noid 0.1.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -3,6 +3,8 @@ source "http://rubygems.org"
3
3
  # Example:
4
4
  # gem "activesupport", ">= 2.3.5"
5
5
  gem "anvl"
6
+ gem "json"
7
+ gem "backports"
6
8
 
7
9
  # Add dependencies to develop your gem here.
8
10
  # Include everything needed to run rake, tests, features, etc.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.3.0
data/lib/noid.rb CHANGED
@@ -1,4 +1,6 @@
1
- require 'noid/minter'
1
+ require 'noid/base'
2
+ require 'noid/persistence'
3
+ require 'noid/persistence/json'
2
4
  require 'noid/identifier'
3
5
  require 'noid/identifier/singleton'
4
6
  require 'noid/identifier/anvl'
@@ -1,64 +1,38 @@
1
+ require 'backports'
2
+
1
3
  module Noid
2
- class Minter
4
+ class Base
3
5
  XDIGIT = ['0','1','2','3','4','5','6','7','8','9','b','c','d','f','g','h','j','k','l','n','p','q','r','s','t','v','w','x','z']
4
6
  MAX_COUNTERS = 293
5
7
 
6
8
  def initialize args = {}
7
-
8
9
  @max = nil
9
10
  @min = nil
11
+ @config = { :identifier => {} }.merge args
12
+ setup_mask args
13
+ end
10
14
 
11
- @identifier_class = args[:identifier_class]
12
- @identifier_class ||= String
13
-
14
- @prefix, @mask = args[:template].split('.')
15
-
16
- @prefix = "#{args[:namespace]}/#{@prefix}" if args[:namespace]
17
-
18
- @type, @characters = @mask.split '', 2
19
- @characters = @characters.split ''
20
- @check = @characters.pop and true if @characters.last == 'k'
21
- case @type
22
- when 's'
23
- @s = 0
24
- when 'z'
25
- @s = 0
26
- when 'r'
27
-
28
- percounter = max / MAX_COUNTERS + 1
29
- t = 0
30
- @s = Array.new(max/percounter) do |i|
31
- { :value => case i
32
- when 0 then 0
33
- else t += percounter
34
- end, :max => t + percounter }
35
- end
36
- end
37
-
38
- end
39
15
 
40
16
  def mint
41
17
  str = @prefix
18
+ n = @s
19
+ @s += 1
20
+
42
21
  case @type
43
22
  when 's'
44
- n = @s
45
- @s += 1
46
- str += n2xdig(n)
47
23
  when 'z'
48
- n = @s
49
- @s += 1
50
- str += n2xdig(n)
51
24
  when 'r'
52
- i = rand(@s.size)
53
- n = @s[i][:value]
54
- @s[i][:value] += 1
55
- @s.delete_at(i) if @s[i][:value] == @s[i][:max]
56
- str += n2xdig(n)
25
+ raise Exception if @counters.size == 0
26
+ i = @rand.rand(@counters.size)
27
+ n = @counters[i][:value]
28
+ @counters[i][:value] += 1
29
+ @counters.delete_at(i) if @counters[i][:value] == @counters[i][:max]
57
30
  end
31
+ str += n2xdig(n)
58
32
 
59
33
  str += checkdigit(str) if @check
60
34
 
61
- @identifier_class.new str
35
+ identifier.new str
62
36
  end
63
37
 
64
38
  def valid? id
@@ -79,8 +53,8 @@ module Noid
79
53
  end
80
54
 
81
55
  protected
82
- def s
83
- @s
56
+ def identifier
57
+ @config[:identifier][:class] || String
84
58
  end
85
59
 
86
60
  def checkdigit str
@@ -141,5 +115,38 @@ module Noid
141
115
 
142
116
  xdig.reverse
143
117
  end
118
+
119
+ def setup_mask args
120
+ @prefix, @mask = args[:template].split('.')
121
+
122
+ @prefix = "#{args[:namespace]}/#{@prefix}" if args[:namespace]
123
+
124
+ @type, @characters = @mask.split '', 2
125
+ @characters = @characters.split ''
126
+ @check = @characters.pop and true if @characters.last == 'k'
127
+ @s = args[:s] || 0
128
+ case @type
129
+ when 's'
130
+ when 'z'
131
+ when 'r'
132
+ @rand = Random.new(args[:seed]) if args[:seed]
133
+ @rand ||= Random.new
134
+ @seed = @rand.seed
135
+
136
+ if args[:s]
137
+ args[:s].times { @rand.rand }
138
+ end
139
+
140
+ percounter = max / (args[:max_counters] || MAX_COUNTERS) + 1
141
+ t = 0
142
+ @counters = args[:counters]
143
+ @counters ||= Array.new(max/percounter) do |i|
144
+ { :value => case i
145
+ when 0 then 0
146
+ else t += percounter
147
+ end, :max => t + percounter }
148
+ end
149
+ end
150
+ end
144
151
  end
145
152
  end
@@ -0,0 +1,4 @@
1
+ module Noid
2
+ module Persistence
3
+ end
4
+ end
@@ -0,0 +1,36 @@
1
+ require 'json'
2
+ module Noid::Persistence
3
+ class JSON < Noid::Base
4
+ FILENAME = 'NOID.js'
5
+ def initialize args = {}
6
+ @file = args[:filename] || FILENAME
7
+ data = load_json
8
+ super data.merge(args)
9
+ save
10
+ end
11
+
12
+ def mint
13
+ a = super
14
+ save
15
+ return a
16
+ end
17
+
18
+ protected
19
+ def load_json
20
+ data = ::JSON.parse(File.read(@file)) if File.exists? @file
21
+ data ||= {}
22
+ data = data.inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo} unless data.empty?
23
+ data[:counters] = data[:counters].map { |x| x.inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo} } if data[:counters]
24
+ data[:identifier] = { :class => Kernel.const_get(data[:identifier]['class']) } if data[:identifier]
25
+ data
26
+ end
27
+
28
+ def save
29
+ File.open(@file, 'w') do |f|
30
+ str = { :identifier => { :class => identifier }, :s => @s, :counters => @counters, :seed => @seed, }.to_json
31
+ f.write(str)
32
+ end
33
+ end
34
+
35
+ end
36
+ end
data/noid.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{noid}
8
- s.version = "0.1.0"
8
+ s.version = "0.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Chris Beer"]
12
- s.date = %q{2010-12-12}
12
+ s.date = %q{2010-12-16}
13
13
  s.description = %q{}
14
14
  s.email = %q{chris@cbeer.info}
15
15
  s.extra_rdoc_files = [
@@ -24,14 +24,17 @@ Gem::Specification.new do |s|
24
24
  "Rakefile",
25
25
  "VERSION",
26
26
  "lib/noid.rb",
27
+ "lib/noid/base.rb",
27
28
  "lib/noid/identifier.rb",
28
29
  "lib/noid/identifier/anvl.rb",
29
30
  "lib/noid/identifier/singleton.rb",
30
- "lib/noid/minter.rb",
31
+ "lib/noid/persistence.rb",
32
+ "lib/noid/persistence/json.rb",
31
33
  "noid.gemspec",
32
34
  "test/helper.rb",
33
35
  "test/test_binding.rb",
34
- "test/test_noid.rb"
36
+ "test/test_noid.rb",
37
+ "test/test_persistence.rb"
35
38
  ]
36
39
  s.homepage = %q{http://github.com/cbeer/noid}
37
40
  s.licenses = ["MIT"]
@@ -41,7 +44,8 @@ Gem::Specification.new do |s|
41
44
  s.test_files = [
42
45
  "test/helper.rb",
43
46
  "test/test_binding.rb",
44
- "test/test_noid.rb"
47
+ "test/test_noid.rb",
48
+ "test/test_persistence.rb"
45
49
  ]
46
50
 
47
51
  if s.respond_to? :specification_version then
@@ -50,12 +54,16 @@ Gem::Specification.new do |s|
50
54
 
51
55
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
52
56
  s.add_runtime_dependency(%q<anvl>, [">= 0"])
57
+ s.add_runtime_dependency(%q<json>, [">= 0"])
58
+ s.add_runtime_dependency(%q<backports>, [">= 0"])
53
59
  s.add_development_dependency(%q<shoulda>, [">= 0"])
54
60
  s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
55
61
  s.add_development_dependency(%q<jeweler>, ["~> 1.5.1"])
56
62
  s.add_development_dependency(%q<rcov>, [">= 0"])
57
63
  else
58
64
  s.add_dependency(%q<anvl>, [">= 0"])
65
+ s.add_dependency(%q<json>, [">= 0"])
66
+ s.add_dependency(%q<backports>, [">= 0"])
59
67
  s.add_dependency(%q<shoulda>, [">= 0"])
60
68
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
61
69
  s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
@@ -63,6 +71,8 @@ Gem::Specification.new do |s|
63
71
  end
64
72
  else
65
73
  s.add_dependency(%q<anvl>, [">= 0"])
74
+ s.add_dependency(%q<json>, [">= 0"])
75
+ s.add_dependency(%q<backports>, [">= 0"])
66
76
  s.add_dependency(%q<shoulda>, [">= 0"])
67
77
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
68
78
  s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
data/test/test_binding.rb CHANGED
@@ -1,33 +1,42 @@
1
1
  require 'helper'
2
2
  require 'anvl'
3
+ require 'tmpdir'
3
4
 
4
5
  class TestNoidBinding < Test::Unit::TestCase
5
6
  context "Noid" do
6
7
  should "accept identifier_class for NOID bindings" do
7
- n = Noid::Minter.new :template => 'r.rek', :identifier_class => Noid::Identifier::Base
8
- id = n.mint
9
- assert_equal(Noid::Identifier::Base, id.class)
10
- id['abc'] = 123
11
- assert_equal(123, id['abc'])
8
+ Dir.mktmpdir do |d|
9
+ Dir.chdir d
10
+ n = Noid::Base.new :template => 'r.rek', :identifier => { :class => Noid::Identifier::Base }
11
+ id = n.mint
12
+ assert_equal(Noid::Identifier::Base, id.class)
13
+ id['abc'] = 123
14
+ assert_equal(123, id['abc'])
15
+ end
12
16
  end
13
17
 
14
18
  should "use singleton instance to persist NOID bindings" do
15
- n = Noid::Minter.new :template => 'r.rek', :identifier_class => Noid::Identifier::Singleton
16
- id = n.mint
17
- id['abc'] = 123
18
- assert_equal(123, id['abc'])
19
+ Dir.mktmpdir do |d|
20
+ Dir.chdir d
21
+ n = Noid::Base.new :template => 'r.rek', :identifier => { :class => Noid::Identifier::Singleton }
22
+ id = n.mint
23
+ id['abc'] = 123
24
+ assert_equal(123, id['abc'])
19
25
 
20
- id2 = Noid::Identifier::Singleton.new id.id
21
- assert_equal(123, id2['abc'])
26
+ id2 = Noid::Identifier::Singleton.new id.id
27
+ assert_equal(123, id2['abc'])
28
+ end
22
29
  end
23
30
 
24
31
  should "user anvl instance to persist NOID binding info" do
25
- n = Noid::Minter.new :template => 'r.rek', :identifier_class => Noid::Identifier::Anvl
26
- id = n.mint
27
- id['abc'] = 123
28
- assert_equal(Noid::Identifier::Anvl, id.class)
29
- assert_equal("123", id['abc'])
30
-
32
+ Dir.mktmpdir do |d|
33
+ Dir.chdir d
34
+ n = Noid::Base.new :template => 'r.rek', :identifier => { :class => Noid::Identifier::Anvl }
35
+ id = n.mint
36
+ id['abc'] = "123"
37
+ assert_equal(Noid::Identifier::Anvl, id.class)
38
+ assert_equal("123", id['abc'])
39
+ end
31
40
  end
32
41
  end
33
42
  end
data/test/test_noid.rb CHANGED
@@ -3,31 +3,31 @@ require 'helper'
3
3
  class TestNoid < Test::Unit::TestCase
4
4
  context "Noid" do
5
5
  should "generate checkdigits correctly" do
6
- n = Noid::Minter.new :template => 's.zd'
6
+ n = Noid::Base.new :template => 's.zd'
7
7
  assert_equal('q', n.send(:checkdigit, '13030/xf93gt2'))
8
8
  end
9
9
 
10
10
  should "generate max sequence for type 'r'" do
11
- n = Noid::Minter.new :template => 's.rd'
11
+ n = Noid::Base.new :template => 's.rd'
12
12
  assert_equal(0, n.send(:min))
13
13
  assert_equal(10, n.send(:max))
14
14
 
15
- n = Noid::Minter.new :template => 's.rdd'
15
+ n = Noid::Base.new :template => 's.rdd'
16
16
  assert_equal(0, n.send(:min))
17
17
  assert_equal(100, n.send(:max))
18
18
  end
19
19
 
20
20
  should "generate quasi-random counters for type 'r'" do
21
- n = Noid::Minter.new :template => 's.rd'
22
- assert_equal((0..9).map { |x| {:value => x, :max => (x + 1)} }, n.send(:s))
21
+ n = Noid::Base.new :template => 's.rd'
22
+ assert_equal((0..9).map { |x| {:value => x, :max => (x + 1)} }, n.instance_variable_get('@counters'))
23
23
 
24
- n = Noid::Minter.new :template => 's.rdde'
25
- s = n.send(:s)
24
+ n = Noid::Base.new :template => 's.rdde'
25
+ s = n.instance_variable_get('@counters')
26
26
  assert_contains(s, {:value => 2890, :max => 2900})
27
27
  end
28
28
 
29
29
  should "generate random sequence for type 'r'" do
30
- n = Noid::Minter.new :template => 's.rd'
30
+ n = Noid::Base.new :template => 's.rd'
31
31
  a = 10.times.map { |i| n.mint }
32
32
 
33
33
  10.times do |i|
@@ -37,14 +37,14 @@ class TestNoid < Test::Unit::TestCase
37
37
  end
38
38
 
39
39
  should "generate numeric sequence for type 's'" do
40
- n = Noid::Minter.new :template => 's.sd'
40
+ n = Noid::Base.new :template => 's.sd'
41
41
  10.times do |i|
42
42
  assert_equal("s#{i}", n.mint)
43
43
  end
44
44
  end
45
45
 
46
46
  should "generate extended sequence for type 's'" do
47
- n = Noid::Minter.new :template => 's.se'
47
+ n = Noid::Base.new :template => 's.se'
48
48
  10.times do |i|
49
49
  assert_equal("s#{i}", n.mint)
50
50
  end
@@ -55,7 +55,7 @@ class TestNoid < Test::Unit::TestCase
55
55
  end
56
56
 
57
57
  should "raise an exception when overflowing sequence" do
58
- n = Noid::Minter.new :template => 's.sd'
58
+ n = Noid::Base.new :template => 's.sd'
59
59
  10.times do |i|
60
60
  assert_equal("s#{i}", n.mint)
61
61
  end
@@ -66,20 +66,20 @@ class TestNoid < Test::Unit::TestCase
66
66
  end
67
67
 
68
68
  should "generate sequence for type 's' with checkdigit" do
69
- n = Noid::Minter.new :template => 's.sdk'
69
+ n = Noid::Base.new :template => 's.sdk'
70
70
  assert_equal('s0s', n.mint)
71
71
  assert_equal('s1v', n.mint)
72
72
  assert_equal('s2x', n.mint)
73
73
  end
74
74
 
75
75
  should "generate sequence for type 'z' with checkdigit" do
76
- n = Noid::Minter.new :template => 'z.zdk'
76
+ n = Noid::Base.new :template => 'z.zdk'
77
77
  assert_equal('z0z', n.mint)
78
78
  assert_equal('z11', n.mint)
79
79
  assert_equal('z23', n.mint)
80
80
  end
81
81
  should "generate sequence for type 'z', adding new digits as needed" do
82
- n = Noid::Minter.new :template => 'z.zdk'
82
+ n = Noid::Base.new :template => 'z.zdk'
83
83
  assert_equal('z0z', n.mint)
84
84
  assert_equal('z11', n.mint)
85
85
  assert_equal('z23', n.mint)
@@ -88,7 +88,7 @@ class TestNoid < Test::Unit::TestCase
88
88
  end
89
89
 
90
90
  should "generate sequence for type 'z', adding new xdigits as needed" do
91
- n = Noid::Minter.new :template => 'z.zdek'
91
+ n = Noid::Base.new :template => 'z.zdek'
92
92
  assert_equal('z00z', n.mint)
93
93
  assert_equal('z012', n.mint)
94
94
  assert_equal('z025', n.mint)
@@ -107,7 +107,7 @@ class TestNoid < Test::Unit::TestCase
107
107
  end
108
108
 
109
109
  should "validate 'r' digit sequences" do
110
- n = Noid::Minter.new :template => 'r.rd'
110
+ n = Noid::Base.new :template => 'r.rd'
111
111
 
112
112
  assert_equal(true, n.valid?('r1') )
113
113
  assert_equal(true, n.valid?('r9') )
@@ -117,7 +117,7 @@ class TestNoid < Test::Unit::TestCase
117
117
  end
118
118
 
119
119
  should "validate 'r' xdigit sequences" do
120
- n = Noid::Minter.new :template => 'r.re'
120
+ n = Noid::Base.new :template => 'r.re'
121
121
 
122
122
  assert_equal(true, n.valid?('r1') )
123
123
  assert_equal(true, n.valid?('r9') )
@@ -125,30 +125,10 @@ class TestNoid < Test::Unit::TestCase
125
125
  assert_equal(true, n.valid?('rb'))
126
126
  end
127
127
  should "validate 'r' xdigit + checkdigit sequences" do
128
- n = Noid::Minter.new :template => 'r.rek'
128
+ n = Noid::Base.new :template => 'r.rek'
129
129
 
130
130
  assert_equal(true, n.valid?('r2w') )
131
131
  assert_equal(false, n.valid?('r2b') )
132
132
  end
133
-
134
- should "accept identifier_class for NOID bindings" do
135
- n = Noid::Minter.new :template => 'r.rek', :identifier_class => Noid::Identifier::Base
136
- id = n.mint
137
- assert_equal(Noid::Identifier::Base, id.class)
138
- id['abc'] = 123
139
- assert_equal(123, id['abc'])
140
- end
141
-
142
- should "use singleton instance to persist NOID bindings" do
143
- n = Noid::Minter.new :template => 'r.rek', :identifier_class => Noid::Identifier::Singleton
144
- id = n.mint
145
- id['abc'] = 123
146
- assert_equal(123, id['abc'])
147
-
148
- id2 = Noid::Identifier::Singleton.new id.id
149
- assert_equal(123, id2['abc'])
150
- end
151
-
152
-
153
133
  end
154
134
  end
@@ -0,0 +1,47 @@
1
+ require 'helper'
2
+ require 'fileutils'
3
+ require 'tmpdir'
4
+
5
+ class TestNoidPersistence < Test::Unit::TestCase
6
+ context "Noid" do
7
+ should "persist data using the JSON module" do
8
+ Dir.mktmpdir do |d|
9
+ Dir.chdir d
10
+ n = Noid::Persistence::JSON.new(:template => 's.sd')
11
+ assert_equal('s0', n.mint)
12
+ assert_equal(1, n.instance_variable_get('@s'))
13
+ m = Noid::Persistence::JSON.new(:template => 's.sd')
14
+ assert_equal('s1', m.mint)
15
+ assert_equal(2, m.instance_variable_get('@s'))
16
+ end
17
+ end
18
+
19
+ should "persist data in a supplied file" do
20
+ Dir.mktmpdir do |d|
21
+ Dir.chdir d
22
+ n = Noid::Persistence::JSON.new(:template => 's.sd', :filename => 'NOID.json')
23
+ assert(File.exists?('NOID.json'))
24
+ end
25
+ end
26
+
27
+ should "persist seed data for random" do
28
+ Dir.mktmpdir do |d|
29
+ Dir.chdir d
30
+ n = Noid::Persistence::JSON.new(:template => 'r.rd')
31
+ n.mint
32
+ assert_equal(1, n.instance_variable_get('@s'))
33
+
34
+ m = Noid::Persistence::JSON.new(:template => 'r.rd')
35
+ assert_equal(n.instance_variable_get('@counters'), m.instance_variable_get('@counters'))
36
+ assert_equal(n.instance_variable_get('@s'), m.instance_variable_get('@s'))
37
+ assert_equal(n.instance_variable_get('@mask'), m.instance_variable_get('@mask'))
38
+ assert_equal(n.instance_variable_get('@characters'), m.instance_variable_get('@characters'))
39
+ assert_equal(n.instance_variable_get('@rand').seed, m.instance_variable_get('@rand').seed)
40
+ assert_equal(n.send(:min), m.send(:min))
41
+ assert_equal(n.send(:max), m.send(:max))
42
+ 5.times { assert_equal(n.mint, m.mint) }
43
+ assert_equal(6, m.instance_variable_get('@s'))
44
+ end
45
+ end
46
+ end
47
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: noid
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 1
8
+ - 3
9
9
  - 0
10
- version: 0.1.0
10
+ version: 0.3.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Chris Beer
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-12-12 00:00:00 -05:00
18
+ date: 2010-12-16 00:00:00 -05:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -33,9 +33,9 @@ dependencies:
33
33
  version: "0"
34
34
  requirement: *id001
35
35
  - !ruby/object:Gem::Dependency
36
- type: :development
36
+ type: :runtime
37
37
  prerelease: false
38
- name: shoulda
38
+ name: json
39
39
  version_requirements: &id002 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
@@ -46,11 +46,39 @@ dependencies:
46
46
  - 0
47
47
  version: "0"
48
48
  requirement: *id002
49
+ - !ruby/object:Gem::Dependency
50
+ type: :runtime
51
+ prerelease: false
52
+ name: backports
53
+ version_requirements: &id003 !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ hash: 3
59
+ segments:
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
49
77
  - !ruby/object:Gem::Dependency
50
78
  type: :development
51
79
  prerelease: false
52
80
  name: bundler
53
- version_requirements: &id003 !ruby/object:Gem::Requirement
81
+ version_requirements: &id005 !ruby/object:Gem::Requirement
54
82
  none: false
55
83
  requirements:
56
84
  - - ~>
@@ -61,12 +89,12 @@ dependencies:
61
89
  - 0
62
90
  - 0
63
91
  version: 1.0.0
64
- requirement: *id003
92
+ requirement: *id005
65
93
  - !ruby/object:Gem::Dependency
66
94
  type: :development
67
95
  prerelease: false
68
96
  name: jeweler
69
- version_requirements: &id004 !ruby/object:Gem::Requirement
97
+ version_requirements: &id006 !ruby/object:Gem::Requirement
70
98
  none: false
71
99
  requirements:
72
100
  - - ~>
@@ -77,12 +105,12 @@ dependencies:
77
105
  - 5
78
106
  - 1
79
107
  version: 1.5.1
80
- requirement: *id004
108
+ requirement: *id006
81
109
  - !ruby/object:Gem::Dependency
82
110
  type: :development
83
111
  prerelease: false
84
112
  name: rcov
85
- version_requirements: &id005 !ruby/object:Gem::Requirement
113
+ version_requirements: &id007 !ruby/object:Gem::Requirement
86
114
  none: false
87
115
  requirements:
88
116
  - - ">="
@@ -91,7 +119,7 @@ dependencies:
91
119
  segments:
92
120
  - 0
93
121
  version: "0"
94
- requirement: *id005
122
+ requirement: *id007
95
123
  description: ""
96
124
  email: chris@cbeer.info
97
125
  executables: []
@@ -109,14 +137,17 @@ files:
109
137
  - Rakefile
110
138
  - VERSION
111
139
  - lib/noid.rb
140
+ - lib/noid/base.rb
112
141
  - lib/noid/identifier.rb
113
142
  - lib/noid/identifier/anvl.rb
114
143
  - lib/noid/identifier/singleton.rb
115
- - lib/noid/minter.rb
144
+ - lib/noid/persistence.rb
145
+ - lib/noid/persistence/json.rb
116
146
  - noid.gemspec
117
147
  - test/helper.rb
118
148
  - test/test_binding.rb
119
149
  - test/test_noid.rb
150
+ - test/test_persistence.rb
120
151
  has_rdoc: true
121
152
  homepage: http://github.com/cbeer/noid
122
153
  licenses:
@@ -155,3 +186,4 @@ test_files:
155
186
  - test/helper.rb
156
187
  - test/test_binding.rb
157
188
  - test/test_noid.rb
189
+ - test/test_persistence.rb