edn_turbo 0.3.3 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8a087faff28667fe082bf7562ae36b749db1ee77
4
- data.tar.gz: 50e07981c8864a7257a3a3fc99054b839719404c
3
+ metadata.gz: dee3d60eb30152a9410b1d125c8d6f2023c37001
4
+ data.tar.gz: 14e6a1cd7eb1b3d2a60d90574106763d7b2c39fd
5
5
  SHA512:
6
- metadata.gz: 2876add49e35091384d97a89ffd8d7f9306a08ebd4854443c21700c3417c1fea48806e2bcc7c582b752d810c6ab86ef2f9d7b146669e4713a54b2226db0f00a3
7
- data.tar.gz: fd59be0e552b7cf5d4932179553dc2ae971dee20cd927e2ef7c05a7f88c1bbc12827b95e94faa36c2d91dbd3df152b6e7c5fecd834cf0bb70a8fe6f8530168e4
6
+ metadata.gz: 5da016b9239aea39cbe482263e697b8072e458ee4e89b692eae1b0c7a255107124f169a315eaab62955ab2969a08028a06392b9fffe4600e951ee94c6548d575
7
+ data.tar.gz: 908e2484578f51a0c7ff96328e48e8b4c2f037d19430efd26297d6398e951e2d8a05073364ff87e77b3d857453817101b9da3c7a0458548bd370fbdefcb70528
data/README.md CHANGED
@@ -1,39 +1,44 @@
1
1
  edn_turbo
2
- ============
2
+ =========
3
3
 
4
- Ruby C-extension for parsing EDN files.
4
+ Fast Ragel-based EDN parser for Ruby.
5
5
 
6
- Written based on the functionality of
7
- [edn](https://github.com/relevance/edn-ruby) but with the goal of
8
- achieving much faster parsing.
6
+ `edn_turbo` is a parser plugin for
7
+ [edn](https://github.com/relevance/edn-ruby). With a few exceptions
8
+ `edn_turbo` provides the same functionality as the edn gem, but since
9
+ the `edn_turbo` parser is implemented in C, it is an order of
10
+ magintude faster.
9
11
 
10
- As of v0.2.0, `edn_turbo` requires `edn` to support tagged elements
11
- using a similar API and return types. Eventually, I'd like to bundle
12
- `edn_turbo` as an optional parser for `edn`.
13
12
 
14
13
  Some quick sample runs comparing time output of file reads using `edn`
15
14
  and `edn_turbo` (see [issue 12](https://github.com/relevance/edn-ruby/issues/12)):
16
15
 
17
- ```ruby
18
- irb(main):004:0> s = "[{\"x\" {\"id\" \"/model/952\", \"model_name\" \"person\", \"ancestors\" [\"record\" \"asset\"], \"format\" \"edn\"}, \"id\" 952, \"name\" nil, \"model_name\" \"person\", \"rel\" {}, \"description\" nil, \"age\" nil, \"updated_at\" nil, \"created_at\" nil, \"anniversary\" nil, \"job\" nil, \"start_date\" nil, \"username\" nil, \"vacation_start\" nil, \"vacation_end\" nil, \"expenses\" nil, \"rate\" nil, \"display_name\" nil, \"gross_profit_per_month\" nil}]"
16
+ ```irb(main):001:0> require 'benchmark'
17
+ => true
18
+ irb(main):002:0> require 'edn'
19
+ => true
20
+ irb(main):003:0> s = "[{\"x\" {\"id\" \"/model/952\", \"model_name\" \"person\", \"ancestors\" [\"record\" \"asset\"], \"format\" \"edn\"}, \"id\" 952, \"name\" nil, \"model_name\" \"person\", \"rel\" {}, \"description\" nil, \"age\" nil, \"updated_at\" nil, \"created_at\" nil, \"anniversary\" nil, \"job\" nil, \"start_date\" nil, \"username\" nil, \"vacation_start\" nil, \"vacation_end\" nil, \"expenses\" nil, \"rate\" nil, \"display_name\" nil, \"gross_profit_per_month\" nil}]"
19
21
  => "[{\"x\" {\"id\" \"/model/952\", \"model_name\" \"person\", \"ancestors\" [\"record\" \"asset\"], \"format\" \"edn\"}, \"id\" 952, \"name\" nil, \"model_name\" \"person\", \"rel\" {}, \"description\" nil, \"age\" nil, \"updated_at\" nil, \"created_at\" nil, \"anniversary\" nil, \"job\" nil, \"start_date\" nil, \"username\" nil, \"vacation_start\" nil, \"vacation_end\" nil, \"expenses\" nil, \"rate\" nil, \"display_name\" nil, \"gross_profit_per_month\" nil}]"
20
- irb(main):005:0> Benchmark.realtime { 100.times { EDN::read(s) } }
21
- => 0.0786
22
- irb(main):006:0> Benchmark.realtime { 100.times { EDNT::read(s) } }
23
- => 0.002991
24
- irb(main):007:0> Benchmark.realtime { 100000.times { EDN::read(s) } }
25
- => 72.421565
26
- irb(main):008:0> Benchmark.realtime { 100000.times { EDNT::read(s) } }
27
- => 2.993059
22
+ irb(main):004:0> Benchmark.realtime { 100.times { EDN::read(s) } }
23
+ => 0.083543
24
+ irb(main):005:0> Benchmark.realtime { 100000.times { EDN::read(s) } }
25
+ => 73.901049
26
+ irb(main):006:0> require 'edn_turbo'
27
+ => true
28
+ irb(main):007:0> Benchmark.realtime { 100.times { EDN::read(s) } }
29
+ => 0.007321
30
+ irb(main):008:0> Benchmark.realtime { 100000.times { EDN::read(s) } }
31
+ => 2.866411
28
32
  ```
29
33
 
34
+
30
35
  Dependencies
31
36
  ============
32
37
 
33
38
  - ruby gems:
34
- - [rake 10.3.2](http://rake.rubyforge.org)
35
- - [rake-compiler 0.9.2](http://rake-compiler.rubyforge.org)
36
- - [edn 1.0.7](https://github.com/relevance/edn-ruby)
39
+ - [rake 10.3](http://rake.rubyforge.org)
40
+ - [rake-compiler 0.9](http://rake-compiler.rubyforge.org)
41
+ - [edn 1.1](https://github.com/relevance/edn-ruby)
37
42
  - [icu4c](http://icu-project.org/apiref/icu4c/)
38
43
 
39
44
 
@@ -50,21 +55,22 @@ Notes:
50
55
  Usage
51
56
  =====
52
57
 
53
- Simlar to `edn-ruby`:
58
+ Simply require 'edn_turbo' instead of 'edn'. Otherwise (with the exceptions noted below)
59
+ the API is the same as the edn gem.
54
60
 
55
61
  ```ruby
56
62
  require 'edn_turbo'
57
63
 
58
64
  File.open(filename) do |file|
59
- output = EDNT.read(file)
65
+ output = EDN.read(file)
60
66
  pp output if output != EOF
61
67
  end
62
68
 
63
69
  # also accepts a string
64
- pp EDNT.read("[ 1 2 3 abc ]")
70
+ pp EDN.read("[ 1 2 3 abc ]")
65
71
 
66
72
  # metadata
67
- e = EDNT.read('^String ^:foo ^{:foo false :tag Boolean :bar 2} [1 2]')
73
+ e = EDN.read('^String ^:foo ^{:foo false :tag Boolean :bar 2} [1 2]')
68
74
  pp e # -> [1, 2]
69
75
  pp e.metadata # -> {:foo=>true, :tag=>#<EDN::Type::Symbol:0x007fdbea8a29b0 @symbol=:String>, :bar=>2}
70
76
 
@@ -75,7 +81,7 @@ Or instantiate and reuse an instance of a parser:
75
81
  ```ruby
76
82
  require 'edn_turbo'
77
83
 
78
- p = EDNT::Parser.new
84
+ p = EDN::new_parser
79
85
  File.open(filename) do |file|
80
86
  output = p.parse(file)
81
87
  pp output if output != EOF
@@ -98,9 +104,15 @@ Or instantiate and reuse an instance of a parser:
98
104
  end
99
105
  ```
100
106
 
107
+ Differences with edn gem
108
+ ========================
109
+ Currently, `edn_turbo` cannot read multiple EDN values from a stream
110
+ the way that `edn-ruby`'s parser can. `edn_turbo` expects string input
111
+ and has no way to control ruby streams of other types.
101
112
 
102
113
  Known problems
103
114
  ==============
115
+
104
116
  v0.3.2:
105
117
 
106
118
  - Some unhandled corner cases with operators and spacing
data/Rakefile CHANGED
@@ -13,6 +13,13 @@ RAGEL_PARSER_SRC_PATH = "#{EXT_PATH}/#{RAGEL_PARSER_SRC}"
13
13
  GEN_CC_PARSER_SRC = "edn_parser.cc"
14
14
  GEN_CC_PARSER_SRC_PATH = "#{EXT_PATH}/#{GEN_CC_PARSER_SRC}"
15
15
 
16
+ task :irb do
17
+ sh "irb -I lib -r edn_turbo"
18
+ sh "reset"
19
+ end
20
+
21
+ task :runthru => [:clean, :default, :test]
22
+
16
23
  Rake::ExtensionTask.new("#{NAME}") do |extension|
17
24
  extension.lib_dir = LIB_DIR
18
25
  extension.source_pattern = "*.{cc,h}"
@@ -2273,7 +2273,7 @@ tr5:
2273
2273
  // parse_value() read an element we care
2274
2274
  // about. Bind the metadata to it and add it to
2275
2275
  // the sequence
2276
- e = Parser::make_edn_type(EDNT_EXTENDED_VALUE_METHOD, e, ruby_meta());
2276
+ e = Parser::make_edn_type(rb_mEDNT, EDNT_EXTENDED_VALUE_METHOD, e, ruby_meta());
2277
2277
  rb_ary_push(elems, e);
2278
2278
  }
2279
2279
  } else {
@@ -2471,7 +2471,7 @@ tr5:
2471
2471
  // parse_value() read an element we care
2472
2472
  // about. Bind the metadata to it and add it to
2473
2473
  // the sequence
2474
- e = Parser::make_edn_type(EDNT_EXTENDED_VALUE_METHOD, e, ruby_meta());
2474
+ e = Parser::make_edn_type(rb_mEDNT, EDNT_EXTENDED_VALUE_METHOD, e, ruby_meta());
2475
2475
  rb_ary_push(elems, e);
2476
2476
  }
2477
2477
  } else {
@@ -2671,7 +2671,7 @@ tr5:
2671
2671
  // parse_value() read an element we care
2672
2672
  // about. Bind the metadata to it and add it to
2673
2673
  // the sequence
2674
- e = Parser::make_edn_type(EDNT_EXTENDED_VALUE_METHOD, e, ruby_meta());
2674
+ e = Parser::make_edn_type(rb_mEDNT, EDNT_EXTENDED_VALUE_METHOD, e, ruby_meta());
2675
2675
  rb_ary_push(elems, e);
2676
2676
  }
2677
2677
  } else {
@@ -2994,7 +2994,7 @@ tr5:
2994
2994
  // parse_value() read an element we care
2995
2995
  // about. Bind the metadata to it and add it to
2996
2996
  // the sequence
2997
- e = Parser::make_edn_type(EDNT_EXTENDED_VALUE_METHOD, e, ruby_meta());
2997
+ e = Parser::make_edn_type(rb_mEDNT, EDNT_EXTENDED_VALUE_METHOD, e, ruby_meta());
2998
2998
  rb_ary_push(elems, e);
2999
2999
  }
3000
3000
  } else {
@@ -3680,7 +3680,7 @@ tr4:
3680
3680
  // metadata sequence to it
3681
3681
  if (!meta_empty() && meta_size() == meta_sz) {
3682
3682
  // this will empty the metadata sequence too
3683
- result = Parser::make_edn_type(EDNT_EXTENDED_VALUE_METHOD, result, ruby_meta());
3683
+ result = Parser::make_edn_type(rb_mEDNT, EDNT_EXTENDED_VALUE_METHOD, result, ruby_meta());
3684
3684
  }
3685
3685
  {p = (( np))-1;}
3686
3686
  }
@@ -3849,7 +3849,7 @@ tr3:
3849
3849
  else {
3850
3850
  // a value was read and there's a pending metadata
3851
3851
  // sequence. Bind them.
3852
- value = Parser::make_edn_type(EDNT_EXTENDED_VALUE_METHOD, value, ruby_meta());
3852
+ value = Parser::make_edn_type(rb_mEDNT, EDNT_EXTENDED_VALUE_METHOD, value, ruby_meta());
3853
3853
  state = TOKEN_OK;
3854
3854
  }
3855
3855
  } else if (!discard.empty()) {
@@ -12,6 +12,7 @@
12
12
  namespace edn
13
13
  {
14
14
  extern VALUE rb_mEDNT;
15
+ extern VALUE EDN_MODULE_SYMBOL;
15
16
  extern VALUE EDNT_MAKE_SYMBOL_METHOD;
16
17
  extern VALUE EDNT_MAKE_LIST_METHOD;
17
18
  extern VALUE EDNT_MAKE_SET_METHOD;
@@ -92,6 +93,7 @@ namespace edn
92
93
 
93
94
  static VALUE make_edn_type(ID method, VALUE value);
94
95
  static VALUE make_edn_type(ID method, VALUE value1, VALUE value2);
96
+ static VALUE make_edn_type(VALUE module, ID method, VALUE value1, VALUE value2);
95
97
 
96
98
  // metadata
97
99
  VALUE ruby_meta();
@@ -600,7 +600,7 @@ const char* edn::Parser::parse_symbol(const char *p, const char *pe, VALUE& s)
600
600
  // parse_value() read an element we care
601
601
  // about. Bind the metadata to it and add it to
602
602
  // the sequence
603
- e = Parser::make_edn_type(EDNT_EXTENDED_VALUE_METHOD, e, ruby_meta());
603
+ e = Parser::make_edn_type(rb_mEDNT, EDNT_EXTENDED_VALUE_METHOD, e, ruby_meta());
604
604
  rb_ary_push(elems, e);
605
605
  }
606
606
  } else {
@@ -1089,7 +1089,7 @@ const char* edn::Parser::parse_meta(const char *p, const char *pe)
1089
1089
  // metadata sequence to it
1090
1090
  if (!meta_empty() && meta_size() == meta_sz) {
1091
1091
  // this will empty the metadata sequence too
1092
- result = Parser::make_edn_type(EDNT_EXTENDED_VALUE_METHOD, result, ruby_meta());
1092
+ result = Parser::make_edn_type(rb_mEDNT, EDNT_EXTENDED_VALUE_METHOD, result, ruby_meta());
1093
1093
  }
1094
1094
  fexec np;
1095
1095
  }
@@ -1151,7 +1151,7 @@ VALUE edn::Parser::parse(const char* src, std::size_t len)
1151
1151
  else {
1152
1152
  // a value was read and there's a pending metadata
1153
1153
  // sequence. Bind them.
1154
- value = Parser::make_edn_type(EDNT_EXTENDED_VALUE_METHOD, value, ruby_meta());
1154
+ value = Parser::make_edn_type(rb_mEDNT, EDNT_EXTENDED_VALUE_METHOD, value, ruby_meta());
1155
1155
  state = TOKEN_OK;
1156
1156
  }
1157
1157
  } else if (!discard.empty()) {
@@ -249,13 +249,20 @@ namespace edn
249
249
  // get a set representation from the ruby side. See edn_turbo.rb
250
250
  VALUE Parser::make_edn_type(ID method, VALUE sym)
251
251
  {
252
- prot_args args(rb_mEDNT, method, sym);
252
+ VALUE edn_module = rb_const_get(rb_cObject, edn::EDN_MODULE_SYMBOL);
253
+ prot_args args(edn_module, method, sym);
253
254
  return edn_prot_rb_funcall( edn_wrap_funcall2, reinterpret_cast<VALUE>(&args) );
254
255
  }
255
256
 
256
257
  VALUE Parser::make_edn_type(ID method, VALUE name, VALUE data)
257
258
  {
258
- prot_args args(rb_mEDNT, method, name, data);
259
+ VALUE module = rb_const_get(rb_cObject, edn::EDN_MODULE_SYMBOL);
260
+ return make_edn_type(module, method, name, data);
261
+ }
262
+
263
+ VALUE Parser::make_edn_type(VALUE module, ID method, VALUE name, VALUE data)
264
+ {
265
+ prot_args args(module, method, name, data);
259
266
  return edn_prot_rb_funcall( edn_wrap_funcall2, reinterpret_cast<VALUE>(&args) );
260
267
  }
261
268
 
@@ -13,7 +13,9 @@ namespace edn {
13
13
 
14
14
  VALUE rb_mEDNT;
15
15
 
16
- // methods on the ruby side we'll call from here
16
+ // Symbols used to call into the ruby world.
17
+ VALUE EDN_MODULE_SYMBOL = Qnil;
18
+
17
19
  VALUE EDNT_MAKE_SYMBOL_METHOD = Qnil;
18
20
  VALUE EDNT_MAKE_LIST_METHOD = Qnil;
19
21
  VALUE EDNT_MAKE_SET_METHOD = Qnil;
@@ -28,7 +30,7 @@ namespace edn {
28
30
  VALUE EDNT_EOF_CONST = Qnil;
29
31
 
30
32
  //
31
- // wrappers to hook the class w/ the C-api
33
+ // Wrappers to hook the class w/ the C-api.
32
34
  static void delete_parser(edn::Parser *ptr) {
33
35
  delete ptr;
34
36
  }
@@ -50,7 +52,7 @@ namespace edn {
50
52
 
51
53
 
52
54
  //
53
- // called by the constructor - sets the source if passed
55
+ // Called by the constructor - sets the source if passed.
54
56
  static VALUE initialize(int argc, VALUE* argv, VALUE self)
55
57
  {
56
58
  Parser* p = get_parser(self);
@@ -133,12 +135,14 @@ void Init_edn_turbo(void)
133
135
  VALUE rb_cParser = rb_define_class_under(edn::rb_mEDNT, "Parser", rb_cObject);
134
136
  rb_define_alloc_func(rb_cParser, edn::alloc_obj);
135
137
  rb_define_method(rb_cParser, "initialize", (VALUE(*)(ANYARGS)) &edn::initialize, -1 );
136
- rb_define_method(rb_cParser, "ext_set_stream", (VALUE(*)(ANYARGS)) &edn::set_source, 1 );
137
138
  rb_define_method(rb_cParser, "ext_eof", (VALUE(*)(ANYARGS)) &edn::eof, 0 );
138
- rb_define_method(rb_cParser, "ext_read", (VALUE(*)(ANYARGS)) &edn::read, 1 );
139
- rb_define_method(rb_cParser, "ext_next", (VALUE(*)(ANYARGS)) &edn::next, 0 );
139
+
140
+ rb_define_method(rb_cParser, "set_input", (VALUE(*)(ANYARGS)) &edn::set_source, 1 );
141
+ rb_define_method(rb_cParser, "parse", (VALUE(*)(ANYARGS)) &edn::read, 1 );
142
+ rb_define_method(rb_cParser, "read", (VALUE(*)(ANYARGS)) &edn::next, 0 );
140
143
 
141
144
  // bind ruby methods we'll call - these should be defined in edn_turbo.rb
145
+ edn::EDN_MODULE_SYMBOL = rb_intern("EDN");
142
146
  edn::EDNT_MAKE_SYMBOL_METHOD = rb_intern("symbol");
143
147
  edn::EDNT_MAKE_LIST_METHOD = rb_intern("list");
144
148
  edn::EDNT_MAKE_SET_METHOD = rb_intern("set");
@@ -150,5 +154,6 @@ void Init_edn_turbo(void)
150
154
  edn::EDNT_STRING_TO_F_METHOD = rb_intern("to_f");
151
155
 
152
156
  // so we can return EOF directly
153
- edn::EDNT_EOF_CONST = rb_const_get(edn::rb_mEDNT, rb_intern("EOF"));
157
+ VALUE edn_module = rb_const_get(rb_cObject, edn::EDN_MODULE_SYMBOL);
158
+ edn::EDNT_EOF_CONST = rb_const_get(edn_module, rb_intern("EOF"));
154
159
  }
@@ -1,31 +1,22 @@
1
- require 'edn'
2
- require 'bigdecimal'
3
-
4
1
  module EDNT
2
+ # Bind the given meta to the value.
3
+ def self.extend_for_meta(value, ext_meta)
5
4
 
6
- class Parser
7
-
8
- # initialize() is defined in the c-side (main.cc)
9
-
10
- # call the c-side method
11
- def set_input(data)
12
- ext_set_stream(data)
13
- end
5
+ meta = ext_meta
14
6
 
15
- # token-by-token read
16
- def read
17
- ext_next
7
+ metadata = meta.reduce({}) do |acc, m|
8
+ case m
9
+ when Symbol then acc.merge(m => true)
10
+ when EDN::Type::Symbol then acc.merge(:tag => m)
11
+ else acc.merge(m)
12
+ end
18
13
  end
19
14
 
20
- # entire stream read
21
- def parse(data)
22
- ext_read(data)
15
+ if !metadata.empty?
16
+ value.extend EDN::Metadata
17
+ value.metadata = metadata
23
18
  end
24
19
 
20
+ value
25
21
  end
26
-
27
- def self.big_decimal(str)
28
- BigDecimal.new(str)
29
- end
30
-
31
22
  end
@@ -1,4 +1,4 @@
1
1
  module EDNT
2
- VERSION = '0.3.3'
3
- RELEASE_DATE = %q{2015-07-07}
2
+ VERSION = '0.4.0'
3
+ RELEASE_DATE = %q{2015-07-31}
4
4
  end
data/lib/edn_turbo.rb CHANGED
@@ -1,42 +1,9 @@
1
- require_relative 'edn_turbo/constants'
2
- require_relative 'edn_turbo/tags'
3
- require_relative 'edn_turbo/utils'
4
- require_relative 'edn_turbo/version'
5
- require_relative 'edn_turbo/edn_parser'
6
- require_relative 'edn_turbo/edn_turbo'
7
-
8
- require 'set'
9
1
  require 'edn'
10
-
11
- module EDNT
12
-
13
- # ----------------------------------------------------------------------------
14
- # instantiate a parser (defined in the C-side) and parse the file
15
- #
16
- def self.read(input)
17
-
18
- begin
19
- data = input.instance_of?(String) ? input : input.read
20
-
21
- Parser.new.parse(data)
22
- rescue EOFError
23
- end
24
-
25
- end
26
-
27
- # ----------------------------------------------------------------------------
28
- # handles creation of various EDN representations
29
- #
30
- def self.symbol(elem)
31
- EDN::Type::Symbol.new(elem)
32
- end
33
-
34
- def self.list(*elems)
35
- EDN::Type::List.new(*elems)
36
- end
37
-
38
- def self.set(*elems)
39
- Set.new(*elems)
40
- end
41
-
42
- end # EDN namespace
2
+ require 'edn_turbo/version'
3
+ require 'edn_turbo/edn_parser'
4
+ require 'edn_turbo/edn_turbo'
5
+
6
+ # Replace the parser in the EDN module with the C based one.
7
+ module EDN
8
+ self.parser = EDNT::Parser
9
+ end
@@ -201,7 +201,7 @@ class EDNT_Test < Minitest::Test
201
201
 
202
202
  def test_tagged_elem
203
203
 
204
- EDNT.register("edn_turbo/test_tagged") do |data|
204
+ EDN.register("edn_turbo/test_tagged") do |data|
205
205
  Tagged.new(data).to_s
206
206
  end
207
207
 
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.3
4
+ version: 0.4.0
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-07-07 00:00:00.000000000 Z
11
+ date: 2015-07-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: edn
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.0'
19
+ version: '1.1'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.0'
26
+ version: '1.1'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0.9'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  description: Optimization for parsing of EDN files using ragel in a c++ extension
56
70
  email: ed@motologic.com
57
71
  executables:
@@ -75,10 +89,7 @@ files:
75
89
  - ext/edn_turbo/extconf.rb
76
90
  - ext/edn_turbo/main.cc
77
91
  - lib/edn_turbo.rb
78
- - lib/edn_turbo/constants.rb
79
92
  - lib/edn_turbo/edn_parser.rb
80
- - lib/edn_turbo/tags.rb
81
- - lib/edn_turbo/utils.rb
82
93
  - lib/edn_turbo/version.rb
83
94
  - test/test_output_diff.rb
84
95
  homepage: http://rubygems.org/gems/edn_turbo
@@ -1,14 +0,0 @@
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,46 +0,0 @@
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
@@ -1,34 +0,0 @@
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