Class: SlothfulCode
- Inherits:
-
Object
- Object
- SlothfulCode
- Defined in:
- lib/slothful_code.rb,
lib/slothful_code/version.rb
Overview
識別コードを生成、検証する
hashids を利用して長過ぎず短過ぎない、人間に読み書きしやすくユニー クな文字列を生成し、またその文字列が適切にこのシステムが生成したも のかどうかを検証できる仕組み
数字と英大文字のうち数字と紛らわしくない文字を利用して11, 12桁程度に 収まるだろう文字列を生成する
sc = SlothfulCode.new sc.generate(type_id: ‘1’) # => ‘R6B7ZRDT6EY-1’
see hashids.org/
Defined Under Namespace
Classes: Error, WrongTypeId
Constant Summary collapse
- HASHIDS_INCLUDE_CHARS =
'1234567890ABCDEFGHJKLMNPQRSTUVWXYZ'.freeze
- TYPE_CHARS =
/\A[0-9A-Z]+\z/
- VERSION =
"0.1.0"
Instance Attribute Summary collapse
-
#resources ⇒ Object
readonly
Returns the value of attribute resources.
Instance Method Summary collapse
-
#date ⇒ Object
decode 済みのコードについて確認用の日付を取得する.
-
#decode(code) ⇒ Object
- param
-
String code [return] Hash.
-
#generate(type_id:) ⇒ Object
コードを生成する.
-
#initialize(salt = '') ⇒ SlothfulCode
constructor
- param
-
String salt.
-
#now ⇒ Object
- return
-
Time.
-
#time_array ⇒ Object
現在時刻を2つの整数の配列にして返す.
-
#valid?(code) ⇒ Boolean
与えられたコードが hashids で decode できるかどうか.
Constructor Details
#initialize(salt = '') ⇒ SlothfulCode
- param
-
String salt
29 30 31 |
# File 'lib/slothful_code.rb', line 29 def initialize(salt = '') @id_processor = Hashids.new(salt, 6, HASHIDS_INCLUDE_CHARS) end |
Instance Attribute Details
#resources ⇒ Object (readonly)
Returns the value of attribute resources.
32 33 34 |
# File 'lib/slothful_code.rb', line 32 def resources @resources end |
Instance Method Details
#date ⇒ Object
decode 済みのコードについて確認用の日付を取得する
- return
-
String
:reek:UncommunicativeVariableName, :reek:FeatureEnvy
124 125 126 127 128 129 130 131 132 133 |
# File 'lib/slothful_code.rb', line 124 def date time = resources[:time] if time t = Time.at(time.first) { month: t.month, mon: t.mon, day: t.day } else nil end end |
#decode(code) ⇒ Object
- param
-
String code
- return
-
Hash
:reek:TooManyStatement
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
# File 'lib/slothful_code.rb', line 71 def decode(code) begin id_str, type_id = code.split('-') id = @id_processor.decode(id_str) if id && type_id @resources = { type_id: type_id, time: id } else {} end rescue Hashids::InputError => e if e. == 'unable to unhash' {} else raise end end end |
#generate(type_id:) ⇒ Object
コードを生成する
- param
-
String type_id
- return
-
String
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/slothful_code.rb', line 40 def generate(type_id:) t = time_array if type_id.to_s =~ TYPE_CHARS hash = [ @id_processor.encode(t), type_id.to_s ].join('-') @resources = { type_id: type_id.to_s, time: t } hash else raise WrongTypeId end end |
#now ⇒ Object
- return
-
Time
93 94 95 |
# File 'lib/slothful_code.rb', line 93 def now Time.now end |
#time_array ⇒ Object
現在時刻を2つの整数の配列にして返す
少数部を 1 msec にまで丸めて2つの整数の配列にして返している。この 部分は完全に hashids での利用のために特化している。この際、0.1 と 0.001 が同じ整数 1 にならないように 0 を埋めている。
ex)
- 12345, 123
-
time_array
- return
-
Array
:reek:UncommunicativeVariableName
110 111 112 113 114 115 116 |
# File 'lib/slothful_code.rb', line 110 def time_array t = now.to_f.round(3) sleep 0.001 ht, lt = t.to_s.split('.') [ht.to_i, (lt.to_s + '00')[0, 3].to_i] end |
#valid?(code) ⇒ Boolean
与えられたコードが hashids で decode できるかどうか
- param
-
String code
- return
-
Boolean
62 63 64 |
# File 'lib/slothful_code.rb', line 62 def valid?(code) decode(code).size > 0 end |