edn_turbo 0.5.3 → 0.5.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,240 @@
1
+ #include <iostream>
2
+ #include <string>
3
+ #include <sstream>
4
+ #include <limits>
5
+
6
+ #include <ruby/ruby.h>
7
+ #include <ruby/encoding.h>
8
+
9
+ #include "util.h"
10
+ #include "util_unicode.h"
11
+
12
+ namespace edn
13
+ {
14
+ //
15
+ // used to determine max number of chars in string value of a type
16
+ template <typename T>
17
+ static std::size_t get_max_chars(T)
18
+ {
19
+ std::stringstream s;
20
+ s << std::fixed << std::numeric_limits<T>::max();
21
+ return s.str().length();
22
+ }
23
+
24
+ static const std::size_t LL_max_chars = get_max_chars<>((long) 1);
25
+ static const std::size_t LD_max_chars = get_max_chars<>((double) 1);
26
+
27
+ //
28
+ // throw runtime error
29
+ static void throw_error(int error)
30
+ {
31
+ if (error == 0)
32
+ return;
33
+
34
+ VALUE err = rb_errinfo();
35
+ rb_raise(CLASS_OF(err), "%s", RSTRING_PTR(rb_obj_as_string(err)));
36
+ }
37
+
38
+ // =================================================================
39
+ // work-around for idiotic rb_protect convention in order to avoid
40
+ // using ruby/rice
41
+ //
42
+ typedef VALUE (edn_rb_f_type)( VALUE arg );
43
+
44
+ // we're using at most 2 args
45
+ struct prot_args {
46
+ prot_args(VALUE r, ID m) :
47
+ receiver(r), method(m), count(0) {
48
+ }
49
+ prot_args(VALUE r, ID m, VALUE arg) :
50
+ receiver(r), method(m), count(1) {
51
+ args[0] = arg;
52
+ }
53
+ prot_args(VALUE r, ID m, VALUE arg1, VALUE arg2) :
54
+ receiver(r), method(m), count(2) {
55
+ args[0] = arg1;
56
+ args[1] = arg2;
57
+ }
58
+
59
+ VALUE call() const {
60
+ return ((count == 0) ?
61
+ rb_funcall( receiver, method, 0 ) :
62
+ rb_funcall2( receiver, method, count, args ));
63
+ }
64
+
65
+ private:
66
+ VALUE receiver;
67
+ ID method;
68
+ int count;
69
+ VALUE args[2];
70
+ };
71
+
72
+ // this allows us to wrap with rb_protect()
73
+ static inline VALUE edn_wrap_funcall2( VALUE arg ) {
74
+ const prot_args* a = reinterpret_cast<const prot_args*>(arg);
75
+ if (a)
76
+ return a->call();
77
+ return Qnil;
78
+ }
79
+
80
+ static inline VALUE edn_prot_rb_funcall( edn_rb_f_type func, VALUE args ) {
81
+ int error;
82
+ VALUE s = rb_protect( func, args, &error );
83
+ if (error) throw_error(error);
84
+ return s;
85
+ }
86
+
87
+ static inline VALUE edn_prot_rb_new_str(const char* str) {
88
+ int error;
89
+ VALUE s = rb_protect( reinterpret_cast<VALUE (*)(VALUE)>(rb_str_new_cstr),
90
+ reinterpret_cast<VALUE>(str), &error );
91
+ if (error) throw_error(error);
92
+ return s;
93
+ }
94
+
95
+ static inline VALUE edn_rb_enc_associate_utf8(VALUE str) {
96
+ return rb_enc_associate(str, rb_utf8_encoding() );
97
+ }
98
+
99
+ // =================================================================
100
+ // utils
101
+ namespace util
102
+ {
103
+ // utility method to convert a primitive in string form to a
104
+ // ruby type
105
+ template <class T>
106
+ static inline T buftotype(const char* p, std::size_t len) {
107
+ T val;
108
+ std::string buf;
109
+ buf.append(p, len);
110
+ std::istringstream(buf) >> val;
111
+ return val;
112
+ }
113
+
114
+ //
115
+ // convert to int.. if string rep has more digits than long can
116
+ // hold, call into ruby to get a big num
117
+ VALUE integer_to_ruby(const char* str, std::size_t len)
118
+ {
119
+ // if something bigger than a long is needed, call into
120
+ // ruby side to get the correct value
121
+ if (str[len-1] == 'M' || len >= LL_max_chars)
122
+ {
123
+ std::string buf(str, len);
124
+ VALUE vs = edn_prot_rb_new_str(buf.c_str());
125
+ prot_args args(vs, RUBY_STRING_TO_I_METHOD);
126
+ return edn_prot_rb_funcall( edn_wrap_funcall2, reinterpret_cast<VALUE>(&args) );
127
+ }
128
+
129
+ return LONG2NUM(buftotype<long>(str, len));
130
+ }
131
+
132
+ //
133
+ // as above.. TODO: check exponential..
134
+ VALUE float_to_ruby(const char* str, std::size_t len)
135
+ {
136
+ // if big decimal is needed, call into ruby side to get
137
+ // the correct value
138
+ if (str[len-1] == 'M' || len >= LD_max_chars)
139
+ {
140
+ std::string buf(str, len);
141
+ VALUE vs = edn_prot_rb_new_str(buf.c_str());
142
+
143
+ if (str[len-1] == 'M') {
144
+ return call_module_fn(rb_mEDN, EDN_MAKE_BIG_DECIMAL_METHOD, vs);
145
+ }
146
+
147
+ prot_args args(vs, RUBY_STRING_TO_F_METHOD);
148
+ return edn_prot_rb_funcall( edn_wrap_funcall2, reinterpret_cast<VALUE>(&args) );
149
+ }
150
+
151
+ return rb_float_new(buftotype<double>(str, len));
152
+ }
153
+
154
+
155
+ //
156
+ // read from a StringIO - expensive!!!
157
+ //
158
+ VALUE ruby_io_read(VALUE io)
159
+ {
160
+ prot_args args(io, RUBY_READ_METHOD);
161
+ return edn_prot_rb_funcall( edn_wrap_funcall2, reinterpret_cast<VALUE>(&args) );
162
+ }
163
+
164
+ //
165
+ // copies the string data, unescaping any present values that need to be replaced
166
+ //
167
+ bool parse_byte_stream(const char *p_start, const char *p_end, VALUE& v_utf8, bool encode)
168
+ {
169
+ if (p_end > p_start) {
170
+ std::string buf;
171
+
172
+ if (encode) {
173
+ if (!util::unicode::to_utf8(p_start, (uint32_t) (p_end - p_start), buf))
174
+ return false;
175
+ }
176
+ else {
177
+ buf.append(p_start, p_end - p_start);
178
+ }
179
+
180
+ // utf-8 encode
181
+ VALUE vs = edn_prot_rb_new_str(buf.c_str());
182
+ int error;
183
+ v_utf8 = rb_protect( edn_rb_enc_associate_utf8, vs, &error);
184
+ if (error) throw_error(error);
185
+ return true;
186
+ } else if (p_end == p_start) {
187
+ v_utf8 = rb_str_new("", 0);
188
+ return true;
189
+ }
190
+
191
+ return false;
192
+ }
193
+
194
+ //
195
+ // handles things like \c, \newline
196
+ //
197
+ bool parse_escaped_char(const char *p, const char *pe, VALUE& v)
198
+ {
199
+ std::string buf;
200
+ std::size_t len = pe - p;
201
+ buf.append(p, len);
202
+
203
+ if (len > 1) {
204
+ if (buf == "newline") buf = '\n';
205
+ else if (buf == "tab") buf = '\t';
206
+ else if (buf == "return") buf = '\r';
207
+ else if (buf == "space") buf = ' ';
208
+ else if (buf == "formfeed") buf = '\f';
209
+ else if (buf == "backspace") buf = '\b';
210
+ // TODO: is this supported?
211
+ else if (buf == "verticaltab") buf = '\v';
212
+ else return false;
213
+ }
214
+
215
+ v = edn_prot_rb_new_str( buf.c_str() );
216
+ return true;
217
+ }
218
+
219
+
220
+ //
221
+ // get a set representation from the ruby side. See edn_turbo.rb
222
+ VALUE call_module_fn(VALUE module, ID method)
223
+ {
224
+ prot_args args(module, method);
225
+ return edn_prot_rb_funcall( edn_wrap_funcall2, reinterpret_cast<VALUE>(&args) );
226
+ }
227
+
228
+ VALUE call_module_fn(VALUE module, ID method, VALUE value)
229
+ {
230
+ prot_args args(module, method, value);
231
+ return edn_prot_rb_funcall( edn_wrap_funcall2, reinterpret_cast<VALUE>(&args) );
232
+ }
233
+
234
+ VALUE call_module_fn(VALUE module, ID method, VALUE name, VALUE data)
235
+ {
236
+ prot_args args(module, method, name, data);
237
+ return edn_prot_rb_funcall( edn_wrap_funcall2, reinterpret_cast<VALUE>(&args) );
238
+ }
239
+ }
240
+ }
@@ -0,0 +1,39 @@
1
+ #pragma once
2
+
3
+ namespace edn
4
+ {
5
+ extern VALUE rb_mEDN;
6
+ extern VALUE rb_mEDNT;
7
+
8
+ extern VALUE EDN_MAKE_SYMBOL_METHOD;
9
+ extern VALUE EDN_MAKE_LIST_METHOD;
10
+ extern VALUE EDN_MAKE_SET_METHOD;
11
+ extern VALUE EDN_MAKE_BIG_DECIMAL_METHOD;
12
+ extern VALUE EDN_TAGGED_ELEM_METHOD;
13
+ extern VALUE EDN_EOF_CONST;
14
+
15
+ extern VALUE EDNT_EXTENDED_VALUE_METHOD;
16
+
17
+ extern VALUE RUBY_STRING_TO_I_METHOD;
18
+ extern VALUE RUBY_STRING_TO_F_METHOD;
19
+ extern VALUE RUBY_READ_METHOD;
20
+
21
+ namespace util
22
+ {
23
+ // defined in edn_parser_util.cc
24
+ VALUE integer_to_ruby(const char* str, std::size_t len);
25
+ VALUE float_to_ruby (const char* str, std::size_t len);
26
+
27
+ VALUE ruby_io_read(VALUE io);
28
+
29
+ bool parse_byte_stream (const char *p, const char *pe, VALUE& rslt, bool encode);
30
+ bool parse_escaped_char(const char *p, const char *pe, VALUE& rslt);
31
+
32
+ VALUE call_module_fn(VALUE module, ID method);
33
+ VALUE call_module_fn(VALUE module, ID method, VALUE value);
34
+ VALUE call_module_fn(VALUE module, ID method, VALUE value1, VALUE value2);
35
+
36
+ // edn_parser_util_unicode.cc
37
+ bool to_utf8(const char *s, uint32_t len, std::string& rslt);
38
+ }
39
+ }
@@ -0,0 +1,36 @@
1
+ #include <string>
2
+
3
+ //
4
+ // needed to define this in its own file because icu and ruby have
5
+ // differing definitions for Uchar and the compiler complains
6
+ //
7
+ #include <unicode/utypes.h>
8
+ #include <unicode/ustring.h>
9
+ #include <unicode/ucnv.h>
10
+ #include <unicode/unistr.h>
11
+
12
+ #include "util_unicode.h"
13
+
14
+ namespace edn
15
+ {
16
+ namespace util
17
+ {
18
+ namespace unicode
19
+ {
20
+ //
21
+ // unescapes any values that need to be replaced, saves it to utf8
22
+ //
23
+ bool to_utf8(const char *s, uint32_t len, std::string& rslt)
24
+ {
25
+ icu::UnicodeString ustr(s, len);
26
+
27
+ if (ustr.isBogus()) {
28
+ return false;
29
+ }
30
+
31
+ ustr.unescape().toUTF8String(rslt);
32
+ return true;
33
+ }
34
+ }
35
+ }
36
+ }
@@ -0,0 +1,14 @@
1
+ #pragma once
2
+
3
+ #include <string>
4
+
5
+ namespace edn
6
+ {
7
+ namespace util
8
+ {
9
+ namespace unicode
10
+ {
11
+ bool to_utf8(const char *s, uint32_t len, std::string& rslt);
12
+ }
13
+ }
14
+ }
@@ -1,18 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # methods specific to edn_turbo
1
5
  module EDNT
2
6
  # Bind the given meta to the value.
3
7
  def self.extend_for_meta(value, ext_meta)
4
-
5
8
  meta = ext_meta
6
9
 
7
10
  metadata = meta.reduce({}) do |acc, m|
8
11
  case m
9
12
  when Symbol then acc.merge(m => true)
10
- when EDN::Type::Symbol then acc.merge(:tag => m)
13
+ when EDN::Type::Symbol then acc.merge(tag: m)
11
14
  else acc.merge(m)
12
15
  end
13
16
  end
14
17
 
15
- if !metadata.empty?
18
+ unless metadata.empty?
16
19
  value.extend EDN::Metadata
17
20
  value.metadata = metadata
18
21
  end
@@ -1,4 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module EDNT
2
- VERSION = '0.5.3'
3
- RELEASE_DATE = '2017-08-16'
4
+ VERSION = '0.5.4'
5
+ RELEASE_DATE = '2017-12-29'
4
6
  end
data/lib/edn_turbo.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'edn'
2
4
  require 'edn_turbo/version'
3
5
  require 'edn_turbo/edn_parser'
@@ -1,12 +1,11 @@
1
1
  #!/usr/bin/env ruby
2
2
  # -*- coding: utf-8 -*-
3
- $LOAD_PATH << File.expand_path( File.dirname(__FILE__) + '/../lib' )
3
+ $LOAD_PATH << File.expand_path(File.dirname(__FILE__) + '/../lib')
4
4
  require 'minitest/autorun'
5
5
  require 'edn_turbo'
6
6
  require 'date'
7
7
 
8
8
  class EDNT_Test < Minitest::Test
9
-
10
9
  def setup
11
10
  @parser = EDNT::Parser.new
12
11
  end
@@ -47,7 +46,7 @@ class EDNT_Test < Minitest::Test
47
46
  output
48
47
  end
49
48
 
50
- # ========================================================================================
49
+ # ============================================================================
51
50
  # tests start here
52
51
  #
53
52
  def test_false
@@ -95,8 +94,8 @@ class EDNT_Test < Minitest::Test
95
94
 
96
95
  check_file('test/values.edn',
97
96
  [false, true, nil, "this is a test", "this\tis\\only\ta\ttest\rof\"various\nescaped\\values",
98
- ["c", "\n", "\t"],
99
- "123➪456®789"]
97
+ ['c', "\n", "\t"],
98
+ '123➪456®789']
100
99
  )
101
100
  end
102
101
 
@@ -104,103 +103,94 @@ class EDNT_Test < Minitest::Test
104
103
 
105
104
  check_file('test/inst.edn',
106
105
  [
107
- DateTime.rfc3339("1985-04-12T23:20:50.52Z"),
108
- DateTime.rfc3339("1996-12-19T16:39:57-08:00"),
109
- DateTime.rfc3339("1990-12-31T23:59:60Z"),
110
- DateTime.rfc3339("1990-12-31T15:59:60-08:00"),
111
- DateTime.rfc3339("1937-01-01T12:00:27.87+00:20")
106
+ DateTime.rfc3339('1985-04-12T23:20:50.52Z'),
107
+ DateTime.rfc3339('1996-12-19T16:39:57-08:00'),
108
+ DateTime.rfc3339('1990-12-31T23:59:60Z'),
109
+ DateTime.rfc3339('1990-12-31T15:59:60-08:00'),
110
+ DateTime.rfc3339('1937-01-01T12:00:27.87+00:20')
112
111
  ]
113
112
  )
114
113
  end
115
114
 
116
115
  def test_builtin_tagged_uuid
117
116
 
118
- check_file('test/uuid.edn', "f81d4fae-7dec-11d0-a765-00a0c91e6bf6")
117
+ check_file('test/uuid.edn', 'f81d4fae-7dec-11d0-a765-00a0c91e6bf6')
119
118
 
120
119
  end
121
120
 
122
121
  def test_sets
123
-
124
122
  check_file('test/set.edn',
125
123
  [ Set.new(),
126
124
  Set.new([1, Set.new([:abc])]),
127
125
  Set.new([1]),
128
- Set.new([1, "abc" ]),
129
- Set.new([1, 2, 3, [4, 5], "abc", 23.3])
126
+ Set.new([1, 'abc' ]),
127
+ Set.new([1, 2, 3, [4, 5], 'abc', 23.3])
130
128
  ]
131
129
  )
132
-
133
130
  end
134
131
 
135
132
  def test_symbol
136
-
137
133
  check_file('test/symbol.edn',
138
134
  [
139
- EDN::Type::Symbol.new("asymbol"),
140
- EDN::Type::Symbol.new(".asymbol"),
135
+ EDN::Type::Symbol.new('asymbol'),
136
+ EDN::Type::Symbol.new('.asymbol'),
141
137
  EDN::Type::Symbol.new("with'_a_'"),
142
- EDN::Type::Symbol.new("with.123"),
143
- EDN::Type::Symbol.new("-with.123"),
144
- EDN::Type::Symbol.new("/"),
145
- EDN::Type::Symbol.new(">:FOuy/+"),
138
+ EDN::Type::Symbol.new('with.123'),
139
+ EDN::Type::Symbol.new('-with.123'),
140
+ EDN::Type::Symbol.new('/'),
141
+ EDN::Type::Symbol.new('>:FOuy/+'),
146
142
  ]
147
143
  )
148
-
149
144
  end
150
145
 
151
146
  def test_unicode
152
-
153
147
  check_file('test/unicode.edn',
154
148
  [:text,
155
149
  "Page \u0018, October 2009 TechTIPS",
156
- "This should be an unfilled star: ☆"]
150
+ 'This should be an unfilled star: ☆']
157
151
  )
158
152
  end
159
153
 
160
154
  def test_vector
161
-
162
155
  check_file('test/vector_1.edn',
163
- [true, true, 34, [true, nil, "", "", :test, [3213.23]]]
156
+ [true, true, 34, [true, nil, '', '', :test, [3213.23]]]
164
157
  )
165
158
  end
166
159
 
167
160
  def test_list
168
-
169
161
  check_file('test/list_1.edn',
170
- [22, 3312, "dss", {:powerpuff=>[:buttercup, :bubbles, :blossom]}]
162
+ [22, 3312, 'dss', {:powerpuff=>[:buttercup, :bubbles, :blossom]}]
171
163
  )
172
-
173
164
  end
174
165
 
175
166
  def test_map
176
-
177
167
  check_file('test/map1.edn',
178
- {:key_a1=>true,:key_a2=>false,:key_a3=>[1, 2, 3, "test string", nil, {1=>2}],
179
- :key_a4=>{:key_a31=>23, :key_a32=>24.4},"string_key"=>:kval,
180
- :embedded=>[true, {:c2g_md5=>"2bbee1cd3045710db6fec432b00d1e0c"}],
168
+ {:key_a1=>true,:key_a2=>false,:key_a3=>[1, 2, 3, 'test string', nil, {1=>2}],
169
+ :key_a4=>{:key_a31=>23, :key_a32=>24.4},'string_key'=>:kval,
170
+ :embedded=>[true, {:c2g_md5=>'2bbee1cd3045710db6fec432b00d1e0c'}],
181
171
  2=>{:a=>:b}}
182
172
  )
183
173
 
184
174
  check_file('test/map2.edn',
185
- {:int=>1, :string=>"hello", :char=>"a", :array=>[0, 1], :hash=>{:key=>"value"}}
175
+ {int: 1, string: 'hello', char: 'a', array: [0, 1], hash: {key: 'value'}}
186
176
  )
187
177
  end
188
178
 
189
179
 
190
180
  def test_metadata
191
181
  f = check_file('test/metadata.edn', [98.6, 99.7])
192
- assert_equal({:doc=>"This is my vector", :rel=>:temps}, f.metadata)
182
+ assert_equal({:doc=>'This is my vector', rel: :temps}, f.metadata)
193
183
  end
194
184
 
195
185
  def test_metadata2
196
186
  f = check_file('test/metadata2.edn', [1, 2])
197
- assert_equal({:foo=>true, :tag=>EDN::Type::Symbol.new('String'), :bar=>2}, f.metadata)
187
+ assert_equal({ foo: true, tag: EDN::Type::Symbol.new('String'), bar: 2 }, f.metadata)
198
188
  end
199
189
 
200
190
  def test_metadata_in_vector
201
191
  check_file('test/meta_in_vector.edn',
202
192
  [ [ EDN::Type::Symbol.new('c'), :d, true ],
203
- DateTime.rfc3339("1390-09-07T21:27:03+00:00")
193
+ DateTime.rfc3339('1390-09-07T21:27:03+00:00')
204
194
  ]
205
195
  )
206
196
  end
@@ -220,7 +210,7 @@ class EDNT_Test < Minitest::Test
220
210
 
221
211
  def test_tagged_elem
222
212
 
223
- EDN.register("edn_turbo/test_tagged") do |data|
213
+ EDN.register('edn_turbo/test_tagged') do |data|
224
214
  Tagged.new(data).to_s
225
215
  end
226
216
 
@@ -257,7 +247,7 @@ class EDNT_Test < Minitest::Test
257
247
  end
258
248
 
259
249
  REF_MAP3_DATA = {:meta=>{:data_format_version=>304,
260
- :filename=>"test/colorspan.pdf",
250
+ :filename=>'test/colorspan.pdf',
261
251
  :is_ok=>true,
262
252
  :font_engine_ok=>true,
263
253
  :pdf_ver_major=>1,
@@ -388,7 +378,7 @@ class EDNT_Test < Minitest::Test
388
378
  end
389
379
 
390
380
  def test_ruby_file_io
391
- File.open("test/true.edn", "r") do |f|
381
+ File.open('test/true.edn', 'r') do |f|
392
382
  # now test setting the source and using read (although one-shot)
393
383
  @parser.set_input(f)
394
384
  output = @parser.read
@@ -397,12 +387,12 @@ class EDNT_Test < Minitest::Test
397
387
  end
398
388
 
399
389
  def test_ruby_file_io_long
400
- File.open("test/map3.edn", "r") do |f|
401
- # now test setting the source and using read (although one-shot)
402
- @parser.set_input(f)
403
- output = @parser.read
404
- assert_equal(REF_MAP3_DATA, output)
405
- end
390
+ File.open('test/map3.edn', 'r') do |f|
391
+ # now test setting the source and using read (although one-shot)
392
+ @parser.set_input(f)
393
+ output = @parser.read
394
+ assert_equal(REF_MAP3_DATA, output)
395
+ end
406
396
  end
407
397
 
408
398
  def test_ruby_string_io
@@ -415,11 +405,10 @@ class EDNT_Test < Minitest::Test
415
405
 
416
406
  def test_init_arg
417
407
  # test passing IO to constructor
418
- File.open("test/map3.edn", "r") do |f|
408
+ File.open('test/map3.edn', 'r') do |f|
419
409
  p = EDNT::Parser.new(f)
420
410
  output = p.read
421
411
  assert_equal(REF_MAP3_DATA, output)
422
412
  end
423
413
  end
424
-
425
414
  end
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.5.3
4
+ version: 0.5.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ed Porras
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-08-16 00:00:00.000000000 Z
11
+ date: 2017-12-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: edn
@@ -83,13 +83,15 @@ files:
83
83
  - bin/ppedn-ruby
84
84
  - ext/edn_turbo/depend
85
85
  - ext/edn_turbo/edn_parser.cc
86
- - ext/edn_turbo/edn_parser.h
87
86
  - ext/edn_turbo/edn_parser.rl
88
- - ext/edn_turbo/edn_parser_util.cc
89
- - ext/edn_turbo/edn_parser_util.h
90
- - ext/edn_turbo/edn_parser_util_unicode.cc
91
87
  - ext/edn_turbo/extconf.rb
92
88
  - ext/edn_turbo/main.cc
89
+ - ext/edn_turbo/parser.h
90
+ - ext/edn_turbo/parser_def.cc
91
+ - ext/edn_turbo/util.cc
92
+ - ext/edn_turbo/util.h
93
+ - ext/edn_turbo/util_unicode.cc
94
+ - ext/edn_turbo/util_unicode.h
93
95
  - lib/edn_turbo.rb
94
96
  - lib/edn_turbo/edn_parser.rb
95
97
  - lib/edn_turbo/version.rb
@@ -114,7 +116,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
114
116
  version: '0'
115
117
  requirements: []
116
118
  rubyforge_project:
117
- rubygems_version: 2.5.2
119
+ rubygems_version: 2.6.11
118
120
  signing_key:
119
121
  specification_version: 3
120
122
  summary: Read EDN files