jenkins-bot has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/350392 )

Change subject: Grammatical features view
......................................................................


Grammatical features view

Bug: T162788
Change-Id: Ic5e7ca48f572850f370e0e964e06908dbc1feba8
---
M WikibaseLexeme.entitytypes.php
M resources/lexeme.css
M resources/templates.php
M src/DataModel/LexemeForm.php
M src/DataModel/Serialization/LexemeDeserializer.php
M src/View/LexemeFormsView.php
M src/View/LexemeView.php
M src/View/LexemeViewFactory.php
M tests/browser/features/forms.feature
M tests/browser/features/step_definitions/forms_steps.rb
M tests/browser/features/support/pages/lexeme_page.rb
M tests/phpunit/composer/DataModel/Serialization/LexemeDeserializerTest.php
M tests/phpunit/composer/DataModel/Serialization/LexemeSerializerTest.php
M tests/phpunit/mediawiki/View/LexemeFormsViewTest.php
M tests/phpunit/mediawiki/View/LexemeViewFactoryTest.php
15 files changed, 154 insertions(+), 29 deletions(-)

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



diff --git a/WikibaseLexeme.entitytypes.php b/WikibaseLexeme.entitytypes.php
index 3492e4c..55db0e6 100644
--- a/WikibaseLexeme.entitytypes.php
+++ b/WikibaseLexeme.entitytypes.php
@@ -68,7 +68,8 @@
                                $labelDescriptionLookup,
                                $fallbackChain,
                                $editSectionGenerator,
-                               $entityTermsView
+                               $entityTermsView,
+                               
WikibaseRepo::getDefaultInstance()->getEntityIdHtmlLinkFormatterFactory()
                        );
 
                        return $factory->newLexemeView();
diff --git a/resources/lexeme.css b/resources/lexeme.css
index 531efe9..9a50d86 100644
--- a/resources/lexeme.css
+++ b/resources/lexeme.css
@@ -17,3 +17,11 @@
        clear: left;
        margin-left: 10px; /* same as .wb-section-heading */
 }
+
+.wikibase-lexeme-form-grammatical-features {
+       display: flex;
+}
+
+.wikibase-lexeme-form-grammatical-features-values {
+       margin: 0 10px;
+}
diff --git a/resources/templates.php b/resources/templates.php
index 324a6d1..a2e4138 100644
--- a/resources/templates.php
+++ b/resources/templates.php
@@ -15,7 +15,13 @@
        $templates = [];
 
        $templates['wikibase-lexeme-form'] = <<<'HTML'
-<h3 class="wikibase-lexeme-form-representation" lang="$1">$2<!-- 
wikibase-lexeme-form-id --> $3</h3>
+<div class="wikibase-lexeme-form">
+       <h3 class="wikibase-lexeme-form-representation" lang="$1">$2 $3</h3>
+       <div class="wikibase-lexeme-form-grammatical-features">
+               <div 
class="wikibase-lexeme-form-grammatical-features-header">Grammatical 
features</div>
+               <div 
class="wikibase-lexeme-form-grammatical-features-values">$4</div>
+       </div>
+</div>
 HTML;
 
        $templates['wikibase-lexeme-form-id'] = <<<'HTML'
diff --git a/src/DataModel/LexemeForm.php b/src/DataModel/LexemeForm.php
index 3ae2bec..32386e7 100644
--- a/src/DataModel/LexemeForm.php
+++ b/src/DataModel/LexemeForm.php
@@ -2,6 +2,8 @@
 
 namespace Wikibase\Lexeme\DataModel;
 
+use Wikibase\DataModel\Entity\ItemId;
+
 /**
  * @license GPL-2.0+
  * @author Thiemo Mättig
@@ -19,12 +21,23 @@
        private $representation;
 
        /**
-        * @param LexemeFormId $id|null
-        * @param string $representation
+        * @var ItemId[]
         */
-       public function __construct( LexemeFormId $id = null, $representation ) 
{
+       private $grammaticalFeatures;
+
+       /**
+        * @param LexemeFormId $id |null
+        * @param string $representation
+        * @param ItemId[] $grammaticalFeatures
+        */
+       public function __construct(
+               LexemeFormId $id = null,
+               $representation,
+               array $grammaticalFeatures
+       ) {
                $this->id = $id;
                $this->representation = $representation;
+               $this->grammaticalFeatures = $grammaticalFeatures;
        }
 
        /**
@@ -41,4 +54,8 @@
                return $this->representation;
        }
 
+       public function getGrammaticalFeatures() {
+               return $this->grammaticalFeatures;
+       }
+
 }
diff --git a/src/DataModel/Serialization/LexemeDeserializer.php 
b/src/DataModel/Serialization/LexemeDeserializer.php
index 0a53a68..66bd6b3 100644
--- a/src/DataModel/Serialization/LexemeDeserializer.php
+++ b/src/DataModel/Serialization/LexemeDeserializer.php
@@ -162,7 +162,7 @@
                }
 
                // TODO: Throw proper exception if array key does not exist
-               return new LexemeForm( $id, $serialization['representation'] );
+               return new LexemeForm( $id, $serialization['representation'], 
[] );
        }
 
 }
diff --git a/src/View/LexemeFormsView.php b/src/View/LexemeFormsView.php
index 36bd16b..da5a8d3 100644
--- a/src/View/LexemeFormsView.php
+++ b/src/View/LexemeFormsView.php
@@ -2,9 +2,11 @@
 
 namespace Wikibase\Lexeme\View;
 
+use Wikibase\DataModel\Entity\ItemId;
 use Wikibase\Lexeme\DataModel\LexemeForm;
 use Wikibase\Lexeme\DataModel\LexemeFormId;
 use Wikibase\Lexeme\View\Template\LexemeTemplateFactory;
+use Wikibase\Lib\EntityIdHtmlLinkFormatter;
 use Wikibase\View\LocalizedTextProvider;
 
 /**
@@ -23,12 +25,19 @@
         */
        private $templateFactory;
 
+       /**
+        * @var EntityIdHtmlLinkFormatter
+        */
+       private $entityIdHtmlFormatter;
+
        public function __construct(
                LocalizedTextProvider $textProvider,
-               LexemeTemplateFactory $templateFactory
+               LexemeTemplateFactory $templateFactory,
+               EntityIdHtmlLinkFormatter $entityIdHtmlFormatter
        ) {
                $this->textProvider = $textProvider;
                $this->templateFactory = $templateFactory;
+               $this->entityIdHtmlFormatter = $entityIdHtmlFormatter;
        }
 
        /**
@@ -63,11 +72,28 @@
                return $this->templateFactory->render( 'wikibase-lexeme-form', [
                        'some language',
                        htmlspecialchars( $representation ),
-                       $this->getFormIdHtml( $form->getId() )
+                       $this->getFormIdHtml( $form->getId() ),
+                       implode(
+                               $this->textProvider->get( 'comma-separator' ),
+                               array_map(
+                                       function ( ItemId $id ) {
+                                               return 
$this->getGrammaticalFeatureHtml( $id );
+                                       },
+                                       $form->getGrammaticalFeatures()
+                               )
+                       )
                ] );
        }
 
        /**
+        * @param ItemId $id
+        * @return string
+        */
+       private function getGrammaticalFeatureHtml( ItemId $id ) {
+               return $this->entityIdHtmlFormatter->formatEntityId( $id );
+       }
+
+       /**
         * @param LexemeFormId|null $id
         *
         * @return string HTML
diff --git a/src/View/LexemeView.php b/src/View/LexemeView.php
index c7eadd7..c5205e6 100644
--- a/src/View/LexemeView.php
+++ b/src/View/LexemeView.php
@@ -105,9 +105,9 @@
 
                // TODO: This obviously is a dummy that must be removed
                $forms = [
-                       new LexemeForm( new LexemeFormId( 'F1' ), 'A' ),
-                       new LexemeForm( new LexemeFormId( 'F2' ), 'B' ),
-                       new LexemeForm( new LexemeFormId( 'F3' ), 'C' ),
+                       new LexemeForm( new LexemeFormId( 'F1' ), 'A', [] ),
+                       new LexemeForm( new LexemeFormId( 'F2' ), 'B', [ new 
ItemId( 'Q2' ) ] ),
+                       new LexemeForm( new LexemeFormId( 'F3' ), 'C', [ new 
ItemId( 'Q2' ), new ItemId( 'Q3' ) ] ),
                ];
 
                $html = $this->getHtmlForLexicalCategoryAndLanguage( $entity )
diff --git a/src/View/LexemeViewFactory.php b/src/View/LexemeViewFactory.php
index 37844e4..9baab36 100644
--- a/src/View/LexemeViewFactory.php
+++ b/src/View/LexemeViewFactory.php
@@ -7,6 +7,7 @@
 use Wikibase\LanguageFallbackChain;
 use Wikibase\Lexeme\View\Template\LexemeTemplateFactory;
 use Wikibase\Lib\LanguageNameLookup;
+use Wikibase\Repo\EntityIdHtmlLinkFormatterFactory;
 use Wikibase\Repo\MediaWikiLanguageDirectionalityLookup;
 use Wikibase\Repo\MediaWikiLocalizedTextProvider;
 use Wikibase\Repo\ParserOutput\FallbackHintHtmlTermRenderer;
@@ -47,6 +48,11 @@
        private $entityTermsView;
 
        /**
+        * @var EntityIdHtmlLinkFormatterFactory
+        */
+       private $entityIdHtmlLinkFormatterFactory;
+
+       /**
         * @param string $languageCode
         * @param LabelDescriptionLookup $labelDescriptionLookup
         * @param LanguageFallbackChain $fallbackChain
@@ -58,13 +64,15 @@
                LabelDescriptionLookup $labelDescriptionLookup,
                LanguageFallbackChain $fallbackChain,
                EditSectionGenerator $editSectionGenerator,
-               EntityTermsView $entityTermsView
+               EntityTermsView $entityTermsView,
+               EntityIdHtmlLinkFormatterFactory 
$entityIdHtmlLinkFormatterFactory
        ) {
                $this->languageCode = $languageCode;
                $this->labelDescriptionLookup = $labelDescriptionLookup;
                $this->fallbackChain = $fallbackChain;
                $this->editSectionGenerator = $editSectionGenerator;
                $this->entityTermsView = $entityTermsView;
+               $this->entityIdHtmlLinkFormatterFactory = 
$entityIdHtmlLinkFormatterFactory;
        }
 
        public function newLexemeView() {
@@ -72,10 +80,6 @@
                $languageDirectionalityLookup = new 
MediaWikiLanguageDirectionalityLookup();
                $localizedTextProvider = new MediaWikiLocalizedTextProvider( 
$this->languageCode );
 
-               $formsView = new LexemeFormsView(
-                       $localizedTextProvider,
-                       new LexemeTemplateFactory( $templates )
-               );
                $sensesView = new SensesView( $localizedTextProvider );
 
                $wikibaseRepo = WikibaseRepo::getDefaultInstance();
@@ -99,6 +103,13 @@
                        ->getLanguageFallbackLabelDescriptionLookupFactory()
                        ->newLabelDescriptionLookup( Language::factory( 
$this->languageCode ) );
 
+               $formsView = new LexemeFormsView(
+                       $localizedTextProvider,
+                       new LexemeTemplateFactory( $templates ),
+                       $this->entityIdHtmlLinkFormatterFactory
+                               ->getEntityIdFormatter( 
$retrievingLabelDescriptionLookup )
+               );
+
                return new LexemeView(
                        TemplateFactory::getDefaultInstance(),
                        $this->entityTermsView,
diff --git a/tests/browser/features/forms.feature 
b/tests/browser/features/forms.feature
index b5e864b..9cbb4b4 100644
--- a/tests/browser/features/forms.feature
+++ b/tests/browser/features/forms.feature
@@ -11,4 +11,8 @@
     Then Forms header should be there
      And Forms container should be there
      And for each Form there is a representation and an ID
-     And each representation is enclosed in tag having lang attribute with 
"some language" as a value
\ No newline at end of file
+     And each representation is enclosed in tag having lang attribute with 
"some language" as a value
+
+  @integration
+  Scenario: View Forms grammatical features
+    And for each Form there is a grammatical feature list
diff --git a/tests/browser/features/step_definitions/forms_steps.rb 
b/tests/browser/features/step_definitions/forms_steps.rb
index fb3757d..87dfceb 100644
--- a/tests/browser/features/step_definitions/forms_steps.rb
+++ b/tests/browser/features/step_definitions/forms_steps.rb
@@ -15,4 +15,10 @@
 Then(/^each representation is enclosed in tag having lang attribute with 
"(.+)" as a value$/) do  |value|
   #todo: this only checks if there is at least one lang attribute
  on(LexemePage).form_representation_element.attribute('lang').should == value
-end
\ No newline at end of file
+end
+
+Given(/^for each Form there is a grammatical feature list$/) do
+  on(LexemePage).forms.each do |form|
+    expect(form.grammatical_features?).to be true
+  end
+end
diff --git a/tests/browser/features/support/pages/lexeme_page.rb 
b/tests/browser/features/support/pages/lexeme_page.rb
index 41d9439..63817ac 100644
--- a/tests/browser/features/support/pages/lexeme_page.rb
+++ b/tests/browser/features/support/pages/lexeme_page.rb
@@ -1,3 +1,10 @@
+class LexemeForm
+  include PageObject
+
+  div(:grammatical_features, class: 
'wikibase-lexeme-form-grammatical-features')
+end
+
+
 class LexemePage
   include PageObject
   include EntityPage
@@ -9,6 +16,8 @@
   span(:senses_header, id: 'senses')
   div(:senses_container, class: 'wikibase-lexeme-senses')
 
+  page_sections(:forms, LexemeForm, class: 'wikibase-lexeme-form')
+
   def create_lexeme(lexeme_data)
     wb_api = MediawikiApi::Wikidata::WikidataClient.new URL.repo_api
     resp = wb_api.create_entity(lexeme_data, "lexeme")
diff --git 
a/tests/phpunit/composer/DataModel/Serialization/LexemeDeserializerTest.php 
b/tests/phpunit/composer/DataModel/Serialization/LexemeDeserializerTest.php
index ffbad9b..6a0728a 100644
--- a/tests/phpunit/composer/DataModel/Serialization/LexemeDeserializerTest.php
+++ b/tests/phpunit/composer/DataModel/Serialization/LexemeDeserializerTest.php
@@ -164,7 +164,7 @@
                        $lexeme
                ];
 
-               $forms = [ new LexemeForm( null, 'form' ) ];
+               $forms = [ new LexemeForm( null, 'form', [] ) ];
                $lexeme = new Lexeme( null, null, null, null, null, $forms );
                $serializations['with minimal forms'] = [
                        [
@@ -174,7 +174,8 @@
                        $lexeme
                ];
 
-               $forms = [ new LexemeForm( new LexemeFormId( 'F5' ), 'form' ) ];
+               //TODO: Test grammatical features (de)serialization
+               $forms = [ new LexemeForm( new LexemeFormId( 'F5' ), 'form', [] 
) ];
                $lexeme = new Lexeme( new LexemeId( 'L5' ), null, null, null, 
null, $forms );
                $serializations['with forms and all IDs set'] = [
                        [
diff --git 
a/tests/phpunit/composer/DataModel/Serialization/LexemeSerializerTest.php 
b/tests/phpunit/composer/DataModel/Serialization/LexemeSerializerTest.php
index ac71e14..d88eb73 100644
--- a/tests/phpunit/composer/DataModel/Serialization/LexemeSerializerTest.php
+++ b/tests/phpunit/composer/DataModel/Serialization/LexemeSerializerTest.php
@@ -127,7 +127,7 @@
                        ]
                ];
 
-               $forms = [ new LexemeForm( null, 'form' ) ];
+               $forms = [ new LexemeForm( null, 'form', [] ) ];
                $lexeme = new Lexeme( null, null, $lexicalCategory, $language, 
null, $forms );
                $serializations['with minimal forms'] = [
                        $lexeme,
@@ -140,7 +140,7 @@
                        ]
                ];
 
-               $forms = [ new LexemeForm( new LexemeFormId( 'F5' ), 'form' ) ];
+               $forms = [ new LexemeForm( new LexemeFormId( 'F5' ), 'form', [] 
) ];
                $lexeme = new Lexeme( new LexemeId( 'L5' ), null, 
$lexicalCategory, $language, null, $forms );
                $serializations['with forms and all IDs set'] = [
                        $lexeme,
diff --git a/tests/phpunit/mediawiki/View/LexemeFormsViewTest.php 
b/tests/phpunit/mediawiki/View/LexemeFormsViewTest.php
index 86e9ca8..709952e 100644
--- a/tests/phpunit/mediawiki/View/LexemeFormsViewTest.php
+++ b/tests/phpunit/mediawiki/View/LexemeFormsViewTest.php
@@ -3,10 +3,15 @@
 namespace Wikibase\Lexeme\Tests\MediaWiki\View;
 
 use PHPUnit_Framework_TestCase;
+use Wikibase\DataModel\Entity\ItemId;
+use Wikibase\DataModel\Services\Lookup\LabelDescriptionLookup;
 use Wikibase\Lexeme\DataModel\LexemeForm;
 use Wikibase\Lexeme\DataModel\LexemeFormId;
 use Wikibase\Lexeme\View\LexemeFormsView;
 use Wikibase\Lexeme\View\Template\LexemeTemplateFactory;
+use Wikibase\Lib\EntityIdHtmlLinkFormatter;
+use Wikibase\Lib\LanguageNameLookup;
+use Wikibase\Lib\Store\EntityTitleLookup;
 use Wikibase\View\DummyLocalizedTextProvider;
 
 /**
@@ -50,14 +55,32 @@
        public function testHtmlContainsFormRepresentationWithIdAndLanguage() {
                $view = $this->newFormsView();
                $html = $view->getHtml( [
-                       new LexemeForm( new LexemeFormId( 'FORM_ID' ), 
'FORM_REPRESENTATION' )
+                       new LexemeForm( new LexemeFormId( 'FORM_ID' ), 
'FORM_REPRESENTATION', [] )
                ] );
 
                assertThat(
                        $html,
-                       is( htmlPiece( havingChild( both( tagMatchingOutline(
-                               '<h3 lang="some language">'
-                       ) )->andAlso( havingTextContents( 'FORM_REPRESENTATION 
(FORM_ID)' ) ) ) ) )
+                       is( htmlPiece( havingChild(
+                               both( tagMatchingOutline( '<h3 lang="some 
language">' ) )
+                                       ->andAlso( havingTextContents( 
containsString( 'FORM_REPRESENTATION (FORM_ID)' ) ) )
+                       ) ) )
+               );
+       }
+
+       public function testHtmlContainsFormGrammaticalFeatures() {
+               $view = $this->newFormsView();
+               $grammaticalFeature = new ItemId( 'Q1' );
+               $lexemeForm = new LexemeForm(
+                       new LexemeFormId( 'FORM_ID' ),
+                       'FORM_REPRESENTATION',
+                       [ $grammaticalFeature ]
+               );
+
+               $html = $view->getHtml( [ $lexemeForm ] );
+
+               assertThat(
+                       $html,
+                       is( htmlPiece( havingChild( havingTextContents( 
containsString( 'Q1' ) ) ) ) )
                );
        }
 
@@ -65,9 +88,14 @@
                return new LexemeFormsView(
                        new DummyLocalizedTextProvider(),
                        new LexemeTemplateFactory( [
-                               'wikibase-lexeme-form' => '<h3 lang="$1">$2 
$3</h3>',
+                               'wikibase-lexeme-form' => '<h3 lang="$1">$2 $3 
$4</h3>',
                                'wikibase-lexeme-form-id' => '$1',
-                       ] )
+                       ] ),
+                       new EntityIdHtmlLinkFormatter(
+                               $this->getMock( LabelDescriptionLookup::class ),
+                               $this->getMock( EntityTitleLookup::class ),
+                               $this->getMock( LanguageNameLookup::class )
+                       )
                );
        }
 
diff --git a/tests/phpunit/mediawiki/View/LexemeViewFactoryTest.php 
b/tests/phpunit/mediawiki/View/LexemeViewFactoryTest.php
index 432be6a..72b2d8f 100644
--- a/tests/phpunit/mediawiki/View/LexemeViewFactoryTest.php
+++ b/tests/phpunit/mediawiki/View/LexemeViewFactoryTest.php
@@ -3,10 +3,13 @@
 namespace Wikibase\Lexeme\Tests\MediaWiki\View;
 
 use PHPUnit_Framework_TestCase;
+use Prophecy\Argument;
 use Wikibase\DataModel\Services\Lookup\LabelDescriptionLookup;
 use Wikibase\LanguageFallbackChain;
 use Wikibase\Lexeme\View\LexemeView;
 use Wikibase\Lexeme\View\LexemeViewFactory;
+use Wikibase\Lib\EntityIdHtmlLinkFormatter;
+use Wikibase\Repo\EntityIdHtmlLinkFormatterFactory;
 use Wikibase\View\EditSectionGenerator;
 use Wikibase\View\EntityTermsView;
 
@@ -21,12 +24,17 @@
 class LexemeViewFactoryTest extends PHPUnit_Framework_TestCase {
 
        public function testNewLexemeView() {
+               $formatterFactory = $this->prophesize( 
EntityIdHtmlLinkFormatterFactory::class );
+               $formatter = $this->prophesize( 
EntityIdHtmlLinkFormatter::class );
+               $formatterFactory->getEntityIdFormatter( Argument::any() 
)->willReturn( $formatter );
+
                $factory = new LexemeViewFactory(
                        'en',
                        $this->getMock( LabelDescriptionLookup::class ),
                        new LanguageFallbackChain( [] ),
                        $this->getMock( EditSectionGenerator::class ),
-                       $this->getMock( EntityTermsView::class )
+                       $this->getMock( EntityTermsView::class ),
+                       $formatterFactory->reveal()
                );
                $view = $factory->newLexemeView();
                $this->assertInstanceOf( LexemeView::class, $view );

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

Gerrit-MessageType: merged
Gerrit-Change-Id: Ic5e7ca48f572850f370e0e964e06908dbc1feba8
Gerrit-PatchSet: 7
Gerrit-Project: mediawiki/extensions/WikibaseLexeme
Gerrit-Branch: master
Gerrit-Owner: Aleksey Bekh-Ivanov (WMDE) <[email protected]>
Gerrit-Reviewer: Aleksey Bekh-Ivanov (WMDE) <[email protected]>
Gerrit-Reviewer: Jakob <[email protected]>
Gerrit-Reviewer: Jonas Kress (WMDE) <[email protected]>
Gerrit-Reviewer: Thiemo Mättig (WMDE) <[email protected]>
Gerrit-Reviewer: WMDE-leszek <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to