fat_core 0.5.3 → 0.6.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7bb57601c694dcca084b7e0cedf6122267fae07d
4
- data.tar.gz: 935cca77deba0bc578dd5ea6d0548b97bfb835e9
3
+ metadata.gz: 66c342d6384a15e67820f179df257c234d77810d
4
+ data.tar.gz: 23a1da18e31c2f77adbd4455206dfe1b54326bb9
5
5
  SHA512:
6
- metadata.gz: 1efe0764bc17f809d64bad67adf09ded6a21e2db79371f3821a48658c284699597d8c48b61d1437981e1d019023d73ffb16a5d7082323fc6b64988944722dd8c
7
- data.tar.gz: 6376076ec020b330a5b35a58d26d73c4030f4d7643be3dbb0c6076e12e34588c4c1fa7be2e22ee7a1d9d146487048a8eb6cfa817990f684a971931c0e22c6053
6
+ metadata.gz: d91ffaf07b1f4353dead0e81b03da11cd311a1a95fc3a0ed92f488336c85b4cbbfd92ee40d4db05ab165f93a7e0b6c6655373bd5963ecc00fbce90a6bac34fb5
7
+ data.tar.gz: 2f8d2eff64ae74ad5d51f2d2cdc3493a514f21464b4efd5d33881566f8003df7fb48e121b78055f7c995e2696fe565a193fa6cf4dcd40336a53e718b20eaace8
data/fat_core.gemspec CHANGED
@@ -7,7 +7,7 @@ Gem::Specification.new do |spec|
7
7
  spec.name = "fat_core"
8
8
  spec.version = FatCore::VERSION
9
9
  spec.authors = ["Daniel E. Doherty"]
10
- spec.email = ["ded-law@ddoherty.net"]
10
+ spec.email = ["ded@ddoherty.net"]
11
11
  spec.summary = %q{fat_core provides some useful core extensions}
12
12
  spec.description = %q{Write a longer description. Optional.}
13
13
  spec.homepage = ""
data/lib/fat_core/date.rb CHANGED
@@ -104,6 +104,22 @@ class Date
104
104
  quarter = $1.to_i
105
105
  date = Date.new(this_year, quarter * 3, 15)
106
106
  spec_type == :from ? date.beginning_of_quarter : date.end_of_quarter
107
+ when /^(\d\d\d\d)-(\d)[Hh]$/, /^(\d\d\d\d)-[Hh](\d)$/
108
+ # Year-Half
109
+ year = $1.to_i
110
+ half = $2.to_i
111
+ unless [1, 2].include?(half)
112
+ raise ArgumentError, "bad date format: #{spec}"
113
+ end
114
+ month = half * 6
115
+ spec_type == :from ? Date.new(year, month, 15).beginning_of_half :
116
+ Date.new(year, month, 1).end_of_half
117
+ when /^([12])[hH]$/, /^[hH]([12])$/
118
+ # Half only
119
+ this_year = today.year
120
+ half = $1.to_i
121
+ date = Date.new(this_year, half * 6, 15)
122
+ spec_type == :from ? date.beginning_of_half : date.end_of_half
107
123
  when /^(\d\d\d\d)-(\d\d?)*$/
108
124
  # Year-Month only
109
125
  spec_type == :from ? Date.new($1.to_i, $2.to_i, 1) :
@@ -149,6 +165,11 @@ class Date
149
165
  when /^last_?quarter/
150
166
  spec_type == :from ? (today - 3.months).beginning_of_quarter :
151
167
  (today - 3.months).end_of_quarter
168
+ when /^(this_?)?half/
169
+ spec_type == :from ? today.beginning_of_half : today.end_of_half
170
+ when /^last_?half/
171
+ spec_type == :from ? (today - 6.months).beginning_of_half :
172
+ (today - 6.months).end_of_half
152
173
  when /^(this_?)?year/
153
174
  spec_type == :from ? today.beginning_of_year : today.end_of_year
154
175
  when /^last_?year/
@@ -216,6 +237,16 @@ class Date
216
237
  !weekend?
217
238
  end
218
239
 
240
+ # Self's calendar half: 1 or 2
241
+ def half
242
+ case month
243
+ when (1..6)
244
+ 1
245
+ when (7..12)
246
+ 2
247
+ end
248
+ end
249
+
219
250
  # Self's calendar quarter: 1, 2, 3, or 4
220
251
  def quarter
221
252
  case month
@@ -230,6 +261,28 @@ class Date
230
261
  end
231
262
  end
232
263
 
264
+ # The date that is the first day of the half-year in which self falls.
265
+ def beginning_of_half
266
+ if month > 9
267
+ (beginning_of_quarter - 15).beginning_of_quarter
268
+ elsif month > 6
269
+ beginning_of_quarter
270
+ else
271
+ beginning_of_year
272
+ end
273
+ end
274
+
275
+ # The date that is the last day of the half-year in which self falls.
276
+ def end_of_half
277
+ if month < 4
278
+ (end_of_quarter + 15).end_of_quarter
279
+ elsif month < 7
280
+ end_of_quarter
281
+ else
282
+ end_of_year
283
+ end
284
+ end
285
+
233
286
  # The date that is the first day of the bimonth in which self
234
287
  # falls. A 'bimonth' is a two-month calendar period beginning on the
235
288
  # first day of the odd-numbered months. E.g., 2014-01-01 to
@@ -304,6 +357,14 @@ class Date
304
357
  end_of_year == self
305
358
  end
306
359
 
360
+ def beginning_of_half?
361
+ beginning_of_half == self
362
+ end
363
+
364
+ def end_of_half?
365
+ end_of_half == self
366
+ end
367
+
307
368
  def beginning_of_quarter?
308
369
  beginning_of_quarter == self
309
370
  end
@@ -363,6 +424,8 @@ class Date
363
424
  case chunk
364
425
  when :year
365
426
  next_year
427
+ when :half
428
+ next_month(6)
366
429
  when :quarter
367
430
  next_month(3)
368
431
  when :bimonth
@@ -386,6 +449,8 @@ class Date
386
449
  case sym
387
450
  when :year
388
451
  beginning_of_year
452
+ when :half
453
+ beginning_of_half
389
454
  when :quarter
390
455
  beginning_of_quarter
391
456
  when :bimonth
@@ -409,6 +474,8 @@ class Date
409
474
  case sym
410
475
  when :year
411
476
  end_of_year
477
+ when :half
478
+ end_of_half
412
479
  when :quarter
413
480
  end_of_quarter
414
481
  when :bimonth
@@ -1,7 +1,7 @@
1
1
  module FatCore
2
2
  MAJOR = 0
3
- MINOR = 5
4
- PATCH = 3
3
+ MINOR = 6
4
+ PATCH = 0
5
5
 
6
6
  VERSION = [MAJOR, MINOR, PATCH].compact.join('.')
7
7
  end
@@ -237,6 +237,22 @@ describe Date do
237
237
  }.to raise_error
238
238
  end
239
239
 
240
+ it "should parse year-half specs such as YYYY-NH or YYYY-HN" do
241
+ expect(Date.parse_spec('2011-2H', :from)).to eq Date.parse('2011-07-01')
242
+ expect(Date.parse_spec('2011-2H', :to)).to eq Date.parse('2011-12-31')
243
+ expect(Date.parse_spec('2011-H1', :from)).to eq Date.parse('2011-01-01')
244
+ expect(Date.parse_spec('2011-H1', :to)).to eq Date.parse('2011-06-30')
245
+ expect { Date.parse_spec('2011-3H') }.to raise_error
246
+ end
247
+
248
+ it "should parse half-only specs such as NQ or QN" do
249
+ expect(Date.parse_spec('2H', :from)).to eq Date.parse('2012-07-01')
250
+ expect(Date.parse_spec('H2', :to)).to eq Date.parse('2012-12-31')
251
+ expect(Date.parse_spec('1H', :from)).to eq Date.parse('2012-01-01')
252
+ expect(Date.parse_spec('H1', :to)).to eq Date.parse('2012-06-30')
253
+ expect { Date.parse_spec('8H') }.to raise_error
254
+ end
255
+
240
256
  it "should parse year-quarter specs such as YYYY-NQ or YYYY-QN" do
241
257
  expect(Date.parse_spec('2011-4Q', :from)).to eq Date.parse('2011-10-01')
242
258
  expect(Date.parse_spec('2011-4Q', :to)).to eq Date.parse('2011-12-31')
@@ -333,6 +349,14 @@ describe Date do
333
349
  expect(Date.parse_spec('last_quarter', :to)).to eq Date.parse('2012-06-30')
334
350
  end
335
351
 
352
+ # Today is set to '2012-07-18'
353
+ it "should parse relative halves: this_half, last_half" do
354
+ expect(Date.parse_spec('this_half')).to eq Date.parse('2012-07-01')
355
+ expect(Date.parse_spec('this_half', :to)).to eq Date.parse('2012-12-31')
356
+ expect(Date.parse_spec('last_half')).to eq Date.parse('2012-01-01')
357
+ expect(Date.parse_spec('last_half', :to)).to eq Date.parse('2012-06-30')
358
+ end
359
+
336
360
  it "should parse relative years: this_year, last_year" do
337
361
  expect(Date.parse_spec('this_year')).to eq Date.parse('2012-01-01')
338
362
  expect(Date.parse_spec('this_year', :to)).to eq Date.parse('2012-12-31')
@@ -426,6 +450,16 @@ describe Date do
426
450
  expect(Date.parse('2013-12-30')).to_not be_end_of_year
427
451
  end
428
452
 
453
+ it "should know about halves" do
454
+ expect(Date.parse('2013-01-01')).to be_beginning_of_half
455
+ expect(Date.parse('2013-12-31')).to be_end_of_half
456
+ expect(Date.parse('2013-07-01')).to be_beginning_of_half
457
+ expect(Date.parse('2013-06-30')).to be_end_of_half
458
+ expect(Date.parse('2013-05-01')).to_not be_beginning_of_half
459
+ expect(Date.parse('2013-05-01').half).to eq(1)
460
+ expect(Date.parse('2013-07-31').half).to eq(2)
461
+ end
462
+
429
463
  it "should know about quarters" do
430
464
  expect(Date.parse('2013-01-01')).to be_beginning_of_quarter
431
465
  expect(Date.parse('2013-12-31')).to be_end_of_quarter
@@ -486,6 +520,7 @@ describe Date do
486
520
 
487
521
  it "should know the beginning of chunks" do
488
522
  expect(Date.parse('2013-11-04').beginning_of_chunk(:year)).to eq Date.parse('2013-01-01')
523
+ expect(Date.parse('2013-11-04').beginning_of_chunk(:half)).to eq Date.parse('2013-07-01')
489
524
  expect(Date.parse('2013-11-04').beginning_of_chunk(:quarter)).to eq Date.parse('2013-10-01')
490
525
  expect(Date.parse('2013-12-04').beginning_of_chunk(:bimonth)).to eq Date.parse('2013-11-01')
491
526
  expect(Date.parse('2013-11-04').beginning_of_chunk(:month)).to eq Date.parse('2013-11-01')
@@ -501,6 +536,7 @@ describe Date do
501
536
  it "should be able to add a chuck sym to itself" do
502
537
  # Date.today is '2012-07-18'
503
538
  expect(Date.today.add_chunk(:year)).to eq(Date.parse('2013-07-18'))
539
+ expect(Date.today.add_chunk(:half)).to eq(Date.parse('2013-01-18'))
504
540
  expect(Date.today.add_chunk(:quarter)).to eq(Date.parse('2012-10-18'))
505
541
  expect(Date.today.add_chunk(:bimonth)).to eq(Date.parse('2012-09-18'))
506
542
  expect(Date.today.add_chunk(:month)).to eq(Date.parse('2012-08-18'))
@@ -516,6 +552,7 @@ describe Date do
516
552
 
517
553
  it "should know the end of chunks" do
518
554
  expect(Date.parse('2013-07-04').end_of_chunk(:year)).to eq Date.parse('2013-12-31')
555
+ expect(Date.parse('2013-05-04').end_of_chunk(:half)).to eq Date.parse('2013-06-30')
519
556
  expect(Date.parse('2013-07-04').end_of_chunk(:quarter)).to eq Date.parse('2013-09-30')
520
557
  expect(Date.parse('2013-12-04').end_of_chunk(:bimonth)).to eq Date.parse('2013-12-31')
521
558
  expect(Date.parse('2013-07-04').end_of_chunk(:month)).to eq Date.parse('2013-07-31')
@@ -530,6 +567,7 @@ describe Date do
530
567
 
531
568
  it "should know how to expand to chunk periods" do
532
569
  expect(Date.parse('2013-07-04').expand_to_period(:year)).to eq Period.new('2013-01-01', '2013-12-31')
570
+ expect(Date.parse('2013-07-04').expand_to_period(:half)).to eq Period.new('2013-07-01', '2013-12-31')
533
571
  expect(Date.parse('2013-07-04').expand_to_period(:quarter)).to eq Period.new('2013-07-01', '2013-09-30')
534
572
  expect(Date.parse('2013-07-04').expand_to_period(:bimonth)).to eq Period.new('2013-07-01', '2013-08-31')
535
573
  expect(Date.parse('2013-07-04').expand_to_period(:month)).to eq Period.new('2013-07-01', '2013-07-31')
@@ -41,7 +41,7 @@ describe Period do
41
41
  end
42
42
  end
43
43
 
44
- describe "class methods" do
44
+ describe 'class methods' do
45
45
  it 'should be able to parse a period spec' do
46
46
  pd = Period.parse
47
47
  expect(pd.first).to eq(Date.parse('2012-01-01'))
@@ -51,6 +51,38 @@ describe Period do
51
51
  expect(pd.first).to eq(Date.parse('2012-07-01'))
52
52
  expect(pd.last).to eq(Date.parse('2012-12-31'))
53
53
 
54
+ pd = Period.parse('from 2Q')
55
+ expect(pd.first).to eq(Date.parse('2012-04-01'))
56
+ expect(pd.last).to eq(Date.parse('2012-06-30'))
57
+
58
+ pd = Period.parse('to 3Q')
59
+ expect(pd.first).to eq(Date.parse('2012-07-01'))
60
+ expect(pd.last).to eq(Date.parse('2012-09-30'))
61
+
62
+ pd = Period.parse('to 2012-2Q')
63
+ expect(pd.first).to eq(Date.parse('2012-04-01'))
64
+ expect(pd.last).to eq(Date.parse('2012-06-30'))
65
+
66
+ pd = Period.parse('from 2012-1Q')
67
+ expect(pd.first).to eq(Date.parse('2012-01-01'))
68
+ expect(pd.last).to eq(Date.parse('2012-03-31'))
69
+
70
+ pd = Period.parse('from 2H')
71
+ expect(pd.first).to eq(Date.parse('2012-07-01'))
72
+ expect(pd.last).to eq(Date.parse('2012-12-31'))
73
+
74
+ pd = Period.parse('to 1H')
75
+ expect(pd.first).to eq(Date.parse('2012-01-01'))
76
+ expect(pd.last).to eq(Date.parse('2012-06-30'))
77
+
78
+ pd = Period.parse('to 2012-2H')
79
+ expect(pd.first).to eq(Date.parse('2012-07-01'))
80
+ expect(pd.last).to eq(Date.parse('2012-12-31'))
81
+
82
+ pd = Period.parse('from 2012-1H')
83
+ expect(pd.first).to eq(Date.parse('2012-01-01'))
84
+ expect(pd.last).to eq(Date.parse('2012-06-30'))
85
+
54
86
  pd = Period.parse('to 2012')
55
87
  expect(pd.first).to eq(Date.parse('2012-01-01'))
56
88
  expect(pd.last).to eq(Date.parse('2012-12-31'))
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fat_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.3
4
+ version: 0.6.0
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: 2015-10-02 00:00:00.000000000 Z
11
+ date: 2016-03-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: simplecov
@@ -166,7 +166,7 @@ dependencies:
166
166
  version: '0'
167
167
  description: Write a longer description. Optional.
168
168
  email:
169
- - ded-law@ddoherty.net
169
+ - ded@ddoherty.net
170
170
  executables:
171
171
  - easters
172
172
  extensions: []