rubysl-pathname 1.0.0 → 2.0.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.
- checksums.yaml +4 -4
- data/.travis.yml +5 -6
- data/lib/rubysl/pathname/pathname.rb +120 -129
- data/lib/rubysl/pathname/version.rb +1 -1
- data/rubysl-pathname.gemspec +1 -2
- metadata +2 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a50a6a72a8ab5c76d641f4c59963970a0351ee82
|
4
|
+
data.tar.gz: f73a1000db8a4010a902b2f0449a0d1ccd93a4b3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 512d80c9c7dd0cb61a0b902081920c98a7f5002e18ffcf3194dd43cdc2481facc9ceabe80ee005d8cb7a2511296235f4b330dc57bf0c262f8abf50bfb5caed29
|
7
|
+
data.tar.gz: a4bb9aa419adebc7aac773fe7f0936f22349e93d97f91f9f050dbd7b96cdf99489ee7c9066091aed835541b0aeb01dc11c5244ffe4f0183fb24850761de3b181
|
data/.travis.yml
CHANGED
@@ -36,27 +36,27 @@
|
|
36
36
|
# === Example 1: Using Pathname
|
37
37
|
#
|
38
38
|
# require 'pathname'
|
39
|
-
#
|
40
|
-
# size =
|
41
|
-
# isdir =
|
42
|
-
# dir =
|
43
|
-
# base =
|
44
|
-
# dir, base =
|
45
|
-
# data =
|
46
|
-
#
|
47
|
-
#
|
39
|
+
# pn = Pathname.new("/usr/bin/ruby")
|
40
|
+
# size = pn.size # 27662
|
41
|
+
# isdir = pn.directory? # false
|
42
|
+
# dir = pn.dirname # Pathname:/usr/bin
|
43
|
+
# base = pn.basename # Pathname:ruby
|
44
|
+
# dir, base = pn.split # [Pathname:/usr/bin, Pathname:ruby]
|
45
|
+
# data = pn.read
|
46
|
+
# pn.open { |f| _ }
|
47
|
+
# pn.each_line { |line| _ }
|
48
48
|
#
|
49
49
|
# === Example 2: Using standard Ruby
|
50
50
|
#
|
51
|
-
#
|
52
|
-
# size = File.size(
|
53
|
-
# isdir = File.directory?(
|
54
|
-
# dir = File.dirname(
|
55
|
-
# base = File.basename(
|
56
|
-
# dir, base = File.split(
|
57
|
-
# data = File.read(
|
58
|
-
# File.open(
|
59
|
-
# File.foreach(
|
51
|
+
# pn = "/usr/bin/ruby"
|
52
|
+
# size = File.size(pn) # 27662
|
53
|
+
# isdir = File.directory?(pn) # false
|
54
|
+
# dir = File.dirname(pn) # "/usr/bin"
|
55
|
+
# base = File.basename(pn) # "ruby"
|
56
|
+
# dir, base = File.split(pn) # ["/usr/bin", "ruby"]
|
57
|
+
# data = File.read(pn)
|
58
|
+
# File.open(pn) { |f| _ }
|
59
|
+
# File.foreach(pn) { |line| _ }
|
60
60
|
#
|
61
61
|
# === Example 3: Special features
|
62
62
|
#
|
@@ -71,14 +71,14 @@
|
|
71
71
|
# p5.cleanpath # Pathname:articles
|
72
72
|
# p5.realpath # Pathname:/home/gavin/articles
|
73
73
|
# p5.children # [Pathname:/home/gavin/articles/linux, ...]
|
74
|
-
#
|
74
|
+
#
|
75
75
|
# == Breakdown of functionality
|
76
76
|
#
|
77
77
|
# === Core methods
|
78
78
|
#
|
79
|
-
# These methods are effectively manipulating a String, because that's
|
80
|
-
# is. Except for #mountpoint?, #children,
|
81
|
-
# filesystem.
|
79
|
+
# These methods are effectively manipulating a String, because that's
|
80
|
+
# all a path is. Except for #mountpoint?, #children, #each_child,
|
81
|
+
# #realdirpath and #realpath, they don't access the filesystem.
|
82
82
|
#
|
83
83
|
# - +
|
84
84
|
# - #join
|
@@ -90,7 +90,9 @@
|
|
90
90
|
# - #each_filename
|
91
91
|
# - #cleanpath
|
92
92
|
# - #realpath
|
93
|
+
# - #realdirpath
|
93
94
|
# - #children
|
95
|
+
# - #each_child
|
94
96
|
# - #mountpoint?
|
95
97
|
#
|
96
98
|
# === File status predicate methods
|
@@ -165,6 +167,7 @@
|
|
165
167
|
# These methods are a facade for IO:
|
166
168
|
# - #each_line(*args, &block)
|
167
169
|
# - #read(*args)
|
170
|
+
# - #binread(*args)
|
168
171
|
# - #readlines(*args)
|
169
172
|
# - #sysopen(*args)
|
170
173
|
#
|
@@ -194,6 +197,13 @@ class Pathname
|
|
194
197
|
# to_path is implemented so Pathname objects are usable with File.open, etc.
|
195
198
|
TO_PATH = :to_path
|
196
199
|
end
|
200
|
+
|
201
|
+
SAME_PATHS = if File::FNM_SYSCASE.nonzero?
|
202
|
+
proc {|a, b| a.casecmp(b).zero?}
|
203
|
+
else
|
204
|
+
proc {|a, b| a == b}
|
205
|
+
end
|
206
|
+
|
197
207
|
# :startdoc:
|
198
208
|
|
199
209
|
#
|
@@ -251,15 +261,40 @@ class Pathname
|
|
251
261
|
|
252
262
|
# Return a pathname which is substituted by String#sub.
|
253
263
|
def sub(pattern, *rest, &block)
|
254
|
-
|
264
|
+
if block
|
265
|
+
path = @path.sub(pattern, *rest) {|*args|
|
266
|
+
begin
|
267
|
+
old = Thread.current[:pathname_sub_matchdata]
|
268
|
+
Thread.current[:pathname_sub_matchdata] = $~
|
269
|
+
eval("$~ = Thread.current[:pathname_sub_matchdata]", block.binding)
|
270
|
+
ensure
|
271
|
+
Thread.current[:pathname_sub_matchdata] = old
|
272
|
+
end
|
273
|
+
yield(*args)
|
274
|
+
}
|
275
|
+
else
|
276
|
+
path = @path.sub(pattern, *rest)
|
277
|
+
end
|
278
|
+
self.class.new(path)
|
255
279
|
end
|
256
280
|
|
257
281
|
if File::ALT_SEPARATOR
|
258
|
-
|
282
|
+
SEPARATOR_LIST = "#{Regexp.quote File::ALT_SEPARATOR}#{Regexp.quote File::SEPARATOR}"
|
283
|
+
SEPARATOR_PAT = /[#{SEPARATOR_LIST}]/
|
259
284
|
else
|
285
|
+
SEPARATOR_LIST = "#{Regexp.quote File::SEPARATOR}"
|
260
286
|
SEPARATOR_PAT = /#{Regexp.quote File::SEPARATOR}/
|
261
287
|
end
|
262
288
|
|
289
|
+
# Return a pathname which the extension of the basename is substituted by
|
290
|
+
# <i>repl</i>.
|
291
|
+
#
|
292
|
+
# If self has no extension part, <i>repl</i> is appended.
|
293
|
+
def sub_ext(repl)
|
294
|
+
ext = File.extname(@path)
|
295
|
+
self.class.new(@path.chomp(ext) + repl)
|
296
|
+
end
|
297
|
+
|
263
298
|
# chop_basename(path) -> [pre-basename, basename] or nil
|
264
299
|
def chop_basename(path)
|
265
300
|
base = File.basename(path)
|
@@ -400,58 +435,25 @@ class Pathname
|
|
400
435
|
end
|
401
436
|
private :cleanpath_conservative
|
402
437
|
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
path = prepend_prefix(prefix, File.join(*(resolved + [n])))
|
413
|
-
if h.include? path
|
414
|
-
if h[path] == :resolving
|
415
|
-
raise Errno::ELOOP.new(path)
|
416
|
-
else
|
417
|
-
prefix, *resolved = h[path]
|
418
|
-
end
|
419
|
-
else
|
420
|
-
s = File.lstat(path)
|
421
|
-
if s.symlink?
|
422
|
-
h[path] = :resolving
|
423
|
-
link_prefix, link_names = split_names(File.readlink(path))
|
424
|
-
if link_prefix == ''
|
425
|
-
prefix, *resolved = h[path] = realpath_rec(prefix, resolved + link_names, h)
|
426
|
-
else
|
427
|
-
prefix, *resolved = h[path] = realpath_rec(link_prefix, link_names, h)
|
428
|
-
end
|
429
|
-
else
|
430
|
-
resolved << n
|
431
|
-
h[path] = [prefix, *resolved]
|
432
|
-
end
|
433
|
-
end
|
434
|
-
end
|
435
|
-
end
|
436
|
-
return prefix, *resolved
|
438
|
+
#
|
439
|
+
# Returns the real (absolute) pathname of +self+ in the actual
|
440
|
+
# filesystem not containing symlinks or useless dots.
|
441
|
+
#
|
442
|
+
# All components of the pathname must exist when this method is
|
443
|
+
# called.
|
444
|
+
#
|
445
|
+
def realpath(basedir=nil)
|
446
|
+
self.class.new(File.realpath(@path, basedir))
|
437
447
|
end
|
438
|
-
private :realpath_rec
|
439
448
|
|
440
449
|
#
|
441
|
-
# Returns
|
450
|
+
# Returns the real (absolute) pathname of +self+ in the actual filesystem.
|
442
451
|
# The real pathname doesn't contain symlinks or useless dots.
|
443
452
|
#
|
444
|
-
#
|
453
|
+
# The last component of the real pathname can be nonexistent.
|
445
454
|
#
|
446
|
-
def
|
447
|
-
path
|
448
|
-
prefix, names = split_names(path)
|
449
|
-
if prefix == ''
|
450
|
-
prefix, names2 = split_names(Dir.pwd)
|
451
|
-
names = names2 + names
|
452
|
-
end
|
453
|
-
prefix, *names = realpath_rec(prefix, names, {})
|
454
|
-
self.class.new(prepend_prefix(prefix, File.join(*names)))
|
455
|
+
def realdirpath(basedir=nil)
|
456
|
+
self.class.new(File.realdirpath(@path, basedir))
|
455
457
|
end
|
456
458
|
|
457
459
|
# #parent returns the parent directory.
|
@@ -506,6 +508,7 @@ class Pathname
|
|
506
508
|
# # yields "usr", "bin", and "ruby".
|
507
509
|
#
|
508
510
|
def each_filename # :yield: filename
|
511
|
+
return to_enum(__method__) unless block_given?
|
509
512
|
prefix, names = split_names(@path)
|
510
513
|
names.each {|filename| yield filename }
|
511
514
|
nil
|
@@ -576,7 +579,7 @@ class Pathname
|
|
576
579
|
# p2 = p1 + "bin/ruby" # Pathname:/usr/bin/ruby
|
577
580
|
# p3 = p1 + "/etc/passwd" # Pathname:/etc/passwd
|
578
581
|
#
|
579
|
-
# This method doesn't access the file system; it is pure string manipulation.
|
582
|
+
# This method doesn't access the file system; it is pure string manipulation.
|
580
583
|
#
|
581
584
|
def +(other)
|
582
585
|
other = Pathname.new(other) unless Pathname === other
|
@@ -652,12 +655,12 @@ class Pathname
|
|
652
655
|
# filename only.
|
653
656
|
#
|
654
657
|
# For example:
|
655
|
-
#
|
656
|
-
#
|
658
|
+
# pn = Pathname("/usr/lib/ruby/1.8")
|
659
|
+
# pn.children
|
657
660
|
# # -> [ Pathname:/usr/lib/ruby/1.8/English.rb,
|
658
661
|
# Pathname:/usr/lib/ruby/1.8/Env.rb,
|
659
662
|
# Pathname:/usr/lib/ruby/1.8/abbrev.rb, ... ]
|
660
|
-
#
|
663
|
+
# pn.children(false)
|
661
664
|
# # -> [ Pathname:English.rb, Pathname:Env.rb, Pathname:abbrev.rb, ... ]
|
662
665
|
#
|
663
666
|
# Note that the result never contain the entries <tt>.</tt> and <tt>..</tt> in
|
@@ -679,6 +682,36 @@ class Pathname
|
|
679
682
|
result
|
680
683
|
end
|
681
684
|
|
685
|
+
# Iterates over the children of the directory
|
686
|
+
# (files and subdirectories, not recursive).
|
687
|
+
# It yields Pathname object for each child.
|
688
|
+
# By default, the yielded pathnames will have enough information to access the files.
|
689
|
+
# If you set +with_directory+ to +false+, then the returned pathnames will contain the filename only.
|
690
|
+
#
|
691
|
+
# Pathname("/usr/local").each_child {|f| p f }
|
692
|
+
# #=> #<Pathname:/usr/local/share>
|
693
|
+
# # #<Pathname:/usr/local/bin>
|
694
|
+
# # #<Pathname:/usr/local/games>
|
695
|
+
# # #<Pathname:/usr/local/lib>
|
696
|
+
# # #<Pathname:/usr/local/include>
|
697
|
+
# # #<Pathname:/usr/local/sbin>
|
698
|
+
# # #<Pathname:/usr/local/src>
|
699
|
+
# # #<Pathname:/usr/local/man>
|
700
|
+
#
|
701
|
+
# Pathname("/usr/local").each_child(false) {|f| p f }
|
702
|
+
# #=> #<Pathname:share>
|
703
|
+
# # #<Pathname:bin>
|
704
|
+
# # #<Pathname:games>
|
705
|
+
# # #<Pathname:lib>
|
706
|
+
# # #<Pathname:include>
|
707
|
+
# # #<Pathname:sbin>
|
708
|
+
# # #<Pathname:src>
|
709
|
+
# # #<Pathname:man>
|
710
|
+
#
|
711
|
+
def each_child(with_directory=true, &b)
|
712
|
+
children(with_directory).each(&b)
|
713
|
+
end
|
714
|
+
|
682
715
|
#
|
683
716
|
# #relative_path_from returns a relative path from the argument to the
|
684
717
|
# receiver. If +self+ is absolute, the argument must be absolute too. If
|
@@ -705,12 +738,12 @@ class Pathname
|
|
705
738
|
base_prefix, basename = r
|
706
739
|
base_names.unshift basename if basename != '.'
|
707
740
|
end
|
708
|
-
|
741
|
+
unless SAME_PATHS[dest_prefix, base_prefix]
|
709
742
|
raise ArgumentError, "different prefix: #{dest_prefix.inspect} and #{base_directory.inspect}"
|
710
743
|
end
|
711
744
|
while !dest_names.empty? &&
|
712
745
|
!base_names.empty? &&
|
713
|
-
dest_names.first
|
746
|
+
SAME_PATHS[dest_names.first, base_names.first]
|
714
747
|
dest_names.shift
|
715
748
|
base_names.shift
|
716
749
|
end
|
@@ -738,16 +771,14 @@ class Pathname # * IO *
|
|
738
771
|
IO.foreach(@path, *args, &block)
|
739
772
|
end
|
740
773
|
|
741
|
-
#
|
742
|
-
def foreachline(*args, &block)
|
743
|
-
warn "Pathname#foreachline is obsoleted. Use Pathname#each_line."
|
744
|
-
each_line(*args, &block)
|
745
|
-
end
|
746
|
-
|
747
|
-
# See <tt>IO.read</tt>. Returns all the bytes from the file, or the first +N+
|
774
|
+
# See <tt>IO.read</tt>. Returns all data from the file, or the first +N+ bytes
|
748
775
|
# if specified.
|
749
776
|
def read(*args) IO.read(@path, *args) end
|
750
777
|
|
778
|
+
# See <tt>IO.binread</tt>. Returns all the bytes from the file, or the first +N+
|
779
|
+
# if specified.
|
780
|
+
def binread(*args) IO.binread(@path, *args) end
|
781
|
+
|
751
782
|
# See <tt>IO.readlines</tt>. Returns all the lines from the file.
|
752
783
|
def readlines(*args) IO.readlines(@path, *args) end
|
753
784
|
|
@@ -834,20 +865,6 @@ class Pathname # * File *
|
|
834
865
|
# See <tt>File.split</tt>. Returns the #dirname and the #basename in an
|
835
866
|
# Array.
|
836
867
|
def split() File.split(@path).map {|f| self.class.new(f) } end
|
837
|
-
|
838
|
-
# Pathname#link is confusing and *obsoleted* because the receiver/argument
|
839
|
-
# order is inverted to corresponding system call.
|
840
|
-
def link(old)
|
841
|
-
warn 'Pathname#link is obsoleted. Use Pathname#make_link.'
|
842
|
-
File.link(old, @path)
|
843
|
-
end
|
844
|
-
|
845
|
-
# Pathname#symlink is confusing and *obsoleted* because the receiver/argument
|
846
|
-
# order is inverted to corresponding system call.
|
847
|
-
def symlink(old)
|
848
|
-
warn 'Pathname#symlink is obsoleted. Use Pathname#make_symlink.'
|
849
|
-
File.symlink(old, @path)
|
850
|
-
end
|
851
868
|
end
|
852
869
|
|
853
870
|
|
@@ -929,7 +946,7 @@ end
|
|
929
946
|
|
930
947
|
class Pathname # * Dir *
|
931
948
|
# See <tt>Dir.glob</tt>. Returns or yields Pathname objects.
|
932
|
-
def Pathname.glob(*args) # :yield:
|
949
|
+
def Pathname.glob(*args) # :yield: pathname
|
933
950
|
if block_given?
|
934
951
|
Dir.glob(*args) {|f| yield self.new(f) }
|
935
952
|
else
|
@@ -941,18 +958,6 @@ class Pathname # * Dir *
|
|
941
958
|
def Pathname.getwd() self.new(Dir.getwd) end
|
942
959
|
class << self; alias pwd getwd end
|
943
960
|
|
944
|
-
# Pathname#chdir is *obsoleted* at 1.8.1.
|
945
|
-
def chdir(&block)
|
946
|
-
warn "Pathname#chdir is obsoleted. Use Dir.chdir."
|
947
|
-
Dir.chdir(@path, &block)
|
948
|
-
end
|
949
|
-
|
950
|
-
# Pathname#chroot is *obsoleted* at 1.8.1.
|
951
|
-
def chroot
|
952
|
-
warn "Pathname#chroot is obsoleted. Use Dir.chroot."
|
953
|
-
Dir.chroot(@path)
|
954
|
-
end
|
955
|
-
|
956
961
|
# Return the entries (files and subdirectories) in the directory, each as a
|
957
962
|
# Pathname object.
|
958
963
|
def entries() Dir.entries(@path).map {|f| self.class.new(f) } end
|
@@ -961,16 +966,10 @@ class Pathname # * Dir *
|
|
961
966
|
# yields a Pathname object for each entry.
|
962
967
|
#
|
963
968
|
# This method has existed since 1.8.1.
|
964
|
-
def each_entry(&block) # :yield:
|
969
|
+
def each_entry(&block) # :yield: pathname
|
965
970
|
Dir.foreach(@path) {|f| yield self.class.new(f) }
|
966
971
|
end
|
967
972
|
|
968
|
-
# Pathname#dir_foreach is *obsoleted* at 1.8.1.
|
969
|
-
def dir_foreach(*args, &block)
|
970
|
-
warn "Pathname#dir_foreach is obsoleted. Use Pathname#each_entry."
|
971
|
-
each_entry(*args, &block)
|
972
|
-
end
|
973
|
-
|
974
973
|
# See <tt>Dir.mkdir</tt>. Create the referenced directory.
|
975
974
|
def mkdir(*args) Dir.mkdir(@path, *args) end
|
976
975
|
|
@@ -995,7 +994,7 @@ class Pathname # * Find *
|
|
995
994
|
# If +self+ is <tt>.</tt>, yielded pathnames begin with a filename in the
|
996
995
|
# current directory, not <tt>./</tt>.
|
997
996
|
#
|
998
|
-
def find(&block) # :yield:
|
997
|
+
def find(&block) # :yield: pathname
|
999
998
|
require 'find'
|
1000
999
|
if @path == '.'
|
1001
1000
|
Find.find(@path) {|f| yield self.class.new(f.sub(%r{\A\./}, '')) }
|
@@ -1037,18 +1036,10 @@ class Pathname # * mixed *
|
|
1037
1036
|
end
|
1038
1037
|
end
|
1039
1038
|
alias delete unlink
|
1039
|
+
end
|
1040
1040
|
|
1041
|
-
|
1042
|
-
|
1043
|
-
warn "Pathname#foreach is obsoleted. Use each_line or each_entry."
|
1044
|
-
if FileTest.directory? @path
|
1045
|
-
# For polymorphism between Dir.foreach and IO.foreach,
|
1046
|
-
# Pathname#foreach doesn't yield Pathname object.
|
1047
|
-
Dir.foreach(@path, *args, &block)
|
1048
|
-
else
|
1049
|
-
IO.foreach(@path, *args, &block)
|
1050
|
-
end
|
1051
|
-
end
|
1041
|
+
class Pathname
|
1042
|
+
undef =~
|
1052
1043
|
end
|
1053
1044
|
|
1054
1045
|
module Kernel
|
data/rubysl-pathname.gemspec
CHANGED
@@ -19,5 +19,4 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.add_development_dependency "bundler", "~> 1.3"
|
20
20
|
spec.add_development_dependency "rake", "~> 10.0"
|
21
21
|
spec.add_development_dependency "mspec", "~> 1.5"
|
22
|
-
|
23
|
-
end
|
22
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubysl-pathname
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Shirai
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-09-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -52,20 +52,6 @@ dependencies:
|
|
52
52
|
- - ~>
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '1.5'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: rubysl-prettyprint
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ~>
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '1.0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ~>
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '1.0'
|
69
55
|
description: Ruby standard library pathname.
|
70
56
|
email:
|
71
57
|
- brixen@gmail.com
|