counter_culture 0.1.25 → 0.1.26

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0e6b6af5c5d06c1ac2acc64ece67762e7283d716
4
- data.tar.gz: 26ef80810b4e221925ede5a498af6f97d025b6ec
3
+ metadata.gz: 46f513670a73b530008f4051a11a67e46def6f0c
4
+ data.tar.gz: 3f004c832368bcff24aa5f1fd6b0121d89d38fe6
5
5
  SHA512:
6
- metadata.gz: 41c7a9851b9d974303bd5b9704c8c2a29a385b8b06c5f0673063a6bc1442bf1c5ab5b4533cf0fac268146125cec9a7adb0dd9071077182f35916b92fa245e1a2
7
- data.tar.gz: 3e60ee5f8ca8dd35163b63ee98a76244b9f4de30b124d03758e10c4d11486173ac47897feb12a56bfd05a554d7c9fe41aa758fb8185c6a6a20809e972d6c9335
6
+ metadata.gz: 149514535d47feb3fac3d3ea389945c7bd66dd2c578e321b35cb3bd33b242b3130fb3c9824dfd665a0b21c6611327f23d7244f3d841cf3b05ac6d9a428704922
7
+ data.tar.gz: c4621358a00d034452b0b56f43e56664480c7a6b7058bbf956cda52409a9789ce8803da216001e70cb07ff1250ad2044b8477ba787756e709784e348dea8b4d0
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.0.0-p247
1
+ 2.0.0
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## 0.1.26 (November 12, 2014)
2
+
3
+ Bugfixes:
4
+ - makes fix_counts work correctly with self-referential tables
5
+
1
6
  ## 0.1.25 (July 30, 2014)
2
7
 
3
8
  Bugfixes:
data/Gemfile.lock CHANGED
@@ -1,27 +1,27 @@
1
1
  GEM
2
2
  remote: https://rubygems.org/
3
3
  specs:
4
- actionmailer (4.1.1)
5
- actionpack (= 4.1.1)
6
- actionview (= 4.1.1)
7
- mail (~> 2.5.4)
8
- actionpack (4.1.1)
9
- actionview (= 4.1.1)
10
- activesupport (= 4.1.1)
4
+ actionmailer (4.1.7)
5
+ actionpack (= 4.1.7)
6
+ actionview (= 4.1.7)
7
+ mail (~> 2.5, >= 2.5.4)
8
+ actionpack (4.1.7)
9
+ actionview (= 4.1.7)
10
+ activesupport (= 4.1.7)
11
11
  rack (~> 1.5.2)
12
12
  rack-test (~> 0.6.2)
13
- actionview (4.1.1)
14
- activesupport (= 4.1.1)
13
+ actionview (4.1.7)
14
+ activesupport (= 4.1.7)
15
15
  builder (~> 3.1)
16
16
  erubis (~> 2.7.0)
17
- activemodel (4.1.1)
18
- activesupport (= 4.1.1)
17
+ activemodel (4.1.7)
18
+ activesupport (= 4.1.7)
19
19
  builder (~> 3.1)
20
- activerecord (4.1.1)
21
- activemodel (= 4.1.1)
22
- activesupport (= 4.1.1)
20
+ activerecord (4.1.7)
21
+ activemodel (= 4.1.7)
22
+ activesupport (= 4.1.7)
23
23
  arel (~> 5.0.0)
24
- activesupport (4.1.1)
24
+ activesupport (4.1.7)
25
25
  i18n (~> 0.6, >= 0.6.9)
26
26
  json (~> 1.7, >= 1.7.7)
27
27
  minitest (~> 5.1)
@@ -33,26 +33,26 @@ GEM
33
33
  arel (5.0.1.20140414130214)
34
34
  awesome_print (1.2.0)
35
35
  builder (3.2.2)
36
- database_cleaner (1.2.0)
36
+ database_cleaner (1.3.0)
37
37
  descendants_tracker (0.0.4)
38
38
  thread_safe (~> 0.3, >= 0.3.1)
39
39
  diff-lcs (1.1.3)
40
40
  erubis (2.7.0)
41
41
  faraday (0.9.0)
42
42
  multipart-post (>= 1.2, < 3)
43
- git (1.2.6)
44
- github_api (0.11.3)
43
+ git (1.2.8)
44
+ github_api (0.12.2)
45
45
  addressable (~> 2.3)
46
- descendants_tracker (~> 0.0.1)
46
+ descendants_tracker (~> 0.0.4)
47
47
  faraday (~> 0.8, < 0.10)
48
- hashie (>= 1.2)
48
+ hashie (>= 3.3)
49
49
  multi_json (>= 1.7.5, < 2.0)
50
- nokogiri (~> 1.6.0)
50
+ nokogiri (~> 1.6.3)
51
51
  oauth2
52
- hashie (2.1.1)
52
+ hashie (3.3.1)
53
53
  highline (1.6.21)
54
54
  hike (1.2.3)
55
- i18n (0.6.9)
55
+ i18n (0.6.11)
56
56
  jeweler (2.0.1)
57
57
  builder
58
58
  bundler (>= 1.0)
@@ -63,45 +63,42 @@ GEM
63
63
  rake
64
64
  rdoc
65
65
  json (1.8.1)
66
- jwt (0.1.13)
67
- multi_json (>= 1.5)
68
- mail (2.5.4)
69
- mime-types (~> 1.16)
70
- treetop (~> 1.4.8)
71
- mime-types (1.25.1)
72
- mini_portile (0.6.0)
73
- minitest (5.3.3)
74
- multi_json (1.10.0)
66
+ jwt (1.0.0)
67
+ mail (2.6.3)
68
+ mime-types (>= 1.16, < 3)
69
+ mime-types (2.4.3)
70
+ mini_portile (0.6.1)
71
+ minitest (5.4.3)
72
+ multi_json (1.10.1)
75
73
  multi_xml (0.5.5)
76
74
  multipart-post (2.0.0)
77
- nokogiri (1.6.2.1)
78
- mini_portile (= 0.6.0)
79
- oauth2 (0.9.3)
75
+ nokogiri (1.6.4.1)
76
+ mini_portile (~> 0.6.0)
77
+ oauth2 (1.0.0)
80
78
  faraday (>= 0.8, < 0.10)
81
- jwt (~> 0.1.8)
79
+ jwt (~> 1.0)
82
80
  multi_json (~> 1.3)
83
81
  multi_xml (~> 0.5)
84
82
  rack (~> 1.2)
85
- polyglot (0.3.4)
86
83
  rack (1.5.2)
87
84
  rack-test (0.6.2)
88
85
  rack (>= 1.0)
89
- rails (4.1.1)
90
- actionmailer (= 4.1.1)
91
- actionpack (= 4.1.1)
92
- actionview (= 4.1.1)
93
- activemodel (= 4.1.1)
94
- activerecord (= 4.1.1)
95
- activesupport (= 4.1.1)
86
+ rails (4.1.7)
87
+ actionmailer (= 4.1.7)
88
+ actionpack (= 4.1.7)
89
+ actionview (= 4.1.7)
90
+ activemodel (= 4.1.7)
91
+ activerecord (= 4.1.7)
92
+ activesupport (= 4.1.7)
96
93
  bundler (>= 1.3.0, < 2.0)
97
- railties (= 4.1.1)
94
+ railties (= 4.1.7)
98
95
  sprockets-rails (~> 2.0)
99
- railties (4.1.1)
100
- actionpack (= 4.1.1)
101
- activesupport (= 4.1.1)
96
+ railties (4.1.7)
97
+ actionpack (= 4.1.7)
98
+ activesupport (= 4.1.7)
102
99
  rake (>= 0.8.7)
103
100
  thor (>= 0.18.1, < 2.0)
104
- rake (10.3.1)
101
+ rake (10.3.2)
105
102
  rdoc (3.12.2)
106
103
  json (~> 1.4)
107
104
  rspec (2.10.0)
@@ -113,23 +110,20 @@ GEM
113
110
  diff-lcs (~> 1.1.3)
114
111
  rspec-extra-formatters (1.0.0)
115
112
  rspec-mocks (2.10.1)
116
- sprockets (2.12.1)
113
+ sprockets (2.12.3)
117
114
  hike (~> 1.2)
118
115
  multi_json (~> 1.0)
119
116
  rack (~> 1.0)
120
117
  tilt (~> 1.1, != 1.3.0)
121
- sprockets-rails (2.1.3)
118
+ sprockets-rails (2.2.0)
122
119
  actionpack (>= 3.0)
123
120
  activesupport (>= 3.0)
124
- sprockets (~> 2.8)
125
- sqlite3 (1.3.9)
121
+ sprockets (>= 2.8, < 4.0)
122
+ sqlite3 (1.3.10)
126
123
  thor (0.19.1)
127
- thread_safe (0.3.3)
124
+ thread_safe (0.3.4)
128
125
  tilt (1.4.1)
129
- treetop (1.4.15)
130
- polyglot
131
- polyglot (>= 0.3.1)
132
- tzinfo (1.1.0)
126
+ tzinfo (1.2.2)
133
127
  thread_safe (~> 0.1)
134
128
 
135
129
  PLATFORMS
data/Rakefile CHANGED
@@ -21,8 +21,6 @@ Jeweler::Tasks.new do |gem|
21
21
  gem.description = %Q{counter_culture provides turbo-charged counter caches that are kept up-to-date not just on create and destroy, that support multiple levels of indirection through relationships, allow dynamic column names and that avoid deadlocks by updating in the after_commit callback.}
22
22
  gem.email = "magnus@vonkoeller.de"
23
23
  gem.authors = ["Magnus von Koeller"]
24
-
25
- gem.add_dependency 'after_commit_action', '~> 0.1.3'
26
24
  end
27
25
  Jeweler::RubygemsDotOrgTasks.new
28
26
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.25
1
+ 0.1.26
@@ -2,15 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: counter_culture 0.1.25 ruby lib
5
+ # stub: counter_culture 0.1.26 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "counter_culture"
9
- s.version = "0.1.25"
9
+ s.version = "0.1.26"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
+ s.require_paths = ["lib"]
12
13
  s.authors = ["Magnus von Koeller"]
13
- s.date = "2014-07-30"
14
+ s.date = "2014-11-13"
14
15
  s.description = "counter_culture provides turbo-charged counter caches that are kept up-to-date not just on create and destroy, that support multiple levels of indirection through relationships, allow dynamic column names and that avoid deadlocks by updating in the after_commit callback."
15
16
  s.email = "magnus@vonkoeller.de"
16
17
  s.extra_rdoc_files = [
@@ -105,8 +106,7 @@ Gem::Specification.new do |s|
105
106
  ]
106
107
  s.homepage = "http://github.com/bestvendor/counter_culture"
107
108
  s.licenses = ["MIT"]
108
- s.require_paths = ["lib"]
109
- s.rubygems_version = "2.1.11"
109
+ s.rubygems_version = "2.2.2"
110
110
  s.summary = "Turbo-charged counter caches for your Rails app."
111
111
 
112
112
  if s.respond_to? :specification_version then
@@ -121,7 +121,6 @@ Gem::Specification.new do |s|
121
121
  s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
122
122
  s.add_development_dependency(%q<bundler>, [">= 1.2.0"])
123
123
  s.add_development_dependency(%q<jeweler>, ["~> 2.0.1"])
124
- s.add_runtime_dependency(%q<after_commit_action>, ["~> 0.1.3"])
125
124
  else
126
125
  s.add_dependency(%q<rake>, [">= 0"])
127
126
  s.add_dependency(%q<rails>, [">= 3.1.0"])
@@ -131,7 +130,6 @@ Gem::Specification.new do |s|
131
130
  s.add_dependency(%q<rdoc>, ["~> 3.12"])
132
131
  s.add_dependency(%q<bundler>, [">= 1.2.0"])
133
132
  s.add_dependency(%q<jeweler>, ["~> 2.0.1"])
134
- s.add_dependency(%q<after_commit_action>, ["~> 0.1.3"])
135
133
  end
136
134
  else
137
135
  s.add_dependency(%q<rake>, [">= 0"])
@@ -142,7 +140,6 @@ Gem::Specification.new do |s|
142
140
  s.add_dependency(%q<rdoc>, ["~> 3.12"])
143
141
  s.add_dependency(%q<bundler>, [">= 1.2.0"])
144
142
  s.add_dependency(%q<jeweler>, ["~> 2.0.1"])
145
- s.add_dependency(%q<after_commit_action>, ["~> 0.1.3"])
146
143
  end
147
144
  end
148
145
 
@@ -76,8 +76,14 @@ module CounterCulture
76
76
  klass = relation_klass(hash[:relation])
77
77
  query = klass
78
78
 
79
+ if klass.table_name == self.table_name
80
+ self_table_name = "#{self.table_name}_#{self.table_name}"
81
+ else
82
+ self_table_name = self.table_name
83
+ end
84
+
79
85
  # if a delta column is provided use SUM, otherwise use COUNT
80
- count_select = hash[:delta_column] ? "SUM(COALESCE(#{self.table_name}.#{hash[:delta_column]},0))" : "COUNT(#{self.table_name}.#{self.primary_key})"
86
+ count_select = hash[:delta_column] ? "SUM(COALESCE(#{self_table_name}.#{hash[:delta_column]},0))" : "COUNT(#{self_table_name}.#{self.primary_key})"
81
87
 
82
88
  # respect the deleted_at column if it exists
83
89
  query = query.where("#{self.table_name}.deleted_at IS NULL") if self.column_names.include?('deleted_at')
@@ -92,7 +98,13 @@ module CounterCulture
92
98
  # store joins in an array so that we can later apply column-specific conditions
93
99
  joins = reverse_relation.map do |cur_relation|
94
100
  reflect = relation_reflect(cur_relation)
95
- joins_query = "LEFT JOIN #{reflect.active_record.table_name} ON #{reflect.table_name}.#{reflect.klass.primary_key} = #{reflect.active_record.table_name}.#{reflect.foreign_key}"
101
+ if klass.table_name == reflect.active_record.table_name
102
+ join_table_name = "#{klass.table_name}_#{klass.table_name}"
103
+ else
104
+ join_table_name = reflect.active_record.table_name
105
+ end
106
+ # join with alias to avoid ambiguous table name with self-referential models:
107
+ joins_query = "LEFT JOIN #{reflect.active_record.table_name} AS #{join_table_name} ON #{reflect.table_name}.#{reflect.klass.primary_key} = #{join_table_name}.#{reflect.foreign_key}"
96
108
  # adds 'type' condition to JOIN clause if the current model is a child in a Single Table Inheritance
97
109
  joins_query = "#{joins_query} AND #{reflect.active_record.table_name}.type IN ('#{self.name}')" if self.column_names.include?('type') and not(self.descends_from_active_record?)
98
110
  joins_query
@@ -1302,4 +1302,38 @@ describe "CounterCulture" do
1302
1302
  end
1303
1303
  end
1304
1304
 
1305
+ describe "self referential counter cache" do
1306
+ it "increments counter cache on create" do
1307
+ company = Company.create!
1308
+ company.children << Company.create!
1309
+
1310
+ company.reload
1311
+ company.children_count.should == 1
1312
+ end
1313
+
1314
+ it "decrements counter cache on destroy" do
1315
+ company = Company.create!
1316
+ company.children << Company.create!
1317
+
1318
+ company.reload
1319
+ company.children_count.should == 1
1320
+
1321
+ company.children.first.destroy
1322
+
1323
+ company.reload
1324
+ company.children_count.should == 0
1325
+ end
1326
+
1327
+ it "fixes counter cache" do
1328
+ company = Company.create!
1329
+ company.children << Company.create!
1330
+
1331
+ company.children_count = -1
1332
+ company.save!
1333
+
1334
+ fixed = Company.counter_culture_fix_counts
1335
+ fixed.length.should == 1
1336
+ company.reload.children_count.should == 1
1337
+ end
1338
+ end
1305
1339
  end
@@ -1,4 +1,11 @@
1
1
  class Company < ActiveRecord::Base
2
2
  belongs_to :industry
3
3
  has_many :managers, :foreign_key => :manages_company_id
4
+
5
+
6
+ belongs_to :parent, :class_name => 'Company', :foreign_key => 'parent_id'
7
+ has_many :children, :class_name => 'Company', :foreign_key => 'parent_id'
8
+
9
+ counter_culture :parent, :column_name => :children_count
10
+
4
11
  end
data/spec/schema.rb CHANGED
@@ -21,6 +21,8 @@ ActiveRecord::Schema.define(:version => 20120522160158) do
21
21
  t.integer "tried_count", :default => 0, :null => false
22
22
  t.integer "managers_count", :default => 0, :null => false
23
23
  t.integer "review_approvals_count", :default => 0, :null => false
24
+ t.integer "parent_id"
25
+ t.integer "children_count", :default => 0, :null => false
24
26
  t.datetime "created_at"
25
27
  t.datetime "updated_at"
26
28
  end
metadata CHANGED
@@ -1,141 +1,127 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: counter_culture
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.25
4
+ version: 0.1.26
5
5
  platform: ruby
6
6
  authors:
7
7
  - Magnus von Koeller
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-30 00:00:00.000000000 Z
11
+ date: 2014-11-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rails
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: 3.1.0
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: 3.1.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: 2.10.0
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: 2.10.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: after_commit_action
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '>='
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '>='
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: awesome_print
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - '>='
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - '>='
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rdoc
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ~>
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
89
  version: '3.12'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ~>
94
+ - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '3.12'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: bundler
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - '>='
101
+ - - ">="
102
102
  - !ruby/object:Gem::Version
103
103
  version: 1.2.0
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - '>='
108
+ - - ">="
109
109
  - !ruby/object:Gem::Version
110
110
  version: 1.2.0
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: jeweler
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - ~>
115
+ - - "~>"
116
116
  - !ruby/object:Gem::Version
117
117
  version: 2.0.1
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - ~>
122
+ - - "~>"
123
123
  - !ruby/object:Gem::Version
124
124
  version: 2.0.1
125
- - !ruby/object:Gem::Dependency
126
- name: after_commit_action
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - ~>
130
- - !ruby/object:Gem::Version
131
- version: 0.1.3
132
- type: :runtime
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - ~>
137
- - !ruby/object:Gem::Version
138
- version: 0.1.3
139
125
  description: counter_culture provides turbo-charged counter caches that are kept up-to-date
140
126
  not just on create and destroy, that support multiple levels of indirection through
141
127
  relationships, allow dynamic column names and that avoid deadlocks by updating in
@@ -147,11 +133,11 @@ extra_rdoc_files:
147
133
  - LICENSE.txt
148
134
  - README.md
149
135
  files:
150
- - .document
151
- - .rspec
152
- - .ruby-gemset
153
- - .ruby-version
154
- - .travis.yml
136
+ - ".document"
137
+ - ".rspec"
138
+ - ".ruby-gemset"
139
+ - ".ruby-version"
140
+ - ".travis.yml"
155
141
  - CHANGELOG.md
156
142
  - Gemfile
157
143
  - Gemfile.lock
@@ -241,17 +227,17 @@ require_paths:
241
227
  - lib
242
228
  required_ruby_version: !ruby/object:Gem::Requirement
243
229
  requirements:
244
- - - '>='
230
+ - - ">="
245
231
  - !ruby/object:Gem::Version
246
232
  version: '0'
247
233
  required_rubygems_version: !ruby/object:Gem::Requirement
248
234
  requirements:
249
- - - '>='
235
+ - - ">="
250
236
  - !ruby/object:Gem::Version
251
237
  version: '0'
252
238
  requirements: []
253
239
  rubyforge_project:
254
- rubygems_version: 2.1.11
240
+ rubygems_version: 2.2.2
255
241
  signing_key:
256
242
  specification_version: 4
257
243
  summary: Turbo-charged counter caches for your Rails app.