ulid-rails 1.1.1 → 2.0.0.pre.1
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
- data/.github/workflows/test.yml +3 -12
- data/.rubocop.yml +1 -0
- data/CHANGELOG.md +5 -0
- data/README.md +1 -5
- data/lib/ulid/rails/patch.rb +0 -40
- data/lib/ulid/rails/postgresql_type.rb +39 -0
- data/lib/ulid/rails/sqlite_type.rb +21 -0
- data/lib/ulid/rails/type.rb +53 -43
- data/lib/ulid/rails/version.rb +1 -1
- data/lib/ulid/rails.rb +8 -11
- data/ulid-rails.gemspec +4 -3
- metadata +26 -14
- data/gemfiles/5.0.gemfile +0 -10
- data/gemfiles/5.1.gemfile +0 -10
- data/lib/ulid/rails/formatter.rb +0 -16
- data/lib/ulid/rails/validator.rb +0 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4fe6dfad2124c31cc7fbd3b744c8309d3abbd1fe8b3f0f737e87730d48e4a7ad
|
4
|
+
data.tar.gz: 5c94f88160609b46cb584c5e802e1a8fbfc3ae92e75e08277ca50c4f5693d24b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0f39ff3a403a16b42ea3ee18a82938b266998f936dabe319084d52dedc2a2260761b92ed3273b8b074c0ee95b30979eef30b41abfa8db73ea16b0436652f1b26
|
7
|
+
data.tar.gz: a836d749d63b71b66cc310262db3c3cd529b5378e17c3ef5c265503c695d446fdc954df36f9c74b828ab423620e707138877322db1546b1d6fc3f3e7c4b986aa
|
data/.github/workflows/test.yml
CHANGED
@@ -15,19 +15,10 @@ jobs:
|
|
15
15
|
strategy:
|
16
16
|
fail-fast: false
|
17
17
|
matrix:
|
18
|
-
activerecord-version: ["
|
18
|
+
activerecord-version: ["6.0", "6.1", "7.0", "7.0.5"]
|
19
19
|
ruby-version: ["2.7", "3.0", "3.1", "3.2"]
|
20
|
-
|
21
|
-
- {activerecord-version: "5.
|
22
|
-
- {activerecord-version: "5.0", ruby-version: "3.1"}
|
23
|
-
- {activerecord-version: "5.0", ruby-version: "3.2"}
|
24
|
-
- {activerecord-version: "5.1", ruby-version: "3.0"}
|
25
|
-
- {activerecord-version: "5.1", ruby-version: "3.1"}
|
26
|
-
- {activerecord-version: "5.1", ruby-version: "3.2"}
|
27
|
-
- {activerecord-version: "5.2", ruby-version: "3.0"}
|
28
|
-
- {activerecord-version: "5.2", ruby-version: "3.1"}
|
29
|
-
- {activerecord-version: "5.2", ruby-version: "3.2"}
|
30
|
-
- {activerecord-version: "6.0", ruby-version: "3.1"}
|
20
|
+
include:
|
21
|
+
- {activerecord-version: "5.2", ruby-version: "2.7"}
|
31
22
|
steps:
|
32
23
|
- uses: actions/checkout@v3
|
33
24
|
- run: docker-compose run test
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -162,13 +162,9 @@ $ docker-compose run -e AR_VERSION=6.1 test
|
|
162
162
|
Or run tests locally, without docker-compose
|
163
163
|
|
164
164
|
```
|
165
|
-
$ AR_VERSION=
|
165
|
+
$ AR_VERSION=6.1 bundle update && AR_VERSION=6.1 bundle exec rake test
|
166
166
|
```
|
167
167
|
|
168
|
-
## Known issues
|
169
|
-
|
170
|
-
- ActiveRecord 5.0 and 5.1 do not work properly with some data association loading methods. For example, eager loading with limit/offset on a model that has a ulid ID. Refer to test cases that are skiped for AR 5.0 and 5.1.
|
171
|
-
|
172
168
|
## License
|
173
169
|
|
174
170
|
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/lib/ulid/rails/patch.rb
CHANGED
@@ -8,46 +8,6 @@ module ULID
|
|
8
8
|
as: "FROM_UNIXTIME(CONV(HEX(#{ulid_column_name} >> 80), 16, 10) / 1000.0)"
|
9
9
|
end
|
10
10
|
end
|
11
|
-
|
12
|
-
module FinderMethods
|
13
|
-
def limited_ids_for(relation)
|
14
|
-
id_rows = super
|
15
|
-
if klass.attribute_types[primary_key].is_a? ULID::Rails::Type
|
16
|
-
id_rows.map do |id|
|
17
|
-
klass.attribute_types[primary_key].deserialize id
|
18
|
-
end
|
19
|
-
else
|
20
|
-
id_rows
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
module SchemaStatements
|
26
|
-
def distinct_relation_for_primary_key(relation) # :nodoc:
|
27
|
-
values = columns_for_distinct(
|
28
|
-
visitor.compile(relation.table[relation.primary_key]),
|
29
|
-
relation.order_values
|
30
|
-
)
|
31
|
-
|
32
|
-
limited = relation.reselect(values).distinct!
|
33
|
-
limited_ids = select_rows(limited.arel, "SQL").map(&:last)
|
34
|
-
|
35
|
-
if relation.klass.attribute_types[relation.primary_key].is_a? ULID::Rails::Type
|
36
|
-
limited_ids.map! do |id|
|
37
|
-
relation.klass.attribute_types[relation.primary_key].deserialize id
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
if limited_ids.empty?
|
42
|
-
relation.none!
|
43
|
-
else
|
44
|
-
relation.where!(relation.primary_key => limited_ids)
|
45
|
-
end
|
46
|
-
|
47
|
-
relation.limit_value = relation.offset_value = nil
|
48
|
-
relation
|
49
|
-
end
|
50
|
-
end
|
51
11
|
end
|
52
12
|
end
|
53
13
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require_relative "type"
|
2
|
+
|
3
|
+
module ULID
|
4
|
+
module Rails
|
5
|
+
class PostgresqlType < Type
|
6
|
+
class Data < ULID::Rails::Type::Data
|
7
|
+
def hex
|
8
|
+
hexed = super
|
9
|
+
return nil if hexed.nil?
|
10
|
+
[hexed].pack("H*")
|
11
|
+
end
|
12
|
+
|
13
|
+
alias_method :to_s, :hex
|
14
|
+
end
|
15
|
+
|
16
|
+
# Inspired by active_record/connection_adapters/postgresql/oid/bytea
|
17
|
+
def deserialize(value)
|
18
|
+
case value
|
19
|
+
when nil
|
20
|
+
nil
|
21
|
+
when ULID::Rails::Type::Data
|
22
|
+
super(value.value)
|
23
|
+
else
|
24
|
+
super(PG::Connection.unescape_bytea(value))
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def cast_string_to_ulid(value)
|
31
|
+
if value.is_a?(String) && value.length == 34 && value.start_with?("\\x")
|
32
|
+
Data.from_serialized(value[2..])
|
33
|
+
else
|
34
|
+
super(value, data_class: PostgresqlType::Data)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative "type"
|
2
|
+
|
3
|
+
module ULID
|
4
|
+
module Rails
|
5
|
+
class SqliteType < Type
|
6
|
+
class Data < ULID::Rails::Type::Data
|
7
|
+
alias_method :to_s, :hex
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def cast_string_to_ulid(value)
|
13
|
+
if value.is_a?(String) && value.length == 32
|
14
|
+
Data.from_serialized(value)
|
15
|
+
else
|
16
|
+
super(value, data_class: SqliteType::Data)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/ulid/rails/type.rb
CHANGED
@@ -1,68 +1,78 @@
|
|
1
1
|
require "active_model/type"
|
2
|
-
require "
|
3
|
-
require "ulid/rails/validator"
|
2
|
+
require "base32/crockford"
|
4
3
|
require "ulid/rails/errors"
|
5
4
|
|
6
5
|
module ULID
|
7
6
|
module Rails
|
8
7
|
class Type < ActiveModel::Type::Binary
|
9
|
-
|
10
|
-
|
8
|
+
def assert_valid_value(value)
|
9
|
+
raise ArgumentError, "`#{value}` is not a ULID format" unless Data.valid_ulid?(value)
|
11
10
|
end
|
12
11
|
|
13
|
-
def
|
14
|
-
|
15
|
-
|
16
|
-
|
12
|
+
def cast(value)
|
13
|
+
return nil if value.nil?
|
14
|
+
|
15
|
+
str = value.is_a?(Data) ? value.value : value
|
16
|
+
|
17
|
+
cast_string_to_ulid(str).value
|
17
18
|
end
|
18
19
|
|
19
|
-
def
|
20
|
-
|
20
|
+
def serialize(value)
|
21
|
+
return value if value.is_a?(Data)
|
22
|
+
return Data.null unless value.is_a?(String)
|
23
|
+
|
24
|
+
cast_string_to_ulid(value)
|
21
25
|
end
|
22
26
|
|
23
27
|
def deserialize(value)
|
24
28
|
return nil if value.nil?
|
25
29
|
|
26
|
-
|
27
|
-
when "mysql2"
|
28
|
-
if value.is_a?(Data)
|
29
|
-
value = value.to_s
|
30
|
-
elsif value.is_a?(String)
|
31
|
-
value = value.unpack1("H*")
|
32
|
-
end
|
33
|
-
when "postgresql"
|
34
|
-
if value.is_a?(Data)
|
35
|
-
value = value.to_s
|
36
|
-
value = value.unpack1("H*")
|
37
|
-
end
|
38
|
-
value = value[2..-1] if value.start_with?("\\x")
|
39
|
-
when "sqlite3"
|
40
|
-
if value.is_a?(Data)
|
41
|
-
value = value.to_s
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
value.length == 32 ? @formatter.format(value) : super
|
30
|
+
super
|
46
31
|
end
|
47
32
|
|
48
|
-
|
49
|
-
|
33
|
+
private
|
34
|
+
|
35
|
+
def cast_string_to_ulid(value, data_class: Data)
|
36
|
+
raise ArgumentError if !value.is_a?(String)
|
50
37
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
38
|
+
if data_class.valid_ulid?(value)
|
39
|
+
data_class.new(value)
|
40
|
+
else
|
41
|
+
data = value.unpack1("H*")
|
42
|
+
data_class.from_serialized(data)
|
56
43
|
end
|
57
44
|
end
|
58
45
|
|
59
|
-
|
46
|
+
class Data < ActiveModel::Type::Binary::Data
|
47
|
+
def self.null
|
48
|
+
new(nil)
|
49
|
+
end
|
60
50
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
51
|
+
def self.from_serialized(data)
|
52
|
+
deserialized = Base32::Crockford.encode(data.hex).rjust(26, "0")
|
53
|
+
new(deserialized)
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.valid_ulid?(str)
|
57
|
+
return true if str.nil?
|
58
|
+
|
59
|
+
str.length == 26 && Base32::Crockford.valid?(str)
|
60
|
+
end
|
61
|
+
|
62
|
+
def initialize(value)
|
63
|
+
@value = nil
|
64
|
+
super if self.class.valid_ulid?(value)
|
65
|
+
end
|
66
|
+
|
67
|
+
attr_reader :value
|
68
|
+
|
69
|
+
def hex
|
70
|
+
return nil if @value.nil?
|
71
|
+
|
72
|
+
hexed = Base32::Crockford.decode(@value).to_s(16).rjust(32, "0")
|
73
|
+
raise ArgumentError if hexed.length > 32
|
74
|
+
|
75
|
+
hexed
|
66
76
|
end
|
67
77
|
end
|
68
78
|
end
|
data/lib/ulid/rails/version.rb
CHANGED
data/lib/ulid/rails.rb
CHANGED
@@ -5,6 +5,8 @@ require "ulid"
|
|
5
5
|
require "base32/crockford"
|
6
6
|
require "ulid/rails/version"
|
7
7
|
require "ulid/rails/type"
|
8
|
+
require "ulid/rails/postgresql_type"
|
9
|
+
require "ulid/rails/sqlite_type"
|
8
10
|
require "ulid/rails/patch"
|
9
11
|
|
10
12
|
module ULID
|
@@ -13,7 +15,7 @@ module ULID
|
|
13
15
|
|
14
16
|
class_methods do
|
15
17
|
def ulid(column_name, auto_generate: false)
|
16
|
-
attribute column_name,
|
18
|
+
attribute column_name, :ulid
|
17
19
|
|
18
20
|
if auto_generate
|
19
21
|
before_create do
|
@@ -44,15 +46,10 @@ module ULID
|
|
44
46
|
end
|
45
47
|
end
|
46
48
|
|
47
|
-
|
48
|
-
ActiveRecord::
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
when 6
|
53
|
-
ActiveRecord::FinderMethods.prepend(Patch::FinderMethods)
|
54
|
-
when 7
|
55
|
-
ActiveRecord::ConnectionAdapters::SchemaStatements.prepend(Patch::SchemaStatements)
|
56
|
-
end
|
49
|
+
ActiveRecord::Type.register(:ulid, ULID::Rails::Type, override: false)
|
50
|
+
ActiveRecord::Type.register(:ulid, ULID::Rails::PostgresqlType, adapter: :postgresql)
|
51
|
+
ActiveRecord::Type.register(:ulid, ULID::Rails::SqliteType, adapter: :sqlite)
|
52
|
+
ActiveRecord::Type.register(:ulid, ULID::Rails::SqliteType, adapter: :sqlite3)
|
53
|
+
ActiveRecord::ConnectionAdapters::TableDefinition.include(Patch::Migrations)
|
57
54
|
end
|
58
55
|
end
|
data/ulid-rails.gemspec
CHANGED
@@ -32,10 +32,11 @@ Gem::Specification.new do |spec|
|
|
32
32
|
|
33
33
|
spec.add_dependency "ulid", "~> 1.0"
|
34
34
|
spec.add_dependency "base32-crockford", "~> 0.1"
|
35
|
-
spec.add_dependency "activesupport", ">= 5.
|
36
|
-
spec.add_dependency "activemodel", ">= 5.
|
37
|
-
spec.add_dependency "activerecord", ">= 5.
|
35
|
+
spec.add_dependency "activesupport", ">= 5.2"
|
36
|
+
spec.add_dependency "activemodel", ">= 5.2"
|
37
|
+
spec.add_dependency "activerecord", ">= 5.2"
|
38
38
|
spec.add_development_dependency "bundler"
|
39
|
+
spec.add_development_dependency "pry-byebug"
|
39
40
|
spec.add_development_dependency "rake"
|
40
41
|
spec.add_development_dependency "minitest", "~> 5.0"
|
41
42
|
spec.add_development_dependency "rubocop-minitest"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ulid-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0.pre.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kazunori Kajihiro
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2023-
|
12
|
+
date: 2023-09-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: ulid
|
@@ -45,42 +45,42 @@ dependencies:
|
|
45
45
|
requirements:
|
46
46
|
- - ">="
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version: '5.
|
48
|
+
version: '5.2'
|
49
49
|
type: :runtime
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
53
|
- - ">="
|
54
54
|
- !ruby/object:Gem::Version
|
55
|
-
version: '5.
|
55
|
+
version: '5.2'
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: activemodel
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
60
|
- - ">="
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version: '5.
|
62
|
+
version: '5.2'
|
63
63
|
type: :runtime
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
67
|
- - ">="
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: '5.
|
69
|
+
version: '5.2'
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: activerecord
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
73
73
|
requirements:
|
74
74
|
- - ">="
|
75
75
|
- !ruby/object:Gem::Version
|
76
|
-
version: '5.
|
76
|
+
version: '5.2'
|
77
77
|
type: :runtime
|
78
78
|
prerelease: false
|
79
79
|
version_requirements: !ruby/object:Gem::Requirement
|
80
80
|
requirements:
|
81
81
|
- - ">="
|
82
82
|
- !ruby/object:Gem::Version
|
83
|
-
version: '5.
|
83
|
+
version: '5.2'
|
84
84
|
- !ruby/object:Gem::Dependency
|
85
85
|
name: bundler
|
86
86
|
requirement: !ruby/object:Gem::Requirement
|
@@ -95,6 +95,20 @@ dependencies:
|
|
95
95
|
- - ">="
|
96
96
|
- !ruby/object:Gem::Version
|
97
97
|
version: '0'
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
name: pry-byebug
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '0'
|
105
|
+
type: :development
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - ">="
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
98
112
|
- !ruby/object:Gem::Dependency
|
99
113
|
name: rake
|
100
114
|
requirement: !ruby/object:Gem::Requirement
|
@@ -174,8 +188,6 @@ files:
|
|
174
188
|
- bin/run_tests
|
175
189
|
- bin/setup
|
176
190
|
- docker-compose.yml
|
177
|
-
- gemfiles/5.0.gemfile
|
178
|
-
- gemfiles/5.1.gemfile
|
179
191
|
- gemfiles/5.2.gemfile
|
180
192
|
- gemfiles/6.0.gemfile
|
181
193
|
- gemfiles/6.1.gemfile
|
@@ -183,10 +195,10 @@ files:
|
|
183
195
|
- gemfiles/7.0.gemfile
|
184
196
|
- lib/ulid/rails.rb
|
185
197
|
- lib/ulid/rails/errors.rb
|
186
|
-
- lib/ulid/rails/formatter.rb
|
187
198
|
- lib/ulid/rails/patch.rb
|
199
|
+
- lib/ulid/rails/postgresql_type.rb
|
200
|
+
- lib/ulid/rails/sqlite_type.rb
|
188
201
|
- lib/ulid/rails/type.rb
|
189
|
-
- lib/ulid/rails/validator.rb
|
190
202
|
- lib/ulid/rails/version.rb
|
191
203
|
- ulid-rails.gemspec
|
192
204
|
homepage: https://github.com/k2nr/ulid-rails/
|
@@ -208,9 +220,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
208
220
|
version: 2.5.0
|
209
221
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
210
222
|
requirements:
|
211
|
-
- - "
|
223
|
+
- - ">"
|
212
224
|
- !ruby/object:Gem::Version
|
213
|
-
version:
|
225
|
+
version: 1.3.1
|
214
226
|
requirements: []
|
215
227
|
rubygems_version: 3.4.12
|
216
228
|
signing_key:
|
data/gemfiles/5.0.gemfile
DELETED
data/gemfiles/5.1.gemfile
DELETED
@@ -1,10 +0,0 @@
|
|
1
|
-
source "https://rubygems.org"
|
2
|
-
|
3
|
-
gemspec path: ".."
|
4
|
-
|
5
|
-
gem "activesupport", "~> 5.1.0"
|
6
|
-
gem "activemodel", "~> 5.1.0"
|
7
|
-
gem "activerecord", "~> 5.1.0"
|
8
|
-
gem "sqlite3", "~> 1.3", ">= 1.3.6"
|
9
|
-
gem "mysql2", ">= 0.3.18", "< 0.6.0"
|
10
|
-
gem "pg", ">= 0.18", "< 2.0"
|
data/lib/ulid/rails/formatter.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
require "base32/crockford"
|
2
|
-
|
3
|
-
module ULID
|
4
|
-
module Rails
|
5
|
-
module Formatter
|
6
|
-
def self.format(v)
|
7
|
-
sanitized = v.delete("-").hex
|
8
|
-
Base32::Crockford.encode(sanitized).rjust(26, "0")
|
9
|
-
end
|
10
|
-
|
11
|
-
def self.unformat(v)
|
12
|
-
Base32::Crockford.decode(v).to_s(16).rjust(32, "0")
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|