activerecord-multirange 1.2.1 → 1.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2e8ec13d27ae216e0f400e1624b05c71e9276a450e53622aba243f181443213a
4
- data.tar.gz: 1ee4ac085770e7711541f70eccebaf8fc6e3fb11c45f6e49ebaece4536d29420
3
+ metadata.gz: 713159095b3f14f7031bd8488b32d8f9880fa7870437b034d66c87eaaf23e24c
4
+ data.tar.gz: 0d2f435fe0dd5b5d0959100fdccce2c6ca207f28c570c781c190353b373c623f
5
5
  SHA512:
6
- metadata.gz: efa82b9f56b823dafa589c40de04d072aa9c6d7e6deefb4933e3460fecee039ec77952108709803647a77d7d9a42eac3805ed3a8637dcf64c2ed07bca31a65cb
7
- data.tar.gz: 2aaf66267a719ae95509a1a8ce50eb78b476734c74ad15f7ee8ca0c778b59fbbfcf490c08974421deda75aa94a0b2c17527d008b52f664ddbb7976a842449b47
6
+ metadata.gz: 4690a5657d8f0c82c4a2b4e7c91efc7976a04579804c1f53af3be935340df5e4ad7229502427f0084adfd8abbb73a0ca436b6741a4a98af149e4531fba0b9b08
7
+ data.tar.gz: 125885f599acd13e58e35258cbefee3bcde4d3b8a766f0668a7583e80ea0b7b6c37ee7ba7bd6da9331211724decac14b1e0195efa26f92103c9513eff3428fbb
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- activerecord-multirange (1.2.1)
4
+ activerecord-multirange (1.3.0)
5
5
  pg (>= 1)
6
6
  rails (>= 6)
7
7
 
@@ -20,20 +20,18 @@ module Activerecord
20
20
  # Query for multirange types and their corresponding base types (not range types)
21
21
  # We need to get the range's subtype (e.g., date) not the range type itself
22
22
  query = <<-QUERY.squish
23
- SELECT m.oid, m.typname, m.typelem, m.typdelim, m.typinput::varchar,
23
+ SELECT m.oid, m.typname, m.typelem, m.typdelim, m.typinput,
24
24
  pr.rngsubtype, m.typtype, m.typbasetype
25
- FROM pg_type m
26
- JOIN pg_type r ON REPLACE(m.typname, 'multirange', 'range') = r.typname
27
- JOIN pg_range pr ON r.oid = pr.rngtypid
25
+ FROM pg_type m
26
+ JOIN pg_range pr ON m.oid = pr.rngmultitypid
28
27
  WHERE m.typtype = 'm';
29
28
  QUERY
30
29
 
31
30
  # Use exec_query for all Rails versions since execute_and_clear is private
32
31
  result = exec_query(query, 'SCHEMA', [])
32
+
33
33
  # Convert rows to hash format with column names as keys
34
- records = result.rows.map do |row|
35
- result.columns.zip(row).to_h
36
- end
34
+ records = result.rows.map { |row| result.columns.zip(row).to_h }
37
35
  initializer.register_multirange_type(records)
38
36
  end
39
37
  end
@@ -35,7 +35,9 @@ module Activerecord
35
35
  end
36
36
 
37
37
  def cast_value(value)
38
- return nil if value.blank?
38
+ return nil if value.nil?
39
+ return [] if value.is_a?(::Array) && value.empty?
40
+ return value if value.is_a?(::Array)
39
41
  return value unless value.is_a?(::String)
40
42
 
41
43
  ranges = scan_ranges(value)
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Activerecord
4
4
  module Multirange
5
- VERSION = '1.2.1'
5
+ VERSION = '1.3.0'
6
6
  end
7
7
  end
@@ -16,12 +16,24 @@ module Activerecord
16
16
 
17
17
  # Multirange types that need to be registered
18
18
  MULTIRANGE_TYPES = {
19
- tsmultirange: { name: "tsmultirange" },
20
- datemultirange: { name: "datemultirange" },
21
- tstzmultirange: { name: "tstzmultirange" },
22
- nummultirange: { name: "nummultirange" },
23
- int8multirange: { name: "int8multirange" },
24
- int4multirange: { name: "int4multirange" }
19
+ tsmultirange: {
20
+ name: 'tsmultirange'
21
+ },
22
+ datemultirange: {
23
+ name: 'datemultirange'
24
+ },
25
+ tstzmultirange: {
26
+ name: 'tstzmultirange'
27
+ },
28
+ nummultirange: {
29
+ name: 'nummultirange'
30
+ },
31
+ int8multirange: {
32
+ name: 'int8multirange'
33
+ },
34
+ int4multirange: {
35
+ name: 'int4multirange'
36
+ }
25
37
  }.freeze
26
38
 
27
39
  def self.add_multirange_column_type
@@ -29,6 +41,13 @@ module Activerecord
29
41
  # Register multirange types in NATIVE_DATABASE_TYPES for Rails 8 compatibility
30
42
  Activerecord::Multirange.register_native_database_types
31
43
 
44
+ # Register multirange modifier for ActiveRecord attribute API
45
+ ActiveRecord::Type.add_modifier(
46
+ { multirange: true },
47
+ Activerecord::Multirange::OID::MultiRange,
48
+ adapter: :postgresql
49
+ )
50
+
32
51
  ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.prepend(Adapter)
33
52
  ActiveRecord::ConnectionAdapters::PostgreSQL::OID::TypeMapInitializer
34
53
  .prepend(TypeMap)
@@ -45,19 +64,21 @@ module Activerecord
45
64
 
46
65
  def self.register_native_database_types
47
66
  # Ensure the PostgreSQL adapter is loaded
48
- return unless defined?(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter)
67
+ unless defined?(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter)
68
+ return
69
+ end
49
70
 
50
71
  adapter_class = ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
51
72
 
52
73
  # Check if NATIVE_DATABASE_TYPES is already defined and modifiable
53
74
  if adapter_class.const_defined?(:NATIVE_DATABASE_TYPES)
54
75
  current_types = adapter_class::NATIVE_DATABASE_TYPES
55
-
76
+
56
77
  # Only modify if our types aren't already registered
57
78
  unless current_types.key?(:tsmultirange)
58
79
  # Create a new hash with existing types plus our multirange types
59
80
  new_types = current_types.merge(MULTIRANGE_TYPES)
60
-
81
+
61
82
  # Replace the constant with the updated hash
62
83
  adapter_class.send(:remove_const, :NATIVE_DATABASE_TYPES)
63
84
  adapter_class.const_set(:NATIVE_DATABASE_TYPES, new_types.freeze)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-multirange
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gustavo Warmling Teixeira