pipa-xmlnuts 0.0.5 → 0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +121 -0
- data/lib/xmlnuts/converters.rb +2 -2
- data/lib/xmlnuts/nuts.rb +24 -6
- data/lib/xmlnuts.rb +0 -47
- data/test/parsing_test.rb +35 -24
- metadata +6 -6
- data/README +0 -5
data/README.rdoc
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
== Introduction
|
2
|
+
XmlNuts is an library that allows for bidirectional mapping between Ruby objects and XML.
|
3
|
+
|
4
|
+
== Features
|
5
|
+
- Type awareness (extensible)
|
6
|
+
- XML namespaces support
|
7
|
+
- Pluggable backends to work with different XML APIs (only REXML implemented so far)
|
8
|
+
|
9
|
+
== Installation
|
10
|
+
gem install pipa-xmlnuts --source http://gems.github.com
|
11
|
+
|
12
|
+
== Usage
|
13
|
+
TODO
|
14
|
+
Please see example below.
|
15
|
+
|
16
|
+
== Issue tracking
|
17
|
+
Please file bugs and feature requests at http://pipa.lighthouseapp.com/projects/21756-xmlnuts
|
18
|
+
|
19
|
+
== License
|
20
|
+
Released under the MIT license (included).
|
21
|
+
|
22
|
+
== Example
|
23
|
+
class Cheezburger
|
24
|
+
include XmlNuts::Nut
|
25
|
+
|
26
|
+
attribute :weight, :integer
|
27
|
+
end
|
28
|
+
|
29
|
+
class Cat
|
30
|
+
include XmlNuts::Nut
|
31
|
+
|
32
|
+
namespaces :lol => 'urn:x-lol', :kthnx => 'urn:x-lol:kthnx'
|
33
|
+
|
34
|
+
root 'kitteh', :xmlns => :lol
|
35
|
+
|
36
|
+
attribute :has_tail, :boolean, :xmlname => 'has-tail', :xmlns => 'urn:x-lol:kthnx'
|
37
|
+
attribute :ears, :integer
|
38
|
+
|
39
|
+
element :ration, [:string], :xmlname => :eats, :xmlns => :kthnx
|
40
|
+
element :name, :string, :whitespace => :collapse, :xmlns => 'urn:x-lol:kthnx'
|
41
|
+
elements :paws, :string, :xmlname => :paw
|
42
|
+
|
43
|
+
element :friends, :xmlname => :pals do # anonymous class definition follows within block
|
44
|
+
elements :names, :string, :xmlname => :friend, :xmlname => :pal
|
45
|
+
end
|
46
|
+
|
47
|
+
element :cheezburger, Cheezburger
|
48
|
+
end
|
49
|
+
|
50
|
+
class ParsingTest < Test::Unit::TestCase
|
51
|
+
def setup
|
52
|
+
@xml_fragment = <<-EOS
|
53
|
+
<kitteh xmlns='urn:x-lol' xmlns:kthnx='urn:x-lol:kthnx' ears=' 2 ' kthnx:has-tail=' yes '>
|
54
|
+
<name xmlns='urn:x-lol:kthnx'>
|
55
|
+
Silly
|
56
|
+
Tom
|
57
|
+
Писда
|
58
|
+
</name>
|
59
|
+
<kthnx:eats>
|
60
|
+
tigers
|
61
|
+
lions
|
62
|
+
</kthnx:eats>
|
63
|
+
<pals>
|
64
|
+
<pal>Chrissy</pal>
|
65
|
+
<pal>Missy</pal>
|
66
|
+
<pal>Sissy</pal>
|
67
|
+
</pals>
|
68
|
+
<paw> one</paw>
|
69
|
+
<paw> two </paw>
|
70
|
+
<paw>three</paw>
|
71
|
+
<paw>four</paw>
|
72
|
+
<cheezburger weight='2' />
|
73
|
+
</kitteh>
|
74
|
+
EOS
|
75
|
+
@cat = Cat.parse(@xml_fragment)
|
76
|
+
end
|
77
|
+
|
78
|
+
context "A cat" do
|
79
|
+
should 'be named Silly Tom' do
|
80
|
+
assert_equal 'Silly Tom Писда', @cat.name
|
81
|
+
end
|
82
|
+
|
83
|
+
should 'eat tigers and lions' do
|
84
|
+
assert_equal %w(tigers lions), @cat.ration
|
85
|
+
end
|
86
|
+
|
87
|
+
should 'be a friend of Chrissy, Missy & Sissy' do
|
88
|
+
assert_equal ['Chrissy', 'Missy', 'Sissy'], @cat.friends.names
|
89
|
+
end
|
90
|
+
|
91
|
+
should 'have 2 ears' do
|
92
|
+
assert_equal 2, @cat.ears
|
93
|
+
end
|
94
|
+
|
95
|
+
should 'have tail' do
|
96
|
+
assert_equal true, @cat.has_tail
|
97
|
+
end
|
98
|
+
|
99
|
+
should 'have four paws' do
|
100
|
+
assert_not_nil @cat.paws
|
101
|
+
assert_equal 4, @cat.paws.length
|
102
|
+
assert_equal %w(one two three four), @cat.paws
|
103
|
+
end
|
104
|
+
|
105
|
+
should 'has cheezburger' do
|
106
|
+
assert_kind_of Cheezburger, @cat.cheezburger
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
context 'A cheezburger' do
|
111
|
+
setup do
|
112
|
+
@burger = @cat.cheezburger
|
113
|
+
end
|
114
|
+
|
115
|
+
should 'weigh 2 pounds' do
|
116
|
+
assert_equal 2, @burger.weight
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
...
|
121
|
+
puts @cat.build
|
data/lib/xmlnuts/converters.rb
CHANGED
@@ -36,9 +36,9 @@ module XmlNuts
|
|
36
36
|
def from_xml(string)
|
37
37
|
return nil unless string
|
38
38
|
string = case @whitespace
|
39
|
-
when :trim then string.
|
39
|
+
when :trim then string.gsub(/(\A\s*)|(\s*\Z)/, '')
|
40
40
|
when :preserve then string
|
41
|
-
when :collapse then string.gsub(/\s+/, ' ').
|
41
|
+
when :collapse then string.gsub(/\s+/, ' ').gsub(/\A\s*|\s*\Z|\s*(?=\s)/, '')
|
42
42
|
end
|
43
43
|
end
|
44
44
|
end
|
data/lib/xmlnuts/nuts.rb
CHANGED
@@ -54,7 +54,8 @@ module XmlNuts #:nodoc:
|
|
54
54
|
@root ||= Root.new('root')
|
55
55
|
end
|
56
56
|
|
57
|
-
# element(name, [type[, options]])
|
57
|
+
# element(name, [type[, options]]) -> Mappings::Element or Mappings::ElementValue
|
58
|
+
# element(name[, options]) { block } -> Mappings::Element
|
58
59
|
#
|
59
60
|
# Defines single-element mapping.
|
60
61
|
#
|
@@ -62,6 +63,7 @@ module XmlNuts #:nodoc:
|
|
62
63
|
# +name+:: Accessor name
|
63
64
|
# +type+:: Element type. +:string+ assumed if omitted (see +Converter+).
|
64
65
|
# +options+:: +:xmlname+, +:xmlns+, converter options (see +Converter+).
|
66
|
+
# +block+:: An anonymous class definition.
|
65
67
|
#
|
66
68
|
# === Example:
|
67
69
|
# class Cat
|
@@ -71,12 +73,14 @@ module XmlNuts #:nodoc:
|
|
71
73
|
# element :cheeseburger, Cheeseburger, :xmlname => :cheezburger
|
72
74
|
# ...
|
73
75
|
# end
|
74
|
-
def element(name, type = :string, options = {})
|
76
|
+
def element(name, type = :string, options = {}, &block)
|
77
|
+
type, options = prepare_args(type, options, &block)
|
75
78
|
define_accessor name
|
76
79
|
(mappings << (type.is_a?(Class) ? Element : ElementValue).new(name, type, prepare_options(options))).last
|
77
80
|
end
|
78
81
|
|
79
|
-
# elements(name, [type[, options]])
|
82
|
+
# elements(name, [type[, options]]) -> Mappings::Element or Mappings::ElementValue
|
83
|
+
# elements(name[, options]) { block } -> Mappings::Element
|
80
84
|
#
|
81
85
|
# Defines multiple elements mapping.
|
82
86
|
#
|
@@ -84,16 +88,18 @@ module XmlNuts #:nodoc:
|
|
84
88
|
# +name+:: Accessor name
|
85
89
|
# +type+:: Element type. +:string+ assumed if omitted (see +Converter+).
|
86
90
|
# +options+:: +:xmlname+, +:xmlns+, converter options (see +Converter+).
|
91
|
+
# +block+:: An anonymous class definition.
|
87
92
|
#
|
88
93
|
# === Example:
|
89
94
|
# class RichCat
|
90
95
|
# include XmlNuts::Nut
|
91
96
|
# ...
|
92
97
|
# elements :ration, :string, :whitespace => :collapse
|
93
|
-
# elements :cheeseburgers, Cheeseburger, :xmlname => :
|
98
|
+
# elements :cheeseburgers, Cheeseburger, :xmlname => :cheezburger
|
94
99
|
# ...
|
95
100
|
# end
|
96
|
-
def elements(name, type = :string, options = {})
|
101
|
+
def elements(name, type = :string, options = {}, &block)
|
102
|
+
type, options = prepare_args(type, options, &block)
|
97
103
|
define_accessor name
|
98
104
|
(mappings << (type.is_a?(Class) ? Elements : ElementValues).new(name, type, prepare_options(options))).last
|
99
105
|
end
|
@@ -122,7 +128,7 @@ module XmlNuts #:nodoc:
|
|
122
128
|
|
123
129
|
# mappings -> Array
|
124
130
|
#
|
125
|
-
# Returns all
|
131
|
+
# Returns all XmlNuts mappings defined on a class.
|
126
132
|
def mappings
|
127
133
|
@mappings ||= []
|
128
134
|
end
|
@@ -143,6 +149,18 @@ module XmlNuts #:nodoc:
|
|
143
149
|
end
|
144
150
|
|
145
151
|
private
|
152
|
+
def prepare_args(type, options, &block)
|
153
|
+
if block_given?
|
154
|
+
options = type if type.is_a?(Hash)
|
155
|
+
type = Class.new
|
156
|
+
type.class_eval do
|
157
|
+
include XmlNuts::Nut
|
158
|
+
class_eval(&block)
|
159
|
+
end
|
160
|
+
end
|
161
|
+
return type, prepare_options(options)
|
162
|
+
end
|
163
|
+
|
146
164
|
def prepare_options(options)
|
147
165
|
ns = options[:xmlns]
|
148
166
|
if ns.is_a?(Symbol)
|
data/lib/xmlnuts.rb
CHANGED
@@ -1,48 +1 @@
|
|
1
1
|
require 'xmlnuts/nuts'
|
2
|
-
|
3
|
-
#class Cheezburger
|
4
|
-
# include XmlNuts::Nut
|
5
|
-
#
|
6
|
-
# attribute :weight, :integer
|
7
|
-
#end
|
8
|
-
#
|
9
|
-
#class Pet
|
10
|
-
# include XmlNuts::Nut
|
11
|
-
#
|
12
|
-
# namespaces :pipi => 'a', :piz => 'b'
|
13
|
-
#
|
14
|
-
# root 'anus', :xmlns => :piz
|
15
|
-
#
|
16
|
-
# element :eats, [:string], :xmlname => :ration, :xmlns => 'a'
|
17
|
-
# element :species, :string, :whitespace => :collapse
|
18
|
-
# elements :paws, :string, :xmlname => :paw
|
19
|
-
#
|
20
|
-
# attribute :has_tail, :boolean, :xmlname => 'has-tail', :xmlns => 'b'
|
21
|
-
# attribute :height, :integer
|
22
|
-
#
|
23
|
-
# element :cheezburger, Cheezburger
|
24
|
-
#end
|
25
|
-
#
|
26
|
-
#xml_fragment = <<-EOS
|
27
|
-
# <mypet xmlns='lol' xmlns:pizda="b" height=' 12 ' pizda:has-tail=' yes '>
|
28
|
-
# <species>
|
29
|
-
#silly
|
30
|
-
# mouse
|
31
|
-
# </species>
|
32
|
-
# <pi:ration xmlns:pi="a">
|
33
|
-
# tigers
|
34
|
-
# lions
|
35
|
-
# </pi:ration>
|
36
|
-
# <paw> one</paw>
|
37
|
-
# <paw> two </paw>
|
38
|
-
# <paw>three</paw>
|
39
|
-
# <paw>four</paw>
|
40
|
-
# <cheezburger weight='2'>
|
41
|
-
# </cheezburger>
|
42
|
-
# <cub age='4'>
|
43
|
-
# </cub>
|
44
|
-
# </mypet>
|
45
|
-
#EOS
|
46
|
-
#pet = Pet.parse(xml_fragment)
|
47
|
-
#
|
48
|
-
#puts pet.build
|
data/test/parsing_test.rb
CHANGED
@@ -13,16 +13,20 @@ end
|
|
13
13
|
class Cat
|
14
14
|
include XmlNuts::Nut
|
15
15
|
|
16
|
-
namespaces :lol => 'urn:lol', :
|
16
|
+
namespaces :lol => 'urn:x-lol', :kthnx => 'urn:x-lol:kthnx'
|
17
17
|
|
18
|
-
root 'kitteh', :xmlns =>
|
18
|
+
root 'kitteh', :xmlns => :lol
|
19
19
|
|
20
|
-
|
21
|
-
|
20
|
+
attribute :has_tail, :boolean, :xmlname => 'has-tail', :xmlns => 'urn:x-lol:kthnx'
|
21
|
+
attribute :ears, :integer
|
22
|
+
|
23
|
+
element :ration, [:string], :xmlname => :eats, :xmlns => :kthnx
|
24
|
+
element :name, :string, :whitespace => :collapse, :xmlns => 'urn:x-lol:kthnx'
|
22
25
|
elements :paws, :string, :xmlname => :paw
|
23
26
|
|
24
|
-
|
25
|
-
|
27
|
+
element :friends, :xmlname => :pals do
|
28
|
+
elements :names, :string, :xmlname => :pal
|
29
|
+
end
|
26
30
|
|
27
31
|
element :cheezburger, Cheezburger
|
28
32
|
end
|
@@ -30,39 +34,46 @@ end
|
|
30
34
|
class ParsingTest < Test::Unit::TestCase
|
31
35
|
def setup
|
32
36
|
@xml_fragment = <<-EOS
|
33
|
-
<
|
34
|
-
<
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
37
|
+
<kitteh xmlns='urn:x-lol' xmlns:kthnx='urn:x-lol:kthnx' ears=' 2 ' kthnx:has-tail=' yes '>
|
38
|
+
<name xmlns='urn:x-lol:kthnx'>
|
39
|
+
Silly
|
40
|
+
Tom
|
41
|
+
Писта
|
42
|
+
</name>
|
43
|
+
<kthnx:eats>
|
39
44
|
tigers
|
40
45
|
lions
|
41
|
-
</
|
46
|
+
</kthnx:eats>
|
47
|
+
<pals>
|
48
|
+
<pal>Chrissy</pal>
|
49
|
+
<pal>Missy</pal>
|
50
|
+
<pal>Sissy</pal>
|
51
|
+
</pals>
|
42
52
|
<paw> one</paw>
|
43
53
|
<paw> two </paw>
|
44
54
|
<paw>three</paw>
|
45
55
|
<paw>four</paw>
|
46
|
-
<cheezburger weight='2'
|
47
|
-
|
48
|
-
<cub age='4'>
|
49
|
-
</cub>
|
50
|
-
</mypet>
|
56
|
+
<cheezburger weight='2' />
|
57
|
+
</kitteh>
|
51
58
|
EOS
|
52
59
|
@cat = Cat.parse(@xml_fragment)
|
53
60
|
end
|
54
61
|
|
55
62
|
context "A cat" do
|
56
|
-
should 'be
|
57
|
-
assert_equal '
|
63
|
+
should 'be named Silly Tom' do
|
64
|
+
assert_equal 'Silly Tom Писта', @cat.name
|
58
65
|
end
|
59
66
|
|
60
67
|
should 'eat tigers and lions' do
|
61
|
-
assert_equal
|
68
|
+
assert_equal %w(tigers lions), @cat.ration
|
69
|
+
end
|
70
|
+
|
71
|
+
should 'be a friend of Chrissy, Missy & Sissy' do
|
72
|
+
assert_equal ['Chrissy', 'Missy', 'Sissy'], @cat.friends.names
|
62
73
|
end
|
63
74
|
|
64
|
-
should '
|
65
|
-
assert_equal
|
75
|
+
should 'have 2 ears' do
|
76
|
+
assert_equal 2, @cat.ears
|
66
77
|
end
|
67
78
|
|
68
79
|
should 'have tail' do
|
@@ -85,7 +96,7 @@ silly
|
|
85
96
|
@burger = @cat.cheezburger
|
86
97
|
end
|
87
98
|
|
88
|
-
should 'weigh 2
|
99
|
+
should 'weigh 2 pounds' do
|
89
100
|
assert_equal 2, @burger.weight
|
90
101
|
end
|
91
102
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pipa-xmlnuts
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: "0.1"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Igor Gunko
|
@@ -13,17 +13,17 @@ date: 2008-12-16 00:00:00 -08:00
|
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
16
|
-
description: XmlNuts is an XML to
|
16
|
+
description: XmlNuts is an XML to Ruby and back again mapping library.
|
17
17
|
email: tekmon@gmail.com
|
18
18
|
executables: []
|
19
19
|
|
20
20
|
extensions: []
|
21
21
|
|
22
22
|
extra_rdoc_files:
|
23
|
-
- README
|
23
|
+
- README.rdoc
|
24
24
|
- MIT-LICENSE
|
25
25
|
files:
|
26
|
-
- README
|
26
|
+
- README.rdoc
|
27
27
|
- MIT-LICENSE
|
28
28
|
- lib/xmlnuts.rb
|
29
29
|
- lib/xmlnuts/nuts.rb
|
@@ -38,7 +38,7 @@ rdoc_options:
|
|
38
38
|
- --line-numbers
|
39
39
|
- --inline-source
|
40
40
|
- --main
|
41
|
-
- README
|
41
|
+
- README.rdoc
|
42
42
|
require_paths:
|
43
43
|
- lib
|
44
44
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -59,6 +59,6 @@ rubyforge_project:
|
|
59
59
|
rubygems_version: 1.2.0
|
60
60
|
signing_key:
|
61
61
|
specification_version: 2
|
62
|
-
summary: Making
|
62
|
+
summary: Making XML <-> Ruby binding easy
|
63
63
|
test_files:
|
64
64
|
- test/parsing_test.rb
|