roxo 0.0.2 → 0.0.3

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.
Files changed (3) hide show
  1. data/lib/roxo.rb +10 -25
  2. data/roxo.gemspec +1 -1
  3. metadata +2 -2
data/lib/roxo.rb CHANGED
@@ -1,11 +1,6 @@
1
- require 'rubygems'
2
1
  require 'active_support/inflector'
3
2
  require 'libxml'
4
3
 
5
- # z = ROXO.new("<foo a='zxcv'><bar><baz>asdf</baz></bar></foo>")
6
- # z.a #=> "zxcv"
7
- # z.bar.baz #=> "asdf"
8
-
9
4
  # Ruby Objects as XML Objects
10
5
  class ROXO
11
6
  instance_methods.each do |meth|
@@ -14,9 +9,8 @@ class ROXO
14
9
 
15
10
  include Comparable
16
11
 
17
- # Accessors and other one-liners
18
12
  attr_reader :raw, :name, :value, :children
19
- def __attributes; @attributes; end
13
+ def __attributes; @attributes.sort; end
20
14
  def attributes; @attributes.keys; end
21
15
  def terminal?; @children.size.zero?; end # A node is terminal if we can't descend any further
22
16
  def has?(o); !! send(o); end # Boolean. Does this exist?
@@ -24,34 +18,26 @@ class ROXO
24
18
  def to_s; @value; end
25
19
 
26
20
  def initialize(xml)
27
- unless xml.class == LibXML::XML::Parser
28
- method = xml.respond_to?(:read) ? :read : :to_s
29
- xml = ::LibXML::XML::Parser.string(xml.send(method))
30
- end
31
-
21
+ xml = ::LibXML::XML::Parser.string(xml).parse.root unless xml.kind_of?(LibXML::XML::Node)
22
+
32
23
  @raw, @name, @attributes = xml, xml.name, xml.attributes.to_h
33
-
34
24
  @children = xml.children.select(&:element?).group_by{|c|c.name.to_sym}
35
-
25
+
36
26
  text_value = xml.children.select(&:text?).map(&:to_s).reject(&:empty?).join
37
27
  cdata_value = xml.children.select(&:cdata?).map{|c|c.to_s.chomp(']]>').sub('<![CDATA[', '')}.join
38
28
  @value = text_value.empty? ? cdata_value : text_value
39
29
  end
40
30
 
41
31
  def inspect
42
- terminal? ? value.inspect : "#<ROXO(#{name}):0x#{object_id.to_s(16)}>"
32
+ terminal? ? value.inspect : "#<ROXO:0x#{object_id.to_s(16)} @name=\"#{@name}\", ...>"
43
33
  end
44
34
 
45
35
  def <=>(other)
46
- return z unless (z = self.class <=> other.class ).zero?
47
- return z unless (z = self.__attributes.sort <=> other.__attributes.sort).zero?
48
- return z unless (z = self.value <=> other.value ).zero?
49
- return z unless (z = self.name <=> other.name ).zero?
50
-
51
- our_nodes = self.children.values.flatten.map{|n|self.class.new(n)}
52
- their_nodes = other.children.values.flatten.map{|n|self.class.new(n)}
53
-
54
- our_nodes.sort <=> their_nodes.sort
36
+ [:class, :__attributes, :value, :name].each do |key|
37
+ return z unless (z = self.send(key) <=> other.send(key)).zero?
38
+ end
39
+ nodes = lambda{|obj|obj.children.values.flatten.map{|n|self.class.new(n)}}
40
+ nodes[self] <=> nodes[other]
55
41
  end
56
42
 
57
43
  def method_missing(sym, *args)
@@ -65,4 +51,3 @@ class ROXO
65
51
  end
66
52
 
67
53
  end
68
-
data/roxo.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |gem|
2
2
  gem.name = 'roxo'
3
- gem.version = "0.0.2"
3
+ gem.version = "0.0.3"
4
4
 
5
5
  gem.author, gem.email = 'Burke Libbey', "burke@burkelibbey.org"
6
6
 
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 2
9
- version: 0.0.2
8
+ - 3
9
+ version: 0.0.3
10
10
  platform: ruby
11
11
  authors:
12
12
  - Burke Libbey