lib/pa/path.rb in pa-1.1.4 vs lib/pa/path.rb in pa-1.2.0
- old
+ new
@@ -10,35 +10,15 @@
* [g]sub[!] match =~
* start_with? end_with?
=end
class Pa
- NAME_EXT_PAT = /^(.+?)(?:\.([^.]+))?$/
module Path
extend Util::Concern
module ClassMethods
- # get path of an object.
- #
- # return obj#path if object has a 'path' instance method
- #
- # nil -> nil
- #
- #
- # @param [String,#path] obj
- # @return [String,nil] path
- def get(obj)
- if obj.respond_to?(:path)
- obj.path
- elsif String === obj
- obj
- elsif obj.nil?
- nil
- else
- raise ArgumentError, "Pa.get() not support type -- #{obj.inspect}(#{obj.class})"
- end
- end
+ DELEGATE_METHODS = [:pwd, :dir, :absolute, :expand, :real, :parent]
# return current work directory
# @return [String] path
def pwd2
Dir.getwd
@@ -67,11 +47,10 @@
else
nil
end
end # def dsymlink?
-
def dir2(path)
File.dirname(path)
end
# get a basename of a path
@@ -86,17 +65,27 @@
# @return [String] basename of a path unless o[:ext]
# @return [Array<String>] \[name, ext] if o[:ext].
def base2(name, o={})
name = File.basename(get(name))
if o[:ext]
- name, ext = name.match(NAME_EXT_PAT).captures
+ name, ext = name.match(/^(.+?)(?:\.([^.]+))?$/).captures
[ name, (ext || "")]
else
name
end
end
+ def base(*args, &blk)
+ rst = base2(*args, &blk)
+
+ if Array===rst
+ [ Pa(rst[0]), rst[1] ]
+ else
+ rst
+ end
+ end
+
# ext of a path
#
# @example
# "a.ogg" => "ogg"
# "a" => nil
@@ -106,10 +95,12 @@
def ext2 path
_, ext = get(path).match(/\.([^.]+)$/).to_a
ext
end
+ alias ext ext2
+
# alias from File.absolute_path
# @param [String,Pa] path
# @return [String]
def absolute2(path)
File.absolute_path get(path)
@@ -129,10 +120,12 @@
# @return [String]
def shorten2(path)
get(path).sub /^#{Regexp.escape(ENV["HOME"])}/, "~"
end
+ alias shorten shorten2
+
# real path
def real2(path)
File.realpath get(path)
end
@@ -146,174 +139,39 @@
n.times do
path = File.dirname(path)
end
path
end
-
- # split path
- #
- # @example
- # path="/home/a/file"
- # split2(path) #=> "/home/a", "file"
- # split2(path, :all => true) #=> "/", "home", "a", "file"
- #
- # @param [String,Pa] name
- # @param [Hash] o option
- # @option o [Boolean] :all split all parts
- # @return [Array<String>]
- def split2(name, o={})
- dir, fname = File.split(get(name))
- ret = Util.wrap_array(File.basename(fname))
- if o[:all]
- loop do
- dir1, fname = File.split(dir)
- break if dir1 == dir
- ret.unshift fname
- dir = dir1
- end
- end
- ret.unshift dir
- ret
- end
+ DELEGATE_METHODS.each { |mth|
+ mth2 = "#{mth}2"
- # special case
- def split(*args)
- dir, *names = split2(*args)
- [ Pa(dir), *names]
- end
-
- # join paths, skip nil and empty string.
- #
- # @param [*Array<String>] *paths
- # @return [String]
- def join2(*paths)
- paths.map!{|v|get(v)}
-
- # skip nil
- paths.compact!
-
- # skip empty string
- paths.delete("")
-
- File.join(*paths)
- end
+ class_eval <<-EOF
+ def #{mth}(*args, &blk)
+ Pa(Pa.#{mth2}(*args, &blk))
+ end
+ EOF
+ }
end
module InstanceMethods
- # @return [String]
- attr_reader :absolute2, :dir2, :base2, :name2, :short2
+ DELEGATE_METHODS2 = [ :parent2 ]
+ DELEGATE_METHODS = [ :parent]
- # @return [String] ext "", "ogg"
- attr_reader :ext2
-
- # @return [String] ext "", ".ogg"
- attr_reader :fext2
-
- def initialize_variables
- super
- @absolute2 = File.absolute_path(@path)
- @dir2 = File.dirname(@path)
- @base2 = File.basename(@path)
- @name2, @ext2 = @base2.match(NAME_EXT_PAT).captures
- @ext2 ||= ""
- @fext2 = @ext2.empty? ? "" : "."+@ext2
+ DELEGATE_METHODS2.each do |mth2|
+ class_eval <<-EOF
+ def #{mth2}(*args, &blk)
+ Pa.#{mth2}(path, *args, &blk)
+ end
+ EOF
end
- alias a2 absolute2
- alias d2 dir2
- alias b2 base2
- alias n2 name2
- alias fname2 base2
- alias fn2 fname2
- alias e2 ext2
- alias fe2 fext2
-
- # fix name,2 => String
- alias base base2
- alias fname fname2
- alias name name2
- alias ext ext2
- alias fext fext2
-
- alias b base
- alias fn fname
- alias n name
- alias e ext
- alias fe fext
-
- def short2
- @short2 ||= Pa.shorten2(@path)
- end
-
- # add string to path
- #
- # @example
- # pa = Pa('/home/foo/a.txt')
- # pa+'~' #=> new Pa('/home/foo/a.txt~')
- #
- # @param [String] str
- # @return [Pa]
- def +(str)
- Pa(path+str)
- end
-
- # @return [String]
- def sub2(*args, &blk)
- path.sub(*args, &blk)
- end
-
- # @return [String]
- def gsub2(*args, &blk)
- path.gsub(*args, &blk)
- end
-
- # @return [Pa]
- def sub(*args, &blk)
- Pa(sub2(*args, &blk))
- end
-
- # @return [Pa]
- def gsub(*args, &blk)
- Pa(gsub2(*args, &blk))
- end
-
- # @return [Pa]
- def sub!(*args,&blk)
- self.replace path.sub(*args,&blk)
- end
-
- # @return [Pa]
- def gsub!(*args,&blk)
- self.replace path.gsub(*args,&blk)
- end
-
- # @return [MatchData]
- def match(*args,&blk)
- path.match(*args,&blk)
- end
-
- # @return [Boolean]
- def start_with?(*args)
- path.start_with?(*args)
- end
-
- # @return [Boolean]
- def end_with?(*args)
- path.end_with?(*args)
- end
-
- def =~(regexp)
- path =~ regexp
- end
-
- def ==(other)
- case other
- when Pa
- self.path == other.path
- else
- false
- end
+ DELEGATE_METHODS.each do |mth|
+ class_eval <<-EOF
+ def #{mth}(*args, &blk)
+ Pa(#{mth}2(*args, &blk))
+ end
+ EOF
end
end
end
end