nom-xml 0.2.0 → 0.3.0
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.
@@ -1,24 +1,22 @@
|
|
1
1
|
module Nom::XML::Decorators::Terminology
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
super
|
12
|
-
end
|
2
|
+
|
3
|
+
def self.extended node
|
4
|
+
node.add_terminology_method_overrides!
|
5
|
+
end
|
6
|
+
|
7
|
+
def add_terminology_method_overrides!
|
8
|
+
self.term_accessors.each do |k, term|
|
9
|
+
if self.respond_to_without_terms? k and not term.options[:override]
|
10
|
+
raise "Trying to redefine method #{k} on #{self.to_s}"
|
13
11
|
end
|
14
|
-
|
12
|
+
end.select { |k, term| term.options[:override] }.each do |method, term|
|
13
|
+
define_term_method(method, self.term_accessors[method.to_sym])
|
14
|
+
end
|
15
15
|
end
|
16
16
|
|
17
17
|
def method_missing method, *args, &block
|
18
18
|
if self.term_accessors[method.to_sym]
|
19
|
-
(
|
20
|
-
lookup_term(self.term_accessors[method.to_sym], *local_args)
|
21
|
-
end
|
19
|
+
define_term_method(method, self.term_accessors[method.to_sym])
|
22
20
|
|
23
21
|
self.send(method, *args, &block)
|
24
22
|
else
|
@@ -26,6 +24,8 @@ module Nom::XML::Decorators::Terminology
|
|
26
24
|
end
|
27
25
|
end
|
28
26
|
|
27
|
+
alias_method :respond_to_without_terms?, :respond_to?
|
28
|
+
|
29
29
|
def respond_to? method
|
30
30
|
super || self.term_accessors[method.to_sym]
|
31
31
|
end
|
@@ -81,6 +81,12 @@ module Nom::XML::Decorators::Terminology
|
|
81
81
|
h
|
82
82
|
end
|
83
83
|
|
84
|
+
def define_term_method method, term
|
85
|
+
(class << self; self; end).send(:define_method, method.to_sym) do |*local_args|
|
86
|
+
lookup_term(self.term_accessors[method.to_sym], *local_args)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
84
90
|
def lookup_term term, *args
|
85
91
|
options = args.extract_options!
|
86
92
|
|
@@ -116,7 +122,7 @@ module Nom::XML::Decorators::Terminology
|
|
116
122
|
raise "Unknown accessor class: #{m.class}"
|
117
123
|
end
|
118
124
|
|
119
|
-
if return_value and (term.options[:single] or (
|
125
|
+
if return_value and (term.options[:single] or (result.length == 1 and result.first.is_a? Nokogiri::XML::Attr))
|
120
126
|
return return_value.first
|
121
127
|
end
|
122
128
|
|
data/lib/nom/xml/version.rb
CHANGED
@@ -9,7 +9,11 @@ describe "Namespaces example" do
|
|
9
9
|
|
10
10
|
xml.set_terminology(:namespaces => { 'mods' => 'http://www.loc.gov/mods/v3'}) do |t|
|
11
11
|
|
12
|
+
t.genre :path => "mods:genre", :accessor => lambda { |e| e.text }
|
13
|
+
|
12
14
|
t.author :path => '//mods:name' do |n|
|
15
|
+
n.authorityURI :path => '@authorityURI', :accessor => lambda { |e| e.text }
|
16
|
+
n.description :path => 'mods:description', :override => true
|
13
17
|
n.valueURI :path => '@valueURI'
|
14
18
|
n.namePart :path => 'mods:namePart', :single => true, :index_as => [:type_1]
|
15
19
|
end
|
@@ -35,6 +39,10 @@ describe "Namespaces example" do
|
|
35
39
|
xml
|
36
40
|
}
|
37
41
|
|
42
|
+
it "should work with existing reserved method names when override is present" do
|
43
|
+
subject.author.first.description.text.should include('asdf')
|
44
|
+
end
|
45
|
+
|
38
46
|
it "should return nodesets by default" do
|
39
47
|
subject.personal_authors.should be_a_kind_of(Nokogiri::XML::NodeSet)
|
40
48
|
end
|
@@ -47,6 +55,11 @@ describe "Namespaces example" do
|
|
47
55
|
subject.personal_authors.first.valueURI.should be_a_kind_of(Nokogiri::XML::Attr)
|
48
56
|
end
|
49
57
|
|
58
|
+
|
59
|
+
it "should treat attributes with an accessor as a single-able element" do
|
60
|
+
subject.author.first.authorityURI.should == 'http://id.loc.gov/authorities/names'
|
61
|
+
end
|
62
|
+
|
50
63
|
it "should share terms over matched nodes" do
|
51
64
|
subject.personal_authors.first.namePart.text.should == "Alterman, Eric"
|
52
65
|
end
|
@@ -89,7 +102,7 @@ describe "Namespaces example" do
|
|
89
102
|
end
|
90
103
|
|
91
104
|
it "should let you go from a terminology to nodes" do
|
92
|
-
subject.terminology.flatten.length.should ==
|
105
|
+
subject.terminology.flatten.length.should == 14
|
93
106
|
|
94
107
|
subject.terminology.flatten.select { |x| x.options[:index_as] }.should have(2).terms
|
95
108
|
subject.terminology.flatten.select { |x| x.options[:index_as] }.map { |x| x.nodes }.flatten.should have(2).nodes
|
@@ -11,6 +11,7 @@
|
|
11
11
|
<name type="personal" authorityURI="http://id.loc.gov/authorities/names"
|
12
12
|
valueURI="http://id.loc.gov/authorities/names/n92101908">
|
13
13
|
<namePart>Alterman, Eric</namePart>
|
14
|
+
<description>asdf</description>
|
14
15
|
<role>
|
15
16
|
<roleTerm type="text">creator</roleTerm>
|
16
17
|
</role>
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nom-xml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -159,7 +159,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
159
159
|
version: '0'
|
160
160
|
segments:
|
161
161
|
- 0
|
162
|
-
hash: -
|
162
|
+
hash: -2552568584722504681
|
163
163
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
164
164
|
none: false
|
165
165
|
requirements:
|
@@ -168,7 +168,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
168
168
|
version: '0'
|
169
169
|
segments:
|
170
170
|
- 0
|
171
|
-
hash: -
|
171
|
+
hash: -2552568584722504681
|
172
172
|
requirements: []
|
173
173
|
rubyforge_project:
|
174
174
|
rubygems_version: 1.8.23
|