om 3.0.3 → 3.0.5

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.
@@ -93,7 +93,7 @@ module OM::XML::TermBuilder
93
93
  # @param [OM::XML::Terminology] terminology that this Term is being built for
94
94
  def build(terminology=nil)
95
95
  self.resolve_refs!
96
- if term.self.settings.has_key?(:proxy)
96
+ if settings.has_key?(:proxy)
97
97
  term = OM::XML::NamedTermProxy.new(self.name, self.settings[:proxy], terminology, self.settings)
98
98
  else
99
99
  term = OM::XML::Term.new(self.name, {}, terminology)
@@ -118,14 +118,45 @@ module OM::XML::TermBuilder
118
118
  return self
119
119
  end
120
120
 
121
+ def root_term= val
122
+ @settings[:is_root_term] = val
123
+ end
121
124
 
122
- # Any unknown method calls will add an entry to the settings hash and return the current object
123
- def method_missing method, *args, &block
124
- if args.length == 1
125
- args = args.first
126
- end
127
- @settings[method] = args
128
- return self
125
+ def index_as= val
126
+ @settings[:index_as] = val
127
+ end
128
+
129
+ def required= val
130
+ @settings[:required] = val
131
+ end
132
+
133
+ def ref= val
134
+ @settings[:ref] = val
135
+ end
136
+
137
+ def attributes= val
138
+ @settings[:attributes] = val
139
+ end
140
+
141
+ def proxy= val
142
+ @settings[:proxy] = val
143
+ end
144
+
145
+ def type= val
146
+ @settings[:type] = val
147
+ end
148
+
149
+ def path= val
150
+ @settings[:path] = val
129
151
  end
152
+
153
+ def variant_of= val
154
+ @settings[:variant_of] = val
155
+ end
156
+
157
+ def default_content_path= val
158
+ @settings[:default_content_path] = val
159
+ end
160
+
130
161
  end
131
162
  end
@@ -51,7 +51,10 @@ class OM::XML::Terminology
51
51
  @namespaces["oxns"] = ns_pair.last
52
52
  end
53
53
  end
54
- root_term_builder = OM::XML::Term::Builder.new(opts.fetch(:path,:root).to_s.sub(/[_!]$/, '')).is_root_term(true)
54
+ path = opts.fetch(:path,:root).to_s.sub(/[_!]$/, '')
55
+ root_term_builder = OM::XML::Term::Builder.new(path).tap do |t|
56
+ t.root_term= true
57
+ end
55
58
  term_opts = opts.dup
56
59
  term_opts.delete(:schema)
57
60
  root_term_builder.settings.merge!(term_opts)
@@ -15,7 +15,7 @@ module OM::XML::TerminologyBasedSolrizer
15
15
  def solrize(doc, solr_doc=Hash.new, field_mapper = nil)
16
16
  unless doc.class.terminology.nil?
17
17
  doc.class.terminology.terms.each_pair do |term_name,term|
18
- doc.solrize_term(term, solr_doc, field_mapper)
18
+ doc.solrize_term(term, solr_doc, field_mapper) unless term.is_root_term?
19
19
  end
20
20
  end
21
21
 
data/om.gemspec CHANGED
@@ -32,8 +32,7 @@ Gem::Specification.new do |s|
32
32
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
33
33
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
34
34
  s.extra_rdoc_files = [
35
- "LICENSE",
36
- "README.textile"
35
+ "LICENSE"
37
36
  ]
38
37
  s.require_paths = ["lib"]
39
38
  end
@@ -1,4 +1,5 @@
1
1
  require 'spec_helper'
2
+ require 'active_support/core_ext/string/conversions' # for String#to_time conversion
2
3
 
3
4
  describe "element values" do
4
5
  before(:all) do
@@ -20,7 +21,7 @@ describe "element values" do
20
21
 
21
22
 
22
23
  describe "when the xml template has existing values" do
23
- subject do
24
+ let(:datastream) do
24
25
  ElementValueTerminology.from_xml <<-EOF
25
26
  <outer outerId="hypatia:outer" type="outer type">
26
27
  <my_date>2012-10-30</my_date>
@@ -30,6 +31,7 @@ describe "element values" do
30
31
  </outer>
31
32
  EOF
32
33
  end
34
+ subject { datastream }
33
35
  describe "reading values" do
34
36
  it "should deserialize date" do
35
37
  subject.my_date.should == [Date.parse('2012-10-30')]
@@ -45,26 +47,42 @@ EOF
45
47
  end
46
48
  end
47
49
  describe "Writing to xml" do
48
- it "should serialize time" do
49
- subject.my_time = [DateTime.parse('2011-01-30T03:45:15Z')]
50
- subject.to_xml.should be_equivalent_to '<?xml version="1.0"?>
51
- <outer outerId="hypatia:outer" type="outer type">
52
- <my_date>2012-10-30</my_date>
53
- <my_time>2011-01-30T03:45:15Z</my_time>
54
- <my_int>7</my_int>
55
- <active>true</active>
56
- </outer>'
50
+ context "serializing time" do
51
+ context "with a valid time" do
52
+ subject { datastream.to_xml }
53
+ before { datastream.my_time = [DateTime.parse('2011-01-30T03:45:15Z')] }
54
+ it { should be_equivalent_to '<?xml version="1.0"?>
55
+ <outer outerId="hypatia:outer" type="outer type">
56
+ <my_date>2012-10-30</my_date>
57
+ <my_time>2011-01-30T03:45:15Z</my_time>
58
+ <my_int>7</my_int>
59
+ <active>true</active>
60
+ </outer>' }
61
+ end
62
+
63
+ context "setting an invalid time" do
64
+ it "raises a type mismatch error" do
65
+ expect { datastream.my_time = '' }.to raise_error OM::TypeMismatch
66
+ end
67
+ end
57
68
  end
58
- it "should serialize date" do
59
- subject.my_date = [Date.parse('2012-09-22')]
60
- subject.to_xml.should be_equivalent_to '<?xml version="1.0"?>
61
- <outer outerId="hypatia:outer" type="outer type">
62
- <my_date>2012-09-22</my_date>
63
- <my_time>2012-10-30T12:22:33Z</my_time>
64
- <my_int>7</my_int>
65
- <active>true</active>
66
- </outer>'
69
+
70
+ context "serializing dates" do
71
+
72
+ subject { datastream.to_xml }
73
+ context "with a valid date" do
74
+
75
+ before { datastream.my_date = [Date.parse('2012-09-22')] }
76
+ it { should be_equivalent_to '<?xml version="1.0"?>
77
+ <outer outerId="hypatia:outer" type="outer type">
78
+ <my_date>2012-09-22</my_date>
79
+ <my_time>2012-10-30T12:22:33Z</my_time>
80
+ <my_int>7</my_int>
81
+ <active>true</active>
82
+ </outer>' }
83
+ end
67
84
  end
85
+
68
86
  it "should serialize ints" do
69
87
  subject.my_int = [9]
70
88
  subject.to_xml.should be_equivalent_to '<?xml version="1.0"?>
@@ -12,6 +12,9 @@ describe "Inherited terminology" do
12
12
  end
13
13
 
14
14
  class ConcreteTerminology < AbstractTerminology
15
+ extend_terminology do |t|
16
+ t.bar
17
+ end
15
18
  end
16
19
  end
17
20
 
@@ -20,7 +23,7 @@ describe "Inherited terminology" do
20
23
  Object.send(:remove_const, :AbstractTerminology)
21
24
  end
22
25
 
23
- describe "on the subclass" do
26
+ describe "the subclass" do
24
27
  subject do
25
28
  xml = '<root xmlns="asdf"><foo>fooval</foo><bar>barval</bar></root>'
26
29
  ConcreteTerminology.from_xml(xml)
@@ -30,9 +33,14 @@ describe "Inherited terminology" do
30
33
  subject.foo = "Test value"
31
34
  subject.foo.should == ["Test value"]
32
35
  end
36
+
37
+ it "should have extended terminology" do
38
+ subject.bar = "Test value"
39
+ subject.bar.should == ["Test value"]
40
+ end
33
41
  end
34
42
 
35
- describe "on the superclass" do
43
+ describe "the superclass" do
36
44
  subject do
37
45
  xml = '<root xmlns="asdf"><foo>fooval</foo><bar>barval</bar></root>'
38
46
  AbstractTerminology.from_xml(xml)
@@ -42,6 +50,10 @@ describe "Inherited terminology" do
42
50
  subject.foo = "Test value"
43
51
  subject.foo.should == ["Test value"]
44
52
  end
53
+
54
+ it "should not have extended terminology" do
55
+ expect { subject.bar }.to raise_error NoMethodError
56
+ end
45
57
  end
46
58
  end
47
59
 
@@ -54,7 +54,7 @@ describe "OM::XML::Container" do
54
54
 
55
55
  it 'should accept an optional Nokogiri::XML Document as an argument and insert its fields into that (mocked test)' do
56
56
  doc = Nokogiri::XML::Document.parse("<test_xml/>")
57
- mock_new_node = mock("new node")
57
+ mock_new_node = double("new node")
58
58
  doc.root.should_receive(:add_child).with(subject.ng_xml.root).and_return(mock_new_node)
59
59
  result = subject.to_xml(doc)
60
60
  end
@@ -65,7 +65,7 @@ describe "OM::XML::Container" do
65
65
  end
66
66
 
67
67
  it 'should add to root of Nokogiri::XML::Documents, but add directly to the elements if a Nokogiri::XML::Node is passed in' do
68
- mock_new_node = mock("new node")
68
+ mock_new_node = double("new node")
69
69
  mock_new_node.stub(:to_xml).and_return("foo")
70
70
 
71
71
  doc = Nokogiri::XML::Document.parse("<test_document/>")
@@ -47,6 +47,11 @@ describe "OM::XML::DynamicNode" do
47
47
  @sample.date_created = ['A long time ago']
48
48
  @sample.date_created.should == ['A long time ago']
49
49
  end
50
+
51
+ it "checks inequality" do
52
+ @sample.foo = ['in a galaxy far far away']
53
+ expect(@sample.foo != ['nearby']).to be true
54
+ end
50
55
  end
51
56
 
52
57
 
@@ -80,6 +85,10 @@ describe "OM::XML::DynamicNode" do
80
85
  @article.person.last_name.first.should == "FAMILY NAME"
81
86
  end
82
87
 
88
+ it "should respond_to? things an array can do" do
89
+ expect(@article.person.last_name).to respond_to(:map)
90
+ end
91
+
83
92
  it "should delegate with blocks to the found array" do
84
93
  arr = []
85
94
  @article.person.last_name.each{|x| arr << x}
@@ -161,6 +170,20 @@ describe "OM::XML::DynamicNode" do
161
170
  @article.journal.title_info = %W(six seven)
162
171
  @article.journal.title_info.should == ["six", "seven"]
163
172
  end
173
+
174
+ describe '==' do
175
+ it "returns true when values of dynamic nodes are equal." do
176
+ @article.name(0).last_name = "Steven"
177
+ @article.name(0).first_name = "Steven"
178
+ (@article.name(0).last_name == @article.name(0).first_name).should == true
179
+ end
180
+
181
+ it 'returns false when values of dynamic nodes are not equal.' do
182
+ @article.name(0).first_name = "Horatio"
183
+ @article.name(0).last_name = "Hogginobble"
184
+ (@article.name(0).last_name == @article.name(0).first_name).should == false
185
+ end
186
+ end
164
187
  end
165
188
  end
166
189
  end
@@ -33,7 +33,7 @@ describe "OM::XML::Term::Builder" do
33
33
 
34
34
  describe '#new' do
35
35
  it "should set terminology_builder attribute if provided" do
36
- mock_terminology_builder = mock("TerminologyBuilder")
36
+ mock_terminology_builder = double("TerminologyBuilder")
37
37
  OM::XML::Term::Builder.new("term1", mock_terminology_builder).terminology_builder.should == mock_terminology_builder
38
38
  end
39
39
  end
@@ -41,17 +41,19 @@ describe "OM::XML::Term::Builder" do
41
41
  describe "configuration methods" do
42
42
  it "should set the corresponding .settings value return the mapping object" do
43
43
  [:path, :index_as, :required, :type, :variant_of, :path, :attributes, :default_content_path].each do |method_name|
44
- @test_builder.send(method_name, "#{method_name.to_s}foo").should == @test_builder
44
+ @test_builder.send("#{method_name}=".to_sym, "#{method_name.to_s}foo")
45
45
  @test_builder.settings[method_name].should == "#{method_name.to_s}foo"
46
46
  end
47
47
  end
48
- it "should be chainable" do
49
- test_builder = OM::XML::Term::Builder.new("chainableTerm").index_as(:facetable, :searchable, :sortable, :displayable).required(true).type(:text)
50
- resulting_settings = test_builder.settings
51
- resulting_settings[:index_as].should == [:facetable, :searchable, :sortable, :displayable]
52
- resulting_settings[:required].should == true
53
- resulting_settings[:type].should == :text
54
- end
48
+ # it "should be chainable" do
49
+ # test_builder = OM::XML::Term::Builder.new("chainableTerm").tap do |t|
50
+ # t.index_as = [:facetable, :searchable, :sortable, :displayable).required(true).type(:text)
51
+ # end
52
+ # resulting_settings = test_builder.settings
53
+ # resulting_settings[:index_as].should == [:facetable, :searchable, :sortable, :displayable]
54
+ # resulting_settings[:required].should == true
55
+ # resulting_settings[:type].should == :text
56
+ # end
55
57
  end
56
58
 
57
59
  describe "settings" do
@@ -70,7 +72,6 @@ describe "OM::XML::Term::Builder" do
70
72
  it "should insert the given Term Builder into the current Term Builder's children" do
71
73
  @test_builder.add_child(@test_builder_2)
72
74
  @test_builder.children[@test_builder_2.name].should == @test_builder_2
73
- @test_builder.ancestors.should include(@test_builder_2)
74
75
  end
75
76
  end
76
77
  describe ".retrieve_child" do
@@ -88,7 +89,11 @@ describe "OM::XML::Term::Builder" do
88
89
 
89
90
  describe ".build" do
90
91
  it "should build a Term with the given settings and generate its xpath values" do
91
- test_builder = OM::XML::Term::Builder.new("requiredTextFacet").index_as([:facetable, :searchable, :sortable, :displayable]).required(true).type(:text)
92
+ test_builder = OM::XML::Term::Builder.new("requiredTextFacet").tap do |t|
93
+ t.index_as = [:facetable, :searchable, :sortable, :displayable]
94
+ t.required = true
95
+ t.type = :text
96
+ end
92
97
  result = test_builder.build
93
98
  result.should be_instance_of OM::XML::Term
94
99
  result.index_as.should == [:facetable, :searchable, :sortable, :displayable]
@@ -100,7 +105,9 @@ describe "OM::XML::Term::Builder" do
100
105
  result.xpath_relative.should == OM::XML::TermXpathGenerator.generate_relative_xpath(result)
101
106
  end
102
107
  it "should create proxy terms if :proxy is set" do
103
- test_builder = OM::XML::Term::Builder.new("my_proxy").proxy([:foo, :bar])
108
+ test_builder = OM::XML::Term::Builder.new("my_proxy").tap do |t|
109
+ t.proxy = [:foo, :bar]
110
+ end
104
111
  result = test_builder.build
105
112
  result.should be_kind_of OM::XML::NamedTermProxy
106
113
  end
@@ -113,8 +120,8 @@ describe "OM::XML::Term::Builder" do
113
120
  built_child1 = OM::XML::Term.new("child1")
114
121
  built_child2 = OM::XML::Term.new("child2")
115
122
 
116
- mock1 = mock("Builder1", :build => built_child1 )
117
- mock2 = mock("Builder2", :build => built_child2 )
123
+ mock1 = double("Builder1", :build => built_child1 )
124
+ mock2 = double("Builder2", :build => built_child2 )
118
125
  mock1.stub(:name).and_return("child1")
119
126
  mock2.stub(:name).and_return("child2")
120
127
 
@@ -137,10 +144,17 @@ describe "OM::XML::Term::Builder" do
137
144
  @almond.lookup_refs.should == [@peach, @stone_fruit]
138
145
  end
139
146
  it "should raise an error if the TermBuilder does not have a reference to a terminology builder" do
140
- lambda { OM::XML::Term::Builder.new("referrer").ref("bongos").lookup_refs }.should raise_error(StandardError,"Cannot perform lookup_ref for the referrer builder. It doesn't have a reference to any terminology builder")
147
+ lambda {
148
+ OM::XML::Term::Builder.new("referrer").tap do |t|
149
+ t.ref="bongos"
150
+ t.lookup_refs
151
+ end
152
+ }.should raise_error(StandardError,"Cannot perform lookup_ref for the referrer builder. It doesn't have a reference to any terminology builder")
141
153
  end
142
154
  it "should raise an error if the referece points to a nonexistent term builder" do
143
- tb = OM::XML::Term::Builder.new("mork",@test_terminology_builder).ref(:characters, :aliens)
155
+ tb = OM::XML::Term::Builder.new("mork",@test_terminology_builder).tap do |t|
156
+ t.ref = [:characters, :aliens]
157
+ end
144
158
  lambda { tb.lookup_refs }.should raise_error(OM::XML::Terminology::BadPointerError,"This TerminologyBuilder does not have a root TermBuilder defined that corresponds to \":characters\"")
145
159
  end
146
160
  it "should raise an error with informative error when given circular references" do
@@ -158,7 +172,9 @@ describe "OM::XML::Term::Builder" do
158
172
  @test_builder.children.should == children_pre
159
173
  end
160
174
  it "should should look up the referenced TermBuilder, use its settings and duplicate its children without changing the name" do
161
- term_builder = OM::XML::Term::Builder.new("orange",@test_terminology_builder).ref(:fruit_trees, :citrus)
175
+ term_builder = OM::XML::Term::Builder.new("orange",@test_terminology_builder).tap do |b|
176
+ b.ref = [:fruit_trees, :citrus]
177
+ end
162
178
  term_builder.resolve_refs!
163
179
  # Make sure children and settings were copied
164
180
  term_builder.settings.should == @citrus.settings.merge(:path=>"citrus")
@@ -174,7 +190,9 @@ describe "OM::XML::Term::Builder" do
174
190
  @almond.settings[:path].should == "prunus"
175
191
  end
176
192
  it "should set path based on the first ref's name if no path is set" do
177
- orange_builder = OM::XML::Term::Builder.new("orange",@test_terminology_builder).ref(:fruit_trees, :citrus)
193
+ orange_builder = OM::XML::Term::Builder.new("orange",@test_terminology_builder).tap do |b|
194
+ b.ref= [:fruit_trees, :citrus]
195
+ end
178
196
  orange_builder.resolve_refs!
179
197
  orange_builder.settings[:path].should == "citrus"
180
198
  end
@@ -182,7 +200,11 @@ describe "OM::XML::Term::Builder" do
182
200
  it "should result in clean trees of Terms after building"
183
201
 
184
202
  it "should preserve any extra settings specific to this builder (for variant terms)" do
185
- tb = OM::XML::Term::Builder.new("orange",@test_terminology_builder).ref(:fruit_trees, :citrus).attributes(:color=>"orange").required(true)
203
+ tb = OM::XML::Term::Builder.new("orange",@test_terminology_builder).tap do |b|
204
+ b.ref= [:fruit_trees, :citrus]
205
+ b.attributes = {color: "orange"}
206
+ b.required =true
207
+ end
186
208
  tb.resolve_refs!
187
209
  tb.settings.should == {:path=>"citrus", :attributes=>{"citric_acid"=>"true", :color=>"orange"}, :required=>true, :type=>:string, :index_as=>[:facetable]}
188
210
  end
@@ -75,8 +75,8 @@ describe OM::XML::Term do
75
75
 
76
76
  describe ".retrieve_term" do
77
77
  it "should crawl down into mapper children to find the desired term" do
78
- mock_role = mock("mapper", :children =>{:text=>"the target"})
79
- mock_conference = mock("mapper", :children =>{:role=>mock_role})
78
+ mock_role = double("mapper", :children =>{:text=>"the target"})
79
+ mock_conference = double("mapper", :children =>{:role=>mock_role})
80
80
  @test_name_part.should_receive(:children).and_return({:conference=>mock_conference})
81
81
  @test_name_part.retrieve_term(:conference, :role, :text).should == "the target"
82
82
  end
@@ -185,7 +185,7 @@ describe OM::XML::Term do
185
185
  @test_volume.xpath_constrained.should == '//detail[@type="volume" and contains(number, "#{constraint_value}")]'.gsub('"', '\"')
186
186
  end
187
187
  it "should trigger update on any child objects" do
188
- mock_child = mock("child term")
188
+ mock_child = double("child term")
189
189
  mock_child.should_receive(:generate_xpath_queries!).exactly(3).times
190
190
  @test_name_part.should_receive(:children).and_return({1=>mock_child, 2=>mock_child, 3=>mock_child})
191
191
  @test_name_part.generate_xpath_queries!
@@ -68,7 +68,7 @@ describe "OM::XML::TermXpathGeneratorSpec" do
68
68
  OM::XML::TermXpathGenerator.generate_absolute_xpath(@test_term).should == '//namePart[@type="termsOfAddress"]'
69
69
  end
70
70
  it "should prepend the xpath for any parent nodes" do
71
- mock_parent_mapper = mock("Term", :xpath_absolute=>'//name[@type="conference"]/role')
71
+ mock_parent_mapper = double("Term", :xpath_absolute=>'//name[@type="conference"]/role')
72
72
  @test_role_text.stub(:parent => mock_parent_mapper)
73
73
  OM::XML::TermXpathGenerator.generate_absolute_xpath(@test_role_text).should == '//name[@type="conference"]/role/roleTerm[@type="text"]'
74
74
  end
@@ -29,6 +29,7 @@ describe OM::XML::TerminologyBasedSolrizer do
29
29
  solr_doc = Hash.new
30
30
  @mods_article.field_mapper = Solrizer::FieldMapper.new
31
31
  Samples::ModsArticle.terminology.terms.each_pair do |k,v|
32
+ next if k == :mods # we don't index the root node
32
33
  @mods_article.should_receive(:solrize_term).with(v, solr_doc, @mods_article.field_mapper)
33
34
  end
34
35
  @mods_article.to_solr(solr_doc)