static_uid 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,38 @@
1
+ module StaticUID
2
+ class Million
3
+
4
+ def self.generate(i)
5
+ ensure_capacity!(i)
6
+
7
+ lookup_table[i]
8
+ end
9
+
10
+ def self.capacity
11
+ lookup_table.size
12
+ end
13
+
14
+ def self.fetch_lookup_table
15
+ capacity
16
+ end
17
+
18
+ private
19
+
20
+ def self.ensure_capacity!(i)
21
+ if i >= capacity
22
+ raise RuntimeError, "Capacity (#{capacity}) exceeded with #{i}"
23
+ end
24
+ end
25
+
26
+ def self.lookup_table
27
+ @lookup_table ||= build_lookup_table
28
+ end
29
+
30
+ def self.build_lookup_table
31
+ File.open(lookup_table_file).to_a.map(&:strip)
32
+ end
33
+
34
+ def self.lookup_table_file
35
+ File.expand_path File.join('..', 'lookup_tables', 'million'), __FILE__
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,3 @@
1
+ module StaticUid
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+ require 'set'
3
+
4
+ require 'static_uid/million'
5
+
6
+ describe StaticUID::Million do
7
+ let(:generator) { StaticUID::Million }
8
+
9
+ def generate(i)
10
+ generator.generate(i)
11
+ end
12
+
13
+ describe 'generate' do
14
+ it 'emits a static uid for an integer' do
15
+ assert_kind_of String, generator.generate(22)
16
+ refute_predicate generate(22), :empty?
17
+ end
18
+
19
+ it 'emits different uids for different integers' do
20
+ refute_equal generate(1), generate(44)
21
+ end
22
+
23
+ it 'emits the same uid for equal input' do
24
+ assert_equal generate(332366), generate(332366)
25
+ end
26
+
27
+ it 'does not contain control chars at the end' do
28
+ refute_match(/\n$/, generate(22))
29
+ end
30
+
31
+ it 'is free of collisions in the promised range' do
32
+ known = Set.new
33
+
34
+ 1.upto(1_000_000).each do |i|
35
+ uid = generate(i)
36
+ refute_includes known, uid, "Collision on #{i}"
37
+ known << uid
38
+ end
39
+ end
40
+
41
+ it 'fails if range is exceeded' do
42
+ assert_raises RuntimeError do
43
+ generate(generator.capacity)
44
+ end
45
+
46
+ assert_raises RuntimeError do
47
+ generate(2_000_000)
48
+ end
49
+ end
50
+ end
51
+
52
+ describe 'capacity' do
53
+ it 'is over one million' do
54
+ assert_operator generator.capacity, :>, 1_000_000
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,2 @@
1
+ require 'minitest/autorun'
2
+ require 'minitest/spec'
@@ -0,0 +1,22 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'static_uid/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "static_uid"
8
+ spec.version = StaticUid::VERSION
9
+ spec.authors = ["Jakob Holderbaum"]
10
+ spec.email = ["jh@neopoly.de"]
11
+ spec.summary = %q{Generates static and readable UIDs}
12
+ spec.homepage = ""
13
+ spec.license = "MIT"
14
+
15
+ spec.files = `git ls-files`.split($/)
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_development_dependency "bundler", "~> 1.3"
21
+ spec.add_development_dependency "rake"
22
+ end
metadata ADDED
@@ -0,0 +1,86 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: static_uid
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Jakob Holderbaum
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-10-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description:
42
+ email:
43
+ - jh@neopoly.de
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - .gitignore
49
+ - Gemfile
50
+ - LICENSE.txt
51
+ - README.md
52
+ - Rakefile
53
+ - lib/static_uid.rb
54
+ - lib/static_uid/lookup_tables/million
55
+ - lib/static_uid/million.rb
56
+ - lib/static_uid/version.rb
57
+ - spec/million_spec.rb
58
+ - spec/spec_helper.rb
59
+ - static_uid.gemspec
60
+ homepage: ''
61
+ licenses:
62
+ - MIT
63
+ metadata: {}
64
+ post_install_message:
65
+ rdoc_options: []
66
+ require_paths:
67
+ - lib
68
+ required_ruby_version: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - '>='
71
+ - !ruby/object:Gem::Version
72
+ version: '0'
73
+ required_rubygems_version: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ requirements: []
79
+ rubyforge_project:
80
+ rubygems_version: 2.0.0
81
+ signing_key:
82
+ specification_version: 4
83
+ summary: Generates static and readable UIDs
84
+ test_files:
85
+ - spec/million_spec.rb
86
+ - spec/spec_helper.rb