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.
- checksums.yaml +7 -0
- data/Gemfile.lock +69 -0
- data/README.textile +16 -5
- data/VERSION.yml +1 -1
- data/ext/trie/trie.c +78 -14
- data/ext/trie/typedefs.h +5 -1
- data/fast_trie.gemspec +75 -0
- data/spec/trie_spec.rb +19 -4
- metadata +115 -46
checksums.yaml
ADDED
@@ -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
|
data/Gemfile.lock
ADDED
@@ -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
|
data/README.textile
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
h1. Trie
|
2
2
|
|
3
|
-
|
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
|
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.
|
data/VERSION.yml
CHANGED
data/ext/trie/trie.c
CHANGED
@@ -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
|
-
|
204
|
-
|
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
|
-
|
284
|
-
|
285
|
-
|
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
|
|
data/ext/trie/typedefs.h
CHANGED
@@ -10,7 +10,11 @@
|
|
10
10
|
|
11
11
|
#include <limits.h>
|
12
12
|
|
13
|
-
|
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
|
data/fast_trie.gemspec
ADDED
@@ -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
|
+
|
data/spec/trie_spec.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
18
|
-
|
19
|
-
|
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
|
-
|
66
|
-
requirements:
|
141
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
67
143
|
- - ">="
|
68
|
-
- !ruby/object:Gem::Version
|
69
|
-
|
70
|
-
|
71
|
-
|
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
|
-
|
78
|
-
- 0
|
79
|
-
version: "0"
|
149
|
+
- !ruby/object:Gem::Version
|
150
|
+
version: '0'
|
80
151
|
requirements: []
|
81
|
-
|
82
152
|
rubyforge_project:
|
83
|
-
rubygems_version:
|
153
|
+
rubygems_version: 2.2.2
|
84
154
|
signing_key:
|
85
|
-
specification_version:
|
155
|
+
specification_version: 4
|
86
156
|
summary: Ruby Trie based on libdatrie.
|
87
|
-
test_files:
|
88
|
-
- spec/trie_spec.rb
|
157
|
+
test_files: []
|