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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f48a7598ad01f84ad88033cbd27f3db579471077
4
- data.tar.gz: 8f2bc339c0a146c2c787e9d605c9097963c3dc69
3
+ metadata.gz: cebdeea08917071eeaaed9b9872d2d423de1e2cb
4
+ data.tar.gz: 4eaa44ee624b9859a153a69e5acab96a5630457e
5
5
  SHA512:
6
- metadata.gz: 05f470ca3023d9c5ed3ebd1a2dd6f8dc3b3c6cbc2a20b96f9af249646b4afc7c72453e653b2a363165b8942d883afa899255615228b48d2b99e0270d809dd871
7
- data.tar.gz: 4363c5d42770658fd5a197e36ebad47a495fe75915654dcd39becbe5c9e81a13bb3515e437a5de66d441d19fb70017c9db1100af62b88d8bc8d211715643ad06
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.1.1"
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
- if s.respond_to? :specification_version then
21
- s.specification_version = 4
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
@@ -25,7 +25,14 @@ module Metrics
25
25
  end
26
26
 
27
27
  def metrics
28
- @metrics ||= self.class.metrics_class.find_or_initialize_by_id(id)
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
- metrics_class.class_eval do
46
- attr_accessible(name, "updated__#{name}__at")
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
- subquery = sql_capturer.query.first.gsub(warmup.id.to_s, "#{metrics_class.table_name}.id")
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}
@@ -1,3 +1,3 @@
1
1
  module HasMetrics
2
- VERSION = "0.0.9"
2
+ VERSION = "0.2.0"
3
3
  end
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
- attr_accessible :actor
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
- attr_accessible :identity, :name
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
- UserMetrics.count(:group => :name_length).should == {4=>1}
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
@@ -30,7 +30,12 @@ describe Segmentation do
30
30
  end
31
31
 
32
32
  it "segments properly" do
33
- PostMetrics.count(:group => :by_name_length).should == {'short'=>1, 'seven'=>1, 'long'=>1}
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.1.1
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: '4.0'
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: '4.0'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement