include_date_scopes 0.9.9 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cc5fb55e3cee51dc62e328c214250470e036e233
4
- data.tar.gz: 67e4dfba26a4d5f5657ebb6a7034d9288a2e61de
3
+ metadata.gz: c585c13b5ffafee45ecf2db6c37812c8c003a7ae
4
+ data.tar.gz: 77647c80fd039022fe644e5ba3d06da80b6401b2
5
5
  SHA512:
6
- metadata.gz: 36d1795e13fc032fe64b76021e418c1d844f88860643f6eb3e7778ef36eb28e8907a53974d8d2b58968dbe8349dbe0e5ef6e980b998f7abfb3f6134f5536766f
7
- data.tar.gz: adaaa58c900d48536e13c3ba5884141e5e434e0e0f220c054150dfcb9f6d3feeceea2d7f1edc278dcdeef0ddcf2060bef0ef71d36fc78d56ad6feee7036ae6ca
6
+ metadata.gz: cba126e9c7ff5920d166a91d2e3403bd3918e4ad7633bed6822f06a6e4c8357799cf8634468bc9f2a8097cdc5a515d56829a801ba583a35946216cb79db89e41
7
+ data.tar.gz: cf563efd3e8820b8f3f43d9d4eef60d92a56b5ea562e30039f8949e026c93415a6ea2696b96e53ad5aec1cebd29cc91561a207da650cee16a1800c6528c2f7f0
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.1.2
1
+ 2.2.4
data/Gemfile CHANGED
@@ -1,6 +1,5 @@
1
1
  source "http://rubygems.org"
2
2
 
3
- gem 'appraisal'
4
3
  gemspec
5
4
 
6
5
  # *************************************
@@ -8,7 +7,7 @@ gemspec
8
7
  # * If you have any local gems to include, create a new Gemfile at ~/.Gemfile
9
8
  # * This code will import anything in there.
10
9
  # *************************************
11
- # if File.exist? File.join(Dir.home,'.Gemfile')
12
- # eval File.read File.join(Dir.home,'.Gemfile')
13
- # end
10
+ if File.exists? File.join(Dir.home,'.Gemfile')
11
+ eval File.read File.join(Dir.home,'.Gemfile')
12
+ end
14
13
 
data/README.md CHANGED
@@ -30,3 +30,97 @@ class Post < ActiveRecord::Base
30
30
  end
31
31
  ```
32
32
  Now the scopes will all be prepended with `updated_at_`. So `Post.yesterday` would become `Post.updated_at_yesterday`.
33
+
34
+ Date Scopes
35
+ -------
36
+
37
+ | Method | Description |
38
+ | --- | --- |
39
+ | `between(start_date,stop_date)` | On or after start_date and on or before stop_date |
40
+ | `on(date)` | |
41
+ | `on_or_before(date)` | |
42
+ | `on_or_before_date(date)` | |
43
+ | `on_or_after(date)` | |
44
+ | `on_or_after_date(date)` | |
45
+ | `before(date)` | |
46
+ | `after(date)` | |
47
+ | `day(date)` | Syonym for `on(date)` |
48
+ | `today` | |
49
+ | `yesterday` | |
50
+ | `tomorrow` | |
51
+ | `this_day` | On the current day |
52
+ | `this_week` | Within the current week (Monday thru Sunday) |
53
+ | `this_month` | Within the current month |
54
+ | `this_year` | Within the current year |
55
+ | `next_day` | Today or tomorrow |
56
+ | `next_week` | Today through the next 7 days |
57
+ | `next_month` | Today through the same day next month |
58
+ | `next_year` | Today through the same day next year |
59
+ | `last_day` | Yesterday or today |
60
+ | `last_week` | Last 7 days through today |
61
+ | `last_month` | Same day last month through today |
62
+ | `last_year` | Same day last year through today |
63
+ | `next_n_days(number)` | Within the next `number` days |
64
+ | `next_n_weeks(number)` | |
65
+ | `next_n_months(number)` | |
66
+ | `next_n_years(number)` | |
67
+ | `last_n_days(number)` | Within the last `number` days |
68
+ | `last_n_weeks(number)` | |
69
+ | `last_n_months(number)` | |
70
+ | `last_n_years(number)` | |
71
+ | `last_30_days` | Synonym for `last_n_days(30)` |
72
+ | `most_recent` | Orders most recent first |
73
+
74
+ Timestamp Scopes
75
+ ----------------
76
+
77
+ | Method | Description |
78
+ | --- | --- |
79
+ | `between(start_time_or_date,stop_time_or_date)` | If start_date_or_time is a Date, the interval INCLUDES the start of the day; otherwise, the interval INCLUDES the argument time. If stop_date_or_time is a Date, the interval INCLUDES the end date; otherwise, the interval EXCLUDES the argument time. |
80
+ | `on(date)` | |
81
+ | `on_or_before(time_or_date)` | At or before a Time argument, or on or before a Date argument |
82
+ | `on_or_before_date(time_or_date)` | Converts a Time argument to Date |
83
+ | `on_or_after(time_or_date)` | At or after a Time argument, or on or after a Date argument |
84
+ | `on_or_after_date(time_or_date)` | Converts a Time argument to Date |
85
+ | `before(time_or_date)` | |
86
+ | `after(time_or_date)` | |
87
+ | `day(date)` | Synonym for `on(date)` |
88
+ | `today` | |
89
+ | `yesterday` | |
90
+ | `tomorrow` | |
91
+ | `this_minute` | Within the current minute |
92
+ | `this_hour` | Within the current hour |
93
+ | `this_day` | Within the current day |
94
+ | `this_week` | Within the current week (Monday thru Sunday) |
95
+ | `this_month` | Within the current month |
96
+ | `this_year` | Within the current year |
97
+ | `next_minute` | Within the next 60 seconds |
98
+ | `next_hour` | Within the next 3600 seconds |
99
+ | `next_day` | Within the next 86400 seconds |
100
+ | `next_week` | Within the next 604800 seconds |
101
+ | `next_month` | Until the same time next month |
102
+ | `next_year` | Until the same time next year |
103
+ | `last_minute` | From 60 seconds ago until the next second |
104
+ | `last_hour` | From 3600 seconds ago until the next second |
105
+ | `last_day` | From 86400 seconds ago until the next second |
106
+ | `last_24_hours` | Synonym for `last_day` |
107
+ | `last_week` | From 604800 seconds ago until the next second |
108
+ | `last_month` | From the same time last month until the next second |
109
+ | `last_year` | From the same time last year until the next second |
110
+ | `next_n_seconds(number)` | Within the next `number` seconds |
111
+ | `next_n_minutes(number)` | |
112
+ | `next_n_hours(number)` | |
113
+ | `next_n_days(number)` | |
114
+ | `next_n_weeks(number)` | |
115
+ | `next_n_months(number)` | |
116
+ | `next_n_years(number)` | |
117
+ | `last_n_seconds(number)` | Within the last `number` seconds |
118
+ | `last_n_minutes(number)` | |
119
+ | `last_n_hours(number)` | |
120
+ | `last_n_days(number)` | |
121
+ | `last_n_weeks(number)` | |
122
+ | `last_n_months(number)` | |
123
+ | `last_n_years(number)` | |
124
+ | `last_30_days` | Synonym for `last_n_days(30)` |
125
+ | `most_recent` | Orders most recent first |
126
+
@@ -23,5 +23,6 @@ DESCRIPTION
23
23
  s.add_dependency "railties"
24
24
  s.add_development_dependency "rspec-rails", "2.14.2"
25
25
  s.add_development_dependency "sqlite3", "1.3.9"
26
+ # s.add_development_dependency "mysql2", "~> 0.3.10" # TODO: How to dynamically choose sqlite or mysql?
26
27
  s.add_development_dependency 'timecop', "0.7.1"
27
28
  end
@@ -20,16 +20,20 @@ module IncludeDateScopes
20
20
 
21
21
  [:day, :week, :month, :year].each do |time_unit|
22
22
  define_singleton_method :"#{prefix}next_#{time_unit}" do
23
- __send__(:"#{prefix}between", Time.now, 1.send(time_unit).from_now)
23
+ now = Time.now
24
+ __send__(:"#{prefix}between", now, now + 1.send(time_unit))
24
25
  end
25
26
  define_singleton_method :"#{prefix}last_#{time_unit}" do
26
- __send__(:"#{prefix}between", 1.send(time_unit).ago, Time.now)
27
+ now = Time.now
28
+ __send__(:"#{prefix}between", now - 1.send(time_unit), now + 1.second)
27
29
  end
28
30
  define_singleton_method :"#{prefix}next_n_#{time_unit}s" do |count|
29
- __send__(:"#{prefix}between", Time.now, count.send(time_unit).from_now)
31
+ now = Time.now
32
+ __send__(:"#{prefix}between", now, now + count.send(time_unit))
30
33
  end
31
34
  define_singleton_method :"#{prefix}last_n_#{time_unit}s" do |count|
32
- __send__(:"#{prefix}between", count.send(time_unit).ago, Time.now)
35
+ now = Time.now
36
+ __send__(:"#{prefix}between", now - count.send(time_unit), now + 1.second)
33
37
  end
34
38
  end
35
39
 
@@ -10,7 +10,14 @@ module IncludeDateScopes
10
10
  end
11
11
 
12
12
  {:on_or_before => :lteq, :before => :lt, :on_or_after => :gteq, :after => :gt, :on => :eq}.each do |label, op|
13
- define_singleton_method :"#{prefix}#{label}" do |date|
13
+ define_singleton_method :"#{prefix}#{label}" do |date_or_time|
14
+ if date_or_time.kind_of? Time
15
+ date = date_or_time.to_date
16
+ elsif date_or_time.kind_of? DateTime
17
+ date = date_or_time.to_date
18
+ else
19
+ date = date_or_time
20
+ end
14
21
  where t[column_name].send op, date
15
22
  end
16
23
  end
@@ -21,7 +28,8 @@ module IncludeDateScopes
21
28
 
22
29
  [:week, :month, :year].each do |time_unit|
23
30
  define_singleton_method :"#{prefix}this_#{time_unit}" do
24
- __send__(:"#{prefix}between", Date.today.send(:"beginning_of_#{time_unit}"), Date.today.send(:"end_of_#{time_unit}"))
31
+ today = Date.today
32
+ __send__(:"#{prefix}between", today.send(:"beginning_of_#{time_unit}"), today.send(:"end_of_#{time_unit}"))
25
33
  end
26
34
  end
27
35
 
@@ -1,4 +1,3 @@
1
-
2
1
  module IncludeDateScopes
3
2
  module DefineTimestampScopes
4
3
 
@@ -7,37 +6,49 @@ module IncludeDateScopes
7
6
  t = self.arel_table
8
7
 
9
8
  define_singleton_method :"#{prefix}between" do |start_date_or_time, stop_date_or_time|
9
+ # If start_date_or_time is a Date, the interval INCLUDES the start of the day; otherwise, the interval INCLUDES the argument time.
10
+ # If stop_date_or_time is a Date, the interval INCLUDES the end date; otherwise, the interval EXCLUDES the argument time.
11
+ # For example between(Date.today, Date.today) is equivalent to between(Date.today.midnight, Date.tomorrow.midnight).
10
12
  start_time = (start_date_or_time.is_a?(Date) ? start_date_or_time.to_time : start_date_or_time)
11
13
  stop_time = (stop_date_or_time.is_a?(Date) ? stop_date_or_time.to_time + 1.day : stop_date_or_time )
12
14
  where(t[column_name].gteq(start_time).and(t[column_name].lt stop_time))
13
15
  end
14
16
 
15
17
  define_singleton_method :"#{prefix}on_or_before_date" do |date|
16
- where( t[column_name].lt date.to_date.tomorrow.midnight.gmtime )
18
+ where(t[column_name].lt date.to_date.tomorrow.midnight)
17
19
  end
18
20
 
19
- define_singleton_method :"#{prefix}on_or_before" do |time|
20
- where(t[column_name].lteq (time.is_a?(Date) ? time.to_time : time))
21
+ define_singleton_method :"#{prefix}on_or_before" do |time|
22
+ if time.is_a?(Date)
23
+ where(t[column_name].lt time.to_time + 1.day)
24
+ else
25
+ where(t[column_name].lteq time)
26
+ end
21
27
  end
22
28
 
23
- define_singleton_method :"#{prefix}before" do |time|
24
- where(t[column_name].lt (time.is_a?(Date) ? time.to_time : time))
29
+ define_singleton_method :"#{prefix}before" do |time|
30
+ time = time.to_time if time.kind_of? Date
31
+ where(t[column_name].lt time)
25
32
  end
26
33
 
27
34
  define_singleton_method :"#{prefix}on_or_after_date" do |time|
28
- where(t[column_name].gteq time.to_date.midnight.gmtime )
35
+ where(t[column_name].gteq time.to_date.midnight)
29
36
  end
30
37
 
31
38
  define_singleton_method :"#{prefix}on_or_after" do |time|
32
- where(t[column_name].gteq (time.is_a?(Date) ? time.to_time + 1.day : time ))
39
+ where(t[column_name].gteq time.to_time)
33
40
  end
34
41
 
35
42
  define_singleton_method :"#{prefix}after" do |time|
36
- where(t[column_name].gt (time.is_a?(Date) ? time.to_time + 1.day : time ))
43
+ if time.is_a?(Date)
44
+ where(t[column_name].gteq time.to_time + 1.day)
45
+ else
46
+ where(t[column_name].gt time)
47
+ end
37
48
  end
38
49
 
39
50
  define_singleton_method :"#{prefix}on" do |day|
40
- __send__(:"#{prefix}between", day.beginning_of_day, day.end_of_day)
51
+ __send__(:"#{prefix}between", day.to_date, day.to_date)
41
52
  end
42
53
 
43
54
  define_singleton_method :"#{prefix}last_24_hours" do
@@ -46,31 +57,37 @@ module IncludeDateScopes
46
57
 
47
58
  [:minute, :hour].each do |time_unit|
48
59
  define_singleton_method :"#{prefix}next_#{time_unit}" do
49
- __send__(:"#{prefix}between", Time.now, 1.send(time_unit).from_now)
60
+ start_time = Time.now
61
+ __send__(:"#{prefix}between", start_time, start_time + 1.send(time_unit))
50
62
  end
51
63
 
52
64
  define_singleton_method :"#{prefix}last_#{time_unit}" do
53
- __send__(:"#{prefix}between", 1.send(time_unit).ago, Time.now)
65
+ now = Time.now
66
+ __send__(:"#{prefix}between", now - 1.send(time_unit), now + 1.second)
54
67
  end
55
68
  end
56
69
 
57
70
  [:seconds, :minutes, :hours].each do |time_unit|
58
71
  define_singleton_method :"#{prefix}last_n_#{time_unit}" do |count|
59
- __send__(:"#{prefix}between", count.send(time_unit).ago, Time.now)
72
+ now = Time.now
73
+ __send__(:"#{prefix}between", now - count.send(time_unit), now + 1.second)
60
74
  end
61
75
 
62
76
  define_singleton_method :"#{prefix}next_n_#{time_unit}" do |count|
63
- __send__(:"#{prefix}between", Time.now, count.send(time_unit).from_now)
77
+ start_time = Time.now
78
+ __send__(:"#{prefix}between", start_time, start_time + count.send(time_unit))
64
79
  end
65
80
  end
66
81
 
67
82
  define_singleton_method :"#{prefix}this_minute" do
68
- __send__(:"#{prefix}between", Time.now.change(sec: 0), Time.now.change(sec: 59, usec: Rational(999999999, 1000)))
83
+ start_time = Time.now.change(sec: 0)
84
+ __send__(:"#{prefix}between", start_time, start_time + 1.minute)
69
85
  end
70
86
 
71
87
  [:hour, :day, :week, :month, :year].each do |time_unit|
72
88
  define_singleton_method :"#{prefix}this_#{time_unit}" do
73
- __send__(:"#{prefix}between", 1.send(time_unit).ago.send(:"end_of_#{time_unit}"), Time.now.send(:"end_of_#{time_unit}"))
89
+ start_time = Time.now.send(:"beginning_of_#{time_unit}")
90
+ __send__(:"#{prefix}between", start_time, start_time + 1.send(:"#{time_unit}"))
74
91
  end
75
92
  end
76
93
 
@@ -1,4 +1,4 @@
1
1
 
2
2
  module IncludeDateScopes
3
- VERSION = '0.9.9'.freeze
3
+ VERSION = '1.0.0'.freeze
4
4
  end
@@ -1,6 +1,12 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe "Model" do
4
+
5
+ before(:all) do
6
+ # puts "Local time: #{Time.now}"
7
+ # puts "UTC time: #{Time.now.gmtime}"
8
+ end
9
+
4
10
  describe 'default timestamp scopes' do
5
11
  before(:all) do
6
12
  define_model_class do
@@ -34,17 +40,19 @@ describe "Model" do
34
40
  describe 'date scopes' do
35
41
  before(:all) do
36
42
  define_model_class do
37
- include_date_scopes_for :show_until
43
+ include_named_date_scopes_for :show_until
38
44
  end
39
45
  end
40
46
 
41
- it_behaves_like 'date scopes', :show_until
47
+ it_behaves_like 'date scopes', :show_until, 'show_until_'
42
48
  end
43
49
 
44
50
  describe 'providing column type' do
45
51
  before(:all) do
46
52
  define_model_class do
47
- include_date_scopes_for :show_at, nil, :date
53
+ # Note that using date scopes to query a datetime column will yield incorrect results unless
54
+ # the database timezone is the same as the local timezone.
55
+ include_date_scopes_for :show_at, true, :date
48
56
  end
49
57
  end
50
58
 
@@ -52,7 +60,9 @@ describe "Model" do
52
60
  expect(Post).not_to respond_to(:last_n_minutes)
53
61
  end
54
62
 
55
- it_behaves_like 'date scopes', :show_at
63
+ # Note that these specs succeed because the test threshold has only date granularity.
64
+ # For a true datetime column the thresholds should have second granularity.
65
+ it_behaves_like('date scopes', :show_at, 'show_at_')
56
66
  end
57
67
 
58
68
  describe 'using a non-date argument' do
@@ -62,11 +72,11 @@ describe "Model" do
62
72
  # word that's also used by my framework.
63
73
  it 'does not raise an error' do
64
74
  define_model_class do
65
- include_date_scopes_for :show_until
75
+ include_named_date_scopes_for :show_at
76
+ include_named_date_scopes_for :show_until
66
77
  end
67
- expect {
68
- Post.before('abc')
69
- }.to_not raise_error
78
+ expect { Post.show_at_before('abc') }.to_not raise_error
79
+ expect { Post.show_until_before('abc') }.to_not raise_error
70
80
  end
71
81
  end
72
82
 
data/spec/spec_helper.rb CHANGED
@@ -17,17 +17,18 @@ if RUBY_PLATFORM == "java"
17
17
  database_adapter = "jdbcsqlite3"
18
18
  else
19
19
  database_adapter = "sqlite3"
20
+ # database_adapter = "mysql2"
20
21
  end
21
22
 
22
- ActiveRecord::Base.default_timezone = :local
23
+ ActiveRecord::Base.default_timezone = :utc
23
24
  ActiveRecord::Base.logger = Logger.new(STDERR)
24
25
  ActiveRecord::Base.logger.level = Logger::WARN
25
26
  ActiveRecord::Base.establish_connection(
26
27
  :adapter => database_adapter,
27
- :database => ':memory:'
28
+ :database => (database_adapter == "sqlite3" ? ':memory:' : 'include_date_scopes_test')
28
29
  )
29
30
  ActiveRecord::Base.connection.create_table(:posts, :force => true) do |t|
30
- t.timestamp :show_at
31
+ t.datetime :show_at
31
32
  t.date :show_until
32
33
  t.timestamp :created_at
33
34
  t.timestamp :updated_at
@@ -45,7 +46,7 @@ RSpec.configure do |config|
45
46
  Post.delete_all
46
47
  end
47
48
 
48
- config.before(:suite) { Timecop.freeze Time.local(2013,02,15,06,30) }
49
+ config.before(:suite) { Timecop.freeze Time.local(2013,02,15,18,30,47) } # next day as utc
49
50
  end
50
51
 
51
52
  def define_model_class(name = "Post", parent_class_name = "ActiveRecord::Base", &block)
@@ -1,259 +1,265 @@
1
-
2
1
  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).to_a
11
- end
2
+ # agruments may be Date or Time values
3
+ # top_threshold and bottom_threshold should be Date values
12
4
 
13
- let(:after_threshold_obj) { test_class.create! date_column => top_threshold.to_date - 1.day }
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.day }
5
+ subject { test_class.send("#{prefix}#{name}", *arguments).to_a }
17
6
 
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 }
7
+ before do
8
+ # puts "#{prefix}#{name}: #{arguments.to_s}"
9
+ # puts test_class.send("#{prefix}#{name}", *arguments).to_sql
22
10
  end
23
- end
24
11
 
25
- shared_examples "date scopes" do |date_column = :show_until, prefix = '' |
26
- let(:test_class) { Post }
27
- let(:prefix) { prefix }
28
- let(:date_column) { date_column }
12
+ let(:before_threshold_obj) { test_class.create! date_column => top_threshold.to_date - 1.day }
13
+ let(:at_top_threshold_obj) { test_class.create! date_column => top_threshold.to_date }
14
+ let(:at_bottom_threshold_obj) { test_class.create! date_column => bottom_threshold.to_date }
15
+ let(:after_threshold_obj) { test_class.create! date_column => bottom_threshold.to_date + 1.day }
29
16
 
30
- describe "date scopes" do
31
- describe ":between" do
32
- subject { test_class.send("#{prefix}between", 6.days.ago.to_date, 3.day.ago.to_date).to_a }
33
-
34
- let(:after_threshold_obj) { test_class.create! date_column => 2.days.ago.to_date }
35
- let(:at_top_threshold_obj) { test_class.create! date_column => 3.days.ago.to_date }
36
- let(:at_bottom_threshold_obj) { test_class.create! date_column => 6.days.ago.to_date }
37
- let(:before_threshold_obj) { test_class.create! date_column => 7.days.ago.to_date }
38
-
39
- it { should_not include after_threshold_obj }
40
- it { should include at_top_threshold_obj }
41
- it { should include at_bottom_threshold_obj }
42
- it { should_not include before_threshold_obj }
43
- end
17
+ it { should_not include before_threshold_obj }
18
+ it { should include at_top_threshold_obj }
19
+ it { should include at_bottom_threshold_obj }
20
+ it { should_not include after_threshold_obj }
21
+ end
44
22
 
45
- describe ":after" do
46
- subject { test_class.send("#{prefix}after", 3.days.ago.to_date).to_a }
23
+ shared_examples "before date scope" do |name|
24
+ # agruments may be Date or Time values
25
+ # threshold should be a Date value
47
26
 
48
- let(:after_threshold_obj) { test_class.create! date_column => 2.days.ago.to_date }
49
- let(:on_threshold_obj) { test_class.create! date_column => 3.days.ago.to_date }
50
- let(:before_threshold_obj) { test_class.create! date_column => 4.days.ago.to_date }
27
+ subject { test_class.send("#{prefix}#{name}", *arguments).to_a }
51
28
 
52
- it { should include after_threshold_obj }
53
- it { should_not include on_threshold_obj }
54
- it { should_not include before_threshold_obj }
55
- end
29
+ # threshold is most recent date NOT included in the interval
30
+ let(:before_top_threshold_obj) { test_class.create! date_column => threshold - 1.day }
31
+ let(:at_top_threshold_obj) { test_class.create! date_column => threshold }
56
32
 
57
- describe ":before" do
58
- subject { test_class.send("#{prefix}before", 3.days.ago.to_date).to_a }
33
+ before do
34
+ # puts "#{prefix}#{name}: #{arguments.to_s}"
35
+ # puts test_class.send("#{prefix}#{name}", *arguments).to_sql
36
+ end
59
37
 
60
- let(:after_threshold_obj) { test_class.create! date_column => 4.days.ago.to_date }
61
- let(:on_threshold_obj) { test_class.create! date_column => 3.days.ago.to_date }
62
- let(:before_threshold_obj) { test_class.create! date_column => 2.days.ago.to_date }
38
+ it { should include before_top_threshold_obj }
39
+ it { should_not include at_top_threshold_obj }
40
+ end
63
41
 
64
- it { should include after_threshold_obj }
65
- it { should_not include on_threshold_obj }
66
- it { should_not include before_threshold_obj }
67
- end
42
+ shared_examples "after date scope" do |name|
43
+ subject { test_class.send("#{prefix}#{name}", *arguments).to_a }
68
44
 
69
- describe ":on_or_after" do
70
- subject { test_class.send("#{prefix}on_or_after", 3.days.ago.to_date).to_a }
45
+ # threshold is oldest date included in the interval
46
+ let(:before_top_threshold_obj) { test_class.create! date_column => threshold - 1.day }
47
+ let(:at_top_threshold_obj) { test_class.create! date_column => threshold }
71
48
 
72
- let(:after_threshold_obj) { test_class.create! date_column => 2.days.ago.to_date }
73
- let(:on_threshold_obj) { test_class.create! date_column => 3.days.ago.to_date }
74
- let(:before_threshold_obj) { test_class.create! date_column => 4.days.ago.to_date }
49
+ before do
50
+ # puts "#{prefix}#{name}: #{arguments.to_s}"
51
+ # puts test_class.send("#{prefix}#{name}", *arguments).to_sql
52
+ end
75
53
 
76
- it { should include after_threshold_obj }
77
- it { should include on_threshold_obj }
78
- it { should_not include before_threshold_obj }
79
- end
54
+ it { should_not include before_top_threshold_obj }
55
+ it { should include at_top_threshold_obj }
56
+ end
80
57
 
81
- describe ":on_or_before" do
82
- subject { test_class.send("#{prefix}on_or_before", 3.days.ago).to_a }
58
+ shared_examples "date scopes" do |date_column = :show_until, prefix = '' |
59
+ let(:test_class) { Post }
60
+ let(:prefix) { prefix }
61
+ let(:date_column) { date_column }
83
62
 
84
- let(:after_threshold_obj) { test_class.create! date_column => 4.days.ago.to_date }
85
- let(:on_threshold_obj) { test_class.create! date_column => 3.days.ago.to_date }
86
- let(:before_threshold_obj) { test_class.create! date_column => 2.days.ago.to_date }
63
+ [:to_date, :to_time].each do |postfix|
64
+ describe ":between" do
65
+ let(:top_threshold) { 6.days.ago.to_date }
66
+ let(:bottom_threshold) { 3.days.ago.to_date }
67
+ let(:arguments) { [6.days.ago.send(postfix), 3.day.ago.send(postfix)] }
68
+ include_examples 'between date scope','between'
69
+ end
70
+
71
+ describe ":before" do
72
+ let(:threshold) { 3.days.ago.to_date }
73
+ let(:arguments) { [ 3.days.ago.send(postfix) ] }
74
+ include_examples 'before date scope','before'
75
+ end
76
+
77
+ describe ":on_or_before" do
78
+ let(:threshold) { 2.days.ago.to_date }
79
+ let(:arguments) { [ 3.days.ago.send(postfix) ] }
80
+ include_examples 'before date scope','on_or_before'
81
+ end
82
+
83
+ describe ":after" do
84
+ let(:threshold) { 2.days.ago.to_date }
85
+ let(:arguments) { [ 3.days.ago.send(postfix) ] }
86
+ include_examples 'after date scope','after'
87
+ end
88
+
89
+ describe ":on_or_after" do
90
+ let(:threshold) { 3.days.ago.to_date }
91
+ let(:arguments) { [ 3.days.ago.send(postfix) ] }
92
+ include_examples 'after date scope','on_or_after'
93
+ end
87
94
 
88
- it { should include after_threshold_obj }
89
- it { should include on_threshold_obj }
90
- it { should_not include before_threshold_obj }
91
95
  end
92
96
 
97
+ describe "date scopes" do
98
+
93
99
  describe ":today" do
94
- let(:top_threshold) { Time.now.beginning_of_day }
95
- let(:bottom_threshold) { Time.now.end_of_day }
100
+ let(:top_threshold) { Date.today }
101
+ let(:bottom_threshold) { Date.today }
96
102
  let(:arguments) { [] }
97
103
  include_examples 'between date scope','today'
98
104
  end
99
105
 
100
106
  describe ":yesterday" do
101
- let(:top_threshold) { 1.day.ago.beginning_of_day }
102
- let(:bottom_threshold) { 1.day.ago.end_of_day }
107
+ let(:top_threshold) { Date.yesterday }
108
+ let(:bottom_threshold) { Date.yesterday }
103
109
  let(:arguments) { [] }
104
110
  include_examples 'between date scope','yesterday'
105
111
  end
106
112
 
107
113
  describe ":tomorrow" do
108
- let(:top_threshold) { 1.day.from_now.beginning_of_day }
109
- let(:bottom_threshold) { 1.day.from_now.end_of_day }
114
+ let(:top_threshold) { Date.tomorrow }
115
+ let(:bottom_threshold) { Date.tomorrow }
110
116
  let(:arguments) { [] }
111
117
  include_examples 'between date scope','tomorrow'
112
118
  end
113
119
 
114
120
  describe ":next_day" do
115
- let(:bottom_threshold) { 1.day.from_now }
116
- let(:top_threshold) { Time.now }
121
+ let(:top_threshold) { Date.today }
122
+ let(:bottom_threshold) { Date.tomorrow }
117
123
  let(:arguments) { [] }
118
124
  include_examples 'between date scope','next_day'
119
125
  end
120
126
 
121
127
  describe ":next_week" do
122
- let(:bottom_threshold) { 1.week.from_now }
123
- let(:top_threshold) { Time.now }
128
+ let(:top_threshold) { Date.today }
129
+ let(:bottom_threshold) { Date.today + 1.week }
124
130
  let(:arguments) { [] }
125
131
  include_examples 'between date scope','next_week'
126
132
  end
127
133
 
128
134
  describe ":next_month" do
129
- let(:bottom_threshold) { 1.month.from_now }
130
- let(:top_threshold) { Time.now }
135
+ let(:top_threshold) { Date.today }
136
+ let(:bottom_threshold) { Date.today + 1.month }
131
137
  let(:arguments) { [] }
132
138
  include_examples 'between date scope','next_month'
133
139
  end
134
140
 
135
141
  describe ":next_year" do
136
- let(:bottom_threshold) { 1.year.from_now }
137
- let(:top_threshold) { Time.now }
142
+ let(:top_threshold) { Date.today }
143
+ let(:bottom_threshold) { Date.today + 1.year }
138
144
  let(:arguments) { [] }
139
145
  include_examples 'between date scope','next_year'
140
146
  end
141
147
 
142
148
  describe ":last_day" do
143
- let(:top_threshold) { 1.day.ago }
144
- let(:bottom_threshold) { Time.now }
149
+ let(:top_threshold) { Date.yesterday }
150
+ let(:bottom_threshold) { Date.today }
145
151
  let(:arguments) { [] }
146
152
  include_examples 'between date scope','last_day'
147
153
  end
148
154
 
149
155
  describe ":last_week" do
150
- let(:top_threshold) { 1.week.ago }
151
- let(:bottom_threshold) { Time.now }
156
+ let(:top_threshold) { Date.today - 1.week }
157
+ let(:bottom_threshold) { Date.today }
152
158
  let(:arguments) { [] }
153
159
  include_examples 'between date scope','last_week'
154
160
  end
155
161
 
156
162
  describe ":last_month" do
157
- let(:top_threshold) { 1.month.ago }
158
- let(:bottom_threshold) { Time.now }
163
+ let(:top_threshold) { Date.today - 1.month }
164
+ let(:bottom_threshold) { Date.today }
159
165
  let(:arguments) { [] }
160
166
  include_examples 'between date scope','last_month'
161
167
  end
162
168
 
163
169
  describe ":last_year" do
164
- let(:top_threshold) { 1.year.ago }
165
- let(:bottom_threshold) { Time.now }
170
+ let(:top_threshold) { Date.today - 1.year }
171
+ let(:bottom_threshold) { Date.today }
166
172
  let(:arguments) { [] }
167
173
  include_examples 'between date scope','last_year'
168
174
  end
169
175
 
170
176
  describe ":last_n_days" do
171
- let(:top_threshold) { 3.days.ago }
172
- let(:bottom_threshold) { Time.now }
177
+ let(:top_threshold) { Date.today - 3.days }
178
+ let(:bottom_threshold) { Date.today }
173
179
  let(:arguments) { [3] }
174
180
  include_examples 'between date scope','last_n_days'
175
181
  end
176
182
 
177
183
  describe ":last_n_weeks" do
178
- let(:top_threshold) { 3.weeks.ago }
179
- let(:bottom_threshold) { Time.now }
184
+ let(:top_threshold) { Date.today - 3.weeks }
185
+ let(:bottom_threshold) { Date.today }
180
186
  let(:arguments) { [3] }
181
187
  include_examples 'between date scope','last_n_weeks'
182
188
  end
183
189
 
184
190
  describe ":last_n_months" do
185
- let(:top_threshold) { 3.months.ago }
186
- let(:bottom_threshold) { Time.now }
191
+ let(:top_threshold) { Date.today - 3.months }
192
+ let(:bottom_threshold) { Date.today }
187
193
  let(:arguments) { [3] }
188
194
  include_examples 'between date scope','last_n_months'
189
195
  end
190
196
 
191
197
  describe ":last_n_years" do
192
- let(:top_threshold) { 3.years.ago }
193
- let(:bottom_threshold) { Time.now }
198
+ let(:top_threshold) { Date.today - 3.years }
199
+ let(:bottom_threshold) { Date.today }
194
200
  let(:arguments) { [3] }
195
201
  include_examples 'between date scope','last_n_years'
196
202
  end
197
203
 
198
204
  describe ":next_n_days" do
199
- let(:top_threshold) { Time.now }
200
- let(:bottom_threshold) { 3.days.from_now }
205
+ let(:top_threshold) { Date.today }
206
+ let(:bottom_threshold) { Date.today + 3.days }
201
207
  let(:arguments) { [3] }
202
208
  include_examples 'between date scope','next_n_days'
203
209
  end
204
210
 
205
211
  describe ":next_n_weeks" do
206
- let(:top_threshold) { Time.now }
207
- let(:bottom_threshold) { 3.weeks.from_now }
212
+ let(:top_threshold) { Date.today }
213
+ let(:bottom_threshold) { Date.today + 3.weeks }
208
214
  let(:arguments) { [3] }
209
215
  include_examples 'between date scope','next_n_weeks'
210
216
  end
211
217
 
212
218
  describe ":next_n_months" do
213
- let(:top_threshold) { Time.now }
214
- let(:bottom_threshold) { 3.months.from_now }
219
+ let(:top_threshold) { Date.today }
220
+ let(:bottom_threshold) { Date.today + 3.months }
215
221
  let(:arguments) { [3] }
216
222
  include_examples 'between date scope','next_n_months'
217
223
  end
218
224
 
219
225
  describe ":next_n_years" do
220
- let(:top_threshold) { Time.now }
221
- let(:bottom_threshold) { 3.years.from_now }
226
+ let(:top_threshold) { Date.today }
227
+ let(:bottom_threshold) { Date.today + 3.years }
222
228
  let(:arguments) { [3] }
223
229
  include_examples 'between date scope','next_n_years'
224
230
  end
225
231
 
226
232
  describe ":last_30_days" do
227
- let(:top_threshold) { 30.days.ago }
228
- let(:bottom_threshold) { Time.now }
233
+ let(:top_threshold) { Date.today - 30.days }
234
+ let(:bottom_threshold) { Date.today }
229
235
  let(:arguments) { [] }
230
236
  include_examples 'between date scope','last_30_days'
231
237
  end
232
238
 
233
239
  describe ":this_day" do
234
- let(:top_threshold) { Time.now.beginning_of_day }
235
- let(:bottom_threshold) { Time.now.end_of_day }
240
+ let(:top_threshold) { Date.today }
241
+ let(:bottom_threshold) { Date.today }
236
242
  let(:arguments) { [] }
237
243
  include_examples 'between date scope','this_day'
238
244
  end
239
245
 
240
246
  describe ":this_week" do
241
- let(:top_threshold) { Time.now.beginning_of_week }
242
- let(:bottom_threshold) { Time.now.end_of_week }
247
+ let(:top_threshold) { Date.today.beginning_of_week }
248
+ let(:bottom_threshold) { Date.today.end_of_week }
243
249
  let(:arguments) { [] }
244
250
  include_examples 'between date scope','this_week'
245
251
  end
246
252
 
247
253
  describe ":this_month" do
248
- let(:top_threshold) { Time.now.beginning_of_month }
249
- let(:bottom_threshold) { Time.now.end_of_month }
254
+ let(:top_threshold) { Date.today.beginning_of_month }
255
+ let(:bottom_threshold) { Date.today.end_of_month }
250
256
  let(:arguments) { [] }
251
257
  include_examples 'between date scope','this_month'
252
258
  end
253
259
 
254
260
  describe ":this_year" do
255
- let(:top_threshold) { Time.now.beginning_of_year }
256
- let(:bottom_threshold) { Time.now.end_of_year }
261
+ let(:top_threshold) { Date.today.beginning_of_year }
262
+ let(:bottom_threshold) { Date.today.end_of_year }
257
263
  let(:arguments) { [] }
258
264
  include_examples 'between date scope','this_year'
259
265
  end
@@ -1,30 +1,56 @@
1
-
2
1
  shared_examples "between time scope" do |name, difference = 1.second|
3
2
  subject do
4
3
  test_class.send("#{prefix}#{name}", *arguments).to_a
5
4
  end
6
5
 
7
- let(:after_threshold_obj) { test_class.create! date_column => top_threshold - difference }
8
- let(:at_top_threshold_obj) { test_class.create! date_column => top_threshold }
9
- let(:at_bottom_threshold_obj) { test_class.create! date_column => bottom_threshold }
10
- let(:before_threshold_obj) { test_class.create! date_column => bottom_threshold + difference }
6
+ # In tests top_threshold and bottom_threshold should have time values,
7
+ # where the interval includes top_threshold but EXCLUDES bottom_threshold
8
+ let(:before_top_threshold_obj) { test_class.create! date_column => top_threshold.to_time - difference }
9
+ let(:at_top_threshold_obj) { test_class.create! date_column => top_threshold.to_time }
10
+ let(:before_bottom_threshold_obj) { test_class.create! date_column => bottom_threshold.to_time - difference }
11
+ let(:at_bottom_threshold_obj) { test_class.create! date_column => bottom_threshold.to_time }
12
+
13
+ before do
14
+ # puts "#{prefix}#{name}: #{arguments.to_s}"
15
+ # puts test_class.send("#{prefix}#{name}", *arguments).to_sql
16
+ end
11
17
 
12
- it { should_not include after_threshold_obj }
18
+ it { should_not include before_top_threshold_obj }
13
19
  it { should include at_top_threshold_obj }
20
+ it { should include before_bottom_threshold_obj }
14
21
  it { should_not include at_bottom_threshold_obj }
15
- it { should_not include before_threshold_obj }
16
22
  end
17
23
 
18
- shared_examples "open ended time scope (exclusive)" do |name|
24
+ shared_examples "before time scope" do |name|
25
+ subject { test_class.send("#{prefix}#{name}", *arguments).to_a }
26
+
27
+ # threshold is NOT included in the interval
28
+ let(:before_top_threshold_obj) { test_class.create! date_column => threshold - 1.second }
29
+ let(:at_top_threshold_obj) { test_class.create! date_column => threshold }
30
+
31
+ before do
32
+ # puts "#{prefix}#{name}: #{arguments.to_s}"
33
+ # puts test_class.send("#{prefix}#{name}", *arguments).to_sql
34
+ end
35
+
36
+ it { should include before_top_threshold_obj }
37
+ it { should_not include at_top_threshold_obj }
38
+ end
39
+
40
+ shared_examples "after time scope" do |name|
19
41
  subject { test_class.send("#{prefix}#{name}", *arguments).to_a }
20
42
 
21
- let(:after_threshold_obj) { test_class.create! date_column => threshold + 1.second }
22
- let(:on_threshold_obj) { test_class.create! date_column => threshold }
23
- let(:before_threshold_obj) { test_class.create! date_column => threshold - 1.second }
43
+ # threshold is included in the interval
44
+ let(:before_top_threshold_obj) { test_class.create! date_column => threshold - 1.second }
45
+ let(:at_top_threshold_obj) { test_class.create! date_column => threshold }
24
46
 
25
- it { should include after_threshold_obj }
26
- it { should_not include on_threshold_obj }
27
- it { should_not include before_threshold_obj }
47
+ before do
48
+ # puts "#{prefix}#{name}: #{arguments.to_s}"
49
+ # puts test_class.send("#{prefix}#{name}", *arguments).to_sql
50
+ end
51
+
52
+ it { should_not include before_top_threshold_obj }
53
+ it { should include at_top_threshold_obj }
28
54
  end
29
55
 
30
56
  shared_examples "timestamp scopes" do |date_column = :created_at, prefix = '' |
@@ -32,7 +58,7 @@ shared_examples "timestamp scopes" do |date_column = :created_at, prefix = '' |
32
58
  let(:prefix) { prefix }
33
59
  let(:date_column) { date_column }
34
60
 
35
- describe "timestamp scopes" do
61
+ describe "Time arguments" do
36
62
  describe ':between' do
37
63
  let(:top_threshold) { 5.minutes.ago }
38
64
  let(:bottom_threshold) { 5.minutes.from_now }
@@ -41,66 +67,133 @@ shared_examples "timestamp scopes" do |date_column = :created_at, prefix = '' |
41
67
  end
42
68
 
43
69
  describe ":after" do
44
- let(:threshold) { 5.minutes.ago }
70
+ let(:threshold) { 5.minutes.ago + 1.second }
45
71
  let(:arguments) { [ 5.minutes.ago ] }
46
72
 
47
- include_examples 'open ended time scope (exclusive)', 'after'
73
+ include_examples 'after time scope', 'after'
48
74
  end
49
75
 
50
76
  describe ":before" do
77
+ let(:threshold) { 5.minutes.ago }
78
+ let(:arguments) { [ 5.minutes.ago ] }
51
79
 
52
- subject { test_class.send("#{prefix}before", 5.minutes.ago).to_a }
80
+ include_examples 'before time scope', 'before'
81
+ end
53
82
 
54
- let(:after_threshold_obj) { test_class.create! date_column => 5.minutes.ago + 1.second }
55
- let(:on_threshold_obj) { test_class.create! date_column => 5.minutes.ago }
56
- let(:before_threshold_obj) { test_class.create! date_column => 5.minutes.ago - 1.second }
83
+ describe ":on" do
84
+ let(:top_threshold) { Date.today.midnight }
85
+ let(:bottom_threshold) { Date.tomorrow.midnight }
86
+ let(:arguments) { [ Time.now ] }
57
87
 
58
- it { should_not include after_threshold_obj }
59
- it { should_not include on_threshold_obj }
60
- it { should include before_threshold_obj }
88
+ include_examples "between time scope", 'on'
61
89
  end
62
90
 
63
91
  describe ":on_or_after" do
64
- subject { test_class.send("#{prefix}on_or_after", 5.minutes.ago).to_a }
92
+ let(:threshold) { 5.minutes.ago }
93
+ let(:arguments) { [ 5.minutes.ago ] }
65
94
 
66
- let(:after_threshold_obj) { test_class.create! date_column => 5.minutes.ago + 1.second }
67
- let(:on_threshold_obj) { test_class.create! date_column => 5.minutes.ago }
68
- let(:before_threshold_obj) { test_class.create! date_column => 5.minutes.ago - 1.second }
95
+ include_examples 'after time scope', 'on_or_after'
96
+ end
97
+
98
+ describe ":on_or_after_date" do
99
+ let(:threshold) { Date.today.midnight }
100
+ let(:arguments) { [ Time.now ] }
69
101
 
70
- it { should include after_threshold_obj }
71
- it { should include on_threshold_obj }
72
- it { should_not include before_threshold_obj }
102
+ include_examples 'after time scope', 'on_or_after_date'
73
103
  end
74
104
 
75
105
  describe ":on_or_before" do
76
- subject { test_class.send("#{prefix}on_or_before", 5.minutes.ago).to_a }
106
+ let(:threshold) { 5.minutes.ago + 1.second }
107
+ let(:arguments) { [ 5.minutes.ago ] }
77
108
 
78
- let(:after_threshold_obj) { test_class.create! date_column => 5.minutes.ago + 1.second }
79
- let(:on_threshold_obj) { test_class.create! date_column => 5.minutes.ago }
80
- let(:before_threshold_obj) { test_class.create! date_column => 5.minutes.ago - 1.second }
109
+ include_examples 'before time scope', 'on_or_before'
110
+ end
111
+
112
+ describe ":on_or_before_date" do
113
+ let(:threshold) { Date.tomorrow.midnight }
114
+ let(:arguments) { [ Time.now ] }
115
+
116
+ include_examples 'before time scope', 'on_or_before_date'
117
+ end
118
+ end
81
119
 
82
- it { should_not include after_threshold_obj }
83
- it { should include on_threshold_obj }
84
- it { should include before_threshold_obj }
120
+ describe "Date arguments" do
121
+ describe ":between" do
122
+ let(:top_threshold) { Date.today.midnight }
123
+ let(:bottom_threshold) { Date.today.midnight + 1.day }
124
+ let(:arguments) { [Date.today, Date.today] }
125
+ include_examples "between time scope", 'between'
85
126
  end
86
127
 
128
+ describe ":on_or_before_date" do
129
+ let(:threshold) { Date.tomorrow.midnight }
130
+ let(:arguments) { [ Date.today ] }
131
+
132
+ include_examples 'before time scope', 'on_or_before_date'
133
+ end
134
+
135
+ describe ":on_or_before" do
136
+ let(:threshold) { Date.tomorrow.midnight }
137
+ let(:arguments) { [ Date.today ] }
138
+
139
+ include_examples 'before time scope', 'on_or_before'
140
+ end
141
+
142
+ describe ":before" do
143
+ let(:threshold) { Date.today.midnight }
144
+ let(:arguments) { [ Date.today ] }
145
+
146
+ include_examples 'before time scope', 'before'
147
+ end
148
+
149
+ describe ":on_or_after_date" do
150
+ let(:threshold) { Date.today.midnight }
151
+ let(:arguments) { [ Date.today ] }
152
+
153
+ include_examples 'after time scope', 'on_or_after_date'
154
+ end
155
+
156
+ describe ":on_or_after" do
157
+ let(:threshold) { Date.today.midnight }
158
+ let(:arguments) { [ Date.today ] }
159
+
160
+ include_examples 'after time scope', 'on_or_after'
161
+ end
162
+
163
+ describe ":after" do
164
+ let(:threshold) { Date.tomorrow.midnight }
165
+ let(:arguments) { [ Date.today ] }
166
+
167
+ include_examples 'after time scope', 'after'
168
+ end
169
+
170
+ describe ":on" do
171
+ let(:top_threshold) { Date.today.midnight }
172
+ let(:bottom_threshold) { Date.tomorrow.midnight }
173
+ let(:arguments) { [ Date.today ] }
174
+
175
+ include_examples "between time scope", 'on'
176
+ end
177
+ end
178
+
179
+ describe "implicit argument" do
87
180
  describe ":today" do
88
181
  let(:top_threshold) { Time.now.beginning_of_day }
89
- let(:bottom_threshold) { Time.now.end_of_day }
182
+ let(:bottom_threshold) { Time.now.beginning_of_day + 1.day }
90
183
  let(:arguments) { [] }
91
184
  include_examples 'between time scope','today'
92
185
  end
93
186
 
94
187
  describe ":yesterday" do
95
188
  let(:top_threshold) { 1.day.ago.beginning_of_day }
96
- let(:bottom_threshold) { 1.day.ago.end_of_day }
189
+ let(:bottom_threshold) { Time.now.beginning_of_day }
97
190
  let(:arguments) { [] }
98
191
  include_examples 'between time scope','yesterday'
99
192
  end
100
193
 
101
194
  describe ":tomorrow" do
102
195
  let(:top_threshold) { 1.day.from_now.beginning_of_day }
103
- let(:bottom_threshold) { 1.day.from_now.end_of_day }
196
+ let(:bottom_threshold) { 2.day.from_now.beginning_of_day }
104
197
  let(:arguments) { [] }
105
198
  include_examples 'between time scope','tomorrow'
106
199
  end
@@ -149,98 +242,98 @@ shared_examples "timestamp scopes" do |date_column = :created_at, prefix = '' |
149
242
 
150
243
  describe ":last_minute" do
151
244
  let(:top_threshold) { 1.minute.ago }
152
- let(:bottom_threshold) { Time.now }
245
+ let(:bottom_threshold) { Time.now + 1.second }
153
246
  let(:arguments) { [] }
154
247
  include_examples 'between time scope','last_minute'
155
248
  end
156
249
 
157
250
  describe ":last_hour" do
158
251
  let(:top_threshold) { 1.hour.ago }
159
- let(:bottom_threshold) { Time.now }
252
+ let(:bottom_threshold) { Time.now + 1.second }
160
253
  let(:arguments) { [] }
161
254
  include_examples 'between time scope','last_hour'
162
255
  end
163
256
 
164
257
  describe ":last_24_hours" do
165
258
  let(:top_threshold) { 1.day.ago }
166
- let(:bottom_threshold) { Time.now }
259
+ let(:bottom_threshold) { Time.now + 1.second }
167
260
  let(:arguments) { [] }
168
261
  include_examples 'between time scope','last_24_hours'
169
262
  end
170
263
 
171
264
  describe ":last_day" do
172
265
  let(:top_threshold) { 1.day.ago }
173
- let(:bottom_threshold) { Time.now }
266
+ let(:bottom_threshold) { Time.now + 1.second }
174
267
  let(:arguments) { [] }
175
268
  include_examples 'between time scope','last_day'
176
269
  end
177
270
 
178
271
  describe ":last_week" do
179
272
  let(:top_threshold) { 1.week.ago }
180
- let(:bottom_threshold) { Time.now }
273
+ let(:bottom_threshold) { Time.now + 1.second }
181
274
  let(:arguments) { [] }
182
275
  include_examples 'between time scope','last_week'
183
276
  end
184
277
 
185
278
  describe ":last_month" do
186
279
  let(:top_threshold) { 1.month.ago }
187
- let(:bottom_threshold) { Time.now }
280
+ let(:bottom_threshold) { Time.now + 1.second }
188
281
  let(:arguments) { [] }
189
282
  include_examples 'between time scope','last_month'
190
283
  end
191
284
 
192
285
  describe ":last_year" do
193
286
  let(:top_threshold) { 1.year.ago }
194
- let(:bottom_threshold) { Time.now }
287
+ let(:bottom_threshold) { Time.now + 1.second }
195
288
  let(:arguments) { [] }
196
289
  include_examples 'between time scope','last_year'
197
290
  end
198
291
 
199
292
  describe ":last_n_seconds" do
200
293
  let(:top_threshold) { 3.seconds.ago }
201
- let(:bottom_threshold) { Time.now }
294
+ let(:bottom_threshold) { Time.now + 1.second }
202
295
  let(:arguments) { [3] }
203
296
  include_examples 'between time scope','last_n_seconds'
204
297
  end
205
298
 
206
299
  describe ":last_n_minutes" do
207
300
  let(:top_threshold) { 3.minutes.ago }
208
- let(:bottom_threshold) { Time.now }
301
+ let(:bottom_threshold) { Time.now + 1.second }
209
302
  let(:arguments) { [3] }
210
303
  include_examples 'between time scope','last_n_minutes'
211
304
  end
212
305
 
213
306
  describe ":last_n_hours" do
214
307
  let(:top_threshold) { 3.hours.ago }
215
- let(:bottom_threshold) { Time.now }
308
+ let(:bottom_threshold) { Time.now + 1.second }
216
309
  let(:arguments) { [3] }
217
310
  include_examples 'between time scope','last_n_hours'
218
311
  end
219
312
 
220
313
  describe ":last_n_days" do
221
314
  let(:top_threshold) { 3.days.ago }
222
- let(:bottom_threshold) { Time.now }
315
+ let(:bottom_threshold) { Time.now + 1.second }
223
316
  let(:arguments) { [3] }
224
317
  include_examples 'between time scope','last_n_days'
225
318
  end
226
319
 
227
320
  describe ":last_n_weeks" do
228
321
  let(:top_threshold) { 3.weeks.ago }
229
- let(:bottom_threshold) { Time.now }
322
+ let(:bottom_threshold) { Time.now + 1.second }
230
323
  let(:arguments) { [3] }
231
324
  include_examples 'between time scope','last_n_weeks'
232
325
  end
233
326
 
234
327
  describe ":last_n_months" do
235
328
  let(:top_threshold) { 3.months.ago }
236
- let(:bottom_threshold) { Time.now }
329
+ let(:bottom_threshold) { Time.now + 1.second }
237
330
  let(:arguments) { [3] }
238
331
  include_examples 'between time scope','last_n_months'
239
332
  end
240
333
 
241
334
  describe ":last_n_years" do
242
335
  let(:top_threshold) { 3.years.ago }
243
- let(:bottom_threshold) { Time.now }
336
+ let(:bottom_threshold) { Time.now + 1.second }
244
337
  let(:arguments) { [3] }
245
338
  include_examples 'between time scope','last_n_years'
246
339
  end
@@ -296,49 +389,49 @@ shared_examples "timestamp scopes" do |date_column = :created_at, prefix = '' |
296
389
 
297
390
  describe ":last_30_days" do
298
391
  let(:top_threshold) { 30.days.ago }
299
- let(:bottom_threshold) { Time.now }
392
+ let(:bottom_threshold) { Time.now + 1.second }
300
393
  let(:arguments) { [] }
301
394
  include_examples 'between time scope','last_30_days'
302
395
  end
303
396
 
304
397
  describe ":this_minute" do
305
398
  let(:top_threshold) { Time.now.change(sec: 0) }
306
- let(:bottom_threshold) { Time.now.change(sec: 59, usec: Rational(999999999, 1000)) }
399
+ let(:bottom_threshold) { Time.now.change(sec: 0) + 1.minute }
307
400
  let(:arguments) { [] }
308
401
  include_examples 'between time scope','this_minute'
309
402
  end
310
403
 
311
404
  describe ":this_hour" do
312
405
  let(:top_threshold) { Time.now.beginning_of_hour }
313
- let(:bottom_threshold) { Time.now.end_of_hour }
406
+ let(:bottom_threshold) { Time.now.beginning_of_hour + 1.hour }
314
407
  let(:arguments) { [] }
315
408
  include_examples 'between time scope','this_hour'
316
409
  end
317
410
 
318
411
  describe ":this_day" do
319
412
  let(:top_threshold) { Time.now.beginning_of_day }
320
- let(:bottom_threshold) { Time.now.end_of_day }
413
+ let(:bottom_threshold) { Time.now.beginning_of_day + 1.day }
321
414
  let(:arguments) { [] }
322
415
  include_examples 'between time scope','this_day'
323
416
  end
324
417
 
325
418
  describe ":this_week" do
326
419
  let(:top_threshold) { Time.now.beginning_of_week }
327
- let(:bottom_threshold) { Time.now.end_of_week }
420
+ let(:bottom_threshold) { Time.now.beginning_of_week + 1.week }
328
421
  let(:arguments) { [] }
329
422
  include_examples 'between time scope','this_week'
330
423
  end
331
424
 
332
425
  describe ":this_month" do
333
426
  let(:top_threshold) { Time.now.beginning_of_month }
334
- let(:bottom_threshold) { Time.now.end_of_month }
427
+ let(:bottom_threshold) { Time.now.beginning_of_month + 1.month }
335
428
  let(:arguments) { [] }
336
429
  include_examples 'between time scope','this_month'
337
430
  end
338
431
 
339
432
  describe ":this_year" do
340
433
  let(:top_threshold) { Time.now.beginning_of_year }
341
- let(:bottom_threshold) { Time.now.end_of_year }
434
+ let(:bottom_threshold) { Time.now.beginning_of_year + 1.year }
342
435
  let(:arguments) { [] }
343
436
  include_examples 'between time scope','this_year'
344
437
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: include_date_scopes
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.9
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sean Todd
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-10-15 00:00:00.000000000 Z
12
+ date: 2016-02-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
@@ -138,7 +138,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
138
138
  version: '0'
139
139
  requirements: []
140
140
  rubyforge_project:
141
- rubygems_version: 2.2.2
141
+ rubygems_version: 2.4.8
142
142
  signing_key:
143
143
  specification_version: 4
144
144
  summary: Include scopes for searching on a date column