appstats 0.6.1 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- appstats (0.6.1)
4
+ appstats (0.7.0)
5
5
  daemons
6
6
  net-scp
7
7
  rails (>= 2.3.0)
@@ -0,0 +1,33 @@
1
+ class CreateAppstatsResults < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :appstats_results do |t|
4
+ t.string :name
5
+ t.string :result_type
6
+ t.text :query
7
+ t.text :query_as_sql
8
+ t.integer :count
9
+ t.string :action
10
+ t.string :host
11
+ t.integer :page
12
+ t.datetime :from_date
13
+ t.datetime :to_date
14
+ t.timestamps
15
+ end
16
+
17
+ add_index :appstats_results, :name
18
+ add_index :appstats_results, :action
19
+ add_index :appstats_results, :host
20
+ add_index :appstats_results, :page
21
+
22
+ end
23
+
24
+ def self.down
25
+
26
+ remove_index :appstats_results, :name
27
+ remove_index :appstats_results, :action
28
+ remove_index :appstats_results, :host
29
+ remove_index :appstats_results, :page
30
+
31
+ drop_table :appstats_results
32
+ end
33
+ end
data/db/schema.rb CHANGED
@@ -10,7 +10,7 @@
10
10
  #
11
11
  # It's strongly recommended to check this file into your version control system.
12
12
 
13
- ActiveRecord::Schema.define(:version => 20110210185911) do
13
+ ActiveRecord::Schema.define(:version => 20110210225606) do
14
14
 
15
15
  create_table "appstats_actions", :force => true do |t|
16
16
  t.string "name"
@@ -66,6 +66,26 @@ ActiveRecord::Schema.define(:version => 20110210185911) do
66
66
 
67
67
  add_index "appstats_log_collectors", ["host"], :name => "index_appstats_log_collectors_on_host"
68
68
 
69
+ create_table "appstats_results", :force => true do |t|
70
+ t.string "name"
71
+ t.string "result_type"
72
+ t.text "query"
73
+ t.text "query_as_sql"
74
+ t.integer "count"
75
+ t.string "action"
76
+ t.string "host"
77
+ t.integer "page"
78
+ t.datetime "from_date"
79
+ t.datetime "to_date"
80
+ t.datetime "created_at"
81
+ t.datetime "updated_at"
82
+ end
83
+
84
+ add_index "appstats_results", ["action"], :name => "index_appstats_results_on_action"
85
+ add_index "appstats_results", ["host"], :name => "index_appstats_results_on_host"
86
+ add_index "appstats_results", ["name"], :name => "index_appstats_results_on_name"
87
+ add_index "appstats_results", ["page"], :name => "index_appstats_results_on_page"
88
+
69
89
  create_table "appstats_test_objects", :force => true do |t|
70
90
  t.string "name"
71
91
  t.datetime "created_at"
data/lib/appstats.rb CHANGED
@@ -11,6 +11,7 @@ require "#{File.dirname(__FILE__)}/appstats/tasks"
11
11
  require "#{File.dirname(__FILE__)}/appstats/logger"
12
12
  require "#{File.dirname(__FILE__)}/appstats/log_collector"
13
13
  require "#{File.dirname(__FILE__)}/appstats/query"
14
+ require "#{File.dirname(__FILE__)}/appstats/result"
14
15
  require "#{File.dirname(__FILE__)}/appstats/test_object"
15
16
 
16
17
  # required in the appstats.gemspec
@@ -10,16 +10,26 @@ module Appstats
10
10
  @format = data[:format] || :inclusive
11
11
  end
12
12
 
13
- def from_to_s
13
+ def from_date
14
14
  return nil if @from.nil?
15
15
  mode = @format == :inclusive ? :start : :end
16
- @from.to_time(mode).strftime('%Y-%m-%d %H:%M:%S')
16
+ @from.to_time(mode)
17
17
  end
18
-
19
- def to_to_s
18
+
19
+ def to_date
20
20
  return nil if @to.nil?
21
21
  mode = @format == :exclusive ? :start : :end
22
- @to.to_time(mode).strftime('%Y-%m-%d %H:%M:%S')
22
+ @to.to_time(mode)
23
+ end
24
+
25
+ def from_date_to_s
26
+ return nil if from_date.nil?
27
+ from_date.strftime('%Y-%m-%d %H:%M:%S')
28
+ end
29
+
30
+ def to_date_to_s
31
+ return nil if to_date.nil?
32
+ to_date.strftime('%Y-%m-%d %H:%M:%S')
23
33
  end
24
34
 
25
35
  def to_sql
@@ -28,9 +38,9 @@ module Appstats
28
38
  if !@from.nil? && @to.nil?
29
39
  return case @format
30
40
  when :inclusive then
31
- "occurred_at >= '#{from_to_s}'"
41
+ "occurred_at >= '#{from_date_to_s}'"
32
42
  when :exclusive then
33
- "occurred_at > '#{from_to_s}'"
43
+ "occurred_at > '#{from_date_to_s}'"
34
44
  when :fixed_point then
35
45
  answer = "("
36
46
  [:year,:month,:day,:hour,:min,:sec].each do |t|
@@ -43,14 +53,14 @@ module Appstats
43
53
  end
44
54
  elsif @from.nil? && !@to.nil?
45
55
  return case @format
46
- when :inclusive then "occurred_at <= '#{to_to_s}'"
47
- when :exclusive then "occurred_at < '#{to_to_s}'"
56
+ when :inclusive then "occurred_at <= '#{to_date_to_s}'"
57
+ when :exclusive then "occurred_at < '#{to_date_to_s}'"
48
58
  else "1=1"
49
59
  end
50
60
  else
51
61
  return case @format
52
- when :inclusive then "(occurred_at >= '#{from_to_s}' and occurred_at <= '#{to_to_s}')"
53
- when :exclusive then "(occurred_at > '#{from_to_s}' and occurred_at < '#{to_to_s}')"
62
+ when :inclusive then "(occurred_at >= '#{from_date_to_s}' and occurred_at <= '#{to_date_to_s}')"
63
+ when :exclusive then "(occurred_at > '#{from_date_to_s}' and occurred_at < '#{to_date_to_s}')"
54
64
  else "1=1"
55
65
  end
56
66
  end
@@ -3,40 +3,22 @@ module Appstats
3
3
  class Query
4
4
 
5
5
  @@default = "1=1"
6
- attr_accessor :input
6
+ attr_accessor :query, :action, :host, :date_range, :query_to_sql
7
7
 
8
8
  def initialize(data = {})
9
- @input = data[:input]
9
+ self.query=(data[:query])
10
10
  end
11
11
 
12
- def run
13
- ActiveRecord::Base.connection.select_one(to_sql)["count(*)"].to_i
12
+ def query=(value)
13
+ @query = value
14
+ parse_query
14
15
  end
15
16
 
16
- def to_sql
17
- sql = "select count(*) from appstats_entries"
18
- return sql if @input.nil?
19
- current_input = @input
20
-
21
- m = current_input.match(/^\s*(\#)\s*([^\s]*)\s*(.*)/)
22
- return sql if m.nil?
23
- if m[1] == "#"
24
- sql += " where action = '#{normalize_action_name(m[2])}'"
25
- end
26
- current_input = m[3]
27
-
28
- m_on_server = current_input.match(/^(.*)?\s*on\s*server\s*(.*)$/)
29
- date_range = m_on_server.nil? ? current_input : m_on_server[1]
30
- if date_range.size > 0
31
- range = DateRange.parse(date_range)
32
- sql += " and #{range.to_sql}" unless range.to_sql == "1=1"
33
- end
34
- return sql if m_on_server.nil?
35
-
36
- host_name = m_on_server[2]
37
- sql += " and exists (select * from appstats_log_collectors where appstats_entries.appstats_log_collector_id = appstats_log_collectors.id and host = '#{host_name}')"
38
-
39
- sql
17
+ def run
18
+ result = Appstats::Result.new(:result_type => :on_demand, :query => @query, :query_as_sql => @query_to_sql, :action => @action, :host => @host, :from_date => @date_range.from_date, :to_date => @date_range.to_date)
19
+ result.count = ActiveRecord::Base.connection.select_one(@query_to_sql)["count(*)"].to_i
20
+ result.save
21
+ result
40
22
  end
41
23
 
42
24
  def self.host_filter_to_sql(raw_input)
@@ -65,6 +47,36 @@ module Appstats
65
47
  action = Appstats::Action.where("plural_name = ?",action_name).first
66
48
  action.nil? ? action_name : action.name
67
49
  end
50
+
51
+ def parse_query
52
+ @query_to_sql = "select count(*) from appstats_entries"
53
+ @action = nil
54
+ @host = nil
55
+ @date_range = DateRange.new
56
+ return @query_to_sql if @query.nil?
57
+ current_query = @query
58
+
59
+ m = current_query.match(/^\s*(\#)\s*([^\s]*)\s*(.*)/)
60
+ return @query_to_sql if m.nil?
61
+ if m[1] == "#"
62
+ @action = normalize_action_name(m[2])
63
+ @query_to_sql += " where action = '#{@action}'"
64
+ end
65
+ current_query = m[3]
66
+
67
+ m_on_server = current_query.match(/^(.*)?\s*on\s*server\s*(.*)$/)
68
+ date_range_text = m_on_server.nil? ? current_query : m_on_server[1]
69
+ if date_range_text.size > 0
70
+ @date_range = DateRange.parse(date_range_text)
71
+ @query_to_sql += " and #{@date_range.to_sql}" unless @date_range.to_sql == "1=1"
72
+ end
73
+ return @query_to_sql if m_on_server.nil?
74
+
75
+ @host = m_on_server[2]
76
+ @query_to_sql += " and exists (select * from appstats_log_collectors where appstats_entries.appstats_log_collector_id = appstats_log_collectors.id and host = '#{@host}')"
77
+
78
+ @query_to_sql
79
+ end
68
80
 
69
81
 
70
82
  end
@@ -0,0 +1,20 @@
1
+ module Appstats
2
+ class Result < ActiveRecord::Base
3
+ set_table_name "appstats_results"
4
+
5
+ attr_accessible :name, :result_type, :query, :query_as_sql, :count, :action, :host, :from_date, :to_date
6
+
7
+ def ==(o)
8
+ o.class == self.class && o.send(:state) == state
9
+ end
10
+ alias_method :eql?, :==
11
+
12
+ private
13
+
14
+ def state
15
+ [name, result_type, query, query_as_sql, count, action, host, from_date, to_date]
16
+ end
17
+
18
+
19
+ end
20
+ end
@@ -1,3 +1,3 @@
1
1
  module Appstats
2
- VERSION = "0.6.1"
2
+ VERSION = "0.7.0"
3
3
  end
@@ -197,41 +197,76 @@ module Appstats
197
197
  end
198
198
 
199
199
 
200
- describe "#from_to_s" do
200
+ describe "#from_date_to_s" do
201
201
  it "should handle nil" do
202
- DateRange.new.from_to_s.should == nil
202
+ DateRange.new.from_date_to_s.should == nil
203
203
  end
204
204
 
205
205
  it "should be based on time" do
206
- DateRange.new(:from => EntryDate.new(:year => 2010)).from_to_s.should == "2010-01-01 00:00:00"
206
+ DateRange.new(:from => EntryDate.new(:year => 2010)).from_date_to_s.should == "2010-01-01 00:00:00"
207
207
  end
208
208
 
209
209
  it "should be based on end_of time as-is for exclusive" do
210
- DateRange.new(:from => EntryDate.new(:year => 2009), :format => :exclusive).from_to_s.should == "2009-12-31 23:59:59"
211
- DateRange.new(:from => EntryDate.new(:year => 2009, :month => 2), :format => :exclusive).from_to_s.should == "2009-02-28 23:59:59"
212
- DateRange.new(:from => EntryDate.new(:year => 2009, :month => 2, :day => 15), :format => :exclusive).from_to_s.should == "2009-02-15 23:59:59"
210
+ DateRange.new(:from => EntryDate.new(:year => 2009), :format => :exclusive).from_date_to_s.should == "2009-12-31 23:59:59"
211
+ DateRange.new(:from => EntryDate.new(:year => 2009, :month => 2), :format => :exclusive).from_date_to_s.should == "2009-02-28 23:59:59"
212
+ DateRange.new(:from => EntryDate.new(:year => 2009, :month => 2, :day => 15), :format => :exclusive).from_date_to_s.should == "2009-02-15 23:59:59"
213
213
  end
214
214
 
215
215
  end
216
216
 
217
- describe "#to_to_s" do
217
+ describe "#to_date_to_s" do
218
218
  it "should handle nil" do
219
- DateRange.new.to_to_s.should == nil
219
+ DateRange.new.to_date_to_s.should == nil
220
220
  end
221
221
 
222
222
  it "should be based on time as-is for exclusive" do
223
- DateRange.new(:to => EntryDate.new(:year => 2009), :format => :exclusive).to_to_s.should == "2009-01-01 00:00:00"
223
+ DateRange.new(:to => EntryDate.new(:year => 2009), :format => :exclusive).to_date_to_s.should == "2009-01-01 00:00:00"
224
224
  end
225
225
 
226
226
  it "should be based on end_of time as-is for inclusive" do
227
- DateRange.new(:to => EntryDate.new(:year => 2009), :format => :inclusive).to_to_s.should == "2009-12-31 23:59:59"
228
- DateRange.new(:to => EntryDate.new(:year => 2009, :month => 2), :format => :inclusive).to_to_s.should == "2009-02-28 23:59:59"
229
- DateRange.new(:to => EntryDate.new(:year => 2009, :month => 2, :day => 15), :format => :inclusive).to_to_s.should == "2009-02-15 23:59:59"
227
+ DateRange.new(:to => EntryDate.new(:year => 2009), :format => :inclusive).to_date_to_s.should == "2009-12-31 23:59:59"
228
+ DateRange.new(:to => EntryDate.new(:year => 2009, :month => 2), :format => :inclusive).to_date_to_s.should == "2009-02-28 23:59:59"
229
+ DateRange.new(:to => EntryDate.new(:year => 2009, :month => 2, :day => 15), :format => :inclusive).to_date_to_s.should == "2009-02-15 23:59:59"
230
230
  end
231
231
 
232
232
 
233
233
  end
234
234
 
235
+ describe "#from_date" do
236
+ it "should handle nil" do
237
+ DateRange.new.from_date.should == nil
238
+ end
239
+
240
+ it "should be based on time" do
241
+ DateRange.new(:from => EntryDate.new(:year => 2010)).from_date.to_s.should == Time.parse("2010-01-01 00:00:00").to_s
242
+ end
243
+
244
+ it "should be based on end_of time as-is for exclusive" do
245
+ DateRange.new(:from => EntryDate.new(:year => 2009), :format => :exclusive).from_date.to_s.should == Time.parse("2009-12-31 23:59:59").to_s
246
+ DateRange.new(:from => EntryDate.new(:year => 2009, :month => 2), :format => :exclusive).from_date.to_s.should == Time.parse("2009-02-28 23:59:59").to_s
247
+ DateRange.new(:from => EntryDate.new(:year => 2009, :month => 2, :day => 15), :format => :exclusive).from_date.to_s.should == Time.parse("2009-02-15 23:59:59").to_s
248
+ end
249
+
250
+ end
251
+
252
+ describe "#to_date" do
253
+ it "should handle nil" do
254
+ DateRange.new.to_date.should == nil
255
+ end
256
+
257
+ it "should be based on time as-is for exclusive" do
258
+ DateRange.new(:to => EntryDate.new(:year => 2009), :format => :exclusive).to_date.to_s.should == Time.parse("2009-01-01 00:00:00").to_s
259
+ end
260
+
261
+ it "should be based on end_of time as-is for inclusive" do
262
+ DateRange.new(:to => EntryDate.new(:year => 2009), :format => :inclusive).to_date.to_s.should == Time.parse("2009-12-31 23:59:59").to_s
263
+ DateRange.new(:to => EntryDate.new(:year => 2009, :month => 2), :format => :inclusive).to_date.to_s.should == Time.parse("2009-02-28 23:59:59").to_s
264
+ DateRange.new(:to => EntryDate.new(:year => 2009, :month => 2, :day => 15), :format => :inclusive).to_date.to_s.should == Time.parse("2009-02-15 23:59:59").to_s
265
+ end
266
+
267
+
268
+ end
269
+
235
270
  describe "#to_sql" do
236
271
 
237
272
  before(:each) do
data/spec/entry_spec.rb CHANGED
@@ -188,18 +188,18 @@ module Appstats
188
188
  end
189
189
 
190
190
  it "should understand an entry without contexts" do
191
- entry = Entry.load_from_logger_entry("0.6.1 setup[:,=,-n] 2010-09-21 23:15:20 action=address_search")
191
+ entry = Entry.load_from_logger_entry("0.7.0 setup[:,=,-n] 2010-09-21 23:15:20 action=address_search")
192
192
  Entry.count.should == @before_count + 1
193
193
  entry.action.should == "address_search"
194
- entry.raw_entry.should == "0.6.1 setup[:,=,-n] 2010-09-21 23:15:20 action=address_search"
194
+ entry.raw_entry.should == "0.7.0 setup[:,=,-n] 2010-09-21 23:15:20 action=address_search"
195
195
  entry.occurred_at.should == Time.parse("2010-09-21 23:15:20")
196
196
  end
197
197
 
198
198
  it "should understand contexts" do
199
- entry = Entry.load_from_logger_entry("0.6.1 setup[:,=,-n] 2010-09-21 23:15:20 action=address_filter : app_name=Market : server=Live")
199
+ entry = Entry.load_from_logger_entry("0.7.0 setup[:,=,-n] 2010-09-21 23:15:20 action=address_filter : app_name=Market : server=Live")
200
200
  Entry.count.should == @before_count + 1
201
201
  entry.action.should == "address_filter"
202
- entry.raw_entry.should == "0.6.1 setup[:,=,-n] 2010-09-21 23:15:20 action=address_filter : app_name=Market : server=Live"
202
+ entry.raw_entry.should == "0.7.0 setup[:,=,-n] 2010-09-21 23:15:20 action=address_filter : app_name=Market : server=Live"
203
203
  entry.occurred_at.should == Time.parse("2010-09-21 23:15:20")
204
204
  entry.contexts.size.should == 2
205
205
  entry.contexts[0].context_key = "app_name"
data/spec/logger_spec.rb CHANGED
@@ -115,7 +115,7 @@ module Appstats
115
115
 
116
116
  it "should accept numbers" do
117
117
  Appstats::Logger.entry(5, :blah => 6)
118
- Appstats::Logger.raw_read.should == ["0.6.1 setup[:,=,-n] 2010-09-21 23:15:20 action=5 : blah=6"]
118
+ Appstats::Logger.raw_read.should == ["0.7.0 setup[:,=,-n] 2010-09-21 23:15:20 action=5 : blah=6"]
119
119
  end
120
120
 
121
121
  end
@@ -124,7 +124,7 @@ module Appstats
124
124
 
125
125
  it "should look similar to regular entry" do
126
126
  Appstats::Logger.exception_entry(RuntimeError.new("blah"),:on => "login")
127
- Appstats::Logger.raw_read.should == ["0.6.1 setup[:,=,-n] 2010-09-21 23:15:20 action=appstats-exception : error=blah : on=login"]
127
+ Appstats::Logger.raw_read.should == ["0.7.0 setup[:,=,-n] 2010-09-21 23:15:20 action=appstats-exception : error=blah : on=login"]
128
128
  end
129
129
 
130
130
  end
@@ -141,29 +141,29 @@ module Appstats
141
141
 
142
142
  it "should handle a statistics entry" do
143
143
  expected = { :action => "address_search", :timestamp => "2010-09-21 23:15:20" }
144
- actual = Appstats::Logger.entry_to_hash("0.6.1 setup[:,=,-n] 2010-09-21 23:15:20 action=address_search")
144
+ actual = Appstats::Logger.entry_to_hash("0.7.0 setup[:,=,-n] 2010-09-21 23:15:20 action=address_search")
145
145
  actual.should == expected
146
146
  end
147
147
 
148
148
  it "should handle contexts" do
149
149
  expected = { :action => "address_filter", :timestamp => "2010-09-21 23:15:20", :server => "Live", :app_name => 'Market' }
150
- actual = Appstats::Logger.entry_to_hash("0.6.1 setup[:,=,-n] 2010-09-21 23:15:20 action=address_filter : app_name=Market : server=Live")
150
+ actual = Appstats::Logger.entry_to_hash("0.7.0 setup[:,=,-n] 2010-09-21 23:15:20 action=address_filter : app_name=Market : server=Live")
151
151
  actual.should == expected
152
152
  end
153
153
 
154
154
  it "should handle actions with the delimiter (and change the delimiter)" do
155
155
  expected = { :action => "address:=search-n", :timestamp => "2010-09-21 23:15:20" }
156
- actual = Appstats::Logger.entry_to_hash("0.6.1 setup[::,==,--n] 2010-09-21 23:15:20 action==address:=search-n")
156
+ actual = Appstats::Logger.entry_to_hash("0.7.0 setup[::,==,--n] 2010-09-21 23:15:20 action==address:=search-n")
157
157
  actual.should == expected
158
158
 
159
159
  expected = { :action => "address::search==--n", :timestamp => "2010-09-21 23:15:20" }
160
- actual = Appstats::Logger.entry_to_hash("0.6.1 setup[:::,===,---n] 2010-09-21 23:15:20 action===address::search==--n")
160
+ actual = Appstats::Logger.entry_to_hash("0.7.0 setup[:::,===,---n] 2010-09-21 23:15:20 action===address::search==--n")
161
161
  actual.should == expected
162
162
  end
163
163
 
164
164
  it "should handle contexts with the delimiter (and change the delimiter)" do
165
165
  expected = { :action => "address", :timestamp => "2010-09-21 23:15:20", :server => "market:eval=-n" }
166
- actual = Appstats::Logger.entry_to_hash("0.6.1 setup[::,==,--n] 2010-09-21 23:15:20 action==address :: server==market:eval=-n")
166
+ actual = Appstats::Logger.entry_to_hash("0.7.0 setup[::,==,--n] 2010-09-21 23:15:20 action==address :: server==market:eval=-n")
167
167
  actual.should == expected
168
168
  end
169
169
 
@@ -172,66 +172,66 @@ module Appstats
172
172
  describe "#entry_to_s" do
173
173
 
174
174
  it "should handle a statistics entry" do
175
- expected = "0.6.1 setup[:,=,-n] 2010-09-21 23:15:20 action=address_search"
175
+ expected = "0.7.0 setup[:,=,-n] 2010-09-21 23:15:20 action=address_search"
176
176
  actual = Appstats::Logger.entry_to_s("address_search")
177
177
  actual.should == expected
178
178
  end
179
179
 
180
180
  it "should handle numbers" do
181
- expected = "0.6.1 setup[:,=,-n] 2010-09-21 23:15:20 action=1 : note=2.2"
181
+ expected = "0.7.0 setup[:,=,-n] 2010-09-21 23:15:20 action=1 : note=2.2"
182
182
  actual = Appstats::Logger.entry_to_s(1,:note => 2.2)
183
183
  actual.should == expected
184
184
  end
185
185
 
186
186
  it "should handle default contexts" do
187
187
  Appstats::Logger.default_contexts[:app_name] = "market"
188
- expected = "0.6.1 setup[:,=,-n] 2010-09-21 23:15:20 action=address_search : app_name=market"
188
+ expected = "0.7.0 setup[:,=,-n] 2010-09-21 23:15:20 action=address_search : app_name=market"
189
189
  actual = Appstats::Logger.entry_to_s("address_search")
190
190
  actual.should == expected
191
191
  end
192
192
 
193
193
  it "should handle contexts (and sort them by symbol)" do
194
- expected = "0.6.1 setup[:,=,-n] 2010-09-21 23:15:20 action=address_filter : app_name=Market : server=Live"
194
+ expected = "0.7.0 setup[:,=,-n] 2010-09-21 23:15:20 action=address_filter : app_name=Market : server=Live"
195
195
  actual = Appstats::Logger.entry_to_s("address_filter", { :server => "Live", :app_name => 'Market' })
196
196
  actual.should == expected
197
197
  end
198
198
 
199
199
  it "should handle actions with the delimiter (and change the delimiter)" do
200
- expected = "0.6.1 setup[::,==,--n] 2010-09-21 23:15:20 action==address:=search-n"
200
+ expected = "0.7.0 setup[::,==,--n] 2010-09-21 23:15:20 action==address:=search-n"
201
201
  actual = Appstats::Logger.entry_to_s("address:=search-n")
202
202
  actual.should == expected
203
203
 
204
- expected = "0.6.1 setup[:::,===,---n] 2010-09-21 23:15:20 action===address::search==--n"
204
+ expected = "0.7.0 setup[:::,===,---n] 2010-09-21 23:15:20 action===address::search==--n"
205
205
  actual = Appstats::Logger.entry_to_s("address::search==--n")
206
206
  actual.should == expected
207
207
  end
208
208
 
209
209
  it "should handle contexts with the delimiter (and change the delimiter)" do
210
- expected = "0.6.1 setup[::,==,--n] 2010-09-21 23:15:20 action==address :: server==market:eval=-n"
210
+ expected = "0.7.0 setup[::,==,--n] 2010-09-21 23:15:20 action==address :: server==market:eval=-n"
211
211
  actual = Appstats::Logger.entry_to_s("address", :server => 'market:eval=-n')
212
212
  actual.should == expected
213
213
  end
214
214
 
215
215
  it "should ignore spaces" do
216
- expected = "0.6.1 setup[:,=,-n] 2010-09-21 23:15:20 action=address search"
216
+ expected = "0.7.0 setup[:,=,-n] 2010-09-21 23:15:20 action=address search"
217
217
  actual = Appstats::Logger.entry_to_s("address search")
218
218
  actual.should == expected
219
219
  end
220
220
 
221
221
  it "should convert newlines in action" do
222
- expected = "0.6.1 setup[:,=,-n] 2010-09-21 23:15:20 action=address_-nsearch"
222
+ expected = "0.7.0 setup[:,=,-n] 2010-09-21 23:15:20 action=address_-nsearch"
223
223
  actual = Appstats::Logger.entry_to_s("address_\nsearch")
224
224
  actual.should == expected
225
225
  end
226
226
 
227
227
  it "should convert newlines in context" do
228
- expected = "0.6.1 setup[:,=,-n] 2010-09-21 23:15:20 action=address_search : blah=some-nlong-nstatement"
228
+ expected = "0.7.0 setup[:,=,-n] 2010-09-21 23:15:20 action=address_search : blah=some-nlong-nstatement"
229
229
  actual = Appstats::Logger.entry_to_s("address_search",:blah => "some\nlong\nstatement")
230
230
  actual.should == expected
231
231
  end
232
232
 
233
233
  it "should convert newlines based on the delimiter" do
234
- expected = "0.6.1 setup[::,==,--n] 2010-09-21 23:15:20 action==address:=--nsearch-n"
234
+ expected = "0.7.0 setup[::,==,--n] 2010-09-21 23:15:20 action==address:=--nsearch-n"
235
235
  actual = Appstats::Logger.entry_to_s("address:=\nsearch-n")
236
236
  actual.should == expected
237
237
  end
data/spec/query_spec.rb CHANGED
@@ -10,15 +10,35 @@ module Appstats
10
10
  end
11
11
 
12
12
  it "should set input to nil" do
13
- @query.input.should == nil
13
+ @query.query.should == nil
14
14
  end
15
15
 
16
- it "should allow input on constructor" do
17
- query = Appstats::Query.new(:input => "# logins")
18
- query.input.should == "# logins"
16
+ it "should allow query on constructor" do
17
+ query = Appstats::Query.new(:query => "# logins")
18
+ query.query.should == "# logins"
19
19
  end
20
20
 
21
21
  end
22
+
23
+ describe "#input" do
24
+
25
+ it "should set the inputs to nil if input invalid" do
26
+ query = Appstats::Query.new(:query => "# myblahs today on server xyz.localnet")
27
+ query.query = nil
28
+ query.action.should == nil
29
+ query.host.should == nil
30
+ query.date_range.should == DateRange.new
31
+
32
+ end
33
+
34
+ it "should set the action and host" do
35
+ query = Appstats::Query.new(:query => "# myblahs today on server xyz.localnet")
36
+ query.action.should == "myblahs"
37
+ query.host.should == "xyz.localnet"
38
+ query.date_range.should == DateRange.parse("today")
39
+ end
40
+
41
+ end
22
42
 
23
43
  describe "#run" do
24
44
 
@@ -27,22 +47,24 @@ module Appstats
27
47
  end
28
48
 
29
49
  it "should return 0 if no results" do
30
- query = Appstats::Query.new(:input => "# blahs")
31
- query.run.should == 0
50
+ query = Appstats::Query.new(:query => "# blahs")
51
+ result = query.run
52
+ result.new_record?.should == false
53
+ result.should == Appstats::Result.new(:result_type => :on_demand, :query => "# blahs", :query_as_sql => query.query_to_sql, :count => 0, :action => "blahs")
32
54
  end
33
55
 
34
56
  it "should track the count if available" do
35
57
  Appstats::Entry.create(:action => "myblahs")
36
- query = Appstats::Query.new(:input => "# myblahs")
37
- query.run.should == 1
58
+ query = Appstats::Query.new(:query => "# myblahs")
59
+ query.run.count.should == 1
38
60
  Appstats::Entry.create(:action => "myblahs")
39
- query.run.should == 2
61
+ query.run.count.should == 2
40
62
  end
41
-
63
+
42
64
  end
43
65
 
44
66
 
45
- describe "#to_sql" do
67
+ describe "#query_to_sql" do
46
68
 
47
69
  before(:all) do
48
70
  Appstats::Action.delete_all
@@ -51,22 +73,22 @@ module Appstats
51
73
 
52
74
  it "should return understand nil" do
53
75
  expected_sql = "select count(*) from appstats_entries"
54
- Appstats::Query.new(:input => nil).to_sql.should == expected_sql
55
- Appstats::Query.new(:input => "").to_sql.should == expected_sql
56
- Appstats::Query.new.to_sql.should == expected_sql
76
+ Appstats::Query.new(:query => nil).query_to_sql.should == expected_sql
77
+ Appstats::Query.new(:query => "").query_to_sql.should == expected_sql
78
+ Appstats::Query.new.query_to_sql.should == expected_sql
57
79
  end
58
80
 
59
81
  describe "actions" do
60
82
 
61
83
  it "should understand both singular and plural names" do
62
84
  expected_sql = "select count(*) from appstats_entries where action = 'login'"
63
- Appstats::Query.new(:input => "# logins").to_sql.should == expected_sql
64
- Appstats::Query.new(:input => "# login").to_sql.should == expected_sql
85
+ Appstats::Query.new(:query => "# logins").query_to_sql.should == expected_sql
86
+ Appstats::Query.new(:query => "# login").query_to_sql.should == expected_sql
65
87
  end
66
88
 
67
89
  it "should use 'itself' if action not found" do
68
90
  expected_sql = "select count(*) from appstats_entries where action = 'garblygook'"
69
- Appstats::Query.new(:input => "# garblygook").to_sql.should == expected_sql
91
+ Appstats::Query.new(:query => "# garblygook").query_to_sql.should == expected_sql
70
92
  end
71
93
 
72
94
  end
@@ -74,7 +96,7 @@ module Appstats
74
96
  describe "date ranges" do
75
97
  it "should understand since dates" do
76
98
  expected_sql = "select count(*) from appstats_entries where action = 'login' and occurred_at >= '2010-01-15 00:00:00'"
77
- Appstats::Query.new(:input => "# logins since 2010-01-15").to_sql.should == expected_sql
99
+ Appstats::Query.new(:query => "# logins since 2010-01-15").query_to_sql.should == expected_sql
78
100
  end
79
101
  end
80
102
 
@@ -82,7 +104,7 @@ module Appstats
82
104
 
83
105
  it "should on server_name" do
84
106
  expected_sql = "select count(*) from appstats_entries where action = 'login' and exists (select * from appstats_log_collectors where appstats_entries.appstats_log_collector_id = appstats_log_collectors.id and host = 'my.localnet')"
85
- Appstats::Query.new(:input => "# logins on server my.localnet").to_sql.should == expected_sql
107
+ Appstats::Query.new(:query => "# logins on server my.localnet").query_to_sql.should == expected_sql
86
108
  end
87
109
 
88
110
  end
@@ -90,7 +112,7 @@ module Appstats
90
112
  describe "date range and server_name" do
91
113
  it "should understand dates and 'on server'" do
92
114
  expected_sql = "select count(*) from appstats_entries where action = 'login' and (occurred_at >= '2010-01-15 00:00:00' and occurred_at <= '2010-01-31 23:59:59') and exists (select * from appstats_log_collectors where appstats_entries.appstats_log_collector_id = appstats_log_collectors.id and host = 'your.localnet')"
93
- Appstats::Query.new(:input => "# logins between 2010-01-15 and 2010-01-31 on server your.localnet").to_sql.should == expected_sql
115
+ Appstats::Query.new(:query => "# logins between 2010-01-15 and 2010-01-31 on server your.localnet").query_to_sql.should == expected_sql
94
116
  end
95
117
  end
96
118
  end
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+
3
+ module Appstats
4
+ describe Result do
5
+
6
+ before(:each) do
7
+ @result = Appstats::Result.new
8
+ end
9
+
10
+ describe "#initialize" do
11
+
12
+ it "should set attributes to nil" do
13
+ @result.name.should == nil
14
+ @result.result_type.should == nil
15
+ @result.query.should == nil
16
+ @result.query_as_sql.should == nil
17
+ @result.count.should == nil
18
+ @result.action.should == nil
19
+ @result.action.should == nil
20
+ end
21
+
22
+ it "should set on constructor" do
23
+ result = Appstats::Result.new(:name => 'a', :result_type => 'b', :query => 'c', :query_as_sql => 'd', :count => 10, :action => 'e', :host => 'f')
24
+ result.name.should == 'a'
25
+ result.result_type.should == 'b'
26
+ result.query.should == 'c'
27
+ result.query_as_sql.should == 'd'
28
+ result.count.should == 10
29
+ result.action.should == 'e'
30
+ result.host.should == 'f'
31
+ end
32
+
33
+ end
34
+
35
+ describe "#==" do
36
+
37
+ it "should be equal on all attributes" do
38
+ result = Appstats::Result.new(:name => 'a', :result_type => 'b', :query => 'c', :query_as_sql => 'd', :count => 10, :action => 'e', :host => 'f')
39
+ same_result = Appstats::Result.new(:name => 'a', :result_type => 'b', :query => 'c', :query_as_sql => 'd', :count => 10, :action => 'e', :host => 'f')
40
+ (result == same_result).should == true
41
+ end
42
+
43
+ it "should be not equal if diferent attributes" do
44
+ result = Appstats::Result.new(:name => 'a', :result_type => 'b', :query => 'c', :query_as_sql => 'd', :count => 10, :action => 'e', :host => 'f')
45
+ different_result = Appstats::Result.new(:name => 'xxx', :result_type => 'b', :query => 'c', :query_as_sql => 'd', :count => 10, :action => 'e', :host => 'f')
46
+
47
+ [:name,:result_type,:query,:query_as_sql,:count,:action,:host].each do |attr|
48
+ different_result = Appstats::Result.new(:name => 'a', :result_type => 'b', :query => 'c', :query_as_sql => 'd', :count => 10, :action => 'e', :host => 'f')
49
+ different_result.send("#{attr}=","XXX")
50
+
51
+ different_result.should_not == result
52
+ (different_result == result).should == false
53
+ end
54
+ end
55
+
56
+ end
57
+ end
58
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appstats
3
3
  version: !ruby/object:Gem::Version
4
- hash: 5
4
+ hash: 3
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 6
9
- - 1
10
- version: 0.6.1
8
+ - 7
9
+ - 0
10
+ version: 0.7.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Andrew Forward
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-02-10 00:00:00 -05:00
18
+ date: 2011-02-11 00:00:00 -05:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -150,6 +150,7 @@ files:
150
150
  - db/migrations/20110207213514_create_appstats_actions.rb
151
151
  - db/migrations/20110208210921_align_entry_time_names.rb
152
152
  - db/migrations/20110210185911_create_appstats_test_object.rb
153
+ - db/migrations/20110210225606_create_appstats_results.rb
153
154
  - db/schema.rb
154
155
  - lib/appstats.rb
155
156
  - lib/appstats/action.rb
@@ -162,6 +163,7 @@ files:
162
163
  - lib/appstats/log_collector.rb
163
164
  - lib/appstats/logger.rb
164
165
  - lib/appstats/query.rb
166
+ - lib/appstats/result.rb
165
167
  - lib/appstats/tasks.rb
166
168
  - lib/appstats/test_object.rb
167
169
  - lib/appstats/version.rb
@@ -194,6 +196,7 @@ files:
194
196
  - spec/log_collector_spec.rb
195
197
  - spec/logger_spec.rb
196
198
  - spec/query_spec.rb
199
+ - spec/result_spec.rb
197
200
  - spec/spec_helper.rb
198
201
  - spec/test_object_spec.rb
199
202
  has_rdoc: true
@@ -241,5 +244,6 @@ test_files:
241
244
  - spec/log_collector_spec.rb
242
245
  - spec/logger_spec.rb
243
246
  - spec/query_spec.rb
247
+ - spec/result_spec.rb
244
248
  - spec/spec_helper.rb
245
249
  - spec/test_object_spec.rb