fat_period 1.0.2 → 1.0.3
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/README.org +10 -2125
- data/lib/fat_period/period.rb +132 -58
- data/lib/fat_period/version.rb +1 -1
- metadata +3 -3
data/lib/fat_period/period.rb
CHANGED
@@ -73,6 +73,64 @@ class Period
|
|
73
73
|
# Period from commercial beginning of time to commercial end of time.
|
74
74
|
FOREVER = Period.new(Date::BOT, Date::EOT)
|
75
75
|
|
76
|
+
# @group Parsing
|
77
|
+
#
|
78
|
+
# Return a period based on two date specs passed as strings (see
|
79
|
+
# `FatCore::Date.parse_spec`), a 'from' and a 'to' spec. The returned period
|
80
|
+
# begins on the first day of the period given as the `from` spec and ends on
|
81
|
+
# the last day given as the `to` spec. If the to spec is not given or is nil,
|
82
|
+
# the from spec is used for both the from- and to-spec.
|
83
|
+
#
|
84
|
+
# @example
|
85
|
+
# Period.parse('2014-11').inspect #=> Period('2014-11-01..2014-11-30')
|
86
|
+
# Period.parse('2014-11', '2015-3Q').inspect #=> Period('2014-11-01..2015-09-30')
|
87
|
+
# # Assuming this executes in December, 2014
|
88
|
+
# Period.parse('last_month', 'this_month').inspect #=> Period('2014-11-01..2014-12-31')
|
89
|
+
#
|
90
|
+
# @param from [String] spec ala FatCore::Date.parse_spec
|
91
|
+
# @param to [String] spec ala FatCore::Date.parse_spec
|
92
|
+
# @return [Period] from beginning of `from` to end of `to`
|
93
|
+
def self.parse(from, to = nil)
|
94
|
+
raise ArgumentError, 'Period.parse missing argument' unless from
|
95
|
+
|
96
|
+
to ||= from
|
97
|
+
first = Date.parse_spec(from, :from)
|
98
|
+
second = Date.parse_spec(to, :to)
|
99
|
+
Period.new(first, second) if first && second
|
100
|
+
end
|
101
|
+
|
102
|
+
# Return a period as in `Period.parse` from a String phrase in which the from
|
103
|
+
# spec is introduced with 'from' and, optionally, the to spec is introduced
|
104
|
+
# with 'to'. A phrase with only a to spec is treated the same as one with
|
105
|
+
# only a from spec. If neither 'from' nor 'to' appear in phrase, treat the
|
106
|
+
# whole string as a from spec.
|
107
|
+
#
|
108
|
+
# @example
|
109
|
+
# Period.parse_phrase('from 2014-11 to 2015-3Q') #=> Period('2014-11-01..2015-09-30')
|
110
|
+
# Period.parse_phrase('from 2014-11') #=> Period('2014-11-01..2014-11-30')
|
111
|
+
# Period.parse_phrase('from 2015-3Q') #=> Period('2015-09-01..2015-12-31')
|
112
|
+
# Period.parse_phrase('to 2015-3Q') #=> Period('2015-09-01..2015-12-31')
|
113
|
+
# Period.parse_phrase('2015-3Q') #=> Period('2015-09-01..2015-12-31')
|
114
|
+
#
|
115
|
+
# @param phrase [String] with 'from <spec> to <spec>'
|
116
|
+
# @return [Period] translated from phrase
|
117
|
+
def self.parse_phrase(phrase)
|
118
|
+
phrase = phrase.clean
|
119
|
+
if phrase =~ /\Afrom (.*) to (.*)\z/
|
120
|
+
from_phrase = $1
|
121
|
+
to_phrase = $2
|
122
|
+
elsif phrase =~ /\Afrom (.*)\z/
|
123
|
+
from_phrase = $1
|
124
|
+
to_phrase = nil
|
125
|
+
elsif phrase =~ /\Ato (.*)\z/
|
126
|
+
from_phrase = $1
|
127
|
+
else
|
128
|
+
from_phrase = phrase
|
129
|
+
to_phrase = nil
|
130
|
+
end
|
131
|
+
parse(from_phrase, to_phrase)
|
132
|
+
end
|
133
|
+
|
76
134
|
# @group Conversion
|
77
135
|
|
78
136
|
# Convert this Period to a Range.
|
@@ -206,64 +264,6 @@ class Period
|
|
206
264
|
(days / days_in_year.to_f).to_f
|
207
265
|
end
|
208
266
|
|
209
|
-
# @group Parsing
|
210
|
-
#
|
211
|
-
# Return a period based on two date specs passed as strings (see
|
212
|
-
# `FatCore::Date.parse_spec`), a 'from' and a 'to' spec. The returned period
|
213
|
-
# begins on the first day of the period given as the `from` spec and ends on
|
214
|
-
# the last day given as the `to` spec. If the to spec is not given or is nil,
|
215
|
-
# the from spec is used for both the from- and to-spec.
|
216
|
-
#
|
217
|
-
# @example
|
218
|
-
# Period.parse('2014-11').inspect #=> Period('2014-11-01..2014-11-30')
|
219
|
-
# Period.parse('2014-11', '2015-3Q').inspect #=> Period('2014-11-01..2015-09-30')
|
220
|
-
# # Assuming this executes in December, 2014
|
221
|
-
# Period.parse('last_month', 'this_month').inspect #=> Period('2014-11-01..2014-12-31')
|
222
|
-
#
|
223
|
-
# @param from [String] spec ala FatCore::Date.parse_spec
|
224
|
-
# @param to [String] spec ala FatCore::Date.parse_spec
|
225
|
-
# @return [Period] from beginning of `from` to end of `to`
|
226
|
-
def self.parse(from, to = nil)
|
227
|
-
raise ArgumentError, 'Period.parse missing argument' unless from
|
228
|
-
|
229
|
-
to ||= from
|
230
|
-
first = Date.parse_spec(from, :from)
|
231
|
-
second = Date.parse_spec(to, :to)
|
232
|
-
Period.new(first, second) if first && second
|
233
|
-
end
|
234
|
-
|
235
|
-
# Return a period as in `Period.parse` from a String phrase in which the from
|
236
|
-
# spec is introduced with 'from' and, optionally, the to spec is introduced
|
237
|
-
# with 'to'. A phrase with only a to spec is treated the same as one with
|
238
|
-
# only a from spec. If neither 'from' nor 'to' appear in phrase, treat the
|
239
|
-
# whole string as a from spec.
|
240
|
-
#
|
241
|
-
# @example
|
242
|
-
# Period.parse_phrase('from 2014-11 to 2015-3Q') #=> Period('2014-11-01..2015-09-30')
|
243
|
-
# Period.parse_phrase('from 2014-11') #=> Period('2014-11-01..2014-11-30')
|
244
|
-
# Period.parse_phrase('from 2015-3Q') #=> Period('2015-09-01..2015-12-31')
|
245
|
-
# Period.parse_phrase('to 2015-3Q') #=> Period('2015-09-01..2015-12-31')
|
246
|
-
# Period.parse_phrase('2015-3Q') #=> Period('2015-09-01..2015-12-31')
|
247
|
-
#
|
248
|
-
# @param phrase [String] with 'from <spec> to <spec>'
|
249
|
-
# @return [Period] translated from phrase
|
250
|
-
def self.parse_phrase(phrase)
|
251
|
-
phrase = phrase.clean
|
252
|
-
if phrase =~ /\Afrom (.*) to (.*)\z/
|
253
|
-
from_phrase = $1
|
254
|
-
to_phrase = $2
|
255
|
-
elsif phrase =~ /\Afrom (.*)\z/
|
256
|
-
from_phrase = $1
|
257
|
-
to_phrase = nil
|
258
|
-
elsif phrase =~ /\Ato (.*)\z/
|
259
|
-
from_phrase = $1
|
260
|
-
else
|
261
|
-
from_phrase = phrase
|
262
|
-
to_phrase = nil
|
263
|
-
end
|
264
|
-
parse(from_phrase, to_phrase)
|
265
|
-
end
|
266
|
-
|
267
267
|
# Possibly useful class method to take an array of periods and join all the
|
268
268
|
# contiguous ones, then return an array of the disjoint periods not
|
269
269
|
# contiguous to one another. An array of periods with no gaps should return
|
@@ -304,6 +304,80 @@ class Period
|
|
304
304
|
half: (180..183), year: (365..366)
|
305
305
|
}.freeze
|
306
306
|
|
307
|
+
# Return a period representing a chunk containing a given Date.
|
308
|
+
def self.day_containing(date)
|
309
|
+
Period.new(date, date)
|
310
|
+
end
|
311
|
+
|
312
|
+
def self.week_containing(date)
|
313
|
+
Period.new(date.beginning_of_week, date.end_of_week)
|
314
|
+
end
|
315
|
+
|
316
|
+
def self.biweek_containing(date)
|
317
|
+
Period.new(date.beginning_of_biweek, date.end_of_biweek)
|
318
|
+
end
|
319
|
+
|
320
|
+
def self.semimonth_containing(date)
|
321
|
+
Period.new(date.beginning_of_semimonth, date.end_of_semimonth)
|
322
|
+
end
|
323
|
+
|
324
|
+
def self.month_containing(date)
|
325
|
+
Period.new(date.beginning_of_month, date.end_of_month)
|
326
|
+
end
|
327
|
+
|
328
|
+
def self.bimonth_containing(date)
|
329
|
+
Period.new(date.beginning_of_bimonth, date.end_of_bimonth)
|
330
|
+
end
|
331
|
+
|
332
|
+
def self.quarter_containing(date)
|
333
|
+
Period.new(date.beginning_of_quarter, date.end_of_quarter)
|
334
|
+
end
|
335
|
+
|
336
|
+
def self.half_containing(date)
|
337
|
+
Period.new(date.beginning_of_half, date.end_of_half)
|
338
|
+
end
|
339
|
+
|
340
|
+
def self.year_containing(date)
|
341
|
+
Period.new(date.beginning_of_year, date.end_of_year)
|
342
|
+
end
|
343
|
+
|
344
|
+
# Return a Period representing a chunk containing today.
|
345
|
+
def self.this_day
|
346
|
+
day_containing(Date.current)
|
347
|
+
end
|
348
|
+
|
349
|
+
def self.this_week
|
350
|
+
week_containing(Date.current)
|
351
|
+
end
|
352
|
+
|
353
|
+
def self.this_biweek
|
354
|
+
biweek_containing(Date.current)
|
355
|
+
end
|
356
|
+
|
357
|
+
def self.this_semimonth
|
358
|
+
semimonth_containing(Date.current)
|
359
|
+
end
|
360
|
+
|
361
|
+
def self.this_month
|
362
|
+
month_containing(Date.current)
|
363
|
+
end
|
364
|
+
|
365
|
+
def self.this_bimonth
|
366
|
+
bimonth_containing(Date.current)
|
367
|
+
end
|
368
|
+
|
369
|
+
def self.this_quarter
|
370
|
+
quarter_containing(Date.current)
|
371
|
+
end
|
372
|
+
|
373
|
+
def self.this_half
|
374
|
+
half_containing(Date.current)
|
375
|
+
end
|
376
|
+
|
377
|
+
def self.this_year
|
378
|
+
year_containing(Date.current)
|
379
|
+
end
|
380
|
+
|
307
381
|
# Return the chunk symbol represented by this period if it covers a single
|
308
382
|
# calendar period; otherwise return :irregular.
|
309
383
|
#
|
data/lib/fat_period/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fat_period
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel E. Doherty
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-02-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -147,7 +147,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
147
147
|
- !ruby/object:Gem::Version
|
148
148
|
version: '0'
|
149
149
|
requirements: []
|
150
|
-
rubygems_version: 3.
|
150
|
+
rubygems_version: 3.0.3
|
151
151
|
signing_key:
|
152
152
|
specification_version: 4
|
153
153
|
summary: Implements a Period class as a Range of Dates.
|