has_metrics 0.0.3 → 0.0.6
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 +7 -0
- data/.gitignore +3 -1
- data/Gemfile +6 -0
- data/Rakefile +3 -7
- data/has_metrics.gemspec +7 -5
- data/lib/has_metrics/metrics.rb +25 -16
- data/lib/has_metrics/version.rb +1 -1
- data/spec/metrics_spec.rb +55 -0
- data/spec/segmentation_spec.rb +36 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/support/active_record.rb +10 -0
- metadata +24 -68
- data/test/functional/metrics_test.rb +0 -51
- data/test/functional/segmentation_test.rb +0 -34
- data/test/test_helper.rb +0 -28
- data/test.db +0 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 290cd9839b6158645e6952a21045665372b5d2fe
|
4
|
+
data.tar.gz: f26872bf500a652a99816716a8cbfbe3be85afc9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4ab5e73e945e0698c8fd82e620c64be6cb780d5b6c6ef46bce90d2b5539f252487cfa2f3ffb71fc801934c9715fd8dd5ac02255458fd781a337b07e525f6ebcb
|
7
|
+
data.tar.gz: aa6fb41dfd66fcaf7b541f3861b2237cc7e4d82faf9f0e5a92736cc41b334598ed399e3e0c3004c970686fe3a57c7f3261b52b60d40a351a53f13ffef99a7ddc
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -1,11 +1,7 @@
|
|
1
1
|
#!/usr/bin/env rake
|
2
2
|
require "bundler/gem_tasks"
|
3
|
+
require 'rspec/core/rake_task'
|
3
4
|
|
4
|
-
|
5
|
-
Rake::TestTask.new(:test) do |test|
|
6
|
-
test.libs << 'lib' << 'test'
|
7
|
-
test.pattern = 'test/{functional,unit}/**/*_test.rb'
|
8
|
-
test.verbose = true
|
9
|
-
end
|
5
|
+
RSpec::Core::RakeTask.new(:spec)
|
10
6
|
|
11
|
-
task :default => :
|
7
|
+
task :default => :spec
|
data/has_metrics.gemspec
CHANGED
@@ -2,22 +2,24 @@
|
|
2
2
|
require File.expand_path('../lib/has_metrics/version', __FILE__)
|
3
3
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
|
+
gem.name = "has_metrics"
|
6
|
+
gem.version = HasMetrics::VERSION
|
5
7
|
gem.authors = ["Allan Grant"]
|
6
8
|
gem.email = ["allan@allangrant.net"]
|
7
9
|
gem.description = %q{Calculate metrics and store them in the DB.}
|
8
10
|
gem.summary = %q{Calculate "metrics" (any expensive methods) on ActiveRecord entries and memoize them to an automagical table.}
|
9
11
|
gem.homepage = "http://github.com/allangrant/has_metrics"
|
12
|
+
gem.license = "MIT"
|
10
13
|
|
11
14
|
gem.files = `git ls-files`.split($\)
|
12
15
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
16
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
|
-
gem.name = "has_metrics"
|
15
17
|
gem.require_paths = ["lib"]
|
16
|
-
gem.version = HasMetrics::VERSION
|
17
18
|
|
18
19
|
gem.add_dependency "activerecord"
|
19
20
|
gem.add_development_dependency "rake"
|
20
|
-
gem.add_development_dependency "
|
21
|
-
gem.add_development_dependency "
|
22
|
-
gem.add_development_dependency "
|
21
|
+
gem.add_development_dependency "bundler"
|
22
|
+
# gem.add_development_dependency "shoulda"
|
23
|
+
# gem.add_development_dependency "sqlite3"
|
24
|
+
# gem.add_development_dependency "pry"
|
23
25
|
end
|
data/lib/has_metrics/metrics.rb
CHANGED
@@ -13,7 +13,7 @@ module Metrics
|
|
13
13
|
belongs_to base.to_s.underscore.to_sym, :foreign_key => 'id'
|
14
14
|
@object_class = base
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
base.class_eval do
|
18
18
|
if klass.table_exists?
|
19
19
|
@metrics_class = klass
|
@@ -23,7 +23,7 @@ module Metrics
|
|
23
23
|
@metrics_class = base
|
24
24
|
base.extend(Metrics::MetricsClass)
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
def metrics
|
28
28
|
@metrics ||= self.class.metrics_class.find_or_create_by_id(id)
|
29
29
|
end
|
@@ -54,7 +54,7 @@ module Metrics
|
|
54
54
|
result = nil if result.is_a?(Float) && !result.finite?
|
55
55
|
begin
|
56
56
|
metrics.send "#{name}=", result
|
57
|
-
metrics.send "#{datestamp_column}=", Time.
|
57
|
+
metrics.send "#{datestamp_column}=", Time.current
|
58
58
|
rescue NoMethodError => e
|
59
59
|
raise e unless e.name == "#{name}=".to_sym
|
60
60
|
# This happens if the migrations haven't run yet for this metric. We should still calculate & return the metric.
|
@@ -67,6 +67,7 @@ module Metrics
|
|
67
67
|
end
|
68
68
|
|
69
69
|
(@metrics ||= []) << name.to_sym
|
70
|
+
@metrics.uniq!
|
70
71
|
|
71
72
|
if respond_to?(:has_custom_order_by) # TODO: carve out has_custom_order_by functionality into this gem
|
72
73
|
unless metrics_class == self
|
@@ -75,7 +76,7 @@ module Metrics
|
|
75
76
|
end
|
76
77
|
end
|
77
78
|
end
|
78
|
-
|
79
|
+
|
79
80
|
if options[:type] && (options[:type].to_sym == :float)
|
80
81
|
(@float_metrics ||= []) << name.to_sym
|
81
82
|
end
|
@@ -84,7 +85,7 @@ module Metrics
|
|
84
85
|
def metrics
|
85
86
|
@metrics
|
86
87
|
end
|
87
|
-
|
88
|
+
|
88
89
|
def metrics_column_type(column)
|
89
90
|
case
|
90
91
|
when (column.to_s =~ /^by_(.+)$/) && respond_to?(:segment_categories) && segment_categories.include?($1.to_sym) # TODO: carve out segementation functionality into this gem
|
@@ -97,7 +98,7 @@ module Metrics
|
|
97
98
|
:integer
|
98
99
|
end
|
99
100
|
end
|
100
|
-
|
101
|
+
|
101
102
|
def update_all_metrics!(*args)
|
102
103
|
metrics_class.migrate!
|
103
104
|
# start_time = Time.zone.now
|
@@ -107,8 +108,13 @@ module Metrics
|
|
107
108
|
# puts "Updating #{total} records."
|
108
109
|
# progress_bar = ProgressBar.new("Progress", total)
|
109
110
|
# end
|
110
|
-
|
111
|
-
|
111
|
+
find_in_batches do |batch|
|
112
|
+
metrics_class.transaction do
|
113
|
+
batch.each do |record|
|
114
|
+
# puts "Updating record ##{record.id}: #{record}"
|
115
|
+
record.update_metrics!(*args)
|
116
|
+
end
|
117
|
+
end
|
112
118
|
# progress_bar.inc if progress_bar
|
113
119
|
end
|
114
120
|
# progress_bar.finish if progress_bar
|
@@ -118,14 +124,14 @@ module Metrics
|
|
118
124
|
end
|
119
125
|
end
|
120
126
|
### END CLASS METHODS, START INSTANCE METHODS
|
121
|
-
|
127
|
+
|
122
128
|
def update_metrics!(*args)
|
123
129
|
self.class.metrics.each do |metric|
|
124
130
|
send(metric, *args)
|
125
131
|
end
|
126
132
|
end
|
127
133
|
### END INSTANCE METHODS
|
128
|
-
|
134
|
+
|
129
135
|
### Sets up a class like "SiteMetrics". These are all CLASS methods:
|
130
136
|
module MetricsClass
|
131
137
|
def object_class
|
@@ -137,7 +143,7 @@ module Metrics
|
|
137
143
|
end
|
138
144
|
|
139
145
|
def required_columns
|
140
|
-
|
146
|
+
@object_class.metrics.map(&:to_s) + metrics_updated_at_columns
|
141
147
|
end
|
142
148
|
|
143
149
|
def missing_columns
|
@@ -151,9 +157,9 @@ module Metrics
|
|
151
157
|
raise "Cannot determine if there were extra columns for has_metric when using the table itself for storing the metric! Remove any columns manually"
|
152
158
|
[] # We wont know what columns are excessive if the source changed
|
153
159
|
else
|
154
|
-
(columns.map(&:name) - %w(id created_at updated_at)) - required_columns
|
160
|
+
(columns.map(&:name) - %w(id created_at updated_at)) - required_columns
|
155
161
|
end
|
156
|
-
|
162
|
+
|
157
163
|
end
|
158
164
|
|
159
165
|
class Metrics::Migration < ActiveRecord::Migration
|
@@ -177,15 +183,18 @@ module Metrics
|
|
177
183
|
old_metrics = @object_class.metrics
|
178
184
|
@object_class.class_eval { @metrics = [] }
|
179
185
|
migrate!
|
180
|
-
@object_class.class_eval { @metrics = old_metrics }
|
186
|
+
@object_class.class_eval { @metrics = old_metrics }
|
181
187
|
migrate!
|
182
188
|
end
|
183
189
|
|
184
190
|
def migrate!
|
191
|
+
# don't migrate if metrics are kept in current class
|
192
|
+
return if @object_class == self
|
193
|
+
|
185
194
|
Metrics::Migration.setup(self)
|
186
|
-
Metrics::Migration.down unless
|
195
|
+
Metrics::Migration.down unless extra_columns.empty?
|
187
196
|
Metrics::Migration.up unless missing_columns.empty?
|
188
197
|
reset_column_information
|
189
198
|
end
|
190
199
|
end
|
191
|
-
end
|
200
|
+
end
|
data/lib/has_metrics/version.rb
CHANGED
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Metrics do
|
4
|
+
describe "defining metrics" do
|
5
|
+
let(:user) { User.create(:name => "Fuzz") }
|
6
|
+
|
7
|
+
before do
|
8
|
+
create_tables_for(:user)
|
9
|
+
|
10
|
+
class User < ActiveRecord::Base
|
11
|
+
include Metrics
|
12
|
+
has_metric :name_length do
|
13
|
+
name.length
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
User.update_all_metrics!
|
18
|
+
end
|
19
|
+
|
20
|
+
it "creates rows for the metrics" do
|
21
|
+
UserMetrics.columns.count.should == 3
|
22
|
+
User.has_metric :name_length_squared do
|
23
|
+
name_length * name_length
|
24
|
+
end
|
25
|
+
User.update_all_metrics!
|
26
|
+
UserMetrics.columns.count.should == 5
|
27
|
+
user.name_length_squared.should == 16
|
28
|
+
end
|
29
|
+
|
30
|
+
it "calculates their block when called" do
|
31
|
+
user.name.should == "Fuzz"
|
32
|
+
user.name_length.should == 4
|
33
|
+
|
34
|
+
user.name = "Bib"
|
35
|
+
|
36
|
+
# since 20 hours hasn't passed, the value is pulled from cache, not recalculated
|
37
|
+
user.name_length.should == 4
|
38
|
+
# (true) forces it to recalculate right away
|
39
|
+
user.name_length(true).should == 3
|
40
|
+
|
41
|
+
# since it wasn't saved, it's the same in the DB
|
42
|
+
User.find_by_name("Fuzz").name_length.should == 4
|
43
|
+
|
44
|
+
user.save
|
45
|
+
user.name_length(true).should == 3
|
46
|
+
User.find_by_name("Bib").name_length.should == 3
|
47
|
+
end
|
48
|
+
|
49
|
+
it "has their values precomputed" do
|
50
|
+
user
|
51
|
+
User.update_all_metrics!
|
52
|
+
UserMetrics.count(:group => :name_length).should == {4=>1}
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Segmentation do
|
4
|
+
before do
|
5
|
+
create_tables_for(:post)
|
6
|
+
|
7
|
+
class Post < ActiveRecord::Base
|
8
|
+
include Metrics
|
9
|
+
include Segmentation
|
10
|
+
|
11
|
+
segment_by :name_length do
|
12
|
+
case name.length
|
13
|
+
when 0..6
|
14
|
+
"short"
|
15
|
+
when 7
|
16
|
+
"seven"
|
17
|
+
else
|
18
|
+
"long"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "defining segments" do
|
25
|
+
before do
|
26
|
+
Post.create(:name => "Shorty")
|
27
|
+
Post.create(:name => "Seven!!")
|
28
|
+
Post.create(:name => "Really long")
|
29
|
+
Post.update_all_metrics!
|
30
|
+
end
|
31
|
+
|
32
|
+
it "segments properly" do
|
33
|
+
PostMetrics.count(:group => :by_name_length).should == {'short'=>1, 'seven'=>1, 'long'=>1}
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
ActiveRecord::Base.establish_connection adapter: "sqlite3", database: ":memory:"
|
2
|
+
|
3
|
+
# ActiveRecord::Migrator.up "db/migrate"
|
4
|
+
|
5
|
+
def create_tables_for(model = :user)
|
6
|
+
ActiveRecord::Migration.create_table "#{model}s", :force => true do |t|
|
7
|
+
t.string "name"
|
8
|
+
end
|
9
|
+
ActiveRecord::Migration.create_table "#{model}_metrics", :force => true
|
10
|
+
end
|
metadata
CHANGED
@@ -1,94 +1,55 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: has_metrics
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.6
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Allan Grant
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-
|
11
|
+
date: 2013-05-01 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: activerecord
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '>='
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rake
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - '>='
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: '0'
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - '>='
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: '0'
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
|
-
name:
|
42
|
+
name: bundler
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - '>='
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: '0'
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
- !ruby/object:Gem::Dependency
|
63
|
-
name: sqlite3
|
64
|
-
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
|
-
requirements:
|
67
|
-
- - ! '>='
|
68
|
-
- !ruby/object:Gem::Version
|
69
|
-
version: '0'
|
70
|
-
type: :development
|
71
|
-
prerelease: false
|
72
|
-
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
|
-
requirements:
|
75
|
-
- - ! '>='
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
version: '0'
|
78
|
-
- !ruby/object:Gem::Dependency
|
79
|
-
name: pry
|
80
|
-
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
|
-
requirements:
|
83
|
-
- - ! '>='
|
84
|
-
- !ruby/object:Gem::Version
|
85
|
-
version: '0'
|
86
|
-
type: :development
|
87
|
-
prerelease: false
|
88
|
-
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
|
-
requirements:
|
91
|
-
- - ! '>='
|
52
|
+
- - '>='
|
92
53
|
- !ruby/object:Gem::Version
|
93
54
|
version: '0'
|
94
55
|
description: Calculate metrics and store them in the DB.
|
@@ -108,42 +69,37 @@ files:
|
|
108
69
|
- lib/has_metrics/metrics.rb
|
109
70
|
- lib/has_metrics/segmentation.rb
|
110
71
|
- lib/has_metrics/version.rb
|
111
|
-
-
|
112
|
-
-
|
113
|
-
-
|
114
|
-
-
|
72
|
+
- spec/metrics_spec.rb
|
73
|
+
- spec/segmentation_spec.rb
|
74
|
+
- spec/spec_helper.rb
|
75
|
+
- spec/support/active_record.rb
|
115
76
|
homepage: http://github.com/allangrant/has_metrics
|
116
|
-
licenses:
|
77
|
+
licenses:
|
78
|
+
- MIT
|
79
|
+
metadata: {}
|
117
80
|
post_install_message:
|
118
81
|
rdoc_options: []
|
119
82
|
require_paths:
|
120
83
|
- lib
|
121
84
|
required_ruby_version: !ruby/object:Gem::Requirement
|
122
|
-
none: false
|
123
85
|
requirements:
|
124
|
-
- -
|
86
|
+
- - '>='
|
125
87
|
- !ruby/object:Gem::Version
|
126
88
|
version: '0'
|
127
|
-
segments:
|
128
|
-
- 0
|
129
|
-
hash: 3863609123876362244
|
130
89
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
131
|
-
none: false
|
132
90
|
requirements:
|
133
|
-
- -
|
91
|
+
- - '>='
|
134
92
|
- !ruby/object:Gem::Version
|
135
93
|
version: '0'
|
136
|
-
segments:
|
137
|
-
- 0
|
138
|
-
hash: 3863609123876362244
|
139
94
|
requirements: []
|
140
95
|
rubyforge_project:
|
141
|
-
rubygems_version:
|
96
|
+
rubygems_version: 2.0.3
|
142
97
|
signing_key:
|
143
|
-
specification_version:
|
98
|
+
specification_version: 4
|
144
99
|
summary: Calculate "metrics" (any expensive methods) on ActiveRecord entries and memoize
|
145
100
|
them to an automagical table.
|
146
101
|
test_files:
|
147
|
-
-
|
148
|
-
-
|
149
|
-
-
|
102
|
+
- spec/metrics_spec.rb
|
103
|
+
- spec/segmentation_spec.rb
|
104
|
+
- spec/spec_helper.rb
|
105
|
+
- spec/support/active_record.rb
|
@@ -1,51 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + "/../test_helper")
|
2
|
-
|
3
|
-
class User < ActiveRecord::Base
|
4
|
-
include Metrics
|
5
|
-
has_metric :name_length do
|
6
|
-
name.length
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
class MetricsTest < Test::Unit::TestCase
|
11
|
-
context "when defining metrics" do
|
12
|
-
setup do
|
13
|
-
CreateTestTables.up(:user)
|
14
|
-
@user = User.create(:name => "Fuzz")
|
15
|
-
User.update_all_metrics!
|
16
|
-
end
|
17
|
-
|
18
|
-
should "create rows for the metrics" do
|
19
|
-
assert_equal 3, UserMetrics.columns.count
|
20
|
-
User.has_metric :name_length_squared do
|
21
|
-
name_length * name_length
|
22
|
-
end
|
23
|
-
User.update_all_metrics!
|
24
|
-
assert_equal 5, UserMetrics.columns.count
|
25
|
-
assert_equal 16, @user.name_length_squared
|
26
|
-
end
|
27
|
-
|
28
|
-
should "calculate their block when called" do
|
29
|
-
assert_equal "Fuzz", @user.name
|
30
|
-
assert_equal 4, @user.name_length
|
31
|
-
|
32
|
-
@user.name = "Bib"
|
33
|
-
|
34
|
-
# since 20 hours hasn't passed, the value is pulled from cache, not recalculated
|
35
|
-
assert_equal 4, @user.name_length
|
36
|
-
# (true) forces it to recalculate right away
|
37
|
-
assert_equal 3, @user.name_length(true)
|
38
|
-
|
39
|
-
# since it wasn't saved, it's the same in the DB
|
40
|
-
assert_equal 4, User.find_by_name("Fuzz").name_length
|
41
|
-
|
42
|
-
@user.save
|
43
|
-
assert_equal 3, @user.name_length(true)
|
44
|
-
assert_equal 3, User.find_by_name("Bib").name_length
|
45
|
-
end
|
46
|
-
|
47
|
-
should "have their values precomputed" do
|
48
|
-
assert_equal({4=>1}, UserMetrics.count(:group => :name_length))
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + "/../test_helper")
|
2
|
-
|
3
|
-
class Post < ActiveRecord::Base
|
4
|
-
include Metrics
|
5
|
-
include Segmentation
|
6
|
-
|
7
|
-
segment_by :name_length do
|
8
|
-
case name.length
|
9
|
-
when 0..6
|
10
|
-
"short"
|
11
|
-
when 7
|
12
|
-
"seven"
|
13
|
-
else
|
14
|
-
"long"
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
class SegmentationTest < Test::Unit::TestCase
|
20
|
-
context "when defining segments" do
|
21
|
-
setup do
|
22
|
-
CreateTestTables.up(:post)
|
23
|
-
|
24
|
-
Post.create(:name => "Shorty")
|
25
|
-
Post.create(:name => "Seven!!")
|
26
|
-
Post.create(:name => "Really long")
|
27
|
-
Post.update_all_metrics!
|
28
|
-
end
|
29
|
-
|
30
|
-
should "segment properly" do
|
31
|
-
assert_equal({'short'=>1, 'seven'=>1, 'long'=>1}, PostMetrics.count(:group => :by_name_length))
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
data/test/test_helper.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
|
3
|
-
# Want to test the files here, in lib, not in an installed version of the gem.
|
4
|
-
$:.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
|
5
|
-
|
6
|
-
require 'shoulda'
|
7
|
-
# require 'mocha'
|
8
|
-
require 'active_record'
|
9
|
-
require 'sqlite3'
|
10
|
-
require 'has_metrics'
|
11
|
-
require 'pry'
|
12
|
-
|
13
|
-
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => File.expand_path(File.dirname(__FILE__) + "/../test.db"))
|
14
|
-
|
15
|
-
|
16
|
-
class CreateTestTables < ActiveRecord::Migration
|
17
|
-
def self.up(model = :user)
|
18
|
-
create_table "#{model}s", :force => true do |t|
|
19
|
-
t.string "name"
|
20
|
-
end
|
21
|
-
create_table "#{model}_metrics", :force => true
|
22
|
-
end
|
23
|
-
|
24
|
-
def self.down(model = :user)
|
25
|
-
drop_table "#{model}s"
|
26
|
-
drop_table "#{model}_metrics"
|
27
|
-
end
|
28
|
-
end
|
data/test.db
DELETED
Binary file
|