has_metrics 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/has_metrics.gemspec +4 -18
- data/lib/has_metrics/metrics.rb +22 -4
- data/lib/has_metrics/version.rb +1 -1
- data/spec/metrics_spec.rb +13 -3
- data/spec/segmentation_spec.rb +6 -1
- data/spec/spec_helper.rb +4 -0
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cebdeea08917071eeaaed9b9872d2d423de1e2cb
|
4
|
+
data.tar.gz: 4eaa44ee624b9859a153a69e5acab96a5630457e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c180c3f247487600bdfc16b49775fe0e6e6759e90d2a9d68f312de1adba64dc8862dd344c6bd44b0e272964eaafb3ae092dcb8db044c604cb41a1a91b8ff8fe5
|
7
|
+
data.tar.gz: b9bca19f30f5caeb68fc7476584273ec1b58ff42333c85cf514082293f7a7c58b7fb02c3093a0218dbcf451b8cac4151cae1af05195f7db0a35d500d496e1ed6
|
data/has_metrics.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "has_metrics"
|
5
|
-
s.version = "0.
|
5
|
+
s.version = "0.2.0"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Allan Grant"]
|
@@ -17,21 +17,7 @@ Gem::Specification.new do |s|
|
|
17
17
|
s.summary = "Calculate \"metrics\" (any expensive methods) on ActiveRecord entries and memoize them to an automagical table."
|
18
18
|
s.test_files = ["spec/metrics_spec.rb", "spec/segmentation_spec.rb", "spec/spec_helper.rb", "spec/support/active_record.rb"]
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
24
|
-
s.add_runtime_dependency(%q<activerecord>, ["< 4.0"])
|
25
|
-
s.add_development_dependency(%q<rake>, [">= 0"])
|
26
|
-
s.add_development_dependency(%q<bundler>, [">= 0"])
|
27
|
-
else
|
28
|
-
s.add_dependency(%q<activerecord>, ["< 4.0"])
|
29
|
-
s.add_dependency(%q<rake>, [">= 0"])
|
30
|
-
s.add_dependency(%q<bundler>, [">= 0"])
|
31
|
-
end
|
32
|
-
else
|
33
|
-
s.add_dependency(%q<activerecord>, ["< 4.0"])
|
34
|
-
s.add_dependency(%q<rake>, [">= 0"])
|
35
|
-
s.add_dependency(%q<bundler>, [">= 0"])
|
36
|
-
end
|
20
|
+
s.add_dependency "activerecord"
|
21
|
+
s.add_development_dependency "rake"
|
22
|
+
s.add_development_dependency "bundler"
|
37
23
|
end
|
data/lib/has_metrics/metrics.rb
CHANGED
@@ -25,7 +25,14 @@ module Metrics
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def metrics
|
28
|
-
@metrics ||=
|
28
|
+
@metrics ||= begin
|
29
|
+
metrics_class = self.class.metrics_class
|
30
|
+
if metrics_class.respond_to?(:find_or_initialize_by)
|
31
|
+
metrics_class.find_or_initialize_by(id: id)
|
32
|
+
else
|
33
|
+
metrics_class.find_or_initialize_by_id(id)
|
34
|
+
end
|
35
|
+
end
|
29
36
|
end
|
30
37
|
end
|
31
38
|
end
|
@@ -42,8 +49,11 @@ module Metrics
|
|
42
49
|
|
43
50
|
metrics[name.to_sym] ||= {}
|
44
51
|
metrics[name.to_sym].merge!(options)
|
45
|
-
|
46
|
-
|
52
|
+
|
53
|
+
if metrics_class.respond_to?(:attr_accessible)
|
54
|
+
metrics_class.class_eval do
|
55
|
+
attr_accessible(name, "updated__#{name}__at") rescue RuntimeError
|
56
|
+
end
|
47
57
|
end
|
48
58
|
end
|
49
59
|
|
@@ -141,7 +151,15 @@ module Metrics
|
|
141
151
|
ActiveRecord::Base.logger = existing_logger
|
142
152
|
|
143
153
|
unless sql_capturer.query.count != 1
|
144
|
-
|
154
|
+
single_query = sql_capturer.query.first
|
155
|
+
subquery = if single_query =~ /(\?|\$\d+)/
|
156
|
+
# AR 4 parameterized query style
|
157
|
+
single_query
|
158
|
+
.gsub(/\[\[.*?\]\]/, '')
|
159
|
+
.gsub(/(\?|\$\d+)/, "#{metrics_class.table_name}.id")
|
160
|
+
else
|
161
|
+
single_query.gsub(warmup.id.to_s, "#{metrics_class.table_name}.id")
|
162
|
+
end
|
145
163
|
unless subquery == %Q{SELECT "#{metrics_class.table_name}".* FROM "#{metrics_class.table_name}" WHERE "#{metrics_class.table_name}"."id" = #{metrics_class.table_name}.id LIMIT 1}
|
146
164
|
update_sql = %Q{
|
147
165
|
UPDATE #{metrics_class.table_name}
|
data/lib/has_metrics/version.rb
CHANGED
data/spec/metrics_spec.rb
CHANGED
@@ -13,11 +13,16 @@ end
|
|
13
13
|
|
14
14
|
class Activity < ActiveRecord::Base
|
15
15
|
belongs_to :actor, class_name: 'Identity'
|
16
|
-
|
16
|
+
if respond_to?(:attr_accessible)
|
17
|
+
attr_accessible :actor rescue RuntimeError
|
18
|
+
end
|
19
|
+
self.inheritance_column = nil
|
17
20
|
end
|
18
21
|
|
19
22
|
class User < ActiveRecord::Base
|
20
|
-
|
23
|
+
if respond_to?(:attr_accessible)
|
24
|
+
attr_accessible :identity, :name rescue RuntimeError
|
25
|
+
end
|
21
26
|
include Metrics
|
22
27
|
belongs_to :identity
|
23
28
|
|
@@ -83,7 +88,12 @@ describe Metrics do
|
|
83
88
|
it "has their values precomputed" do
|
84
89
|
user
|
85
90
|
User.update_all_metrics!
|
86
|
-
|
91
|
+
count = if RAILS_4_OR_GREATER
|
92
|
+
UserMetrics.group(:name_length).count
|
93
|
+
else
|
94
|
+
UserMetrics.count(:group => :name_length)
|
95
|
+
end
|
96
|
+
count.should == { 4 => 1 }
|
87
97
|
end
|
88
98
|
|
89
99
|
describe 'aggregate functions' do
|
data/spec/segmentation_spec.rb
CHANGED
@@ -30,7 +30,12 @@ describe Segmentation do
|
|
30
30
|
end
|
31
31
|
|
32
32
|
it "segments properly" do
|
33
|
-
|
33
|
+
count = if RAILS_4_OR_GREATER
|
34
|
+
PostMetrics.group(:by_name_length).count
|
35
|
+
else
|
36
|
+
PostMetrics.count(:group => :by_name_length)
|
37
|
+
end
|
38
|
+
count.should == {'short'=>1, 'seven'=>1, 'long'=>1}
|
34
39
|
end
|
35
40
|
end
|
36
41
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -5,6 +5,10 @@ require 'active_record'
|
|
5
5
|
require 'support/active_record'
|
6
6
|
require 'has_metrics'
|
7
7
|
|
8
|
+
RAILS_4_OR_GREATER = ::ActiveRecord.respond_to?(:version) && ::ActiveRecord.version >= Gem::Version.new('4.0.0')
|
9
|
+
|
10
|
+
ActiveRecord::Base.default_timezone = :local
|
11
|
+
|
8
12
|
RSpec.configure do |config|
|
9
13
|
# some (optional) config here
|
10
14
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: has_metrics
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Allan Grant
|
@@ -14,16 +14,16 @@ dependencies:
|
|
14
14
|
name: activerecord
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|