Mwjames has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/86849


Change subject: UpdateObserver and JobBase to implement ContextAware
......................................................................

UpdateObserver and JobBase to implement ContextAware

Instead of implementing DependencyRequestor, implement ContextAware to
loosen dependency between DIC and the requestor.

Change-Id: Ie5e74dfd56f5fecd7391285585622f80681db97a
---
M includes/UpdateObserver.php
M includes/dic/SharedDependencyContainer.php
M includes/jobs/JobBase.php
M includes/jobs/UpdateDispatcherJob.php
M includes/jobs/UpdateJob.php
M tests/phpunit/includes/UpdateObserverTest.php
M tests/phpunit/includes/dic/SharedDependencyContainerTest.php
M tests/phpunit/includes/jobs/UpdateDispatcherJobTest.php
M tests/phpunit/includes/jobs/UpdateJobTest.php
9 files changed, 81 insertions(+), 117 deletions(-)


  git pull 
ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/SemanticMediaWiki 
refs/changes/49/86849/1

diff --git a/includes/UpdateObserver.php b/includes/UpdateObserver.php
index 1828c2b..c75c510 100644
--- a/includes/UpdateObserver.php
+++ b/includes/UpdateObserver.php
@@ -21,37 +21,35 @@
  * to this observer which will independently act from the source of
  * the notification
  *
- * @note When testing rountrips, use the MockUpdateObserver instead
+ * @note When testing round-trips, use the MockUpdateObserver instead
  *
  * @ingroup Observer
  */
-class UpdateObserver extends Observer implements DependencyRequestor {
+class UpdateObserver extends Observer implements ContextAware {
 
-       /** @var DependencyBuilder */
-       protected $dependencyBuilder = null;
+       /** @var ContextResource */
+       protected $context = null;
 
        /**
-        * @see DependencyRequestor::setDependencyBuilder
-        *
         * @since 1.9
         *
-        * @param DependencyBuilder $builder
+        * @param ContextResource
         */
-       public function setDependencyBuilder( DependencyBuilder $builder ) {
-               $this->dependencyBuilder = $builder;
+       public function invokeContext( ContextResource $context ) {
+               $this->context = $context;
        }
 
        /**
-        * @see DependencyRequestor::getDependencyBuilder
+        * @see ContextAware::withContext
         *
         * @since 1.9
         *
-        * @return DependencyBuilder
+        * @return ContextResource
         */
-       public function getDependencyBuilder() {
+       public function withContext() {
 
                // This is not as clean as it should be but to avoid to make
-               // multipe changes at once we determine a default builder here
+               // multiple changes at once we determine a default builder here
                // which at some point should vanish after pending changes have
                // been merged
 
@@ -59,11 +57,11 @@
                // UpdateJob does not
                // ParserAfterTidy does not
 
-               if ( $this->dependencyBuilder === null ) {
-                       $this->dependencyBuilder = new SimpleDependencyBuilder( 
new SharedDependencyContainer() );
+               if ( $this->context === null ) {
+                       $this->context = new BaseContext();
                }
 
-               return $this->dependencyBuilder;
+               return $this->context;
        }
 
        /**
@@ -80,17 +78,12 @@
         */
        public function runStoreUpdater( ParserData $subject ) {
 
-               /**
-                * @var Settings $settings
-                */
-               $settings = $this->getDependencyBuilder()->newObject( 
'Settings' );
+               $updater = new StoreUpdater(
+                       $this->withContext()->getStore(),
+                       $subject->getData(),
+                       $this->withContext()->getSettings()
+               );
 
-               /**
-                * @var Store $store
-                */
-               $store = $this->getDependencyBuilder()->newObject( 'Store' );
-
-               $updater = new StoreUpdater( $store, $subject->getData(), 
$settings );
                $updater->setUpdateStatus( $subject->getUpdateStatus() 
)->doUpdate();
 
                return true;
@@ -119,7 +112,7 @@
        public function runUpdateDispatcher( TitleAccess $subject ) {
 
                $dispatcher = new UpdateDispatcherJob( $subject->getTitle() );
-               $dispatcher->setDependencyBuilder( 
$this->getDependencyBuilder() );
+               $dispatcher->invokeContext( $this->withContext() );
                $dispatcher->run();
 
                return true;
diff --git a/includes/dic/SharedDependencyContainer.php 
b/includes/dic/SharedDependencyContainer.php
index 8de063b..4003e21 100644
--- a/includes/dic/SharedDependencyContainer.php
+++ b/includes/dic/SharedDependencyContainer.php
@@ -284,7 +284,7 @@
        protected function getUpdateObserver() {
                return function ( DependencyBuilder $builder ) {
                        $updateObserver = new UpdateObserver();
-                       $updateObserver->setDependencyBuilder( $builder );
+                       $updateObserver->invokeContext( $builder->newObject( 
'BaseContext' ) );
                        return $updateObserver;
                };
        }
diff --git a/includes/jobs/JobBase.php b/includes/jobs/JobBase.php
index 642232c..3a05bd8 100644
--- a/includes/jobs/JobBase.php
+++ b/includes/jobs/JobBase.php
@@ -11,40 +11,37 @@
  * @license GNU GPL v2+
  * @author mwjames
  */
-abstract class JobBase extends Job implements DependencyRequestor {
+abstract class JobBase extends Job implements ContextAware {
 
-       /** @var DependencyBuilder */
-       protected $dependencyBuilder = null;
+       /** @var ContextResource */
+       protected $context = null;
 
        /**
-        * @see DependencyRequestor::setDependencyBuilder
-        *
         * @since 1.9
         *
-        * @param DependencyBuilder $builder
+        * @param ContextResource
         */
-       public function setDependencyBuilder( DependencyBuilder $builder ) {
-               $this->dependencyBuilder = $builder;
+       public function invokeContext( ContextResource $context ) {
+               $this->context = $context;
        }
 
        /**
-        * @see DependencyRequestor::getDependencyBuilder
+        * @see ContextAware::withContext
         *
         * @since 1.9
         *
-        * @return DependencyBuilder
+        * @return ContextResource
         */
-       public function getDependencyBuilder() {
+       public function withContext() {
 
                // JobBase is a top-level class and to avoid a non-instantiated 
object
-               // a default builder is set as for when Jobs are triggered using
-               // command line etc.
-
-               if ( $this->dependencyBuilder === null ) {
-                       $this->dependencyBuilder = new SimpleDependencyBuilder( 
new SharedDependencyContainer() );
+               // a default builder is set as for when Jobs are triggered 
without
+               // injected context (during command line etc.)
+               if ( $this->context === null ) {
+                       $this->context = new BaseContext();
                }
 
-               return $this->dependencyBuilder;
+               return $this->context;
        }
 
        /**
diff --git a/includes/jobs/UpdateDispatcherJob.php 
b/includes/jobs/UpdateDispatcherJob.php
index 269b6a5..ac8416c 100644
--- a/includes/jobs/UpdateDispatcherJob.php
+++ b/includes/jobs/UpdateDispatcherJob.php
@@ -99,7 +99,7 @@
                /**
                 * @var Store $store
                 */
-               $store = $this->getDependencyBuilder()->newObject( 'Store' );
+               $store = $this->withContext()->getStore();
 
                // Array of all subjects that have some value for the given 
property
                $subjects = $store->getAllPropertySubjects( $property );
@@ -171,13 +171,7 @@
         * @codeCoverageIgnore
         */
        public function insert() {
-
-               /**
-                * @var Settings $settings
-                */
-               $settings = $this->getDependencyBuilder()->newObject( 
'Settings' );
-
-               if ( $settings->get( 'smwgEnableUpdateJobs' ) ) {
+               if ( $this->withContext()->getSettings()->get( 
'smwgEnableUpdateJobs' ) ) {
                        parent::insert();
                }
        }
diff --git a/includes/jobs/UpdateJob.php b/includes/jobs/UpdateJob.php
index 9fcbce3..f702d03 100644
--- a/includes/jobs/UpdateJob.php
+++ b/includes/jobs/UpdateJob.php
@@ -63,13 +63,7 @@
         * @return boolean
         */
        private function clearData() {
-               /**
-                * @var Store $store
-                */
-               $store = $this->getDependencyBuilder()->newObject( 'Store' );
-
-               $store->deleteSubject( $this->getTitle() );
-
+               $this->withContext()->getStore()->deleteSubject( 
$this->getTitle() );
                return true;
        }
 
@@ -77,10 +71,11 @@
         * @return boolean
         */
        private function runContentParser() {
+
                /**
                 * @var ContentParser $contentParser
                 */
-               $contentParser = $this->getDependencyBuilder()->newObject( 
'ContentParser', array(
+               $contentParser = 
$this->withContext()->getDependencyBuilder()->newObject( 'ContentParser', array(
                        'Title' => $this->getTitle()
                ) );
 
@@ -105,13 +100,13 @@
                /**
                 * @var CacheHandler $cache
                 */
-               $cache = $this->getDependencyBuilder()->newObject( 
'CacheHandler' );
+               $cache = 
$this->withContext()->getDependencyBuilder()->newObject( 'CacheHandler' );
                $cache->setKey( FactboxCache::newCacheId( 
$this->getTitle()->getArticleID() ) )->delete();
 
                /**
                 * @var ParserData $parserData
                 */
-               $parserData = $this->getDependencyBuilder()->newObject( 
'ParserData', array(
+               $parserData = 
$this->withContext()->getDependencyBuilder()->newObject( 'ParserData', array(
                        'Title'        => $this->getTitle(),
                        'ParserOutput' => $parserOutput
                ) );
@@ -133,13 +128,7 @@
         * @codeCoverageIgnore
         */
        public function insert() {
-
-               /**
-                * @var Settings $settings
-                */
-               $settings = $this->getDependencyBuilder()->newObject( 
'Settings' );
-
-               if ( $settings->get( 'smwgEnableUpdateJobs' ) ) {
+               if ( $this->withContext()->getSettings()->get( 
'smwgEnableUpdateJobs' ) ) {
                        parent::insert();
                }
        }
diff --git a/tests/phpunit/includes/UpdateObserverTest.php 
b/tests/phpunit/includes/UpdateObserverTest.php
index f18a6e1..aa3f660 100644
--- a/tests/phpunit/includes/UpdateObserverTest.php
+++ b/tests/phpunit/includes/UpdateObserverTest.php
@@ -3,6 +3,7 @@
 namespace SMW\Test;
 
 use SMW\UpdateObserver;
+use SMW\BaseContext;
 
 /**
  * Tests for the UpdateObserver class
@@ -43,23 +44,23 @@
         *
         * @return UpdateObserver
         */
-       private function newInstance() {
-
-               $observer = new UpdateObserver();
-
-               // Use the provided default builder
-               $observer->setDependencyBuilder( 
$observer->getDependencyBuilder() );
+       private function newInstance( $settings = array() ) {
 
                $mockStore = $this->newMockBuilder()->newObject( 'Store', array(
                        'getAllPropertySubjects' => array(),
                        'getPropertySubjects'    => array()
                ) );
 
-               $observer->getDependencyBuilder()
-                       ->getContainer()
-                       ->registerObject( 'Store', $mockStore );
+               $context   = new BaseContext();
 
-               return $observer;
+               $container = $context->getDependencyBuilder()->getContainer();
+               $container->registerObject( 'Store', $mockStore );
+               $container->registerObject( 'Settings', $this->newSettings( 
$settings ) );
+
+               $instance = new UpdateObserver();
+               $instance->invokeContext( $context );
+
+               return $instance;
        }
 
        /**
@@ -79,15 +80,11 @@
         */
        public function testUpdateDispatcherJob( $setup, $expected ) {
 
-               $instance = $this->newInstance();
-
-               $instance->getDependencyBuilder()
-                       ->getContainer()
-                       ->registerObject( 'Settings', $this->newSettings( 
$setup['settings'] ) );
+               $instance = $this->newInstance( $setup['settings'] );
 
                $this->assertTrue(
                        $instance->runUpdateDispatcher( $setup['title'] ),
-                       'asserts that runUpdateDispatcher always returns true'
+                       'Asserts that runUpdateDispatcher always returns true'
                );
        }
 
@@ -99,15 +96,11 @@
         */
        public function testStoreUpdater( $setup, $expected ) {
 
-               $instance = $this->newInstance();
-
-               $instance->getDependencyBuilder()
-                       ->getContainer()
-                       ->registerObject( 'Settings', $this->newSettings( 
$setup['settings'] ) );
+               $instance = $this->newInstance( $setup['settings'] );
 
                $this->assertTrue(
                        $instance->runStoreUpdater( $setup['parserData'] ),
-                       'asserts that runStoreUpdater always returns true'
+                       'Asserts that runStoreUpdater always returns true'
                );
        }
 
diff --git a/tests/phpunit/includes/dic/SharedDependencyContainerTest.php 
b/tests/phpunit/includes/dic/SharedDependencyContainerTest.php
index 8c1d445..6d177b6 100644
--- a/tests/phpunit/includes/dic/SharedDependencyContainerTest.php
+++ b/tests/phpunit/includes/dic/SharedDependencyContainerTest.php
@@ -120,10 +120,10 @@
                $provider[] = array( 'Settings',                   array( 
'\SMW\Settings'                    => array() ) );
                $provider[] = array( 'Store',                      array( 
'\SMW\Store'                       => array() ) );
                $provider[] = array( 'CacheHandler',               array( 
'\SMW\CacheHandler'                => array() ) );
+               $provider[] = array( 'BaseContext',                array( 
'\SMW\ContextResource'             => array() ) );
                $provider[] = array( 'NamespaceExaminer',          array( 
'\SMW\NamespaceExaminer'           => array() ) );
                $provider[] = array( 'UpdateObserver',             array( 
'\SMW\UpdateObserver'              => array() ) );
                $provider[] = array( 'ObservableUpdateDispatcher', array( 
'\SMW\ObservableSubjectDispatcher' => array() ) );
-               $provider[] = array( 'BaseContext',                array( 
'\SMW\BaseContext'                 => array() ) );
 
                $provider[] = array( 'RequestContext',             array( 
'\IContextSource'                  => array() ) );
 
diff --git a/tests/phpunit/includes/jobs/UpdateDispatcherJobTest.php 
b/tests/phpunit/includes/jobs/UpdateDispatcherJobTest.php
index 04d4d03..5a2800b 100644
--- a/tests/phpunit/includes/jobs/UpdateDispatcherJobTest.php
+++ b/tests/phpunit/includes/jobs/UpdateDispatcherJobTest.php
@@ -2,8 +2,8 @@
 
 namespace SMW\Test;
 
-use SMW\SharedDependencyContainer;
 use SMW\UpdateDispatcherJob;
+use SMW\BaseContext;
 use SMW\DIProperty;
 
 use Title;
@@ -69,12 +69,14 @@
                        'smwgEnableUpdateJobs' => false
                ) );
 
-               $container = new SharedDependencyContainer();
+               $context   = new BaseContext();
+
+               $container = $context->getDependencyBuilder()->getContainer();
                $container->registerObject( 'Store', $mockStore );
                $container->registerObject( 'Settings', $settings );
 
                $instance = new UpdateDispatcherJob( $title );
-               $instance->setDependencyBuilder( $this->newDependencyBuilder( 
$container ) );
+               $instance->invokeContext( $context );
 
                return $instance;
        }
diff --git a/tests/phpunit/includes/jobs/UpdateJobTest.php 
b/tests/phpunit/includes/jobs/UpdateJobTest.php
index ef907d8..a31414b 100644
--- a/tests/phpunit/includes/jobs/UpdateJobTest.php
+++ b/tests/phpunit/includes/jobs/UpdateJobTest.php
@@ -2,7 +2,7 @@
 
 namespace SMW\Test;
 
-use SMW\SharedDependencyContainer;
+use SMW\BaseContext;
 use SMW\UpdateJob;
 
 use Title;
@@ -45,34 +45,29 @@
         *
         * @return UpdateJob
         */
-       private function newInstance( Title $title = null, $settings = null ) {
+       private function newInstance( Title $title = null ) {
 
                if ( $title === null ) {
                        $title = $this->newTitle();
                }
 
-               // Set smwgEnableUpdateJobs to false in order to avoid having 
jobs being
-               // inserted as real jobs to the queue
-               if ( $settings === null ) {
-                       $settings = $this->newSettings( array(
-                               'smwgCacheType'        => 'hash',
-                               'smwgEnableUpdateJobs' => false
-                       ) );
-               }
+               $settings = $this->newSettings( array(
+                       'smwgCacheType'        => 'hash',
+                       'smwgEnableUpdateJobs' => false // false in order to 
avoid having jobs being inserted
+               ) );
+
+               $mockStore = $this->newMockBuilder()->newObject( 'Store' );
+
+               $context   = new BaseContext();
+
+               $container = $context->getDependencyBuilder()->getContainer();
+               $container->registerObject( 'Store', $mockStore );
+               $container->registerObject( 'Settings', $settings );
 
                $instance = new UpdateJob( $title );
-
-               $builder = $instance->getDependencyBuilder();
-               $container = $builder->getContainer();
-               $container->registerObject( 'Settings', $settings );
-               $container->registerObject( 'Store', 
$this->newMockBuilder()->newObject( 'Store' ) );
-
-               // This seems redundant but it allows to cover
-               // all necessary methods provided by the JobBase
-               $instance->setDependencyBuilder( $builder );
+               $instance->invokeContext( $context );
 
                return $instance;
-
        }
 
        /**
@@ -116,7 +111,8 @@
 
                $instance  = $this->newInstance( $setup['title'] );
 
-               $instance->getDependencyBuilder()
+               $instance->withContext()
+                       ->getDependencyBuilder()
                        ->getContainer()
                        ->registerObject( 'ContentParser', 
$setup['contentParser'] );
 

-- 
To view, visit https://gerrit.wikimedia.org/r/86849
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ie5e74dfd56f5fecd7391285585622f80681db97a
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/SemanticMediaWiki
Gerrit-Branch: master
Gerrit-Owner: Mwjames <jamesin.hongkon...@gmail.com>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to