better-uuid 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +1 -0
- data/.rspec +3 -0
- data/LICENSE +20 -0
- data/README.md +41 -0
- data/Rakefile +30 -0
- data/lib/benchmark.rb +29 -0
- data/lib/better-uuid.rb +28 -0
- data/lib/better-uuid/class.rb +9 -0
- data/lib/better-uuid/class_methods.rb +167 -0
- data/lib/better-uuid/instance_methods.rb +85 -0
- data/lib/better-uuid/namespace.rb +9 -0
- data/lib/better-uuid/nil.rb +3 -0
- data/lib/better-uuid/state_file.rb +111 -0
- data/lib/better-uuid/struct.rb +2 -0
- data/lib/better-uuid/version.rb +5 -0
- data/lib/better-uuid/versions.rb +8 -0
- data/spec/better-uuid_spec.rb +172 -0
- data/spec/spec_helper.rb +82 -0
- metadata +141 -0
- metadata.gz.sig +0 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: bf1e28e13ece5b54517f75f4dbeb57ae5fb5b9c7
|
4
|
+
data.tar.gz: 6336da4021c61f05105ddf3c4cfacef1f9f99d7d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 65c53c292aca251a8f4fb60802aa608c42907b03a1a54b05e78e1cef847ba1996103e9fe9ff510133f11659fda105ada419227e8e1117dfd79a092fe8a2a433a
|
7
|
+
data.tar.gz: c7a421d5f807749c855ae3c37a3d67ac4d3c97688655ba3a38a2c0c3fc6823bb26fc0160732e45e60bec82bf047baccc6e42aeadef326a90286b36406e2f9599
|
checksums.yaml.gz.sig
ADDED
Binary file
|
data.tar.gz.sig
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
�j�b�]�AY�*�����u�N��7, �ཫ 4~�Xb:,�dߴeF5�Vir�A5u�k��H�����9�SX�p_<���]����;��}���A[���Z�S�������`ry�/��=wɯ<�ofG�C4���W��':�(��u�68��g�*;Z��-E�qt�.0�0g�i|�3�uz,r����u�S�:c��ͼ��bg�W�lybVu.�f|)Z(��������5;5|��;,��'N)���U`��q�
|
data/.rspec
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2014 Barry Allard
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
[![Build Status](https://travis-ci.org/steakknife/better-uuid.svg)](https://travis-ci.org/steakknife/better-uuid)
|
2
|
+
|
3
|
+
# BetterUUID
|
4
|
+
|
5
|
+
## Advantages
|
6
|
+
|
7
|
+
- Very fast because it doesn't hit disk on every create, updates in a seperate thread
|
8
|
+
|
9
|
+
|
10
|
+
## Usage
|
11
|
+
|
12
|
+
BetterUUID.create # or create_v1
|
13
|
+
BetterUUID.create_v3 'key', BetterUUID::Namespace::DNS # or URL, OID or X500
|
14
|
+
BetterUUID.create_v4 # random
|
15
|
+
BetterUUID.create_v5 'key', BetterUUID::Namespace::DNS # or URL, OID or X500
|
16
|
+
|
17
|
+
BetterUUID.parse 'urn:uuid:6ba7b810-9dad-11d1-80b4-00c04fd430c8'
|
18
|
+
|
19
|
+
## Installation
|
20
|
+
|
21
|
+
### Bundler
|
22
|
+
|
23
|
+
gem 'better-uuid'
|
24
|
+
|
25
|
+
### manually
|
26
|
+
|
27
|
+
gem cert --add <(curl -L https://raw.githubusercontent.com/steakknife/better-uuid/master/gem-public_cert.pem)
|
28
|
+
gem install better-uuid -P HighSecurity
|
29
|
+
|
30
|
+
## Author
|
31
|
+
|
32
|
+
Barry Allard
|
33
|
+
|
34
|
+
## Attribution
|
35
|
+
|
36
|
+
Heavily based off https://github.com/spectra/ruby-uuid
|
37
|
+
which was based on http://mput.dip.jp/mput/uuid.txt
|
38
|
+
|
39
|
+
## License
|
40
|
+
|
41
|
+
MIT
|
data/Rakefile
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
begin
|
2
|
+
require 'bundler/setup'
|
3
|
+
rescue LoadError
|
4
|
+
fail 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'rdoc/task'
|
8
|
+
|
9
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
10
|
+
rdoc.rdoc_dir = 'rdoc'
|
11
|
+
rdoc.title = 'BetterUUID'
|
12
|
+
rdoc.options << '--line-numbers'
|
13
|
+
rdoc.rdoc_files.include('README.rdoc')
|
14
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
|
+
end
|
16
|
+
|
17
|
+
Bundler::GemHelper.install_tasks
|
18
|
+
|
19
|
+
desc 'Run RSpec specs'
|
20
|
+
task :spec do
|
21
|
+
ARGV.delete 'spec'
|
22
|
+
sh "bundle exec rspec #{ARGV.join ' '}"
|
23
|
+
end
|
24
|
+
|
25
|
+
desc 'Benchmark'
|
26
|
+
task :benchmark do
|
27
|
+
sh "bundle exec ruby lib/benchmark.rb"
|
28
|
+
end
|
29
|
+
|
30
|
+
task default: :spec
|
data/lib/benchmark.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'better-uuid'
|
2
|
+
begin
|
3
|
+
require 'absolute_time'
|
4
|
+
rescue LoadError
|
5
|
+
require 'benchmark'
|
6
|
+
end
|
7
|
+
NUM_OPS = 1_000_000
|
8
|
+
|
9
|
+
FOO = 'foo'
|
10
|
+
|
11
|
+
def time(&block)
|
12
|
+
(defined?(AbsoluteTime) ? AbsoluteTime : Benchmark).realtime(&block)
|
13
|
+
end
|
14
|
+
|
15
|
+
# v1
|
16
|
+
seconds = time { NUM_OPS.times { BetterUUID.create_v1 } }
|
17
|
+
puts "#{NUM_OPS / seconds} create_v1/sec (#{1e6*seconds / NUM_OPS} usec/op)"
|
18
|
+
|
19
|
+
# v3
|
20
|
+
seconds = time { NUM_OPS.times { BetterUUID.create_v3 FOO, BetterUUID::Namespace::URL } }
|
21
|
+
puts "#{NUM_OPS / seconds} create_v3/sec (#{1e6*seconds / NUM_OPS} usec/op)"
|
22
|
+
|
23
|
+
# v4
|
24
|
+
seconds = time { NUM_OPS.times { BetterUUID.create_v4 } }
|
25
|
+
puts "#{NUM_OPS / seconds} create_v4/sec (#{1e6*seconds / NUM_OPS} usec/op)"
|
26
|
+
|
27
|
+
# v5
|
28
|
+
seconds = time { NUM_OPS.times { BetterUUID.create_v5 FOO, BetterUUID::Namespace::URL } }
|
29
|
+
puts "#{NUM_OPS / seconds} create_v5/sec (#{1e6*seconds / NUM_OPS} usec/op)"
|
data/lib/better-uuid.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
### https://raw.githubusercontent.com/spectra/ruby-uuid/master/uuid.rb
|
2
|
+
### original http://mput.dip.jp/mput/uuid.txt
|
3
|
+
|
4
|
+
# Copyright(c) 2005 URABE, Shyouhei.
|
5
|
+
#
|
6
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
+
# of this code, to deal in the code without restriction, including without
|
8
|
+
# limitation the rights to use, copy, modify, merge, publish, distribute,
|
9
|
+
# sublicense, and/or sell copies of the code, and to permit persons to whom the
|
10
|
+
# code is furnished to do so, subject to the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the code.
|
14
|
+
#
|
15
|
+
# THE CODE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
# AUTHOR OR COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
# OUT OF OR IN CONNECTION WITH THE CODE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
# CODE.
|
22
|
+
#
|
23
|
+
# 2009-02-20: Modified by Pablo Lorenzoni <pablo@propus.com.br> to correctly
|
24
|
+
# include the version in the raw_bytes.
|
25
|
+
|
26
|
+
require 'better-uuid/class'
|
27
|
+
require 'better-uuid/namespace'
|
28
|
+
require 'better-uuid/nil'
|
@@ -0,0 +1,167 @@
|
|
1
|
+
### https://raw.githubusercontent.com/spectra/ruby-uuid/master/uuid.rb
|
2
|
+
### original http://mput.dip.jp/mput/uuid.txt
|
3
|
+
|
4
|
+
# Copyright(c) 2005 URABE, Shyouhei.
|
5
|
+
#
|
6
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
+
# of this code, to deal in the code without restriction, including without
|
8
|
+
# limitation the rights to use, copy, modify, merge, publish, distribute,
|
9
|
+
# sublicense, and/or sell copies of the code, and to permit persons to whom the
|
10
|
+
# code is furnished to do so, subject to the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the code.
|
14
|
+
#
|
15
|
+
# THE CODE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
# AUTHOR OR COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
# OUT OF OR IN CONNECTION WITH THE CODE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
# CODE.
|
22
|
+
#
|
23
|
+
# 2009-02-20: Modified by Pablo Lorenzoni <pablo@propus.com.br> to correctly
|
24
|
+
# include the version in the raw_bytes.
|
25
|
+
|
26
|
+
require 'better-uuid/state_file'
|
27
|
+
|
28
|
+
require 'digest/md5'
|
29
|
+
require 'digest/sha1'
|
30
|
+
|
31
|
+
|
32
|
+
# Pure ruby UUID generator, which is compatible with RFC4122
|
33
|
+
|
34
|
+
class BetterUUID
|
35
|
+
|
36
|
+
module ClassMethods
|
37
|
+
def mask19(v, str) # :nodoc
|
38
|
+
nstr = str.bytes.to_a
|
39
|
+
version = [0, 16, 32, 48, 64, 80][v]
|
40
|
+
nstr[6] &= 0b00001111
|
41
|
+
nstr[6] |= version
|
42
|
+
# nstr[7] &= 0b00001111
|
43
|
+
# nstr[7] |= 0b01010000
|
44
|
+
nstr[8] &= 0b00111111
|
45
|
+
nstr[8] |= 0b10000000
|
46
|
+
str = ''
|
47
|
+
nstr.each { |s| str << s.chr }
|
48
|
+
str
|
49
|
+
end
|
50
|
+
|
51
|
+
def mask18(v, str) # :nodoc
|
52
|
+
version = [0, 16, 32, 48, 64, 80][v]
|
53
|
+
str[6] &= 0b00001111
|
54
|
+
str[6] |= version
|
55
|
+
# str[7] &= 0b00001111
|
56
|
+
# str[7] |= 0b01010000
|
57
|
+
str[8] &= 0b00111111
|
58
|
+
str[8] |= 0b10000000
|
59
|
+
str
|
60
|
+
end
|
61
|
+
|
62
|
+
def mask(v, str)
|
63
|
+
if RUBY_VERSION >= '1.9.0'
|
64
|
+
return mask19 v, str
|
65
|
+
else
|
66
|
+
return mask18 v, str
|
67
|
+
end
|
68
|
+
end
|
69
|
+
private :mask, :mask18, :mask19
|
70
|
+
|
71
|
+
# UUID generation using SHA1. Recommended over create_md5.
|
72
|
+
# Namespace object is another UUID, some of them are pre-defined below.
|
73
|
+
def create_sha1(str, namespace)
|
74
|
+
sha1 = Digest::SHA1.new
|
75
|
+
sha1.update namespace.raw_bytes
|
76
|
+
sha1.update str
|
77
|
+
sum = sha1.digest
|
78
|
+
raw = mask 5, sum[0..15]
|
79
|
+
ret = new raw
|
80
|
+
ret.freeze
|
81
|
+
ret
|
82
|
+
end
|
83
|
+
alias :create_v5 :create_sha1
|
84
|
+
|
85
|
+
# UUID generation using MD5 (for backward compat.)
|
86
|
+
def create_md5(str, namespace)
|
87
|
+
md5 = Digest::MD5.new
|
88
|
+
md5.update namespace.raw_bytes
|
89
|
+
md5.update str
|
90
|
+
sum = md5.digest
|
91
|
+
raw = mask 3, sum[0..16]
|
92
|
+
ret = new raw
|
93
|
+
ret.freeze
|
94
|
+
ret
|
95
|
+
end
|
96
|
+
alias :create_v3 :create_md5
|
97
|
+
|
98
|
+
# UUID generation using random-number generator. From it's random
|
99
|
+
# nature, there's no warranty that the created ID is really universaly
|
100
|
+
# unique.
|
101
|
+
def create_random
|
102
|
+
rnd = [
|
103
|
+
rand(0x100000000),
|
104
|
+
rand(0x100000000),
|
105
|
+
rand(0x100000000),
|
106
|
+
rand(0x100000000),
|
107
|
+
].pack 'N4'
|
108
|
+
raw = mask 4, rnd
|
109
|
+
ret = new raw
|
110
|
+
ret.freeze
|
111
|
+
ret
|
112
|
+
end
|
113
|
+
alias :create_v4 :create_random
|
114
|
+
|
115
|
+
def get_time
|
116
|
+
# UUID epoch is 1582/Oct/15
|
117
|
+
tt = Time.now
|
118
|
+
tt.to_i*10000000 + tt.tv_usec*10 + 0x01B21DD213814000
|
119
|
+
end
|
120
|
+
private :get_time
|
121
|
+
|
122
|
+
# create the 'version 1' UUID with current system clock, current UTC
|
123
|
+
# timestamp, and the IEEE 802 address (so-called MAC address).
|
124
|
+
#
|
125
|
+
# Speed notice: it's slow. It writes some data into hard drive on every
|
126
|
+
# invokation. If you want to speed this up, try remounting tmpdir with a
|
127
|
+
# memory based filesystem (such as tmpfs). STILL slow? then no way but
|
128
|
+
# rewrite it with c :)
|
129
|
+
def create(clock = nil, time = nil, mac_addr = nil)
|
130
|
+
c, m = StateFile::update(clock, mac_addr)
|
131
|
+
time ||= get_time
|
132
|
+
|
133
|
+
tl = time & 0xFFFF_FFFF
|
134
|
+
tm = time >> 32
|
135
|
+
tm = tm & 0xFFFF
|
136
|
+
th = time >> 48
|
137
|
+
th = th & 0x0FFF
|
138
|
+
th = th | 0x1000
|
139
|
+
cl = c & 0xFF
|
140
|
+
ch = c & 0x3F00
|
141
|
+
ch = ch >> 8
|
142
|
+
ch = ch | 0x80
|
143
|
+
pack tl, tm, th, cl, ch, m
|
144
|
+
end
|
145
|
+
alias :create_v1 :create
|
146
|
+
|
147
|
+
# A simple GUID parser: just ignores unknown characters and convert
|
148
|
+
# hexadecimal dump into 16-octet object.
|
149
|
+
def parse(obj)
|
150
|
+
str = obj.to_s.sub %r/\Aurn:uuid:/, ''
|
151
|
+
str.gsub! %r/[^0-9A-Fa-f]/, ''
|
152
|
+
raw = str[0..31].lines.to_a.pack 'H*'
|
153
|
+
ret = new raw
|
154
|
+
ret.freeze
|
155
|
+
ret
|
156
|
+
end
|
157
|
+
|
158
|
+
# The 'primitive constructor' of this class
|
159
|
+
# Note UUID.pack(uuid.unpack) == uuid
|
160
|
+
def pack(tl, tm, th, ch, cl, n)
|
161
|
+
raw = [tl, tm, th, ch, cl, n].pack 'NnnCCa6'
|
162
|
+
ret = new raw
|
163
|
+
ret.freeze
|
164
|
+
ret
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
### https://raw.githubusercontent.com/spectra/ruby-uuid/master/uuid.rb
|
2
|
+
### original http://mput.dip.jp/mput/uuid.txt
|
3
|
+
|
4
|
+
# Copyright(c) 2005 URABE, Shyouhei.
|
5
|
+
#
|
6
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
+
# of this code, to deal in the code without restriction, including without
|
8
|
+
# limitation the rights to use, copy, modify, merge, publish, distribute,
|
9
|
+
# sublicense, and/or sell copies of the code, and to permit persons to whom the
|
10
|
+
# code is furnished to do so, subject to the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the code.
|
14
|
+
#
|
15
|
+
# THE CODE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
# AUTHOR OR COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
# OUT OF OR IN CONNECTION WITH THE CODE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
# CODE.
|
22
|
+
#
|
23
|
+
# 2009-02-20: Modified by Pablo Lorenzoni <pablo@propus.com.br> to correctly
|
24
|
+
# include the version in the raw_bytes.
|
25
|
+
|
26
|
+
|
27
|
+
# Pure ruby UUID generator, which is compatible with RFC4122
|
28
|
+
|
29
|
+
class BetterUUID
|
30
|
+
module InstanceMethods
|
31
|
+
|
32
|
+
# The 'primitive deconstructor', or the dual to pack.
|
33
|
+
# Note UUID.pack(uuid.unpack) == uuid
|
34
|
+
def unpack
|
35
|
+
raw_bytes.unpack 'NnnCCa6'
|
36
|
+
end
|
37
|
+
|
38
|
+
# Generate the string representation (a.k.a GUID) of this UUID
|
39
|
+
def to_s
|
40
|
+
a = unpack
|
41
|
+
tmp = a[-1].unpack 'C*'
|
42
|
+
a[-1] = sprintf '%02x%02x%02x%02x%02x%02x', *tmp
|
43
|
+
'%08x-%04x-%04x-%02x%02x-%s' % a
|
44
|
+
end
|
45
|
+
alias guid to_s
|
46
|
+
|
47
|
+
# Convert into a RFC4122-comforming URN representation
|
48
|
+
def to_uri
|
49
|
+
'urn:uuid:' + self.to_s
|
50
|
+
end
|
51
|
+
alias urn to_uri
|
52
|
+
|
53
|
+
# Convert into 128-bit unsigned integer
|
54
|
+
# Typically a Bignum instance, but can be a Fixnum.
|
55
|
+
def to_int
|
56
|
+
tmp = self.raw_bytes.unpack 'C*'
|
57
|
+
tmp.inject do |r, i|
|
58
|
+
r * 256 | i
|
59
|
+
end
|
60
|
+
end
|
61
|
+
alias to_i to_int
|
62
|
+
|
63
|
+
# Gets the version of this UUID
|
64
|
+
# returns nil if bad version
|
65
|
+
def version
|
66
|
+
a = unpack
|
67
|
+
v = (a[2] & 0xF000).to_s(16)[0].chr.to_i
|
68
|
+
return v if (1..5).include? v
|
69
|
+
return nil
|
70
|
+
end
|
71
|
+
|
72
|
+
# Two UUIDs are said to be equal if and only if their (byte-order
|
73
|
+
# canonicalized) integer representations are equivallent. Refer RFC4122 for
|
74
|
+
# details.
|
75
|
+
def ==(other)
|
76
|
+
to_i == other.to_i
|
77
|
+
end
|
78
|
+
|
79
|
+
include Comparable
|
80
|
+
# UUIDs are comparable (don't know what benefits are there, though).
|
81
|
+
def <=>(other)
|
82
|
+
to_s <=> other.to_s
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
class BetterUUID
|
2
|
+
# Pre-defined UUID Namespaces described in RFC4122 Appendix C.
|
3
|
+
module Namespace
|
4
|
+
DNS = BetterUUID.parse '6ba7b810-9dad-11d1-80b4-00c04fd430c8'
|
5
|
+
URL = BetterUUID.parse '6ba7b811-9dad-11d1-80b4-00c04fd430c8'
|
6
|
+
OID = BetterUUID.parse '6ba7b812-9dad-11d1-80b4-00c04fd430c8'
|
7
|
+
X500 = BetterUUID.parse '6ba7b814-9dad-11d1-80b4-00c04fd430c8'
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'digest/sha1'
|
2
|
+
require 'tmpdir'
|
3
|
+
|
4
|
+
# Pure ruby UUID generator, which is compatible with RFC4122
|
5
|
+
|
6
|
+
class BetterUUID
|
7
|
+
module StateFile
|
8
|
+
extend self
|
9
|
+
|
10
|
+
FILENAME = 'better-uuid.ruby.marshall'
|
11
|
+
|
12
|
+
def update(clock = nil, mac_addr = nil)
|
13
|
+
result = change_state(clock, mac_addr)
|
14
|
+
start_background_writer
|
15
|
+
result
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
def start_background_writer
|
20
|
+
$_better_uuid_background_writer ||= Thread.new { background_writer }
|
21
|
+
end
|
22
|
+
|
23
|
+
def background_write
|
24
|
+
if $_better_uuid_background_writer_state_dirty
|
25
|
+
open(filename, 'wb') { |fp|
|
26
|
+
fp.flock IO::LOCK_EX
|
27
|
+
write fp
|
28
|
+
}
|
29
|
+
$_better_uuid_background_writer_state_dirty = false
|
30
|
+
end
|
31
|
+
rescue Errno::EACCES, Errno::ENOENT, Errno::ENOSPC
|
32
|
+
end
|
33
|
+
|
34
|
+
def background_writer
|
35
|
+
$_better_uuid_background_writer_state_dirty ||= false
|
36
|
+
at_exit { background_write }
|
37
|
+
loop do
|
38
|
+
background_write
|
39
|
+
sleep 3
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def pseudo_mac
|
44
|
+
# Generate a pseudo MAC address because we have no pure-ruby way
|
45
|
+
# to know the MAC address of the NIC this system uses. Note
|
46
|
+
# that cheating with pseudo arresses here is completely legal:
|
47
|
+
# see Section 4.5 of RFC4122 for details.
|
48
|
+
sha1 = Digest::SHA1.new
|
49
|
+
256.times do
|
50
|
+
r = [rand(0x100000000)].pack 'N'
|
51
|
+
sha1.update r
|
52
|
+
end
|
53
|
+
str = sha1.digest
|
54
|
+
r = rand 14 # 20-6
|
55
|
+
node = str[r, 6] || str
|
56
|
+
if RUBY_VERSION >= '1.9.0'
|
57
|
+
nnode = node.bytes.to_a
|
58
|
+
nnode[0] |= 0x01
|
59
|
+
node = ''
|
60
|
+
nnode.each { |s| node << s.chr }
|
61
|
+
else
|
62
|
+
node[0] |= 0x01 # multicast bit
|
63
|
+
end
|
64
|
+
node
|
65
|
+
end
|
66
|
+
|
67
|
+
def default_initial_state
|
68
|
+
[ rand(0x40000), pseudo_mac ]
|
69
|
+
end
|
70
|
+
|
71
|
+
def initial_state
|
72
|
+
begin
|
73
|
+
open(filename, 'rb') { |fp|
|
74
|
+
fp.flock IO::LOCK_EX
|
75
|
+
read fp
|
76
|
+
}
|
77
|
+
rescue Errno::EACCES, Errno::ENOENT, ArgumentError
|
78
|
+
default_initial_state
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def next_state(clock = nil, mac_addr = nil)
|
83
|
+
$_better_uuid_background_writer_state_dirty = true
|
84
|
+
c = clock ? (clock % 0x4000) : @c
|
85
|
+
m = mac_addr ? mac_addr : @m
|
86
|
+
c = c.succ
|
87
|
+
[ c, m ]
|
88
|
+
end
|
89
|
+
|
90
|
+
def change_state(clock, mac_addr)
|
91
|
+
@c, @m = if instance_variable_defined?(:@_better_uuid_initialized)
|
92
|
+
next_state(clock, mac_addr)
|
93
|
+
else
|
94
|
+
@_better_uuid_initialized = true
|
95
|
+
initial_state
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def read(fp) # :nodoc:
|
100
|
+
Marshal.load fp.read
|
101
|
+
end
|
102
|
+
|
103
|
+
def filename
|
104
|
+
File.join(Dir.tmpdir, FILENAME)
|
105
|
+
end
|
106
|
+
|
107
|
+
def write(fp) # :nodoc:
|
108
|
+
fp.write Marshal.dump([@c, @m])
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,172 @@
|
|
1
|
+
require 'better-uuid'
|
2
|
+
|
3
|
+
describe BetterUUID do
|
4
|
+
context 'v1' do
|
5
|
+
describe '#version' do
|
6
|
+
it { u = BetterUUID.create_v1
|
7
|
+
expect(u.version).to be(1) }
|
8
|
+
end
|
9
|
+
|
10
|
+
describe '.create' do
|
11
|
+
context 'unique' do
|
12
|
+
it { u1 = BetterUUID.create
|
13
|
+
u2 = BetterUUID.create
|
14
|
+
expect(u1).not_to eq(u2) }
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'repeatable' do
|
18
|
+
it { u1 = BetterUUID.create 1, 2, '345678'
|
19
|
+
u2 = BetterUUID.create 1, 2, '345678'
|
20
|
+
expect(u1).to eq(u2) }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '.create_v1' do
|
25
|
+
context 'same as .create' do
|
26
|
+
it { u1 = BetterUUID.create 1, 2, '345678'
|
27
|
+
u2 = BetterUUID.create_v1 1, 2, '345678'
|
28
|
+
expect(u1).to eq(u2) }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'v3' do
|
34
|
+
describe '#version' do
|
35
|
+
it { u = BetterUUID.create_md5 'foo', BetterUUID::Namespace::DNS
|
36
|
+
expect(u.version).to be(3) }
|
37
|
+
end
|
38
|
+
|
39
|
+
describe '.create_md5' do
|
40
|
+
context 'unique' do
|
41
|
+
it { u1 = BetterUUID.create_md5 'foo', BetterUUID::Namespace::DNS
|
42
|
+
u2 = BetterUUID.create_md5 'foo', BetterUUID::Namespace::URL
|
43
|
+
u3 = BetterUUID.create_md5 'bar', BetterUUID::Namespace::DNS
|
44
|
+
expect(u1).not_to eq(u2)
|
45
|
+
expect(u1).not_to eq(u3) }
|
46
|
+
end
|
47
|
+
|
48
|
+
context 'repeatable' do
|
49
|
+
it { u1 = BetterUUID.create_md5 'foo', BetterUUID::Namespace::DNS
|
50
|
+
u2 = BetterUUID.create_md5 'foo', BetterUUID::Namespace::DNS
|
51
|
+
expect(u1).to eq(u2) }
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context 'v4' do
|
57
|
+
describe '#version' do
|
58
|
+
it { u = BetterUUID.create_random
|
59
|
+
expect(u.version).to be(4) }
|
60
|
+
end
|
61
|
+
|
62
|
+
describe '.create_random' do
|
63
|
+
context 'unique' do
|
64
|
+
# This test is not perfect, because the random nature of version 4
|
65
|
+
# BetterUUID it is not always true that the three objects below really
|
66
|
+
# differ. But in real life it's enough to say we're OK when this
|
67
|
+
# passes.
|
68
|
+
it { u1 = BetterUUID.create_random
|
69
|
+
u2 = BetterUUID.create_random
|
70
|
+
u3 = BetterUUID.create_random
|
71
|
+
expect(u1).not_to eq(u2)
|
72
|
+
expect(u1).not_to eq(u3) }
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe '.create_v4' do
|
77
|
+
context 'same as .create_random' do
|
78
|
+
it { expect(BetterUUID.create_random.version).to eq(BetterUUID.create_v4.version) }
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
context 'v5' do
|
84
|
+
describe '#version' do
|
85
|
+
it { u = BetterUUID.create_sha1 'foo', BetterUUID::Namespace::DNS
|
86
|
+
expect(u.version).to be(5) }
|
87
|
+
end
|
88
|
+
|
89
|
+
describe '.create_sha1' do
|
90
|
+
context 'repeatable' do
|
91
|
+
it { u1 = BetterUUID.create_sha1 'foo', BetterUUID::Namespace::DNS
|
92
|
+
u2 = BetterUUID.create_sha1 'foo', BetterUUID::Namespace::DNS
|
93
|
+
expect(u1).to eq(u2) }
|
94
|
+
end
|
95
|
+
|
96
|
+
context 'unique' do
|
97
|
+
it { u1 = BetterUUID.create_sha1 'foo', BetterUUID::Namespace::DNS
|
98
|
+
u2 = BetterUUID.create_sha1 'foo', BetterUUID::Namespace::URL
|
99
|
+
u3 = BetterUUID.create_sha1 'bar', BetterUUID::Namespace::DNS
|
100
|
+
expect(u1).not_to eq(u2)
|
101
|
+
expect(u1).not_to eq(u3) }
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
describe '.create_v5' do
|
106
|
+
context 'same as .create_sha1' do
|
107
|
+
it { u1 = BetterUUID.create_sha1 'foo', BetterUUID::Namespace::DNS
|
108
|
+
u2 = BetterUUID.create_v5 'foo', BetterUUID::Namespace::DNS
|
109
|
+
expect(u1).to eq(u2) }
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
describe '.pack' do
|
115
|
+
it { u = BetterUUID.pack(0x6ba7b810, 0x9dad, 0x11d1, 0x80, 0xb4, "\000\300O\3240\310")
|
116
|
+
expect(u).to eq(BetterUUID::Namespace::DNS) }
|
117
|
+
end
|
118
|
+
|
119
|
+
describe '.unpack' do
|
120
|
+
it { tl, tm, th, cl, ch, m = BetterUUID::Namespace::DNS.unpack
|
121
|
+
expect(tl).to eq(0x6ba7b810)
|
122
|
+
expect(tm).to eq(0x9dad)
|
123
|
+
expect(th).to eq(0x11d1)
|
124
|
+
expect(cl).to eq(0x80)
|
125
|
+
expect(ch).to eq(0xb4)
|
126
|
+
expect(m).to eq("\000\300O\3240\310".force_encoding('ASCII-8BIT')) }
|
127
|
+
end
|
128
|
+
|
129
|
+
describe '.parse' do
|
130
|
+
it { u1 = BetterUUID.pack 0x6ba7b810, 0x9dad, 0x11d1, 0x80, 0xb4, "\000\300O\3240\310"
|
131
|
+
u2 = BetterUUID.parse '6ba7b810-9dad-11d1-80b4-00c04fd430c8'
|
132
|
+
u3 = BetterUUID.parse 'urn:uuid:6ba7b810-9dad-11d1-80b4-00c04fd430c8'
|
133
|
+
expect(u1).to eq(u2)
|
134
|
+
expect(u1).to eq(u3) }
|
135
|
+
end
|
136
|
+
|
137
|
+
describe '.to_s' do
|
138
|
+
it { s = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'
|
139
|
+
u = BetterUUID.parse(s)
|
140
|
+
expect(u.to_s).to eq(s) }
|
141
|
+
end
|
142
|
+
|
143
|
+
describe '.guid' do
|
144
|
+
context 'same as .to_s' do
|
145
|
+
it { u = BetterUUID.create
|
146
|
+
expect(u.guid).to eq(u.to_s) }
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
describe '.to_uri' do
|
151
|
+
context 'works' do
|
152
|
+
it { s = 'urn:uuid:6ba7b810-9dad-11d1-80b4-00c04fd430c8'
|
153
|
+
u = BetterUUID.parse s
|
154
|
+
expect(u.to_uri).to eq(s) }
|
155
|
+
end
|
156
|
+
|
157
|
+
context 'same as .urn' do
|
158
|
+
it { s = 'urn:uuid:6ba7b810-9dad-11d1-80b4-00c04fd430c8'
|
159
|
+
u = BetterUUID.parse s
|
160
|
+
expect(u.urn).to eq(u.to_uri) }
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
describe '.to_i' do
|
165
|
+
it { s = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'
|
166
|
+
u = BetterUUID.parse(s)
|
167
|
+
i = 0x6ba7b8109dad11d180b400c04fd430c8
|
168
|
+
expect(u.to_i).to eq(i) }
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
# This file was generated by the `rspec --init` command. Conventionally, all
|
2
|
+
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
3
|
+
# The generated `.rspec` file contains `--require spec_helper` which will cause this
|
4
|
+
# file to always be loaded, without a need to explicitly require it in any files.
|
5
|
+
#
|
6
|
+
# Given that it is always loaded, you are encouraged to keep this file as
|
7
|
+
# light-weight as possible. Requiring heavyweight dependencies from this file
|
8
|
+
# (such as loading up an entire rails app) will add to the boot time of your
|
9
|
+
# test suite on EVERY test run, even for an individual file that may not need
|
10
|
+
# all of that loaded.
|
11
|
+
#
|
12
|
+
# The `.rspec` file also contains a few flags that are not defaults but that
|
13
|
+
# users commonly want.
|
14
|
+
#
|
15
|
+
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
16
|
+
RSpec.configure do |config|
|
17
|
+
# The settings below are suggested to provide a good initial experience
|
18
|
+
# with RSpec, but feel free to customize to your heart's content.
|
19
|
+
=begin
|
20
|
+
# These two settings work together to allow you to limit a spec run
|
21
|
+
# to individual examples or groups you care about by tagging them with
|
22
|
+
# `:focus` metadata. When nothing is tagged with `:focus`, all examples
|
23
|
+
# get run.
|
24
|
+
config.filter_run :focus
|
25
|
+
config.run_all_when_everything_filtered = true
|
26
|
+
|
27
|
+
# Many RSpec users commonly either run the entire suite or an individual
|
28
|
+
# file, and it's useful to allow more verbose output when running an
|
29
|
+
# individual spec file.
|
30
|
+
if config.files_to_run.one?
|
31
|
+
# RSpec filters the backtrace by default so as not to be so noisy.
|
32
|
+
# This causes the full backtrace to be printed when running a single
|
33
|
+
# spec file (e.g. to troubleshoot a particular spec failure).
|
34
|
+
config.full_backtrace = true
|
35
|
+
|
36
|
+
# Use the documentation formatter for detailed output,
|
37
|
+
# unless a formatter has already been configured
|
38
|
+
# (e.g. via a command-line flag).
|
39
|
+
config.formatter = 'doc' if config.formatters.none?
|
40
|
+
end
|
41
|
+
|
42
|
+
# Print the 10 slowest examples and example groups at the
|
43
|
+
# end of the spec run, to help surface which specs are running
|
44
|
+
# particularly slow.
|
45
|
+
config.profile_examples = 10
|
46
|
+
|
47
|
+
# Run specs in random order to surface order dependencies. If you find an
|
48
|
+
# order dependency and want to debug it, you can fix the order by providing
|
49
|
+
# the seed, which is printed after each run.
|
50
|
+
# --seed 1234
|
51
|
+
config.order = :random
|
52
|
+
|
53
|
+
# Seed global randomization in this process using the `--seed` CLI option.
|
54
|
+
# Setting this allows you to use `--seed` to deterministically reproduce
|
55
|
+
# test failures related to randomization by passing the same `--seed` value
|
56
|
+
# as the one that triggered the failure.
|
57
|
+
Kernel.srand config.seed
|
58
|
+
|
59
|
+
# rspec-expectations config goes here. You can use an alternate
|
60
|
+
# assertion/expectation library such as wrong or the stdlib/minitest
|
61
|
+
# assertions if you prefer.
|
62
|
+
config.expect_with :rspec do |expectations|
|
63
|
+
# Enable only the newer, non-monkey-patching expect syntax.
|
64
|
+
# For more details, see:
|
65
|
+
# - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
|
66
|
+
expectations.syntax = :expect
|
67
|
+
end
|
68
|
+
|
69
|
+
# rspec-mocks config goes here. You can use an alternate test double
|
70
|
+
# library (such as bogus or mocha) by changing the `mock_with` option here.
|
71
|
+
config.mock_with :rspec do |mocks|
|
72
|
+
# Enable only the newer, non-monkey-patching expect syntax.
|
73
|
+
# For more details, see:
|
74
|
+
# - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
|
75
|
+
mocks.syntax = :expect
|
76
|
+
|
77
|
+
# Prevents you from mocking or stubbing a method that does not exist on
|
78
|
+
# a real object. This is generally recommended.
|
79
|
+
mocks.verify_partial_doubles = true
|
80
|
+
end
|
81
|
+
=end
|
82
|
+
end
|
metadata
ADDED
@@ -0,0 +1,141 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: better-uuid
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Barry Allard
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain:
|
11
|
+
- |
|
12
|
+
-----BEGIN CERTIFICATE-----
|
13
|
+
MIIDOjCCAiKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBDMRUwEwYDVQQDDAxiYXJy
|
14
|
+
eS5hbGxhcmQxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkW
|
15
|
+
A2NvbTAeFw0xMzA0MDgwMTI0NThaFw0xNDA0MDgwMTI0NThaMEMxFTATBgNVBAMM
|
16
|
+
DGJhcnJ5LmFsbGFyZDEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPy
|
17
|
+
LGQBGRYDY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvDcmlxJH
|
18
|
+
eySiUBcYTqGXaWETRVYmgfGwWRPZzqkmBdIVZkbk9SWxseiHWIReFWjP438UoUTs
|
19
|
+
J17G/HuQb0SmjPCMZy8967Fb2wqs+QRbcmpnmtYA1vilgC2CIzntFOFLSA2KpfZH
|
20
|
+
dJSsg6aaXqwS4/KJxK6ooDsp+iR6zGTINwkdUt4ktpqgCHz1VYuzvii2slnazbm4
|
21
|
+
cQUi/wWIynHyzzdrPvDhGgaZm161MYHidCtV+wzqwjeVeFsyQwCFVEkrD/0G98ho
|
22
|
+
Gti8vB6Xj6VjO3n+kh/KlYZgmM7SWauLpo+2RGlIYVYdpQQWGwhMEmvSgBxjfX4c
|
23
|
+
unDFxO1ZAQIRBQIDAQABozkwNzAJBgNVHRMEAjAAMB0GA1UdDgQWBBS+Kk7ypi9u
|
24
|
+
kFUcaqJlpaKO7eWiUTALBgNVHQ8EBAMCBLAwDQYJKoZIhvcNAQEFBQADggEBALie
|
25
|
+
YCNeW9EIQ/j8+2emMm0484JVtycOqPyIu5UALtsU42En392HVOZ6oEA/rh2KFRvq
|
26
|
+
dcDwcJPI/u7PzWp9TNp81PTShtHMtSs7Wv1UsC04vQ9b6XBEomWbbzoxxgzyjP7l
|
27
|
+
ZV4L5HzmX0nDOSEFJyYkqbwgYjIoldg2TMlw2BeoVqGm7Gx1ljXKb2Kg5iasyDpI
|
28
|
+
C/gAiGBIAX7FxyIXmjZq38xWBOxyGF3NFL/W6z+vhJg81HGdNBCpIdwrQ/eXOjba
|
29
|
+
VqwwfY+Ms3gcCHSERG1X4AFW1zesX+UWcTCwVLtAsuRWQhC8odDSVDWzUfkZmOQt
|
30
|
+
ViIxU1ZphInql7L5g34=
|
31
|
+
-----END CERTIFICATE-----
|
32
|
+
date: 2014-04-02 00:00:00.000000000 Z
|
33
|
+
dependencies:
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: rake
|
36
|
+
requirement: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
type: :development
|
42
|
+
prerelease: false
|
43
|
+
version_requirements: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: rspec
|
50
|
+
requirement: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: should_not
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
type: :development
|
70
|
+
prerelease: false
|
71
|
+
version_requirements: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
- !ruby/object:Gem::Dependency
|
77
|
+
name: absolute_time
|
78
|
+
requirement: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
type: :development
|
84
|
+
prerelease: false
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
description: Sensible UUID library as a gem
|
91
|
+
email:
|
92
|
+
- barry.allard@gmail.com
|
93
|
+
executables: []
|
94
|
+
extensions: []
|
95
|
+
extra_rdoc_files: []
|
96
|
+
files:
|
97
|
+
- ".rspec"
|
98
|
+
- LICENSE
|
99
|
+
- README.md
|
100
|
+
- Rakefile
|
101
|
+
- lib/benchmark.rb
|
102
|
+
- lib/better-uuid.rb
|
103
|
+
- lib/better-uuid/class.rb
|
104
|
+
- lib/better-uuid/class_methods.rb
|
105
|
+
- lib/better-uuid/instance_methods.rb
|
106
|
+
- lib/better-uuid/namespace.rb
|
107
|
+
- lib/better-uuid/nil.rb
|
108
|
+
- lib/better-uuid/state_file.rb
|
109
|
+
- lib/better-uuid/struct.rb
|
110
|
+
- lib/better-uuid/version.rb
|
111
|
+
- lib/better-uuid/versions.rb
|
112
|
+
- spec/better-uuid_spec.rb
|
113
|
+
- spec/spec_helper.rb
|
114
|
+
homepage: https://github.com/steakknife/better-uuid
|
115
|
+
licenses: []
|
116
|
+
metadata: {}
|
117
|
+
post_install_message:
|
118
|
+
rdoc_options: []
|
119
|
+
require_paths:
|
120
|
+
- lib
|
121
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - ">="
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
127
|
+
requirements:
|
128
|
+
- - ">="
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: '0'
|
131
|
+
requirements: []
|
132
|
+
rubyforge_project:
|
133
|
+
rubygems_version: 2.2.2
|
134
|
+
signing_key:
|
135
|
+
specification_version: 4
|
136
|
+
summary: UUID library
|
137
|
+
test_files:
|
138
|
+
- spec/better-uuid_spec.rb
|
139
|
+
- spec/spec_helper.rb
|
140
|
+
- ".rspec"
|
141
|
+
has_rdoc:
|
metadata.gz.sig
ADDED
Binary file
|