acdc 0.6.0 → 0.7.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/README CHANGED
@@ -25,7 +25,7 @@ marshaling those objects from XML a breeze.
25
25
 
26
26
  jack = acdc("<thejack shes_got='big-balls'><big_balls>I've got big balls</big_balls></thejack>")
27
27
  puts jack.shes_got
28
- => "big_balls"
28
+ => "big-balls"
29
29
  puts jack.big_balls
30
30
  => "I've got big balls"
31
31
  puts jack.acdc
@@ -10,19 +10,24 @@ class Boolean; end
10
10
 
11
11
  module AcDc
12
12
 
13
- DEFAULT_NAMESPACE = "acdc" unless defined?(AcDc::DEFAULT_NAMESPACE)
14
- VERSION = [0,6,0] unless defined?(AcDc::VERSION)
13
+ DEFAULT_NAMESPACE = "acdc"
14
+ VERSION = [0,7,0]
15
15
 
16
- if defined?(JAIL_BREAK)
17
- puts "AcDc is live -- Dirty Deeds!"
16
+ def self.parseable_constants
17
+ @parseables ||= []
18
18
  end
19
19
 
20
20
  end
21
21
 
22
- require File.join(File.dirname(__FILE__), 'acdc/mapping')
23
- require File.join(File.dirname(__FILE__), 'acdc/build')
24
- require File.join(File.dirname(__FILE__), 'acdc/parse')
25
- require File.join(File.dirname(__FILE__), 'acdc/item')
26
- require File.join(File.dirname(__FILE__), 'acdc/attribute')
27
- require File.join(File.dirname(__FILE__), 'acdc/element')
28
- require File.join(File.dirname(__FILE__), 'acdc/body')
22
+ dir = File.dirname(__FILE__)
23
+ require File.join(dir, 'acdc/mapping')
24
+ require File.join(dir, 'acdc/build')
25
+ require File.join(dir, 'acdc/parse')
26
+ require File.join(dir, 'acdc/item')
27
+ require File.join(dir, 'acdc/attribute')
28
+ require File.join(dir, 'acdc/element')
29
+ require File.join(dir, 'acdc/body')
30
+
31
+ class Object
32
+ include AcDc::Parsing
33
+ end
@@ -1,8 +1,8 @@
1
1
  module AcDc
2
2
  class Body
3
3
 
4
- include(Mapping)
5
- include(Building)
4
+ include Mapping
5
+ include Building
6
6
 
7
7
  def self.inherited(child)
8
8
  attrs = @attributes.nil? ? {} : @attributes.dup
@@ -11,6 +11,7 @@ module AcDc
11
11
  child.instance_variable_set("@elements", elems)
12
12
  @inheritance_chain ||= []
13
13
  @inheritance_chain << child
14
+ AcDc.parseable_constants << child
14
15
  end
15
16
 
16
17
  end
@@ -68,10 +68,8 @@ module AcDc
68
68
  if options[:namespace] == false
69
69
  namespace = nil
70
70
  elsif options[:namespace]
71
- # from an element definition
72
71
  namespace = "#{DEFAULT_NAMESPACE}:#{options[:namespace]}"
73
72
  elsif self.namespace
74
- # this node has a custom namespace (that is present in the doc)
75
73
  namespace = "#{DEFAULT_NAMESPACE}:#{self.namespace}"
76
74
  end
77
75
 
@@ -4,7 +4,8 @@ module AcDc
4
4
  def self.included(base)
5
5
  base.instance_variable_set("@attributes",{})
6
6
  base.instance_variable_set("@elements",{})
7
- base.extend(ClassMethods)
7
+ base.extend ClassMethods
8
+ AcDc.parseable_constants << base
8
9
  end
9
10
 
10
11
  module ClassMethods
@@ -1,8 +1,7 @@
1
1
  module AcDc
2
2
  module Parsing
3
-
3
+
4
4
  def acdc(xml, options={})
5
-
6
5
  if xml.is_a?(XML::Node)
7
6
  node = xml
8
7
  else
@@ -12,20 +11,20 @@ module AcDc
12
11
  node = XML::Parser.string(xml).parse.root
13
12
  end
14
13
  end
15
-
14
+ # This constantize is a global scope constantize.
15
+ # It will use AcDc#parseable_constants to detect which class
16
+ # is being parsed.
16
17
  klass = constantize(node.name)
17
-
18
+ if klass.nil?
19
+ raise Exception.new("Uh Oh ... Live Wire! Couldn't parse #{node.name}.")
20
+ end
18
21
  root = node.name.downcase == klass.tag_name
19
-
20
22
  namespace = node.namespaces.default
21
23
  namespace = "#{DEFAULT_NAMESPACE}:#{namespace}" if namespace
22
-
23
24
  xpath = root ? '/' : './/'
24
25
  xpath += "#{DEFAULT_NAMESPACE}:" if namespace
25
26
  xpath += node.name
26
-
27
27
  nodes = node.find(xpath, Array(namespace))
28
-
29
28
  collection = nodes.collect do |n|
30
29
  obj = klass.new
31
30
  klass.attributes.each do |attr|
@@ -36,9 +35,7 @@ module AcDc
36
35
  end
37
36
  obj
38
37
  end
39
-
40
38
  nodes = nil
41
-
42
39
  if options[:single] || root
43
40
  collection.first
44
41
  else
@@ -46,45 +43,16 @@ module AcDc
46
43
  end
47
44
  end
48
45
 
49
- private
50
-
51
- def constantize(type)
52
- if type.is_a?(String)
53
- constant = Object
54
- all_class_names.each do |name|
55
- if name.downcase == type.downcase
56
- constant = const_get(name)
57
- end
58
- end
59
- constant
60
- else
61
- type
62
- end
63
- end
64
-
65
- end
66
- end
67
-
68
- class Module
69
-
70
- def hierarchy
71
- name.split('::').inject([Object]) {|hierarchy,name|
72
- hierarchy << hierarchy.last.const_get(name)
73
- }
74
- end
75
-
76
- def all_class_names
77
- class_names = []
78
- constants.each do |const|
79
- constant = const_get(const)
80
- case constant
81
- when Class
82
- class_names << constant.to_s.split('::',2)[1]
83
- when Module
84
- class_names += constant.all_class_names
85
- end
46
+ private
47
+ def constantize(type)
48
+ # I'm using a separate store for constants because of the fact at
49
+ # runtime during parsing we will simply get a tag name to start with.
50
+ # It won't be in a form we could use to detect a constant normally.
51
+ # Also - this way provides a cleaner check for the tag_name feature.
52
+ AcDc.parseable_constants.detect{ |const|
53
+ const.name.downcase =~ /#{type.downcase}/ || const.tag_name == type
54
+ }
86
55
  end
87
- class_names.uniq
56
+
88
57
  end
89
-
90
58
  end
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.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Clint Hill
@@ -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.6.0
81
+ summary: acdc 0.7.0
82
82
  test_files: []
83
83