activerecord-multirange 1.1.2 → 1.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8e5e5824edcee8ed0ade179513082b83dce32d8a662290defb2b06813028ea14
4
- data.tar.gz: b23ec872923746b1610c3979c8a1c8cc5baf09ff374cee1114e5f0ceaf616aec
3
+ metadata.gz: 2e8ec13d27ae216e0f400e1624b05c71e9276a450e53622aba243f181443213a
4
+ data.tar.gz: 1ee4ac085770e7711541f70eccebaf8fc6e3fb11c45f6e49ebaece4536d29420
5
5
  SHA512:
6
- metadata.gz: 330815a9a9e8856e8db6c742a502e1bc25a93edfe4a0cc137dbeee7d8f4682fc58f9ba519fc33a0096795e47996f9b4376ae3dd3d27dd63ec9b8f02c19981f30
7
- data.tar.gz: 63e94b1eb651bfff3211f7dcaa15dbcc92f294d75e84cb95c16329493d1f9b11b1b7de1dc57af0a991ffec20c7c07d630b9f8008c90ea7616bed4118ba3e08ce
6
+ metadata.gz: efa82b9f56b823dafa589c40de04d072aa9c6d7e6deefb4933e3460fecee039ec77952108709803647a77d7d9a42eac3805ed3a8637dcf64c2ed07bca31a65cb
7
+ data.tar.gz: 2aaf66267a719ae95509a1a8ce50eb78b476734c74ad15f7ee8ca0c778b59fbbfcf490c08974421deda75aa94a0b2c17527d008b52f664ddbb7976a842449b47
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- activerecord-multirange (1.1.2)
4
+ activerecord-multirange (1.2.1)
5
5
  pg (>= 1)
6
6
  rails (>= 6)
7
7
 
@@ -0,0 +1,23 @@
1
+ version: '3.8'
2
+
3
+ services:
4
+ postgres:
5
+ image: postgres:15-alpine
6
+ environment:
7
+ POSTGRES_USER: postgres
8
+ POSTGRES_PASSWORD: postgres
9
+ POSTGRES_DB: activerecord_multirange_test
10
+ ports:
11
+ - "15432:5432"
12
+ volumes:
13
+ - postgres_data:/var/lib/postgresql/data
14
+ - ./docker/postgres-init:/docker-entrypoint-initdb.d
15
+ command: postgres -c shared_preload_libraries=pg_stat_statements
16
+ healthcheck:
17
+ test: ["CMD-SHELL", "pg_isready -U postgres"]
18
+ interval: 5s
19
+ timeout: 5s
20
+ retries: 5
21
+
22
+ volumes:
23
+ postgres_data:
@@ -5,21 +5,84 @@ module Activerecord
5
5
  module Quoting
6
6
  def quote(value)
7
7
  return quote(encode_multirange(value)) if value.is_a?(::Activerecord::Multirange::OID::MultiRange::Data)
8
+ return quote_array_as_multirange(value) if array_of_ranges?(value)
8
9
 
9
10
  super
10
11
  end
11
12
 
12
13
  def type_cast(value)
13
14
  return encode_multirange(value) if value.is_a?(::Activerecord::Multirange::OID::MultiRange::Data)
15
+ return encode_array_as_multirange(value) if array_of_ranges?(value)
14
16
 
15
17
  super
16
18
  end
17
19
 
20
+ # Override the bound value quoting for parameter binding in WHERE clauses
21
+ def quoted_literal(value)
22
+ if array_of_ranges?(value)
23
+ encode_array_as_multirange(value)
24
+ else
25
+ super
26
+ end
27
+ end
28
+
29
+ # Override quote_bound_value for newer Rails versions
30
+ def quote_bound_value(value)
31
+ if array_of_ranges?(value)
32
+ "'#{encode_array_as_multirange(value)}'"
33
+ else
34
+ super
35
+ end
36
+ end
37
+
38
+ # Override for default expression quoting
39
+ def quote_default_expression(value, column)
40
+ if array_of_ranges?(value)
41
+ "'#{encode_array_as_multirange(value)}'"
42
+ else
43
+ super
44
+ end
45
+ end
46
+
47
+ # Override sanitize_sql_array to catch arrays of ranges at parameter binding level
48
+ def sanitize_sql_array(ary)
49
+ statement, *values = ary
50
+ if statement.respond_to?(:to_str)
51
+ # Convert arrays of ranges to multirange format in the values
52
+ converted_values = values.map do |value|
53
+ if array_of_ranges?(value)
54
+ encode_array_as_multirange(value)
55
+ else
56
+ value
57
+ end
58
+ end
59
+ sanitize_sql_for_conditions([statement, *converted_values])
60
+ else
61
+ super
62
+ end
63
+ end
64
+
18
65
  def encode_multirange(range_data)
19
66
  collection = range_data.ranges.map { |r| encode_range(r) }.join(",")
20
67
 
21
68
  "{#{collection}}"
22
69
  end
70
+
71
+ private
72
+
73
+ def array_of_ranges?(value)
74
+ value.is_a?(::Array) && value.all? { |item| item.is_a?(::Range) }
75
+ end
76
+
77
+ def quote_array_as_multirange(ranges)
78
+ encoded_multirange = encode_array_as_multirange(ranges)
79
+ "'#{encoded_multirange}'"
80
+ end
81
+
82
+ def encode_array_as_multirange(ranges)
83
+ collection = ranges.map { |r| encode_range(r) }.join(",")
84
+ "{#{collection}}"
85
+ end
23
86
  end
24
87
  end
25
88
  end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Activerecord
4
+ module Multirange
5
+ module Relation
6
+ def where(*args)
7
+ if args.length > 1 && args.first.is_a?(String)
8
+ # Convert any arrays of ranges in the parameters to multirange format
9
+ converted_rest = args.from(1).map do |param|
10
+ if array_of_ranges?(param)
11
+ encode_array_as_multirange(param)
12
+ else
13
+ param
14
+ end
15
+ end
16
+ super(args.first, *converted_rest)
17
+ else
18
+ super
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def array_of_ranges?(value)
25
+ value.is_a?(::Array) && value.all? { |item| item.is_a?(::Range) }
26
+ end
27
+
28
+ def encode_array_as_multirange(ranges)
29
+ collection = ranges.map { |r| connection.send(:encode_range, r) }.join(",")
30
+ "{#{collection}}"
31
+ end
32
+ end
33
+ end
34
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Activerecord
4
4
  module Multirange
5
- VERSION = '1.1.2'
5
+ VERSION = '1.2.1'
6
6
  end
7
7
  end
@@ -6,6 +6,7 @@ require 'activerecord-multirange/quoting'
6
6
  require 'activerecord-multirange/schema_statements'
7
7
  require 'activerecord-multirange/table_definition'
8
8
  require 'activerecord-multirange/type_map'
9
+ require 'activerecord-multirange/relation'
9
10
  require 'active_record'
10
11
 
11
12
  module Activerecord
@@ -38,6 +39,7 @@ module Activerecord
38
39
  ActiveRecord::ConnectionAdapters::PostgreSQL::TableDefinition.prepend(
39
40
  TableDefinition
40
41
  )
42
+ ActiveRecord::Relation.prepend(Relation)
41
43
  end
42
44
  end
43
45
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-multirange
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.2
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gustavo Warmling Teixeira
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2025-07-09 00:00:00.000000000 Z
10
+ date: 2025-08-19 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: pg
@@ -124,10 +124,12 @@ files:
124
124
  - Rakefile
125
125
  - activerecord-multirange-1.1.0.gem
126
126
  - config.ru
127
+ - docker-compose.yml
127
128
  - lib/activerecord-multirange.rb
128
129
  - lib/activerecord-multirange/adapter.rb
129
130
  - lib/activerecord-multirange/oid/multi_range.rb
130
131
  - lib/activerecord-multirange/quoting.rb
132
+ - lib/activerecord-multirange/relation.rb
131
133
  - lib/activerecord-multirange/schema_statements.rb
132
134
  - lib/activerecord-multirange/table_definition.rb
133
135
  - lib/activerecord-multirange/type_map.rb