multi_xml 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of multi_xml might be problematic. Click here for more details.

@@ -1,8 +1,7 @@
1
1
  $LOAD_PATH.unshift(File.dirname(__FILE__))
2
2
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
3
  require 'multi_xml'
4
- require 'spec'
5
- require 'spec/autorun'
4
+ require 'rspec/core'
6
5
  require 'rubygems'
7
6
  begin
8
7
  require 'bundler'
@@ -10,7 +9,3 @@ begin
10
9
  rescue LoadError
11
10
  $stderr.puts "Bundler (or a dependency) not available."
12
11
  end
13
-
14
- Spec::Runner.configure do |config|
15
-
16
- end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: multi_xml
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 27
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 0
9
8
  - 1
10
- version: 0.0.1
9
+ - 0
10
+ version: 0.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Erik Michaels-Ober
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-10-02 00:00:00 -07:00
18
+ date: 2010-10-12 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -26,94 +26,73 @@ dependencies:
26
26
  requirements:
27
27
  - - ~>
28
28
  - !ruby/object:Gem::Version
29
- hash: 19
29
+ hash: 15
30
30
  segments:
31
31
  - 1
32
32
  - 0
33
- - 2
34
- version: 1.0.2
33
+ version: "1.0"
35
34
  type: :development
36
35
  version_requirements: *id001
37
- - !ruby/object:Gem::Dependency
38
- name: hpricot
39
- prerelease: false
40
- requirement: &id002 !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
43
- - - ~>
44
- - !ruby/object:Gem::Version
45
- hash: 59
46
- segments:
47
- - 0
48
- - 8
49
- - 2
50
- version: 0.8.2
51
- type: :development
52
- version_requirements: *id002
53
36
  - !ruby/object:Gem::Dependency
54
37
  name: libxml-ruby
55
38
  prerelease: false
56
- requirement: &id003 !ruby/object:Gem::Requirement
39
+ requirement: &id002 !ruby/object:Gem::Requirement
57
40
  none: false
58
41
  requirements:
59
42
  - - ~>
60
43
  - !ruby/object:Gem::Version
61
- hash: 27
44
+ hash: 13
62
45
  segments:
63
46
  - 1
64
47
  - 1
65
- - 4
66
- version: 1.1.4
48
+ version: "1.1"
67
49
  type: :development
68
- version_requirements: *id003
50
+ version_requirements: *id002
69
51
  - !ruby/object:Gem::Dependency
70
52
  name: nokogiri
71
53
  prerelease: false
72
- requirement: &id004 !ruby/object:Gem::Requirement
54
+ requirement: &id003 !ruby/object:Gem::Requirement
73
55
  none: false
74
56
  requirements:
75
57
  - - ~>
76
58
  - !ruby/object:Gem::Version
77
- hash: 1
59
+ hash: 7
78
60
  segments:
79
61
  - 1
80
62
  - 4
81
- - 3
82
- version: 1.4.3
63
+ version: "1.4"
83
64
  type: :development
84
- version_requirements: *id004
65
+ version_requirements: *id003
85
66
  - !ruby/object:Gem::Dependency
86
67
  name: rake
87
68
  prerelease: false
88
- requirement: &id005 !ruby/object:Gem::Requirement
69
+ requirement: &id004 !ruby/object:Gem::Requirement
89
70
  none: false
90
71
  requirements:
91
72
  - - ~>
92
73
  - !ruby/object:Gem::Version
93
- hash: 49
74
+ hash: 27
94
75
  segments:
95
76
  - 0
96
77
  - 8
97
- - 7
98
- version: 0.8.7
78
+ version: "0.8"
99
79
  type: :development
100
- version_requirements: *id005
80
+ version_requirements: *id004
101
81
  - !ruby/object:Gem::Dependency
102
82
  name: rspec
103
83
  prerelease: false
104
- requirement: &id006 !ruby/object:Gem::Requirement
84
+ requirement: &id005 !ruby/object:Gem::Requirement
105
85
  none: false
106
86
  requirements:
107
87
  - - ~>
108
88
  - !ruby/object:Gem::Version
109
- hash: 27
89
+ hash: 3
110
90
  segments:
111
- - 1
112
- - 3
91
+ - 2
113
92
  - 0
114
- version: 1.3.0
93
+ version: "2.0"
115
94
  type: :development
116
- version_requirements: *id006
95
+ version_requirements: *id005
117
96
  description: A gem to provide swappable XML backends utilizing LibXML, Nokogiri, Hpricot, or REXML.
118
97
  email:
119
98
  - sferik@gmail.com
@@ -125,17 +104,19 @@ extra_rdoc_files: []
125
104
 
126
105
  files:
127
106
  - .gitignore
107
+ - .rspec
128
108
  - Gemfile
129
109
  - Gemfile.lock
130
110
  - LICENSE
131
111
  - README.rdoc
132
112
  - Rakefile
133
113
  - lib/multi_xml.rb
134
- - lib/multi_xml/engines/rexml.rb
114
+ - lib/multi_xml/parsers/libxml.rb
115
+ - lib/multi_xml/parsers/nokogiri.rb
116
+ - lib/multi_xml/parsers/rexml.rb
135
117
  - lib/multi_xml/version.rb
136
118
  - multi_xml.gemspec
137
119
  - spec/multi_xml_spec.rb
138
- - spec/spec.opts
139
120
  - spec/spec_helper.rb
140
121
  has_rdoc: true
141
122
  homepage: http://rubygems.org/gems/multi_xml
@@ -173,5 +154,4 @@ specification_version: 3
173
154
  summary: A gem to provide swappable XML backends utilizing LibXML, Nokogiri, Hpricot, or REXML.
174
155
  test_files:
175
156
  - spec/multi_xml_spec.rb
176
- - spec/spec.opts
177
157
  - spec/spec_helper.rb
@@ -1,221 +0,0 @@
1
- require 'rexml/parsers/baseparser'
2
- require 'rexml/text'
3
- require 'date'
4
- require 'time'
5
- require 'yaml'
6
- require 'bigdecimal'
7
-
8
- module MultiXml
9
- module Engines
10
- # Use REXML to parse XML.
11
- class Rexml
12
-
13
- def self.parse(string, options = {}) #:nodoc:
14
- string.strip!
15
- stack = []
16
- parser = ::REXML::Parsers::BaseParser.new(string)
17
-
18
- while true
19
- event = parser.pull
20
- case event[0]
21
- when :end_document
22
- break
23
- when :start_element
24
- stack.push RexmlUtilityNode.new(event[1], event[2])
25
- when :end_element
26
- if stack.size > 1
27
- temp = stack.pop
28
- stack.last.add_node(temp)
29
- end
30
- when :text, :cdata
31
- stack.last.add_node(event[1]) unless event[1].strip.length == 0 || stack.empty?
32
- end
33
- end
34
- hash = (stack.length > 0 ? stack.pop.to_hash : {})
35
- options[:symbolize_keys] ? symbolize_keys(hash) : hash
36
- end
37
-
38
- def self.symbolize_keys(hash) #:nodoc:
39
- hash.inject({}){|result, (key, value)|
40
- new_key = case key
41
- when String then key.to_sym
42
- else key
43
- end
44
- new_value = case value
45
- when Hash then symbolize_keys(value)
46
- else value
47
- end
48
- result[new_key] = new_value
49
- result
50
- }
51
- end
52
- end
53
-
54
- class RexmlUtilityNode #:nodoc:
55
- attr_accessor :name, :attributes, :children, :type
56
-
57
- def self.typecasts
58
- @@typecasts
59
- end
60
-
61
- def self.typecasts=(obj)
62
- @@typecasts = obj
63
- end
64
-
65
- def self.available_typecasts
66
- @@available_typecasts
67
- end
68
-
69
- def self.available_typecasts=(obj)
70
- @@available_typecasts = obj
71
- end
72
-
73
- self.typecasts = {}
74
- self.typecasts["integer"] = lambda{|v| v.nil? ? nil : v.to_i}
75
- self.typecasts["boolean"] = lambda{|v| v.nil? ? nil : (v.strip != "false")}
76
- self.typecasts["datetime"] = lambda{|v| v.nil? ? nil : Time.parse(v).utc}
77
- self.typecasts["date"] = lambda{|v| v.nil? ? nil : Date.parse(v)}
78
- self.typecasts["dateTime"] = lambda{|v| v.nil? ? nil : Time.parse(v).utc}
79
- self.typecasts["decimal"] = lambda{|v| v.nil? ? nil : BigDecimal(v.to_s)}
80
- self.typecasts["double"] = lambda{|v| v.nil? ? nil : v.to_f}
81
- self.typecasts["float"] = lambda{|v| v.nil? ? nil : v.to_f}
82
- self.typecasts["symbol"] = lambda{|v| v.nil? ? nil : v.to_sym}
83
- self.typecasts["string"] = lambda{|v| v.to_s}
84
- self.typecasts["yaml"] = lambda{|v| v.nil? ? nil : YAML.load(v)}
85
- self.typecasts["base64Binary"] = lambda{|v| v.unpack('m').first }
86
-
87
- self.available_typecasts = self.typecasts.keys
88
-
89
- def initialize(name, normalized_attributes = {})
90
-
91
- # unnormalize attribute values
92
- attributes = Hash[* normalized_attributes.map { |key, value|
93
- [ key, unnormalize_xml_entities(value) ]
94
- }.flatten]
95
-
96
- @name = name.tr("-", "_")
97
- # leave the type alone if we don't know what it is
98
- @type = self.class.available_typecasts.include?(attributes["type"]) ? attributes.delete("type") : attributes["type"]
99
-
100
- @nil_element = attributes.delete("nil") == "true"
101
- @attributes = undasherize_keys(attributes)
102
- @children = []
103
- @text = false
104
- end
105
-
106
- def add_node(node)
107
- @text = true if node.is_a? String
108
- @children << node
109
- end
110
-
111
- def to_hash
112
- if @type == "file"
113
- f = StringIO.new((@children.first || '').unpack('m').first)
114
- class << f
115
- attr_accessor :original_filename, :content_type
116
- end
117
- f.original_filename = attributes['name'] || 'untitled'
118
- f.content_type = attributes['content_type'] || 'application/octet-stream'
119
- return {name => f}
120
- end
121
-
122
- if @text
123
- t = typecast_value( unnormalize_xml_entities( inner_html ) )
124
- t.class.send(:attr_accessor, :attributes)
125
- t.attributes = attributes
126
- return { name => t }
127
- else
128
- #change repeating groups into an array
129
- groups = @children.inject({}) { |s,e| (s[e.name] ||= []) << e; s }
130
-
131
- out = nil
132
- if @type == "array"
133
- out = []
134
- groups.each do |k, v|
135
- if v.size == 1
136
- out << v.first.to_hash.entries.first.last
137
- else
138
- out << v.map{|e| e.to_hash[k]}
139
- end
140
- end
141
- out = out.flatten
142
-
143
- else # If Hash
144
- out = {}
145
- groups.each do |k,v|
146
- if v.size == 1
147
- out.merge!(v.first)
148
- else
149
- out.merge!( k => v.map{|e| e.to_hash[k]})
150
- end
151
- end
152
- out.merge! attributes unless attributes.empty?
153
- out = out.empty? ? nil : out
154
- end
155
-
156
- if @type && out.nil?
157
- { name => typecast_value(out) }
158
- else
159
- { name => out }
160
- end
161
- end
162
- end
163
-
164
- # Typecasts a value based upon its type. For instance, if
165
- # +node+ has #type == "integer",
166
- # {{[node.typecast_value("12") #=> 12]}}
167
- #
168
- # @param value<String> The value that is being typecast.
169
- #
170
- # @details [:type options]
171
- # "integer"::
172
- # converts +value+ to an integer with #to_i
173
- # "boolean"::
174
- # checks whether +value+, after removing spaces, is the literal
175
- # "true"
176
- # "datetime"::
177
- # Parses +value+ using Time.parse, and returns a UTC Time
178
- # "date"::
179
- # Parses +value+ using Date.parse
180
- #
181
- # @return <Integer, TrueClass, FalseClass, Time, Date, Object>
182
- # The result of typecasting +value+.
183
- #
184
- # @note
185
- # If +self+ does not have a "type" key, or if it's not one of the
186
- # options specified above, the raw +value+ will be returned.
187
- def typecast_value(value)
188
- return value unless @type
189
- proc = self.class.typecasts[@type]
190
- proc.nil? ? value : proc.call(value)
191
- end
192
-
193
- # Take keys of the form foo-bar and convert them to foo_bar
194
- def undasherize_keys(params)
195
- params.keys.each do |key, value|
196
- params[key.tr("-", "_")] = params.delete(key)
197
- end
198
- params
199
- end
200
-
201
- # Get the inner_html of the REXML node.
202
- def inner_html
203
- @children.join
204
- end
205
-
206
- # Converts the node into a readable HTML node.
207
- #
208
- # @return <String> The HTML node in text form.
209
- def to_html
210
- attributes.merge!(:type => @type ) if @type
211
- "<#{name}#{attributes.to_xml_attributes}>#{@nil_element ? '' : inner_html}</#{name}>"
212
- end
213
- alias :to_s :to_html
214
-
215
- def unnormalize_xml_entities value
216
- ::REXML::Text.unnormalize(value)
217
- end
218
- end
219
-
220
- end
221
- end
@@ -1,2 +0,0 @@
1
- --color
2
- --format=nested