noid 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/Gemfile +2 -14
- data/Rakefile +5 -50
- data/VERSION +1 -1
- data/lib/noid.rb +6 -11
- data/lib/noid/minter.rb +113 -1
- data/lib/noid/template.rb +144 -0
- data/lib/noid/version.rb +9 -0
- data/noid.gemspec +18 -80
- data/spec/lib/minter_spec.rb +153 -0
- data/spec/spec_helper.rb +7 -0
- metadata +65 -153
- data/.document +0 -5
- data/doc/active_record_sample.rb +0 -6
- data/lib/noid/active_record.rb +0 -5
- data/lib/noid/active_record/provider.rb +0 -36
- data/lib/noid/base.rb +0 -154
- data/lib/noid/identifier.rb +0 -24
- data/lib/noid/identifier/anvl.rb +0 -32
- data/lib/noid/identifier/singleton.rb +0 -14
- data/lib/noid/persistence.rb +0 -4
- data/lib/noid/persistence/base.rb +0 -11
- data/lib/noid/persistence/json.rb +0 -38
- data/test/helper.rb +0 -18
- data/test/test_binding.rb +0 -42
- data/test/test_noid.rb +0 -134
- data/test/test_persistence.rb +0 -47
@@ -0,0 +1,153 @@
|
|
1
|
+
describe Noid::Minter do
|
2
|
+
it "should mint a few random 3-digit numbers" do
|
3
|
+
minter = Noid::Minter.new(:template => '.rddd')
|
4
|
+
minter.mint.should =~ /\d\d\d/
|
5
|
+
end
|
6
|
+
|
7
|
+
it "should mint random 3-digit numbers, stopping after the 1000th" do
|
8
|
+
minter = Noid::Minter.new(:template => '.rddd')
|
9
|
+
1000.times { minter.mint.should =~ /^\d\d\d$/ }
|
10
|
+
expect { minter.mint }.to raise_exception
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should mint sequential numbers without limit, adding new digits as needed" do
|
14
|
+
minter = Noid::Minter.new(:template => '.zd')
|
15
|
+
minter.mint.should == "0"
|
16
|
+
999.times { minter.mint.should =~ /\d/ }
|
17
|
+
minter.mint.should == "1000"
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should mint random 4-digit numbers with constant prefix bc" do
|
21
|
+
minter = Noid::Minter.new(:template => 'bc.rdddd')
|
22
|
+
1000.times { minter.mint.should =~ /^bc\d\d\d\d$/ }
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should mint sequential 2-digit numbers with constant prefix 8rf" do
|
26
|
+
minter = Noid::Minter.new(:template => '8rf.sdd')
|
27
|
+
minter.mint.should == "8rf00"
|
28
|
+
10.times { minter.mint.should =~ /^8rf\d\d$/ }
|
29
|
+
minter.mint.should == "8rf11"
|
30
|
+
88.times { minter.mint.should =~ /^8rf\d\d$/ }
|
31
|
+
expect { minter.mint }.to raise_exception
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should mint sequential extended-digits" do
|
35
|
+
minter = Noid::Minter.new(:template => '.se')
|
36
|
+
29.times.map { minter.mint }.join('').should == "0123456789bcdfghjkmnpqrstvwxz"
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should mint random 3-extended-digit numbers with constant prefix h9" do
|
40
|
+
minter = Noid::Minter.new(:template => 'h9.reee')
|
41
|
+
|
42
|
+
(minter.template.max).times { minter.mint.should =~ /^h9\w\w\w$/ }
|
43
|
+
expect { minter.mint }.to raise_exception
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should mint unlimited sequential numbers with at least 3 extended digits" do
|
47
|
+
minter = Noid::Minter.new(:template => '.zeee')
|
48
|
+
(29*29*29).times { minter.mint.should =~ /^\w\w\w/ }
|
49
|
+
minter.mint.should =~ /^\w\w\w\w/
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should mint random 7-char numbers, with extended digits at chars 2,4,and 5" do
|
53
|
+
minter = Noid::Minter.new(:template => '.rdedeedd')
|
54
|
+
1000.times { minter.mint.should =~ /^\d\w\d\w\w\d\d$/ }
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should mint unlimited mixed digits, adding new extended digits as needed" do
|
58
|
+
minter = Noid::Minter.new(:template => '.zedededed')
|
59
|
+
minter.mint.should == "00000000"
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should mint sequential 4-mixed-digit with constant prefix sdd" do
|
63
|
+
minter = Noid::Minter.new(:template => 'sdd.sdede')
|
64
|
+
minter.mint.should == 'sdd0000'
|
65
|
+
1000.times { minter.mint.should =~ /^sdd\d\w\d\w$/}
|
66
|
+
minter.mint.should == "sdd034h"
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should mint random 3 mixed digits plus final (4th) computed check character" do
|
70
|
+
minter = Noid::Minter.new(:template => '.rdedk')
|
71
|
+
1000.times { minter.mint.should =~ /^\d\w\d\w$/ }
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should mint 5 sequential mixed digits plus final extended digit check char" do
|
75
|
+
minter = Noid::Minter.new(:template => '.sdeeedk')
|
76
|
+
minter.mint.should == "000000"
|
77
|
+
minter.mint.should == "000015"
|
78
|
+
minter.mint.should == "00002b"
|
79
|
+
1000.times { minter.mint.should =~ /^\d\w\w\w\d\w$/ }
|
80
|
+
minter.mint.should == "003f3m"
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should mint sequential digits plus check char, with new digits added as needed" do
|
84
|
+
minter = Noid::Minter.new(:template => ".zdeek")
|
85
|
+
minter.mint.should == "0000"
|
86
|
+
minter.mint.should == "0013"
|
87
|
+
(10*29*29-2).times { minter.mint.should =~ /^\d\w\w\w$/ }
|
88
|
+
minter.mint.should == "10001"
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should mint prefix plus random 3 mixed digits plus a check char" do
|
92
|
+
minter = Noid::Minter.new(:template => "63q.redek")
|
93
|
+
minter.mint.should =~ /63q\w\d\w\w/
|
94
|
+
end
|
95
|
+
|
96
|
+
describe "seed" do
|
97
|
+
it "given a specific seed, identifiers should be replicable" do
|
98
|
+
minter = Noid::Minter.new(:template => "63q.redek")
|
99
|
+
minter.seed(0)
|
100
|
+
minter.mint.should == "63qk208"
|
101
|
+
|
102
|
+
minter = Noid::Minter.new(:template => "63q.redek")
|
103
|
+
minter.seed(0)
|
104
|
+
minter.mint.should == "63qk208"
|
105
|
+
end
|
106
|
+
|
107
|
+
it "given a specific seed and sequence, identifiers should be replicable" do
|
108
|
+
minter = Noid::Minter.new(:template => "63q.redek")
|
109
|
+
minter.seed(23456789, 567)
|
110
|
+
minter.mint.should == "63qh305"
|
111
|
+
|
112
|
+
minter = Noid::Minter.new(:template => "63q.redek")
|
113
|
+
minter.seed(23456789, 567)
|
114
|
+
minter.mint.should == "63qh305"
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
describe "dump" do
|
119
|
+
it "should dump the minter state" do
|
120
|
+
minter = Noid::Minter.new(:template => ".sddd")
|
121
|
+
d = minter.dump
|
122
|
+
d[:template].should == ".sddd"
|
123
|
+
d[:seq].should == 0
|
124
|
+
|
125
|
+
minter.mint
|
126
|
+
minter.mint
|
127
|
+
d = minter.dump
|
128
|
+
d[:seq] == 2
|
129
|
+
end
|
130
|
+
|
131
|
+
it "should dump the seed, sequence, and counters for the RNG" do
|
132
|
+
minter = Noid::Minter.new(:template => ".rddd")
|
133
|
+
d = minter.dump
|
134
|
+
d[:seq] == 0
|
135
|
+
d[:seed].should == minter.instance_variable_get('@seed')
|
136
|
+
end
|
137
|
+
|
138
|
+
it "should allow a random identifier minter to be 'replayed' accurately" do
|
139
|
+
minter = Noid::Minter.new(:template => '.rd')
|
140
|
+
d = minter.dump
|
141
|
+
arr = 10.times.map { minter.mint }
|
142
|
+
|
143
|
+
minter = Noid::Minter.new(d)
|
144
|
+
|
145
|
+
arr2 = 10.times.map { minter.mint }
|
146
|
+
|
147
|
+
arr.should == arr2
|
148
|
+
|
149
|
+
end
|
150
|
+
|
151
|
+
end
|
152
|
+
|
153
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
@@ -1,194 +1,106 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: noid
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 4
|
9
|
-
- 0
|
10
|
-
version: 0.4.0
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.5.0
|
5
|
+
prerelease:
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Chris Beer
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
date: 2010-12-23 00:00:00 -05:00
|
12
|
+
date: 2011-07-13 00:00:00.000000000 -04:00
|
19
13
|
default_executable:
|
20
|
-
dependencies:
|
21
|
-
- !ruby/object:Gem::Dependency
|
22
|
-
type: :runtime
|
23
|
-
prerelease: false
|
24
|
-
name: anvl
|
25
|
-
version_requirements: &id001 !ruby/object:Gem::Requirement
|
26
|
-
none: false
|
27
|
-
requirements:
|
28
|
-
- - ">="
|
29
|
-
- !ruby/object:Gem::Version
|
30
|
-
hash: 3
|
31
|
-
segments:
|
32
|
-
- 0
|
33
|
-
version: "0"
|
34
|
-
requirement: *id001
|
35
|
-
- !ruby/object:Gem::Dependency
|
36
|
-
type: :runtime
|
37
|
-
prerelease: false
|
38
|
-
name: json
|
39
|
-
version_requirements: &id002 !ruby/object:Gem::Requirement
|
40
|
-
none: false
|
41
|
-
requirements:
|
42
|
-
- - ">="
|
43
|
-
- !ruby/object:Gem::Version
|
44
|
-
hash: 3
|
45
|
-
segments:
|
46
|
-
- 0
|
47
|
-
version: "0"
|
48
|
-
requirement: *id002
|
49
|
-
- !ruby/object:Gem::Dependency
|
50
|
-
type: :runtime
|
51
|
-
prerelease: false
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
52
16
|
name: backports
|
53
|
-
|
17
|
+
requirement: &2153449260 !ruby/object:Gem::Requirement
|
54
18
|
none: false
|
55
|
-
requirements:
|
56
|
-
- -
|
57
|
-
- !ruby/object:Gem::Version
|
58
|
-
|
59
|
-
|
60
|
-
- 0
|
61
|
-
version: "0"
|
62
|
-
requirement: *id003
|
63
|
-
- !ruby/object:Gem::Dependency
|
64
|
-
type: :development
|
65
|
-
prerelease: false
|
66
|
-
name: shoulda
|
67
|
-
version_requirements: &id004 !ruby/object:Gem::Requirement
|
68
|
-
none: false
|
69
|
-
requirements:
|
70
|
-
- - ">="
|
71
|
-
- !ruby/object:Gem::Version
|
72
|
-
hash: 3
|
73
|
-
segments:
|
74
|
-
- 0
|
75
|
-
version: "0"
|
76
|
-
requirement: *id004
|
77
|
-
- !ruby/object:Gem::Dependency
|
78
|
-
type: :development
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0'
|
23
|
+
type: :runtime
|
79
24
|
prerelease: false
|
25
|
+
version_requirements: *2153449260
|
26
|
+
- !ruby/object:Gem::Dependency
|
80
27
|
name: bundler
|
81
|
-
|
28
|
+
requirement: &2153448740 !ruby/object:Gem::Requirement
|
82
29
|
none: false
|
83
|
-
requirements:
|
30
|
+
requirements:
|
84
31
|
- - ~>
|
85
|
-
- !ruby/object:Gem::Version
|
86
|
-
hash: 23
|
87
|
-
segments:
|
88
|
-
- 1
|
89
|
-
- 0
|
90
|
-
- 0
|
32
|
+
- !ruby/object:Gem::Version
|
91
33
|
version: 1.0.0
|
92
|
-
requirement: *id005
|
93
|
-
- !ruby/object:Gem::Dependency
|
94
34
|
type: :development
|
95
35
|
prerelease: false
|
96
|
-
|
97
|
-
|
36
|
+
version_requirements: *2153448740
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: rspec
|
39
|
+
requirement: &2153448240 !ruby/object:Gem::Requirement
|
98
40
|
none: false
|
99
|
-
requirements:
|
100
|
-
- -
|
101
|
-
- !ruby/object:Gem::Version
|
102
|
-
|
103
|
-
segments:
|
104
|
-
- 1
|
105
|
-
- 5
|
106
|
-
- 1
|
107
|
-
version: 1.5.1
|
108
|
-
requirement: *id006
|
109
|
-
- !ruby/object:Gem::Dependency
|
41
|
+
requirements:
|
42
|
+
- - ! '>='
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '2.0'
|
110
45
|
type: :development
|
111
46
|
prerelease: false
|
47
|
+
version_requirements: *2153448240
|
48
|
+
- !ruby/object:Gem::Dependency
|
112
49
|
name: rcov
|
113
|
-
|
50
|
+
requirement: &2153447780 !ruby/object:Gem::Requirement
|
114
51
|
none: false
|
115
|
-
requirements:
|
116
|
-
- -
|
117
|
-
- !ruby/object:Gem::Version
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
type: :development
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: *2153447780
|
59
|
+
description: ''
|
60
|
+
email:
|
61
|
+
- chris@cbeer.info
|
125
62
|
executables: []
|
126
|
-
|
127
63
|
extensions: []
|
128
|
-
|
129
|
-
|
130
|
-
-
|
131
|
-
- README.rdoc
|
132
|
-
files:
|
133
|
-
- .document
|
64
|
+
extra_rdoc_files: []
|
65
|
+
files:
|
66
|
+
- .gitignore
|
134
67
|
- Gemfile
|
135
68
|
- LICENSE.txt
|
136
69
|
- README.rdoc
|
137
70
|
- Rakefile
|
138
71
|
- VERSION
|
139
|
-
- doc/active_record_sample.rb
|
140
72
|
- lib/noid.rb
|
141
|
-
- lib/noid/active_record.rb
|
142
|
-
- lib/noid/active_record/provider.rb
|
143
|
-
- lib/noid/base.rb
|
144
|
-
- lib/noid/identifier.rb
|
145
|
-
- lib/noid/identifier/anvl.rb
|
146
|
-
- lib/noid/identifier/singleton.rb
|
147
73
|
- lib/noid/minter.rb
|
148
|
-
- lib/noid/
|
149
|
-
- lib/noid/
|
150
|
-
- lib/noid/persistence/json.rb
|
74
|
+
- lib/noid/template.rb
|
75
|
+
- lib/noid/version.rb
|
151
76
|
- noid.gemspec
|
152
|
-
-
|
153
|
-
-
|
154
|
-
- test/test_noid.rb
|
155
|
-
- test/test_persistence.rb
|
77
|
+
- spec/lib/minter_spec.rb
|
78
|
+
- spec/spec_helper.rb
|
156
79
|
has_rdoc: true
|
157
|
-
homepage: http://github.com/
|
158
|
-
licenses:
|
159
|
-
- MIT
|
80
|
+
homepage: http://github.com/microservices/noid
|
81
|
+
licenses: []
|
160
82
|
post_install_message:
|
161
83
|
rdoc_options: []
|
162
|
-
|
163
|
-
require_paths:
|
84
|
+
require_paths:
|
164
85
|
- lib
|
165
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
86
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
166
87
|
none: false
|
167
|
-
requirements:
|
168
|
-
- -
|
169
|
-
- !ruby/object:Gem::Version
|
170
|
-
|
171
|
-
|
172
|
-
- 0
|
173
|
-
version: "0"
|
174
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - ! '>='
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '0'
|
92
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
175
93
|
none: false
|
176
|
-
requirements:
|
177
|
-
- -
|
178
|
-
- !ruby/object:Gem::Version
|
179
|
-
|
180
|
-
segments:
|
181
|
-
- 0
|
182
|
-
version: "0"
|
94
|
+
requirements:
|
95
|
+
- - ! '>='
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0'
|
183
98
|
requirements: []
|
184
|
-
|
185
|
-
|
186
|
-
rubygems_version: 1.3.7
|
99
|
+
rubyforge_project: noid
|
100
|
+
rubygems_version: 1.6.2
|
187
101
|
signing_key:
|
188
102
|
specification_version: 3
|
189
103
|
summary: Nice Opaque Identifier
|
190
|
-
test_files:
|
191
|
-
-
|
192
|
-
-
|
193
|
-
- test/test_noid.rb
|
194
|
-
- test/test_persistence.rb
|
104
|
+
test_files:
|
105
|
+
- spec/lib/minter_spec.rb
|
106
|
+
- spec/spec_helper.rb
|
data/.document
DELETED
data/doc/active_record_sample.rb
DELETED
data/lib/noid/active_record.rb
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
module Noid::ActiveRecord
|
2
|
-
module Provider
|
3
|
-
def self.included base
|
4
|
-
base.send :before_create, :mint_identifier
|
5
|
-
# base.send :attr_accessor, :minter
|
6
|
-
class << base
|
7
|
-
def minter value = nil
|
8
|
-
@minter = value if value
|
9
|
-
@minter
|
10
|
-
end
|
11
|
-
|
12
|
-
def identifier_field value = nil
|
13
|
-
@identifier_field = value if value
|
14
|
-
@identifier_field
|
15
|
-
end
|
16
|
-
|
17
|
-
def persistence_path
|
18
|
-
File.join RAILS_ROOT, "db/#{self.to_s}_NOID.js"
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def minter= value
|
24
|
-
@minter = value
|
25
|
-
end
|
26
|
-
|
27
|
-
def minter
|
28
|
-
@minter || self.class.minter
|
29
|
-
end
|
30
|
-
|
31
|
-
def mint_identifier
|
32
|
-
self.send "#{self.class.instance_variable_get('@identifier_field')}=", self.minter.mint unless self.attribute_present? self.class.instance_variable_get('@identifier_field')
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
36
|
-
end
|