edn_turbo 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,7 @@
1
1
  #include <iostream>
2
2
  #include <string>
3
+ #include <stack>
4
+ #include <vector>
3
5
  #include <limits>
4
6
  #include <exception>
5
7
 
@@ -30,18 +32,23 @@ namespace edn
30
32
  //
31
33
  VALUE Parser::next()
32
34
  {
33
- VALUE token = EDNT_EOF;
35
+ VALUE token = EDNT_EOF_CONST;
34
36
 
35
37
  while (!is_eof())
36
38
  {
37
39
  // fetch a token. If it's metadata or discard
38
- VALUE v;
39
- if (parse_next(v))
40
- {
40
+ VALUE v = EDNT_EOF_CONST;
41
+ eTokenState state = parse_next(v);
42
+
43
+ if (state == TOKEN_OK) {
41
44
  // valid token
42
45
  token = v;
43
46
  break;
44
47
  }
48
+ else if (state == TOKEN_ERROR) {
49
+ token = EDNT_EOF_CONST;
50
+ break;
51
+ }
45
52
  }
46
53
 
47
54
  return token;
@@ -53,7 +60,13 @@ namespace edn
53
60
  {
54
61
  line_number = 1;
55
62
  discard.clear();
56
- metadata.clear();
63
+
64
+ // remove any remaining levels except for the first
65
+ while (metadata.size() > 1) {
66
+ del_top_meta_list();
67
+ }
68
+ // but clear any metadata on the first
69
+ metadata.top()->clear();
57
70
  }
58
71
 
59
72
  //
@@ -76,20 +89,27 @@ namespace edn
76
89
 
77
90
  // we're using at most 2 args
78
91
  struct prot_args {
79
- prot_args(ID r, ID m, VALUE arg) :
92
+ prot_args(VALUE r, ID m) :
93
+ receiver(r), method(m), count(0) {
94
+ }
95
+ prot_args(VALUE r, ID m, VALUE arg) :
80
96
  receiver(r), method(m), count(1) {
81
97
  args[0] = arg;
82
98
  }
83
- prot_args(ID r, ID m, VALUE arg1, VALUE arg2) :
99
+ prot_args(VALUE r, ID m, VALUE arg1, VALUE arg2) :
84
100
  receiver(r), method(m), count(2) {
85
101
  args[0] = arg1;
86
102
  args[1] = arg2;
87
103
  }
88
104
 
89
- VALUE call() const { return rb_funcall2( receiver, method, count, args ); }
105
+ VALUE call() const {
106
+ return ((count == 0) ?
107
+ rb_funcall( receiver, method, 0 ) :
108
+ rb_funcall2( receiver, method, count, args ));
109
+ }
90
110
 
91
111
  private:
92
- ID receiver;
112
+ VALUE receiver;
93
113
  ID method;
94
114
  VALUE count;
95
115
  VALUE args[2];
@@ -133,29 +153,35 @@ namespace edn
133
153
  // hold, call into ruby to get a big num
134
154
  VALUE Parser::integer_to_ruby(const char* str, std::size_t len)
135
155
  {
136
- if (len < LL_max_chars)
156
+ if (str[len-1] == 'M' || len >= LL_max_chars)
137
157
  {
138
- return LONG2NUM(buftotype<long>(str, len));
158
+ std::string buf(str, len);
159
+ VALUE vs = edn_prot_rb_new_str(buf.c_str());
160
+ prot_args args(vs, EDNT_STRING_TO_I_METHOD);
161
+ return edn_prot_rb_funcall( edn_wrap_funcall2, reinterpret_cast<VALUE>(&args) );
139
162
  }
140
163
 
141
- // value is outside of range of long type. Use ruby to convert it
142
- VALUE rb_s = edn_prot_rb_new_str( str );
143
- prot_args args(rb_mEDNT, EDNT_STR_INT_TO_BIGNUM, rb_s);
144
- return edn_prot_rb_funcall( edn_wrap_funcall2, reinterpret_cast<VALUE>(&args) );
164
+ return LONG2NUM(buftotype<long>(str, len));
145
165
  }
146
166
 
147
167
  //
148
168
  // as above.. TODO: check exponential..
149
169
  VALUE Parser::float_to_ruby(const char* str, std::size_t len)
150
170
  {
151
- if (len < LD_max_chars)
171
+ if (str[len-1] == 'M' || len >= LD_max_chars)
152
172
  {
153
- return rb_float_new(buftotype<double>(str, len));
173
+ std::string buf(str, len);
174
+ VALUE vs = edn_prot_rb_new_str(buf.c_str());
175
+
176
+ if (str[len-1] == 'M') {
177
+ return Parser::make_edn_type(EDNT_MAKE_BIG_DECIMAL_METHOD, vs);
178
+ }
179
+
180
+ prot_args args(vs, EDNT_STRING_TO_F_METHOD);
181
+ return edn_prot_rb_funcall( edn_wrap_funcall2, reinterpret_cast<VALUE>(&args) );
154
182
  }
155
183
 
156
- // value is outside of range of long type. Use ruby to convert it
157
- prot_args args(rb_mEDNT, EDNT_STR_DBL_TO_BIGNUM, edn_prot_rb_new_str(str));
158
- return edn_prot_rb_funcall( edn_wrap_funcall2, reinterpret_cast<VALUE>(&args) );
184
+ return rb_float_new(buftotype<double>(str, len));
159
185
  }
160
186
 
161
187
 
@@ -218,25 +244,15 @@ namespace edn
218
244
 
219
245
  //
220
246
  // get a set representation from the ruby side. See edn_turbo.rb
221
- VALUE Parser::make_edn_symbol(VALUE sym)
247
+ VALUE Parser::make_edn_type(ID method, VALUE sym)
222
248
  {
223
- prot_args args(rb_mEDNT, EDNT_MAKE_EDN_SYMBOL, sym);
249
+ prot_args args(rb_mEDNT, method, sym);
224
250
  return edn_prot_rb_funcall( edn_wrap_funcall2, reinterpret_cast<VALUE>(&args) );
225
251
  }
226
252
 
227
- //
228
- // get a set representation from the ruby side. See edn_turbo.rb
229
- VALUE Parser::make_ruby_set(VALUE elems)
253
+ VALUE Parser::make_edn_type(ID method, VALUE name, VALUE data)
230
254
  {
231
- prot_args args(rb_mEDNT, EDNT_MAKE_SET_METHOD, elems);
232
- return edn_prot_rb_funcall( edn_wrap_funcall2, reinterpret_cast<VALUE>(&args) );
233
- }
234
-
235
- //
236
- // get an object representation from the ruby side using the given symbol name
237
- VALUE Parser::tagged_element(VALUE name, VALUE data)
238
- {
239
- prot_args args(rb_mEDNT, EDNT_TAGGED_ELEM, name, data);
255
+ prot_args args(rb_mEDNT, method, name, data);
240
256
  return edn_prot_rb_funcall( edn_wrap_funcall2, reinterpret_cast<VALUE>(&args) );
241
257
  }
242
258
 
@@ -248,22 +264,15 @@ namespace edn
248
264
  // (right to left) - the ruby side will interpret this
249
265
  VALUE Parser::ruby_meta()
250
266
  {
251
- VALUE m = rb_ary_new();
267
+ VALUE m_ary = rb_ary_new();
252
268
 
253
- while (!metadata.empty()) {
254
- rb_ary_push(m, metadata.back());
255
- metadata.pop_back();
269
+ // pop from the back of the top-most list
270
+ while (!metadata.top()->empty()) {
271
+ rb_ary_push(m_ary, metadata.top()->back());
272
+ metadata.top()->pop_back();
256
273
  }
257
274
 
258
- return m;
259
- }
260
-
261
- //
262
- // calls the ruby-side bind_meta to bind the metadata to the value
263
- VALUE Parser::bind_meta_to_value(VALUE value)
264
- {
265
- prot_args args(rb_mEDNT, EDNT_BIND_META_TO_VALUE, value, ruby_meta());
266
- return edn_prot_rb_funcall( edn_wrap_funcall2, reinterpret_cast<VALUE>(&args) );
275
+ return m_ary;
267
276
  }
268
277
 
269
278
 
@@ -12,15 +12,18 @@ namespace edn {
12
12
  VALUE rb_mEDNT;
13
13
 
14
14
  // methods on the ruby side we'll call from here
15
- VALUE EDNT_MAKE_EDN_SYMBOL = Qnil;
16
- VALUE EDNT_MAKE_SET_METHOD = Qnil;
17
- VALUE EDNT_TAGGED_ELEM = Qnil;
18
- VALUE EDNT_BIND_META_TO_VALUE = Qnil;
19
- VALUE EDNT_STR_INT_TO_BIGNUM = Qnil;
20
- VALUE EDNT_STR_DBL_TO_BIGNUM = Qnil;
15
+ VALUE EDNT_MAKE_SYMBOL_METHOD = Qnil;
16
+ VALUE EDNT_MAKE_LIST_METHOD = Qnil;
17
+ VALUE EDNT_MAKE_SET_METHOD = Qnil;
18
+ VALUE EDNT_MAKE_BIG_DECIMAL_METHOD = Qnil;
19
+ VALUE EDNT_TAGGED_ELEM_METHOD = Qnil;
20
+ VALUE EDNT_EXTENDED_VALUE_METHOD = Qnil;
21
+
22
+ VALUE EDNT_STRING_TO_I_METHOD = Qnil;
23
+ VALUE EDNT_STRING_TO_F_METHOD = Qnil;
21
24
 
22
25
  // returned when EOF - defined as a constant in EDN module
23
- VALUE EDNT_EOF = Qnil;
26
+ VALUE EDNT_EOF_CONST = Qnil;
24
27
 
25
28
  //
26
29
  // wrappers to hook the class w/ the C-api
@@ -136,16 +139,16 @@ void Init_edn_turbo(void)
136
139
  rb_define_method(rb_cParser, "ext_next", (VALUE(*)(ANYARGS)) &edn::next, 0 );
137
140
 
138
141
  // bind ruby methods we'll call - these should be defined in edn_turbo.rb
139
- edn::EDNT_MAKE_EDN_SYMBOL = rb_intern("make_edn_symbol");
140
- edn::EDNT_MAKE_SET_METHOD = rb_intern("make_set");
141
- edn::EDNT_TAGGED_ELEM = rb_intern("tagged_element");
142
- edn::EDNT_BIND_META_TO_VALUE = rb_intern("bind_metadata_to_value");
143
- edn::EDNT_STR_INT_TO_BIGNUM = rb_intern("string_int_to_bignum");
144
- edn::EDNT_STR_DBL_TO_BIGNUM = rb_intern("string_double_to_bignum");
142
+ edn::EDNT_MAKE_SYMBOL_METHOD = rb_intern("symbol");
143
+ edn::EDNT_MAKE_LIST_METHOD = rb_intern("list");
144
+ edn::EDNT_MAKE_SET_METHOD = rb_intern("set");
145
+ edn::EDNT_MAKE_BIG_DECIMAL_METHOD = rb_intern("big_decimal");
146
+ edn::EDNT_TAGGED_ELEM_METHOD = rb_intern("tagged_element");
147
+ edn::EDNT_EXTENDED_VALUE_METHOD = rb_intern("extend_for_meta");
145
148
 
146
- // so we can return EOF directly
147
- edn::EDNT_EOF = rb_const_get(edn::rb_mEDNT, rb_intern("EOF"));
149
+ edn::EDNT_STRING_TO_I_METHOD = rb_intern("to_i");
150
+ edn::EDNT_STRING_TO_F_METHOD = rb_intern("to_f");
148
151
 
149
- // import whatever else we've defined in the ruby side
150
- rb_require("edn_turbo/edn_parser");
152
+ // so we can return EOF directly
153
+ edn::EDNT_EOF_CONST = rb_const_get(edn::rb_mEDNT, rb_intern("EOF"));
151
154
  }
@@ -0,0 +1,14 @@
1
+ require 'edn'
2
+
3
+ module EDNT
4
+
5
+ # Object returned when there is nothing to return
6
+
7
+ NOTHING = EDN::NOTHING
8
+
9
+ # Object to return when we hit end of file. Cant be nil or :eof
10
+ # because either of those could be something in the EDN data.
11
+
12
+ EOF = EDN::EOF
13
+
14
+ end
@@ -1,9 +1,8 @@
1
1
  require 'edn'
2
+ require 'bigdecimal'
2
3
 
3
4
  module EDNT
4
5
 
5
- EOF = Object.new
6
-
7
6
  class Parser
8
7
 
9
8
  # initialize() is defined in the c-side (main.cc)
@@ -25,4 +24,8 @@ module EDNT
25
24
 
26
25
  end
27
26
 
27
+ def self.big_decimal(str)
28
+ BigDecimal.new(str)
29
+ end
30
+
28
31
  end
@@ -0,0 +1,46 @@
1
+ require 'edn'
2
+
3
+ module EDNT
4
+
5
+ # ----------------------------------------------------------------------------
6
+ # register a tagged element
7
+ #
8
+ TAGS = {
9
+ # built-in tagged elements
10
+ "inst" => lambda { |*a| DateTime.parse(*a) },
11
+ "uuid" => lambda { |*a| String.new(*a) }
12
+ }
13
+
14
+ def self.register(tag, func = nil, &block)
15
+ # don't allow re-registration of built-in tags
16
+ if tag != "inst" && tag != "uuid"
17
+ if block_given?
18
+ func = block
19
+ end
20
+
21
+ if func.nil?
22
+ func = lambda { |x| x }
23
+ end
24
+
25
+ if func.is_a?(Class)
26
+ TAGS[tag] = lambda { |*args| func.new(*args) }
27
+ else
28
+ TAGS[tag] = func
29
+ end
30
+ end
31
+ end
32
+
33
+ def self.unregister(tag)
34
+ TAGS[tag] = nil
35
+ end
36
+
37
+ def self.tagged_element(tag, element)
38
+ func = TAGS[tag]
39
+ if func
40
+ func.call(element)
41
+ else
42
+ EDN::Type::Unknown.new(tag, element)
43
+ end
44
+ end
45
+
46
+ end
@@ -0,0 +1,34 @@
1
+ require 'edn'
2
+
3
+ module EDNT
4
+
5
+ # ============================================================================
6
+ # emulate EDN::Metadata
7
+ module Metadata
8
+ attr_accessor :metadata
9
+ end
10
+
11
+ # ----------------------------------------------------------------------------
12
+ # bind the given meta to the value
13
+ #
14
+ def self.extend_for_meta(value, ext_meta)
15
+
16
+ meta = ext_meta
17
+
18
+ metadata = meta.reduce({}) do |acc, m|
19
+ case m
20
+ when Symbol then acc.merge(m => true)
21
+ when EDN::Type::Symbol then acc.merge(:tag => m)
22
+ else acc.merge(m)
23
+ end
24
+ end
25
+
26
+ if !metadata.empty?
27
+ value.extend Metadata
28
+ value.metadata = metadata
29
+ end
30
+
31
+ value
32
+ end
33
+
34
+ end
@@ -1,4 +1,4 @@
1
1
  module EDNT
2
- VERSION = '0.3.1'
3
- RELEASE_DATE = %q{2015-06-18}
2
+ VERSION = '0.3.2'
3
+ RELEASE_DATE = %q{2015-06-29}
4
4
  end
data/lib/edn_turbo.rb CHANGED
@@ -1,8 +1,10 @@
1
- require_relative 'edn_turbo/edn_parser'
1
+ require_relative 'edn_turbo/constants'
2
+ require_relative 'edn_turbo/tags'
3
+ require_relative 'edn_turbo/utils'
2
4
  require_relative 'edn_turbo/version'
5
+ require_relative 'edn_turbo/edn_parser'
3
6
  require_relative 'edn_turbo/edn_turbo'
4
7
 
5
- require 'date'
6
8
  require 'set'
7
9
  require 'edn'
8
10
 
@@ -23,102 +25,18 @@ module EDNT
23
25
  end
24
26
 
25
27
  # ----------------------------------------------------------------------------
26
- # register a tagged element
27
- #
28
- TAGS = {
29
- # built-in tagged elements
30
- "inst" => lambda { |*a| DateTime.parse(*a) },
31
- "uuid" => lambda { |*a| String.new(*a) }
32
- }
33
-
34
- def self.register(tag, func = nil, &block)
35
- # don't allow re-registration of built-in tags
36
- if tag != "inst" && tag != "uuid"
37
- if block_given?
38
- func = block
39
- end
40
-
41
- if func.nil?
42
- func = lambda { |x| x }
43
- end
44
-
45
- if func.is_a?(Class)
46
- TAGS[tag] = lambda { |*args| func.new(*args) }
47
- else
48
- TAGS[tag] = func
49
- end
50
- end
51
- end
52
-
53
- def self.unregister(tag)
54
- TAGS[tag] = nil
55
- end
56
-
57
- def self.tagged_element(tag, element)
58
- func = TAGS[tag]
59
- if func
60
- func.call(element)
61
- else
62
- EDN::Type::Unknown.new(tag, element)
63
- end
64
- end
65
-
66
- # ----------------------------------------------------------------------------
67
- # handles creation of a set from an array
68
- #
69
- def self.make_set(elems)
70
- Set.new(elems)
71
- end
72
-
73
- # ----------------------------------------------------------------------------
74
- # handles creation of an EDN::Type::Symbol
28
+ # handles creation of various EDN representations
75
29
  #
76
- def self.make_edn_symbol(elem)
30
+ def self.symbol(elem)
77
31
  EDN::Type::Symbol.new(elem)
78
32
  end
79
33
 
80
- # ----------------------------------------------------------------------------
81
- # to create Big Ints (for now)
82
- #
83
- def self.string_int_to_bignum(str)
84
- str.to_i
85
- end
86
-
87
- # ----------------------------------------------------------------------------
88
- # to create Big Ints (for now)
89
- #
90
- def self.string_double_to_bignum(str)
91
- str.to_f
92
- end
93
-
94
- # ============================================================================
95
- # emulate EDN::Metadata
96
- module Metadata
97
- attr_accessor :metadata
34
+ def self.list(*elems)
35
+ EDN::Type::List.new(*elems)
98
36
  end
99
37
 
100
- # ----------------------------------------------------------------------------
101
- # bind the given meta to the value
102
- #
103
- def self.bind_metadata_to_value(value, ext_meta)
104
-
105
- meta = ext_meta
106
-
107
- metadata = meta.reduce({}) do |acc, m|
108
- case m
109
- when Symbol then acc.merge(m => true)
110
- when EDN::Type::Symbol then acc.merge(:tag => m)
111
- else acc.merge(m)
112
- end
113
- end
114
-
115
- if !metadata.empty?
116
- value.extend Metadata
117
- value.metadata = metadata
118
- end
119
-
120
- value
38
+ def self.set(*elems)
39
+ Set.new(*elems)
121
40
  end
122
41
 
123
-
124
42
  end # EDN namespace
@@ -12,18 +12,47 @@ class EDNT_Test < Minitest::Test
12
12
  end
13
13
 
14
14
  def check_file(file, expected_output)
15
- File.open(file) { |file|
16
- assert_equal(expected_output, @parser.parse(file.read))
15
+ output = nil
16
+ File.open(file) { |source|
17
+ input = source.instance_of?(String) ? source : source.read
18
+
19
+ # test using parse() first
20
+ output = @parser.parse(input)
21
+ assert_equal(expected_output, output)
22
+
23
+ # now test setting the source and using read (although one-shot)
24
+ @parser.set_input(input)
25
+ output = @parser.read
26
+ assert_equal(expected_output, output)
17
27
  }
28
+ output
18
29
  end
19
30
 
20
- def test_basic
31
+ # ========================================================================================
32
+ # tests start here
33
+ #
34
+ def test_false
35
+ check_file('test/false.edn', false)
36
+ end
37
+
38
+ def test_tru
39
+ check_file('test/true.edn', true)
40
+ end
41
+
42
+ def test_nil
43
+ check_file('test/nil.edn', nil)
44
+ end
45
+
46
+ def test_char
47
+ check_file('test/char.edn', "\f")
48
+ end
49
+
50
+ def test_string
51
+ check_file('test/string.edn', "abc\"➪\u8226")
52
+ end
21
53
 
22
- assert_equal(false, @parser.parse('false'))
23
- assert_equal(true, @parser.parse('true'))
24
- assert_equal("a string", @parser.parse('"a string"'))
25
- assert_equal(:"namespace.of.some.length/keyword-name", @parser.parse(':namespace.of.some.length/keyword-name'))
26
- assert_equal(:'/', @parser.parse(':/'))
54
+ def test_keyword_with_namespace
55
+ check_file('test/keyword_with_namespace.edn', :"namespace.of.some.length/keyword-name")
27
56
  end
28
57
 
29
58
  def test_number
@@ -39,7 +68,7 @@ class EDNT_Test < Minitest::Test
39
68
  def test_keyword
40
69
 
41
70
  check_file('test/keyword.edn',
42
- [:key1, :"key_2/adsd2", :key_3, :"key-4", :"key_5/asd-32_ee"]
71
+ [:key1, :"key_2/adsd2", :key_3, :"key-4", :"key_5/asd-32_ee", :"#/:a"]
43
72
  )
44
73
  end
45
74
 
@@ -47,7 +76,7 @@ class EDNT_Test < Minitest::Test
47
76
 
48
77
  check_file('test/values.edn',
49
78
  [false, true, nil, "this is a test", "this\tis\\only\ta\ttest\rof\"various\nescaped\\values",
50
- "c", "\n", "\t",
79
+ ["c", "\n", "\t"],
51
80
  "123➪456®789"]
52
81
  )
53
82
  end
@@ -89,8 +118,12 @@ class EDNT_Test < Minitest::Test
89
118
  check_file('test/symbol.edn',
90
119
  [
91
120
  EDN::Type::Symbol.new("asymbol"),
121
+ EDN::Type::Symbol.new(".asymbol"),
92
122
  EDN::Type::Symbol.new("with'_a_'"),
93
123
  EDN::Type::Symbol.new("with.123"),
124
+ EDN::Type::Symbol.new("-with.123"),
125
+ EDN::Type::Symbol.new("/"),
126
+ EDN::Type::Symbol.new(">:FOuy/+"),
94
127
  ]
95
128
  )
96
129
 
@@ -112,13 +145,6 @@ class EDNT_Test < Minitest::Test
112
145
  )
113
146
  end
114
147
 
115
- def test_read
116
-
117
- # check read for using string
118
- assert_equal({:a=>1, :b=>2}, @parser.parse('{:a 1 :b 2}'))
119
-
120
- end
121
-
122
148
  def test_list
123
149
 
124
150
  check_file('test/list_1.edn',
@@ -143,15 +169,23 @@ class EDNT_Test < Minitest::Test
143
169
 
144
170
 
145
171
  def test_metadata
146
- f = EDNT::read(File.open('test/metadata.edn').read)
147
- assert_equal([98.6, 99.7], f)
172
+ f = check_file('test/metadata.edn', [98.6, 99.7])
148
173
  assert_equal({:doc=>"This is my vector", :rel=>:temps}, f.metadata)
174
+ end
149
175
 
150
- f = EDNT::read(File.open('test/metadata2.edn').read)
151
- assert_equal([1, 2], f)
176
+ def test_metadata2
177
+ f = check_file('test/metadata2.edn', [1, 2])
152
178
  assert_equal({:foo=>true, :tag=>EDN::Type::Symbol.new('String'), :bar=>2}, f.metadata)
153
179
  end
154
180
 
181
+ def test_metadata_in_vector
182
+ check_file('test/meta_in_vector.edn',
183
+ [ [ EDN::Type::Symbol.new('c'), :d, true ],
184
+ DateTime.rfc3339("1390-09-07T21:27:03+00:00")
185
+ ]
186
+ )
187
+ end
188
+
155
189
  #
156
190
  # for testing tagged element #edn_turbo/test_tagged
157
191
  class Tagged
@@ -171,7 +205,7 @@ class EDNT_Test < Minitest::Test
171
205
  Tagged.new(data).to_s
172
206
  end
173
207
 
174
- assert_equal([345, :a], @parser.parse('#edn_turbo/test_tagged { :item 345 :other :a }'))
208
+ check_file('test/tagged_elem.edn', [345, :a])
175
209
  end
176
210
 
177
211
  def test_operators
@@ -191,10 +225,6 @@ class EDNT_Test < Minitest::Test
191
225
  EDN::Type::Symbol.new('='),
192
226
  EDN::Type::Symbol.new('-'),
193
227
  EDN::Type::Symbol.new('+'),
194
- # [1, EDN::Type::Symbol.new('/'), 2],
195
- # [3, EDN::Type::Symbol.new('/'), 4],
196
- [5, EDN::Type::Symbol.new('/'), 6],
197
- [7, EDN::Type::Symbol.new('/'), 8]
198
228
  ]
199
229
  )
200
230
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: edn_turbo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ed Porras
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-18 00:00:00.000000000 Z
11
+ date: 2015-06-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: edn
@@ -75,12 +75,15 @@ files:
75
75
  - ext/edn_turbo/extconf.rb
76
76
  - ext/edn_turbo/main.cc
77
77
  - lib/edn_turbo.rb
78
+ - lib/edn_turbo/constants.rb
78
79
  - lib/edn_turbo/edn_parser.rb
80
+ - lib/edn_turbo/tags.rb
81
+ - lib/edn_turbo/utils.rb
79
82
  - lib/edn_turbo/version.rb
80
83
  - test/test_output_diff.rb
81
84
  homepage: http://rubygems.org/gems/edn_turbo
82
85
  licenses:
83
- - ''
86
+ - MIT
84
87
  metadata: {}
85
88
  post_install_message:
86
89
  rdoc_options: []