torque-postgresql 3.2.2 → 3.3.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: 1948838632756aeab31c22f59995a8a41ce1900671e3cc9e1f8d802d898a4fe6
4
- data.tar.gz: ca24eb91ead1a52927d1b0069e8408419600ba7884744a31de3909f45b59bb4d
3
+ metadata.gz: a8dfe147f5a65e1626923bff250d8c057c73e2fc2c2f2ea6812d67537da32e38
4
+ data.tar.gz: 3205fea618ea9da4d9aeccf3b5d48e3dff72a4a670e181c78c9b9a0b9896cfbf
5
5
  SHA512:
6
- metadata.gz: 41071ecb22d7730bdb0debe558cf4b14db7ca648637d8f59cc43de31d0ca847b0ce7df2447b2e75be507b7ccd03f668c0dc7fa7232a38217889f5172f923a243
7
- data.tar.gz: 74be2a0828976d3f521e3c9ff0c49708cc767dd019c8a22b6e98080bbda036da4297675c8852f124d01de3588f04b390ae7f5138549a3e85a6f6ce0ad1e50ccb
6
+ metadata.gz: ce88617dcacc292754245e9fff7f7dba62ec672a5b7b4760fff2ff2b28b4b25be7e8413b92bf509f5f9f9c4d0b096559b7ec46de4fdce5294181c363f34367fb
7
+ data.tar.gz: 6c3e8e96edd6b906bd2f0038869f9f15596fad7f22745c5bd63c08b623a55cf97f6185877206dac54a7e93e81ce5d7644bfeb048e7e2db1780bb7cadc7843159
@@ -176,11 +176,11 @@ module Torque
176
176
  # Build the query for allowed schemas
177
177
  def user_defined_schemas_sql
178
178
  conditions = []
179
- conditions << <<-SQL if schemas_blacklist.any?
180
- nspname NOT LIKE ANY (ARRAY['#{schemas_blacklist.join("', '")}'])
179
+ conditions << <<-SQL.squish if schemas_blacklist.any?
180
+ nspname NOT LIKE ALL (ARRAY['#{schemas_blacklist.join("', '")}'])
181
181
  SQL
182
182
 
183
- conditions << <<-SQL if schemas_whitelist.any?
183
+ conditions << <<-SQL.squish if schemas_whitelist.any?
184
184
  nspname LIKE ANY (ARRAY['#{schemas_whitelist.join("', '")}'])
185
185
  SQL
186
186
 
@@ -16,7 +16,7 @@ module Torque
16
16
  statements.concat(o.indexes.map { |c, o| index_in_create(o.name, c, o) })
17
17
  end
18
18
 
19
- if supports_foreign_keys?
19
+ if @conn.supports_foreign_keys?
20
20
  statements.concat(o.foreign_keys.map { |fk| accept fk })
21
21
  end
22
22
 
@@ -122,6 +122,12 @@ module Torque
122
122
  super.sub('SELECT c.relname FROM', "SELECT n.nspname || '.' || c.relname FROM")
123
123
  end
124
124
 
125
+ # Add schema and inherits as one of the valid options for table
126
+ # definition
127
+ def valid_table_definition_options
128
+ super + [:schema, :inherits]
129
+ end
130
+
125
131
  private
126
132
 
127
133
  # Remove the schema from the sequence name
@@ -11,20 +11,20 @@ module Torque
11
11
 
12
12
  def load_records_for_keys(keys, &block)
13
13
  condition = query_condition_for(keys)
14
+ return super if condition.nil?
15
+
14
16
  scope.where(condition).load(&block)
15
17
  end
16
18
 
17
19
  def query_condition_for(keys)
18
- if connected_through_array?
19
- value = scope.cast_for_condition(foreign_column, keys.to_a)
20
- scope.table[association_key_name].overlaps(value)
21
- else
22
- { association_key_name => keys }
23
- end
20
+ return unless connected_through_array?
21
+
22
+ value = scope.cast_for_condition(foreign_column, keys.to_a)
23
+ scope.table[association_key_name].overlaps(value)
24
24
  end
25
25
 
26
26
  def connected_through_array?
27
- foreign_column.array?
27
+ !association_key_name.is_a?(Array) && foreign_column.array?
28
28
  end
29
29
  end
30
30
 
@@ -4,6 +4,9 @@ module Torque
4
4
  module PostgreSQL
5
5
  include ActiveSupport::Configurable
6
6
 
7
+ # Stores a version check for compatibility purposes
8
+ AR710 = (ActiveRecord.gem_version >= Gem::Version.new('7.1.0'))
9
+
7
10
  # Use the same logger as the Active Record one
8
11
  def self.logger
9
12
  ActiveRecord::Base.logger
@@ -17,8 +20,8 @@ module Torque
17
20
  send("#{name}=", klass)
18
21
  end
19
22
 
20
- # Set if any information that requires querying and searching or collectiong
21
- # information shuld be eager loaded. This automatically changes when rails
23
+ # Set if any information that requires querying and searching or collecting
24
+ # information should be eager loaded. This automatically changes when rails
22
25
  # same configuration is set to true
23
26
  config.eager_load = false
24
27
 
@@ -17,7 +17,7 @@ module Torque
17
17
  private
18
18
 
19
19
  # Check if the foreign key should be pluralized
20
- def derive_foreign_key
20
+ def derive_foreign_key(*, **)
21
21
  result = super
22
22
  result = ActiveSupport::Inflector.pluralize(result) \
23
23
  if collection? && connected_through_array?
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Torque
4
+ module PostgreSQL
5
+ module BoundSchemaReflection
6
+ def add_model_name(table_name, model)
7
+ @schema_reflection.add_model_name(@connection, table_name, model)
8
+ end
9
+
10
+ def dependencies(table_name)
11
+ @schema_reflection.dependencies(@connection, table_name)
12
+ end
13
+
14
+ def associations(table_name)
15
+ @schema_reflection.associations(@connection, table_name)
16
+ end
17
+
18
+ def lookup_model(table_name, scoped_class = '')
19
+ @schema_reflection.lookup_model(@connection, table_name, scoped_class)
20
+ end
21
+ end
22
+
23
+ ActiveRecord::ConnectionAdapters::BoundSchemaReflection.prepend BoundSchemaReflection
24
+ end
25
+ end
@@ -0,0 +1,117 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Torque
4
+ module PostgreSQL
5
+ module SchemaCache
6
+ module Inheritance
7
+
8
+ # Try to find a model based on a given table
9
+ def lookup_model(table_name, scoped_class = '', source_to_model:)
10
+ scoped_class = scoped_class.name if scoped_class.is_a?(Class)
11
+ return source_to_model[table_name] if source_to_model.key?(table_name)
12
+
13
+ # Get all the possible scopes
14
+ scopes = scoped_class.scan(/(?:::)?[A-Z][a-z]+/)
15
+ scopes.unshift('Object::')
16
+
17
+ # Check if the table name comes with a schema
18
+ if table_name.include?('.')
19
+ schema, table_name = table_name.split('.')
20
+ scopes.insert(1, schema.camelize) if schema != 'public'
21
+ end
22
+
23
+ # Consider the maximum namespaced possible model name
24
+ max_name = table_name.tr('_', '/').camelize.split(/(::)/)
25
+ max_name[-1] = max_name[-1].singularize
26
+
27
+ # Test all the possible names against all the possible scopes
28
+ until scopes.size == 0
29
+ scope = scopes.join.chomp('::').safe_constantize
30
+ model = find_model(max_name, table_name, scope) unless scope.nil?
31
+ return source_to_model[table_name] = model unless model.nil?
32
+ scopes.pop
33
+ end
34
+
35
+ # If this part is reach, no model name was found
36
+ raise LookupError.new(<<~MSG.squish)
37
+ Unable to find a valid model that is associated with the
38
+ '#{table_name}' table. Please, check if they correctly inherit from
39
+ ActiveRecord::Base
40
+ MSG
41
+ end
42
+
43
+ protected
44
+
45
+ # Find a model by a given max namespaced class name that matches the
46
+ # given table name
47
+ def find_model(max_name, table_name, scope = Object)
48
+ pieces = max_name.is_a?(::Array) ? max_name : max_name.split(/(::)/)
49
+ ns_places = (1..(max_name.size - 1)).step(2).to_a
50
+
51
+ # Generate all possible combinations
52
+ conditions = []
53
+ range = Torque::PostgreSQL.config.inheritance.inverse_lookup \
54
+ ? 0.upto(ns_places.size) \
55
+ : ns_places.size.downto(0)
56
+ range.each do |size|
57
+ conditions.concat(ns_places.combination(size).to_a)
58
+ end
59
+
60
+ # Now iterate over
61
+ while (condition = conditions.shift)
62
+ ns_places.each do |i|
63
+ pieces[i] = condition.include?(i) ? '::' : ''
64
+ end
65
+
66
+ candidate = pieces.join
67
+ candidate.prepend("#{scope.name}::") unless scope === Object
68
+
69
+ klass = candidate.safe_constantize
70
+ next if klass.nil?
71
+
72
+ # Check if the class match the table name
73
+ return klass if klass < ::ActiveRecord::Base &&
74
+ klass.table_name == table_name
75
+ end
76
+ end
77
+
78
+ # Calculates the inverted dependency (association), where even indirect
79
+ # inheritance comes up in the list
80
+ def generate_associations(inheritance_dependencies)
81
+ return {} if inheritance_dependencies.empty?
82
+
83
+ result = Hash.new{ |h, k| h[k] = [] }
84
+ masters = inheritance_dependencies.values.flatten.uniq
85
+
86
+ # Add direct associations
87
+ masters.map do |master|
88
+ inheritance_dependencies.each do |(dependent, associations)|
89
+ result[master] << dependent if associations.include?(master)
90
+ end
91
+ end
92
+
93
+ # Add indirect associations
94
+ result.each do |master, children|
95
+ children.each do |child|
96
+ children.concat(result[child]).uniq! if result.key?(child)
97
+ end
98
+ end
99
+
100
+ # Remove the default proc that would create new entries
101
+ result.default_proc = nil
102
+ result
103
+ end
104
+
105
+ # Parse the Torque config into the proper hash of irregular models.
106
+ # This is smart enough to only load necessary models
107
+ def prepare_irregular_models(data_sources)
108
+ entries = Torque::PostgreSQL.config.irregular_models
109
+ entries.slice(*data_sources).each_with_object({}) do |(table, model), hash|
110
+ hash[table] = model.is_a?(Class) ? model : model.constantize
111
+ end
112
+ end
113
+
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Torque
4
+ module PostgreSQL
5
+ module SchemaReflection
6
+ def add_model_name(connection, table_name, model)
7
+ cache(connection).add_model_name(connection, table_name, model)
8
+ end
9
+
10
+ def dependencies(connection, table_name)
11
+ cache(connection).dependencies(connection, table_name)
12
+ end
13
+
14
+ def associations(connection, table_name)
15
+ cache(connection).associations(connection, table_name)
16
+ end
17
+
18
+ def lookup_model(connection, table_name, scoped_class)
19
+ cache(connection).lookup_model(table_name, scoped_class)
20
+ end
21
+ end
22
+
23
+ ActiveRecord::ConnectionAdapters::SchemaReflection.prepend SchemaReflection
24
+ end
25
+ end
@@ -1,11 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'torque/postgresql/schema_cache/inheritance'
4
+
5
+ if Torque::PostgreSQL::AR710
6
+ require 'torque/postgresql/schema_cache/schema_reflection'
7
+ require 'torque/postgresql/schema_cache/bound_schema_reflection'
8
+ end
9
+
3
10
  module Torque
4
11
  module PostgreSQL
5
12
  LookupError = Class.new(ArgumentError)
6
13
 
7
14
  # :TODO: Create the +add+ to load inheritance info
8
15
  module SchemaCache
16
+ include Torque::PostgreSQL::SchemaCache::Inheritance
9
17
 
10
18
  def initialize(*) # :nodoc:
11
19
  super
@@ -37,7 +45,7 @@ module Torque
37
45
  @inheritance_associations = coder['inheritance_associations']
38
46
  end
39
47
 
40
- def add(table_name, *) # :nodoc:
48
+ def add(connection_or_table_name, table_name = connection_or_table_name, *) # :nodoc:
41
49
  super
42
50
 
43
51
  # Reset inheritance information when a table is added
@@ -64,8 +72,8 @@ module Torque
64
72
  ].map(&:size).inject(:+)
65
73
  end
66
74
 
67
- def clear_data_source_cache!(name) # :nodoc:
68
- super
75
+ def clear_data_source_cache!(connection_or_name, name = connection_or_name) # :nodoc:
76
+ Torque::PostgreSQL::AR710 ? super : super(name)
69
77
  @data_sources_model_names.delete name
70
78
  @inheritance_dependencies.delete name
71
79
  @inheritance_associations.delete name
@@ -89,94 +97,37 @@ module Torque
89
97
  end
90
98
 
91
99
  # A way to manually add models name so it doesn't need the lookup method
92
- def add_model_name(table_name, model)
93
- return unless data_source_exists?(table_name) && model.is_a?(Class)
94
- @data_sources_model_names[table_name] = model
100
+ def add_model_name(*args)
101
+ model, *source = args.reverse
102
+ return unless data_source_exists?(*source.reverse) && model.is_a?(Class)
103
+
104
+ @data_sources_model_names[source.first] = model
95
105
  end
96
106
 
97
107
  # Get all the tables that the given one inherits from
98
- def dependencies(table_name)
99
- reload_inheritance_data!
108
+ def dependencies(conn, table_name = conn)
109
+ reload_inheritance_data!(conn == table_name ? connection : conn)
100
110
  @inheritance_dependencies[table_name]
101
111
  end
102
112
 
103
113
  # Get the list of all tables that are associated (direct or indirect
104
114
  # inheritance) with the provided one
105
- def associations(table_name)
106
- reload_inheritance_data!
115
+ def associations(conn, table_name = conn)
116
+ reload_inheritance_data!(conn == table_name ? connection : conn)
107
117
  @inheritance_associations[table_name]
108
118
  end
109
119
 
110
- # Try to find a model based on a given table
111
- def lookup_model(table_name, scoped_class = '')
112
- scoped_class = scoped_class.name if scoped_class.is_a?(Class)
113
- return @data_sources_model_names[table_name] \
114
- if @data_sources_model_names.key?(table_name)
115
-
116
- # Get all the possible scopes
117
- scopes = scoped_class.scan(/(?:::)?[A-Z][a-z]+/)
118
- scopes.unshift('Object::')
119
-
120
- # Check if the table name comes with a schema
121
- if table_name.include?('.')
122
- schema, table_name = table_name.split('.')
123
- scopes.insert(1, schema.camelize) if schema != 'public'
124
- end
125
-
126
- # Consider the maximum namespaced possible model name
127
- max_name = table_name.tr('_', '/').camelize.split(/(::)/)
128
- max_name[-1] = max_name[-1].singularize
129
-
130
- # Test all the possible names against all the possible scopes
131
- until scopes.size == 0
132
- scope = scopes.join.chomp('::').safe_constantize
133
- model = find_model(max_name, table_name, scope) unless scope.nil?
134
- return @data_sources_model_names[table_name] = model unless model.nil?
135
- scopes.pop
136
- end
137
-
138
- # If this part is reach, no model name was found
139
- raise LookupError.new(<<~MSG.squish)
140
- Unable to find a valid model that is associated with the '#{table_name}' table.
141
- Please, check if they correctly inherit from ActiveRecord::Base
142
- MSG
120
+ # Override the inheritance implementation to pass over the proper cache of
121
+ # the existing association between data sources and model names
122
+ def lookup_model(*args, **xargs)
123
+ super(*args, **xargs, source_to_model: @data_sources_model_names)
143
124
  end
144
125
 
145
126
  private
146
127
 
147
- # Find a model by a given max namespaced class name thath matches the
148
- # given table name
149
- def find_model(max_name, table_name, scope = Object)
150
- pieces = max_name.is_a?(::Array) ? max_name : max_name.split(/(::)/)
151
- ns_places = (1..(max_name.size - 1)).step(2).to_a
152
-
153
- # Generate all possible combinarions
154
- conditions = []
155
- range = Torque::PostgreSQL.config.inheritance.inverse_lookup \
156
- ? 0.upto(ns_places.size) \
157
- : ns_places.size.downto(0)
158
- range.each do |size|
159
- conditions.concat(ns_places.combination(size).to_a)
160
- end
161
-
162
- # Now iterate over
163
- while (condition = conditions.shift)
164
- ns_places.each{ |i| pieces[i] = condition.include?(i) ? '::' : '' }
165
-
166
- candidate = pieces.join
167
- candidate.prepend("#{scope.name}::") unless scope === Object
168
-
169
- klass = candidate.safe_constantize
170
- next if klass.nil?
171
-
172
- # Check if the class match the table name
173
- return klass if klass < ::ActiveRecord::Base && klass.table_name == table_name
174
- end
175
- end
176
-
177
128
  # Reload information about tables inheritance and dependencies, uses a
178
- # cache to not perform additional checkes
179
- def reload_inheritance_data!
129
+ # cache to not perform additional checks
130
+ def reload_inheritance_data!(connection)
180
131
  return if @inheritance_loaded
181
132
  @inheritance_dependencies = connection.inherited_tables
182
133
  @inheritance_associations = generate_associations
@@ -186,38 +137,15 @@ module Torque
186
137
  # Calculates the inverted dependency (association), where even indirect
187
138
  # inheritance comes up in the list
188
139
  def generate_associations
189
- return {} if @inheritance_dependencies.empty?
190
-
191
- result = Hash.new{ |h, k| h[k] = [] }
192
- masters = @inheritance_dependencies.values.flatten.uniq
193
-
194
- # Add direct associations
195
- masters.map do |master|
196
- @inheritance_dependencies.each do |(dependent, associations)|
197
- result[master] << dependent if associations.include?(master)
198
- end
199
- end
200
-
201
- # Add indirect associations
202
- result.each do |master, children|
203
- children.each do |child|
204
- children.concat(result[child]).uniq! if result.key?(child)
205
- end
206
- end
207
-
208
- # Remove the default proc that would create new entries
209
- result.default_proc = nil
210
- result
140
+ super(@inheritance_dependencies)
211
141
  end
212
142
 
213
- # Use this method to also load any irregular model name. This is smart
214
- # enought to only load the sources present on this instance
215
- def prepare_data_sources
216
- super
217
- @data_sources_model_names = Torque::PostgreSQL.config
218
- .irregular_models.slice(*@data_sources.keys).map do |table_name, model_name|
219
- [table_name, (model_name.is_a?(Class) ? model_name : model_name.constantize)]
220
- end.to_h
143
+ # Use this method to also load any irregular model name
144
+ def prepare_data_sources(connection = nil)
145
+ Torque::PostgreSQL::AR710 ? super : super()
146
+
147
+ sources = connection.present? ? tables_to_cache(connection) : @data_sources.keys
148
+ @data_sources_model_names = prepare_irregular_models(sources)
221
149
  end
222
150
 
223
151
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Torque
4
4
  module PostgreSQL
5
- VERSION = '3.2.2'
5
+ VERSION = '3.3.1'
6
6
  end
7
7
  end
@@ -201,6 +201,47 @@ RSpec.describe 'HasMany' do
201
201
  expect(query.to_sql).to match(/INNER JOIN "texts"/)
202
202
  expect { query.load }.not_to raise_error
203
203
  end
204
+
205
+ context 'with query constraint' do
206
+ let(:activity) { Activity.create! }
207
+
208
+ before do
209
+ skip('Only Rails 7.1 onwards') unless Post.respond_to?(:query_constraints)
210
+
211
+ Post.query_constraints :author_id, :id
212
+ Activity.query_constraints :author_id, :id
213
+ Activity.has_many :posts
214
+ end
215
+
216
+ after do
217
+ Post.instance_variable_set(:@has_query_constraints, false)
218
+ Post.instance_variable_set(:@query_constraints_list, nil)
219
+ Post.instance_variable_set(:@_query_constraints_list, nil)
220
+ Activity.instance_variable_set(:@has_query_constraints, false)
221
+ Activity.instance_variable_set(:@query_constraints_list, nil)
222
+ Activity.instance_variable_set(:@_query_constraints_list, nil)
223
+ end
224
+
225
+ it 'properly preload records' do
226
+ FactoryBot.create_list(:post, 5, activity: activity)
227
+ entries = Activity.all.includes(:posts).load
228
+
229
+ expect(entries.size).to be_eql(1)
230
+ expect(entries.first.posts).to be_loaded
231
+ expect(entries.first.posts.size).to be_eql(5)
232
+ end
233
+
234
+ it 'properly preload records using preloader' do
235
+ FactoryBot.create_list(:post, 5, activity: activity)
236
+ entries = ActiveRecord::Associations::Preloader.new(
237
+ records: Activity.all,
238
+ associations: [:posts],
239
+ ).call.first.records_by_owner
240
+
241
+ expect(entries.size).to be_eql(1)
242
+ expect(entries.values.first.size).to be_eql(5)
243
+ end
244
+ end
204
245
  end
205
246
 
206
247
  context 'on array' do
@@ -4,8 +4,8 @@ RSpec.describe 'Schema' do
4
4
  let(:connection) { ActiveRecord::Base.connection }
5
5
 
6
6
  before do
7
- connection.instance_variable_set(:@schmeas_blacklist, nil)
8
- connection.instance_variable_set(:@schmeas_whitelist, nil)
7
+ connection.instance_variable_set(:@schemas_blacklist, nil)
8
+ connection.instance_variable_set(:@schemas_whitelist, nil)
9
9
  end
10
10
 
11
11
  context 'on migration' do
@@ -104,7 +104,12 @@ RSpec.describe 'TableInheritance' do
104
104
  end
105
105
 
106
106
  context 'on schema cache' do
107
- subject { ActiveRecord::Base.connection.schema_cache }
107
+ let(:schema_cache) { ActiveRecord::Base.connection.schema_cache }
108
+ let(:schema_cache_connection) { schema_cache.instance_variable_get(:@connection) }
109
+ let(:schema_cache_reflection) { schema_cache.instance_variable_get(:@schema_reflection) }
110
+ let(:new_schema_cache) { schema_cache_reflection.send(:cache, schema_cache_connection) }
111
+
112
+ subject { Torque::PostgreSQL::AR710 ? new_schema_cache : schema_cache }
108
113
 
109
114
  it 'correctly defines the associations' do
110
115
  scenario = {
@@ -120,6 +125,7 @@ RSpec.describe 'TableInheritance' do
120
125
  subject.instance_variable_set(:@inheritance_loaded, true)
121
126
  subject.instance_variable_set(:@inheritance_dependencies, scenario)
122
127
  subject.instance_variable_set(:@inheritance_associations, subject.send(:generate_associations))
128
+ subject.instance_variable_set(:@data_sources_model_names, {})
123
129
  expect(subject.instance_variable_get(:@inheritance_associations)).to eql({
124
130
  'A' => %w(B D C N M),
125
131
  'B' => %w(C N M),
@@ -131,6 +137,8 @@ RSpec.describe 'TableInheritance' do
131
137
  end
132
138
 
133
139
  context 'on looking up models' do
140
+ let(:prepare_arguments) { Torque::PostgreSQL::AR710 ? [schema_cache_connection] : nil }
141
+
134
142
  after(:all) do
135
143
  schema_cache = ActiveRecord::Base.connection.schema_cache
136
144
  schema_cache.instance_variable_set(:@data_sources, {})
@@ -138,26 +146,35 @@ RSpec.describe 'TableInheritance' do
138
146
  end
139
147
 
140
148
  it 'respect irregular names' do
141
- Torque::PostgreSQL.config.irregular_models = {
142
- 'posts' => 'ActivityPost',
143
- }
149
+ allow(Torque::PostgreSQL.config).to receive(:irregular_models).and_return({
150
+ 'public.posts' => 'ActivityPost',
151
+ })
144
152
 
145
- subject.send(:prepare_data_sources)
153
+ subject.send(:prepare_data_sources, *prepare_arguments)
146
154
  list = subject.instance_variable_get(:@data_sources_model_names)
147
- expect(list).to have_key('posts')
148
- expect(list['posts']).to eql(ActivityPost)
155
+ expect(list).to have_key('public.posts')
156
+ expect(list['public.posts']).to eql(ActivityPost)
149
157
  end
150
158
 
151
159
  it 'does not load irregular where the data source is not defined' do
152
- Torque::PostgreSQL.config.irregular_models = {
160
+ allow(Torque::PostgreSQL.config).to receive(:irregular_models).and_return({
153
161
  'products' => 'Product',
154
- }
162
+ })
155
163
 
156
- subject.send(:prepare_data_sources)
164
+ subject.send(:prepare_data_sources, *prepare_arguments)
157
165
  list = subject.instance_variable_get(:@data_sources_model_names)
158
166
  expect(list).to_not have_key('products')
159
167
  end
160
168
 
169
+ it 'works with eager loading' do
170
+ allow(Torque::PostgreSQL.config).to receive(:eager_load).and_return(true)
171
+ ActivityPost.reset_table_name
172
+
173
+ list = subject.instance_variable_get(:@data_sources_model_names)
174
+ expect(list).to have_key('activity_posts')
175
+ expect(list['activity_posts']).to eql(ActivityPost)
176
+ end
177
+
161
178
  {
162
179
  'activities' => 'Activity',
163
180
  'activity_posts' => 'ActivityPost',
@@ -176,6 +193,8 @@ RSpec.describe 'TableInheritance' do
176
193
  let(:child2) { ActivityBook }
177
194
  let(:other) { AuthorJournalist }
178
195
 
196
+ before { ActiveRecord::Base.connection.schema_cache.clear! }
197
+
179
198
  it 'identifies mergeable attributes' do
180
199
  result_base = %w(id author_id title active kind created_at updated_at description url file post_id)
181
200
  expect(base.inheritance_mergeable_attributes.sort).to eql(result_base.sort)
@@ -228,7 +247,7 @@ RSpec.describe 'TableInheritance' do
228
247
  expect(other.table_name).to eql('authors')
229
248
  end
230
249
 
231
- it 'respects the table name prefix and sufix defined on parent module' do
250
+ it 'respects the table name prefix and suffix defined on parent module' do
232
251
  mod = Object.const_set('Private', Module.new)
233
252
  mod.define_singleton_method(:table_name_prefix) { 'private.' }
234
253
  mod.define_singleton_method(:table_name_suffix) { '_bundle' }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: torque-postgresql
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.2
4
+ version: 3.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Carlos Silva
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-01-20 00:00:00.000000000 Z
11
+ date: 2024-01-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -64,20 +64,14 @@ dependencies:
64
64
  requirements:
65
65
  - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: '1.5'
68
- - - ">="
69
- - !ruby/object:Gem::Version
70
- version: 1.5.3
67
+ version: '2.0'
71
68
  type: :development
72
69
  prerelease: false
73
70
  version_requirements: !ruby/object:Gem::Requirement
74
71
  requirements:
75
72
  - - "~>"
76
73
  - !ruby/object:Gem::Version
77
- version: '1.5'
78
- - - ">="
79
- - !ruby/object:Gem::Version
80
- version: 1.5.3
74
+ version: '2.0'
81
75
  - !ruby/object:Gem::Dependency
82
76
  name: dotenv
83
77
  requirement: !ruby/object:Gem::Requirement
@@ -233,6 +227,9 @@ files:
233
227
  - lib/torque/postgresql/relation/inheritance.rb
234
228
  - lib/torque/postgresql/relation/merger.rb
235
229
  - lib/torque/postgresql/schema_cache.rb
230
+ - lib/torque/postgresql/schema_cache/bound_schema_reflection.rb
231
+ - lib/torque/postgresql/schema_cache/inheritance.rb
232
+ - lib/torque/postgresql/schema_cache/schema_reflection.rb
236
233
  - lib/torque/postgresql/table_name.rb
237
234
  - lib/torque/postgresql/version.rb
238
235
  - spec/en.yml
@@ -292,7 +289,8 @@ licenses:
292
289
  metadata:
293
290
  source_code_uri: https://github.com/crashtech/torque-postgresql
294
291
  bug_tracker_uri: https://github.com/crashtech/torque-postgresql/issues
295
- post_install_message:
292
+ changelog_uri: https://github.com/crashtech/torque-postgresql/releases
293
+ post_install_message:
296
294
  rdoc_options:
297
295
  - "--title"
298
296
  - Torque PostgreSQL
@@ -310,7 +308,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
310
308
  version: 1.8.11
311
309
  requirements: []
312
310
  rubygems_version: 3.2.15
313
- signing_key:
311
+ signing_key:
314
312
  specification_version: 4
315
313
  summary: ActiveRecord extension to access PostgreSQL advanced resources
316
314
  test_files: