active-record-ex 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -3
- data/.travis.yml +7 -0
- data/CHANGELOG.md +4 -0
- data/Gemfile +9 -0
- data/Rakefile +3 -2
- data/active-record-ex.gemspec +6 -3
- data/lib/active-record-ex/assoc_ordering.rb +8 -3
- data/lib/active-record-ex/assume_destroy.rb +4 -3
- data/lib/active-record-ex/many_to_many.rb +32 -9
- data/lib/active-record-ex/polymorphic_build.rb +1 -1
- data/lib/active-record-ex/relation_extensions.rb +4 -1
- data/lib/active-record-ex/version.rb +1 -1
- data/test/schema.rb +63 -0
- data/test/test_helper.rb +45 -67
- data/test/unit/assoc_ordering_test.rb +3 -3
- data/test/unit/assume_destroy_test.rb +13 -29
- data/test/unit/many_to_many_test.rb +50 -62
- data/test/unit/nillable_find_test.rb +19 -26
- data/test/unit/polymorphic_build_test.rb +2 -2
- data/test/unit/relation_extensions_test.rb +4 -4
- metadata +54 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 003406b4939618a1f44328e1bf84155ea6de693b
|
4
|
+
data.tar.gz: 1bee5be3e16844522ec53f91ab2a05721d231fa8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c6e1aa0159785dff066465d8d5ae242c373f922313a3d282daa2311638267e094ee0a72f68f77faf6d4a1b02461c82cea2901b07ccbbb1167487c9d1dd2a3d42
|
7
|
+
data.tar.gz: b49112112339eb49f429af039e2baa2e5c15eb8ce2bafe483e79332ed146244409544931e0b46abd4b76b75821b6f8454afb12acd1e78ae6456bb9e88b31d0d2
|
data/.gitignore
CHANGED
@@ -27,9 +27,9 @@
|
|
27
27
|
|
28
28
|
# for a library or gem, you might want to ignore these files since the code is
|
29
29
|
# intended to run in multiple environments; otherwise, check them in:
|
30
|
-
|
31
|
-
|
32
|
-
|
30
|
+
Gemfile.lock
|
31
|
+
.ruby-version
|
32
|
+
.ruby-gemset
|
33
33
|
|
34
34
|
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
|
35
35
|
.rvmrc
|
data/.travis.yml
CHANGED
@@ -5,8 +5,15 @@ rvm:
|
|
5
5
|
- 2.0.0
|
6
6
|
- 2.1.2
|
7
7
|
- 2.2.3
|
8
|
+
env:
|
9
|
+
- "RAILS_VERSION=3.2.22.5"
|
10
|
+
- "RAILS_VERSION=4.2.8"
|
8
11
|
cache:
|
9
12
|
bundler: true
|
13
|
+
install:
|
14
|
+
- gem update --system
|
15
|
+
- gem install bundler
|
16
|
+
- bundle install --jobs=3 --retry=3
|
10
17
|
branches:
|
11
18
|
only:
|
12
19
|
- master
|
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
@@ -2,3 +2,12 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
# Specify your gem's dependencies in active-record-ex.gemspec
|
4
4
|
gemspec
|
5
|
+
|
6
|
+
rails_version = ENV["RAILS_VERSION"] || '4.2.8'
|
7
|
+
|
8
|
+
gem 'activerecord', rails_version
|
9
|
+
gem 'activesupport', rails_version
|
10
|
+
|
11
|
+
group :test do
|
12
|
+
gem 'testrbl'
|
13
|
+
end
|
data/Rakefile
CHANGED
data/active-record-ex.gemspec
CHANGED
@@ -20,10 +20,13 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_development_dependency 'bundler'
|
22
22
|
spec.add_development_dependency 'rake'
|
23
|
-
spec.add_development_dependency 'test-unit'
|
24
23
|
spec.add_development_dependency 'shoulda'
|
25
24
|
spec.add_development_dependency 'mocha'
|
25
|
+
spec.add_development_dependency 'sqlite3'
|
26
|
+
spec.add_development_dependency 'database_cleaner'
|
27
|
+
spec.add_development_dependency 'minitest-rails'
|
28
|
+
spec.add_development_dependency 'test-unit'
|
26
29
|
|
27
|
-
spec.add_runtime_dependency 'activesupport', '
|
28
|
-
spec.add_runtime_dependency 'activerecord', '
|
30
|
+
spec.add_runtime_dependency 'activesupport', '>= 3.2'
|
31
|
+
spec.add_runtime_dependency 'activerecord', '>= 3.2'
|
29
32
|
end
|
@@ -7,9 +7,14 @@ module ActiveRecordEx
|
|
7
7
|
end
|
8
8
|
|
9
9
|
module ClassMethods
|
10
|
-
def has_many(assoc_name, options = {}, &extension)
|
11
|
-
order_field = options.delete(:order_on)
|
12
|
-
|
10
|
+
def has_many(assoc_name, scope = nil, options = {}, &extension)
|
11
|
+
order_field = scope.is_a?(Hash) ? scope.delete(:order_on) : options.delete(:order_on)
|
12
|
+
if ActiveRecord::VERSION::MAJOR < 4
|
13
|
+
super(assoc_name, scope || {}, &extension)
|
14
|
+
else
|
15
|
+
super
|
16
|
+
end
|
17
|
+
opts = (scope.is_a?(Hash) ? scope : options)
|
13
18
|
return unless order_field
|
14
19
|
|
15
20
|
define_model_setter(assoc_name, order_field)
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# extends accepts_nested_attributes_for
|
2
2
|
# by default, accepts_nested_attributes_for "allow_destroy"s,
|
3
3
|
# ie, will destroy associations if explicitly marked by _destroy: true
|
4
|
-
# this flips that, causing an association to be destroyed
|
4
|
+
# this flips that, causing an association to be destroyed
|
5
5
|
# if it's not included in the updating attrs
|
6
6
|
module ActiveRecordEx
|
7
7
|
module AssumeDestroy
|
@@ -18,6 +18,7 @@ module ActiveRecordEx
|
|
18
18
|
super assoc_name, options
|
19
19
|
|
20
20
|
return unless assume_destroy
|
21
|
+
|
21
22
|
attrs_name = ("#{assoc_name.to_s}_attributes").to_sym
|
22
23
|
setter_name = ("#{attrs_name.to_s}=").to_sym
|
23
24
|
unassuming_setter_name = ("#{attrs_name.to_s}_without_assume=").to_sym
|
@@ -26,7 +27,6 @@ module ActiveRecordEx
|
|
26
27
|
define_method(assuming_setter_name) do |attrs|
|
27
28
|
ids = attrs.map { |a| a['id'] || a[:id] }.compact
|
28
29
|
assocs = self.send(assoc_name)
|
29
|
-
|
30
30
|
dead_assocs = []
|
31
31
|
# the ternary's 'cause Arel doesn't do the right thing with an empty array
|
32
32
|
dead_assocs = assocs.where('id NOT IN (?)', ids.any? ? ids : '') unless self.new_record?
|
@@ -35,7 +35,8 @@ module ActiveRecordEx
|
|
35
35
|
attrs = attrs.concat(dead_attrs)
|
36
36
|
self.send(unassuming_setter_name, attrs)
|
37
37
|
end
|
38
|
-
|
38
|
+
alias_method unassuming_setter_name, setter_name
|
39
|
+
alias_method setter_name, assuming_setter_name
|
39
40
|
end
|
40
41
|
end
|
41
42
|
end
|
@@ -26,19 +26,42 @@ module ActiveRecordEx
|
|
26
26
|
end
|
27
27
|
|
28
28
|
module ClassMethods
|
29
|
-
def
|
29
|
+
def set_scope_and_options(scope, options)
|
30
|
+
if scope.is_a?(Hash)
|
31
|
+
options = scope
|
32
|
+
scope = nil
|
33
|
+
end
|
34
|
+
[scope, options]
|
35
|
+
end
|
36
|
+
|
37
|
+
def belongs_to(name, scope = nil, options = {})
|
38
|
+
scope, options = set_scope_and_options(scope, options)
|
30
39
|
subtypes = options.delete(:subtypes)
|
31
|
-
|
40
|
+
if ActiveRecord::VERSION::MAJOR < 4
|
41
|
+
super(name, options)
|
42
|
+
else
|
43
|
+
super
|
44
|
+
end
|
32
45
|
define_belongs_assoc(name, options.merge(subtypes: subtypes))
|
33
46
|
end
|
34
47
|
|
35
|
-
def has_many(name, options = {}, &extension)
|
36
|
-
|
48
|
+
def has_many(name, scope = nil, options = {}, &extension)
|
49
|
+
scope, options = set_scope_and_options(scope, options)
|
50
|
+
if ActiveRecord::VERSION::MAJOR < 4
|
51
|
+
super(name, options, &extension)
|
52
|
+
else
|
53
|
+
super
|
54
|
+
end
|
37
55
|
define_has_assoc(name.to_s.singularize, options)
|
38
56
|
end
|
39
57
|
|
40
|
-
def has_one(name, options = {}, &extension)
|
41
|
-
|
58
|
+
def has_one(name, scope = nil, options = {}, &extension)
|
59
|
+
scope, options = set_scope_and_options(scope, options)
|
60
|
+
if ActiveRecord::VERSION::MAJOR < 4
|
61
|
+
super(name, options, &extension)
|
62
|
+
else
|
63
|
+
super
|
64
|
+
end
|
42
65
|
define_has_assoc(name.to_s, options)
|
43
66
|
end
|
44
67
|
|
@@ -74,7 +97,7 @@ module ActiveRecordEx
|
|
74
97
|
method_name = name.pluralize.to_sym
|
75
98
|
define_singleton_method(method_name) do
|
76
99
|
klass = klass_name.constantize
|
77
|
-
foreign_key = self.arel_table[key_name]
|
100
|
+
foreign_key = ActiveRecord::VERSION::MAJOR < 4 ? self.arel_table[key_name] : self.arel_table[key_name].name
|
78
101
|
primary_keys = self.pluck(foreign_key).uniq
|
79
102
|
# eg, Account.where(id: ids)
|
80
103
|
klass.where(klass.primary_key => primary_keys)
|
@@ -89,7 +112,7 @@ module ActiveRecordEx
|
|
89
112
|
|
90
113
|
method_name = subtype_klass.to_s.demodulize.underscore.pluralize.to_sym
|
91
114
|
define_singleton_method(method_name) do
|
92
|
-
foreign_key = self.arel_table[key_name]
|
115
|
+
foreign_key = ActiveRecord::VERSION::MAJOR < 4 ? self.arel_table[key_name] : self.arel_table[key_name].name
|
93
116
|
primary_keys = self.where(type_key => type_val).pluck(foreign_key).uniq
|
94
117
|
# eg, Account.where(id: ids)
|
95
118
|
subtype_klass.where(subtype_klass.primary_key => primary_keys)
|
@@ -111,7 +134,7 @@ module ActiveRecordEx
|
|
111
134
|
|
112
135
|
method_name = name.pluralize.to_sym
|
113
136
|
define_singleton_method(method_name) do
|
114
|
-
primary_key = self.arel_table[self.primary_key]
|
137
|
+
primary_key = ActiveRecord::VERSION::MAJOR < 4 ? self.arel_table[self.primary_key] : self.arel_table[self.primary_key].name
|
115
138
|
foreign_keys = self.pluck(primary_key).uniq
|
116
139
|
|
117
140
|
other_klass = klass_name.constantize
|
@@ -29,7 +29,10 @@ module ActiveRecord
|
|
29
29
|
|
30
30
|
def collapsed_where
|
31
31
|
values = self.where_values
|
32
|
-
|
32
|
+
# You must pass in 1 instead of True Arel no longer
|
33
|
+
# supports TrueClass
|
34
|
+
# https://github.com/rails/rails/issues/20473
|
35
|
+
values = [1] if values.empty?
|
33
36
|
# FIXME: Needs to wrap string literal conditions (e.g., where("id > 1"))
|
34
37
|
Arel::Nodes::And.new(values)
|
35
38
|
end
|
data/test/schema.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
ActiveRecord::Schema.define do
|
2
|
+
execute('PRAGMA foreign_keys = ON;')
|
3
|
+
create_table 'assumes_destroys' do |t|
|
4
|
+
end
|
5
|
+
|
6
|
+
create_table "destroyees" do |t|
|
7
|
+
t.integer :assumes_destroy_id
|
8
|
+
t.string :name
|
9
|
+
end
|
10
|
+
|
11
|
+
create_table 'parents' do |t|
|
12
|
+
end
|
13
|
+
|
14
|
+
create_table "children" do |t|
|
15
|
+
t.integer :parent_id
|
16
|
+
t.string :foo
|
17
|
+
end
|
18
|
+
|
19
|
+
create_table 'has_manieds' do |t|
|
20
|
+
end
|
21
|
+
|
22
|
+
create_table 'has_ordered_assocs' do |t|
|
23
|
+
end
|
24
|
+
|
25
|
+
create_table 'ordered_assocs' do |t|
|
26
|
+
end
|
27
|
+
|
28
|
+
create_table 'simple_belongs_tos' do |t|
|
29
|
+
t.integer :has_manied_id
|
30
|
+
end
|
31
|
+
|
32
|
+
create_table 'belongs_to_throughs' do |t|
|
33
|
+
t.integer :simple_belongs_to_id
|
34
|
+
end
|
35
|
+
|
36
|
+
create_table 'some_class_names' do |t|
|
37
|
+
t.integer :some_name_id
|
38
|
+
t.integer :has_manied_id
|
39
|
+
end
|
40
|
+
|
41
|
+
create_table 'foreign_keyeds' do |t|
|
42
|
+
t.integer :has_manied
|
43
|
+
end
|
44
|
+
# https://stackoverflow.com/questions/1884818/how-do-i-add-a-foreign-key-to-an-existing-sqlite-3-6-21-table
|
45
|
+
execute("ALTER TABLE foreign_keyeds ADD COLUMN some_foreign_key_id INTEGER REFERENCES has_manieds(id)")
|
46
|
+
|
47
|
+
create_table 'ones' do |t|
|
48
|
+
t.integer :has_manied_id
|
49
|
+
end
|
50
|
+
|
51
|
+
create_table 'aseds' do |t|
|
52
|
+
t.string :some_as_type
|
53
|
+
t.integer :some_as_id
|
54
|
+
end
|
55
|
+
|
56
|
+
create_table 'belongs_tos' do |t|
|
57
|
+
t.integer :has_manied_id
|
58
|
+
end
|
59
|
+
|
60
|
+
create_table 'poly_bases' do |t|
|
61
|
+
t.string :type
|
62
|
+
end
|
63
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -1,85 +1,30 @@
|
|
1
1
|
require 'active_record'
|
2
|
-
require '
|
2
|
+
require 'minitest/autorun'
|
3
3
|
require 'shoulda'
|
4
|
-
require 'mocha'
|
5
|
-
|
4
|
+
require 'mocha/mini_test'
|
6
5
|
require 'active-record-ex/relation_extensions'
|
6
|
+
require 'database_cleaner'
|
7
7
|
|
8
|
-
|
9
|
-
def db_expects(arel, query, response = nil)
|
10
|
-
response_columns = response.try(:first).try(:keys).try(:map, &:to_s) || []
|
11
|
-
response_rows = response.try(:map, &:values) || []
|
12
|
-
response = ActiveRecord::Result.new(response_columns, response_rows)
|
13
|
-
|
14
|
-
case query.first
|
15
|
-
when /^SELECT/
|
16
|
-
arel.connection.expects(:exec_query).with(*query).returns(response)
|
17
|
-
when /^DELETE/
|
18
|
-
arel.connection.expects(:exec_delete).with(*query).returns(response)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
# Used as a "dummy" model in tests to avoid using a database connection
|
24
|
-
class StubModel < ActiveRecord::Base
|
25
|
-
self.abstract_class = true
|
26
|
-
|
27
|
-
conn = Class.new(ActiveRecord::ConnectionAdapters::AbstractAdapter) do
|
28
|
-
def quote_column_name(name)
|
29
|
-
"`#{name.to_s.gsub('`', '``')}`"
|
30
|
-
end
|
31
|
-
|
32
|
-
def quote_table_name(name)
|
33
|
-
quote_column_name(name).gsub('.', '`.`')
|
34
|
-
end
|
35
|
-
|
36
|
-
def select(sql, name = nil, _ = [])
|
37
|
-
exec_query(sql, name).to_a
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
visitor = Class.new(Arel::Visitors::ToSql) do
|
42
|
-
def table_exists?(*_)
|
43
|
-
true
|
44
|
-
end
|
45
|
-
|
46
|
-
def column_for(attr)
|
47
|
-
pk = attr == 'id'
|
48
|
-
column = ActiveRecord::ConnectionAdapters::Column.new(attr, nil, pk ? :integer : :string)
|
49
|
-
column.primary = pk
|
50
|
-
column
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
@@connection = conn.new({})
|
55
|
-
@@connection.visitor = visitor.new(@@connection)
|
56
|
-
|
57
|
-
class << self
|
58
|
-
def connection
|
59
|
-
@@connection
|
60
|
-
end
|
61
|
-
|
62
|
-
def columns; []; end
|
63
|
-
|
64
|
-
def get_primary_key(*_); 'id'; end
|
65
|
-
end
|
8
|
+
DatabaseCleaner.strategy = :truncation
|
66
9
|
|
67
|
-
|
68
|
-
|
10
|
+
ActiveRecord::Base.establish_connection adapter: "sqlite3", database: ":memory:"
|
11
|
+
puts File.dirname(__FILE__) + '/schema.rb'
|
12
|
+
load File.dirname(__FILE__) + '/schema.rb'
|
69
13
|
|
70
|
-
|
71
|
-
|
14
|
+
require 'logger'
|
15
|
+
ActiveRecord::Base.logger = Logger.new(STDOUT)
|
16
|
+
ActiveRecord::Base.logger.level = Logger::ERROR
|
72
17
|
|
73
18
|
# SQLCounter is part of ActiveRecord but is not distributed with the gem (used for internal tests only)
|
74
19
|
# see https://github.com/rails/rails/blob/3-2-stable/activerecord/test/cases/helper.rb#L59
|
75
20
|
module ActiveRecord
|
76
21
|
class SQLCounter
|
77
22
|
cattr_accessor :ignored_sql
|
78
|
-
self.ignored_sql = [/^PRAGMA
|
23
|
+
self.ignored_sql = [/^PRAGMA/, /^SELECT currval/, /^SELECT CAST/, /^SELECT @@IDENTITY/, /^SELECT @@ROWCOUNT/, /^SAVEPOINT/, /^ROLLBACK TO SAVEPOINT/, /^RELEASE SAVEPOINT/, /^SHOW max_identifier_length/, /^BEGIN/i, /^COMMIT/i, /FROM sqlite_master/]
|
79
24
|
|
80
25
|
# FIXME: this needs to be refactored so specific database can add their own
|
81
26
|
# ignored SQL. This ignored SQL is for Oracle.
|
82
|
-
ignored_sql.concat [/^select .*nextval/i, /^SAVEPOINT/, /^ROLLBACK TO/, /^\s*select .* from all_triggers/im]
|
27
|
+
self.ignored_sql.concat [/^select .*nextval/i, /^SAVEPOINT/, /^ROLLBACK TO/, /^\s*select .* from all_triggers/im, /^INSERT/]
|
83
28
|
|
84
29
|
cattr_accessor :log
|
85
30
|
self.log = []
|
@@ -90,6 +35,10 @@ module ActiveRecord
|
|
90
35
|
@ignore = ignore
|
91
36
|
end
|
92
37
|
|
38
|
+
def self.clear_log
|
39
|
+
self.log = []
|
40
|
+
end
|
41
|
+
|
93
42
|
def call(name, start, finish, message_id, values)
|
94
43
|
sql = values[:sql]
|
95
44
|
|
@@ -102,3 +51,32 @@ module ActiveRecord
|
|
102
51
|
|
103
52
|
ActiveSupport::Notifications.subscribe('sql.active_record', SQLCounter.new)
|
104
53
|
end
|
54
|
+
|
55
|
+
class ActiveSupport::TestCase
|
56
|
+
setup do
|
57
|
+
DatabaseCleaner.strategy = :transaction
|
58
|
+
DatabaseCleaner.clean_with :truncation
|
59
|
+
DatabaseCleaner.start
|
60
|
+
end
|
61
|
+
|
62
|
+
teardown do
|
63
|
+
DatabaseCleaner.clean
|
64
|
+
end
|
65
|
+
|
66
|
+
def assert_no_queries(&block)
|
67
|
+
assert_queries(0, :ignore_none => true, &block)
|
68
|
+
end
|
69
|
+
def assert_queries(num = 1, options = {})
|
70
|
+
ignore_none = options.fetch(:ignore_none) { num == :any }
|
71
|
+
ActiveRecord::SQLCounter.clear_log
|
72
|
+
yield
|
73
|
+
ensure
|
74
|
+
the_log = ActiveRecord::SQLCounter.log
|
75
|
+
if num == :any
|
76
|
+
assert_operator the_log.size, :>=, 1, "1 or more queries expected, but none were executed."
|
77
|
+
else
|
78
|
+
mesg = "#{the_log.size} instead of #{num} queries were executed.#{the_log.size == 0 ? '' : "\nQueries:\n#{the_log.join("\n")}"}"
|
79
|
+
assert_equal num, the_log.size, mesg
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -1,19 +1,19 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
require 'active-record-ex/assoc_ordering'
|
3
3
|
|
4
|
-
class OrderedAssoc <
|
4
|
+
class OrderedAssoc < ActiveRecord::Base
|
5
5
|
attr_accessor :name
|
6
6
|
attr_accessor :order
|
7
7
|
attr_accessor :has_orderd_assoc_id
|
8
8
|
end
|
9
9
|
|
10
|
-
class DestroyableAssoc <
|
10
|
+
class DestroyableAssoc < ActiveRecord::Base
|
11
11
|
attr_accessor :name
|
12
12
|
attr_accessor :order
|
13
13
|
attr_accessor :has_orderd_assoc_id
|
14
14
|
end
|
15
15
|
|
16
|
-
class HasOrderedAssoc <
|
16
|
+
class HasOrderedAssoc < ActiveRecord::Base
|
17
17
|
include ActiveRecordEx::AssocOrdering
|
18
18
|
|
19
19
|
has_many :ordered_assocs, order_on: :order
|
@@ -1,32 +1,29 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
require 'active-record-ex/assume_destroy'
|
3
3
|
|
4
|
-
class AssumeDestroyTest <
|
5
|
-
class AssumesDestroy <
|
4
|
+
class AssumeDestroyTest < ActiveSupport::TestCase
|
5
|
+
class AssumesDestroy < ActiveRecord::Base
|
6
6
|
include ActiveRecordEx::AssumeDestroy
|
7
7
|
|
8
8
|
has_many :destroyees
|
9
9
|
accepts_nested_attributes_for :destroyees, assume_destroy: true
|
10
10
|
end
|
11
11
|
|
12
|
-
class Destroyee <
|
12
|
+
class Destroyee < ActiveRecord::Base
|
13
13
|
end
|
14
14
|
|
15
15
|
context 'ActiveRecordEx::AssumeDestroy' do
|
16
|
-
setup do
|
17
|
-
@subject = AssumesDestroy.
|
18
|
-
@subject.
|
16
|
+
setup do
|
17
|
+
@subject = AssumesDestroy.create
|
18
|
+
2.times { @subject.destroyees.create }
|
19
19
|
end
|
20
20
|
|
21
21
|
context 'preconditions in ActiveRecord' do
|
22
22
|
should 'DELETE records marked for destruction' do
|
23
23
|
attrs = []
|
24
|
-
|
25
|
-
db_expects(@subject, ['SELECT `destroyees`.* FROM `destroyees` WHERE `destroyees`.`assumes_destroy_id` IS NULL AND `destroyees`.`id` IN (1, 2)', 'AssumeDestroyTest::Destroyee Load'], [{'id' => 1}, {'id' => 2}])
|
26
|
-
db_expects(@subject.destroyees, ['DELETE FROM `destroyees` WHERE `destroyees`.`id` = ?', 'SQL', [[nil, 1]]])
|
27
|
-
db_expects(@subject.destroyees, ['DELETE FROM `destroyees` WHERE `destroyees`.`id` = ?', 'SQL', [[nil, 2]]])
|
28
|
-
|
24
|
+
assert_equal @subject.destroyees.count, 2
|
29
25
|
@subject.update_attributes(destroyees_attributes: attrs)
|
26
|
+
assert_equal Destroyee.all, []
|
30
27
|
end
|
31
28
|
end
|
32
29
|
|
@@ -34,50 +31,37 @@ class AssumeDestroyTest < ActiveRecord::TestCase
|
|
34
31
|
@subject.stubs(:new_record?).returns(true)
|
35
32
|
attrs = [{name: 'one'}]
|
36
33
|
expected_attrs = [{name: 'one'}]
|
37
|
-
@subject.expects(:destroyees_attributes_without_assume=).with(expected_attrs)
|
38
|
-
|
39
|
-
# shouldn't even hit the DB
|
40
34
|
assert_no_queries { @subject.destroyees_attributes = attrs }
|
41
35
|
end
|
42
36
|
|
43
37
|
should 'mark all associations for destruction when passed an empty array' do
|
44
38
|
attrs = []
|
45
|
-
|
46
|
-
|
47
|
-
expected_attrs = [{id: 1, _destroy: true}, {id: 2, _destroy: true}]
|
39
|
+
expected_attrs = []
|
40
|
+
@subject.destroyees.each {|d| expected_attrs << {id: d.id, _destroy: true} }
|
48
41
|
@subject.expects(:destroyees_attributes_without_assume=).with(expected_attrs)
|
49
42
|
@subject.destroyees_attributes = attrs
|
50
43
|
end
|
51
44
|
|
52
45
|
should 'mark all existing associations for destruction when passed an array of just new' do
|
53
46
|
attrs = [{name: 'one'}]
|
54
|
-
|
55
|
-
|
56
|
-
expected_attrs = [{name: 'one'}, {id: 1, _destroy: true}, {id: 2, _destroy: true}]
|
47
|
+
expected_attrs = attrs.dup
|
48
|
+
@subject.destroyees.each {|d| expected_attrs << {id: d.id, _destroy: true} }
|
57
49
|
@subject.expects(:destroyees_attributes_without_assume=).with(expected_attrs)
|
58
50
|
@subject.destroyees_attributes = attrs
|
59
51
|
end
|
60
52
|
|
61
53
|
should 'not mark explicitly passed in associations for destruction' do
|
62
54
|
attrs = [{name: 'one'}, {id: 1}]
|
63
|
-
stub_association_query(@subject, '1', [{id: 2}])
|
64
|
-
|
65
55
|
expected_attrs = [{name: 'one'}, {id: 1}, {id: 2, _destroy: true}]
|
66
56
|
@subject.expects(:destroyees_attributes_without_assume=).with(expected_attrs)
|
67
57
|
@subject.destroyees_attributes = attrs
|
68
58
|
end
|
69
59
|
|
70
|
-
should 'preserve existing marks for destruction' do
|
60
|
+
should 'preserve existing marks for destruction' do
|
71
61
|
attrs = [{name: 'one'}, {id: 1, _destroy: true}]
|
72
|
-
stub_association_query(@subject, '1', [{id: 2}])
|
73
|
-
|
74
62
|
expected_attrs = [{name: 'one'}, {id: 1, _destroy: true}, {id: 2, _destroy: true}]
|
75
63
|
@subject.expects(:destroyees_attributes_without_assume=).with(expected_attrs)
|
76
64
|
@subject.destroyees_attributes = attrs
|
77
65
|
end
|
78
66
|
end
|
79
|
-
|
80
|
-
def stub_association_query(subject, id_string, id_response)
|
81
|
-
db_expects(subject, ["SELECT `destroyees`.* FROM `destroyees` WHERE `destroyees`.`assumes_destroy_id` IS NULL AND (id NOT IN (#{id_string}))", 'AssumeDestroyTest::Destroyee Load'], id_response)
|
82
|
-
end
|
83
67
|
end
|
@@ -2,7 +2,7 @@ require 'test_helper'
|
|
2
2
|
require 'active-record-ex/many_to_many'
|
3
3
|
|
4
4
|
class ManyToManyTest < ActiveSupport::TestCase
|
5
|
-
class HasManied <
|
5
|
+
class HasManied < ActiveRecord::Base
|
6
6
|
include ActiveRecordEx::ManyToMany
|
7
7
|
|
8
8
|
has_one :one
|
@@ -14,7 +14,7 @@ class ManyToManyTest < ActiveSupport::TestCase
|
|
14
14
|
|
15
15
|
singularize :ones
|
16
16
|
end
|
17
|
-
class SimpleBelongsTo <
|
17
|
+
class SimpleBelongsTo < ActiveRecord::Base
|
18
18
|
include ActiveRecordEx::ManyToMany
|
19
19
|
|
20
20
|
belongs_to :has_manied
|
@@ -22,122 +22,112 @@ class ManyToManyTest < ActiveSupport::TestCase
|
|
22
22
|
|
23
23
|
singularize :has_manieds
|
24
24
|
end
|
25
|
-
class BelongsToThrough <
|
25
|
+
class BelongsToThrough < ActiveRecord::Base
|
26
26
|
include ActiveRecordEx::ManyToMany
|
27
27
|
|
28
28
|
belongs_to :has_manied
|
29
29
|
end
|
30
|
-
class SomeClassName <
|
30
|
+
class SomeClassName < ActiveRecord::Base
|
31
31
|
include ActiveRecordEx::ManyToMany
|
32
32
|
|
33
33
|
belongs_to :some_name, class_name: 'ManyToManyTest::HasManied'
|
34
34
|
end
|
35
|
-
class ForeignKeyed <
|
35
|
+
class ForeignKeyed < ActiveRecord::Base
|
36
36
|
include ActiveRecordEx::ManyToMany
|
37
37
|
|
38
38
|
belongs_to :has_manied, foreign_key: :some_foreign_key_id
|
39
39
|
end
|
40
|
-
class Ased <
|
40
|
+
class Ased < ActiveRecord::Base
|
41
41
|
include ActiveRecordEx::ManyToMany
|
42
42
|
|
43
43
|
belongs_to :some_as, polymorphic: true, subtypes: [HasManied]
|
44
44
|
end
|
45
|
-
class One <
|
45
|
+
class One < ActiveRecord::Base
|
46
46
|
end
|
47
47
|
|
48
48
|
context 'ActiveRecord::ManyToMany' do
|
49
49
|
context '#has_one' do
|
50
|
-
setup
|
50
|
+
setup do
|
51
|
+
@has_manied = HasManied.create
|
52
|
+
@one = @has_manied.create_one
|
53
|
+
end
|
54
|
+
|
51
55
|
should 'handle the simple case correctly' do
|
52
|
-
|
53
|
-
db_expects(@arel, ['SELECT `ones`.* FROM `ones` WHERE `ones`.`has_manied_id` IN (1)', 'ManyToManyTest::One Load'])
|
54
|
-
@arel.ones.to_a
|
56
|
+
assert_equal HasManied.where('1=1').ones.to_a, [@one]
|
55
57
|
end
|
56
58
|
end
|
57
59
|
|
58
60
|
context '#has_many' do
|
59
|
-
setup
|
61
|
+
setup do
|
62
|
+
@has_manied = HasManied.create
|
63
|
+
@simple_belongs_to = @has_manied.simple_belongs_tos.create
|
64
|
+
end
|
60
65
|
|
61
66
|
should 'handle the simple case correctly' do
|
62
|
-
|
63
|
-
db_expects(@arel, ['SELECT `simple_belongs_tos`.* FROM `simple_belongs_tos` WHERE `simple_belongs_tos`.`has_manied_id` IN (1)', 'ManyToManyTest::SimpleBelongsTo Load'])
|
64
|
-
@arel.simple_belongs_tos.to_a
|
67
|
+
assert_equal HasManied.where('1=1').simple_belongs_tos.to_a, [@simple_belongs_to]
|
65
68
|
end
|
66
69
|
|
67
70
|
should 'handle the empty base case correctly' do
|
68
|
-
|
69
|
-
db_expects(@arel, ['SELECT `simple_belongs_tos`.* FROM `simple_belongs_tos` WHERE 1=0', 'ManyToManyTest::SimpleBelongsTo Load'])
|
70
|
-
@arel.none.simple_belongs_tos.to_a
|
71
|
+
assert_equal HasManied.where('1=1').none.simple_belongs_tos.to_a, []
|
71
72
|
end
|
72
73
|
|
73
74
|
should 'handle the multiple base ids case correctly' do
|
74
|
-
|
75
|
-
|
76
|
-
|
75
|
+
second_has_manied = HasManied.create
|
76
|
+
simple_belongs_to = second_has_manied.simple_belongs_tos.create
|
77
|
+
assert_equal HasManied.where('1=1').simple_belongs_tos.to_a, [@simple_belongs_to, simple_belongs_to]
|
77
78
|
end
|
78
79
|
|
79
80
|
should 'chain queries for has_many through:' do
|
80
|
-
|
81
|
-
db_expects(@arel, ['SELECT `simple_belongs_tos`.`id` FROM `simple_belongs_tos` WHERE `simple_belongs_tos`.`has_manied_id` IN (1)'], [{id: 1}])
|
82
|
-
db_expects(@arel, ['SELECT `belongs_to_throughs`.* FROM `belongs_to_throughs` WHERE `belongs_to_throughs`.`simple_belongs_to_id` IN (1)', 'ManyToManyTest::BelongsToThrough Load'])
|
81
|
+
belongs_to_through = @simple_belongs_to.belongs_to_throughs.create
|
83
82
|
|
84
|
-
|
83
|
+
assert_equal HasManied.belongs_to_throughs.to_a, [belongs_to_through]
|
85
84
|
end
|
86
85
|
|
87
86
|
should 'not N+1 has_many through:' do
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
@arel.belongs_to_throughs.to_a
|
87
|
+
assert_queries(3) do
|
88
|
+
HasManied.where('1=1').belongs_to_throughs.to_a
|
89
|
+
end
|
93
90
|
end
|
94
91
|
|
95
92
|
should 'use the class name passed in' do
|
96
|
-
|
97
|
-
|
98
|
-
@arel.class_nameds.to_a
|
93
|
+
@has_manied.class_nameds.create
|
94
|
+
assert_equal HasManied.where('1=1').class_nameds.first.class, ManyToManyTest::SomeClassName
|
99
95
|
end
|
100
96
|
|
101
97
|
should 'use the foreign key passed in' do
|
102
|
-
|
103
|
-
|
104
|
-
@arel.foreign_keyeds.to_a
|
98
|
+
foreign_keyed = @has_manied.foreign_keyeds.create
|
99
|
+
assert_equal HasManied.where('1=1').foreign_keyeds.to_a, [foreign_keyed]
|
105
100
|
end
|
106
101
|
|
107
102
|
should 'use the as passed in' do
|
108
|
-
|
109
|
-
|
110
|
-
@arel.aseds.to_a
|
103
|
+
ased = @has_manied.aseds.create
|
104
|
+
assert_equal HasManied.where('1=1').aseds.to_a, [ased]
|
111
105
|
end
|
112
106
|
end
|
113
107
|
|
114
108
|
context '#belongs_to' do
|
115
109
|
should 'handle the simple case correctly' do
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
@arel.has_manieds.to_a
|
110
|
+
has_manied = HasManied.create
|
111
|
+
sbt = has_manied.simple_belongs_tos.create
|
112
|
+
assert_equal SimpleBelongsTo.where('1=1').has_manieds.to_a, [has_manied]
|
120
113
|
end
|
121
114
|
|
122
115
|
should 'use the class name passed in' do
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
@arel.some_names.to_a
|
116
|
+
has_manied = HasManied.create
|
117
|
+
scn = SomeClassName.create(some_name_id: has_manied.id)
|
118
|
+
assert_equal SomeClassName.where('1=1').some_names.to_a, [has_manied]
|
127
119
|
end
|
128
|
-
|
120
|
+
|
129
121
|
should 'use the foreign key passed in' do
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
@arel.has_manieds.to_a
|
122
|
+
has_manied = HasManied.create
|
123
|
+
foreign_keyed = ForeignKeyed.create(has_manied: has_manied)
|
124
|
+
assert_equal ForeignKeyed.where('1=1').has_manieds.to_a, [has_manied]
|
134
125
|
end
|
135
126
|
|
136
127
|
should 'handle polymorphic belongs_to' do
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
@arel.has_manieds.to_a
|
128
|
+
has_manied = HasManied.create
|
129
|
+
ased = Ased.create(some_as: has_manied)
|
130
|
+
assert_equal Ased.where('1=1').has_manieds.to_a, [has_manied]
|
141
131
|
end
|
142
132
|
end
|
143
133
|
|
@@ -145,17 +135,15 @@ class ManyToManyTest < ActiveSupport::TestCase
|
|
145
135
|
should 'work for belongs_tos without triggering an extra query' do
|
146
136
|
@model = SimpleBelongsTo.new
|
147
137
|
@model.stubs(:has_manied_id).returns(42)
|
148
|
-
@arel = HasManied.
|
149
|
-
|
150
|
-
@model.has_manieds.to_a
|
138
|
+
@arel = HasManied.all
|
139
|
+
assert_queries(1) { @model.has_manieds.to_a }
|
151
140
|
end
|
152
141
|
|
153
142
|
should 'work for has_ones without triggering an extra query' do
|
154
143
|
@model = HasManied.new
|
155
144
|
@model.stubs(:id).returns(42)
|
156
|
-
@arel = One.
|
157
|
-
|
158
|
-
@model.ones.to_a
|
145
|
+
@arel = One.all
|
146
|
+
assert_queries(1) {@model.ones.to_a}
|
159
147
|
end
|
160
148
|
end
|
161
149
|
end
|
@@ -3,54 +3,47 @@ require 'active-record-ex/many_to_many'
|
|
3
3
|
require 'active-record-ex/nillable_find'
|
4
4
|
|
5
5
|
class NillableFindTest < ActiveSupport::TestCase
|
6
|
-
class Parent <
|
6
|
+
class Parent < ActiveRecord::Base
|
7
7
|
include ActiveRecordEx::ManyToMany
|
8
8
|
include ActiveRecordEx::NillableFind
|
9
9
|
|
10
10
|
has_many :children
|
11
11
|
end
|
12
12
|
|
13
|
-
class Child <
|
13
|
+
class Child < ActiveRecord::Base
|
14
14
|
end
|
15
15
|
|
16
16
|
context 'ActiveRecordEx::NillableFind' do
|
17
17
|
context '#nillable_find' do
|
18
|
-
setup
|
18
|
+
setup do
|
19
|
+
@parent = Parent.where('1=1')
|
20
|
+
end
|
19
21
|
# RC == relative complement
|
20
22
|
should 'request the RC of the base scope in the parent scope when just passed nil' do
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
# disjunct
|
26
|
-
db_expects(@arel, ['SELECT `children`.* FROM `children` WHERE ((1=0 OR NOT (`children`.`parent_id` IN (1, 2)) AND `children`.`foo` = \'bar\'))', 'NillableFindTest::Child Load'], [])
|
27
|
-
|
28
|
-
Parent.nillable_find([nil], Child.where(foo: 'bar')).children.all
|
23
|
+
2.times { Parent.create }
|
24
|
+
child = @parent.children.create
|
25
|
+
foo_child = @parent.children.create(foo: 'bar')
|
26
|
+
assert_equal Parent.nillable_find([nil], Child.where(foo: 'bar')).children.all, []
|
29
27
|
end
|
30
28
|
|
31
29
|
should 'request the disjunct of the RC of base scope in parent scope and all children of non-nil ids' do
|
32
30
|
# fetch IDs
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
db_expects(@arel, ['SELECT `children`.* FROM `children` WHERE ((`children`.`parent_id` IN (1) OR NOT (`children`.`parent_id` IN (1, 2)) AND `children`.`foo` = \'bar\'))', 'NillableFindTest::Child Load'], [])
|
38
|
-
|
39
|
-
Parent.nillable_find([1, nil], Child.where(foo: 'bar')).children.all
|
31
|
+
2.times { Parent.create }
|
32
|
+
parent = Parent.first
|
33
|
+
child = parent.children.create
|
34
|
+
assert_equal Parent.nillable_find([parent.id, nil], Child.where(foo: 'bar')).children.all.to_a, [child]
|
40
35
|
end
|
41
36
|
|
42
37
|
should 'request nothing when passed no an empty set of ids' do
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
Parent.nillable_find([], Child.where(foo: 'bar')).children.all
|
38
|
+
child = Child.create(foo: 'bar')
|
39
|
+
assert_equal Parent.nillable_find([], Child.where(foo: 'bar')).children.all.to_a, []
|
47
40
|
end
|
48
41
|
|
49
42
|
should 'request as a normal many-to-many when passed only normal ids' do
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
Parent.nillable_find([
|
43
|
+
parent = Parent.create
|
44
|
+
child = parent.children.create
|
45
|
+
foo_child = Child.create(foo: 'bar')
|
46
|
+
assert_equal Parent.nillable_find([parent.id], Child.where(foo: 'bar')).children.all.to_a, [child]
|
54
47
|
end
|
55
48
|
end
|
56
49
|
end
|
@@ -2,7 +2,7 @@ require 'test_helper'
|
|
2
2
|
require 'active-record-ex/polymorphic_build'
|
3
3
|
|
4
4
|
class PolymorphicBuildTest < ActiveSupport::TestCase
|
5
|
-
class PolyBase <
|
5
|
+
class PolyBase < ActiveRecord::Base
|
6
6
|
include ActiveRecordEx::PolymorphicBuild
|
7
7
|
attr_accessor :type
|
8
8
|
end
|
@@ -22,7 +22,7 @@ class PolymorphicBuildTest < ActiveSupport::TestCase
|
|
22
22
|
|
23
23
|
should 'throw an error if the passed in class is not a subclass' do
|
24
24
|
assert_raise(ArgumentError) do
|
25
|
-
PolyBase.new(type:
|
25
|
+
PolyBase.new(type: ActiveRecord::Base.to_s)
|
26
26
|
end
|
27
27
|
end
|
28
28
|
end
|
@@ -1,11 +1,11 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class RelationExtensionsTest < ActiveSupport::TestCase
|
4
|
-
class HasManied <
|
4
|
+
class HasManied < ActiveRecord::Base
|
5
5
|
has_many :belongs_tos
|
6
6
|
end
|
7
7
|
|
8
|
-
class BelongsTo <
|
8
|
+
class BelongsTo < ActiveRecord::Base
|
9
9
|
belongs_to :has_manied
|
10
10
|
attr_accessor :has_manied_id
|
11
11
|
end
|
@@ -49,13 +49,13 @@ class RelationExtensionsTest < ActiveSupport::TestCase
|
|
49
49
|
|
50
50
|
context 'by unconditional' do
|
51
51
|
should 'return nothing' do
|
52
|
-
|
52
|
+
assert_equal true, BelongsTo.unscoped.relative_complement(@hm1.belongs_tos).empty?
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
56
|
context 'of unconditional' do
|
57
57
|
should 'return all belongs_tos' do
|
58
|
-
assert_equal @hm2.belongs_tos.all, @hm1.belongs_tos.relative_complement(BelongsTo.
|
58
|
+
assert_equal @hm2.belongs_tos.all, @hm1.belongs_tos.relative_complement(BelongsTo.where('1=1'))
|
59
59
|
end
|
60
60
|
end
|
61
61
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active-record-ex
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Arjun Kavi
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2017-09-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -40,7 +40,7 @@ dependencies:
|
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
version: '0'
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
|
-
name:
|
43
|
+
name: shoulda
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
46
|
- - ">="
|
@@ -54,7 +54,7 @@ dependencies:
|
|
54
54
|
- !ruby/object:Gem::Version
|
55
55
|
version: '0'
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
|
-
name:
|
57
|
+
name: mocha
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
60
|
- - ">="
|
@@ -68,7 +68,49 @@ dependencies:
|
|
68
68
|
- !ruby/object:Gem::Version
|
69
69
|
version: '0'
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
|
-
name:
|
71
|
+
name: sqlite3
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: database_cleaner
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
type: :development
|
92
|
+
prerelease: false
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - ">="
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0'
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
name: minitest-rails
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '0'
|
105
|
+
type: :development
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - ">="
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
name: test-unit
|
72
114
|
requirement: !ruby/object:Gem::Requirement
|
73
115
|
requirements:
|
74
116
|
- - ">="
|
@@ -85,28 +127,28 @@ dependencies:
|
|
85
127
|
name: activesupport
|
86
128
|
requirement: !ruby/object:Gem::Requirement
|
87
129
|
requirements:
|
88
|
-
- - "
|
130
|
+
- - ">="
|
89
131
|
- !ruby/object:Gem::Version
|
90
132
|
version: '3.2'
|
91
133
|
type: :runtime
|
92
134
|
prerelease: false
|
93
135
|
version_requirements: !ruby/object:Gem::Requirement
|
94
136
|
requirements:
|
95
|
-
- - "
|
137
|
+
- - ">="
|
96
138
|
- !ruby/object:Gem::Version
|
97
139
|
version: '3.2'
|
98
140
|
- !ruby/object:Gem::Dependency
|
99
141
|
name: activerecord
|
100
142
|
requirement: !ruby/object:Gem::Requirement
|
101
143
|
requirements:
|
102
|
-
- - "
|
144
|
+
- - ">="
|
103
145
|
- !ruby/object:Gem::Version
|
104
146
|
version: '3.2'
|
105
147
|
type: :runtime
|
106
148
|
prerelease: false
|
107
149
|
version_requirements: !ruby/object:Gem::Requirement
|
108
150
|
requirements:
|
109
|
-
- - "
|
151
|
+
- - ">="
|
110
152
|
- !ruby/object:Gem::Version
|
111
153
|
version: '3.2'
|
112
154
|
description: A library to make ActiveRecord::Relations even more awesome
|
@@ -133,6 +175,7 @@ files:
|
|
133
175
|
- lib/active-record-ex/polymorphic_build.rb
|
134
176
|
- lib/active-record-ex/relation_extensions.rb
|
135
177
|
- lib/active-record-ex/version.rb
|
178
|
+
- test/schema.rb
|
136
179
|
- test/test_helper.rb
|
137
180
|
- test/unit/assoc_ordering_test.rb
|
138
181
|
- test/unit/assume_destroy_test.rb
|
@@ -160,11 +203,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
160
203
|
version: '0'
|
161
204
|
requirements: []
|
162
205
|
rubyforge_project:
|
163
|
-
rubygems_version: 2.
|
206
|
+
rubygems_version: 2.5.1
|
164
207
|
signing_key:
|
165
208
|
specification_version: 4
|
166
209
|
summary: Relation -> Relation methods
|
167
210
|
test_files:
|
211
|
+
- test/schema.rb
|
168
212
|
- test/test_helper.rb
|
169
213
|
- test/unit/assoc_ordering_test.rb
|
170
214
|
- test/unit/assume_destroy_test.rb
|