has_metrics 0.1.1 → 0.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 +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
|