order_id 0.1.1 → 0.1.3
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 +5 -5
- data/.gitignore +1 -1
- data/Gemfile +6 -0
- data/README.md +3 -3
- data/bin/console +3 -5
- data/lib/order_id/version.rb +3 -0
- data/lib/order_id.rb +27 -0
- data/{OrderId.gemspec → order_id.gemspec} +13 -12
- metadata +25 -12
- data/.idea/workspace.xml +0 -49
- data/lib/OrderId/version.rb +0 -3
- data/lib/OrderId.rb +0 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 4411fb9039ddb6ce1173b1093eb5978ff8d0c04b12bdb51d3671448b2f16eba6
|
4
|
+
data.tar.gz: 517f9d854d8d469be93929b9fd778b8fd8765d39dfd9778bc271593aa37c5ef5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6e8c88d48610a1eb1688d440fb22e02648ab8e55d5f8b07323653b01203db07989d32e65e95b7472116973492cea7b3d39b9cba718089049df3ebe6699ae06d2
|
7
|
+
data.tar.gz: 3c3ea8008b0bb8b03bfa8a7ef200bd887f7fffffcfae3cf06fd8ad8a1974c58064951c7c5a433d13ea11d93ccdebc873663b998238252c7c402646cfdcf18e77
|
data/.gitignore
CHANGED
data/Gemfile
ADDED
data/README.md
CHANGED
@@ -13,7 +13,7 @@ of XX chars separated by a custom separator-char.
|
|
13
13
|
Add this line to your application's Gemfile:
|
14
14
|
|
15
15
|
```ruby
|
16
|
-
gem '
|
16
|
+
gem 'order_id'
|
17
17
|
```
|
18
18
|
|
19
19
|
And then execute:
|
@@ -32,7 +32,7 @@ OrderId.get_time('G3RRY-ZMIHR-CCZ3P-FGXM') # 2022-08-21 20:33:18 +0000
|
|
32
32
|
```
|
33
33
|
### Parameters
|
34
34
|
OrderId takes four optional parameters:
|
35
|
-
- `
|
35
|
+
- `decimal_places`: number of decimal places in a timestamp. Makes no sense if it's over 20, common sense is 10 or 12.
|
36
36
|
- `base`: base number system. Defaults to 36, but any arbitrary base is a good place to obfuscate your ids. E.g . `OrderId.generate(base: 12) # 12616-51312-6751B-A87B1-72235-444`
|
37
37
|
- `separator`: a separator char. Defaults to `-` but can be `'/'` or any non-digit and non-word character
|
38
38
|
- `group_length`: a number of chars in groups separated by a `separator`. Defaults to 4. `OrderId.generate(base: 12, length: 4, group_length: 8) # "1A434285-32526"`
|
@@ -41,7 +41,7 @@ OrderId takes four optional parameters:
|
|
41
41
|
If you know the parameters which the Id has been generated with you can restore a timestamp the Id was based on.
|
42
42
|
|
43
43
|
```ruby
|
44
|
-
OrderId.get_time('1A434285-32526', base: 12,
|
44
|
+
OrderId.get_time('1A434285-32526', base: 12, decimal_places: 4) # 2022-08-21 20:49:34 +0000
|
45
45
|
```
|
46
46
|
|
47
47
|
## Development
|
data/bin/console
CHANGED
@@ -1,14 +1,12 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require "bundler/setup"
|
4
|
-
require "
|
4
|
+
require "order_id"
|
5
5
|
|
6
6
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
7
|
# with your gem easier. You can also use a different console, if you like.
|
8
8
|
|
9
9
|
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
|
11
|
-
|
10
|
+
require "pry"
|
11
|
+
Pry.start
|
12
12
|
|
13
|
-
require "irb"
|
14
|
-
IRB.start(__FILE__)
|
data/lib/order_id.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'order_id/version'
|
2
|
+
require 'bigdecimal'
|
3
|
+
module OrderId
|
4
|
+
DECIMAL_PLACES = 20
|
5
|
+
BASE = 36
|
6
|
+
SEPARATOR = '-'
|
7
|
+
GROUP_LENGTH = 5
|
8
|
+
ALLOWED_SEPARATORS = ['-', '_', '|', ':', '@', '.', '/', '#', '!', '$', '%', '^', '&', '*', '(', ')', '[', ']', '{', '}'].freeze
|
9
|
+
|
10
|
+
class FormatError < StandardError; end
|
11
|
+
|
12
|
+
def self.generate(decimal_places: DECIMAL_PLACES, base: BASE, separator: SEPARATOR, group_length: GROUP_LENGTH)
|
13
|
+
raise FormatError, "Characters not allowed as separator: '#{separator}'" unless ALLOWED_SEPARATORS.include?(separator)
|
14
|
+
raise FormatError, 'Length should be positive' unless decimal_places.positive?
|
15
|
+
|
16
|
+
t = Time.now.to_f
|
17
|
+
ts = format("%.#{decimal_places}f", t).delete('.')
|
18
|
+
final = ts.to_i.to_s(base).upcase
|
19
|
+
final.scan(/.{1,#{group_length}}/).join(separator)
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.get_time(id, decimal_places: DECIMAL_PLACES, base: BASE, separator: SEPARATOR)
|
23
|
+
id.delete!(separator)
|
24
|
+
ts = id.to_i(base) / BigDecimal("1e+#{decimal_places}")
|
25
|
+
Time.at(ts)
|
26
|
+
end
|
27
|
+
end
|
@@ -1,18 +1,18 @@
|
|
1
1
|
|
2
|
-
lib = File.expand_path(
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
4
|
+
require 'order_id/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'order_id'
|
8
8
|
spec.version = OrderId::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
9
|
+
spec.authors = ['Max Buslaev']
|
10
|
+
spec.email = ['max@buslaev.net']
|
11
11
|
|
12
12
|
spec.summary = %q{Timestamps-based ID strings.}
|
13
13
|
spec.description = %q{Generates an ID string best used for orders/invoices/etc. Timestamp-based, reverse parseable.}
|
14
|
-
spec.homepage =
|
15
|
-
spec.license =
|
14
|
+
spec.homepage = 'https://github.com/austerlitz/order_id'
|
15
|
+
spec.license = 'MIT'
|
16
16
|
|
17
17
|
|
18
18
|
# Specify which files should be added to the gem when it is released.
|
@@ -20,13 +20,14 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
21
21
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
22
22
|
end
|
23
|
-
spec.bindir =
|
23
|
+
spec.bindir = 'exe'
|
24
24
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
25
|
-
spec.require_paths = [
|
25
|
+
spec.require_paths = ['lib']
|
26
26
|
|
27
|
-
spec.add_development_dependency
|
28
|
-
spec.add_development_dependency
|
29
|
-
spec.add_development_dependency
|
27
|
+
spec.add_development_dependency 'bundler'
|
28
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
29
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
30
|
+
spec.add_development_dependency 'pry'
|
30
31
|
|
31
32
|
spec.add_dependency 'bigdecimal'
|
32
33
|
end
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: order_id
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Max Buslaev
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-07-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '3.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: bigdecimal
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -75,18 +89,18 @@ extensions: []
|
|
75
89
|
extra_rdoc_files: []
|
76
90
|
files:
|
77
91
|
- ".gitignore"
|
78
|
-
- ".idea/workspace.xml"
|
79
92
|
- ".rspec"
|
80
93
|
- ".travis.yml"
|
81
94
|
- CODE_OF_CONDUCT.md
|
95
|
+
- Gemfile
|
82
96
|
- LICENSE.txt
|
83
|
-
- OrderId.gemspec
|
84
97
|
- README.md
|
85
98
|
- Rakefile
|
86
99
|
- bin/console
|
87
100
|
- bin/setup
|
88
|
-
- lib/
|
89
|
-
- lib/
|
101
|
+
- lib/order_id.rb
|
102
|
+
- lib/order_id/version.rb
|
103
|
+
- order_id.gemspec
|
90
104
|
homepage: https://github.com/austerlitz/order_id
|
91
105
|
licenses:
|
92
106
|
- MIT
|
@@ -106,8 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
106
120
|
- !ruby/object:Gem::Version
|
107
121
|
version: '0'
|
108
122
|
requirements: []
|
109
|
-
|
110
|
-
rubygems_version: 2.5.2
|
123
|
+
rubygems_version: 3.4.13
|
111
124
|
signing_key:
|
112
125
|
specification_version: 4
|
113
126
|
summary: Timestamps-based ID strings.
|
data/.idea/workspace.xml
DELETED
@@ -1,49 +0,0 @@
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
-
<project version="4">
|
3
|
-
<component name="ChangeListManager">
|
4
|
-
<list default="true" id="4b873eb2-62f8-4b0c-a8f7-c2e6e71629fe" name="Changes" comment="" />
|
5
|
-
<option name="SHOW_DIALOG" value="false" />
|
6
|
-
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
7
|
-
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
8
|
-
<option name="LAST_RESOLUTION" value="IGNORE" />
|
9
|
-
</component>
|
10
|
-
<component name="Git.Settings">
|
11
|
-
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
12
|
-
</component>
|
13
|
-
<component name="MarkdownSettingsMigration">
|
14
|
-
<option name="stateVersion" value="1" />
|
15
|
-
</component>
|
16
|
-
<component name="ProjectId" id="2DgD17KvwTjH9BGJd1Qsr1bJHzY" />
|
17
|
-
<component name="ProjectLevelVcsManager" settingsEditedManually="true" />
|
18
|
-
<component name="ProjectViewState">
|
19
|
-
<option name="hideEmptyMiddlePackages" value="true" />
|
20
|
-
<option name="showLibraryContents" value="true" />
|
21
|
-
</component>
|
22
|
-
<component name="PropertiesComponent">{
|
23
|
-
"keyToString": {
|
24
|
-
"RunOnceActivity.OpenProjectViewOnStart": "true",
|
25
|
-
"RunOnceActivity.ShowReadmeOnStart": "true",
|
26
|
-
"WebServerToolWindowFactoryState": "false",
|
27
|
-
"nodejs_package_manager_path": "npm",
|
28
|
-
"ruby.rails.projectView.checked": "true",
|
29
|
-
"vue.rearranger.settings.migration": "true"
|
30
|
-
}
|
31
|
-
}</component>
|
32
|
-
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
|
33
|
-
<component name="SpringUtil" SPRING_PRE_LOADER_OPTION="true" RAKE_SPRING_PRE_LOADER_OPTION="true" RAILS_SPRING_PRE_LOADER_OPTION="true" />
|
34
|
-
<component name="TaskManager">
|
35
|
-
<task active="true" id="Default" summary="Default task">
|
36
|
-
<changelist id="4b873eb2-62f8-4b0c-a8f7-c2e6e71629fe" name="Changes" comment="" />
|
37
|
-
<created>1661111615612</created>
|
38
|
-
<option name="number" value="Default" />
|
39
|
-
<option name="presentableId" value="Default" />
|
40
|
-
<updated>1661111615612</updated>
|
41
|
-
<workItem from="1661111617027" duration="4151000" />
|
42
|
-
<workItem from="1661115973104" duration="395000" />
|
43
|
-
</task>
|
44
|
-
<servers />
|
45
|
-
</component>
|
46
|
-
<component name="TypeScriptGeneratedFilesManager">
|
47
|
-
<option name="version" value="3" />
|
48
|
-
</component>
|
49
|
-
</project>
|
data/lib/OrderId/version.rb
DELETED
data/lib/OrderId.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
require "OrderId/version"
|
2
|
-
require 'bigdecimal'
|
3
|
-
module OrderId
|
4
|
-
DECIMAL_LENGTH = 20
|
5
|
-
BASE = 36
|
6
|
-
SEPARATOR = '-'
|
7
|
-
GROUP_LENGTH = 5
|
8
|
-
class FormatError < StandardError; end
|
9
|
-
|
10
|
-
def self.generate(length: DECIMAL_LENGTH, base: BASE, separator: SEPARATOR, group_length: GROUP_LENGTH)
|
11
|
-
if separator =~ (/[\w\d]/)
|
12
|
-
raise FormatError, "Characters not allowed as separator: `#{separator}`"
|
13
|
-
end
|
14
|
-
t = Time.now.to_f
|
15
|
-
ts = "%.#{length}f" % t
|
16
|
-
ts.delete!('.')
|
17
|
-
final = ts.to_i.to_s(base).upcase
|
18
|
-
final.scan(/.{1,#{group_length}}/).join(separator)
|
19
|
-
end
|
20
|
-
|
21
|
-
def self.get_time(id, length: DECIMAL_LENGTH, base: BASE, separator: SEPARATOR)
|
22
|
-
id.delete!(separator)
|
23
|
-
ts = id.to_i(base) / BigDecimal("1e+#{length}")
|
24
|
-
Time.at(ts)
|
25
|
-
end
|
26
|
-
end
|