[MediaWiki-commits] [Gerrit] mediawiki...MobileFrontend[specialpages]: Mobile Frontend feature management system

2018-01-08 Thread jenkins-bot (Code Review)
jenkins-bot has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/402938 )

Change subject: Mobile Frontend feature management system
..


Mobile Frontend feature management system

Bug: T182362
Change-Id: If7ebace5ace1b2f191a53e6a1e8bc373307af08f
---
M extension.json
M includes/MobileFrontend.hooks.php
M includes/ServiceWiring.php
A includes/features/Feature.php
A includes/features/FeaturesManager.php
A includes/features/IFeature.php
6 files changed, 152 insertions(+), 2 deletions(-)

Approvals:
  jenkins-bot: Verified
  Jdlrobson: Looks good to me, approved



diff --git a/extension.json b/extension.json
index d0f5318..f4935db 100644
--- a/extension.json
+++ b/extension.json
@@ -46,7 +46,8 @@
"MobileFrontendAlias": "MobileFrontend.alias.php"
},
"AutoloadNamespaces": {
-   "MobileFrontend\\Transforms\\": "includes/transforms/"
+   "MobileFrontend\\Transforms\\": "includes/transforms/",
+   "MobileFrontend\\Features\\" : "includes/features/"
},
"AutoloadClasses": {
"ExtMobileFrontend": "includes/MobileFrontend.body.php",
diff --git a/includes/MobileFrontend.hooks.php 
b/includes/MobileFrontend.hooks.php
index cd7f519..6fbb210 100644
--- a/includes/MobileFrontend.hooks.php
+++ b/includes/MobileFrontend.hooks.php
@@ -122,6 +122,13 @@
$skin = self::getDefaultMobileSkin( $context, $mobileContext );
Hooks::run( 'RequestContextCreateSkinMobile', [ $mobileContext, 
$skin ] );
 
+   // TODO, do we want to have a specific hook just for Mobile 
Features initialization
+   // or do we want to reuse the RequestContextCreateSkinMobile 
and use MediawikiService
+   // to retrieve the FeaturesManager
+   $featureManager = \MediaWiki\MediaWikiServices::getInstance()
+   ->getService( 'MobileFrontend.FeaturesManager' );
+   Hooks::run( 'MobileFrontendFeaturesRegistration', [ 
$featureManager ] );
+
return false;
}
 
diff --git a/includes/ServiceWiring.php b/includes/ServiceWiring.php
index efc21e1..ee9abfb 100644
--- a/includes/ServiceWiring.php
+++ b/includes/ServiceWiring.php
@@ -1,10 +1,28 @@
  function ( MediaWikiServices $services ) {
return $services->getService( 'ConfigFactory' )
->makeConfig( 'mobilefrontend' );
-   }
+   },
+
+   'MobileFrontend.FeaturesManager' => function ( MediaWikiServices 
$services ) {
+   $config = $services->getService( 'MobileFrontend.Config' );
+
+   $manager = new FeaturesManager();
+   // register default features
+   // maybe we can get all available features by looping through 
MobileFrontend.Feature.*
+   // and register it here, it would be nice to have something like
+   // $services->getAllByPrefix('MobileFrontend.Feature')
+   $manager->registerFeature( new Feature( 
'MFEnableWikidataDescriptions',
+   $config->get( 'MFEnableWikidataDescriptions' ) ) );
+   $manager->registerFeature( new Feature( 'MFLazyLoadReferences',
+   $config->get( 'MFLazyLoadReferences' ) ) );
+
+   return $manager;
+   },
 ];
diff --git a/includes/features/Feature.php b/includes/features/Feature.php
new file mode 100644
index 000..9627d41
--- /dev/null
+++ b/includes/features/Feature.php
@@ -0,0 +1,59 @@
+name = $name;
+   $this->options = $options;
+   }
+
+   /**
+* @inheritDoc
+*/
+   public function isAvailable( $mode ) {
+   return array_key_exists( $mode, $this->options ) ?
+   $this->options[ $mode ] : self::DEFAULT_ENABLED_MODE;
+   }
+
+   /**
+* @inheritDoc
+*/
+   public function getId() {
+   return $this->name;
+   }
+
+   /**
+* @inheritDoc
+*/
+   public function getNameKey() {
+   return 'mobile-frontend-mobile-option-' . $this->name;
+   }
+
+   /**
+* @inheritDoc
+*/
+   public function getDescriptionKey() {
+   return 'mobile-frontend-mobile-option-' . $this->name . 
'-description';
+   }
+
+}
diff --git a/includes/features/FeaturesManager.php 
b/includes/features/FeaturesManager.php
new file mode 100644
index 000..85ee423
--- /dev/null
+++ b/includes/features/FeaturesManager.php
@@ -0,0 +1,31 @@
+
+*/
+   private $features = [];
+
+   /**
+* Register a new MobileFronted feature
+* @param IFeature $feature Feature to register
+*/
+   public function registerFeature( IFeature $feature ) {
+   $this->features[] = $feature;
+   }
+
+   /**
+* @param string $mode Mode
+* @return array
+  

[MediaWiki-commits] [Gerrit] mediawiki...MobileFrontend[specialpages]: Mobile Frontend feature management system

2018-01-08 Thread Pmiazga (Code Review)
Pmiazga has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/402938 )

Change subject: Mobile Frontend feature management system
..

Mobile Frontend feature management system

Bug: T182362
Change-Id: If7ebace5ace1b2f191a53e6a1e8bc373307af08f
---
A ServiceWiring.php
M extension.json
M includes/MobileFrontend.hooks.php
M includes/ServiceWiring.php
A includes/features/Feature.php
A includes/features/FeaturesManager.php
A includes/features/IFeature.php
M includes/specials/SpecialMobileOptions.php
8 files changed, 197 insertions(+), 13 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/MobileFrontend 
refs/changes/38/402938/1

diff --git a/ServiceWiring.php b/ServiceWiring.php
new file mode 100644
index 000..ee9abfb
--- /dev/null
+++ b/ServiceWiring.php
@@ -0,0 +1,28 @@
+ function ( MediaWikiServices $services ) {
+   return $services->getService( 'ConfigFactory' )
+   ->makeConfig( 'mobilefrontend' );
+   },
+
+   'MobileFrontend.FeaturesManager' => function ( MediaWikiServices 
$services ) {
+   $config = $services->getService( 'MobileFrontend.Config' );
+
+   $manager = new FeaturesManager();
+   // register default features
+   // maybe we can get all available features by looping through 
MobileFrontend.Feature.*
+   // and register it here, it would be nice to have something like
+   // $services->getAllByPrefix('MobileFrontend.Feature')
+   $manager->registerFeature( new Feature( 
'MFEnableWikidataDescriptions',
+   $config->get( 'MFEnableWikidataDescriptions' ) ) );
+   $manager->registerFeature( new Feature( 'MFLazyLoadReferences',
+   $config->get( 'MFLazyLoadReferences' ) ) );
+
+   return $manager;
+   },
+];
diff --git a/extension.json b/extension.json
index 54c8107..3c0aae6 100644
--- a/extension.json
+++ b/extension.json
@@ -45,6 +45,9 @@
"ExtensionMessagesFiles": {
"MobileFrontendAlias": "MobileFrontend.alias.php"
},
+   "AutoloadNamespaces": {
+   "MobileFrontend\\Features\\" : "includes/features/"
+   },
"AutoloadClasses": {
"ExtMobileFrontend": "includes/MobileFrontend.body.php",
"MobileFrontendHooks": "includes/MobileFrontend.hooks.php",
diff --git a/includes/MobileFrontend.hooks.php 
b/includes/MobileFrontend.hooks.php
index 91b943d..07614f9 100644
--- a/includes/MobileFrontend.hooks.php
+++ b/includes/MobileFrontend.hooks.php
@@ -122,6 +122,13 @@
$skin = self::getDefaultMobileSkin( $context, $mobileContext );
Hooks::run( 'RequestContextCreateSkinMobile', [ $mobileContext, 
$skin ] );
 
+   // TODO, do we want to have a specific hook just for Mobile 
Features initialization
+   // or do we want to reuse the RequestContextCreateSkinMobile 
and use MediawikiService
+   // to retrieve the FeaturesManager
+   $featureManager = \MediaWiki\MediaWikiServices::getInstance()
+   ->getService( 'MobileFrontend.FeaturesManager' );
+   Hooks::run( 'MobileFrontendFeaturesRegistration', [ 
$featureManager ] );
+
return false;
}
 
diff --git a/includes/ServiceWiring.php b/includes/ServiceWiring.php
index efc21e1..ee9abfb 100644
--- a/includes/ServiceWiring.php
+++ b/includes/ServiceWiring.php
@@ -1,10 +1,28 @@
  function ( MediaWikiServices $services ) {
return $services->getService( 'ConfigFactory' )
->makeConfig( 'mobilefrontend' );
-   }
+   },
+
+   'MobileFrontend.FeaturesManager' => function ( MediaWikiServices 
$services ) {
+   $config = $services->getService( 'MobileFrontend.Config' );
+
+   $manager = new FeaturesManager();
+   // register default features
+   // maybe we can get all available features by looping through 
MobileFrontend.Feature.*
+   // and register it here, it would be nice to have something like
+   // $services->getAllByPrefix('MobileFrontend.Feature')
+   $manager->registerFeature( new Feature( 
'MFEnableWikidataDescriptions',
+   $config->get( 'MFEnableWikidataDescriptions' ) ) );
+   $manager->registerFeature( new Feature( 'MFLazyLoadReferences',
+   $config->get( 'MFLazyLoadReferences' ) ) );
+
+   return $manager;
+   },
 ];
diff --git a/includes/features/Feature.php b/includes/features/Feature.php
new file mode 100644
index 000..d03ac88
--- /dev/null
+++ b/includes/features/Feature.php
@@ -0,0 +1,59 @@
+name = $name;
+   $this->config = $config;
+   }
+
+   /**
+* @inheritDoc
+*/
+   public