composite_primary_keys 7.0.11 → 7.0.12
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 +4 -4
- data/History.rdoc +6 -0
- data/README.rdoc +1 -0
- data/lib/composite_primary_keys.rb +3 -1
- data/lib/composite_primary_keys/composite_relation.rb +48 -0
- data/lib/composite_primary_keys/nested_attributes.rb +10 -2
- data/lib/composite_primary_keys/relation.rb +16 -65
- data/lib/composite_primary_keys/version.rb +1 -1
- data/test/test_attribute_methods.rb +9 -1
- data/test/test_delete.rb +1 -1
- data/test/test_delete_all.rb +1 -2
- data/test/test_dumpable.rb +15 -0
- data/test/test_suite.rb +3 -0
- metadata +9 -9
- data/init.rb +0 -2
- data/install.rb +0 -30
- data/loader.rb +0 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 65cb7db711192f8ae6b531e8c5cc5fa316554806
|
4
|
+
data.tar.gz: ce079278064acfc94b691592c804047c6b0a4dd5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f927ff29273325bc1034c2981382403fc568709f6f400db40e9d33c0933dc2016b222a9ae67cc85ad414b1e8b0e5186441ca534039f9c61c0bf35fe27c87c284
|
7
|
+
data.tar.gz: c0f88b9953c629c61b2bb001b0ff9375878c196b9b13f6d60e92705514ff04971b5a5ed4add442c55eebd169aded609f159d5a30ee0bd326a4b370f1d595a787
|
data/History.rdoc
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
== 7.0.12 (2014-11-09)
|
2
|
+
|
3
|
+
* ActiveRecord 4.1.7 support (Tom Hughes)
|
4
|
+
* Extract CPK methods to its own module and extending instead of opening the singleton class
|
5
|
+
which fixes Marshal#dump (Nicolás Hock Isaza)
|
6
|
+
|
1
7
|
== 7.0.11 (2014-10-10)
|
2
8
|
|
3
9
|
* ActiveRecord 4.1.6 support (Tom Hughes, Charlie Savage)
|
data/README.rdoc
CHANGED
@@ -26,7 +26,7 @@ $:.unshift(File.dirname(__FILE__)) unless
|
|
26
26
|
|
27
27
|
unless defined?(ActiveRecord)
|
28
28
|
require 'rubygems'
|
29
|
-
gem 'activerecord', '~>4.1.
|
29
|
+
gem 'activerecord', '~>4.1.7'
|
30
30
|
require 'active_record'
|
31
31
|
end
|
32
32
|
|
@@ -104,3 +104,5 @@ require 'composite_primary_keys/relation/predicate_builder'
|
|
104
104
|
require 'composite_primary_keys/relation/query_methods'
|
105
105
|
|
106
106
|
require 'composite_primary_keys/validations/uniqueness'
|
107
|
+
|
108
|
+
require 'composite_primary_keys/composite_relation'
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module CompositePrimaryKeys
|
2
|
+
module CompositeRelation
|
3
|
+
include CompositePrimaryKeys::ActiveRecord::Batches
|
4
|
+
include CompositePrimaryKeys::ActiveRecord::Calculations
|
5
|
+
include CompositePrimaryKeys::ActiveRecord::FinderMethods
|
6
|
+
include CompositePrimaryKeys::ActiveRecord::QueryMethods
|
7
|
+
|
8
|
+
def delete(id_or_array)
|
9
|
+
# CPK
|
10
|
+
if self.composite?
|
11
|
+
id_or_array = if id_or_array.is_a?(CompositePrimaryKeys::CompositeKeys)
|
12
|
+
[id_or_array]
|
13
|
+
else
|
14
|
+
Array(id_or_array)
|
15
|
+
end
|
16
|
+
|
17
|
+
id_or_array.each do |id|
|
18
|
+
# Is the passed in id actually a record?
|
19
|
+
id = id.kind_of?(::ActiveRecord::Base) ? id.id : id
|
20
|
+
where(cpk_id_predicate(table, self.primary_key, id)).delete_all
|
21
|
+
end
|
22
|
+
else
|
23
|
+
where(primary_key => id_or_array).delete_all
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def destroy(id_or_array)
|
28
|
+
# Without CPK:
|
29
|
+
#if id.is_a?(Array)
|
30
|
+
# id.map { |one_id| destroy(one_id) }
|
31
|
+
#else
|
32
|
+
# find(id).destroy
|
33
|
+
#end
|
34
|
+
|
35
|
+
id_or_array = if id_or_array.kind_of?(CompositePrimaryKeys::CompositeKeys)
|
36
|
+
[id_or_array]
|
37
|
+
else
|
38
|
+
Array(id_or_array)
|
39
|
+
end
|
40
|
+
|
41
|
+
id_or_array.each do |id|
|
42
|
+
where(cpk_id_predicate(table, self.primary_key, id)).each do |record|
|
43
|
+
record.destroy
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -1,5 +1,13 @@
|
|
1
1
|
module ActiveRecord
|
2
2
|
module NestedAttributes
|
3
|
+
def cpk_detect_record(id, records)
|
4
|
+
id_string = id.is_a?(Array) ? CompositePrimaryKeys::CompositeKeys.new(id).to_s : id.to_s
|
5
|
+
|
6
|
+
records.detect do |record|
|
7
|
+
record.id.to_s == id_string
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
3
11
|
def assign_nested_attributes_for_collection_association(association_name, attributes_collection)
|
4
12
|
options = self.nested_attributes_options[association_name]
|
5
13
|
|
@@ -48,12 +56,12 @@ module ActiveRecord
|
|
48
56
|
unless reject_new_record?(association_name, attributes)
|
49
57
|
association.build(attributes.except(*UNASSIGNABLE_KEYS))
|
50
58
|
end
|
51
|
-
elsif existing_record =
|
59
|
+
elsif existing_record = cpk_detect_record(attributes['id'], existing_records)
|
52
60
|
unless call_reject_if(association_name, attributes)
|
53
61
|
# Make sure we are operating on the actual object which is in the association's
|
54
62
|
# proxy_target array (either by finding it, or adding it if not found)
|
55
63
|
# Take into account that the proxy_target may have changed due to callbacks
|
56
|
-
target_record =
|
64
|
+
target_record = cpk_detect_record(attributes['id'], association.target)
|
57
65
|
if target_record
|
58
66
|
existing_record = target_record
|
59
67
|
else
|
@@ -4,7 +4,6 @@ module ActiveRecord
|
|
4
4
|
def initialize(klass, table, values = {})
|
5
5
|
initialize_without_cpk(klass, table, values)
|
6
6
|
add_cpk_support if klass && klass.composite?
|
7
|
-
add_cpk_where_values_hash
|
8
7
|
end
|
9
8
|
|
10
9
|
alias :initialize_copy_without_cpk :initialize_copy
|
@@ -14,75 +13,27 @@ module ActiveRecord
|
|
14
13
|
end
|
15
14
|
|
16
15
|
def add_cpk_support
|
17
|
-
|
18
|
-
include CompositePrimaryKeys::ActiveRecord::Batches
|
19
|
-
include CompositePrimaryKeys::ActiveRecord::Calculations
|
20
|
-
include CompositePrimaryKeys::ActiveRecord::FinderMethods
|
21
|
-
include CompositePrimaryKeys::ActiveRecord::QueryMethods
|
22
|
-
|
23
|
-
def delete(id_or_array)
|
24
|
-
# CPK
|
25
|
-
if self.composite?
|
26
|
-
id_or_array = if id_or_array.is_a?(CompositePrimaryKeys::CompositeKeys)
|
27
|
-
[id_or_array]
|
28
|
-
else
|
29
|
-
Array(id_or_array)
|
30
|
-
end
|
31
|
-
|
32
|
-
id_or_array.each do |id|
|
33
|
-
# Is the passed in id actually a record?
|
34
|
-
id = id.kind_of?(ActiveRecord::Base) ? id.id : id
|
35
|
-
where(cpk_id_predicate(table, self.primary_key, id)).delete_all
|
36
|
-
end
|
37
|
-
else
|
38
|
-
where(primary_key => id_or_array).delete_all
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def destroy(id_or_array)
|
43
|
-
# Without CPK:
|
44
|
-
#if id.is_a?(Array)
|
45
|
-
# id.map { |one_id| destroy(one_id) }
|
46
|
-
#else
|
47
|
-
# find(id).destroy
|
48
|
-
#end
|
49
|
-
|
50
|
-
id_or_array = if id_or_array.kind_of?(CompositePrimaryKeys::CompositeKeys)
|
51
|
-
[id_or_array]
|
52
|
-
else
|
53
|
-
Array(id_or_array)
|
54
|
-
end
|
55
|
-
|
56
|
-
id_or_array.each do |id|
|
57
|
-
where(cpk_id_predicate(table, self.primary_key, id)).each do |record|
|
58
|
-
record.destroy
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
16
|
+
extend CompositePrimaryKeys::CompositeRelation
|
63
17
|
end
|
64
18
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
nodes_from_and = where_values.grep(Arel::Nodes::And).map {|and_node| and_node.children.grep(Arel::Nodes::Equality) }.flatten
|
19
|
+
# CPK adds this so that it finds the Equality nodes beneath the And node:
|
20
|
+
# equalities = where_values.grep(Arel::Nodes::Equality).find_all { |node|
|
21
|
+
# node.left.relation.name == table_name
|
22
|
+
# }
|
23
|
+
alias :where_values_hash_without_cpk :where_values_hash
|
24
|
+
def where_values_hash(relation_table_name = table_name)
|
25
|
+
nodes_from_and = where_values.grep(Arel::Nodes::And).map {|and_node| and_node.children.grep(Arel::Nodes::Equality) }.flatten
|
73
26
|
|
74
|
-
|
75
|
-
|
76
|
-
|
27
|
+
equalities = (nodes_from_and + where_values.grep(Arel::Nodes::Equality)).find_all { |node|
|
28
|
+
node.left.relation.name == relation_table_name
|
29
|
+
}
|
77
30
|
|
78
|
-
|
31
|
+
binds = Hash[bind_values.find_all(&:first).map { |column, v| [column.name, v] }]
|
79
32
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
end
|
85
|
-
end
|
33
|
+
Hash[equalities.map { |where|
|
34
|
+
name = where.left.name
|
35
|
+
[name, binds.fetch(name.to_s) { where.right }]
|
36
|
+
}]
|
86
37
|
end
|
87
38
|
|
88
39
|
def _update_record(values, id, id_was)
|
@@ -51,5 +51,13 @@ class TestAttributeMethods < ActiveSupport::TestCase
|
|
51
51
|
assert_equal([1,1], ref_code.to_key)
|
52
52
|
end
|
53
53
|
|
54
|
-
|
54
|
+
def test_id_was
|
55
|
+
rt = ReferenceType.find(1)
|
56
|
+
rt.id = 2
|
57
|
+
assert_equal 1, rt.id_was
|
58
|
+
|
59
|
+
ref_code = ReferenceCode.find([1, 1])
|
60
|
+
ref_code.id = [1,2]
|
61
|
+
assert_equal [1,1], ref_code.id_was
|
62
|
+
end
|
55
63
|
end
|
data/test/test_delete.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require File.expand_path('../abstract_unit', __FILE__)
|
2
2
|
|
3
3
|
class TestDelete < ActiveSupport::TestCase
|
4
|
-
fixtures :departments, :employees, :products, :product_tariffs,
|
4
|
+
fixtures :articles, :departments, :employees, :products, :tariffs, :product_tariffs,
|
5
5
|
:reference_types, :reference_codes
|
6
6
|
|
7
7
|
CLASSES = {
|
data/test/test_delete_all.rb
CHANGED
@@ -13,10 +13,9 @@ class TestValidations < ActiveSupport::TestCase
|
|
13
13
|
EmployeesGroup.create(employee_id: 3, group_id: 103)
|
14
14
|
|
15
15
|
assert_equal(EmployeesGroup.all.size, 3)
|
16
|
-
|
16
|
+
assert_raises(ActiveRecord::StatementInvalid) {
|
17
17
|
EmployeesGroup.where(employee_id: 1).first.destroy
|
18
18
|
}
|
19
|
-
assert_match(/Unknown column 'employees_groups.' in 'where clause/, exception.message)
|
20
19
|
assert(EmployeesGroup.all.size == 3)
|
21
20
|
end
|
22
21
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require File.expand_path('../abstract_unit', __FILE__)
|
2
|
+
|
3
|
+
class TestDumpable < ActiveSupport::TestCase
|
4
|
+
fixtures :articles, :readings, :users
|
5
|
+
|
6
|
+
def test_marshal_with_simple_preload
|
7
|
+
articles = Article.preload(:readings).where(id: 1).to_a
|
8
|
+
assert_equal(Marshal.load(Marshal.dump(articles)), articles)
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_marshal_with_comples_preload
|
12
|
+
articles = Article.preload({ readings: :user }).where(id: 1).to_a
|
13
|
+
assert_equal(Marshal.load(Marshal.dump(articles)), articles)
|
14
|
+
end
|
15
|
+
end
|
data/test/test_suite.rb
CHANGED
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: composite_primary_keys
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 7.0.
|
4
|
+
version: 7.0.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Charlie Savage
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-11-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 4.1.
|
19
|
+
version: 4.1.7
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 4.1.
|
26
|
+
version: 4.1.7
|
27
27
|
description: Composite key support for ActiveRecord
|
28
28
|
email:
|
29
29
|
executables: []
|
@@ -34,8 +34,6 @@ files:
|
|
34
34
|
- README.rdoc
|
35
35
|
- README_DB2.rdoc
|
36
36
|
- Rakefile
|
37
|
-
- init.rb
|
38
|
-
- install.rb
|
39
37
|
- lib/composite_primary_keys.rb
|
40
38
|
- lib/composite_primary_keys/associations/association.rb
|
41
39
|
- lib/composite_primary_keys/associations/association_scope.rb
|
@@ -55,6 +53,7 @@ files:
|
|
55
53
|
- lib/composite_primary_keys/base.rb
|
56
54
|
- lib/composite_primary_keys/composite_arrays.rb
|
57
55
|
- lib/composite_primary_keys/composite_predicates.rb
|
56
|
+
- lib/composite_primary_keys/composite_relation.rb
|
58
57
|
- lib/composite_primary_keys/connection_adapters/abstract/connection_specification_changes.rb
|
59
58
|
- lib/composite_primary_keys/connection_adapters/abstract_adapter.rb
|
60
59
|
- lib/composite_primary_keys/connection_adapters/postgresql_adapter.rb
|
@@ -73,7 +72,6 @@ files:
|
|
73
72
|
- lib/composite_primary_keys/sanitization.rb
|
74
73
|
- lib/composite_primary_keys/validations/uniqueness.rb
|
75
74
|
- lib/composite_primary_keys/version.rb
|
76
|
-
- loader.rb
|
77
75
|
- scripts/console.rb
|
78
76
|
- scripts/txt2html
|
79
77
|
- scripts/txt2js
|
@@ -176,6 +174,7 @@ files:
|
|
176
174
|
- test/test_create.rb
|
177
175
|
- test/test_delete.rb
|
178
176
|
- test/test_delete_all.rb
|
177
|
+
- test/test_dumpable.rb
|
179
178
|
- test/test_dup.rb
|
180
179
|
- test/test_enum.rb
|
181
180
|
- test/test_equal.rb
|
@@ -235,6 +234,7 @@ test_files:
|
|
235
234
|
- test/test_create.rb
|
236
235
|
- test/test_delete.rb
|
237
236
|
- test/test_delete_all.rb
|
237
|
+
- test/test_dumpable.rb
|
238
238
|
- test/test_dup.rb
|
239
239
|
- test/test_enum.rb
|
240
240
|
- test/test_equal.rb
|
data/init.rb
DELETED
data/install.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
require 'rbconfig'
|
2
|
-
require 'find'
|
3
|
-
require 'ftools'
|
4
|
-
|
5
|
-
include Config
|
6
|
-
|
7
|
-
# this was adapted from rdoc's install.rb by ways of Log4r
|
8
|
-
|
9
|
-
$sitedir = CONFIG["sitelibdir"]
|
10
|
-
unless $sitedir
|
11
|
-
version = CONFIG["MAJOR"] + "." + CONFIG["MINOR"]
|
12
|
-
$libdir = File.join(CONFIG["libdir"], "ruby", version)
|
13
|
-
$sitedir = $:.find {|x| x =~ /site_ruby/ }
|
14
|
-
if !$sitedir
|
15
|
-
$sitedir = File.join($libdir, "site_ruby")
|
16
|
-
elsif $sitedir !~ Regexp.quote(version)
|
17
|
-
$sitedir = File.join($sitedir, version)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
# the acual gruntwork
|
22
|
-
Dir.chdir("lib")
|
23
|
-
|
24
|
-
Find.find("composite_primary_keys", "composite_primary_keys.rb") { |f|
|
25
|
-
if f[-3..-1] == ".rb"
|
26
|
-
File::install(f, File.join($sitedir, *f.split(/\//)), 0644, true)
|
27
|
-
else
|
28
|
-
File::makedirs(File.join($sitedir, *f.split(/\//)))
|
29
|
-
end
|
30
|
-
}
|
data/loader.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
# Load local config files in /local
|
2
|
-
begin
|
3
|
-
local_file_supported = Dir[File.join(PROJECT_ROOT, 'local/*.sample')].map { |path| File.basename(path).sub(".sample","") }
|
4
|
-
local_file_supported.each do |file|
|
5
|
-
require "local/#{file}"
|
6
|
-
end
|
7
|
-
rescue LoadError
|
8
|
-
puts <<-EOS
|
9
|
-
This Gem supports local developer extensions in local/ folder.
|
10
|
-
Supported files:
|
11
|
-
#{local_file_supported.map { |f| "local/#{f}"}.join(', ')}
|
12
|
-
|
13
|
-
Setup default sample files:
|
14
|
-
rake local:setup
|
15
|
-
|
16
|
-
Current warning: #{$!}
|
17
|
-
|
18
|
-
EOS
|
19
|
-
end
|
20
|
-
|
21
|
-
|
22
|
-
# Now load Rake tasks from /tasks
|
23
|
-
rakefiles = Dir[File.join(File.dirname(__FILE__), "tasks/**/*.rake")]
|
24
|
-
rakefiles.each { |rakefile| load File.expand_path(rakefile) }
|