epitools 0.5.59 → 0.5.60

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e9003ca555f667ebc3547afdcbe332b0718cb3e0
4
- data.tar.gz: 83d00e82dc95355773c1f34744c6a1f24290f808
3
+ metadata.gz: 1f76bdcc4911578c98d5b2ab7e37fb34f9033205
4
+ data.tar.gz: fd983d2ffc809874983ff153f8c87e31d65f39d0
5
5
  SHA512:
6
- metadata.gz: 776eca2bf207c715ef1ec9a0fa213e216bc640b152b356841b6873a8ecf66c2e0d0d5ca7a786f38c4b16edca14676f29a73644b7b82d38df31145938623e8071
7
- data.tar.gz: 5400b2ad213c76e4e297838143af5c43010bd8c485aee789479b530b89781d73303b21ed784ec4cae2e1c67c7937c818f11057dda6ab44129465e9aaf794f2d7
6
+ metadata.gz: 881360cb002b0d78c2c313dcb6465b417aa472d08f3a5686cec612fdd0892ede20b6daa22502ef643189618312d43b872d57437ab38ab93279ad4e52717bb6cf
7
+ data.tar.gz: 1853d1fd9df5a4ac19901a480b672d54888061e3843c302962326b819ea4cd4f43648dd5156b0d02410dadbfaa553ffce2c4effa17030e3180c0ae4a83b86815
data/.gitignore CHANGED
@@ -20,3 +20,4 @@ pkg
20
20
 
21
21
  ## PROJECT::SPECIFIC
22
22
  .idea
23
+ .tags*
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.59
1
+ 0.5.60
@@ -1,6 +1,12 @@
1
1
 
2
2
  class Array
3
3
 
4
+ #
5
+ # Better names
6
+ #
7
+ alias_method :lpush, :unshift
8
+ alias_method :lpop, :shift
9
+
4
10
  #
5
11
  # flatten.compact.uniq
6
12
  #
@@ -20,13 +26,13 @@ class Array
20
26
  #
21
27
  # nums = [1,2,3,4,5,6,7,8,9,10,11,12]
22
28
  # even = nums.remove_if { |n| n.even? } # remove all even numbers from the "nums" array and return them
23
- # odd = nums # "nums" now only contains odd numbers
29
+ # odd = nums # "nums" now only contains odd numbers
24
30
  #
25
31
  def remove_if(&block)
26
32
  removed = []
27
33
 
28
34
  delete_if do |x|
29
- if block.call(x)
35
+ if yield(x)
30
36
  removed << x
31
37
  true
32
38
  else
@@ -91,7 +97,7 @@ class Array
91
97
  #
92
98
  unless instance_methods.include? :shuffle
93
99
  def shuffle
94
- sort_by{rand}
100
+ sort_by { rand }
95
101
  end
96
102
  end
97
103
 
@@ -181,6 +187,33 @@ class Array
181
187
 
182
188
  end
183
189
 
190
+
191
+ alias_method :old_multiply, :*
192
+ private :old_multiply
193
+
194
+ #
195
+ # Overridden multiplication operator. Now lets you multiply the Array by another Array or Enumerable.
196
+ #
197
+ # Array * Integer == a new array with <Integer> copies of itself inside
198
+ # Array * String == a new string containing the elements, joined by the <String>
199
+ # Array * {Array or Enumerable} == the cross product (aka. cartesian product) of both arrays
200
+ #
201
+ def *(other)
202
+ case other
203
+ when Integer, String
204
+ old_multiply(other)
205
+ when Enumerable
206
+ cross_product(other).to_a
207
+ end
208
+ end
209
+
210
+ #
211
+ # Multiply the array by itself `n` times.
212
+ #
213
+ def **(n)
214
+ super.to_a
215
+ end
216
+
184
217
  end
185
218
 
186
219
 
@@ -390,6 +390,34 @@ module Enumerable
390
390
  end
391
391
  alias_method :grouped, :groups
392
392
 
393
+
394
+ #
395
+ # Multiplies this Enumerable by something. (Same behaviour as Enumerator#*)
396
+ #
397
+ def *(other)
398
+ case other
399
+ when Integer, String
400
+ to_enum * other
401
+ when Enumerable
402
+ to_enum.cross_product(other)
403
+ end
404
+ end
405
+
406
+ #
407
+ # Multiplies this Enumerable by itself `n` times.
408
+ #
409
+ def **(n)
410
+ [self].cycle(n).reduce(:*)
411
+ end
412
+
413
+ #
414
+ # Same behaviour as Enumerator#cross_product
415
+ #
416
+ def cross_product(other)
417
+ to_enum.cross_product(other)
418
+ end
419
+ alias_method :cross, :cross_product
420
+
393
421
  end
394
422
 
395
423
 
@@ -419,4 +447,49 @@ class Enumerator
419
447
  end
420
448
  end
421
449
 
450
+
451
+ #
452
+ # Concatenates two Enumerators, returning a new Enumerator.
453
+ #
454
+ def +(other)
455
+ raise "Can only concatenate Enumerable things to Enumerators" unless Enumerable === other
456
+
457
+ Enumerator.new do |yielder|
458
+ each { |e| yielder << e }
459
+ other.each { |e| yielder << e }
460
+ end
461
+ end
462
+
463
+
464
+ #
465
+ # Multiplies this Enumerator by something else.
466
+ #
467
+ # Enumerator * Integer == a new Enumerator that repeats the original one <Integer> times
468
+ # Enumerator * String == joins the Enumerator's elements into a new string, with <String> in between each pair of elements
469
+ # Enumerator * Enumerable == the cross product (aka. cartesian product) of the Enumerator and the Enumerable
470
+ #
471
+ def *(other)
472
+ case other
473
+ when Integer
474
+ cycle(other)
475
+ when String
476
+ join(other)
477
+ when Enumerable
478
+ cross(other)
479
+ else
480
+ raise "#{other.class} is not something that can be multiplied by an Enumerator"
481
+ end
482
+ end
483
+
484
+ #
485
+ # Takes the cross product (aka. cartesian product) of the Enumerator and the argument,
486
+ # returning a new Enumerator. (The argument must be some kind of Enumerable.)
487
+ #
488
+ def cross_product(other)
489
+ Enumerator.new do |yielder|
490
+ each { |a| other.each { |b| yielder << [a,b] } }
491
+ end
492
+ end
493
+ alias_method :cross, :cross_product
494
+
422
495
  end
@@ -20,9 +20,9 @@ module Hex
20
20
  ASCII_PRINTABLE = (33..126)
21
21
 
22
22
  DUMP_COLORS = Rash.new(
23
- /\d/ => 13,
24
- /\w/ => 3,
25
- nil => 9,
23
+ /\d/ => 13,
24
+ /\w/ => 3,
25
+ nil => 9,
26
26
  :default => 7
27
27
  )
28
28
 
data/lib/epitools/iter.rb CHANGED
@@ -70,7 +70,7 @@ class Iter
70
70
  class Elem < BasicObject
71
71
 
72
72
  attr_accessor :val, :visited
73
-
73
+
74
74
  def initialize(iter, val)
75
75
  @iter = iter
76
76
  @val = val.is_a?(Elem) ? val.value : val
@@ -81,10 +81,6 @@ class Iter
81
81
  true
82
82
  end
83
83
 
84
- def ==(other)
85
- self.eql?(other)
86
- end
87
-
88
84
  def container
89
85
  @iter.container
90
86
  end
@@ -161,6 +157,19 @@ class Iter
161
157
  def inspect
162
158
  "<Elem: #{@val.inspect}>"
163
159
  end
160
+
161
+
162
+ include ::Comparable
163
+
164
+ def <=>(other)
165
+ case other
166
+ when Elem
167
+ @val <=> other.value
168
+ else
169
+ @val <=> other
170
+ end
171
+ end
172
+
164
173
  end
165
174
 
166
175
 
data/lib/epitools/path.rb CHANGED
@@ -582,7 +582,7 @@ class Path
582
582
  #
583
583
  def []=(key, value)
584
584
  Path.setfattr(path, key, value)
585
- @attrs = nil
585
+ @attrs = nil # clear cached xattrs
586
586
  end
587
587
 
588
588
  ###############################################################################
data/spec/autoreq_spec.rb CHANGED
@@ -2,37 +2,37 @@ require 'epitools/minimal'
2
2
 
3
3
  describe "autoreq" do
4
4
 
5
- it "should have Haml and Units installed" do
6
- gems = Gem.source_index.to_a.map{|name, spec| spec.name}.uniq
7
- gems.include?("haml").should == true
8
- gems.include?("units").should == true
9
- end
5
+ # it "should have Haml and Units installed" do
6
+ # gems = Gem.source_index.to_a.map{|name, spec| spec.name}.uniq
7
+ # gems.include?("haml").should == true
8
+ # gems.include?("units").should == true
9
+ # end
10
10
 
11
- it "autoreqs a gem" do
12
- defined?(Haml).should == nil
11
+ # it "autoreqs a gem" do
12
+ # defined?(Haml).should == nil
13
13
 
14
- autoreq :Haml, 'haml'
15
- !!defined?(Haml).should == false
16
- lambda { Haml }.should_not raise_error
17
- end
14
+ # autoreq :Haml, 'haml'
15
+ # !!defined?(Haml).should == false
16
+ # lambda { Haml }.should_not raise_error
17
+ # end
18
18
 
19
- it "autoreqs a regular ruby file" do
20
- defined?(Net).should == nil
19
+ # it "autoreqs a regular ruby file" do
20
+ # defined?(Net).should == nil
21
21
 
22
- module Net
23
- autoreq :HTTP, 'net/http'
24
- end
25
- lambda { Net::HTTP }.should_not raise_error
26
- end
22
+ # module Net
23
+ # autoreq :HTTP, 'net/http'
24
+ # end
25
+ # lambda { Net::HTTP }.should_not raise_error
26
+ # end
27
27
 
28
- it "autoreqs a gem with a block" do
29
- defined?(Units).should == nil
28
+ # it "autoreqs a gem with a block" do
29
+ # defined?(Units).should == nil
30
30
 
31
- autoreq :Units do
32
- gem 'units', '~> 1.0'
33
- require 'units'
34
- end
35
- lambda { Units }.should_not raise_error
36
- end
31
+ # autoreq :Units do
32
+ # gem 'units', '~> 1.0'
33
+ # require 'units'
34
+ # end
35
+ # lambda { Units }.should_not raise_error
36
+ # end
37
37
 
38
38
  end
@@ -445,24 +445,24 @@ end
445
445
 
446
446
  describe Enumerable do
447
447
 
448
- # it "maps deeply" do
449
- # [["a\n", "b\n"], ["c\n", "d\n"]].map_recursively(&:strip).should == [ %w[a b], %w[c d] ]
448
+ it "maps deeply" do
449
+ [["a\n", "b\n"], ["c\n", "d\n"]].map_recursively(&:strip).should == [ %w[a b], %w[c d] ]
450
450
 
451
- # [[1,2],[3,4]].deep_map {|e| e ** 2}.should == [[1,4],[9,16]]
452
- # [1,2,3,4].deep_map {|e| e ** 2}.should == [1,4,9,16]
453
- # [[],[],1,2,3,4].deep_map {|e| e ** 2}.should == [[], [], 1, 4, 9, 16]
451
+ [[1,2],[3,4]].deep_map {|e| e ** 2}.should == [[1,4],[9,16]]
452
+ [1,2,3,4].deep_map {|e| e ** 2}.should == [1,4,9,16]
453
+ [[],[],1,2,3,4].deep_map {|e| e ** 2}.should == [[], [], 1, 4, 9, 16]
454
454
 
455
- # {1=>2, 3=>{4=>5, 6=>7}}.deep_map {|k,v| [k, v**2] }.should == [ [1,4], [3, [[4,25], [6,49]]] ]
456
- # end
455
+ {1=>2, 3=>{4=>5, 6=>7}}.deep_map {|k,v| [k, v**2] }.should == [ [1,4], [3, [[4,25], [6,49]]] ]
456
+ end
457
457
 
458
- # it "selects deeply" do
459
- # [[1,2],[3,4]].deep_select {|e| e % 2 == 0 }.should == [[2],[4]]
460
- # puts
458
+ it "selects deeply" do
459
+ [[1,2],[3,4]].deep_select {|e| e % 2 == 0 }.should == [[2],[4]]
460
+ puts
461
461
 
462
- # {1=>2, 3=>{4=>5, 6=>7}}.deep_select {|k,v| k == 1 }.should == {1=>2}
463
- # #[1,2,3,4].deep_select {|e| e ** 2}.should == [1,4,9,16]
464
- # #[[],[],1,2,3,4].deep_select {|e| e ** 2}.should == [[], [], 1, 4, 9, 16]
465
- # end
462
+ {1=>2, 3=>{4=>5, 6=>7}}.deep_select {|k,v| k == 1 }.should == {1=>2}
463
+ #[1,2,3,4].deep_select {|e| e ** 2}.should == [1,4,9,16]
464
+ #[[],[],1,2,3,4].deep_select {|e| e ** 2}.should == [[], [], 1, 4, 9, 16]
465
+ end
466
466
 
467
467
  it "splits" do
468
468
  [1,2,3,4,5].split_at {|e| e == 3}.should == [ [1,2], [4,5] ]
@@ -540,6 +540,13 @@ describe Enumerable do
540
540
  result.should == 10.times.permutation(2).to_a
541
541
  end
542
542
 
543
+ it "cartesian products" do
544
+ a = [1,2]
545
+ b = [3,4]
546
+
547
+ (a * b).to_a.should == [[1,3],[1,4],[2,3],[2,4]]
548
+ end
549
+
543
550
  end
544
551
 
545
552
  describe Enumerator do
@@ -550,6 +557,36 @@ describe Enumerator do
550
557
  }.should_not raise_error
551
558
  end
552
559
 
560
+ it "concatenates" do
561
+ e = [1,2,3].to_enum + [4,5,6].to_enum
562
+ e.to_a.should == [1,2,3,4,5,6]
563
+
564
+ e = [1,2,3].to_enum + [4,5,6]
565
+ e.to_a.should == [1,2,3,4,5,6]
566
+ end
567
+
568
+ it "multiplies" do
569
+ e = [1,2,3].to_enum * 3
570
+ e.to_a.should == [1,2,3]*3
571
+
572
+ e = [1,2].to_enum * [3,4].to_enum
573
+ e.to_a.should == [[1,3],[1,4],[2,3],[2,4]]
574
+
575
+ lambda { [].old_multiply }.should raise_error(NoMethodError)
576
+ end
577
+
578
+ it "exponentiates" do
579
+ e = [1,2].to_enum ** 2
580
+ squared = [[1,1], [1,2], [2,1], [2,2]]
581
+
582
+ e.to_a.should == squared
583
+
584
+ e = [1,2].to_enum ** 3
585
+
586
+ e.to_a.should == squared * [1,2]
587
+ e.to_a.should == ([1,2]**3)
588
+ end
589
+
553
590
  end
554
591
 
555
592
 
data/spec/path_spec.rb CHANGED
@@ -542,7 +542,7 @@ describe Path do
542
542
  attrs = file.attrs
543
543
  attrs["user.diff_element"] = "newtest"
544
544
  file.attrs = attrs
545
- file["user.newtest"].should == "newtest"
545
+ file["user.diff_element"].should == "newtest"
546
546
  end
547
547
 
548
548
  it "changes mtime/atime" do
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.59
4
+ version: 0.5.60
5
5
  platform: ruby
6
6
  authors:
7
7
  - epitron
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-15 00:00:00.000000000 Z
11
+ date: 2014-12-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -61,7 +61,6 @@ files:
61
61
  - lib/epitools/core_ext/range.rb
62
62
  - lib/epitools/core_ext/string.rb
63
63
  - lib/epitools/core_ext/truthiness.rb
64
- - lib/epitools/ezdb.rb
65
64
  - lib/epitools/hexdump.rb
66
65
  - lib/epitools/iter.rb
67
66
  - lib/epitools/its.rb
@@ -90,7 +89,6 @@ files:
90
89
  - spec/clitools_spec.rb
91
90
  - spec/colored_spec.rb
92
91
  - spec/core_ext_spec.rb
93
- - spec/ezdb_spec.rb
94
92
  - spec/histogram_spec.rb
95
93
  - spec/iter_spec.rb
96
94
  - spec/lcs_spec.rb
data/lib/epitools/ezdb.rb DELETED
@@ -1,100 +0,0 @@
1
- require 'epitools'
2
- require 'dbm'
3
- require 'delegate'
4
-
5
- class Ezdc < DelegateClass(Hash)
6
-
7
- attr_reader :db, :path, :dirty
8
-
9
- @@dirty = Set.new
10
-
11
- def initialize(filename)
12
- @path = Path[filename]
13
-
14
- if @path.ext.nil?
15
- @path.ext = "db"
16
- else
17
- @path.ext += ".db" if @path.ext != 'db'
18
- end
19
-
20
- @db = DBM::open(@path.with(:ext=>nil))
21
-
22
- super
23
- end
24
-
25
- class Observed < BasicObject
26
- MUTATORS = ::Set.new [
27
- :<<, :push, :pop, :slice, :[]=
28
- ]
29
-
30
- def __send__(meth, *args)
31
- if MUTATORS.include? meth
32
- @@dirty.add self
33
- end
34
-
35
- end
36
- end
37
-
38
- def observed(obj)
39
- obj.using(Observed)
40
- end
41
-
42
- def [](key)
43
- observed(super[key])
44
- end
45
-
46
- def []=(key, val)
47
- end
48
-
49
- def keys
50
- db.keys.map(&:unmarshal)
51
- end
52
-
53
- def delete!
54
- @path.rm
55
- end
56
-
57
- def flush!
58
- dirty.each do |key|
59
- db[key.marshal] = super[key].marshal
60
- end
61
- end
62
-
63
- end
64
-
65
-
66
- class Ezdb
67
-
68
- attr_reader :db, :path
69
-
70
- def initialize(filename)
71
- @path = Path[filename]
72
-
73
- if @path.ext.nil?
74
- @path.ext = "db"
75
- else
76
- @path.ext += ".db" if @path.ext != 'db'
77
- end
78
-
79
- @db = DBM::open(@path.with(:ext=>nil))
80
- end
81
-
82
- def [](key)
83
- val = db[key.marshal]
84
- val = val.unmarshal if val
85
- val
86
- end
87
-
88
- def []=(key, val)
89
- db[key.marshal] = val.marshal
90
- end
91
-
92
- def keys
93
- db.keys.map(&:unmarshal)
94
- end
95
-
96
- def delete!
97
- @path.rm
98
- end
99
-
100
- end
data/spec/ezdb_spec.rb DELETED
@@ -1,47 +0,0 @@
1
- require 'epitools/ezdb'
2
- require 'epitools/path'
3
-
4
- class Test < Struct.new(:a, :b); end
5
-
6
- describe Ezdb do
7
-
8
- attr_accessor :db
9
-
10
- before :each do
11
- @dbfile = Path["test.db"]
12
- @dbfile.rm if @dbfile.exists?
13
- @db = Ezdb.new @dbfile
14
- end
15
-
16
- after :each do
17
- @db.delete!
18
- end
19
-
20
- it "stores/retrieves" do
21
- db[1].should == nil
22
- db[1] = :blah
23
- db[1].should == :blah
24
- db.keys.should == [1]
25
-
26
- s = Test.new("what", true)
27
- db[s] = false
28
- db[s].should == false
29
- end
30
-
31
- it "handles nil extensions" do
32
- x = Ezdb.new "testdb"
33
- x[1].should == nil
34
- x.delete!
35
- end
36
-
37
- it "pushes" do
38
- db[:a] ||= []
39
- db[:a].should == []
40
- db[:a] << 1
41
- db[:a] << 2
42
- db[:a] << 3
43
- db[:a] << 4
44
- db[:a].should == [1,2,3,4]
45
- end
46
-
47
- end