epitools 0.5.111 → 0.5.112

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3d2e24ebc0ca331f63f356f9275773499b86ab48c3880be8169a5936afba4f58
4
- data.tar.gz: 78af329f856014c8d2693cf1654c1479721ab75ca8938fb26c5f1d8c73609686
3
+ metadata.gz: d59d9daf2f46a0daf7008b75f596bcb8164801c61ec00a8a4f779e3105e97be1
4
+ data.tar.gz: 97b7ef67560c7377929db8aece4fc6f7f358f3ef96501c5913f99b75a655fa07
5
5
  SHA512:
6
- metadata.gz: eb0f9dbcc7c796e31ed5db2868823b94e15517ccf8f4ae7f967c006674d5ed82ba63d6719254bdf0f176b2b0f5ebe17a80b39580571259f9e7563dfc1895630d
7
- data.tar.gz: 2391e6edc69384fa38081bf91869f0b456da3a828d21f66e012a08a2b8268d47747252dc0d2e40635040463e45ee20ff6d88d7d6e9bf17fa31e6290ab211405b
6
+ metadata.gz: c17bdd3fada9128955712952cfa8edfa459ff24f83fd04ba4cef9116c3a931f9caba819095a4131f24c89bc4921d574110f6ccd180310a721c5d072896901e40
7
+ data.tar.gz: b642d62d3c9326b2b20a85ebb8bbf92ca5cff1150c6093f7f73530c44b878ef9637a36a8f2649fcac0e4bc22fca1de75469b947f99a648d77082f4d544f08161
data/Rakefile CHANGED
@@ -9,7 +9,7 @@ task :release => :build do
9
9
  end
10
10
 
11
11
  task :install => :build do
12
- system "gem install epitools-#{gem_version}.gem"
12
+ system "gem install --local epitools-#{gem_version}.gem"
13
13
  end
14
14
 
15
15
  task :pry do
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.111
1
+ 0.5.112
@@ -16,6 +16,7 @@ autoload :Timeout, 'timeout'
16
16
  autoload :Find, 'find'
17
17
  autoload :Benchmark, 'benchmark'
18
18
  autoload :Tracer, 'tracer'
19
+ autoload :TSort, 'tsort'
19
20
  autoload :Shellwords, 'shellwords'
20
21
  autoload :PTY, 'pty'
21
22
  autoload :CSV, 'csv'
@@ -86,6 +87,7 @@ autoreq :JSON, 'json'
86
87
  autoreq :GeoIP, 'geoip'
87
88
  autoreq :RBTree, 'rbtree'
88
89
  autoreq :MultiRBTree, 'rbtree'
90
+ autoreq :ID3Tag, 'id3tag'
89
91
 
90
92
  autoreq :AwesomePrint do
91
93
  require 'awesome_print'
@@ -61,7 +61,7 @@ class Browser
61
61
  @agent = Mechanize.new do |a|
62
62
  # ["Mechanize", "Mac Mozilla", "Linux Mozilla", "Windows IE 6", "iPhone", "Linux Konqueror", "Windows IE 7", "Mac FireFox", "Mac Safari", "Windows Mozilla"]
63
63
  a.max_history = 10
64
- a.user_agent_alias = "Windows IE 7"
64
+ a.user_agent_alias = "Windows Chrome"
65
65
  a.log = Logger.new "mechanize.log" if @use_logs
66
66
  end
67
67
 
@@ -136,6 +136,78 @@ class Array
136
136
 
137
137
  alias_method :unzip, :transpose
138
138
 
139
+ #
140
+ # Transpose an array that could have rows of uneven length
141
+ #
142
+ def transpose_with_padding
143
+ max_width = map(&:size).max
144
+ map { |row| row.rpad(max_width) }.transpose
145
+ end
146
+
147
+ #
148
+ # Remove instances of "element" from the end of the array (using `Array#pop`)
149
+ #
150
+ def rtrim!(element=nil)
151
+ pop while last == element
152
+ self
153
+ end
154
+
155
+ #
156
+ # Like `rtrim!`, but returns a trimmed copy of the array
157
+ #
158
+ def rtrim(element=nil)
159
+ dup.rtrim!(element)
160
+ end
161
+
162
+ ####################################################################
163
+ # Pseudo-matrix methods
164
+ ####################################################################
165
+
166
+ def rows
167
+ self
168
+ end
169
+
170
+ def columns
171
+ cols = transpose_with_padding
172
+ cols.each &:rtrim!
173
+ cols
174
+ end
175
+ alias_method :cols, :columns
176
+
177
+ #
178
+ # Return row n of a 2D array
179
+ #
180
+ def row(n)
181
+ rows[n]
182
+ end
183
+
184
+ #
185
+ # Return column n of a 2D array
186
+ #
187
+ def column(n)
188
+ columns[n]&.rtrim!
189
+ end
190
+ alias_method :col, :column
191
+
192
+ ####################################################################
193
+
194
+ #
195
+ # Extend the array the target_width by adding nils to the end (right side)
196
+ #
197
+ def rpad!(target_width)
198
+ if target_width > size and target_width > 0
199
+ self[target_width-1] = nil
200
+ end
201
+ self
202
+ end
203
+
204
+ #
205
+ # Return a copy of this array which has been extended to target_width by adding nils to the end (right side)
206
+ #
207
+ def rpad(target_width)
208
+ dup.rpad!(target_width)
209
+ end
210
+
139
211
  #
140
212
  # Convert the array to a hash
141
213
  #
@@ -470,6 +470,32 @@ module Enumerable
470
470
  end
471
471
  alias_method :grouped, :groups
472
472
 
473
+ #
474
+ # run-length encode the array (returns an array of [count, element] pairs)
475
+ #
476
+ def rle
477
+ return to_enum(:rle) unless block_given?
478
+
479
+ last = nil
480
+ result = []
481
+ count = 1
482
+
483
+ each do |e|
484
+ if last
485
+ if last != e
486
+ yield [count, last]
487
+ count = 1
488
+ else
489
+ count += 1
490
+ end
491
+ end
492
+
493
+ last = e
494
+ end
495
+
496
+ yield [count, last]
497
+ end
498
+
473
499
  #
474
500
  # Sort strings by their numerical values
475
501
  #
@@ -53,6 +53,7 @@ class Hash
53
53
  end
54
54
  self
55
55
  end
56
+ alias_method :transform_keys!, :map_keys!
56
57
 
57
58
  #
58
59
  # Transforms the keys of the hash by passing them into the supplied block,
@@ -61,6 +62,34 @@ class Hash
61
62
  def map_keys(&block)
62
63
  dup.map_keys!(&block)
63
64
  end
65
+ alias_method :transform_keys, :map_keys
66
+
67
+ #
68
+ # Translate keys to other keys, given a hash of old-key to new-key mappings.
69
+ #
70
+ # eg: hash.translate_keys!(
71
+ # "Extreme Sports!!!!" => :extreme_sports,
72
+ # "Mediocre sports" => :sports,
73
+ # "Pretty okay sports" => :sports,
74
+ # "Golf" => :liesure_activities,
75
+ # )
76
+ #
77
+ def translate_keys!(mapping)
78
+ # TODO: Allow regexes and lambdas (eg: translate_keys!(/.+/ => ->(key) { key.to_sym })
79
+ mapping.each do |src,dest|
80
+ if includes? src
81
+ self[dest] = delete(src)
82
+ end
83
+ end
84
+ self
85
+ end
86
+
87
+ #
88
+ # Same as `translate_keys!`, except it returns a copy of the hash
89
+ #
90
+ def translate_keys(mapping)
91
+ dup.translate_keys!(mapping)
92
+ end
64
93
 
65
94
  #
66
95
  # Convert the keys to symbols in-place, for fun and profit
@@ -1,3 +1,14 @@
1
+ #
2
+ # TODO: Reimplement Matrix so it's not so awful, and give it a new name (like Grid).
3
+ # (Goal: To be as nice as numpy)
4
+ #
5
+ # Features:
6
+ # * Better constructors
7
+ # * Pretty-printer support
8
+ # * .rows, .cols, .each_{row,col}, .neighbourhood
9
+ # * Vec class, Point class
10
+ #
11
+
1
12
  require 'matrix'
2
13
 
3
14
  #
@@ -405,7 +405,7 @@ class Float
405
405
  # > 0.32786243.percent(2) # => "32.79%"
406
406
  #
407
407
  def percent(decimals=0)
408
- "%0.#{decimals}f%" % (self * 100)
408
+ "%0.#{decimals}f%%" % (self * 100)
409
409
  end
410
410
 
411
411
  end
@@ -28,6 +28,13 @@ class String
28
28
  gsub(/[\t ]+/,' ').strip
29
29
  end
30
30
 
31
+ #
32
+ # Smash together all the characters in a string (removing whitespace)
33
+ #
34
+ def smash
35
+ downcase.scan(/\w+/).join
36
+ end
37
+
31
38
  #
32
39
  # Remove redundant whitespace AND newlines.
33
40
  #
@@ -157,10 +157,7 @@ class Path
157
157
  when String
158
158
 
159
159
  if path =~ %r{^[a-z\-]+://}i # URL?
160
- Path::URL.new(path)
161
-
162
- elsif path =~ /^javascript:/
163
- Path::JS.new(path)
160
+ Path::URI.new(path)
164
161
 
165
162
  else
166
163
  # TODO: highlight backgrounds of codeblocks to show indent level & put boxes (or rules?) around (between?) double-spaced regions
@@ -452,13 +449,8 @@ class Path
452
449
  !!thing[/^\../]
453
450
  end
454
451
 
455
- def uri?
456
- false
457
- end
458
-
459
- def url?
460
- uri?
461
- end
452
+ def uri?; false; end
453
+ def url?; uri?; end
462
454
 
463
455
  def child_of?(parent)
464
456
  parent.parent_of? self
@@ -468,6 +460,13 @@ class Path
468
460
  dirs == child.dirs[0...dirs.size]
469
461
  end
470
462
 
463
+ #
464
+ # Does the file or directory name start with a "."?
465
+ #
466
+ def hidden?
467
+ (dir? ? dirs.last : filename)[/^\../]
468
+ end
469
+
471
470
  ###############################################################################
472
471
  # Comparisons
473
472
  ###############################################################################
@@ -478,7 +477,7 @@ class Path
478
477
  # An array of attributes which will be used sort paths (case insensitive, directories come first)
479
478
  #
480
479
  def sort_attrs
481
- [filename ? 1 : 0, path.downcase]
480
+ [(filename ? 1 : 0), path.downcase]
482
481
  end
483
482
 
484
483
  def <=>(other)
@@ -495,7 +494,9 @@ class Path
495
494
  def ==(other)
496
495
  self.path == other.to_s
497
496
  end
497
+ alias_method :eql?, :==
498
498
 
499
+ def hash; path.hash; end
499
500
 
500
501
  ###############################################################################
501
502
  # Joining paths
@@ -619,6 +620,9 @@ class Path
619
620
  # Opening/Reading files
620
621
  ###############################################################################
621
622
 
623
+ #
624
+ # Open the file (default: read-only + binary mode)
625
+ #
622
626
  def open(mode="rb", &block)
623
627
  if block_given?
624
628
  File.open(path, mode, &block)
@@ -629,16 +633,19 @@ class Path
629
633
  alias_method :io, :open
630
634
  alias_method :stream, :open
631
635
 
636
+ #
637
+ # Read bytes from the file (just a wrapper around File.read)
638
+ #
632
639
  def read(length=nil, offset=nil)
633
640
  File.read(path, length, offset)
634
641
  end
635
642
 
636
643
  #
637
- # Read the contents of the file, yielding it in 16k chunks. (default chunk size is 16k)
644
+ # Read the contents of a file one chunk at a time (default chunk size is 16k)
638
645
  #
639
646
  def each_chunk(chunk_size=2**14)
640
- open do |f|
641
- yield f.read(chunk_size) until f.eof?
647
+ open do |io|
648
+ yield io.read(chunk_size) until io.eof?
642
649
  end
643
650
  end
644
651
 
@@ -646,12 +653,18 @@ class Path
646
653
  #
647
654
  # All the lines in this file, chomped.
648
655
  #
649
- def each
650
- io.each_line
656
+ def each_line(&block)
657
+ open { |io| io.each_line { |line| block.call(line.chomp) } }
651
658
  end
652
- alias_method :each_line, :each
653
- alias_method :lines, :each
659
+ alias_method :each, :each_line
660
+ alias_method :lines, :each_line
661
+ alias_method :nicelines, :each_line
662
+ alias_method :nice_lines, :each_line
654
663
 
664
+
665
+ #
666
+ # Yields all matching lines in the file (by returning an Enumerator, or receiving a block)
667
+ #
655
668
  def grep(pat)
656
669
  return to_enum(:grep, pat).to_a unless block_given?
657
670
 
@@ -660,21 +673,22 @@ class Path
660
673
  end
661
674
  end
662
675
 
663
- def nicelines
664
- lines.map(&:chomp)
665
- end
666
- alias_method :nice_lines, :nicelines
667
-
668
676
  def unmarshal
669
677
  read.unmarshal
670
678
  end
671
679
 
680
+ #
681
+ # Returns all the files in the directory that this path points to
682
+ #
672
683
  def ls
673
684
  Dir.foreach(path).
674
685
  reject {|fn| fn == "." or fn == ".." }.
675
686
  flat_map {|fn| self / fn }
676
687
  end
677
688
 
689
+ #
690
+ # Returns all files in this path's directory and its subdirectories
691
+ #
678
692
  def ls_r(symlinks=false)
679
693
  # glob = symlinks ? "**{,/*/**}/*" : "**/*"
680
694
  # Path[File.join(path, glob)]
@@ -682,20 +696,33 @@ class Path
682
696
  end
683
697
  alias_method :ls_R, :ls_r
684
698
 
699
+ #
700
+ # Returns all the directories in this path
701
+ #
685
702
  def ls_dirs
686
703
  ls.select(&:dir?)
687
704
  #Dir.glob("#{path}*/", File::FNM_DOTMATCH).map { |s| Path.new(s, :type=>:dir) }
688
705
  end
689
706
 
707
+ #
708
+ # Returns all the files in this path
709
+ #
690
710
  def ls_files
691
711
  ls.select(&:file?)
692
712
  #Dir.glob("#{path}*", File::FNM_DOTMATCH).map { |s| Path.new(s, :type=>:file) }
693
713
  end
694
714
 
715
+ #
716
+ # Returns all neighbouring directories to this path
717
+ #
695
718
  def siblings
696
719
  Path[dir].ls - [self]
697
720
  end
698
721
 
722
+ #
723
+ # Like the unix `touch` command
724
+ # (if the file exists, update its timestamp, otherwise create a new file)
725
+ #
699
726
  def touch
700
727
  open("a") { }
701
728
  self
@@ -758,7 +785,7 @@ class Path
758
785
 
759
786
  #
760
787
  # Parse the file based on the file extension.
761
- # (Handles json, html, yaml, xml, bson, and marshal.)
788
+ # (Handles json, html, yaml, xml, csv, marshal, and bson.)
762
789
  #
763
790
  def parse
764
791
  case ext.downcase
@@ -823,29 +850,43 @@ class Path
823
850
  end
824
851
  alias_method :from_csv, :read_csv
825
852
 
826
-
853
+ # Parse the file as XML
827
854
  def read_xml
828
855
  Nokogiri::XML(io)
829
856
  end
830
857
 
831
-
858
+ # Parse the file as a Ruby Marshal dump
832
859
  def read_marshal
833
860
  Marshal.load(io)
834
861
  end
835
862
 
863
+ # Serilize an object to Ruby Marshal format and write it to this path
836
864
  def write_marshal(object)
837
865
  write object.marshal
838
866
  end
839
867
 
840
-
868
+ # Parse the file as BSON
841
869
  def read_bson
842
870
  BSON.deserialize(read)
843
871
  end
844
872
 
873
+ # Serilize an object to BSON format and write it to this path
845
874
  def write_bson(object)
846
875
  write BSON.serialize(object)
847
876
  end
848
877
 
878
+ #
879
+ # Read ID3 tags (requires 'id3tag' gem)
880
+ #
881
+ # Available fields:
882
+ # tag.artist, tag.title, tag.album, tag.year, tag.track_nr, tag.genre, tag.get_frame(:TIT2)&.content,
883
+ # tag.get_frames(:COMM).first&.content, tag.get_frames(:COMM).last&.language
884
+ #
885
+ def id3
886
+ ID3Tag.read(io)
887
+ end
888
+ alias_method :id3tags, :id3
889
+
849
890
  #
850
891
  # Change into the directory. If a block is given, it changes into
851
892
  # the directory for the duration of the block, then puts you back where you
@@ -928,7 +969,11 @@ class Path
928
969
 
929
970
  n = 1
930
971
  loop do
931
- new_file = with(:basename => "#{basename} (#{n})")
972
+ if dir?
973
+ new_file = with(:dirs => dirs[0..-2] + ["#{dirs.last} (#{n})"])
974
+ else
975
+ new_file = with(:basename => "#{basename} (#{n})")
976
+ end
932
977
  return new_file unless new_file.exists?
933
978
  n += 1
934
979
  end
@@ -1074,7 +1119,12 @@ class Path
1074
1119
 
1075
1120
  ## Dangerous methods.
1076
1121
 
1122
+ #
1123
+ # Remove a file or directory
1124
+ #
1077
1125
  def rm
1126
+ raise "Error: #{self} does not exist" unless symlink? or exists?
1127
+
1078
1128
  if directory? and not symlink?
1079
1129
  Dir.rmdir(self) == 0
1080
1130
  else
@@ -1085,6 +1135,9 @@ class Path
1085
1135
  alias_method :unlink!, :rm
1086
1136
  alias_method :remove!, :rm
1087
1137
 
1138
+ #
1139
+ # Shrink or expand the size of a file in-place
1140
+ #
1088
1141
  def truncate(offset=0)
1089
1142
  File.truncate(self, offset) if exists?
1090
1143
  end
@@ -1313,12 +1366,12 @@ class Path
1313
1366
  chown_R/1
1314
1367
  chmod_R/1
1315
1368
  ].each do |spec|
1316
- method, cardinality = spec.split("/")
1317
- cardinality = cardinality.to_i
1369
+ meth, cardinality = spec.split("/")
1370
+ cardinality = cardinality.to_i
1318
1371
 
1319
1372
  class_eval %{
1320
- def self.#{method}(path#{", *args" if cardinality > 0})
1321
- Path[path].#{method}#{"(*args)" if cardinality > 0}
1373
+ def self.#{meth}(path#{", *args" if cardinality > 0})
1374
+ Path[path].#{meth}#{"(*args)" if cardinality > 0}
1322
1375
  end
1323
1376
  }
1324
1377
  end
@@ -1355,16 +1408,21 @@ class Path
1355
1408
  end
1356
1409
  alias_class_method :tempdir, :tmpdir
1357
1410
 
1358
-
1411
+ #
1412
+ # User's current home directory
1413
+ #
1359
1414
  def self.home
1360
1415
  Path[ENV['HOME']]
1361
1416
  end
1362
1417
 
1418
+ #
1419
+ # The current directory
1420
+ #
1363
1421
  def self.pwd
1364
1422
  Path.new expand_path(Dir.pwd)
1365
1423
  end
1366
1424
 
1367
- def self.pushd
1425
+ def self.pushd(destination)
1368
1426
  @@dir_stack ||= []
1369
1427
  @@dir_stack.push pwd
1370
1428
  end
@@ -1453,9 +1511,9 @@ class Path::Relative < Path
1453
1511
  end
1454
1512
 
1455
1513
  #
1456
- # A wrapper for URL objects.
1514
+ # A wrapper for URI objects.
1457
1515
  #
1458
- class Path::URL < Path
1516
+ class Path::URI < Path
1459
1517
 
1460
1518
  attr_reader :uri
1461
1519
 
@@ -1464,7 +1522,7 @@ class Path::URL < Path
1464
1522
  # (eg: remove commands that write)
1465
1523
 
1466
1524
  def initialize(uri, hints={})
1467
- @uri = URI.parse(uri)
1525
+ @uri = ::URI.parse(uri)
1468
1526
  self.path = @uri.path
1469
1527
  end
1470
1528
 
@@ -1486,6 +1544,12 @@ class Path::URL < Path
1486
1544
  def scheme; uri.scheme; end
1487
1545
  alias_method :protocol, :scheme
1488
1546
 
1547
+ %w[http https ftp magnet].each do |s|
1548
+ define_method("#{s}?") { scheme[/^#{s}$/i] }
1549
+ end
1550
+
1551
+ def http?; super or https?; end
1552
+
1489
1553
  #
1490
1554
  # ...and this is: 'host.com'
1491
1555
  #
@@ -196,6 +196,7 @@ describe Numeric do
196
196
 
197
197
  end
198
198
 
199
+
199
200
  describe String do
200
201
 
201
202
  it "anys?" do
@@ -204,8 +205,6 @@ describe String do
204
205
  "YAY".should be_any
205
206
  end
206
207
 
207
-
208
-
209
208
  it "rot13s" do
210
209
  message = "Unbreakable Code"
211
210
  message.rot13.should_not == message
@@ -429,6 +428,7 @@ describe Integer do
429
428
 
430
429
  end
431
430
 
431
+
432
432
  describe Float do
433
433
 
434
434
  it "float?" do
@@ -462,6 +462,7 @@ describe Number do
462
462
 
463
463
  end
464
464
 
465
+
465
466
  describe Array do
466
467
 
467
468
  it "squashes" do
@@ -522,6 +523,41 @@ describe Array do
522
523
  [:a, :b, :c].includes?(5).should == false
523
524
  end
524
525
 
526
+ it "rpads" do
527
+ [1,2,3].rpad(5).should == [1,2,3,nil,nil]
528
+ end
529
+
530
+ it "transpose_with_padding" do
531
+ a = [
532
+ [1,2],
533
+ [1],
534
+ [1,2,3]
535
+ ]
536
+
537
+ a_transposed = [
538
+ [1,2,nil],
539
+ [1,nil,nil],
540
+ [1,2,3]
541
+ ].transpose
542
+
543
+ a.transpose_with_padding.should == a_transposed
544
+ end
545
+
546
+ it "rows and columnses" do
547
+ a = [
548
+ [ 1, 2, 3, 4, 5 ],
549
+ [ 6, 7, 8, 9, 10 ],
550
+ [ 11, 12 ],
551
+ ]
552
+
553
+ a.row(0).should == [1,2,3,4,5]
554
+ a.col(0).should == [1,6,11]
555
+ a.col(-1).should == [5,10]
556
+ a.col(-10).should == nil
557
+
558
+ a.cols.map(&:size).should == [3,3,2,2,2]
559
+ end
560
+
525
561
  end
526
562
 
527
563
 
@@ -660,6 +696,11 @@ describe Enumerable do
660
696
  (a * b).to_a.should == [[1,3],[1,4],[2,3],[2,4]]
661
697
  end
662
698
 
699
+ it "rles" do
700
+ [1, 2, 3,3,3, 4].rle.to_a.should == [ [1,1], [1,2], [3,3], [1,4] ]
701
+ [5,5, 1, 2, 3,3,3, 4,4].rle.to_a.should == [ [2,5], [1,1], [1,2], [3,3], [2,4] ]
702
+ end
703
+
663
704
  it "sorts strings numerically" do
664
705
  a = ["a1", "a11", "a2", "a3"]
665
706
  proper = ["a1", "a2", "a3", "a11"]
@@ -673,6 +714,7 @@ describe Enumerable do
673
714
 
674
715
  end
675
716
 
717
+
676
718
  describe Enumerator do
677
719
 
678
720
  it "spins" do
@@ -831,6 +873,7 @@ describe Binding do
831
873
  b.call.should == 5
832
874
  end
833
875
 
876
+
834
877
  describe Proc do
835
878
 
836
879
  it "joins procs" do
@@ -242,7 +242,7 @@ describe Path do
242
242
  path.exists?.should == false
243
243
 
244
244
  path.touch
245
- lambda { path.rename(:ext=>".dat") }.should raise_error
245
+ lambda { path.rename(:ext=>".dat") }.should raise_error(RuntimeError)
246
246
 
247
247
  dest.rm
248
248
  path.rename!(:ext=>".dat")
@@ -264,7 +264,7 @@ describe Path do
264
264
  dest.rm
265
265
 
266
266
  path.touch
267
- p path.numbered_backup_file
267
+ # p path.numbered_backup_file
268
268
 
269
269
  dest = path.numbered_backup!
270
270
  path.touch
@@ -275,6 +275,14 @@ describe Path do
275
275
 
276
276
  dest.rm
277
277
  dest2.rm
278
+
279
+
280
+ path = Path.tmpdir
281
+ path.dir?.should == true
282
+ backup = path.numbered_backup!
283
+ backup.dir?.should == true
284
+ backup.dirs.last.should == "#{path.dirs.last} (1)"
285
+ backup.rm
278
286
  end
279
287
 
280
288
  it "rms" do
@@ -316,7 +324,7 @@ describe Path do
316
324
 
317
325
  it "mkdirs" do
318
326
  tmp = Path.tmpfile
319
- lambda { tmp.mkdir }.should raise_error
327
+ lambda { tmp.mkdir }.should raise_error(RuntimeError)
320
328
  tmp.rm
321
329
  tmp.mkdir.should be_truthy
322
330
  tmp.rm.should be_truthy
@@ -409,7 +417,7 @@ describe Path do
409
417
  end
410
418
 
411
419
  it "modes" do
412
- Path.tmpfile.mode.class.should == Fixnum
420
+ Path.tmpfile.mode.class.should == Integer
413
421
  end
414
422
 
415
423
  it "chmods and chmod_Rs" do
@@ -547,7 +555,7 @@ describe Path do
547
555
  file["user.test"].should == nil
548
556
  Path.getfattr(file)["user.test"].should == nil
549
557
 
550
- lambda { file["blahblahblah"] = "whee" }.should raise_error
558
+ lambda { file["blahblahblah"] = "whee" }.should raise_error(RuntimeError)
551
559
 
552
560
  # Test assigning an entire hash of attributes, using diffing
553
561
  attrs = file.attrs
@@ -584,4 +592,12 @@ describe Path do
584
592
  # if the source is a file, copies it and builds the directory tree
585
593
  end
586
594
 
595
+ it "id3's" do
596
+ path = Path["test.mp3"]
597
+ if path.exists?
598
+ tags = path.id3
599
+ tags.title.should_not == nil
600
+ tags.artist.should_not == nil
601
+ end
602
+ end
587
603
  end
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.111
4
+ version: 0.5.112
5
5
  platform: ruby
6
6
  authors:
7
7
  - epitron
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-04-26 00:00:00.000000000 Z
11
+ date: 2018-05-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec