epitools 0.5.79 → 0.5.81
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/.gemspec +1 -1
- data/Rakefile +12 -0
- data/VERSION +1 -1
- data/lib/epitools/autoloads.rb +18 -7
- data/lib/epitools/core_ext/enumerable.rb +18 -3
- data/lib/epitools/core_ext/numbers.rb +1 -9
- data/lib/epitools/core_ext/string.rb +0 -34
- data/lib/epitools/core_ext/truthiness.rb +86 -0
- data/lib/epitools/minimal.rb +6 -0
- data/spec/core_ext_spec.rb +48 -8
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8331753ad7012fb296bd72ac0e18d68b670b69d2
|
4
|
+
data.tar.gz: 4fc4a3aae6820feb16508a0bf719e279c3865e2a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2169dc5158cd619f98e42f908a3cf4d1665ae9d5d38235e5b660fef4052d7e6a56359a7cdf7acfdb2122da630dfb3d30fdadbdd177db5eeaccff3966b330d5f6
|
7
|
+
data.tar.gz: 8a177e9b1d3f2dc232c9edc5874ce9801adb68d3f75ea6508a465ef7c1cdd2ba421edd2cf83c235cabc2adaedb4f66946dad3a1766f494e5a4f7ebc9e164c831
|
data/.gemspec
CHANGED
data/Rakefile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.5.
|
1
|
+
0.5.81
|
data/lib/epitools/autoloads.rb
CHANGED
@@ -27,22 +27,32 @@ module Digest
|
|
27
27
|
autoload :MD5, 'digest/md5'
|
28
28
|
end
|
29
29
|
|
30
|
-
|
30
|
+
if RUBY_VERSION["1.8.7"]
|
31
|
+
autoload :Prime, 'mathn'
|
32
|
+
else
|
33
|
+
autoload :Prime, 'prime'
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
## Networking
|
38
|
+
|
31
39
|
['IP', 'Basic', 'TCP', 'UDP', 'UNIX', ''].each do |type|
|
32
40
|
autoload :"#{type}Socket", 'socket'
|
33
41
|
end
|
34
42
|
|
35
|
-
# Network Servers
|
36
43
|
['TCP', 'UNIX'].each do |type|
|
37
44
|
autoload :"#{type}Server", 'socket'
|
38
45
|
end
|
39
46
|
|
40
|
-
|
41
|
-
autoload :
|
42
|
-
|
43
|
-
autoload :
|
47
|
+
module Net
|
48
|
+
autoload :HTTP, 'net/http'
|
49
|
+
autoload :HTTPS, 'net/https'
|
50
|
+
autoload :FTP, 'net/ftp'
|
51
|
+
autoload :FTP, 'net/ftp'
|
44
52
|
end
|
45
53
|
|
54
|
+
autoload :Resolv, 'resolv'
|
55
|
+
|
46
56
|
|
47
57
|
## Nonstandard library (epitools)
|
48
58
|
|
@@ -80,7 +90,8 @@ autoreq :AwesomePrint do
|
|
80
90
|
end
|
81
91
|
end
|
82
92
|
|
83
|
-
|
93
|
+
|
94
|
+
## YAML hacks (the module might not be loaded properly in older Rubies)
|
84
95
|
|
85
96
|
if defined? YAML and not defined? YAML.parse
|
86
97
|
del YAML # remove the existing module
|
@@ -59,6 +59,9 @@ module Enumerable
|
|
59
59
|
# [1,2,3,4,5].split{ |e| e == 3 }
|
60
60
|
# #=> [ [1,2], [4,5] ]
|
61
61
|
#
|
62
|
+
# "hello\n\nthere\n".each_line.split_at("\n").to_a
|
63
|
+
# #=> [ ["hello\n"], ["there\n"] ]
|
64
|
+
#
|
62
65
|
# [1,2,3,4,5].split(:include_boundary=>true) { |e| e == 3 }
|
63
66
|
# #=> [ [1,2], [3,4,5] ]
|
64
67
|
#
|
@@ -71,11 +74,10 @@ module Enumerable
|
|
71
74
|
if matcher.nil?
|
72
75
|
boundary_test_proc = block
|
73
76
|
else
|
74
|
-
if matcher.is_a?
|
75
|
-
boundary_test_proc = proc { |element| element
|
77
|
+
if matcher.is_a? Regexp
|
78
|
+
boundary_test_proc = proc { |element| element =~ matcher }
|
76
79
|
else
|
77
80
|
boundary_test_proc = proc { |element| element == matcher }
|
78
|
-
#raise "I don't know how to split with #{matcher}"
|
79
81
|
end
|
80
82
|
end
|
81
83
|
|
@@ -191,6 +193,19 @@ module Enumerable
|
|
191
193
|
sum / count.to_f
|
192
194
|
end
|
193
195
|
|
196
|
+
#
|
197
|
+
# Lazily enumerate unique elements
|
198
|
+
# (WARNING: This can cause an infinite loop if you enumerate over a cycle,
|
199
|
+
# since it will keep reading the input until it finds a unique element)
|
200
|
+
#
|
201
|
+
def uniq
|
202
|
+
already_seen = Set.new
|
203
|
+
|
204
|
+
Enumerator::Lazy.new(self) do |yielder, value|
|
205
|
+
yielder << value if already_seen.add?(value)
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
194
209
|
#
|
195
210
|
# The same as "map", except that if an element is an Array or Enumerable, map is called
|
196
211
|
# recursively on that element. (Hashes are ignored because of the complications of block
|
@@ -3,10 +3,6 @@ Number = Numeric # "obj.is_a? Number" just sounds better.
|
|
3
3
|
|
4
4
|
class Numeric
|
5
5
|
|
6
|
-
def integer?; true; end
|
7
|
-
|
8
|
-
def truthy?; self > 0; end
|
9
|
-
|
10
6
|
#
|
11
7
|
# Convert this number to a string, adding commas between each group of 3 digits.
|
12
8
|
#
|
@@ -251,11 +247,6 @@ end
|
|
251
247
|
|
252
248
|
|
253
249
|
class Integer
|
254
|
-
|
255
|
-
#
|
256
|
-
# 'true' if the integer is 0
|
257
|
-
#
|
258
|
-
def blank?; self == 0; end
|
259
250
|
|
260
251
|
#
|
261
252
|
# Convert the number into a hexadecimal string representation.
|
@@ -376,6 +367,7 @@ end
|
|
376
367
|
end
|
377
368
|
end
|
378
369
|
|
370
|
+
|
379
371
|
class Time
|
380
372
|
|
381
373
|
#
|
@@ -2,40 +2,6 @@ require 'epitools/minimal'
|
|
2
2
|
require 'epitools/core_ext/numbers'
|
3
3
|
|
4
4
|
class String
|
5
|
-
|
6
|
-
#
|
7
|
-
# Could this string be cast to an integer?
|
8
|
-
#
|
9
|
-
def integer?
|
10
|
-
strip.match(/^\d+$/) ? true : false
|
11
|
-
end
|
12
|
-
|
13
|
-
#
|
14
|
-
# 'true' if the string's length is 0 (after whitespace has been stripped from the ends)
|
15
|
-
#
|
16
|
-
def blank?
|
17
|
-
strip.size == 0
|
18
|
-
end
|
19
|
-
|
20
|
-
#
|
21
|
-
# Is there anything in the string? (ignoring whitespace/newlines)
|
22
|
-
#
|
23
|
-
def any?
|
24
|
-
not blank?
|
25
|
-
end
|
26
|
-
alias_method :present?, :any?
|
27
|
-
|
28
|
-
#
|
29
|
-
# Does this string contain something that means roughly "true"?
|
30
|
-
#
|
31
|
-
def truthy?
|
32
|
-
case strip.downcase
|
33
|
-
when "1", "true", "yes", "on", "enabled", "affirmative"
|
34
|
-
true
|
35
|
-
else
|
36
|
-
false
|
37
|
-
end
|
38
|
-
end
|
39
5
|
|
40
6
|
#
|
41
7
|
# Convert \r\n to \n
|
@@ -6,6 +6,16 @@ class Object
|
|
6
6
|
#
|
7
7
|
def integer?; false; end
|
8
8
|
|
9
|
+
#
|
10
|
+
# Default "float?" behaviour.
|
11
|
+
#
|
12
|
+
def float?; false; end
|
13
|
+
|
14
|
+
#
|
15
|
+
# Default "number?" behaviour.
|
16
|
+
#
|
17
|
+
def number?; false; end
|
18
|
+
|
9
19
|
#
|
10
20
|
# `truthy?` means `not blank?`
|
11
21
|
#
|
@@ -34,6 +44,27 @@ class FalseClass
|
|
34
44
|
end
|
35
45
|
|
36
46
|
|
47
|
+
class Numeric
|
48
|
+
|
49
|
+
def truthy?; self > 0; end
|
50
|
+
|
51
|
+
def number?; true; end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
class Integer
|
57
|
+
|
58
|
+
#
|
59
|
+
# 'true' if the integer is 0
|
60
|
+
#
|
61
|
+
def blank?; self == 0; end
|
62
|
+
|
63
|
+
def integer?; true; end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
|
37
68
|
class Float
|
38
69
|
|
39
70
|
#
|
@@ -41,6 +72,8 @@ class Float
|
|
41
72
|
#
|
42
73
|
def blank?; self == 0.0; end
|
43
74
|
|
75
|
+
def float?; true; end
|
76
|
+
|
44
77
|
end
|
45
78
|
|
46
79
|
|
@@ -62,3 +95,56 @@ class Symbol
|
|
62
95
|
def blank?; false; end
|
63
96
|
|
64
97
|
end
|
98
|
+
|
99
|
+
|
100
|
+
class String
|
101
|
+
|
102
|
+
#
|
103
|
+
# Could this string be cast to an integer?
|
104
|
+
#
|
105
|
+
def integer?
|
106
|
+
!!strip.match(/^-?\d+$/)
|
107
|
+
end
|
108
|
+
|
109
|
+
#
|
110
|
+
# Could this string be cast to an float?
|
111
|
+
#
|
112
|
+
def float?
|
113
|
+
!!strip.match(/^-?\d+\.\d+$/)
|
114
|
+
end
|
115
|
+
|
116
|
+
#
|
117
|
+
# Could this string be cast to an number?
|
118
|
+
#
|
119
|
+
def number?
|
120
|
+
!!strip.match(/^-?\d\.?\d*$/)
|
121
|
+
end
|
122
|
+
|
123
|
+
#
|
124
|
+
# 'true' if the string's length is 0 (after whitespace has been stripped from the ends)
|
125
|
+
#
|
126
|
+
def blank?
|
127
|
+
strip.size == 0
|
128
|
+
end
|
129
|
+
|
130
|
+
#
|
131
|
+
# Is there anything in the string? (ignoring whitespace/newlines)
|
132
|
+
#
|
133
|
+
def any?
|
134
|
+
not blank?
|
135
|
+
end
|
136
|
+
alias_method :present?, :any?
|
137
|
+
|
138
|
+
#
|
139
|
+
# Does this string contain something that means roughly "true"?
|
140
|
+
#
|
141
|
+
def truthy?
|
142
|
+
case strip.downcase
|
143
|
+
when "1", "true", "yes", "on", "enabled", "affirmative"
|
144
|
+
true
|
145
|
+
else
|
146
|
+
false
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
data/lib/epitools/minimal.rb
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
#
|
2
|
+
# If you require 'epitools/minimal' instead of 'epitools',
|
3
|
+
# this is what you get: core_ext monkeypatches and all the
|
4
|
+
# autoloads; the barest essentials for survival.
|
5
|
+
#
|
6
|
+
|
1
7
|
if RUBY_VERSION[/^1.8/]
|
2
8
|
require 'enumerator'
|
3
9
|
Enumerator = Enumerable::Enumerator unless defined? Enumerator
|
data/spec/core_ext_spec.rb
CHANGED
@@ -251,7 +251,6 @@ describe String do
|
|
251
251
|
" asdf" => " Asdf",
|
252
252
|
"ASDFASDFA SDF" => "Asdfasdfa Sdf",
|
253
253
|
"What's Up" => "What's Up",
|
254
|
-
"What's Up" => "What's Up",
|
255
254
|
"they're awesome" => "They're Awesome",
|
256
255
|
"king of pain" => "King of Pain",
|
257
256
|
"a-b-c 1-2-3" => "A-B-C 1-2-3",
|
@@ -342,11 +341,11 @@ end
|
|
342
341
|
|
343
342
|
describe Integer do
|
344
343
|
|
345
|
-
it "integer?" do
|
344
|
+
it "integer?s" do
|
346
345
|
|
347
346
|
{
|
348
|
-
true => [ "123", "000", 123
|
349
|
-
false => [ "123asdf", "asdfasdf", Object.new, nil ]
|
347
|
+
true => [ "123", "000", 123 ],
|
348
|
+
false => [ "123asdf", "asdfasdf", Object.new, nil, 123.45 ]
|
350
349
|
}.each do |expected_result, objects|
|
351
350
|
objects.each { |object| object.integer?.should == expected_result }
|
352
351
|
end
|
@@ -401,6 +400,30 @@ describe Integer do
|
|
401
400
|
|
402
401
|
end
|
403
402
|
|
403
|
+
describe Float do
|
404
|
+
|
405
|
+
it "float?" do
|
406
|
+
{
|
407
|
+
true => [ "0.0", "1.000", 123.45 ],
|
408
|
+
false => [ "123asdf", "asdfasdf", Object.new, nil, 12345, "000", "123" ]
|
409
|
+
}.each do |expected_result, objects|
|
410
|
+
objects.each { |object| object.float?.should == expected_result }
|
411
|
+
end
|
412
|
+
end
|
413
|
+
end
|
414
|
+
|
415
|
+
describe Number do
|
416
|
+
|
417
|
+
it "number?" do
|
418
|
+
{
|
419
|
+
true => [ "0.0", " 1.0", "1.000", "-1", "-1.25", 123.45, 12345, "000", "123", "1" ],
|
420
|
+
false => [ "123asdf", "abcd123", "asdfasdf", Object.new, nil ]
|
421
|
+
}.each do |expected_result, objects|
|
422
|
+
objects.each { |object| object.number?.should == expected_result }
|
423
|
+
end
|
424
|
+
end
|
425
|
+
|
426
|
+
end
|
404
427
|
|
405
428
|
describe Array do
|
406
429
|
|
@@ -477,8 +500,11 @@ describe Enumerable do
|
|
477
500
|
[1,2,3,4,5].split_after {|e| e == 3}.should == [ [1,2,3], [4,5] ]
|
478
501
|
[1,2,3,4,5].split_before {|e| e == 3}.should == [ [1,2], [3,4,5] ]
|
479
502
|
|
480
|
-
result = "a\nb\n---\nc\nd\n".
|
481
|
-
result.
|
503
|
+
result = "a\nb\n---\nc\nd\n".each_line.split_at(/---/)
|
504
|
+
result.to_a.should == [ ["a\n", "b\n"], ["c\n", "d\n"] ]
|
505
|
+
|
506
|
+
result = "hello\n\nthere\n".each_line.split_at("\n")
|
507
|
+
result.to_a.should == [ ["hello\n"], ["there\n"] ]
|
482
508
|
end
|
483
509
|
|
484
510
|
it "splits with nested things" do
|
@@ -534,6 +560,10 @@ describe Enumerable do
|
|
534
560
|
[1,1,3,3].average.should == 2.0
|
535
561
|
end
|
536
562
|
|
563
|
+
it "uniqs lazily" do
|
564
|
+
[0,0,0,1].cycle.uniq.take(2).to_a.should == [0,1]
|
565
|
+
end
|
566
|
+
|
537
567
|
it "foldl's" do
|
538
568
|
a = [1,2,3,4]
|
539
569
|
a.foldl(:+).should == a.sum
|
@@ -764,6 +794,7 @@ describe BasicObject do
|
|
764
794
|
|
765
795
|
end
|
766
796
|
|
797
|
+
|
767
798
|
describe Range do
|
768
799
|
|
769
800
|
it "generates random numbers" do
|
@@ -780,6 +811,7 @@ describe Range do
|
|
780
811
|
|
781
812
|
end
|
782
813
|
|
814
|
+
|
783
815
|
describe ObjectSpace do
|
784
816
|
|
785
817
|
it "is Enumerable" do
|
@@ -788,6 +820,7 @@ describe ObjectSpace do
|
|
788
820
|
|
789
821
|
end
|
790
822
|
|
823
|
+
|
791
824
|
describe Matrix do
|
792
825
|
|
793
826
|
it "draws a matrix" do
|
@@ -822,19 +855,23 @@ describe Matrix do
|
|
822
855
|
|
823
856
|
end
|
824
857
|
|
858
|
+
|
825
859
|
describe "truthiness" do
|
826
860
|
|
827
861
|
it "is truthy!" do
|
828
862
|
{
|
829
863
|
# truthy things
|
830
864
|
true => [
|
831
|
-
"yes", "on", "1", "Enabled",
|
865
|
+
"yes", "on", "1", "Enabled",
|
866
|
+
1, 1.7,
|
867
|
+
:blah, true,
|
868
|
+
[1,2,3], [1,2,3].to_enum,
|
832
869
|
1938389127239847129803741980237498012374,
|
833
870
|
],
|
834
871
|
|
835
872
|
# untruthy things
|
836
873
|
false => [
|
837
|
-
"", " ", "asdf", 0, 0.0, false, nil, [], [].to_enum,
|
874
|
+
"", " ", "\t\n ", "asdf", 0, 0.0, false, nil, [], [].to_enum,
|
838
875
|
]
|
839
876
|
}.each do |truthiness, objs|
|
840
877
|
objs.each { |obj| obj.truthy?.should == truthiness }
|
@@ -843,6 +880,7 @@ describe "truthiness" do
|
|
843
880
|
|
844
881
|
end
|
845
882
|
|
883
|
+
|
846
884
|
describe "proper grammar" do
|
847
885
|
|
848
886
|
it "responds_to?" do
|
@@ -885,6 +923,7 @@ describe "global methods" do
|
|
885
923
|
|
886
924
|
end
|
887
925
|
|
926
|
+
|
888
927
|
describe "to_jsons and to_yamls" do
|
889
928
|
data = {"a"=>"b", "yes"=>true, "hello"=>[1,2,3,4,5]}
|
890
929
|
data.to_json.from_json.should == data
|
@@ -893,6 +932,7 @@ describe "to_jsons and to_yamls" do
|
|
893
932
|
data.to_yaml.from_yaml.should == data
|
894
933
|
end
|
895
934
|
|
935
|
+
|
896
936
|
describe "to_hms and from_hms" do
|
897
937
|
60.to_hms.should == "01:00"
|
898
938
|
60.to_hms.from_hms.should == 60
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: epitools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.81
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- epitron
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-12-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -123,7 +123,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
123
123
|
version: '0'
|
124
124
|
requirements: []
|
125
125
|
rubyforge_project:
|
126
|
-
rubygems_version: 2.4.5
|
126
|
+
rubygems_version: 2.4.5.1
|
127
127
|
signing_key:
|
128
128
|
specification_version: 3
|
129
129
|
summary: Not utils... METILS!
|