torque-postgresql 2.0.0 → 2.0.5

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.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/lib/torque/postgresql.rb +0 -1
  3. data/lib/torque/postgresql/adapter.rb +7 -0
  4. data/lib/torque/postgresql/adapter/database_statements.rb +2 -0
  5. data/lib/torque/postgresql/adapter/oid.rb +3 -1
  6. data/lib/torque/postgresql/adapter/oid/box.rb +2 -0
  7. data/lib/torque/postgresql/adapter/oid/circle.rb +2 -0
  8. data/lib/torque/postgresql/adapter/oid/enum.rb +2 -0
  9. data/lib/torque/postgresql/adapter/oid/enum_set.rb +2 -0
  10. data/lib/torque/postgresql/adapter/oid/interval.rb +2 -0
  11. data/lib/torque/postgresql/adapter/oid/line.rb +2 -0
  12. data/lib/torque/postgresql/adapter/oid/range.rb +2 -0
  13. data/lib/torque/postgresql/adapter/oid/segment.rb +2 -0
  14. data/lib/torque/postgresql/adapter/quoting.rb +2 -0
  15. data/lib/torque/postgresql/adapter/schema_creation.rb +8 -1
  16. data/lib/torque/postgresql/adapter/schema_definitions.rb +2 -0
  17. data/lib/torque/postgresql/adapter/schema_dumper.rb +23 -18
  18. data/lib/torque/postgresql/adapter/schema_statements.rb +2 -0
  19. data/lib/torque/postgresql/arel/infix_operation.rb +5 -1
  20. data/lib/torque/postgresql/arel/join_source.rb +2 -0
  21. data/lib/torque/postgresql/arel/nodes.rb +2 -0
  22. data/lib/torque/postgresql/arel/operations.rb +2 -0
  23. data/lib/torque/postgresql/arel/select_manager.rb +2 -0
  24. data/lib/torque/postgresql/arel/visitors.rb +6 -3
  25. data/lib/torque/postgresql/associations/association.rb +9 -1
  26. data/lib/torque/postgresql/associations/association_scope.rb +2 -0
  27. data/lib/torque/postgresql/associations/belongs_to_many_association.rb +17 -10
  28. data/lib/torque/postgresql/associations/builder/belongs_to_many.rb +2 -0
  29. data/lib/torque/postgresql/associations/builder/has_many.rb +2 -0
  30. data/lib/torque/postgresql/associations/preloader/association.rb +30 -1
  31. data/lib/torque/postgresql/attributes/builder.rb +3 -1
  32. data/lib/torque/postgresql/attributes/builder/enum.rb +5 -3
  33. data/lib/torque/postgresql/attributes/builder/period.rb +6 -4
  34. data/lib/torque/postgresql/attributes/enum.rb +5 -10
  35. data/lib/torque/postgresql/attributes/enum_set.rb +2 -0
  36. data/lib/torque/postgresql/attributes/lazy.rb +3 -1
  37. data/lib/torque/postgresql/attributes/period.rb +2 -0
  38. data/lib/torque/postgresql/auxiliary_statement.rb +2 -0
  39. data/lib/torque/postgresql/auxiliary_statement/settings.rb +2 -0
  40. data/lib/torque/postgresql/base.rb +2 -0
  41. data/lib/torque/postgresql/coder.rb +5 -3
  42. data/lib/torque/postgresql/collector.rb +2 -0
  43. data/lib/torque/postgresql/config.rb +5 -0
  44. data/lib/torque/postgresql/geometry_builder.rb +2 -0
  45. data/lib/torque/postgresql/i18n.rb +2 -0
  46. data/lib/torque/postgresql/inheritance.rb +2 -0
  47. data/lib/torque/postgresql/migration/command_recorder.rb +2 -0
  48. data/lib/torque/postgresql/railtie.rb +2 -0
  49. data/lib/torque/postgresql/reflection.rb +2 -0
  50. data/lib/torque/postgresql/reflection/abstract_reflection.rb +13 -5
  51. data/lib/torque/postgresql/reflection/association_reflection.rb +2 -0
  52. data/lib/torque/postgresql/reflection/belongs_to_many_reflection.rb +18 -4
  53. data/lib/torque/postgresql/reflection/has_many_reflection.rb +2 -0
  54. data/lib/torque/postgresql/reflection/runtime_reflection.rb +2 -0
  55. data/lib/torque/postgresql/reflection/through_reflection.rb +2 -0
  56. data/lib/torque/postgresql/relation.rb +15 -11
  57. data/lib/torque/postgresql/relation/auxiliary_statement.rb +6 -1
  58. data/lib/torque/postgresql/relation/distinct_on.rb +2 -0
  59. data/lib/torque/postgresql/relation/inheritance.rb +2 -0
  60. data/lib/torque/postgresql/relation/merger.rb +2 -0
  61. data/lib/torque/postgresql/schema_cache.rb +2 -0
  62. data/lib/torque/postgresql/version.rb +3 -1
  63. data/spec/schema.rb +2 -2
  64. data/spec/tests/arel_spec.rb +3 -1
  65. data/spec/tests/belongs_to_many_spec.rb +6 -0
  66. data/spec/tests/enum_set_spec.rb +1 -1
  67. data/spec/tests/enum_spec.rb +7 -0
  68. data/spec/tests/has_many_spec.rb +11 -1
  69. data/spec/tests/table_inheritance_spec.rb +14 -1
  70. metadata +9 -10
  71. data/lib/torque/postgresql/autosave_association.rb +0 -39
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Torque
2
4
  module PostgreSQL
3
5
  module Relation
@@ -34,7 +36,10 @@ module Torque
34
36
  # attributes as well
35
37
  def bound_attributes
36
38
  visitor = ::Arel::Visitors::PostgreSQL.new(ActiveRecord::Base.connection)
37
- visitor.accept(self.arel.ast, ::Arel::Collectors::Bind.new).value
39
+ visitor.accept(self.arel.ast, ::Arel::Collectors::Composite.new(
40
+ ::Arel::Collectors::SQLString.new,
41
+ ::Arel::Collectors::Bind.new,
42
+ )).value.last
38
43
  end
39
44
 
40
45
  private
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Torque
2
4
  module PostgreSQL
3
5
  module Relation
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Torque
2
4
  module PostgreSQL
3
5
  module Relation
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Torque
2
4
  module PostgreSQL
3
5
  module Relation
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Torque
2
4
  module PostgreSQL
3
5
  LookupError = Class.new(ArgumentError)
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Torque
2
4
  module PostgreSQL
3
- VERSION = '2.0.0'
5
+ VERSION = '2.0.5'
4
6
  end
5
7
  end
@@ -11,7 +11,7 @@
11
11
  # It's strongly recommended that you check this file into your version control system.
12
12
 
13
13
  begin
14
- version = 61
14
+ version = 62
15
15
 
16
16
  raise SystemExit if ActiveRecord::Migrator.current_version == version
17
17
  ActiveRecord::Schema.define(version: version) do
@@ -83,7 +83,7 @@ begin
83
83
  create_table "courses", force: :cascade do |t|
84
84
  t.string "title", null: false
85
85
  t.interval "duration"
86
- t.enum "types", subtype: :types, array: true, default: [:A, :B]
86
+ t.enum "types", subtype: :types, array: true
87
87
  t.datetime "created_at", null: false
88
88
  t.datetime "updated_at", null: false
89
89
  end
@@ -25,7 +25,9 @@ RSpec.describe 'Arel' do
25
25
  klass_name = operator.to_s.camelize
26
26
 
27
27
  context "##{operator}" do
28
- let(:instance) { attribute.public_send(operator, value) }
28
+ let(:instance) do
29
+ attribute.public_send(operator, value.is_a?(Array) ? ::Arel.array(value) : value)
30
+ end
29
31
 
30
32
  context 'for attribute' do
31
33
  let(:klass) { ::Arel::Nodes.const_get(klass_name) }
@@ -35,6 +35,11 @@ RSpec.describe 'BelongsToMany' do
35
35
  expect(subject._reflections).to include('tags')
36
36
  end
37
37
 
38
+ it 'has correct foreign key' do
39
+ item = subject._reflections['tags']
40
+ expect(item.foreign_key).to be_eql('tag_ids')
41
+ end
42
+
38
43
  it 'loads associated records' do
39
44
  subject.update(tag_ids: [initial.id])
40
45
  expect(subject.tags.to_sql).to be_eql(<<-SQL.squish)
@@ -116,6 +121,7 @@ RSpec.describe 'BelongsToMany' do
116
121
 
117
122
  subject.tags.concat(other.new(name: 'Test'))
118
123
  subject.tags.reload
124
+
119
125
  expect(subject.tags.size).to be_eql(2)
120
126
  expect(subject.tag_ids.size).to be_eql(2)
121
127
  expect(subject.tags.last.name).to be_eql('Test')
@@ -48,7 +48,7 @@ RSpec.describe 'Enum' do
48
48
  expect(dump_io.string).to match checker
49
49
  end
50
50
 
51
- it 'can have a default value as an array of symbols' do
51
+ xit 'can have a default value as an array of symbols' do
52
52
  dump_io = StringIO.new
53
53
  checker = /t\.enum +"types", +default: \[:A, :B\], +array: true, +subtype: :types/
54
54
  ActiveRecord::SchemaDumper.dump(connection, dump_io)
@@ -124,6 +124,13 @@ RSpec.describe 'Enum' do
124
124
  expect(dump_io.string).to match /create_enum \"content_status\", \[/
125
125
  end
126
126
 
127
+ it 'sorts the enum entries to better consistency' do
128
+ dump_io = StringIO.new
129
+ ActiveRecord::SchemaDumper.dump(connection, dump_io)
130
+ items = dump_io.string.scan(/create_enum "(\w+)"/).flatten
131
+ expect(items).to be_eql(items.sort)
132
+ end
133
+
127
134
  it 'do not dump when has none' do
128
135
  connection.drop_type(:content_status, force: :cascade)
129
136
 
@@ -5,7 +5,7 @@ RSpec.describe 'HasMany' do
5
5
  let(:builder) { ActiveRecord::Associations::Builder::HasMany }
6
6
 
7
7
  it 'adds the array option' do
8
- expect(builder.send(:valid_options, [])).to include(:array)
8
+ expect(builder.send(:valid_options, {})).to include(:array)
9
9
  end
10
10
  end
11
11
 
@@ -21,6 +21,11 @@ RSpec.describe 'HasMany' do
21
21
  expect(subject._reflections).to include('texts')
22
22
  end
23
23
 
24
+ it 'has correct foreign key' do
25
+ item = subject._reflections['texts']
26
+ expect(item.foreign_key).to be_eql('user_id')
27
+ end
28
+
24
29
  it 'loads associated records' do
25
30
  expect(subject.texts.to_sql).to match(Regexp.new(<<-SQL.squish))
26
31
  SELECT "texts"\\.\\* FROM "texts" WHERE \\(?"texts"\\."user_id" = #{subject.id}\\)?
@@ -210,6 +215,11 @@ RSpec.describe 'HasMany' do
210
215
  expect(subject._reflections).to include('videos')
211
216
  end
212
217
 
218
+ it 'has correct foreign key' do
219
+ item = subject._reflections['videos']
220
+ expect(item.foreign_key).to be_eql('tag_ids')
221
+ end
222
+
213
223
  it 'loads associated records' do
214
224
  expect(subject.videos.to_sql).to match(Regexp.new(<<-SQL.squish))
215
225
  SELECT "videos"\\.\\* FROM "videos"
@@ -66,7 +66,7 @@ RSpec.describe 'TableInheritance' do
66
66
 
67
67
  it 'allows empty-body create table operation' do
68
68
  sql = connection.create_table(:activity_posts, inherits: :activities)
69
- result = 'CREATE TABLE "activity_posts" ()'
69
+ result = "CREATE TABLE \"activity_posts\" ()"
70
70
  result << ' INHERITS ( "activities" )'
71
71
  expect(sql).to eql(result)
72
72
  end
@@ -231,6 +231,19 @@ RSpec.describe 'TableInheritance' do
231
231
  expect(child2.table_name).to eql('activity_books')
232
232
  expect(other.table_name).to eql('authors')
233
233
  end
234
+
235
+ it 'respects the table name prefix and sufix defined on parent module' do
236
+ mod = Object.const_set('Private', Module.new)
237
+ mod.define_singleton_method(:table_name_prefix) { 'private.' }
238
+ mod.define_singleton_method(:table_name_suffix) { '_bundle' }
239
+ result = 'private.activity_post_others_bundle'
240
+
241
+ klass = mod.const_set('Other', Class.new(ActivityPost))
242
+ allow(klass).to receive(:module_parent).and_return(child)
243
+ allow(klass).to receive(:module_parents).and_return([mod])
244
+ allow(klass).to receive(:physically_inherited?).and_return(true)
245
+ expect(klass.send(:compute_table_name)).to be_eql(result)
246
+ end
234
247
  end
235
248
 
236
249
  context 'on relation' do
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: 2.0.0
4
+ version: 2.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Carlos Silva
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-23 00:00:00.000000000 Z
11
+ date: 2021-01-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -211,7 +211,6 @@ files:
211
211
  - lib/torque/postgresql/attributes/enum_set.rb
212
212
  - lib/torque/postgresql/attributes/lazy.rb
213
213
  - lib/torque/postgresql/attributes/period.rb
214
- - lib/torque/postgresql/autosave_association.rb
215
214
  - lib/torque/postgresql/auxiliary_statement.rb
216
215
  - lib/torque/postgresql/auxiliary_statement/settings.rb
217
216
  - lib/torque/postgresql/base.rb
@@ -303,7 +302,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
303
302
  - !ruby/object:Gem::Version
304
303
  version: 1.8.11
305
304
  requirements: []
306
- rubygems_version: 3.1.2
305
+ rubygems_version: 3.1.4
307
306
  signing_key:
308
307
  specification_version: 4
309
308
  summary: ActiveRecord extension to access PostgreSQL advanced resources
@@ -333,11 +332,10 @@ test_files:
333
332
  - spec/factories/videos.rb
334
333
  - spec/tests/geometric_builder_spec.rb
335
334
  - spec/tests/range_spec.rb
336
- - spec/tests/auxiliary_statement_spec.rb
337
- - spec/tests/belongs_to_many_spec.rb
338
- - spec/tests/has_many_spec.rb
339
- - spec/tests/period_spec.rb
340
335
  - spec/tests/table_inheritance_spec.rb
336
+ - spec/tests/enum_spec.rb
337
+ - spec/tests/auxiliary_statement_spec.rb
338
+ - spec/tests/enum_set_spec.rb
341
339
  - spec/tests/coder_spec.rb
342
340
  - spec/tests/collector_spec.rb
343
341
  - spec/tests/distinct_on_spec.rb
@@ -345,9 +343,10 @@ test_files:
345
343
  - spec/tests/lazy_spec.rb
346
344
  - spec/tests/quoting_spec.rb
347
345
  - spec/tests/relation_spec.rb
346
+ - spec/tests/belongs_to_many_spec.rb
347
+ - spec/tests/period_spec.rb
348
348
  - spec/tests/arel_spec.rb
349
- - spec/tests/enum_set_spec.rb
350
- - spec/tests/enum_spec.rb
349
+ - spec/tests/has_many_spec.rb
351
350
  - spec/mocks/cache_query.rb
352
351
  - spec/mocks/create_table.rb
353
352
  - spec/en.yml
@@ -1,39 +0,0 @@
1
- module Torque
2
- module PostgreSQL
3
- module AutosaveAssociation
4
- module ClassMethods
5
- def add_autosave_association_callbacks(reflection)
6
- return super unless reflection.macro.eql?(:belongs_to_many)
7
-
8
- save_method = :"autosave_associated_records_for_#{reflection.name}"
9
- define_non_cyclic_method(save_method) { save_belongs_to_many_array(reflection) }
10
-
11
- before_save(:before_save_collection_association)
12
- after_save(:after_save_collection_association) if ::ActiveRecord::Base
13
- .instance_methods.include?(:after_save_collection_association)
14
-
15
- before_create(save_method)
16
- before_update(save_method)
17
-
18
- define_autosave_validation_callbacks(reflection)
19
- end
20
- end
21
-
22
- def save_belongs_to_many_array(reflection)
23
- save_collection_association(reflection)
24
-
25
- association = association_instance_get(reflection.name)
26
- return unless association
27
-
28
- klass_fk = reflection.foreign_key
29
- acpk = reflection.active_record_primary_key
30
-
31
- records = association.target.each_with_object(klass_fk)
32
- write_attribute(acpk, records.map(&:read_attribute).compact)
33
- end
34
- end
35
-
36
- ::ActiveRecord::Base.singleton_class.prepend(AutosaveAssociation::ClassMethods)
37
- ::ActiveRecord::Base.include(AutosaveAssociation)
38
- end
39
- end