fat_core 4.8.2 → 4.9.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 626d8f221d0dc52dd3914d8a5b6a28d92211a90fb9d1851c650203c76f1a1cff
4
- data.tar.gz: 1cee79cbd3a51d530e95a8b52b994bdb430c9bb6a6630041f56564e3436fc5d6
3
+ metadata.gz: 8c7c63377c037bd7a5f79fa829b942f3e1d87985de7f5fe778a4e3211a31cde9
4
+ data.tar.gz: 612094bfa4667b800a0d677fee774d2d2a63e54bf2acee1db59c64d906f11ca8
5
5
  SHA512:
6
- metadata.gz: 8809c0b8ba8e2a4909ece3b7f4733e607d6a8c8a205e08f6e30ed9018659a1c8aa26dc177f909408fd54613cbb8563b5d4ed5a0fc5856cabed50b273803f0fcb
7
- data.tar.gz: 207bca7517f91e868b3f246a13d277d5a64bdd9c05a669b67b8f70d735261722f9d0ea6ab51d1a4f9d906696bb45f8015f2f85aa92bf07efd89618238dbde077
6
+ metadata.gz: 86f750f6fc63cacfdf659444a00db1ae07070a2133b347de5c4f943744678969f6c76a1c2ae3d92ce1dfb688ccffd922bd1f1fc3c72da70c18d3b19fa71f5408
7
+ data.tar.gz: 8d9aaad679c1d72869f89ea659cff2ddc321df7f2b9b6f1d167916fdc77fe0024ae6bae86d46dc336bcfafb426f3145dda6b24aab2fe95ed62e3d4bae6783235
data/.gitignore CHANGED
@@ -20,3 +20,4 @@ tmp
20
20
  /GTAGS
21
21
  /.rubocop_todo.yml
22
22
  /gtags.files
23
+ /.ruby-version
data/.rubocop.yml CHANGED
@@ -1,3 +1,19 @@
1
- inherit_from:
2
- - '~/.rubocop.yml'
3
- - '.rubocop_todo.yml'
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/**/*'
17
+
18
+ Style/StringLiterals:
19
+ Enabled: false
data/.travis.yml CHANGED
@@ -1,7 +1,7 @@
1
1
  language: ruby
2
2
  bundler_args: --without debug
3
3
  rvm:
4
- - 2.2.2
5
- - 2.3
6
- - 2.4
7
- - ruby-head
4
+ - 2.5
5
+ - 2.6
6
+ - 2.7
7
+ - 3.0
data/Gemfile CHANGED
@@ -1,5 +1,8 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
+ gem 'damerau-levenshtein', git: 'https://github.com/ddoherty03/damerau-levenshtein'
4
+ gem 'rubocop-shopify', require: false
5
+
3
6
  # Specify your gem's dependencies in fat_core.gemspec
4
7
  gemspec
5
8
 
data/fat_core.gemspec CHANGED
@@ -4,8 +4,6 @@ lib = File.expand_path('../lib', __FILE__)
4
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
  require 'fat_core/version'
6
6
 
7
- gem 'damerau-levenshtein', git: 'https://github.com/ddoherty03/damerau-levenshtein'
8
-
9
7
  Gem::Specification.new do |spec|
10
8
  spec.name = 'fat_core'
11
9
  spec.version = FatCore::VERSION
@@ -33,7 +31,8 @@ Gem::Specification.new do |spec|
33
31
  spec.add_development_dependency 'pry-doc'
34
32
  spec.add_development_dependency 'pry-byebug'
35
33
  spec.add_development_dependency 'redcarpet'
34
+ spec.add_development_dependency 'solargraph'
36
35
 
37
- spec.add_runtime_dependency 'activesupport'
36
+ spec.add_runtime_dependency 'activesupport', '~>6.0'
38
37
  spec.add_runtime_dependency 'damerau-levenshtein'
39
38
  end
data/lib/fat_core/all.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'fat_core/array'
2
4
  require 'fat_core/bigdecimal'
3
5
  require 'fat_core/date'
@@ -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
- self.size - 1
8
+ size - 1
7
9
  end
8
10
 
9
11
  # Return a new Array that is the intersection of this Array with +other+,
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bigdecimal'
2
4
 
3
5
  module FatCore
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 '%-m/%-d/%Y'
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 [1, 2]
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 [1, 2, 3, 4]
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 [1, 2, 3, 4, 5, 6]
152
+ # @return [Integer]
151
153
  def bimonth
152
154
  case month
153
155
  when (1..2)
@@ -857,7 +859,8 @@ 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'),
863
+ ::Date.parse('2020-12-24'),
861
864
  ].freeze
862
865
 
863
866
  # Presidential funeral since JFK
@@ -877,7 +880,7 @@ module FatCore
877
880
  # GTF Funeral
878
881
  ::Date.parse('2007-01-02'),
879
882
  # GHWBFuneral
880
- ::Date.parse('2018-12-05')
883
+ ::Date.parse('2018-12-05'),
881
884
  ].freeze
882
885
 
883
886
  # Return whether this date is a United States federal holiday.
@@ -1115,7 +1118,7 @@ module FatCore
1115
1118
  def nyse_workday?
1116
1119
  !nyse_holiday?
1117
1120
  end
1118
- alias trading_day? nyse_workday?
1121
+ alias_method :trading_day?, :nyse_workday?
1119
1122
 
1120
1123
  # Return the date that is n NYSE trading days after or before (if n < 0) this
1121
1124
  # date.
@@ -1134,7 +1137,7 @@ module FatCore
1134
1137
  end
1135
1138
  d
1136
1139
  end
1137
- alias add_trading_days add_nyse_workdays
1140
+ alias_method :add_trading_days, :add_nyse_workdays
1138
1141
 
1139
1142
  # Return the next NYSE trading day after this date. The date returned is always
1140
1143
  # a date at least one day after this date, never this date.
@@ -1143,7 +1146,7 @@ module FatCore
1143
1146
  def next_nyse_workday
1144
1147
  add_nyse_workdays(1)
1145
1148
  end
1146
- alias next_trading_day next_nyse_workday
1149
+ alias_method :next_trading_day, :next_nyse_workday
1147
1150
 
1148
1151
  # Return the last NYSE trading day before this date. The date returned is always
1149
1152
  # a date at least one day before this date, never this date.
@@ -1152,7 +1155,7 @@ module FatCore
1152
1155
  def prior_nyse_workday
1153
1156
  add_nyse_workdays(-1)
1154
1157
  end
1155
- alias prior_trading_day prior_nyse_workday
1158
+ alias_method :prior_trading_day, :prior_nyse_workday
1156
1159
 
1157
1160
  # Return this date if its a trading day, otherwise skip forward to the first
1158
1161
  # later trading day.
@@ -1212,11 +1215,15 @@ module FatCore
1212
1215
  # MLK's Birthday (Third Monday in Jan) since 1998
1213
1216
  year >= 1998 && nth_wday_in_month?(3, 1, 1)
1214
1217
  when 2
1215
- # Lincoln's birthday until 1953
1216
- # Washington's Birthday (Third Monday in Feb)
1217
- (year <= 1953 && month == 2 && day == 12) ||
1218
- (year <= 1970 ? (month == 2 && day == 22)
1219
- : nth_wday_in_month?(3, 1, 2))
1218
+ # Washington's Birthday was celebrated on February 22 until 1970. In
1219
+ # 1971 and later, it was moved to the third Monday in February. Note:
1220
+ # Lincoln's birthday is not an official holiday, but is sometimes
1221
+ # included with Washington's and called "Presidents' Day."
1222
+ if year <= 1970
1223
+ month == 2 && day == 22
1224
+ else
1225
+ nth_wday_in_month?(3, 1, 2)
1226
+ end
1220
1227
  when 3, 4
1221
1228
  # Good Friday
1222
1229
  if !friday?
@@ -1419,7 +1426,7 @@ module FatCore
1419
1426
  #
1420
1427
  # @param spec [String, #to_s] the spec to be interpreted as a calendar period
1421
1428
  #
1422
- # @param spec_type [:from, :to] return the first (:from) or last (:to)
1429
+ # @param spec_type [Symbol, :from, :to] return the first (:from) or last (:to)
1423
1430
  # date in the spec's period respectively
1424
1431
  #
1425
1432
  # @return [::Date] date that is the first (:from) or last (:to) in the period
@@ -1432,11 +1439,12 @@ module FatCore
1432
1439
 
1433
1440
  today = ::Date.current
1434
1441
  case spec.clean
1435
- when %r{\A(\d\d\d\d)[-/](\d\d?)[-/](\d\d?)\z}
1442
+ when %r{\A(?<yr>\d\d\d\d)[-/](?<mo>\d\d?)[-/](?<dy>\d\d?)\z}
1436
1443
  # A specified date
1437
- ::Date.new($1.to_i, $2.to_i, $3.to_i)
1438
- when /\AW(\d\d?)\z/, /\A(\d\d?)W\z/
1439
- week_num = $1.to_i
1444
+ ::Date.new(Regexp.last_match[:yr].to_i, Regexp.last_match[:mo].to_i,
1445
+ Regexp.last_match[:dy].to_i)
1446
+ when /\AW(?<wk>\d\d?)\z/, /\A(?<wk>\d\d?)W\z/
1447
+ week_num = Regexp.last_match[:wk].to_i
1440
1448
  if week_num < 1 || week_num > 53
1441
1449
  raise ArgumentError, "invalid week number (1-53): '#{spec}'"
1442
1450
  end
@@ -1446,9 +1454,9 @@ module FatCore
1446
1454
  else
1447
1455
  ::Date.commercial(today.year, week_num).end_of_week
1448
1456
  end
1449
- when %r{\A(\d\d\d\d)[-/]W(\d\d?)\z}, %r{\A(\d\d\d\d)[-/](\d\d?)W\z}
1450
- year = $1.to_i
1451
- week_num = $2.to_i
1457
+ 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}
1458
+ year = Regexp.last_match[:yr].to_i
1459
+ week_num = Regexp.last_match[:wk].to_i
1452
1460
  if week_num < 1 || week_num > 53
1453
1461
  raise ArgumentError, "invalid week number (1-53): '#{spec}'"
1454
1462
  end
@@ -1458,10 +1466,10 @@ module FatCore
1458
1466
  else
1459
1467
  ::Date.commercial(year, week_num).end_of_week
1460
1468
  end
1461
- when %r{^(\d\d\d\d)[-/](\d)[Qq]$}, %r{^(\d\d\d\d)[-/][Qq](\d)$}
1469
+ when %r{^(?<yr>\d\d\d\d)[-/](?<qt>\d)[Qq]$}, %r{^(?<yr>\d\d\d\d)[-/][Qq](?<qt>\d)$}
1462
1470
  # Year-Quarter
1463
- year = $1.to_i
1464
- quarter = $2.to_i
1471
+ year = Regexp.last_match[:yr].to_i
1472
+ quarter = Regexp.last_match[:qt].to_i
1465
1473
  unless [1, 2, 3, 4].include?(quarter)
1466
1474
  raise ArgumentError, "invalid quarter number (1-4): '#{spec}'"
1467
1475
  end
@@ -1472,10 +1480,10 @@ module FatCore
1472
1480
  else
1473
1481
  ::Date.new(year, month, 1).end_of_quarter
1474
1482
  end
1475
- when /^([1234])[qQ]$/, /^[qQ]([1234])$/
1483
+ when /^(?<qt>[1234])[qQ]$/, /^[qQ](?<qt>[1234])$/
1476
1484
  # Quarter only
1477
1485
  this_year = today.year
1478
- quarter = $1.to_i
1486
+ quarter = Regexp.last_match[:qt].to_i
1479
1487
  unless [1, 2, 3, 4].include?(quarter)
1480
1488
  raise ArgumentError, "invalid quarter number (1-4): '#{spec}'"
1481
1489
  end
@@ -1486,10 +1494,10 @@ module FatCore
1486
1494
  else
1487
1495
  date.end_of_quarter
1488
1496
  end
1489
- when %r{^(\d\d\d\d)[-/](\d)[Hh]$}, %r{^(\d\d\d\d)[-/][Hh](\d)$}
1497
+ when %r{^(?<yr>\d\d\d\d)[-/](?<hf>\d)[Hh]$}, %r{^(?<yr>\d\d\d\d)[-/][Hh](?<hf>\d)$}
1490
1498
  # Year-Half
1491
- year = $1.to_i
1492
- half = $2.to_i
1499
+ year = Regexp.last_match[:yr].to_i
1500
+ half = Regexp.last_match[:hf].to_i
1493
1501
  msg = "invalid half number: '#{spec}'"
1494
1502
  raise ArgumentError, msg unless [1, 2].include?(half)
1495
1503
 
@@ -1499,10 +1507,10 @@ module FatCore
1499
1507
  else
1500
1508
  ::Date.new(year, month, 1).end_of_half
1501
1509
  end
1502
- when /^([12])[hH]$/, /^[hH]([12])$/
1510
+ when /^(?<hf>[12])[hH]$/, /^[hH](?<hf>[12])$/
1503
1511
  # Half only
1504
1512
  this_year = today.year
1505
- half = $1.to_i
1513
+ half = Regexp.last_match[:hf].to_i
1506
1514
  msg = "invalid half number: '#{spec}'"
1507
1515
  raise ArgumentError, msg unless [1, 2].include?(half)
1508
1516
 
@@ -1512,10 +1520,10 @@ module FatCore
1512
1520
  else
1513
1521
  date.end_of_half
1514
1522
  end
1515
- when %r{^(\d\d\d\d)[-/](\d\d?)*$}
1523
+ when %r{^(?<yr>\d\d\d\d)[-/](?<mo>\d\d?)*$}
1516
1524
  # Year-Month only
1517
- year = $1.to_i
1518
- month = $2.to_i
1525
+ year = Regexp.last_match[:yr].to_i
1526
+ month = Regexp.last_match[:mo].to_i
1519
1527
  unless [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12].include?(month)
1520
1528
  raise ArgumentError, "invalid month number (1-12): '#{spec}'"
1521
1529
  end
@@ -1525,10 +1533,10 @@ module FatCore
1525
1533
  else
1526
1534
  ::Date.new(year, month, 1).end_of_month
1527
1535
  end
1528
- when %r{^(\d\d?)[-/](\d\d?)*$}
1536
+ when %r{^(?<mo>\d\d?)[-/](?<dy>\d\d?)*$}
1529
1537
  # Month-Day only
1530
- month = $1.to_i
1531
- day = $2.to_i
1538
+ month = Regexp.last_match[:mo].to_i
1539
+ day = Regexp.last_match[:dy].to_i
1532
1540
  unless [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12].include?(month)
1533
1541
  raise ArgumentError, "invalid month number (1-12): '#{spec}'"
1534
1542
  end
@@ -1538,9 +1546,9 @@ module FatCore
1538
1546
  else
1539
1547
  ::Date.new(today.year, month, day).end_of_month
1540
1548
  end
1541
- when /\A(\d\d?)\z/
1549
+ when /\A(?<mo>\d\d?)\z/
1542
1550
  # Month only
1543
- month = $1.to_i
1551
+ month = Regexp.last_match[:mo].to_i
1544
1552
  unless [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12].include?(month)
1545
1553
  raise ArgumentError, "invalid month number (1-12): '#{spec}'"
1546
1554
  end
@@ -1550,12 +1558,13 @@ module FatCore
1550
1558
  else
1551
1559
  ::Date.new(today.year, month, 1).end_of_month
1552
1560
  end
1553
- when /^(\d\d\d\d)$/
1561
+ when /^(?<yr>\d\d\d\d)$/
1554
1562
  # Year only
1563
+ year = Regexp.last_match[:yr].to_i
1555
1564
  if spec_type == :from
1556
- ::Date.new($1.to_i, 1, 1)
1565
+ ::Date.new(year, 1, 1)
1557
1566
  else
1558
- ::Date.new($1.to_i, 12, 31)
1567
+ ::Date.new(year, 12, 31)
1559
1568
  end
1560
1569
  when /^(to|this_?)?day/
1561
1570
  today
@@ -1679,6 +1688,43 @@ module FatCore
1679
1688
  end
1680
1689
  end
1681
1690
 
1691
+ # Return the 1-indexed integer that corresponds to a month name.
1692
+ #
1693
+ # @param name [String] a name of a month
1694
+ #
1695
+ # @return [Integer] the integer integer that corresponds to a month
1696
+ # name, or nil of no month recognized.
1697
+ def mo_name_to_num(name)
1698
+ case name.clean
1699
+ when /\Ajan/i
1700
+ 1
1701
+ when /\Afeb/i
1702
+ 2
1703
+ when /\Amar/i
1704
+ 3
1705
+ when /\Aapr/i
1706
+ 4
1707
+ when /\Amay/i
1708
+ 5
1709
+ when /\Ajun/i
1710
+ 6
1711
+ when /\Ajul/i
1712
+ 7
1713
+ when /\Aaug/i
1714
+ 8
1715
+ when /\Asep/i
1716
+ 9
1717
+ when /\Aoct/i
1718
+ 10
1719
+ when /\Anov/i
1720
+ 11
1721
+ when /\Adec/i
1722
+ 12
1723
+ else
1724
+ nil
1725
+ end
1726
+ end
1727
+
1682
1728
  # Return the nth weekday in the given month. If n is negative, count from
1683
1729
  # last day of month.
1684
1730
  #
@@ -1744,8 +1790,8 @@ module FatCore
1744
1790
  # Ensure that date is of class Date based either on a string or Date
1745
1791
  # object.
1746
1792
  #
1747
- # @param dat [String|Date|Time] the object to be converted to Date
1748
- # @return [Date]
1793
+ # @param dat [String, Date, Time] the object to be converted to Date
1794
+ # @return [Date, DateTime]
1749
1795
  def ensure_date(dat)
1750
1796
  case dat
1751
1797
  when String
@@ -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 { k += 1; k.div(num) }
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
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
1
4
  # The FatCore extensions to Hash provide a handful of generally useful methods
2
5
  # on Ruby Hash objects.
3
6
  #
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'fat_core/numeric'
2
4
 
3
5
  module Kernel
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
- alias entitle as_string
11
+ alias_method :entitle, :as_string
10
12
 
11
13
  # Allow nils to respond to #tex_quote for use in TeX documents
12
14
  #
@@ -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 = $1 || ''
79
- whole = $2 ? $2.delete('_') : ''
80
- frac = $5 || ''
81
- exp = $6 || ''
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' % { hrs: hrs,
137
- mins: mins, secs: secs,
138
- frac: frac.round(5) * 100 }
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' % { hrs: hrs, mins: mins,
141
- secs: secs }
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
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Provide #positive? and #negative? for older versions of Ruby.
2
4
  unless 2.respond_to?(:positive?)
3
5
  # Patch Numeric
@@ -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
- alias & intersection
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,36 +150,44 @@ module FatCore
148
150
 
149
151
  ([min, other.min].min..[max, other.max].max)
150
152
  end
151
- alias + union
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)
161
166
  raise 'Range difference requires objects have pred and succ methods'
162
167
  end
163
168
 
164
- if subset_of?(other)
165
- # (4..7) - (0..10)
166
- []
167
- elsif proper_superset_of?(other)
168
- # (4..7) - (5..5) -> [(4..4), (6..7)]
169
- [(min..other.min.pred), (other.max.succ..max)]
170
- elsif overlaps?(other) && other.min <= min
171
- # (4..7) - (2..5) -> (6..7)
172
- [(other.max.succ..max)]
173
- elsif overlaps?(other) && other.max >= max
174
- # (4..7) - (6..10) -> (4..5)
175
- [(min..other.min.pred)]
169
+ # Remove the intersection of self and other from self. The intersection
170
+ # is either (a) empty, so return self, (b) coincides with self, so
171
+ # return nothing,
172
+ isec = self & other
173
+ return [self] if isec.nil?
174
+ return [] if isec == self
175
+
176
+ # (c) touches self on the right, (d) touches self on the left, or (e)
177
+ # touches on neither the left or right, in which case the difference is
178
+ # two ranges.
179
+ if isec.max == max && isec.min > min
180
+ # Return the part to the left of isec
181
+ [(min..isec.min.pred)]
182
+ elsif isec.min == min && isec.max < max
183
+ # Return the part to the right of isec
184
+ [(isec.max.succ..max)]
176
185
  else
177
- [self]
186
+ # Return the parts to the left and right of isec
187
+ [(min..isec.min.pred), (isec.max.succ..max)]
178
188
  end
179
189
  end
180
- alias - difference
190
+ alias_method :-, :difference
181
191
 
182
192
  # Allow erb or erubis documents to directly interpolate a Range.
183
193
  #
@@ -280,13 +290,14 @@ module FatCore
280
290
  min >= other.min && max <= other.max
281
291
  end
282
292
 
283
- # Return whether self is contained within `other` range, without their
284
- # boundaries touching.
293
+ # Return whether self is contained within `other` range, with at most one
294
+ # boundary touching.
285
295
  #
286
296
  # @param other [Range] the containing range
287
297
  # @return [Boolean] is self wholly within other
288
298
  def proper_subset_of?(other)
289
- min > other.min && max < other.max
299
+ subset_of?(other) &&
300
+ (min > other.min || max < other.max)
290
301
  end
291
302
 
292
303
  # Return whether self contains `other` range, even if their
@@ -298,13 +309,14 @@ module FatCore
298
309
  min <= other.min && max >= other.max
299
310
  end
300
311
 
301
- # Return whether self contains `other` range, without their
302
- # boundaries touching.
312
+ # Return whether self contains `other` range, with at most one
313
+ # boundary touching.
303
314
  #
304
315
  # @param other [Range] the contained range
305
316
  # @return [Boolean] does self wholly contain other
306
317
  def proper_superset_of?(other)
307
- min < other.min && max > other.max
318
+ superset_of?(other) &&
319
+ (min < other.min || max > other.max)
308
320
  end
309
321
 
310
322
  # Return whether self overlaps with other Range.
@@ -368,7 +380,7 @@ module FatCore
368
380
  # (4..8) <=> (4..8) #=> 0
369
381
  #
370
382
  # @param other [Range] range to compare self with
371
- # @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
372
384
  def <=>(other)
373
385
  [min, max] <=> other.minmax
374
386
  end
@@ -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{(\d\d\d\d)[-/]?(\d\d?)[-/]?(\d\d?)}
108
- ::Date.new($1.to_i, $2.to_i, $3.to_i)
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
 
@@ -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
- alias entitle as_string
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
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module FatCore
2
4
  MAJOR = 4
3
- MINOR = 8
4
- PATCH = 2
5
+ MINOR = 9
6
+ PATCH = 3
5
7
 
6
8
  # FatCore version number
7
9
  VERSION = [MAJOR, MINOR, PATCH].compact.join('.')
data/lib/fat_core.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'fat_core/version'
2
2
  require 'fat_core/patches'
3
+ require 'active_support'
3
4
  require 'active_support/core_ext/object/blank'
4
5
  require 'active_support/core_ext/object/deep_dup'
@@ -1,3 +1,4 @@
1
+ require 'spec_helper'
1
2
  require 'fat_core/bigdecimal'
2
3
 
3
4
  describe BigDecimal do
@@ -1,6 +1,6 @@
1
1
  # coding: utf-8
2
- #require 'spec_helper'
3
2
 
3
+ require 'spec_helper'
4
4
  require 'fat_core/date'
5
5
 
6
6
  describe Date do
@@ -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
 
@@ -1,5 +1,4 @@
1
1
  require 'spec_helper'
2
-
3
2
  require 'fat_core/enumerable'
4
3
 
5
4
  describe Enumerable do
@@ -1,5 +1,4 @@
1
1
  require 'spec_helper'
2
-
3
2
  require 'fat_core/hash'
4
3
 
5
4
  describe Hash do
@@ -1,5 +1,4 @@
1
1
  require 'spec_helper'
2
-
3
2
  require 'fat_core/kernel'
4
3
 
5
4
  describe Kernel do
data/spec/lib/nil_spec.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  require 'spec_helper'
2
-
3
2
  require 'fat_core/nil'
4
3
 
5
4
  describe NilClass do
@@ -1,3 +1,4 @@
1
+ require 'spec_helper'
1
2
  require 'fat_core/numeric'
2
3
 
3
4
  describe Numeric do
@@ -1,3 +1,4 @@
1
+ require 'spec_helper'
1
2
  require 'fat_core/range'
2
3
 
3
4
  describe Range do
@@ -12,6 +13,7 @@ describe Range do
12
13
 
13
14
  it 'should know if it is a proper subset of another range' do
14
15
  expect((4..8)).to be_proper_subset_of((2..9))
16
+ expect((4..8)).to be_proper_subset_of((4..9))
15
17
  expect((4..8)).not_to be_proper_subset_of((4..8))
16
18
  expect((4..8)).not_to be_proper_subset_of((2..7))
17
19
  expect((4..8)).not_to be_proper_subset_of((5..8))
@@ -34,8 +36,8 @@ describe Range do
34
36
 
35
37
  it 'should know if it is a proper superset of another range' do
36
38
  expect((4..8)).to be_proper_superset_of((5..7))
37
- expect((4..8)).not_to be_proper_superset_of((6..8))
38
- expect((4..8)).not_to be_proper_superset_of((4..7))
39
+ expect((4..8)).to be_proper_superset_of((6..8))
40
+ expect((4..8)).to be_proper_superset_of((4..7))
39
41
  expect((4..8)).not_to be_proper_superset_of((4..8))
40
42
  expect((4..8)).not_to be_proper_superset_of((2..9))
41
43
  expect((4..8)).not_to be_proper_superset_of((2..8))
@@ -1,3 +1,4 @@
1
+ require 'spec_helper'
1
2
  require 'fat_core/symbol'
2
3
 
3
4
  describe Symbol do
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.8.2
4
+ version: 4.9.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: 2020-03-18 00:00:00.000000000 Z
11
+ date: 2022-01-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: simplecov
@@ -137,19 +137,33 @@ dependencies:
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
139
  - !ruby/object:Gem::Dependency
140
- name: activesupport
140
+ name: solargraph
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
143
  - - ">="
144
144
  - !ruby/object:Gem::Version
145
145
  version: '0'
146
- type: :runtime
146
+ type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
150
  - - ">="
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: activesupport
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '6.0'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '6.0'
153
167
  - !ruby/object:Gem::Dependency
154
168
  name: damerau-levenshtein
155
169
  requirement: !ruby/object:Gem::Requirement
@@ -233,7 +247,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
233
247
  - !ruby/object:Gem::Version
234
248
  version: '0'
235
249
  requirements: []
236
- rubygems_version: 3.0.3
250
+ rubygems_version: 3.3.3
237
251
  signing_key:
238
252
  specification_version: 4
239
253
  summary: fat_core provides some useful core extensions