include_date_scopes 0.9.2 → 0.9.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,92 @@
1
+
2
+ module IncludeDateScopes
3
+ module DefineTimestampScopes
4
+
5
+ def define_timestamp_scopes_for(column_name, prepend_name = false)
6
+ prefix = prepend_name ? "#{column_name}_" : ""
7
+ t = self.arel_table
8
+
9
+ define_singleton_method :"#{prefix}between" do |start_date_or_time, stop_date_or_time|
10
+ start_time = (start_date_or_time.is_a?(Date) ? start_date_or_time.to_time : start_date_or_time)
11
+ stop_time = (stop_date_or_time.is_a?(Date) ? stop_date_or_time.to_time + 1.day : stop_date_or_time )
12
+ where(t[column_name].gteq(start_time).and(t[column_name].lteq stop_time))
13
+ end
14
+
15
+ define_singleton_method :"#{prefix}on_or_before_date" do |date|
16
+ where( t[column_name].lt date.to_date.tomorrow.midnight.gmtime )
17
+ end
18
+
19
+ define_singleton_method :"#{prefix}on_or_before" do |time|
20
+ where(t[column_name].lteq time_object(time))
21
+ end
22
+
23
+ define_singleton_method :"#{prefix}before" do |time|
24
+ where(t[column_name].lt time_object(time))
25
+ end
26
+
27
+ define_singleton_method :"#{prefix}on_or_after_date" do |time|
28
+ where(t[column_name].gteq time.to_date.midnight.gmtime )
29
+ end
30
+
31
+ define_singleton_method :"#{prefix}on_or_after" do |time|
32
+ where(t[column_name].gteq time_object(time))
33
+ end
34
+
35
+ define_singleton_method :"#{prefix}after" do |time|
36
+ where(t[column_name].gt (time.is_a?(Date) ? time.to_time + 1.day : time ))
37
+ end
38
+
39
+ define_singleton_method :"#{prefix}on" do |day|
40
+ __send__(:"#{prefix}between", day.beginning_of_day, day.end_of_day)
41
+ end
42
+
43
+ define_singleton_method :"#{prefix}day" do |day|
44
+ __send__(:"#{prefix}on", day)
45
+ end
46
+
47
+ define_singleton_method :"#{prefix}last_24_hours" do
48
+ __send__(:"#{prefix}last_day")
49
+ end
50
+
51
+ [:minute, :hour].each do |time_unit|
52
+ define_singleton_method :"#{prefix}next_#{time_unit}" do
53
+ __send__(:"#{prefix}between", Time.now, 1.send(time_unit).from_now)
54
+ end
55
+
56
+ define_singleton_method :"#{prefix}last_#{time_unit}" do
57
+ __send__(:"#{prefix}between", 1.send(time_unit).ago, Time.now)
58
+ end
59
+ end
60
+
61
+ [:seconds, :minutes, :hours].each do |time_unit|
62
+ define_singleton_method :"#{prefix}last_n_#{time_unit}" do |count|
63
+ __send__(:"#{prefix}between", count.send(time_unit).ago, Time.now)
64
+ end
65
+
66
+ define_singleton_method :"#{prefix}next_n_#{time_unit}" do |count|
67
+ __send__(:"#{prefix}between", Time.now, count.send(time_unit).from_now)
68
+ end
69
+ end
70
+
71
+ define_singleton_method :"#{prefix}this_minute" do
72
+ __send__(:"#{prefix}between", Time.now.change(sec: 0), Time.now.change(sec: 59, usec: Rational(999999999, 1000)))
73
+ end
74
+
75
+ [:hour, :day, :week, :month, :year].each do |time_unit|
76
+ define_singleton_method :"#{prefix}this_#{time_unit}" do
77
+ __send__(:"#{prefix}between", 1.send(time_unit).ago.send(:"end_of_#{time_unit}"), Time.now.send(:"end_of_#{time_unit}"))
78
+ end
79
+ end
80
+
81
+ define_common_scopes prefix, column_name
82
+ end
83
+
84
+ private
85
+
86
+ def time_object(time)
87
+ time.is_a?(Date) ? time.to_time + 1.day : time
88
+ end
89
+
90
+ end
91
+ end
92
+
@@ -1,4 +1,4 @@
1
1
 
2
2
  module IncludeDateScopes
3
- VERSION = '0.9.2'.freeze
3
+ VERSION = '0.9.3'.freeze
4
4
  end
@@ -40,4 +40,18 @@ describe "Post" do
40
40
 
41
41
  it_behaves_like 'date scopes', :show_until
42
42
  end
43
+
44
+ describe 'providing column type' do
45
+ before(:all) do
46
+ define_model_class do
47
+ include_date_scopes_for :show_at, nil, :date
48
+ end
49
+ end
50
+
51
+ it 'does not respond to time scopes' do
52
+ expect(Post).not_to respond_to(:last_n_minutes)
53
+ end
54
+
55
+ it_behaves_like 'date scopes', :show_at
56
+ end
43
57
  end
@@ -1,197 +1,263 @@
1
1
 
2
+ shared_examples "between date scope" do |name|
3
+ context 'with time argument' do
4
+ # Not working right now
5
+ # include_examples 'between time scope', name, 1.day
6
+ end
7
+
8
+ context 'with date argument' do
9
+ subject do
10
+ test_class.send "#{prefix}#{name}", *arguments
11
+ end
12
+
13
+ let(:after_threshold_obj) { test_class.create! date_column => top_threshold.to_date - 1.second }
14
+ let(:at_top_threshold_obj) { test_class.create! date_column => top_threshold.to_date }
15
+ let(:at_bottom_threshold_obj) { test_class.create! date_column => bottom_threshold.to_date }
16
+ let(:before_threshold_obj) { test_class.create! date_column => bottom_threshold.to_date + 1.second }
17
+
18
+ it { should_not include after_threshold_obj }
19
+ it { should include at_top_threshold_obj }
20
+ it { should include at_bottom_threshold_obj }
21
+ it { should_not include before_threshold_obj }
22
+ end
23
+ end
24
+
2
25
  shared_examples "date scopes" do |date_column = :created_at, prefix = '' |
3
26
  let(:test_class) { Post }
27
+ let(:prefix) { prefix }
28
+ let(:date_column) { date_column }
29
+
4
30
  describe "date scopes" do
5
31
  before(:all) { Timecop.freeze Time.local(2013,02,15,06,30) }
6
32
 
7
- let(:last_year_obj) { test_class.create! date_column => 1.year.ago }
8
- let(:last_month_obj) { test_class.create! date_column => 1.month.ago.to_date }
9
- let(:beginning_of_month_obj) { test_class.create! date_column => Date.today.beginning_of_month }
10
- let(:last_week_obj) { test_class.create! date_column => 7.days.ago.to_date }
11
- let(:beginning_of_week_obj) { test_class.create! date_column => Date.today.beginning_of_week }
12
- let(:yesterday_obj) { test_class.create! date_column => Date.yesterday }
13
- let(:today_obj) { test_class.create! date_column => Date.today }
14
-
15
33
  describe ":between" do
16
- subject { test_class.send("#{prefix}between", 2.days.ago.to_date, Date.yesterday) }
34
+ subject { test_class.send("#{prefix}between", 6.days.ago.to_date, 3.day.ago.to_date) }
17
35
 
18
- it { should_not include last_week_obj }
19
- it { should include yesterday_obj }
20
- it { should_not include today_obj }
36
+ let(:after_threshold_obj) { test_class.create! date_column => 2.days.ago.to_date }
37
+ let(:at_top_threshold_obj) { test_class.create! date_column => 3.days.ago.to_date }
38
+ let(:at_bottom_threshold_obj) { test_class.create! date_column => 6.days.ago.to_date }
39
+ let(:before_threshold_obj) { test_class.create! date_column => 7.days.ago.to_date }
40
+
41
+ it { should_not include after_threshold_obj }
42
+ it { should include at_top_threshold_obj }
43
+ it { should include at_bottom_threshold_obj }
44
+ it { should_not include before_threshold_obj }
21
45
  end
22
46
 
23
47
  describe ":after" do
24
- subject { test_class.send("#{prefix}after", 2.days.ago.to_date) }
48
+ subject { test_class.send("#{prefix}after", 3.days.ago.to_date) }
25
49
 
26
- it { should_not include last_week_obj }
27
- it { should include yesterday_obj }
28
- it { should include today_obj }
50
+ let(:after_threshold_obj) { test_class.create! date_column => 2.days.ago.to_date }
51
+ let(:on_threshold_obj) { test_class.create! date_column => 3.days.ago.to_date }
52
+ let(:before_threshold_obj) { test_class.create! date_column => 4.days.ago.to_date }
53
+
54
+ it { should include after_threshold_obj }
55
+ it { should_not include on_threshold_obj }
56
+ it { should_not include before_threshold_obj }
29
57
  end
30
58
 
31
59
  describe ":before" do
32
- subject { test_class.send("#{prefix}before", Date.today) }
33
-
34
- it { should include last_week_obj }
35
- it { should include yesterday_obj }
36
- it { should_not include today_obj }
37
- end
60
+ subject { test_class.send("#{prefix}before", 3.days.ago.to_date) }
38
61
 
39
- describe ":today" do
40
- subject { test_class.send("#{prefix}today") }
62
+ let(:after_threshold_obj) { test_class.create! date_column => 4.days.ago.to_date }
63
+ let(:on_threshold_obj) { test_class.create! date_column => 3.days.ago.to_date }
64
+ let(:before_threshold_obj) { test_class.create! date_column => 2.days.ago.to_date }
41
65
 
42
- it { should_not include last_week_obj }
43
- it { should_not include yesterday_obj }
44
- it { should include today_obj }
66
+ it { should include after_threshold_obj }
67
+ it { should_not include on_threshold_obj }
68
+ it { should_not include before_threshold_obj }
45
69
  end
46
70
 
47
- describe ":yesterday" do
48
- subject { test_class.send("#{prefix}yesterday") }
71
+ describe ":on_or_after" do
72
+ subject { test_class.send("#{prefix}on_or_after", 3.days.ago.to_date) }
49
73
 
50
- it { should_not include last_week_obj }
51
- it { should include yesterday_obj }
52
- it { should_not include today_obj }
53
- end
74
+ let(:after_threshold_obj) { test_class.create! date_column => 2.days.ago.to_date }
75
+ let(:on_threshold_obj) { test_class.create! date_column => 3.days.ago.to_date }
76
+ let(:before_threshold_obj) { test_class.create! date_column => 4.days.ago.to_date }
54
77
 
55
- describe ":last_week" do
56
- subject { test_class.send("#{prefix}last_week") }
57
-
58
- it { should_not include last_week_obj }
59
- it { should include yesterday_obj }
60
- it { should include today_obj }
78
+ it { should include after_threshold_obj }
79
+ it { should include on_threshold_obj }
80
+ it { should_not include before_threshold_obj }
61
81
  end
62
82
 
63
- describe ":last_month" do
64
- subject { test_class.send("#{prefix}last_month") }
83
+ describe ":on_or_before" do
84
+ subject { test_class.send("#{prefix}on_or_before", 3.days.ago) }
65
85
 
66
- it { should_not include last_year_obj }
67
- it { should_not include last_month_obj }
68
- it { should include last_week_obj }
69
- it { should include yesterday_obj }
70
- end
86
+ let(:after_threshold_obj) { test_class.create! date_column => 4.days.ago.to_date }
87
+ let(:on_threshold_obj) { test_class.create! date_column => 3.days.ago.to_date }
88
+ let(:before_threshold_obj) { test_class.create! date_column => 2.days.ago.to_date }
71
89
 
72
- describe ":last_year" do
73
- subject { test_class.send("#{prefix}last_year") }
90
+ it { should include after_threshold_obj }
91
+ it { should include on_threshold_obj }
92
+ it { should_not include before_threshold_obj }
93
+ end
74
94
 
75
- it { should_not include last_year_obj }
76
- it { should include last_month_obj }
77
- it { should include last_week_obj }
78
- it { should include yesterday_obj }
95
+ describe ":today" do
96
+ let(:top_threshold) { Time.now.beginning_of_day }
97
+ let(:bottom_threshold) { Time.now.end_of_day }
98
+ let(:arguments) { [] }
99
+ include_examples 'between date scope','today'
79
100
  end
80
101
 
81
- describe 'last_n_days' do
82
- subject { test_class.send("#{prefix}last_n_days", 3) }
102
+ describe ":yesterday" do
103
+ let(:top_threshold) { 1.day.ago.beginning_of_day }
104
+ let(:bottom_threshold) { 1.day.ago.end_of_day }
105
+ let(:arguments) { [] }
106
+ include_examples 'between date scope','yesterday'
107
+ end
83
108
 
84
- let(:after_threshold_obj) { test_class.create! date_column => 4.days.ago }
85
- let(:on_threshold_obj) { test_class.create! date_column => 3.days.ago }
86
- let(:before_threshold_obj) { test_class.create! date_column => 2.days.ago }
109
+ describe ":tomorrow" do
110
+ let(:top_threshold) { 1.day.from_now.beginning_of_day }
111
+ let(:bottom_threshold) { 1.day.from_now.end_of_day }
112
+ let(:arguments) { [] }
113
+ include_examples 'between date scope','tomorrow'
114
+ end
87
115
 
88
- it { should_not include after_threshold_obj }
89
- it { should include on_threshold_obj }
90
- it { should include before_threshold_obj }
116
+ describe ":next_day" do
117
+ let(:bottom_threshold) { 1.day.from_now }
118
+ let(:top_threshold) { Time.now }
119
+ let(:arguments) { [] }
120
+ include_examples 'between date scope','next_day'
91
121
  end
92
122
 
93
- describe 'last_n_months' do
94
- subject { test_class.send("#{prefix}last_n_months", 3) }
123
+ describe ":next_week" do
124
+ let(:bottom_threshold) { 1.week.from_now }
125
+ let(:top_threshold) { Time.now }
126
+ let(:arguments) { [] }
127
+ include_examples 'between date scope','next_week'
128
+ end
95
129
 
96
- let(:after_threshold_obj) { test_class.create! date_column => 4.months.ago }
97
- let(:on_threshold_obj) { test_class.create! date_column => 3.months.ago }
98
- let(:before_threshold_obj) { test_class.create! date_column => 2.months.ago }
130
+ describe ":next_month" do
131
+ let(:bottom_threshold) { 1.month.from_now }
132
+ let(:top_threshold) { Time.now }
133
+ let(:arguments) { [] }
134
+ include_examples 'between date scope','next_month'
135
+ end
99
136
 
100
- it { should_not include after_threshold_obj }
101
- it { should include on_threshold_obj }
102
- it { should include before_threshold_obj }
137
+ describe ":next_year" do
138
+ let(:bottom_threshold) { 1.year.from_now }
139
+ let(:top_threshold) { Time.now }
140
+ let(:arguments) { [] }
141
+ include_examples 'between date scope','next_year'
103
142
  end
104
143
 
105
- describe 'last_n_years' do
106
- subject { test_class.send("#{prefix}last_n_years", 3) }
144
+ describe ":last_day" do
145
+ let(:top_threshold) { 1.day.ago }
146
+ let(:bottom_threshold) { Time.now }
147
+ let(:arguments) { [] }
148
+ include_examples 'between date scope','last_day'
149
+ end
107
150
 
108
- let(:after_threshold_obj) { test_class.create! date_column => 4.years.ago }
109
- let(:on_threshold_obj) { test_class.create! date_column => 3.years.ago }
110
- let(:before_threshold_obj) { test_class.create! date_column => 2.years.ago }
151
+ describe ":last_week" do
152
+ let(:top_threshold) { 1.week.ago }
153
+ let(:bottom_threshold) { Time.now }
154
+ let(:arguments) { [] }
155
+ include_examples 'between date scope','last_week'
156
+ end
111
157
 
112
- it { should_not include after_threshold_obj }
113
- it { should include on_threshold_obj }
114
- it { should include before_threshold_obj }
158
+ describe ":last_month" do
159
+ let(:top_threshold) { 1.month.ago }
160
+ let(:bottom_threshold) { Time.now }
161
+ let(:arguments) { [] }
162
+ include_examples 'between date scope','last_month'
115
163
  end
116
164
 
117
- describe 'next_n_days' do
118
- subject { test_class.send("#{prefix}next_n_days", 3) }
165
+ describe ":last_year" do
166
+ let(:top_threshold) { 1.year.ago }
167
+ let(:bottom_threshold) { Time.now }
168
+ let(:arguments) { [] }
169
+ include_examples 'between date scope','last_year'
170
+ end
119
171
 
120
- let(:after_threshold_obj) { test_class.create! date_column => 2.days.from_now }
121
- let(:on_threshold_obj) { test_class.create! date_column => 3.days.from_now }
122
- let(:before_threshold_obj) { test_class.create! date_column => 4.days.from_now }
172
+ describe ":last_n_days" do
173
+ let(:top_threshold) { 3.days.ago }
174
+ let(:bottom_threshold) { Time.now }
175
+ let(:arguments) { [3] }
176
+ include_examples 'between date scope','last_n_days'
177
+ end
123
178
 
124
- it { should include after_threshold_obj }
125
- it { should include on_threshold_obj }
126
- it { should_not include before_threshold_obj }
179
+ describe ":last_n_weeks" do
180
+ let(:top_threshold) { 3.weeks.ago }
181
+ let(:bottom_threshold) { Time.now }
182
+ let(:arguments) { [3] }
183
+ include_examples 'between date scope','last_n_weeks'
127
184
  end
128
185
 
129
- describe 'next_n_months' do
130
- subject { test_class.send("#{prefix}next_n_months", 3) }
186
+ describe ":last_n_months" do
187
+ let(:top_threshold) { 3.months.ago }
188
+ let(:bottom_threshold) { Time.now }
189
+ let(:arguments) { [3] }
190
+ include_examples 'between date scope','last_n_months'
191
+ end
131
192
 
132
- let(:after_threshold_obj) { test_class.create! date_column => 2.months.from_now }
133
- let(:on_threshold_obj) { test_class.create! date_column => 3.months.from_now }
134
- let(:before_threshold_obj) { test_class.create! date_column => 4.months.from_now }
193
+ describe ":last_n_years" do
194
+ let(:top_threshold) { 3.years.ago }
195
+ let(:bottom_threshold) { Time.now }
196
+ let(:arguments) { [3] }
197
+ include_examples 'between date scope','last_n_years'
198
+ end
135
199
 
136
- it { should include after_threshold_obj }
137
- it { should include on_threshold_obj }
138
- it { should_not include before_threshold_obj }
200
+ describe ":next_n_days" do
201
+ let(:top_threshold) { Time.now }
202
+ let(:bottom_threshold) { 3.days.from_now }
203
+ let(:arguments) { [3] }
204
+ include_examples 'between date scope','next_n_days'
139
205
  end
140
206
 
141
- describe 'next_n_years' do
142
- subject { test_class.send("#{prefix}next_n_years", 3) }
207
+ describe ":next_n_weeks" do
208
+ let(:top_threshold) { Time.now }
209
+ let(:bottom_threshold) { 3.weeks.from_now }
210
+ let(:arguments) { [3] }
211
+ include_examples 'between date scope','next_n_weeks'
212
+ end
143
213
 
144
- let(:after_threshold_obj) { test_class.create! date_column => 2.years.from_now }
145
- let(:on_threshold_obj) { test_class.create! date_column => 3.years.from_now }
146
- let(:before_threshold_obj) { test_class.create! date_column => 4.years.from_now }
214
+ describe ":next_n_months" do
215
+ let(:top_threshold) { Time.now }
216
+ let(:bottom_threshold) { 3.months.from_now }
217
+ let(:arguments) { [3] }
218
+ include_examples 'between date scope','next_n_months'
219
+ end
147
220
 
148
- it { should include after_threshold_obj }
149
- it { should include on_threshold_obj }
150
- it { should_not include before_threshold_obj }
221
+ describe ":next_n_years" do
222
+ let(:top_threshold) { Time.now }
223
+ let(:bottom_threshold) { 3.years.from_now }
224
+ let(:arguments) { [3] }
225
+ include_examples 'between date scope','next_n_years'
151
226
  end
152
227
 
153
228
  describe ":last_30_days" do
154
- subject { test_class.send("#{prefix}last_30days") }
229
+ let(:top_threshold) { 30.days.ago }
230
+ let(:bottom_threshold) { Time.now }
231
+ let(:arguments) { [] }
232
+ include_examples 'between date scope','last_30_days'
233
+ end
155
234
 
156
- it { should_not include last_month_obj }
157
- it { should include last_week_obj }
158
- it { should include yesterday_obj }
235
+ describe ":this_day" do
236
+ let(:top_threshold) { Time.now.beginning_of_day }
237
+ let(:bottom_threshold) { Time.now.end_of_day }
238
+ let(:arguments) { [] }
239
+ include_examples 'between date scope','this_day'
159
240
  end
160
241
 
161
242
  describe ":this_week" do
162
- subject { test_class.send("#{prefix}this_week") }
163
-
164
- let(:before_week) { test_class.create! date_column => Date.today.beginning_of_week - 1.minute }
165
- let(:at_beginning_of_week) { test_class.create! date_column => Date.today.beginning_of_week }
166
- let(:after_week) { test_class.create! date_column => Date.today.beginning_of_week + 1.minute }
167
-
168
- it { should_not include before_week }
169
- it { should include at_beginning_of_week }
170
- it { should include after_week }
243
+ let(:top_threshold) { Time.now.beginning_of_week }
244
+ let(:bottom_threshold) { Time.now.end_of_week }
245
+ let(:arguments) { [] }
246
+ include_examples 'between date scope','this_week'
171
247
  end
172
248
 
173
249
  describe ":this_month" do
174
- subject { test_class.send("#{prefix}this_month") }
175
-
176
- let(:before_month) { test_class.create! date_column => Date.today.beginning_of_month - 1.minute }
177
- let(:at_beginning_of_month) { test_class.create! date_column => Date.today.beginning_of_month }
178
- let(:after_month) { test_class.create! date_column => Date.today.beginning_of_month + 1.minute }
179
-
180
- it { should_not include before_month }
181
- it { should include at_beginning_of_month }
182
- it { should include after_month }
250
+ let(:top_threshold) { Time.now.beginning_of_month }
251
+ let(:bottom_threshold) { Time.now.end_of_month }
252
+ let(:arguments) { [] }
253
+ include_examples 'between date scope','this_month'
183
254
  end
184
255
 
185
256
  describe ":this_year" do
186
- subject { test_class.send("#{prefix}this_year") }
187
-
188
- let(:before_year) { test_class.create! date_column => Date.today.beginning_of_year - 1.minute }
189
- let(:at_beginning_of_year) { test_class.create! date_column => Date.today.beginning_of_year }
190
- let(:after_year) { test_class.create! date_column => Date.today.beginning_of_year + 1.minute }
191
-
192
- it { should_not include before_year }
193
- it { should include at_beginning_of_year }
194
- it { should include after_year }
257
+ let(:top_threshold) { Time.now.beginning_of_year }
258
+ let(:bottom_threshold) { Time.now.end_of_year }
259
+ let(:arguments) { [] }
260
+ include_examples 'between date scope','this_year'
195
261
  end
196
262
  end
197
263
  end