Completed
Pull Request — master (#48)
by Sam
03:49
created

NamespaceGetter::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 3
ccs 3
cts 3
cp 1
rs 10
cc 1
eloc 2
nc 1
nop 1
crap 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 5
	public function __construct( MediawikiApi $api ) {
21 5
		$this->api = $api;
22 5
	}
23
24
	/**
25
	 * Find a namespace by its canonical name
26
	 *
27
	 * @param string $canonicalName
28
	 * @return NamespaceInfo|null
29
	 */
30 2
	public function getNamespaceByCanonicalName( $canonicalName ) {
31 2
		$result = $this->getNamespaceResult()['query'];
32 2
		foreach ( $result['namespaces'] as $nsInfo ) {
33 2
			if ( !empty( $nsInfo['canonical'] ) && $nsInfo['canonical'] === $canonicalName ) {
34 2
				return $this->createNamespaceFromQuery( $nsInfo, $result['namespacealiases'] );
35
			}
36
		}
37 1
		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 2
	public function getNamespaceByName( $name ) {
47 2
		$result = $this->getNamespaceResult()['query'];
48 2
		foreach ( $result['namespaces'] as $nsInfo ) {
49 2
			if ( ( !empty( $nsInfo['canonical'] ) && $nsInfo['canonical'] === $name ) ||
50 2
				$nsInfo['*'] === $name ) {
51 2
				return $this->createNamespaceFromQuery( $nsInfo, $result['namespacealiases'] );
52
			}
53
		}
54 1
		foreach ( $result['namespacealiases'] as $alias ) {
55 1
			if ( $alias['*'] === $name && !empty( $result['namespaces'][$alias['id']] ) ) {
56 1
				return $this->createNamespaceFromQuery(
57 1
					$result['namespaces'][$alias['id']],
58 1
					$result['namespacealiases']
59
				);
60
			}
61
		}
62
		return null;
63
	}
64
65
	/**
66
	 * @return NamespaceInfo[]
67
	 */
68 1
	public function getNamespaces() {
69 1
		$namespaces = [];
70 1
		$result = $this->getNamespaceResult()['query'];
71 1
		foreach ( $result['namespaces'] as $nsInfo ) {
72 1
			$namespaces[$nsInfo['id']] = $this->createNamespaceFromQuery(
73 1
				$nsInfo, $result['namespacealiases']
74
			);
75
		}
76 1
		return $namespaces;
77
	}
78
79 4
	private function createNamespaceFromQuery( $nsInfo, $namespaceAliases ) {
80 4
		return new NamespaceInfo(
81 4
			$nsInfo['id'],
82 4
			empty( $nsInfo['canonical'] ) ? '' : $nsInfo['canonical'],
83 4
			$nsInfo['*'],
84 4
			$nsInfo['case'],
85 4
			empty( $nsInfo['defaultcontentmodel'] ) ? null : $nsInfo['defaultcontentmodel'],
86 4
			$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 4
	private function getAliases( $id, $namespaceAliases ) {
96 4
		$aliases = [];
97 4
		foreach ( $namespaceAliases as $alias ) {
98 4
			if ( $alias['id'] === $id ) {
99 4
				$aliases[] = $alias['*'];
100
			}
101
		}
102 4
		return $aliases;
103
	}
104
105
	/**
106
	 * @return array
107
	 */
108 5
	private function getNamespaceResult() {
109 5
		return $this->api->getRequest( new SimpleRequest(
110 5
			'query', [
111 5
				'meta' => 'siteinfo',
112
				'siprop' => 'namespaces|namespacealiases'
113
			]
114
		) );
115
	}
116
117
}
118