acdc 0.2.5 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -9,22 +9,9 @@ This is a little XML-to-object-to-XML library that gets Dirty Deeds Done Dirt Ch
9
9
  * Take XML string objects and convert them to real Ruby objects from your library
10
10
  * Take real Ruby objects and convert them to XML strings
11
11
  * Declare XML elements/attributes easily and with type enforcement
12
- * Coerce objects to XML strings automatically (see JAIL_BREAK)
13
12
 
14
13
  == Usage
15
14
 
16
- === Element
17
-
18
- A basic XML element is created with the use of the following constructor
19
-
20
- require 'acdc'
21
- elem = Element("Hells Bells")
22
- puts elem.acdc
23
- => "<Element>Hells Bells</Element>"
24
- elem = Element("Hells Bells", {}, "BackInBlack")
25
- puts elem.acdc
26
- => "<BackInBlack>Hells Bells</BackInBlack>"
27
-
28
15
  === It's A Long Way To The Top, If You Want To Rock n Roll
29
16
 
30
17
  AcDc::Body assists you with declaring XML objects with ease. And #acdc makes
@@ -32,45 +19,30 @@ marshaling those objects from XML a breeze.
32
19
 
33
20
  require 'acdc'
34
21
  class TheJack < AcDc::Body
35
- attribute :shes_got, "the jack"
36
- element :big_balls
22
+ attribute :shes_got, String
23
+ element :big_balls, String
37
24
  end
38
- rosie = TheJack.new(:big_balls => "I've got big balls")
39
- puts rosie.big_balls
40
- => "I've got big balls"
41
- puts rosie.acdc
42
- => "<TheJack shes_got="the jack"><BigBalls>I've got big balls</BigBalls></TheJack>"
43
- who_made_who = acdc("<TheJack><BigBalls>Biggest Balls of them all</BigBalls></TheJack>")
44
- puts who_made_who.class
45
- => TheJack
46
- puts who_made_who.big_balls
47
- => "Biggest Balls of them all"
48
-
49
- === JAIL_BREAK
50
-
51
- JAIL_BREAK will determine whether or not you need to explicitly coerce your
52
- objects to XML using Element#acdc or Body#acdc. It's may not be the smartest
53
- feature in the world, but we're gonna Ride On.
54
-
55
- ==== Without JAIL_BREAK
56
25
 
57
- require 'acdc'
58
- XML_element = Element("TNT")
59
- puts XML_element
60
- => #<AcDc::Element:>
61
- puts XML_element.acdc
62
- => "<Element>TNT</Element>"
63
-
64
- ==== With JAIL_BREAK
65
-
66
- JAIL_BREAK = true
67
- require 'acdc'
68
- XML_element = Element("TNT")
69
- puts XML_element
70
- => "<Element>TNT</Element>"
26
+ jack = acdc("<thejack shes_got='big-balls'><big_balls>I've got big balls</big_balls></thejack>")
27
+ puts jack.shes_got
28
+ => "big_balls"
29
+ puts jack.big_balls
30
+ => "I've got big balls"
31
+ puts jack.acdc
32
+ => "<?xml version='1.0' encoding='UTF-8'?><thejack shes_got='big-balls'><big_balls>I've got big balls</big_balls></thejack>"
71
33
 
72
34
  == Contact
73
35
 
74
36
  - Author:: Clint Hill clint.hill@h3osoftware.com
75
37
  - Home Page:: http://h3osoftware.com/acdc
76
- - GitHub:: git://github.com/clinth3o/acdc.git
38
+ - GitHub:: git://github.com/clinth3o/acdc.git
39
+
40
+ == Special Thanks
41
+
42
+ I want to thank John Nunemaker for his HappyMapper gem. I stole quite a bit
43
+ of code from that gem.
44
+ http://railstips.org/2008/11/17/happymapper-making-xml-fun-again
45
+ http://github.com/jnunemaker/happymapper/
46
+
47
+ And if you might ask why not just use his library? Well - that's the acdc part
48
+ of this story. He had the AC - I added the DC.
data/Rakefile CHANGED
@@ -28,25 +28,24 @@ spec = Gem::Specification.new do |s|
28
28
  "lib/acdc.rb",
29
29
  "lib/acdc/attribute.rb",
30
30
  "lib/acdc/body.rb",
31
- "lib/acdc/element.rb"
31
+ "lib/acdc/element.rb",
32
+ "lib/acdc/item.rb",
33
+ "lib/acdc/parse.rb"
32
34
  ]
33
35
  if s.respond_to? :specification_version then
34
36
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
35
37
  s.specification_version = 3
36
38
 
37
39
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
38
- s.add_runtime_dependency(%q<activesupport>, [">= 2.3.2"])
40
+ s.add_runtime_dependency(%q<libxml-ruby>, [">= 1.1.3"])
39
41
  s.add_runtime_dependency(%q<builder>, [">= 2.1.2"])
40
- s.add_runtime_dependency(%q<hpricot>, [">= 0.8"])
41
42
  else
42
- s.add_dependency(%q<activesupport>, [">= 2.3.2"])
43
+ s.add_dependency(%q<libxml-ruby>, [">= 1.1.3"])
43
44
  s.add_dependency(%q<builder>, [">= 2.1.2"])
44
- s.add_dependency(%q<hpricot>, [">= 0.8"])
45
45
  end
46
46
  else
47
- s.add_dependency(%q<activesupport>, [">= 2.3.2"])
47
+ s.add_dependency(%q<libxml-ruby>, [">= 1.1.3"])
48
48
  s.add_dependency(%q<builder>, [">= 2.1.2"])
49
- s.add_dependency(%q<hpricot>, [">= 0.8"])
50
49
  end
51
50
  end
52
51
 
@@ -1,20 +1,5 @@
1
1
  module AcDc
2
-
3
- # Attribute object used in Element and Body.
4
- # Not often used outside of these.
5
- class Attribute
6
-
7
- attr_accessor :name, :value
8
-
9
- def initialize(name,value)
10
- @name = name
11
- @value = value
12
- end
13
-
14
- # Returns the values of this attribute in hash form
15
- def to_hash
16
- {@name => @value}
17
- end
2
+ class Attribute < Item
18
3
 
19
4
  end
20
5
  end
data/lib/acdc/body.rb CHANGED
@@ -1,205 +1,10 @@
1
1
  module AcDc
2
- class Body
3
-
4
- attr_accessor :attributes, :elements, :sequence
5
-
6
- # Populates the attributes and elements declared for this object.
7
- #@option values [Hash] :attributes Hash list of attributes to populate
8
- #@example Filling the values and attributes
9
- # class ThunderStruck < Body
10
- # attribute :thunder
11
- # element :lightning
12
- # end
13
- # kaboom = ThunderStruck.new({:attributes => {:thunder => "boom"}, :lightning => "crash"})
14
- def initialize(values = {})
15
- @attributes ||= {}
16
- @elements ||= {}
17
- @sequence = values[:sequence] || 0
18
- # catch default values for attributes
19
- unless self.class.declared_attributes.values.all?{|val| val.nil?}
20
- self.class.declared_attributes.each do |key,val|
21
- attributes.update(key => Attribute(key,val)) unless val.nil?
22
- end
23
- end
24
- # now set initialized attribute values
25
- if values.has_key?(:attributes)
26
- values.delete(:attributes).each do |key,val|
27
- if self.class.declared_attributes.has_key?(key)
28
- attributes.update(key => Attribute(key,val))
29
- end
30
- end
31
- end
32
- # and finally set values
33
- values.each do |key,val|
34
- if self.class.declared_elements.has_key?(key)
35
- type = options_for(key)[:type]
36
- validate(type,key,val)
37
- if type and type.ancestors.include?(Body)
38
- elements.update(key => type.new(val.to_hash.merge(:sequence => options_for(key)[:sequence])))
39
- elsif type
40
- # if it's an Element we want the value (avoids recursive value)
41
- value = (val.respond_to?(:value)) ? val.value : val
42
- elements.update(key => type.new(value, options_for(key)))
43
- else
44
- elements.update(key => Element(val, options_for(key)))
45
- end
46
- end
47
- end
2
+ class Body
3
+ def self.inherited(child)
4
+ child.instance_variable_set("@attributes", {})
5
+ child.instance_variable_set("@elements",{})
48
6
  end
49
-
50
- # Converts object to XML
51
- def acdc
52
- xml = Builder::XmlMarkup.new
53
- attrs = attributes.inject({}){|acc,attr| acc.update(attr[1].to_hash)}
54
- xml.tag!(tag_name,attrs){ |body|
55
- elements.sort{|a,b| a[1].sequence <=> b[1].sequence}.each do |key, elem|
56
- body << elem.acdc
57
- end
58
- }
59
- xml.target!
60
- end
61
-
62
- # Calls #acdc then matches
63
- def match(pattern)
64
- acdc.match(pattern)
65
- end
66
-
67
- def to_hash
68
- elements
69
- end
70
-
71
- # The name to use for the tag
72
- def tag_name
73
- self.class.to_s.split("::").last
74
- end
75
-
76
- def method_missing(method_id, *args, &block)
77
- key = method_id.to_s.gsub(/\=/,"").to_sym
78
- if elements.has_key?(key) or attributes.has_key?(key)
79
- (method_id.to_s.match(/\=$/)) ? write(method_id, *args, &block) : read(method_id)
80
- else
81
- super
82
- end
83
- end
84
-
85
- class << self
86
- def inherited(child)
87
- child.instance_variable_set('@declared_elements', @declared_elements)
88
- child.instance_variable_set('@declared_attributes', @declared_attributes)
89
- child.instance_variable_set('@element_sequence', @element_sequence)
90
- end
91
-
92
- # Declare an Element for this Body
93
- # Sequence of elements (XML Schema sequence) is taken care of by the order
94
- # the elements are declared in the class definition.
95
- #@param [Symbol] name A name to assign the Element (tag name)
96
- #@param [Class] type A type to use for the element (use this for type enforcement)
97
- #@option options [Boolean] :single False if object is a collection
98
- #@option options [String] :tag String determining the name to use in the XML tag
99
- def element(*options)
100
- name = options.first
101
- type = options.second || nil unless options.second.is_a?(Hash)
102
- opts = options.extract_options!
103
- opts.merge!(:tag => name) if opts[:tag].nil?
104
- declared_elements.update(name => opts.merge(:type => type, :sequence => next_sequence))
105
- end
106
-
107
- # Declare an attribute for this Body
108
- def attribute(name, value = nil)
109
- declared_attributes.update(name => value)
110
- end
111
-
112
- # Returns the Hash list of Elements declared
113
- def declared_elements
114
- @elements ||= {}
115
- @declared_elements ||= @elements[to_s] ||= {}
116
- end
117
-
118
- # Returns a Hash list of Attributes declared
119
- def declared_attributes
120
- @attributes ||= {}
121
- @declared_attributes ||= @attributes[to_s] ||= {}
122
- end
123
-
124
- # Converts the XML to a Class object found in the library
125
- def acdc(xml)
126
- doc = Hpricot.XML(xml)
127
- klass = doc.root.name.constantize
128
- attributes = doc.root.attributes.inject({}){|acc,attr| acc.update(attr[0].to_sym => attr[1])}
129
- values = doc.root.children.inject({}) do |acc, node|
130
- name = node.name.underscore.to_sym
131
- value = value_from_node(node)
132
- attrs = node.attributes
133
- acc.merge!({name => value, :attributes => attrs})
134
- end
135
- klass.new(values.merge(:attributes => attributes))
136
- end
137
-
138
- private
139
- def value_from_node(node)
140
- if node.respond_to?(:children) and node.children
141
- values = node.children.collect do |child|
142
- return child.inner_text if child.text?
143
- instantiate(child)
144
- end
145
- (values.size == 1) ? values.first : values
146
- end
147
- end
148
-
149
- def instantiate(node)
150
- name = node.name
151
- attrs = node.attributes
152
- klass = name.constantize
153
- klass.new(value_from_node(node), :attributes => attrs)
154
- end
155
-
156
- def next_sequence
157
- @element_sequence ||= 0
158
- @element_sequence = @element_sequence +=1
159
- end
160
- end
161
-
162
- private
163
-
164
- def validate(type, key, val)
165
- if type
166
- if val.respond_to?(:each)
167
- val.each {|v| raise ArgumentError.new("#{val.class} type is invalid. #{self.class} #{key} requires #{type}.") unless v.is_a?(type)}
168
- else
169
- unless val.is_a?(type)
170
- raise ArgumentError.new("#{val.class} type is invalid. #{self.class} #{key} requires #{type}.")
171
- end
172
- end
173
- end
174
- end
175
-
176
- def options_for(key)
177
- self.class.declared_elements[key]
178
- end
179
-
180
- def read(method_id)
181
- if elements.has_key?(method_id)
182
- elements[method_id]
183
- else
184
- attributes[method_id].value
185
- end
186
- end
187
-
188
- def write(method_id, *args, &block)
189
- key = method_id.to_s.gsub(/\=$/,"").to_sym
190
- if elements.has_key?(key)
191
- type = options_for(key)[:type]
192
- if type and type.ancestors.include?(Body)
193
- elements.update(key => type.new(args.first.to_hash, options_for(key)))
194
- elsif type
195
- elements.update(key => type.new(args.first, options_for(key)))
196
- else
197
- elements.update(key => Element(args.first, options_for(key)))
198
- end
199
- else
200
- attributes.update(key => Attribute(key,args.first))
201
- end
202
- end
203
-
7
+ extend(ClassMethods)
8
+ extend(Parsing)
204
9
  end
205
10
  end
data/lib/acdc/element.rb CHANGED
@@ -1,82 +1,5 @@
1
1
  module AcDc
2
-
3
- # Basic XML Element
4
- class Element
5
-
6
- attr_accessor :value, :tag, :attributes, :options
7
-
8
- # Constructor with the following:
9
- #@param [Object] value Any value to place in the tags
10
- #@option options [Boolean] :single False if object is a collection
11
- #@option options [String] :tag A tag name to use if not Element
12
- def initialize(value=nil, options={})
13
- @tag = options[:tag] ||= self.class.to_s.split("::").last
14
- @value = value
15
- @options = options
16
- @attributes = options.delete(:attributes)
17
- end
18
-
19
- # Converts the object to XML
20
- def acdc
21
- xml = Builder::XmlMarkup.new
22
- if value.nil?
23
- xml.tag!(tag_content)
24
- else
25
- has_many? ? render_many(xml) : xml.tag!(tag_content) {|elem| elem << content}
26
- end
27
- xml.target!
28
- end
29
-
30
- # Calls #acdc then matches
31
- def match(pattern)
32
- acdc.match(pattern)
33
- end
34
-
35
- # True if object has a collection of values
36
- def has_many?
37
- options.has_key?(:single) and !options[:single] and value.size > 1
38
- end
39
-
40
- # The name to use for the tag
41
- def tag_name
42
- tag.to_s
43
- end
44
-
45
- # Overridden to compare the values and not the whole object
46
- def eql?(other)
47
- return false if other.nil?
48
- return false unless other.kind_of?(self.class)
49
- value.eql?(other.value)
50
- end
51
-
52
- def sequence
53
- @options[:sequence]
54
- end
55
-
56
- private
57
- def tag_content
58
- (attributes.nil? or attributes.empty?) ? tag_name : [tag_name,attributes]
59
- end
60
-
61
- def content
62
- if has_many?
63
- value.inject(""){|xml,val| xml << (val.is_a?(Element) ? val.acdc : val.to_s)}
64
- else
65
- value.respond_to?(:acdc) ? value.acdc : value.to_s
66
- end
67
- end
68
-
69
- def render_many(xml)
70
- if value.respond_to?(:each)
71
- xml.tag!(tag_content){|elem|
72
- value.each{|val|
73
- raise Exception.new("Can't render non-Element multiple times.") unless val.respond_to?(:acdc)
74
- elem << val.acdc
75
- }
76
- }
77
- else
78
- xml.tag!(tag_content) {|elem| elem << content}
79
- end
80
- end
2
+ class Element < Item
3
+
81
4
  end
82
5
  end
data/lib/acdc/item.rb ADDED
@@ -0,0 +1,144 @@
1
+ module AcDc
2
+ class Item
3
+
4
+ Types = [String, Float, Time, Date, DateTime, Integer, Boolean]
5
+ attr_accessor :name, :type, :tag, :options, :namespace
6
+
7
+ def initialize(name, type, options={})
8
+ @name = name.to_s
9
+ @type = type
10
+ @tag = options.delete(:tag) || name.to_s
11
+ @options = options
12
+ @xml_type = self.class.to_s.split('::').last.downcase
13
+ end
14
+
15
+ def method_name
16
+ @method_name ||= name.tr('-','_')
17
+ end
18
+
19
+ def constant
20
+ @constant ||= constantize(type)
21
+ end
22
+
23
+ def element?
24
+ @xml_type == 'element'
25
+ end
26
+
27
+ def attribute?
28
+ !element?
29
+ end
30
+
31
+ def value_from_xml(node, namespace)
32
+ if primitive?
33
+ find(node, namespace) do |n|
34
+ value = n.respond_to?(:content) ? n.content : n.to_s
35
+ typecast(value)
36
+ end
37
+ else
38
+ constant.parse(node, options)
39
+ end
40
+ end
41
+
42
+ def primitive?
43
+ Types.include?(constant)
44
+ end
45
+
46
+ def xpath(namespace = self.namespace)
47
+ xpath = ''
48
+ xpath += "#{DEFAULT_NAMESPACE}:" if namespace
49
+ xpath += tag
50
+ xpath
51
+ end
52
+
53
+ private
54
+ def constantize(type)
55
+ if type.is_a?(String)
56
+ names = type.split('::')
57
+ constant = Object
58
+ names.each do |name|
59
+ constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
60
+ end
61
+ constant
62
+ else
63
+ type
64
+ end
65
+ end
66
+
67
+ def find(node, namespace, &block)
68
+ if options[:namespace] == false
69
+ namespace = nil
70
+ elsif options[:namespace]
71
+ # from an element definition
72
+ namespace = "#{DEFAULT_NAMESPACE}:#{options[:namespace]}"
73
+ elsif self.namespace
74
+ # this node has a custom namespace (that is present in the doc)
75
+ namespace = "#{DEFAULT_NAMESPACE}:#{self.namespace}"
76
+ end
77
+
78
+ if element?
79
+ if(options[:single].nil? || options[:single])
80
+ result = node.find_first(xpath(namespace), namespace)
81
+ else
82
+ result = node.find(xpath(namespace))
83
+ end
84
+
85
+ if result
86
+ if(options[:single].nil? || options[:single])
87
+ value = yield(result)
88
+ else
89
+ value = []
90
+ result.each do |res|
91
+ value << yield(res)
92
+ end
93
+ end
94
+ if options[:attributes].is_a?(Hash)
95
+ result.attributes.each do |xml_attribute|
96
+ if attribute_options = options[:attributes][xml_attribute.name.to_sym]
97
+ attribute_value = Attribute.new(xml_attribute.name.to_sym, *attribute_options).from_xml_node(result, namespace)
98
+ result.instance_eval <<-EOV
99
+ def value.#{xml_attribute.name}
100
+ #{attribute_value.inspect}
101
+ end
102
+ EOV
103
+ end
104
+ end
105
+ end
106
+ value
107
+ else
108
+ nil
109
+ end
110
+ else
111
+ yield(node[tag])
112
+ end
113
+ end
114
+
115
+ def typecast(value)
116
+ return value if value.kind_of?(constant) || value.nil?
117
+ begin
118
+ if constant == String then value.to_s
119
+ elsif constant == Float then value.to_f
120
+ elsif constant == Time then Time.parse(value.to_s)
121
+ elsif constant == Date then Date.parse(value.to_s)
122
+ elsif constant == DateTime then DateTime.parse(value.to_s)
123
+ elsif constant == Boolean then ['true', 't', '1'].include?(value.to_s.downcase)
124
+ elsif constant == Integer
125
+ value_to_i = value.to_i
126
+ if value_to_i == 0 && value != '0'
127
+ value_to_s = value.to_s
128
+ begin
129
+ Integer(value_to_s =~ /^(\d+)/ ? $1 : value_to_s)
130
+ rescue ArgumentError
131
+ nil
132
+ end
133
+ else
134
+ value_to_i
135
+ end
136
+ else
137
+ value
138
+ end
139
+ rescue
140
+ value
141
+ end
142
+ end
143
+ end
144
+ end
data/lib/acdc/parse.rb ADDED
@@ -0,0 +1,65 @@
1
+ module AcDc
2
+ module Parsing
3
+
4
+ def acdc(xml, options={})
5
+
6
+ if xml.is_a?(XML::Node)
7
+ node = xml
8
+ else
9
+ if xml.is_a?(XML::Document)
10
+ node = xml.root
11
+ else
12
+ node = XML::Parser.string(xml).parse.root
13
+ end
14
+ end
15
+
16
+ klass = constantize(node.name)
17
+
18
+ root = node.name.downcase == klass.tag_name
19
+
20
+ namespace = node.namespaces.default
21
+ namespace = "#{DEFAULT_NAMESPACE}:#{namespace}" if namespace
22
+
23
+ xpath = root ? '/' : './/'
24
+ xpath += "#{DEFAULT_NAMESPACE}:" if namespace
25
+ xpath += node.name
26
+
27
+ nodes = node.find(xpath, Array(namespace))
28
+
29
+ collection = nodes.collect do |n|
30
+ obj = klass.new
31
+ klass.attributes.each do |attr|
32
+ obj.send("#{attr.method_name}=", attr.value_from_xml(n, namespace))
33
+ end
34
+ klass.elements.each do |elem|
35
+ obj.send("#{elem.method_name}=", elem.value_from_xml(n, namespace))
36
+ end
37
+ obj
38
+ end
39
+
40
+ nodes = nil
41
+
42
+ if options[:single] || root
43
+ collection.first
44
+ else
45
+ collection
46
+ end
47
+ end
48
+
49
+ private
50
+
51
+ def constantize(type)
52
+ if type.is_a?(String)
53
+ names = type.split('::')
54
+ constant = Object
55
+ names.each do |name|
56
+ constant = const_defined?(name) ? const_get(name) : const_missing(name)
57
+ end
58
+ constant
59
+ else
60
+ type
61
+ end
62
+ end
63
+
64
+ end
65
+ end
data/lib/acdc.rb CHANGED
@@ -1,35 +1,69 @@
1
+ require 'date'
2
+ require 'time'
1
3
  require 'rubygems'
4
+ gem 'libxml-ruby', '= 1.1.3'
5
+ require 'xml'
6
+ gem 'builder'
2
7
  require 'builder'
3
- require 'activesupport'
4
- require 'hpricot'
5
-
6
- require File.join(File.dirname(__FILE__),"acdc","attribute")
7
- require File.join(File.dirname(__FILE__),"acdc","element")
8
- require File.join(File.dirname(__FILE__),"acdc","body")
8
+
9
+ class Boolean; end
9
10
 
10
11
  module AcDc
11
12
 
12
- VERSION = [0,2,5] unless defined?(AcDc::VERSION)
13
+ DEFAULT_NAMESPACE = "example" unless defined?(AcDc::DEFAULT_NAMESPACE)
14
+ VERSION = [0,5,0] unless defined?(AcDc::VERSION)
13
15
 
14
16
  if defined?(JAIL_BREAK)
15
- Element.class_eval{ alias :to_s :acdc }
16
- Body.class_eval{ alias :to_s :acdc }
17
+ puts "AcDc is live -- Dirty Deeds!"
17
18
  end
18
-
19
- end
20
19
 
21
- # Will construct a AcDc::Element classs
22
- def Element(value, options = {})
23
- AcDc::Element.new(value,options)
24
- end
20
+ def self.included(base)
21
+ base.instance_variable_set("@attributes",{})
22
+ base.instance_variable_set("@elements",{})
23
+ base.extend(ClassMethods)
24
+ base.extend(Parsing)
25
+ end
26
+
27
+ module ClassMethods
28
+
29
+ def attributes
30
+ @attributes[to_s] || []
31
+ end
25
32
 
26
- # Will construct a AcDc::Attribute class
27
- def Attribute(name,value)
28
- AcDc::Attribute.new(name,value)
29
- end
33
+ def elements
34
+ @elements[to_s] || []
35
+ end
36
+
37
+ def attribute(name, type, options={})
38
+ attribute = Attribute.new(name,type,options)
39
+ @attributes[to_s] ||= []
40
+ @attributes[to_s] << attribute
41
+ attr_accessor attribute.method_name.intern
42
+ end
43
+
44
+ def element(name, type, options={})
45
+ element = Element.new(name,type,options)
46
+ @elements[to_s] ||= []
47
+ @elements[to_s] << element
48
+ attr_accessor element.method_name.intern
49
+ end
50
+
51
+ def tag_name(name = nil)
52
+ @tag_name = name.to_s if name
53
+ @tag_name ||= to_s.split('::')[-1].downcase
54
+ end
30
55
 
31
- # Will convert the XML to a class found in the library
32
- def acdc(xml)
33
- AcDc::Body.acdc(xml)
56
+ def namespace(namespace = nil)
57
+ @namespace = namespace if namespace
58
+ @namespace
59
+ end
60
+
61
+ end
62
+
34
63
  end
35
-
64
+ require File.join(File.dirname(__FILE__), 'acdc/build')
65
+ require File.join(File.dirname(__FILE__), 'acdc/parse')
66
+ require File.join(File.dirname(__FILE__), 'acdc/item')
67
+ require File.join(File.dirname(__FILE__), 'acdc/attribute')
68
+ require File.join(File.dirname(__FILE__), 'acdc/element')
69
+ require File.join(File.dirname(__FILE__), 'acdc/body')
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: acdc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Clint Hill
@@ -9,18 +9,18 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-10-03 00:00:00 -07:00
12
+ date: 2009-11-18 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
- name: activesupport
16
+ name: libxml-ruby
17
17
  type: :runtime
18
18
  version_requirement:
19
19
  version_requirements: !ruby/object:Gem::Requirement
20
20
  requirements:
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: 2.3.2
23
+ version: 1.1.3
24
24
  version:
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: builder
@@ -32,16 +32,6 @@ dependencies:
32
32
  - !ruby/object:Gem::Version
33
33
  version: 2.1.2
34
34
  version:
35
- - !ruby/object:Gem::Dependency
36
- name: hpricot
37
- type: :runtime
38
- version_requirement:
39
- version_requirements: !ruby/object:Gem::Requirement
40
- requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- version: "0.8"
44
- version:
45
35
  description: " This is a little xml-to-object-to-xml library that gets Dirty Deeds Done Dirt Cheap. \n"
46
36
  email: clint.hill@h3osoftware.com
47
37
  executables: []
@@ -58,6 +48,8 @@ files:
58
48
  - lib/acdc/attribute.rb
59
49
  - lib/acdc/body.rb
60
50
  - lib/acdc/element.rb
51
+ - lib/acdc/item.rb
52
+ - lib/acdc/parse.rb
61
53
  has_rdoc: true
62
54
  homepage: http://h3osoftware.com/acdc
63
55
  licenses: []