fast_trie 0.5.0 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d100a816d2493736f2d1f351d8bd0def2916b366
4
+ data.tar.gz: a0d1ef512cc1ed7a2bddbf41a38749748f8b6bdb
5
+ SHA512:
6
+ metadata.gz: d75a83ba5eb51fbb6037e3cb6273bbfc334d434bcab7e57978f15fe21c0040483cfd31a1af57e53c35b4bfc6d4fa1ffc271a23b3d8acd7be605e0e8a8f9adb29
7
+ data.tar.gz: 284623b2d2986f2c67f10143f8d043ffe0872b42cdaeca6b2ae10cb232b9867f2bc85b929dba5260046a8be9ed1114aa33d63a2e2cd89d87ee55e7d34bf29bff
@@ -0,0 +1,69 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ addressable (2.3.5)
5
+ builder (3.2.2)
6
+ descendants_tracker (0.0.3)
7
+ diff-lcs (1.2.5)
8
+ faraday (0.9.0)
9
+ multipart-post (>= 1.2, < 3)
10
+ git (1.2.6)
11
+ github_api (0.11.2)
12
+ addressable (~> 2.3)
13
+ descendants_tracker (~> 0.0.1)
14
+ faraday (~> 0.8, < 0.10)
15
+ hashie (>= 1.2)
16
+ multi_json (>= 1.7.5, < 2.0)
17
+ nokogiri (~> 1.6.0)
18
+ oauth2
19
+ hashie (2.0.5)
20
+ highline (1.6.20)
21
+ jeweler (2.0.1)
22
+ builder
23
+ bundler (>= 1.0)
24
+ git (>= 1.2.5)
25
+ github_api
26
+ highline (>= 1.6.15)
27
+ nokogiri (>= 1.5.10)
28
+ rake
29
+ rdoc
30
+ json (1.8.1)
31
+ jwt (0.1.11)
32
+ multi_json (>= 1.5)
33
+ mini_portile (0.5.2)
34
+ multi_json (1.8.4)
35
+ multi_xml (0.5.5)
36
+ multipart-post (2.0.0)
37
+ nokogiri (1.6.1-x86-mingw32)
38
+ mini_portile (~> 0.5.0)
39
+ oauth2 (0.9.3)
40
+ faraday (>= 0.8, < 0.10)
41
+ jwt (~> 0.1.8)
42
+ multi_json (~> 1.3)
43
+ multi_xml (~> 0.5)
44
+ rack (~> 1.2)
45
+ rack (1.5.2)
46
+ rake (10.1.1)
47
+ rake-compiler (0.9.2)
48
+ rake
49
+ rdoc (3.12.2)
50
+ json (~> 1.4)
51
+ rspec (2.14.1)
52
+ rspec-core (~> 2.14.0)
53
+ rspec-expectations (~> 2.14.0)
54
+ rspec-mocks (~> 2.14.0)
55
+ rspec-core (2.14.7)
56
+ rspec-expectations (2.14.5)
57
+ diff-lcs (>= 1.1.3, < 2.0)
58
+ rspec-mocks (2.14.5)
59
+
60
+ PLATFORMS
61
+ x86-mingw32
62
+
63
+ DEPENDENCIES
64
+ bundler (~> 1.0)
65
+ jeweler (~> 2.0.1)
66
+ rake
67
+ rake-compiler
68
+ rdoc (~> 3.12)
69
+ rspec
@@ -1,6 +1,8 @@
1
1
  h1. Trie
2
2
 
3
- This is a trie for Ruby using libdatrie. It uses a dual-array system, meaning it has best-in-class memory usage and search time.
3
+ !https://badge.fury.io/rb/fast_trie.svg!:https://rubygems.org/gems/fast_trie !https://travis-ci.org/tyler/trie.svg!:https://travis-ci.org/tyler/trie
4
+
5
+ This is a trie for Ruby using "libdatrie":http://linux.thai.net/~thep/datrie/. It uses a dual-array system, meaning it has best-in-class memory usage and search time.
4
6
 
5
7
 
6
8
  h2. What is a trie?
@@ -19,12 +21,20 @@ But in short a trie is a data structure that holds strings in a tree. So if you
19
21
 
20
22
  It's easy to see how this can have pretty neat implications for things like searching through lists of strings, sorting lists of strings, and things like spelling correction and autocompletion.
21
23
 
24
+ h2. Installation
25
+
26
+ From RubyGems https://rubygems.org/gems/fast_trie
27
+
28
+ <pre><code>
29
+ gem install fast_trie
30
+ </code></pre>
22
31
 
23
32
  h2. Tutorial
24
33
 
25
- Let's go through building a simple autocompleter using Trie.
34
+ Let's go through building a simple autocompleter using "Trie":http://rubydoc.info/gems/fast_trie/Trie object.
26
35
 
27
36
  <pre><code>
37
+ require 'trie'
28
38
  Trie.new
29
39
  </code></pre>
30
40
 
@@ -85,8 +95,9 @@ There are, of course, some more interesting and advanced ways to use a trie. Fo
85
95
  end
86
96
  </code></pre>
87
97
 
88
- By calling <code>root</code> on a Trie object, you get a TrieNode, pointed at the root of the trie. You can then use this node to walk the trie and perceive things about each word.
98
+ By calling <code>root</code> on a Trie, you get a "TrieNode":http://rubydoc.info/gems/fast_trie/TrieNode, pointed at the root of the trie. You can then use this node to walk the trie and perceive things about each word.
89
99
 
100
+ You can read the reference documentation at http://rubydoc.info/gems/fast_trie/frames/Trie
90
101
 
91
102
  h2. Performance Characteristics
92
103
 
@@ -115,7 +126,7 @@ For keys that are 40 characters long:
115
126
 
116
127
  There are a few takeaways from this. First, there is no strong correlation between length of keys and insert or retrieve time. They stay fairly constant as the length of keys increase. Secondly, doing prefix searches with this trie gets slower linearly with the length of the keys in the trie.
117
128
 
118
- This points to a limitation of this type of trie. It is based on libdatrie, which is a dual-array trie. When finding branches from a particular node, we must query all possible branches to determine whether or not they exist. So for each node we do 255 of these queries.
129
+ This points to a limitation of this type of trie. It is based on "libdatrie":http://linux.thai.net/~thep/datrie/ ("version 0.1.99":http://linux.thai.net/svn/software/datrie/trunk/NEWS), which is a dual-array trie. When finding branches from a particular node, we must query all possible branches to determine whether or not they exist. So for each node we do 255 of these queries.
119
130
 
120
131
  There may be some tricks to speed this up, but for now it is simply a limitation of this trie.
121
132
 
@@ -129,4 +140,4 @@ The reason the insertion times takes such a beating is due, again, to a limitati
129
140
 
130
141
 
131
142
 
132
- Copyright (c) 2008 Tyler McMullen. See LICENSE for details.
143
+ Copyright (c) 2008 Tyler McMullen. See LICENSE for details.
@@ -1,5 +1,5 @@
1
1
  ---
2
2
  :major: 0
3
3
  :minor: 5
4
- :patch: 0
4
+ :patch: 1
5
5
  :build:
@@ -21,7 +21,7 @@ static VALUE rb_trie_alloc(VALUE klass) {
21
21
 
22
22
  void raise_ioerror(const char * message) {
23
23
  VALUE rb_eIOError = rb_const_get(rb_cObject, rb_intern("IOError"));
24
- rb_raise(rb_eIOError, message);
24
+ rb_raise(rb_eIOError, "%s", message);
25
25
  }
26
26
 
27
27
  /*
@@ -179,6 +179,19 @@ static VALUE walk_all_paths(Trie *trie, VALUE children, TrieState *state, char *
179
179
  }
180
180
  }
181
181
 
182
+
183
+ static Bool traverse(TrieState *state, TrieChar *char_prefix) {
184
+ const TrieChar *iterator = char_prefix;
185
+ while(*iterator != 0) {
186
+ if(!trie_state_is_walkable(state, *iterator))
187
+ return FALSE;
188
+ trie_state_walk(state, *iterator);
189
+ iterator++;
190
+ }
191
+ return TRUE;
192
+ }
193
+
194
+
182
195
  /*
183
196
  * call-seq:
184
197
  * children(prefix) -> [ key, ... ]
@@ -200,12 +213,8 @@ static VALUE rb_trie_children(VALUE self, VALUE prefix) {
200
213
  VALUE children = rb_ary_new();
201
214
  TrieChar *char_prefix = (TrieChar*)RSTRING_PTR(prefix);
202
215
 
203
- const TrieChar *iterator = char_prefix;
204
- while(*iterator != 0) {
205
- if(!trie_state_is_walkable(state, *iterator))
206
- return children;
207
- trie_state_walk(state, *iterator);
208
- iterator++;
216
+ if(!traverse(state, char_prefix)) {
217
+ return children;
209
218
  }
210
219
 
211
220
  if(trie_state_is_terminal(state))
@@ -221,6 +230,64 @@ static VALUE rb_trie_children(VALUE self, VALUE prefix) {
221
230
  return children;
222
231
  }
223
232
 
233
+ static Bool walk_all_paths_until_first_terminal(Trie *trie, TrieState *state, char *prefix, int prefix_size) {
234
+ int c;
235
+ Bool ret = FALSE;
236
+ for(c = 1; c < 256; c++) {
237
+ if(trie_state_is_walkable(state,c)) {
238
+ TrieState *next_state = trie_state_clone(state);
239
+ trie_state_walk(next_state, c);
240
+
241
+ prefix[prefix_size] = c;
242
+ prefix[prefix_size + 1] = 0;
243
+
244
+ if(trie_state_is_terminal(next_state)) {
245
+ return TRUE;
246
+ }
247
+
248
+ ret = walk_all_paths_until_first_terminal(trie, next_state, prefix, prefix_size + 1);
249
+
250
+ prefix[prefix_size] = 0;
251
+ trie_state_free(next_state);
252
+
253
+ if (ret == TRUE) {
254
+ return ret;
255
+ }
256
+ }
257
+ }
258
+
259
+ return ret;
260
+ }
261
+
262
+ static VALUE rb_trie_has_children(VALUE self, VALUE prefix) {
263
+ if(NIL_P(prefix))
264
+ return rb_ary_new();
265
+
266
+ StringValue(prefix);
267
+
268
+ Trie *trie;
269
+ Data_Get_Struct(self, Trie, trie);
270
+
271
+ int prefix_size = RSTRING_LEN(prefix);
272
+ TrieState *state = trie_root(trie);
273
+ TrieChar *char_prefix = (TrieChar*)RSTRING_PTR(prefix);
274
+
275
+ if(!traverse(state, char_prefix)) {
276
+ return Qfalse;
277
+ }
278
+
279
+ if(trie_state_is_terminal(state))
280
+ return Qtrue;
281
+
282
+ char prefix_buffer[1024];
283
+ memcpy(prefix_buffer, char_prefix, prefix_size);
284
+ prefix_buffer[prefix_size] = 0;
285
+
286
+ Bool ret = walk_all_paths_until_first_terminal(trie, state, prefix_buffer, prefix_size);
287
+
288
+ trie_state_free(state);
289
+ return ret == TRUE ? Qtrue : Qfalse;
290
+ }
224
291
 
225
292
  static VALUE walk_all_paths_with_values(Trie *trie, VALUE children, TrieState *state, char *prefix, int prefix_size) {
226
293
  int c;
@@ -280,13 +347,9 @@ static VALUE rb_trie_children_with_values(VALUE self, VALUE prefix) {
280
347
 
281
348
  TrieState *state = trie_root(trie);
282
349
 
283
- const TrieChar *iterator = char_prefix;
284
- while(*iterator != 0) {
285
- if(!trie_state_is_walkable(state, *iterator))
286
- return rb_ary_new();
287
- trie_state_walk(state, *iterator);
288
- iterator++;
289
- }
350
+ if(!traverse(state, char_prefix)) {
351
+ return children;
352
+ }
290
353
 
291
354
  if(trie_state_is_terminal(state)) {
292
355
  TrieState *end_state = trie_state_clone(state);
@@ -541,6 +604,7 @@ void Init_trie() {
541
604
  rb_define_method(cTrie, "delete", rb_trie_delete, 1);
542
605
  rb_define_method(cTrie, "children", rb_trie_children, 1);
543
606
  rb_define_method(cTrie, "children_with_values", rb_trie_children_with_values, 1);
607
+ rb_define_method(cTrie, "has_children?", rb_trie_has_children, 1);
544
608
  rb_define_method(cTrie, "root", rb_trie_root, 0);
545
609
  rb_define_method(cTrie, "save", rb_trie_save, 1);
546
610
 
@@ -10,7 +10,11 @@
10
10
 
11
11
  #include <limits.h>
12
12
 
13
- typedef enum { FALSE = 0, TRUE = 1 } Bool;
13
+ // fix for fast_trie on Windows. Should be easy to merge with future changes to libdatrie. MH
14
+ #include <stdbool.h>
15
+ #define Bool bool
16
+ #define FALSE false
17
+ #define TRUE true
14
18
 
15
19
  # if UCHAR_MAX == 0xff
16
20
  # ifndef UINT8_TYPEDEF
@@ -0,0 +1,75 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+ # stub: fast_trie 0.5.1 ruby ext
6
+ # stub: ext/trie/extconf.rb
7
+
8
+ Gem::Specification.new do |s|
9
+ s.name = "fast_trie"
10
+ s.version = "0.5.1"
11
+
12
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
13
+ s.require_paths = ["ext"]
14
+ s.authors = ["Tyler McMullen", "Matt Hickford"]
15
+ s.date = "2015-07-27"
16
+ s.description = "Ruby Trie based on libdatrie."
17
+ s.email = "tyler@scribd.com"
18
+ s.extensions = ["ext/trie/extconf.rb"]
19
+ s.extra_rdoc_files = [
20
+ "LICENSE",
21
+ "README.textile"
22
+ ]
23
+ s.files = [
24
+ "Gemfile.lock",
25
+ "README.textile",
26
+ "VERSION.yml",
27
+ "ext/trie/darray.c",
28
+ "ext/trie/darray.h",
29
+ "ext/trie/extconf.rb",
30
+ "ext/trie/fileutils.c",
31
+ "ext/trie/fileutils.h",
32
+ "ext/trie/tail.c",
33
+ "ext/trie/tail.h",
34
+ "ext/trie/trie-private.c",
35
+ "ext/trie/trie-private.h",
36
+ "ext/trie/trie.c",
37
+ "ext/trie/trie.h",
38
+ "ext/trie/triedefs.h",
39
+ "ext/trie/typedefs.h",
40
+ "fast_trie.gemspec",
41
+ "spec/trie_spec.rb"
42
+ ]
43
+ s.homepage = "http://github.com/tyler/trie"
44
+ s.rdoc_options = ["--title", "Trie", "--line-numbers", "--op", "rdoc", "--main", "ext/trie/trie.c", "README"]
45
+ s.rubygems_version = "2.4.5"
46
+ s.summary = "Ruby Trie based on libdatrie."
47
+
48
+ if s.respond_to? :specification_version then
49
+ s.specification_version = 4
50
+
51
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
52
+ s.add_development_dependency(%q<rake>, [">= 0"])
53
+ s.add_development_dependency(%q<rspec>, [">= 0"])
54
+ s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
55
+ s.add_development_dependency(%q<bundler>, ["~> 1.0"])
56
+ s.add_development_dependency(%q<jeweler>, ["~> 2.0.1"])
57
+ s.add_development_dependency(%q<rake-compiler>, [">= 0"])
58
+ else
59
+ s.add_dependency(%q<rake>, [">= 0"])
60
+ s.add_dependency(%q<rspec>, [">= 0"])
61
+ s.add_dependency(%q<rdoc>, ["~> 3.12"])
62
+ s.add_dependency(%q<bundler>, ["~> 1.0"])
63
+ s.add_dependency(%q<jeweler>, ["~> 2.0.1"])
64
+ s.add_dependency(%q<rake-compiler>, [">= 0"])
65
+ end
66
+ else
67
+ s.add_dependency(%q<rake>, [">= 0"])
68
+ s.add_dependency(%q<rspec>, [">= 0"])
69
+ s.add_dependency(%q<rdoc>, ["~> 3.12"])
70
+ s.add_dependency(%q<bundler>, ["~> 1.0"])
71
+ s.add_dependency(%q<jeweler>, ["~> 2.0.1"])
72
+ s.add_dependency(%q<rake-compiler>, [">= 0"])
73
+ end
74
+ end
75
+
@@ -144,31 +144,46 @@ describe Trie do
144
144
  FileUtils.mkdir_p(dir)
145
145
  File.join(dir, 'trie')
146
146
  end
147
-
147
+
148
148
  context 'when I save the populated trie to disk' do
149
149
  before(:each) do
150
150
  @trie.add('omgwtflolbbq', 123)
151
151
  @trie.save(filename_base)
152
152
  end
153
-
153
+
154
154
  it 'should contain the same data when reading from disk' do
155
155
  trie2 = Trie.read(filename_base)
156
156
  trie2.get('omgwtflolbbq').should == 123
157
157
  end
158
158
  end
159
159
  end
160
-
160
+
161
161
  describe :read do
162
162
  context 'when the files to read from do not exist' do
163
163
  let(:filename_base) do
164
164
  "phantasy/file/path/that/does/not/exist"
165
165
  end
166
-
166
+
167
167
  it 'should raise an error when attempting a read' do
168
168
  lambda { Trie.read(filename_base) }.should raise_error(IOError)
169
169
  end
170
170
  end
171
171
  end
172
+
173
+ describe :has_children? do
174
+ it 'returns true when there are children matching prefix' do
175
+ @trie.has_children?('r').should be_true
176
+
177
+ @trie.has_children?('rock').should be_true
178
+ @trie.has_children?('rocket').should be_true
179
+ end
180
+
181
+ it 'returns false when there are no children matching prefix' do
182
+ @trie.has_children?('no').should be_false
183
+ @trie.has_children?('rome').should be_false
184
+ @trie.has_children?('roc_').should be_false
185
+ end
186
+ end
172
187
  end
173
188
 
174
189
  describe TrieNode do
metadata CHANGED
@@ -1,33 +1,111 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: fast_trie
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 5
8
- - 0
9
- version: 0.5.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.1
10
5
  platform: ruby
11
- authors:
6
+ authors:
12
7
  - Tyler McMullen
8
+ - Matt Hickford
13
9
  autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
-
17
- date: 2010-12-21 00:00:00 -08:00
18
- default_executable:
19
- dependencies: []
20
-
12
+ date: 2015-07-27 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: rspec
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: rdoc
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '3.12'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '3.12'
56
+ - !ruby/object:Gem::Dependency
57
+ name: bundler
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '1.0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '1.0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: jeweler
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: 2.0.1
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: 2.0.1
84
+ - !ruby/object:Gem::Dependency
85
+ name: rake-compiler
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
21
98
  description: Ruby Trie based on libdatrie.
22
99
  email: tyler@scribd.com
23
100
  executables: []
24
-
25
- extensions:
101
+ extensions:
26
102
  - ext/trie/extconf.rb
27
- extra_rdoc_files:
103
+ extra_rdoc_files:
28
104
  - LICENSE
29
105
  - README.textile
30
- files:
106
+ files:
107
+ - Gemfile.lock
108
+ - LICENSE
31
109
  - README.textile
32
110
  - VERSION.yml
33
111
  - ext/trie/darray.c
@@ -43,46 +121,37 @@ files:
43
121
  - ext/trie/trie.h
44
122
  - ext/trie/triedefs.h
45
123
  - ext/trie/typedefs.h
124
+ - fast_trie.gemspec
46
125
  - spec/trie_spec.rb
47
- - LICENSE
48
- has_rdoc: true
49
126
  homepage: http://github.com/tyler/trie
50
127
  licenses: []
51
-
128
+ metadata: {}
52
129
  post_install_message:
53
- rdoc_options:
54
- - --title
130
+ rdoc_options:
131
+ - "--title"
55
132
  - Trie
56
- - --line-numbers
57
- - --op
133
+ - "--line-numbers"
134
+ - "--op"
58
135
  - rdoc
59
- - --main
136
+ - "--main"
60
137
  - ext/trie/trie.c
61
138
  - README
62
- require_paths:
139
+ require_paths:
63
140
  - ext
64
- required_ruby_version: !ruby/object:Gem::Requirement
65
- none: false
66
- requirements:
141
+ required_ruby_version: !ruby/object:Gem::Requirement
142
+ requirements:
67
143
  - - ">="
68
- - !ruby/object:Gem::Version
69
- segments:
70
- - 0
71
- version: "0"
72
- required_rubygems_version: !ruby/object:Gem::Requirement
73
- none: false
74
- requirements:
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ required_rubygems_version: !ruby/object:Gem::Requirement
147
+ requirements:
75
148
  - - ">="
76
- - !ruby/object:Gem::Version
77
- segments:
78
- - 0
79
- version: "0"
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
80
151
  requirements: []
81
-
82
152
  rubyforge_project:
83
- rubygems_version: 1.3.7
153
+ rubygems_version: 2.2.2
84
154
  signing_key:
85
- specification_version: 3
155
+ specification_version: 4
86
156
  summary: Ruby Trie based on libdatrie.
87
- test_files:
88
- - spec/trie_spec.rb
157
+ test_files: []