peachy 0.2.0 → 0.2.1

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.
@@ -0,0 +1,10 @@
1
+ class NoXmlParserAvailable < Exception
2
+ def initialize
3
+ super <<MESSAGE
4
+ Peachy was unable to find any XML parser gems. PEachy expects one of the following
5
+ gems to be installed before use:
6
+ Nokogiri
7
+ LibXML
8
+ MESSAGE
9
+ end
10
+ end
@@ -1,16 +1,15 @@
1
1
  module Peachy
2
2
  class ChildlessProxyWithAttributes < Proxy
3
+ # Returns the text content of the XML node encapsulated by this instance.
3
4
  def value
4
5
  acts_as_only_child
5
- @nokogiri_node.content
6
+ node.content
6
7
  end
7
8
 
8
9
  private
9
10
  def generate_method_for_xml method_name
10
11
  check_for_convention(method_name)
11
- match = find_match_by_attributes method_name, nokogiri_node
12
- raise NoMatchingXmlPart.new method_name, node_name if match.nil?
13
- return create_value(match) {|child| define_child method_name, child }
12
+ create_method_for_attribute(method_name) {|match| no_matching_xml(method_name) if match.nil? }
14
13
  end
15
14
  end
16
15
  end
@@ -1,9 +1,15 @@
1
1
  module Peachy
2
2
  module ConventionChecks
3
+ private
4
+ # Checks whether the provided method name is in the accepted convention,
5
+ # raising a MethodNotInRubyConvention if it's not.
3
6
  def check_for_convention method_name
4
7
  raise MethodNotInRubyConvention.new(method_name) unless matches_convention(method_name)
5
8
  end
6
9
 
10
+ # Checks whether the given method name matches the Ruby convention of
11
+ # lowercase with underscores. This method does not allow question marks,
12
+ # excalmation marks or numbers, however.
7
13
  def matches_convention method_name
8
14
  method_name.to_s =~ /^[a-z]+(?:_[a-z]+){0,}$/
9
15
  end
@@ -1,5 +1,6 @@
1
1
  module Peachy
2
2
  module MethodMask
3
+ private
3
4
  def hide_public_methods exceptions
4
5
  methods_to_hide = public_instance_methods.clone
5
6
  exceptions.each do |to_stay_public|
@@ -1,8 +1,8 @@
1
1
  module Peachy
2
2
  module MorphIntoArray
3
+ private
3
4
  def you_use_me_like_an_array method_name, block_given, *args
4
5
  return ((block_given or args.size > 0) and array_can?(method_name))
5
- #method_name == :[] and args.one? and args.first == 0
6
6
  end
7
7
 
8
8
  def array_can? method_name
@@ -1,6 +1,7 @@
1
1
  module Peachy
2
2
  # MyMetaClass is a convenience Module for meta programming within a Class.
3
3
  module MyMetaClass
4
+ private
4
5
  def eval_on_singleton_class &block
5
6
  (class << self; self; end).class_eval &block
6
7
  end
@@ -0,0 +1,73 @@
1
+ module Peachy
2
+ module Parsers
3
+ class NokogiriWrapper
4
+ def initialize nokogiri
5
+ @nokogiri = nokogiri
6
+ end
7
+
8
+ # Runs the XPath for the method name against the underlying XML DOM,
9
+ # returning nil if no element or attribute matching the method name is found
10
+ # in the children of the current location in the DOM.
11
+ def find_matches method_name
12
+ matches = xpath(xpath_for(method_name))
13
+ return nil if matches.length < 1
14
+ return matches
15
+ end
16
+
17
+ def find_match_by_attributes method_name
18
+ mapped = method_name.variations.map {|variation| attribute(variation) }
19
+ mapped.find {|match| match != nil }
20
+ end
21
+
22
+ def find_attribute method_name
23
+ attribute(method_name.to_s)
24
+ end
25
+
26
+ def has_children_and_attributes?
27
+ there_are_child_nodes? and node_has_attributes?
28
+ end
29
+
30
+ # Determines whether the given element contains any child elements or not.
31
+ # The choice of implementation is based on performance tests between using
32
+ # XPath and a Ruby iterator.
33
+ def there_are_child_nodes?
34
+ children.any? {|child| child.kind_of? Peachy::Parsers::NokogiriWrapper }
35
+ end
36
+
37
+ def node_has_attributes?
38
+ attribute_nodes.size > 0
39
+ end
40
+
41
+ def content
42
+ @nokogiri.content
43
+ end
44
+
45
+ def name
46
+ @nokogiri.name
47
+ end
48
+
49
+ private
50
+ def attribute_nodes
51
+ @nokogiri.attribute_nodes.map {|attribute| attribute.content }
52
+ end
53
+
54
+ def children
55
+ @nokogiri.children.map {|child| NokogiriWrapper.new(child) if child.kind_of? Nokogiri::XML::Element }
56
+ end
57
+
58
+ # Gets the XPath for all variations of the MethodName instance
59
+ def xpath_for method_name
60
+ method_name.variations.map {|variation| "./#{variation}" } * '|'
61
+ end
62
+
63
+ def xpath xpath
64
+ @nokogiri.xpath(xpath).map{|noko_node| NokogiriWrapper.new(noko_node) }
65
+ end
66
+
67
+ def attribute attribute_name
68
+ noko = @nokogiri.attribute(attribute_name)
69
+ noko.nil?? nil : NokogiriWrapper.new(noko)
70
+ end
71
+ end
72
+ end
73
+ end
data/lib/peachy/proxy.rb CHANGED
@@ -1,11 +1,8 @@
1
- require 'rubygems'
2
- require 'nokogiri'
3
-
4
1
  module Peachy
5
2
  class Proxy
6
3
  alias_method :original_method_missing, :method_missing
7
4
  extend MethodMask
8
- include ConventionChecks, MorphIntoArray, MyMetaClass, NodeChildMatcher
5
+ include ConventionChecks, MorphIntoArray, MyMetaClass, XmlNode
9
6
 
10
7
  # This hides all public methods on the class except for 'methods', 'nil?'
11
8
  # 'respond_to?' and 'inspect', which I've found are too useful to hide for
@@ -14,9 +11,9 @@ module Peachy
14
11
 
15
12
  # Takes either a string containing XML or a Nokogiri::XML::Element as the
16
13
  # single argument.
17
- def initialize arguments
18
- @xml = arguments if arguments.kind_of? String
19
- @nokogiri_node = arguments if arguments.kind_of? Nokogiri::XML::Element
14
+ def initialize xml_node
15
+ @xml = xml_node if xml_node.kind_of? String
16
+ @nokogiri_node = xml_node if xml_node.kind_of? Peachy::Parsers::NokogiriWrapper #Nokogiri::XML::Element
20
17
  end
21
18
 
22
19
  # Overloaded so that calls to methods representative of an XML element or
@@ -82,81 +79,45 @@ module Peachy
82
79
  acts_as_only_child
83
80
  child_proxy
84
81
  elsif array_can?(method_name)
85
- # if child doesn't exist, see if the call might be a zero-argument
86
- # Array call.
87
- new_proxy = create_from_element(nokogiri_node)
82
+ # morph into an array, as method is a zero-length array call
83
+ new_proxy = ProxyFactory.create_from_element(node)
88
84
  morph_into_array(new_proxy, method_name)
89
85
  else
90
- # no matches, so throw
91
- raise NoMatchingXmlPart.new(method_name, node_name)
86
+ no_matching_xml(method_name)
92
87
  end
93
88
  end
94
89
 
95
90
  private
96
91
  def generate_method_for_xml method_name
97
92
  check_for_convention(method_name)
98
- attribute_content = create_from_parent_with_attribute(method_name, nokogiri_node)
93
+ attribute_content = create_attribute method_name
99
94
  return attribute_content unless attribute_content.nil?
100
- matches = find_matches(method_name, nokogiri_node)
95
+ matches = node.find_matches(method_name)
101
96
  matches.nil? ? nil : create_method_for_child_or_content(method_name, matches)
102
97
  end
103
98
 
104
99
  def create_method_for_child_or_content method_name, matches
105
100
  return create_from_element_list(method_name, matches) if matches.size > 1
106
- return create_from_element(matches[0]) {|child| define_child method_name, child }
107
- end
108
-
109
- def create_from_parent_with_attribute method_name, node
110
- if there_are_child_nodes?(node) and node_has_attributes?(node)
111
- match = node.attribute(method_name.to_s)
112
- create_value(match) {|child| define_child(method_name, child) } unless match.nil?
113
- end
114
- end
115
-
116
- def create_from_element_list method_name, matches
117
- define_method(method_name) { return matches_to_array matches }
118
- end
119
-
120
- def matches_to_array matches
121
- matches.inject([]) {|array, child| array << create_from_element(child) }
122
- end
123
-
124
- def create_from_element match, &block
125
- return create_proxy(match, &block) if there_are_child_nodes?(match)
126
- return create_proxy_with_attributes(match, &block) if node_has_attributes?(match)
127
- return create_content_child(match, &block)
101
+ child = ProxyFactory.create_from_element(matches[0])
102
+ define_child(method_name, child)
128
103
  end
129
104
 
130
- def node_has_attributes? match
131
- match.attribute_nodes.size > 0
105
+ def create_attribute method_name
106
+ create_method_for_attribute(method_name) if node.has_children_and_attributes?
132
107
  end
133
108
 
134
- # Determines whether the given element contains any child elements or not.
135
- # The choice of implementation is based on performance tests between using
136
- # XPath and a Ruby iterator.
137
- def there_are_child_nodes? match
138
- match.children.any? {|child| child.kind_of? Nokogiri::XML::Element }
109
+ def create_method_for_attribute method_name
110
+ match = node.find_match_by_attributes(method_name)
111
+ yield match if block_given?
112
+ define_child(method_name, match.content) unless match.nil?
139
113
  end
140
114
 
141
- def create_value match, &block
142
- create_child(match.content, &block)
143
- end
144
-
145
- def create_content_child match, &block
146
- create_child(SimpleContent.new(match.content, match.name), &block)
147
- end
148
-
149
- def create_proxy match, &block
150
- create_child(Proxy.new(match), &block)
151
- end
152
-
153
- def create_proxy_with_attributes match, &block
154
- create_child ChildlessProxyWithAttributes.new(match), &block
115
+ def create_from_element_list method_name, matches
116
+ define_method(method_name) { return matches_to_array(matches) }
155
117
  end
156
118
 
157
- def create_child child
158
- yield child if block_given?
159
- return child
119
+ def matches_to_array matches
120
+ matches.inject([]) {|array, child| array << ProxyFactory.create_from_element(child) }
160
121
  end
161
122
 
162
123
  def define_child method_name, child
@@ -172,17 +133,8 @@ module Peachy
172
133
  @xml.nil? and @nokogiri_node.nil?
173
134
  end
174
135
 
175
- def node_name
176
- nokogiri_node.name
177
- end
178
-
179
- def nokogiri_node
180
- raise InvalidProxyParameters.new(:xml => nil, :nokogiri => nil) if variables_are_nil?
181
- @nokogiri_node ||= Nokogiri::XML(@xml)
182
- end
183
-
184
- def clone
185
- create_from_element(nokogiri_node)
136
+ def no_matching_xml method_name
137
+ raise NoMatchingXmlPart.new(method_name, node_name)
186
138
  end
187
139
  end
188
140
  end
@@ -0,0 +1,34 @@
1
+ module Peachy
2
+ class ProxyFactory
3
+ class << self
4
+ def create_from_element match
5
+ return create_proxy(match) if there_are_child_nodes?(match)
6
+ return create_proxy_with_attributes(match) if node_has_attributes?(match)
7
+ return create_content_child(match)
8
+ end
9
+
10
+ def node_has_attributes? match
11
+ match.node_has_attributes?
12
+ end
13
+
14
+ # Determines whether the given element contains any child elements or not.
15
+ # The choice of implementation is based on performance tests between using
16
+ # XPath and a Ruby iterator.
17
+ def there_are_child_nodes? match
18
+ match.there_are_child_nodes?
19
+ end
20
+
21
+ def create_content_child match
22
+ SimpleContent.new(match.content, match.name)
23
+ end
24
+
25
+ def create_proxy match
26
+ Proxy.new(match)
27
+ end
28
+
29
+ def create_proxy_with_attributes match
30
+ ChildlessProxyWithAttributes.new(match)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,3 +1,3 @@
1
1
  module Peachy
2
- VERSION = '0.2.0'
2
+ VERSION = '0.2.1'
3
3
  end
@@ -0,0 +1,20 @@
1
+ module Peachy
2
+ module XmlNode
3
+ private
4
+ def clone
5
+ ProxyFactory.create_from_element(node)
6
+ end
7
+
8
+ # Returns the name of the encapsulated node.
9
+ def node_name
10
+ node.name
11
+ end
12
+
13
+ # The encapsulated Nokogiri node, which is lazy loaded from the @xml instance
14
+ # variable.
15
+ def node
16
+ raise InvalidProxyParameters.new(:xml => nil, :nokogiri => nil) if variables_are_nil?
17
+ @nokogiri_node ||= Peachy::Parsers::NokogiriWrapper.new(Nokogiri::XML(@xml))
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,15 @@
1
+ module Peachy
2
+ class XmlParserFactory
3
+ def load_parser
4
+ return load_up(:nokogiri) if Gem.available? /nokogiri/
5
+ return load_up(:libxml) if Gem.available? /libxml/
6
+ raise NoXmlParserAvailable.new
7
+ end
8
+
9
+ private
10
+ def load_up xml_parser
11
+ require(xml_parser.to_s)
12
+ return xml_parser
13
+ end
14
+ end
15
+ end
data/lib/peachy.rb CHANGED
@@ -1,18 +1,27 @@
1
+ require 'rubygems'
2
+
1
3
  require File.join(File.dirname(__FILE__), 'already_an_only_child')
2
4
  require File.join(File.dirname(__FILE__), 'invalid_proxy_parameters')
3
5
  require File.join(File.dirname(__FILE__), 'method_not_in_ruby_convention')
4
6
  require File.join(File.dirname(__FILE__), 'no_matching_xml_part')
7
+ require File.join(File.dirname(__FILE__), 'no_xml_parser_available')
5
8
  require File.join(File.dirname(__FILE__), 'peachy/convention_checks')
6
9
  require File.join(File.dirname(__FILE__), 'peachy/string_styler')
7
10
  require File.join(File.dirname(__FILE__), 'peachy/method_name')
8
11
  require File.join(File.dirname(__FILE__), 'peachy/method_mask')
9
12
  require File.join(File.dirname(__FILE__), 'peachy/morph_into_array')
10
13
  require File.join(File.dirname(__FILE__), 'peachy/my_meta_class')
11
- require File.join(File.dirname(__FILE__), 'peachy/node_child_matcher')
14
+ require File.join(File.dirname(__FILE__), 'peachy/xml_node')
12
15
  require File.join(File.dirname(__FILE__), 'peachy/simple_content')
16
+ require File.join(File.dirname(__FILE__), 'peachy/xml_parser_factory')
17
+ require File.join(File.dirname(__FILE__), 'peachy/parsers/nokogiri_wrapper')
13
18
  require File.join(File.dirname(__FILE__), 'peachy/proxy')
19
+ require File.join(File.dirname(__FILE__), 'peachy/proxy_factory')
14
20
  require File.join(File.dirname(__FILE__), 'peachy/childless_proxy_with_attributes')
15
21
 
22
+ # first up, load the underlying XML parser that Peachy will use
23
+ Peachy::XmlParserFactory.new.load_parser
24
+
16
25
  module Peachy
17
26
  def self.whine
18
27
  @whine = true
@@ -1,3 +1,5 @@
1
+ require 'spec_helper'
2
+
1
3
  describe "attributes on a parent node" do
2
4
  before(:each) do
3
5
  @proxy = Peachy::Proxy.new '<root><test_node name="Test"><child>Check meh.</child><test_node></root>'
@@ -15,4 +17,8 @@ describe "attributes on a parent node" do
15
17
  @proxy.root.test_node.name
16
18
  @proxy.root.test_node.methods.should include 'name'
17
19
  end
20
+
21
+ it "should raise an error if the attirbute does not exist" do
22
+ lambda { @proxy.root.test_node.other }.should raise_error NoMatchingXmlPart
23
+ end
18
24
  end
@@ -1,6 +1,13 @@
1
+ require 'spec_helper'
1
2
  describe "interpreting element and attribute names that are defined in camelCase" do
2
3
  before(:each) do
3
- @proxy = Peachy::Proxy.new '<root><testNode>Check meh.</testNode><secondNode id="2" recordLabel="Wall of Sound">Check meh, too.</secondNode></root>'
4
+ @proxy = Peachy::Proxy.new <<XML
5
+ <root>
6
+ <testNode>Check meh.</testNode>
7
+ <secondNode id="2" recordLabel="Wall of Sound">Check meh, too.</secondNode>
8
+ <thirdNode id="2" recordLabel="Wall of Sound"><child>Nested</child></secondNode>
9
+ </root>
10
+ XML
4
11
  end
5
12
 
6
13
  it "should match a method to an element by camel case" do
@@ -20,5 +27,10 @@ describe "interpreting element and attribute names that are defined in camelCase
20
27
  @proxy.root.second_node.record_label
21
28
  @proxy.root.second_node.methods.should include 'record_label'
22
29
  end
30
+
31
+ it "should match parent attribute names" do
32
+ @proxy.root.third_node.record_label.should == 'Wall of Sound'
33
+ @proxy.root.third_node.methods.should include 'record_label'
34
+ end
23
35
  end
24
36
 
@@ -1,3 +1,5 @@
1
+ require 'spec_helper'
2
+
1
3
  describe "collections with children as arrays" do
2
4
  before(:each) do
3
5
  xml = <<STR
@@ -1,15 +1,42 @@
1
+ require 'spec_helper'
2
+
1
3
  describe "interpretting element names that contain hyphens" do
2
4
  before(:each) do
3
- @proxy = Peachy::Proxy.new '<test-node>Check meh.</test-node>'
5
+ @proxy = Peachy::Proxy.new <<XML
6
+ <test-node>
7
+ <first-child>Check meh.</first-child>
8
+ <second-child record-label="Rough Trade">Check meh, too.</second-child>
9
+ <third-child record-label="Rough Trade"><text-node>Check meh again.</text-node></third-child>
10
+ </test-node>
11
+ XML
4
12
  end
5
13
 
6
14
  it "should try to match a method to a node with hyphens" do
7
- @proxy.test_node.value.should == 'Check meh.'
15
+ @proxy.test_node.first_child.value.should == 'Check meh.'
8
16
  end
9
17
 
10
18
  it "should define a method for the element name" do
11
19
  @proxy.test_node
12
20
  @proxy.methods.should include 'test_node'
13
21
  end
22
+
23
+ it "should match a method to an attribute by pascal case" do
24
+ @proxy.test_node.second_child.record_label.should == 'Rough Trade'
25
+ end
26
+
27
+ it "should define a method from pascal cased attribute name" do
28
+ @proxy.test_node.second_child.record_label
29
+ @proxy.test_node.second_child.methods.should include 'record_label'
30
+ end
31
+
32
+ it "should define a method on a parent with attributes" do
33
+ @proxy.test_node.third_child.record_label.should == 'Rough Trade'
34
+ @proxy.test_node.third_child.methods.should include 'record_label'
35
+ end
36
+
37
+ it "should allow child nodes to be selected after an attrbiute is selected on a parent node" do
38
+ @proxy.test_node.third_child.record_label.should == 'Rough Trade'
39
+ @proxy.test_node.third_child.text_node.value.should == 'Check meh again.'
40
+ end
14
41
  end
15
42
 
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ describe Peachy::XmlParserFactory do
4
+ before(:each) do
5
+ Gem.stubs(:available?).with(/libxml/).returns(true)
6
+ Gem.stubs(:available?).with(/nokogiri/).returns(false)
7
+ @factory = Peachy::XmlParserFactory.new
8
+ @factory.stubs(:require).with('libxml').returns(true)
9
+ end
10
+
11
+ it "should return LibXML if Nokogiri is not an available gem" do
12
+ parser_type = @factory.load_parser
13
+ parser_type.should == :libxml
14
+ end
15
+
16
+ it "should load LibXML if Nokogiri is not an available gem, but LibXML is" do
17
+ first_expectation = Gem.expects(:available?).with(/nokogiri/).returns(false)
18
+ second_expectation = @factory.expects(:require).with('libxml').returns(true)
19
+ parser_type = @factory.load_parser
20
+ first_expectation.satisfied?.should be_true
21
+ second_expectation.satisfied?.should be_true
22
+ end
23
+
24
+ it "should not load Nokogiri if Nokogiri is not an available gem" do
25
+ expectation = @factory.expects(:require).with('nokogiri').returns(true).never()
26
+ parser_type = @factory.load_parser
27
+ expectation.satisfied?.should be_true
28
+ end
29
+ end
30
+
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe "no xml parsers are available" do
4
+ before(:each) do
5
+ Gem.stubs(:available?).returns(false)
6
+ @factory = Peachy::XmlParserFactory.new
7
+ end
8
+
9
+ it "should blow up if no XML parsing library is available" do
10
+ lambda { @factory.load_parser }.should raise_error NoXmlParserAvailable
11
+ end
12
+ end
13
+
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe "nokogiri is the available XML parser" do
4
+ before(:each) do
5
+ @factory = Peachy::XmlParserFactory.new
6
+ end
7
+
8
+ it "should check whether Nokogiri is available" do
9
+ expectation = Gem.expects(:available?).with(/nokogiri/).returns(true)
10
+ parser_type = @factory.load_parser
11
+ expectation.satisfied?.should be_true
12
+ end
13
+
14
+ it "should return Nokogiri if Nokogiri is an available gem" do
15
+ parser_type = @factory.load_parser
16
+ parser_type.should == :nokogiri
17
+ end
18
+
19
+ it "should load Nokogiri if Nokogiri is an available gem" do
20
+ expectation = @factory.expects(:require).with('nokogiri').returns(true)
21
+ parser_type = @factory.load_parser
22
+ expectation.satisfied?.should be_true
23
+ end
24
+ end
25
+
@@ -1,6 +1,13 @@
1
+ require 'spec_helper'
1
2
  describe "interpreting element and attribute names that are defined in PascalCase" do
2
3
  before(:each) do
3
- @proxy = Peachy::Proxy.new '<Root><TestNode>Check meh.</TestNode><SecondNode Id="2" RecordLabel="Wall of Sound">Check meh, too.</SecondNode></Root>'
4
+ @proxy = Peachy::Proxy.new <<XML
5
+ <Root>
6
+ <TestNode>Check meh.</TestNode>
7
+ <SecondNode Id="2" RecordLabel="Wall of Sound">Check meh, too.</SecondNode>
8
+ <ThirdNode Id="2" RecordLabel="Wall of Sound"><Child>Check meh again.</Child></SecondNode>
9
+ </Root>
10
+ XML
4
11
  end
5
12
 
6
13
  it "should match a method to an element by pascal case" do
@@ -20,5 +27,15 @@ describe "interpreting element and attribute names that are defined in PascalCas
20
27
  @proxy.root.second_node.record_label
21
28
  @proxy.root.second_node.methods.should include 'record_label'
22
29
  end
30
+
31
+ it "should define a method on a parent with attributes" do
32
+ @proxy.root.third_node.record_label.should == 'Wall of Sound'
33
+ @proxy.root.third_node.methods.should include 'record_label'
34
+ end
35
+
36
+ it "should allow child nodes to be selected after an attrbiute is selected on a parent node" do
37
+ @proxy.root.third_node.record_label.should == 'Wall of Sound'
38
+ @proxy.root.third_node.child.value.should == 'Check meh again.'
39
+ end
23
40
  end
24
41
 
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ describe "nokogiri wrapper" do
4
+ before(:each) do
5
+ @nokogiri_xml = Nokogiri::XML <<XML
6
+ <root identity="1234" category="awesomeness">
7
+ <child id="1">Hello</child>
8
+ <second_child attribute_one="one" attribute_two="two">Contents</second_child>
9
+ </root>
10
+ XML
11
+ @nokogiri = Peachy::Parsers::NokogiriWrapper.new @nokogiri_xml
12
+ end
13
+
14
+ it "should have all of the methods that I expect" do
15
+ @nokogiri.methods.should include 'content'
16
+ @nokogiri.methods.should include 'name'
17
+ end
18
+
19
+ it "should return the expected content" do
20
+ @simple_noko = Peachy::Parsers::NokogiriWrapper.new(Nokogiri::XML('<xml>Hello</xml>'))
21
+ @simple_noko.content.should == 'Hello'
22
+ end
23
+
24
+ it "should return the expected name" do
25
+ @nokogiri.name.should == 'document'
26
+ end
27
+ end
28
+
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), '../lib/peachy'))
2
+ require 'mocha'
2
3
 
3
4
  Spec::Runner.configure do |config|
4
5
  Peachy.whine
6
+ config.mock_with :mocha
5
7
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 2
8
- - 0
9
- version: 0.2.0
8
+ - 1
9
+ version: 0.2.1
10
10
  platform: ruby
11
11
  authors:
12
12
  - NJ Pearman
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-05-12 00:00:00 +01:00
17
+ date: 2010-05-18 00:00:00 +01:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -44,32 +44,40 @@ extensions: []
44
44
  extra_rdoc_files:
45
45
  - README.rdoc
46
46
  files:
47
+ - lib/peachy/xml_node.rb
47
48
  - lib/peachy/convention_checks.rb
48
49
  - lib/peachy/childless_proxy_with_attributes.rb
49
50
  - lib/peachy/method_name.rb
51
+ - lib/peachy/xml_parser_factory.rb
50
52
  - lib/peachy/method_mask.rb
53
+ - lib/peachy/proxy_factory.rb
51
54
  - lib/peachy/simple_content.rb
52
55
  - lib/peachy/version.rb
53
56
  - lib/peachy/proxy.rb
57
+ - lib/peachy/parsers/nokogiri_wrapper.rb
54
58
  - lib/peachy/morph_into_array.rb
55
59
  - lib/peachy/my_meta_class.rb
56
60
  - lib/peachy/string_styler.rb
57
- - lib/peachy/node_child_matcher.rb
58
61
  - lib/no_matching_xml_part.rb
62
+ - lib/no_xml_parser_available.rb
59
63
  - lib/invalid_proxy_parameters.rb
60
64
  - lib/method_not_in_ruby_convention.rb
61
65
  - lib/already_an_only_child.rb
62
66
  - lib/peachy.rb
67
+ - spec/nokogiri_is_the_available_xml_parser_spec.rb
63
68
  - spec/hyphen_separated_names_spec.rb
64
69
  - spec/elements_referenced_as_collections_spec.rb
70
+ - spec/peachy_parsers_nokogiri_spec.rb
65
71
  - spec/simple_content_wrapper_for_Peachy_spec.rb
66
72
  - spec/collections_with_children_as_arrays_spec.rb
67
73
  - spec/method_name_spec.rb
68
74
  - spec/childless_elements_referenced_as_collections_spec.rb
69
75
  - spec/simple_xml_collections_as_arrays_spec.rb
70
76
  - spec/simple_element_referenced_as_collections_spec.rb
77
+ - spec/no_xml_parsers_are_available_spec.rb
71
78
  - spec/using_peachy_proxy_incorrectly_spec.rb
72
79
  - spec/inferring_a_method_from_an_attribute_spec.rb
80
+ - spec/libxml_is_the_available_xml_parser_spec.rb
73
81
  - spec/camel_case_names_spec.rb
74
82
  - spec/attributes_on_a_parent_node_spec.rb
75
83
  - spec/pascal_case_names_spec.rb
@@ -1,22 +0,0 @@
1
- module Peachy
2
- module NodeChildMatcher
3
- # Runs the XPath for the method name against the underlying XML DOM,
4
- # returning nil if no element or attribute matching the method name is found
5
- # in the children of the current location in the DOM.
6
- def find_matches method_name, node #=nokogiri_node
7
- matches = node.xpath(xpath_for(method_name))
8
- return nil if matches.length < 1
9
- return matches
10
- end
11
-
12
- def find_match_by_attributes method_name, node
13
- mapped = method_name.variations.map {|variation| node.attribute variation }
14
- mapped.find {|match| match != nil }
15
- end
16
-
17
- # Gets the XPath for all variations of the MethodName instance
18
- def xpath_for method_name
19
- method_name.variations.map {|variation| "./#{variation}" } * '|'
20
- end
21
- end
22
- end