nom-xml 0.0.6 → 0.0.7
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.
- data/lib/nom/xml/term.rb +63 -29
- data/lib/nom/xml/version.rb +1 -1
- data/spec/lib/terminology_decorator_spec.rb +18 -0
- data/spec/lib/terminology_spec.rb +21 -0
- metadata +4 -4
data/lib/nom/xml/term.rb
CHANGED
@@ -6,6 +6,13 @@ module Nom::XML
|
|
6
6
|
attr_writer :parent
|
7
7
|
attr_reader :options
|
8
8
|
|
9
|
+
##
|
10
|
+
# Create a new Nom::XML::Term
|
11
|
+
#
|
12
|
+
# @attr [Nom::XML::Term] parent
|
13
|
+
# @attr [String] name
|
14
|
+
# @attr [Hash] options
|
15
|
+
# @yield
|
9
16
|
def initialize parent, name, options = {}, *args, &block
|
10
17
|
@name = name
|
11
18
|
@terms = {}
|
@@ -17,40 +24,59 @@ module Nom::XML
|
|
17
24
|
end
|
18
25
|
end
|
19
26
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
def in_edit_context?
|
27
|
-
@edit_context
|
28
|
-
end
|
29
|
-
|
30
|
-
def parent_xpath
|
31
|
-
@parent_xpath ||= self.parent.xpath
|
32
|
-
end
|
33
|
-
|
34
|
-
def clear_parent_cache!
|
35
|
-
@parent_xpath = nil
|
27
|
+
##
|
28
|
+
# Traverse the tree to figure out what terminology this term belongs to
|
29
|
+
# @return [Nom::XML::Terminology]
|
30
|
+
def terminology
|
31
|
+
@terminology ||= parent.terminology
|
36
32
|
end
|
37
33
|
|
34
|
+
##
|
35
|
+
# Get the absolute xpath to this node
|
36
|
+
# @return [String]
|
38
37
|
def xpath
|
39
38
|
[parent_xpath, local_xpath].flatten.compact.join("/")
|
40
39
|
end
|
41
40
|
|
41
|
+
##
|
42
|
+
# Get the relative xpath to this node from its immediate parent's term
|
43
|
+
# @return [String]
|
42
44
|
def local_xpath
|
43
45
|
("#{xmlns}:" unless xmlns.blank? ).to_s + (options[:path] || name).to_s
|
44
46
|
end
|
45
47
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
48
|
+
##
|
49
|
+
# Get the document nodes associated with this term
|
50
|
+
# @return [Nokogiri::XML::NodeSet]
|
50
51
|
def nodes
|
51
52
|
terminology.document.root.xpath(xpath, terminology.namespaces)
|
52
53
|
end
|
53
54
|
|
55
|
+
##
|
56
|
+
# Does this term have a sub-term called term_name
|
57
|
+
# @attr [String] term_key
|
58
|
+
# @return [Boolean]
|
59
|
+
def key? term_key
|
60
|
+
terms.key? term_key
|
61
|
+
end
|
62
|
+
|
63
|
+
##
|
64
|
+
# Flatten this term and all sub-terms (recursively)
|
65
|
+
# @return [Array]
|
66
|
+
def flatten
|
67
|
+
[self, terms.map { |k,v| v.flatten }].flatten
|
68
|
+
end
|
69
|
+
|
70
|
+
def respond_to? method, *args, &block
|
71
|
+
if in_edit_context?
|
72
|
+
true
|
73
|
+
elsif key? method
|
74
|
+
true
|
75
|
+
else
|
76
|
+
super
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
54
80
|
def method_missing method, *args, &block
|
55
81
|
if in_edit_context?
|
56
82
|
add_term(method, *args, &block)
|
@@ -61,19 +87,17 @@ module Nom::XML
|
|
61
87
|
end
|
62
88
|
end
|
63
89
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
[self, terms.map { |k,v| v.flatten }].flatten
|
90
|
+
protected
|
91
|
+
def in_edit_context &block
|
92
|
+
@edit_context = true
|
93
|
+
yield
|
94
|
+
@edit_context = false
|
70
95
|
end
|
71
96
|
|
72
|
-
def
|
73
|
-
@
|
97
|
+
def in_edit_context?
|
98
|
+
@edit_context
|
74
99
|
end
|
75
100
|
|
76
|
-
protected
|
77
101
|
def add_term method, options = {}, *args, &block
|
78
102
|
terms[method] = Term.new(self, method, options, *args, &block)
|
79
103
|
end
|
@@ -82,6 +106,16 @@ module Nom::XML
|
|
82
106
|
terms[method]
|
83
107
|
end
|
84
108
|
|
109
|
+
##
|
110
|
+
# Get the XPath to the parent nodes for this term
|
111
|
+
def parent_xpath
|
112
|
+
@parent_xpath ||= self.parent.xpath
|
113
|
+
end
|
114
|
+
|
115
|
+
def xmlns
|
116
|
+
(options[:xmlns] if options) || (self.parent.xmlns if self.parent)
|
117
|
+
end
|
118
|
+
|
85
119
|
end
|
86
120
|
|
87
121
|
end
|
data/lib/nom/xml/version.rb
CHANGED
@@ -93,6 +93,24 @@ describe "Nutrition" do
|
|
93
93
|
|
94
94
|
subject.asdf
|
95
95
|
end
|
96
|
+
|
97
|
+
it "should raise an error on unknown accessors" do
|
98
|
+
mock_term = mock(:local_xpath => '//asdf', :options => {:accessor => 123 })
|
99
|
+
@term_accessors = { :asdf => mock_term }
|
100
|
+
|
101
|
+
subject.should_receive(:xpath).with('//asdf', anything)
|
102
|
+
|
103
|
+
expect { subject.asdf }.to raise_error
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should convert single-valued objects to single values" do
|
107
|
+
mock_term = mock(:local_xpath => '//asdf', :options => {:single => true })
|
108
|
+
@term_accessors = { :asdf => mock_term }
|
109
|
+
|
110
|
+
subject.should_receive(:xpath).with('//asdf', anything).and_return([1])
|
111
|
+
|
112
|
+
subject.asdf.should == 1
|
113
|
+
end
|
96
114
|
end
|
97
115
|
|
98
116
|
describe "#terms" do
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Nom::XML::Terminology do
|
4
|
+
describe "#namespaces" do
|
5
|
+
it "should pull the namespaces out of the terminology options" do
|
6
|
+
Nom::XML::Terminology.new(nil, :namespaces => { 'asd' => '123'}).namespaces.should == { 'asd' => '123'}
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should return an empty hash if no namespace is provided" do
|
10
|
+
Nom::XML::Terminology.new.namespaces.should == {}
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "#terminology" do
|
15
|
+
it "should be an identity function" do
|
16
|
+
a = Nom::XML::Terminology.new
|
17
|
+
|
18
|
+
a.terminology.should == a
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
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.0.
|
4
|
+
version: 0.0.7
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-11-
|
12
|
+
date: 2012-11-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -174,7 +174,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
174
174
|
version: '0'
|
175
175
|
segments:
|
176
176
|
- 0
|
177
|
-
hash:
|
177
|
+
hash: 2351930484694908071
|
178
178
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
179
179
|
none: false
|
180
180
|
requirements:
|
@@ -183,7 +183,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
183
183
|
version: '0'
|
184
184
|
segments:
|
185
185
|
- 0
|
186
|
-
hash:
|
186
|
+
hash: 2351930484694908071
|
187
187
|
requirements: []
|
188
188
|
rubyforge_project:
|
189
189
|
rubygems_version: 1.8.23
|