slothful-code-generator 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: f8dbd14d94387b3989432616c6fac8ad9d6dbd95b51bc665db1bf612672376ed
4
+ data.tar.gz: c0eb253a2e8d63f85e844d7df91b6593b1048c9024e8564a9e824f7e44af4788
5
+ SHA512:
6
+ metadata.gz: 695fa543111485dd49ea0daf207c39bde52f1f387f67a77beaabce4d5935f21719efd4d6f7aa8f967b1ff97e18e12b070abea05caffa5f3f51b93cc3b3fb2939
7
+ data.tar.gz: 0b67467a85a6729a261bbd76e4d94f6eb563e10bea0f374a1e9b23c2c938e64bd62d2dfff56e063873f6c0d3a1b321438a1f1d3fd2953a02a251639cc380a8e3
data/.editorconfig ADDED
@@ -0,0 +1,3 @@
1
+ [*]
2
+ indent_size = 2
3
+ indent_style = space
data/.gitignore ADDED
@@ -0,0 +1,10 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+ /vendor/
10
+ Gemfile.lock
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ sudo: false
3
+ language: ruby
4
+ cache: bundler
5
+ rvm:
6
+ - 2.6.5
7
+ before_install: gem install bundler -v 2.0.2
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in slothful-code-generator.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,25 @@
1
+ BSD 2-Clause License
2
+
3
+ Copyright (c) 2021, Colorful Company,Inc.
4
+ All rights reserved.
5
+
6
+ Redistribution and use in source and binary forms, with or without
7
+ modification, are permitted provided that the following conditions are met:
8
+
9
+ 1. Redistributions of source code must retain the above copyright notice, this
10
+ list of conditions and the following disclaimer.
11
+
12
+ 2. Redistributions in binary form must reproduce the above copyright notice,
13
+ this list of conditions and the following disclaimer in the documentation
14
+ and/or other materials provided with the distribution.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
20
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.md ADDED
@@ -0,0 +1,46 @@
1
+ # SlothfulCode
2
+
3
+ ある程度人間にとって扱いやすい長さ、複雑さで、類推しにくく、重複しないコードを生成、検証する
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'slothful-code-generator'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install slothful-code-generator
20
+
21
+ ## Usage
22
+
23
+ ```ruby
24
+ require 'slothful_code'
25
+ ```
26
+
27
+ ### ganerate
28
+
29
+ ```ruby
30
+ sc = SlothfulCode.new(<salt>)
31
+ sc.generate(type_id: '1') # => '989JV7WDCN6Q-1'
32
+ ```
33
+
34
+ ### decode
35
+
36
+ ```ruby
37
+ sc = SlothfulCode.new(<salt>)
38
+ sc.decode(<code>) # => {:type_id=>'1', :time=>[1612769809, 113]}
39
+ ```
40
+
41
+ ### valid?
42
+
43
+ ```ruby
44
+ sc = SlothfulCode.new(<salt>)
45
+ sc.valid?(<code>) # => true / false
46
+ ```
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.libs << "lib"
7
+ t.test_files = FileList["test/**/*_test.rb"]
8
+ end
9
+
10
+ task :default => :test
data/Steepfile ADDED
@@ -0,0 +1,7 @@
1
+ # -*- mode: ruby -*-
2
+
3
+ target :lib do
4
+ signature "sig"
5
+
6
+ check "lib" # Directory name
7
+ end
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "slothful_code"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1 @@
1
+ require_relative './slothful_code'
@@ -0,0 +1,134 @@
1
+ require "hashids"
2
+ require "slothful_code/version"
3
+
4
+ #
5
+ # 識別コードを生成、検証する
6
+ #
7
+ # hashids を利用して長過ぎず短過ぎない、人間に読み書きしやすくユニー
8
+ # クな文字列を生成し、またその文字列が適切にこのシステムが生成したも
9
+ # のかどうかを検証できる仕組み
10
+ #
11
+ # 数字と英大文字のうち数字と紛らわしくない文字を利用して11, 12桁程度に
12
+ # 収まるだろう文字列を生成する
13
+ #
14
+ # sc = SlothfulCode.new
15
+ # sc.generate(type_id: '1') # => 'R6B7ZRDT6EY-1'
16
+ #
17
+ # see https://hashids.org/
18
+ #
19
+ class SlothfulCode
20
+ class Error < StandardError; end
21
+ class WrongTypeId < Error; end
22
+
23
+ HASHIDS_INCLUDE_CHARS = '1234567890ABCDEFGHJKLMNPQRSTUVWXYZ'.freeze
24
+ TYPE_CHARS = /\A[0-9A-Z]+\z/
25
+
26
+ #
27
+ # [param] String salt
28
+ #
29
+ def initialize(salt = '')
30
+ @id_processor = Hashids.new(salt, 6, HASHIDS_INCLUDE_CHARS)
31
+ end
32
+ attr_reader :resources
33
+
34
+ #
35
+ # コードを生成する
36
+ #
37
+ # [param] String type_id
38
+ # [return] String
39
+ #
40
+ def generate(type_id:)
41
+ t = time_array
42
+
43
+ if type_id.to_s =~ TYPE_CHARS
44
+ hash = [
45
+ @id_processor.encode(t),
46
+ type_id.to_s
47
+ ].join('-')
48
+
49
+ @resources = { type_id: type_id.to_s, time: t }
50
+ hash
51
+ else
52
+ raise WrongTypeId
53
+ end
54
+ end
55
+
56
+ #
57
+ # 与えられたコードが hashids で decode できるかどうか
58
+ #
59
+ # [param] String code
60
+ # [return] Boolean
61
+ #
62
+ def valid?(code)
63
+ decode(code).size > 0
64
+ end
65
+
66
+ #
67
+ # [param] String code
68
+ # [return] Hash
69
+ #
70
+ # :reek:TooManyStatement
71
+ def decode(code)
72
+ begin
73
+ id_str, type_id = code.split('-')
74
+ id = @id_processor.decode(id_str)
75
+
76
+ if id && type_id
77
+ @resources = { type_id: type_id, time: id }
78
+ else
79
+ {}
80
+ end
81
+ rescue Hashids::InputError => e
82
+ if e.message == 'unable to unhash'
83
+ {}
84
+ else
85
+ raise
86
+ end
87
+ end
88
+ end
89
+
90
+ #
91
+ # [return] Time
92
+ #
93
+ def now
94
+ Time.now
95
+ end
96
+
97
+ #
98
+ # 現在時刻を2つの整数の配列にして返す
99
+ #
100
+ # 少数部を 1 msec にまで丸めて2つの整数の配列にして返している。この
101
+ # 部分は完全に hashids での利用のために特化している。この際、0.1 と
102
+ # 0.001 が同じ整数 1 にならないように 0 を埋めている。
103
+ #
104
+ # ex)
105
+ # [12345, 123] = time_array
106
+ #
107
+ # [return] Array
108
+ #
109
+ # :reek:UncommunicativeVariableName
110
+ def time_array
111
+ t = now.to_f.round(3)
112
+ sleep 0.001
113
+
114
+ ht, lt = t.to_s.split('.')
115
+ [ht.to_i, (lt.to_s + '00')[0, 3].to_i]
116
+ end
117
+
118
+ #
119
+ # decode 済みのコードについて確認用の日付を取得する
120
+ #
121
+ # [return] String
122
+ #
123
+ # :reek:UncommunicativeVariableName, :reek:FeatureEnvy
124
+ def date
125
+ time = resources[:time]
126
+
127
+ if time
128
+ t = Time.at(time.first)
129
+ { month: t.month, mon: t.mon, day: t.day }
130
+ else
131
+ nil
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,3 @@
1
+ class SlothfulCode
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,27 @@
1
+ # -*- mode: ruby -*-
2
+
3
+ type time_array = [Integer, Integer]
4
+ type resource_record = { type_id: String?, time: time_array? }
5
+ type date_record = { month: Integer, mon: Integer, day: Integer }
6
+
7
+ class SlothfulCode
8
+ VERSION: String
9
+ HASHIDS_INCLUDE_CHARS: String
10
+ TYPE_CHARS: untyped
11
+
12
+ attr_reader resources: resource_record
13
+
14
+ def initialize: (?String) -> untyped
15
+
16
+ def generate: (type_id: String) -> String
17
+
18
+ def valid?: (String) -> bool
19
+
20
+ def decode: (String) -> resource_record
21
+
22
+ def now: () -> Time
23
+
24
+ def time_array: () -> time_array
25
+
26
+ def date: () -> (date_record | nil)
27
+ end
@@ -0,0 +1,40 @@
1
+ lib = File.expand_path("lib", __dir__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require "slothful_code/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "slothful-code-generator"
7
+ spec.version = SlothfulCode::VERSION
8
+ spec.authors = [""]
9
+ spec.email = [""]
10
+
11
+ spec.summary = %q{generate time-based unique id with loose precision}
12
+ spec.description = # %q{TODO: Write a longer description or delete this line.}
13
+ spec.homepage = "https://github.com/colorfulcompany/slothful-code-generator"
14
+
15
+ spec.metadata["allowed_push_host"] = "https://rubygems.org"
16
+
17
+ spec.metadata["homepage_uri"] = spec.homepage
18
+ spec.metadata["source_code_uri"] = spec.homepage
19
+ # spec.metadata["changelog_uri"] = "TODO: Put your gem's CHANGELOG.md URL here."
20
+
21
+ # Specify which files should be added to the gem when it is released.
22
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
23
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
24
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
25
+ end
26
+ spec.bindir = "exe"
27
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
+ spec.require_paths = ["lib"]
29
+
30
+ spec.add_runtime_dependency "hashids", "~> 1"
31
+
32
+ spec.add_development_dependency "bundler", "~> 2.0"
33
+ spec.add_development_dependency "rake", "~> 12"
34
+ spec.add_development_dependency "minitest", "~> 5.0"
35
+ spec.add_development_dependency "minitest-skip"
36
+ spec.add_development_dependency "minitest-power_assert", "~> 0.3"
37
+ spec.add_development_dependency "power_assert", "~> 2.0"
38
+ spec.add_development_dependency "minitest-reporters", "~> 1"
39
+ spec.add_development_dependency "steep"
40
+ end
metadata ADDED
@@ -0,0 +1,187 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: slothful-code-generator
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - ''
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2021-03-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: hashids
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '12'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '12'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '5.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '5.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest-skip
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: minitest-power_assert
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.3'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.3'
97
+ - !ruby/object:Gem::Dependency
98
+ name: power_assert
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '2.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '2.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: minitest-reporters
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '1'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '1'
125
+ - !ruby/object:Gem::Dependency
126
+ name: steep
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ description: https://github.com/colorfulcompany/slothful-code-generator
140
+ email:
141
+ - ''
142
+ executables: []
143
+ extensions: []
144
+ extra_rdoc_files: []
145
+ files:
146
+ - ".editorconfig"
147
+ - ".gitignore"
148
+ - ".travis.yml"
149
+ - Gemfile
150
+ - LICENSE
151
+ - README.md
152
+ - Rakefile
153
+ - Steepfile
154
+ - bin/console
155
+ - bin/setup
156
+ - lib/slothful-code-generator.rb
157
+ - lib/slothful_code.rb
158
+ - lib/slothful_code/version.rb
159
+ - sig/slothful_code.rbs
160
+ - slothful-code-generator.gemspec
161
+ homepage: https://github.com/colorfulcompany/slothful-code-generator
162
+ licenses: []
163
+ metadata:
164
+ allowed_push_host: https://rubygems.org
165
+ homepage_uri: https://github.com/colorfulcompany/slothful-code-generator
166
+ source_code_uri: https://github.com/colorfulcompany/slothful-code-generator
167
+ post_install_message:
168
+ rdoc_options: []
169
+ require_paths:
170
+ - lib
171
+ required_ruby_version: !ruby/object:Gem::Requirement
172
+ requirements:
173
+ - - ">="
174
+ - !ruby/object:Gem::Version
175
+ version: '0'
176
+ required_rubygems_version: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ requirements: []
182
+ rubyforge_project:
183
+ rubygems_version: 2.7.6.2
184
+ signing_key:
185
+ specification_version: 4
186
+ summary: generate time-based unique id with loose precision
187
+ test_files: []