by_star 2.2.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. checksums.yaml +5 -13
  2. data/.github/workflows/mysql.yml +92 -0
  3. data/.github/workflows/postgresql.yml +99 -0
  4. data/.gitignore +6 -5
  5. data/.travis.yml +92 -35
  6. data/CHANGELOG.md +59 -29
  7. data/Gemfile +18 -25
  8. data/MIT-LICENSE +20 -20
  9. data/README.md +616 -523
  10. data/Rakefile +18 -18
  11. data/UPGRADING +4 -12
  12. data/by_star.gemspec +34 -32
  13. data/cleaner.rb +24 -24
  14. data/lib/by_star/base.rb +69 -68
  15. data/lib/by_star/between.rb +185 -120
  16. data/lib/by_star/directional.rb +35 -21
  17. data/lib/by_star/kernel/date.rb +41 -0
  18. data/lib/by_star/kernel/in_time_zone.rb +20 -0
  19. data/lib/by_star/{kernel.rb → kernel/time.rb} +41 -41
  20. data/lib/by_star/normalization.rb +156 -118
  21. data/lib/by_star/orm/active_record/by_star.rb +75 -59
  22. data/lib/by_star/orm/mongoid/by_star.rb +90 -63
  23. data/lib/by_star/orm/mongoid/reorder.rb +23 -0
  24. data/lib/by_star/version.rb +3 -3
  25. data/lib/by_star.rb +18 -15
  26. data/spec/database.yml +15 -15
  27. data/spec/fixtures/active_record/models.rb +12 -10
  28. data/spec/fixtures/active_record/schema.rb +19 -19
  29. data/spec/fixtures/mongoid/models.rb +31 -29
  30. data/spec/fixtures/shared/seeds.rb +36 -26
  31. data/spec/gemfiles/Gemfile.rails +5 -0
  32. data/spec/gemfiles/Gemfile.rails32 +7 -0
  33. data/spec/gemfiles/Gemfile.rails40 +7 -0
  34. data/spec/gemfiles/Gemfile.rails41 +7 -0
  35. data/spec/gemfiles/Gemfile.rails42 +7 -0
  36. data/spec/gemfiles/Gemfile.rails50 +7 -0
  37. data/spec/gemfiles/Gemfile.rails51 +7 -0
  38. data/spec/gemfiles/Gemfile.rails52 +7 -0
  39. data/spec/gemfiles/Gemfile.rails60 +7 -0
  40. data/spec/gemfiles/Gemfile.rails61 +7 -0
  41. data/spec/integration/active_record/active_record_spec.rb +41 -53
  42. data/spec/integration/mongoid/mongoid_spec.rb +39 -46
  43. data/spec/integration/shared/at_time.rb +53 -0
  44. data/spec/integration/shared/between_dates.rb +99 -0
  45. data/spec/integration/shared/between_times.rb +99 -0
  46. data/spec/integration/shared/by_calendar_month.rb +55 -55
  47. data/spec/integration/shared/by_cweek.rb +54 -0
  48. data/spec/integration/shared/by_day.rb +120 -108
  49. data/spec/integration/shared/by_direction.rb +126 -114
  50. data/spec/integration/shared/by_fortnight.rb +48 -48
  51. data/spec/integration/shared/by_month.rb +50 -50
  52. data/spec/integration/shared/by_quarter.rb +49 -49
  53. data/spec/integration/shared/by_week.rb +54 -54
  54. data/spec/integration/shared/by_weekend.rb +49 -49
  55. data/spec/integration/shared/by_year.rb +48 -48
  56. data/spec/integration/shared/index_scope_parameter.rb +111 -0
  57. data/spec/integration/shared/offset_parameter.rb +32 -31
  58. data/spec/integration/shared/order_parameter.rb +36 -0
  59. data/spec/integration/shared/relative.rb +174 -174
  60. data/spec/spec_helper.rb +33 -29
  61. data/spec/unit/kernel_date_spec.rb +113 -0
  62. data/spec/unit/kernel_time_spec.rb +57 -57
  63. data/spec/unit/normalization_spec.rb +384 -255
  64. data/tmp/.gitignore +1 -1
  65. metadata +82 -68
  66. data/spec/integration/shared/scope_parameter.rb +0 -42
@@ -1,50 +1,50 @@
1
- require 'spec_helper'
2
-
3
- shared_examples_for 'by month' do
4
-
5
- describe '#by_month' do
6
-
7
- context 'point-in-time' do
8
- subject { Post.by_month('Feb') }
9
- its(:count){ should eq 2 }
10
- end
11
-
12
- context 'timespan' do
13
- subject { Event.by_month(1) }
14
- its(:count){ should eq 9 }
15
- end
16
-
17
- context 'timespan strict' do
18
- subject { Event.by_month(Date.parse('2014-02-01'), strict: true) }
19
- its(:count){ should eq 1 }
20
- end
21
-
22
- context 'with :year option' do
23
-
24
- context 'point-in-time' do
25
- subject { Post.by_month(12, year: 2013) }
26
- its(:count){ should eq 8 }
27
- end
28
-
29
- context 'timespan' do
30
- subject { Event.by_month('December', year: 2013) }
31
- its(:count){ should eq 12 }
32
- end
33
-
34
- context 'timespan strict' do
35
- subject { Event.by_month('Dec', year: 2013, strict: true) }
36
- its(:count){ should eq 4 }
37
- end
38
- end
39
-
40
- it 'should raise an error when given an invalid argument' do
41
- ->{ Post.by_month(0) }.should raise_error(ByStar::ParseError, 'Month must be a number between 1 and 12 or a month name')
42
- ->{ Post.by_month(13) }.should raise_error(ByStar::ParseError, 'Month must be a number between 1 and 12 or a month name')
43
- ->{ Post.by_month('foobar') }.should raise_error(ByStar::ParseError, 'Month must be a number between 1 and 12 or a month name')
44
- end
45
-
46
- it 'should be able to use an alternative field' do
47
- Event.by_month(:field => 'end_time').count.should eq 8
48
- end
49
- end
50
- end
1
+ require 'spec_helper'
2
+
3
+ shared_examples_for 'by month' do
4
+
5
+ describe '#by_month' do
6
+
7
+ context 'point-in-time' do
8
+ subject { Post.by_month('Feb') }
9
+ it { expect(subject.count).to eql(2) }
10
+ end
11
+
12
+ context 'timespan' do
13
+ subject { Event.by_month(1) }
14
+ it { expect(subject.count).to eql(9) }
15
+ end
16
+
17
+ context 'timespan strict' do
18
+ subject { Event.by_month(Date.parse('2014-02-01'), strict: true) }
19
+ it { expect(subject.count).to eql(1) }
20
+ end
21
+
22
+ context 'with :year option' do
23
+
24
+ context 'point-in-time' do
25
+ subject { Post.by_month(12, year: 2013) }
26
+ it { expect(subject.count).to eql(8) }
27
+ end
28
+
29
+ context 'timespan' do
30
+ subject { Event.by_month('December', year: 2013) }
31
+ it { expect(subject.count).to eql(12) }
32
+ end
33
+
34
+ context 'timespan strict' do
35
+ subject { Event.by_month('Dec', year: 2013, strict: true) }
36
+ it { expect(subject.count).to eql(4) }
37
+ end
38
+ end
39
+
40
+ it 'should raise an error when given an invalid argument' do
41
+ expect{ Post.by_month(0) }.to raise_error(ByStar::ParseError, 'Month must be a number between 1 and 12 or a month name')
42
+ expect{ Post.by_month(13) }.to raise_error(ByStar::ParseError, 'Month must be a number between 1 and 12 or a month name')
43
+ expect{ Post.by_month('foobar') }.to raise_error(ByStar::ParseError, 'Month must be a number between 1 and 12 or a month name')
44
+ end
45
+
46
+ it 'should be able to use an alternative field' do
47
+ expect(Event.by_month(field: 'end_time').count).to eq 8
48
+ end
49
+ end
50
+ end
@@ -1,49 +1,49 @@
1
- require 'spec_helper'
2
-
3
- shared_examples_for 'by quarter' do
4
-
5
- describe '#by_quarter' do
6
-
7
- context 'point-in-time' do
8
- subject { Post.by_quarter(2) }
9
- its(:count){ should eq 2 }
10
- end
11
-
12
- context 'timespan' do
13
- subject { Event.by_quarter(1) }
14
- its(:count){ should eq 13 }
15
- end
16
-
17
- context 'timespan strict' do
18
- subject { Event.by_quarter(Date.parse('2014-02-01'), strict: true) }
19
- its(:count){ should eq 7 }
20
- end
21
-
22
- context 'with :year option' do
23
-
24
- context 'point-in-time' do
25
- subject { Post.by_quarter(4, year: 2013) }
26
- its(:count){ should eq 10 }
27
- end
28
-
29
- context 'timespan' do
30
- subject { Event.by_quarter(4, year: 2013) }
31
- its(:count){ should eq 13 }
32
- end
33
-
34
- context 'timespan strict' do
35
- subject { Event.by_quarter(4, year: 2013, strict: true) }
36
- its(:count){ should eq 8 }
37
- end
38
- end
39
-
40
- it 'should raise an error when given an invalid argument' do
41
- ->{ Post.by_quarter(0) }.should raise_error(ByStar::ParseError, 'Quarter number must be between 1 and 4')
42
- ->{ Post.by_quarter(5) }.should raise_error(ByStar::ParseError, 'Quarter number must be between 1 and 4')
43
- end
44
-
45
- it 'should be able to use an alternative field' do
46
- Event.by_quarter(1, :field => 'end_time').count.should eq 12
47
- end
48
- end
49
- end
1
+ require 'spec_helper'
2
+
3
+ shared_examples_for 'by quarter' do
4
+
5
+ describe '#by_quarter' do
6
+
7
+ context 'point-in-time' do
8
+ subject { Post.by_quarter(2) }
9
+ it { expect(subject.count).to eql(2) }
10
+ end
11
+
12
+ context 'timespan' do
13
+ subject { Event.by_quarter(1) }
14
+ it { expect(subject.count).to eql(13) }
15
+ end
16
+
17
+ context 'timespan strict' do
18
+ subject { Event.by_quarter(Date.parse('2014-02-01'), strict: true) }
19
+ it { expect(subject.count).to eql(7) }
20
+ end
21
+
22
+ context 'with :year option' do
23
+
24
+ context 'point-in-time' do
25
+ subject { Post.by_quarter(4, year: 2013) }
26
+ it { expect(subject.count).to eql(10) }
27
+ end
28
+
29
+ context 'timespan' do
30
+ subject { Event.by_quarter(4, year: 2013) }
31
+ it { expect(subject.count).to eql(13) }
32
+ end
33
+
34
+ context 'timespan strict' do
35
+ subject { Event.by_quarter(4, year: 2013, strict: true) }
36
+ it { expect(subject.count).to eql(8) }
37
+ end
38
+ end
39
+
40
+ it 'should raise an error when given an invalid argument' do
41
+ expect{ Post.by_quarter(0) }.to raise_error(ByStar::ParseError, 'Quarter number must be between 1 and 4')
42
+ expect{ Post.by_quarter(5) }.to raise_error(ByStar::ParseError, 'Quarter number must be between 1 and 4')
43
+ end
44
+
45
+ it 'should be able to use an alternative field' do
46
+ expect(Event.by_quarter(1, field: 'end_time').count).to eq 12
47
+ end
48
+ end
49
+ end
@@ -1,54 +1,54 @@
1
- require 'spec_helper'
2
-
3
- shared_examples_for 'by week' do
4
-
5
- describe '#by_week' do
6
-
7
- context 'point-in-time' do
8
- subject { Post.by_week('2014-01-02') }
9
- its(:count){ should eq 4 }
10
- end
11
-
12
- context 'timespan' do
13
- subject { Event.by_week(0) }
14
- its(:count){ should eq 7 }
15
- end
16
-
17
- context 'timespan strict' do
18
- subject { Event.by_week(Date.parse('2014-01-01'), strict: true) }
19
- its(:count){ should eq 0 }
20
- end
21
-
22
- context 'with :year option' do
23
-
24
- context 'point-in-time' do
25
- subject { Post.by_week(52, year: 2013) }
26
- its(:count){ should eq 4 }
27
- end
28
-
29
- context 'timespan' do
30
- subject { Event.by_week(52, year: 2013) }
31
- its(:count){ should eq 7 }
32
- end
33
-
34
- context 'timespan strict' do
35
- subject { Event.by_week(52, year: 2013, strict: true) }
36
- its(:count){ should eq 0 }
37
- end
38
- end
39
-
40
- it 'should raise an error when given an invalid argument' do
41
- lambda { Post.by_weekend(-1) }.should raise_error(ByStar::ParseError, 'Week number must be between 0 and 52')
42
- lambda { Post.by_weekend(53) }.should raise_error(ByStar::ParseError, 'Week number must be between 0 and 52')
43
- end
44
-
45
- it 'should be able to use an alternative field' do
46
- Event.by_week(:field => 'end_time').count.should eq 3
47
- end
48
-
49
- context ':start_day option' do
50
- subject { Post.by_week('2014-01-02', :start_day => :thursday) }
51
- its(:count){ should eq 1 }
52
- end
53
- end
54
- end
1
+ require 'spec_helper'
2
+
3
+ shared_examples_for 'by week' do
4
+
5
+ describe '#by_week' do
6
+
7
+ context 'point-in-time' do
8
+ subject { Post.by_week('2014-01-02') }
9
+ it { expect(subject.count).to eql(4) }
10
+ end
11
+
12
+ context 'timespan' do
13
+ subject { Event.by_week(0) }
14
+ it { expect(subject.count).to eql(7) }
15
+ end
16
+
17
+ context 'timespan strict' do
18
+ subject { Event.by_week(Date.parse('2014-01-01'), strict: true) }
19
+ it { expect(subject.count).to eql(0) }
20
+ end
21
+
22
+ context 'with :year option' do
23
+
24
+ context 'point-in-time' do
25
+ subject { Post.by_week(52, year: 2013) }
26
+ it { expect(subject.count).to eql(4) }
27
+ end
28
+
29
+ context 'timespan' do
30
+ subject { Event.by_week(52, year: 2013) }
31
+ it { expect(subject.count).to eql(7) }
32
+ end
33
+
34
+ context 'timespan strict' do
35
+ subject { Event.by_week(52, year: 2013, strict: true) }
36
+ it { expect(subject.count).to eql(0) }
37
+ end
38
+ end
39
+
40
+ it 'should raise an error when given an invalid argument' do
41
+ expect { Post.by_week(-1) }.to raise_error(ByStar::ParseError, 'Week number must be between 0 and 52')
42
+ expect { Post.by_week(53) }.to raise_error(ByStar::ParseError, 'Week number must be between 0 and 52')
43
+ end
44
+
45
+ it 'should be able to use an alternative field' do
46
+ expect(Event.by_week(field: 'end_time').count).to eq 3
47
+ end
48
+
49
+ context ':start_day option' do
50
+ subject { Post.by_week('2014-01-02', start_day: :thursday) }
51
+ it { expect(subject.count).to eql(1) }
52
+ end
53
+ end
54
+ end
@@ -1,49 +1,49 @@
1
- require 'spec_helper'
2
-
3
- shared_examples_for 'by weekend' do
4
-
5
- describe '#by_weekend' do
6
-
7
- context 'point-in-time' do
8
- subject { Post.by_weekend('2014-01-01') }
9
- its(:count){ should eq 1 }
10
- end
11
-
12
- context 'timespan' do
13
- subject { Event.by_weekend(0) }
14
- its(:count){ should eq 5 }
15
- end
16
-
17
- context 'timespan strict' do
18
- subject { Event.by_weekend(Date.parse('2014-01-01'), strict: true) }
19
- its(:count){ should eq 0 }
20
- end
21
-
22
- context 'with :year option' do
23
-
24
- context 'point-in-time' do
25
- subject { Post.by_weekend(52, year: 2013) }
26
- its(:count){ should eq 1 }
27
- end
28
-
29
- context 'timespan' do
30
- subject { Event.by_weekend(52, year: 2013) }
31
- its(:count){ should eq 5 }
32
- end
33
-
34
- context 'timespan strict' do
35
- subject { Event.by_weekend(52, year: 2013, strict: true) }
36
- its(:count){ should eq 0 }
37
- end
38
- end
39
-
40
- it 'should raise an error when given an invalid argument' do
41
- lambda { Post.by_weekend(-1) }.should raise_error(ByStar::ParseError, 'Week number must be between 0 and 52')
42
- lambda { Post.by_weekend(53) }.should raise_error(ByStar::ParseError, 'Week number must be between 0 and 52')
43
- end
44
-
45
- it 'should be able to use an alternative field' do
46
- Event.by_weekend(:field => 'end_time').count.should eq 1
47
- end
48
- end
49
- end
1
+ require 'spec_helper'
2
+
3
+ shared_examples_for 'by weekend' do
4
+
5
+ describe '#by_weekend' do
6
+
7
+ context 'point-in-time' do
8
+ subject { Post.by_weekend('2014-01-01') }
9
+ it { expect(subject.count).to eql(1) }
10
+ end
11
+
12
+ context 'timespan' do
13
+ subject { Event.by_weekend(0) }
14
+ it { expect(subject.count).to eql(5) }
15
+ end
16
+
17
+ context 'timespan strict' do
18
+ subject { Event.by_weekend(Date.parse('2014-01-01'), strict: true) }
19
+ it { expect(subject.count).to eql(0) }
20
+ end
21
+
22
+ context 'with :year option' do
23
+
24
+ context 'point-in-time' do
25
+ subject { Post.by_weekend(52, year: 2013) }
26
+ it { expect(subject.count).to eql(1) }
27
+ end
28
+
29
+ context 'timespan' do
30
+ subject { Event.by_weekend(52, year: 2013) }
31
+ it { expect(subject.count).to eql(5) }
32
+ end
33
+
34
+ context 'timespan strict' do
35
+ subject { Event.by_weekend(52, year: 2013, strict: true) }
36
+ it { expect(subject.count).to eql(0) }
37
+ end
38
+ end
39
+
40
+ it 'should raise an error when given an invalid argument' do
41
+ expect { Post.by_weekend(-1) }.to raise_error(ByStar::ParseError, 'Week number must be between 0 and 52')
42
+ expect { Post.by_weekend(53) }.to raise_error(ByStar::ParseError, 'Week number must be between 0 and 52')
43
+ end
44
+
45
+ it 'should be able to use an alternative field' do
46
+ expect(Event.by_weekend(field: 'end_time').count).to eq 1
47
+ end
48
+ end
49
+ end
@@ -1,48 +1,48 @@
1
- require 'spec_helper'
2
-
3
- shared_examples_for 'by year' do
4
-
5
- describe '#by_year' do
6
-
7
- context 'point-in-time' do
8
- subject { Post.by_year('2014') }
9
- its(:count){ should eq 12 }
10
- end
11
-
12
- context 'timespan' do
13
- subject { Event.by_year(13) }
14
- its(:count){ should eq 13 }
15
- end
16
-
17
- context 'timespan strict' do
18
- subject { Event.by_year(Date.parse('2014-02-01'), strict: true) }
19
- its(:count){ should eq 9 }
20
- end
21
-
22
- context 'with :year option' do
23
-
24
- context 'point-in-time' do
25
- subject { Post.by_year(year: 2013) }
26
- its(:count){ should eq 10 }
27
- end
28
-
29
- context 'timespan' do
30
- subject { Event.by_year(year: 2014) }
31
- its(:count){ should eq 14 }
32
- end
33
-
34
- context 'timespan strict' do
35
- subject { Event.by_year(year: 2013, strict: true) }
36
- its(:count){ should eq 8 }
37
- end
38
- end
39
-
40
- it 'should be able to use an alternative field' do
41
- Event.by_year(:field => 'end_time').count.should eq 14
42
- end
43
-
44
- it 'can use a 2-digit year' do
45
- Post.by_year(13).count.should eq 10
46
- end
47
- end
48
- end
1
+ require 'spec_helper'
2
+
3
+ shared_examples_for 'by year' do
4
+
5
+ describe '#by_year' do
6
+
7
+ context 'point-in-time' do
8
+ subject { Post.by_year('2014') }
9
+ it { expect(subject.count).to eql(12) }
10
+ end
11
+
12
+ context 'timespan' do
13
+ subject { Event.by_year(13) }
14
+ it { expect(subject.count).to eql(13) }
15
+ end
16
+
17
+ context 'timespan strict' do
18
+ subject { Event.by_year(Date.parse('2014-02-01'), strict: true) }
19
+ it { expect(subject.count).to eql(9) }
20
+ end
21
+
22
+ context 'integer' do
23
+
24
+ context 'point-in-time' do
25
+ subject { Post.by_year(2013) }
26
+ it { expect(subject.count).to eql(10) }
27
+ end
28
+
29
+ context 'timespan' do
30
+ subject { Event.by_year(2014) }
31
+ it { expect(subject.count).to eql(14) }
32
+ end
33
+
34
+ context 'timespan strict' do
35
+ subject { Event.by_year(2013, strict: true) }
36
+ it { expect(subject.count).to eql(8) }
37
+ end
38
+ end
39
+
40
+ it 'should be able to use an alternative field' do
41
+ expect(Event.by_year(field: 'end_time').count).to eq 14
42
+ end
43
+
44
+ it 'can use a 2-digit year' do
45
+ expect(Post.by_year(13).count).to eq 10
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,111 @@
1
+ require 'spec_helper'
2
+
3
+ shared_examples_for 'index_scope parameter' do
4
+
5
+ describe ':scope' do
6
+
7
+ it 'should memoize the scope variable' do
8
+ expect(Event.instance_variable_get(:@by_star_index_scope)).to be_nil
9
+ expect(Post.instance_variable_get(:@by_star_index_scope)).to be_nil
10
+ expect(Appointment.instance_variable_get(:@by_star_index_scope)).to be_a Proc
11
+ end
12
+
13
+ context 'between_times with index_scope' do
14
+
15
+ context 'nil' do
16
+ subject { Event.between_times(Date.parse('2013-12-01'), Date.parse('2014-01-31'), index_scope: nil) }
17
+ it { expect(subject.count).to eql(16) }
18
+ end
19
+
20
+ context 'false' do
21
+ subject { Event.between_times(Date.parse('2013-12-01'), Date.parse('2014-01-31'), index_scope: false) }
22
+ it { expect(subject.count).to eql(16) }
23
+ end
24
+
25
+ context 'Time' do
26
+ subject { Event.between_times(Date.parse('2013-12-01'), Date.parse('2014-01-31'), index_scope: Time.zone.parse('2013-11-30 17:00:00')) }
27
+ it { expect(subject.count).to eql(14) }
28
+ end
29
+
30
+ context 'DateTime' do
31
+ subject { Event.between_times(Date.parse('2013-12-01'), Date.parse('2014-01-31'), index_scope: Time.zone.parse('2013-11-30 17:00:00').to_datetime) }
32
+ it { expect(subject.count).to eql(14) }
33
+ end
34
+
35
+ context 'Date' do
36
+ subject { Event.between_times(Date.parse('2013-12-01'), Date.parse('2014-01-31'), index_scope: Date.parse('2013-11-30')) }
37
+ it { expect(subject.count).to eql(14) }
38
+ end
39
+
40
+ context 'ActiveSupport::Duration' do
41
+ subject { Event.between_times(Date.parse('2013-12-01'), Date.parse('2014-01-31'), index_scope: 3.hours) }
42
+ it { expect(subject.count).to eql(13) }
43
+ end
44
+
45
+ context 'Numeric' do
46
+ subject { Event.between_times(Date.parse('2013-12-01'), Date.parse('2014-01-31'), index_scope: 3600) }
47
+ it { expect(subject.count).to eql(13) }
48
+ end
49
+
50
+ context ':beginning_of_day' do
51
+ subject { Event.between_times(Date.parse('2013-12-01'), Date.parse('2014-01-31'), index_scope: :beginning_of_day) }
52
+ it { expect(subject.count).to eql(13) }
53
+ end
54
+
55
+ context 'unsupported type' do
56
+ subject { Event.between_times(Date.parse('2013-12-01'), Date.parse('2014-01-31'), index_scope: Integer) }
57
+ it { expect{subject.count}.to raise_error(RuntimeError) }
58
+ end
59
+ end
60
+
61
+ context 'at_time with index_scope' do
62
+
63
+ context 'nil' do
64
+ subject { Event.at_time(Time.zone.parse('2013-12-01 14:00'), index_scope: nil) }
65
+ it { expect(subject.count).to eql(3) }
66
+ end
67
+
68
+ context 'false' do
69
+ subject { Event.at_time(Time.zone.parse('2013-12-01 14:00'), index_scope: false) }
70
+ it { expect(subject.count).to eql(3) }
71
+ end
72
+
73
+ context 'Time' do
74
+ subject { Event.at_time(Time.zone.parse('2013-12-01 14:00'), index_scope: Time.zone.parse('2013-10-30 17:00:00')) }
75
+ it { expect(subject.count).to eql(3) }
76
+ end
77
+
78
+ context 'DateTime' do
79
+ subject { Event.at_time(Time.zone.parse('2013-12-01 14:00'), index_scope: Time.zone.parse('2013-11-30 17:00:00').to_datetime) }
80
+ it { expect(subject.count).to eql(1) }
81
+ end
82
+
83
+ context 'Date' do
84
+ subject { Event.at_time(Time.zone.parse('2013-12-01 14:00'), index_scope: Date.parse('2013-11-30')) }
85
+ it { expect(subject.count).to eql(1) }
86
+ end
87
+
88
+ context 'ActiveSupport::Duration' do
89
+ subject { Event.at_time(Time.zone.parse('2013-12-01 14:00'), index_scope: 100.hours) }
90
+ it { expect(subject.count).to eql(1) }
91
+ end
92
+
93
+ context 'Numeric' do
94
+ subject { Event.at_time(Time.zone.parse('2013-12-01 14:00'), index_scope: 60 * 60 * 1000) }
95
+ it { expect(subject.count).to eql(3) }
96
+ end
97
+
98
+ context ':beginning_of_day' do
99
+ let!(:custom_event){ t = Time.zone.parse('2013-12-30 17:00'); Event.create!(start_time: t - 1.hour, end_time: t + 1.hour) }
100
+ subject { Event.at_time(Time.zone.parse('2013-12-30 16:00'), index_scope: :beginning_of_day) }
101
+ it { expect(subject.count).to eql(1) }
102
+ after { custom_event.delete }
103
+ end
104
+
105
+ context 'unsupported type' do
106
+ subject { Event.at_time(Time.zone.parse('2013-12-01 14:00'), index_scope: Integer) }
107
+ it { expect{subject.count}.to raise_error(RuntimeError) }
108
+ end
109
+ end
110
+ end
111
+ end