composite_primary_keys 9.0.4 → 9.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/History.rdoc +20 -0
  3. data/Rakefile +37 -34
  4. data/lib/composite_primary_keys.rb +5 -10
  5. data/lib/composite_primary_keys/arel/in.rb +6 -6
  6. data/lib/composite_primary_keys/arel/sqlserver.rb +36 -0
  7. data/lib/composite_primary_keys/associations/association_scope.rb +51 -29
  8. data/lib/composite_primary_keys/attribute_methods/read.rb +3 -1
  9. data/lib/composite_primary_keys/connection_adapters/abstract_mysql_adapter.rb +22 -0
  10. data/lib/composite_primary_keys/relation.rb +30 -0
  11. data/lib/composite_primary_keys/relation/query_methods.rb +25 -36
  12. data/lib/composite_primary_keys/sanitization.rb +31 -47
  13. data/lib/composite_primary_keys/version.rb +1 -1
  14. data/tasks/databases/mysql.rake +40 -42
  15. data/tasks/databases/oracle.rake +29 -15
  16. data/tasks/databases/postgresql.rake +38 -47
  17. data/tasks/databases/sqlite.rake +25 -0
  18. data/tasks/databases/sqlserver.rake +32 -16
  19. data/test/abstract_unit.rb +12 -11
  20. data/test/connections/connection_spec.rb +27 -18
  21. data/test/connections/databases.ci.yml +5 -4
  22. data/test/connections/databases.example.yml +19 -4
  23. data/test/connections/databases.yml +25 -4
  24. data/test/fixtures/article.rb +6 -5
  25. data/test/fixtures/db_definitions/mysql.sql +16 -7
  26. data/test/fixtures/db_definitions/oracle.drop.sql +2 -0
  27. data/test/fixtures/db_definitions/oracle.sql +25 -15
  28. data/test/fixtures/db_definitions/postgresql.sql +11 -2
  29. data/test/fixtures/db_definitions/sqlite.sql +8 -0
  30. data/test/fixtures/db_definitions/sqlserver.sql +19 -33
  31. data/test/fixtures/pk_called_id.rb +5 -0
  32. data/test/fixtures/pk_called_ids.yml +11 -0
  33. data/test/test_associations.rb +334 -332
  34. data/test/test_create.rb +9 -1
  35. data/test/test_delete.rb +17 -39
  36. data/test/test_ids.rb +113 -109
  37. data/test/test_preload.rb +94 -0
  38. data/test/test_suite.rb +1 -1
  39. data/test/test_update.rb +12 -7
  40. metadata +14 -24
  41. data/lib/composite_primary_keys/associations/singular_association.rb +0 -14
  42. data/lib/composite_primary_keys/connection_adapters/abstract/connection_specification_changes.rb +0 -71
  43. data/lib/composite_primary_keys/connection_adapters/postgresql_adapter.rb +0 -50
  44. data/lib/composite_primary_keys/dirty.rb +0 -19
  45. data/lib/composite_primary_keys/validations/uniqueness.rb +0 -41
  46. data/tasks/databases/oracle_enhanced.rake +0 -27
  47. data/tasks/databases/sqlite3.rake +0 -27
  48. data/test/connections/native_ibm_db/connection.rb +0 -19
  49. data/test/connections/native_mysql/connection.rb +0 -17
  50. data/test/connections/native_oracle/connection.rb +0 -11
  51. data/test/connections/native_oracle_enhanced/connection.rb +0 -16
  52. data/test/connections/native_postgresql/connection.rb +0 -13
  53. data/test/connections/native_sqlite3/connection.rb +0 -9
  54. data/test/connections/native_sqlserver/connection.rb +0 -11
  55. data/test/fixtures/db_definitions/sqlserver.drop.sql +0 -92
  56. data/test/test_delete_all.rb +0 -29
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: composite_primary_keys
3
3
  version: !ruby/object:Gem::Version
4
- version: 9.0.4
4
+ version: 9.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Charlie Savage
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-08-17 00:00:00.000000000 Z
11
+ date: 2017-01-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -25,7 +25,7 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: 5.0.0
27
27
  - !ruby/object:Gem::Dependency
28
- name: sqlite3
28
+ name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
@@ -39,7 +39,7 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: pg
42
+ name: mysql2
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
@@ -53,7 +53,7 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: mysql2
56
+ name: sqlite3
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
@@ -67,7 +67,7 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: rake
70
+ name: pg
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
@@ -92,6 +92,7 @@ files:
92
92
  - Rakefile
93
93
  - lib/composite_primary_keys.rb
94
94
  - lib/composite_primary_keys/arel/in.rb
95
+ - lib/composite_primary_keys/arel/sqlserver.rb
95
96
  - lib/composite_primary_keys/arel/to_sql.rb
96
97
  - lib/composite_primary_keys/associations/association.rb
97
98
  - lib/composite_primary_keys/associations/association_scope.rb
@@ -102,7 +103,6 @@ files:
102
103
  - lib/composite_primary_keys/associations/join_dependency/join_association.rb
103
104
  - lib/composite_primary_keys/associations/preloader/association.rb
104
105
  - lib/composite_primary_keys/associations/preloader/belongs_to.rb
105
- - lib/composite_primary_keys/associations/singular_association.rb
106
106
  - lib/composite_primary_keys/attribute_methods.rb
107
107
  - lib/composite_primary_keys/attribute_methods/primary_key.rb
108
108
  - lib/composite_primary_keys/attribute_methods/read.rb
@@ -112,12 +112,10 @@ files:
112
112
  - lib/composite_primary_keys/composite_arrays.rb
113
113
  - lib/composite_primary_keys/composite_predicates.rb
114
114
  - lib/composite_primary_keys/composite_relation.rb
115
- - lib/composite_primary_keys/connection_adapters/abstract/connection_specification_changes.rb
116
115
  - lib/composite_primary_keys/connection_adapters/abstract_adapter.rb
117
- - lib/composite_primary_keys/connection_adapters/postgresql_adapter.rb
116
+ - lib/composite_primary_keys/connection_adapters/abstract_mysql_adapter.rb
118
117
  - lib/composite_primary_keys/connection_adapters/sqlserver_adapter.rb
119
118
  - lib/composite_primary_keys/core.rb
120
- - lib/composite_primary_keys/dirty.rb
121
119
  - lib/composite_primary_keys/fixtures.rb
122
120
  - lib/composite_primary_keys/locking/optimistic.rb
123
121
  - lib/composite_primary_keys/nested_attributes.rb
@@ -130,16 +128,14 @@ files:
130
128
  - lib/composite_primary_keys/relation/query_methods.rb
131
129
  - lib/composite_primary_keys/relation/where_clause.rb
132
130
  - lib/composite_primary_keys/sanitization.rb
133
- - lib/composite_primary_keys/validations/uniqueness.rb
134
131
  - lib/composite_primary_keys/version.rb
135
132
  - scripts/console.rb
136
133
  - scripts/txt2html
137
134
  - scripts/txt2js
138
135
  - tasks/databases/mysql.rake
139
136
  - tasks/databases/oracle.rake
140
- - tasks/databases/oracle_enhanced.rake
141
137
  - tasks/databases/postgresql.rake
142
- - tasks/databases/sqlite3.rake
138
+ - tasks/databases/sqlite.rake
143
139
  - tasks/databases/sqlserver.rake
144
140
  - tasks/website.rake
145
141
  - test/README_tests.rdoc
@@ -148,13 +144,6 @@ files:
148
144
  - test/connections/databases.ci.yml
149
145
  - test/connections/databases.example.yml
150
146
  - test/connections/databases.yml
151
- - test/connections/native_ibm_db/connection.rb
152
- - test/connections/native_mysql/connection.rb
153
- - test/connections/native_oracle/connection.rb
154
- - test/connections/native_oracle_enhanced/connection.rb
155
- - test/connections/native_postgresql/connection.rb
156
- - test/connections/native_sqlite3/connection.rb
157
- - test/connections/native_sqlserver/connection.rb
158
147
  - test/db_test.rb
159
148
  - test/fixtures/article.rb
160
149
  - test/fixtures/articles.yml
@@ -169,7 +158,6 @@ files:
169
158
  - test/fixtures/db_definitions/oracle.sql
170
159
  - test/fixtures/db_definitions/postgresql.sql
171
160
  - test/fixtures/db_definitions/sqlite.sql
172
- - test/fixtures/db_definitions/sqlserver.drop.sql
173
161
  - test/fixtures/db_definitions/sqlserver.sql
174
162
  - test/fixtures/department.rb
175
163
  - test/fixtures/departments.yml
@@ -185,6 +173,8 @@ files:
185
173
  - test/fixtures/membership_status.rb
186
174
  - test/fixtures/membership_statuses.yml
187
175
  - test/fixtures/memberships.yml
176
+ - test/fixtures/pk_called_id.rb
177
+ - test/fixtures/pk_called_ids.yml
188
178
  - test/fixtures/product.rb
189
179
  - test/fixtures/product_tariff.rb
190
180
  - test/fixtures/product_tariffs.yml
@@ -239,7 +229,6 @@ files:
239
229
  - test/test_counter_cache.rb
240
230
  - test/test_create.rb
241
231
  - test/test_delete.rb
242
- - test/test_delete_all.rb
243
232
  - test/test_dumpable.rb
244
233
  - test/test_dup.rb
245
234
  - test/test_enum.rb
@@ -254,6 +243,7 @@ files:
254
243
  - test/test_pagination.rb
255
244
  - test/test_polymorphic.rb
256
245
  - test/test_predicates.rb
246
+ - test/test_preload.rb
257
247
  - test/test_santiago.rb
258
248
  - test/test_serialize.rb
259
249
  - test/test_suite.rb
@@ -281,7 +271,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
281
271
  version: '0'
282
272
  requirements: []
283
273
  rubyforge_project:
284
- rubygems_version: 2.6.6
274
+ rubygems_version: 2.6.8
285
275
  signing_key:
286
276
  specification_version: 4
287
277
  summary: Composite key support for ActiveRecord
@@ -300,7 +290,6 @@ test_files:
300
290
  - test/test_counter_cache.rb
301
291
  - test/test_create.rb
302
292
  - test/test_delete.rb
303
- - test/test_delete_all.rb
304
293
  - test/test_dumpable.rb
305
294
  - test/test_dup.rb
306
295
  - test/test_enum.rb
@@ -315,6 +304,7 @@ test_files:
315
304
  - test/test_pagination.rb
316
305
  - test/test_polymorphic.rb
317
306
  - test/test_predicates.rb
307
+ - test/test_preload.rb
318
308
  - test/test_santiago.rb
319
309
  - test/test_serialize.rb
320
310
  - test/test_suite.rb
@@ -1,14 +0,0 @@
1
- module CompositePrimaryKeys
2
- module SingularAssociation
3
- def get_records
4
- cpk_applies = (target && target.composite?) ||
5
- (owner && owner.composite?) ||
6
- (options[:primary_key] && options[:primary_key].kind_of?(Array)) ||
7
- (options[:foreign_key] && options[:foreign_key].kind_of?(Array))
8
- return scope.limit(1).to_a if cpk_applies
9
- super
10
- end
11
- end
12
- end
13
-
14
- ActiveRecord::Associations::SingularAssociation.prepend CompositePrimaryKeys::SingularAssociation
@@ -1,71 +0,0 @@
1
- module ActiveRecord
2
- class Base
3
- def self.load_cpk_adapter(adapter)
4
- if adapter.to_s =~ /postgresql/ || adapter.to_s =~ /postgis/
5
- require "composite_primary_keys/connection_adapters/postgresql_adapter.rb"
6
- end
7
- if adapter.to_s =~ /sqlserver/
8
- require "composite_primary_keys/connection_adapters/sqlserver_adapter.rb"
9
- end
10
- end
11
-
12
- def self.establish_connection(spec = nil)
13
- spec ||= ActiveRecord::ConnectionHandling::DEFAULT_ENV.call.to_sym
14
- resolver = ConnectionAdapters::ConnectionSpecification::Resolver.new configurations
15
- spec = resolver.spec(spec, self == Base ? "primary" : name)
16
- self.connection_specification_name = spec.name
17
-
18
- # CPK
19
- load_cpk_adapter(spec.config[:adapter])
20
-
21
- unless respond_to?(spec.adapter_method)
22
- raise AdapterNotFound, "database configuration specifies nonexistent #{spec.config[:adapter]} adapter"
23
- end
24
-
25
- remove_connection
26
- connection_handler.establish_connection spec
27
- end
28
-
29
- class << self
30
- # Returns the connection currently associated with the class. This can
31
- # also be used to "borrow" the connection to do database work unrelated
32
- # to any of the specific Active Records.
33
- def connection
34
- retrieve_connection
35
- end
36
-
37
- # Returns the configuration of the associated connection as a hash:
38
- #
39
- # ActiveRecord::Base.connection_config
40
- # # => {:pool=>5, :timeout=>5000, :database=>"db/development.sqlite3", :adapter=>"sqlite3"}
41
- #
42
- # Please use only for reading.
43
- def connection_config
44
- connection_pool.spec.config
45
- end
46
-
47
- def connection_pool
48
- connection_handler.retrieve_connection_pool(connection_specification_name)
49
- end
50
-
51
- def retrieve_connection
52
- connection_handler.retrieve_connection(connection_specification_name)
53
- end
54
-
55
- # Returns true if Active Record is connected.
56
- def connected?
57
- connection_handler.connected?(connection_specification_name)
58
- end
59
-
60
- def remove_connection(id = connection_specification_name)
61
- connection_handler.remove_connection(id)
62
- end
63
-
64
- def clear_active_connections!
65
- connection_handler.clear_active_connections!
66
- end
67
-
68
- delegate :clear_reloadable_connections!, :clear_all_connections!, :to => :connection_handler
69
- end
70
- end
71
- end
@@ -1,50 +0,0 @@
1
- module ActiveRecord
2
- module ConnectionAdapters
3
- class PostgreSQLAdapter
4
- def insert_sql(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil)
5
- unless pk
6
- # Extract the table from the insert sql. Yuck.
7
- table_ref = extract_table_ref_from_insert_sql(sql)
8
- pk = primary_key(table_ref) if table_ref
9
- end
10
-
11
- if pk && use_insert_returning?
12
- # CPK
13
- # select_value("#{sql} RETURNING #{quote_column_names(pk)}")
14
- select_value("#{sql} RETURNING #{quote_column_names(pk)}")
15
- elsif pk
16
- super
17
- last_insert_id_value(sequence_name || default_sequence_name(table_ref, pk))
18
- else
19
- super
20
- end
21
- end
22
- alias :create :insert
23
-
24
- def sql_for_insert(sql, pk, id_value, sequence_name, binds)
25
- unless pk
26
- # Extract the table from the insert sql. Yuck.
27
- table_ref = extract_table_ref_from_insert_sql(sql)
28
- pk = primary_key(table_ref) if table_ref
29
- end
30
-
31
- if pk && use_insert_returning?
32
- # CPK
33
- # sql = "#{sql} RETURNING #{quote_column_names(pk)}"
34
- sql = "#{sql} RETURNING #{quote_column_names(pk)}"
35
- end
36
-
37
- [sql, binds]
38
- end
39
-
40
- # Returns a single value if query returns a single element
41
- # otherwise returns an array corresponding to the composite keys
42
- def last_inserted_id(result)
43
- row = result && result.rows.first
44
- if Array === row
45
- row.size == 1 ? row[0] : row
46
- end
47
- end
48
- end
49
- end
50
- end
@@ -1,19 +0,0 @@
1
- module ActiveModel
2
- module Dirty
3
- def can_change_primary_key?
4
- true
5
- end
6
-
7
- def primary_key_changed?
8
- !!changed.detect { |key| ids_hash.keys.include?(key.to_s) }
9
- end
10
-
11
- def primary_key_was
12
- ids_hash.keys.inject(Hash.new) do |result, attribute_name|
13
- result[attribute_name] = attribute_was(attribute_name.to_s)
14
- result
15
- end
16
- end
17
- alias_method :ids_hash_was, :primary_key_was
18
- end
19
- end
@@ -1,41 +0,0 @@
1
- module ActiveRecord
2
- module Validations
3
- # class UniquenessValidator
4
- # def validate_each(record, attribute, value)
5
- # finder_class = find_finder_class_for(record)
6
- # table = finder_class.arel_table
7
- # value = map_enum_attribute(finder_class, attribute, value)
8
- #
9
- # begin
10
- # relation = build_relation(finder_class, table, attribute, value)
11
- # # CPK
12
- # # relation = relation.and(table[finder_class.primary_key.to_sym].not_eq(record.id)) if record.persisted?
13
- # if record.persisted?
14
- # not_eq_conditions = Array(finder_class.primary_key).zip(Array(record.send(:id))).map do |name, value|
15
- # table[name.to_sym].not_eq(value)
16
- # end
17
- #
18
- # condition = not_eq_conditions.shift
19
- # not_eq_conditions.each do |not_eq_condition|
20
- # condition = condition.or(not_eq_condition)
21
- # end
22
- # relation = relation.and(condition)
23
- # end
24
- # # End CPK
25
- # relation = scope_relation(record, table, relation)
26
- # relation = finder_class.unscoped.where(relation)
27
- # relation = relation.merge(options[:conditions]) if options[:conditions]
28
- # rescue RangeError
29
- # relation = finder_class.none
30
- # end
31
- #
32
- # if relation.exists?
33
- # error_options = options.except(:case_sensitive, :scope, :conditions)
34
- # error_options[:value] = value
35
- #
36
- # record.errors.add(attribute, :taken, error_options)
37
- # end
38
- # end
39
- # end
40
- end
41
- end
@@ -1,27 +0,0 @@
1
- require File.join(PROJECT_ROOT, 'lib', 'composite_primary_keys')
2
- require File.join(PROJECT_ROOT, 'test', 'connections', 'connection_spec')
3
-
4
- namespace :oracle_enhanced do
5
- desc 'Build the Oracle test database'
6
- task :build_database => :load_connection do
7
- options_str = connection_string
8
-
9
- sql = File.join(PROJECT_ROOT, 'test', 'fixtures', 'db_definitions', 'oracle.sql')
10
- sh %( sqlplus #{options_str} < #{sql} )
11
- end
12
-
13
- desc 'Drop the Oracle test database'
14
- task :drop_database => :load_connection do
15
- options_str = connection_string
16
-
17
- sql = File.join(PROJECT_ROOT, 'test', 'fixtures', 'db_definitions', 'oracle.drop.sql')
18
- sh %( sqlplus #{options_str} < #{sql} )
19
- end
20
-
21
- desc 'Rebuild the Oracle test database'
22
- task :rebuild_database => [:drop_database, :build_database]
23
-
24
- task :load_connection do
25
- require File.join(PROJECT_ROOT, "test", "connections", "native_oracle_enhanced", "connection")
26
- end
27
- end
@@ -1,27 +0,0 @@
1
- require File.join(PROJECT_ROOT, 'lib', 'composite_primary_keys')
2
- require File.join(PROJECT_ROOT, 'test', 'connections', 'connection_spec')
3
-
4
- namespace :sqlite3 do
5
- desc 'Build the sqlite test database'
6
- task :build_database => :load_connection do
7
- schema = File.join(PROJECT_ROOT, 'test', 'fixtures', 'db_definitions', 'sqlite.sql')
8
- dbfile = File.join(PROJECT_ROOT, connection_string)
9
- FileUtils.mkdir_p(File.dirname(dbfile))
10
- cmd = "sqlite3 #{dbfile} < #{schema}"
11
- puts cmd
12
- sh %{ #{cmd} }
13
- end
14
-
15
- desc 'Drop the sqlite test database'
16
- task :drop_database => :load_connection do
17
- dbfile = connection_string
18
- sh %{ rm -f #{dbfile} }
19
- end
20
-
21
- desc 'Rebuild the sqlite test database'
22
- task :rebuild_database => [:drop_database, :build_database]
23
-
24
- task :load_connection do
25
- require File.join(PROJECT_ROOT, "test", "connections", "native_sqlite3", "connection")
26
- end
27
- end
@@ -1,19 +0,0 @@
1
- print "Using IBM2 \n"
2
-
3
- gem 'ibm_db'
4
- require 'IBM_DB'
5
-
6
- RAILS_CONNECTION_ADAPTERS = %w( mysql postgresql sqlite firebird sqlserver db2 oracle sybase openbase frontbase ibm_db )
7
-
8
- db1 = 'composite_primary_keys_unittest'
9
-
10
- connection_options = {
11
- :adapter => "ibm_db",
12
- :database => "ocdpdev",
13
- :username => "db2inst1",
14
- :password => "password",
15
- :host => '192.168.2.21'
16
- }
17
-
18
- ActiveRecord::Base.configurations = { db1 => connection_options }
19
- ActiveRecord::Base.establish_connection(connection_options)
@@ -1,17 +0,0 @@
1
- print "Using native MySQL\n"
2
-
3
- def connection_string
4
- options = {}
5
- options['u'] = SPEC['username'] if SPEC['username']
6
- options['p'] = SPEC['password'] if SPEC['password']
7
- options['S'] = SPEC['sock'] if SPEC['sock']
8
- options.map { |key, value| "-#{key}#{value}" }.join(" ")
9
- end
10
-
11
- # Adapter config setup in test/connections/databases.yml
12
- SPEC = CompositePrimaryKeys::ConnectionSpec['mysql']
13
-
14
- def establish_connection
15
- ActiveRecord::Base.establish_connection(SPEC)
16
- end
17
- establish_connection