fat_core 4.12.0 → 4.13.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.
@@ -1,11 +1,22 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'fat_core/string'
3
5
  require 'fat_core/date'
4
6
 
5
7
  describe String do
6
- before do
7
- #23456789012345678901234567890123456789012345678901234567890123456789|
8
- @getty = "\
8
+ describe 'class methods' do
9
+ it 'generates a random string' do
10
+ ss = described_class.random(100)
11
+ expect(ss.class).to eq String
12
+ expect(ss.size).to eq 100
13
+ end
14
+ end
15
+
16
+ describe 'instance methods' do
17
+ describe 'wrapping' do
18
+ #23456789012345678901234567890123456789012345678901234567890123456789|
19
+ let(:getty) {"\
9
20
  Four score and seven years ago our fathers brought forth on this conti\
10
21
  nent a new nation, conceived in liberty, and dedicated to the proposit\
11
22
  ion that all men are created equal. Now we are engaged in a great civ\
@@ -26,88 +37,114 @@ red dead we take increased devotion to that cause for which they gave \
26
37
  the last full measure of devotion--that we here highly resolve that th\
27
38
  ese dead shall not have died in vain--that this nation, under God, sha\
28
39
  ll have a new birth of freedom--and that government of the people, by \
29
- the people, for the people, shall not perish from the earth."
40
+ the people, for the people, shall not perish from the earth."}
30
41
 
31
- # 0000000000111111111122222222223333333333444444444455555555556666666666
32
- # 0123456789012345678901234567890123456789012345678901234567890123456789|
33
- # Four score and seven years ago our fathers brought forth on
34
- # this continent a new nation, conceived in liberty, and
35
- # dedicated to the proposition that all men are created
36
- # equal. Now we are engaged in a great civil war, testing
37
- # whether that nation, or any nation, so conceived and
38
- # so dedicated, can long endure. We are met on a great
39
- # battle-field of that war. We have come to dedicate a
40
- # portion of that field, as a final resting place for
41
- # those who here gave their lives that that nation might
42
- # live. It is altogether fitting and proper that we should
43
- # do this. But, in a larger sense, we can not dedicate,
44
- # we can not consecrate, we can not hallow this ground.
45
- # The brave men, living and dead, who struggled here,
46
- # have consecrated it, far above our poor power to add
47
- # or detract. The world will little note, nor long remember
48
- # what we say here, but it can never forget what they
49
- # did here. It is for us the living, rather, to be dedicated
50
- # here to the unfinished work which they who fought here
51
- # have thus far so nobly advanced. It is rather for us
52
- # to be here dedicated to the great task remaining before
53
- # us--that from these honored dead we take increased devotion
54
- # to that cause for which they gave the last full measure
55
- # of devotion--that we here highly resolve that these dead
56
- # shall not have died in vain--that this nation, under
57
- # God, shall have a new birth of freedom--and that government
58
- # of the people, by the people, for the people, shall
59
- # not perish from the earth.
60
- end
42
+ # 0000000000111111111122222222223333333333444444444455555555556666666666
43
+ # 0123456789012345678901234567890123456789012345678901234567890123456789|
44
+ # Four score and seven years ago our fathers brought forth on
45
+ # this continent a new nation, conceived in liberty, and
46
+ # dedicated to the proposition that all men are created
47
+ # equal. Now we are engaged in a great civil war, testing
48
+ # whether that nation, or any nation, so conceived and
49
+ # so dedicated, can long endure. We are met on a great
50
+ # battle-field of that war. We have come to dedicate a
51
+ # portion of that field, as a final resting place for
52
+ # those who here gave their lives that that nation might
53
+ # live. It is altogether fitting and proper that we should
54
+ # do this. But, in a larger sense, we can not dedicate,
55
+ # we can not consecrate, we can not hallow this ground.
56
+ # The brave men, living and dead, who struggled here,
57
+ # have consecrated it, far above our poor power to add
58
+ # or detract. The world will little note, nor long remember
59
+ # what we say here, but it can never forget what they
60
+ # did here. It is for us the living, rather, to be dedicated
61
+ # here to the unfinished work which they who fought here
62
+ # have thus far so nobly advanced. It is rather for us
63
+ # to be here dedicated to the great task remaining before
64
+ # us--that from these honored dead we take increased devotion
65
+ # to that cause for which they gave the last full measure
66
+ # of devotion--that we here highly resolve that these dead
67
+ # shall not have died in vain--that this nation, under
68
+ # God, shall have a new birth of freedom--and that government
69
+ # of the people, by the people, for the people, shall
70
+ # not perish from the earth.
61
71
 
62
- describe 'class methods' do
63
- it 'should be able to generate a random string' do
64
- ss = String.random(100)
65
- expect(ss.class).to eq String
66
- expect(ss.size).to eq 100
72
+ it 'wraps a short string' do
73
+ expect('hello, world'.wrap).to eq 'hello, world'
74
+ end
75
+
76
+ it 'wraps a long string' do
77
+ str = getty.wrap
78
+ str.split("\n").each { |l| expect(l.length).to be <= 70 }
79
+ end
80
+
81
+ it 'wraps a long string with a hangining indent' do
82
+ str = getty.wrap(70, 10)
83
+ str.split("\n").each { |l| expect(l.length).to be <= 70 }
84
+ str.split("\n")[1..-1].each do |l|
85
+ expect(l).to match(/^ /)
86
+ end
87
+ second_line = ' ' * 10 + 'this continent a new nation'
88
+ third_line = ' ' * 10 + 'dedicated to the proposition'
89
+ twenty_fourth_line = ' ' * 10 + 'shall not have died in vain'
90
+ expect(str.split("\n")[1]).to match(/^#{second_line}/)
91
+ expect(str.split("\n")[2]).to match(/^#{third_line}/)
92
+ expect(str.split("\n")[23]).to match(/^#{twenty_fourth_line}/)
93
+ end
67
94
  end
68
- end
69
95
 
70
- describe 'instance methods' do
71
- it 'should be able to clean up white space in a string' do
96
+ it 'cleans up white space in a string' do
72
97
  expect(' string here '.clean).to eq 'string here'
73
98
  end
74
99
 
75
- it 'should be able to convert a numeric string to a commified form' do
76
- expect('20140521'.commas).to eq '20,140,521'
77
- expect('20140521.556'.commas).to eq '20,140,521.556'
78
- expect('20140521.556'.commas(2)).to eq '20,140,521.56'
79
- expect('-20140521.556'.commas).to eq '-20,140,521.556'
80
- expect('+20140521.556'.commas).to eq '+20,140,521.556'
81
- expect('+20140521.556e3'.commas).to eq '+20,140,521.556e3'
82
- expect('3.141591828'.commas(11)).to eq '3.14159182800'
83
- expect('3.141591828'.commas(10)).to eq '3.1415918280'
84
- expect('3.141591828'.commas(9)).to eq '3.141591828'
85
- expect('3.141591828'.commas(8)).to eq '3.14159183'
86
- expect('3.141591828'.commas(7)).to eq '3.1415918'
87
- expect('3.141591828'.commas(6)).to eq '3.141592'
88
- expect('3.141591828'.commas(5)).to eq '3.14159'
89
- expect('3.141591828'.commas(4)).to eq '3.1416'
90
- expect('3.141591828'.commas(3)).to eq '3.142'
91
- expect('3.141591828'.commas(2)).to eq '3.14'
92
- expect('3.141591828'.commas(1)).to eq '3.1'
93
- expect('3.141591828'.commas(0)).to eq '3'
94
- expect('3.14'.commas(5)).to eq '3.14000'
95
- expect('6789345612.14'.commas).to eq '6,789,345,612.14'
96
- expect('6789345612.14'.commas(-1)).to eq '6,789,345,612'
97
- expect('6789345612.14'.commas(-2)).to eq '6,789,345,610'
98
- expect('6789345612.14'.commas(-3)).to eq '6,789,345,600'
99
- expect('6789345612.14'.commas(-4)).to eq '6,789,346,000'
100
- expect('6789345612.14'.commas(-5)).to eq '6,789,350,000'
101
- expect('6789345612.14'.commas(-6)).to eq '6,789,300,000'
102
- expect('6789345612.14'.commas(-7)).to eq '6,789,000,000'
103
- expect('6789345612.14'.commas(-8)).to eq '6,790,000,000'
104
- expect('6789345612.14'.commas(-9)).to eq '6,800,000,000'
105
- expect('6789345612.14'.commas(-10)).to eq '7,000,000,000'
106
- expect('6789345612.14'.commas(-11)).to eq '10,000,000,000'
107
- expect('6789345612.14'.commas(-12)).to eq '000,000,000,000'
100
+ describe 'numeric strings' do
101
+ it 'converts a numeric string to a commified form' do
102
+ expect('20140521'.commas).to eq '20,140,521'
103
+ expect('20140521.556'.commas).to eq '20,140,521.556'
104
+ expect('20140521.556'.commas(2)).to eq '20,140,521.56'
105
+ expect('-20140521.556'.commas).to eq '-20,140,521.556'
106
+ expect('+20140521.556'.commas).to eq '20,140,521.556'
107
+ expect('+20140521.556e3'.commas).to eq '20,140,521,556'
108
+ expect('3.141591828'.commas(11)).to eq '3.14159182800'
109
+ expect('3.141591828'.commas(10)).to eq '3.1415918280'
110
+ expect('3.141591828'.commas(9)).to eq '3.141591828'
111
+ expect('3.141591828'.commas(8)).to eq '3.14159183'
112
+ expect('3.141591828'.commas(7)).to eq '3.1415918'
113
+ expect('3.141591828'.commas(6)).to eq '3.141592'
114
+ expect('3.141591828'.commas(5)).to eq '3.14159'
115
+ expect('3.141591828'.commas(4)).to eq '3.1416'
116
+ expect('3.141591828'.commas(3)).to eq '3.142'
117
+ expect('3.141591828'.commas(2)).to eq '3.14'
118
+ expect('3.141591828'.commas(1)).to eq '3.1'
119
+ expect('3.141591828'.commas(0)).to eq '3'
120
+ expect('3.14'.commas(5)).to eq '3.14000'
121
+ expect('6789345612.14'.commas).to eq '6,789,345,612.14'
122
+ expect('6789345612.14'.commas(-1)).to eq '6,789,345,610'
123
+ expect('6789345612.14'.commas(-2)).to eq '6,789,345,600'
124
+ expect('6789345612.14'.commas(-3)).to eq '6,789,346,000'
125
+ expect('6789345612.14'.commas(-4)).to eq '6,789,350,000'
126
+ expect('6789345612.14'.commas(-5)).to eq '6,789,300,000'
127
+ expect('6789345612.14'.commas(-6)).to eq '6,789,000,000'
128
+ expect('6789345612.14'.commas(-7)).to eq '6,790,000,000'
129
+ expect('6789345612.14'.commas(-8)).to eq '6,800,000,000'
130
+ expect('6789345612.14'.commas(-9)).to eq '7,000,000,000'
131
+ expect('6789345612.14'.commas(-10)).to eq '10,000,000,000'
132
+ expect('6789345612.14'.commas(-11)).to eq '0'
133
+ end
134
+
135
+ it 'determines if it\'s a valid number' do
136
+ expect('88'.number?).to be true
137
+ expect('-88'.number?).to be true
138
+ expect('8.008'.number?).to be true
139
+ expect('-8.008'.number?).to be true
140
+ expect('8.008e33'.number?).to be true
141
+ expect('-8.008e33'.number?).to be true
142
+ expect('0x8.008'.number?).to be false
143
+ expect('hello world'.number?).to be false
144
+ end
108
145
  end
109
146
 
110
- it 'should be able to convert a digital date to a Date' do
147
+ it 'converts a digital date to a Date' do
111
148
  expect('20140521'.as_date.iso).to eq '2014-05-21'
112
149
  expect('2014-05-21'.as_date.iso).to eq '2014-05-21'
113
150
  expect('2014/05/21'.as_date.iso).to eq '2014-05-21'
@@ -115,41 +152,7 @@ the people, for the people, shall not perish from the earth."
115
152
  expect('201X/5/21'.as_date).to be_nil
116
153
  end
117
154
 
118
- it 'should wrap a short string' do
119
- expect('hello, world'.wrap).to eq 'hello, world'
120
- end
121
-
122
- it 'should wrap a long string' do
123
- str = @getty.wrap
124
- str.split("\n").each { |l| expect(l.length).to be <= 70 }
125
- end
126
-
127
- it 'should wrap a long string with a hangining indent' do
128
- str = @getty.wrap(70, 10)
129
- str.split("\n").each { |l| expect(l.length).to be <= 70 }
130
- str.split("\n")[1..-1].each do |l|
131
- expect(l).to match(/^ /)
132
- end
133
- second_line = ' ' * 10 + 'this continent a new nation'
134
- third_line = ' ' * 10 + 'dedicated to the proposition'
135
- twenty_fourth_line = ' ' * 10 + 'shall not have died in vain'
136
- expect(str.split("\n")[1]).to match(/^#{second_line}/)
137
- expect(str.split("\n")[2]).to match(/^#{third_line}/)
138
- expect(str.split("\n")[23]).to match(/^#{twenty_fourth_line}/)
139
- end
140
-
141
- it 'should be able to determine is it\'s a valid number' do
142
- expect('88'.number?).to be true
143
- expect('-88'.number?).to be true
144
- expect('8.008'.number?).to be true
145
- expect('-8.008'.number?).to be true
146
- expect('8.008e33'.number?).to be true
147
- expect('-8.008e33'.number?).to be true
148
- expect('0x8.008'.number?).to be false
149
- expect('hello world'.number?).to be false
150
- end
151
-
152
- it 'should be able to convert a string to a regular expression' do
155
+ it 'converts a string to a regular expression' do
153
156
  # Ignores case by default
154
157
  re = "/hello((\s+)(world))?/".as_regexp
155
158
  expect(re.class).to eq Regexp
@@ -172,11 +175,11 @@ the people, for the people, shall not perish from the earth."
172
175
  expect(re.multiline?).to be false
173
176
  expect(re.match?('hello world')).to be false
174
177
  expect(re.match?(str)).to be true
175
- expect('Hello\b'.as_regexp).to eq %r{Hello\\b}
176
- expect('Hello'.as_regexp).to eq %r{Hello}
178
+ expect('Hello\b'.as_regexp).to eq(/Hello\\b/)
179
+ expect('Hello'.as_regexp).to eq(/Hello/)
177
180
  end
178
181
 
179
- it 'should be able to convert metacharacters into Regexp' do
182
+ it 'converts metacharacters into Regexp' do
180
183
  "\\$()*+.<>?[]^{|}".chars.each do |c|
181
184
  re = c.as_regexp
182
185
  expect(re.class).to eq Regexp
@@ -184,21 +187,20 @@ the people, for the people, shall not perish from the earth."
184
187
  end
185
188
  end
186
189
 
187
- it 'should be able to convert itself to a sym' do
190
+ it 'converts itself to a sym' do
188
191
  expect('joke'.as_sym).to eq :joke
189
192
  expect('hello world'.as_sym).to eq :hello_world
190
193
  expect("hello world it's me".as_sym).to eq :hello_world_its_me
191
194
  expect('Street1'.as_sym).to eq :street1
192
195
  end
193
196
 
194
- it 'should do nothing in response to as_string' do
197
+ it 'does nothing in response to as_string' do
195
198
  expect('joke'.as_string).to eq 'joke'
196
199
  expect('hello world'.as_string).to eq 'hello world'
197
- expect("hello world it's me".as_string)
198
- .to eq "hello world it's me"
200
+ expect("hello world it's me".as_string).to eq "hello world it's me"
199
201
  end
200
202
 
201
- it 'should be able to properly capitalize a string as a title' do
203
+ it 'properly capitalizes a string as a title' do
202
204
  # Capitalize little words only at beginning and end
203
205
  expect('the cat in the hat'.entitle).to eq('The Cat in the Hat')
204
206
  expect('dr'.entitle).to eq('Dr')
@@ -225,7 +227,7 @@ the people, for the people, shall not perish from the earth."
225
227
  expect('the hitler-stalin pact'.entitle).to eq('The Hitler-Stalin Pact')
226
228
  end
227
229
 
228
- it 'should be able to compute its Levenshtein distance from another string' do
230
+ it 'computes its Levenshtein distance from another string' do
229
231
  expect('Something'.distance('Smoething')).to eq 1
230
232
  expect('Something'.distance('meSothing')).to eq 4
231
233
  expect('SomethingElse'.distance('Encyclopedia')).to eq 11
@@ -235,7 +237,7 @@ the people, for the people, shall not perish from the earth."
235
237
  end
236
238
 
237
239
  describe 'Quoting' do
238
- it 'should be able to quote special TeX characters' do
240
+ it 'quotes special TeX characters' do
239
241
  expect('$10,000'.tex_quote).to eq('\\$10,000')
240
242
  expect('would~~have'.tex_quote).to eq('would\\textasciitilde{}\\textasciitilde{}have')
241
243
  expect('<hello>'.tex_quote).to eq('\\textless{}hello\\textgreater{}')
@@ -243,32 +245,38 @@ the people, for the people, shall not perish from the earth."
243
245
  end
244
246
  end
245
247
 
246
- describe 'Matching' do
247
- it 'should be able to fuzzy match with another string' do
248
+ describe 'Fuzzy Matching' do
249
+ it 'fuzzy matches with another string' do
248
250
  expect('Hello, world'.fuzzy_match('wor')).to be_truthy
249
251
  expect('Hello, world'.fuzzy_match('ox')).to be_falsy
250
252
  end
251
253
 
252
- it 'should be able to fuzzy match with another string containing re' do
254
+ it 'fuzzy matches with another string containing re' do
253
255
  expect('Hello, world'.matches_with('/or/')).to be_truthy
254
256
  expect('Hello, world'.matches_with('/ox/')).to be_falsy
255
257
  end
256
258
 
257
- it 'should be able to fuzzy match space-separated parts' do
259
+ it 'fuzzy matches space-separated parts' do
258
260
  expect('Hello world'.fuzzy_match('hel wor')).to be_truthy
259
261
  expect('Hello, world'.fuzzy_match('hel ox')).to be_falsy
260
262
  end
261
263
 
262
- it 'should be able to fuzzy match colon-separated parts' do
264
+ it 'fuzzy matches colon-separated parts' do
263
265
  expect('Hello:world'.fuzzy_match('hel:wor')).to be_truthy
264
266
  expect('Hello:world'.fuzzy_match('hel:ox')).to be_falsy
265
267
  end
266
268
 
267
- it 'should be able to fuzzy match colon-separated parts' do
269
+ it 'fuzzy matches colon-separated parts' do
268
270
  expect('Hello:world'.fuzzy_match('hel:wor')).to be_truthy
269
271
  expect('Hello:world'.fuzzy_match('hel:ox')).to be_falsy
270
272
  end
271
273
 
274
+ it 'treats an internal `:stuff in the matcher as \bstuff.*?\b' do
275
+ expect('Hello, what is with the world?'.fuzzy_match('wha:wi:wor')).to be_truthy
276
+ expect('Hello:world'.fuzzy_match('what:or')).to be_falsy
277
+ expect('Hello, what=+&is (with) the world?'.fuzzy_match('wha:wi:wor')).to be_truthy
278
+ end
279
+
272
280
  it 'requires end-anchor for ending colon' do
273
281
  expect('Hello, to the world'.fuzzy_match('hel:world:')).to eq('Hello to the world')
274
282
  expect('Hello, to the world today'.fuzzy_match('to:world:')).to be_nil
@@ -284,13 +292,13 @@ the people, for the people, shall not perish from the earth."
284
292
  expect('Hello, to the world today'.fuzzy_match('hel:world:')).to be_falsy
285
293
  end
286
294
 
287
- it 'should return the matched text' do
295
+ it 'returns the matched text after match' do
288
296
  expect('Hello:world'.fuzzy_match('hel')).to eq('Hel')
289
297
  expect('Hello:world'.fuzzy_match('hel:wor')).to eq('Hello:wor')
290
298
  expect('Hello:world'.matches_with('/^h.*r/')).to eq('Hello:wor')
291
299
  end
292
300
 
293
- it 'should ignore periods, commas, and apostrophes when matching' do
301
+ it 'ignores periods, commas, and apostrophes when matching' do
294
302
  expect("St. Luke's".fuzzy_match('st lukes')).to eq('St Lukes')
295
303
  expect('St Lukes'.fuzzy_match('st. luke\'s')).to eq('St Lukes')
296
304
  expect('St Lukes, Inc.'.fuzzy_match('st luke inc')).to eq('St Lukes Inc')
@@ -2,16 +2,16 @@ require 'spec_helper'
2
2
  require 'fat_core/symbol'
3
3
 
4
4
  describe Symbol do
5
- it 'should be able to convert to a capitalized string' do
5
+ it 'converts to a capitalized string' do
6
6
  expect(:i_am_a_symbol.entitle).to eq 'I Am a Symbol'
7
7
  expect(:i_am_a_symbol.as_string).to eq 'I Am a Symbol'
8
8
  end
9
9
 
10
- it 'should respond to tex_quote' do
10
+ it 'responds to tex_quote' do
11
11
  expect(:i_am_a_symbol.tex_quote).to eq 'i\\_am\\_a\\_symbol'
12
12
  end
13
13
 
14
- it 'should respond to :as_sym as identity' do
14
+ it 'responds to :as_sym as identity' do
15
15
  expect(:i_am_a_symbol.as_sym).to eq :i_am_a_symbol
16
16
  end
17
17
  end
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.12.0
4
+ version: 4.13.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: 2022-09-26 00:00:00.000000000 Z
11
+ date: 2022-12-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: simplecov
@@ -164,7 +164,12 @@ dependencies:
164
164
  - - ">="
165
165
  - !ruby/object:Gem::Version
166
166
  version: '0'
167
- description: Useful extensions to Date, String, Range and other classes
167
+ description: |
168
+ Useful extensions to Date, String, Range and other classes
169
+ including useful Date extensions for dealing with US Federal
170
+ and New York Stock Exchange holidays and working days, a useful
171
+ Enumerable#each_with_flags for flagging first and last items in the
172
+ iteration, (also for Hash), set operations on Ranges
168
173
  email:
169
174
  - ded@ddoherty.net
170
175
  executables:
@@ -234,10 +239,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
234
239
  - !ruby/object:Gem::Version
235
240
  version: '0'
236
241
  requirements: []
237
- rubygems_version: 3.3.7
242
+ rubygems_version: 3.3.22
238
243
  signing_key:
239
244
  specification_version: 4
240
- summary: fat_core provides some useful core extensions
245
+ summary: some useful core extensions
241
246
  test_files:
242
247
  - spec/lib/array_spec.rb
243
248
  - spec/lib/bigdecimal_spec.rb