appstats 0.11.7 → 0.12.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- appstats (0.11.7)
4
+ appstats (0.12.1)
5
5
  daemons
6
6
  net-scp
7
7
  rails (>= 2.3.0)
@@ -0,0 +1,15 @@
1
+ class AddAppstatsEntriesWeekAndQuarter < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :appstats_entries, :week, :integer
4
+ add_column :appstats_entries, :quarter, :integer
5
+ add_index :appstats_entries, [:year,:week], :name => "index_entries_by_week"
6
+ add_index :appstats_entries, [:year,:quarter], :name => "index_entries_by_quarter"
7
+ end
8
+
9
+ def self.down
10
+ remove_column :appstats_entries, :week
11
+ remove_column :appstats_entries, :quarter
12
+ remove_index :appstats_entries, :name => "index_entries_by_week"
13
+ remove_index :appstats_entries, :name => "index_entries_by_quarter"
14
+ end
15
+ end
@@ -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 => 20110222215437) do
13
+ ActiveRecord::Schema.define(:version => 20110223212232) do
14
14
 
15
15
  create_table "appstats_actions", :force => true do |t|
16
16
  t.string "name"
@@ -63,6 +63,8 @@ ActiveRecord::Schema.define(:version => 20110222215437) do
63
63
  t.integer "hour"
64
64
  t.integer "min"
65
65
  t.integer "sec"
66
+ t.integer "week"
67
+ t.integer "quarter"
66
68
  end
67
69
 
68
70
  add_index "appstats_entries", ["action"], :name => "index_appstats_entries_on_action"
@@ -70,6 +72,8 @@ ActiveRecord::Schema.define(:version => 20110222215437) do
70
72
  add_index "appstats_entries", ["year", "month", "day", "hour"], :name => "index_entries_by_hour"
71
73
  add_index "appstats_entries", ["year", "month", "day"], :name => "index_entries_by_day"
72
74
  add_index "appstats_entries", ["year", "month"], :name => "index_entries_by_month"
75
+ add_index "appstats_entries", ["year", "quarter"], :name => "index_entries_by_quarter"
76
+ add_index "appstats_entries", ["year", "week"], :name => "index_entries_by_week"
73
77
  add_index "appstats_entries", ["year"], :name => "index_entries_by_year"
74
78
 
75
79
  create_table "appstats_hosts", :force => true do |t|
@@ -12,13 +12,16 @@ module Appstats
12
12
 
13
13
  def from_date
14
14
  return nil if @from.nil?
15
- mode = @format == :inclusive ? :start : :end
15
+ mode = @format == :exclusive ? :end : :beginning
16
16
  @from.to_time(mode)
17
17
  end
18
18
 
19
19
  def to_date
20
+ if @format == :fixed_point && !@from.nil?
21
+ return @from.to_time(:end)
22
+ end
20
23
  return nil if @to.nil?
21
- mode = @format == :exclusive ? :start : :end
24
+ mode = @format == :exclusive ? :beginning : :end
22
25
  @to.to_time(mode)
23
26
  end
24
27
 
@@ -118,22 +121,14 @@ module Appstats
118
121
  m = input.match(/^this\s*(year|quarter|month|week|day)$/)
119
122
  unless m.nil?
120
123
  range.from = EntryDate.parse(input)
121
- range.format = ["week","quarter"].include?(m[1]) ? :inclusive : :fixed_point
124
+ range.format = :fixed_point
122
125
  return range
123
126
  end
124
127
 
125
128
  m = input.match(/^(last|previous)\s*(year|quarter|month|week|day)$/)
126
129
  unless m.nil?
127
130
  range.from = EntryDate.parse(input)
128
- if m[2] == "week"
129
- range.to = range.from.end_of_week
130
- range.format = :inclusive
131
- elsif m[2] == "quarter"
132
- range.to = range.from.end_of_quarter
133
- range.format = :inclusive
134
- else
135
- range.format = :fixed_point
136
- end
131
+ range.format = :fixed_point
137
132
  return range
138
133
  end
139
134
 
@@ -19,6 +19,8 @@ module Appstats
19
19
  self[:hour] = nil
20
20
  self[:min] = nil
21
21
  self[:sec] = nil
22
+ self[:week] = nil
23
+ self[:quarter] = nil
22
24
  else
23
25
  self[:year] = value.year
24
26
  self[:month] = value.month
@@ -26,6 +28,8 @@ module Appstats
26
28
  self[:hour] = value.hour
27
29
  self[:min] = value.min
28
30
  self[:sec] = value.sec
31
+ self[:week] = EntryDate.calculate_week_of(value)
32
+ self[:quarter] = EntryDate.calculate_quarter_of(value)
29
33
  end
30
34
  end
31
35
 
@@ -2,7 +2,7 @@
2
2
  module Appstats
3
3
  class EntryDate
4
4
 
5
- attr_accessor :year, :month, :day, :hour, :min, :sec
5
+ attr_accessor :year, :month, :day, :hour, :min, :sec, :week, :quarter
6
6
 
7
7
  def initialize(data = {})
8
8
  @year = data[:year]
@@ -11,6 +11,8 @@ module Appstats
11
11
  @hour = data[:hour]
12
12
  @min = data[:min]
13
13
  @sec = data[:sec]
14
+ @week = data[:week]
15
+ @quarter = data[:quarter]
14
16
  end
15
17
 
16
18
  def end_of_week
@@ -19,24 +21,32 @@ module Appstats
19
21
  week.year = t.year
20
22
  week.month = t.month
21
23
  week.day = t.day
24
+ week.week = EntryDate.calculate_week_of(t)
22
25
  week
23
26
  end
24
27
 
25
28
  def end_of_quarter
26
29
  t = to_time.end_of_quarter
27
- EntryDate.new(:year => t.year, :month => t.month)
30
+ EntryDate.new(:year => t.year, :month => t.month, :quarter => EntryDate.calculate_quarter_of(t))
28
31
  end
29
32
 
30
- def to_time(mode = :start)
33
+ def to_time(mode = :beginning)
31
34
  return Time.now if @year.nil?
32
35
  t = Time.parse("#{@year}-#{@month||'01'}-#{@day||'01'} #{@hour||'00'}:#{@min||'00'}:#{@sec||'00'}")
33
36
 
34
- if mode == :end
35
- t = t.end_of_year if @month.nil?
36
- t = t.end_of_month if @day.nil?
37
- t = t.end_of_day if @hour.nil?
37
+ if @month.nil?
38
+ method = "_of_year"
39
+ elsif !@quarter.nil?
40
+ method = "_of_quarter"
41
+ elsif !@week.nil?
42
+ method = "_of_week"
43
+ elsif @day.nil?
44
+ method = "_of_month"
45
+ elsif @hour.nil?
46
+ method = "_of_day"
38
47
  end
39
- t
48
+ return t if method.nil?
49
+ t.send("#{mode}#{method}")
40
50
  end
41
51
 
42
52
  def to_s
@@ -62,6 +72,17 @@ module Appstats
62
72
  s
63
73
  end
64
74
 
75
+ def self.calculate_quarter_of(time)
76
+ return nil if time.nil?
77
+ (time.month - 1) / 3 + 1
78
+ end
79
+
80
+ def self.calculate_week_of(time)
81
+ return nil if time.nil?
82
+ return -1 if time.beginning_of_week.year != time.year
83
+ time.strftime("%W").to_i
84
+ end
85
+
65
86
  def self.parse(raw_input)
66
87
  date = EntryDate.new
67
88
  return date if raw_input.nil? || raw_input == ''
@@ -86,12 +107,12 @@ module Appstats
86
107
  t_parts = [:year]
87
108
  elsif input.match(/^this quarter$/)
88
109
  t = t.beginning_of_quarter
89
- t_parts = [:year,:month]
110
+ t_parts = [:year,:month, :quarter]
90
111
  elsif input.match(/^this month$/)
91
112
  t_parts = [:year,:month]
92
113
  elsif input.match(/^this week$/)
93
114
  t = t.beginning_of_week
94
- t_parts = [:year,:month,:day]
115
+ t_parts = [:year,:month,:day, :week]
95
116
  elsif input.match(/^this day$/)
96
117
  t_parts = [:year,:month,:day]
97
118
  elsif input.match(/^(.*),[^\d]*(\d*)$/) # month, year
@@ -112,7 +133,7 @@ module Appstats
112
133
  if m
113
134
  t = t.beginning_of_quarter
114
135
  last_date_offset(m).times { t = (t - 1.day).beginning_of_quarter }
115
- t_parts = [:year,:month]
136
+ t_parts = [:year,:month,:quarter]
116
137
  end
117
138
 
118
139
  m = input.match(/^(last|previous)\s*(\d*)\s*months?$/)
@@ -124,7 +145,7 @@ module Appstats
124
145
  m = input.match(/^(last|previous)\s*(\d*)\s*weeks?$/)
125
146
  if m
126
147
  t = (t - last_date_offset(m).week).beginning_of_week
127
- t_parts = [:year,:month,:day]
148
+ t_parts = [:year,:month,:day,:week]
128
149
  end
129
150
 
130
151
  m = input.match(/^(last|previous)\s*(\d*)\s*days?$/)
@@ -135,7 +156,11 @@ module Appstats
135
156
 
136
157
  unless t_parts.nil?
137
158
  t_parts.each do |label|
138
- date.send("#{label}=",t.send(label))
159
+ if [:quarter,:week].include?(label)
160
+ date.send("#{label}=",EntryDate.send("calculate_#{label}_of",t))
161
+ else
162
+ date.send("#{label}=",t.send(label))
163
+ end
139
164
  end
140
165
  return date
141
166
  end
@@ -157,7 +182,7 @@ module Appstats
157
182
  private
158
183
 
159
184
  def state
160
- [@year, @month, @day, @hour, @min, @sec]
185
+ [@year, @month, @day, @hour, @min, @sec, @week, @quarter]
161
186
  end
162
187
 
163
188
  # (last|previous) (\d*)
@@ -6,10 +6,26 @@ module Appstats
6
6
 
7
7
  def date_to_s
8
8
  return "" if from_date.nil? && to_date.nil?
9
- return "#{from_date_to_s} to present" if !from_date.nil? && to_date.nil? && created_at.nil?
10
- return "#{from_date_to_s} to #{created_at.strftime('%Y-%m-%d')}" if !from_date.nil? && to_date.nil? && !created_at.nil?
11
- return "up to #{to_date_to_s}" if from_date.nil? && !to_date.nil?
12
- "#{from_date_to_s} to #{to_date_to_s}"
9
+
10
+ from_s = nil
11
+ to_s = nil
12
+
13
+ if !from_date.nil? && to_date.nil? && created_at.nil?
14
+ from_s = from_date_to_s
15
+ to_s = "present"
16
+ elsif !from_date.nil? && to_date.nil? && !created_at.nil?
17
+ from_s = from_date_to_s
18
+ to_s = created_at.strftime('%Y-%m-%d')
19
+ elsif from_date.nil? && !to_date.nil?
20
+ from_s = "up"
21
+ to_s = to_date_to_s
22
+ else
23
+ from_s = from_date_to_s
24
+ to_s = to_date_to_s
25
+ end
26
+
27
+ return from_s if from_s == to_s
28
+ "#{from_s} to #{to_s}"
13
29
  end
14
30
 
15
31
  def from_date_to_s
@@ -1,3 +1,3 @@
1
1
  module Appstats
2
- VERSION = "0.11.7"
2
+ VERSION = "0.12.1"
3
3
  end
@@ -32,6 +32,7 @@ module Appstats
32
32
  date_range.should == same_date_range
33
33
  date_range.should_not == another_date_range
34
34
  end
35
+
35
36
  end
36
37
 
37
38
  describe "#parse" do
@@ -89,7 +90,7 @@ module Appstats
89
90
  end
90
91
 
91
92
  it "should understand this quarter" do
92
- DateRange.parse(" this quarter ").should == DateRange.new(:from => EntryDate.new(:year => 2010, :month => 1), :to => nil, :format => :inclusive )
93
+ DateRange.parse(" this quarter ").should == DateRange.new(:from => EntryDate.new(:year => 2010, :month => 1, :quarter => 1), :to => nil, :format => :fixed_point )
93
94
  end
94
95
 
95
96
  it "should understand this month" do
@@ -97,7 +98,7 @@ module Appstats
97
98
  end
98
99
 
99
100
  it "should understand this week" do
100
- DateRange.parse(" this week ").should == DateRange.new(:from => EntryDate.new(:year => 2010, :month => 1, :day => 11), :to => nil, :format => :inclusive )
101
+ DateRange.parse(" this week ").should == DateRange.new(:from => EntryDate.new(:year => 2010, :month => 1, :day => 11, :week => 2), :to => nil, :format => :fixed_point )
101
102
  end
102
103
 
103
104
  it "should understand this day" do
@@ -113,7 +114,7 @@ module Appstats
113
114
  end
114
115
 
115
116
  it "should understand last quarter" do
116
- DateRange.parse(" last quarter ").should == DateRange.new(:from => EntryDate.new(:year => 2009, :month => 10), :to => EntryDate.new(:year => 2009, :month => 12), :format => :inclusive )
117
+ DateRange.parse(" last quarter ").should == DateRange.new(:from => EntryDate.new(:year => 2009, :month => 10, :quarter => 4), :to => nil, :format => :fixed_point )
117
118
  end
118
119
 
119
120
  it "should understand last month" do
@@ -121,7 +122,7 @@ module Appstats
121
122
  end
122
123
 
123
124
  it "should understand last week" do
124
- DateRange.parse(" last week ").should == DateRange.new(:from => EntryDate.new(:year => 2010, :month => 1, :day => 4), :to => EntryDate.new(:year => 2010, :month => 1, :day => 10), :format => :inclusive )
125
+ DateRange.parse(" last week ").should == DateRange.new(:from => EntryDate.new(:year => 2010, :month => 1, :day => 4, :week => 1), :to => nil, :format => :fixed_point )
125
126
  end
126
127
 
127
128
  it "should understand last day" do
@@ -137,7 +138,7 @@ module Appstats
137
138
  end
138
139
 
139
140
  it "should understand previous week" do
140
- DateRange.parse(" previous week ").should == DateRange.new(:from => EntryDate.new(:year => 2010, :month => 1, :day => 4), :to => EntryDate.new(:year => 2010, :month => 1, :day => 10), :format => :inclusive )
141
+ DateRange.parse(" previous week ").should == DateRange.new(:from => EntryDate.new(:year => 2010, :month => 1, :day => 4, :week => 1), :to => nil, :format => :fixed_point )
141
142
  end
142
143
 
143
144
  it "should understand previous day" do
@@ -155,9 +156,9 @@ module Appstats
155
156
  end
156
157
 
157
158
  it "should understand last X quarters" do
158
- DateRange.parse(" last 1 quarter ").should == DateRange.new(:from => EntryDate.new(:year => 2010, :month => 1), :to => nil, :format => :inclusive )
159
- DateRange.parse(" last 2 quarters ").should == DateRange.new(:from => EntryDate.new(:year => 2009, :month => 10), :to => nil, :format => :inclusive )
160
- DateRange.parse(" last 3 quarters ").should == DateRange.new(:from => EntryDate.new(:year => 2009, :month => 7), :to => nil, :format => :inclusive )
159
+ DateRange.parse(" last 1 quarter ").should == DateRange.new(:from => EntryDate.new(:year => 2010, :month => 1, :quarter => 1), :to => nil, :format => :inclusive )
160
+ DateRange.parse(" last 2 quarters ").should == DateRange.new(:from => EntryDate.new(:year => 2009, :month => 10, :quarter => 4), :to => nil, :format => :inclusive )
161
+ DateRange.parse(" last 3 quarters ").should == DateRange.new(:from => EntryDate.new(:year => 2009, :month => 7, :quarter => 3), :to => nil, :format => :inclusive )
161
162
  end
162
163
 
163
164
  it "should understand last X months" do
@@ -167,9 +168,9 @@ module Appstats
167
168
  end
168
169
 
169
170
  it "should understand last X weeks" do
170
- DateRange.parse(" last 1 week ").should == DateRange.new(:from => EntryDate.new(:year => 2010, :month => 1, :day => 11), :to => nil, :format => :inclusive )
171
- DateRange.parse(" last 2 weeks ").should == DateRange.new(:from => EntryDate.new(:year => 2010, :month => 1, :day => 4), :to => nil, :format => :inclusive )
172
- DateRange.parse(" last 3 weeks ").should == DateRange.new(:from => EntryDate.new(:year => 2009, :month => 12, :day => 28), :to => nil, :format => :inclusive )
171
+ DateRange.parse(" last 1 week ").should == DateRange.new(:from => EntryDate.new(:year => 2010, :month => 1, :day => 11, :week => 2), :to => nil, :format => :inclusive )
172
+ DateRange.parse(" last 2 weeks ").should == DateRange.new(:from => EntryDate.new(:year => 2010, :month => 1, :day => 4, :week => 1), :to => nil, :format => :inclusive )
173
+ DateRange.parse(" last 3 weeks ").should == DateRange.new(:from => EntryDate.new(:year => 2009, :month => 12, :day => 28, :week => 52), :to => nil, :format => :inclusive )
173
174
  end
174
175
 
175
176
  it "should understand last X days" do
@@ -189,9 +190,9 @@ module Appstats
189
190
  end
190
191
 
191
192
  it "should understand previous Y quarters" do
192
- DateRange.parse(" previous 1 quarter ").should == DateRange.new(:from => EntryDate.new(:year => 2009, :month => 10), :to => EntryDate.new(:year => 2009, :month => 12), :format => :inclusive )
193
- DateRange.parse(" previous 2 quarters ").should == DateRange.new(:from => EntryDate.new(:year => 2009, :month => 7), :to => EntryDate.new(:year => 2009, :month => 12), :format => :inclusive )
194
- DateRange.parse(" previous 3 quarters ").should == DateRange.new(:from => EntryDate.new(:year => 2009, :month => 4), :to => EntryDate.new(:year => 2009, :month => 12), :format => :inclusive )
193
+ DateRange.parse(" previous 1 quarter ").should == DateRange.new(:from => EntryDate.new(:year => 2009, :month => 10, :quarter => 4), :to => EntryDate.new(:year => 2009, :month => 12, :quarter => 4), :format => :inclusive )
194
+ DateRange.parse(" previous 2 quarters ").should == DateRange.new(:from => EntryDate.new(:year => 2009, :month => 7, :quarter => 3), :to => EntryDate.new(:year => 2009, :month => 12, :quarter => 4), :format => :inclusive )
195
+ DateRange.parse(" previous 3 quarters ").should == DateRange.new(:from => EntryDate.new(:year => 2009, :month => 4, :quarter => 2), :to => EntryDate.new(:year => 2009, :month => 12, :quarter => 4), :format => :inclusive )
195
196
  end
196
197
 
197
198
  it "should understand previous Y months" do
@@ -201,9 +202,9 @@ module Appstats
201
202
  end
202
203
 
203
204
  it "should understand previous 2 weeks" do
204
- DateRange.parse(" previous 1 week ").should == DateRange.new(:from => EntryDate.new(:year => 2010, :month => 1, :day => 4), :to => EntryDate.new(:year => 2010, :month => 1, :day => 10), :format => :inclusive )
205
- DateRange.parse(" previous 2 weeks ").should == DateRange.new(:from => EntryDate.new(:year => 2009, :month => 12, :day => 28), :to => EntryDate.new(:year => 2010, :month => 1, :day => 10), :format => :inclusive )
206
- DateRange.parse(" previous 3 weeks ").should == DateRange.new(:from => EntryDate.new(:year => 2009, :month => 12, :day => 21), :to => EntryDate.new(:year => 2010, :month => 1, :day => 10), :format => :inclusive )
205
+ DateRange.parse(" previous 1 week ").should == DateRange.new(:from => EntryDate.new(:year => 2010, :month => 1, :day => 4, :week => 1), :to => EntryDate.new(:year => 2010, :month => 1, :day => 10, :week => 1), :format => :inclusive )
206
+ DateRange.parse(" previous 2 weeks ").should == DateRange.new(:from => EntryDate.new(:year => 2009, :month => 12, :day => 28, :week => 52), :to => EntryDate.new(:year => 2010, :month => 1, :day => 10, :week => 1), :format => :inclusive )
207
+ DateRange.parse(" previous 3 weeks ").should == DateRange.new(:from => EntryDate.new(:year => 2009, :month => 12, :day => 21, :week => 51), :to => EntryDate.new(:year => 2010, :month => 1, :day => 10, :week => 1), :format => :inclusive )
207
208
  end
208
209
 
209
210
  it "should understand previous 2 days" do
@@ -266,6 +267,15 @@ module Appstats
266
267
  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
267
268
  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
268
269
  end
270
+
271
+ it "should handle fixed points" do
272
+ DateRange.new(:from => EntryDate.new(:year => 2009), :to => nil, :format => :fixed_point ).from_date.to_s.should == Time.parse("2009-01-01 00:00:00").to_s
273
+ DateRange.new(:from => EntryDate.new(:year => 2009, :month => 10, :quarter => 4), :to => nil, :format => :fixed_point ).from_date.to_s.should == Time.parse("2009-10-01 00:00:00").to_s
274
+ DateRange.new(:from => EntryDate.new(:year => 2009, :month => 10, :day => 2, :week => 39), :to => nil, :format => :fixed_point ).from_date.to_s.should == Time.parse("2009-09-28 00:00:00").to_s
275
+ DateRange.new(:from => EntryDate.new(:year => 2009, :month => 10), :to => nil, :format => :fixed_point ).from_date.to_s.should == Time.parse("2009-10-01 00:00:00").to_s
276
+ DateRange.new(:from => EntryDate.new(:year => 2009, :month => 10, :day => 3), :to => nil, :format => :fixed_point ).from_date.to_s.should == Time.parse("2009-10-03 00:00:00").to_s
277
+ DateRange.new(:from => nil, :to => nil, :format => :fixed_point ).from_date.should == nil
278
+ end
269
279
 
270
280
  end
271
281
 
@@ -284,6 +294,15 @@ module Appstats
284
294
  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
285
295
  end
286
296
 
297
+ it "should handle fixed points" do
298
+ DateRange.new(:from => EntryDate.new(:year => 2009), :to => nil, :format => :fixed_point ).to_date.to_s.should == Time.parse("2009-12-31 23:59:59").to_s
299
+ DateRange.new(:from => EntryDate.new(:year => 2009, :month => 10), :to => nil, :format => :fixed_point ).to_date.to_s.should == Time.parse("2009-10-31 23:59:59").to_s
300
+ DateRange.new(:from => EntryDate.new(:year => 2009, :month => 10, :quarter => 4), :to => nil, :format => :fixed_point ).to_date.to_s.should == Time.parse("2009-12-31 23:59:59").to_s
301
+ DateRange.new(:from => EntryDate.new(:year => 2009, :month => 10, :day => 2, :week => 39), :to => nil, :format => :fixed_point ).to_date.to_s.should == Time.parse("2009-10-04 23:59:59").to_s
302
+ DateRange.new(:from => EntryDate.new(:year => 2009, :month => 10, :day => 3), :to => nil, :format => :fixed_point ).to_date.to_s.should == Time.parse("2009-10-03 23:59:59").to_s
303
+
304
+ DateRange.new(:from => nil, :to => nil, :format => :fixed_point ).to_date.should == nil
305
+ end
287
306
 
288
307
  end
289
308
 
@@ -11,26 +11,38 @@ module Appstats
11
11
  describe "#initialize" do
12
12
 
13
13
  it "should understand year, month, day, hour, min, sec" do
14
- date = EntryDate.new(:year => 2010, :month => 1, :day => 2, :hour => 3, :min => 4, :sec => 5)
14
+ date = EntryDate.new(:year => 2010, :month => 1, :day => 2, :hour => 3, :min => 4, :sec => 5, :week => 6, :quarter => 7)
15
15
  date.year.should == 2010
16
16
  date.month.should == 1
17
17
  date.day.should == 2
18
18
  date.hour.should == 3
19
19
  date.min.should == 4
20
20
  date.sec.should == 5
21
+ date.week.should == 6
22
+ date.quarter.should == 7
21
23
  end
24
+
25
+ end
26
+
27
+ describe "#==" do
22
28
 
23
- it "should understand equality" do
24
- date = EntryDate.new(:year => 2010, :month => 1, :day => 2, :hour => 3, :min => 4, :sec => 5)
25
- same_date = EntryDate.new(:year => 2010, :month => 1, :day => 2, :hour => 3, :min => 4, :sec => 5)
26
- another_date = EntryDate.new(:year => 2011, :month => 1, :day => 2, :hour => 3, :min => 4, :sec => 5)
27
-
29
+ it "should be equal on all attributes" do
30
+ date = EntryDate.new(:year => 2010, :month => 1, :day => 2, :hour => 3, :min => 4, :sec => 5, :week => 6, :quarter => 7)
31
+ same_date = EntryDate.new(:year => 2010, :month => 1, :day => 2, :hour => 3, :min => 4, :sec => 5, :week => 6, :quarter => 7)
28
32
  date.should == date
29
33
  date.should == same_date
30
- date.should_not == another_date
31
34
  end
32
35
 
33
-
36
+ it "should be not equal if diferent attributes" do
37
+ date = EntryDate.new(:year => 2010, :month => 1, :day => 2, :hour => 3, :min => 4, :sec => 5, :week => 6, :quarter => 7)
38
+
39
+ [:year,:month,:day,:hour,:min,:sec,:week,:quarter].each do |attr|
40
+ different_date = EntryDate.new(:year => 2010, :month => 1, :day => 2, :hour => 3, :min => 4, :sec => 5, :week => 6, :quarter => 7)
41
+ different_date.send("#{attr}=",99)
42
+ different_date.should_not == date
43
+ end
44
+ end
45
+
34
46
  end
35
47
 
36
48
  describe "#to_time" do
@@ -43,6 +55,18 @@ module Appstats
43
55
  EntryDate.new(:year => 2010, :month => 2).to_time.should == Time.parse("2010-02-01 00:00:00")
44
56
  end
45
57
 
58
+ it "should handle quarter" do
59
+ EntryDate.new(:year => 2010, :month => 2, :quarter => 1).to_time(:beginning).should == Time.parse("2010-01-01 00:00:00")
60
+ EntryDate.new(:year => 2010, :month => 2, :quarter => 1).to_time(:end).to_s.should == Time.parse("2010-03-31 23:59:59").to_s
61
+ EntryDate.new(:year => 2010, :month => 2, :quarter => 1).to_time.should == Time.parse("2010-01-01 00:00:00")
62
+ end
63
+
64
+ it "should handle week" do
65
+ EntryDate.new(:year => 2010, :month => 2, :day => 16, :week => 7).to_time(:beginning).should == Time.parse("2010-02-15 00:00:00")
66
+ EntryDate.new(:year => 2010, :month => 2, :day => 16, :week => 7).to_time(:end).to_s.should == Time.parse("2010-02-21 23:59:59").to_s
67
+ EntryDate.new(:year => 2010, :month => 2, :day => 16, :week => 7).to_time.should == Time.parse("2010-02-15 00:00:00")
68
+ end
69
+
46
70
  it "should handle now" do
47
71
  EntryDate.new.to_time.should == Time.now
48
72
  end
@@ -70,7 +94,7 @@ module Appstats
70
94
  describe "#end_of_week" do
71
95
  it "should return the same 'level' data points" do
72
96
  now = EntryDate.new(:year => 2010, :month => 1, :day => 5, :hour => 10) # tuesday
73
- expected = EntryDate.new(:year => 2010, :month => 1, :day => 10, :hour => 10)
97
+ expected = EntryDate.new(:year => 2010, :month => 1, :day => 10, :hour => 10, :week => 1)
74
98
  now.end_of_week.should == expected
75
99
  end
76
100
  end
@@ -78,11 +102,112 @@ module Appstats
78
102
  describe "#end_of_quarter" do
79
103
  it "should return the same 'level' data points" do
80
104
  now = EntryDate.new(:year => 2010, :month => 1, :day => 5, :hour => 10)
81
- expected = EntryDate.new(:year => 2010, :month => 3)
105
+ expected = EntryDate.new(:year => 2010, :month => 3, :quarter => 1)
82
106
  now.end_of_quarter.should == expected
83
107
  end
108
+
109
+ it "should return quarter" do
110
+ now = EntryDate.new(:year => 2010, :month => 1, :quarter => 1)
111
+ expected = EntryDate.new(:year => 2010, :month => 3, :quarter => 1)
112
+ now.end_of_quarter.should == expected
113
+ end
114
+
115
+ end
116
+
117
+ describe "#calculate_quarter_of" do
118
+
119
+ it "should handle nil" do
120
+ EntryDate.calculate_quarter_of(nil).should == nil
121
+ end
122
+
123
+ it "should be 1 for jan/feb/mar" do
124
+ EntryDate.calculate_quarter_of(Time.parse("2011-01-01")).should == 1
125
+ EntryDate.calculate_quarter_of(Time.parse("2011-02-15")).should == 1
126
+ EntryDate.calculate_quarter_of(Time.parse("2011-03-31")).should == 1
127
+ end
128
+
129
+ it "should be 2 for apr/may/jun" do
130
+ EntryDate.calculate_quarter_of(Time.parse("2011-04-01")).should == 2
131
+ EntryDate.calculate_quarter_of(Time.parse("2011-05-15")).should == 2
132
+ EntryDate.calculate_quarter_of(Time.parse("2011-06-30")).should == 2
133
+ end
134
+
135
+ it "should be 3 for jul/aug/sep" do
136
+ EntryDate.calculate_quarter_of(Time.parse("2011-07-01")).should == 3
137
+ EntryDate.calculate_quarter_of(Time.parse("2011-08-15")).should == 3
138
+ EntryDate.calculate_quarter_of(Time.parse("2011-09-30")).should == 3
139
+ end
140
+
141
+ it "should be 4 for oct/nov/dec" do
142
+ EntryDate.calculate_quarter_of(Time.parse("2011-10-01")).should == 4
143
+ EntryDate.calculate_quarter_of(Time.parse("2011-11-15")).should == 4
144
+ EntryDate.calculate_quarter_of(Time.parse("2011-12-31")).should == 4
145
+ end
146
+
147
+
148
+ end
149
+
150
+ describe "#calculate_quarter_of" do
151
+
152
+ it "should handle nil" do
153
+ EntryDate.calculate_quarter_of(nil).should == nil
154
+ end
155
+
156
+ it "should be 1 for jan/feb/mar" do
157
+ EntryDate.calculate_quarter_of(Time.parse("2011-01-01")).should == 1
158
+ EntryDate.calculate_quarter_of(Time.parse("2011-02-15")).should == 1
159
+ EntryDate.calculate_quarter_of(Time.parse("2011-03-31")).should == 1
160
+ end
161
+
162
+ it "should be 2 for apr/may/jun" do
163
+ EntryDate.calculate_quarter_of(Time.parse("2011-04-01")).should == 2
164
+ EntryDate.calculate_quarter_of(Time.parse("2011-05-15")).should == 2
165
+ EntryDate.calculate_quarter_of(Time.parse("2011-06-30")).should == 2
166
+ end
167
+
168
+ it "should be 3 for jul/aug/sep" do
169
+ EntryDate.calculate_quarter_of(Time.parse("2011-07-01")).should == 3
170
+ EntryDate.calculate_quarter_of(Time.parse("2011-08-15")).should == 3
171
+ EntryDate.calculate_quarter_of(Time.parse("2011-09-30")).should == 3
172
+ end
173
+
174
+ it "should be 4 for oct/nov/dec" do
175
+ EntryDate.calculate_quarter_of(Time.parse("2011-10-01")).should == 4
176
+ EntryDate.calculate_quarter_of(Time.parse("2011-11-15")).should == 4
177
+ EntryDate.calculate_quarter_of(Time.parse("2011-12-31")).should == 4
178
+ end
179
+
180
+
84
181
  end
85
182
 
183
+ describe "#calculate_week_of" do
184
+
185
+ it "should handle nil" do
186
+ EntryDate.calculate_week_of(nil).should == nil
187
+ end
188
+
189
+ it "should be -1 if jan 1 is not start of week" do
190
+ EntryDate.calculate_week_of(Time.parse("2011-01-01")).should == -1
191
+ EntryDate.calculate_week_of(Time.parse("2011-01-02")).should == -1
192
+ end
193
+
194
+ it "should be 1 for the first monday of the year" do
195
+ EntryDate.calculate_week_of(Time.parse("2011-01-03")).should == 1
196
+ end
197
+
198
+ it "should be 1 if the first day is on a monday" do
199
+ EntryDate.calculate_week_of(Time.parse("2018-01-01")).should == 1
200
+ end
201
+
202
+ it "should be X for the Xth monday of the year" do
203
+ time = Time.parse("2011-01-03")
204
+ 1.upto(52).each do |offset|
205
+ EntryDate.calculate_week_of(time).should == offset
206
+ time = time.next_week
207
+ end
208
+ end
209
+
210
+ end
86
211
 
87
212
  describe "#parse" do
88
213
 
@@ -128,7 +253,7 @@ module Appstats
128
253
  end
129
254
 
130
255
  it "should understand last quarter" do
131
- EntryDate.parse("last quarter").should == EntryDate.new(:year => 2009, :month => 10)
256
+ EntryDate.parse("last quarter").should == EntryDate.new(:year => 2009, :month => 10, :quarter => 4)
132
257
  end
133
258
 
134
259
  it "should understand last month" do
@@ -136,7 +261,7 @@ module Appstats
136
261
  end
137
262
 
138
263
  it "should understand last week" do
139
- EntryDate.parse("last week").should == EntryDate.new(:year => 2010, :month => 1, :day => 4)
264
+ EntryDate.parse("last week").should == EntryDate.new(:year => 2010, :month => 1, :day => 4, :week => 1)
140
265
  end
141
266
 
142
267
  it "should understand last day" do
@@ -148,7 +273,7 @@ module Appstats
148
273
  end
149
274
 
150
275
  it "should understand previous quarter" do
151
- EntryDate.parse("previous quarter").should == EntryDate.new(:year => 2009, :month => 10)
276
+ EntryDate.parse("previous quarter").should == EntryDate.new(:year => 2009, :month => 10, :quarter => 4)
152
277
  end
153
278
 
154
279
  it "should understand previous month" do
@@ -156,7 +281,7 @@ module Appstats
156
281
  end
157
282
 
158
283
  it "should understand previous week" do
159
- EntryDate.parse("previous week").should == EntryDate.new(:year => 2010, :month => 1, :day => 4)
284
+ EntryDate.parse("previous week").should == EntryDate.new(:year => 2010, :month => 1, :day => 4, :week => 1)
160
285
  end
161
286
 
162
287
  it "should understand previous day" do
@@ -168,7 +293,7 @@ module Appstats
168
293
  end
169
294
 
170
295
  it "should understand this quarter" do
171
- EntryDate.parse("this quarter").should == EntryDate.new(:year => 2010, :month => 1)
296
+ EntryDate.parse("this quarter").should == EntryDate.new(:year => 2010, :month => 1, :quarter => 1)
172
297
  end
173
298
 
174
299
  it "should understand this month" do
@@ -176,7 +301,7 @@ module Appstats
176
301
  end
177
302
 
178
303
  it "should understand this week" do
179
- EntryDate.parse("this week").should == EntryDate.new(:year => 2010, :month => 1, :day => 11)
304
+ EntryDate.parse("this week").should == EntryDate.new(:year => 2010, :month => 1, :day => 11, :week => 2)
180
305
  end
181
306
 
182
307
  it "should understand this day" do
@@ -190,9 +315,9 @@ module Appstats
190
315
  end
191
316
 
192
317
  it "should understand last X quarters" do
193
- EntryDate.parse("last 1 quarter").should == EntryDate.new(:year => 2010, :month => 1)
194
- EntryDate.parse("last 2 quarters").should == EntryDate.new(:year => 2009, :month => 10)
195
- EntryDate.parse("last 3 quarters").should == EntryDate.new(:year => 2009, :month => 7)
318
+ EntryDate.parse("last 1 quarter").should == EntryDate.new(:year => 2010, :month => 1, :quarter => 1 )
319
+ EntryDate.parse("last 2 quarters").should == EntryDate.new(:year => 2009, :month => 10, :quarter => 4)
320
+ EntryDate.parse("last 3 quarters").should == EntryDate.new(:year => 2009, :month => 7, :quarter => 3)
196
321
  end
197
322
 
198
323
 
@@ -203,9 +328,9 @@ module Appstats
203
328
  end
204
329
 
205
330
  it "should understand last X weeks" do
206
- EntryDate.parse("last 1 week").should == EntryDate.new(:year => 2010, :month => 1, :day => 11)
207
- EntryDate.parse("last 2 weeks").should == EntryDate.new(:year => 2010, :month => 1, :day => 4)
208
- EntryDate.parse("last 3 weeks").should == EntryDate.new(:year => 2009, :month => 12, :day => 28)
331
+ EntryDate.parse("last 1 week").should == EntryDate.new(:year => 2010, :month => 1, :day => 11, :week => 2)
332
+ EntryDate.parse("last 2 weeks").should == EntryDate.new(:year => 2010, :month => 1, :day => 4, :week => 1)
333
+ EntryDate.parse("last 3 weeks").should == EntryDate.new(:year => 2009, :month => 12, :day => 28, :week => 52)
209
334
  end
210
335
 
211
336
  it "should understand last X days" do
@@ -221,9 +346,9 @@ module Appstats
221
346
  end
222
347
 
223
348
  it "should understand previous X quarters" do
224
- EntryDate.parse("previous 1 quarter").should == EntryDate.new(:year => 2009, :month => 10)
225
- EntryDate.parse("previous 2 quarters").should == EntryDate.new(:year => 2009, :month => 7)
226
- EntryDate.parse("previous 3 quarters").should == EntryDate.new(:year => 2009, :month => 4)
349
+ EntryDate.parse("previous 1 quarter").should == EntryDate.new(:year => 2009, :month => 10, :quarter => 4)
350
+ EntryDate.parse("previous 2 quarters").should == EntryDate.new(:year => 2009, :month => 7, :quarter => 3)
351
+ EntryDate.parse("previous 3 quarters").should == EntryDate.new(:year => 2009, :month => 4, :quarter => 2)
227
352
  end
228
353
 
229
354
  it "should understand previous X months" do
@@ -233,9 +358,9 @@ module Appstats
233
358
  end
234
359
 
235
360
  it "should understand previous X weeks" do
236
- EntryDate.parse("previous 1 week").should == EntryDate.new(:year => 2010, :month => 1, :day => 4)
237
- EntryDate.parse("previous 2 weeks").should == EntryDate.new(:year => 2009, :month => 12, :day => 28)
238
- EntryDate.parse("previous 3 weeks").should == EntryDate.new(:year => 2009, :month => 12, :day => 21)
361
+ EntryDate.parse("previous 1 week").should == EntryDate.new(:year => 2010, :month => 1, :day => 4, :week => 1)
362
+ EntryDate.parse("previous 2 weeks").should == EntryDate.new(:year => 2009, :month => 12, :day => 28, :week => 52)
363
+ EntryDate.parse("previous 3 weeks").should == EntryDate.new(:year => 2009, :month => 12, :day => 21, :week => 51)
239
364
  end
240
365
 
241
366
  it "should understand previous X days" do
@@ -72,6 +72,8 @@ module Appstats
72
72
  entry.hour.should == 10
73
73
  entry.min.should == 11
74
74
  entry.sec.should == 12
75
+ entry.week.should == 2
76
+ entry.quarter.should == 1
75
77
 
76
78
  entry.occurred_at = Time.parse("2011-02-16 17:18:19")
77
79
  entry.year.should == 2011
@@ -80,6 +82,8 @@ module Appstats
80
82
  entry.hour.should == 17
81
83
  entry.min.should == 18
82
84
  entry.sec.should == 19
85
+ entry.week.should == 7
86
+ entry.quarter.should == 1
83
87
 
84
88
  entry.occurred_at = nil
85
89
  entry.year.should == nil
@@ -88,7 +92,8 @@ module Appstats
88
92
  entry.hour.should == nil
89
93
  entry.min.should == nil
90
94
  entry.sec.should == nil
91
-
95
+ entry.week.should == nil
96
+ entry.quarter.should == nil
92
97
  end
93
98
 
94
99
  end
@@ -188,18 +193,18 @@ module Appstats
188
193
  end
189
194
 
190
195
  it "should understand an entry without contexts" do
191
- entry = Entry.create_from_logger_string("0.11.7 setup[:,=,-n] 2010-09-21 23:15:20 action=address_search")
196
+ entry = Entry.create_from_logger_string("0.12.1 setup[:,=,-n] 2010-09-21 23:15:20 action=address_search")
192
197
  Entry.count.should == @before_count + 1
193
198
  entry.action.should == "address_search"
194
- entry.raw_entry.should == "0.11.7 setup[:,=,-n] 2010-09-21 23:15:20 action=address_search"
199
+ entry.raw_entry.should == "0.12.1 setup[:,=,-n] 2010-09-21 23:15:20 action=address_search"
195
200
  entry.occurred_at.should == Time.parse("2010-09-21 23:15:20")
196
201
  end
197
202
 
198
203
  it "should understand contexts" do
199
- entry = Entry.create_from_logger_string("0.11.7 setup[:,=,-n] 2010-09-21 23:15:20 action=address_filter : app_name=Market : server=Live")
204
+ entry = Entry.create_from_logger_string("0.12.1 setup[:,=,-n] 2010-09-21 23:15:20 action=address_filter : app_name=Market : server=Live")
200
205
  Entry.count.should == @before_count + 1
201
206
  entry.action.should == "address_filter"
202
- entry.raw_entry.should == "0.11.7 setup[:,=,-n] 2010-09-21 23:15:20 action=address_filter : app_name=Market : server=Live"
207
+ entry.raw_entry.should == "0.12.1 setup[:,=,-n] 2010-09-21 23:15:20 action=address_filter : app_name=Market : server=Live"
203
208
  entry.occurred_at.should == Time.parse("2010-09-21 23:15:20")
204
209
  entry.contexts.size.should == 2
205
210
  entry.contexts[0].context_key = "app_name"
@@ -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.11.7 setup[:,=,-n] 2010-09-21 23:15:20 action=5 : blah=6"]
118
+ Appstats::Logger.raw_read.should == ["0.12.1 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.11.7 setup[:,=,-n] 2010-09-21 23:15:20 action=appstats-exception : error=blah : on=login"]
127
+ Appstats::Logger.raw_read.should == ["0.12.1 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.11.7 setup[:,=,-n] 2010-09-21 23:15:20 action=address_search")
144
+ actual = Appstats::Logger.entry_to_hash("0.12.1 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.11.7 setup[:,=,-n] 2010-09-21 23:15:20 action=address_filter : app_name=Market : server=Live")
150
+ actual = Appstats::Logger.entry_to_hash("0.12.1 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.11.7 setup[::,==,--n] 2010-09-21 23:15:20 action==address:=search-n")
156
+ actual = Appstats::Logger.entry_to_hash("0.12.1 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.11.7 setup[:::,===,---n] 2010-09-21 23:15:20 action===address::search==--n")
160
+ actual = Appstats::Logger.entry_to_hash("0.12.1 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.11.7 setup[::,==,--n] 2010-09-21 23:15:20 action==address :: server==market:eval=-n")
166
+ actual = Appstats::Logger.entry_to_hash("0.12.1 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.11.7 setup[:,=,-n] 2010-09-21 23:15:20 action=address_search"
175
+ expected = "0.12.1 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.11.7 setup[:,=,-n] 2010-09-21 23:15:20 action=1 : note=2.2"
181
+ expected = "0.12.1 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.11.7 setup[:,=,-n] 2010-09-21 23:15:20 action=address_search : app_name=market"
188
+ expected = "0.12.1 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.11.7 setup[:,=,-n] 2010-09-21 23:15:20 action=address_filter : app_name=Market : server=Live"
194
+ expected = "0.12.1 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.11.7 setup[::,==,--n] 2010-09-21 23:15:20 action==address:=search-n"
200
+ expected = "0.12.1 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.11.7 setup[:::,===,---n] 2010-09-21 23:15:20 action===address::search==--n"
204
+ expected = "0.12.1 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.11.7 setup[::,==,--n] 2010-09-21 23:15:20 action==address :: server==market:eval=-n"
210
+ expected = "0.12.1 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.11.7 setup[:,=,-n] 2010-09-21 23:15:20 action=address search"
216
+ expected = "0.12.1 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.11.7 setup[:,=,-n] 2010-09-21 23:15:20 action=address_-nsearch"
222
+ expected = "0.12.1 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.11.7 setup[:,=,-n] 2010-09-21 23:15:20 action=address_search : blah=some-nlong-nstatement"
228
+ expected = "0.12.1 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.11.7 setup[::,==,--n] 2010-09-21 23:15:20 action==address:=--nsearch-n"
234
+ expected = "0.12.1 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
@@ -3,6 +3,10 @@ require 'spec_helper'
3
3
  module Appstats
4
4
  describe Query do
5
5
 
6
+ before(:each) do
7
+ Time.stub!(:now).and_return(Time.parse('2010-09-21 23:15:20'))
8
+ end
9
+
6
10
  describe "#initialize" do
7
11
 
8
12
  before(:each) do
@@ -108,6 +112,41 @@ module Appstats
108
112
  query.run.count.should == 2
109
113
  end
110
114
 
115
+ describe "fixed_points searches" do
116
+
117
+ it "should handle year" do
118
+ query = Appstats::Query.new(:query => "# myblahs last year")
119
+ result = query.run
120
+ result.date_to_s.should == "2009-01-01 to 2009-12-31"
121
+ end
122
+
123
+ it "should handle quarter" do
124
+ query = Appstats::Query.new(:query => "# myblahs last quarter")
125
+ result = query.run
126
+ result.date_to_s.should == "2010-04-01 to 2010-06-30"
127
+ end
128
+
129
+ it "should handle month" do
130
+ query = Appstats::Query.new(:query => "# myblahs last month")
131
+ result = query.run
132
+ result.date_to_s.should == "2010-08-01 to 2010-08-31"
133
+ end
134
+
135
+ it "should handle week" do
136
+ query = Appstats::Query.new(:query => "# myblahs last week")
137
+ result = query.run
138
+ result.date_to_s.should == "2010-09-13 to 2010-09-19"
139
+ end
140
+
141
+ it "should handle day" do
142
+ query = Appstats::Query.new(:query => "# myblahs last day")
143
+ result = query.run
144
+ result.date_to_s.should == "2010-09-20"
145
+ end
146
+
147
+ end
148
+
149
+
111
150
  end
112
151
 
113
152
 
@@ -75,6 +75,11 @@ module Appstats
75
75
  @result.date_to_s.should == "2010-01-02 to present"
76
76
  end
77
77
 
78
+ it "should return one date if 'today'" do
79
+ @result.from_date = Time.parse("2010-01-02 03:04:05")
80
+ @result.to_date = Time.parse("2010-01-02 04:05:06")
81
+ @result.date_to_s.should == "2010-01-02"
82
+ end
78
83
 
79
84
  it "should handle a from date only" do
80
85
  @result.from_date = Time.parse("2010-01-02 03:04:05")
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: 61
4
+ hash: 45
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 11
9
- - 7
10
- version: 0.11.7
8
+ - 12
9
+ - 1
10
+ version: 0.12.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Andrew Forward
@@ -157,6 +157,7 @@ files:
157
157
  - db/migrations/20110217220357_add_additional_contexts_indexes.rb
158
158
  - db/migrations/20110217234136_add_appstats_results_contexts.rb
159
159
  - db/migrations/20110222215437_create_appstats_jobs.rb
160
+ - db/migrations/20110223212232_add_appstats_entries_week_and_quarter.rb
160
161
  - db/schema.rb
161
162
  - lib/appstats.rb
162
163
  - lib/appstats/action.rb