deferring 0.5.0 → 0.7.1

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
- SHA1:
3
- metadata.gz: 81a9e2bd6deea9d8b3fc5ea29b2633f9cfafaee5
4
- data.tar.gz: 3e4749cb1645b4278631ded639460f30ff099246
2
+ SHA256:
3
+ metadata.gz: 14441d2a2db2d40728af34eb27b47b4da1c7961a716be04a10019468298f7cfc
4
+ data.tar.gz: ddef46c10b1d7fd9f6e44a1f2e5507937c85e42af8424bc8f2d5d96e156de96a
5
5
  SHA512:
6
- metadata.gz: 3d1481294966a71e02d5a2eeba4b63f38a998039d79956760c6c6fb95a7ef4a1f0fd2fc216ad503ad4b1cd5d56f4464028223ab3cd30e25d93e01b43f666d609
7
- data.tar.gz: 4dd94104c28016dc7b216b3a486c28e692da0d59f2be56fc5499a2f858aa0a7e76da4457ac8930ed8d664f6dd3ac45ffc7401664978d6b623f30e85305f3cb17
6
+ metadata.gz: 54eedbbfc6be7e60b517e38a94c1b0b248dd55e52ef90036ea17e4148c92ccf0b37ed153732e28601368704a238ec8dc9178cf7eacf3cacf3af180306bf6a0a4
7
+ data.tar.gz: 4c2f00b244eb1cab289353e5abcb46cdd48e58e656c83dbc5316af84ad826fb20d0974acd57ff5e90e78656044ce0cb800c9f84e87fc4bd8a36065433b0b01b8
@@ -1,17 +1,26 @@
1
1
  language: ruby
2
2
 
3
3
  rvm:
4
- - 2.3.7
5
- - 2.4.4
6
- - 2.5.1
7
- - ruby-head
4
+ - 2.3.8
5
+ - 2.4.6
6
+ - 2.5.5
7
+ - 2.6.3
8
+ - 2.7.1
8
9
 
9
10
  gemfile:
10
11
  - gemfiles/rails_42.gemfile
11
12
  - gemfiles/rails_50.gemfile
12
13
  - gemfiles/rails_51.gemfile
13
14
  - gemfiles/rails_52.gemfile
15
+ - gemfiles/rails_60.gemfile
14
16
 
15
17
  sudo: false
16
18
 
17
19
  script: 'bundle exec rake'
20
+
21
+ matrix:
22
+ exclude:
23
+ - rvm: 2.3.8
24
+ gemfile: gemfiles/rails_60.gemfile
25
+ - rvm: 2.4.6
26
+ gemfile: gemfiles/rails_60.gemfile
data/Appraisals CHANGED
@@ -1,15 +1,24 @@
1
1
  appraise 'rails-42' do
2
- gem 'activerecord', '4.2.10'
2
+ gem 'activerecord', '4.2.11.3'
3
+ gem 'sqlite3', '~> 1.3.6'
3
4
  end
4
5
 
5
6
  appraise 'rails-50' do
6
- gem 'activerecord', '5.0.7'
7
+ gem 'activerecord', '5.0.7.2'
8
+ gem 'sqlite3', '~> 1.3.6'
7
9
  end
8
10
 
9
11
  appraise 'rails-51' do
10
- gem 'activerecord', '5.1.6'
12
+ gem 'activerecord', '5.1.7'
13
+ gem 'sqlite3'
11
14
  end
12
15
 
13
16
  appraise 'rails-52' do
14
- gem 'activerecord', '5.2.0'
17
+ gem 'activerecord', '5.2.4.3'
18
+ gem 'sqlite3'
19
+ end
20
+
21
+ appraise 'rails-60' do
22
+ gem 'activerecord', '6.0.3.2'
23
+ gem 'sqlite3'
15
24
  end
@@ -1,4 +1,4 @@
1
- Copyright (c) 2018 Robin Roestenburg
1
+ Copyright (c) 2019 Robin Roestenburg
2
2
 
3
3
  MIT License
4
4
 
@@ -20,11 +20,10 @@ Gem::Specification.new do |spec|
20
20
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
21
21
  spec.require_paths = ['lib']
22
22
 
23
- spec.add_dependency 'activerecord', ['>= 4.2', '< 5.3']
23
+ spec.add_dependency 'activerecord', ['>= 4.2']
24
24
 
25
25
  spec.add_development_dependency 'bundler', '~> 1.3'
26
26
  spec.add_development_dependency 'rake'
27
27
  spec.add_development_dependency 'rspec'
28
- spec.add_development_dependency 'sqlite3'
29
28
  spec.add_development_dependency 'appraisal'
30
29
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "activerecord", "4.2.10"
5
+ gem "activerecord", "4.2.11.3"
6
+ gem "sqlite3", "~> 1.3.6"
6
7
 
7
- gemspec :path => "../"
8
+ gemspec path: "../"
@@ -1,66 +1,66 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- deferring (0.5.0)
5
- activerecord (>= 4.2, < 5.3)
4
+ deferring (0.7.0)
5
+ activerecord (>= 4.2)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- activemodel (4.2.10)
11
- activesupport (= 4.2.10)
10
+ activemodel (4.2.11.3)
11
+ activesupport (= 4.2.11.3)
12
12
  builder (~> 3.1)
13
- activerecord (4.2.10)
14
- activemodel (= 4.2.10)
15
- activesupport (= 4.2.10)
13
+ activerecord (4.2.11.3)
14
+ activemodel (= 4.2.11.3)
15
+ activesupport (= 4.2.11.3)
16
16
  arel (~> 6.0)
17
- activesupport (4.2.10)
17
+ activesupport (4.2.11.3)
18
18
  i18n (~> 0.7)
19
19
  minitest (~> 5.1)
20
20
  thread_safe (~> 0.3, >= 0.3.4)
21
21
  tzinfo (~> 1.1)
22
- appraisal (2.2.0)
22
+ appraisal (2.3.0)
23
23
  bundler
24
24
  rake
25
25
  thor (>= 0.14.0)
26
26
  arel (6.0.4)
27
- builder (3.2.3)
28
- concurrent-ruby (1.0.5)
29
- diff-lcs (1.3)
27
+ builder (3.2.4)
28
+ concurrent-ruby (1.1.6)
29
+ diff-lcs (1.4.4)
30
30
  i18n (0.9.5)
31
31
  concurrent-ruby (~> 1.0)
32
- minitest (5.11.3)
33
- rake (12.3.1)
34
- rspec (3.7.0)
35
- rspec-core (~> 3.7.0)
36
- rspec-expectations (~> 3.7.0)
37
- rspec-mocks (~> 3.7.0)
38
- rspec-core (3.7.1)
39
- rspec-support (~> 3.7.0)
40
- rspec-expectations (3.7.0)
32
+ minitest (5.14.1)
33
+ rake (13.0.1)
34
+ rspec (3.9.0)
35
+ rspec-core (~> 3.9.0)
36
+ rspec-expectations (~> 3.9.0)
37
+ rspec-mocks (~> 3.9.0)
38
+ rspec-core (3.9.2)
39
+ rspec-support (~> 3.9.3)
40
+ rspec-expectations (3.9.2)
41
41
  diff-lcs (>= 1.2.0, < 2.0)
42
- rspec-support (~> 3.7.0)
43
- rspec-mocks (3.7.0)
42
+ rspec-support (~> 3.9.0)
43
+ rspec-mocks (3.9.1)
44
44
  diff-lcs (>= 1.2.0, < 2.0)
45
- rspec-support (~> 3.7.0)
46
- rspec-support (3.7.1)
45
+ rspec-support (~> 3.9.0)
46
+ rspec-support (3.9.3)
47
47
  sqlite3 (1.3.13)
48
- thor (0.20.0)
48
+ thor (1.0.1)
49
49
  thread_safe (0.3.6)
50
- tzinfo (1.2.5)
50
+ tzinfo (1.2.7)
51
51
  thread_safe (~> 0.1)
52
52
 
53
53
  PLATFORMS
54
54
  ruby
55
55
 
56
56
  DEPENDENCIES
57
- activerecord (= 4.2.10)
57
+ activerecord (= 4.2.11.3)
58
58
  appraisal
59
59
  bundler (~> 1.3)
60
60
  deferring!
61
61
  rake
62
62
  rspec
63
- sqlite3
63
+ sqlite3 (~> 1.3.6)
64
64
 
65
65
  BUNDLED WITH
66
- 1.16.2
66
+ 1.17.3
@@ -2,6 +2,7 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "activerecord", "5.0.7"
5
+ gem "activerecord", "5.0.7.2"
6
+ gem "sqlite3", "~> 1.3.6"
6
7
 
7
- gemspec :path => "../"
8
+ gemspec path: "../"
@@ -1,64 +1,64 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- deferring (0.5.0)
5
- activerecord (>= 4.2, < 5.3)
4
+ deferring (0.7.0)
5
+ activerecord (>= 4.2)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- activemodel (5.0.7)
11
- activesupport (= 5.0.7)
12
- activerecord (5.0.7)
13
- activemodel (= 5.0.7)
14
- activesupport (= 5.0.7)
10
+ activemodel (5.0.7.2)
11
+ activesupport (= 5.0.7.2)
12
+ activerecord (5.0.7.2)
13
+ activemodel (= 5.0.7.2)
14
+ activesupport (= 5.0.7.2)
15
15
  arel (~> 7.0)
16
- activesupport (5.0.7)
16
+ activesupport (5.0.7.2)
17
17
  concurrent-ruby (~> 1.0, >= 1.0.2)
18
18
  i18n (>= 0.7, < 2)
19
19
  minitest (~> 5.1)
20
20
  tzinfo (~> 1.1)
21
- appraisal (2.2.0)
21
+ appraisal (2.3.0)
22
22
  bundler
23
23
  rake
24
24
  thor (>= 0.14.0)
25
25
  arel (7.1.4)
26
- concurrent-ruby (1.0.5)
27
- diff-lcs (1.3)
28
- i18n (1.0.1)
26
+ concurrent-ruby (1.1.6)
27
+ diff-lcs (1.4.4)
28
+ i18n (1.8.3)
29
29
  concurrent-ruby (~> 1.0)
30
- minitest (5.11.3)
31
- rake (12.3.1)
32
- rspec (3.7.0)
33
- rspec-core (~> 3.7.0)
34
- rspec-expectations (~> 3.7.0)
35
- rspec-mocks (~> 3.7.0)
36
- rspec-core (3.7.1)
37
- rspec-support (~> 3.7.0)
38
- rspec-expectations (3.7.0)
30
+ minitest (5.14.1)
31
+ rake (13.0.1)
32
+ rspec (3.9.0)
33
+ rspec-core (~> 3.9.0)
34
+ rspec-expectations (~> 3.9.0)
35
+ rspec-mocks (~> 3.9.0)
36
+ rspec-core (3.9.2)
37
+ rspec-support (~> 3.9.3)
38
+ rspec-expectations (3.9.2)
39
39
  diff-lcs (>= 1.2.0, < 2.0)
40
- rspec-support (~> 3.7.0)
41
- rspec-mocks (3.7.0)
40
+ rspec-support (~> 3.9.0)
41
+ rspec-mocks (3.9.1)
42
42
  diff-lcs (>= 1.2.0, < 2.0)
43
- rspec-support (~> 3.7.0)
44
- rspec-support (3.7.1)
43
+ rspec-support (~> 3.9.0)
44
+ rspec-support (3.9.3)
45
45
  sqlite3 (1.3.13)
46
- thor (0.20.0)
46
+ thor (1.0.1)
47
47
  thread_safe (0.3.6)
48
- tzinfo (1.2.5)
48
+ tzinfo (1.2.7)
49
49
  thread_safe (~> 0.1)
50
50
 
51
51
  PLATFORMS
52
52
  ruby
53
53
 
54
54
  DEPENDENCIES
55
- activerecord (= 5.0.7)
55
+ activerecord (= 5.0.7.2)
56
56
  appraisal
57
57
  bundler (~> 1.3)
58
58
  deferring!
59
59
  rake
60
60
  rspec
61
- sqlite3
61
+ sqlite3 (~> 1.3.6)
62
62
 
63
63
  BUNDLED WITH
64
- 1.16.2
64
+ 1.17.3
@@ -2,6 +2,7 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "activerecord", "5.1.6"
5
+ gem "activerecord", "5.1.7"
6
+ gem "sqlite3"
6
7
 
7
- gemspec :path => "../"
8
+ gemspec path: "../"
@@ -1,58 +1,58 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- deferring (0.5.0)
5
- activerecord (>= 4.2, < 5.3)
4
+ deferring (0.7.0)
5
+ activerecord (>= 4.2)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- activemodel (5.1.6)
11
- activesupport (= 5.1.6)
12
- activerecord (5.1.6)
13
- activemodel (= 5.1.6)
14
- activesupport (= 5.1.6)
10
+ activemodel (5.1.7)
11
+ activesupport (= 5.1.7)
12
+ activerecord (5.1.7)
13
+ activemodel (= 5.1.7)
14
+ activesupport (= 5.1.7)
15
15
  arel (~> 8.0)
16
- activesupport (5.1.6)
16
+ activesupport (5.1.7)
17
17
  concurrent-ruby (~> 1.0, >= 1.0.2)
18
18
  i18n (>= 0.7, < 2)
19
19
  minitest (~> 5.1)
20
20
  tzinfo (~> 1.1)
21
- appraisal (2.2.0)
21
+ appraisal (2.3.0)
22
22
  bundler
23
23
  rake
24
24
  thor (>= 0.14.0)
25
25
  arel (8.0.0)
26
- concurrent-ruby (1.0.5)
27
- diff-lcs (1.3)
28
- i18n (1.0.1)
26
+ concurrent-ruby (1.1.6)
27
+ diff-lcs (1.4.4)
28
+ i18n (1.8.3)
29
29
  concurrent-ruby (~> 1.0)
30
- minitest (5.11.3)
31
- rake (12.3.1)
32
- rspec (3.7.0)
33
- rspec-core (~> 3.7.0)
34
- rspec-expectations (~> 3.7.0)
35
- rspec-mocks (~> 3.7.0)
36
- rspec-core (3.7.1)
37
- rspec-support (~> 3.7.0)
38
- rspec-expectations (3.7.0)
30
+ minitest (5.14.1)
31
+ rake (13.0.1)
32
+ rspec (3.9.0)
33
+ rspec-core (~> 3.9.0)
34
+ rspec-expectations (~> 3.9.0)
35
+ rspec-mocks (~> 3.9.0)
36
+ rspec-core (3.9.2)
37
+ rspec-support (~> 3.9.3)
38
+ rspec-expectations (3.9.2)
39
39
  diff-lcs (>= 1.2.0, < 2.0)
40
- rspec-support (~> 3.7.0)
41
- rspec-mocks (3.7.0)
40
+ rspec-support (~> 3.9.0)
41
+ rspec-mocks (3.9.1)
42
42
  diff-lcs (>= 1.2.0, < 2.0)
43
- rspec-support (~> 3.7.0)
44
- rspec-support (3.7.1)
45
- sqlite3 (1.3.13)
46
- thor (0.20.0)
43
+ rspec-support (~> 3.9.0)
44
+ rspec-support (3.9.3)
45
+ sqlite3 (1.4.2)
46
+ thor (1.0.1)
47
47
  thread_safe (0.3.6)
48
- tzinfo (1.2.5)
48
+ tzinfo (1.2.7)
49
49
  thread_safe (~> 0.1)
50
50
 
51
51
  PLATFORMS
52
52
  ruby
53
53
 
54
54
  DEPENDENCIES
55
- activerecord (= 5.1.6)
55
+ activerecord (= 5.1.7)
56
56
  appraisal
57
57
  bundler (~> 1.3)
58
58
  deferring!
@@ -61,4 +61,4 @@ DEPENDENCIES
61
61
  sqlite3
62
62
 
63
63
  BUNDLED WITH
64
- 1.16.2
64
+ 1.17.3
@@ -2,6 +2,7 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "activerecord", "5.2.0"
5
+ gem "activerecord", "5.2.4.3"
6
+ gem "sqlite3"
6
7
 
7
- gemspec :path => "../"
8
+ gemspec path: "../"
@@ -1,58 +1,58 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- deferring (0.5.0)
5
- activerecord (>= 4.2, < 5.3)
4
+ deferring (0.7.0)
5
+ activerecord (>= 4.2)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- activemodel (5.2.0)
11
- activesupport (= 5.2.0)
12
- activerecord (5.2.0)
13
- activemodel (= 5.2.0)
14
- activesupport (= 5.2.0)
10
+ activemodel (5.2.4.3)
11
+ activesupport (= 5.2.4.3)
12
+ activerecord (5.2.4.3)
13
+ activemodel (= 5.2.4.3)
14
+ activesupport (= 5.2.4.3)
15
15
  arel (>= 9.0)
16
- activesupport (5.2.0)
16
+ activesupport (5.2.4.3)
17
17
  concurrent-ruby (~> 1.0, >= 1.0.2)
18
18
  i18n (>= 0.7, < 2)
19
19
  minitest (~> 5.1)
20
20
  tzinfo (~> 1.1)
21
- appraisal (2.2.0)
21
+ appraisal (2.3.0)
22
22
  bundler
23
23
  rake
24
24
  thor (>= 0.14.0)
25
25
  arel (9.0.0)
26
- concurrent-ruby (1.0.5)
27
- diff-lcs (1.3)
28
- i18n (1.0.1)
26
+ concurrent-ruby (1.1.6)
27
+ diff-lcs (1.4.4)
28
+ i18n (1.8.3)
29
29
  concurrent-ruby (~> 1.0)
30
- minitest (5.11.3)
31
- rake (12.3.1)
32
- rspec (3.7.0)
33
- rspec-core (~> 3.7.0)
34
- rspec-expectations (~> 3.7.0)
35
- rspec-mocks (~> 3.7.0)
36
- rspec-core (3.7.1)
37
- rspec-support (~> 3.7.0)
38
- rspec-expectations (3.7.0)
30
+ minitest (5.14.1)
31
+ rake (13.0.1)
32
+ rspec (3.9.0)
33
+ rspec-core (~> 3.9.0)
34
+ rspec-expectations (~> 3.9.0)
35
+ rspec-mocks (~> 3.9.0)
36
+ rspec-core (3.9.2)
37
+ rspec-support (~> 3.9.3)
38
+ rspec-expectations (3.9.2)
39
39
  diff-lcs (>= 1.2.0, < 2.0)
40
- rspec-support (~> 3.7.0)
41
- rspec-mocks (3.7.0)
40
+ rspec-support (~> 3.9.0)
41
+ rspec-mocks (3.9.1)
42
42
  diff-lcs (>= 1.2.0, < 2.0)
43
- rspec-support (~> 3.7.0)
44
- rspec-support (3.7.1)
45
- sqlite3 (1.3.13)
46
- thor (0.20.0)
43
+ rspec-support (~> 3.9.0)
44
+ rspec-support (3.9.3)
45
+ sqlite3 (1.4.2)
46
+ thor (1.0.1)
47
47
  thread_safe (0.3.6)
48
- tzinfo (1.2.5)
48
+ tzinfo (1.2.7)
49
49
  thread_safe (~> 0.1)
50
50
 
51
51
  PLATFORMS
52
52
  ruby
53
53
 
54
54
  DEPENDENCIES
55
- activerecord (= 5.2.0)
55
+ activerecord (= 5.2.4.3)
56
56
  appraisal
57
57
  bundler (~> 1.3)
58
58
  deferring!
@@ -61,4 +61,4 @@ DEPENDENCIES
61
61
  sqlite3
62
62
 
63
63
  BUNDLED WITH
64
- 1.16.2
64
+ 1.17.3
@@ -0,0 +1,8 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activerecord", "6.0.3.2"
6
+ gem "sqlite3"
7
+
8
+ gemspec path: "../"
@@ -0,0 +1,64 @@
1
+ PATH
2
+ remote: ..
3
+ specs:
4
+ deferring (0.7.0)
5
+ activerecord (>= 4.2)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ activemodel (6.0.3.2)
11
+ activesupport (= 6.0.3.2)
12
+ activerecord (6.0.3.2)
13
+ activemodel (= 6.0.3.2)
14
+ activesupport (= 6.0.3.2)
15
+ activesupport (6.0.3.2)
16
+ concurrent-ruby (~> 1.0, >= 1.0.2)
17
+ i18n (>= 0.7, < 2)
18
+ minitest (~> 5.1)
19
+ tzinfo (~> 1.1)
20
+ zeitwerk (~> 2.2, >= 2.2.2)
21
+ appraisal (2.3.0)
22
+ bundler
23
+ rake
24
+ thor (>= 0.14.0)
25
+ concurrent-ruby (1.1.6)
26
+ diff-lcs (1.4.4)
27
+ i18n (1.8.3)
28
+ concurrent-ruby (~> 1.0)
29
+ minitest (5.14.1)
30
+ rake (13.0.1)
31
+ rspec (3.9.0)
32
+ rspec-core (~> 3.9.0)
33
+ rspec-expectations (~> 3.9.0)
34
+ rspec-mocks (~> 3.9.0)
35
+ rspec-core (3.9.2)
36
+ rspec-support (~> 3.9.3)
37
+ rspec-expectations (3.9.2)
38
+ diff-lcs (>= 1.2.0, < 2.0)
39
+ rspec-support (~> 3.9.0)
40
+ rspec-mocks (3.9.1)
41
+ diff-lcs (>= 1.2.0, < 2.0)
42
+ rspec-support (~> 3.9.0)
43
+ rspec-support (3.9.3)
44
+ sqlite3 (1.4.2)
45
+ thor (1.0.1)
46
+ thread_safe (0.3.6)
47
+ tzinfo (1.2.7)
48
+ thread_safe (~> 0.1)
49
+ zeitwerk (2.3.1)
50
+
51
+ PLATFORMS
52
+ ruby
53
+
54
+ DEPENDENCIES
55
+ activerecord (= 6.0.3.2)
56
+ appraisal
57
+ bundler (~> 1.3)
58
+ deferring!
59
+ rake
60
+ rspec
61
+ sqlite3
62
+
63
+ BUNDLED WITH
64
+ 1.17.3
@@ -26,14 +26,14 @@ module Deferring
26
26
  alias_method :pretty_inspect, :inspect
27
27
 
28
28
  delegate :to_s, :to_a, :inspect, :==, # methods undefined by SimpleDelegator
29
- :is_a?, :as_json, to: :objects
29
+ :as_json, to: :objects
30
30
 
31
31
  def each(&block)
32
32
  objects.each(&block)
33
33
  end
34
34
 
35
35
  # TODO: Add explanation about :first/:last loaded? problem.
36
- [:first, :last].each do |method|
36
+ [:first, :last, :empty?, :size].each do |method|
37
37
  define_method method do
38
38
  unless objects_loaded?
39
39
  original_association.send(method)
@@ -46,7 +46,8 @@ module Deferring
46
46
  # Delegates methods from Ruby's Array module to the object in the deferred
47
47
  # association.
48
48
  delegate :[]=, :[], :clear, :select!, :reject!, :flatten, :flatten!, :sort!,
49
- :keep_if, :delete_if, :sort_by!, :empty?, :size, :length,
49
+ :keep_if, :delete_if, :sort_by!, :length,
50
+ :each_index,
50
51
  to: :objects
51
52
 
52
53
  # Delegates Ruby's Enumerable#find method to the original association.
@@ -57,6 +58,18 @@ module Deferring
57
58
  original_association.find(*args)
58
59
  end
59
60
 
61
+ # Delegates Ruby's Enumerable#count method to the original association.
62
+ #
63
+ # The delegation has to be explicit in this case, because the inclusion of
64
+ # Enumerable also defines the count-method on DeferredAssociation.
65
+ def count(*args, &block)
66
+ if block_given?
67
+ objects.count(*args, &block)
68
+ else
69
+ original_association.count(*args)
70
+ end
71
+ end
72
+
60
73
  # Delegates Ruby's Enumerable#select method to the original association when
61
74
  # no block has been given. Rails' select-method does not accept a block, so
62
75
  # we know that in that case the select-method has to be called on our
@@ -64,9 +77,9 @@ module Deferring
64
77
  #
65
78
  # The delegation has to be explicit in this case, because the inclusion of
66
79
  # Enumerable also defines the select-method on DeferredAssociation.
67
- def select(value = Proc.new)
80
+ def select(value = nil, &block)
68
81
  if block_given?
69
- objects.select { |*block_args| value.call(*block_args) }
82
+ objects.select { |*block_args| block.call(*block_args) }
70
83
  else
71
84
  original_association.select(value)
72
85
  end
@@ -131,7 +144,7 @@ module Deferring
131
144
  def destroy(*records)
132
145
  records.flatten.compact.uniq.each do |record|
133
146
  record = record.to_i if record.is_a? String
134
- record = objects.detect { |o| o.id == record } if record.is_a? Fixnum
147
+ record = objects.detect { |o| o.id == record } if record.is_a? Integer
135
148
 
136
149
  run_deferring_callbacks(:unlink, record) {
137
150
  objects.delete(record)
@@ -1,3 +1,3 @@
1
1
  module Deferring
2
- VERSION = '0.5.0'
2
+ VERSION = '0.7.1'
3
3
  end
@@ -377,6 +377,19 @@ RSpec.describe 'deferred has_and_belongs_to_many associations' do
377
377
  end
378
378
  end
379
379
 
380
+ describe 'supports methods from Ruby Array' do
381
+ describe '#each_index' do
382
+ it 'returns the index of each element in the association' do
383
+ bob.teams << dba << support
384
+ bob.save!
385
+
386
+ result = []
387
+ bob.teams.each_index { |i| result << i }
388
+ expect(result).to eq([0, 1])
389
+ end
390
+ end
391
+ end
392
+
380
393
  describe 'enumerable methods that conflict with ActiveRecord' do
381
394
  describe '#select' do
382
395
  before do
@@ -359,6 +359,63 @@ RSpec.describe 'deferred has_many associations' do
359
359
  people = Person.all
360
360
  expect(people[1].issues.loaded?).to be_falsey
361
361
  end
362
+
363
+ describe 'count' do
364
+ it 'should not load the association' do
365
+ person = Person.where(name: 'Bob').first
366
+ expect(person.issues.count).to eq(2)
367
+ expect(person.issues.loaded?).to be_falsey
368
+ end
369
+
370
+ it 'should execute a count(*) query, even if the association has already been loaded' do
371
+ person = Person.where(name: 'Bob').first
372
+ expect { person.issues.count }.to query(1) { |sql| expect(sql).to include('SELECT COUNT(*) FROM "issues"') }
373
+ expect { person.issues.to_a }.to query(1)
374
+ expect(person.issues.loaded?).to be_truthy
375
+ expect { person.issues.to_a }.to query(0)
376
+ expect { person.issues.count }.to query(1) { |sql| expect(sql).to include('SELECT COUNT(*) FROM "issues"') }
377
+ end
378
+
379
+ it 'should execute count with a block' do
380
+ person = Person.where(name: 'Bob').first
381
+ expect(person.issues.count { |i| i.subject.start_with?('Printer') }).to eq(1)
382
+ end
383
+ end
384
+
385
+ describe 'size' do
386
+ it 'should not load the association' do
387
+ person = Person.where(name: 'Bob').first
388
+ expect(person.issues.size).to eq(2)
389
+ expect { person.issues.size }.to query(1) { |sql| expect(sql).to include('SELECT COUNT(*) FROM "issues"') }
390
+ expect(person.issues.loaded?).to be_falsey
391
+ end
392
+
393
+ it 'should not execute query when the association has already been loaded' do
394
+ person = Person.where(name: 'Bob').first
395
+ expect { person.issues.size }.to query(1) { |sql| expect(sql).to include('SELECT COUNT(*) FROM "issues"') }
396
+ expect { person.issues.to_a }.to query(1)
397
+ expect(person.issues.loaded?).to be_truthy
398
+ expect { person.issues.to_a }.to query(0)
399
+ expect { person.issues.size }.to query(0)
400
+ end
401
+ end
402
+
403
+ describe 'empty?' do
404
+ it 'should not load the association' do
405
+ person = Person.where(name: 'Bob').first
406
+ expect(person.issues.empty?).to be_falsey
407
+ expect(person.issues.loaded?).to be_falsey
408
+ end
409
+
410
+ it 'should not execute query when the association has already been loaded' do
411
+ person = Person.where(name: 'Bob').first
412
+ expect { person.issues.empty? }.to query(1) { |sql| expect(sql).to include('SELECT 1') }
413
+ expect { person.issues.to_a }.to query(1)
414
+ expect(person.issues.loaded?).to be_truthy
415
+ expect { person.issues.to_a }.to query(0)
416
+ expect { person.issues.empty? }.to query(0)
417
+ end
418
+ end
362
419
  end # preloading associations
363
420
 
364
421
  describe 'active record api' do
@@ -5,6 +5,7 @@ require 'support/models/team'
5
5
  require 'support/models/issue'
6
6
  require 'support/models/address'
7
7
  require 'support/models/non_validated_issue'
8
+ require 'support/matchers/query_matcher'
8
9
 
9
10
  RSpec.configure do |config|
10
11
  config.disable_monkey_patching!
@@ -18,6 +19,8 @@ RSpec.configure do |config|
18
19
  # --seed 1234
19
20
  config.order = 'random'
20
21
 
22
+ config.include(Deferring::Matchers)
23
+
21
24
  # Rollback all the database changes after each spec, poor man's
22
25
  # DatabaseCleaner :-)
23
26
  config.around do |example|
@@ -0,0 +1,127 @@
1
+ module Deferring
2
+ module Matchers
3
+
4
+ class ArQuery #:nodoc:
5
+ cattr_accessor :executed
6
+
7
+ @@recording_queries = false
8
+ def self.recording_queries?
9
+ @@recording_queries
10
+ end
11
+
12
+ def initialize(expected, &block)
13
+ @expected = expected
14
+ @block = block
15
+ end
16
+
17
+ def matches?(given_proc)
18
+ @eval_block = false
19
+ @eval_error = nil
20
+ ArQuery.executed = []
21
+ @@recording_queries = true
22
+
23
+ given_proc.call
24
+
25
+ if @expected.is_a?(Integer)
26
+ @actual = ArQuery.executed.length
27
+ @matched = @actual == @expected
28
+ else
29
+ @actual = ArQuery.executed.detect { |sql| @expected === sql }
30
+ @matched = !@actual.nil?
31
+ end
32
+
33
+ eval_block if @block && @matched && !negative_expectation?
34
+
35
+ ensure
36
+ ArQuery.executed = nil
37
+ @@recording_queries = false
38
+ return @matched && @eval_error.nil?
39
+ end
40
+
41
+ def eval_block
42
+ @eval_block = true
43
+ begin
44
+ @block[ArQuery.executed]
45
+ rescue => err
46
+ @eval_error = err
47
+ end
48
+ end
49
+
50
+ def supports_block_expectations?
51
+ true
52
+ end
53
+
54
+ def failure_message
55
+ if @eval_error
56
+ @eval_error.message
57
+ elsif @expected.is_a?(Integer)
58
+ "expected #{@expected}, got #{@actual}"
59
+ else
60
+ "expected to execute a query with pattern #{@expected.inspect}, but it wasn't"
61
+ end
62
+ end
63
+
64
+ def failure_message_when_negated
65
+ if @expected.is_a?(Integer)
66
+ "did not expect #{@expected}"
67
+ else
68
+ "did not expect to execute a query with pattern #{@expected.inspect}, but it was executed"
69
+ end
70
+ end
71
+
72
+ def description
73
+ if @expected.is_a?(Integer)
74
+ @expected == 1 ? 'execute 1 query' : "execute #{@expected} queries"
75
+ else
76
+ "execute query with pattern #{@expected.inspect}"
77
+ end
78
+ end
79
+
80
+ def negative_expectation?
81
+ @negative_expectation ||= !caller.first(3).find { |s| s =~ /should_not/ }.nil?
82
+ end
83
+ end
84
+
85
+ def query(expected = 1, &block)
86
+ ArQuery.new(expected, &block)
87
+ end
88
+ end
89
+ end
90
+
91
+ # For Rails 6.0
92
+ module ActiveRecord
93
+ module ConnectionAdapters
94
+ module SQLite3
95
+ module DatabaseStatements
96
+ [:exec_query, :exec, :execute].each do |method|
97
+ if respond_to?(method)
98
+ define_method("#{method}_with_query_record") do |sql, *args|
99
+ Deferring::Matchers::ArQuery.executed << sql if Deferring::Matchers::ArQuery.recording_queries?
100
+ send("#{method}_without_query_record", sql, *args)
101
+ end
102
+
103
+ alias_method :"#{method}_without_query_record", method
104
+ alias_method method, :"#{method}_with_query_record"
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
111
+
112
+ # For previous versions of Rails
113
+ module ActiveRecord
114
+ module ConnectionAdapters
115
+ class SQLite3Adapter
116
+ [:exec_query, :exec, :execute].each do |method|
117
+ define_method("#{method}_with_query_record") do |sql, *args|
118
+ Deferring::Matchers::ArQuery.executed << sql if Deferring::Matchers::ArQuery.recording_queries?
119
+ send("#{method}_without_query_record", sql, *args)
120
+ end
121
+
122
+ alias_method :"#{method}_without_query_record", method
123
+ alias_method method, :"#{method}_with_query_record"
124
+ end
125
+ end
126
+ end
127
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: deferring
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robin Roestenburg
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-07-09 00:00:00.000000000 Z
11
+ date: 2020-10-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -17,9 +17,6 @@ dependencies:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '4.2'
20
- - - "<"
21
- - !ruby/object:Gem::Version
22
- version: '5.3'
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
@@ -27,9 +24,6 @@ dependencies:
27
24
  - - ">="
28
25
  - !ruby/object:Gem::Version
29
26
  version: '4.2'
30
- - - "<"
31
- - !ruby/object:Gem::Version
32
- version: '5.3'
33
27
  - !ruby/object:Gem::Dependency
34
28
  name: bundler
35
29
  requirement: !ruby/object:Gem::Requirement
@@ -72,20 +66,6 @@ dependencies:
72
66
  - - ">="
73
67
  - !ruby/object:Gem::Version
74
68
  version: '0'
75
- - !ruby/object:Gem::Dependency
76
- name: sqlite3
77
- requirement: !ruby/object:Gem::Requirement
78
- requirements:
79
- - - ">="
80
- - !ruby/object:Gem::Version
81
- version: '0'
82
- type: :development
83
- prerelease: false
84
- version_requirements: !ruby/object:Gem::Requirement
85
- requirements:
86
- - - ">="
87
- - !ruby/object:Gem::Version
88
- version: '0'
89
69
  - !ruby/object:Gem::Dependency
90
70
  name: appraisal
91
71
  requirement: !ruby/object:Gem::Requirement
@@ -125,6 +105,8 @@ files:
125
105
  - gemfiles/rails_51.gemfile.lock
126
106
  - gemfiles/rails_52.gemfile
127
107
  - gemfiles/rails_52.gemfile.lock
108
+ - gemfiles/rails_60.gemfile
109
+ - gemfiles/rails_60.gemfile.lock
128
110
  - lib/deferring.rb
129
111
  - lib/deferring/deferred_association.rb
130
112
  - lib/deferring/deferred_callback_listener.rb
@@ -134,6 +116,7 @@ files:
134
116
  - spec/lib/deferring_nested_attributes_spec.rb
135
117
  - spec/spec_helper.rb
136
118
  - spec/support/active_record.rb
119
+ - spec/support/matchers/query_matcher.rb
137
120
  - spec/support/models/address.rb
138
121
  - spec/support/models/issue.rb
139
122
  - spec/support/models/non_validated_issue.rb
@@ -158,8 +141,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
158
141
  - !ruby/object:Gem::Version
159
142
  version: '0'
160
143
  requirements: []
161
- rubyforge_project:
162
- rubygems_version: 2.5.1
144
+ rubygems_version: 3.1.4
163
145
  signing_key:
164
146
  specification_version: 4
165
147
  summary: Defer saving ActiveRecord associations until parent is saved
@@ -169,9 +151,9 @@ test_files:
169
151
  - spec/lib/deferring_nested_attributes_spec.rb
170
152
  - spec/spec_helper.rb
171
153
  - spec/support/active_record.rb
154
+ - spec/support/matchers/query_matcher.rb
172
155
  - spec/support/models/address.rb
173
156
  - spec/support/models/issue.rb
174
157
  - spec/support/models/non_validated_issue.rb
175
158
  - spec/support/models/person.rb
176
159
  - spec/support/models/team.rb
177
- has_rdoc: