counter_culture 3.1.0 → 3.2.0

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
2
  SHA256:
3
- metadata.gz: 461f74df5dfedb6986e9ad3504c20d6a8c173b284011279b853cec7a58fdf57b
4
- data.tar.gz: ce60aa02f06c3719f2a34020ca065bf6fe07847d7b4e5d238ef263345634e491
3
+ metadata.gz: 95534ee62aca302b549c2dcac07fc297169c388686330d44fd7113e4ef2b20bc
4
+ data.tar.gz: b19462c370aca6769529a3f1485f6bf5cbaba9b51b4df8edc3f7f4fcd01dac40
5
5
  SHA512:
6
- metadata.gz: b706ac60f8dcd3f68e8b7da3a8987caaddfd9d5e0c67cb94923af7188910614c0c991047734e8a4c28d68801e41ab1f77ac975e659615facd6ecdaf96ce58faa
7
- data.tar.gz: e9b2a3910632ee00a5e6489f339e79f7e3b07be8aee5ef7eddf0e60f82e7af848aedcc63861cf281c833edb9703407ae215fd7b4ea57b792fe74b776ae5a45ca
6
+ metadata.gz: d6f3b86aff4915f42227de7303a1b8dfef7e6be9de77574b0887c44022393a8d4135329c1a538ba7e0fb0595cd27c021905a401303727169b90ac4ec3d891120
7
+ data.tar.gz: 7453a54d51964e9ee157ee6a9a7d6a4977c0f21b4e6261859558b83b92c29a03e4619428d88b18988f08c27db8f2afce0fecf32edb1156c3550b76aa8ba4388a
@@ -0,0 +1,66 @@
1
+ version: 2.1
2
+
3
+ orbs:
4
+ ruby: circleci/ruby@1.4
5
+
6
+ jobs:
7
+ test:
8
+ parameters:
9
+ ruby-version:
10
+ type: string
11
+ rails-version:
12
+ type: string
13
+ database:
14
+ type: string
15
+ docker:
16
+ - image: cimg/ruby:<< parameters.ruby-version >>
17
+ - image: cimg/postgres:14.1
18
+ - image: cimg/mysql:8.0
19
+ steps:
20
+ - checkout
21
+ - run:
22
+ name: bundle update
23
+ command: BUNDLE_GEMFILE=gemfiles/rails_<< parameters.rails-version >>.gemfile bundle update
24
+ - run:
25
+ name: install dockerize
26
+ command: wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz && sudo tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz
27
+ environment:
28
+ DOCKERIZE_VERSION: v0.3.0
29
+ - run:
30
+ name: Wait for Postgres
31
+ command: dockerize -wait tcp://localhost:5432 -timeout 1m
32
+ - run:
33
+ name: Wait for MySQL
34
+ command: dockerize -wait tcp://localhost:3306 -timeout 1m
35
+ - run:
36
+ name: rspec
37
+ command: DB=<< parameters.database >> rspec spec
38
+
39
+ workflows:
40
+ test:
41
+ jobs:
42
+ - test:
43
+ matrix:
44
+ parameters:
45
+ ruby-version: ["2.6", "2.7", "3.0"]
46
+ rails-version: ["5.2", "6.0", "6.1", "7.0"]
47
+ database: ["postgresql", "sqlite3", "mysql2"]
48
+ exclude:
49
+ - ruby-version: "3.0"
50
+ rails-version: "5.2"
51
+ database: "postgresql"
52
+ - ruby-version: "3.0"
53
+ rails-version: "5.2"
54
+ database: "sqlite3"
55
+ - ruby-version: "3.0"
56
+ rails-version: "5.2"
57
+ database: "mysql2"
58
+ - ruby-version: "2.6"
59
+ rails-version: "7.0"
60
+ database: "postgresql"
61
+ - ruby-version: "2.6"
62
+ rails-version: "7.0"
63
+ database: "sqlite3"
64
+ - ruby-version: "2.6"
65
+ rails-version: "7.0"
66
+ database: "mysql2"
data/Appraisals CHANGED
@@ -2,30 +2,9 @@
2
2
  5.2
3
3
  6.0
4
4
  6.1
5
+ 7.0
5
6
  ].each do |rails_version|
6
- gem_rails_version = Gem::Version.new(rails_version)
7
- if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.5.0') &&
8
- gem_rails_version >= Gem::Version.new('6.0.0.beta')
9
-
10
- # Rails 6 requires Ruby >= 2.5
11
- next
12
- end
13
7
  appraise "rails-#{rails_version}" do
14
8
  gem 'rails', "~> #{rails_version}.0"
15
-
16
- if gem_rails_version < Gem::Version.new('5.0')
17
- gem 'pg', '~> 0.15'
18
- else
19
- gem 'pg'
20
- end
21
- gem 'mysql2'
22
- if gem_rails_version < Gem::Version.new('5.2')
23
- gem 'sqlite3', '~> 1.3.0'
24
- else
25
- gem 'sqlite3'
26
- end
27
- if gem_rails_version < Gem::Version.new('5.0')
28
- gem 'bigdecimal', '~> 1.3.5'
29
- end
30
9
  end
31
10
  end
data/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ ## 3.2.0 (January 24, 2022)
2
+
3
+ Improvements:
4
+ - Allow specifiying `polymorphic_classes` to avoid a potentially expensive
5
+ `DISTINCT` query when calling `counter_culture_fix_counts` (#336)
6
+
7
+ Bugfixes:
8
+ - Fix primary key name for enumerable relations (#337)
9
+
1
10
  ## 3.1.0 (November 29, 2021)
2
11
 
3
12
  Improvements:
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # counter_culture [![Build Status](https://app.travis-ci.com/magnusvk/counter_culture.svg?branch=master)](https://app.travis-ci.com/magnusvk/counter_culture)
1
+ # counter_culture [![Build Status](https://circleci.com/gh/magnusvk/counter_culture/tree/master.svg?style=svg)](https://circleci.com/gh/magnusvk/counter_culture/tree/master)
2
2
 
3
3
  Turbo-charged counter caches for your Rails app. Huge improvements over the Rails standard counter caches:
4
4
 
@@ -7,7 +7,7 @@ Turbo-charged counter caches for your Rails app. Huge improvements over the Rail
7
7
  * Supports dynamic column names, making it possible to split up the counter cache for different types of objects
8
8
  * Can keep a running count, or a running total
9
9
 
10
- Tested against Ruby 2.5.8, 2.6.6, 2.7.2 and 3.0.0, and against the latest patch releases of Rails 4.2, 5.0, 5.1, 5.2, 6.0 and 6.1.
10
+ Tested against Ruby 2.6, 2.7 and 3.0, and against the latest patch releases of Rails 5.2, 6.0, 6.1 and 7.0.
11
11
 
12
12
  Please note that -- unlike Rails' built-in counter-caches -- counter_culture does not currently change the behavior of the `.size` method on ActiveRecord associations. If you want to avoid a database query and read the cached value, please use the attribute name containing the counter cache directly.
13
13
  ```
@@ -378,7 +378,7 @@ end
378
378
 
379
379
  You can specify a scope instead of a where condition string for `column_names`. We recommend
380
380
  providing a Proc that returns a hash instead of directly providing a hash: If you were to directly
381
- provide a scope this would load your schema cache on startup which will break things like
381
+ provide a scope this would load your schema cache on startup which will break things like
382
382
  `rake db:migrate`.
383
383
 
384
384
  ```ruby
@@ -459,6 +459,17 @@ end
459
459
 
460
460
  counter_culture now supports polymorphic associations of one level only.
461
461
 
462
+ To discover which models need to be updated via `counter_culture_fix_counts`,
463
+ counter_culture performs a `DISTINCT` query on the polymorphic relationship.
464
+ This query can be expensive so we therefore offer the option
465
+ (`polymorphic_classes`) to specify the models' counts that should be corrected:
466
+
467
+ ```ruby
468
+ Image.counter_culture_fix_counts(polymorphic_classes: Product)
469
+ # or
470
+ Image.counter_culture_fix_counts(polymorphic_classes: [Product, Employee])
471
+ ```
472
+
462
473
  ## Contributing to counter_culture
463
474
 
464
475
  * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
@@ -38,7 +38,7 @@ Gem::Specification.new do |spec|
38
38
  spec.add_development_dependency 'after_commit_action'
39
39
  spec.add_development_dependency 'rails', '>= 4.2'
40
40
  spec.add_development_dependency 'rake', '>= 10.0'
41
- spec.add_development_dependency 'rdoc', '~> 5.0.0'
41
+ spec.add_development_dependency 'rdoc', ">= 6.3.1"
42
42
  spec.add_development_dependency 'rspec', '~> 3.0'
43
43
  spec.add_development_dependency 'rspec-extra-formatters'
44
44
  spec.add_development_dependency 'simplecov', '~> 0.16.1'
@@ -2,9 +2,6 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "sqlite3"
6
5
  gem "rails", "~> 5.2.0"
7
- gem "pg"
8
- gem "mysql2"
9
6
 
10
7
  gemspec path: "../"
@@ -2,9 +2,6 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "sqlite3"
6
5
  gem "rails", "~> 6.0.0"
7
- gem "pg"
8
- gem "mysql2"
9
6
 
10
7
  gemspec path: "../"
@@ -2,9 +2,6 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "sqlite3"
6
5
  gem "rails", "~> 6.1.0"
7
- gem "pg"
8
- gem "mysql2"
9
6
 
10
7
  gemspec path: "../"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 7.0.0"
6
+
7
+ gemspec path: "../"
@@ -163,8 +163,9 @@ module CounterCulture
163
163
  # pass true to get the past value, false or nothing to get the
164
164
  # current value
165
165
  def foreign_key_value(obj, relation, was = false)
166
+ original_relation = relation
166
167
  relation = relation.is_a?(Enumerable) ? relation.dup : [relation]
167
- first_relation = relation.first
168
+
168
169
  if was
169
170
  first = relation.shift
170
171
  foreign_key_value = attribute_was(obj, relation_foreign_key(first))
@@ -180,7 +181,8 @@ module CounterCulture
180
181
  while !value.nil? && relation.size > 0
181
182
  value = value.send(relation.shift)
182
183
  end
183
- return value.try(relation_primary_key(first_relation, source: obj, was: was).try(:to_sym))
184
+
185
+ return value.try(relation_primary_key(original_relation, source: obj, was: was).try(:to_sym))
184
186
  end
185
187
 
186
188
  # gets the reflect object on the given relation
@@ -71,7 +71,8 @@ module CounterCulture
71
71
  # options:
72
72
  # { :exclude => list of relations to skip when fixing counts,
73
73
  # :only => only these relations will have their counts fixed,
74
- # :column_name => only this column will have its count fixed }
74
+ # :column_name => only this column will have its count fixed
75
+ # :polymorphic_classes => specify the class(es) to update in polymorphic associations }
75
76
  # returns: a list of fixed record as an array of hashes of the form:
76
77
  # { :entity => which model the count was fixed on,
77
78
  # :id => the id of the model that had the incorrect count,
@@ -91,7 +92,7 @@ module CounterCulture
91
92
  next if options[:exclude] && options[:exclude].include?(counter.relation)
92
93
  next if options[:only] && !options[:only].include?(counter.relation)
93
94
 
94
- reconciler_options = %i(batch_size column_name finish skip_unsupported start touch verbose where)
95
+ reconciler_options = %i(batch_size column_name finish skip_unsupported start touch verbose where polymorphic_classes)
95
96
 
96
97
  reconciler = CounterCulture::Reconciler.new(counter, options.slice(*reconciler_options))
97
98
  reconciler.reconcile!
@@ -28,7 +28,7 @@ module CounterCulture
28
28
  raise "Fixing counter caches is not supported when :delta_magnitude is a Proc; you may skip this relation with :skip_unsupported => true" if delta_magnitude.is_a?(Proc)
29
29
  end
30
30
 
31
- associated_model_classes.each do |associated_model_class|
31
+ Array(associated_model_classes).each do |associated_model_class|
32
32
  Reconciliation.new(counter, changes, options, associated_model_class).perform
33
33
  end
34
34
 
@@ -39,7 +39,7 @@ module CounterCulture
39
39
 
40
40
  def associated_model_classes
41
41
  if polymorphic?
42
- polymorphic_associated_model_classes
42
+ options[:polymorphic_classes].presence || polymorphic_associated_model_classes
43
43
  else
44
44
  [associated_model_class]
45
45
  end
@@ -1,3 +1,3 @@
1
1
  module CounterCulture
2
- VERSION = '3.1.0'.freeze
2
+ VERSION = '3.2.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: counter_culture
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.0
4
+ version: 3.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Magnus von Koeller
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-11-30 00:00:00.000000000 Z
11
+ date: 2022-01-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -182,16 +182,16 @@ dependencies:
182
182
  name: rdoc
183
183
  requirement: !ruby/object:Gem::Requirement
184
184
  requirements:
185
- - - "~>"
185
+ - - ">="
186
186
  - !ruby/object:Gem::Version
187
- version: 5.0.0
187
+ version: 6.3.1
188
188
  type: :development
189
189
  prerelease: false
190
190
  version_requirements: !ruby/object:Gem::Requirement
191
191
  requirements:
192
- - - "~>"
192
+ - - ">="
193
193
  - !ruby/object:Gem::Version
194
- version: 5.0.0
194
+ version: 6.3.1
195
195
  - !ruby/object:Gem::Dependency
196
196
  name: rspec
197
197
  requirement: !ruby/object:Gem::Requirement
@@ -302,10 +302,10 @@ extra_rdoc_files:
302
302
  - LICENSE.txt
303
303
  - README.md
304
304
  files:
305
+ - ".circleci/config.yml"
305
306
  - ".document"
306
307
  - ".gitignore"
307
308
  - ".rspec"
308
- - ".travis.yml"
309
309
  - Appraisals
310
310
  - CHANGELOG.md
311
311
  - Gemfile
@@ -317,6 +317,7 @@ files:
317
317
  - gemfiles/rails_5.2.gemfile
318
318
  - gemfiles/rails_6.0.gemfile
319
319
  - gemfiles/rails_6.1.gemfile
320
+ - gemfiles/rails_7.0.gemfile
320
321
  - lib/counter_culture.rb
321
322
  - lib/counter_culture/counter.rb
322
323
  - lib/counter_culture/extensions.rb
data/.travis.yml DELETED
@@ -1,50 +0,0 @@
1
- dist: focal
2
- language: ruby
3
- cache:
4
- directories:
5
- - ~/.rvm/gems
6
- services:
7
- - postgresql
8
- - mysql
9
- branches:
10
- only:
11
- - master
12
- addons:
13
- postgresql: '12'
14
- apt:
15
- packages:
16
- - postgresql-12
17
- - postgresql-client-12
18
- rvm:
19
- - "2.6.8"
20
- - "2.7.4"
21
- - "3.0.2"
22
- gemfile:
23
- - gemfiles/rails_5.2.gemfile
24
- - gemfiles/rails_6.0.gemfile
25
- - gemfiles/rails_6.1.gemfile
26
- matrix:
27
- exclude:
28
- - rvm: "3.0.2"
29
- gemfile: gemfiles/rails_5.2.gemfile
30
- env:
31
- global:
32
- - PGUSER=postgres
33
- - PGPORT=5432
34
- - PGHOST=localhost
35
- jobs:
36
- - DB=postgresql
37
- - DB=sqlite3
38
- - DB=mysql2
39
- before_install:
40
- - sudo sed -i -e '/local.*peer/s/postgres/all/' -e 's/peer\|md5/trust/g' /etc/postgresql/*/main/pg_hba.conf
41
- - sudo service postgresql restart
42
- - sleep 1
43
- - postgres --version
44
- - if [ "$BUNDLE_GEMFILE" = "$PWD/gemfiles/rails_4.2.gemfile" ]; then gem install bundler -v '1.17.3'; else gem install bundler -v '> 2'; fi
45
- install:
46
- - if [ "$BUNDLE_GEMFILE" = "$PWD/gemfiles/rails_4.2.gemfile" ]; then bundle _1.17.3_ update; else bundle update; fi
47
- before_script:
48
- - psql -c 'create database counter_culture_test;' -U postgres
49
- - mysql -e 'CREATE DATABASE counter_culture_test;'
50
- script: TRAVIS=true bundle exec rake spec