Class: SlothfulCode

Inherits:
Object
  • Object
show all
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

Instance Method Summary collapse

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

#resourcesObject (readonly)

Returns the value of attribute resources.



32
33
34
# File 'lib/slothful_code.rb', line 32

def resources
  @resources
end

Instance Method Details

#dateObject

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.message == '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

#nowObject

return

Time



93
94
95
# File 'lib/slothful_code.rb', line 93

def now
  Time.now
end

#time_arrayObject

現在時刻を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

Returns:

  • (Boolean)


62
63
64
# File 'lib/slothful_code.rb', line 62

def valid?(code)
  decode(code).size > 0
end