om 1.8.0 → 1.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
 - data/.rspec +1 -0
 - data/.rubocop.yml +1 -0
 - data/.rubocop_todo.yml +382 -0
 - data/.travis.yml +10 -0
 - data/Rakefile +1 -1
 - data/container_spec.rb +14 -14
 - data/gemfiles/gemfile.rails3 +11 -0
 - data/gemfiles/gemfile.rails4 +10 -0
 - data/lib/om.rb +9 -12
 - data/lib/om/samples/mods_article.rb +9 -9
 - data/lib/om/tree_node.rb +6 -6
 - data/lib/om/version.rb +1 -1
 - data/lib/om/xml.rb +18 -20
 - data/lib/om/xml/container.rb +12 -12
 - data/lib/om/xml/document.rb +3 -7
 - data/lib/om/xml/dynamic_node.rb +45 -50
 - data/lib/om/xml/named_term_proxy.rb +13 -13
 - data/lib/om/xml/node_generator.rb +3 -3
 - data/lib/om/xml/template_registry.rb +18 -26
 - data/lib/om/xml/term.rb +30 -46
 - data/lib/om/xml/term_value_operators.rb +52 -56
 - data/lib/om/xml/term_xpath_generator.rb +51 -57
 - data/lib/om/xml/terminology.rb +8 -10
 - data/lib/om/xml/validation.rb +19 -19
 - data/lib/om/xml/vocabulary.rb +4 -4
 - data/lib/tasks/om.rake +4 -6
 - data/om.gemspec +1 -2
 - data/spec/integration/differentiated_elements_spec.rb +2 -2
 - data/spec/integration/element_value_spec.rb +13 -13
 - data/spec/integration/proxies_and_ref_spec.rb +15 -15
 - data/spec/integration/querying_documents_spec.rb +24 -18
 - data/spec/integration/rights_metadata_integration_example_spec.rb +18 -18
 - data/spec/integration/selective_querying_spec.rb +1 -1
 - data/spec/integration/serialization_spec.rb +13 -13
 - data/spec/integration/set_reentrant_terminology_spec.rb +7 -7
 - data/spec/integration/xpathy_stuff_spec.rb +16 -16
 - data/spec/spec_helper.rb +2 -3
 - data/spec/unit/container_spec.rb +28 -29
 - data/spec/unit/document_spec.rb +49 -50
 - data/spec/unit/dynamic_node_spec.rb +55 -47
 - data/spec/unit/named_term_proxy_spec.rb +16 -16
 - data/spec/unit/node_generator_spec.rb +7 -7
 - data/spec/unit/nokogiri_sanity_spec.rb +30 -30
 - data/spec/unit/om_spec.rb +5 -5
 - data/spec/unit/template_registry_spec.rb +69 -69
 - data/spec/unit/term_builder_spec.rb +77 -77
 - data/spec/unit/term_spec.rb +78 -72
 - data/spec/unit/term_value_operators_spec.rb +186 -191
 - data/spec/unit/term_xpath_generator_spec.rb +37 -43
 - data/spec/unit/terminology_builder_spec.rb +85 -85
 - data/spec/unit/terminology_spec.rb +98 -98
 - data/spec/unit/validation_spec.rb +22 -22
 - data/spec/unit/xml_serialization_spec.rb +21 -22
 - data/spec/unit/xml_spec.rb +7 -7
 - metadata +143 -147
 
| 
         @@ -18,73 +18,71 @@ describe "OM::XML::TermXpathGeneratorSpec" do 
     | 
|
| 
       18 
18 
     | 
    
         
             
              end
         
     | 
| 
       19 
19 
     | 
    
         | 
| 
       20 
20 
     | 
    
         
             
              before(:each) do
         
     | 
| 
       21 
     | 
    
         
            -
                @test_term 
     | 
| 
      
 21 
     | 
    
         
            +
                @test_term                   = OM::XML::Term.new(:terms_of_address, :path=>"namePart", :attributes=>{:type=>"termsOfAddress"})
         
     | 
| 
       22 
22 
     | 
    
         
             
                @test_term_with_default_path = OM::XML::Term.new(:volume, :path=>"detail", :attributes=>{:type=>"volume"}, :default_content_path=>"number")
         
     | 
| 
       23 
     | 
    
         
            -
                @test_role_text 
     | 
| 
       24 
     | 
    
         
            -
                @test_lang_attribute 
     | 
| 
       25 
     | 
    
         
            -
                @test_none_attribute_value 
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
      
 23 
     | 
    
         
            +
                @test_role_text              = OM::XML::Term.new(:role_text, :path=>"roleTerm", :attributes=>{:type=>"text"})
         
     | 
| 
      
 24 
     | 
    
         
            +
                @test_lang_attribute         = OM::XML::Term.new(:language, :path=>{:attribute=>"lang"})
         
     | 
| 
      
 25 
     | 
    
         
            +
                @test_none_attribute_value   = OM::XML::Term.new(:person_id, :path=>"namePart", :attributes=>{:type=>:none})
         
     | 
| 
       27 
26 
     | 
    
         
             
              end
         
     | 
| 
       28 
27 
     | 
    
         | 
| 
       29 
28 
     | 
    
         
             
              it "should support terms that are pointers to attribute values" do
         
     | 
| 
       30 
     | 
    
         
            -
                OM::XML::TermXpathGenerator.generate_xpath(@test_lang_attribute, :absolute). 
     | 
| 
       31 
     | 
    
         
            -
                OM::XML::TermXpathGenerator.generate_xpath(@test_lang_attribute, :relative). 
     | 
| 
       32 
     | 
    
         
            -
                OM::XML::TermXpathGenerator.generate_xpath(@test_lang_attribute, :constrained). 
     | 
| 
      
 29 
     | 
    
         
            +
                expect(OM::XML::TermXpathGenerator.generate_xpath(@test_lang_attribute, :absolute)).to eq("//@lang")
         
     | 
| 
      
 30 
     | 
    
         
            +
                expect(OM::XML::TermXpathGenerator.generate_xpath(@test_lang_attribute, :relative)).to eq("@lang")
         
     | 
| 
      
 31 
     | 
    
         
            +
                expect(OM::XML::TermXpathGenerator.generate_xpath(@test_lang_attribute, :constrained)).to eq('//@lang[contains(., "#{constraint_value}")]'.gsub('"', '\"'))
         
     | 
| 
       33 
32 
     | 
    
         
             
              end
         
     | 
| 
       34 
33 
     | 
    
         | 
| 
       35 
34 
     | 
    
         
             
              describe "generate_xpath" do
         
     | 
| 
       36 
35 
     | 
    
         
             
                it "should generate an xpath based on the given mapper and options" do
         
     | 
| 
       37 
     | 
    
         
            -
                  OM::XML::TermXpathGenerator. 
     | 
| 
      
 36 
     | 
    
         
            +
                  expect(OM::XML::TermXpathGenerator).to receive(:generate_absolute_xpath).with(@test_term)
         
     | 
| 
       38 
37 
     | 
    
         
             
                  OM::XML::TermXpathGenerator.generate_xpath(@test_term, :absolute)
         
     | 
| 
       39 
38 
     | 
    
         | 
| 
       40 
     | 
    
         
            -
                  OM::XML::TermXpathGenerator. 
     | 
| 
      
 39 
     | 
    
         
            +
                  expect(OM::XML::TermXpathGenerator).to receive(:generate_relative_xpath).with(@test_term)
         
     | 
| 
       41 
40 
     | 
    
         
             
                  OM::XML::TermXpathGenerator.generate_xpath(@test_term, :relative)
         
     | 
| 
       42 
41 
     | 
    
         | 
| 
       43 
     | 
    
         
            -
                  OM::XML::TermXpathGenerator. 
     | 
| 
      
 42 
     | 
    
         
            +
                  expect(OM::XML::TermXpathGenerator).to receive(:generate_constrained_xpath).with(@test_term)
         
     | 
| 
       44 
43 
     | 
    
         
             
                  OM::XML::TermXpathGenerator.generate_xpath(@test_term, :constrained)
         
     | 
| 
       45 
44 
     | 
    
         
             
                end
         
     | 
| 
       46 
45 
     | 
    
         
             
              end
         
     | 
| 
       47 
46 
     | 
    
         | 
| 
       48 
47 
     | 
    
         
             
              describe "generate_relative_xpath" do
         
     | 
| 
       49 
48 
     | 
    
         
             
                it "should generate a relative xpath based on the given mapper" do
         
     | 
| 
       50 
     | 
    
         
            -
                  OM::XML::TermXpathGenerator.generate_relative_xpath(@test_term). 
     | 
| 
      
 49 
     | 
    
         
            +
                  expect(OM::XML::TermXpathGenerator.generate_relative_xpath(@test_term)).to eq('namePart[@type="termsOfAddress"]')
         
     | 
| 
       51 
50 
     | 
    
         
             
                end
         
     | 
| 
       52 
51 
     | 
    
         
             
                it "should support mappers without namespaces" do
         
     | 
| 
       53 
52 
     | 
    
         
             
                  @test_term.namespace_prefix = nil
         
     | 
| 
       54 
     | 
    
         
            -
                  OM::XML::TermXpathGenerator.generate_relative_xpath(@test_term). 
     | 
| 
      
 53 
     | 
    
         
            +
                  expect(OM::XML::TermXpathGenerator.generate_relative_xpath(@test_term)).to eq('namePart[@type="termsOfAddress"]')
         
     | 
| 
       55 
54 
     | 
    
         
             
                end
         
     | 
| 
       56 
55 
     | 
    
         
             
                it "should not use a namespace for a path set to text() and should include normalize-space to ignore white space" do
         
     | 
| 
       57 
56 
     | 
    
         
             
                  text_term = OM::XML::Term.new(:title_content, :path=>"text()")
         
     | 
| 
       58 
     | 
    
         
            -
                  OM::XML::TermXpathGenerator.generate_relative_xpath(text_term). 
     | 
| 
      
 57 
     | 
    
         
            +
                  expect(OM::XML::TermXpathGenerator.generate_relative_xpath(text_term)).to eq('text()[normalize-space(.)]')
         
     | 
| 
       59 
58 
     | 
    
         
             
                end
         
     | 
| 
       60 
59 
     | 
    
         
             
                it "should set a 'not' predicate if the attribute value is :none" do
         
     | 
| 
       61 
     | 
    
         
            -
                   OM::XML::TermXpathGenerator.generate_relative_xpath(@test_none_attribute_value). 
     | 
| 
      
 60 
     | 
    
         
            +
                   expect(OM::XML::TermXpathGenerator.generate_relative_xpath(@test_none_attribute_value)).to eq('namePart[not(@type)]')
         
     | 
| 
       62 
61 
     | 
    
         
             
                end
         
     | 
| 
       63 
     | 
    
         
            -
             
     | 
| 
       64 
62 
     | 
    
         
             
              end
         
     | 
| 
       65 
63 
     | 
    
         | 
| 
       66 
64 
     | 
    
         
             
              describe "generate_absolute_xpath" do
         
     | 
| 
       67 
65 
     | 
    
         
             
                it "should generate an absolute xpath based on the given mapper" do
         
     | 
| 
       68 
     | 
    
         
            -
                  OM::XML::TermXpathGenerator.generate_absolute_xpath(@test_term). 
     | 
| 
      
 66 
     | 
    
         
            +
                  expect(OM::XML::TermXpathGenerator.generate_absolute_xpath(@test_term)).to eq('//namePart[@type="termsOfAddress"]')
         
     | 
| 
       69 
67 
     | 
    
         
             
                end
         
     | 
| 
       70 
68 
     | 
    
         
             
                it "should prepend the xpath for any parent nodes" do
         
     | 
| 
       71 
     | 
    
         
            -
                  mock_parent_mapper =  
     | 
| 
       72 
     | 
    
         
            -
                  @test_role_text. 
     | 
| 
       73 
     | 
    
         
            -
                  OM::XML::TermXpathGenerator.generate_absolute_xpath(@test_role_text). 
     | 
| 
      
 69 
     | 
    
         
            +
                  mock_parent_mapper = double("Term", :xpath_absolute=>'//name[@type="conference"]/role')
         
     | 
| 
      
 70 
     | 
    
         
            +
                  allow(@test_role_text).to receive(:parent).and_return(mock_parent_mapper)
         
     | 
| 
      
 71 
     | 
    
         
            +
                  expect(OM::XML::TermXpathGenerator.generate_absolute_xpath(@test_role_text)).to eq('//name[@type="conference"]/role/roleTerm[@type="text"]')
         
     | 
| 
       74 
72 
     | 
    
         
             
                end
         
     | 
| 
       75 
73 
     | 
    
         
             
              end
         
     | 
| 
       76 
74 
     | 
    
         | 
| 
       77 
75 
     | 
    
         
             
              describe "generate_constrained_xpath" do
         
     | 
| 
       78 
76 
     | 
    
         
             
                it "should generate a constrained xpath based on the given mapper" do
         
     | 
| 
       79 
     | 
    
         
            -
                  OM::XML::TermXpathGenerator.generate_constrained_xpath(@test_term). 
     | 
| 
      
 77 
     | 
    
         
            +
                  expect(OM::XML::TermXpathGenerator.generate_constrained_xpath(@test_term)).to eq('//namePart[@type="termsOfAddress" and contains(., "#{constraint_value}")]'.gsub('"', '\"'))
         
     | 
| 
       80 
78 
     | 
    
         
             
                end
         
     | 
| 
       81 
79 
     | 
    
         
             
              end
         
     | 
| 
       82 
80 
     | 
    
         | 
| 
       83 
81 
     | 
    
         
             
              it "should support mappers without namespaces" do
         
     | 
| 
       84 
82 
     | 
    
         
             
                @test_term.namespace_prefix = nil
         
     | 
| 
       85 
     | 
    
         
            -
                OM::XML::TermXpathGenerator.generate_relative_xpath(@test_term). 
     | 
| 
       86 
     | 
    
         
            -
                OM::XML::TermXpathGenerator.generate_absolute_xpath(@test_term). 
     | 
| 
       87 
     | 
    
         
            -
                OM::XML::TermXpathGenerator.generate_constrained_xpath(@test_term). 
     | 
| 
      
 83 
     | 
    
         
            +
                expect(OM::XML::TermXpathGenerator.generate_relative_xpath(@test_term)).to eq('namePart[@type="termsOfAddress"]')
         
     | 
| 
      
 84 
     | 
    
         
            +
                expect(OM::XML::TermXpathGenerator.generate_absolute_xpath(@test_term)).to eq('//namePart[@type="termsOfAddress"]')
         
     | 
| 
      
 85 
     | 
    
         
            +
                expect(OM::XML::TermXpathGenerator.generate_constrained_xpath(@test_term)).to eq('//namePart[@type="termsOfAddress" and contains(., "#{constraint_value}")]'.gsub('"', '\"'))
         
     | 
| 
       88 
86 
     | 
    
         
             
              end
         
     | 
| 
       89 
87 
     | 
    
         | 
| 
       90 
88 
     | 
    
         
             
              describe "generate_xpath_with_indexes" do
         
     | 
| 
         @@ -92,44 +90,40 @@ describe "OM::XML::TermXpathGeneratorSpec" do 
     | 
|
| 
       92 
90 
     | 
    
         
             
                  generated_xpath = OM::XML::TermXpathGenerator.generate_xpath_with_indexes( @sample_terminology, :person, {:first_name=>"Tim", :family_name=>"Berners-Lee"} )
         
     | 
| 
       93 
91 
     | 
    
         
             
                  # expect an xpath that looks like this: '//oxns:name[@type="personal" and contains(oxns:namePart[@type="family"], "Berners-Lee") and contains(oxns:namePart[@type="given"], "Tim")]'
         
     | 
| 
       94 
92 
     | 
    
         
             
                  # can't use string comparison because the contains functions can arrive in any order
         
     | 
| 
       95 
     | 
    
         
            -
                  generated_xpath. 
     | 
| 
       96 
     | 
    
         
            -
                  generated_xpath. 
     | 
| 
      
 93 
     | 
    
         
            +
                  expect(generated_xpath).to match( /\/\/oxns:name\[@type=\"personal\".*and contains\(oxns:namePart\[@type=\"given\"\], \"Tim\"\).*\]/ )
         
     | 
| 
      
 94 
     | 
    
         
            +
                  expect(generated_xpath).to match( /\/\/oxns:name\[@type=\"personal\".*and contains\(oxns:namePart\[@type=\"family\"\], \"Berners-Lee\"\).*\]/ )
         
     | 
| 
       97 
95 
     | 
    
         
             
                end
         
     | 
| 
       98 
96 
     | 
    
         
             
                it "should support xpath queries as argument" do
         
     | 
| 
       99 
     | 
    
         
            -
                  OM::XML::TermXpathGenerator.generate_xpath_with_indexes(@sample_terminology, '//oxns:name[@type="personal"][1]/oxns:namePart'). 
     | 
| 
      
 97 
     | 
    
         
            +
                  expect(OM::XML::TermXpathGenerator.generate_xpath_with_indexes(@sample_terminology, '//oxns:name[@type="personal"][1]/oxns:namePart')).to eq('//oxns:name[@type="personal"][1]/oxns:namePart')
         
     | 
| 
       100 
98 
     | 
    
         
             
                end
         
     | 
| 
       101 
99 
     | 
    
         
             
                it "should return the xpath of the terminology's root node if term pointer is nil" do
         
     | 
| 
       102 
     | 
    
         
            -
                  OM::XML::TermXpathGenerator.generate_xpath_with_indexes( @sample_terminology, nil ). 
     | 
| 
      
 100 
     | 
    
         
            +
                  expect(OM::XML::TermXpathGenerator.generate_xpath_with_indexes( @sample_terminology, nil )).to eq(@sample_terminology.root_terms.first.xpath)
         
     | 
| 
       103 
101 
     | 
    
         
             
                end
         
     | 
| 
       104 
102 
     | 
    
         
             
                it "should return / if term pointer is nil and the terminology does not have a root term defined" do
         
     | 
| 
       105 
     | 
    
         
            -
                  OM::XML::TermXpathGenerator.generate_xpath_with_indexes( @rootless_terminology, nil ). 
     | 
| 
      
 103 
     | 
    
         
            +
                  expect(OM::XML::TermXpathGenerator.generate_xpath_with_indexes( @rootless_terminology, nil )).to eq("/")
         
     | 
| 
       106 
104 
     | 
    
         
             
                end
         
     | 
| 
       107 
105 
     | 
    
         
             
                it "should destringify term pointers before using them" do
         
     | 
| 
       108 
     | 
    
         
            -
                  generated_xpath = OM::XML::TermXpathGenerator.generate_xpath_with_indexes( @sample_terminology, {"person"=>"1"}, "first_name" ). 
     | 
| 
      
 106 
     | 
    
         
            +
                  generated_xpath = expect(OM::XML::TermXpathGenerator.generate_xpath_with_indexes( @sample_terminology, {"person"=>"1"}, "first_name" )).to eq('//oxns:name[@type="personal"][2]/oxns:namePart[@type="given"]')
         
     | 
| 
       109 
107 
     | 
    
         
             
                  ### Last argument is a filter, we are passing no filters
         
     | 
| 
       110 
     | 
    
         
            -
                  @sample_terminology.xpath_with_indexes(:name, {:family_name=>1},{}). 
     | 
| 
      
 108 
     | 
    
         
            +
                  expect(@sample_terminology.xpath_with_indexes(:name, {:family_name=>1},{})).to eq('//oxns:name/oxns:namePart[@type="family"][2]')
         
     | 
| 
       111 
109 
     | 
    
         
             
                end
         
     | 
| 
       112 
110 
     | 
    
         
             
                it "should warn about indexes on a proxy" do
         
     | 
| 
       113 
     | 
    
         
            -
                  Logger. 
     | 
| 
       114 
     | 
    
         
            -
                  @sample_terminology.xpath_with_indexes({:family_name=>1}). 
     | 
| 
      
 111 
     | 
    
         
            +
                  expect_any_instance_of(Logger).to receive(:warn).with("You attempted to call an index value of 1 on the term \":family_name\". However \":family_name\" is a proxy so we are ignoring the index. See https://jira.duraspace.org/browse/HYDRA-643")
         
     | 
| 
      
 112 
     | 
    
         
            +
                  expect(@sample_terminology.xpath_with_indexes({:family_name=>1})).to eq("//oxns:name/oxns:namePart[@type=\"family\"]")
         
     | 
| 
       115 
113 
     | 
    
         
             
                end
         
     | 
| 
       116 
114 
     | 
    
         
             
              end
         
     | 
| 
       117 
115 
     | 
    
         | 
| 
       118 
116 
     | 
    
         
             
              it "should support mappers with default_content_path" do
         
     | 
| 
       119 
     | 
    
         
            -
                 
     | 
| 
       120 
     | 
    
         
            -
                 
     | 
| 
       121 
     | 
    
         
            -
             
     | 
| 
       122 
     | 
    
         
            -
                OM::XML::TermXpathGenerator. 
     | 
| 
       123 
     | 
    
         
            -
                OM::XML::TermXpathGenerator. 
     | 
| 
       124 
     | 
    
         
            -
                OM::XML::TermXpathGenerator.generate_constrained_xpath(@test_term_with_default_path).should == '//oxns:detail[contains(oxns:number[@type="volume"], "#{constraint_value}")]'.gsub('"', '\"')
         
     | 
| 
      
 117 
     | 
    
         
            +
                skip "need to implement mapper_set first"
         
     | 
| 
      
 118 
     | 
    
         
            +
                # @test_term_with_default_path = OM::XML::Term.new(:volume, :path=>"detail", :attributes=>{:type=>"volume"}, :default_content_path=>"number")
         
     | 
| 
      
 119 
     | 
    
         
            +
                expect(OM::XML::TermXpathGenerator.generate_relative_xpath(@test_term_with_default_path)).to eq('oxns:detail[@type="volume"]')
         
     | 
| 
      
 120 
     | 
    
         
            +
                expect(OM::XML::TermXpathGenerator.generate_absolute_xpath(@test_term_with_default_path)).to eq('//oxns:detail[@type="volume"]')
         
     | 
| 
      
 121 
     | 
    
         
            +
                expect(OM::XML::TermXpathGenerator.generate_constrained_xpath(@test_term_with_default_path)).to eq('//oxns:detail[contains(oxns:number[@type="volume"], "#{constraint_value}")]'.gsub('"', '\"'))
         
     | 
| 
       125 
122 
     | 
    
         
             
              end
         
     | 
| 
       126 
123 
     | 
    
         | 
| 
       127 
124 
     | 
    
         
             
              it "should default to using an inherited namspace prefix" do
         
     | 
| 
       128 
     | 
    
         
            -
             
     | 
| 
       129 
125 
     | 
    
         
             
                term = @sample_terminology.retrieve_term(:person, :first_name)
         
     | 
| 
       130 
     | 
    
         
            -
                OM::XML::TermXpathGenerator.generate_absolute_xpath(term). 
     | 
| 
       131 
     | 
    
         
            -
             
     | 
| 
       132 
     | 
    
         
            -
             
     | 
| 
      
 126 
     | 
    
         
            +
                expect(OM::XML::TermXpathGenerator.generate_absolute_xpath(term)).to eq("//oxns:name[@type=\"personal\"]/oxns:namePart[@type=\"given\"]")
         
     | 
| 
       133 
127 
     | 
    
         
             
              end
         
     | 
| 
       134 
128 
     | 
    
         | 
| 
       135 
129 
     | 
    
         
             
            end
         
     | 
| 
         @@ -1,20 +1,20 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'spec_helper'
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            describe "OM::XML::Terminology::Builder" do
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
       5 
5 
     | 
    
         
             
                before(:each) do
         
     | 
| 
       6 
6 
     | 
    
         
             
                  @test_builder = OM::XML::Terminology::Builder.new
         
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
       8 
8 
     | 
    
         
             
                  @builder_with_block = OM::XML::Terminology::Builder.new do |t|
         
     | 
| 
       9 
9 
     | 
    
         
             
                    t.root(:path=>"mods", :xmlns=>"http://www.loc.gov/mods/v3", :schema=>"http://www.loc.gov/standards/mods/v3/mods-3-2.xsd")
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
       11 
11 
     | 
    
         
             
                    t.title_info(:path=>"titleInfo") {
         
     | 
| 
       12 
12 
     | 
    
         
             
                      t.main_title(:path=>"title", :label=>"title")
         
     | 
| 
       13 
13 
     | 
    
         
             
                      t.language(:path=>{:attribute=>"lang"})
         
     | 
| 
       14 
     | 
    
         
            -
                    } 
     | 
| 
      
 14 
     | 
    
         
            +
                    }
         
     | 
| 
       15 
15 
     | 
    
         
             
                    # t.title(:path=>"titleInfo", :default_content_path=>"title") {
         
     | 
| 
       16 
16 
     | 
    
         
             
                    #   t.@language(:path=>{:attribute=>"lang"})
         
     | 
| 
       17 
     | 
    
         
            -
                    # } 
     | 
| 
      
 17 
     | 
    
         
            +
                    # }
         
     | 
| 
       18 
18 
     | 
    
         
             
                    # This is a mods:name.  The underscore is purely to avoid namespace conflicts.
         
     | 
| 
       19 
19 
     | 
    
         
             
                    t.name_ {
         
     | 
| 
       20 
20 
     | 
    
         
             
                      # this is a namepart
         
     | 
| 
         @@ -29,7 +29,7 @@ describe "OM::XML::Terminology::Builder" do 
     | 
|
| 
       29 
29 
     | 
    
         
             
                      t.given_name(:path=>"namePart", :attributes=>{:type=>"given"}, :label=>"first name")
         
     | 
| 
       30 
30 
     | 
    
         
             
                      t.terms_of_address(:path=>"namePart", :attributes=>{:type=>"termsOfAddress"})
         
     | 
| 
       31 
31 
     | 
    
         
             
                    }
         
     | 
| 
       32 
     | 
    
         
            -
                    # lookup :person, :first_name 
     | 
| 
      
 32 
     | 
    
         
            +
                    # lookup :person, :first_name
         
     | 
| 
       33 
33 
     | 
    
         
             
                    t.person(:ref=>:name, :attributes=>{:type=>"personal"})
         
     | 
| 
       34 
34 
     | 
    
         | 
| 
       35 
35 
     | 
    
         
             
                    t.role {
         
     | 
| 
         @@ -61,144 +61,144 @@ describe "OM::XML::Terminology::Builder" do 
     | 
|
| 
       61 
61 
     | 
    
         
             
                  end
         
     | 
| 
       62 
62 
     | 
    
         | 
| 
       63 
63 
     | 
    
         
             
                  # @test_full_terminology = @builder_with_block.build
         
     | 
| 
       64 
     | 
    
         
            -
             
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
       65 
65 
     | 
    
         
             
                end
         
     | 
| 
       66 
     | 
    
         
            -
             
     | 
| 
       67 
     | 
    
         
            -
                it "supports proxy terms at the root of the Terminology" do 
     | 
| 
       68 
     | 
    
         
            -
                  t_builder = OM::XML::Terminology::Builder.new do |t| 
     | 
| 
       69 
     | 
    
         
            -
                    t.root(:path=>"mods", :xmlns=>"http://www.loc.gov/mods/v3", :schema=>"http://www.loc.gov/standards/mods/v3/mods-3-2.xsd") 
     | 
| 
       70 
     | 
    
         
            -
                    t.title_info(:path=>"titleInfo") { 
     | 
| 
       71 
     | 
    
         
            -
                      t.main_title(:path=>"title", :label=>"title") 
     | 
| 
       72 
     | 
    
         
            -
                      t.language(:path=>{:attribute=>"lang"}) 
     | 
| 
       73 
     | 
    
         
            -
                    } 
     | 
| 
       74 
     | 
    
         
            -
                    t.title(:proxy=>[:title_info, :main_title], :index_as =>[:facetable, :not_searchable]) 
     | 
| 
       75 
     | 
    
         
            -
                  end 
     | 
| 
       76 
     | 
    
         
            -
             
     | 
| 
       77 
     | 
    
         
            -
                  terminology = t_builder.build 
     | 
| 
       78 
     | 
    
         
            -
                  terminology.retrieve_term(:title). 
     | 
| 
       79 
     | 
    
         
            -
                  terminology.retrieve_term(:title).index_as. 
     | 
| 
       80 
     | 
    
         
            -
                  terminology.retrieve_term(:title_info, :main_title).index_as. 
     | 
| 
       81 
     | 
    
         
            -
                  terminology.xpath_for(:title). 
     | 
| 
       82 
     | 
    
         
            -
                  terminology.xpath_with_indexes({:title=>0}). 
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
                it "supports proxy terms at the root of the Terminology" do
         
     | 
| 
      
 68 
     | 
    
         
            +
                  t_builder = OM::XML::Terminology::Builder.new do |t|
         
     | 
| 
      
 69 
     | 
    
         
            +
                    t.root(:path=>"mods", :xmlns=>"http://www.loc.gov/mods/v3", :schema=>"http://www.loc.gov/standards/mods/v3/mods-3-2.xsd")
         
     | 
| 
      
 70 
     | 
    
         
            +
                    t.title_info(:path=>"titleInfo") {
         
     | 
| 
      
 71 
     | 
    
         
            +
                      t.main_title(:path=>"title", :label=>"title")
         
     | 
| 
      
 72 
     | 
    
         
            +
                      t.language(:path=>{:attribute=>"lang"})
         
     | 
| 
      
 73 
     | 
    
         
            +
                    }
         
     | 
| 
      
 74 
     | 
    
         
            +
                    t.title(:proxy=>[:title_info, :main_title], :index_as =>[:facetable, :not_searchable])
         
     | 
| 
      
 75 
     | 
    
         
            +
                  end
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
                  terminology = t_builder.build
         
     | 
| 
      
 78 
     | 
    
         
            +
                  expect(terminology.retrieve_term(:title)).to be_kind_of OM::XML::NamedTermProxy
         
     | 
| 
      
 79 
     | 
    
         
            +
                  expect(terminology.retrieve_term(:title).index_as).to eq([:facetable, :not_searchable])
         
     | 
| 
      
 80 
     | 
    
         
            +
                  expect(terminology.retrieve_term(:title_info, :main_title).index_as).to eq([])
         
     | 
| 
      
 81 
     | 
    
         
            +
                  expect(terminology.xpath_for(:title)).to eq('//oxns:titleInfo/oxns:title')
         
     | 
| 
      
 82 
     | 
    
         
            +
                  expect(terminology.xpath_with_indexes({:title=>0})).to eq("//oxns:titleInfo/oxns:title")
         
     | 
| 
       83 
83 
     | 
    
         
             
                  # @builder_with_block.build.xpath_for_pointer(:issue).should == '//oxns:part'
         
     | 
| 
       84 
84 
     | 
    
         
             
                  # terminology.xpath_for_pointer(:title).should == '//oxns:titleInfo/oxns:title'
         
     | 
| 
       85 
85 
     | 
    
         
             
                end
         
     | 
| 
       86 
     | 
    
         
            -
             
     | 
| 
      
 86 
     | 
    
         
            +
             
     | 
| 
       87 
87 
     | 
    
         
             
                describe '#new' do
         
     | 
| 
       88 
88 
     | 
    
         
             
                  it "should return an instance of OM::XML::Terminology::Builder" do
         
     | 
| 
       89 
     | 
    
         
            -
                    OM::XML::Terminology::Builder.new. 
     | 
| 
      
 89 
     | 
    
         
            +
                    expect(OM::XML::Terminology::Builder.new).to be_instance_of OM::XML::Terminology::Builder
         
     | 
| 
       90 
90 
     | 
    
         
             
                  end
         
     | 
| 
       91 
91 
     | 
    
         
             
                  it "should process the input block, creating a new Term Builder for each entry and its children" do
         
     | 
| 
       92 
92 
     | 
    
         
             
                    expected_root_terms = [:mods, :title_info, :issue, :person, :name, :journal, :role]
         
     | 
| 
       93 
93 
     | 
    
         
             
                    expected_root_terms.each do |name|
         
     | 
| 
       94 
     | 
    
         
            -
                      @builder_with_block.term_builders. 
     | 
| 
      
 94 
     | 
    
         
            +
                      expect(@builder_with_block.term_builders).to have_key(name)
         
     | 
| 
       95 
95 
     | 
    
         
             
                    end
         
     | 
| 
       96 
     | 
    
         
            -
                    @builder_with_block.term_builders.length. 
     | 
| 
       97 
     | 
    
         
            -
             
     | 
| 
       98 
     | 
    
         
            -
                    @builder_with_block.term_builders[:journal]. 
     | 
| 
       99 
     | 
    
         
            -
                    @builder_with_block.term_builders[:journal].settings[:path]. 
     | 
| 
       100 
     | 
    
         
            -
                    @builder_with_block.term_builders[:journal].settings[:attributes]. 
     | 
| 
       101 
     | 
    
         
            -
             
     | 
| 
       102 
     | 
    
         
            -
                    @builder_with_block.term_builders[:journal].children[:issn]. 
     | 
| 
       103 
     | 
    
         
            -
                    @builder_with_block.term_builders[:journal].children[:issn].settings[:path]. 
     | 
| 
       104 
     | 
    
         
            -
                    @builder_with_block.term_builders[:journal].children[:issn].settings[:attributes]. 
     | 
| 
      
 96 
     | 
    
         
            +
                    expect(@builder_with_block.term_builders.length).to eq(expected_root_terms.length)
         
     | 
| 
      
 97 
     | 
    
         
            +
             
     | 
| 
      
 98 
     | 
    
         
            +
                    expect(@builder_with_block.term_builders[:journal]).to be_instance_of OM::XML::Term::Builder
         
     | 
| 
      
 99 
     | 
    
         
            +
                    expect(@builder_with_block.term_builders[:journal].settings[:path]).to eq("relatedItem")
         
     | 
| 
      
 100 
     | 
    
         
            +
                    expect(@builder_with_block.term_builders[:journal].settings[:attributes]).to eq({:type=>"host"})
         
     | 
| 
      
 101 
     | 
    
         
            +
             
     | 
| 
      
 102 
     | 
    
         
            +
                    expect(@builder_with_block.term_builders[:journal].children[:issn]).to be_instance_of OM::XML::Term::Builder
         
     | 
| 
      
 103 
     | 
    
         
            +
                    expect(@builder_with_block.term_builders[:journal].children[:issn].settings[:path]).to eq("identifier")
         
     | 
| 
      
 104 
     | 
    
         
            +
                    expect(@builder_with_block.term_builders[:journal].children[:issn].settings[:attributes]).to eq({:type=>"issn"})
         
     | 
| 
       105 
105 
     | 
    
         
             
                  end
         
     | 
| 
       106 
106 
     | 
    
         
             
                  it "should clip the underscore off the end of any Term names" do
         
     | 
| 
       107 
     | 
    
         
            -
                    @builder_with_block.term_builders[:name]. 
     | 
| 
       108 
     | 
    
         
            -
                    @builder_with_block.term_builders[:name].name. 
     | 
| 
      
 107 
     | 
    
         
            +
                    expect(@builder_with_block.term_builders[:name]).to be_instance_of OM::XML::Term::Builder
         
     | 
| 
      
 108 
     | 
    
         
            +
                    expect(@builder_with_block.term_builders[:name].name).to eq(:name)
         
     | 
| 
       109 
109 
     | 
    
         | 
| 
       110 
     | 
    
         
            -
                    @builder_with_block.term_builders[:name].children[:date]. 
     | 
| 
       111 
     | 
    
         
            -
                    @builder_with_block.term_builders[:name].children[:date].settings[:path]. 
     | 
| 
       112 
     | 
    
         
            -
                    @builder_with_block.term_builders[:name].children[:date].settings[:attributes]. 
     | 
| 
      
 110 
     | 
    
         
            +
                    expect(@builder_with_block.term_builders[:name].children[:date]).to be_instance_of OM::XML::Term::Builder
         
     | 
| 
      
 111 
     | 
    
         
            +
                    expect(@builder_with_block.term_builders[:name].children[:date].settings[:path]).to eq("namePart")
         
     | 
| 
      
 112 
     | 
    
         
            +
                    expect(@builder_with_block.term_builders[:name].children[:date].settings[:attributes]).to eq({:type=>"date"})
         
     | 
| 
       113 
113 
     | 
    
         
             
                  end
         
     | 
| 
       114 
114 
     | 
    
         
             
                end
         
     | 
| 
       115 
     | 
    
         
            -
             
     | 
| 
      
 115 
     | 
    
         
            +
             
     | 
| 
       116 
116 
     | 
    
         
             
                describe '#from_xml' do
         
     | 
| 
       117 
117 
     | 
    
         
             
                  it "should let you load mappings from an xml file" do
         
     | 
| 
       118 
     | 
    
         
            -
                     
     | 
| 
      
 118 
     | 
    
         
            +
                    skip
         
     | 
| 
       119 
119 
     | 
    
         
             
                    vocab = OM::XML::Terminology.from_xml( fixture("sample_mappings.xml") )
         
     | 
| 
       120 
     | 
    
         
            -
                    vocab. 
     | 
| 
       121 
     | 
    
         
            -
                    vocab.mappers. 
     | 
| 
      
 120 
     | 
    
         
            +
                    expect(vocab).to be_instance_of OM::XML::Terminology
         
     | 
| 
      
 121 
     | 
    
         
            +
                    expect(vocab.mappers).to eq({})
         
     | 
| 
       122 
122 
     | 
    
         
             
                  end
         
     | 
| 
       123 
123 
     | 
    
         
             
                end
         
     | 
| 
       124 
     | 
    
         
            -
             
     | 
| 
      
 124 
     | 
    
         
            +
             
     | 
| 
       125 
125 
     | 
    
         
             
                describe ".retrieve_term_builder" do
         
     | 
| 
       126 
126 
     | 
    
         
             
                  it "should support looking up Term Builders by pointer" do
         
     | 
| 
       127 
127 
     | 
    
         
             
                    expected = @builder_with_block.term_builders[:name].children[:date]
         
     | 
| 
       128 
     | 
    
         
            -
                    @builder_with_block.retrieve_term_builder(:name, :date). 
     | 
| 
      
 128 
     | 
    
         
            +
                    expect(@builder_with_block.retrieve_term_builder(:name, :date)).to eq(expected)
         
     | 
| 
       129 
129 
     | 
    
         
             
                  end
         
     | 
| 
       130 
130 
     | 
    
         
             
                end
         
     | 
| 
       131 
     | 
    
         
            -
             
     | 
| 
      
 131 
     | 
    
         
            +
             
     | 
| 
       132 
132 
     | 
    
         
             
                describe "build" do
         
     | 
| 
       133 
133 
     | 
    
         
             
                  it "should generate the new Terminology, calling .build on its Term builders"
         
     | 
| 
       134 
134 
     | 
    
         
             
                  it "should resolve :refs" do
         
     | 
| 
       135 
     | 
    
         
            -
                    @builder_with_block.retrieve_term_builder(:name, :role).settings[:ref]. 
     | 
| 
       136 
     | 
    
         
            -
                    @builder_with_block.retrieve_term_builder(:role).children[:text]. 
     | 
| 
       137 
     | 
    
         
            -
             
     | 
| 
      
 135 
     | 
    
         
            +
                    expect(@builder_with_block.retrieve_term_builder(:name, :role).settings[:ref]).to eq([:role])
         
     | 
| 
      
 136 
     | 
    
         
            +
                    expect(@builder_with_block.retrieve_term_builder(:role).children[:text]).to be_instance_of OM::XML::Term::Builder
         
     | 
| 
      
 137 
     | 
    
         
            +
             
     | 
| 
       138 
138 
     | 
    
         
             
                    built_terminology = @builder_with_block.build
         
     | 
| 
       139 
     | 
    
         
            -
             
     | 
| 
       140 
     | 
    
         
            -
                    built_terminology.retrieve_term(:name, :role, :text). 
     | 
| 
       141 
     | 
    
         
            -
                    built_terminology.retrieve_term(:name, :role, :text).path. 
     | 
| 
       142 
     | 
    
         
            -
                    built_terminology.retrieve_term(:name, :role, :text).attributes. 
     | 
| 
      
 139 
     | 
    
         
            +
             
     | 
| 
      
 140 
     | 
    
         
            +
                    expect(built_terminology.retrieve_term(:name, :role, :text)).to be_instance_of OM::XML::Term
         
     | 
| 
      
 141 
     | 
    
         
            +
                    expect(built_terminology.retrieve_term(:name, :role, :text).path).to eq("roleTerm")
         
     | 
| 
      
 142 
     | 
    
         
            +
                    expect(built_terminology.retrieve_term(:name, :role, :text).attributes).to eq({:type=>"text"})
         
     | 
| 
       143 
143 
     | 
    
         
             
                  end
         
     | 
| 
       144 
144 
     | 
    
         
             
                  it "should put copies of the entire terminology under any root terms" do
         
     | 
| 
       145 
     | 
    
         
            -
                    @builder_with_block.root_term_builders. 
     | 
| 
       146 
     | 
    
         
            -
             
     | 
| 
      
 145 
     | 
    
         
            +
                    expect(@builder_with_block.root_term_builders).to include(@builder_with_block.retrieve_term_builder(:mods))
         
     | 
| 
      
 146 
     | 
    
         
            +
             
     | 
| 
       147 
147 
     | 
    
         
             
                    built_terminology = @builder_with_block.build
         
     | 
| 
       148 
148 
     | 
    
         
             
                    expected_keys = [:title_info, :issue, :person, :name, :journal, :role]
         
     | 
| 
       149 
     | 
    
         
            -
             
     | 
| 
       150 
     | 
    
         
            -
                    built_terminology.retrieve_term(:mods).children.length. 
     | 
| 
      
 149 
     | 
    
         
            +
             
     | 
| 
      
 150 
     | 
    
         
            +
                    expect(built_terminology.retrieve_term(:mods).children.length).to eq(expected_keys.length)
         
     | 
| 
       151 
151 
     | 
    
         
             
                    expected_keys.each do |key|
         
     | 
| 
       152 
     | 
    
         
            -
                      built_terminology.retrieve_term(:mods).children.keys. 
     | 
| 
      
 152 
     | 
    
         
            +
                      expect(built_terminology.retrieve_term(:mods).children.keys).to include(key)
         
     | 
| 
       153 
153 
     | 
    
         
             
                    end
         
     | 
| 
       154 
     | 
    
         
            -
                    built_terminology.retrieve_term(:mods, :name, :role, :text). 
     | 
| 
       155 
     | 
    
         
            -
                    built_terminology.retrieve_term(:mods, :person, :role, :text). 
     | 
| 
      
 154 
     | 
    
         
            +
                    expect(built_terminology.retrieve_term(:mods, :name, :role, :text)).to be_instance_of OM::XML::Term
         
     | 
| 
      
 155 
     | 
    
         
            +
                    expect(built_terminology.retrieve_term(:mods, :person, :role, :text)).to be_instance_of OM::XML::Term
         
     | 
| 
       156 
156 
     | 
    
         | 
| 
       157 
157 
     | 
    
         
             
                  end
         
     | 
| 
       158 
158 
     | 
    
         
             
                end
         
     | 
| 
       159 
     | 
    
         
            -
             
     | 
| 
      
 159 
     | 
    
         
            +
             
     | 
| 
       160 
160 
     | 
    
         
             
                describe '.insert_term' do
         
     | 
| 
       161 
161 
     | 
    
         
             
                  it "should create a new OM::XML::Term::Builder and insert it into the class mappings hash" do
         
     | 
| 
       162 
     | 
    
         
            -
                     
     | 
| 
       163 
     | 
    
         
            -
             
     | 
| 
       164 
     | 
    
         
            -
                    result = @test_builder.insert_mapper(:name_, :namePart).index_as([:facetable, :searchable, :sortable, :displayable]).required(true).type(:text) 
     | 
| 
       165 
     | 
    
         
            -
                    @test_builder.mapper_builders(:name_, :namePart). 
     | 
| 
       166 
     | 
    
         
            -
                    result. 
     | 
| 
      
 162 
     | 
    
         
            +
                    skip
         
     | 
| 
      
 163 
     | 
    
         
            +
             
     | 
| 
      
 164 
     | 
    
         
            +
                    result = @test_builder.insert_mapper(:name_, :namePart).index_as([:facetable, :searchable, :sortable, :displayable]).required(true).type(:text)
         
     | 
| 
      
 165 
     | 
    
         
            +
                    expect(@test_builder.mapper_builders(:name_, :namePart)).to eq(result)
         
     | 
| 
      
 166 
     | 
    
         
            +
                    expect(result).to be_instance_of OM::XML::Mapper::Builder
         
     | 
| 
       167 
167 
     | 
    
         
             
                  end
         
     | 
| 
       168 
168 
     | 
    
         
             
                end
         
     | 
| 
       169 
     | 
    
         
            -
             
     | 
| 
      
 169 
     | 
    
         
            +
             
     | 
| 
       170 
170 
     | 
    
         
             
                describe ".root" do
         
     | 
| 
       171 
171 
     | 
    
         
             
                  it "should accept options for the root node, such as namespace(s)  and schema and those values should impact the resulting Terminology" do
         
     | 
| 
       172 
172 
     | 
    
         
             
                    root_term_builder = @test_builder.root(:path=>"mods", :xmlns => 'one:two', 'xmlns:foo' => 'bar', :schema=>"http://www.loc.gov/standards/mods/v3/mods-3-2.xsd")
         
     | 
| 
       173 
     | 
    
         
            -
                    root_term_builder.settings[:is_root_term]. 
     | 
| 
       174 
     | 
    
         
            -
             
     | 
| 
       175 
     | 
    
         
            -
                    @test_builder.schema. 
     | 
| 
       176 
     | 
    
         
            -
                    @test_builder.namespaces. 
     | 
| 
       177 
     | 
    
         
            -
                    @test_builder.term_builders[:mods]. 
     | 
| 
       178 
     | 
    
         
            -
             
     | 
| 
      
 173 
     | 
    
         
            +
                    expect(root_term_builder.settings[:is_root_term]).to eq(true)
         
     | 
| 
      
 174 
     | 
    
         
            +
             
     | 
| 
      
 175 
     | 
    
         
            +
                    expect(@test_builder.schema).to eq("http://www.loc.gov/standards/mods/v3/mods-3-2.xsd")
         
     | 
| 
      
 176 
     | 
    
         
            +
                    expect(@test_builder.namespaces).to eq({ "oxns"=>"one:two", 'xmlns' => 'one:two', 'xmlns:foo' => 'bar' })
         
     | 
| 
      
 177 
     | 
    
         
            +
                    expect(@test_builder.term_builders[:mods]).to eq(root_term_builder)
         
     | 
| 
      
 178 
     | 
    
         
            +
             
     | 
| 
       179 
179 
     | 
    
         
             
                    terminology = @test_builder.build
         
     | 
| 
       180 
     | 
    
         
            -
                    terminology.schema. 
     | 
| 
       181 
     | 
    
         
            -
                    terminology.namespaces. 
     | 
| 
      
 180 
     | 
    
         
            +
                    expect(terminology.schema).to eq("http://www.loc.gov/standards/mods/v3/mods-3-2.xsd")
         
     | 
| 
      
 181 
     | 
    
         
            +
                    expect(terminology.namespaces).to eq({ "oxns"=>"one:two", 'xmlns' => 'one:two', 'xmlns:foo' => 'bar' })
         
     | 
| 
       182 
182 
     | 
    
         
             
                  end
         
     | 
| 
       183 
183 
     | 
    
         
             
                  it "should create an explicit term correspoinding to the root node and pass any additional settings into that term" do
         
     | 
| 
       184 
184 
     | 
    
         
             
                    @test_builder.root(:path=>"fwoop", :xmlns => 'one:two', 'xmlns:foo' => 'bar', :index_as=>[:not_searchable], :namespace_prefix=>"foox")
         
     | 
| 
       185 
185 
     | 
    
         
             
                    terminology = @test_builder.build
         
     | 
| 
       186 
186 
     | 
    
         
             
                    term = terminology.retrieve_term(:fwoop)
         
     | 
| 
       187 
     | 
    
         
            -
                    term. 
     | 
| 
       188 
     | 
    
         
            -
                    term.is_root_term 
     | 
| 
       189 
     | 
    
         
            -
                    term.index_as. 
     | 
| 
       190 
     | 
    
         
            -
                    term.namespace_prefix. 
     | 
| 
      
 187 
     | 
    
         
            +
                    expect(term).to be_instance_of OM::XML::Term
         
     | 
| 
      
 188 
     | 
    
         
            +
                    expect(term.is_root_term?).to eq(true)
         
     | 
| 
      
 189 
     | 
    
         
            +
                    expect(term.index_as).to eq([:not_searchable])
         
     | 
| 
      
 190 
     | 
    
         
            +
                    expect(term.namespace_prefix).to eq("foox")
         
     | 
| 
       191 
191 
     | 
    
         
             
                  end
         
     | 
| 
       192 
192 
     | 
    
         
             
                  it "should work within a builder block" do
         
     | 
| 
       193 
     | 
    
         
            -
                    @builder_with_block.term_builders[:mods].settings[:is_root_term]. 
     | 
| 
      
 193 
     | 
    
         
            +
                    expect(@builder_with_block.term_builders[:mods].settings[:is_root_term]).to eq(true)
         
     | 
| 
       194 
194 
     | 
    
         
             
                  end
         
     | 
| 
       195 
195 
     | 
    
         
             
                end
         
     | 
| 
       196 
     | 
    
         
            -
             
     | 
| 
      
 196 
     | 
    
         
            +
             
     | 
| 
       197 
197 
     | 
    
         
             
                describe ".root_term_builders" do
         
     | 
| 
       198 
198 
     | 
    
         
             
                  it "should return the terms that have been marked root" do
         
     | 
| 
       199 
     | 
    
         
            -
                    @builder_with_block.root_term_builders.length. 
     | 
| 
       200 
     | 
    
         
            -
                    @builder_with_block.root_term_builders.first. 
     | 
| 
      
 199 
     | 
    
         
            +
                    expect(@builder_with_block.root_term_builders.length).to eq(1)
         
     | 
| 
      
 200 
     | 
    
         
            +
                    expect(@builder_with_block.root_term_builders.first).to eq(@builder_with_block.term_builders[:mods])
         
     | 
| 
       201 
201 
     | 
    
         
             
                  end
         
     | 
| 
       202 
202 
     | 
    
         
             
                end
         
     | 
| 
       203 
     | 
    
         
            -
             
     | 
| 
      
 203 
     | 
    
         
            +
             
     | 
| 
       204 
204 
     | 
    
         
             
            end
         
     | 
| 
         @@ -89,162 +89,162 @@ describe "OM::XML::Terminology" do 
     | 
|
| 
       89 
89 
     | 
    
         | 
| 
       90 
90 
     | 
    
         
             
              describe "namespaceless terminologies" do
         
     | 
| 
       91 
91 
     | 
    
         
             
                it "should generate xpath queries without namespaces" do
         
     | 
| 
       92 
     | 
    
         
            -
                  @namespaceless_terminology.xpath_for(:to). 
     | 
| 
       93 
     | 
    
         
            -
                  @namespaceless_terminology.xpath_for(:note, :from). 
     | 
| 
      
 92 
     | 
    
         
            +
                  expect(@namespaceless_terminology.xpath_for(:to)).to eq("//to")
         
     | 
| 
      
 93 
     | 
    
         
            +
                  expect(@namespaceless_terminology.xpath_for(:note, :from)).to eq("//note/from")
         
     | 
| 
       94 
94 
     | 
    
         
             
                end
         
     | 
| 
       95 
95 
     | 
    
         | 
| 
       96 
96 
     | 
    
         
             
                it "should work with xml documents that have no namespaces" do
         
     | 
| 
       97 
     | 
    
         
            -
                  @namespaceless_doc.from.first. 
     | 
| 
       98 
     | 
    
         
            -
                  @namespaceless_doc.to. 
     | 
| 
      
 97 
     | 
    
         
            +
                  expect(@namespaceless_doc.from.first).to eq("Jani")
         
     | 
| 
      
 98 
     | 
    
         
            +
                  expect(@namespaceless_doc.to).to eq(["Tove"])
         
     | 
| 
       99 
99 
     | 
    
         
             
                end
         
     | 
| 
       100 
100 
     | 
    
         
             
              end
         
     | 
| 
       101 
101 
     | 
    
         | 
| 
       102 
102 
     | 
    
         
             
              describe "basics" do
         
     | 
| 
       103 
103 
     | 
    
         | 
| 
       104 
104 
     | 
    
         
             
                it "constructs xpath queries for finding properties" do
         
     | 
| 
       105 
     | 
    
         
            -
                  @test_full_terminology.retrieve_term(:name).xpath. 
     | 
| 
       106 
     | 
    
         
            -
                  @test_full_terminology.retrieve_term(:name).xpath_relative. 
     | 
| 
      
 105 
     | 
    
         
            +
                  expect(@test_full_terminology.retrieve_term(:name).xpath).to eq('//oxns:name')
         
     | 
| 
      
 106 
     | 
    
         
            +
                  expect(@test_full_terminology.retrieve_term(:name).xpath_relative).to eq('oxns:name')
         
     | 
| 
       107 
107 
     | 
    
         | 
| 
       108 
     | 
    
         
            -
                  @test_full_terminology.retrieve_term(:person).xpath. 
     | 
| 
       109 
     | 
    
         
            -
                  @test_full_terminology.retrieve_term(:person).xpath_relative. 
     | 
| 
       110 
     | 
    
         
            -
                  @test_full_terminology.retrieve_term(:person, :person_id).xpath_relative. 
     | 
| 
      
 108 
     | 
    
         
            +
                  expect(@test_full_terminology.retrieve_term(:person).xpath).to eq('//oxns:name[@type="personal"]')
         
     | 
| 
      
 109 
     | 
    
         
            +
                  expect(@test_full_terminology.retrieve_term(:person).xpath_relative).to eq('oxns:name[@type="personal"]')
         
     | 
| 
      
 110 
     | 
    
         
            +
                  expect(@test_full_terminology.retrieve_term(:person, :person_id).xpath_relative).to eq('oxns:namePart[not(@type)]')
         
     | 
| 
       111 
111 
     | 
    
         
             
                end
         
     | 
| 
       112 
112 
     | 
    
         | 
| 
       113 
113 
     | 
    
         
             
                it "should expand proxy and get sub terms" do
         
     | 
| 
       114 
     | 
    
         
            -
                  @test_full_terminology.retrieve_node(:title, :main_title_lang).xpath. 
     | 
| 
      
 114 
     | 
    
         
            +
                  expect(@test_full_terminology.retrieve_node(:title, :main_title_lang).xpath).to eq('//oxns:titleInfo/oxns:title/@xml:lang')
         
     | 
| 
       115 
115 
     | 
    
         
             
                  ### retrieve_term() will not cross proxies
         
     | 
| 
       116 
     | 
    
         
            -
                  @test_full_terminology.retrieve_term(:title_info, :main_title, :main_title_lang).xpath. 
     | 
| 
      
 116 
     | 
    
         
            +
                  expect(@test_full_terminology.retrieve_term(:title_info, :main_title, :main_title_lang).xpath).to eq('//oxns:titleInfo/oxns:title/@xml:lang')
         
     | 
| 
       117 
117 
     | 
    
         
             
                end
         
     | 
| 
       118 
118 
     | 
    
         | 
| 
       119 
119 
     | 
    
         
             
                it "constructs templates for value-driven searches" do
         
     | 
| 
       120 
     | 
    
         
            -
                  @test_full_terminology.retrieve_term(:name).xpath_constrained. 
     | 
| 
       121 
     | 
    
         
            -
                  @test_full_terminology.retrieve_term(:person).xpath_constrained. 
     | 
| 
      
 120 
     | 
    
         
            +
                  expect(@test_full_terminology.retrieve_term(:name).xpath_constrained).to eq('//oxns:name[contains(., "#{constraint_value}")]'.gsub('"', '\"'))
         
     | 
| 
      
 121 
     | 
    
         
            +
                  expect(@test_full_terminology.retrieve_term(:person).xpath_constrained).to eq('//oxns:name[@type="personal" and contains(., "#{constraint_value}")]'.gsub('"', '\"'))
         
     | 
| 
       122 
122 
     | 
    
         | 
| 
       123 
123 
     | 
    
         
             
                  # Example of how you could use these templates:
         
     | 
| 
       124 
124 
     | 
    
         
             
                  constraint_value = "SAMPLE CONSTRAINT VALUE"
         
     | 
| 
       125 
125 
     | 
    
         
             
                  constrained_query = eval( '"' + @test_full_terminology.retrieve_term(:person).xpath_constrained + '"' )
         
     | 
| 
       126 
     | 
    
         
            -
                  constrained_query. 
     | 
| 
      
 126 
     | 
    
         
            +
                  expect(constrained_query).to eq('//oxns:name[@type="personal" and contains(., "SAMPLE CONSTRAINT VALUE")]')
         
     | 
| 
       127 
127 
     | 
    
         
             
                end
         
     | 
| 
       128 
128 
     | 
    
         | 
| 
       129 
129 
     | 
    
         
             
                it "constructs xpath queries & templates for nested terms" do
         
     | 
| 
       130 
130 
     | 
    
         
             
                  name_date_term = @test_full_terminology.retrieve_term(:name, :date)
         
     | 
| 
       131 
     | 
    
         
            -
                  name_date_term.xpath. 
     | 
| 
       132 
     | 
    
         
            -
                  name_date_term.xpath_relative. 
     | 
| 
       133 
     | 
    
         
            -
                  name_date_term.xpath_constrained. 
     | 
| 
      
 131 
     | 
    
         
            +
                  expect(name_date_term.xpath).to eq('//oxns:name/oxns:namePart[@type="date"]')
         
     | 
| 
      
 132 
     | 
    
         
            +
                  expect(name_date_term.xpath_relative).to eq('oxns:namePart[@type="date"]')
         
     | 
| 
      
 133 
     | 
    
         
            +
                  expect(name_date_term.xpath_constrained).to eq('//oxns:name/oxns:namePart[@type="date" and contains(., "#{constraint_value}")]'.gsub('"', '\"'))
         
     | 
| 
       134 
134 
     | 
    
         
             
                  # name_date_term.xpath_constrained.should == '//oxns:name[contains(oxns:namePart[@type="date"], "#{constraint_value}")]'.gsub('"', '\"')
         
     | 
| 
       135 
135 
     | 
    
         | 
| 
       136 
136 
     | 
    
         
             
                  person_date_term = @test_full_terminology.retrieve_term(:person, :date)
         
     | 
| 
       137 
     | 
    
         
            -
                  person_date_term.xpath. 
     | 
| 
       138 
     | 
    
         
            -
                  person_date_term.xpath_relative. 
     | 
| 
       139 
     | 
    
         
            -
                  person_date_term.xpath_constrained. 
     | 
| 
      
 137 
     | 
    
         
            +
                  expect(person_date_term.xpath).to eq('//oxns:name[@type="personal"]/oxns:namePart[@type="date"]')
         
     | 
| 
      
 138 
     | 
    
         
            +
                  expect(person_date_term.xpath_relative).to eq('oxns:namePart[@type="date"]')
         
     | 
| 
      
 139 
     | 
    
         
            +
                  expect(person_date_term.xpath_constrained).to eq('//oxns:name[@type="personal"]/oxns:namePart[@type="date" and contains(., "#{constraint_value}")]'.gsub('"', '\"'))
         
     | 
| 
       140 
140 
     | 
    
         
             
                  # person_date_term.xpath_constrained.should == '//oxns:name[@type="personal" and contains(oxns:namePart[@type="date"], "#{constraint_value}")]'.gsub('"', '\"')
         
     | 
| 
       141 
141 
     | 
    
         
             
                end
         
     | 
| 
       142 
142 
     | 
    
         | 
| 
       143 
143 
     | 
    
         
             
                it "supports subelements that are specified using a :ref" do
         
     | 
| 
       144 
144 
     | 
    
         
             
                  role_term = @test_full_terminology.retrieve_term(:name, :role)
         
     | 
| 
       145 
     | 
    
         
            -
                  role_term.xpath. 
     | 
| 
       146 
     | 
    
         
            -
                  role_term.xpath_relative. 
     | 
| 
       147 
     | 
    
         
            -
                  role_term.xpath_constrained. 
     | 
| 
      
 145 
     | 
    
         
            +
                  expect(role_term.xpath).to eq('//oxns:name/oxns:role')
         
     | 
| 
      
 146 
     | 
    
         
            +
                  expect(role_term.xpath_relative).to eq('oxns:role')
         
     | 
| 
      
 147 
     | 
    
         
            +
                  expect(role_term.xpath_constrained).to eq('//oxns:name/oxns:role[contains(., "#{constraint_value}")]'.gsub('"', '\"'))
         
     | 
| 
       148 
148 
     | 
    
         
             
                  # role_term.xpath_constrained.should == '//oxns:name[contains(oxns:role/oxns:roleTerm, "#{constraint_value}")]'.gsub('"', '\"')
         
     | 
| 
       149 
149 
     | 
    
         
             
                end
         
     | 
| 
       150 
150 
     | 
    
         | 
| 
       151 
151 
     | 
    
         
             
                describe "treating attributes as properties" do
         
     | 
| 
       152 
     | 
    
         
            -
                  it "should build correct xpath" do 
     | 
| 
      
 152 
     | 
    
         
            +
                  it "should build correct xpath" do
         
     | 
| 
       153 
153 
     | 
    
         
             
                    language_term = @test_full_terminology.retrieve_term(:title_info, :language)
         
     | 
| 
       154 
     | 
    
         
            -
                    language_term.xpath. 
     | 
| 
       155 
     | 
    
         
            -
                    language_term.xpath_relative. 
     | 
| 
       156 
     | 
    
         
            -
                    language_term.xpath_constrained. 
     | 
| 
      
 154 
     | 
    
         
            +
                    expect(language_term.xpath).to eq('//oxns:titleInfo/@lang')
         
     | 
| 
      
 155 
     | 
    
         
            +
                    expect(language_term.xpath_relative).to eq('@lang')
         
     | 
| 
      
 156 
     | 
    
         
            +
                    expect(language_term.xpath_constrained).to eq('//oxns:titleInfo/@lang[contains(., "#{constraint_value}")]'.gsub('"', '\"'))
         
     | 
| 
       157 
157 
     | 
    
         
             
                  end
         
     | 
| 
       158 
158 
     | 
    
         
             
                end
         
     | 
| 
       159 
159 
     | 
    
         | 
| 
       160 
160 
     | 
    
         
             
                it "should support deep nesting of properties" do
         
     | 
| 
       161 
161 
     | 
    
         
             
                  volume_term = @test_full_terminology.retrieve_term(:journal, :issue, :volume)
         
     | 
| 
       162 
     | 
    
         
            -
                  volume_term.xpath. 
     | 
| 
       163 
     | 
    
         
            -
                  volume_term.xpath_relative. 
     | 
| 
      
 162 
     | 
    
         
            +
                  expect(volume_term.xpath).to eq("//oxns:relatedItem[@type=\"host\"]/oxns:part/oxns:detail[@type=\"volume\"]")
         
     | 
| 
      
 163 
     | 
    
         
            +
                  expect(volume_term.xpath_relative).to eq("oxns:detail[@type=\"volume\"]")
         
     | 
| 
       164 
164 
     | 
    
         
             
                  # volume_term.xpath_constrained.should == "//oxns:part[contains(oxns:detail[@type=\\\"volume\\\"], \\\"\#{constraint_value}\\\")]"
         
     | 
| 
       165 
     | 
    
         
            -
                  volume_term.xpath_constrained. 
     | 
| 
      
 165 
     | 
    
         
            +
                  expect(volume_term.xpath_constrained).to eq('//oxns:relatedItem[@type="host"]/oxns:part/oxns:detail[@type="volume" and contains(oxns:number, "#{constraint_value}")]'.gsub('"', '\"'))
         
     | 
| 
       166 
166 
     | 
    
         
             
                end
         
     | 
| 
       167 
167 
     | 
    
         | 
| 
       168 
168 
     | 
    
         
             
                it "should not overwrite default property info when adding a variant property" do
         
     | 
| 
       169 
169 
     | 
    
         
             
                  name_term = @test_full_terminology.retrieve_term(:name)
         
     | 
| 
       170 
170 
     | 
    
         
             
                  person_term = @test_full_terminology.retrieve_term(:person)
         
     | 
| 
       171 
171 
     | 
    
         | 
| 
       172 
     | 
    
         
            -
                  name_term. 
     | 
| 
       173 
     | 
    
         
            -
                  name_term.xpath. 
     | 
| 
       174 
     | 
    
         
            -
                  name_term.children. 
     | 
| 
       175 
     | 
    
         
            -
                  name_term.children[:date].xpath_constrained. 
     | 
| 
      
 172 
     | 
    
         
            +
                  expect(name_term).not_to equal(person_term)
         
     | 
| 
      
 173 
     | 
    
         
            +
                  expect(name_term.xpath).not_to equal(person_term.xpath)
         
     | 
| 
      
 174 
     | 
    
         
            +
                  expect(name_term.children).not_to equal(person_term.children)
         
     | 
| 
      
 175 
     | 
    
         
            +
                  expect(name_term.children[:date].xpath_constrained).not_to equal(person_term.children[:date].xpath_constrained)
         
     | 
| 
       176 
176 
     | 
    
         
             
                end
         
     | 
| 
       177 
177 
     | 
    
         | 
| 
       178 
178 
     | 
    
         
             
              end
         
     | 
| 
       179 
179 
     | 
    
         | 
| 
       180 
180 
     | 
    
         
             
              describe '#from_xml' do
         
     | 
| 
       181 
181 
     | 
    
         
             
                it "should let you load mappings from an xml file" do
         
     | 
| 
       182 
     | 
    
         
            -
                   
     | 
| 
      
 182 
     | 
    
         
            +
                  skip
         
     | 
| 
       183 
183 
     | 
    
         
             
                  vocab = OM::XML::Terminology.from_xml( fixture("sample_mappings.xml") )
         
     | 
| 
       184 
     | 
    
         
            -
                  vocab. 
     | 
| 
       185 
     | 
    
         
            -
                  vocab.mappers. 
     | 
| 
      
 184 
     | 
    
         
            +
                  expect(vocab).to be_instance_of OM::XML::Terminology
         
     | 
| 
      
 185 
     | 
    
         
            +
                  expect(vocab.mappers).to eq({})
         
     | 
| 
       186 
186 
     | 
    
         
             
                end
         
     | 
| 
       187 
187 
     | 
    
         
             
              end
         
     | 
| 
       188 
188 
     | 
    
         | 
| 
       189 
189 
     | 
    
         
             
              describe '#to_xml' do
         
     | 
| 
       190 
190 
     | 
    
         
             
                it "should let you serialize mappings to an xml document" do
         
     | 
| 
       191 
     | 
    
         
            -
                   
     | 
| 
       192 
     | 
    
         
            -
                  TerminologyTest.to_xml. 
     | 
| 
      
 191 
     | 
    
         
            +
                  skip
         
     | 
| 
      
 192 
     | 
    
         
            +
                  expect(TerminologyTest.to_xml).to eq("")
         
     | 
| 
       193 
193 
     | 
    
         
             
                end
         
     | 
| 
       194 
194 
     | 
    
         
             
              end
         
     | 
| 
       195 
195 
     | 
    
         | 
| 
       196 
196 
     | 
    
         
             
              describe ".has_term?" do
         
     | 
| 
       197 
197 
     | 
    
         
             
                it "should return true if the specified term does exist in the terminology" do
         
     | 
| 
       198 
     | 
    
         
            -
                  @test_full_terminology.has_term?(:journal,:issue,:end_page). 
     | 
| 
      
 198 
     | 
    
         
            +
                  expect(@test_full_terminology.has_term?(:journal,:issue,:end_page)).to be_truthy
         
     | 
| 
       199 
199 
     | 
    
         
             
                end
         
     | 
| 
       200 
200 
     | 
    
         
             
                it "should support term_pointers with array indexes in them (ignoring the indexes)" do
         
     | 
| 
       201 
     | 
    
         
            -
                  @test_full_terminology.has_term?(:title_info, :main_title). 
     | 
| 
       202 
     | 
    
         
            -
                  @test_full_terminology.has_term?({:title_info=>"0"}, :main_title). 
     | 
| 
      
 201 
     | 
    
         
            +
                  expect(@test_full_terminology.has_term?(:title_info, :main_title)).to be_truthy
         
     | 
| 
      
 202 
     | 
    
         
            +
                  expect(@test_full_terminology.has_term?({:title_info=>"0"}, :main_title)).to be_truthy
         
     | 
| 
       203 
203 
     | 
    
         
             
                end
         
     | 
| 
       204 
204 
     | 
    
         
             
                it "should return false if the specified term does not exist in the terminology" do
         
     | 
| 
       205 
     | 
    
         
            -
                  @test_full_terminology.has_term?(:name, :date, :nonexistentTerm, :anotherTermName). 
     | 
| 
      
 205 
     | 
    
         
            +
                  expect(@test_full_terminology.has_term?(:name, :date, :nonexistentTerm, :anotherTermName)).to be_falsey
         
     | 
| 
       206 
206 
     | 
    
         
             
                end
         
     | 
| 
       207 
207 
     | 
    
         
             
              end
         
     | 
| 
       208 
208 
     | 
    
         | 
| 
       209 
209 
     | 
    
         
             
              describe ".retrieve_term" do
         
     | 
| 
       210 
210 
     | 
    
         
             
                it "should return the mapper identified by the given pointer" do
         
     | 
| 
       211 
211 
     | 
    
         
             
                  term = @test_terminology.retrieve_term(:name, :namePart)
         
     | 
| 
       212 
     | 
    
         
            -
                  term. 
     | 
| 
       213 
     | 
    
         
            -
                  term. 
     | 
| 
      
 212 
     | 
    
         
            +
                  expect(term).to eq(@test_terminology.terms[:name].children[:namePart])
         
     | 
| 
      
 213 
     | 
    
         
            +
                  expect(term).to eq(@test_child_term)
         
     | 
| 
       214 
214 
     | 
    
         
             
                end
         
     | 
| 
       215 
215 
     | 
    
         
             
                it "should build complete terminologies" do
         
     | 
| 
       216 
     | 
    
         
            -
                  @test_full_terminology.retrieve_term(:name, :date). 
     | 
| 
       217 
     | 
    
         
            -
                  @test_full_terminology.retrieve_term(:name, :date).path. 
     | 
| 
       218 
     | 
    
         
            -
                  @test_full_terminology.retrieve_term(:name, :date).attributes. 
     | 
| 
       219 
     | 
    
         
            -
                  @test_full_terminology.retrieve_term(:name, :affiliation).path. 
     | 
| 
       220 
     | 
    
         
            -
                  @test_full_terminology.retrieve_term(:name, :date).xpath. 
     | 
| 
      
 216 
     | 
    
         
            +
                  expect(@test_full_terminology.retrieve_term(:name, :date)).to be_instance_of OM::XML::Term
         
     | 
| 
      
 217 
     | 
    
         
            +
                  expect(@test_full_terminology.retrieve_term(:name, :date).path).to eq('namePart')
         
     | 
| 
      
 218 
     | 
    
         
            +
                  expect(@test_full_terminology.retrieve_term(:name, :date).attributes).to eq({:type=>"date"})
         
     | 
| 
      
 219 
     | 
    
         
            +
                  expect(@test_full_terminology.retrieve_term(:name, :affiliation).path).to eq('affiliation')
         
     | 
| 
      
 220 
     | 
    
         
            +
                  expect(@test_full_terminology.retrieve_term(:name, :date).xpath).to eq('//oxns:name/oxns:namePart[@type="date"]')
         
     | 
| 
       221 
221 
     | 
    
         
             
                end
         
     | 
| 
       222 
222 
     | 
    
         
             
                it "should support looking up variant Terms" do
         
     | 
| 
       223 
     | 
    
         
            -
                  @test_full_terminology.retrieve_term(:person).path. 
     | 
| 
       224 
     | 
    
         
            -
                  @test_full_terminology.retrieve_term(:person).attributes. 
     | 
| 
       225 
     | 
    
         
            -
                  @test_full_terminology.retrieve_term(:person, :affiliation).path. 
     | 
| 
       226 
     | 
    
         
            -
                  @test_full_terminology.retrieve_term(:person, :date).xpath. 
     | 
| 
      
 223 
     | 
    
         
            +
                  expect(@test_full_terminology.retrieve_term(:person).path).to eq('name')
         
     | 
| 
      
 224 
     | 
    
         
            +
                  expect(@test_full_terminology.retrieve_term(:person).attributes).to eq({:type=>"personal"})
         
     | 
| 
      
 225 
     | 
    
         
            +
                  expect(@test_full_terminology.retrieve_term(:person, :affiliation).path).to eq('affiliation')
         
     | 
| 
      
 226 
     | 
    
         
            +
                  expect(@test_full_terminology.retrieve_term(:person, :date).xpath).to eq('//oxns:name[@type="personal"]/oxns:namePart[@type="date"]')
         
     | 
| 
       227 
227 
     | 
    
         
             
                end
         
     | 
| 
       228 
228 
     | 
    
         
             
                it "should support including root terms in pointer" do
         
     | 
| 
       229 
     | 
    
         
            -
                  @test_full_terminology.retrieve_term(:mods). 
     | 
| 
       230 
     | 
    
         
            -
                  @test_full_terminology.retrieve_term(:mods, :name, :date). 
     | 
| 
       231 
     | 
    
         
            -
                  @test_full_terminology.retrieve_term(:mods, :name, :date).path. 
     | 
| 
       232 
     | 
    
         
            -
                  @test_full_terminology.retrieve_term(:mods, :name, :date).attributes. 
     | 
| 
       233 
     | 
    
         
            -
                  @test_full_terminology.retrieve_term(:mods, :name, :date).xpath. 
     | 
| 
      
 229 
     | 
    
         
            +
                  expect(@test_full_terminology.retrieve_term(:mods)).to be_instance_of OM::XML::Term
         
     | 
| 
      
 230 
     | 
    
         
            +
                  expect(@test_full_terminology.retrieve_term(:mods, :name, :date)).to be_instance_of OM::XML::Term
         
     | 
| 
      
 231 
     | 
    
         
            +
                  expect(@test_full_terminology.retrieve_term(:mods, :name, :date).path).to eq('namePart')
         
     | 
| 
      
 232 
     | 
    
         
            +
                  expect(@test_full_terminology.retrieve_term(:mods, :name, :date).attributes).to eq({:type=>"date"})
         
     | 
| 
      
 233 
     | 
    
         
            +
                  expect(@test_full_terminology.retrieve_term(:mods, :name, :date).xpath).to eq('//oxns:mods/oxns:name/oxns:namePart[@type="date"]')
         
     | 
| 
       234 
234 
     | 
    
         
             
                end
         
     | 
| 
       235 
235 
     | 
    
         | 
| 
       236 
236 
     | 
    
         
             
                it "should raise an informative error if the desired Term doesn't exist" do
         
     | 
| 
       237 
     | 
    
         
            -
                   
     | 
| 
      
 237 
     | 
    
         
            +
                  expect { @test_full_terminology.retrieve_term(:name, :date, :nonexistentTerm, :anotherTermName) }.to raise_error(OM::XML::Terminology::BadPointerError, "You attempted to retrieve a Term using this pointer: [:name, :date, :nonexistentTerm, :anotherTermName] but no Term exists at that location. Everything is fine until \":nonexistentTerm\", which doesn't exist.")
         
     | 
| 
       238 
238 
     | 
    
         
             
                end
         
     | 
| 
       239 
239 
     | 
    
         
             
              end
         
     | 
| 
       240 
240 
     | 
    
         | 
| 
       241 
241 
     | 
    
         
             
              describe ".term_xpath" do
         
     | 
| 
       242 
242 
     | 
    
         
             
                it "should insert calls to xpath array lookup into parent xpaths if parents argument is provided" do
         
     | 
| 
       243 
     | 
    
         
            -
                   
     | 
| 
      
 243 
     | 
    
         
            +
                  skip
         
     | 
| 
       244 
244 
     | 
    
         
             
                  # conference_mapper = TerminologyTest.retrieve_mapper(:conference)
         
     | 
| 
       245 
245 
     | 
    
         
             
                  # role_mapper =  TerminologyTest.retrieve_mapper(:conference, :role)
         
     | 
| 
       246 
246 
     | 
    
         
             
                  # text_mapper = TerminologyTest.retrieve_mapper(:conference, :role, :text)
         
     | 
| 
       247 
     | 
    
         
            -
                  TerminologyTest.term_xpath({:conference=>0}, {:role=>1}, :text ). 
     | 
| 
      
 247 
     | 
    
         
            +
                  expect(TerminologyTest.term_xpath({:conference=>0}, {:role=>1}, :text )).to eq('//oxns:name[@type="conference"][1]/oxns:role[2]/oxns:roleTerm[@type="text"]')
         
     | 
| 
       248 
248 
     | 
    
         
             
                  # OM::XML::TermXpathGenerator.expects(:generate_absolute_xpath).with({conference_mapper=>0}, {role_mapper=>1}, text_mapper)
         
     | 
| 
       249 
249 
     | 
    
         
             
                end
         
     | 
| 
       250 
250 
     | 
    
         
             
              end
         
     | 
| 
         @@ -252,72 +252,72 @@ describe "OM::XML::Terminology" do 
     | 
|
| 
       252 
252 
     | 
    
         
             
              describe ".xpath_for" do
         
     | 
| 
       253 
253 
     | 
    
         | 
| 
       254 
254 
     | 
    
         
             
                it "should retrieve the generated xpath query to match your desires" do
         
     | 
| 
       255 
     | 
    
         
            -
                  @test_full_terminology.xpath_for(:person). 
     | 
| 
      
 255 
     | 
    
         
            +
                  expect(@test_full_terminology.xpath_for(:person)).to eq('//oxns:name[@type="personal"]')
         
     | 
| 
       256 
256 
     | 
    
         | 
| 
       257 
     | 
    
         
            -
                  @test_full_terminology.xpath_for(:person, "Beethoven, Ludwig van"). 
     | 
| 
      
 257 
     | 
    
         
            +
                  expect(@test_full_terminology.xpath_for(:person, "Beethoven, Ludwig van")).to eq('//oxns:name[@type="personal" and contains(., "Beethoven, Ludwig van")]')
         
     | 
| 
       258 
258 
     | 
    
         | 
| 
       259 
     | 
    
         
            -
                  @test_full_terminology.xpath_for(:person, :date). 
     | 
| 
      
 259 
     | 
    
         
            +
                  expect(@test_full_terminology.xpath_for(:person, :date)).to eq('//oxns:name[@type="personal"]/oxns:namePart[@type="date"]')
         
     | 
| 
       260 
260 
     | 
    
         | 
| 
       261 
     | 
    
         
            -
                  @test_full_terminology.xpath_for(:person, :date, "2010"). 
     | 
| 
      
 261 
     | 
    
         
            +
                  expect(@test_full_terminology.xpath_for(:person, :date, "2010")).to eq('//oxns:name[@type="personal"]/oxns:namePart[@type="date" and contains(., "2010")]')
         
     | 
| 
       262 
262 
     | 
    
         | 
| 
       263 
     | 
    
         
            -
                  @test_full_terminology.xpath_for(:person, :person_id). 
     | 
| 
      
 263 
     | 
    
         
            +
                  expect(@test_full_terminology.xpath_for(:person, :person_id)).to eq('//oxns:name[@type="personal"]/oxns:namePart[not(@type)]')
         
     | 
| 
       264 
264 
     | 
    
         | 
| 
       265 
265 
     | 
    
         
             
                end
         
     | 
| 
       266 
266 
     | 
    
         | 
| 
       267 
267 
     | 
    
         
             
                it "should support including root terms in term pointer" do
         
     | 
| 
       268 
     | 
    
         
            -
                  @test_full_terminology.xpath_for(:mods, :person). 
     | 
| 
       269 
     | 
    
         
            -
                  @test_full_terminology.xpath_for(:mods, :person, "Beethoven, Ludwig van"). 
     | 
| 
      
 268 
     | 
    
         
            +
                  expect(@test_full_terminology.xpath_for(:mods, :person)).to eq('//oxns:mods/oxns:name[@type="personal"]')
         
     | 
| 
      
 269 
     | 
    
         
            +
                  expect(@test_full_terminology.xpath_for(:mods, :person, "Beethoven, Ludwig van")).to eq('//oxns:mods/oxns:name[@type="personal" and contains(., "Beethoven, Ludwig van")]')
         
     | 
| 
       270 
270 
     | 
    
         
             
                end
         
     | 
| 
       271 
271 
     | 
    
         | 
| 
       272 
272 
     | 
    
         
             
                it "should support queries with complex constraints" do
         
     | 
| 
       273 
     | 
    
         
            -
                   
     | 
| 
       274 
     | 
    
         
            -
                  @test_full_terminology.xpath_for(:person, {:date=>"2010"}). 
     | 
| 
      
 273 
     | 
    
         
            +
                  skip
         
     | 
| 
      
 274 
     | 
    
         
            +
                  expect(@test_full_terminology.xpath_for(:person, {:date=>"2010"})).to eq('//oxns:name[@type="personal" and contains(oxns:namePart[@type="date"], "2010")]')
         
     | 
| 
       275 
275 
     | 
    
         
             
                end
         
     | 
| 
       276 
276 
     | 
    
         | 
| 
       277 
277 
     | 
    
         
             
                it "should support queries with multiple complex constraints" do
         
     | 
| 
       278 
     | 
    
         
            -
                   
     | 
| 
       279 
     | 
    
         
            -
                  @test_full_terminology.xpath_for(:person, {:role=>"donor", :last_name=>"Rockefeller"}). 
     | 
| 
      
 278 
     | 
    
         
            +
                  skip
         
     | 
| 
      
 279 
     | 
    
         
            +
                  expect(@test_full_terminology.xpath_for(:person, {:role=>"donor", :last_name=>"Rockefeller"})).to eq('//oxns:name[@type="personal" and contains(oxns:role/oxns:roleTerm, "donor") and contains(oxns:namePart[@type="family"], "Rockefeller")]')
         
     | 
| 
       280 
280 
     | 
    
         
             
                end
         
     | 
| 
       281 
281 
     | 
    
         | 
| 
       282 
282 
     | 
    
         
             
                it "should parrot any strings back to you (in case you already have an xpath query)" do
         
     | 
| 
       283 
     | 
    
         
            -
                  @test_full_terminology.xpath_for('//oxns:name[@type="personal"]/oxns:namePart[@type="date"]'). 
     | 
| 
      
 283 
     | 
    
         
            +
                  expect(@test_full_terminology.xpath_for('//oxns:name[@type="personal"]/oxns:namePart[@type="date"]')).to eq('//oxns:name[@type="personal"]/oxns:namePart[@type="date"]')
         
     | 
| 
       284 
284 
     | 
    
         
             
                end
         
     | 
| 
       285 
285 
     | 
    
         | 
| 
       286 
286 
     | 
    
         
             
                it "should traverse named term proxies transparently" do
         
     | 
| 
       287 
287 
     | 
    
         
             
                  proxied_xpath = @test_full_terminology.xpath_for(:journal, :issue, :pages, :start)
         
     | 
| 
       288 
     | 
    
         
            -
                  @test_full_terminology.xpath_for( :journal, :issue, :start_page ). 
     | 
| 
      
 288 
     | 
    
         
            +
                  expect(@test_full_terminology.xpath_for( :journal, :issue, :start_page )).to eq(proxied_xpath)
         
     | 
| 
       289 
289 
     | 
    
         
             
                end
         
     | 
| 
       290 
290 
     | 
    
         | 
| 
       291 
291 
     | 
    
         
             
              end
         
     | 
| 
       292 
292 
     | 
    
         | 
| 
       293 
293 
     | 
    
         
             
              describe ".xpath_with_indexes" do
         
     | 
| 
       294 
294 
     | 
    
         
             
                it "should return the xpath given in the call to #accessor" do
         
     | 
| 
       295 
     | 
    
         
            -
                  @test_full_terminology.xpath_with_indexes( :title_info ). 
     | 
| 
      
 295 
     | 
    
         
            +
                  expect(@test_full_terminology.xpath_with_indexes( :title_info )).to eq('//oxns:titleInfo')
         
     | 
| 
       296 
296 
     | 
    
         
             
                end
         
     | 
| 
       297 
297 
     | 
    
         
             
                it "should support xpath queries as argument" do
         
     | 
| 
       298 
     | 
    
         
            -
                  @test_full_terminology.xpath_with_indexes('//oxns:name[@type="personal"][1]/oxns:namePart'). 
     | 
| 
      
 298 
     | 
    
         
            +
                  expect(@test_full_terminology.xpath_with_indexes('//oxns:name[@type="personal"][1]/oxns:namePart')).to eq('//oxns:name[@type="personal"][1]/oxns:namePart')
         
     | 
| 
       299 
299 
     | 
    
         
             
                end
         
     | 
| 
       300 
300 
     | 
    
         
             
                # Note: Ruby array indexes begin from 0.  In xpath queries (which start from 1 instead of 0), this will be translated accordingly.
         
     | 
| 
       301 
301 
     | 
    
         
             
                it "should prepend the xpath for any parent nodes, inserting calls to xpath array lookup where necessary" do
         
     | 
| 
       302 
     | 
    
         
            -
                  @test_full_terminology.xpath_with_indexes( {:conference=>0}, {:role=>1}, :text ). 
     | 
| 
      
 302 
     | 
    
         
            +
                  expect(@test_full_terminology.xpath_with_indexes( {:conference=>0}, {:role=>1}, :text )).to eq('//oxns:name[@type="conference"][1]/oxns:role[2]/oxns:roleTerm[@type="text"]')
         
     | 
| 
       303 
303 
     | 
    
         
             
                end
         
     | 
| 
       304 
304 
     | 
    
         
             
                it "should be idempotent" do
         
     | 
| 
       305 
     | 
    
         
            -
                  @test_full_terminology.xpath_with_indexes( *[{:title_info=>2}, :main_title] ). 
     | 
| 
       306 
     | 
    
         
            -
                  @test_full_terminology.xpath_with_indexes( *[{:title_info=>2}, :main_title] ). 
     | 
| 
       307 
     | 
    
         
            -
                  @test_full_terminology.xpath_with_indexes( *[{:title_info=>2}, :main_title] ). 
     | 
| 
      
 305 
     | 
    
         
            +
                  expect(@test_full_terminology.xpath_with_indexes( *[{:title_info=>2}, :main_title] )).to eq("//oxns:titleInfo[3]/oxns:title")
         
     | 
| 
      
 306 
     | 
    
         
            +
                  expect(@test_full_terminology.xpath_with_indexes( *[{:title_info=>2}, :main_title] )).to eq("//oxns:titleInfo[3]/oxns:title")
         
     | 
| 
      
 307 
     | 
    
         
            +
                  expect(@test_full_terminology.xpath_with_indexes( *[{:title_info=>2}, :main_title] )).to eq("//oxns:titleInfo[3]/oxns:title")
         
     | 
| 
       308 
308 
     | 
    
         
             
                end
         
     | 
| 
       309 
309 
     | 
    
         
             
                it "should traverse named term proxies transparently" do
         
     | 
| 
       310 
310 
     | 
    
         
             
                  proxied_xpath = @test_full_terminology.xpath_with_indexes(:journal, :issue, :pages, :start)
         
     | 
| 
       311 
     | 
    
         
            -
                  @test_full_terminology.xpath_with_indexes( :journal, :issue, :start_page ). 
     | 
| 
      
 311 
     | 
    
         
            +
                  expect(@test_full_terminology.xpath_with_indexes( :journal, :issue, :start_page )).to eq(proxied_xpath)
         
     | 
| 
       312 
312 
     | 
    
         
             
                end
         
     | 
| 
       313 
313 
     | 
    
         
             
              end
         
     | 
| 
       314 
314 
     | 
    
         | 
| 
       315 
315 
     | 
    
         
             
              describe "#xml_builder_template" do
         
     | 
| 
       316 
316 
     | 
    
         | 
| 
       317 
317 
     | 
    
         
             
                it "should generate a template call for passing into the builder block (assumes 'xml' as the argument for the block)" do
         
     | 
| 
       318 
     | 
    
         
            -
                  @test_full_terminology.xml_builder_template(:person,:date). 
     | 
| 
       319 
     | 
    
         
            -
                  @test_full_terminology.xml_builder_template(:person,:person_id). 
     | 
| 
       320 
     | 
    
         
            -
                  @test_full_terminology.xml_builder_template(:name,:affiliation). 
     | 
| 
      
 318 
     | 
    
         
            +
                  expect(@test_full_terminology.xml_builder_template(:person,:date)).to eq('xml.namePart( \'#{builder_new_value}\', \'type\'=>\'date\' )')
         
     | 
| 
      
 319 
     | 
    
         
            +
                  expect(@test_full_terminology.xml_builder_template(:person,:person_id)).to eq('xml.namePart( \'#{builder_new_value}\' )')
         
     | 
| 
      
 320 
     | 
    
         
            +
                  expect(@test_full_terminology.xml_builder_template(:name,:affiliation)).to eq('xml.affiliation( \'#{builder_new_value}\' )')
         
     | 
| 
       321 
321 
     | 
    
         
             
                end
         
     | 
| 
       322 
322 
     | 
    
         | 
| 
       323 
323 
     | 
    
         
             
                it "should accept extra options" do
         
     | 
| 
         @@ -326,44 +326,44 @@ describe "OM::XML::Terminology" do 
     | 
|
| 
       326 
326 
     | 
    
         
             
                  e1 = %q{xml.roleTerm( '#{builder_new_value}', 'type'=>'code', 'authority'=>'marcrelator' )}
         
     | 
| 
       327 
327 
     | 
    
         
             
                  e2 = %q{xml.roleTerm( '#{builder_new_value}', 'authority'=>'marcrelator', 'type'=>'code' )}
         
     | 
| 
       328 
328 
     | 
    
         
             
                  got = @test_full_terminology.xml_builder_template(:role, :code, {:attributes=>{"authority"=>"marcrelator"}} )
         
     | 
| 
       329 
     | 
    
         
            -
                  [e1, e2]. 
     | 
| 
      
 329 
     | 
    
         
            +
                  expect([e1, e2]).to include(got)
         
     | 
| 
       330 
330 
     | 
    
         
             
                  got = @test_full_terminology.xml_builder_template(:person, :role, :code, {:attributes=>{"authority"=>"marcrelator"}} )
         
     | 
| 
       331 
     | 
    
         
            -
                  [e1, e2]. 
     | 
| 
      
 331 
     | 
    
         
            +
                  expect([e1, e2]).to include(got)
         
     | 
| 
       332 
332 
     | 
    
         
             
                end
         
     | 
| 
       333 
333 
     | 
    
         | 
| 
       334 
334 
     | 
    
         
             
                it "should work with deeply nested properties" do
         
     | 
| 
       335 
     | 
    
         
            -
                  @test_full_terminology.xml_builder_template(:issue, :volume). 
     | 
| 
       336 
     | 
    
         
            -
                  @test_full_terminology.xml_builder_template(:journal, :issue, :level). 
     | 
| 
       337 
     | 
    
         
            -
                  @test_full_terminology.xml_builder_template(:journal, :issue, :volume). 
     | 
| 
       338 
     | 
    
         
            -
                  @test_full_terminology.xml_builder_template(:journal, :issue, :pages, :start). 
     | 
| 
      
 335 
     | 
    
         
            +
                  expect(@test_full_terminology.xml_builder_template(:issue, :volume)).to eq("xml.detail( \'type\'=>'volume' ) { xml.number( '\#{builder_new_value}' ) }")
         
     | 
| 
      
 336 
     | 
    
         
            +
                  expect(@test_full_terminology.xml_builder_template(:journal, :issue, :level)).to eq("xml.detail( \'type\'=>'number' ) { xml.number( '\#{builder_new_value}' ) }")
         
     | 
| 
      
 337 
     | 
    
         
            +
                  expect(@test_full_terminology.xml_builder_template(:journal, :issue, :volume)).to eq("xml.detail( \'type\'=>'volume' ) { xml.number( '\#{builder_new_value}' ) }")
         
     | 
| 
      
 338 
     | 
    
         
            +
                  expect(@test_full_terminology.xml_builder_template(:journal, :issue, :pages, :start)).to eq("xml.start( '\#{builder_new_value}' )")
         
     | 
| 
       339 
339 
     | 
    
         
             
                end
         
     | 
| 
       340 
340 
     | 
    
         | 
| 
       341 
341 
     | 
    
         
             
              end
         
     | 
| 
       342 
342 
     | 
    
         | 
| 
       343 
343 
     | 
    
         
             
              describe "#term_generic_name" do
         
     | 
| 
       344 
344 
     | 
    
         
             
                it "should generate a generic accessor name based on an array of pointers" do
         
     | 
| 
       345 
     | 
    
         
            -
                  OM::XML::Terminology.term_generic_name( {:conference=>0}, {:role=>1}, :text ). 
     | 
| 
       346 
     | 
    
         
            -
                  OM::XML::Terminology.term_generic_name( *[{:conference=>0}, {:role=>1}, :text] ). 
     | 
| 
      
 345 
     | 
    
         
            +
                  expect(OM::XML::Terminology.term_generic_name( {:conference=>0}, {:role=>1}, :text )).to eq("conference_role_text")
         
     | 
| 
      
 346 
     | 
    
         
            +
                  expect(OM::XML::Terminology.term_generic_name( *[{:conference=>0}, {:role=>1}, :text] )).to eq("conference_role_text")
         
     | 
| 
       347 
347 
     | 
    
         
             
                end
         
     | 
| 
       348 
348 
     | 
    
         
             
              end
         
     | 
| 
       349 
349 
     | 
    
         | 
| 
       350 
350 
     | 
    
         
             
              describe "#term_hierarchical_name" do
         
     | 
| 
       351 
351 
     | 
    
         
             
                it "should generate a specific accessor name based on an array of pointers and indexes" do
         
     | 
| 
       352 
     | 
    
         
            -
                  OM::XML::Terminology.term_hierarchical_name( {:conference=>0}, {:role=>1}, :text ). 
     | 
| 
       353 
     | 
    
         
            -
                  OM::XML::Terminology.term_hierarchical_name( *[{:conference=>0}, {:role=>1}, :text] ). 
     | 
| 
      
 352 
     | 
    
         
            +
                  expect(OM::XML::Terminology.term_hierarchical_name( {:conference=>0}, {:role=>1}, :text )).to eq("conference_0_role_1_text")
         
     | 
| 
      
 353 
     | 
    
         
            +
                  expect(OM::XML::Terminology.term_hierarchical_name( *[{:conference=>0}, {:role=>1}, :text] )).to eq("conference_0_role_1_text")
         
     | 
| 
       354 
354 
     | 
    
         
             
                end
         
     | 
| 
       355 
355 
     | 
    
         
             
              end
         
     | 
| 
       356 
356 
     | 
    
         | 
| 
       357 
357 
     | 
    
         
             
              describe ".term_builders" do
         
     | 
| 
       358 
358 
     | 
    
         
             
                it "should return a hash terms that have been added to the root of the terminology, indexed by term name" do
         
     | 
| 
       359 
     | 
    
         
            -
                  @test_terminology.terms[:name]. 
     | 
| 
      
 359 
     | 
    
         
            +
                  expect(@test_terminology.terms[:name]).to eq(@test_name)
         
     | 
| 
       360 
360 
     | 
    
         
             
                end
         
     | 
| 
       361 
361 
     | 
    
         
             
              end
         
     | 
| 
       362 
362 
     | 
    
         | 
| 
       363 
363 
     | 
    
         
             
              describe ".root_terms" do
         
     | 
| 
       364 
364 
     | 
    
         
             
                it "should return the terms that have been marked root" do
         
     | 
| 
       365 
     | 
    
         
            -
                  @test_full_terminology.root_terms.length. 
     | 
| 
       366 
     | 
    
         
            -
                  @test_full_terminology.root_terms.first. 
     | 
| 
      
 365 
     | 
    
         
            +
                  expect(@test_full_terminology.root_terms.length).to eq(1)
         
     | 
| 
      
 366 
     | 
    
         
            +
                  expect(@test_full_terminology.root_terms.first).to eq(@test_full_terminology.terms[:mods])
         
     | 
| 
       367 
367 
     | 
    
         
             
                end
         
     | 
| 
       368 
368 
     | 
    
         
             
              end
         
     | 
| 
       369 
369 
     | 
    
         |