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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1774e8210820d1f732ce43c7032035cfe5498e415b45837b2ddb31688ca31b3a
4
- data.tar.gz: 13990bece50e4ec7f3ddf537b1cfbeeca4663ac50c02aaee99a95dd3d91157e8
3
+ metadata.gz: f84a86677dd7f4427b636524b7dc09ea1c5eb049db16ebc727e86b8801847245
4
+ data.tar.gz: e7d313979f6e205f7cc07685b6fad56d6e483e99ae8cf985eb04c5fd0c2a3acb
5
5
  SHA512:
6
- metadata.gz: 1e898a098a890acefee7b29bb59ffa545ea1f3356fb6de5ff18f6bfde0f817562c7142bd7210388125a672ca875a3ce3055cf1c71b3d0bca4acf2e915893e1bb
7
- data.tar.gz: d064d47c5e57c505a0cf8f61adf09a3fbfc7f468d4c1a982bb24e7d067bae0a74cf50e4a31abf7df7e3809cd1ff8b0351fbfa374722585a1089159eb2a829f7c
6
+ metadata.gz: 80c306db18783b1f27457706731efa67594c06ac8a7efd7fbcf5e368befbe2166ba136a676026fa6bab076fe191de1563b36cdaab3690a3b01bf9ca0d97007a3
7
+ data.tar.gz: 6eb784fa47af4ad1fb395d0e5f4dc56bb9e2a8f2a48b85d24bf036e5bcebc93ed128d9a9f24d75144eb05f285089d8b47e27820571e6b4cece2b43ca33f9af41
data/.rubocop.yml CHANGED
@@ -1,22 +1,56 @@
1
1
  AllCops:
2
- TargetRubyVersion: 2.6
2
+ TargetRubyVersion: 3.1.2
3
+ EnabledByDefault: true
4
+ Exclude:
5
+ - 'db/**/*'
6
+ - 'config/**/*'
7
+ - 'script/**/*'
8
+ - 'bin/{rails,rake}'
3
9
 
4
- Style/StringLiterals:
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
- Style/StringLiteralsInInterpolation:
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
- Style/Documentation:
37
+ Rails/SkipsModelValidations:
13
38
  Enabled: false
14
39
 
15
- Naming/FileName:
40
+ Rails/DefaultScope:
16
41
  Enabled: false
17
42
 
18
- Metrics/BlockLength:
43
+ Rails/HasManyOrHasOneDependent:
19
44
  Enabled: false
20
45
 
21
- Layout/LineLength:
22
- Max: 120
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
@@ -1,5 +1,9 @@
1
1
  ## [Unreleased]
2
2
 
3
- ## [0.1.0] - 2023-05-29
3
+ ## [1.1.0] - 2024-12-19
4
+
5
+ - Minor version bump with improvements and updates
6
+
7
+ ## [1.0.0] - 2023-05-29
4
8
 
5
9
  - Initial release
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- activerecord-multirange (1.0.0)
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
- datemultirange: { name: "datemultirange" },
14
- nummultirange: { name: "nummultirange" },
15
- tsmultirange: { name: "tsmultirange" },
16
- tstzmultirange: { name: "tstzmultirange" },
17
- int4multirange: { name: "int4multirange" },
18
- int8multirange: { name: "int8multirange" }
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 = ::ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::OID::TypeMapInitializer.new(type_map)
24
- query = <<-QUERY
25
- SELECT t.oid, t.typname, t.typelem, t.typdelim, t.typinput, r.rngsubtype, t.typtype, t.typbasetype
26
- FROM pg_type as t
27
- JOIN pg_range as r ON oid = "rngmultitypid";
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
- execute_and_clear(query, "SCHEMA", []) do |records|
31
- initializer.register_multirange_type(records)
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
- @subtype.deserialize(unquote(value))
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
- @subtype.deserialize(unquote(value))
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 "activerecord-multirange/oid/multi_range"
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
- register_with_subtype(row["oid"], row["rngsubtype"].to_i) do |subtype|
11
- Activerecord::Multirange::OID::MultiRange.new(subtype, row["typname"].to_sym)
12
- end
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
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Activerecord
4
4
  module Multirange
5
- VERSION = "1.0.0"
5
+ VERSION = "1.1.0"
6
6
  end
7
7
  end
@@ -1,24 +1,30 @@
1
1
  # frozen_string_literal: true
2
2
 
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"
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; end
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.prepend(TypeMap)
19
+ ActiveRecord::ConnectionAdapters::PostgreSQL::OID::TypeMapInitializer
20
+ .prepend(TypeMap)
19
21
  ActiveRecord::ConnectionAdapters::PostgreSQL::Quoting.prepend(Quoting)
20
- ActiveRecord::ConnectionAdapters::PostgreSQL::SchemaStatements.prepend(SchemaStatements)
21
- ActiveRecord::ConnectionAdapters::PostgreSQL::TableDefinition.prepend(TableDefinition)
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.0.0
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: 2023-08-30 00:00:00.000000000 Z
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.4.10
158
- signing_key:
155
+ rubygems_version: 3.6.6
159
156
  specification_version: 4
160
157
  summary: PostgreSQL multiranges support
161
158
  test_files: []