timeboss 0.0.10 → 0.2.2

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
  SHA256:
3
- metadata.gz: a46b4d08fd0e17154dbb9f2f806d74e3e0dd83ad2a6dff04102dd5142a975809
4
- data.tar.gz: e231795ad178299e99475a03f7fc589d234373ce672f525653b9e67c209d00cc
3
+ metadata.gz: 9d4c953bb1ef449bdc7d37f0ac3061da752b28a9f4df8c1901f9507c447ac89b
4
+ data.tar.gz: 752abd38f0afee607b6529894eec4189dfbbc462f5a27ddb4a6238720db35b4e
5
5
  SHA512:
6
- metadata.gz: b4a01cd350e3df24190b5818e0cc71ea09b15e57ae73db9620e812b138b9badcb8acd8fb5fa33a35c52049e7893e37cf7a3beed40c8eebbbfddd46158d0ff72f
7
- data.tar.gz: 493dd68afa5bd7df4b49c36881946ef869844f538a791780da86a966988be349debd9077a35cb0f834a20b5f0920088da2547cac33de1ec7618783d5f8f69b74
6
+ metadata.gz: b1d04714bcb3514b386fda20f1aaad42f1db96382719848ef9ee5cf889b5c855a26bbb6c6039f50e08ce2484194924ceb8a2ee32f0242b1e3bbc928a9156a0b8
7
+ data.tar.gz: 1662c699fc80d9b37744a2f7f4fffa5d72e64d912bab4e19b1d113ba466a16201c003e32b26d1d8697da8c2feb21d4e16be344bc2bacdb2358f2a46ed6646c49
data/.gitignore CHANGED
@@ -1,3 +1,5 @@
1
- /*.gem
2
- /Gemfile.lock
3
- /.bundle
1
+ *.gem
2
+ Gemfile.lock
3
+ .bundle
4
+ .yardoc
5
+ doc
@@ -0,0 +1 @@
1
+ --protected lib/**/*.rb
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # TimeBoss [![Build Status](https://travis-ci.com/kevinstuffandthings/timeboss.svg?branch=master)](https://travis-ci.com/kevinstuffandthings/timeboss) [![Gem Version](https://badge.fury.io/rb/timeboss.svg)](https://badge.fury.io/rb/timeboss)
2
- A gem providing convenient navigation of the [Broadcast Calendar](https://en.wikipedia.org/wiki/Broadcast_calendar).
2
+
3
+ A gem providing convenient navigation of the [Broadcast Calendar](https://en.wikipedia.org/wiki/Broadcast_calendar), the standard Gregorian calendar, and is easily extensible to support multiple financial calendars.
4
+
3
5
  Originally developed for [Simulmedia](https://simulmedia.com).
4
6
 
5
7
  ## Installation
@@ -23,7 +25,7 @@ $ gem install timeboss
23
25
  ```
24
26
 
25
27
  ## Usage
26
- Supports `year`, `half`, `quarter`, `month`, `week`, and `day`.
28
+ Supports `year`, `half`, `quarter`, `month`, `week` (non-gregorian calendars only), and `day`.
27
29
 
28
30
  Prepare your calendar for use:
29
31
 
@@ -62,7 +64,7 @@ calendar.years_back(2).map { |y| y.start_date.to_s } # run in 2020
62
64
  calendar.months_ago(3).name # run in 2020M7
63
65
  # => "2020M4"
64
66
 
65
- calendar.weeks_hence(3).name # run in 2020W29
67
+ calendar.weeks_ahead(3).name # run in 2020W29
66
68
  # => "2020W32"
67
69
  ```
68
70
 
@@ -131,11 +133,16 @@ period = calendar.parse('2020W3..2020Q1')
131
133
  # => "2020W3 .. 2020Q1: from 2020-01-13 thru 2020-03-29 (current=false)"
132
134
  ```
133
135
 
134
- The examples above are just samples. Try different periods, operators, etc.
136
+ The examples above are just samples. Try different periods, operators, etc. All of the non-week-based operations will work similarly on the `TimeBoss::Calendars::Gregorian` calendar.
135
137
 
136
138
  ### Shell
137
139
  To open an IRB shell for the broadcast calendar, use the `tbsh` executable, or the `timeboss:calendars:broadcast:shell` rake task.
138
- You will find yourself in the context of an instantiated `TimeBoss::Calendars::Broadcast` object:
140
+
141
+ For the Gregorian calendar (or any other implemented calendars), supply the name on the command line.
142
+ - `tbsh gregorian`
143
+ - `rake timeboss:calendars:gregorian:shell`
144
+
145
+ You will find yourself in the context of an instantiated `TimeBoss::Calendar` object:
139
146
 
140
147
  ```bash
141
148
  $ tbsh
data/bin/tbsh CHANGED
@@ -4,7 +4,7 @@ require 'timeboss/calendars'
4
4
  require 'timeboss/support/shellable'
5
5
 
6
6
  calendar = if ARGV.length == 1
7
- TimeBoss::Calendars[ARGV.first]&.calendar
7
+ TimeBoss::Calendars[ARGV.first]
8
8
  else
9
9
  TimeBoss::Calendars.first.calendar
10
10
  end
@@ -1,2 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  require "timeboss/version"
3
+
4
+ # TimeBoss
5
+ module TimeBoss
6
+ end
@@ -9,16 +9,37 @@ require_relative './calendar/support/month_basis'
9
9
  module TimeBoss
10
10
  class Calendar
11
11
  include Waypoints
12
+
13
+ # @!method parse
14
+ # Parse an identifier into a unit or period.
15
+ # Valid identifiers can include simple units (like "2020Q3", "2020M8W3", "last_quarter"),
16
+ # mathematical expressions (like "this_month+6"),
17
+ # or period expressions (like "2020W1..2020W8", "this_quarter-2..next_quarter")
18
+ # @param identifier [String]
19
+ # @return [Support::Unit, Period]
20
+
12
21
  delegate :parse, to: :parser
13
22
 
23
+ # Get a name by which this calendar can be referenced.
24
+ # @return [String]
14
25
  def name
15
26
  self.class.to_s.demodulize.underscore
16
27
  end
17
28
 
29
+ # Get a friendly title for this calendar.
30
+ # @return [String]
18
31
  def title
19
32
  name.titleize
20
33
  end
21
34
 
35
+ # Can this calendar support weeks?
36
+ # For custom calendars, this value can generally not be overridden.
37
+ # But for calendars like our Gregorian implementation, weeks are irrelevant, and should be suppressed.
38
+ # @return [Boolean]
39
+ def supports_weeks?
40
+ true
41
+ end
42
+
22
43
  protected
23
44
 
24
45
  attr_reader :basis
@@ -8,22 +8,28 @@ module TimeBoss
8
8
  super(calendar, start_date, start_date)
9
9
  end
10
10
 
11
+ # Get a simple representation of this day.
12
+ # @return [String] (e.g. "2020-08-03")
11
13
  def name
12
14
  start_date.to_s
13
15
  end
14
16
 
17
+ # Get a "pretty" representation of this day.
18
+ # @return [String] (e.g. "August 3, 2020")
15
19
  def title
16
20
  start_date.strftime('%B %-d, %Y')
17
21
  end
18
22
 
19
- def to_s
20
- name
21
- end
23
+ alias_method :to_s, :name
22
24
 
25
+ # Get the index of this day within its containing year.
26
+ # @return [Integer]
23
27
  def index
24
28
  @_index ||= (start_date - year.start_date).to_i + 1
25
29
  end
26
30
 
31
+ # Get the year number for this day.
32
+ # @return [Integer] (e.g. 2020)
27
33
  def year_index
28
34
  @_year_index ||= year.year_index
29
35
  end
@@ -1,15 +1,19 @@
1
1
  # frozen_string_literal: true
2
- require_relative './support/month_based'
2
+ require_relative './support/monthly_unit'
3
3
 
4
4
  module TimeBoss
5
5
  class Calendar
6
- class Half < Support::MonthBased
6
+ class Half < Support::MonthlyUnit
7
7
  NUM_MONTHS = 6
8
8
 
9
+ # Get a simple representation of this half.
10
+ # @return [String] (e.g. "2020H2")
9
11
  def name
10
12
  "#{year_index}H#{index}"
11
13
  end
12
14
 
15
+ # Get a "pretty" representation of this half.
16
+ # @return [String] (e.g. "H2 2020")
13
17
  def title
14
18
  "H#{index} #{year_index}"
15
19
  end
@@ -1,15 +1,19 @@
1
1
  # frozen_string_literal: true
2
- require_relative './support/month_based'
2
+ require_relative './support/monthly_unit'
3
3
 
4
4
  module TimeBoss
5
5
  class Calendar
6
- class Month < Support::MonthBased
6
+ class Month < Support::MonthlyUnit
7
7
  NUM_MONTHS = 1
8
8
 
9
+ # Get a simple representation of this month.
10
+ # @return [String] (e.g. "2020M8")
9
11
  def name
10
12
  "#{year_index}M#{index}"
11
13
  end
12
14
 
15
+ # Get a "pretty" representation of this month.
16
+ # @return [String] (e.g. "August 2020")
13
17
  def title
14
18
  "#{Date::MONTHNAMES[index]} #{year_index}"
15
19
  end
@@ -3,9 +3,29 @@ module TimeBoss
3
3
  class Calendar
4
4
  class Period
5
5
  attr_reader :begin, :end
6
+
7
+ # @!method start_date
8
+ # Get the start date of this period.
9
+ # @return [Date]
6
10
  delegate :start_date, to: :begin
11
+
12
+ # @!method end_date
13
+ # Get the end date of this period.
14
+ # @return [Date]
7
15
  delegate :end_date, to: :end
8
16
 
17
+ # @!method name
18
+ # Get a simple representation of this period.
19
+ # @return [String]
20
+
21
+ # @!method title
22
+ # Get a "pretty" representation of this period.
23
+ # @return [String]
24
+
25
+ # @!method to_s
26
+ # Get a stringified representation of this period.
27
+ # @return [String]
28
+
9
29
  %i[name title to_s].each do |message|
10
30
  define_method(message) do
11
31
  text = self.begin.send(message)
@@ -14,7 +34,7 @@ module TimeBoss
14
34
  end
15
35
  end
16
36
 
17
- %w[week month quarter half year].each do |size|
37
+ %w[day week month quarter half year].each do |size|
18
38
  define_method(size.pluralize) do
19
39
  entry = calendar.send("#{size}_for", self.begin.start_date)
20
40
  build_entries entry
@@ -27,20 +47,14 @@ module TimeBoss
27
47
  end
28
48
  end
29
49
 
50
+ # Does this period cover the current date?
51
+ # @return [Boolean]
30
52
  def current?
31
53
  to_range.include?(Date.today)
32
54
  end
33
55
 
34
- def days
35
- to_range.map { |d| Day.new(calendar, d) }
36
- end
37
-
38
- def day
39
- entries = days
40
- return nil unless entries.length == 1
41
- entries.first
42
- end
43
-
56
+ # Express this period as a date range.
57
+ # @return [Range<Date, Date>]
44
58
  def to_range
45
59
  @_to_range ||= start_date .. end_date
46
60
  end
@@ -1,15 +1,19 @@
1
1
  # frozen_string_literal: true
2
- require_relative './support/month_based'
2
+ require_relative './support/monthly_unit'
3
3
 
4
4
  module TimeBoss
5
5
  class Calendar
6
- class Quarter < Support::MonthBased
6
+ class Quarter < Support::MonthlyUnit
7
7
  NUM_MONTHS = 3
8
8
 
9
+ # Get a simple representation of this quarter.
10
+ # @return [String] (e.g. "2020Q3")
9
11
  def name
10
12
  "#{year_index}Q#{index}"
11
13
  end
12
14
 
15
+ # Get a "pretty" representation of this quarter.
16
+ # @return [String] (e.g. "Q3 2020")
13
17
  def title
14
18
  "Q#{index} #{year_index}"
15
19
  end
@@ -1,18 +1,20 @@
1
1
  # frozen_string_literal: true
2
- require_relative './shiftable'
2
+ require_relative './translatable'
3
3
 
4
4
  module TimeBoss
5
5
  class Calendar
6
6
  module Support
7
7
  private
8
8
 
9
+ # The formatter is responsible for the implementation of name formatting for a unit.
9
10
  class Formatter
10
- PERIODS = Shiftable::PERIODS.reverse.map(&:to_sym).drop(1)
11
+ PERIODS = Translatable::PERIODS.reverse.map(&:to_sym).drop(1)
11
12
  attr_reader :unit, :periods
12
13
 
13
14
  def initialize(unit, periods)
14
15
  @unit = unit
15
16
  @periods = PERIODS & periods.map(&:to_sym).push(unit.class.type.to_sym)
17
+ @periods -= [:week] unless unit.calendar.supports_weeks?
16
18
  end
17
19
 
18
20
  def to_s
@@ -1,6 +1,7 @@
1
1
  module TimeBoss
2
2
  class Calendar
3
3
  module Support
4
+ # @abstract
4
5
  class MonthBasis
5
6
  attr_reader :year, :month
6
7
 
@@ -4,7 +4,7 @@ require_relative './unit'
4
4
  module TimeBoss
5
5
  class Calendar
6
6
  module Support
7
- class MonthBased < Unit
7
+ class MonthlyUnit < Unit
8
8
  attr_reader :year_index, :index
9
9
 
10
10
  def initialize(calendar, year_index, index, start_date, end_date)
@@ -13,10 +13,14 @@ module TimeBoss
13
13
  @index = index
14
14
  end
15
15
 
16
+ # Get a stringified representation of this unit.
17
+ # @return [String] (e.g. "2020Q3: 2020-06-29 thru 2020-09-27")
16
18
  def to_s
17
19
  "#{name}: #{start_date} thru #{end_date}"
18
20
  end
19
21
 
22
+ # Get a list of weeks contained within this period.
23
+ # @return [Array<Week>]
20
24
  def weeks
21
25
  base = calendar.year(year_index)
22
26
  num_weeks = (((base.end_date - base.start_date) + 1) / 7.0).to_i
@@ -3,24 +3,47 @@ module TimeBoss
3
3
  class Calendar
4
4
  module Support
5
5
  module Navigable
6
+ # @overload previous
7
+ # Fetch the previous unit relative to this unit.
8
+ # @return [Unit]
9
+ # @overload previous(value)
10
+ # Fetch some previous number of units relative to this unit
11
+ # @param quantity [Integer]
12
+ # @return [Array<Unit>]
6
13
  def previous(quantity = nil)
7
14
  return down if quantity.nil?
8
15
  gather(:previous, quantity).reverse
9
16
  end
10
17
 
18
+ # @overload next
19
+ # Fetch the next unit relative to this unit.
20
+ # @return [Unit]
21
+ # @overload next(value)
22
+ # Fetch some next number of units relative to this unit
23
+ # @param quantity [Integer]
24
+ # @return [Array<Unit>]
11
25
  def next(quantity = nil)
12
26
  return up if quantity.nil?
13
27
  gather(:next, quantity)
14
28
  end
15
29
 
30
+ # Fetch the unit some number of units prior to this unit.
31
+ # @param quantity [Integer]
32
+ # @return [Unit]
16
33
  def ago(quantity)
17
34
  previous(quantity + 1).first
18
35
  end
19
36
 
20
- def hence(quantity)
37
+ # Fetch the unit some number of units after this unit.
38
+ # @param quantity [Integer]
39
+ # @return [Unit]
40
+ def ahead(quantity)
21
41
  self.next(quantity + 1).last
22
42
  end
23
43
 
44
+ # Fetch a list of units from this unit until some date.
45
+ # @param end_date [Date]
46
+ # @return [Array<Unit>]
24
47
  def until(end_date)
25
48
  entry = self
26
49
  [entry].tap do |entries|
@@ -3,48 +3,238 @@ module TimeBoss
3
3
  class Calendar
4
4
  module Support
5
5
  module Shiftable
6
- PERIODS = %w[day week month quarter half year]
7
-
8
- PERIODS.each do |period|
6
+ Support::Translatable::PERIODS.each do |period|
9
7
  periods = period.pluralize
10
8
 
11
- define_method periods do
12
- calendar.send("#{periods}_for", self)
13
- end
14
-
15
- define_method period do
16
- entries = send(periods)
17
- return nil unless entries.length == 1
18
- entries.first
19
- end
20
-
21
- define_method "in_#{period}" do
9
+ define_method("in_#{period}") do
22
10
  base = send(periods)
23
11
  return unless base.length == 1
24
12
  base.first.send(self.class.type.to_s.pluralize).find_index { |p| p == self } + 1
25
13
  end
26
14
 
27
- define_method "#{periods}_ago" do |offset|
15
+ define_method("#{periods}_ago") do |offset|
28
16
  base_offset = send("in_#{period}") or return
29
17
  (calendar.send("this_#{period}") - offset).send(self.class.type.to_s.pluralize)[base_offset - 1]
30
18
  end
31
19
 
32
- define_method "last_#{period}" do
33
- send("#{periods}_ago", 1)
34
- end
20
+ define_method("#{periods}_ahead") { |o| send("#{periods}_ago", o * -1) }
35
21
 
36
- define_method "this_#{period}" do
37
- send("#{periods}_ago", 0)
38
- end
22
+ define_method("last_#{period}") { send("#{periods}_ago", 1) }
23
+ define_method("this_#{period}") { send("#{periods}_ago", 0) }
24
+ define_method("next_#{period}") { send("#{periods}_ahead", 1) }
25
+ end
39
26
 
40
- define_method "#{periods}_hence" do |offset|
41
- send("#{periods}_ago", offset * -1)
42
- end
27
+ alias_method :yesterday, :last_day
28
+ alias_method :today, :this_day
29
+ alias_method :tomorrow, :next_day
43
30
 
44
- define_method "next_#{period}" do
45
- send("#{periods}_hence", 1)
46
- end
47
- end
31
+ #
32
+ # i hate this
33
+ #
34
+
35
+ ### Days
36
+
37
+ # @!method in_day
38
+ # Get the index within the day that this unit falls in.
39
+ # Returns nil if no single day can be identified.
40
+ # @return [Integer, nil]
41
+
42
+ # @!method days_ago
43
+ # Get the index-relative day some number of days ago.
44
+ # Returns nil if no single day can be identified.
45
+ # @param offset [Integer] the number of days back to shift this period
46
+ # @return [Calendar::Day, nil]
47
+
48
+ # @!method days_ahead
49
+ # Get the index-relative day some number of days ahead.
50
+ # Returns nil if no single day can be identified.
51
+ # @param offset [Integer] the number of days forward to shift this period
52
+ # @return [Calendar::Day, nil]
53
+
54
+ # @!method last_day
55
+ # Get the index-relative day 1 day ago.
56
+ # Returns nil if no single day can be identified.
57
+ # @return [Calendar::Day, nil]
58
+
59
+ # @!method this_day
60
+ # Get the index-relative day for this day.
61
+ # Returns nil if no single day can be identified.
62
+ # @return [Calendar::Day, nil]
63
+
64
+ # @!method next_day
65
+ # Get the index-relative day 1 day forward.
66
+ # Returns nil if no single day can be identified.
67
+ # @return [Calendar::Day, nil]
68
+
69
+ ### Weeks
70
+
71
+ # @!method in_week
72
+ # Get the index within the week that this unit falls in.
73
+ # Returns nil if no single week can be identified.
74
+ # @return [Integer, nil]
75
+
76
+ # @!method weeks_ago
77
+ # Get the index-relative week some number of weeks ago.
78
+ # Returns nil if no single week can be identified.
79
+ # @param offset [Integer] the number of weeks back to shift this period
80
+ # @return [Calendar::Week, nil]
81
+
82
+ # @!method weeks_ahead
83
+ # Get the index-relative week some number of weeks ahead.
84
+ # Returns nil if no single week can be identified.
85
+ # @param offset [Integer] the number of weeks forward to shift this period
86
+ # @return [Calendar::Week, nil]
87
+
88
+ # @!method last_week
89
+ # Get the index-relative week 1 week ago.
90
+ # Returns nil if no single week can be identified.
91
+ # @return [Calendar::Week, nil]
92
+
93
+ # @!method this_week
94
+ # Get the index-relative week for this week.
95
+ # Returns nil if no single week can be identified.
96
+ # @return [Calendar::Week, nil]
97
+
98
+ # @!method next_week
99
+ # Get the index-relative week 1 week forward.
100
+ # Returns nil if no single week can be identified.
101
+ # @return [Calendar::Week, nil]
102
+
103
+ ### Months
104
+
105
+ # @!method in_month
106
+ # Get the index within the month that this unit falls in.
107
+ # Returns nil if no single month can be identified.
108
+ # @return [Integer, nil]
109
+
110
+ # @!method months_ago
111
+ # Get the index-relative month some number of months ago.
112
+ # Returns nil if no single month can be identified.
113
+ # @param offset [Integer] the number of months back to shift this period
114
+ # @return [Calendar::Month, nil]
115
+
116
+ # @!method months_ahead
117
+ # Get the index-relative month some number of months ahead.
118
+ # Returns nil if no single month can be identified.
119
+ # @param offset [Integer] the number of months forward to shift this period
120
+ # @return [Calendar::Month, nil]
121
+
122
+ # @!method last_month
123
+ # Get the index-relative month 1 month ago.
124
+ # Returns nil if no single month can be identified.
125
+ # @return [Calendar::Month, nil]
126
+
127
+ # @!method this_month
128
+ # Get the index-relative month for this month.
129
+ # Returns nil if no single month can be identified.
130
+ # @return [Calendar::Month, nil]
131
+
132
+ # @!method next_month
133
+ # Get the index-relative month 1 month forward.
134
+ # Returns nil if no single month can be identified.
135
+ # @return [Calendar::Month, nil]
136
+
137
+ ### Quarters
138
+
139
+ # @!method in_quarter
140
+ # Get the index within the quarter that this unit falls in.
141
+ # Returns nil if no single quarter can be identified.
142
+ # @return [Integer, nil]
143
+
144
+ # @!method quarters_ago
145
+ # Get the index-relative quarter some number of quarters ago.
146
+ # Returns nil if no single quarter can be identified.
147
+ # @param offset [Integer] the number of quarters back to shift this period
148
+ # @return [Calendar::Quarter, nil]
149
+
150
+ # @!method quarters_ahead
151
+ # Get the index-relative quarter some number of quarters ahead.
152
+ # Returns nil if no single quarter can be identified.
153
+ # @param offset [Integer] the number of quarters forward to shift this period
154
+ # @return [Calendar::Quarter, nil]
155
+
156
+ # @!method last_quarter
157
+ # Get the index-relative quarter 1 quarter ago.
158
+ # Returns nil if no single quarter can be identified.
159
+ # @return [Calendar::Quarter, nil]
160
+
161
+ # @!method this_quarter
162
+ # Get the index-relative quarter for this quarter.
163
+ # Returns nil if no single quarter can be identified.
164
+ # @return [Calendar::Quarter, nil]
165
+
166
+ # @!method next_quarter
167
+ # Get the index-relative quarter 1 quarter forward.
168
+ # Returns nil if no single quarter can be identified.
169
+ # @return [Calendar::Quarter, nil]
170
+
171
+ ### Halves
172
+
173
+ # @!method in_half
174
+ # Get the index within the half that this unit falls in.
175
+ # Returns nil if no single half can be identified.
176
+ # @return [Integer, nil]
177
+
178
+ # @!method halves_ago
179
+ # Get the index-relative half some number of halves ago.
180
+ # Returns nil if no single half can be identified.
181
+ # @param offset [Integer] the number of halves back to shift this period
182
+ # @return [Calendar::Half, nil]
183
+
184
+ # @!method halves_ahead
185
+ # Get the index-relative half some number of halves ahead.
186
+ # Returns nil if no single half can be identified.
187
+ # @param offset [Integer] the number of halves forward to shift this period
188
+ # @return [Calendar::Half, nil]
189
+
190
+ # @!method last_half
191
+ # Get the index-relative half 1 half ago.
192
+ # Returns nil if no single half can be identified.
193
+ # @return [Calendar::Half, nil]
194
+
195
+ # @!method this_half
196
+ # Get the index-relative half for this half.
197
+ # Returns nil if no single half can be identified.
198
+ # @return [Calendar::Half, nil]
199
+
200
+ # @!method next_half
201
+ # Get the index-relative half 1 half forward.
202
+ # Returns nil if no single half can be identified.
203
+ # @return [Calendar::Half, nil]
204
+
205
+ ### Years
206
+
207
+ # @!method in_year
208
+ # Get the index within the year that this unit falls in.
209
+ # Returns nil if no single year can be identified.
210
+ # @return [Integer, nil]
211
+
212
+ # @!method years_ago
213
+ # Get the index-relative year some number of years ago.
214
+ # Returns nil if no single year can be identified.
215
+ # @param offset [Integer] the number of years back to shift this period
216
+ # @return [Calendar::Year, nil]
217
+
218
+ # @!method years_ahead
219
+ # Get the index-relative year some number of years ahead.
220
+ # Returns nil if no single year can be identified.
221
+ # @param offset [Integer] the number of years forward to shift this period
222
+ # @return [Calendar::Year, nil]
223
+
224
+ # @!method last_year
225
+ # Get the index-relative year 1 year ago.
226
+ # Returns nil if no single year can be identified.
227
+ # @return [Calendar::Year, nil]
228
+
229
+ # @!method this_year
230
+ # Get the index-relative year for this year.
231
+ # Returns nil if no single year can be identified.
232
+ # @return [Calendar::Year, nil]
233
+
234
+ # @!method next_year
235
+ # Get the index-relative year 1 year forward.
236
+ # Returns nil if no single year can be identified.
237
+ # @return [Calendar::Year, nil]
48
238
  end
49
239
  end
50
240
  end