Completed
Push — master ( ec2f81...11966d )
by adam
03:28
created

NamespaceGetter   A

Complexity

Total Complexity 22

Size/Duplication

Total Lines 104
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Test Coverage

Coverage 0%

Importance

Changes 2
Bugs 0 Features 0
Metric Value
wmc 22
lcom 1
cbo 3
dl 0
loc 104
ccs 0
cts 67
cp 0
rs 10
c 2
b 0
f 0

7 Methods

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