Class: Pathname

Inherits:
Object show all
Includes:
Comparable
Defined in:
opal/stdlib/pathname.rb

Overview

Portions from Author:: Tanaka Akira [email protected]

Constant Summary

SEPARATOR_PAT =
/#{Regexp.quote File::SEPARATOR}/
SAME_PATHS =
if File::FNM_SYSCASE.nonzero?
  # Avoid #zero? here because #casecmp can return nil.
  proc {|a, b| a.casecmp(b) == 0}
else
  proc {|a, b| a == b}
end

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(path) ⇒ Pathname

Returns a new instance of Pathname

Raises:

  • (ArgumentError)


8
9
10
11
12
13
14
15
16
17
18
19
20
21
# File 'opal/stdlib/pathname.rb', line 8

def initialize(path)
  if Pathname === path
    @path = path.path.to_s
  elsif path.respond_to?(:to_path)
    @path = path.to_path
  elsif path.is_a?(String)
    @path = path
  elsif path.nil?
    raise TypeError, 'no implicit conversion of nil into String'
  else
    raise TypeError, "no implicit conversion of #{path.class} into String"
  end
  raise ArgumentError if @path == "\0"
end

Instance Attribute Details

#pathObject (readonly)

Returns the value of attribute path



23
24
25
# File 'opal/stdlib/pathname.rb', line 23

def path
  @path
end

Instance Method Details

#+(other) ⇒ Object



81
82
83
84
# File 'opal/stdlib/pathname.rb', line 81

def +(other)
  other = Pathname.new(other) unless Pathname === other
  Pathname.new(plus(@path, other.to_s))
end

#<=>(other) ⇒ Object



160
161
162
# File 'opal/stdlib/pathname.rb', line 160

def <=>(other)
  self.path <=> other.path
end

#==(other) ⇒ Object Also known as: eql?, ===



25
26
27
# File 'opal/stdlib/pathname.rb', line 25

def == other
  other.path == @path
end

#absolute?Boolean

Returns:



29
30
31
# File 'opal/stdlib/pathname.rb', line 29

def absolute?
  !relative?
end

#basenameObject



148
149
150
# File 'opal/stdlib/pathname.rb', line 148

def basename
  Pathname.new(File.basename(@path))
end

#chop_basename(path) ⇒ Object

:nodoc:



41
42
43
44
45
46
47
48
49
# File 'opal/stdlib/pathname.rb', line 41

def chop_basename(path) # :nodoc:
  base = File.basename(path)
  # ruby uses /^#{SEPARATOR_PAT}?$/o but having issues with interpolation
  if Regexp.new("^#{Pathname::SEPARATOR_PAT.source}?$") =~ base
    return nil
  else
    return path[0, path.rindex(base)], base
  end
end

#cleanpathObject



65
66
67
# File 'opal/stdlib/pathname.rb', line 65

def cleanpath
  `return Opal.normalize(#@path)`
end

#directory?Boolean

Returns:



152
153
154
# File 'opal/stdlib/pathname.rb', line 152

def directory?
  File.directory?(@path)
end

#dirnameObject



144
145
146
# File 'opal/stdlib/pathname.rb', line 144

def dirname
  Pathname.new(File.dirname(@path))
end

#entriesObject



213
214
215
# File 'opal/stdlib/pathname.rb', line 213

def entries
  Dir.entries(@path).map {|f| self.class.new(f) }
end

#expand_pathObject



77
78
79
# File 'opal/stdlib/pathname.rb', line 77

def expand_path
  File.expand_path @path
end

#extnameObject



156
157
158
# File 'opal/stdlib/pathname.rb', line 156

def extname
  File.extname(@path)
end

#hashObject



73
74
75
# File 'opal/stdlib/pathname.rb', line 73

def hash
  @path
end

#join(*args) ⇒ Object



127
128
129
130
131
132
133
134
135
136
137
138
# File 'opal/stdlib/pathname.rb', line 127

def join(*args)
  return self if args.empty?
  result = args.pop
  result = Pathname.new(result) unless Pathname === result
  return result if result.absolute?
  args.reverse_each {|arg|
    arg = Pathname.new(arg) unless Pathname === arg
    result = arg + result
    return result if result.absolute?
  }
  self + result
end

#parentObject



55
56
57
58
59
# File 'opal/stdlib/pathname.rb', line 55

def parent
  new_path = @path.sub(%r{/([^/]+/?$)}, '')
  new_path = absolute? ? '/' : '.' if new_path == ''
  Pathname.new(new_path)
end

#plus(path1, path2) ⇒ Object

-> path # :nodoc:



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# File 'opal/stdlib/pathname.rb', line 86

def plus(path1, path2) # -> path # :nodoc:
  prefix2 = path2
  index_list2 = []
  basename_list2 = []
  while r2 = chop_basename(prefix2)
    prefix2, basename2 = r2
    index_list2.unshift prefix2.length
    basename_list2.unshift basename2
  end
  return path2 if prefix2 != ''
  prefix1 = path1
  while true
    while !basename_list2.empty? && basename_list2.first == '.'
      index_list2.shift
      basename_list2.shift
    end
    break unless r1 = chop_basename(prefix1)
    prefix1, basename1 = r1
    next if basename1 == '.'
    if basename1 == '..' || basename_list2.empty? || basename_list2.first != '..'
      prefix1 = prefix1 + basename1
      break
    end
    index_list2.shift
    basename_list2.shift
  end
  r1 = chop_basename(prefix1)
  if !r1 && /#{SEPARATOR_PAT}/ =~ File.basename(prefix1)
    while !basename_list2.empty? && basename_list2.first == '..'
      index_list2.shift
      basename_list2.shift
    end
  end
  if !basename_list2.empty?
    suffix2 = path2[index_list2.first..-1]
    r1 ? File.join(prefix1, suffix2) : prefix1 + suffix2
  else
    r1 ? prefix1 : File.dirname(prefix1)
  end
end

#relative?Boolean

Returns:



33
34
35
36
37
38
39
# File 'opal/stdlib/pathname.rb', line 33

def relative?
  path = @path
  while r = chop_basename(path)
    path, = r
  end
  path == ''
end

#relative_path_from(base_directory) ⇒ Object



177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
# File 'opal/stdlib/pathname.rb', line 177

def relative_path_from(base_directory)
  dest_directory = self.cleanpath.to_s
  base_directory = base_directory.cleanpath.to_s
  dest_prefix = dest_directory
  dest_names = []
  while r = chop_basename(dest_prefix)
    dest_prefix, basename = r
    dest_names.unshift basename if basename != '.'
  end
  base_prefix = base_directory
  base_names = []
  while r = chop_basename(base_prefix)
    base_prefix, basename = r
    base_names.unshift basename if basename != '.'
  end
  unless SAME_PATHS[dest_prefix, base_prefix]
    raise ArgumentError, "different prefix: #{dest_prefix.inspect} and #{base_directory.inspect}"
  end
  while !dest_names.empty? &&
        !base_names.empty? &&
        SAME_PATHS[dest_names.first, base_names.first]
    dest_names.shift
    base_names.shift
  end
  if base_names.include? '..'
    raise ArgumentError, "base_directory has ..: #{base_directory.inspect}"
  end
  base_names.fill('..')
  relpath_names = base_names + dest_names
  if relpath_names.empty?
    Pathname.new('.')
  else
    Pathname.new(File.join(*relpath_names))
  end
end

#root?Boolean

Returns:



51
52
53
# File 'opal/stdlib/pathname.rb', line 51

def root?
  @path == '/'
end

#splitObject



140
141
142
# File 'opal/stdlib/pathname.rb', line 140

def split
  [ dirname, basename ]
end

#sub(*args) ⇒ Object



61
62
63
# File 'opal/stdlib/pathname.rb', line 61

def sub(*args)
  Pathname.new(@path.sub(*args))
end

#to_pathObject Also known as: to_str, to_s



69
70
71
# File 'opal/stdlib/pathname.rb', line 69

def to_path
  @path
end