activerecord-multirange 1.0.0 → 1.1.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 +4 -4
- data/.rubocop.yml +44 -10
- data/CHANGELOG.md +5 -1
- data/Gemfile.lock +4 -1
- data/lib/activerecord-multirange/adapter.rb +42 -16
- data/lib/activerecord-multirange/oid/multi_range.rb +12 -4
- data/lib/activerecord-multirange/type_map.rb +16 -4
- data/lib/activerecord-multirange/version.rb +1 -1
- data/lib/activerecord-multirange.rb +17 -11
- metadata +3 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f84a86677dd7f4427b636524b7dc09ea1c5eb049db16ebc727e86b8801847245
|
4
|
+
data.tar.gz: e7d313979f6e205f7cc07685b6fad56d6e483e99ae8cf985eb04c5fd0c2a3acb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 80c306db18783b1f27457706731efa67594c06ac8a7efd7fbcf5e368befbe2166ba136a676026fa6bab076fe191de1563b36cdaab3690a3b01bf9ca0d97007a3
|
7
|
+
data.tar.gz: 6eb784fa47af4ad1fb395d0e5f4dc56bb9e2a8f2a48b85d24bf036e5bcebc93ed128d9a9f24d75144eb05f285089d8b47e27820571e6b4cece2b43ca33f9af41
|
data/.rubocop.yml
CHANGED
@@ -1,22 +1,56 @@
|
|
1
1
|
AllCops:
|
2
|
-
TargetRubyVersion: 2
|
2
|
+
TargetRubyVersion: 3.1.2
|
3
|
+
EnabledByDefault: true
|
4
|
+
Exclude:
|
5
|
+
- 'db/**/*'
|
6
|
+
- 'config/**/*'
|
7
|
+
- 'script/**/*'
|
8
|
+
- 'bin/{rails,rake}'
|
3
9
|
|
4
|
-
|
10
|
+
require:
|
11
|
+
- rubocop-rails
|
12
|
+
|
13
|
+
inherit_from:
|
14
|
+
- node_modules/@prettier/plugin-ruby/rubocop.yml
|
15
|
+
|
16
|
+
Style:
|
17
|
+
Enabled: false
|
18
|
+
|
19
|
+
Metrics:
|
20
|
+
Enabled: false
|
21
|
+
|
22
|
+
Lint:
|
5
23
|
Enabled: true
|
6
|
-
EnforcedStyle: double_quotes
|
7
24
|
|
8
|
-
|
25
|
+
Lint/ConstantResolution:
|
26
|
+
Enabled: false
|
27
|
+
|
28
|
+
Lint/AssignmentInCondition:
|
29
|
+
Enabled: false
|
30
|
+
|
31
|
+
Lint/NumberConversion:
|
32
|
+
Enabled: false
|
33
|
+
|
34
|
+
Rails:
|
9
35
|
Enabled: true
|
10
|
-
EnforcedStyle: double_quotes
|
11
36
|
|
12
|
-
|
37
|
+
Rails/SkipsModelValidations:
|
13
38
|
Enabled: false
|
14
39
|
|
15
|
-
|
40
|
+
Rails/DefaultScope:
|
16
41
|
Enabled: false
|
17
42
|
|
18
|
-
|
43
|
+
Rails/HasManyOrHasOneDependent:
|
19
44
|
Enabled: false
|
20
45
|
|
21
|
-
|
22
|
-
|
46
|
+
Rails/InverseOf:
|
47
|
+
Enabled: false
|
48
|
+
|
49
|
+
Rails/Date:
|
50
|
+
Enabled: false
|
51
|
+
|
52
|
+
Rails/TimeZone:
|
53
|
+
Enabled: false
|
54
|
+
|
55
|
+
Rails/RequestReferer:
|
56
|
+
Enabled: false
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
activerecord-multirange (1.
|
4
|
+
activerecord-multirange (1.1.0)
|
5
5
|
pg (>= 1)
|
6
6
|
rails (>= 6)
|
7
7
|
|
@@ -116,6 +116,8 @@ GEM
|
|
116
116
|
net-smtp (0.3.3)
|
117
117
|
net-protocol
|
118
118
|
nio4r (2.5.9)
|
119
|
+
nokogiri (1.15.4-arm64-darwin)
|
120
|
+
racc (~> 1.4)
|
119
121
|
nokogiri (1.15.4-x86_64-darwin)
|
120
122
|
racc (~> 1.4)
|
121
123
|
nokogiri (1.15.4-x86_64-linux)
|
@@ -200,6 +202,7 @@ GEM
|
|
200
202
|
zeitwerk (2.6.11)
|
201
203
|
|
202
204
|
PLATFORMS
|
205
|
+
arm64-darwin-23
|
203
206
|
x86_64-darwin-22
|
204
207
|
x86_64-linux
|
205
208
|
|
@@ -8,28 +8,54 @@ module Activerecord
|
|
8
8
|
load_multirange_types
|
9
9
|
end
|
10
10
|
|
11
|
-
def native_database_types
|
12
|
-
super.merge(
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
11
|
+
def self.native_database_types
|
12
|
+
super.merge(
|
13
|
+
{
|
14
|
+
datemultirange: {
|
15
|
+
name: 'datemultirange'
|
16
|
+
},
|
17
|
+
nummultirange: {
|
18
|
+
name: 'nummultirange'
|
19
|
+
},
|
20
|
+
tsmultirange: {
|
21
|
+
name: 'tsmultirange'
|
22
|
+
},
|
23
|
+
tstzmultirange: {
|
24
|
+
name: 'tstzmultirange'
|
25
|
+
},
|
26
|
+
int4multirange: {
|
27
|
+
name: 'int4multirange'
|
28
|
+
},
|
29
|
+
int8multirange: {
|
30
|
+
name: 'int8multirange'
|
31
|
+
}
|
32
|
+
}
|
33
|
+
)
|
20
34
|
end
|
21
35
|
|
22
36
|
def load_multirange_types
|
23
|
-
initializer =
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
37
|
+
initializer =
|
38
|
+
::ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::OID::TypeMapInitializer
|
39
|
+
.new(type_map)
|
40
|
+
|
41
|
+
# Query for multirange types and their corresponding base types (not range types)
|
42
|
+
# We need to get the range's subtype (e.g., date) not the range type itself
|
43
|
+
query = <<-QUERY.squish
|
44
|
+
SELECT m.oid, m.typname, m.typelem, m.typdelim, m.typinput,
|
45
|
+
pr.rngsubtype, m.typtype, m.typbasetype
|
46
|
+
FROM pg_type m
|
47
|
+
JOIN pg_type r ON REPLACE(m.typname, 'multirange', 'range') = r.typname
|
48
|
+
JOIN pg_range pr ON r.oid = pr.rngtypid
|
49
|
+
WHERE m.typtype = 'm';
|
28
50
|
QUERY
|
29
51
|
|
30
|
-
|
31
|
-
|
52
|
+
# Use exec_query for all Rails versions since execute_and_clear is private
|
53
|
+
result = exec_query(query, 'SCHEMA', [])
|
54
|
+
# Convert rows to hash format with column names as keys
|
55
|
+
records = result.rows.map do |row|
|
56
|
+
result.columns.zip(row).to_h
|
32
57
|
end
|
58
|
+
initializer.register_multirange_type(records)
|
33
59
|
end
|
34
60
|
end
|
35
61
|
end
|
@@ -78,6 +78,8 @@ module Activerecord
|
|
78
78
|
# * https://www.postgresql.org/docs/current/rangetypes.html#RANGETYPES-IO
|
79
79
|
# * https://www.postgresql.org/docs/current/rowtypes.html#ROWTYPES-IO-SYNTAX
|
80
80
|
def unquote(value)
|
81
|
+
return value if value.nil?
|
82
|
+
|
81
83
|
if value.start_with?('"') && value.end_with?('"')
|
82
84
|
unquoted_value = value[1..-2]
|
83
85
|
unquoted_value.gsub!('""', '"')
|
@@ -89,15 +91,21 @@ module Activerecord
|
|
89
91
|
end
|
90
92
|
|
91
93
|
def parse_lower(value)
|
92
|
-
return infinity_value(value, negative: true) if ["", "-infinity"].include?(value)
|
94
|
+
return infinity_value(value, negative: true) if value.nil? || ["", "-infinity"].include?(value)
|
93
95
|
|
94
|
-
|
96
|
+
unquoted = unquote(value)
|
97
|
+
return nil if unquoted.nil?
|
98
|
+
|
99
|
+
@subtype.deserialize(unquoted)
|
95
100
|
end
|
96
101
|
|
97
102
|
def parse_upper(value)
|
98
|
-
return infinity_value(value) if ["", "infinity"].include?(value)
|
103
|
+
return infinity_value(value) if value.nil? || ["", "infinity"].include?(value)
|
99
104
|
|
100
|
-
|
105
|
+
unquoted = unquote(value)
|
106
|
+
return nil if unquoted.nil?
|
107
|
+
|
108
|
+
@subtype.deserialize(unquoted)
|
101
109
|
end
|
102
110
|
|
103
111
|
def extract_range_data(value)
|
@@ -1,15 +1,27 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require 'activerecord-multirange/oid/multi_range'
|
4
4
|
|
5
5
|
module Activerecord
|
6
6
|
module Multirange
|
7
7
|
module TypeMap
|
8
8
|
def register_multirange_type(records)
|
9
9
|
records.each do |row|
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
multirange_oid = row['oid']
|
11
|
+
range_oid = row['rngsubtype']
|
12
|
+
type_name = row['typname']
|
13
|
+
|
14
|
+
# Get the range subtype from the type map
|
15
|
+
range_type = @store.lookup(range_oid)
|
16
|
+
next unless range_type
|
17
|
+
|
18
|
+
# Create and register the multirange type
|
19
|
+
multirange_type = Activerecord::Multirange::OID::MultiRange.new(
|
20
|
+
range_type,
|
21
|
+
type_name.to_sym
|
22
|
+
)
|
23
|
+
|
24
|
+
register(multirange_oid, multirange_type)
|
13
25
|
end
|
14
26
|
end
|
15
27
|
end
|
@@ -1,24 +1,30 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
3
|
+
require 'activerecord-multirange/version'
|
4
|
+
require 'activerecord-multirange/adapter'
|
5
|
+
require 'activerecord-multirange/quoting'
|
6
|
+
require 'activerecord-multirange/schema_statements'
|
7
|
+
require 'activerecord-multirange/table_definition'
|
8
|
+
require 'activerecord-multirange/type_map'
|
9
|
+
require 'active_record'
|
10
10
|
|
11
11
|
module Activerecord
|
12
12
|
module Multirange
|
13
|
-
class Error < StandardError
|
13
|
+
class Error < StandardError
|
14
|
+
end
|
14
15
|
|
15
16
|
def self.add_multirange_column_type
|
16
17
|
ActiveSupport.on_load(:active_record) do
|
17
18
|
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.prepend(Adapter)
|
18
|
-
ActiveRecord::ConnectionAdapters::PostgreSQL::OID::TypeMapInitializer
|
19
|
+
ActiveRecord::ConnectionAdapters::PostgreSQL::OID::TypeMapInitializer
|
20
|
+
.prepend(TypeMap)
|
19
21
|
ActiveRecord::ConnectionAdapters::PostgreSQL::Quoting.prepend(Quoting)
|
20
|
-
ActiveRecord::ConnectionAdapters::PostgreSQL::SchemaStatements.prepend(
|
21
|
-
|
22
|
+
ActiveRecord::ConnectionAdapters::PostgreSQL::SchemaStatements.prepend(
|
23
|
+
SchemaStatements
|
24
|
+
)
|
25
|
+
ActiveRecord::ConnectionAdapters::PostgreSQL::TableDefinition.prepend(
|
26
|
+
TableDefinition
|
27
|
+
)
|
22
28
|
end
|
23
29
|
end
|
24
30
|
end
|
metadata
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-multirange
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gustavo Warmling Teixeira
|
8
|
-
autorequire:
|
9
8
|
bindir: exe
|
10
9
|
cert_chain: []
|
11
|
-
date:
|
10
|
+
date: 2025-06-03 00:00:00.000000000 Z
|
12
11
|
dependencies:
|
13
12
|
- !ruby/object:Gem::Dependency
|
14
13
|
name: pg
|
@@ -139,7 +138,6 @@ licenses:
|
|
139
138
|
metadata:
|
140
139
|
homepage_uri: https://github.com/gustavowt/activerecord-multirange
|
141
140
|
source_code_uri: https://github.com/gustavowt/activerecord-multirange
|
142
|
-
post_install_message:
|
143
141
|
rdoc_options: []
|
144
142
|
require_paths:
|
145
143
|
- lib
|
@@ -154,8 +152,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
154
152
|
- !ruby/object:Gem::Version
|
155
153
|
version: '0'
|
156
154
|
requirements: []
|
157
|
-
rubygems_version: 3.
|
158
|
-
signing_key:
|
155
|
+
rubygems_version: 3.6.6
|
159
156
|
specification_version: 4
|
160
157
|
summary: PostgreSQL multiranges support
|
161
158
|
test_files: []
|