peachy 0.2.1 → 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.
- data/History.txt +19 -0
- data/README.rdoc +6 -8
- data/lib/peachy.rb +17 -3
- data/lib/peachy/parsers/nokogiri_wrapper.rb +16 -31
- data/lib/peachy/parsers/parser_factory.rb +22 -0
- data/lib/peachy/parsers/parser_wrapper.rb +8 -0
- data/lib/peachy/parsers/rexml_attribute_wrapper.rb +17 -0
- data/lib/peachy/parsers/rexml_wrapper.rb +42 -0
- data/lib/peachy/parsers/with_xpath.rb +10 -0
- data/lib/peachy/proxy.rb +3 -3
- data/lib/peachy/proxy_factory.rb +2 -13
- data/lib/peachy/version.rb +1 -1
- data/lib/peachy/xml_node.rb +12 -1
- data/spec/attributes_on_a_parent_node_spec.rb +1 -1
- data/spec/camel_case_names_spec.rb +1 -1
- data/spec/nokogiri_is_the_available_xml_parser_spec.rb +18 -3
- data/spec/only_rexml_is_available_spec.rb +41 -0
- data/spec/parsers/all_parser_wrappers_spec.rb +61 -0
- data/spec/pascal_case_names_spec.rb +2 -1
- data/spec/peachy_spec.rb +9 -0
- metadata +19 -27
- data/lib/no_xml_parser_available.rb +0 -10
- data/lib/peachy/xml_parser_factory.rb +0 -15
- data/spec/libxml_is_the_available_xml_parser_spec.rb +0 -30
- data/spec/no_xml_parsers_are_available_spec.rb +0 -13
- data/spec/peachy_parsers_nokogiri_spec.rb +0 -28
data/History.txt
CHANGED
@@ -1,3 +1,22 @@
|
|
1
|
+
== 0.3.0
|
2
|
+
|
3
|
+
* Major improvements
|
4
|
+
* No longer hard-wired to Nokogiri, determining which XML parser is available
|
5
|
+
at first usage, defaulting to REXML if Nokogiri is not found.
|
6
|
+
|
7
|
+
* Minor improvements
|
8
|
+
* Improved implementation of NokogiriWrapper.
|
9
|
+
|
10
|
+
|
11
|
+
== 0.2.1
|
12
|
+
|
13
|
+
* Major improvements
|
14
|
+
* Actually a breaking change from previous version, introducing NokogiriWrapper.
|
15
|
+
It's no longer possible to pass a Nokogiri node directly into Peachy.
|
16
|
+
* Only children can now be treated as if they are arrays in any way, morphing into
|
17
|
+
an array if treated as an array.
|
18
|
+
|
19
|
+
|
1
20
|
== 0.2.0
|
2
21
|
|
3
22
|
* Major improvements
|
data/README.rdoc
CHANGED
@@ -14,18 +14,14 @@ then
|
|
14
14
|
|
15
15
|
require 'peachy'
|
16
16
|
|
17
|
-
in irb/your codebase to get going.
|
17
|
+
in irb / your codebase to get going.
|
18
18
|
|
19
19
|
== Usage
|
20
20
|
The Peachy::Proxy is the key class in Peachy. Create a new instance of a
|
21
|
-
Peachy::Proxy passing in
|
21
|
+
Peachy::Proxy by passing in a raw XML string
|
22
22
|
|
23
23
|
proxy = Peachy::Proxy.new('<xml><node>Peachy</node></xml>')
|
24
24
|
|
25
|
-
or
|
26
|
-
|
27
|
-
proxy = Peachy::Proxy.new(Nokogiri::XML('<xml><node>Peachy</node></xml>'))
|
28
|
-
|
29
25
|
Once you have a Proxy, it's straightforward to drill down through the XML by
|
30
26
|
node name:
|
31
27
|
|
@@ -43,8 +39,10 @@ More detailed usage examples can be found in the .rb files in the /test director
|
|
43
39
|
|
44
40
|
=== XML parsing
|
45
41
|
|
46
|
-
|
47
|
-
|
42
|
+
Peachy tries to determine which XML parser to load when it is first used. Nokogiri
|
43
|
+
is currently the first choice, defaulting to REXML if Nokogiri is not available.
|
44
|
+
It's possible to extend this out so let me know if there are any other XML parsers
|
45
|
+
that you'd like Peachy to support.
|
48
46
|
|
49
47
|
=== Elements and Attributes
|
50
48
|
|
data/lib/peachy.rb
CHANGED
@@ -4,7 +4,6 @@ require File.join(File.dirname(__FILE__), 'already_an_only_child')
|
|
4
4
|
require File.join(File.dirname(__FILE__), 'invalid_proxy_parameters')
|
5
5
|
require File.join(File.dirname(__FILE__), 'method_not_in_ruby_convention')
|
6
6
|
require File.join(File.dirname(__FILE__), 'no_matching_xml_part')
|
7
|
-
require File.join(File.dirname(__FILE__), 'no_xml_parser_available')
|
8
7
|
require File.join(File.dirname(__FILE__), 'peachy/convention_checks')
|
9
8
|
require File.join(File.dirname(__FILE__), 'peachy/string_styler')
|
10
9
|
require File.join(File.dirname(__FILE__), 'peachy/method_name')
|
@@ -13,14 +12,17 @@ require File.join(File.dirname(__FILE__), 'peachy/morph_into_array')
|
|
13
12
|
require File.join(File.dirname(__FILE__), 'peachy/my_meta_class')
|
14
13
|
require File.join(File.dirname(__FILE__), 'peachy/xml_node')
|
15
14
|
require File.join(File.dirname(__FILE__), 'peachy/simple_content')
|
16
|
-
require File.join(File.dirname(__FILE__), 'peachy/
|
15
|
+
require File.join(File.dirname(__FILE__), 'peachy/parsers/parser_factory')
|
16
|
+
require File.join(File.dirname(__FILE__), 'peachy/parsers/with_xpath')
|
17
|
+
require File.join(File.dirname(__FILE__), 'peachy/parsers/parser_wrapper')
|
17
18
|
require File.join(File.dirname(__FILE__), 'peachy/parsers/nokogiri_wrapper')
|
19
|
+
require File.join(File.dirname(__FILE__), 'peachy/parsers/rexml_wrapper')
|
20
|
+
require File.join(File.dirname(__FILE__), 'peachy/parsers/rexml_attribute_wrapper')
|
18
21
|
require File.join(File.dirname(__FILE__), 'peachy/proxy')
|
19
22
|
require File.join(File.dirname(__FILE__), 'peachy/proxy_factory')
|
20
23
|
require File.join(File.dirname(__FILE__), 'peachy/childless_proxy_with_attributes')
|
21
24
|
|
22
25
|
# first up, load the underlying XML parser that Peachy will use
|
23
|
-
Peachy::XmlParserFactory.new.load_parser
|
24
26
|
|
25
27
|
module Peachy
|
26
28
|
def self.whine
|
@@ -30,4 +32,16 @@ module Peachy
|
|
30
32
|
def self.whiny?
|
31
33
|
return @whine
|
32
34
|
end
|
35
|
+
|
36
|
+
def self.proxy xml
|
37
|
+
create_factory unless defined? @factory
|
38
|
+
return Proxy.new(@factory.make_from(xml))
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
def self.create_factory
|
43
|
+
@factory ||= Peachy::Parsers::ParserFactory.new
|
44
|
+
@factory.load_parser
|
45
|
+
return @factory
|
46
|
+
end
|
33
47
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module Peachy
|
2
2
|
module Parsers
|
3
|
-
class NokogiriWrapper
|
3
|
+
class NokogiriWrapper < ParserWrapper
|
4
|
+
include WithXPath
|
5
|
+
|
4
6
|
def initialize nokogiri
|
5
7
|
@nokogiri = nokogiri
|
6
8
|
end
|
@@ -10,32 +12,29 @@ module Peachy
|
|
10
12
|
# in the children of the current location in the DOM.
|
11
13
|
def find_matches method_name
|
12
14
|
matches = xpath(xpath_for(method_name))
|
13
|
-
|
14
|
-
return matches
|
15
|
+
matches.any? ? matches : nil
|
15
16
|
end
|
16
17
|
|
17
18
|
def find_match_by_attributes method_name
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
def find_attribute method_name
|
23
|
-
attribute(method_name.to_s)
|
19
|
+
match = @nokogiri.attribute_nodes.find do |attribute|
|
20
|
+
attribute if method_name.variations.include? attribute.name
|
21
|
+
end
|
22
|
+
match.nil? ? nil : make_from(match)
|
24
23
|
end
|
25
24
|
|
26
25
|
def has_children_and_attributes?
|
27
|
-
|
26
|
+
has_children? and has_attributes?
|
28
27
|
end
|
29
28
|
|
30
29
|
# Determines whether the given element contains any child elements or not.
|
31
30
|
# The choice of implementation is based on performance tests between using
|
32
31
|
# XPath and a Ruby iterator.
|
33
|
-
def
|
34
|
-
children.any? {|child| child.kind_of?
|
32
|
+
def has_children?
|
33
|
+
@nokogiri.children.any? {|child| child.kind_of? Nokogiri::XML::Element }
|
35
34
|
end
|
36
35
|
|
37
|
-
def
|
38
|
-
attribute_nodes.size > 0
|
36
|
+
def has_attributes?
|
37
|
+
@nokogiri.attribute_nodes.size > 0
|
39
38
|
end
|
40
39
|
|
41
40
|
def content
|
@@ -47,26 +46,12 @@ module Peachy
|
|
47
46
|
end
|
48
47
|
|
49
48
|
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
49
|
def xpath xpath
|
64
|
-
@nokogiri.xpath(xpath).map{|noko_node|
|
50
|
+
@nokogiri.xpath(xpath).map{|noko_node| make_from(noko_node) }
|
65
51
|
end
|
66
52
|
|
67
|
-
def
|
68
|
-
|
69
|
-
noko.nil?? nil : NokogiriWrapper.new(noko)
|
53
|
+
def make_from child
|
54
|
+
NokogiriWrapper.new(child)
|
70
55
|
end
|
71
56
|
end
|
72
57
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Peachy
|
2
|
+
module Parsers
|
3
|
+
class ParserFactory
|
4
|
+
def load_parser
|
5
|
+
return load_up(:nokogiri) if Gem.available? /nokogiri/
|
6
|
+
require('rexml/document')
|
7
|
+
@parser = :rexml
|
8
|
+
end
|
9
|
+
|
10
|
+
def make_from raw_xml
|
11
|
+
return NokogiriWrapper.new(Nokogiri::XML(raw_xml)) if @parser == :nokogiri
|
12
|
+
return REXMLWrapper.new(REXML::Document.new(raw_xml)) if @parser == :rexml
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
def load_up xml_parser
|
17
|
+
require(xml_parser.to_s)
|
18
|
+
@parser = xml_parser
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Peachy
|
2
|
+
module Parsers
|
3
|
+
class REXMLWrapper < ParserWrapper
|
4
|
+
include WithXPath
|
5
|
+
|
6
|
+
def initialize rexml_element
|
7
|
+
@rexml = rexml_element
|
8
|
+
end
|
9
|
+
|
10
|
+
def find_matches method_name
|
11
|
+
matches = REXML::XPath.match(@rexml, xpath_for(method_name))
|
12
|
+
return nil if matches.size < 1
|
13
|
+
matches.map {|node| REXMLWrapper.new(node)}
|
14
|
+
end
|
15
|
+
|
16
|
+
def find_match_by_attributes method_name
|
17
|
+
match = @rexml.attributes.find {|attribute| method_name.variations.include? attribute.first }
|
18
|
+
match.nil? ? nil : REXMLAttributeWrapper.new(match)
|
19
|
+
end
|
20
|
+
|
21
|
+
def has_children?
|
22
|
+
@rexml.elements.size > 0
|
23
|
+
end
|
24
|
+
|
25
|
+
def has_attributes?
|
26
|
+
@rexml.attributes.size > 0
|
27
|
+
end
|
28
|
+
|
29
|
+
def has_children_and_attributes?
|
30
|
+
has_children? and has_attributes?
|
31
|
+
end
|
32
|
+
|
33
|
+
def content
|
34
|
+
@rexml.text
|
35
|
+
end
|
36
|
+
|
37
|
+
def name
|
38
|
+
@rexml.name
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/lib/peachy/proxy.rb
CHANGED
@@ -13,7 +13,7 @@ module Peachy
|
|
13
13
|
# single argument.
|
14
14
|
def initialize xml_node
|
15
15
|
@xml = xml_node if xml_node.kind_of? String
|
16
|
-
@
|
16
|
+
@node = xml_node if xml_node.kind_of? Peachy::Parsers::ParserWrapper
|
17
17
|
end
|
18
18
|
|
19
19
|
# Overloaded so that calls to methods representative of an XML element or
|
@@ -113,7 +113,7 @@ module Peachy
|
|
113
113
|
end
|
114
114
|
|
115
115
|
def create_from_element_list method_name, matches
|
116
|
-
|
116
|
+
define_method(method_name) { return matches_to_array(matches) }
|
117
117
|
end
|
118
118
|
|
119
119
|
def matches_to_array matches
|
@@ -130,7 +130,7 @@ module Peachy
|
|
130
130
|
end
|
131
131
|
|
132
132
|
def variables_are_nil?
|
133
|
-
@xml.nil? and @
|
133
|
+
@xml.nil? and @node.nil?
|
134
134
|
end
|
135
135
|
|
136
136
|
def no_matching_xml method_name
|
data/lib/peachy/proxy_factory.rb
CHANGED
@@ -2,22 +2,11 @@ module Peachy
|
|
2
2
|
class ProxyFactory
|
3
3
|
class << self
|
4
4
|
def create_from_element match
|
5
|
-
return create_proxy(match) if
|
6
|
-
return create_proxy_with_attributes(match) if
|
5
|
+
return create_proxy(match) if match.has_children?
|
6
|
+
return create_proxy_with_attributes(match) if match.has_attributes?
|
7
7
|
return create_content_child(match)
|
8
8
|
end
|
9
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
10
|
def create_content_child match
|
22
11
|
SimpleContent.new(match.content, match.name)
|
23
12
|
end
|
data/lib/peachy/version.rb
CHANGED
data/lib/peachy/xml_node.rb
CHANGED
@@ -14,7 +14,18 @@ module Peachy
|
|
14
14
|
# variable.
|
15
15
|
def node
|
16
16
|
raise InvalidProxyParameters.new(:xml => nil, :nokogiri => nil) if variables_are_nil?
|
17
|
-
@
|
17
|
+
@node ||= create
|
18
|
+
end
|
19
|
+
|
20
|
+
def create
|
21
|
+
load_factory unless defined? @factory
|
22
|
+
@factory.make_from @xml
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
def load_factory
|
27
|
+
@factory = Peachy::Parsers::ParserFactory.new
|
28
|
+
@factory.load_parser
|
18
29
|
end
|
19
30
|
end
|
20
31
|
end
|
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe "attributes on a parent node" do
|
4
4
|
before(:each) do
|
5
|
-
@proxy = Peachy::Proxy.new '<root><test_node name="Test"><child>Check meh.</child
|
5
|
+
@proxy = Peachy::Proxy.new '<root><test_node name="Test"><child>Check meh.</child></test_node></root>'
|
6
6
|
end
|
7
7
|
|
8
8
|
it "should return the child when accessing it by name" do
|
@@ -5,7 +5,7 @@ describe "interpreting element and attribute names that are defined in camelCase
|
|
5
5
|
<root>
|
6
6
|
<testNode>Check meh.</testNode>
|
7
7
|
<secondNode id="2" recordLabel="Wall of Sound">Check meh, too.</secondNode>
|
8
|
-
<thirdNode id="2" recordLabel="Wall of Sound"><child>Nested</child></
|
8
|
+
<thirdNode id="2" recordLabel="Wall of Sound"><child>Nested</child></thirdNode>
|
9
9
|
</root>
|
10
10
|
XML
|
11
11
|
end
|
@@ -1,8 +1,10 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'nokogiri'
|
2
3
|
|
3
4
|
describe "nokogiri is the available XML parser" do
|
4
5
|
before(:each) do
|
5
|
-
@factory = Peachy::
|
6
|
+
@factory = Peachy::Parsers::ParserFactory.new
|
7
|
+
expectation = @factory.stubs(:require).with('nokogiri').returns(true)
|
6
8
|
end
|
7
9
|
|
8
10
|
it "should check whether Nokogiri is available" do
|
@@ -11,15 +13,28 @@ describe "nokogiri is the available XML parser" do
|
|
11
13
|
expectation.satisfied?.should be_true
|
12
14
|
end
|
13
15
|
|
14
|
-
it "should return Nokogiri
|
16
|
+
it "should return Nokogiri" do
|
15
17
|
parser_type = @factory.load_parser
|
16
18
|
parser_type.should == :nokogiri
|
17
19
|
end
|
18
20
|
|
19
|
-
it "should load Nokogiri
|
21
|
+
it "should load Nokogiri" do
|
20
22
|
expectation = @factory.expects(:require).with('nokogiri').returns(true)
|
21
23
|
parser_type = @factory.load_parser
|
22
24
|
expectation.satisfied?.should be_true
|
23
25
|
end
|
26
|
+
|
27
|
+
it "should not load REXML" do
|
28
|
+
expectation = @factory.expects(:require).with('rexml/document').never.returns(true)
|
29
|
+
parser_type = @factory.load_parser
|
30
|
+
expectation.satisfied?.should be_true
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should create a NokogiriWrapper from xml" do
|
34
|
+
@factory.load_parser
|
35
|
+
wrapper = @factory.make_from '<thing>Stuff</thing>'
|
36
|
+
wrapper.should be_a Peachy::Parsers::NokogiriWrapper
|
37
|
+
wrapper.content.should == 'Stuff'
|
38
|
+
end
|
24
39
|
end
|
25
40
|
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'rexml/document'
|
3
|
+
|
4
|
+
describe "only REXML is available" do
|
5
|
+
before(:each) do
|
6
|
+
@factory = Peachy::Parsers::ParserFactory.new
|
7
|
+
@factory.stubs(:require).with('rexml/document').returns(true)
|
8
|
+
Gem.stubs(:available?).with(/nokogiri/).returns(false)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should return REXML if no other XML parser is available" do
|
12
|
+
parser = @factory.load_parser
|
13
|
+
parser.should == :rexml
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should load REXML" do
|
17
|
+
expectation = @factory.expects(:require).with('rexml/document').returns(true)
|
18
|
+
@factory.load_parser
|
19
|
+
expectation.satisfied?.should be_true
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should check whether other XML parsers are available" do
|
23
|
+
expectation = Gem.expects(:available?).with(/nokogiri/).returns(false)
|
24
|
+
@factory.load_parser
|
25
|
+
expectation.satisfied?.should be_true
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should not load any other XML parsers" do
|
29
|
+
expectation = @factory.expects(:require).with('nokogiri').never.returns(false)
|
30
|
+
@factory.load_parser
|
31
|
+
expectation.satisfied?.should be_true
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should create a REXMLWrapper from xml" do
|
35
|
+
@factory.load_parser
|
36
|
+
wrapper = @factory.make_from '<thing>Stuff</thing>'
|
37
|
+
wrapper.should be_a Peachy::Parsers::REXMLWrapper
|
38
|
+
wrapper.has_children?.should be_true
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
shared_examples_for "all parser wrappers" do
|
4
|
+
it "should be able to find the correct matches in the underlying XML" do
|
5
|
+
matches = @wrapper.find_matches(Peachy::MethodName.new('child'))
|
6
|
+
matches.size.should == 1
|
7
|
+
matches[0].name.should == 'child'
|
8
|
+
matches[0].content.should == 'Name'
|
9
|
+
matches[0].should be_a @expected_wrapper_class
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should return no matches for a child name that doesn't exist" do
|
13
|
+
matches = @wrapper.find_matches(Peachy::MethodName.new('not_a_child'))
|
14
|
+
matches.should be_nil
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should be able to find the correct attribute matches in the underlying XML" do
|
18
|
+
match = @wrapper.find_match_by_attributes(Peachy::MethodName.new('type'))
|
19
|
+
match.name.should == 'type'
|
20
|
+
match.content.should == 'test'
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should return no matches for an attribute name that doesn't exist" do
|
24
|
+
matches = @wrapper.find_match_by_attributes(Peachy::MethodName.new('attrbiute'))
|
25
|
+
matches.should be_nil
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should indicate that an element has children" do
|
29
|
+
@wrapper.has_children?.should be_true
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should indicate that an element has an attributes" do
|
33
|
+
@wrapper.has_attributes?.should be_true
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should indicate that an element has both children and an attribute" do
|
37
|
+
@wrapper.has_children_and_attributes?.should be_true
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "the Nokogiri parser wrapper class" do
|
42
|
+
before(:each) do
|
43
|
+
noko = Nokogiri::XML('<root type="test"><child>Name</child></root>')
|
44
|
+
@wrapper = Peachy::Parsers::NokogiriWrapper.new((noko/'root')[0])
|
45
|
+
@expected_wrapper_class = Peachy::Parsers::NokogiriWrapper
|
46
|
+
end
|
47
|
+
|
48
|
+
it_should_behave_like "all parser wrappers"
|
49
|
+
end
|
50
|
+
|
51
|
+
require 'rexml/document'
|
52
|
+
|
53
|
+
describe "the REXML parser wrapper class" do
|
54
|
+
before(:each) do
|
55
|
+
rexml = REXML::Document.new('<root type="test"><child>Name</child></root>')
|
56
|
+
@wrapper = Peachy::Parsers::REXMLWrapper.new rexml.root
|
57
|
+
@expected_wrapper_class = Peachy::Parsers::REXMLWrapper
|
58
|
+
end
|
59
|
+
|
60
|
+
it_should_behave_like "all parser wrappers"
|
61
|
+
end
|
@@ -1,11 +1,12 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
|
2
3
|
describe "interpreting element and attribute names that are defined in PascalCase" do
|
3
4
|
before(:each) do
|
4
5
|
@proxy = Peachy::Proxy.new <<XML
|
5
6
|
<Root>
|
6
7
|
<TestNode>Check meh.</TestNode>
|
7
8
|
<SecondNode Id="2" RecordLabel="Wall of Sound">Check meh, too.</SecondNode>
|
8
|
-
<ThirdNode Id="2" RecordLabel="Wall of Sound"><Child>Check meh again.</Child></
|
9
|
+
<ThirdNode Id="2" RecordLabel="Wall of Sound"><Child>Check meh again.</Child></ThirdNode>
|
9
10
|
</Root>
|
10
11
|
XML
|
11
12
|
end
|
data/spec/peachy_spec.rb
ADDED
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 3
|
8
|
+
- 0
|
9
|
+
version: 0.3.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- NJ Pearman
|
@@ -14,26 +14,13 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-05-
|
17
|
+
date: 2010-05-26 00:00:00 +01:00
|
18
18
|
default_executable:
|
19
|
-
dependencies:
|
20
|
-
|
21
|
-
name: nokogiri
|
22
|
-
prerelease: false
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
-
requirements:
|
25
|
-
- - ">="
|
26
|
-
- !ruby/object:Gem::Version
|
27
|
-
segments:
|
28
|
-
- 1
|
29
|
-
- 3
|
30
|
-
- 3
|
31
|
-
version: 1.3.3
|
32
|
-
type: :runtime
|
33
|
-
version_requirements: *id001
|
19
|
+
dependencies: []
|
20
|
+
|
34
21
|
description: |
|
35
22
|
Peachy is an XML slurper that sits on top of existing XML parsers. It dynamically
|
36
|
-
creates object-
|
23
|
+
creates object-trees for simple integration of XML data sources.
|
37
24
|
|
38
25
|
email:
|
39
26
|
- n.pearman@gmail.com
|
@@ -48,18 +35,21 @@ files:
|
|
48
35
|
- lib/peachy/convention_checks.rb
|
49
36
|
- lib/peachy/childless_proxy_with_attributes.rb
|
50
37
|
- lib/peachy/method_name.rb
|
51
|
-
- lib/peachy/xml_parser_factory.rb
|
52
38
|
- lib/peachy/method_mask.rb
|
53
39
|
- lib/peachy/proxy_factory.rb
|
54
40
|
- lib/peachy/simple_content.rb
|
55
41
|
- lib/peachy/version.rb
|
56
42
|
- lib/peachy/proxy.rb
|
43
|
+
- lib/peachy/parsers/rexml_attribute_wrapper.rb
|
57
44
|
- lib/peachy/parsers/nokogiri_wrapper.rb
|
45
|
+
- lib/peachy/parsers/parser_factory.rb
|
46
|
+
- lib/peachy/parsers/with_xpath.rb
|
47
|
+
- lib/peachy/parsers/parser_wrapper.rb
|
48
|
+
- lib/peachy/parsers/rexml_wrapper.rb
|
58
49
|
- lib/peachy/morph_into_array.rb
|
59
50
|
- lib/peachy/my_meta_class.rb
|
60
51
|
- lib/peachy/string_styler.rb
|
61
52
|
- lib/no_matching_xml_part.rb
|
62
|
-
- lib/no_xml_parser_available.rb
|
63
53
|
- lib/invalid_proxy_parameters.rb
|
64
54
|
- lib/method_not_in_ruby_convention.rb
|
65
55
|
- lib/already_an_only_child.rb
|
@@ -67,20 +57,20 @@ files:
|
|
67
57
|
- spec/nokogiri_is_the_available_xml_parser_spec.rb
|
68
58
|
- spec/hyphen_separated_names_spec.rb
|
69
59
|
- spec/elements_referenced_as_collections_spec.rb
|
70
|
-
- spec/peachy_parsers_nokogiri_spec.rb
|
71
60
|
- spec/simple_content_wrapper_for_Peachy_spec.rb
|
72
61
|
- spec/collections_with_children_as_arrays_spec.rb
|
73
62
|
- spec/method_name_spec.rb
|
74
63
|
- spec/childless_elements_referenced_as_collections_spec.rb
|
75
64
|
- spec/simple_xml_collections_as_arrays_spec.rb
|
76
65
|
- spec/simple_element_referenced_as_collections_spec.rb
|
77
|
-
- spec/no_xml_parsers_are_available_spec.rb
|
78
66
|
- spec/using_peachy_proxy_incorrectly_spec.rb
|
79
67
|
- spec/inferring_a_method_from_an_attribute_spec.rb
|
80
|
-
- spec/libxml_is_the_available_xml_parser_spec.rb
|
81
68
|
- spec/camel_case_names_spec.rb
|
82
69
|
- spec/attributes_on_a_parent_node_spec.rb
|
83
70
|
- spec/pascal_case_names_spec.rb
|
71
|
+
- spec/peachy_spec.rb
|
72
|
+
- spec/only_rexml_is_available_spec.rb
|
73
|
+
- spec/parsers/all_parser_wrappers_spec.rb
|
84
74
|
- spec/inferring_a_method_from_element_name_spec.rb
|
85
75
|
- spec/spec_helper.rb
|
86
76
|
- spec/nested_elements_spec.rb
|
@@ -102,8 +92,10 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
102
92
|
- - ">="
|
103
93
|
- !ruby/object:Gem::Version
|
104
94
|
segments:
|
105
|
-
-
|
106
|
-
|
95
|
+
- 1
|
96
|
+
- 8
|
97
|
+
- 7
|
98
|
+
version: 1.8.7
|
107
99
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
108
100
|
requirements:
|
109
101
|
- - ">="
|
@@ -1,15 +0,0 @@
|
|
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
|
@@ -1,30 +0,0 @@
|
|
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
|
-
|
@@ -1,13 +0,0 @@
|
|
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
|
-
|
@@ -1,28 +0,0 @@
|
|
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
|
-
|