timeboss 0.0.10 → 0.1.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.
- 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
|