by_star 3.0.0 → 4.0.1

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 (67) hide show
  1. checksums.yaml +4 -4
  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 -61
  6. data/CHANGELOG.md +63 -44
  7. data/Gemfile +18 -18
  8. data/MIT-LICENSE +20 -20
  9. data/README.md +616 -577
  10. data/Rakefile +18 -18
  11. data/UPGRADING +4 -6
  12. data/by_star.gemspec +34 -34
  13. data/cleaner.rb +24 -24
  14. data/lib/by_star/base.rb +69 -68
  15. data/lib/by_star/between.rb +185 -156
  16. data/lib/by_star/directional.rb +35 -37
  17. data/lib/by_star/kernel/date.rb +41 -50
  18. data/lib/by_star/kernel/in_time_zone.rb +20 -0
  19. data/lib/by_star/kernel/time.rb +41 -41
  20. data/lib/by_star/normalization.rb +156 -127
  21. data/lib/by_star/orm/active_record/by_star.rb +75 -61
  22. data/lib/by_star/orm/mongoid/by_star.rb +90 -76
  23. data/lib/by_star/orm/mongoid/reorder.rb +23 -23
  24. data/lib/by_star/version.rb +3 -3
  25. data/lib/by_star.rb +18 -17
  26. data/spec/database.yml +15 -15
  27. data/spec/fixtures/active_record/models.rb +12 -12
  28. data/spec/fixtures/active_record/schema.rb +19 -19
  29. data/spec/fixtures/mongoid/models.rb +31 -31
  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 -7
  34. data/spec/gemfiles/Gemfile.rails41 +7 -7
  35. data/spec/gemfiles/Gemfile.rails42 +7 -7
  36. data/spec/gemfiles/Gemfile.rails50 +7 -10
  37. data/spec/gemfiles/Gemfile.rails51 +7 -10
  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 -38
  42. data/spec/integration/mongoid/mongoid_spec.rb +39 -37
  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 -82
  46. data/spec/integration/shared/by_calendar_month.rb +55 -55
  47. data/spec/integration/shared/by_cweek.rb +54 -54
  48. data/spec/integration/shared/by_day.rb +120 -96
  49. data/spec/integration/shared/by_direction.rb +126 -172
  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 -32
  58. data/spec/integration/shared/order_parameter.rb +36 -36
  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 -113
  62. data/spec/unit/kernel_time_spec.rb +57 -57
  63. data/spec/unit/normalization_spec.rb +384 -305
  64. data/tmp/.gitignore +1 -1
  65. metadata +33 -21
  66. data/spec/gemfiles/Gemfile.master +0 -6
  67. data/spec/integration/shared/scope_parameter.rb +0 -73
@@ -1,55 +1,55 @@
1
- require 'spec_helper'
2
-
3
- shared_examples_for 'by calendar month' do
4
-
5
- describe '#by_calendar_month' do
6
-
7
- context 'point-in-time' do
8
- subject { Post.by_calendar_month('Feb') }
9
- it { expect(subject.count).to eql(3) }
10
- end
11
-
12
- context 'timespan' do
13
- subject { Event.by_calendar_month(1) }
14
- it { expect(subject.count).to eql(10) }
15
- end
16
-
17
- context 'timespan strict' do
18
- subject { Event.by_calendar_month(Date.parse('2014-02-01'), strict: true) }
19
- it { expect(subject.count).to eql(2) }
20
- end
21
-
22
- context 'with :year option' do
23
-
24
- context 'point-in-time' do
25
- subject { Post.by_calendar_month(12, year: 2013) }
26
- it { expect(subject.count).to eql(12) }
27
- end
28
-
29
- context 'timespan' do
30
- subject { Event.by_calendar_month('December', year: 2013) }
31
- it { expect(subject.count).to eql(13) }
32
- end
33
-
34
- context 'timespan strict' do
35
- subject { Event.by_calendar_month('Dec', year: 2013, strict: true) }
36
- it { expect(subject.count).to eql(9) }
37
- end
38
- end
39
-
40
- it 'should raise an error when given an invalid argument' do
41
- expect{ Post.by_calendar_month(0) }.to raise_error(ByStar::ParseError, 'Month must be a number between 1 and 12 or a month name')
42
- expect{ Post.by_calendar_month(13) }.to raise_error(ByStar::ParseError, 'Month must be a number between 1 and 12 or a month name')
43
- expect{ Post.by_calendar_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_calendar_month(field: 'end_time').count).to eql(9)
48
- end
49
-
50
- context ':start_day option' do
51
- subject { Post.by_calendar_month(1, start_day: :wednesday) }
52
- it{ expect(subject.count).to eql(7) }
53
- end
54
- end
55
- end
1
+ require 'spec_helper'
2
+
3
+ shared_examples_for 'by calendar month' do
4
+
5
+ describe '#by_calendar_month' do
6
+
7
+ context 'point-in-time' do
8
+ subject { Post.by_calendar_month('Feb') }
9
+ it { expect(subject.count).to eql(3) }
10
+ end
11
+
12
+ context 'timespan' do
13
+ subject { Event.by_calendar_month(1) }
14
+ it { expect(subject.count).to eql(10) }
15
+ end
16
+
17
+ context 'timespan strict' do
18
+ subject { Event.by_calendar_month(Date.parse('2014-02-01'), strict: true) }
19
+ it { expect(subject.count).to eql(2) }
20
+ end
21
+
22
+ context 'with :year option' do
23
+
24
+ context 'point-in-time' do
25
+ subject { Post.by_calendar_month(12, year: 2013) }
26
+ it { expect(subject.count).to eql(12) }
27
+ end
28
+
29
+ context 'timespan' do
30
+ subject { Event.by_calendar_month('December', year: 2013) }
31
+ it { expect(subject.count).to eql(13) }
32
+ end
33
+
34
+ context 'timespan strict' do
35
+ subject { Event.by_calendar_month('Dec', year: 2013, strict: true) }
36
+ it { expect(subject.count).to eql(9) }
37
+ end
38
+ end
39
+
40
+ it 'should raise an error when given an invalid argument' do
41
+ expect{ Post.by_calendar_month(0) }.to raise_error(ByStar::ParseError, 'Month must be a number between 1 and 12 or a month name')
42
+ expect{ Post.by_calendar_month(13) }.to raise_error(ByStar::ParseError, 'Month must be a number between 1 and 12 or a month name')
43
+ expect{ Post.by_calendar_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_calendar_month(field: 'end_time').count).to eql(9)
48
+ end
49
+
50
+ context ':start_day option' do
51
+ subject { Post.by_calendar_month(1, start_day: :wednesday) }
52
+ it{ expect(subject.count).to eql(7) }
53
+ end
54
+ end
55
+ end
@@ -1,54 +1,54 @@
1
- require 'spec_helper'
2
-
3
- shared_examples_for 'by cweek' do
4
-
5
- describe '#by_cweek' do
6
-
7
- context 'point-in-time' do
8
- subject { Post.by_cweek('2014-01-02') }
9
- it { expect(subject.count).to eql(4) }
10
- end
11
-
12
- context 'timespan' do
13
- subject { Event.by_cweek(1) }
14
- it { expect(subject.count).to eql(7) }
15
- end
16
-
17
- context 'timespan strict' do
18
- subject { Event.by_cweek(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_cweek(53, year: 2013) }
26
- it { expect(subject.count).to eql(4) }
27
- end
28
-
29
- context 'timespan' do
30
- subject { Event.by_cweek(53, year: 2013) }
31
- it { expect(subject.count).to eql(7) }
32
- end
33
-
34
- context 'timespan strict' do
35
- subject { Event.by_cweek(53, 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_cweek(0) }.to raise_error(ByStar::ParseError, 'cweek number must be between 1 and 53')
42
- expect { Post.by_cweek(54) }.to raise_error(ByStar::ParseError, 'cweek number must be between 1 and 53')
43
- end
44
-
45
- it 'should be able to use an alternative field' do
46
- expect(Event.by_cweek(field: 'end_time').count).to eq 3
47
- end
48
-
49
- context ':start_day option' do
50
- subject { Post.by_cweek('2014-01-02', start_day: :thursday) }
51
- it { expect(subject.count).to eql(1) }
52
- end
53
- end
54
- end
1
+ require 'spec_helper'
2
+
3
+ shared_examples_for 'by cweek' do
4
+
5
+ describe '#by_cweek' do
6
+
7
+ context 'point-in-time' do
8
+ subject { Post.by_cweek('2014-01-02') }
9
+ it { expect(subject.count).to eql(4) }
10
+ end
11
+
12
+ context 'timespan' do
13
+ subject { Event.by_cweek(1) }
14
+ it { expect(subject.count).to eql(7) }
15
+ end
16
+
17
+ context 'timespan strict' do
18
+ subject { Event.by_cweek(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_cweek(53, year: 2013) }
26
+ it { expect(subject.count).to eql(4) }
27
+ end
28
+
29
+ context 'timespan' do
30
+ subject { Event.by_cweek(53, year: 2013) }
31
+ it { expect(subject.count).to eql(7) }
32
+ end
33
+
34
+ context 'timespan strict' do
35
+ subject { Event.by_cweek(53, 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_cweek(0) }.to raise_error(ByStar::ParseError, 'cweek number must be between 1 and 53')
42
+ expect { Post.by_cweek(54) }.to raise_error(ByStar::ParseError, 'cweek number must be between 1 and 53')
43
+ end
44
+
45
+ it 'should be able to use an alternative field' do
46
+ expect(Event.by_cweek(field: 'end_time').count).to eq 3
47
+ end
48
+
49
+ context ':start_day option' do
50
+ subject { Post.by_cweek('2014-01-02', start_day: :thursday) }
51
+ it { expect(subject.count).to eql(1) }
52
+ end
53
+ end
54
+ end
@@ -1,96 +1,120 @@
1
- require 'spec_helper'
2
-
3
- shared_examples_for 'by day' do
4
-
5
- describe '#by_day' do
6
-
7
- context 'point-in-time' do
8
- it { expect(Post.by_day('2014-01-01').count).to eql(2) }
9
- end
10
-
11
- context 'timespan' do
12
- it { expect(Event.by_day(Time.zone.parse '2014-01-01').count).to eql(5) }
13
- end
14
-
15
- context 'timespan strict' do
16
- it { expect(Event.by_day(Date.parse('2014-01-01'), strict: true).count).to eql(0) }
17
- end
18
-
19
- it 'should be able to use an alternative field' do
20
- expect(Event.by_day(field: 'end_time').count).to eql(0)
21
- end
22
-
23
- it 'should support :offset option' do
24
- expect(Post.by_day('2014-01-01', offset: -16.hours).count).to eq(1)
25
- end
26
- end
27
-
28
- describe '#today' do # 2014-01-01
29
-
30
- context 'point-in-time' do
31
- it { expect(Post.today.count).to eql(2) }
32
- end
33
-
34
- context 'timespan' do
35
- it { expect(Event.today.count).to eql(5) }
36
- end
37
-
38
- context 'timespan strict' do
39
- it { expect(Event.today(strict: true).count).to eql(0) }
40
- end
41
-
42
- it 'should be able to use an alternative field' do
43
- expect(Event.today(field: 'created_at').count).to eql(2)
44
- end
45
-
46
- it 'should support :offset option' do
47
- expect(Post.today(offset: -24.hours).count).to eql(1)
48
- end
49
- end
50
-
51
- describe '#yesterday' do # 2013-12-31
52
-
53
- context 'point-in-time' do
54
- it { expect(Post.yesterday.count).to eql(1) }
55
- end
56
-
57
- context 'timespan' do
58
- it { expect(Event.yesterday.count).to eql(5) }
59
- end
60
-
61
- context 'timespan strict' do
62
- it { expect(Event.yesterday(strict: true).count).to eql(0) }
63
- end
64
-
65
- it 'should be able to use an alternative field' do
66
- expect(Event.yesterday(field: 'created_at').count).to eql(1)
67
- end
68
-
69
- it 'should support :offset option' do
70
- expect(Post.yesterday(offset: 24.hours).count).to eql(2)
71
- end
72
- end
73
-
74
- describe '#tomorrow' do # 2014-01-02
75
-
76
- context 'point-in-time' do
77
- it { expect(Post.tomorrow.count).to eql(0) }
78
- end
79
-
80
- context 'timespan' do
81
- it { expect(Event.tomorrow.count).to eql(5) }
82
- end
83
-
84
- context 'timespan strict' do
85
- it { expect(Event.tomorrow(strict: true).count).to eql(0) }
86
- end
87
-
88
- it 'should be able to use an alternative field' do
89
- expect(Event.tomorrow(field: 'created_at').count).to eql(0)
90
- end
91
-
92
- it 'should support :offset option' do
93
- expect(Post.tomorrow(offset: -24.hours).count).to eql(2)
94
- end
95
- end
96
- end
1
+ require 'spec_helper'
2
+
3
+ shared_examples_for 'by day' do
4
+
5
+ describe '#by_day' do
6
+
7
+ context 'point-in-time' do
8
+ it { expect(Post.by_day('2014-01-01').count).to eql(2) }
9
+ end
10
+
11
+ context 'timespan' do
12
+ it { expect(Event.by_day(Time.zone.parse '2014-01-01').count).to eql(5) }
13
+ end
14
+
15
+ context 'timespan strict' do
16
+ it { expect(Event.by_day(Date.parse('2014-01-01'), strict: true).count).to eql(0) }
17
+ end
18
+
19
+ it 'should be able to use an alternative field' do
20
+ expect(Event.by_day(field: 'end_time').count).to eql(0)
21
+ end
22
+
23
+ it 'should support :offset option' do
24
+ expect(Post.by_day('2014-01-01', offset: -16.hours).count).to eq(1)
25
+ end
26
+
27
+ context 'when DST starts (Sydney)', sydney: true do
28
+ context 'day before' do
29
+ subject { Event.by_day('2020-04-04', offset: 5.hours) }
30
+ it { expect(subject.count).to eq(3) }
31
+ end
32
+
33
+ context 'same day' do
34
+ subject { Event.by_day('2020-04-05', offset: 5.hours) }
35
+ it { expect(subject.count).to eq(1) }
36
+ end
37
+ end
38
+
39
+ context 'when DST ends (Sydney)', sydney: true do
40
+ context 'day before' do
41
+ subject { Event.by_day('2020-10-03', offset: 5.hours) }
42
+ it { expect(subject.count).to eq(1) }
43
+ end
44
+
45
+ context 'same day' do
46
+ subject { Event.by_day('2020-10-04', offset: 5.hours) }
47
+ it { expect(subject.count).to eq(3) }
48
+ end
49
+ end
50
+ end
51
+
52
+ describe '#today' do # 2014-01-01
53
+
54
+ context 'point-in-time' do
55
+ it { expect(Post.today.count).to eql(2) }
56
+ end
57
+
58
+ context 'timespan' do
59
+ it { expect(Event.today.count).to eql(5) }
60
+ end
61
+
62
+ context 'timespan strict' do
63
+ it { expect(Event.today(strict: true).count).to eql(0) }
64
+ end
65
+
66
+ it 'should be able to use an alternative field' do
67
+ expect(Event.today(field: 'created_at').count).to eql(2)
68
+ end
69
+
70
+ it 'should support :offset option' do
71
+ expect(Post.today(offset: -24.hours).count).to eql(1)
72
+ end
73
+ end
74
+
75
+ describe '#yesterday' do # 2013-12-31
76
+
77
+ context 'point-in-time' do
78
+ it { expect(Post.yesterday.count).to eql(1) }
79
+ end
80
+
81
+ context 'timespan' do
82
+ it { expect(Event.yesterday.count).to eql(5) }
83
+ end
84
+
85
+ context 'timespan strict' do
86
+ it { expect(Event.yesterday(strict: true).count).to eql(0) }
87
+ end
88
+
89
+ it 'should be able to use an alternative field' do
90
+ expect(Event.yesterday(field: 'created_at').count).to eql(1)
91
+ end
92
+
93
+ it 'should support :offset option' do
94
+ expect(Post.yesterday(offset: 24.hours).count).to eql(2)
95
+ end
96
+ end
97
+
98
+ describe '#tomorrow' do # 2014-01-02
99
+
100
+ context 'point-in-time' do
101
+ it { expect(Post.tomorrow.count).to eql(0) }
102
+ end
103
+
104
+ context 'timespan' do
105
+ it { expect(Event.tomorrow.count).to eql(5) }
106
+ end
107
+
108
+ context 'timespan strict' do
109
+ it { expect(Event.tomorrow(strict: true).count).to eql(0) }
110
+ end
111
+
112
+ it 'should be able to use an alternative field' do
113
+ expect(Event.tomorrow(field: 'created_at').count).to eql(0)
114
+ end
115
+
116
+ it 'should support :offset option' do
117
+ expect(Post.tomorrow(offset: -24.hours).count).to eql(2)
118
+ end
119
+ end
120
+ end