sixarm_ruby_xid 3.4.1 → 3.4.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/Rakefile +9 -2
- data/lib/sixarm_ruby_xid.rb +1 -31
- data/lib/sixarm_ruby_xid/xid.rb +101 -0
- data/test/sixarm_ruby_xid_test.rb +6 -115
- data/test/sixarm_ruby_xid_test/xid_test.rb +116 -0
- metadata +89 -12
- metadata.gz.sig +0 -0
- data/.gemtest +0 -0
- data/CHANGES.md +0 -13
- data/CONTRIBUTING.md +0 -28
- data/LICENSE.md +0 -28
- data/README.md +0 -124
- data/VERSION +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2f5b6519a9ac4fad507d584b4e79e3a8acd07052
|
4
|
+
data.tar.gz: ae6ae65995d3091262ce3444951ede3437335a4e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ddce1beb9a306f2b3f5c95a836eff8aba4aa12a723f91102f6cde20cd353990dc028b6d06b3a5515f0738195dffa7fa1449a997080f0954b4deae3fe354203bf
|
7
|
+
data.tar.gz: 10012f4d5b4a0f1a51e16a35ab2a1c0f98dd80903cfff4cac3709c68bc13b5187f866e8f2015da018c85cdb639d764cce4f141c36aaa4f11ae39fc6eb616bb6a
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/Rakefile
CHANGED
@@ -3,8 +3,15 @@ require "rake"
|
|
3
3
|
require "rake/testtask"
|
4
4
|
|
5
5
|
Rake::TestTask.new(:test) do |t|
|
6
|
-
t.libs
|
7
|
-
t.pattern =
|
6
|
+
t.libs.push("lib", "test")
|
7
|
+
t.pattern = "test/**/*.rb"
|
8
8
|
end
|
9
9
|
|
10
10
|
task :default => [:test]
|
11
|
+
task :default => [:test]
|
12
|
+
task :default => [:test]
|
13
|
+
task :default => [:test]
|
14
|
+
task :default => [:test]
|
15
|
+
task :default => [:test]
|
16
|
+
task :default => [:test]
|
17
|
+
task :default => [:test]
|
data/lib/sixarm_ruby_xid.rb
CHANGED
@@ -3,34 +3,4 @@
|
|
3
3
|
Please see README
|
4
4
|
=end
|
5
5
|
|
6
|
-
|
7
|
-
require "digest/sha2"
|
8
|
-
|
9
|
-
class XID < String
|
10
|
-
|
11
|
-
def initialize(s = nil)
|
12
|
-
s and (XID.valid?(s) or raise ArgumentError)
|
13
|
-
super(s || SecureRandom.hex)
|
14
|
-
end
|
15
|
-
|
16
|
-
def valid?
|
17
|
-
XID.valid?(self)
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.valid?(s)
|
21
|
-
!!(s && s.is_a?(String) && s.size == 32 && s =~ /\A[0-9a-f]{32}\Z/)
|
22
|
-
end
|
23
|
-
|
24
|
-
def digest
|
25
|
-
XID.digest(self)
|
26
|
-
end
|
27
|
-
|
28
|
-
def self.digest(s)
|
29
|
-
Digest::SHA256.new.update(s).to_s
|
30
|
-
end
|
31
|
-
|
32
|
-
def self.parse(s)
|
33
|
-
XID.new(s.downcase.gsub(/[^0-9a-f]/,'')[0...32])
|
34
|
-
end
|
35
|
-
|
36
|
-
end
|
6
|
+
require_relative "sixarm_ruby_xid/xid"
|
@@ -0,0 +1,101 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
=begin rdoc
|
3
|
+
XID class.
|
4
|
+
=end
|
5
|
+
|
6
|
+
require "securerandom"
|
7
|
+
require "digest/sha2"
|
8
|
+
|
9
|
+
class XID < String
|
10
|
+
|
11
|
+
# Initialize a new XID, optionally with a string.
|
12
|
+
#
|
13
|
+
# Example:
|
14
|
+
#
|
15
|
+
# xid = XID.new
|
16
|
+
#
|
17
|
+
# xid = XID.new("4bb88af57d4ddc224fecad688442423d")
|
18
|
+
#
|
19
|
+
# Return: [XID] A new XID
|
20
|
+
#
|
21
|
+
def initialize(s = nil)
|
22
|
+
s and (XID.valid?(s) or raise ArgumentError)
|
23
|
+
super(s || SecureRandom.hex)
|
24
|
+
end
|
25
|
+
|
26
|
+
# Is this XID valid?
|
27
|
+
#
|
28
|
+
# Example:
|
29
|
+
#
|
30
|
+
# xid = XID.new
|
31
|
+
# xid.valid? #=> true
|
32
|
+
#
|
33
|
+
# Return: [true/false]
|
34
|
+
#
|
35
|
+
def valid?
|
36
|
+
XID.valid?(self)
|
37
|
+
end
|
38
|
+
|
39
|
+
# Is a given XID string valid?
|
40
|
+
#
|
41
|
+
# Example:
|
42
|
+
#
|
43
|
+
# XID.valid?("4bb88af57d4ddc224fecad688442423d") #=> true
|
44
|
+
# XID.valid?("hello") #=> false
|
45
|
+
#
|
46
|
+
# Return: [true/false]
|
47
|
+
#
|
48
|
+
def self.valid?(s)
|
49
|
+
!!(s && s.is_a?(String) && s.size == 32 && s =~ /\A[0-9a-f]{32}\Z/)
|
50
|
+
end
|
51
|
+
|
52
|
+
# Compute the XID digest of this XID.
|
53
|
+
#
|
54
|
+
# This is useful for proving knowledge of the XID,
|
55
|
+
# without needed to expose the XID.
|
56
|
+
#
|
57
|
+
# Example:
|
58
|
+
#
|
59
|
+
# xid = XID.new("4bb88af57d4ddc224fecad688442423d")
|
60
|
+
# xid.digest
|
61
|
+
# #=> 4d648be0ca9dbb9e3a1b6b30b9d13c79ecbc0818dfca4125cc7961e32d61112c
|
62
|
+
#
|
63
|
+
def digest
|
64
|
+
XID.digest(self)
|
65
|
+
end
|
66
|
+
|
67
|
+
# Compute the XID digest of a given string.
|
68
|
+
#
|
69
|
+
# This is useful for proving knowledge of the XID,
|
70
|
+
# without needed to expose the XID.
|
71
|
+
#
|
72
|
+
# Example:
|
73
|
+
#
|
74
|
+
# xid = XID.new("4bb88af57d4ddc224fecad688442423d")
|
75
|
+
# xid.digest
|
76
|
+
# #=> 4d648be0ca9dbb9e3a1b6b30b9d13c79ecbc0818dfca4125cc7961e32d61112c
|
77
|
+
#
|
78
|
+
def self.digest(s)
|
79
|
+
Digest::SHA256.new.update(s).to_s
|
80
|
+
end
|
81
|
+
|
82
|
+
# Parse a string to an XID.
|
83
|
+
#
|
84
|
+
# This does three steps:
|
85
|
+
#
|
86
|
+
# * downcase
|
87
|
+
# * delete any non-hex characters
|
88
|
+
# * take the first 32 characters
|
89
|
+
#
|
90
|
+
# Example:
|
91
|
+
#
|
92
|
+
# xid = XID.parse("***FFAD30A1-BE5E-B511-9ED8-976CAB0281B6***")
|
93
|
+
# #=> "ffad30a1be5eb5119ed8976cab0281b6"
|
94
|
+
#
|
95
|
+
# Return: [XID] A new XID
|
96
|
+
#
|
97
|
+
def self.parse(s)
|
98
|
+
XID.new(s.downcase.gsub(/[^0-9a-f]/,'')[0...32])
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
@@ -1,120 +1,11 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
require "minitest/autorun"
|
3
|
-
|
3
|
+
require "coveralls"
|
4
4
|
require "simplecov"
|
5
|
+
Coveralls.wear!
|
6
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
|
7
|
+
SimpleCov::Formatter::HTMLFormatter,
|
8
|
+
Coveralls::SimpleCov::Formatter
|
9
|
+
]
|
5
10
|
SimpleCov.start
|
6
11
|
require "sixarm_ruby_xid"
|
7
|
-
|
8
|
-
describe XID do
|
9
|
-
|
10
|
-
describe "#new" do
|
11
|
-
|
12
|
-
describe "with initialize defaults" do
|
13
|
-
|
14
|
-
it "is a string with the correct length and characters" do
|
15
|
-
xid = XID.new
|
16
|
-
xid.must_match /\A[0-9a-f]{32}\z/
|
17
|
-
end
|
18
|
-
|
19
|
-
it "is always different" do
|
20
|
-
seen = Set.new
|
21
|
-
99999.times.each{
|
22
|
-
xid = XID.new
|
23
|
-
seen.include?(xid).must_equal false
|
24
|
-
seen.add(xid)
|
25
|
-
}
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
29
|
-
|
30
|
-
describe "with valid initialize string" do
|
31
|
-
|
32
|
-
it "sets" do
|
33
|
-
s = "1cf2a839c0890bb9be7e9d56b7405a54"
|
34
|
-
xid = XID.new(s)
|
35
|
-
xid.must_equal(s)
|
36
|
-
end
|
37
|
-
|
38
|
-
end
|
39
|
-
|
40
|
-
describe "with invalid initialize string" do
|
41
|
-
|
42
|
-
it "raises" do
|
43
|
-
proc { XID.new("invalid") }.must_raise ArgumentError
|
44
|
-
end
|
45
|
-
|
46
|
-
end
|
47
|
-
|
48
|
-
end
|
49
|
-
|
50
|
-
describe ".valid" do
|
51
|
-
|
52
|
-
describe "with valid string" do
|
53
|
-
it "is true" do
|
54
|
-
xid = XID.new("c3d010bbfec046f59c7fe843d32dab32")
|
55
|
-
xid.valid?.must_equal true
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
describe "with invalid string" do
|
60
|
-
it "never gets called because it fails to create an xid" do
|
61
|
-
proc { XID.new("abc") }.must_raise ArgumentError
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
end
|
66
|
-
|
67
|
-
describe "#valid" do
|
68
|
-
|
69
|
-
describe "with valid string" do
|
70
|
-
it "is true" do
|
71
|
-
XID.valid?("c3d010bbfec046f59c7fe843d32dab32").must_be_same_as true
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
describe "with invalid string" do
|
76
|
-
it "is false" do
|
77
|
-
XID.valid?("abc").must_be_same_as false
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
end
|
82
|
-
|
83
|
-
describe "#digest" do
|
84
|
-
|
85
|
-
it "digests" do
|
86
|
-
xid = XID.new
|
87
|
-
xid.digest.must_match /\A[0-9a-f]{64}\z/
|
88
|
-
end
|
89
|
-
|
90
|
-
end
|
91
|
-
|
92
|
-
describe ".digest" do
|
93
|
-
|
94
|
-
it "digests" do
|
95
|
-
XID.digest("foo").must_match /\A[0-9a-f]{64}\z/
|
96
|
-
end
|
97
|
-
|
98
|
-
end
|
99
|
-
|
100
|
-
describe ".parse" do
|
101
|
-
|
102
|
-
it "converts to lower case" do
|
103
|
-
XID.parse("C3D010BBFEC046F59C7FE843D32DAB32").must_equal "c3d010bbfec046f59c7fe843d32dab32"
|
104
|
-
end
|
105
|
-
|
106
|
-
it "deletes non-hex characters" do
|
107
|
-
XID.parse("!!c3d010bb-fec0-46f59c7f-e843d32dab32!!").must_equal "c3d010bbfec046f59c7fe843d32dab32"
|
108
|
-
end
|
109
|
-
|
110
|
-
it "chops at 32 characters" do
|
111
|
-
XID.parse("c3d010bbfec046f59c7fe843d32dab32aaaaaaaaa").must_equal "c3d010bbfec046f59c7fe843d32dab32"
|
112
|
-
end
|
113
|
-
|
114
|
-
it "raises if the string is invalid" do
|
115
|
-
proc { XID.parse("abc") }.must_raise ArgumentError
|
116
|
-
end
|
117
|
-
|
118
|
-
end
|
119
|
-
|
120
|
-
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require "sixarm_ruby_xid_test"
|
3
|
+
|
4
|
+
describe XID do
|
5
|
+
|
6
|
+
describe "#new" do
|
7
|
+
|
8
|
+
describe "with initialize defaults" do
|
9
|
+
|
10
|
+
it "is a string with the correct length and characters" do
|
11
|
+
xid = XID.new
|
12
|
+
xid.must_match /\A[0-9a-f]{32}\z/
|
13
|
+
end
|
14
|
+
|
15
|
+
it "is always different" do
|
16
|
+
seen = Set.new
|
17
|
+
99999.times.each{
|
18
|
+
xid = XID.new
|
19
|
+
seen.include?(xid).must_equal false
|
20
|
+
seen.add(xid)
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "with valid initialize string" do
|
27
|
+
|
28
|
+
it "sets" do
|
29
|
+
s = "1cf2a839c0890bb9be7e9d56b7405a54"
|
30
|
+
xid = XID.new(s)
|
31
|
+
xid.must_equal(s)
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "with invalid initialize string" do
|
37
|
+
|
38
|
+
it "raises" do
|
39
|
+
proc { XID.new("invalid") }.must_raise ArgumentError
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
describe ".valid" do
|
47
|
+
|
48
|
+
describe "with valid string" do
|
49
|
+
it "is true" do
|
50
|
+
xid = XID.new("c3d010bbfec046f59c7fe843d32dab32")
|
51
|
+
xid.valid?.must_equal true
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe "with invalid string" do
|
56
|
+
it "never gets called because it fails to create an xid" do
|
57
|
+
proc { XID.new("abc") }.must_raise ArgumentError
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
describe "#valid" do
|
64
|
+
|
65
|
+
describe "with valid string" do
|
66
|
+
it "is true" do
|
67
|
+
XID.valid?("c3d010bbfec046f59c7fe843d32dab32").must_be_same_as true
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe "with invalid string" do
|
72
|
+
it "is false" do
|
73
|
+
XID.valid?("abc").must_be_same_as false
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
describe "#digest" do
|
80
|
+
|
81
|
+
it "digests" do
|
82
|
+
xid = XID.new
|
83
|
+
xid.digest.must_match /\A[0-9a-f]{64}\z/
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
|
88
|
+
describe ".digest" do
|
89
|
+
|
90
|
+
it "digests" do
|
91
|
+
XID.digest("foo").must_match /\A[0-9a-f]{64}\z/
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
describe ".parse" do
|
97
|
+
|
98
|
+
it "converts to lower case" do
|
99
|
+
XID.parse("C3D010BBFEC046F59C7FE843D32DAB32").must_equal "c3d010bbfec046f59c7fe843d32dab32"
|
100
|
+
end
|
101
|
+
|
102
|
+
it "deletes non-hex characters" do
|
103
|
+
XID.parse("!!c3d010bb-fec0-46f59c7f-e843d32dab32!!").must_equal "c3d010bbfec046f59c7fe843d32dab32"
|
104
|
+
end
|
105
|
+
|
106
|
+
it "chops at 32 characters" do
|
107
|
+
XID.parse("c3d010bbfec046f59c7fe843d32dab32aaaaaaaaa").must_equal "c3d010bbfec046f59c7fe843d32dab32"
|
108
|
+
end
|
109
|
+
|
110
|
+
it "raises if the string is invalid" do
|
111
|
+
proc { XID.parse("abc") }.must_raise ArgumentError
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sixarm_ruby_xid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.4.
|
4
|
+
version: 3.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- SixArm
|
@@ -44,24 +44,100 @@ cert_chain:
|
|
44
44
|
2AC9FOGkybW6DJEFSFFMlNk0IILsa/gNp8ufGuTVLWF9FUUdMNK+TMbghnifT8/1
|
45
45
|
n+ES/gQPOnvmVkLDGw==
|
46
46
|
-----END CERTIFICATE-----
|
47
|
-
date: 2015-07-
|
48
|
-
dependencies:
|
49
|
-
|
50
|
-
|
47
|
+
date: 2015-07-19 00:00:00.000000000 Z
|
48
|
+
dependencies:
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: minitest
|
51
|
+
requirement: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: 5.7.0
|
56
|
+
- - "<"
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: '6'
|
59
|
+
type: :development
|
60
|
+
prerelease: false
|
61
|
+
version_requirements: !ruby/object:Gem::Requirement
|
62
|
+
requirements:
|
63
|
+
- - ">="
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: 5.7.0
|
66
|
+
- - "<"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '6'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rake
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 10.4.2
|
76
|
+
- - "<"
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '11'
|
79
|
+
type: :development
|
80
|
+
prerelease: false
|
81
|
+
version_requirements: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - ">"
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 10.4.2
|
86
|
+
- - "<"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '11'
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: simplecov
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: 0.10.0
|
96
|
+
- - "<"
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '2'
|
99
|
+
type: :development
|
100
|
+
prerelease: false
|
101
|
+
version_requirements: !ruby/object:Gem::Requirement
|
102
|
+
requirements:
|
103
|
+
- - ">="
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: 0.10.0
|
106
|
+
- - "<"
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '2'
|
109
|
+
- !ruby/object:Gem::Dependency
|
110
|
+
name: coveralls
|
111
|
+
requirement: !ruby/object:Gem::Requirement
|
112
|
+
requirements:
|
113
|
+
- - ">="
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: 0.8.2
|
116
|
+
- - "<"
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '2'
|
119
|
+
type: :development
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - ">="
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 0.8.2
|
126
|
+
- - "<"
|
127
|
+
- !ruby/object:Gem::Version
|
128
|
+
version: '2'
|
129
|
+
description: XID generates a new random id, suitable for foreign keys, security authentication,
|
130
|
+
unique tracking, etc.
|
51
131
|
email: sixarm@sixarm.com
|
52
132
|
executables: []
|
53
133
|
extensions: []
|
54
134
|
extra_rdoc_files: []
|
55
135
|
files:
|
56
|
-
- ".gemtest"
|
57
|
-
- CHANGES.md
|
58
|
-
- CONTRIBUTING.md
|
59
|
-
- LICENSE.md
|
60
|
-
- README.md
|
61
136
|
- Rakefile
|
62
|
-
- VERSION
|
63
137
|
- lib/sixarm_ruby_xid.rb
|
138
|
+
- lib/sixarm_ruby_xid/xid.rb
|
64
139
|
- test/sixarm_ruby_xid_test.rb
|
140
|
+
- test/sixarm_ruby_xid_test/xid_test.rb
|
65
141
|
homepage: http://sixarm.com/
|
66
142
|
licenses:
|
67
143
|
- BSD
|
@@ -89,7 +165,8 @@ rubyforge_project:
|
|
89
165
|
rubygems_version: 2.4.8
|
90
166
|
signing_key:
|
91
167
|
specification_version: 4
|
92
|
-
summary: SixArm.com » Ruby » XID
|
168
|
+
summary: 'SixArm.com » Ruby » XID: Xeno Identifier'
|
93
169
|
test_files:
|
94
170
|
- test/sixarm_ruby_xid_test.rb
|
171
|
+
- test/sixarm_ruby_xid_test/xid_test.rb
|
95
172
|
has_rdoc: true
|
metadata.gz.sig
CHANGED
Binary file
|
data/.gemtest
DELETED
File without changes
|
data/CHANGES.md
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
# Changes
|
2
|
-
|
3
|
-
* 2015-07-07 3.4.1 Update gemspec to use file manifest
|
4
|
-
* 2015-04-01 3.4.0 Add XID.parse and XID.valid?
|
5
|
-
* 2015-02-12 3.3.0 Add XID.digest(s)
|
6
|
-
* 2015-02-12 3.2.0 Add XID.new(s) to initialize with a given string.
|
7
|
-
* 2015-02-12 3.1.0 Add #digest.
|
8
|
-
* 2015-02-11 3.0.0 Upgrade to XID.
|
9
|
-
* 2013-08-20 2.1.0 Add #next to enable using this as an enumeration.
|
10
|
-
* 2013-08-18 2.0.0 Upgrade for Ruby 2.0.0; add .length and .choices methods.
|
11
|
-
* 2012-03-21 1.4.0 Upgrade for Ruby 1.9.3, minitest/spec, and improved docs.
|
12
|
-
* 2011-04-22 1.3.0 Update to 32 characters
|
13
|
-
* 2011-04-21 1.2.2 End support for Ruby 1.8.6
|
data/CONTRIBUTING.md
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
# Contributing
|
2
|
-
|
3
|
-
Thank you for contributing!
|
4
|
-
|
5
|
-
If you would like to contribute a donation, an easy way is to use PayPal to sixarm@sixarm.com.
|
6
|
-
|
7
|
-
If you would like to contribute help, the next section is for you.
|
8
|
-
|
9
|
-
|
10
|
-
## Contributing to the source
|
11
|
-
|
12
|
-
We love pull requests for improvments to the source code and documentation.
|
13
|
-
|
14
|
-
There are three easy steps:
|
15
|
-
|
16
|
-
1. Fork the repo.
|
17
|
-
|
18
|
-
* Before you do any work please run our existing tests to make sure the code runs cleanly.
|
19
|
-
|
20
|
-
2. Work as you like.
|
21
|
-
|
22
|
-
* Please create tests. This helps us know that all your code runs cleanly.
|
23
|
-
|
24
|
-
3. Push to your fork and submit a pull request.
|
25
|
-
|
26
|
-
* We'll take a look as soon as we can; this is typically within a business day.
|
27
|
-
|
28
|
-
Thank you again!
|
data/LICENSE.md
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
# License
|
2
|
-
|
3
|
-
You may choose any of these open source licenses:
|
4
|
-
|
5
|
-
* Apache License
|
6
|
-
* BSD License
|
7
|
-
* CreativeCommons License, Non-commercial Share Alike
|
8
|
-
* GNU Affero General Public License (AGPL)
|
9
|
-
* GNU General Public License Version (GPL)
|
10
|
-
* GNU Lesser General Public License (LGPL)
|
11
|
-
* MIT License
|
12
|
-
* Perl Artistic License
|
13
|
-
* Ruby License
|
14
|
-
|
15
|
-
The software is provided "as is", without warranty of any kind,
|
16
|
-
express or implied, including but not limited to the warranties of
|
17
|
-
merchantability, fitness for a particular purpose and noninfringement.
|
18
|
-
|
19
|
-
In no event shall the authors or copyright holders be liable for any
|
20
|
-
claim, damages or other liability, whether in an action of contract,
|
21
|
-
tort or otherwise, arising from, out of or in connection with the
|
22
|
-
software or the use or other dealings in the software.
|
23
|
-
|
24
|
-
This license is for the included software that is created by SixArm.
|
25
|
-
Some of the included software may have its own licenses, copyrights,
|
26
|
-
authors, etc. and these may take precedence over the SixArm license.
|
27
|
-
|
28
|
-
Copyright (c) Joel Parker Henderson
|
data/README.md
DELETED
@@ -1,124 +0,0 @@
|
|
1
|
-
# SixArm.com » Ruby » <br> XID excellent identifier
|
2
|
-
|
3
|
-
[![Code Climate](https://codeclimate.com/github/SixArm/sixarm_ruby_xid.png)](https://codeclimate.com/github/SixArm/sixarm_ruby_xid)
|
4
|
-
[![Build Status](https://travis-ci.org/SixArm/sixarm_ruby_xid.png)](https://travis-ci.org/SixArm/sixarm_ruby_xid)
|
5
|
-
|
6
|
-
* Doc: <http://sixarm.com/sixarm_ruby_xid/doc>
|
7
|
-
* Gem: <http://rubygems.org/gems/sixarm_ruby_xid>
|
8
|
-
* Repo: <http://github.com/sixarm/sixarm_ruby_xid>
|
9
|
-
* Email: Joel Parker Henderson, <joel@sixarm.com>
|
10
|
-
|
11
|
-
|
12
|
-
## Introduction
|
13
|
-
|
14
|
-
XID is an excellent identifier. The XID much like a UUID (Universally Unique Identifier) or GUID (Globally Unique Identifer).
|
15
|
-
|
16
|
-
Example:
|
17
|
-
|
18
|
-
XID.new
|
19
|
-
#=> "90f44e35a062479289ff75ab2abc0ed3"
|
20
|
-
|
21
|
-
What makes the XID excellent: a streamlined specfication, stronger security, speedier algorithms, and simple string comparisons.
|
22
|
-
|
23
|
-
XID specification:
|
24
|
-
|
25
|
-
* 128 bit.
|
26
|
-
* Completely random and generated with a secure random generator.
|
27
|
-
* The string representation is entirely hexidecimal: digits 0-9 and lowercase a-f.
|
28
|
-
|
29
|
-
For docs go to <http://sixarm.com/sixarm_ruby_xid/doc>
|
30
|
-
|
31
|
-
Want to help? We're happy to get pull requests.
|
32
|
-
|
33
|
-
|
34
|
-
## Install quickstart
|
35
|
-
|
36
|
-
Install:
|
37
|
-
|
38
|
-
gem install sixarm_ruby_xid
|
39
|
-
|
40
|
-
Bundler:
|
41
|
-
|
42
|
-
gem "sixarm_ruby_xid", ">=3.4.0", "<4"
|
43
|
-
|
44
|
-
Require:
|
45
|
-
|
46
|
-
require "sixarm_ruby_xid"
|
47
|
-
|
48
|
-
|
49
|
-
## Install with security (optional)
|
50
|
-
|
51
|
-
To enable high security for all our gems:
|
52
|
-
|
53
|
-
wget http://sixarm.com/sixarm.pem
|
54
|
-
gem cert --add sixarm.pem
|
55
|
-
gem sources --add http://sixarm.com
|
56
|
-
|
57
|
-
To install with high security:
|
58
|
-
|
59
|
-
gem install sixarm_ruby_xid --trust-policy HighSecurity
|
60
|
-
|
61
|
-
|
62
|
-
## Details
|
63
|
-
|
64
|
-
Methods:
|
65
|
-
|
66
|
-
* `XID.new`: create an XID and initialize to a random string.
|
67
|
-
* `XID.new(s)`: create an XID and initialize to a given string.
|
68
|
-
* `XID.valid?`: is this XIDa valid, i.e. the correct format?
|
69
|
-
* `XID#valid?(s)`: is a string a valid XID, i.e. the correct format?
|
70
|
-
* `XID#digest`: return a SHA256 digest as a 64-character string.
|
71
|
-
* `XID.digest(s)`: return a SHA256 digest as a 64-character string.
|
72
|
-
* `XID.parse(s)`: parse any string with enough data to a new XID.
|
73
|
-
|
74
|
-
Notes:
|
75
|
-
|
76
|
-
* XID uses Ruby's SecureRandom methods for strong security.
|
77
|
-
* An XID is a Ruby string, so you can do any string methods on it.
|
78
|
-
|
79
|
-
|
80
|
-
## UUID comparison
|
81
|
-
|
82
|
-
The XID is much like a UUID:
|
83
|
-
|
84
|
-
* The XID and UUID are both 128 bit.
|
85
|
-
* The XID has one form. The UUID has multiple forms, known as variants and versions.
|
86
|
-
* The XID is completely random. The UUID may have non-random pieces, such as a MAC sequence, and a fixed bit for the variant and version.
|
87
|
-
* The XID specification requires the use of a secure random generator. The UUID has no guarantee, and some forms use predicatable sequences.
|
88
|
-
* The XID uses digits 0-9 and lowecase a-f. The UUID canoncical form uses dashes to separate sequencies, and may use uppercase or lowercase.
|
89
|
-
|
90
|
-
To format an XID in the style of a UUID canonical representation:
|
91
|
-
|
92
|
-
xid = "90f44e35a062479289ff75ab2abc0ed3"
|
93
|
-
xid.sub(/(.{8})(.{4})(.{4})(.{16})/,"#$1-#$2-#$3-#$4")
|
94
|
-
#=> "90f44e35-a062-4792-89ff75ab2abc0ed3"
|
95
|
-
|
96
|
-
Note: the result string is formatted like a UUID, but is not guaranteed to be valid UUID. This is because the XID is random, whereas the UUID specification requires a specific bit that indicates the UUID is random.
|
97
|
-
|
98
|
-
To format a UUID in the style of an XID:
|
99
|
-
|
100
|
-
uuid = "14fFE137-2DB2-4A37-A2A4-A04DB1C756CA"
|
101
|
-
uuid.gsub(/-/,"").downcase
|
102
|
-
#=> ""14f7e1372db24a37a2a4a04db1c756ca"
|
103
|
-
|
104
|
-
Note: the result string is formatted like a XID, but is not a valid XID. This is because there's no guarantee that the UUID was randomly generated using a secure random generator, and also because the UUID-4 specification requires a random UUID to set the third section's first digit to 4.
|
105
|
-
|
106
|
-
|
107
|
-
## Unix tooling
|
108
|
-
|
109
|
-
To generate an XID on a typical Unix system, one way is the hexdump command:
|
110
|
-
|
111
|
-
$ hexdump -n 16 -v -e '16/1 "%02x" "\n"' /dev/random
|
112
|
-
b29dd48b7040f788fd926ebf1f4eddd0
|
113
|
-
|
114
|
-
To digest an XID by using SHA256:
|
115
|
-
|
116
|
-
$ echo -n "b29dd48b7040f788fd926ebf1f4eddd0" | shasum -a 256
|
117
|
-
afdfb0400e479285040e541ee87d9227d5731a7232ecfa5a07074ee0ad171c64
|
118
|
-
|
119
|
-
|
120
|
-
## Database tooling
|
121
|
-
|
122
|
-
To store an XID in a database, one way is using a string field that is 32 characters long.
|
123
|
-
|
124
|
-
Some databases have specialize fields for 128 bit values, such as PostgreSQL and its UUID extensions. PostgreSQL states that a UUID field will accept a string that is lowercase and that omits dashes. PostgreSQL does not do any validity-checking on the UUID value. Thus it is viable to store an XID in a UUID field. Our team has a goal to create a PostgreSQL extension for the XID data type.
|
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
3.4.1
|