nom-xml 0.0.1 → 0.0.2
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/decorators/terminology.rb +34 -5
- data/lib/nom/xml/nokogiri_extension.rb +18 -37
- data/lib/nom/xml/version.rb +1 -1
- data/nom.gemspec +1 -0
- data/spec/examples/nutrition_example_spec.rb +11 -0
- data/spec/test_spec.rb +0 -6
- metadata +19 -3
@@ -4,15 +4,44 @@ module Nom::XML::Decorators::Terminology
|
|
4
4
|
klass.add_terminology_methods!
|
5
5
|
end
|
6
6
|
|
7
|
+
def add_terminology_methods!
|
8
|
+
document.add_terminology_methods(self)
|
9
|
+
end
|
10
|
+
|
7
11
|
def terms
|
8
|
-
|
12
|
+
if self == self.document.root or self.is_a? Nokogiri::XML::Document
|
13
|
+
root_terms
|
14
|
+
elsif not self.parent.terms.empty?
|
15
|
+
child_terms
|
16
|
+
else
|
17
|
+
[]
|
18
|
+
end
|
9
19
|
end
|
10
20
|
|
11
|
-
|
12
|
-
|
21
|
+
private
|
22
|
+
|
23
|
+
def root_terms
|
24
|
+
self.document.terminology.terms
|
13
25
|
end
|
14
26
|
|
15
|
-
def
|
16
|
-
|
27
|
+
def child_terms
|
28
|
+
h = {}
|
29
|
+
|
30
|
+
collect_terms_for_node.each do |k,v|
|
31
|
+
v.terms.each do |k1, v1|
|
32
|
+
h[k1] = v1
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
h
|
17
37
|
end
|
38
|
+
|
39
|
+
##
|
40
|
+
#find this self in the terminology
|
41
|
+
def collect_terms_for_node
|
42
|
+
self.parent.terms.select do |k,term|
|
43
|
+
self.parent.xpath(term.local_xpath).include? self
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
18
47
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'active_support/core_ext/array'
|
2
|
+
|
1
3
|
module Nom::XML
|
2
4
|
module NokogiriExtension
|
3
5
|
|
@@ -27,19 +29,24 @@ module Nom::XML
|
|
27
29
|
# Add terminology accessors for querying child terms
|
28
30
|
# @param [Nokogiri::XML::Node] node
|
29
31
|
def add_terminology_methods node
|
30
|
-
if node == node.document.root or node.is_a? Nokogiri::XML::Document
|
31
|
-
node.terms = root_terms(node)
|
32
|
-
elsif not node.parent.terms.empty?
|
33
|
-
node.terms = child_terms(node)
|
34
|
-
end
|
35
32
|
|
36
33
|
node.terms.each do |k, t|
|
37
|
-
(class << node; self; end).send(:define_method, k.to_sym) do
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
34
|
+
(class << node; self; end).send(:define_method, k.to_sym) do |*args|
|
35
|
+
options = args.extract_options!
|
36
|
+
|
37
|
+
args += options.map { |key, value| %{#{key}="#{value.gsub(/"/, '\\\"') }"} }
|
38
|
+
|
39
|
+
xpath = t.local_xpath
|
40
|
+
|
41
|
+
xpath += "[#{args.join('][')}]" unless args.empty?
|
42
|
+
|
43
|
+
result = case self
|
44
|
+
when Nokogiri::XML::Document
|
45
|
+
self.root.xpath(xpath)
|
46
|
+
else
|
47
|
+
result = self.xpath(xpath)
|
48
|
+
end
|
49
|
+
|
43
50
|
m = t.options[:accessor]
|
44
51
|
case
|
45
52
|
when m.nil?
|
@@ -54,31 +61,5 @@ module Nom::XML
|
|
54
61
|
end
|
55
62
|
end
|
56
63
|
end
|
57
|
-
|
58
|
-
private
|
59
|
-
|
60
|
-
def root_terms node
|
61
|
-
node.document.terminology.terms
|
62
|
-
end
|
63
|
-
|
64
|
-
def child_terms node
|
65
|
-
h = {}
|
66
|
-
|
67
|
-
terms_for_node(node).each do |k,v|
|
68
|
-
v.terms.each do |k1, v1|
|
69
|
-
h[k1] = v1
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
h
|
74
|
-
end
|
75
|
-
|
76
|
-
##
|
77
|
-
#find this node in the terminology
|
78
|
-
def terms_for_node node
|
79
|
-
node.parent.terms.select do |k,term|
|
80
|
-
node.parent.xpath(term.local_xpath).include? node
|
81
|
-
end
|
82
|
-
end
|
83
64
|
end
|
84
65
|
end
|
data/lib/nom/xml/version.rb
CHANGED
data/nom.gemspec
CHANGED
@@ -10,6 +10,7 @@ describe "Nutrition" do
|
|
10
10
|
dv.total_fat :path => 'total-fat' do |tf|
|
11
11
|
tf.value :path => '.', :accessor => lambda { |node| node.text.to_i }
|
12
12
|
tf.units :path => '@units'
|
13
|
+
tf.display_value :path => '.', :accessor => lambda { |node| "#{node.value.first}#{node.units}" }
|
13
14
|
end
|
14
15
|
end
|
15
16
|
|
@@ -28,10 +29,15 @@ describe "Nutrition" do
|
|
28
29
|
xml
|
29
30
|
}
|
30
31
|
|
32
|
+
it "should be able to access things via xpath, and then continue with terminology selectors" do
|
33
|
+
subject.xpath('//food').first._name.text.should == "Avocado Dip"
|
34
|
+
end
|
35
|
+
|
31
36
|
it "should have total fat information" do
|
32
37
|
subject.daily_values.total_fat.text.should == "65"
|
33
38
|
subject.daily_values.total_fat.value.should include(65)
|
34
39
|
subject.daily_values.total_fat.units.text.should =='g'
|
40
|
+
subject.daily_values.total_fat.display_value.should include('65g')
|
35
41
|
|
36
42
|
subject.foods.total_fat.value.inject(:+).should == 117
|
37
43
|
end
|
@@ -39,4 +45,9 @@ describe "Nutrition" do
|
|
39
45
|
it "should have food names" do
|
40
46
|
subject.foods._name.text.should include("Avocado Dip")
|
41
47
|
end
|
48
|
+
|
49
|
+
it "should have xpath selectors" do
|
50
|
+
subject.foods(:name => 'Avocado Dip').total_fat.value.first.should == 11
|
51
|
+
subject.foods('total-fat/text() = 11')._name.text.should == "Avocado Dip"
|
52
|
+
end
|
42
53
|
end
|
data/spec/test_spec.rb
CHANGED
@@ -68,13 +68,7 @@ describe Nom do
|
|
68
68
|
# </level2>
|
69
69
|
# </level1>
|
70
70
|
|
71
|
-
it "Should be able to query for all the 'level3' nodes (leafs with different parents)"
|
72
|
-
it "Should be able to query for all the 'level3' nodes that are children of parent1 (leafs with same parent)"
|
73
|
-
it "Should be able to query for the nth child of a specific node"
|
74
|
-
it "Should be able to update the inner text of a specific target node"
|
75
71
|
it "Should be able to update the inner texts of a bunch of nodes????? (e.g. find('level2 > level3').innerText=['one', 'two', 'three']"
|
76
72
|
it "Should be able to add a subtree at a specific point in the graph"
|
77
|
-
it "Should be able to remove a subtree from the graph"
|
78
|
-
it "should be able to set the text content of a node to nil"
|
79
73
|
|
80
74
|
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.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,6 +11,22 @@ bindir: bin
|
|
11
11
|
cert_chain: []
|
12
12
|
date: 2012-09-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: activesupport
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
14
30
|
- !ruby/object:Gem::Dependency
|
15
31
|
name: nokogiri
|
16
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -134,7 +150,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
134
150
|
version: '0'
|
135
151
|
segments:
|
136
152
|
- 0
|
137
|
-
hash:
|
153
|
+
hash: 880844590018492615
|
138
154
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
139
155
|
none: false
|
140
156
|
requirements:
|
@@ -143,7 +159,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
143
159
|
version: '0'
|
144
160
|
segments:
|
145
161
|
- 0
|
146
|
-
hash:
|
162
|
+
hash: 880844590018492615
|
147
163
|
requirements: []
|
148
164
|
rubyforge_project:
|
149
165
|
rubygems_version: 1.8.23
|