json-jruby 1.2.4-universal-java-1.6 → 1.4.0-universal-java-1.6

Sign up to get free protection for your applications and to get access to all the features.
data/lib/json/common.rb CHANGED
@@ -63,6 +63,20 @@ module JSON
63
63
  end
64
64
  self.state = generator::State
65
65
  const_set :State, self.state
66
+ const_set :SAFE_STATE_PROTOTYPE, State.new.freeze
67
+ const_set :FAST_STATE_PROTOTYPE, State.new(
68
+ :indent => '',
69
+ :space => '',
70
+ :object_nl => "",
71
+ :array_nl => "",
72
+ :max_nesting => false
73
+ ).freeze
74
+ const_set :PRETTY_STATE_PROTOTYPE, State.new(
75
+ :indent => ' ',
76
+ :space => ' ',
77
+ :object_nl => "\n",
78
+ :array_nl => "\n"
79
+ ).freeze
66
80
  end
67
81
 
68
82
  # Returns the JSON generator modul, that is used by JSON. This might be
@@ -95,15 +109,15 @@ module JSON
95
109
  # deep.
96
110
  class NestingError < ParserError; end
97
111
 
112
+ # :stopdoc:
113
+ class CircularDatastructure < NestingError; end
114
+ # :startdoc:
115
+
98
116
  # This exception is raised, if a generator or unparser error occurs.
99
117
  class GeneratorError < JSONError; end
100
118
  # For backwards compatibility
101
119
  UnparserError = GeneratorError
102
120
 
103
- # If a circular data structure is encountered while unparsing
104
- # this exception is raised.
105
- class CircularDatastructure < GeneratorError; end
106
-
107
121
  # This exception is raised, if the required unicode support is missing on the
108
122
  # system. Usually this means, that the iconv library is not installed.
109
123
  class MissingUnicodeSupport < JSONError; end
@@ -129,7 +143,7 @@ module JSON
129
143
  # * *object_class*: Defaults to Hash
130
144
  # * *array_class*: Defaults to Array
131
145
  def parse(source, opts = {})
132
- JSON.parser.new(source, opts).parse
146
+ Parser.new(source, opts).parse
133
147
  end
134
148
 
135
149
  # Parse the JSON document _source_ into a Ruby data structure and return it.
@@ -149,10 +163,10 @@ module JSON
149
163
  # defaults to true.
150
164
  def parse!(source, opts = {})
151
165
  opts = {
152
- :max_nesting => false,
153
- :allow_nan => true
166
+ :max_nesting => false,
167
+ :allow_nan => true
154
168
  }.update(opts)
155
- JSON.parser.new(source, opts).parse
169
+ Parser.new(source, opts).parse
156
170
  end
157
171
 
158
172
  # Generate a JSON document from the Ruby data structure _obj_ and return
@@ -171,8 +185,6 @@ module JSON
171
185
  # * *space_before*: a string that is put before a : pair delimiter (default: ''),
172
186
  # * *object_nl*: a string that is put at the end of a JSON object (default: ''),
173
187
  # * *array_nl*: a string that is put at the end of a JSON array (default: ''),
174
- # * *check_circular*: true if checking for circular data structures
175
- # should be done (the default), false otherwise.
176
188
  # * *allow_nan*: true if NaN, Infinity, and -Infinity should be
177
189
  # generated, otherwise an exception is thrown, if these values are
178
190
  # encountered. This options defaults to false.
@@ -183,17 +195,21 @@ module JSON
183
195
  # See also the fast_generate for the fastest creation method with the least
184
196
  # amount of sanity checks, and the pretty_generate method for some
185
197
  # defaults for a pretty output.
186
- def generate(obj, state = nil)
187
- if state
188
- state = State.from_state(state)
198
+ def generate(obj, opts = nil)
199
+ if opts
200
+ if opts.respond_to? :to_hash
201
+ opts = opts.to_hash
202
+ elsif opts.respond_to? :to_h
203
+ opts = opts.to_h
204
+ else
205
+ raise TypeError, "can't convert #{opts.class} into Hash"
206
+ end
207
+ state = SAFE_STATE_PROTOTYPE.dup
208
+ state = state.configure(opts)
189
209
  else
190
- state = State.new
191
- end
192
- result = obj.to_json(state)
193
- if result !~ /\A\s*(?:\[.*\]|\{.*\})\s*\Z/m
194
- raise GeneratorError, "only generation of JSON objects or arrays allowed"
210
+ state = SAFE_STATE_PROTOTYPE
195
211
  end
196
- result
212
+ state.generate(obj)
197
213
  end
198
214
 
199
215
  # :stopdoc:
@@ -208,12 +224,21 @@ module JSON
208
224
  #
209
225
  # *WARNING*: Be careful not to pass any Ruby data structures with circles as
210
226
  # _obj_ argument, because this will cause JSON to go into an infinite loop.
211
- def fast_generate(obj)
212
- result = obj.to_json(nil)
213
- if result !~ /\A(?:\[.*\]|\{.*\})\Z/
214
- raise GeneratorError, "only generation of JSON objects or arrays allowed"
227
+ def fast_generate(obj, opts = nil)
228
+ if opts
229
+ if opts.respond_to? :to_hash
230
+ opts = opts.to_hash
231
+ elsif opts.respond_to? :to_h
232
+ opts = opts.to_h
233
+ else
234
+ raise TypeError, "can't convert #{opts.class} into Hash"
235
+ end
236
+ state = FAST_STATE_PROTOTYPE.dup
237
+ state.configure(opts)
238
+ else
239
+ state = FAST_STATE_PROTOTYPE
215
240
  end
216
- result
241
+ state.generate(obj)
217
242
  end
218
243
 
219
244
  # :stopdoc:
@@ -229,13 +254,6 @@ module JSON
229
254
  # The _opts_ argument can be used to configure the generator, see the
230
255
  # generate method for a more detailed explanation.
231
256
  def pretty_generate(obj, opts = nil)
232
- state = JSON.state.new(
233
- :indent => ' ',
234
- :space => ' ',
235
- :object_nl => "\n",
236
- :array_nl => "\n",
237
- :check_circular => true
238
- )
239
257
  if opts
240
258
  if opts.respond_to? :to_hash
241
259
  opts = opts.to_hash
@@ -244,13 +262,12 @@ module JSON
244
262
  else
245
263
  raise TypeError, "can't convert #{opts.class} into Hash"
246
264
  end
265
+ state = PRETTY_STATE_PROTOTYPE.dup
247
266
  state.configure(opts)
267
+ else
268
+ state = PRETTY_STATE_PROTOTYPE
248
269
  end
249
- result = obj.to_json(state)
250
- if result !~ /\A\s*(?:\[.*\]|\{.*\})\s*\Z/m
251
- raise GeneratorError, "only generation of JSON objects or arrays allowed"
252
- end
253
- result
270
+ state.generate(obj)
254
271
  end
255
272
 
256
273
  # :stopdoc:
Binary file
Binary file
@@ -40,6 +40,15 @@ module JSON
40
40
  # UTF16 big endian characters as \u????, and return it.
41
41
  if defined?(::Encoding)
42
42
  def utf8_to_json(string) # :nodoc:
43
+ string = string.dup
44
+ string << '' # XXX workaround: avoid buffer sharing
45
+ string.force_encoding(::Encoding::ASCII_8BIT)
46
+ string.gsub!(/["\\\x0-\x1f]/) { MAP[$&] }
47
+ string.force_encoding(::Encoding::UTF_8)
48
+ string
49
+ end
50
+
51
+ def utf8_to_json_ascii(string) # :nodoc:
43
52
  string = string.dup
44
53
  string << '' # XXX workaround: avoid buffer sharing
45
54
  string.force_encoding(::Encoding::ASCII_8BIT)
@@ -63,6 +72,10 @@ module JSON
63
72
  end
64
73
  else
65
74
  def utf8_to_json(string) # :nodoc:
75
+ string.gsub(/["\\\x0-\x1f]/) { MAP[$&] }
76
+ end
77
+
78
+ def utf8_to_json_ascii(string) # :nodoc:
66
79
  string = string.gsub(/["\\\x0-\x1f]/) { MAP[$&] }
67
80
  string.gsub!(/(
68
81
  (?:
@@ -81,7 +94,7 @@ module JSON
81
94
  raise GeneratorError, "Caught #{e.class}: #{e}"
82
95
  end
83
96
  end
84
- module_function :utf8_to_json
97
+ module_function :utf8_to_json, :utf8_to_json_ascii
85
98
 
86
99
  module Pure
87
100
  module Generator
@@ -99,7 +112,7 @@ module JSON
99
112
  when Hash
100
113
  new(opts)
101
114
  else
102
- new
115
+ SAFE_STATE_PROTOTYPE
103
116
  end
104
117
  end
105
118
 
@@ -112,22 +125,20 @@ module JSON
112
125
  # * *space_before*: a string that is put before a : pair delimiter (default: ''),
113
126
  # * *object_nl*: a string that is put at the end of a JSON object (default: ''),
114
127
  # * *array_nl*: a string that is put at the end of a JSON array (default: ''),
115
- # * *check_circular*: true if checking for circular data structures
116
- # should be done (the default), false otherwise.
117
- # * *check_circular*: true if checking for circular data structures
118
- # should be done, false (the default) otherwise.
128
+ # * *check_circular*: is deprecated now, use the :max_nesting option instead,
129
+ # * *max_nesting*: sets the maximum level of data structure nesting in
130
+ # the generated JSON, max_nesting = 0 if no maximum should be checked.
119
131
  # * *allow_nan*: true if NaN, Infinity, and -Infinity should be
120
132
  # generated, otherwise an exception is thrown, if these values are
121
133
  # encountered. This options defaults to false.
122
134
  def initialize(opts = {})
123
- @seen = {}
124
135
  @indent = ''
125
136
  @space = ''
126
137
  @space_before = ''
127
138
  @object_nl = ''
128
139
  @array_nl = ''
129
- @check_circular = true
130
140
  @allow_nan = false
141
+ @ascii_only = false
131
142
  configure opts
132
143
  end
133
144
 
@@ -159,10 +170,10 @@ module JSON
159
170
  raise NestingError, "nesting of #{current_nesting} is too deep"
160
171
  end
161
172
 
162
- # Returns true, if circular data structures should be checked,
173
+ # Returns true, if circular data structures are checked,
163
174
  # otherwise returns false.
164
175
  def check_circular?
165
- @check_circular
176
+ !@max_nesting.zero?
166
177
  end
167
178
 
168
179
  # Returns true if NaN, Infinity, and -Infinity should be considered as
@@ -171,21 +182,8 @@ module JSON
171
182
  @allow_nan
172
183
  end
173
184
 
174
- # Returns _true_, if _object_ was already seen during this generating
175
- # run.
176
- def seen?(object)
177
- @seen.key?(object.__id__)
178
- end
179
-
180
- # Remember _object_, to find out if it was already encountered (if a
181
- # cyclic data structure is if a cyclic data structure is rendered).
182
- def remember(object)
183
- @seen[object.__id__] = true
184
- end
185
-
186
- # Forget _object_ for this generating run.
187
- def forget(object)
188
- @seen.delete object.__id__
185
+ def ascii_only?
186
+ @ascii_only
189
187
  end
190
188
 
191
189
  # Configure this State instance with the Hash _opts_, and return
@@ -196,8 +194,8 @@ module JSON
196
194
  @space_before = opts[:space_before] if opts.key?(:space_before)
197
195
  @object_nl = opts[:object_nl] if opts.key?(:object_nl)
198
196
  @array_nl = opts[:array_nl] if opts.key?(:array_nl)
199
- @check_circular = !!opts[:check_circular] if opts.key?(:check_circular)
200
197
  @allow_nan = !!opts[:allow_nan] if opts.key?(:allow_nan)
198
+ @ascii_only = opts[:ascii_only] if opts.key?(:ascii_only)
201
199
  if !opts.key?(:max_nesting) # defaults to 19
202
200
  @max_nesting = 19
203
201
  elsif opts[:max_nesting]
@@ -212,12 +210,23 @@ module JSON
212
210
  # passed to the configure method.
213
211
  def to_h
214
212
  result = {}
215
- for iv in %w[indent space space_before object_nl array_nl check_circular allow_nan max_nesting]
213
+ for iv in %w[indent space space_before object_nl array_nl allow_nan max_nesting]
216
214
  result[iv.intern] = instance_variable_get("@#{iv}")
217
215
  end
218
216
  result
219
217
  end
220
218
 
219
+ # Generates a valid JSON document from object +obj+ and returns the
220
+ # result. If no valid JSON document can be created this method raises a
221
+ # GeneratorError exception.
222
+ def generate(obj)
223
+ result = obj.to_json(self)
224
+ if result !~ /\A\s*(?:\[.*\]|\{.*\})\s*\Z/m
225
+ raise GeneratorError, "only generation of JSON objects or arrays allowed"
226
+ end
227
+ result
228
+ end
229
+
221
230
  # Return the value returned by method +name+.
222
231
  def [](name)
223
232
  __send__ name
@@ -240,27 +249,14 @@ module JSON
240
249
  # _depth_ is used to find out nesting depth, to indent accordingly.
241
250
  def to_json(state = nil, depth = 0, *)
242
251
  if state
243
- state = JSON.state.from_state(state)
252
+ state = State.from_state(state)
244
253
  state.check_max_nesting(depth)
245
- json_check_circular(state) { json_transform(state, depth) }
246
- else
247
- json_transform(state, depth)
248
254
  end
255
+ json_transform(state, depth)
249
256
  end
250
257
 
251
258
  private
252
259
 
253
- def json_check_circular(state)
254
- if state and state.check_circular?
255
- state.seen?(self) and raise JSON::CircularDatastructure,
256
- "circular data structures not supported!"
257
- state.remember self
258
- end
259
- yield
260
- ensure
261
- state and state.forget self
262
- end
263
-
264
260
  def json_shift(state, depth)
265
261
  state and not state.object_nl.empty? or return ''
266
262
  state.indent * depth
@@ -272,16 +268,22 @@ module JSON
272
268
  delim << state.object_nl
273
269
  result = '{'
274
270
  result << state.object_nl
275
- result << map { |key,value|
276
- s = json_shift(state, depth + 1)
277
- s << key.to_s.to_json(state, depth + 1)
278
- s << state.space_before
279
- s << ':'
280
- s << state.space
281
- s << value.to_json(state, depth + 1)
282
- }.join(delim)
271
+ depth += 1
272
+ first = true
273
+ indent = state && !state.object_nl.empty?
274
+ each { |key,value|
275
+ result << delim unless first
276
+ result << state.indent * depth if indent
277
+ result << key.to_s.to_json(state, depth)
278
+ result << state.space_before
279
+ result << ':'
280
+ result << state.space
281
+ result << value.to_json(state, depth)
282
+ first = false
283
+ }
284
+ depth -= 1
283
285
  result << state.object_nl
284
- result << json_shift(state, depth)
286
+ result << state.indent * depth if indent if indent
285
287
  result << '}'
286
288
  else
287
289
  result = '{'
@@ -302,43 +304,32 @@ module JSON
302
304
  # _depth_ is used to find out nesting depth, to indent accordingly.
303
305
  def to_json(state = nil, depth = 0, *)
304
306
  if state
305
- state = JSON.state.from_state(state)
307
+ state = State.from_state(state)
306
308
  state.check_max_nesting(depth)
307
- json_check_circular(state) { json_transform(state, depth) }
308
- else
309
- json_transform(state, depth)
310
309
  end
310
+ json_transform(state, depth)
311
311
  end
312
312
 
313
313
  private
314
314
 
315
- def json_check_circular(state)
316
- if state and state.check_circular?
317
- state.seen?(self) and raise JSON::CircularDatastructure,
318
- "circular data structures not supported!"
319
- state.remember self
320
- end
321
- yield
322
- ensure
323
- state and state.forget self
324
- end
325
-
326
- def json_shift(state, depth)
327
- state and not state.array_nl.empty? or return ''
328
- state.indent * depth
329
- end
330
-
331
315
  def json_transform(state, depth)
332
316
  delim = ','
333
317
  if state
334
318
  delim << state.array_nl
335
319
  result = '['
336
320
  result << state.array_nl
337
- result << map { |value|
338
- json_shift(state, depth + 1) << value.to_json(state, depth + 1)
339
- }.join(delim)
321
+ depth += 1
322
+ first = true
323
+ indent = state && !state.array_nl.empty?
324
+ each { |value|
325
+ result << delim unless first
326
+ result << state.indent * depth if indent
327
+ result << value.to_json(state, depth)
328
+ first = false
329
+ }
330
+ depth -= 1
340
331
  result << state.array_nl
341
- result << json_shift(state, depth)
332
+ result << state.indent * depth if indent
342
333
  result << ']'
343
334
  else
344
335
  '[' << map { |value| value.to_json }.join(delim) << ']'
@@ -378,11 +369,17 @@ module JSON
378
369
  # This string should be encoded with UTF-8 A call to this method
379
370
  # returns a JSON string encoded with UTF16 big endian characters as
380
371
  # \u????.
381
- def to_json(*)
372
+ def to_json(*args)
373
+ state, = *args
374
+ state ||= State.from_state(state)
382
375
  if encoding == ::Encoding::UTF_8
383
- '"' << JSON.utf8_to_json(self) << '"'
376
+ string = self
384
377
  else
385
378
  string = encode(::Encoding::UTF_8)
379
+ end
380
+ if state.ascii_only?
381
+ '"' << JSON.utf8_to_json_ascii(string) << '"'
382
+ else
386
383
  '"' << JSON.utf8_to_json(string) << '"'
387
384
  end
388
385
  end
@@ -390,16 +387,23 @@ module JSON
390
387
  # This string should be encoded with UTF-8 A call to this method
391
388
  # returns a JSON string encoded with UTF16 big endian characters as
392
389
  # \u????.
393
- def to_json(*)
394
- '"' << JSON.utf8_to_json(self) << '"'
390
+ def to_json(*args)
391
+ state, = *args
392
+ state ||= State.from_state(state)
393
+ if state.ascii_only?
394
+ '"' << JSON.utf8_to_json_ascii(self) << '"'
395
+ else
396
+ '"' << JSON.utf8_to_json(self) << '"'
397
+ end
395
398
  end
396
399
  end
397
400
 
398
401
  # Module that holds the extinding methods if, the String module is
399
402
  # included.
400
403
  module Extend
401
- # Raw Strings are JSON Objects (the raw bytes are stored in an array for the
402
- # key "raw"). The Ruby String can be created by this module method.
404
+ # Raw Strings are JSON Objects (the raw bytes are stored in an
405
+ # array for the key "raw"). The Ruby String can be created by this
406
+ # module method.
403
407
  def json_create(o)
404
408
  o['raw'].pack('C*')
405
409
  end
data/lib/json/version.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module JSON
2
2
  # JSON version
3
- VERSION = '1.2.4'
3
+ VERSION = '1.4.0'
4
4
  VERSION_ARRAY = VERSION.split(/\./).map { |x| x.to_i } # :nodoc:
5
5
  VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
6
6
  VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
@@ -57,11 +57,12 @@ class TC_JSONEncoding < Test::Unit::TestCase
57
57
  end
58
58
 
59
59
  def test_generate
60
- assert_equal @generated, JSON.generate(@parsed)
60
+ assert_equal @generated, JSON.generate(@parsed, :ascii_only => true)
61
61
  if defined?(::Encoding)
62
- assert_equal @generated, JSON.generate(@utf_16_data)
62
+ assert_equal @generated, JSON.generate(@utf_16_data, :ascii_only => true)
63
63
  else
64
- assert_raises(JSON::GeneratorError) { JSON.generate(@utf_16_data) }
64
+ # XXX checking of correct utf8 data is not as strict (yet?) without :ascii_only
65
+ assert_raises(JSON::GeneratorError) { JSON.generate(@utf_16_data, :ascii_only => true) }
65
66
  end
66
67
  end
67
68
  end
@@ -87,19 +87,19 @@ EOT
87
87
  def test_states
88
88
  json = generate({1=>2}, nil)
89
89
  assert_equal('{"1":2}', json)
90
- s = JSON.state.new(:check_circular => true)
90
+ s = JSON.state.new
91
91
  assert s.check_circular?
92
92
  assert s[:check_circular?]
93
93
  h = { 1=>2 }
94
94
  h[3] = h
95
- assert_raises(JSON::CircularDatastructure) { generate(h) }
96
- assert_raises(JSON::CircularDatastructure) { generate(h, s) }
97
- s = JSON.state.new(:check_circular => true)
98
- assert s.check_circular?
99
- assert s[:check_circular?]
95
+ assert_raises(JSON::NestingError) { generate(h) }
96
+ assert_raises(JSON::NestingError) { generate(h, s) }
97
+ s = JSON.state.new
100
98
  a = [ 1, 2 ]
101
99
  a << a
102
- assert_raises(JSON::CircularDatastructure) { generate(a, s) }
100
+ assert_raises(JSON::NestingError) { generate(a, s) }
101
+ assert s.check_circular?
102
+ assert s[:check_circular?]
103
103
  end
104
104
 
105
105
  def test_allow_nan
@@ -19,22 +19,36 @@ class TC_JSONUnicode < Test::Unit::TestCase
19
19
  assert_equal '" "', ' '.to_json
20
20
  assert_equal "\"#{0x7f.chr}\"", 0x7f.chr.to_json
21
21
  utf8 = [ "© ≠ €! \01" ]
22
+ json = '["© ≠ €! \u0001"]'
23
+ assert_equal json, utf8.to_json(:ascii_only => false)
24
+ assert_equal utf8, parse(json)
22
25
  json = '["\u00a9 \u2260 \u20ac! \u0001"]'
23
- assert_equal json, utf8.to_json
26
+ assert_equal json, utf8.to_json(:ascii_only => true)
27
+ assert_equal utf8, parse(json)
28
+ utf8 = ["\343\201\202\343\201\204\343\201\206\343\201\210\343\201\212"]
29
+ json = "[\"\343\201\202\343\201\204\343\201\206\343\201\210\343\201\212\"]"
24
30
  assert_equal utf8, parse(json)
31
+ assert_equal json, utf8.to_json(:ascii_only => false)
25
32
  utf8 = ["\343\201\202\343\201\204\343\201\206\343\201\210\343\201\212"]
33
+ assert_equal utf8, parse(json)
26
34
  json = "[\"\\u3042\\u3044\\u3046\\u3048\\u304a\"]"
27
- assert_equal json, utf8.to_json
35
+ assert_equal json, utf8.to_json(:ascii_only => true)
28
36
  assert_equal utf8, parse(json)
29
37
  utf8 = ['საქართველო']
38
+ json = '["საქართველო"]'
39
+ assert_equal json, utf8.to_json(:ascii_only => false)
30
40
  json = "[\"\\u10e1\\u10d0\\u10e5\\u10d0\\u10e0\\u10d7\\u10d5\\u10d4\\u10da\\u10dd\"]"
31
- assert_equal json, utf8.to_json
41
+ assert_equal json, utf8.to_json(:ascii_only => true)
32
42
  assert_equal utf8, parse(json)
33
- assert_equal '["\\u00c3"]', JSON.generate(["Ã"])
43
+ assert_equal '["Ã"]', JSON.generate(["Ã"], :ascii_only => false)
44
+ assert_equal '["\\u00c3"]', JSON.generate(["Ã"], :ascii_only => true)
34
45
  assert_equal ["€"], JSON.parse('["\u20ac"]')
35
46
  utf8 = ["\xf0\xa0\x80\x81"]
47
+ json = "[\"\xf0\xa0\x80\x81\"]"
48
+ assert_equal json, JSON.generate(utf8, :ascii_only => false)
49
+ assert_equal utf8, JSON.parse(json)
36
50
  json = '["\ud840\udc01"]'
37
- assert_equal json, JSON.generate(utf8)
51
+ assert_equal json, JSON.generate(utf8, :ascii_only => true)
38
52
  assert_equal utf8, JSON.parse(json)
39
53
  end
40
54
 
@@ -55,7 +69,7 @@ class TC_JSONUnicode < Test::Unit::TestCase
55
69
  end
56
70
  end
57
71
  assert_raise(JSON::GeneratorError) do
58
- JSON.generate(["\x80"])
72
+ JSON.generate(["\x80"], :ascii_only => true)
59
73
  end
60
74
  assert_equal "\302\200", JSON.parse('["\u0080"]').first
61
75
  end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 1
7
- - 2
8
7
  - 4
9
- version: 1.2.4
8
+ - 0
9
+ version: 1.4.0
10
10
  platform: universal-java-1.6
11
11
  authors:
12
12
  - Daniel Luz
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-04-08 00:00:00 -03:00
17
+ date: 2010-04-23 00:00:00 -03:00
18
18
  default_executable:
19
19
  dependencies: []
20
20