Jens Ohlig has uploaded a new change for review.
https://gerrit.wikimedia.org/r/95598
Change subject: Refactored Wikibase Lua library code to make everything
testable.
......................................................................
Refactored Wikibase Lua library code to make everything testable.
Change-Id: Ifab855fa635ad096fcdb94d3cad1e0c4784a6f92
---
M client/WikibaseClient.classes.php
D client/includes/WikibaseLibrary.php
A client/includes/scribunto/Scribunto_LuaWikibaseLibrary.php
A client/includes/scribunto/Scribunto_LuaWikibaseLibraryImplementation.php
R client/includes/scribunto/mw.wikibase.lua
A
client/tests/phpunit/includes/scribunto/Scribunto_LuaWikibaseLibraryImplementationTest.php
6 files changed, 310 insertions(+), 156 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase
refs/changes/98/95598/1
diff --git a/client/WikibaseClient.classes.php
b/client/WikibaseClient.classes.php
index ad69ac6..5140f44 100644
--- a/client/WikibaseClient.classes.php
+++ b/client/WikibaseClient.classes.php
@@ -22,7 +22,6 @@
'Wikibase\RepoItemLinkGenerator' =>
'includes/RepoItemLinkGenerator.php',
'Wikibase\RepoLinker' => 'includes/RepoLinker.php',
'Wikibase\Client\WikibaseClient' =>
'includes/WikibaseClient.php',
- 'Scribunto_LuaWikibaseLibrary' =>
'includes/WikibaseLibrary.php',
'Wikibase\PageUpdater' => 'includes/PageUpdater.php',
'Wikibase\SiteLinkCommentCreator' =>
'includes/SiteLinkCommentCreator.php',
'Wikibase\WikiPageUpdater' => 'includes/WikiPageUpdater.php',
@@ -61,6 +60,10 @@
'Wikibase\DirectSqlStore' =>
'includes/store/sql/DirectSqlStore.php',
'Wikibase\EntityCacheTable' =>
'includes/store/sql/EntityCacheTable.php',
+ // includes/scribunto
+ 'Scribunto_LuaWikibaseLibrary' =>
'includes/scribunto/Scribunto_LuaWikibaseLibrary.php',
+ 'Scribunto_LuaWikibaseLibraryImplementation' =>
'includes/scribunto/Scribunto_LuaWikibaseLibraryImplementation.php',
+
// test
'Wikibase\Test\MockPageUpdater' =>
'tests/phpunit/MockPageUpdater.php'
diff --git a/client/includes/WikibaseLibrary.php
b/client/includes/WikibaseLibrary.php
deleted file mode 100644
index 91be67b..0000000
--- a/client/includes/WikibaseLibrary.php
+++ /dev/null
@@ -1,155 +0,0 @@
-<?php
-
-/**
- * Registers and defines functions to access Wikibase through the Scribunto
extension
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @since 0.4
- *
- * @licence GNU GPL v2+
- * @author Jens Ohlig < [email protected] >
- */
-
-use ValueParsers\ParseException;
-use Wikibase\Client\WikibaseClient;
-use Wikibase\Lib\Serializers\SerializationOptions;
-use Wikibase\Lib\Serializers\SerializerFactory;
-use Wikibase\LanguageFallbackChainFactory;
-use Wikibase\Utils;
-
-class Scribunto_LuaWikibaseLibrary extends Scribunto_LuaLibraryBase {
-
- /**
- * Register mw.wikibase.lua library
- *
- * @since 0.4
- */
- public function register() {
- $lib = array(
- 'getEntity' => array( $this, 'getEntity' ),
- 'getEntityId' => array( $this, 'getEntityId' ),
- 'getGlobalSiteId' => array( $this, 'getGlobalSiteId' )
- );
- $this->getEngine()->registerInterface( dirname( __FILE__ ) .
'/../resources/' . 'mw.wikibase.lua', $lib, array() );
- }
-
- /**
- * Get entity from prefixed ID (e.g. "Q23") and return it as serialized
array.
- *
- * @since 0.4
- *
- * @param string $prefixedEntityId
- *
- * @throws ScribuntoException
- * @return array $entityArr
- */
- public function getEntity( $prefixedEntityId = null ) {
- $this->checkType( 'getEntity', 1, $prefixedEntityId, 'string' );
- $prefixedEntityId = trim( $prefixedEntityId );
-
- $entityIdParser =
WikibaseClient::getDefaultInstance()->getEntityIdParser();
-
- try {
- $entityId = $entityIdParser->parse( $prefixedEntityId );
- }
- catch ( ParseException $parseException ) {
- throw $this->getEngine()->newException(
'wikibase-error-invalid-entity-id' );
- }
-
- $entityObject =
WikibaseClient::getDefaultInstance()->getStore()->getEntityLookup()->getEntity(
- $entityId
- );
-
- if ( $entityObject == null ) {
- return array( null );
- }
-
- $opt = new SerializationOptions();
- $serializerFactory = new SerializerFactory( $opt );
-
- // Using "ID_KEYS_BOTH" here means that all lists of Snaks or
Claims will be listed
- // twice, once with a lower case key and once with an upper
case key.
- // This is a B/C hack to allow existing lua code to use
hardcoded IDs
- // in both lower (legacy) and upper case.
- $opt->setIdKeyMode( SerializationOptions::ID_KEYS_BOTH );
-
- // This is $wgContLang, not parser target language or anything
else.
- // See Scribunto_LuaLanguageLibrary::getContLangCode().
- global $wgContLang;
-
- // See mw.wikibase.lua. This is the only way to inject values
into mw.wikibase.label( ),
- // so any customized Lua modules can access labels of another
entity written in another variant,
- // unless we give them the ability to getEntity() any entity by
specifying its ID, not just self.
- $chain =
WikibaseClient::getDefaultInstance()->getLanguageFallbackChainFactory()->newFromLanguage(
- $wgContLang,
LanguageFallbackChainFactory::FALLBACK_SELF |
LanguageFallbackChainFactory::FALLBACK_VARIANTS
- );
- // SerializationOptions accepts mixed types of keys happily.
- $opt->setLanguages( Utils::getLanguageCodes() + array(
$wgContLang->getCode() => $chain ) );
-
- $serializer = $serializerFactory->newSerializerForObject(
$entityObject, $opt );
-
- try {
- $entityArr = $serializer->getSerialized( $entityObject
);
- return array( $entityArr );
- } catch ( \Exception $e ) {
- throw $this->getEngine()->newException(
'wikibase-error-serialize-error' );
- }
- }
-
- /**
- * Get entity id from page title.
- *
- * @since 0.4
- *
- * @param string $pageTitle
- *
- * @return string $id
- */
- public function getEntityId( $pageTitle = null ) {
- $this->checkType( 'getEntityByTitle', 1, $pageTitle, 'string' );
- $globalSiteId = \Wikibase\Settings::get( 'siteGlobalID' );
- $table =
WikibaseClient::getDefaultInstance()->getStore()->getSiteLinkTable();
- if ( $table == null ) {
- return array( null );
- }
-
- $numericId = $table->getItemIdForLink( $globalSiteId,
$pageTitle );
- if ( !is_int( $numericId ) ) {
- return array( null );
- }
-
- $id = new Wikibase\EntityId( \Wikibase\Item::ENTITY_TYPE,
$numericId );
- if ( $id == null ) {
- return array( null );
- }
-
- $idFormatter =
WikibaseClient::getDefaultInstance()->getEntityIdFormatter();
-
- return array( $idFormatter->format( $id ) );
- }
- /**
- * Get global site ID (e.g. "enwiki")
- * This is basically a helper function.
- * I can see this becoming part of mw.site in the Scribunto extension.
- *
- * @since 0.4
- *
- */
- public function getGlobalSiteId() {
- return array( \Wikibase\Settings::get( 'siteGlobalID' ) );
- }
-}
diff --git a/client/includes/scribunto/Scribunto_LuaWikibaseLibrary.php
b/client/includes/scribunto/Scribunto_LuaWikibaseLibrary.php
new file mode 100644
index 0000000..c05ce8a
--- /dev/null
+++ b/client/includes/scribunto/Scribunto_LuaWikibaseLibrary.php
@@ -0,0 +1,109 @@
+<?php
+
+/**
+ * Registers and defines functions to access Wikibase through the Scribunto
extension
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 0.4
+ *
+ * @licence GNU GPL v2+
+ * @author Jens Ohlig < [email protected] >
+ */
+
+use ValueParsers\ParseException;
+use Wikibase\Client\WikibaseClient;
+
+
+class Scribunto_LuaWikibaseLibrary extends Scribunto_LuaLibraryBase {
+ /**
+ * Constructor for wrapper class, initialize member object holding
implementation
+ *
+ * @since 0.5
+ *
+ */
+
+ /* @var Scribunto_LuaWikibaseLibraryImplementation */
+ protected $wbLibrary;
+
+ public function __construct( $engine ) {
+ $this->wbLibrary = new
Scribunto_LuaWikibaseLibraryImplementation(
+
WikibaseClient::getDefaultInstance()->getEntityIdParser(), // EntityIdParser
+
WikibaseClient::getDefaultInstance()->getStore()->getEntityLookup(), //
EntityLookup
+
WikibaseClient::getDefaultInstance()->getEntityIdFormatter(), //
EntityIdFormatter
+
WikibaseClient::getDefaultInstance()->getStore()->getSiteLinkTable() //
SiteLinkLookup
+ );
+ parent::__construct( $engine );
+ }
+
+ /**
+ * Register mw.wikibase.lua library
+ *
+ * @since 0.4
+ */
+ public function register() {
+ $lib = array( 'getEntity' => array( $this, 'getEntity' ),
'getEntityId' => array( $this, 'getEntityId' ), 'getGlobalSiteId' => array(
$this, 'getGlobalSiteId' ) );
+ $this->getEngine()->registerInterface( dirname( __FILE__ ) .
'/mw.wikibase.lua', $lib, array() );
+ }
+
+ /**
+ * Wrapper for getEntity in Scribunto_LuaWikibaseLibraryImplementation
+ *
+ * @since 0.5
+ *
+ * @param string $prefixedEntityId
+ *
+ * @throws ScribuntoException
+ * @return array $entityArr
+ */
+ public function getEntity( $prefixedEntityId = null ) {
+ $this->checkType( 'getEntity', 1, $prefixedEntityId, 'string' );
+ try {
+ $entityArr = $this->wbLibrary->getEntity(
$prefixedEntityId );
+ return $entityArr;
+ }
+ catch ( ParseException $e ) {
+ throw new ScribuntoException(
'wikibase-error-invalid-entity-id' );
+ }
+ catch ( \Exception $e ) {
+ throw new ScribuntoException(
'wikibase-error-serialize-error' );
+ }
+ }
+
+ /**
+ * Wrapper for getEntityId in Scribunto_LuaWikibaseLibraryImplementation
+ *
+ * @since 0.5
+ *
+ * @param string $pageTitle
+ *
+ * @return string $id
+ */
+ public function getEntityId( $pageTitle = null ) {
+ $this->checkType( 'getEntityByTitle', 1, $pageTitle, 'string' );
+ return $this->wbLibrary->getEntityId( $pageTitle );
+ }
+
+ /**
+ * Wrapper for getGlobalSiteId in
Scribunto_LuaWikibaseLibraryImplementation
+ *
+ * @since 0.5
+ *
+ */
+ public function getGlobalSiteId() {
+ return $this->wbLibrary->getGlobalSiteId();
+ }
+}
diff --git
a/client/includes/scribunto/Scribunto_LuaWikibaseLibraryImplementation.php
b/client/includes/scribunto/Scribunto_LuaWikibaseLibraryImplementation.php
new file mode 100644
index 0000000..a65675e
--- /dev/null
+++ b/client/includes/scribunto/Scribunto_LuaWikibaseLibraryImplementation.php
@@ -0,0 +1,150 @@
+<?php
+
+/**
+ * Actual implementations of the functions to access Wikibase through the
Scribunto extension
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 0.4
+ *
+ * @licence GNU GPL v2+
+ * @author Jens Ohlig < [email protected] >
+ */
+
+use Wikibase\EntityLookup;
+use Wikibase\SiteLinkLookup;
+use Wikibase\Lib\Serializers\SerializationOptions;
+use Wikibase\Lib\Serializers\SerializerFactory;
+use Wikibase\Lib\EntityIdFormatter;
+use Wikibase\Lib\EntityIdParser;
+use Wikibase\LanguageFallbackChainFactory;
+use Wikibase\Utils;
+
+class Scribunto_LuaWikibaseLibraryImplementation {
+
+ /* @var EntityIdParser */
+ protected $entityIdParser;
+
+ /* @var EntityLookup */
+ protected $entityLookup;
+
+ /* @var EntityIdFormatter */
+ protected $entityIdFormatter;
+
+ /* @var SiteLinkLookup */
+ protected $siteLinkTable;
+
+
+ /**
+ * @param EntityIdParser $entityIdParser
+ *
+ */
+ public function __construct( EntityIdParser $entityIdParser,
EntityLookup $entityLookup, EntityIdFormatter $entityIdFormatter,
SiteLinkLookup $siteLinkTable ) {
+ $this->entityIdParser = $entityIdParser;
+ $this->entityLookup = $entityLookup;
+ $this->entityIdFormatter = $entityIdFormatter;
+ $this->siteLinkTable = $siteLinkTable;
+ }
+
+
+ /**
+ * Get entity from prefixed ID (e.g. "Q23") and return it as serialized
array.
+ *
+ * @since 0.5
+ *
+ * @param string $prefixedEntityId
+ *
+ * @return array $entityArr
+ */
+ public function getEntity( $prefixedEntityId = null ) {
+ $prefixedEntityId = trim( $prefixedEntityId );
+
+ $entityId = $this->entityIdParser->parse( $prefixedEntityId );
+
+ $entityObject = $this->entityLookup->getEntity( $entityId );
+
+ if ( $entityObject == null ) {
+ return array( null );
+ }
+
+ $opt = new SerializationOptions();
+ $serializerFactory = new SerializerFactory( $opt );
+
+ // Using "ID_KEYS_BOTH" here means that all lists of Snaks or
Claims will be listed
+ // twice, once with a lower case key and once with an upper
case key.
+ // This is a B/C hack to allow existing lua code to use
hardcoded IDs
+ // in both lower (legacy) and upper case.
+ $opt->setIdKeyMode( SerializationOptions::ID_KEYS_BOTH );
+
+ // This is $wgContLang, not parser target language or anything
else.
+ // See Scribunto_LuaLanguageLibrary::getContLangCode().
+ global $wgContLang;
+
+ // See mw.wikibase.lua. This is the only way to inject values
into mw.wikibase.label( ),
+ // so any customized Lua modules can access labels of another
entity written in another variant,
+ // unless we give them the ability to getEntity() any entity by
specifying its ID, not just self.
+ $fallbackChainFactory = new LanguageFallbackChainFactory();
+ $chain = $fallbackChainFactory->newFromLanguage( $wgContLang,
LanguageFallbackChainFactory::FALLBACK_SELF |
LanguageFallbackChainFactory::FALLBACK_VARIANTS );
+ // SerializationOptions accepts mixed types of keys happily.
+ $opt->setLanguages( Utils::getLanguageCodes() + array(
$wgContLang->getCode() => $chain ) );
+
+ $serializer = $serializerFactory->newSerializerForObject(
$entityObject, $opt );
+
+ $entityArr = $serializer->getSerialized( $entityObject );
+ return array( $entityArr );
+ }
+
+ /**
+ * Get entity id from page title.
+ *
+ * @since 0.5
+ *
+ * @param string $pageTitle
+ *
+ * @return string $id
+ */
+ public function getEntityId( $pageTitle = null ) {
+ $globalSiteId = $this->getGlobalSiteId();
+ $table = $this->siteLinkTable;
+ if ( $table == null ) {
+ return array( null );
+ }
+
+ $numericId = $table->getItemIdForLink( $globalSiteId,
$pageTitle );
+ if ( ! is_int( $numericId ) ) {
+ return array( null );
+ }
+
+ $id = new Wikibase\EntityId( \Wikibase\Item::ENTITY_TYPE,
$numericId );
+ if ( $id == null ) {
+ return array( null );
+ }
+
+ return array( $this->entityIdFormatter->format( $id ) );
+ }
+
+ /**
+ * Get global site ID (e.g. "enwiki")
+ * This is basically a helper function.
+ * I can see this becoming part of mw.site in the Scribunto extension.
+ *
+ * @since 0.5
+ *
+ */
+ public function getGlobalSiteId() {
+ return array( \Wikibase\Settings::get( 'siteGlobalID' ) );
+ }
+}
diff --git a/client/resources/mw.wikibase.lua
b/client/includes/scribunto/mw.wikibase.lua
similarity index 100%
rename from client/resources/mw.wikibase.lua
rename to client/includes/scribunto/mw.wikibase.lua
diff --git
a/client/tests/phpunit/includes/scribunto/Scribunto_LuaWikibaseLibraryImplementationTest.php
b/client/tests/phpunit/includes/scribunto/Scribunto_LuaWikibaseLibraryImplementationTest.php
new file mode 100644
index 0000000..3740b9c
--- /dev/null
+++
b/client/tests/phpunit/includes/scribunto/Scribunto_LuaWikibaseLibraryImplementationTest.php
@@ -0,0 +1,47 @@
+<?php
+
+namespace Wikibase\Test;
+
+use Scribunto_LuaWikibaseLibraryImplementation;
+use Wikibase\Client\WikibaseClient;
+
+/**
+ * @covers Wikibase\Scribunto_LuaWikibaseLibraryImplementation
+ *
+ * @file
+ * @since 0.4
+ *
+ * @ingroup WikibaseClient
+ * @ingroup Test
+ *
+ * @group Wikibase
+ * @group WikibaseClient
+ * @group Scribunto_LuaWikibaseLibraryImplementationTest
+ *
+ * @licence GNU GPL v2+
+ * @author Jens Ohlig < [email protected] >
+ */
+class Scribunto_LuaWikibaseLibraryImplementationTest extends
\PHPUnit_Framework_TestCase {
+
+ public function getWikibaseLibraryImplementation() {
+ $entityLookup = new MockRepository();
+ return new Scribunto_LuaWikibaseLibraryImplementation(
+
WikibaseClient::getDefaultInstance()->getEntityIdParser(), // EntityIdParser
+ $entityLookup,
+
WikibaseClient::getDefaultInstance()->getEntityIdFormatter(), //
EntityIdFormatter
+
WikibaseClient::getDefaultInstance()->getStore()->getSiteLinkTable() //
SiteLinkLookup
+ );
+ }
+
+ /**
+ * @dataProvider provideEntity
+ */
+ public function testGetEntity( $entity ) {
+ $entityArr =
$this->getWikibaseLibraryImplementation()->getEntity( $entity );
+ $this->assertEquals( is_array( $entityArr ), true );
+ }
+
+ public function provideEntity() {
+ return array( array( 'q42' ), array( 'q23' ) );
+ }
+}
--
To view, visit https://gerrit.wikimedia.org/r/95598
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ifab855fa635ad096fcdb94d3cad1e0c4784a6f92
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Jens Ohlig <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits