uuid_attribute 0.9.10 → 0.9.12

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4391aedd96215a7827897d233a988b61f8902abd5386ec56d9c242acf1541593
4
- data.tar.gz: 9d62caede1fd48735913e6dfcdfe7bb4cbd36ef151ec4eb416c74f1cc6233b1b
3
+ metadata.gz: 1685c722a23743951d2632a893fd5829db06e9f1d2fdecc324e84c3eb5f31a9c
4
+ data.tar.gz: b2ddf6083cf44a1c011845d08065fad900b6ad993677e98e75fcb18c894e48fa
5
5
  SHA512:
6
- metadata.gz: 9adf89495017230161cb481948f8096eb39f2e899c3b341ce6f6c81ff840e0ecdfb9358528ea8dc2cfcf2ae1e5941eb23c9bfe993270f02401e27790b73f605e
7
- data.tar.gz: 3dba3afd0604bbb60eb6ceaf62fd0e0f547e5f966edf6be788b7da687a4657ead791afbb2bf9da64262ed8d1c5471b7c5af0b6a3b85c29e10ac870e0dcbefbe8
6
+ metadata.gz: addce17ecc827d604fbf2eafe349f1e4ddab3528a2405bc08b8ed028c744a585633ed67daa374c1c8917c28b13619961e38ce125d0aa688e673ede674e11e5b5
7
+ data.tar.gz: 2987018970032d0709a07c2bb791ff65deb90406672e5caa12233299f9b09b8c8a215cc38207f6da5469cd545152fd8ba29d746b0925cc7b66a6a1d386ded358
@@ -1,6 +1,99 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "rails/railtie"
4
+ require "active_record/associations/association_scope"
5
+ require "active_record/fixture_set/table_row"
6
+
7
+ module ActiveRecord
8
+ module Associations
9
+ class AssociationScope # :nodoc:
10
+ def last_chain_scope(scope, reflection, owner)
11
+ primary_key = reflection.join_primary_key
12
+ foreign_key = reflection.join_foreign_key
13
+
14
+ table = reflection.aliased_table
15
+
16
+ prevalue = owner[foreign_key]
17
+ if owner.class.attribute_types[foreign_key].class.name == "UuidAttribute::Type"
18
+ prevalue = UuidAttribute::Utils.raw_bytes(UuidAttribute::Utils.normalize(UuidAttribute::Utils.parse(prevalue)))
19
+ end
20
+
21
+ value = transform_value(prevalue)
22
+ scope = apply_scope(scope, table, primary_key, value)
23
+
24
+ if reflection.type
25
+ polymorphic_type = transform_value(owner.class.polymorphic_name)
26
+ scope = apply_scope(scope, table, reflection.type, polymorphic_type)
27
+ end
28
+
29
+ scope
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ module ActiveStorage
36
+ class FixtureSet
37
+ def self.blob(filename:, **attributes)
38
+ generated_uuid = Digest::UUID.uuid_v5(Digest::UUID::OID_NAMESPACE, filename)
39
+ raw_uuid = UuidAttribute::Utils.raw_bytes(
40
+ UuidAttribute::Utils.normalize(UuidAttribute::Utils.parse(generated_uuid))
41
+ )
42
+ new.prepare Blob.new(filename: filename, id: raw_uuid, key: generated_uuid), **attributes
43
+ end
44
+ end
45
+ end
46
+
47
+ module ActiveRecord
48
+ class FixtureSet
49
+ class << self
50
+ def identify(label, column_type = :integer)
51
+ if column_type == :uuid
52
+ generated_uuid = Digest::UUID.uuid_v5(Digest::UUID::OID_NAMESPACE, label.to_s)
53
+ UuidAttribute::Utils.raw_bytes(UuidAttribute::Utils.normalize(UuidAttribute::Utils.parse(generated_uuid)))
54
+ else
55
+ Zlib.crc32(label.to_s) % MAX_ID
56
+ end
57
+ end
58
+ end
59
+
60
+ class TableRow
61
+ private
62
+
63
+ alias org_fill_row_model_attributes fill_row_model_attributes
64
+ def fill_row_model_attributes
65
+ org_fill_row_model_attributes
66
+ return unless model_class
67
+
68
+ resolve_string_uuids
69
+ end
70
+
71
+ def resolve_string_uuids
72
+ @row.each do |key, value|
73
+ next if model_class.to_s.include?("ActiveStorage") && key == "record_id"
74
+
75
+ transform_uuid(key, value)
76
+ end
77
+ end
78
+
79
+ def transform_uuid(key, value)
80
+ if test_uuid36?(key, value)
81
+ @row[key] = [value&.gsub("-", "")&.upcase].pack("H*")
82
+ elsif test_uuid22?(key, value)
83
+ @row[key] = [UuidAttribute::Utils.unshort(value)&.gsub("-", "")&.upcase].pack("H*")
84
+ end
85
+ end
86
+
87
+ def test_uuid36?(key, value)
88
+ (key == "id" || key.ends_with?("_id")) && value.instance_of?(String) && value.length == 36
89
+ end
90
+
91
+ def test_uuid22?(key, value)
92
+ (key == "id" || key.ends_with?("_id")) && value.instance_of?(String) && value.length == 22
93
+ end
94
+ end
95
+ end
96
+ end
4
97
 
5
98
  module UuidAttribute
6
99
  # Rails Initializer
@@ -26,7 +119,7 @@ module UuidAttribute
26
119
  def list_models
27
120
  models = []
28
121
  Dir["#{Rails.root}/app/models/*"].each do |file|
29
- model = File.basename(file, ".*").classify
122
+ model = File.basename(file, ".*").camelcase
30
123
  models << model unless models.include?(model)
31
124
  end
32
125
 
@@ -39,7 +132,10 @@ module UuidAttribute
39
132
  rescue
40
133
  end
41
134
 
42
- models.each(&:constantize)
135
+ models.each do |m|
136
+ Object.const_get(m)
137
+ rescue NameError
138
+ end
43
139
  all_active_record_classes
44
140
  end
45
141
 
@@ -54,7 +150,7 @@ module UuidAttribute
54
150
 
55
151
  default = nil
56
152
  default = -> { SecureRandom.uuid } if att.eql? "id"
57
- model.attribute att, ::UuidAttribute::UUID.new, default: default
153
+ model.attribute att, ::UuidAttribute::Type.new, default: default
58
154
  end
59
155
  end
60
156
  rescue ActiveRecord::NoDatabaseError
@@ -0,0 +1,43 @@
1
+
2
+ module UuidAttribute
3
+ # UUID Attribute
4
+ class Type < ActiveModel::Type::Binary
5
+ def type
6
+ :uuid
7
+ end
8
+
9
+ def serialize(value)
10
+ #puts "SERIALIZE"
11
+ return if value.blank?
12
+ return value if value.is_a?(ActiveRecord::Type::Binary::Data)
13
+
14
+ binary_data = value
15
+ binary_data = Utils.raw_bytes(Utils.normalize(Utils.parse(value))) if value.is_a?(String)
16
+ # binary_data = value.raw if value.is_a?(UUID)
17
+
18
+ ActiveRecord::Type::Binary::Data.new(
19
+ binary_data
20
+ )
21
+ end
22
+
23
+ def deserialize(value)
24
+ # puts "DESERIALIZE"
25
+ return nil if value.nil?
26
+ value = value.to_s if value.is_a?(ActiveModel::Type::Binary::Data)
27
+
28
+ # return UUID.new(Utils.normalize(Utils.parse(value)))
29
+ return Utils.shorten(Utils.normalize(Utils.parse(value)))
30
+ # ActiveRecord::Type::Binary::Data.new(Utils.raw_bytes(Utils.normalize(Utils.parse(value))))
31
+ end
32
+
33
+ def cast(value)
34
+ # puts "CAST"
35
+ return nil if value.nil?
36
+ # return value if value.is_a?(UUID)
37
+
38
+ value = value.to_s if value.is_a?(ActiveModel::Type::Binary::Data)
39
+ return Utils.shorten(Utils.normalize(Utils.parse(value)))
40
+ # super
41
+ end
42
+ end
43
+ end
@@ -17,6 +17,7 @@ module UuidAttribute
17
17
  end
18
18
 
19
19
  def parse(str)
20
+ return format_uuid(str.hex) if str.is_a?(UUID)
20
21
  return nil if str.length.zero?
21
22
  return str if str.length == 36
22
23
 
@@ -1,28 +1,22 @@
1
1
  # frozen_string_literal: true
2
-
3
2
  module UuidAttribute
4
3
  # UUID Attribute
5
- class UUID < ActiveModel::Type::Binary
6
- def type
7
- :uuid
4
+ class UUID
5
+ def initialize(value)
6
+ @hex = Utils.normalize(Utils.parse(value))
7
+ @shorten = Utils.shorten(@hex)
8
8
  end
9
9
 
10
- def serialize(value)
11
- return if value.blank?
12
-
13
- ActiveRecord::Type::Binary::Data.new(
14
- Utils.raw_bytes(Utils.normalize(Utils.parse(value)))
15
- )
10
+ def to_s
11
+ @shorten
16
12
  end
17
13
 
18
- def deserialize(value)
19
- return nil if value.nil?
20
-
21
- Utils.shorten(Utils.parse(value.to_s))
14
+ def hex
15
+ @hex
22
16
  end
23
17
 
24
- def cast(value)
25
- deserialize(value)
18
+ def raw
19
+ UuidAttribute::Utils.raw_bytes(@hex)
26
20
  end
27
21
  end
28
22
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module UuidAttribute
4
- VERSION = "0.9.10"
4
+ VERSION = "0.9.12"
5
5
  end
@@ -4,6 +4,7 @@ require "active_model"
4
4
  require "active_model/type"
5
5
  require "rails"
6
6
  require_relative "uuid_attribute/version"
7
+ require_relative "uuid_attribute/type"
7
8
  require_relative "uuid_attribute/uuid"
8
9
  require_relative "uuid_attribute/utils"
9
10
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: uuid_attribute
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.10
4
+ version: 0.9.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Patrick Negri
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-04-17 00:00:00.000000000 Z
11
+ date: 2023-05-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -50,6 +50,7 @@ files:
50
50
  - README.md
51
51
  - lib/uuid_attribute.rb
52
52
  - lib/uuid_attribute/railtie.rb
53
+ - lib/uuid_attribute/type.rb
53
54
  - lib/uuid_attribute/utils.rb
54
55
  - lib/uuid_attribute/uuid.rb
55
56
  - lib/uuid_attribute/version.rb