multi_xml 0.5.5 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,10 +1,13 @@
1
- require 'rexml/document' unless defined?(REXML::Document)
1
+ require "rexml/document" unless defined?(REXML::Document)
2
2
 
3
3
  module MultiXml
4
4
  module Parsers
5
- module Rexml #:nodoc:
5
+ module Rexml # :nodoc:
6
6
  extend self
7
- def parse_error; ::REXML::ParseException; end
7
+
8
+ def parse_error
9
+ ::REXML::ParseException
10
+ end
8
11
 
9
12
  # Parse an XML Document IO into a simple hash using REXML
10
13
  #
@@ -12,11 +15,9 @@ module MultiXml
12
15
  # XML Document IO to parse
13
16
  def parse(xml)
14
17
  doc = REXML::Document.new(xml)
15
- if doc.root
16
- merge_element!({}, doc.root)
17
- else
18
- raise REXML::ParseException, "The document #{doc.to_s.inspect} does not have a valid root"
19
- end
18
+ raise(REXML::ParseException, "The document #{doc.to_s.inspect} does not have a valid root") unless doc.root
19
+
20
+ merge_element!({}, doc.root)
20
21
  end
21
22
 
22
23
  private
@@ -39,7 +40,7 @@ module MultiXml
39
40
  hash = get_attributes(element)
40
41
 
41
42
  if element.has_elements?
42
- element.each_element {|child| merge_element!(hash, child) }
43
+ element.each_element { |child| merge_element!(hash, child) }
43
44
  merge_texts!(hash, element) unless empty_content?(element)
44
45
  hash
45
46
  else
@@ -54,13 +55,12 @@ module MultiXml
54
55
  # element::
55
56
  # XML element whose texts are to me merged into the hash
56
57
  def merge_texts!(hash, element)
57
- unless element.has_text?
58
- hash
59
- else
58
+ if element.has_text?
60
59
  # must use value to prevent double-escaping
61
- texts = ''
62
- element.texts.each { |t| texts << t.value }
60
+ texts = element.texts.map(&:value).join
63
61
  merge!(hash, MultiXml::CONTENT_ROOT, texts)
62
+ else
63
+ hash
64
64
  end
65
65
  end
66
66
 
@@ -76,7 +76,7 @@ module MultiXml
76
76
  # value::
77
77
  # Value to be associated with key.
78
78
  def merge!(hash, key, value)
79
- if hash.has_key?(key)
79
+ if hash.key?(key)
80
80
  if hash[key].instance_of?(Array)
81
81
  hash[key] << value
82
82
  else
@@ -97,7 +97,7 @@ module MultiXml
97
97
  # XML element to extract attributes from.
98
98
  def get_attributes(element)
99
99
  attributes = {}
100
- element.attributes.each { |n,v| attributes[n] = v }
100
+ element.attributes.each { |n, v| attributes[n] = v }
101
101
  attributes
102
102
  end
103
103
 
@@ -1,3 +1,3 @@
1
1
  module MultiXml
2
- VERSION = "0.5.5" unless defined?(MultiXML::VERSION)
2
+ VERSION = Gem::Version.create("0.7.0")
3
3
  end
data/lib/multi_xml.rb CHANGED
@@ -1,77 +1,84 @@
1
- require 'base64'
2
- require 'bigdecimal'
3
- require 'date'
4
- require 'stringio'
5
- require 'time'
6
- require 'yaml'
7
-
8
- module MultiXml
1
+ require "bigdecimal"
2
+ require "date"
3
+ require "stringio"
4
+ require "time"
5
+ require "yaml"
6
+
7
+ module MultiXml # rubocop:disable Metrics/ModuleLength
9
8
  class ParseError < StandardError; end
9
+
10
+ class NoParserError < StandardError; end
11
+
10
12
  class DisallowedTypeError < StandardError
11
13
  def initialize(type)
12
- super "Disallowed type attribute: #{type.inspect}"
14
+ super("Disallowed type attribute: #{type.inspect}")
13
15
  end
14
16
  end
15
17
 
16
- REQUIREMENT_MAP = [
17
- ['ox', :ox],
18
- ['libxml', :libxml],
19
- ['nokogiri', :nokogiri],
20
- ['rexml/document', :rexml]
21
- ] unless defined?(REQUIREMENT_MAP)
18
+ unless defined?(REQUIREMENT_MAP)
19
+ REQUIREMENT_MAP = [
20
+ ["ox", :ox],
21
+ ["libxml", :libxml],
22
+ ["nokogiri", :nokogiri],
23
+ ["rexml/document", :rexml],
24
+ ["oga", :oga]
25
+ ].freeze
26
+ end
22
27
 
23
- CONTENT_ROOT = '__content__'.freeze unless defined?(CONTENT_ROOT)
28
+ CONTENT_ROOT = "__content__".freeze unless defined?(CONTENT_ROOT)
24
29
 
25
30
  unless defined?(PARSING)
31
+ float_proc = proc { |float| float.to_f }
32
+ datetime_proc = proc { |time| Time.parse(time).utc rescue DateTime.parse(time).utc } # rubocop:disable Style/RescueModifier
33
+
26
34
  PARSING = {
27
- 'symbol' => Proc.new{|symbol| symbol.to_sym},
28
- 'date' => Proc.new{|date| Date.parse(date)},
29
- 'datetime' => Proc.new{|time| Time.parse(time).utc rescue DateTime.parse(time).utc},
30
- 'integer' => Proc.new{|integer| integer.to_i},
31
- 'float' => Proc.new{|float| float.to_f},
32
- 'decimal' => Proc.new{|number| BigDecimal(number)},
33
- 'boolean' => Proc.new{|boolean| !%w(0 false).include?(boolean.strip)},
34
- 'string' => Proc.new{|string| string.to_s},
35
- 'yaml' => Proc.new{|yaml| YAML::load(yaml) rescue yaml},
36
- 'base64Binary' => Proc.new{|binary| ::Base64.decode64(binary)},
37
- 'binary' => Proc.new{|binary, entity| parse_binary(binary, entity)},
38
- 'file' => Proc.new{|file, entity| parse_file(file, entity)},
39
- }
40
-
41
- PARSING.update(
42
- 'double' => PARSING['float'],
43
- 'dateTime' => PARSING['datetime']
44
- )
35
+ "symbol" => proc { |symbol| symbol.to_sym },
36
+ "date" => proc { |date| Date.parse(date) },
37
+ "datetime" => datetime_proc,
38
+ "dateTime" => datetime_proc,
39
+ "integer" => proc { |integer| integer.to_i },
40
+ "float" => float_proc,
41
+ "double" => float_proc,
42
+ "decimal" => proc { |number| BigDecimal(number) },
43
+ "boolean" => proc { |boolean| !%w[0 false].include?(boolean.strip) },
44
+ "string" => proc { |string| string.to_s },
45
+ "yaml" => proc { |yaml| YAML.load(yaml) rescue yaml }, # rubocop:disable Style/RescueModifier
46
+ "base64Binary" => proc { |binary| base64_decode(binary) },
47
+ "binary" => proc { |binary, entity| parse_binary(binary, entity) },
48
+ "file" => proc { |file, entity| parse_file(file, entity) }
49
+ }.freeze
50
+ end
51
+
52
+ unless defined?(TYPE_NAMES)
53
+ TYPE_NAMES = {
54
+ "Symbol" => "symbol",
55
+ "Integer" => "integer",
56
+ "BigDecimal" => "decimal",
57
+ "Float" => "float",
58
+ "TrueClass" => "boolean",
59
+ "FalseClass" => "boolean",
60
+ "Date" => "date",
61
+ "DateTime" => "datetime",
62
+ "Time" => "datetime",
63
+ "Array" => "array",
64
+ "Hash" => "hash"
65
+ }.freeze
45
66
  end
46
67
 
47
- TYPE_NAMES = {
48
- 'Symbol' => 'symbol',
49
- 'Fixnum' => 'integer',
50
- 'Bignum' => 'integer',
51
- 'BigDecimal' => 'decimal',
52
- 'Float' => 'float',
53
- 'TrueClass' => 'boolean',
54
- 'FalseClass' => 'boolean',
55
- 'Date' => 'date',
56
- 'DateTime' => 'datetime',
57
- 'Time' => 'datetime',
58
- 'Array' => 'array',
59
- 'Hash' => 'hash'
60
- } unless defined?(TYPE_NAMES)
61
-
62
- DISALLOWED_XML_TYPES = %w(symbol yaml)
68
+ DISALLOWED_XML_TYPES = %w[symbol yaml].freeze
63
69
 
64
70
  DEFAULT_OPTIONS = {
65
- :typecast_xml_value => true,
66
- :disallowed_types => DISALLOWED_XML_TYPES,
67
- :symbolize_keys => false
68
- }
71
+ typecast_xml_value: true,
72
+ disallowed_types: DISALLOWED_XML_TYPES,
73
+ symbolize_keys: false
74
+ }.freeze
69
75
 
70
76
  class << self
71
77
  # Get the current parser class.
72
78
  def parser
73
79
  return @parser if defined?(@parser)
74
- self.parser = self.default_parser
80
+
81
+ self.parser = default_parser
75
82
  @parser
76
83
  end
77
84
 
@@ -83,15 +90,16 @@ module MultiXml
83
90
  return :ox if defined?(::Ox)
84
91
  return :libxml if defined?(::LibXML)
85
92
  return :nokogiri if defined?(::Nokogiri)
93
+ return :oga if defined?(::Oga)
86
94
 
87
95
  REQUIREMENT_MAP.each do |library, parser|
88
- begin
89
- require library
90
- return parser
91
- rescue LoadError
92
- next
93
- end
96
+ require library
97
+ return parser
98
+ rescue LoadError
99
+ next
94
100
  end
101
+ raise(NoParserError,
102
+ "No XML parser detected. If you're using Rubinius and Bundler, try adding an XML parser to your Gemfile (e.g. libxml-ruby, nokogiri, or rubysl-rexml). For more information, see https://github.com/sferik/multi_xml/issues/42.")
95
103
  end
96
104
 
97
105
  # Set the XML parser utilizing a symbol, string, or class.
@@ -101,15 +109,16 @@ module MultiXml
101
109
  # * <tt>:nokogiri</tt>
102
110
  # * <tt>:ox</tt>
103
111
  # * <tt>:rexml</tt>
112
+ # * <tt>:oga</tt>
104
113
  def parser=(new_parser)
105
114
  case new_parser
106
115
  when String, Symbol
107
116
  require "multi_xml/parsers/#{new_parser.to_s.downcase}"
108
- @parser = MultiXml::Parsers.const_get("#{new_parser.to_s.split('_').map{|s| s.capitalize}.join('')}")
117
+ @parser = MultiXml::Parsers.const_get(new_parser.to_s.split("_").collect(&:capitalize).join.to_s)
109
118
  when Class, Module
110
119
  @parser = new_parser
111
120
  else
112
- raise "Did not recognize your parser specification. Please specify either a symbol or a class."
121
+ raise("Did not recognize your parser specification. Please specify either a symbol or a class.")
113
122
  end
114
123
  end
115
124
 
@@ -122,25 +131,26 @@ module MultiXml
122
131
  # <tt>:disallowed_types</tt> :: Types to disallow from being typecasted. Defaults to `['yaml', 'symbol']`. Use `[]` to allow all types.
123
132
  #
124
133
  # <tt>:typecast_xml_value</tt> :: If true, won't typecast values for parsed document
125
- def parse(xml, options={})
126
- xml ||= ''
134
+ def parse(xml, options = {}) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
135
+ xml ||= ""
127
136
 
128
137
  options = DEFAULT_OPTIONS.merge(options)
129
138
 
130
- xml.strip! if xml.respond_to?(:strip!)
139
+ xml = xml.strip if xml.respond_to?(:strip)
131
140
  begin
132
141
  xml = StringIO.new(xml) unless xml.respond_to?(:read)
133
142
 
134
143
  char = xml.getc
135
144
  return {} if char.nil?
145
+
136
146
  xml.ungetc(char)
137
147
 
138
148
  hash = undasherize_keys(parser.parse(xml) || {})
139
- hash = options[:typecast_xml_value] ? typecast_xml_value(hash, options[:disallowed_types]) : hash
149
+ hash = typecast_xml_value(hash, options[:disallowed_types]) if options[:typecast_xml_value]
140
150
  rescue DisallowedTypeError
141
151
  raise
142
- rescue parser.parse_error => error
143
- raise ParseError, error.message, error.backtrace
152
+ rescue parser.parse_error => e
153
+ raise(ParseError, e.message, e.backtrace)
144
154
  end
145
155
  hash = symbolize_keys(hash) if options[:symbolize_keys]
146
156
  hash
@@ -148,38 +158,42 @@ module MultiXml
148
158
 
149
159
  # This module decorates files with the <tt>original_filename</tt>
150
160
  # and <tt>content_type</tt> methods.
151
- module FileLike #:nodoc:
161
+ module FileLike # :nodoc:
152
162
  attr_writer :original_filename, :content_type
153
163
 
154
164
  def original_filename
155
- @original_filename || 'untitled'
165
+ @original_filename || "untitled"
156
166
  end
157
167
 
158
168
  def content_type
159
- @content_type || 'application/octet-stream'
169
+ @content_type || "application/octet-stream"
160
170
  end
161
171
  end
162
172
 
163
173
  private
164
174
 
165
175
  # TODO: Add support for other encodings
166
- def parse_binary(binary, entity) #:nodoc:
167
- case entity['encoding']
168
- when 'base64'
169
- Base64.decode64(binary)
176
+ def parse_binary(binary, entity) # :nodoc:
177
+ case entity["encoding"]
178
+ when "base64"
179
+ base64_decode(binary)
170
180
  else
171
181
  binary
172
182
  end
173
183
  end
174
184
 
175
185
  def parse_file(file, entity)
176
- f = StringIO.new(Base64.decode64(file))
186
+ f = StringIO.new(base64_decode(file))
177
187
  f.extend(FileLike)
178
- f.original_filename = entity['name']
179
- f.content_type = entity['content_type']
188
+ f.original_filename = entity["name"]
189
+ f.content_type = entity["content_type"]
180
190
  f
181
191
  end
182
192
 
193
+ def base64_decode(input)
194
+ input.unpack1("m")
195
+ end
196
+
183
197
  def symbolize_keys(params)
184
198
  case params
185
199
  when Hash
@@ -187,7 +201,7 @@ module MultiXml
187
201
  result.merge(key.to_sym => symbolize_keys(value))
188
202
  end
189
203
  when Array
190
- params.map{|value| symbolize_keys(value)}
204
+ params.collect { |value| symbolize_keys(value) }
191
205
  else
192
206
  params
193
207
  end
@@ -196,27 +210,27 @@ module MultiXml
196
210
  def undasherize_keys(params)
197
211
  case params
198
212
  when Hash
199
- params.inject({}) do |hash, (key, value)|
200
- hash[key.to_s.tr('-', '_')] = undasherize_keys(value)
213
+ params.each_with_object({}) do |(key, value), hash|
214
+ hash[key.to_s.tr("-", "_")] = undasherize_keys(value)
201
215
  hash
202
216
  end
203
217
  when Array
204
- params.map{|value| undasherize_keys(value)}
218
+ params.collect { |value| undasherize_keys(value) }
205
219
  else
206
220
  params
207
221
  end
208
222
  end
209
223
 
210
- def typecast_xml_value(value, disallowed_types=nil)
224
+ def typecast_xml_value(value, disallowed_types = nil) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
211
225
  disallowed_types ||= DISALLOWED_XML_TYPES
212
226
 
213
227
  case value
214
228
  when Hash
215
- if value.include?('type') && !value['type'].is_a?(Hash) && disallowed_types.include?(value['type'])
216
- raise DisallowedTypeError, value['type']
229
+ if value.include?("type") && !value["type"].is_a?(Hash) && disallowed_types.include?(value["type"])
230
+ raise(DisallowedTypeError, value["type"])
217
231
  end
218
232
 
219
- if value['type'] == 'array'
233
+ if value["type"] == "array"
220
234
 
221
235
  # this commented-out suggestion helps to avoid the multiple attribute
222
236
  # problem, but it breaks when there is only one item in the array.
@@ -227,29 +241,31 @@ module MultiXml
227
241
 
228
242
  # This attempt fails to consider the order that the detect method
229
243
  # retrieves the entries.
230
- #_, entries = value.detect {|key, _| key != 'type'}
244
+ # _, entries = value.detect {|key, _| key != 'type'}
231
245
 
232
246
  # This approach ignores attribute entries that are not convertable
233
247
  # to an Array which allows attributes to be ignored.
234
- _, entries = value.detect {|k, v| k != 'type' && (v.is_a?(Array) || v.is_a?(Hash)) }
248
+ _, entries = value.detect { |k, v| k != "type" && (v.is_a?(Array) || v.is_a?(Hash)) }
235
249
 
236
- if entries.nil? || (entries.is_a?(String) && entries.strip.empty?)
250
+ case entries
251
+ when NilClass
237
252
  []
253
+ when String
254
+ [] if entries.strip.empty?
255
+ when Array
256
+ entries.collect { |entry| typecast_xml_value(entry, disallowed_types) }
257
+ when Hash
258
+ [typecast_xml_value(entries, disallowed_types)]
238
259
  else
239
- case entries
240
- when Array
241
- entries.map {|entry| typecast_xml_value(entry, disallowed_types)}
242
- when Hash
243
- [typecast_xml_value(entries, disallowed_types)]
244
- else
245
- raise "can't typecast #{entries.class.name}: #{entries.inspect}"
246
- end
260
+ raise("can't typecast #{entries.class.name}: #{entries.inspect}")
247
261
  end
248
- elsif value.has_key?(CONTENT_ROOT)
262
+
263
+ elsif value.key?(CONTENT_ROOT)
249
264
  content = value[CONTENT_ROOT]
250
- if block = PARSING[value['type']]
265
+ block = PARSING[value["type"]]
266
+ if block
251
267
  if block.arity == 1
252
- value.delete('type') if PARSING[value['type']]
268
+ value.delete("type") if PARSING[value["type"]]
253
269
  if value.keys.size > 1
254
270
  value[CONTENT_ROOT] = block.call(content)
255
271
  value
@@ -260,37 +276,36 @@ module MultiXml
260
276
  block.call(content, value)
261
277
  end
262
278
  else
263
- value.keys.size > 1 ? value : content
279
+ (value.keys.size > 1) ? value : content
264
280
  end
265
- elsif value['type'] == 'string' && value['nil'] != 'true'
266
- ''
281
+ elsif value["type"] == "string" && value["nil"] != "true"
282
+ ""
267
283
  # blank or nil parsed values are represented by nil
268
- elsif value.empty? || value['nil'] == 'true'
284
+ elsif value.empty? || value["nil"] == "true"
269
285
  nil
270
286
  # If the type is the only element which makes it then
271
287
  # this still makes the value nil, except if type is
272
288
  # a XML node(where type['value'] is a Hash)
273
- elsif value['type'] && value.size == 1 && !value['type'].is_a?(Hash)
289
+ elsif value["type"] && value.size == 1 && !value["type"].is_a?(Hash)
274
290
  nil
275
291
  else
276
- xml_value = value.inject({}) do |hash, (k, v)|
292
+ xml_value = value.each_with_object({}) do |(k, v), hash|
277
293
  hash[k] = typecast_xml_value(v, disallowed_types)
278
294
  hash
279
295
  end
280
296
 
281
297
  # Turn {:files => {:file => #<StringIO>} into {:files => #<StringIO>} so it is compatible with
282
298
  # how multipart uploaded files from HTML appear
283
- xml_value['file'].is_a?(StringIO) ? xml_value['file'] : xml_value
299
+ (xml_value["file"].is_a?(StringIO)) ? xml_value["file"] : xml_value
284
300
  end
285
301
  when Array
286
- value.map!{|i| typecast_xml_value(i, disallowed_types)}
287
- value.length > 1 ? value : value.first
302
+ value.map! { |i| typecast_xml_value(i, disallowed_types) }
303
+ (value.length > 1) ? value : value.first
288
304
  when String
289
305
  value
290
306
  else
291
- raise "can't typecast #{value.class.name}: #{value.inspect}"
307
+ raise("can't typecast #{value.class.name}: #{value.inspect}")
292
308
  end
293
309
  end
294
310
  end
295
-
296
311
  end
metadata CHANGED
@@ -1,111 +1,79 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: multi_xml
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.5
5
- prerelease:
4
+ version: 0.7.0
6
5
  platform: ruby
7
6
  authors:
8
- - Erik Michaels-Ober
9
- autorequire:
10
- bindir: bin
11
- cert_chain:
12
- - !binary |-
13
- LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURMakNDQWhhZ0F3SUJB
14
- Z0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREE5TVE4d0RRWURWUVFEREFaelpt
15
- VnkKYVdzeEZUQVRCZ29Ka2lhSmsvSXNaQUVaRmdWbmJXRnBiREVUTUJFR0Nn
16
- bVNKb21UOGl4a0FSa1dBMk52YlRBZQpGdzB4TXpBeU1ETXhNREF5TWpkYUZ3
17
- MHhOREF5TURNeE1EQXlNamRhTUQweER6QU5CZ05WQkFNTUJuTm1aWEpwCmF6
18
- RVZNQk1HQ2dtU0pvbVQ4aXhrQVJrV0JXZHRZV2xzTVJNd0VRWUtDWkltaVpQ
19
- eUxHUUJHUllEWTI5dE1JSUIKSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4
20
- QU1JSUJDZ0tDQVFFQWwweDVkeDh1S3hpN1Rrckl1eUJVVEpWQgp2MW85M25V
21
- QjlqL3k0TTk2Z1Yycll3QWNpMUpQQnNlTmQ2RnliempvM1lHdUhsN0VRSHVT
22
- SE5hZjFwMmx4ZXcvCnk2MEpYSUpCQmdQY0RLL0tDUDROVUhvZm0wamZvWUQr
23
- SDV1TkpmSENOcTcvWnNUeE90RTNSYTkyczBCQ01UcG0Kd0JNTWxXUjVNdGRF
24
- aElZdUJPNFhobmVqWWdIMEwvN0JMMmx5bW50Vm5zci9hZ2RRb29qUUNOMUlR
25
- bXNSSnZyUgpkdVpSTzN0WnZvSW8xcEJjNEpFZWhEdXFDZXlCZ1BMT3FNb0t0
26
- UWxvbGQxVFFzMWtXVUJLN0tXTUZFaEtDL0tnCnp5ektSSFFvOXlEWXdPdllu
27
- Z29CTFkrVC9sd0NUNGR5c3NkaHpSYmZueEFoYUt1NFNBc3NJd2FDMDF5Vm93
28
- SUQKQVFBQm96a3dOekFKQmdOVkhSTUVBakFBTUIwR0ExVWREZ1FXQkJTMHJ1
29
- RGZSYWs1Y2kxT3BETlgvWmRERWtJcwppVEFMQmdOVkhROEVCQU1DQkxBd0RR
30
- WUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFISFNNcy9NUDBzT2FMa0V2NEpvCnp2
31
- a20zcW41QTZ0MHZhSHg3NzRjbWVqeU1VKzV3eVN4UmV6c3BMN1VMaDlOZXVL
32
- Mk9oVStPZTNUcHFyQWc1VEsKUjhHUUlMblZ1MkZlbUdBNnNBa1BEbGNQdGdB
33
- NmllSTE5UFpPRjZIVkxtYy9JRC9kUC9OZ1pXV3pFZXFRS21jSwoyK0hNK1NF
34
- RURoWmtTY1lla3c0Wk9lMTY0WnRaRzgxNm9BdjV4MHBHaXRTSWt1bVVwN1Y4
35
- aUVaLzZlaHI3WTllClhPZzRlZXVuNUwvSmptakFSb1cya05kdmtSRDNjMkVl
36
- U0xxV3ZRUnNCbHlwSGZoczZKSnVMbHlaUEdoVTNSL3YKU2YzbFZLcEJDV2dS
37
- cEdUdnk0NVhWcEIrNTl5MzNQSm1FdVExUFRFT1l2UXlhbzlVS01BQWFBTi83
38
- cVdRdGpsMApobHc9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
39
- date: 2013-08-06 00:00:00.000000000 Z
7
+ - Erik Berlin
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2024-04-30 00:00:00.000000000 Z
40
12
  dependencies:
41
13
  - !ruby/object:Gem::Dependency
42
- name: bundler
14
+ name: bigdecimal
43
15
  requirement: !ruby/object:Gem::Requirement
44
- none: false
45
16
  requirements:
46
- - - ~>
17
+ - - "~>"
47
18
  - !ruby/object:Gem::Version
48
- version: '1.0'
49
- type: :development
19
+ version: '3.1'
20
+ type: :runtime
50
21
  prerelease: false
51
22
  version_requirements: !ruby/object:Gem::Requirement
52
- none: false
53
23
  requirements:
54
- - - ~>
24
+ - - "~>"
55
25
  - !ruby/object:Gem::Version
56
- version: '1.0'
57
- description: Provides swappable XML backends utilizing LibXML, Nokogiri, Ox, or REXML.
58
- email: sferik@gmail.com
26
+ version: '3.1'
27
+ description:
28
+ email:
29
+ - sferik@gmail.com
59
30
  executables: []
60
31
  extensions: []
61
32
  extra_rdoc_files: []
62
33
  files:
63
- - .yardopts
34
+ - ".rspec"
35
+ - ".rubocop.yml"
36
+ - ".yardopts"
64
37
  - CHANGELOG.md
65
38
  - CONTRIBUTING.md
39
+ - Gemfile
66
40
  - LICENSE.md
67
41
  - README.md
68
42
  - Rakefile
69
- - multi_xml.gemspec
43
+ - lib/multi_xml.rb
70
44
  - lib/multi_xml/parsers/libxml.rb
71
45
  - lib/multi_xml/parsers/libxml2_parser.rb
72
46
  - lib/multi_xml/parsers/nokogiri.rb
47
+ - lib/multi_xml/parsers/oga.rb
73
48
  - lib/multi_xml/parsers/ox.rb
74
49
  - lib/multi_xml/parsers/rexml.rb
75
50
  - lib/multi_xml/version.rb
76
- - lib/multi_xml.rb
77
- - spec/helper.rb
78
- - spec/multi_xml_spec.rb
79
- - spec/parser_shared_example.rb
80
- - spec/speed.rb
81
51
  homepage: https://github.com/sferik/multi_xml
82
52
  licenses:
83
53
  - MIT
84
- post_install_message:
54
+ metadata:
55
+ allowed_push_host: https://rubygems.org
56
+ homepage_uri: https://github.com/sferik/multi_xml
57
+ source_code_uri: https://github.com/sferik/multi_xml
58
+ changelog_uri: https://github.com/sferik/multi_xml/blob/master/CHANGELOG.md
59
+ rubygems_mfa_required: 'true'
60
+ post_install_message:
85
61
  rdoc_options: []
86
62
  require_paths:
87
63
  - lib
88
64
  required_ruby_version: !ruby/object:Gem::Requirement
89
- none: false
90
65
  requirements:
91
- - - ! '>='
66
+ - - ">="
92
67
  - !ruby/object:Gem::Version
93
- version: '0'
68
+ version: 3.1.4
94
69
  required_rubygems_version: !ruby/object:Gem::Requirement
95
- none: false
96
70
  requirements:
97
- - - ! '>='
71
+ - - ">="
98
72
  - !ruby/object:Gem::Version
99
- version: 1.3.5
73
+ version: '0'
100
74
  requirements: []
101
- rubyforge_project:
102
- rubygems_version: 1.8.23
103
- signing_key:
104
- specification_version: 3
105
- summary: A generic swappable back-end for XML parsing
106
- test_files:
107
- - spec/helper.rb
108
- - spec/multi_xml_spec.rb
109
- - spec/parser_shared_example.rb
110
- - spec/speed.rb
111
- has_rdoc:
75
+ rubygems_version: 3.5.9
76
+ signing_key:
77
+ specification_version: 4
78
+ summary: Provides swappable XML backends utilizing LibXML, Nokogiri, Ox, or REXML.
79
+ test_files: []
data/multi_xml.gemspec DELETED
@@ -1,24 +0,0 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'multi_xml/version'
5
-
6
- Gem::Specification.new do |spec|
7
- spec.add_development_dependency 'bundler', '~> 1.0'
8
- spec.author = "Erik Michaels-Ober"
9
- spec.cert_chain = ['certs/sferik.pem']
10
- spec.description = %q{Provides swappable XML backends utilizing LibXML, Nokogiri, Ox, or REXML.}
11
- spec.email = 'sferik@gmail.com'
12
- spec.files = %w(.yardopts CHANGELOG.md CONTRIBUTING.md LICENSE.md README.md Rakefile multi_xml.gemspec)
13
- spec.files += Dir.glob("lib/**/*.rb")
14
- spec.files += Dir.glob("spec/**/*")
15
- spec.homepage = 'https://github.com/sferik/multi_xml'
16
- spec.licenses = ['MIT']
17
- spec.name = 'multi_xml'
18
- spec.require_paths = ['lib']
19
- spec.required_rubygems_version = '>= 1.3.5'
20
- spec.signing_key = File.expand_path("~/.gem/private_key.pem") if $0 =~ /gem\z/
21
- spec.summary = %q{A generic swappable back-end for XML parsing}
22
- spec.test_files = Dir.glob("spec/**/*")
23
- spec.version = MultiXml::VERSION
24
- end