Completed
Push — master ( 97b5b5...7e7f32 )
by Sam
10s
created

NamespaceGetter   A

Complexity

Total Complexity 21

Size/Duplication

Total Lines 96
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Test Coverage

Coverage 98.15%

Importance

Changes 0
Metric Value
wmc 21
lcom 1
cbo 4
dl 0
loc 96
ccs 53
cts 54
cp 0.9815
rs 10
c 0
b 0
f 0

6 Methods

Rating   Name   Duplication   Size   Complexity  
A getNamespaceByCanonicalName() 0 9 4
B getNamespaceByName() 0 18 8
A getNamespaces() 0 10 2
A createNamespaceFromQuery() 0 10 3
A getAliases() 0 9 3
A getNamespaceResult() 0 8 1
1
<?php
2
3
namespace Mediawiki\Api\Service;
4
5
use Mediawiki\Api\SimpleRequest;
6
use Mediawiki\DataModel\NamespaceInfo;
7
8
/**
9
 * @access private
10
 *
11
 * @author gbirke
12
 */
13
class NamespaceGetter extends Service {
14
15
	/**
16
	 * Find a namespace by its canonical name
17
	 *
18
	 * @param string $canonicalName
19
	 * @return NamespaceInfo|null
20
	 */
21 2
	public function getNamespaceByCanonicalName( $canonicalName ) {
22 2
		$result = $this->getNamespaceResult()['query'];
23 2
		foreach ( $result['namespaces'] as $nsInfo ) {
24 2
			if ( !empty( $nsInfo['canonical'] ) && $nsInfo['canonical'] === $canonicalName ) {
25 1
				return $this->createNamespaceFromQuery( $nsInfo, $result['namespacealiases'] );
26
			}
27 2
		}
28 1
		return null;
29
	}
30
31
	/**
32
	 * Find a namespace by its canonical name, local name or namespace alias
33
	 *
34
	 * @param string $name
35
	 * @return NamespaceInfo|null
36
	 */
37 2
	public function getNamespaceByName( $name ) {
38 2
		$result = $this->getNamespaceResult()['query'];
39 2
		foreach ( $result['namespaces'] as $nsInfo ) {
40 2
			if ( ( !empty( $nsInfo['canonical'] ) && $nsInfo['canonical'] === $name ) ||
41 2
				$nsInfo['*'] === $name ) {
42 1
				return $this->createNamespaceFromQuery( $nsInfo, $result['namespacealiases'] );
43
			}
44 2
		}
45 1
		foreach ( $result['namespacealiases'] as $alias ) {
46 1
			if ( $alias['*'] === $name && !empty( $result['namespaces'][$alias['id']] ) ) {
47 1
				return $this->createNamespaceFromQuery(
48 1
					$result['namespaces'][$alias['id']],
49 1
					$result['namespacealiases']
50 1
				);
51
			}
52 1
		}
53
		return null;
54
	}
55
56
	/**
57
	 * @return NamespaceInfo[]
58
	 */
59 1
	public function getNamespaces() {
60 1
		$namespaces = [];
61 1
		$result = $this->getNamespaceResult()['query'];
62 1
		foreach ( $result['namespaces'] as $nsInfo ) {
63 1
			$namespaces[$nsInfo['id']] = $this->createNamespaceFromQuery(
64 1
				$nsInfo, $result['namespacealiases']
65 1
			);
66 1
		}
67 1
		return $namespaces;
68
	}
69
70 4
	private function createNamespaceFromQuery( $nsInfo, $namespaceAliases ) {
71 4
		return new NamespaceInfo(
72 4
			$nsInfo['id'],
73 4
			empty( $nsInfo['canonical'] ) ? '' : $nsInfo['canonical'],
74 4
			$nsInfo['*'],
75 4
			$nsInfo['case'],
76 4
			empty( $nsInfo['defaultcontentmodel'] ) ? null : $nsInfo['defaultcontentmodel'],
77 4
			$this->getAliases( $nsInfo['id'], $namespaceAliases )
78 4
		);
79
	}
80
81
	/**
82
	 * @param int $id
83
	 * @param array $namespaceAliases Alias list, as returned by the API
84
	 * @return string[]
85
	 */
86 4
	private function getAliases( $id, $namespaceAliases ) {
87 4
		$aliases = [];
88 4
		foreach ( $namespaceAliases as $alias ) {
89 4
			if ( $alias['id'] === $id ) {
90 2
				$aliases[] = $alias['*'];
91 2
			}
92 4
		}
93 4
		return $aliases;
94
	}
95
96
	/**
97
	 * @return array
98
	 */
99 5
	private function getNamespaceResult() {
100 5
		return $this->api->getRequest( new SimpleRequest(
101 5
			'query', [
102 5
				'meta' => 'siteinfo',
103
				'siprop' => 'namespaces|namespacealiases'
104 5
			]
105 5
		) );
106
	}
107
108
}
109