om 2.0.0 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 44a61e82e98c8010da9259bb94dd4c290f197fa7
4
- data.tar.gz: 7386eda5bf6c846f1951cf23072ef94cab809deb
3
+ metadata.gz: 0a6fa4665be8a90aed771767f2a4cdb5d6f76b98
4
+ data.tar.gz: d723ee94c4ffee487c4351a5d41e5d7146082e9f
5
5
  SHA512:
6
- metadata.gz: 79dc1948ff7370f23878e86b864da077efd9937805dff28fe31245757d14b149f18f269addafe84cb650beab61f1207b12ea780e5b690ab26950b68693b363a5
7
- data.tar.gz: 561feab3a3d79d6f24f09ac66f059954487566cf6e12134e1b6c97768551bbb74c10389896adf85060ce4e72e355642db93382394968a07f917bbbc0f826de8d
6
+ metadata.gz: 501f8065eb893cb977490025716bc52b293cfeda24b4bfff788d9120be39aa7e6ecc926e67b5b2f3c802ef014439d2da60e440a5c8466eefca73a15859ad0279
7
+ data.tar.gz: 9b8a97c71fe6f9ccdaf4debd091c97c77c6608ad747fbcbef91a218ffe10ee6fac902a2ef2966b090a0a008b0713bb5a5c13364163d1b73150b7ff143d06ff4e
@@ -4,7 +4,7 @@ OM allows you to define a "terminology" to ease translation between XML and ruby
4
4
 
5
5
  OM "terms" are ruby symbols you define (in the terminology) that map specific XML content into ruby object attributes.
6
6
 
7
- The API documentation at "http://hudson.projecthydra.org/job/om/Documentation/OM.html":http://hudson.projecthydra.org/job/om/Documentation/OM.html provides additional, more targeted information. We will provide links to the API as appropriate.
7
+ The API documentation at "http://rdoc.info/github/projecthydra/om":http://rdoc.info/github/projecthydra/om provides additional, more targeted information. We will provide links to the API as appropriate.
8
8
 
9
9
  h4. What you will learn from this document
10
10
 
@@ -251,4 +251,4 @@ terminology.xpath_for(:organization)
251
251
 
252
252
  h2. Solrizing Documents
253
253
 
254
- The solrizer gem provides support for indexing XML documents into Solr based on OM Terminologies. That process is documented in the "solrizer documentation":http://hudson.projecthydra.org/job/solrizer/Documentation/file.SOLRIZING_OM_DOCUMENTS.html
254
+ The solrizer gem provides support for indexing XML documents into Solr based on OM Terminologies. That process is documented in the "solrizer documentation":http://rdoc.info/github/projecthydra/solrizer
data/History.textile CHANGED
@@ -1,3 +1,11 @@
1
+ h3. 2.1.0 (unreleased)
2
+ support for element names with periods in them
3
+ support for 'type: :time'
4
+
5
+
6
+ h3. 2.0.0
7
+ Support new solr schema
8
+
1
9
  h3. 1.8.0
2
10
  Removed unused mods_article_terminology.xml
3
11
  Replacing :data_type with :type; deprecating :data_type
data/README.textile CHANGED
@@ -8,20 +8,14 @@ OM allows you to define a “terminology” to ease translation between XML and
8
8
 
9
9
  OM “terms” are ruby symbols you define (in the terminology) that map specific XML content into ruby object attributes.
10
10
 
11
- h2. Tutorials
11
+ h2. Tutorials & Reference
12
12
 
13
- * "Getting Started":https://github.com/projecthydra/om/blob/master/GETTING_STARTED.textile
14
- * "Querying Documents":https://github.com/projecthydra/om/blob/master/QUERYING_DOCUMENTS.textile
15
- * "Updating Documents":https://github.com/projecthydra/om/blob/master/UPDATING_DOCUMENTS.textile
16
- * "Getting Fancy":https://github.com/projecthydra/om/blob/master/GETTING_FANCY.textile
17
-
18
- h2. Common OM Patterns
19
-
20
- "Common OM Patterns":https://github.com/projecthydra/om/blob/master/COMMON_OM_PATTERNS.textile
13
+ * "Tame Your XML with OM":https://github.com/projecthydra/om/wiki/Tame-your-XML-with-OM
14
+ * "Common OM Patterns":https://github.com/projecthydra/om/blob/master/COMMON_OM_PATTERNS.textile
21
15
 
22
16
  h3. Solrizing Documents
23
17
 
24
- The solrizer gem provides support for indexing XML documents into Solr based on OM Terminologies. That process is documented in the "solrizer documentation":http://hudson.projecthydra.org/job/solrizer/Documentation/file.SOLRIZING_OM_DOCUMENTS.html
18
+ The solrizer gem provides support for indexing XML documents into Solr based on OM Terminologies. That process is documented in the "solrizer documentation":http://rdoc.info/github/projecthydra/solrizer
25
19
 
26
20
  h2. OM in the Wild
27
21
 
data/lib/om/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Om
2
- VERSION = "2.0.0"
2
+ VERSION = "2.1.0"
3
3
  end
data/lib/om/xml/term.rb CHANGED
@@ -1,147 +1,13 @@
1
+ require 'om/xml/term_builder'
2
+
1
3
  # Special options:
2
4
  # type, index_as, attributes,
3
5
  # is_root_term, required
4
6
  #
5
7
  class OM::XML::Term
6
8
 
7
-
8
-
9
-
10
- # Term::Builder Class Definition
11
- #
12
- # @example
13
- # tb2 = OM::XML::Term::Builder.new("my_term_name").path("fooPath").attributes({:lang=>"foo"}).index_as([:searchable, :facetable]).required(true).type(:text)
14
- #
15
- #
16
- #
17
- # When coding against Builders, remember that they rely on MethodMissing,
18
- # so any time you call a method on the Builder that it doesn't explicitly recognize,
19
- # the Builder will add your method & arguments to the it's settings and return itself.
20
- class Builder
21
-
22
- attr_accessor :name, :settings, :children, :terminology_builder
23
-
24
- def initialize(name, terminology_builder=nil)
25
- @name = name.to_sym
26
- @terminology_builder = terminology_builder
27
- @settings = {:required=>false, :type=>:string}
28
- @children = {}
29
- end
30
-
31
- def add_child(child)
32
- @children[child.name] = child
33
- end
34
-
35
- def retrieve_child(child_name)
36
- child = @children.fetch(child_name, nil)
37
- end
38
-
39
- def lookup_refs(nodes_visited=[])
40
- result = []
41
- if @settings[:ref]
42
- # Fail if we do not have terminology builder
43
- if self.terminology_builder.nil?
44
- raise "Cannot perform lookup_ref for the #{self.name} builder. It doesn't have a reference to any terminology builder"
45
- end
46
- target = self.terminology_builder.retrieve_term_builder(*@settings[:ref])
47
-
48
- # Fail on circular references and return an intelligible error message
49
- if nodes_visited.include?(target)
50
- nodes_visited << self
51
- nodes_visited << target
52
- trail = ""
53
- nodes_visited.each_with_index do |node, z|
54
- trail << node.name.inspect
55
- unless z == nodes_visited.length-1
56
- trail << " => "
57
- end
58
- end
59
- raise OM::XML::Terminology::CircularReferenceError, "Circular reference in Terminology: #{trail}"
60
- end
61
- result << target
62
- result.concat( target.lookup_refs(nodes_visited << self) )
63
- end
64
- return result
65
- end
66
-
67
- # If a :ref value has been set, looks up the target of that ref and merges the target's settings & children with the current builder's settings & children
68
- # operates recursively, so it is possible to apply refs that in turn refer to other nodes.
69
- def resolve_refs!
70
- name_of_last_ref = nil
71
- lookup_refs.each_with_index do |ref,z|
72
- @settings = two_layer_merge(@settings, ref.settings)
73
- @children.merge!(ref.children)
74
- name_of_last_ref = ref.name
75
- end
76
- if @settings[:path].nil? && !name_of_last_ref.nil?
77
- @settings[:path] = name_of_last_ref.to_s
78
- end
79
- @settings.delete :ref
80
- return self
81
- end
82
-
83
- # Returns a new Hash that merges +downstream_hash+ with +upstream_hash+
84
- # similar to calling +upstream_hash+.merge(+downstream_hash+) only it also merges
85
- # any internal values that are themselves Hashes.
86
- def two_layer_merge(downstream_hash, upstream_hash)
87
- up = upstream_hash.dup
88
- dn = downstream_hash.dup
89
- up.each_pair do |setting_name, value|
90
- if value.kind_of?(Hash) && downstream_hash.has_key?(setting_name)
91
- dn[setting_name] = value.merge(downstream_hash[setting_name])
92
- up.delete(setting_name)
93
- end
94
- end
95
- return up.merge(dn)
96
- end
97
-
98
- # Builds a new OM::XML::Term based on the Builder object's current settings
99
- # If no path has been provided, uses the Builder object's name as the term's path
100
- # Recursively builds any children, appending the results as children of the Term that's being built.
101
- # @param [OM::XML::Terminology] terminology that this Term is being built for
102
- def build(terminology=nil)
103
- self.resolve_refs!
104
- if term.self.settings.has_key?(:proxy)
105
- term = OM::XML::NamedTermProxy.new(self.name, self.settings[:proxy], terminology, self.settings)
106
- else
107
- term = OM::XML::Term.new(self.name, {}, terminology)
108
-
109
- self.settings.each do |name, values|
110
- if term.respond_to?(name.to_s+"=")
111
- term.instance_variable_set("@#{name}", values)
112
- end
113
- end
114
- @children.each_value do |child|
115
- term.add_child child.build(terminology)
116
- end
117
- term.generate_xpath_queries!
118
- end
119
-
120
- return term
121
- end
122
-
123
- # We have to add this method so it will play nice with ruby 1.8.7
124
- def type value
125
- @settings[:type] = value
126
- return self
127
- end
128
-
129
-
130
- # Any unknown method calls will add an entry to the settings hash and return the current object
131
- def method_missing method, *args, &block
132
- if args.length == 1
133
- args = args.first
134
- end
135
- @settings[method] = args
136
- return self
137
- end
138
- end
139
-
140
- #
141
- # Class Definition for Term
142
- #
143
-
144
9
  include OM::TreeNode
10
+ include OM::XML::TermBuilder
145
11
 
146
12
  attr_accessor :name, :xpath, :xpath_constrained, :xpath_relative, :path, :index_as, :required, :type, :variant_of, :path, :default_content_path, :is_root_term
147
13
  attr_accessor :children, :internal_xml, :terminology
@@ -185,7 +51,7 @@ class OM::XML::Term
185
51
  # @option opts [String] :path partial xpath that points to the node.
186
52
  # @option opts [Hash] :attributes xml attributes to match in the selector
187
53
  # @option opts [String] :namespace_prefix xml namespace for this node. If not provided, the default namespace set in the terminology will be used.
188
- # @option opts [Symbol] :type one of :string, :date, :integer. Defaults to :string
54
+ # @option opts [Symbol] :type one of :string, :date, :time :integer. Defaults to :string
189
55
  def initialize(name, opts={}, terminology=nil)
190
56
  opts = {:ancestors=>[], :children=>{}}.merge(opts)
191
57
  [:children, :ancestors,:path, :index_as, :required, :variant_of, :path, :attributes, :default_content_path, :namespace_prefix].each do |accessor_name|
@@ -228,6 +94,8 @@ class OM::XML::Term
228
94
  case type
229
95
  when :date, :integer
230
96
  val.to_s
97
+ when :time
98
+ val.to_time.utc.iso8601
231
99
  when :boolean
232
100
  val.to_s
233
101
  else
@@ -242,6 +110,9 @@ class OM::XML::Term
242
110
  when :date
243
111
  #TODO use present?
244
112
  val.map { |v| !v.empty? ? Date.parse(v) : nil}
113
+ when :time
114
+ #TODO use present?
115
+ val.map { |v| !v.empty? ? DateTime.parse(v) : nil}
245
116
  when :integer
246
117
  #TODO use blank?
247
118
  val.map { |v| v.empty? ? nil : v.to_i}
@@ -327,20 +198,29 @@ class OM::XML::Term
327
198
  node_options << "\'#{k}\'=>\'#{v}\'" unless v == :none
328
199
  end
329
200
  end
330
- builder_ref = "xml"
331
- builder_method = self.path
332
- if builder_method.include?(":")
333
- builder_ref = "xml['#{self.path[0..path.index(":")-1]}']"
334
- builder_method = self.path[path.index(":")+1..-1]
201
+
202
+ builder_ref = if self.path.include?(":")
203
+ "xml['#{self.path[0..path.index(":")-1]}']"
335
204
  elsif !self.namespace_prefix.nil? and self.namespace_prefix != 'oxns'
336
- builder_ref = "xml['#{self.namespace_prefix}']"
337
- elsif self.path.kind_of?(Hash) && self.path[:attribute]
338
- builder_method = "@#{self.path[:attribute]}"
205
+ "xml['#{self.namespace_prefix}']"
206
+ else
207
+ "xml"
339
208
  end
340
- if Nokogiri::XML::Builder.method_defined? builder_method.to_sym
341
- builder_method += "_"
209
+
210
+ attribute = OM::XML.delimited_list(node_options)
211
+
212
+ builder_method = if self.path.include?(":")
213
+ "#{self.path[path.index(":")+1..-1]}( #{attribute} )"
214
+ elsif self.path.include?(".")
215
+ "send(:\\\"#{self.path}\\\", #{attribute} )"
216
+ elsif self.path.kind_of?(Hash) && self.path[:attribute]
217
+ "@#{self.path[:attribute]}( #{OM::XML.delimited_list(node_options)} )"
218
+ elsif Nokogiri::XML::Builder.method_defined? self.path.to_sym
219
+ "#{self.path}_( #{OM::XML.delimited_list(node_options)} )"
220
+ else
221
+ "#{self.path}( #{OM::XML.delimited_list(node_options)} )"
342
222
  end
343
- template = "#{builder_ref}.#{builder_method}( #{OM::XML.delimited_list(node_options)} )" + node_child_template
223
+ template = "#{builder_ref}.#{builder_method}#{node_child_template}"
344
224
  return template.gsub( /:::(.*?):::/ ) { '#{'+$1+'}' }
345
225
  end
346
226
 
@@ -0,0 +1,131 @@
1
+ # Term::Builder Class Definition
2
+ #
3
+ # @example
4
+ # tb2 = OM::XML::Term::Builder.new("my_term_name").path("fooPath").attributes({:lang=>"foo"}).index_as([:searchable, :facetable]).required(true).type(:text)
5
+ #
6
+ #
7
+ #
8
+ # When coding against Builders, remember that they rely on MethodMissing,
9
+ # so any time you call a method on the Builder that it doesn't explicitly recognize,
10
+ # the Builder will add your method & arguments to the it's settings and return itself.
11
+ #
12
+ module OM::XML::TermBuilder
13
+ class Builder
14
+ attr_accessor :name, :settings, :children, :terminology_builder
15
+
16
+ def initialize(name, terminology_builder=nil)
17
+ @name = name.to_sym
18
+ @terminology_builder = terminology_builder
19
+ @settings = {:required=>false, :type=>:string}
20
+ @children = {}
21
+ end
22
+
23
+ def add_child(child)
24
+ @children[child.name] = child
25
+ end
26
+
27
+ def retrieve_child(child_name)
28
+ child = @children.fetch(child_name, nil)
29
+ end
30
+
31
+ def lookup_refs(nodes_visited=[])
32
+ result = []
33
+ if @settings[:ref]
34
+ # Fail if we do not have terminology builder
35
+ if self.terminology_builder.nil?
36
+ raise "Cannot perform lookup_ref for the #{self.name} builder. It doesn't have a reference to any terminology builder"
37
+ end
38
+ target = self.terminology_builder.retrieve_term_builder(*@settings[:ref])
39
+
40
+ # Fail on circular references and return an intelligible error message
41
+ if nodes_visited.include?(target)
42
+ nodes_visited << self
43
+ nodes_visited << target
44
+ trail = ""
45
+ nodes_visited.each_with_index do |node, z|
46
+ trail << node.name.inspect
47
+ unless z == nodes_visited.length-1
48
+ trail << " => "
49
+ end
50
+ end
51
+ raise OM::XML::Terminology::CircularReferenceError, "Circular reference in Terminology: #{trail}"
52
+ end
53
+ result << target
54
+ result.concat( target.lookup_refs(nodes_visited << self) )
55
+ end
56
+ return result
57
+ end
58
+
59
+ # If a :ref value has been set, looks up the target of that ref and merges the target's settings & children with the current builder's settings & children
60
+ # operates recursively, so it is possible to apply refs that in turn refer to other nodes.
61
+ def resolve_refs!
62
+ name_of_last_ref = nil
63
+ lookup_refs.each_with_index do |ref,z|
64
+ @settings = two_layer_merge(@settings, ref.settings)
65
+ @children.merge!(ref.children)
66
+ name_of_last_ref = ref.name
67
+ end
68
+ if @settings[:path].nil? && !name_of_last_ref.nil?
69
+ @settings[:path] = name_of_last_ref.to_s
70
+ end
71
+ @settings.delete :ref
72
+ return self
73
+ end
74
+
75
+ # Returns a new Hash that merges +downstream_hash+ with +upstream_hash+
76
+ # similar to calling +upstream_hash+.merge(+downstream_hash+) only it also merges
77
+ # any internal values that are themselves Hashes.
78
+ def two_layer_merge(downstream_hash, upstream_hash)
79
+ up = upstream_hash.dup
80
+ dn = downstream_hash.dup
81
+ up.each_pair do |setting_name, value|
82
+ if value.kind_of?(Hash) && downstream_hash.has_key?(setting_name)
83
+ dn[setting_name] = value.merge(downstream_hash[setting_name])
84
+ up.delete(setting_name)
85
+ end
86
+ end
87
+ return up.merge(dn)
88
+ end
89
+
90
+ # Builds a new OM::XML::Term based on the Builder object's current settings
91
+ # If no path has been provided, uses the Builder object's name as the term's path
92
+ # Recursively builds any children, appending the results as children of the Term that's being built.
93
+ # @param [OM::XML::Terminology] terminology that this Term is being built for
94
+ def build(terminology=nil)
95
+ self.resolve_refs!
96
+ if term.self.settings.has_key?(:proxy)
97
+ term = OM::XML::NamedTermProxy.new(self.name, self.settings[:proxy], terminology, self.settings)
98
+ else
99
+ term = OM::XML::Term.new(self.name, {}, terminology)
100
+
101
+ self.settings.each do |name, values|
102
+ if term.respond_to?(name.to_s+"=")
103
+ term.instance_variable_set("@#{name}", values)
104
+ end
105
+ end
106
+ @children.each_value do |child|
107
+ term.add_child child.build(terminology)
108
+ end
109
+ term.generate_xpath_queries!
110
+ end
111
+
112
+ return term
113
+ end
114
+
115
+ # We have to add this method so it will play nice with ruby 1.8.7
116
+ def type value
117
+ @settings[:type] = value
118
+ return self
119
+ end
120
+
121
+
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
129
+ end
130
+ end
131
+ end
@@ -8,6 +8,7 @@ describe "element values" do
8
8
  set_terminology do |t|
9
9
  t.root(:path => "outer", :xmlns => nil)
10
10
  t.my_date(:type=>:date)
11
+ t.my_time(:type=>:time)
11
12
  t.my_int(:type=>:integer)
12
13
  t.active(:type=>:boolean)
13
14
  t.wrapper do
@@ -23,6 +24,7 @@ describe "element values" do
23
24
  ElementValueTerminology.from_xml <<-EOF
24
25
  <outer outerId="hypatia:outer" type="outer type">
25
26
  <my_date>2012-10-30</my_date>
27
+ <my_time>2012-10-30T12:22:33Z</my_time>
26
28
  <my_int>7</my_int>
27
29
  <active>true</active>
28
30
  </outer>
@@ -32,6 +34,9 @@ EOF
32
34
  it "should deserialize date" do
33
35
  subject.my_date.should == [Date.parse('2012-10-30')]
34
36
  end
37
+ it "should deserialize time" do
38
+ subject.my_time.should == [DateTime.parse('2012-10-30T12:22:33Z')]
39
+ end
35
40
  it "should deserialize ints" do
36
41
  subject.my_int.should == [7]
37
42
  end
@@ -40,11 +45,22 @@ EOF
40
45
  end
41
46
  end
42
47
  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>'
57
+ end
43
58
  it "should serialize date" do
44
59
  subject.my_date = [Date.parse('2012-09-22')]
45
60
  subject.to_xml.should be_equivalent_to '<?xml version="1.0"?>
46
61
  <outer outerId="hypatia:outer" type="outer type">
47
62
  <my_date>2012-09-22</my_date>
63
+ <my_time>2012-10-30T12:22:33Z</my_time>
48
64
  <my_int>7</my_int>
49
65
  <active>true</active>
50
66
  </outer>'
@@ -54,6 +70,7 @@ EOF
54
70
  subject.to_xml.should be_equivalent_to '<?xml version="1.0"?>
55
71
  <outer outerId="hypatia:outer" type="outer type">
56
72
  <my_date>2012-10-30</my_date>
73
+ <my_time>2012-10-30T12:22:33Z</my_time>
57
74
  <my_int>9</my_int>
58
75
  <active>true</active>
59
76
  </outer>'
@@ -63,6 +80,7 @@ EOF
63
80
  subject.to_xml.should be_equivalent_to '<?xml version="1.0"?>
64
81
  <outer outerId="hypatia:outer" type="outer type">
65
82
  <my_date>2012-10-30</my_date>
83
+ <my_time>2012-10-30T12:22:33Z</my_time>
66
84
  <my_int>7</my_int>
67
85
  <active>false</active>
68
86
  </outer>'
@@ -8,7 +8,9 @@ describe "OM::XML::DynamicNode" do
8
8
 
9
9
  set_terminology do |t|
10
10
  t.root(:path=>"dc", :xmlns=>"http://purl.org/dc/terms/")
11
- t.creator(:xmlns=>"http://www.loc.gov/mods/v3", :namespace_prefix => "dcterms")
11
+ t.creator( :namespace_prefix => "dcterms")
12
+ t.foo(:namespace_prefix => "dcterms")
13
+ t.date_created(:path=>'date.created', :namespace_prefix => "dcterms")
12
14
  end
13
15
 
14
16
  def self.xml_template
@@ -29,6 +31,15 @@ describe "OM::XML::DynamicNode" do
29
31
  @sample.creator = ["Foo", "Bar"]
30
32
  @sample.creator.should == ['Foo', 'Bar']
31
33
  end
34
+ it "should create templates for plain nodes" do
35
+ @sample.foo = ['in a galaxy far far away']
36
+ @sample.foo.should == ['in a galaxy far far away']
37
+ end
38
+
39
+ it "should create templates for dynamic nodes with a period in the element name" do
40
+ @sample.date_created = ['A long time ago']
41
+ @sample.date_created.should == ['A long time ago']
42
+ end
32
43
  end
33
44
 
34
45
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: om
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Zumwalt
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-28 00:00:00.000000000 Z
12
+ date: 2013-04-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -229,6 +229,7 @@ files:
229
229
  - lib/om/xml/node_generator.rb
230
230
  - lib/om/xml/template_registry.rb
231
231
  - lib/om/xml/term.rb
232
+ - lib/om/xml/term_builder.rb
232
233
  - lib/om/xml/term_value_operators.rb
233
234
  - lib/om/xml/term_xpath_generator.rb
234
235
  - lib/om/xml/terminology.rb
@@ -294,7 +295,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
294
295
  version: '0'
295
296
  requirements: []
296
297
  rubyforge_project:
297
- rubygems_version: 2.0.0
298
+ rubygems_version: 2.0.3
298
299
  signing_key:
299
300
  specification_version: 4
300
301
  summary: 'OM (Opinionated Metadata): A library to help you tame sprawling XML schemas