sixarm_ruby_xid 3.4.2 → 4.0.0
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/Rakefile +0 -6
- data/lib/sixarm_ruby_xid/xid.rb +20 -62
- data/test/sixarm_ruby_xid_test/xid_test.rb +8 -53
- metadata +2 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0f6d3accebde3354b4b649117469e7e7fd67a7aa
|
4
|
+
data.tar.gz: 05feb7ba4b25e7f485425a37fab9a803c0c0099d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d1af7e6bd0d539cd3a2a5214140d56774183b7b6fd63f273a9664f47eafeee62af87210340e5a54d0fae7c1dfa0ef7ec281bdbf06f7d9657fbefd297be68e547
|
7
|
+
data.tar.gz: e1a67f1e6d6c06e49761cf25b84f2b2bb3e94ee095121d06b6c9bfa0f1a3549aa93462c8605fda30bc779943ae188992d63e25830c176d8b4cd44c5be6f8e18a
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/Rakefile
CHANGED
data/lib/sixarm_ruby_xid/xid.rb
CHANGED
@@ -6,34 +6,19 @@ XID class.
|
|
6
6
|
require "securerandom"
|
7
7
|
require "digest/sha2"
|
8
8
|
|
9
|
-
class XID
|
9
|
+
class XID
|
10
10
|
|
11
|
-
#
|
11
|
+
# Generate a new XID string.
|
12
12
|
#
|
13
13
|
# Example:
|
14
14
|
#
|
15
|
-
#
|
15
|
+
# string = XID.generate
|
16
|
+
# #=> "4bb88af57d4ddc224fecad688442423d"
|
16
17
|
#
|
17
|
-
#
|
18
|
+
# Return: [String] A new XID string
|
18
19
|
#
|
19
|
-
|
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)
|
20
|
+
def self.generate
|
21
|
+
SecureRandom.hex
|
37
22
|
end
|
38
23
|
|
39
24
|
# Is a given XID string valid?
|
@@ -45,57 +30,30 @@ class XID < String
|
|
45
30
|
#
|
46
31
|
# Return: [true/false]
|
47
32
|
#
|
48
|
-
def self.valid?(
|
49
|
-
!!(
|
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
|
33
|
+
def self.valid?(string)
|
34
|
+
!!(string && string.is_a?(String) && string.size == 32 && string =~ /\A[0-9a-f]{32}\z/)
|
80
35
|
end
|
81
36
|
|
82
|
-
# Parse
|
37
|
+
# Parse any object to an XID string.
|
83
38
|
#
|
84
|
-
# This does
|
39
|
+
# This does these steps:
|
85
40
|
#
|
86
|
-
# *
|
87
|
-
# *
|
88
|
-
# *
|
41
|
+
# * Convert the object to a string by calling `#to_s`.
|
42
|
+
# * Convert the string to lower case by calling `#downcase`.
|
43
|
+
# * Delete any non-hex characters.
|
44
|
+
# * Take the first 32 characters.
|
89
45
|
#
|
90
46
|
# Example:
|
91
47
|
#
|
92
|
-
#
|
48
|
+
# string = XID.parse("***FFAD30A1-BE5E-B511-9ED8-976CAB0281B6***")
|
93
49
|
# #=> "ffad30a1be5eb5119ed8976cab0281b6"
|
94
50
|
#
|
95
51
|
# Return: [XID] A new XID
|
96
52
|
#
|
97
|
-
def self.parse(
|
98
|
-
|
53
|
+
def self.parse(object)
|
54
|
+
xid = object.to_s.downcase.gsub(/[^0-9a-f]/,'')[0...32]
|
55
|
+
raise ArgumentError if !XID.valid?(xid)
|
56
|
+
xid
|
99
57
|
end
|
100
58
|
|
101
59
|
end
|
@@ -8,14 +8,14 @@ describe XID do
|
|
8
8
|
describe "with initialize defaults" do
|
9
9
|
|
10
10
|
it "is a string with the correct length and characters" do
|
11
|
-
xid = XID.
|
11
|
+
xid = XID.generate
|
12
12
|
xid.must_match /\A[0-9a-f]{32}\z/
|
13
13
|
end
|
14
14
|
|
15
15
|
it "is always different" do
|
16
16
|
seen = Set.new
|
17
17
|
99999.times.each{
|
18
|
-
xid = XID.
|
18
|
+
xid = XID.generate
|
19
19
|
seen.include?(xid).must_equal false
|
20
20
|
seen.add(xid)
|
21
21
|
}
|
@@ -23,41 +23,6 @@ describe XID do
|
|
23
23
|
|
24
24
|
end
|
25
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
26
|
end
|
62
27
|
|
63
28
|
describe "#valid" do
|
@@ -76,25 +41,15 @@ describe XID do
|
|
76
41
|
|
77
42
|
end
|
78
43
|
|
79
|
-
describe "
|
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
|
44
|
+
describe ".parse" do
|
89
45
|
|
90
|
-
it "
|
91
|
-
|
46
|
+
it "converts objects to strings" do
|
47
|
+
obj = Minitest::Mock.new
|
48
|
+
obj.expect(:to_s, "!!C3D010BBFEC046F59C7FE843D32DAB32!!")
|
49
|
+
XID.parse(obj).must_equal "c3d010bbfec046f59c7fe843d32dab32"
|
50
|
+
obj.verify
|
92
51
|
end
|
93
52
|
|
94
|
-
end
|
95
|
-
|
96
|
-
describe ".parse" do
|
97
|
-
|
98
53
|
it "converts to lower case" do
|
99
54
|
XID.parse("C3D010BBFEC046F59C7FE843D32DAB32").must_equal "c3d010bbfec046f59c7fe843d32dab32"
|
100
55
|
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:
|
4
|
+
version: 4.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- SixArm
|
@@ -44,7 +44,7 @@ cert_chain:
|
|
44
44
|
2AC9FOGkybW6DJEFSFFMlNk0IILsa/gNp8ufGuTVLWF9FUUdMNK+TMbghnifT8/1
|
45
45
|
n+ES/gQPOnvmVkLDGw==
|
46
46
|
-----END CERTIFICATE-----
|
47
|
-
date: 2015-
|
47
|
+
date: 2015-08-06 00:00:00.000000000 Z
|
48
48
|
dependencies:
|
49
49
|
- !ruby/object:Gem::Dependency
|
50
50
|
name: minitest
|
metadata.gz.sig
CHANGED
Binary file
|