timeboss 0.0.10 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.yardopts +1 -0
- data/README.md +1 -1
- data/doc/TimeBoss.html +146 -0
- data/doc/TimeBoss/Calendar.html +137 -0
- data/doc/TimeBoss/Calendar/Day.html +594 -0
- data/doc/TimeBoss/Calendar/Half.html +396 -0
- data/doc/TimeBoss/Calendar/Month.html +396 -0
- data/doc/TimeBoss/Calendar/Parser.html +386 -0
- data/doc/TimeBoss/Calendar/Period.html +841 -0
- data/doc/TimeBoss/Calendar/Quarter.html +396 -0
- data/doc/TimeBoss/Calendar/Support.html +131 -0
- data/doc/TimeBoss/Calendar/Support/Formatter.html +459 -0
- data/doc/TimeBoss/Calendar/Support/MonthBased.html +591 -0
- data/doc/TimeBoss/Calendar/Support/MonthBasis.html +437 -0
- data/doc/TimeBoss/Calendar/Support/MonthlyUnit.html +591 -0
- data/doc/TimeBoss/Calendar/Support/Navigable.html +723 -0
- data/doc/TimeBoss/Calendar/Support/Shiftable.html +138 -0
- data/doc/TimeBoss/Calendar/Support/Unit.html +1299 -0
- data/doc/TimeBoss/Calendar/Waypoints.html +155 -0
- data/doc/TimeBoss/Calendar/Waypoints/Absolute.html +1378 -0
- data/doc/TimeBoss/Calendar/Waypoints/Relative.html +4308 -0
- data/doc/TimeBoss/Calendar/Week.html +671 -0
- data/doc/TimeBoss/Calendar/Year.html +319 -0
- data/doc/TimeBoss/Calendars.html +336 -0
- data/doc/TimeBoss/Calendars/Broadcast.html +221 -0
- data/doc/TimeBoss/Calendars/Broadcast/Basis.html +278 -0
- data/doc/TimeBoss/Calendars/Entry.html +399 -0
- data/doc/TimeBoss/Support.html +115 -0
- data/doc/TimeBoss/Support/Shellable.html +249 -0
- data/doc/_index.html +416 -0
- data/doc/class_list.html +51 -0
- data/doc/css/common.css +1 -0
- data/doc/css/full_list.css +58 -0
- data/doc/css/style.css +496 -0
- data/doc/file.README.html +299 -0
- data/doc/file_list.html +56 -0
- data/doc/frames.html +17 -0
- data/doc/index.html +299 -0
- data/doc/js/app.js +314 -0
- data/doc/js/full_list.js +216 -0
- data/doc/js/jquery.js +4 -0
- data/doc/method_list.html +1139 -0
- data/doc/top-level-namespace.html +110 -0
- data/lib/timeboss.rb +4 -0
- data/lib/timeboss/calendar.rb +14 -0
- data/lib/timeboss/calendar/day.rb +10 -3
- data/lib/timeboss/calendar/half.rb +7 -2
- data/lib/timeboss/calendar/month.rb +7 -2
- data/lib/timeboss/calendar/parser.rb +1 -0
- data/lib/timeboss/calendar/period.rb +26 -11
- data/lib/timeboss/calendar/quarter.rb +7 -2
- data/lib/timeboss/calendar/support.rb +8 -0
- data/lib/timeboss/calendar/support/formatter.rb +1 -0
- data/lib/timeboss/calendar/support/month_basis.rb +3 -0
- data/lib/timeboss/calendar/support/{month_based.rb → monthly_unit.rb} +7 -1
- data/lib/timeboss/calendar/support/navigable.rb +25 -1
- data/lib/timeboss/calendar/support/shiftable.rb +3 -2
- data/lib/timeboss/calendar/support/unit.rb +24 -0
- data/lib/timeboss/calendar/waypoints.rb +6 -55
- data/lib/timeboss/calendar/waypoints/absolute.rb +114 -0
- data/lib/timeboss/calendar/waypoints/relative.rb +268 -0
- data/lib/timeboss/calendar/week.rb +11 -0
- data/lib/timeboss/calendar/year.rb +6 -5
- data/lib/timeboss/calendars.rb +16 -0
- data/lib/timeboss/version.rb +1 -1
- data/spec/calendar/support/{month_based_spec.rb → monthly_unit_spec.rb} +7 -7
- data/spec/calendars/broadcast_spec.rb +7 -7
- data/timeboss.gemspec +1 -0
- metadata +70 -7
@@ -3,27 +3,38 @@ require_relative './support/unit'
|
|
3
3
|
|
4
4
|
module TimeBoss
|
5
5
|
class Calendar
|
6
|
+
# Representation of a single week within a calendar.
|
6
7
|
class Week < Support::Unit
|
7
8
|
def initialize(calendar, start_date, end_date)
|
8
9
|
super(calendar, start_date, end_date)
|
9
10
|
end
|
10
11
|
|
12
|
+
# Get a simple representation of this week.
|
13
|
+
# @return [String] (e.g. "2020W32")
|
11
14
|
def name
|
12
15
|
"#{year_index}W#{index}"
|
13
16
|
end
|
14
17
|
|
18
|
+
# Get a "pretty" representation of this week.
|
19
|
+
# @return [String] (e.g. "Week of August 3, 2020")
|
15
20
|
def title
|
16
21
|
"Week of #{start_date.strftime('%B %-d, %Y')}"
|
17
22
|
end
|
18
23
|
|
24
|
+
# Get a stringified representation of this week.
|
25
|
+
# @return [String] (e.g. "2020W32: 2020-08-03 thru 2020-08-09")
|
19
26
|
def to_s
|
20
27
|
"#{name}: #{start_date} thru #{end_date}"
|
21
28
|
end
|
22
29
|
|
30
|
+
# Get the index of this week within its containing year.
|
31
|
+
# @return [Integer]
|
23
32
|
def index
|
24
33
|
@_index ||= (((start_date - year.start_date) + 1) / 7.0).to_i + 1
|
25
34
|
end
|
26
35
|
|
36
|
+
# Get the year number for this week.
|
37
|
+
# @return [Integer] (e.g. 2020)
|
27
38
|
def year_index
|
28
39
|
@_year_index ||= year.year_index
|
29
40
|
end
|
@@ -1,18 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
require_relative './support/
|
2
|
+
require_relative './support/monthly_unit'
|
3
3
|
|
4
4
|
module TimeBoss
|
5
5
|
class Calendar
|
6
|
-
|
6
|
+
# Representation of a 12-month period within a calendar.
|
7
|
+
class Year < Support::MonthlyUnit
|
7
8
|
NUM_MONTHS = 12
|
8
9
|
|
10
|
+
# Get a simple representation of this year.
|
11
|
+
# @return [String] (e.g. "2020")
|
9
12
|
def name
|
10
13
|
year_index.to_s
|
11
14
|
end
|
12
15
|
|
13
|
-
|
14
|
-
name
|
15
|
-
end
|
16
|
+
alias_method :title, :name
|
16
17
|
end
|
17
18
|
end
|
18
19
|
end
|
data/lib/timeboss/calendars.rb
CHANGED
@@ -5,17 +5,23 @@ require_relative 'calendar'
|
|
5
5
|
Dir[File.expand_path('../calendars/*.rb', __FILE__)].each { |f| require f }
|
6
6
|
|
7
7
|
module TimeBoss
|
8
|
+
# A home for specific calendar implementations.
|
8
9
|
module Calendars
|
9
10
|
extend self
|
10
11
|
extend Enumerable
|
11
12
|
delegate :each, :length, to: :all
|
12
13
|
|
14
|
+
# Retrieve a list of all registered calendars.
|
15
|
+
# @return [Array<Entry>]
|
13
16
|
def all
|
14
17
|
@_all ||= TimeBoss::Calendar.subclasses.map do |klass|
|
15
18
|
Entry.new(klass.to_s.demodulize.underscore.to_sym, klass)
|
16
19
|
end
|
17
20
|
end
|
18
21
|
|
22
|
+
# Retrieve an instance of the specified named calendar.
|
23
|
+
# @param name [String, Symbol] the name of the calendar to retrieve.
|
24
|
+
# @return [Calendar]
|
19
25
|
def [](name)
|
20
26
|
find { |e| e.name == name&.to_sym }&.calendar
|
21
27
|
end
|
@@ -23,6 +29,16 @@ module TimeBoss
|
|
23
29
|
private
|
24
30
|
|
25
31
|
Entry = Struct.new(:name, :klass) do
|
32
|
+
# @!method name
|
33
|
+
# Get the name of the calendar referenced in this entry.
|
34
|
+
# @return [Symbol]
|
35
|
+
|
36
|
+
# @!method klass
|
37
|
+
# The class implementing this calendar.
|
38
|
+
# @return [Class<Calendar>]
|
39
|
+
|
40
|
+
# Get an instance of the calendar referenced in this entry.
|
41
|
+
# @return [Calendar]
|
26
42
|
def calendar
|
27
43
|
@_calendar ||= klass.new
|
28
44
|
end
|
data/lib/timeboss/version.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
module TimeBoss
|
2
2
|
class Calendar
|
3
3
|
module Support
|
4
|
-
describe
|
5
|
-
class
|
4
|
+
describe MonthlyUnit do
|
5
|
+
class MonthBasedChunk < described_class
|
6
6
|
NUM_MONTHS = 2
|
7
7
|
|
8
8
|
def name
|
9
9
|
"#{year_index}C#{index}"
|
10
10
|
end
|
11
11
|
end
|
12
|
-
let(:described_class) {
|
12
|
+
let(:described_class) { MonthBasedChunk }
|
13
13
|
let(:calendar) { double }
|
14
14
|
let(:start_date) { Date.parse('2018-06-25') }
|
15
15
|
let(:end_date) { Date.parse('2018-08-26') }
|
@@ -51,24 +51,24 @@ module TimeBoss
|
|
51
51
|
|
52
52
|
describe '#previous' do
|
53
53
|
it 'moves easily within itself' do
|
54
|
-
expect(calendar).to receive(:
|
54
|
+
expect(calendar).to receive(:month_based_chunk).with(48, 3).and_return result
|
55
55
|
expect(described_class.new(calendar, 48, 4, nil, nil).previous).to eq result
|
56
56
|
end
|
57
57
|
|
58
58
|
it 'flips to the previous container' do
|
59
|
-
expect(calendar).to receive(:
|
59
|
+
expect(calendar).to receive(:month_based_chunk).with(47, 6).and_return result
|
60
60
|
expect(described_class.new(calendar, 48, 1, nil, nil).previous).to eq result
|
61
61
|
end
|
62
62
|
end
|
63
63
|
|
64
64
|
describe '#next' do
|
65
65
|
it 'moves easily within itself' do
|
66
|
-
expect(calendar).to receive(:
|
66
|
+
expect(calendar).to receive(:month_based_chunk).with(48, 3).and_return result
|
67
67
|
expect(described_class.new(calendar, 48, 2, nil, nil).next).to eq result
|
68
68
|
end
|
69
69
|
|
70
70
|
it 'flips to the previous container' do
|
71
|
-
expect(calendar).to receive(:
|
71
|
+
expect(calendar).to receive(:month_based_chunk).with(48, 1).and_return result
|
72
72
|
expect(described_class.new(calendar, 47, 6, nil, nil).next).to eq result
|
73
73
|
end
|
74
74
|
end
|
@@ -133,8 +133,8 @@ module TimeBoss
|
|
133
133
|
expect(quarters.map(&:name)).to eq ['2015Q3', '2015Q4', '2016Q1', '2016Q2', '2016Q3']
|
134
134
|
end
|
135
135
|
|
136
|
-
it 'can get a quarter
|
137
|
-
quarter = subject.
|
136
|
+
it 'can get a quarter ahead' do
|
137
|
+
quarter = subject.quarters_ahead(4)
|
138
138
|
expect(quarter).to be_a TimeBoss::Calendar::Quarter
|
139
139
|
expect(quarter.name).to eq '2016Q3'
|
140
140
|
end
|
@@ -271,8 +271,8 @@ module TimeBoss
|
|
271
271
|
expect(months.map(&:name)).to eq ['2015M3', '2015M4', '2015M5', '2015M6', '2015M7']
|
272
272
|
end
|
273
273
|
|
274
|
-
it 'can get a month
|
275
|
-
month = subject.
|
274
|
+
it 'can get a month ahead' do
|
275
|
+
month = subject.months_ahead(4)
|
276
276
|
expect(month).to be_a TimeBoss::Calendar::Month
|
277
277
|
expect(month.name).to eq '2015M7'
|
278
278
|
end
|
@@ -510,7 +510,7 @@ module TimeBoss
|
|
510
510
|
it 'can parse mathematic expressions' do
|
511
511
|
result = subject.parse('this_month + 2')
|
512
512
|
expect(result).to be_a TimeBoss::Calendar::Month
|
513
|
-
expect(result).to eq subject.
|
513
|
+
expect(result).to eq subject.months_ahead(2)
|
514
514
|
end
|
515
515
|
|
516
516
|
context 'ranges' do
|
@@ -574,7 +574,7 @@ module TimeBoss
|
|
574
574
|
|
575
575
|
it 'can shift to a different year' do
|
576
576
|
allow(subject).to receive(:this_year).and_return subject.parse('2019')
|
577
|
-
result = basis.
|
577
|
+
result = basis.years_ahead(3)
|
578
578
|
expect(result).to be_a TimeBoss::Calendar::Day
|
579
579
|
expect(result.to_s).to eq '2022-04-19'
|
580
580
|
expect(basis.in_year).to eq 114
|
@@ -616,7 +616,7 @@ module TimeBoss
|
|
616
616
|
|
617
617
|
it 'can shift to a different year' do
|
618
618
|
allow(subject).to receive(:this_year).and_return subject.parse('2020')
|
619
|
-
result = basis.
|
619
|
+
result = basis.years_ahead(4)
|
620
620
|
expect(result).to be_a TimeBoss::Calendar::Month
|
621
621
|
expect(result.name).to eq '2024M4'
|
622
622
|
expect(basis.in_year).to eq 4
|
data/timeboss.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: timeboss
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevin McDonald
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-07-
|
11
|
+
date: 2020-07-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -108,6 +108,20 @@ dependencies:
|
|
108
108
|
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: yard
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
111
125
|
description: Broadcast Calendar navigation in Ruby made simple
|
112
126
|
email:
|
113
127
|
- kevinstuffandthings@gmail.com
|
@@ -121,12 +135,59 @@ files:
|
|
121
135
|
- ".gitignore"
|
122
136
|
- ".rspec"
|
123
137
|
- ".travis.yml"
|
138
|
+
- ".yardoc/checksums"
|
139
|
+
- ".yardoc/complete"
|
140
|
+
- ".yardoc/object_types"
|
141
|
+
- ".yardoc/objects/root.dat"
|
142
|
+
- ".yardoc/proxy_types"
|
143
|
+
- ".yardopts"
|
124
144
|
- CODE_OF_CONDUCT.md
|
125
145
|
- Gemfile
|
126
146
|
- LICENSE.txt
|
127
147
|
- README.md
|
128
148
|
- Rakefile
|
129
149
|
- bin/tbsh
|
150
|
+
- doc/TimeBoss.html
|
151
|
+
- doc/TimeBoss/Calendar.html
|
152
|
+
- doc/TimeBoss/Calendar/Day.html
|
153
|
+
- doc/TimeBoss/Calendar/Half.html
|
154
|
+
- doc/TimeBoss/Calendar/Month.html
|
155
|
+
- doc/TimeBoss/Calendar/Parser.html
|
156
|
+
- doc/TimeBoss/Calendar/Period.html
|
157
|
+
- doc/TimeBoss/Calendar/Quarter.html
|
158
|
+
- doc/TimeBoss/Calendar/Support.html
|
159
|
+
- doc/TimeBoss/Calendar/Support/Formatter.html
|
160
|
+
- doc/TimeBoss/Calendar/Support/MonthBased.html
|
161
|
+
- doc/TimeBoss/Calendar/Support/MonthBasis.html
|
162
|
+
- doc/TimeBoss/Calendar/Support/MonthlyUnit.html
|
163
|
+
- doc/TimeBoss/Calendar/Support/Navigable.html
|
164
|
+
- doc/TimeBoss/Calendar/Support/Shiftable.html
|
165
|
+
- doc/TimeBoss/Calendar/Support/Unit.html
|
166
|
+
- doc/TimeBoss/Calendar/Waypoints.html
|
167
|
+
- doc/TimeBoss/Calendar/Waypoints/Absolute.html
|
168
|
+
- doc/TimeBoss/Calendar/Waypoints/Relative.html
|
169
|
+
- doc/TimeBoss/Calendar/Week.html
|
170
|
+
- doc/TimeBoss/Calendar/Year.html
|
171
|
+
- doc/TimeBoss/Calendars.html
|
172
|
+
- doc/TimeBoss/Calendars/Broadcast.html
|
173
|
+
- doc/TimeBoss/Calendars/Broadcast/Basis.html
|
174
|
+
- doc/TimeBoss/Calendars/Entry.html
|
175
|
+
- doc/TimeBoss/Support.html
|
176
|
+
- doc/TimeBoss/Support/Shellable.html
|
177
|
+
- doc/_index.html
|
178
|
+
- doc/class_list.html
|
179
|
+
- doc/css/common.css
|
180
|
+
- doc/css/full_list.css
|
181
|
+
- doc/css/style.css
|
182
|
+
- doc/file.README.html
|
183
|
+
- doc/file_list.html
|
184
|
+
- doc/frames.html
|
185
|
+
- doc/index.html
|
186
|
+
- doc/js/app.js
|
187
|
+
- doc/js/full_list.js
|
188
|
+
- doc/js/jquery.js
|
189
|
+
- doc/method_list.html
|
190
|
+
- doc/top-level-namespace.html
|
130
191
|
- lib/tasks/calendars.rake
|
131
192
|
- lib/tasks/timeboss.rake
|
132
193
|
- lib/timeboss.rb
|
@@ -137,13 +198,16 @@ files:
|
|
137
198
|
- lib/timeboss/calendar/parser.rb
|
138
199
|
- lib/timeboss/calendar/period.rb
|
139
200
|
- lib/timeboss/calendar/quarter.rb
|
201
|
+
- lib/timeboss/calendar/support.rb
|
140
202
|
- lib/timeboss/calendar/support/formatter.rb
|
141
|
-
- lib/timeboss/calendar/support/month_based.rb
|
142
203
|
- lib/timeboss/calendar/support/month_basis.rb
|
204
|
+
- lib/timeboss/calendar/support/monthly_unit.rb
|
143
205
|
- lib/timeboss/calendar/support/navigable.rb
|
144
206
|
- lib/timeboss/calendar/support/shiftable.rb
|
145
207
|
- lib/timeboss/calendar/support/unit.rb
|
146
208
|
- lib/timeboss/calendar/waypoints.rb
|
209
|
+
- lib/timeboss/calendar/waypoints/absolute.rb
|
210
|
+
- lib/timeboss/calendar/waypoints/relative.rb
|
147
211
|
- lib/timeboss/calendar/week.rb
|
148
212
|
- lib/timeboss/calendar/year.rb
|
149
213
|
- lib/timeboss/calendars.rb
|
@@ -152,7 +216,7 @@ files:
|
|
152
216
|
- lib/timeboss/version.rb
|
153
217
|
- spec/calendar/day_spec.rb
|
154
218
|
- spec/calendar/quarter_spec.rb
|
155
|
-
- spec/calendar/support/
|
219
|
+
- spec/calendar/support/monthly_unit_spec.rb
|
156
220
|
- spec/calendar/support/unit_spec.rb
|
157
221
|
- spec/calendar/week_spec.rb
|
158
222
|
- spec/calendars/broadcast_spec.rb
|
@@ -178,15 +242,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
178
242
|
- !ruby/object:Gem::Version
|
179
243
|
version: '0'
|
180
244
|
requirements: []
|
181
|
-
|
182
|
-
rubygems_version: 2.7.7
|
245
|
+
rubygems_version: 3.0.8
|
183
246
|
signing_key:
|
184
247
|
specification_version: 4
|
185
248
|
summary: Broadcast Calendar navigation in Ruby made simple
|
186
249
|
test_files:
|
187
250
|
- spec/calendar/day_spec.rb
|
188
251
|
- spec/calendar/quarter_spec.rb
|
189
|
-
- spec/calendar/support/
|
252
|
+
- spec/calendar/support/monthly_unit_spec.rb
|
190
253
|
- spec/calendar/support/unit_spec.rb
|
191
254
|
- spec/calendar/week_spec.rb
|
192
255
|
- spec/calendars/broadcast_spec.rb
|