simple_uuid 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.
data/CHANGELOG ADDED
@@ -0,0 +1 @@
1
+ v0.0.1 Initial extraction from the cassandra gem.
data/LICENSE ADDED
File without changes
data/Manifest ADDED
@@ -0,0 +1,7 @@
1
+ CHANGELOG
2
+ LICENSE
3
+ README
4
+ Rakefile
5
+ lib/simple_uuid.rb
6
+ test/test_uuid.rb
7
+ Manifest
data/README ADDED
File without changes
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ require 'echoe'
2
+ Echoe.new('simple_uuid') do |e|
3
+ e.author = 'Evan Weaver'
4
+ e.author = 'Ryan King'
5
+ e.description = 'Simple UUID generation.'
6
+ e.email = 'ryan@twitter.com'
7
+ end
@@ -0,0 +1,137 @@
1
+ class Time
2
+ def self.stamp
3
+ Time.now.stamp
4
+ end
5
+
6
+ def stamp
7
+ to_i * 1_000_000 + usec
8
+ end
9
+ end
10
+
11
+ # UUID format version 1, as specified in RFC 4122, with jitter in place of the mac address and sequence counter.
12
+ class UUID
13
+
14
+ class InvalidVersion < StandardError #:nodoc:
15
+ end
16
+
17
+ GREGORIAN_EPOCH_OFFSET = 0x01B2_1DD2_1381_4000 # Oct 15, 1582
18
+
19
+ VARIANT = 0b1000_0000_0000_0000
20
+
21
+ def initialize(bytes = nil)
22
+ case bytes
23
+ when self.class # UUID
24
+ @bytes = bytes.to_s
25
+ when String
26
+ case bytes.size
27
+ when 16 # Raw byte array
28
+ @bytes = bytes
29
+ when 36 # Human-readable UUID representation; inverse of #to_guid
30
+ elements = bytes.split("-")
31
+ raise TypeError, "Expected #{bytes.inspect} to cast to a #{self.class} (malformed UUID representation)" if elements.size != 5
32
+ @bytes = elements.join.to_a.pack('H32')
33
+ else
34
+ raise TypeError, "Expected #{bytes.inspect} to cast to a #{self.class} (invalid bytecount)"
35
+ end
36
+
37
+ when Integer
38
+ raise TypeError, "Expected #{bytes.inspect} to cast to a #{self.class} (integer out of range)" if bytes < 0 or bytes > 2**128
39
+ @bytes = [
40
+ (bytes >> 96) & 0xFFFF_FFFF,
41
+ (bytes >> 64) & 0xFFFF_FFFF,
42
+ (bytes >> 32) & 0xFFFF_FFFF,
43
+ bytes & 0xFFFF_FFFF
44
+ ].pack("NNNN")
45
+
46
+ when NilClass, Time
47
+ time = (bytes || Time).stamp * 10 + GREGORIAN_EPOCH_OFFSET
48
+ # See http://github.com/spectra/ruby-uuid/
49
+ @bytes = [
50
+ time & 0xFFFF_FFFF,
51
+ time >> 32,
52
+ ((time >> 48) & 0x0FFF) | 0x1000,
53
+ # Top 3 bytes reserved
54
+ rand(2**13) | VARIANT,
55
+ rand(2**16),
56
+ rand(2**32)
57
+ ].pack("NnnnnN")
58
+
59
+ else
60
+ raise TypeError, "Expected #{bytes.inspect} to cast to a #{self.class} (unknown source class)"
61
+ end
62
+ end
63
+
64
+ def to_i
65
+ ints = @bytes.unpack("NNNN")
66
+ (ints[0] << 96) +
67
+ (ints[1] << 64) +
68
+ (ints[2] << 32) +
69
+ ints[3]
70
+ end
71
+
72
+ def version
73
+ time_high = @bytes.unpack("NnnQ")[2]
74
+ version = (time_high & 0xF000).to_s(16)[0].chr.to_i
75
+ version > 0 and version < 6 ? version : -1
76
+ end
77
+
78
+ def variant
79
+ @bytes.unpack('QnnN')[1] >> 13
80
+ end
81
+
82
+ def to_guid
83
+ elements = @bytes.unpack("NnnCCa6")
84
+ node = elements[-1].unpack('C*')
85
+ elements[-1] = '%02x%02x%02x%02x%02x%02x' % node
86
+ "%08x-%04x-%04x-%02x%02x-%s" % elements
87
+ end
88
+
89
+ def seconds
90
+ total_usecs / 1_000_000
91
+ end
92
+
93
+ def usecs
94
+ total_usecs % 1_000_000
95
+ end
96
+
97
+ def <=>(other)
98
+ total_usecs <=> other.send(:total_usecs)
99
+ end
100
+
101
+ def ==(other)
102
+ to_s == other.to_s
103
+ end
104
+
105
+ def inspect(long = false)
106
+ "<UUID##{object_id} time: #{
107
+ Time.at(seconds).inspect
108
+ }, usecs: #{
109
+ usecs
110
+ } jitter: #{
111
+ @bytes.unpack('QQ')[1]
112
+ }" + (long ? ", version: #{version}, variant: #{variant}, guid: #{to_guid}>" : ">")
113
+ end
114
+
115
+ def hash
116
+ @bytes.hash
117
+ end
118
+
119
+ def eql?(other)
120
+ other.is_a?(Comparable) and @bytes == other.to_s
121
+ end
122
+
123
+ def ==(other)
124
+ other.respond_to?(:to_i) && self.to_i == other.to_i
125
+ end
126
+
127
+ def to_s
128
+ @bytes
129
+ end
130
+
131
+ private
132
+
133
+ def total_usecs
134
+ elements = @bytes.unpack("NnnQ")
135
+ (elements[0] + (elements[1] << 32) + ((elements[2] & 0x0FFF) << 48) - GREGORIAN_EPOCH_OFFSET) / 10
136
+ end
137
+ end
@@ -0,0 +1,33 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{simple_uuid}
5
+ s.version = "0.0.1"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Ryan King"]
9
+ s.cert_chain = ["/Users/ryan/.gemkeys/gem-public_cert.pem"]
10
+ s.date = %q{2010-01-20}
11
+ s.description = %q{Simple UUID generation.}
12
+ s.email = %q{ryan@twitter.com}
13
+ s.extra_rdoc_files = ["CHANGELOG", "LICENSE", "README", "lib/simple_uuid.rb"]
14
+ s.files = ["CHANGELOG", "LICENSE", "README", "Rakefile", "lib/simple_uuid.rb", "test/test_uuid.rb", "Manifest", "simple_uuid.gemspec"]
15
+ s.homepage = %q{}
16
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Simple_uuid", "--main", "README"]
17
+ s.require_paths = ["lib"]
18
+ s.rubyforge_project = %q{simple_uuid}
19
+ s.rubygems_version = %q{1.3.5}
20
+ s.signing_key = %q{/Users/ryan/.gemkeys/gem-private_key.pem}
21
+ s.summary = %q{Simple UUID generation.}
22
+ s.test_files = ["test/test_uuid.rb"]
23
+
24
+ if s.respond_to? :specification_version then
25
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
26
+ s.specification_version = 3
27
+
28
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
29
+ else
30
+ end
31
+ else
32
+ end
33
+ end
data/test/test_uuid.rb ADDED
@@ -0,0 +1,35 @@
1
+ require 'test/unit'
2
+ require 'simple_uuid'
3
+
4
+ class UUIDTest < Test::Unit::TestCase
5
+ def test_uuid_sort
6
+ ary = []
7
+ 5.times { ary << UUID.new(Time.at(rand(2**31))) }
8
+ assert_equal ary.map { |_| _.seconds }.sort, ary.sort.map { |_| _.seconds }
9
+ assert_not_equal ary.sort, ary.sort_by {|_| _.to_guid }
10
+ end
11
+
12
+ def test_uuid_equality
13
+ uuid = UUID.new
14
+ assert_equal uuid, UUID.new(uuid)
15
+ assert_equal uuid, UUID.new(uuid.to_s)
16
+ assert_equal uuid, UUID.new(uuid.to_i)
17
+ assert_equal uuid, UUID.new(uuid.to_guid)
18
+ end
19
+
20
+ def test_uuid_error
21
+ assert_raises(TypeError) do
22
+ UUID.new("bogus")
23
+ end
24
+ end
25
+
26
+ def test_types_behave_well
27
+ assert !(UUID.new() == false)
28
+ end
29
+
30
+ def test_uuid_casting_error
31
+ assert_raises(TypeError) do
32
+ UUID.new({})
33
+ end
34
+ end
35
+ end
data.tar.gz.sig ADDED
Binary file
metadata ADDED
@@ -0,0 +1,91 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: simple_uuid
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Ryan King
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIDNjCCAh6gAwIBAgIBADANBgkqhkiG9w0BAQUFADBBMQ0wCwYDVQQDDARyeWFu
14
+ MRswGQYKCZImiZPyLGQBGRYLdGhlcnlhbmtpbmcxEzARBgoJkiaJk/IsZAEZFgNj
15
+ b20wHhcNMTAwMTA4MTc1MDM0WhcNMTEwMTA4MTc1MDM0WjBBMQ0wCwYDVQQDDARy
16
+ eWFuMRswGQYKCZImiZPyLGQBGRYLdGhlcnlhbmtpbmcxEzARBgoJkiaJk/IsZAEZ
17
+ FgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDLPp+0PtRT3qCI
18
+ 02sMsADSn7Uf1GpyXUtk4Fb94LqUO6Scl91YDmbFMpjzrQwQvBYMIVreWcwSish6
19
+ nip6WEk9lqXcOeDmex/qY2/FVXG8ffqjFHiNiN9vpWrWj5VMICequ+ftzWLKsPIS
20
+ DGJ4o+Z6wEYRuirgaRPCYAUDPglsaqctJ56wPuycryMe5+ApSkOS9iLWMprQKEAq
21
+ j2R2OBV0dSARdbtzuKwrP7sLDo7uPa0egFBUlcZ+nujGr4LvmpryB8scNRNmZK1w
22
+ 1rEI7O06CbULj08qYxEhnKmFE7LbBoN/HrmvZLVQK5mWuiZQhtmJuhBfStJsaDux
23
+ 5tBEkYZVAgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW
24
+ BBSnLarDEo5eBE2arSMrBdOOhtrnPTANBgkqhkiG9w0BAQUFAAOCAQEANER07s4K
25
+ Pvc1DSduliRDMUax/VSfLzDTtTAQwuSAPDrWAYXKugcJtOZOXjDbGL7c5zoWmy9u
26
+ Fn5vEVdm/93J+84D/IMaaof3BwX/NNEYH01CeZEIGMfc5AFFha7dabzP/uiPpb/c
27
+ GSvomC9IzyN37+eWwOS16cC+5XnBT6KRCaXYg2Fh6WpTgde67OVgXr4Q58HXlaZ+
28
+ /2BB3wq9lZ4JskvlpYpYnlPAUyiyc6R2Mjts1pURz5nkW4SuS7Kd1KCOOyr1McDH
29
+ VP12sTSjJclmI17BjDGQpAF0n9v5ExhJxWpeOjeBUPQsOin3ypEM1KkckLmOKvH6
30
+ zyKMYVRO0z/58g==
31
+ -----END CERTIFICATE-----
32
+
33
+ date: 2010-01-20 00:00:00 -08:00
34
+ default_executable:
35
+ dependencies: []
36
+
37
+ description: Simple UUID generation.
38
+ email: ryan@twitter.com
39
+ executables: []
40
+
41
+ extensions: []
42
+
43
+ extra_rdoc_files:
44
+ - CHANGELOG
45
+ - LICENSE
46
+ - README
47
+ - lib/simple_uuid.rb
48
+ files:
49
+ - CHANGELOG
50
+ - LICENSE
51
+ - README
52
+ - Rakefile
53
+ - lib/simple_uuid.rb
54
+ - test/test_uuid.rb
55
+ - Manifest
56
+ - simple_uuid.gemspec
57
+ has_rdoc: true
58
+ homepage: ""
59
+ licenses: []
60
+
61
+ post_install_message:
62
+ rdoc_options:
63
+ - --line-numbers
64
+ - --inline-source
65
+ - --title
66
+ - Simple_uuid
67
+ - --main
68
+ - README
69
+ require_paths:
70
+ - lib
71
+ required_ruby_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: "0"
76
+ version:
77
+ required_rubygems_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: "1.2"
82
+ version:
83
+ requirements: []
84
+
85
+ rubyforge_project: simple_uuid
86
+ rubygems_version: 1.3.5
87
+ signing_key:
88
+ specification_version: 3
89
+ summary: Simple UUID generation.
90
+ test_files:
91
+ - test/test_uuid.rb
metadata.gz.sig ADDED
Binary file