demolisher 0.5.2 → 0.6.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/Rakefile +2 -1
- data/VERSION +1 -1
- data/demolisher.gemspec +19 -19
- data/lib/demolisher.rb +30 -18
- data/test/demolisher_test.rb +51 -0
- metadata +25 -10
- data/.gitignore +0 -5
data/Rakefile
CHANGED
@@ -11,7 +11,8 @@ begin
|
|
11
11
|
gem.authors = ["Geoff Garside"]
|
12
12
|
gem.rubyforge_project = 'demolisher'
|
13
13
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
14
|
-
gem.add_dependency('libxml-ruby', '>=
|
14
|
+
gem.add_dependency('libxml-ruby', '>=1.1.3')
|
15
|
+
gem.add_dependency('nokogiri', '>=1.4.2')
|
15
16
|
end
|
16
17
|
|
17
18
|
rescue LoadError
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.6.0
|
data/demolisher.gemspec
CHANGED
@@ -1,56 +1,56 @@
|
|
1
1
|
# Generated by jeweler
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{demolisher}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.6.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Geoff Garside"]
|
12
|
-
s.date = %q{
|
12
|
+
s.date = %q{2011-03-23}
|
13
13
|
s.email = %q{geoff@geoffgarside.co.uk}
|
14
14
|
s.extra_rdoc_files = [
|
15
15
|
"LICENSE",
|
16
|
-
|
16
|
+
"README.rdoc"
|
17
17
|
]
|
18
18
|
s.files = [
|
19
19
|
".document",
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
"test/test_helper.rb"
|
20
|
+
"LICENSE",
|
21
|
+
"README.rdoc",
|
22
|
+
"Rakefile",
|
23
|
+
"VERSION",
|
24
|
+
"demolisher.gemspec",
|
25
|
+
"lib/demolisher.rb",
|
26
|
+
"test/demolisher_test.rb",
|
27
|
+
"test/ns.xml",
|
28
|
+
"test/test.xml",
|
29
|
+
"test/test_helper.rb"
|
31
30
|
]
|
32
31
|
s.homepage = %q{http://github.com/geoffgarside/demolisher}
|
33
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
34
32
|
s.require_paths = ["lib"]
|
35
33
|
s.rubyforge_project = %q{demolisher}
|
36
|
-
s.rubygems_version = %q{1.
|
34
|
+
s.rubygems_version = %q{1.6.2}
|
37
35
|
s.summary = %q{Gem for extracting information from XML files, think Builder but backwards}
|
38
36
|
s.test_files = [
|
39
37
|
"test/demolisher_test.rb",
|
40
|
-
|
38
|
+
"test/test_helper.rb"
|
41
39
|
]
|
42
40
|
|
43
41
|
if s.respond_to? :specification_version then
|
44
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
45
42
|
s.specification_version = 3
|
46
43
|
|
47
44
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
48
45
|
s.add_runtime_dependency(%q<libxml-ruby>, [">= 1.1.3"])
|
46
|
+
s.add_runtime_dependency(%q<nokogiri>, [">= 1.4.2"])
|
49
47
|
else
|
50
48
|
s.add_dependency(%q<libxml-ruby>, [">= 1.1.3"])
|
49
|
+
s.add_dependency(%q<nokogiri>, [">= 1.4.2"])
|
51
50
|
end
|
52
51
|
else
|
53
52
|
s.add_dependency(%q<libxml-ruby>, [">= 1.1.3"])
|
53
|
+
s.add_dependency(%q<nokogiri>, [">= 1.4.2"])
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
data/lib/demolisher.rb
CHANGED
@@ -1,24 +1,29 @@
|
|
1
|
-
require '
|
1
|
+
require 'libxml'
|
2
|
+
require 'nokogiri'
|
3
|
+
require 'nokogiri/xml'
|
2
4
|
|
3
5
|
module Demolisher
|
4
6
|
# Demolish an XML file or XML::Parser object.
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
node = Node.new(
|
7
|
+
# @param [String,IO,#parse] thing
|
8
|
+
def self.demolish(thing, namespaces = nil)
|
9
|
+
thing = _parse(thing) unless thing.kind_of?(Nokogiri::XML::Document)
|
10
|
+
node = Node.new(thing, namespaces, true)
|
9
11
|
|
10
12
|
yield node if block_given?
|
11
13
|
node
|
12
14
|
end
|
13
15
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
16
|
+
def self._exchange_libxml(thing)
|
17
|
+
thing = thing.parse if thing.respond_to?(:parse)
|
18
|
+
thing.to_s
|
19
|
+
end
|
20
|
+
def self._parse(thing)
|
21
|
+
if thing.kind_of?(LibXML::XML::Parser) || thing.kind_of?(LibXML::XML::Document)
|
22
|
+
Nokogiri::XML::Document.parse(_exchange_libxml(thing))
|
20
23
|
else
|
21
|
-
|
24
|
+
# could be string data or a file name
|
25
|
+
thing = File.open(thing) if File.exists?(thing)
|
26
|
+
Nokogiri::XML::Document.parse(thing)
|
22
27
|
end
|
23
28
|
end
|
24
29
|
|
@@ -30,7 +35,8 @@ module Demolisher
|
|
30
35
|
def initialize(xml, namespaces = nil, is_root = true)
|
31
36
|
@nodes = [xml]
|
32
37
|
@nodes.unshift(nil) unless is_root
|
33
|
-
@namespaces = namespaces
|
38
|
+
@namespaces = namespaces || {}
|
39
|
+
@namespaces.merge!(xml.collect_namespaces) if xml.respond_to?(:collect_namespaces)
|
34
40
|
end
|
35
41
|
|
36
42
|
# Access an attribute of the current node.
|
@@ -50,7 +56,7 @@ module Demolisher
|
|
50
56
|
# end
|
51
57
|
#
|
52
58
|
def [](attr_name)
|
53
|
-
_current_node.attributes[attr_name]
|
59
|
+
_current_node.attributes[attr_name].to_s
|
54
60
|
end
|
55
61
|
|
56
62
|
# The workhorse, finds the node matching meth.
|
@@ -73,16 +79,19 @@ module Demolisher
|
|
73
79
|
case block.arity
|
74
80
|
when 1
|
75
81
|
yield idx
|
82
|
+
when 2
|
83
|
+
yield self.class.new(node, @namespaces, false), idx
|
76
84
|
else
|
77
85
|
yield
|
78
86
|
end
|
79
87
|
@nodes.pop
|
80
88
|
end
|
89
|
+
self
|
81
90
|
else
|
82
91
|
node = xpath.first
|
83
92
|
|
84
|
-
if node.
|
85
|
-
content = node.
|
93
|
+
if node.xpath('text()').length == 1
|
94
|
+
content = node.xpath('text()').first.content
|
86
95
|
case meth.to_s
|
87
96
|
when /\?$/
|
88
97
|
!! Regexp.new(/(t(rue)?|y(es)?|1)/i).match(content)
|
@@ -99,13 +108,16 @@ module Demolisher
|
|
99
108
|
def to_s # :nodoc:
|
100
109
|
_current_node.content.strip
|
101
110
|
end
|
111
|
+
def inspect # :nodoc:
|
112
|
+
"#<#{self.class} node=#{_current_node.name}>"
|
113
|
+
end
|
102
114
|
|
103
115
|
def _current_node
|
104
|
-
|
116
|
+
@nodes.last
|
105
117
|
end
|
106
118
|
|
107
119
|
def _xpath_for_element(el_or_ns, el_for_ns = nil)
|
108
|
-
_current_node.
|
120
|
+
_current_node.xpath(_element_from_symbol(el_or_ns, el_for_ns), @namespaces)
|
109
121
|
end
|
110
122
|
|
111
123
|
# Transforms a symbol into a XML element path.
|
data/test/demolisher_test.rb
CHANGED
@@ -47,6 +47,57 @@ class DemolisherTest < Test::Unit::TestCase
|
|
47
47
|
assert_equal 'randy@example.com', @person[:email]
|
48
48
|
end
|
49
49
|
end
|
50
|
+
context "shortened form" do
|
51
|
+
setup do
|
52
|
+
@people = Array.new
|
53
|
+
Demolisher.demolish(File.dirname(__FILE__) +'/test.xml') do |xml|
|
54
|
+
xml.addressbook.person do |person, idx|
|
55
|
+
@people << {:firstname => person.firstname, :lastname => person.lastname,
|
56
|
+
:active => person.active?, :email => person.contact.email, :index => idx}
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
context "first extracted person" do
|
61
|
+
setup do
|
62
|
+
@person = @people[0]
|
63
|
+
end
|
64
|
+
should "have extracted firstname" do
|
65
|
+
assert_equal 'Enoch', @person[:firstname]
|
66
|
+
end
|
67
|
+
should "have extracted lastname" do
|
68
|
+
assert_equal 'Root', @person[:lastname]
|
69
|
+
end
|
70
|
+
should "have extracted true active status" do
|
71
|
+
assert @person[:active]
|
72
|
+
end
|
73
|
+
should "have extracted email" do
|
74
|
+
assert_equal 'enoch@example.com', @person[:email]
|
75
|
+
end
|
76
|
+
should "have index 0" do
|
77
|
+
assert_equal 0, @person[:index]
|
78
|
+
end
|
79
|
+
end
|
80
|
+
context "second extracted person" do
|
81
|
+
setup do
|
82
|
+
@person = @people[1]
|
83
|
+
end
|
84
|
+
should "have extracted firstname" do
|
85
|
+
assert_equal 'Randy', @person[:firstname]
|
86
|
+
end
|
87
|
+
should "have extracted lastname" do
|
88
|
+
assert_equal 'Waterhouse', @person[:lastname]
|
89
|
+
end
|
90
|
+
should "have extracted false active status" do
|
91
|
+
assert !@person[:active]
|
92
|
+
end
|
93
|
+
should "have extracted email" do
|
94
|
+
assert_equal 'randy@example.com', @person[:email]
|
95
|
+
end
|
96
|
+
should "have index 1" do
|
97
|
+
assert_equal 1, @person[:index]
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
50
101
|
end
|
51
102
|
context "Demolished XML String" do
|
52
103
|
setup do
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: demolisher
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 7
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 6
|
9
|
+
- 0
|
10
|
+
version: 0.6.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Geoff Garside
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2011-03-23 00:00:00 +00:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -34,6 +34,22 @@ dependencies:
|
|
34
34
|
version: 1.1.3
|
35
35
|
type: :runtime
|
36
36
|
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: nokogiri
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 3
|
46
|
+
segments:
|
47
|
+
- 1
|
48
|
+
- 4
|
49
|
+
- 2
|
50
|
+
version: 1.4.2
|
51
|
+
type: :runtime
|
52
|
+
version_requirements: *id002
|
37
53
|
description:
|
38
54
|
email: geoff@geoffgarside.co.uk
|
39
55
|
executables: []
|
@@ -45,7 +61,6 @@ extra_rdoc_files:
|
|
45
61
|
- README.rdoc
|
46
62
|
files:
|
47
63
|
- .document
|
48
|
-
- .gitignore
|
49
64
|
- LICENSE
|
50
65
|
- README.rdoc
|
51
66
|
- Rakefile
|
@@ -61,8 +76,8 @@ homepage: http://github.com/geoffgarside/demolisher
|
|
61
76
|
licenses: []
|
62
77
|
|
63
78
|
post_install_message:
|
64
|
-
rdoc_options:
|
65
|
-
|
79
|
+
rdoc_options: []
|
80
|
+
|
66
81
|
require_paths:
|
67
82
|
- lib
|
68
83
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -86,7 +101,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
86
101
|
requirements: []
|
87
102
|
|
88
103
|
rubyforge_project: demolisher
|
89
|
-
rubygems_version: 1.
|
104
|
+
rubygems_version: 1.6.2
|
90
105
|
signing_key:
|
91
106
|
specification_version: 3
|
92
107
|
summary: Gem for extracting information from XML files, think Builder but backwards
|