epitools 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/epitools.gemspec +8 -5
- data/lib/epitools.rb +1 -0
- data/lib/epitools/basetypes.rb +70 -15
- data/lib/epitools/rails.rb +0 -1
- data/lib/epitools/ratio.rb +48 -0
- data/spec/basetypes_spec.rb +20 -0
- data/spec/ratio_spec.rb +24 -0
- metadata +8 -5
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.3
|
data/epitools.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{epitools}
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["epitron"]
|
@@ -35,12 +35,14 @@ Gem::Specification.new do |s|
|
|
35
35
|
"lib/epitools/pretty_backtrace.rb",
|
36
36
|
"lib/epitools/rails.rb",
|
37
37
|
"lib/epitools/rash.rb",
|
38
|
+
"lib/epitools/ratio.rb",
|
38
39
|
"lib/epitools/string_to_proc.rb",
|
39
40
|
"spec/basetypes_spec.rb",
|
40
41
|
"spec/lcs_spec.rb",
|
41
42
|
"spec/metaclass_spec.rb",
|
42
43
|
"spec/permutations_spec.rb",
|
43
44
|
"spec/rash_spec.rb",
|
45
|
+
"spec/ratio_spec.rb",
|
44
46
|
"spec/spec.opts",
|
45
47
|
"spec/spec_helper.rb"
|
46
48
|
]
|
@@ -50,12 +52,13 @@ Gem::Specification.new do |s|
|
|
50
52
|
s.rubygems_version = %q{1.3.6}
|
51
53
|
s.summary = %q{NOT UTILS... METILS!}
|
52
54
|
s.test_files = [
|
53
|
-
"spec/
|
55
|
+
"spec/permutations_spec.rb",
|
54
56
|
"spec/rash_spec.rb",
|
55
|
-
"spec/metaclass_spec.rb",
|
56
|
-
"spec/permutations_spec.rb",
|
57
57
|
"spec/spec_helper.rb",
|
58
|
-
"spec/
|
58
|
+
"spec/lcs_spec.rb",
|
59
|
+
"spec/basetypes_spec.rb",
|
60
|
+
"spec/ratio_spec.rb",
|
61
|
+
"spec/metaclass_spec.rb"
|
59
62
|
]
|
60
63
|
|
61
64
|
if s.respond_to? :specification_version then
|
data/lib/epitools.rb
CHANGED
data/lib/epitools/basetypes.rb
CHANGED
@@ -5,12 +5,10 @@ class Object
|
|
5
5
|
def integer?; false; end
|
6
6
|
end
|
7
7
|
|
8
|
-
|
9
8
|
class Float
|
10
9
|
def integer?; true; end
|
11
10
|
end
|
12
11
|
|
13
|
-
|
14
12
|
class String
|
15
13
|
|
16
14
|
#
|
@@ -20,6 +18,27 @@ class String
|
|
20
18
|
self.strip.match(/^\d+$/) ? true : false
|
21
19
|
end
|
22
20
|
|
21
|
+
#
|
22
|
+
# Convert \r\n to \n
|
23
|
+
#
|
24
|
+
def to_unix
|
25
|
+
gsub("\r\n", "\n")
|
26
|
+
end
|
27
|
+
|
28
|
+
#
|
29
|
+
# Remove redundant whitespaces (not including newlines).
|
30
|
+
#
|
31
|
+
def tighten
|
32
|
+
gsub(/[\t ]+/,' ').strip
|
33
|
+
end
|
34
|
+
|
35
|
+
#
|
36
|
+
# Remove redundant whitespace AND newlines.
|
37
|
+
#
|
38
|
+
def dewhitespace
|
39
|
+
gsub(/\s+/,' ').strip
|
40
|
+
end
|
41
|
+
|
23
42
|
#
|
24
43
|
# Like #lines, but skips empty lines and removes \n's.
|
25
44
|
#
|
@@ -31,7 +50,6 @@ class String
|
|
31
50
|
|
32
51
|
end
|
33
52
|
|
34
|
-
|
35
53
|
class Integer
|
36
54
|
|
37
55
|
def integer?
|
@@ -97,12 +115,13 @@ module Enumerable
|
|
97
115
|
include_boundary = options[:include_boundary] || false
|
98
116
|
|
99
117
|
if matcher.nil?
|
100
|
-
|
118
|
+
boundary_test_proc = block
|
101
119
|
else
|
102
120
|
if matcher.is_a? String or matcher.is_a? Regexp
|
103
|
-
|
121
|
+
boundary_test_proc = proc { |element| element[matcher] rescue nil }
|
104
122
|
else
|
105
|
-
|
123
|
+
boundary_test_proc = proc { |element| element == matcher }
|
124
|
+
#raise "I don't know how to split with #{matcher}"
|
106
125
|
end
|
107
126
|
end
|
108
127
|
|
@@ -111,7 +130,7 @@ module Enumerable
|
|
111
130
|
|
112
131
|
each do |e|
|
113
132
|
|
114
|
-
if
|
133
|
+
if boundary_test_proc.call(e)
|
115
134
|
|
116
135
|
if current_chunk.empty? and not include_boundary
|
117
136
|
next # hit 2 boundaries in a row... just keep moving, people!
|
@@ -140,8 +159,6 @@ module Enumerable
|
|
140
159
|
chunks # resultset
|
141
160
|
end
|
142
161
|
|
143
|
-
alias_method :split, :split_at
|
144
|
-
|
145
162
|
#
|
146
163
|
# Split the array into chunks, with the boundaries being after the element to split on.
|
147
164
|
#
|
@@ -150,7 +167,7 @@ module Enumerable
|
|
150
167
|
def split_after(matcher=nil, options={}, &block)
|
151
168
|
options[:after] ||= true
|
152
169
|
options[:include_boundary] ||= true
|
153
|
-
|
170
|
+
split_at(matcher, options, &block)
|
154
171
|
end
|
155
172
|
|
156
173
|
#
|
@@ -160,7 +177,7 @@ module Enumerable
|
|
160
177
|
#
|
161
178
|
def split_before(matcher=nil, options={}, &block)
|
162
179
|
options[:include_boundary] ||= true
|
163
|
-
|
180
|
+
split_at(matcher, options, &block)
|
164
181
|
end
|
165
182
|
|
166
183
|
#
|
@@ -298,15 +315,26 @@ end
|
|
298
315
|
|
299
316
|
|
300
317
|
class Hash
|
318
|
+
|
319
|
+
#
|
320
|
+
# Runs remove_blank_lines on self.
|
321
|
+
#
|
301
322
|
def remove_blank_values!
|
302
323
|
delete_if{|k,v| v.blank?}
|
303
324
|
self
|
304
325
|
end
|
305
326
|
|
327
|
+
#
|
328
|
+
# Returns a new Hash where all elements whose values are "blank?" (eg: "", [], nil)
|
329
|
+
# have been eliminated.
|
330
|
+
#
|
306
331
|
def remove_blank_values
|
307
332
|
dup.remove_blank_values!
|
308
333
|
end
|
309
334
|
|
335
|
+
#
|
336
|
+
# Runs map_values on self.
|
337
|
+
#
|
310
338
|
def map_values!(&block)
|
311
339
|
keys.each do |key|
|
312
340
|
value = self[key]
|
@@ -315,10 +343,16 @@ class Hash
|
|
315
343
|
self
|
316
344
|
end
|
317
345
|
|
346
|
+
#
|
347
|
+
# Returns a Hash whsoe values have been transformed by the block.
|
348
|
+
#
|
318
349
|
def map_values(&block)
|
319
350
|
dup.map_values!(&block)
|
320
351
|
end
|
321
|
-
|
352
|
+
|
353
|
+
#
|
354
|
+
# Runs map_keys on self.
|
355
|
+
#
|
322
356
|
def map_keys!(&block)
|
323
357
|
keys.each do |key|
|
324
358
|
value = delete(key)
|
@@ -327,13 +361,34 @@ class Hash
|
|
327
361
|
self
|
328
362
|
end
|
329
363
|
|
364
|
+
#
|
365
|
+
# Returns a new Hash whose keys have been transformed by the block.
|
366
|
+
#
|
330
367
|
def map_keys(&block)
|
331
368
|
dup.map_keys!(&block)
|
332
369
|
end
|
333
370
|
|
334
|
-
#
|
335
|
-
#
|
336
|
-
#
|
371
|
+
#
|
372
|
+
# Creates an new Hash whose missing items default to [].
|
373
|
+
# Good for collecting things!
|
374
|
+
#
|
375
|
+
# eg:
|
376
|
+
# Hash.of_arrays[:yays] << "YAY!"
|
377
|
+
#
|
378
|
+
def self.of_arrays
|
379
|
+
new {|h,k| h[k] = [] }
|
380
|
+
end
|
381
|
+
|
382
|
+
#
|
383
|
+
# Creates an new Hash whose missing items default to values of 0.
|
384
|
+
# Good for counting things!
|
385
|
+
#
|
386
|
+
# eg:
|
387
|
+
# Hash.of_integers[:yays] += 1
|
388
|
+
#
|
389
|
+
def self.of_integers
|
390
|
+
new(0)
|
391
|
+
end
|
337
392
|
|
338
393
|
end
|
339
394
|
|
data/lib/epitools/rails.rb
CHANGED
@@ -0,0 +1,48 @@
|
|
1
|
+
|
2
|
+
class Ratio
|
3
|
+
|
4
|
+
include Comparable
|
5
|
+
|
6
|
+
def <=>(other)
|
7
|
+
to_f <=> other.to_f
|
8
|
+
end
|
9
|
+
|
10
|
+
attr_accessor :first, :last
|
11
|
+
|
12
|
+
def self.[](*args)
|
13
|
+
new(*args)
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize(first, last=1)
|
17
|
+
@first = first
|
18
|
+
@last = last
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_s
|
22
|
+
"#{@first}/#{@last}"
|
23
|
+
end
|
24
|
+
alias_method :ratio, :to_s
|
25
|
+
|
26
|
+
def to_f
|
27
|
+
if @last == 0
|
28
|
+
0.0
|
29
|
+
else
|
30
|
+
@first.to_f / @last
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def percent
|
35
|
+
"%0.1f%" % (to_f * 100)
|
36
|
+
end
|
37
|
+
alias_method :to_percent, :percent
|
38
|
+
|
39
|
+
def inspect
|
40
|
+
"#<Ratio: #{to_s}>"
|
41
|
+
end
|
42
|
+
|
43
|
+
def +(other)
|
44
|
+
Ratio.new( first+other.first, last+other.last)
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
data/spec/basetypes_spec.rb
CHANGED
@@ -104,6 +104,26 @@ describe Enumerable do
|
|
104
104
|
"a\nb\n---\nc\nd\n".split_at(/---/).map_recursive(&:strip).should == [ %w[a b], %w[c d] ]
|
105
105
|
end
|
106
106
|
|
107
|
+
it "handles nested things" do
|
108
|
+
array = [ [],["a"],"a",[1,2,3] ]
|
109
|
+
|
110
|
+
lambda {
|
111
|
+
array.split_at("a")
|
112
|
+
}.should_not raise_error
|
113
|
+
|
114
|
+
array.split_at("a").should == [ array[0..1], array[3..3] ]
|
115
|
+
array.split_at([1,2,3]).should == [ array[0..2] ]
|
116
|
+
end
|
117
|
+
|
118
|
+
it "handles arbitrary objects" do
|
119
|
+
arbitrary = Struct.new(:a, :b, :c)
|
120
|
+
|
121
|
+
particular = arbitrary.new(1,2,3)
|
122
|
+
array = [ arbitrary.new, arbitrary.new, particular, arbitrary.new]
|
123
|
+
|
124
|
+
array.split_at(particular).should == [ array[0..1], array[3..3] ]
|
125
|
+
end
|
126
|
+
|
107
127
|
it "sums" do
|
108
128
|
[1,2,3,4,5].sum.should == 15
|
109
129
|
end
|
data/spec/ratio_spec.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'epitools/ratio'
|
2
|
+
|
3
|
+
describe Ratio do
|
4
|
+
|
5
|
+
before :each do
|
6
|
+
@a = Ratio[1,1]
|
7
|
+
@b = Ratio[1,2]
|
8
|
+
end
|
9
|
+
|
10
|
+
it "adds" do
|
11
|
+
( @a + @b ).should == Ratio[2,3]
|
12
|
+
end
|
13
|
+
|
14
|
+
it "floats" do
|
15
|
+
@a.to_f.should == 1.0
|
16
|
+
@b.to_f.should == 0.5
|
17
|
+
end
|
18
|
+
|
19
|
+
it "percents" do
|
20
|
+
@a.percent.should == "100.0%"
|
21
|
+
@b.percent.should == "50.0%"
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
version: 0.1.
|
8
|
+
- 3
|
9
|
+
version: 0.1.3
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- epitron
|
@@ -59,12 +59,14 @@ files:
|
|
59
59
|
- lib/epitools/pretty_backtrace.rb
|
60
60
|
- lib/epitools/rails.rb
|
61
61
|
- lib/epitools/rash.rb
|
62
|
+
- lib/epitools/ratio.rb
|
62
63
|
- lib/epitools/string_to_proc.rb
|
63
64
|
- spec/basetypes_spec.rb
|
64
65
|
- spec/lcs_spec.rb
|
65
66
|
- spec/metaclass_spec.rb
|
66
67
|
- spec/permutations_spec.rb
|
67
68
|
- spec/rash_spec.rb
|
69
|
+
- spec/ratio_spec.rb
|
68
70
|
- spec/spec.opts
|
69
71
|
- spec/spec_helper.rb
|
70
72
|
has_rdoc: true
|
@@ -98,9 +100,10 @@ signing_key:
|
|
98
100
|
specification_version: 3
|
99
101
|
summary: NOT UTILS... METILS!
|
100
102
|
test_files:
|
101
|
-
- spec/lcs_spec.rb
|
102
|
-
- spec/rash_spec.rb
|
103
|
-
- spec/metaclass_spec.rb
|
104
103
|
- spec/permutations_spec.rb
|
104
|
+
- spec/rash_spec.rb
|
105
105
|
- spec/spec_helper.rb
|
106
|
+
- spec/lcs_spec.rb
|
106
107
|
- spec/basetypes_spec.rb
|
108
|
+
- spec/ratio_spec.rb
|
109
|
+
- spec/metaclass_spec.rb
|