torque-postgresql 3.3.0 → 3.3.2

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: 2ea2d3fe5e64c12ea8cf8b77ee39a08092b23c5f15802442d5bc92464e248111
4
- data.tar.gz: 17541c4f9cbd22c940b5082be168c0fd62e9736abe77efc79340c73058342db4
3
+ metadata.gz: 3a40ad54958c3355dabba2edfdf5fb0a833e9f2eeb16eb6aa680e522a93fe5cd
4
+ data.tar.gz: 32b7d2b052b475996081fedcfd265ed45f75aa115941269e93d26f6b88fe97e0
5
5
  SHA512:
6
- metadata.gz: 39f36019706145c9b6ff5c4e407ee95b7965746d194338a52d1ee3d67876008b62f673996fb41bc0eb257184454ba74cbe3ffc2cb60805bcaf2d366a3a8ad54f
7
- data.tar.gz: 8c77b20d700a66a002eecf369d3d7e2f458d88b280e182e93c4e25bcd8ddbe10f03f77d578d50f13a7234683721ed3cc99d49eac9db7f3de1f0ade9c058f5e53
6
+ metadata.gz: f36f81c4fd169d0e2dd164f17ba28ee6b6efb7e656609b45471216c5ec7119dc1f567e9864616420786a985d1a1630da681b423c7f9bff035fcf347c518dce14
7
+ data.tar.gz: de52240614a54984891c727edb19811ab67037a30f5f284bf4e5f9ce7e29e0afd19e9cc24897fdd2a1d060f6fc3d3ac466a39a812c3f975ec4c91b7bf51b0ec2
@@ -12,9 +12,9 @@ module Torque
12
12
  ## CUSTOM
13
13
  def ids_reader
14
14
  if loaded?
15
- target.pluck(reflection.association_primary_key)
15
+ target.pluck(reflection.active_record_primary_key)
16
16
  elsif !target.empty?
17
- load_target.pluck(reflection.association_primary_key)
17
+ load_target.pluck(reflection.active_record_primary_key)
18
18
  else
19
19
  stale_state || column_default_value
20
20
  end
@@ -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,7 +4,7 @@ module Torque
4
4
  module PostgreSQL
5
5
  module SchemaReflection
6
6
  def add_model_name(connection, table_name, model)
7
- cache(connection).add_model_name(table_name, model)
7
+ cache(connection).add_model_name(connection, table_name, model)
8
8
  end
9
9
 
10
10
  def dependencies(connection, table_name)
@@ -97,9 +97,11 @@ module Torque
97
97
  end
98
98
 
99
99
  # A way to manually add models name so it doesn't need the lookup method
100
- def add_model_name(table_name, model)
101
- return unless data_source_exists?(table_name) && model.is_a?(Class)
102
- @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
103
105
  end
104
106
 
105
107
  # Get all the tables that the given one inherits from
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Torque
4
4
  module PostgreSQL
5
- VERSION = '3.3.0'
5
+ VERSION = '3.3.2'
6
6
  end
7
7
  end
data/spec/schema.rb CHANGED
@@ -10,7 +10,7 @@
10
10
  #
11
11
  # It's strongly recommended that you check this file into your version control system.
12
12
 
13
- version = 2
13
+ version = 3
14
14
 
15
15
  return if ActiveRecord::Migrator.current_version == version
16
16
  ActiveRecord::Schema.define(version: version) do
@@ -77,14 +77,14 @@ ActiveRecord::Schema.define(version: version) do
77
77
  create_table "texts", force: :cascade do |t|
78
78
  t.integer "user_id"
79
79
  t.string "content"
80
- t.enum "conflict", enum_type: :conflicts
80
+ t.enum "conflict", enum_type: :conflicts
81
81
  end
82
82
 
83
83
  create_table "comments", force: :cascade do |t|
84
- t.integer "user_id", null: false
84
+ t.integer "user_id", null: false
85
85
  t.integer "comment_id"
86
86
  t.integer "video_id"
87
- t.text "content", null: false
87
+ t.text "content", null: false
88
88
  t.string "kind"
89
89
  t.index ["user_id"], name: "index_comments_on_user_id", using: :btree
90
90
  t.index ["comment_id"], name: "index_comments_on_comment_id", using: :btree
@@ -92,7 +92,7 @@ ActiveRecord::Schema.define(version: version) do
92
92
 
93
93
  create_table "courses", force: :cascade do |t|
94
94
  t.integer "category_id"
95
- t.string "title", null: false
95
+ t.string "title", null: false
96
96
  t.interval "duration"
97
97
  t.enum "types", enum_type: :types, array: true
98
98
  t.datetime "created_at", null: false
@@ -108,7 +108,7 @@ ActiveRecord::Schema.define(version: version) do
108
108
  t.integer "activity_id"
109
109
  t.string "title"
110
110
  t.text "content"
111
- t.enum "status", enum_type: :content_status
111
+ t.enum "status", enum_type: :content_status
112
112
  t.index ["author_id"], name: "index_posts_on_author_id", using: :btree
113
113
  end
114
114
 
@@ -120,8 +120,8 @@ ActiveRecord::Schema.define(version: version) do
120
120
  end
121
121
 
122
122
  create_table "users", force: :cascade do |t|
123
- t.string "name", null: false
124
- t.enum "role", enum_type: :roles, default: :visitor
123
+ t.string "name", null: false
124
+ t.enum "role", enum_type: :roles, default: :visitor
125
125
  t.datetime "created_at", null: false
126
126
  t.datetime "updated_at", null: false
127
127
  end
@@ -137,7 +137,7 @@ ActiveRecord::Schema.define(version: version) do
137
137
  t.integer "author_id"
138
138
  t.string "title"
139
139
  t.boolean "active"
140
- t.enum "kind", enum_type: :types
140
+ t.enum "kind", enum_type: :types
141
141
  t.datetime "created_at", null: false
142
142
  t.datetime "updated_at", null: false
143
143
  end
@@ -400,7 +400,7 @@ RSpec.describe 'BelongsToMany' do
400
400
  let(:player) { Class.new(ActiveRecord::Base) }
401
401
  let(:other) { player.create }
402
402
 
403
- # TODO: Set as a shred example
403
+ # TODO: Set as a shared example
404
404
  before do
405
405
  connection.create_table(:players, id: :uuid) { |t| t.string :name }
406
406
  connection.create_table(:games, id: :uuid) { |t| t.uuid :player_ids, array: true }
@@ -440,4 +440,45 @@ RSpec.describe 'BelongsToMany' do
440
440
  expect { query.load }.not_to raise_error
441
441
  end
442
442
  end
443
+
444
+ context 'using custom keys' do
445
+ let(:connection) { ActiveRecord::Base.connection }
446
+ let(:post) { Post }
447
+ let(:tag) { Tag }
448
+ let(:tags) { %w[a b c].map { |id| create(:tag, friendly_id: id) } }
449
+
450
+ subject { create(:post) }
451
+
452
+ before do
453
+ connection.add_column(:tags, :friendly_id, :string)
454
+ connection.add_column(:posts, :friendly_tag_ids, :string, array: true)
455
+ post.belongs_to_many(:tags, foreign_key: :friendly_tag_ids, primary_key: :friendly_id)
456
+ post.reset_column_information
457
+ tag.reset_column_information
458
+ end
459
+
460
+ after do
461
+ tag.reset_column_information
462
+ post.reset_column_information
463
+ post._reflections.delete(:tags)
464
+ end
465
+
466
+ it 'loads associated records' do
467
+ subject.update(friendly_tag_ids: tags.pluck(:friendly_id))
468
+
469
+ expect(subject.tags.to_sql).to be_eql(<<-SQL.squish)
470
+ SELECT "tags".* FROM "tags" WHERE "tags"."friendly_id" IN ('a', 'b', 'c')
471
+ SQL
472
+
473
+ expect(subject.tags.load).to be_a(ActiveRecord::Associations::CollectionProxy)
474
+ expect(subject.tags.to_a).to be_eql(tags)
475
+ end
476
+
477
+ it 'can properly assign tags' do
478
+ expect(subject.friendly_tag_ids).to be_blank
479
+
480
+ subject.tags = tags
481
+ expect(subject.friendly_tag_ids).to be_eql(%w[a b c])
482
+ end
483
+ end
443
484
  end
@@ -40,7 +40,7 @@ RSpec.describe 'DistinctOn' do
40
40
  end
41
41
 
42
42
  it 'raises with invalid relation' do
43
- expect { subject.distinct_on(tags: :name).to_sql }.to \
43
+ expect { subject.distinct_on(supervisors: :name).to_sql }.to \
44
44
  raise_error(ArgumentError, /Relation for/)
45
45
  end
46
46
 
@@ -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
@@ -44,7 +44,7 @@ RSpec.describe 'Relation', type: :helper do
44
44
  end
45
45
 
46
46
  it 'raises on relation not present' do
47
- check = [tags: :name]
47
+ check = [supervisors: :name]
48
48
  expect{ subject.call(check) }.to raise_error(ArgumentError, /Relation for/)
49
49
  end
50
50
 
@@ -125,6 +125,7 @@ RSpec.describe 'TableInheritance' do
125
125
  subject.instance_variable_set(:@inheritance_loaded, true)
126
126
  subject.instance_variable_set(:@inheritance_dependencies, scenario)
127
127
  subject.instance_variable_set(:@inheritance_associations, subject.send(:generate_associations))
128
+ subject.instance_variable_set(:@data_sources_model_names, {})
128
129
  expect(subject.instance_variable_get(:@inheritance_associations)).to eql({
129
130
  'A' => %w(B D C N M),
130
131
  'B' => %w(C N M),
@@ -145,9 +146,9 @@ RSpec.describe 'TableInheritance' do
145
146
  end
146
147
 
147
148
  it 'respect irregular names' do
148
- Torque::PostgreSQL.config.irregular_models = {
149
+ allow(Torque::PostgreSQL.config).to receive(:irregular_models).and_return({
149
150
  'public.posts' => 'ActivityPost',
150
- }
151
+ })
151
152
 
152
153
  subject.send(:prepare_data_sources, *prepare_arguments)
153
154
  list = subject.instance_variable_get(:@data_sources_model_names)
@@ -156,15 +157,24 @@ RSpec.describe 'TableInheritance' do
156
157
  end
157
158
 
158
159
  it 'does not load irregular where the data source is not defined' do
159
- Torque::PostgreSQL.config.irregular_models = {
160
+ allow(Torque::PostgreSQL.config).to receive(:irregular_models).and_return({
160
161
  'products' => 'Product',
161
- }
162
+ })
162
163
 
163
164
  subject.send(:prepare_data_sources, *prepare_arguments)
164
165
  list = subject.instance_variable_get(:@data_sources_model_names)
165
166
  expect(list).to_not have_key('products')
166
167
  end
167
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
+
168
178
  {
169
179
  'activities' => 'Activity',
170
180
  'activity_posts' => 'ActivityPost',
@@ -237,7 +247,7 @@ RSpec.describe 'TableInheritance' do
237
247
  expect(other.table_name).to eql('authors')
238
248
  end
239
249
 
240
- 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
241
251
  mod = Object.const_set('Private', Module.new)
242
252
  mod.define_singleton_method(:table_name_prefix) { 'private.' }
243
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.3.0
4
+ version: 3.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Carlos Silva
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-11-18 00:00:00.000000000 Z
11
+ date: 2024-03-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -289,6 +289,7 @@ licenses:
289
289
  metadata:
290
290
  source_code_uri: https://github.com/crashtech/torque-postgresql
291
291
  bug_tracker_uri: https://github.com/crashtech/torque-postgresql/issues
292
+ changelog_uri: https://github.com/crashtech/torque-postgresql/releases
292
293
  post_install_message:
293
294
  rdoc_options:
294
295
  - "--title"