fat_core 4.8.3 → 4.9.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/.rubocop.yml +16 -3
- data/.travis.yml +1 -1
- data/Gemfile +1 -0
- data/lib/fat_core/all.rb +2 -0
- data/lib/fat_core/array.rb +3 -1
- data/lib/fat_core/bigdecimal.rb +2 -0
- data/lib/fat_core/date.rb +91 -46
- data/lib/fat_core/enumerable.rb +6 -1
- data/lib/fat_core/hash.rb +3 -0
- data/lib/fat_core/kernel.rb +2 -0
- data/lib/fat_core/nil.rb +3 -1
- data/lib/fat_core/numeric.rb +13 -10
- data/lib/fat_core/patches.rb +2 -0
- data/lib/fat_core/range.rb +9 -4
- data/lib/fat_core/string.rb +9 -5
- data/lib/fat_core/symbol.rb +3 -1
- data/lib/fat_core/version.rb +4 -2
- data/spec/lib/date_spec.rb +16 -0
- metadata +6 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b4ec4463c5e5a2ba5718fea513be1cf2f01aba020205b05688a24b5e8d08c3a4
|
4
|
+
data.tar.gz: 4133d30f997f69bacacc5975c85deb7614b7c95571aea1166a02fd204c984169
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fb8fc88f40ca65406599bce7d26e4ef1d3b804369813ec708664c7ef3265fe03fc548066ed1bcae0639a2ea007e46bba352c838350ad5c8d16eabaeede02f092
|
7
|
+
data.tar.gz: e53428dd7cd1cf4ae7c532f455a5c9fc6ec8d106e5f60f7c0f46e621ee97126ae48954862485727a3c0abdc42f70bdeb5bb32587e5c29eca893edad268333546
|
data/.rubocop.yml
CHANGED
@@ -1,3 +1,16 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
inherit_gem:
|
2
|
+
rubocop-shopify: rubocop.yml
|
3
|
+
|
4
|
+
AllCops:
|
5
|
+
TargetRubyVersion: 2.7
|
6
|
+
Exclude:
|
7
|
+
- 'test/tmp/**/*'
|
8
|
+
- 'vendor/bundle/**/*'
|
9
|
+
|
10
|
+
Style/MethodCallWithArgsParentheses:
|
11
|
+
Exclude:
|
12
|
+
- '**/Gemfile'
|
13
|
+
|
14
|
+
Style/ClassAndModuleChildren:
|
15
|
+
Exclude:
|
16
|
+
- 'test/**/*'
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/lib/fat_core/all.rb
CHANGED
data/lib/fat_core/array.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module FatCore
|
2
4
|
module Array
|
3
5
|
# Return the index of the last element of this Array. This is just a
|
4
6
|
# convenience for an oft-needed Array attribute.
|
5
7
|
def last_i
|
6
|
-
|
8
|
+
size - 1
|
7
9
|
end
|
8
10
|
|
9
11
|
# Return a new Array that is the intersection of this Array with +other+,
|
data/lib/fat_core/bigdecimal.rb
CHANGED
data/lib/fat_core/date.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'date'
|
2
4
|
require 'active_support/core_ext/date'
|
3
5
|
require 'active_support/core_ext/time'
|
@@ -106,7 +108,7 @@ module FatCore
|
|
106
108
|
# form.
|
107
109
|
# @return [String]
|
108
110
|
def american
|
109
|
-
strftime
|
111
|
+
strftime('%-m/%-d/%Y')
|
110
112
|
end
|
111
113
|
|
112
114
|
# :category: Queries
|
@@ -117,7 +119,7 @@ module FatCore
|
|
117
119
|
# Self's calendar "half" by analogy to calendar quarters: 1 or 2, depending
|
118
120
|
# on whether the date falls in the first or second half of the calendar
|
119
121
|
# year.
|
120
|
-
# @return [
|
122
|
+
# @return [Integer]
|
121
123
|
def half
|
122
124
|
case month
|
123
125
|
when (1..6)
|
@@ -131,7 +133,7 @@ module FatCore
|
|
131
133
|
|
132
134
|
# Self's calendar quarter: 1, 2, 3, or 4, depending on which calendar quarter
|
133
135
|
# the date falls in.
|
134
|
-
# @return [
|
136
|
+
# @return [Integer]
|
135
137
|
def quarter
|
136
138
|
case month
|
137
139
|
when (1..3)
|
@@ -147,7 +149,7 @@ module FatCore
|
|
147
149
|
|
148
150
|
# Self's calendar bimonth: 1, 2, 3, 4, 5, or 6 depending on which calendar
|
149
151
|
# bimonth the date falls in.
|
150
|
-
# @return [
|
152
|
+
# @return [Integer]
|
151
153
|
def bimonth
|
152
154
|
case month
|
153
155
|
when (1..2)
|
@@ -857,7 +859,7 @@ module FatCore
|
|
857
859
|
::Date.parse('2012-12-24'),
|
858
860
|
# And Trump
|
859
861
|
::Date.parse('2018-12-24'),
|
860
|
-
::Date.parse('2019-12-24')
|
862
|
+
::Date.parse('2019-12-24'),
|
861
863
|
].freeze
|
862
864
|
|
863
865
|
# Presidential funeral since JFK
|
@@ -877,7 +879,7 @@ module FatCore
|
|
877
879
|
# GTF Funeral
|
878
880
|
::Date.parse('2007-01-02'),
|
879
881
|
# GHWBFuneral
|
880
|
-
::Date.parse('2018-12-05')
|
882
|
+
::Date.parse('2018-12-05'),
|
881
883
|
].freeze
|
882
884
|
|
883
885
|
# Return whether this date is a United States federal holiday.
|
@@ -1115,7 +1117,7 @@ module FatCore
|
|
1115
1117
|
def nyse_workday?
|
1116
1118
|
!nyse_holiday?
|
1117
1119
|
end
|
1118
|
-
|
1120
|
+
alias_method :trading_day?, :nyse_workday?
|
1119
1121
|
|
1120
1122
|
# Return the date that is n NYSE trading days after or before (if n < 0) this
|
1121
1123
|
# date.
|
@@ -1134,7 +1136,7 @@ module FatCore
|
|
1134
1136
|
end
|
1135
1137
|
d
|
1136
1138
|
end
|
1137
|
-
|
1139
|
+
alias_method :add_trading_days, :add_nyse_workdays
|
1138
1140
|
|
1139
1141
|
# Return the next NYSE trading day after this date. The date returned is always
|
1140
1142
|
# a date at least one day after this date, never this date.
|
@@ -1143,7 +1145,7 @@ module FatCore
|
|
1143
1145
|
def next_nyse_workday
|
1144
1146
|
add_nyse_workdays(1)
|
1145
1147
|
end
|
1146
|
-
|
1148
|
+
alias_method :next_trading_day, :next_nyse_workday
|
1147
1149
|
|
1148
1150
|
# Return the last NYSE trading day before this date. The date returned is always
|
1149
1151
|
# a date at least one day before this date, never this date.
|
@@ -1152,7 +1154,7 @@ module FatCore
|
|
1152
1154
|
def prior_nyse_workday
|
1153
1155
|
add_nyse_workdays(-1)
|
1154
1156
|
end
|
1155
|
-
|
1157
|
+
alias_method :prior_trading_day, :prior_nyse_workday
|
1156
1158
|
|
1157
1159
|
# Return this date if its a trading day, otherwise skip forward to the first
|
1158
1160
|
# later trading day.
|
@@ -1212,11 +1214,15 @@ module FatCore
|
|
1212
1214
|
# MLK's Birthday (Third Monday in Jan) since 1998
|
1213
1215
|
year >= 1998 && nth_wday_in_month?(3, 1, 1)
|
1214
1216
|
when 2
|
1215
|
-
#
|
1216
|
-
#
|
1217
|
-
|
1218
|
-
|
1219
|
-
|
1217
|
+
# Washington's Birthday was celebrated on February 22 until 1970. In
|
1218
|
+
# 1971 and later, it was moved to the third Monday in February. Note:
|
1219
|
+
# Lincoln's birthday is not an official holiday, but is sometimes
|
1220
|
+
# included with Washington's and called "Presidents' Day."
|
1221
|
+
if year <= 1970
|
1222
|
+
month == 2 && day == 22
|
1223
|
+
else
|
1224
|
+
nth_wday_in_month?(3, 1, 2)
|
1225
|
+
end
|
1220
1226
|
when 3, 4
|
1221
1227
|
# Good Friday
|
1222
1228
|
if !friday?
|
@@ -1419,7 +1425,7 @@ module FatCore
|
|
1419
1425
|
#
|
1420
1426
|
# @param spec [String, #to_s] the spec to be interpreted as a calendar period
|
1421
1427
|
#
|
1422
|
-
# @param spec_type [:from, :to] return the first (:from) or last (:to)
|
1428
|
+
# @param spec_type [Symbol, :from, :to] return the first (:from) or last (:to)
|
1423
1429
|
# date in the spec's period respectively
|
1424
1430
|
#
|
1425
1431
|
# @return [::Date] date that is the first (:from) or last (:to) in the period
|
@@ -1432,11 +1438,12 @@ module FatCore
|
|
1432
1438
|
|
1433
1439
|
today = ::Date.current
|
1434
1440
|
case spec.clean
|
1435
|
-
when %r{\A(
|
1441
|
+
when %r{\A(?<yr>\d\d\d\d)[-/](?<mo>\d\d?)[-/](?<dy>\d\d?)\z}
|
1436
1442
|
# A specified date
|
1437
|
-
::Date.new(
|
1438
|
-
|
1439
|
-
|
1443
|
+
::Date.new(Regexp.last_match[:yr].to_i, Regexp.last_match[:mo].to_i,
|
1444
|
+
Regexp.last_match[:dy].to_i)
|
1445
|
+
when /\AW(?<wk>\d\d?)\z/, /\A(?<wk>\d\d?)W\z/
|
1446
|
+
week_num = Regexp.last_match[:wk].to_i
|
1440
1447
|
if week_num < 1 || week_num > 53
|
1441
1448
|
raise ArgumentError, "invalid week number (1-53): '#{spec}'"
|
1442
1449
|
end
|
@@ -1446,9 +1453,9 @@ module FatCore
|
|
1446
1453
|
else
|
1447
1454
|
::Date.commercial(today.year, week_num).end_of_week
|
1448
1455
|
end
|
1449
|
-
when %r{\A(
|
1450
|
-
year =
|
1451
|
-
week_num =
|
1456
|
+
when %r{\A(?<yr>\d\d\d\d)[-/]W(?<wk>\d\d?)\z}, %r{\A(?<yr>\d\d\d\d)[-/](?<wk>\d\d?)W\z}
|
1457
|
+
year = Regexp.last_match[:yr].to_i
|
1458
|
+
week_num = Regexp.last_match[:wk].to_i
|
1452
1459
|
if week_num < 1 || week_num > 53
|
1453
1460
|
raise ArgumentError, "invalid week number (1-53): '#{spec}'"
|
1454
1461
|
end
|
@@ -1458,10 +1465,10 @@ module FatCore
|
|
1458
1465
|
else
|
1459
1466
|
::Date.commercial(year, week_num).end_of_week
|
1460
1467
|
end
|
1461
|
-
when %r{^(
|
1468
|
+
when %r{^(?<yr>\d\d\d\d)[-/](?<qt>\d)[Qq]$}, %r{^(?<yr>\d\d\d\d)[-/][Qq](?<qt>\d)$}
|
1462
1469
|
# Year-Quarter
|
1463
|
-
year =
|
1464
|
-
quarter =
|
1470
|
+
year = Regexp.last_match[:yr].to_i
|
1471
|
+
quarter = Regexp.last_match[:qt].to_i
|
1465
1472
|
unless [1, 2, 3, 4].include?(quarter)
|
1466
1473
|
raise ArgumentError, "invalid quarter number (1-4): '#{spec}'"
|
1467
1474
|
end
|
@@ -1472,10 +1479,10 @@ module FatCore
|
|
1472
1479
|
else
|
1473
1480
|
::Date.new(year, month, 1).end_of_quarter
|
1474
1481
|
end
|
1475
|
-
when /^([1234])[qQ]$/, /^[qQ]([1234])$/
|
1482
|
+
when /^(?<qt>[1234])[qQ]$/, /^[qQ](?<qt>[1234])$/
|
1476
1483
|
# Quarter only
|
1477
1484
|
this_year = today.year
|
1478
|
-
quarter =
|
1485
|
+
quarter = Regexp.last_match[:qt].to_i
|
1479
1486
|
unless [1, 2, 3, 4].include?(quarter)
|
1480
1487
|
raise ArgumentError, "invalid quarter number (1-4): '#{spec}'"
|
1481
1488
|
end
|
@@ -1486,10 +1493,10 @@ module FatCore
|
|
1486
1493
|
else
|
1487
1494
|
date.end_of_quarter
|
1488
1495
|
end
|
1489
|
-
when %r{^(
|
1496
|
+
when %r{^(?<yr>\d\d\d\d)[-/](?<hf>\d)[Hh]$}, %r{^(?<yr>\d\d\d\d)[-/][Hh](?<hf>\d)$}
|
1490
1497
|
# Year-Half
|
1491
|
-
year =
|
1492
|
-
half =
|
1498
|
+
year = Regexp.last_match[:yr].to_i
|
1499
|
+
half = Regexp.last_match[:hf].to_i
|
1493
1500
|
msg = "invalid half number: '#{spec}'"
|
1494
1501
|
raise ArgumentError, msg unless [1, 2].include?(half)
|
1495
1502
|
|
@@ -1499,10 +1506,10 @@ module FatCore
|
|
1499
1506
|
else
|
1500
1507
|
::Date.new(year, month, 1).end_of_half
|
1501
1508
|
end
|
1502
|
-
when /^([12])[hH]$/, /^[hH]([12])$/
|
1509
|
+
when /^(?<hf>[12])[hH]$/, /^[hH](?<hf>[12])$/
|
1503
1510
|
# Half only
|
1504
1511
|
this_year = today.year
|
1505
|
-
half =
|
1512
|
+
half = Regexp.last_match[:hf].to_i
|
1506
1513
|
msg = "invalid half number: '#{spec}'"
|
1507
1514
|
raise ArgumentError, msg unless [1, 2].include?(half)
|
1508
1515
|
|
@@ -1512,10 +1519,10 @@ module FatCore
|
|
1512
1519
|
else
|
1513
1520
|
date.end_of_half
|
1514
1521
|
end
|
1515
|
-
when %r{^(
|
1522
|
+
when %r{^(?<yr>\d\d\d\d)[-/](?<mo>\d\d?)*$}
|
1516
1523
|
# Year-Month only
|
1517
|
-
year =
|
1518
|
-
month =
|
1524
|
+
year = Regexp.last_match[:yr].to_i
|
1525
|
+
month = Regexp.last_match[:mo].to_i
|
1519
1526
|
unless [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12].include?(month)
|
1520
1527
|
raise ArgumentError, "invalid month number (1-12): '#{spec}'"
|
1521
1528
|
end
|
@@ -1525,10 +1532,10 @@ module FatCore
|
|
1525
1532
|
else
|
1526
1533
|
::Date.new(year, month, 1).end_of_month
|
1527
1534
|
end
|
1528
|
-
when %r{^(
|
1535
|
+
when %r{^(?<mo>\d\d?)[-/](?<dy>\d\d?)*$}
|
1529
1536
|
# Month-Day only
|
1530
|
-
month =
|
1531
|
-
day =
|
1537
|
+
month = Regexp.last_match[:mo].to_i
|
1538
|
+
day = Regexp.last_match[:dy].to_i
|
1532
1539
|
unless [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12].include?(month)
|
1533
1540
|
raise ArgumentError, "invalid month number (1-12): '#{spec}'"
|
1534
1541
|
end
|
@@ -1538,9 +1545,9 @@ module FatCore
|
|
1538
1545
|
else
|
1539
1546
|
::Date.new(today.year, month, day).end_of_month
|
1540
1547
|
end
|
1541
|
-
when /\A(
|
1548
|
+
when /\A(?<mo>\d\d?)\z/
|
1542
1549
|
# Month only
|
1543
|
-
month =
|
1550
|
+
month = Regexp.last_match[:mo].to_i
|
1544
1551
|
unless [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12].include?(month)
|
1545
1552
|
raise ArgumentError, "invalid month number (1-12): '#{spec}'"
|
1546
1553
|
end
|
@@ -1550,12 +1557,13 @@ module FatCore
|
|
1550
1557
|
else
|
1551
1558
|
::Date.new(today.year, month, 1).end_of_month
|
1552
1559
|
end
|
1553
|
-
when /^(
|
1560
|
+
when /^(?<yr>\d\d\d\d)$/
|
1554
1561
|
# Year only
|
1562
|
+
year = Regexp.last_match[:yr].to_i
|
1555
1563
|
if spec_type == :from
|
1556
|
-
::Date.new(
|
1564
|
+
::Date.new(year, 1, 1)
|
1557
1565
|
else
|
1558
|
-
::Date.new(
|
1566
|
+
::Date.new(year, 12, 31)
|
1559
1567
|
end
|
1560
1568
|
when /^(to|this_?)?day/
|
1561
1569
|
today
|
@@ -1679,6 +1687,43 @@ module FatCore
|
|
1679
1687
|
end
|
1680
1688
|
end
|
1681
1689
|
|
1690
|
+
# Return the 1-indexed integer that corresponds to a month name.
|
1691
|
+
#
|
1692
|
+
# @param name [String] a name of a month
|
1693
|
+
#
|
1694
|
+
# @return [Integer] the integer integer that corresponds to a month
|
1695
|
+
# name, or nil of no month recognized.
|
1696
|
+
def mo_name_to_num(name)
|
1697
|
+
case name.clean
|
1698
|
+
when /\Ajan/i
|
1699
|
+
1
|
1700
|
+
when /\Afeb/i
|
1701
|
+
2
|
1702
|
+
when /\Amar/i
|
1703
|
+
3
|
1704
|
+
when /\Aapr/i
|
1705
|
+
4
|
1706
|
+
when /\Amay/i
|
1707
|
+
5
|
1708
|
+
when /\Ajun/i
|
1709
|
+
6
|
1710
|
+
when /\Ajul/i
|
1711
|
+
7
|
1712
|
+
when /\Aaug/i
|
1713
|
+
8
|
1714
|
+
when /\Asep/i
|
1715
|
+
9
|
1716
|
+
when /\Aoct/i
|
1717
|
+
10
|
1718
|
+
when /\Anov/i
|
1719
|
+
11
|
1720
|
+
when /\Adec/i
|
1721
|
+
12
|
1722
|
+
else
|
1723
|
+
nil
|
1724
|
+
end
|
1725
|
+
end
|
1726
|
+
|
1682
1727
|
# Return the nth weekday in the given month. If n is negative, count from
|
1683
1728
|
# last day of month.
|
1684
1729
|
#
|
@@ -1744,8 +1789,8 @@ module FatCore
|
|
1744
1789
|
# Ensure that date is of class Date based either on a string or Date
|
1745
1790
|
# object.
|
1746
1791
|
#
|
1747
|
-
# @param dat [String
|
1748
|
-
# @return [Date]
|
1792
|
+
# @param dat [String, Date, Time] the object to be converted to Date
|
1793
|
+
# @return [Date, DateTime]
|
1749
1794
|
def ensure_date(dat)
|
1750
1795
|
case dat
|
1751
1796
|
when String
|
data/lib/fat_core/enumerable.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Enumerable
|
2
4
|
# Yield items in groups of n, for each group yield the group number, starting
|
3
5
|
# with zero and an Array of n items, or all remaining items if less than n.
|
@@ -8,7 +10,10 @@ module Enumerable
|
|
8
10
|
# end
|
9
11
|
def groups_of(num)
|
10
12
|
k = -1
|
11
|
-
group_by
|
13
|
+
group_by do
|
14
|
+
k += 1
|
15
|
+
k.div(num)
|
16
|
+
end
|
12
17
|
end
|
13
18
|
|
14
19
|
# Yield each item together with two booleans that indicate whether the item is
|
data/lib/fat_core/hash.rb
CHANGED
data/lib/fat_core/kernel.rb
CHANGED
data/lib/fat_core/nil.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module FatCore
|
2
4
|
module NilClass
|
3
5
|
# Allow nils to respond to #as_string like String and Symbol
|
@@ -6,7 +8,7 @@ module FatCore
|
|
6
8
|
def as_string
|
7
9
|
''
|
8
10
|
end
|
9
|
-
|
11
|
+
alias_method :entitle, :as_string
|
10
12
|
|
11
13
|
# Allow nils to respond to #tex_quote for use in TeX documents
|
12
14
|
#
|
data/lib/fat_core/numeric.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'fat_core/patches'
|
2
4
|
require 'active_support/core_ext/object/blank'
|
3
5
|
|
@@ -74,11 +76,11 @@ module FatCore
|
|
74
76
|
end
|
75
77
|
|
76
78
|
# Break the number into parts; underscores are possible in all components.
|
77
|
-
str =~ /\A([-+])?([\d_]*)((\.)?([\d_]*))?([eE][+-]?[\d_]+)?\z/
|
78
|
-
sig =
|
79
|
-
whole =
|
80
|
-
frac =
|
81
|
-
exp =
|
79
|
+
str =~ /\A(?<sg>[-+])?(?<wh>[\d_]*)((\.)?(?<fr>[\d_]*))?(?<ex>x[eE][+-]?[\d_]+)?\z/
|
80
|
+
sig = Regexp.last_match[:sg] || ''
|
81
|
+
whole = Regexp.last_match[:wh] ? Regexp.last_match[:wh].delete('_') : ''
|
82
|
+
frac = Regexp.last_match[:fr] || ''
|
83
|
+
exp = Regexp.last_match[:ex] || ''
|
82
84
|
|
83
85
|
# Pad out the fractional part with zeroes to the right
|
84
86
|
unless places.nil?
|
@@ -133,12 +135,13 @@ module FatCore
|
|
133
135
|
mins, secs = divmod(60)
|
134
136
|
hrs, mins = mins.divmod(60)
|
135
137
|
if frac.round(5) > 0.0
|
136
|
-
'%02<hrs>d:%02<mins>d:%02<secs>d.%<frac>d'
|
137
|
-
|
138
|
-
|
138
|
+
format('%02<hrs>d:%02<mins>d:%02<secs>d.%<frac>d',
|
139
|
+
{ hrs: hrs,
|
140
|
+
mins: mins, secs: secs,
|
141
|
+
frac: frac.round(5) * 100 })
|
139
142
|
else
|
140
|
-
'%02<hrs>d:%02<mins>d:%02<secs>d'
|
141
|
-
|
143
|
+
format('%02<hrs>d:%02<mins>d:%02<secs>d',
|
144
|
+
{ hrs: hrs, mins: mins, secs: secs })
|
142
145
|
end
|
143
146
|
end
|
144
147
|
|
data/lib/fat_core/patches.rb
CHANGED
data/lib/fat_core/range.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# FatCore extends the Range class with methods that
|
2
4
|
#
|
3
5
|
# 1. provide some set operations operations on Ranges, union, intersection, and
|
@@ -130,7 +132,7 @@ module FatCore
|
|
130
132
|
|
131
133
|
([min, other.min].max..[max, other.max].min)
|
132
134
|
end
|
133
|
-
|
135
|
+
alias_method :&, :intersection
|
134
136
|
|
135
137
|
# Return a Range that represents the union between this range and the
|
136
138
|
# `other` range. If there is no overlap and self is not contiguous with
|
@@ -148,13 +150,16 @@ module FatCore
|
|
148
150
|
|
149
151
|
([min, other.min].min..[max, other.max].max)
|
150
152
|
end
|
151
|
-
|
153
|
+
alias_method :+, :union
|
152
154
|
|
153
155
|
# The difference method, -, removes the overlapping part of the other
|
154
156
|
# argument from self. Because in the case where self is a superset of the
|
155
157
|
# other range, this will result in the difference being two non-contiguous
|
156
158
|
# ranges, this returns an array of ranges. If there is no overlap or if
|
157
159
|
# self is a subset of the other range, return an array of self
|
160
|
+
#
|
161
|
+
# @param other [Range] the Range whose overlap is removed from self
|
162
|
+
# @return [Array<Range>] the Ranges representing self with other removed
|
158
163
|
def difference(other)
|
159
164
|
unless max.respond_to?(:succ) && min.respond_to?(:pred) &&
|
160
165
|
other.max.respond_to?(:succ) && other.min.respond_to?(:pred)
|
@@ -182,7 +187,7 @@ module FatCore
|
|
182
187
|
[(min..isec.min.pred), (isec.max.succ..max)]
|
183
188
|
end
|
184
189
|
end
|
185
|
-
|
190
|
+
alias_method :-, :difference
|
186
191
|
|
187
192
|
# Allow erb or erubis documents to directly interpolate a Range.
|
188
193
|
#
|
@@ -375,7 +380,7 @@ module FatCore
|
|
375
380
|
# (4..8) <=> (4..8) #=> 0
|
376
381
|
#
|
377
382
|
# @param other [Range] range to compare self with
|
378
|
-
# @return [-1, 0, 1] if self is less, equal, or greater than other
|
383
|
+
# @return [Integer, -1, 0, 1] if self is less, equal, or greater than other
|
379
384
|
def <=>(other)
|
380
385
|
[min, max] <=> other.minmax
|
381
386
|
end
|
data/lib/fat_core/string.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'bigdecimal'
|
2
4
|
require 'fat_core/patches'
|
3
5
|
require 'damerau-levenshtein'
|
@@ -49,14 +51,14 @@ module FatCore
|
|
49
51
|
#
|
50
52
|
# @return [String] self wrapped
|
51
53
|
def wrap(width = 70, hang = 0)
|
52
|
-
result =
|
54
|
+
result = ::String.new
|
53
55
|
first_line = true
|
54
56
|
first_word_on_line = true
|
55
57
|
line_width_so_far = 0
|
56
58
|
words = split(' ')
|
57
59
|
words.each do |w|
|
58
|
-
w = ' ' * hang + w if !first_line && first_word_on_line
|
59
|
-
w = ' ' + w unless first_word_on_line
|
60
|
+
w = ::String.new(' ') * hang + w if !first_line && first_word_on_line
|
61
|
+
w = ::String.new(' ') + w unless first_word_on_line
|
60
62
|
result << w
|
61
63
|
first_word_on_line = false
|
62
64
|
line_width_so_far += 1 + w.length
|
@@ -104,8 +106,10 @@ module FatCore
|
|
104
106
|
#
|
105
107
|
# @return [Date] the translated Date
|
106
108
|
def as_date
|
107
|
-
if self =~ %r{(
|
108
|
-
::Date.new(
|
109
|
+
if self =~ %r{(?<yr>\d\d\d\d)[-/]?(?<mo>\d\d?)[-/]?(?<dy>\d\d?)}
|
110
|
+
::Date.new(Regexp.last_match[:yr].to_i,
|
111
|
+
Regexp.last_match[:mo].to_i,
|
112
|
+
Regexp.last_match[:dy].to_i)
|
109
113
|
end
|
110
114
|
end
|
111
115
|
|
data/lib/fat_core/symbol.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'fat_core/string'
|
2
4
|
|
3
5
|
module FatCore
|
@@ -14,7 +16,7 @@ module FatCore
|
|
14
16
|
def as_string
|
15
17
|
to_s.tr('_', ' ').split(' ').join(' ').entitle
|
16
18
|
end
|
17
|
-
|
19
|
+
alias_method :entitle, :as_string
|
18
20
|
|
19
21
|
# Return self. This (together with String#as_sym) allows `#as_sym` to be
|
20
22
|
# applied to a string or Symbol and get back a Symbol with out testing for
|
data/lib/fat_core/version.rb
CHANGED
data/spec/lib/date_spec.rb
CHANGED
@@ -425,6 +425,22 @@ describe Date do
|
|
425
425
|
expect(Date.parse_spec('forever', :to)).to eq Date::EOT
|
426
426
|
expect(Date.parse_spec('never')).to be_nil
|
427
427
|
end
|
428
|
+
|
429
|
+
it 'should be able to convert a month name into its sequential number' do
|
430
|
+
expect(Date.mo_name_to_num(' January')).to eq 1
|
431
|
+
expect(Date.mo_name_to_num(' feb ')).to eq 2
|
432
|
+
expect(Date.mo_name_to_num(' mAr ')).to eq 3
|
433
|
+
expect(Date.mo_name_to_num(' Aprol ')).to eq 4
|
434
|
+
expect(Date.mo_name_to_num("\t \tmaybe")).to eq 5
|
435
|
+
expect(Date.mo_name_to_num("\t \tjunta\t \t")).to eq 6
|
436
|
+
expect(Date.mo_name_to_num("\t \tjulia\t \t")).to eq 7
|
437
|
+
expect(Date.mo_name_to_num("\t \tAugustus\t \t")).to eq 8
|
438
|
+
expect(Date.mo_name_to_num("September")).to eq 9
|
439
|
+
expect(Date.mo_name_to_num("octagon")).to eq 10
|
440
|
+
expect(Date.mo_name_to_num(" novena this month")).to eq 11
|
441
|
+
expect(Date.mo_name_to_num("decimal")).to eq 12
|
442
|
+
expect(Date.mo_name_to_num(" dewey decimal")).to be nil
|
443
|
+
end
|
428
444
|
end
|
429
445
|
end
|
430
446
|
|
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: 4.
|
4
|
+
version: 4.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel E. Doherty
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-02-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: simplecov
|
@@ -218,7 +218,7 @@ licenses:
|
|
218
218
|
- MIT
|
219
219
|
metadata:
|
220
220
|
yard.run: yri
|
221
|
-
post_install_message:
|
221
|
+
post_install_message:
|
222
222
|
rdoc_options: []
|
223
223
|
require_paths:
|
224
224
|
- lib
|
@@ -233,9 +233,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
233
233
|
- !ruby/object:Gem::Version
|
234
234
|
version: '0'
|
235
235
|
requirements: []
|
236
|
-
|
237
|
-
|
238
|
-
signing_key:
|
236
|
+
rubygems_version: 3.2.3
|
237
|
+
signing_key:
|
239
238
|
specification_version: 4
|
240
239
|
summary: fat_core provides some useful core extensions
|
241
240
|
test_files:
|