acdc 0.7.3 → 0.7.4

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -17,20 +17,99 @@ This is a little XML-to-object-to-XML library that gets Dirty Deeds Done Dirt Ch
17
17
  AcDc::Body assists you with declaring XML objects with ease. And #acdc makes
18
18
  marshaling those objects from XML a breeze.
19
19
 
20
+ ==== Simple Data Model
21
+
22
+ This example will go over a simple Address data model and all of the ways you could use it.
23
+
24
+ require 'rubygems'
20
25
  require 'acdc'
21
- class TheJack < AcDc::Body
22
- attribute :shes_got, String
23
- element :big_balls, String
26
+
27
+ class Address < AcDc::Body
28
+ attribute :type, String, :tag => "Type"
24
29
  end
25
30
 
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>"
31
+ puts Address.new.acdc
32
+ #=> <?xml version="1.0" encoding="UTF-8"?><address Type=""></address>
33
+
34
+ First thing to point out is the #attribute class method that allows you to specify
35
+ the name of the method (:type) the type of the data (String) and the XML tag ("Type").
36
+
37
+ You can also do this with #element.
38
+
39
+ class Address < AcDc::Body
40
+ attribute :type, String, :tag => "Type"
41
+ element :street, String, :tag => "Street"
42
+ end
43
+
44
+ puts Address.new.acdc
45
+ #=> <?xml version="1.0" encoding="UTF-8"?><address Type=""><Street/></address>
46
+
47
+ The :tag parameter is optional. The reason it's demonstrated here is simply to capitalize
48
+ the attribute/element tag. You could :tag any element/attribute with another name for rendering.
49
+ By default AcDc will output XML in lowercase.
50
+
51
+ class Address < AcDc::Body
52
+ attribute :type, String
53
+ element :street, String
54
+ end
55
+
56
+ puts Address.new.acdc
57
+ #=> <?xml version="1.0" encoding="UTF-8"?><address type=""><street/></address>
58
+
59
+ You could also specify a custom type for the second parameter. In the following example the
60
+ Street element will be created as a custom type.
61
+
62
+ class Street < AcDc::Body
63
+ element :line_1, String
64
+ end
65
+
66
+ class Address < AcDc::Body
67
+ attribute :type, String
68
+ element :street, Street
69
+ end
70
+
71
+ add = Address.new
72
+ add.street = Street.new
73
+ add.street.line_1 = "1234 Somewhere"
74
+
75
+ puts add.acdc
76
+ #=> <?xml version="1.0" encoding="UTF-8"?><address type=""><street><line_1>1234 Somewhere</line_1></street></address>
77
+
78
+ AcDc will also recognize collections of elements. You can do this with the :single
79
+ parameter. Here is an example:
80
+
81
+ class Street < AcDc::Body
82
+ element :line_1, String
83
+ end
84
+
85
+ class Address < AcDc::Body
86
+ attribute :type, String
87
+ element :streets, Street, :single => false
88
+ end
89
+
90
+ add = Address.new
91
+ street1 = Street.new
92
+ street2 = Street.new
93
+ street1.line_1 = "1234 Somewhere"
94
+ street2.line_1 = "5678 Somwhere Else"
95
+ add.streets = [street1,street2]
96
+ puts add.acdc
97
+ #=> <?xml version="1.0" encoding="UTF-8"?><address type=""><street><line_1>1234 Somewhere</line_1></street><street><line_1>5678 Somwhere Else</line_1></street></address>
98
+
99
+ The final example is the Dc part - Xml to Object. The following example uses the Street and Address
100
+ classes above and the #acdc method to derive the objects from the XML string.
33
101
 
102
+ addy = acdc <<EOF
103
+ <?xml version="1.0" encoding="UTF-8"?>
104
+ <address type="">
105
+ <street><line_1>1234 Somewhere</line_1></street>
106
+ <street><line_1>5678 Somwhere Else</line_1></street>
107
+ </address>
108
+ EOF
109
+
110
+ puts addy.inspect
111
+ #<Address:0x3342f8 @type="", @streets=[#<Street:0x32abb8 @line_1="1234 Somewhere">, #<Street:0x329290 @line_1="5678 Somwhere Else">]>
112
+
34
113
  == Contact
35
114
 
36
115
  - Author:: Clint Hill clint.hill@h3osoftware.com
@@ -11,7 +11,7 @@ class Boolean; end
11
11
  module AcDc
12
12
 
13
13
  DEFAULT_NAMESPACE = "acdc"
14
- VERSION = [0,7,3]
14
+ VERSION = [0,7,4]
15
15
 
16
16
  def self.parseable_constants
17
17
  @parseables ||= []
@@ -6,7 +6,7 @@ module AcDc
6
6
  def acdc(root = true)
7
7
  xml = Builder::XmlMarkup.new
8
8
  attrs = self.class.attributes.inject({}){ |acc,attr|
9
- acc.update(attr.method_name => send(attr.method_name.to_sym))
9
+ acc.update(attr.tag => send(attr.method_name.to_sym))
10
10
  }
11
11
  attrs.update(:xmlns => self.class.namespace) if self.class.namespace
12
12
  xml.instruct! :xml, :version=>"1.0", :encoding=>"UTF-8" if root
@@ -14,10 +14,20 @@ module AcDc
14
14
  self.class.elements.each do |elem|
15
15
  value = send(elem.method_name.to_sym)
16
16
  if value
17
- if elem.primitive?
18
- body.tag! elem.tag, value
17
+ if elem.single?
18
+ if elem.primitive?
19
+ body.tag! elem.tag, value
20
+ else
21
+ body << value.acdc(false)
22
+ end
19
23
  else
20
- body << value.acdc(false)
24
+ value.each { |v|
25
+ if v.kind_of?(AcDc::Body)
26
+ body << v.acdc(false)
27
+ else
28
+ body.tag! elem.tag, v
29
+ end
30
+ }
21
31
  end
22
32
  else
23
33
  body.tag! elem.tag if elem.renderable?
@@ -28,6 +28,10 @@ module AcDc
28
28
  @constant ||= constantize(type)
29
29
  end
30
30
 
31
+ def single?
32
+ options[:single].nil? || options[:single]
33
+ end
34
+
31
35
  def element?
32
36
  @xml_type == 'element'
33
37
  end
@@ -84,7 +88,7 @@ module AcDc
84
88
  namespace = "#{DEFAULT_NAMESPACE}:#{self.namespace}"
85
89
  end
86
90
  if element?
87
- if(options[:single].nil? || options[:single])
91
+ if(single?)
88
92
 
89
93
  result = node.find_first(xpath(namespace), namespace)
90
94
 
@@ -106,7 +110,7 @@ module AcDc
106
110
  result = node.find(xpath(namespace))
107
111
  end
108
112
  if result
109
- if(options[:single].nil? || options[:single])
113
+ if(single?)
110
114
  value = yield(result)
111
115
  else
112
116
  value = []
@@ -49,13 +49,10 @@ module AcDc
49
49
 
50
50
  private
51
51
  def make_accessor(item)
52
- safe_name = item.name.tr('-','_')
53
- # I find this to be brittle because of other libraries ability
54
- # to add methods the way we do. Leaving for now - however
55
- # there has to be a better way to isolate the method name
56
- # from our own @elements/@attributes
57
- if instance_methods.include?(safe_name)
58
- name = "#{item.element? ? "element_" : "attribute_"}#{safe_name}"
52
+ in_elems = elements.find{|e| e.name == item.name and e != item}
53
+ in_attrs = attributes.find{|a| a.name == item.name and a != item}
54
+ if in_elems or in_attrs
55
+ name = "#{item.element? ? "element_" : "attribute_"}#{item.name}"
59
56
  item.name = name
60
57
  end
61
58
  attr_accessor item.method_name.intern
@@ -11,7 +11,7 @@ module AcDc
11
11
  node = XML::Parser.string(xml).parse.root
12
12
  end
13
13
  end
14
- klass = AcDc.parseable_constants.detect{ |const|
14
+ klass = AcDc.parseable_constants.find{ |const|
15
15
  const.name.downcase =~ /#{node.name.downcase}/ || const.tag_name == node.name
16
16
  }
17
17
  if klass.nil?
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.7.3
4
+ version: 0.7.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Clint Hill
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-12-10 00:00:00 -07:00
12
+ date: 2010-01-01 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -78,6 +78,6 @@ rubyforge_project:
78
78
  rubygems_version: 1.3.5
79
79
  signing_key:
80
80
  specification_version: 3
81
- summary: acdc 0.7.3
81
+ summary: acdc 0.7.4
82
82
  test_files: []
83
83