fat_core 5.1.0 → 5.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +5 -21
- data/Gemfile +14 -8
- data/README.org +170 -19
- data/Rakefile +10 -3
- data/bin/easters +22 -12
- data/fat_core.gemspec +2 -12
- data/lib/fat_core/date.rb +247 -258
- data/lib/fat_core/enumerable.rb +1 -1
- data/lib/fat_core/nil.rb +1 -1
- data/lib/fat_core/numeric.rb +19 -14
- data/lib/fat_core/range.rb +5 -5
- data/lib/fat_core/string.rb +37 -17
- data/lib/fat_core/symbol.rb +1 -1
- data/lib/fat_core/version.rb +1 -1
- data/spec/lib/date_spec.rb +172 -13
- data/spec/lib/enumerable_spec.rb +7 -4
- data/spec/lib/kernel_spec.rb +6 -6
- data/spec/lib/range_spec.rb +16 -14
- data/spec/lib/string_spec.rb +6 -11
- data/spec/spec_helper.rb +4 -0
- metadata +5 -131
- /data/spec/lib/{bigdecimal_spec.rb → big_decimal_spec.rb} +0 -0
- /data/spec/lib/{nil_spec.rb → nil_class_spec.rb} +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c2376c4bac5a7a1702ae4361cca280a07b1bfde4304f42fad41e0f37754d41c8
|
4
|
+
data.tar.gz: e87c81524e1901bf80443b421d62ad8ebffe7212916f0bd18817625e79795985
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c0b95bc966b857fae1bcfbf2b38dcb8e4275dee5b269091944f2dcd08830162ebf22b98072a49b9b40e1599b7c0f940beeffa4e08f9f6b9f05dc003ba81a3e8c
|
7
|
+
data.tar.gz: 6cf190c0656ba641ccfe10a27e832d9bbe2bb71dde2491c97179ae4acc677af884679a4c635aefe40379e5a022dda71549c705cc6c05e71a5e4d7037639c193b
|
data/.rubocop.yml
CHANGED
@@ -1,25 +1,9 @@
|
|
1
1
|
inherit_from:
|
2
2
|
- ~/.rubocop.yml
|
3
3
|
|
4
|
-
|
5
|
-
|
4
|
+
AllCops:
|
5
|
+
NewCops: enable
|
6
|
+
TargetRubyVersion: 3.0
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
# AllCops:
|
11
|
-
# TargetRubyVersion: 2.7
|
12
|
-
# Exclude:
|
13
|
-
# - 'test/tmp/**/*'
|
14
|
-
# - 'vendor/bundle/**/*'
|
15
|
-
|
16
|
-
# Style/MethodCallWithArgsParentheses:
|
17
|
-
# Exclude:
|
18
|
-
# - '**/Gemfile'
|
19
|
-
|
20
|
-
# Style/ClassAndModuleChildren:
|
21
|
-
# Exclude:
|
22
|
-
# - 'test/**/*'
|
23
|
-
|
24
|
-
# Style/StringLiterals:
|
25
|
-
# Enabled: false
|
8
|
+
Style/BitwisePredicate:
|
9
|
+
Enabled: false
|
data/Gemfile
CHANGED
@@ -1,13 +1,19 @@
|
|
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
|
-
|
6
3
|
# Specify your gem's dependencies in fat_core.gemspec
|
7
4
|
gemspec
|
8
5
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
6
|
+
group :development do
|
7
|
+
gem 'rubocop-shopify', require: false
|
8
|
+
gem 'rubocop-rspec', require: false
|
9
|
+
gem 'rubocop-performance', require: false
|
10
|
+
gem 'rubocop-rake', require: false
|
11
|
+
gem 'bundler'
|
12
|
+
gem 'debug', '>= 1.0.0'
|
13
|
+
gem 'pry'
|
14
|
+
gem 'redcarpet'
|
15
|
+
gem 'pry-doc'
|
16
|
+
gem 'rake'
|
17
|
+
gem 'rspec'
|
18
|
+
gem 'simplecov'
|
19
|
+
end
|
data/README.org
CHANGED
@@ -54,13 +54,11 @@ Many of these have little that is of general interest, but there are a few
|
|
54
54
|
goodies.
|
55
55
|
|
56
56
|
*** Date
|
57
|
-
|
58
57
|
**** Constants
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
date ranges, for example. They are defined as:
|
58
|
+
~FatCore~ adds two date constants to the ~Date~ class, Date::BOT and
|
59
|
+
Date::EOT. These represent the earliest and latest dates of practical
|
60
|
+
commercial interest. The exact values are rather arbitrary, but they prove
|
61
|
+
useful in date ranges, for example. They are defined as:
|
64
62
|
|
65
63
|
- ~Date::BOT~ :: January 1, 1900
|
66
64
|
- ~Date::EOT~ :: December 31, 3000
|
@@ -69,7 +67,38 @@ date ranges, for example. They are defined as:
|
|
69
67
|
- ~Date::PRESIDENTIAL_FUNERALS~ :: an Array of dates of presidential funerals,
|
70
68
|
which are observed with a closing of most federal agencies
|
71
69
|
|
72
|
-
|
70
|
+
**** Ensure
|
71
|
+
The ~Date.ensure~ class method tries to convert its argument to a ~Date~
|
72
|
+
object by (1) applying the ~#to_date~ method or (2) applying the ~Date.parse~
|
73
|
+
method to a String. This is handy when you want to define a method that takes
|
74
|
+
a date argument but want the caller to be able to supply anything that can
|
75
|
+
reasonably be converted to a ~Date~:
|
76
|
+
|
77
|
+
#+begin_src ruby
|
78
|
+
$:.unshift("~/src/fat_core/lib")
|
79
|
+
require 'fat_core/date' # => true
|
80
|
+
|
81
|
+
def tomorow_tomorrow(arg)
|
82
|
+
from = Date.ensure(arg) # => ArgumentError: cannot convert class 'Array' to a Date or DateTime
|
83
|
+
from + 2.days # => Mon, 03 Jun 2024, Wed, 16 Oct 2024 05:47:30 -0500, Sun, 03 Mar 2024
|
84
|
+
end # => :tomorow_tomorrow
|
85
|
+
|
86
|
+
tomorow_tomorrow('June 1') # => Mon, 03 Jun 2024
|
87
|
+
tomorow_tomorrow(Time.now) # => Wed, 16 Oct 2024 05:47:30 -0500
|
88
|
+
# But it's only as good as Date.parse!
|
89
|
+
tomorow_tomorrow('Ides of March') # => Sun, 03 Mar 2024
|
90
|
+
|
91
|
+
tomorow_tomorrow([])
|
92
|
+
# =>
|
93
|
+
|
94
|
+
# ~> ArgumentError
|
95
|
+
# ~> cannot convert class 'Array' to a Date or DateTime
|
96
|
+
# ~>
|
97
|
+
# ~> /home/ded/src/fat_core/lib/fat_core/date.rb:1849:in `ensure_date'
|
98
|
+
# ~> /home/ded/src/fat_core/lib/fat_core/date.rb:1863:in `ensure'
|
99
|
+
# ~> /tmp/seeing_is_believing_temp_dir20241014-1457038-xj4k5x/program.rb:5:in `tomorow_tomorrow'
|
100
|
+
# ~> /tmp/seeing_is_believing_temp_dir20241014-1457038-xj4k5x/program.rb:14:in `<main>'
|
101
|
+
#+end_src
|
73
102
|
|
74
103
|
**** Formatting
|
75
104
|
|
@@ -88,7 +117,6 @@ that are often useful:
|
|
88
117
|
puts "American: #{d.american}"
|
89
118
|
#+end_SRC
|
90
119
|
|
91
|
-
#+RESULTS:
|
92
120
|
#+begin_example
|
93
121
|
ISO: 1957-09-22
|
94
122
|
All Numbers: 19570922
|
@@ -112,7 +140,7 @@ convention of using en-dashes to separate the components.
|
|
112
140
|
|
113
141
|
Many of the methods provided by ~FatCore~ deal with various calendar periods
|
114
142
|
that are less common than those provided by the Ruby Standard Library or gems
|
115
|
-
such as ~
|
143
|
+
such as ~active_support~. This documentation refers to these calendar periods
|
116
144
|
as "chunks", and they are the following:
|
117
145
|
|
118
146
|
- year,
|
@@ -134,7 +162,7 @@ or end of each of these chunks:
|
|
134
162
|
tab = []
|
135
163
|
d = Date.parse('2017-06-30')
|
136
164
|
%i[beginning end].each do |side|
|
137
|
-
%i(year half quarter bimonth month semimonth biweek week
|
165
|
+
%i(year half quarter bimonth month semimonth biweek week).each do |chunk|
|
138
166
|
meth = "#{side}_of_#{chunk}?".to_sym
|
139
167
|
tab << [d.iso, meth.to_s, "#{d.send(meth)}"]
|
140
168
|
end
|
@@ -231,7 +259,6 @@ You can query which numerical half, quarter, etc. that a given date falls in:
|
|
231
259
|
objects.
|
232
260
|
|
233
261
|
***** American Dates
|
234
|
-
|
235
262
|
Americans often write dates in the form M/d/Y, and the normal parse method
|
236
263
|
will parse such a string as d/M/Y, often resulting in invalid date errors.
|
237
264
|
~FatCore~ adds the specialty parsing method, ~Date.parse_american~ to handle
|
@@ -256,15 +283,140 @@ Date.parse_american('9/22/1957') => 1957-09-22
|
|
256
283
|
#+end_example
|
257
284
|
|
258
285
|
***** Date Specs
|
259
|
-
|
260
|
-
|
286
|
+
It is often desirable to get the first or last date of a specified time
|
287
|
+
period. For this ~FatCore~ provides the ~parse_spec~ method that takes a
|
288
|
+
string and an optional ~spec_type~ parameter of either ~:from~, indicating
|
289
|
+
that the first date of the period should be returned or ~:to~, indicating that
|
290
|
+
the last date of the period should be returned.
|
291
|
+
|
292
|
+
This method supports a rich set of ways to specify periods of time:
|
293
|
+
|
294
|
+
- YYYY-MM-DD :: returns a single day as the time period,
|
295
|
+
- YYYY-MM :: returns the specified month, beginning or end
|
296
|
+
- YYYY :: returns the specified year, beginning or end
|
297
|
+
- YYYY-ddd :: returns the ddd'th day of the specified year, beginning or end
|
298
|
+
- MM :: returns the specified month of the current year, beginning or end
|
299
|
+
- MM-DD :: returns the specified day of the specified month in the current
|
300
|
+
year, beginning or end,
|
301
|
+
- YYYY-Wnn or YYYY-nnW :: returns the nn'th commercial week of the given year
|
302
|
+
according to the ISO 8601 standard, in which the week containing the first
|
303
|
+
Thursday of the year counts as the first commercial week, even if that week
|
304
|
+
started in the prior calendar year,
|
305
|
+
- Wnn or nnW :: returns the nn'th commercial week of the current year,
|
306
|
+
- YYYY-1H or YYYY-2H :: returns the specified half year for the given year,
|
307
|
+
- 1H or 2H :: returns the specified half year for the current year,
|
308
|
+
- YYYY-1Q, YYYY-2Q, etc :: returns the calendar quarter for the given year,
|
309
|
+
- 1Q, 2Q, etc :: returns the calendar quarter for the current year,
|
310
|
+
- YYYY-MM-I or YYYY-MM-II :: returns the semi-month for the given month and
|
311
|
+
year, where the first semi-month always runs from the 1st to the 15th and
|
312
|
+
the second semi-month always runs from the 16th to the last day of the given
|
313
|
+
month, regardless of the number of days in the month,
|
314
|
+
- YYYY-MM-i or YYYY-MM-ii up to YYYY-MM-vi :: returns the given week within
|
315
|
+
the month, including any partial weeks,
|
316
|
+
- MM-i or MM-ii up to MM-vi :: returns the given week within the month of the
|
317
|
+
current year, including any partial weeks,
|
318
|
+
- i or ii up to vi :: returns the given week within the current month of the current
|
319
|
+
year, including any partial weeks,
|
320
|
+
- YYYY-MM-nSu up to YYYY-MM-nSa :: returns the single date that is the n'th
|
321
|
+
Sunday, Monday, etc., in the given month using the first two letters of the
|
322
|
+
English names for the days of the week,
|
323
|
+
- MM-nSu up to MM-nSa :: returns the single date that is the n'th Sunday,
|
324
|
+
Monday, etc., in the given month of the current year using the first two
|
325
|
+
letters of the English names for the days of the week,
|
326
|
+
- nSu up to nSa :: returns the single date that is the n'th Sunday, Monday,
|
327
|
+
etc., in the current month of the current year using the first two letters
|
328
|
+
of the English names for the days of the week,
|
329
|
+
- YYYY-nnn :: is the nnn'th day of the given year, exactly three digits needed,
|
330
|
+
- nnn :: is the nnn'th day of the current year, exactly three digits needed,
|
331
|
+
- YYYY-E :: returns the single date of Easter in the Western church for the
|
332
|
+
given year,
|
333
|
+
- E :: returns the single date of Easter in the Western church for the current
|
334
|
+
year,
|
335
|
+
- YYYY-E-n or YYYY-E+n :: returns the single date that falls n days before (-)
|
336
|
+
or after (+) Easter in the Western church for the given year,
|
337
|
+
- E-n or E+n :: returns the single date that falls n days before (-) or after
|
338
|
+
(+) Easter in the Western church for the current year,
|
339
|
+
- yesterday or yesteryear or lastday or last_year, etc :: the relative
|
340
|
+
prefixes, 'last' or 'yester' prepended to any chunk name returns the period
|
341
|
+
named by the chunk that precedes today's date.
|
342
|
+
- today or toyear or this-year or thissemimonth, etc :: the relative prefixes,
|
343
|
+
'to' or 'this' prepended to any chunk name returns the period named by
|
344
|
+
the chunk that contains today's date.
|
345
|
+
- nextday or nextyear or next-year or nextsemimonth, etc :: the relative
|
346
|
+
prefixes, 'next' prepended to any chunk name returns the period named by the
|
347
|
+
chunk that follows today's date. As a special case, 'tomorrow' is treated as
|
348
|
+
equivalent to 'nextday'.
|
349
|
+
- forever :: returns the period Date::BOT to Date::EOT, which, for financial
|
350
|
+
applications is meant to stand in for eternity.
|
351
|
+
- never :: returns nil, representing no date.
|
352
|
+
|
353
|
+
Some things to note with respect to ~Date.parse_spec~:
|
354
|
+
|
355
|
+
1. The second argument should be either ~:from~ or ~:to~, but it defaults to
|
356
|
+
~:from~. If it is ~:from~, ~parse_spec~ returns the first date of the
|
357
|
+
specified period; if it is ~:to~, it returns the last date of the specified
|
358
|
+
period. When the "period" resolves to a single day, both arguments return
|
359
|
+
the same date, so ~parse_spec('2024-E', :from)~ and ~parse_spec('2024-E',
|
360
|
+
:to)~ both result in March 31, 2024.
|
361
|
+
2. Where relevant, ~parse_spec~ accepts letters of either upper or lower case:
|
362
|
+
so 2024-1Q can be written 2024-1q and 'yesteryear' can be written
|
363
|
+
'YeSterYeaR', and likewise for all components of the spec using letters.
|
364
|
+
3. Date components can be separated with either a hyphen, as in the examples
|
365
|
+
above, or with a '/' as is common. Thus, 2024-11-09 can also be
|
366
|
+
2024/11/09, or indeed, 2024/11-09 or 2024-11/09.
|
367
|
+
4. The prefixes for relative periods can be separated from the period name by
|
368
|
+
a hyphen, and underscore, or by nothing at all. Thus, yester-day,
|
369
|
+
yester_day, and yesterday are all acceptable. Clearly neologisms such as
|
370
|
+
'yestermonth' are quaint, but not harmful.
|
371
|
+
5. On the other hand, to get a day-of-year spec right, you must use exactly 3
|
372
|
+
digits: 2024-011 is the 11th day of 2024, but 2024-11 is November of 2024.
|
261
373
|
|
262
374
|
**** Holidays and Workdays
|
263
|
-
|
264
|
-
|
265
|
-
-
|
266
|
-
|
267
|
-
|
375
|
+
One of the original motivations for this library was to provide an easy way to
|
376
|
+
determine whether a given date is a federal holiday in the United States or,
|
377
|
+
nearly but not quite the same, a non-trading day on the New York Stock
|
378
|
+
Exchange. To that end, ~FatCore~ provides the following methods:
|
379
|
+
|
380
|
+
- Date#weekend? -- is this date on a weekend?
|
381
|
+
- Date#weekday? -- is this date on a week day?
|
382
|
+
- Date#easter_this_year -- the date of Easter in the Date's year
|
383
|
+
|
384
|
+
Methods concerning Federal holidays:
|
385
|
+
|
386
|
+
- Date#fed_holiday? -- is this date a Federal holiday? It knows about
|
387
|
+
obscurities such as holidays decreed by past Presidents, dates of
|
388
|
+
Presidential funerals, and the Federal rule for when holidays fall on a
|
389
|
+
weekend, whether it is moved to the prior Friday or the following Monday.
|
390
|
+
- Date#fed_workday? -- is it a date when the Federal government is open?,
|
391
|
+
inverse of Date#fed_holiday?
|
392
|
+
- Date#add_fed_workdays(n) -- n Federal workdays following (or preceding if n
|
393
|
+
negative) this date,
|
394
|
+
- Date#next_fed_workday -- the next Federal workday following this date,
|
395
|
+
- Date#prior_fed_workday -- the previous Federal workday before this date,
|
396
|
+
- Date#next_until_fed_workday -- starting with this date, move forward until
|
397
|
+
we hit a Federal workday
|
398
|
+
- Date#prior_until_fed_workday -- starting with this date, move back until
|
399
|
+
we hit a Federal workday
|
400
|
+
|
401
|
+
And we have similar methods for "holidays" or non-trading days on the NYSE:
|
402
|
+
|
403
|
+
- Date#nyse_holiday? -- is this date a NYSE holiday?
|
404
|
+
- Date#nyse_workday? -- is it a date when the NYSE is open for trading?,
|
405
|
+
inverse of Date#nyse_holiday?
|
406
|
+
- Date#add_nyse_workdays(n) -- n NYSE workdays following (or preceding if n
|
407
|
+
negative) this date,
|
408
|
+
- Date#next_nyse_workday -- the next NYSE workday following this date,
|
409
|
+
- Date#prior_nyse_workday -- the previous NYSE workday before this date,
|
410
|
+
- Date#next_until_nyse_~~workday -- starting with this date, move forward until
|
411
|
+
we hit a NYSE workday
|
412
|
+
- Date#prior_until_nyse_workday -- starting with this date, move back until
|
413
|
+
we hit a Federal workday
|
414
|
+
|
415
|
+
**** Ordinal Weekdays in Month
|
416
|
+
It is often useful to find the 1st, 2nd, etc, Sunday, Monday, etc. in a given
|
417
|
+
month. ~FatCore~ provides the class method ~Date.nth_wday_in_year_month(nth,
|
418
|
+
wday, year, month)~ to return such dates. The first parameter can be
|
419
|
+
negative, which will count from the end of the month.
|
268
420
|
|
269
421
|
**** Easter
|
270
422
|
The ~Date~ class extension adds two methods for determining whether a given
|
@@ -325,7 +477,6 @@ coverage on one Range by an Array of other Ranges:
|
|
325
477
|
(0..12).gaps([(0..2), (5..7), (10..12)]) => [(3..4), (8..9)]
|
326
478
|
#+end_SRC
|
327
479
|
|
328
|
-
**
|
329
480
|
* Enumerable
|
330
481
|
FatCore::Enumerable extends Enumerable with the ~#each_with_flags~ method that
|
331
482
|
yields the elements of the Enumerable but also yields two booleans, ~first~ and
|
data/Rakefile
CHANGED
@@ -10,16 +10,23 @@ RDoc::Task.new do |rdoc|
|
|
10
10
|
end
|
11
11
|
|
12
12
|
YARD::Rake::YardocTask.new do |t|
|
13
|
-
t.files
|
13
|
+
t.files = ['lib/**/*.rb', 'README.md']
|
14
14
|
t.options << '--no-private'
|
15
15
|
t.options << '--embed-mixins'
|
16
16
|
t.options << '--markup=markdown'
|
17
17
|
t.options << '--markup-provider=redcarpet'
|
18
|
-
#t.stats_options = ['--list-undoc']
|
18
|
+
# t.stats_options = ['--list-undoc']
|
19
19
|
end
|
20
20
|
|
21
21
|
RSpec::Core::RakeTask.new(:spec, :tag) do |t|
|
22
22
|
t.rspec_opts = '--tag ~online -f p'
|
23
23
|
end
|
24
24
|
|
25
|
-
|
25
|
+
########################################################################
|
26
|
+
# Rubocop tasks
|
27
|
+
########################################################################
|
28
|
+
require 'rubocop/rake_task'
|
29
|
+
|
30
|
+
RuboCop::RakeTask.new
|
31
|
+
|
32
|
+
task :default => [:spec, :rubocop]
|
data/bin/easters
CHANGED
@@ -1,17 +1,27 @@
|
|
1
|
-
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
|
-
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'easters' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
4
10
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
if
|
11
|
-
|
12
|
-
elsif easter.month == 4 && easter.day >= 24
|
13
|
-
print easter.day == 25 ? " >>>\n" : " >>\n"
|
11
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__)
|
12
|
+
|
13
|
+
bundle_binstub = File.expand_path("bundle", __dir__)
|
14
|
+
|
15
|
+
if File.file?(bundle_binstub)
|
16
|
+
if File.read(bundle_binstub, 300).include?("This file was generated by Bundler")
|
17
|
+
load(bundle_binstub)
|
14
18
|
else
|
15
|
-
|
19
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
20
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
16
21
|
end
|
17
22
|
end
|
23
|
+
|
24
|
+
require "rubygems"
|
25
|
+
require "bundler/setup"
|
26
|
+
|
27
|
+
load Gem.bin_path("fat_core", "easters")
|
data/fat_core.gemspec
CHANGED
@@ -25,16 +25,6 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.executables = spec.files.grep(%r{^bin/easter}) { |f| File.basename(f) }
|
26
26
|
spec.require_paths = ['lib']
|
27
27
|
|
28
|
-
spec.
|
29
|
-
spec.
|
30
|
-
spec.add_development_dependency 'pry'
|
31
|
-
spec.add_development_dependency 'pry-doc'
|
32
|
-
spec.add_development_dependency 'rake'
|
33
|
-
spec.add_development_dependency 'redcarpet'
|
34
|
-
spec.add_development_dependency 'rspec'
|
35
|
-
spec.add_development_dependency 'simplecov'
|
36
|
-
spec.add_development_dependency 'solargraph'
|
37
|
-
|
38
|
-
spec.add_runtime_dependency 'activesupport'
|
39
|
-
spec.add_runtime_dependency 'damerau-levenshtein'
|
28
|
+
spec.add_dependency 'activesupport'
|
29
|
+
spec.add_dependency 'damerau-levenshtein'
|
40
30
|
end
|