pa 1.1.3 → 1.1.4

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.
@@ -2,7 +2,6 @@ GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
4
  diff-lcs (1.1.2)
5
- rake (0.9.2)
6
5
  rspec (2.6.0)
7
6
  rspec-core (~> 2.6.0)
8
7
  rspec-expectations (~> 2.6.0)
@@ -18,7 +17,6 @@ PLATFORMS
18
17
  ruby
19
18
 
20
19
  DEPENDENCIES
21
- rake
22
20
  rspec
23
21
  thor
24
22
  watchr
data/lib/pa.rb CHANGED
@@ -75,7 +75,7 @@ class Pa
75
75
  # dir -> dir2
76
76
  name2 = "#{name}2".to_sym
77
77
  if public_methods.include?(name2)
78
- ret = __send__(name2, *args)
78
+ ret = __send__(name2, *args, &blk)
79
79
  return case ret
80
80
  when Array
81
81
  ret.map{|v| Pa(v)}
@@ -130,17 +130,7 @@ class Pa
130
130
 
131
131
  # missing method goes to Pa.class-method
132
132
  def method_missing(name, *args, &blk)
133
- ret = self.class.__send__(name, path, *args, &blk)
134
-
135
- case ret
136
- # e.g. readlink ..
137
- when String
138
- Pa(ret)
139
- # e.g. directory?
140
- else
141
- ret
142
- end
143
-
133
+ self.class.__send__(name, path, *args, &blk)
144
134
  end
145
135
 
146
136
  def <=> other
@@ -158,16 +148,15 @@ end
158
148
 
159
149
  require "pa/path"
160
150
  require "pa/cmd"
161
- require "pa/dir"
151
+ require "pa/directory"
162
152
  require "pa/state"
163
153
  class Pa
164
154
  include Path
165
- include Dir
155
+ include Directory
166
156
  include State
167
157
  include Cmd
168
158
  end
169
159
 
170
-
171
160
  module Kernel
172
161
  private
173
162
  # a very convient function.
@@ -59,12 +59,11 @@ class Pa
59
59
  File.readlink(get(path))
60
60
  end
61
61
 
62
-
63
62
  # change directory
64
63
  #
65
64
  # @param [String,Pa] path
66
65
  def cd(path=ENV["HOME"], &blk)
67
- ::Dir.chdir(get(path), &blk)
66
+ Dir.chdir(get(path), &blk)
68
67
  end
69
68
 
70
69
  # chroot
@@ -73,7 +72,7 @@ class Pa
73
72
  # @param [String] path
74
73
  # @return [nil]
75
74
  def chroot(path)
76
- ::Dir.chroot(get(path))
75
+ Dir.chroot(get(path))
77
76
  end
78
77
 
79
78
  # touch a blank file
@@ -135,12 +134,12 @@ class Pa
135
134
  def mktmpdir(o={}, &blk)
136
135
  p = _mktmpname(o)
137
136
  File.mkdir(p)
138
- begin blk.call(p) ensure ::Dir.delete(p) end if blk
137
+ begin blk.call(p) ensure Dir.delete(p) end if blk
139
138
  p
140
139
  end # def mktmpdir
141
140
 
142
141
  def home(user=nil)
143
- ::Dir.home
142
+ Dir.home
144
143
  end
145
144
 
146
145
  # make temp file
@@ -301,14 +300,13 @@ class Pa
301
300
  #
302
301
  # @example
303
302
  #
304
- # Pa.rename('/home/guten.jpg') {|pa| pa.name+'_1'+pa.fext} # => '/home/guten_1.jpg'
305
- # Pa('/home/guten.jpg').rename {|pa| pa.name+'_1'+pa.fext} # => <#Pa('/home/guten_1.jpg')>
303
+ # Pa.rename2('/home/guten.jpg') {|pa| pa.name+'_1'+pa.fext} # => '/home/guten_1.jpg'
306
304
  #
307
305
  # @param [String,Pa] src
308
306
  # @yieldparam [Pa] pa
309
307
  # @yieldreturn [String] fname
310
308
  # @return [String,Pa] # Pa.rename return String. Pa#rename return Pa.
311
- def rename(src, &blk)
309
+ def rename2(src, &blk)
312
310
  src = Pa(src)
313
311
  fname = blk.call(src)
314
312
  src.dir.join(fname).path
@@ -429,7 +427,7 @@ class Pa
429
427
  end
430
428
 
431
429
  stack.reverse.each do |path|
432
- ::Dir.mkdir(path)
430
+ Dir.mkdir(path)
433
431
  File.chmod(o[:mode], path)
434
432
  end
435
433
  }
@@ -463,7 +461,7 @@ class Pa
463
461
  pa.each {|pa1|
464
462
  File.directory?(pa1.p) ? _rmdir(pa1, o) : File.delete(pa1.p)
465
463
  }
466
- File.directory?(pa.p) ? ::Dir.rmdir(pa.p) : File.delete(pa.p)
464
+ File.directory?(pa.p) ? Dir.rmdir(pa.p) : File.delete(pa.p)
467
465
  end
468
466
 
469
467
  # I'm recursive
@@ -20,7 +20,7 @@
20
20
 
21
21
  =end
22
22
  class Pa
23
- module Dir
23
+ module Directory
24
24
  extend Util::Concern
25
25
 
26
26
  module ClassMethods
@@ -40,32 +40,36 @@ class Pa
40
40
  def glob2(*args, &blk)
41
41
  paths, o = Util.extract_options(args)
42
42
  paths.map!{|v|get(v)}
43
+ blk ||= proc { |path| path }
43
44
 
44
45
  flag = 0
45
46
  o.each do |option, value|
46
- next if option==:use_pa
47
47
  flag |= File.const_get("FNM_#{option.upcase}") if value
48
48
  end
49
49
 
50
- ret = ::Dir.glob(paths, flag)
50
+ files = Dir.glob(paths, flag)
51
51
 
52
52
  # delete . .. for '.*'
53
- %w(. ..).each {|v| ret.delete(v)}
54
- ret = ret.map{|v| Pa(v)} if o[:use_pa]
55
-
56
- if blk
57
- ret.each {|pa|
58
- blk.call pa
59
- }
60
- else
61
- ret
62
- end
53
+ %w(. ..).each {|v| files.delete(v)}
54
+
55
+ ret = []
56
+ files.each { |path|
57
+ ret << blk.call(path)
58
+ }
59
+
60
+ ret
63
61
  end
64
62
 
65
63
  def glob(*args, &blk)
66
64
  args, o = Util.extract_options(args)
67
- o[:use_pa] = true
68
- glob2(*args, o, &blk)
65
+ ret = []
66
+ blk ||= proc { |path| path }
67
+
68
+ glob2 *args, o do |path|
69
+ ret << blk.call(Pa(path))
70
+ end
71
+
72
+ ret
69
73
  end
70
74
 
71
75
  # is directory empty?
@@ -73,7 +77,7 @@ class Pa
73
77
  # @param [String] path
74
78
  # @return [Boolean]
75
79
  def empty?(path)
76
- ::Dir.entries(get(path)).empty?
80
+ Dir.entries(get(path)).empty?
77
81
  end
78
82
 
79
83
  # traverse directory
@@ -108,7 +112,7 @@ class Pa
108
112
  raise Errno::ENOTDIR, "`#{path}' not a directoy." unless File.directory?(path)
109
113
 
110
114
  begin
111
- dir = ::Dir.open(path)
115
+ dir = Dir.open(path)
112
116
  rescue Errno::EPERM => err
113
117
  end
114
118
  raise err if err and !o[:error]
@@ -120,19 +124,15 @@ class Pa
120
124
 
121
125
  # => "foo" not "./foo"
122
126
  pa = path=="." ? entry : File.join(path, entry)
123
- pa = Pa(pa) if o[:use_pa]
124
- if o[:error]
125
- blk.call pa, err
126
- else
127
- blk.call pa
127
+ blk.call pa, err
128
128
  end
129
129
  end
130
- end
131
130
 
132
131
  def each(*args, &blk)
133
132
  args, o = Util.extract_options(args)
134
- o[:use_pa] = true
135
- each2(*args, o, &blk)
133
+ each2 *args, o do |path, err|
134
+ blk.call Pa(path), err
135
+ end
136
136
  end
137
137
 
138
138
  # each with recursive
@@ -158,9 +158,12 @@ class Pa
158
158
  end
159
159
 
160
160
  def each_r(*args, &blk)
161
+ return Pa.to_enum(:each_r, *args) if not blk
162
+
161
163
  args, o = Util.extract_options(args)
162
- o[:use_pa] = true
163
- each2_r(*args, o, &blk)
164
+ each2_r *args, o do |path, err|
165
+ blk.call Pa(path), err
166
+ end
164
167
  end
165
168
 
166
169
  # list directory contents
@@ -178,18 +181,31 @@ class Pa
178
181
  # @yieldparam [String] fname
179
182
  # @return [Array<String>]
180
183
  def ls2(*args, &blk)
181
- blk ||= proc {true}
182
- each2(*args).with_object([]) { |path,m|
184
+ blk ||= proc { true }
185
+ each2(*args).with_object([]) { |(path),m|
183
186
  base = File.basename(path)
184
187
  ret = blk.call(path, base)
185
188
  m << base if ret
186
189
  }
187
190
  end
188
191
 
192
+ # @overload ls(path=".", o={})
193
+ # @return [Array<Pa>]
194
+ # @overload ls(path=".", o={})
195
+ # @yieldparam [Pa] path
196
+ # @yieldparam [String] fname
197
+ # @return [Array<String>]
189
198
  def ls(*args, &blk)
190
199
  args, o = Util.extract_options(args)
191
- o[:use_pa] = true
192
- ls2(*args, o, &blk)
200
+ blk ||= proc { true }
201
+ ret = []
202
+
203
+ ls2 *args do |path, fname|
204
+ rst = blk.call(Pa(path), fname)
205
+ ret << fname if rst
206
+ end
207
+
208
+ ret
193
209
  end
194
210
 
195
211
  # ls2 with recursive
@@ -217,16 +233,16 @@ class Pa
217
233
  # @param [String] path
218
234
  def _each2_r(path, relative, o, &blk)
219
235
  o.merge!(error: true)
220
- Pa.each2(path, o) do |path1, err|
236
+
237
+ Pa.each2(path, o) do |path2, err|
221
238
  # fix for File.join with empty string
222
- joins=[ relative=="" ? nil : relative, File.basename(path1)].compact
223
- relative1 = File.join(*joins)
239
+ joins=[ relative=="" ? nil : relative, File.basename(path2)].compact
240
+ relative2 = File.join(*joins)
224
241
 
225
- path1 = Pa(path1) if o[:use_pa]
226
- blk.call path1, relative1, err
242
+ blk.call path2, relative2, err
227
243
 
228
- if File.directory?(path1)
229
- _each2_r(path1, relative1, o, &blk)
244
+ if File.directory?(path2)
245
+ _each2_r(path2, relative2, o, &blk)
230
246
  end
231
247
  end
232
248
  end
@@ -0,0 +1,35 @@
1
+ # add Pa support in Marshal
2
+ module Marshal
3
+ class <<self
4
+
5
+ alias :original_load :load
6
+
7
+ # add support with Pa
8
+ #
9
+ # Marshal.load(Pa(path))
10
+ #
11
+ # @param [IO,String,Pa] obj
12
+ # @return [String]
13
+ def load(obj) original_load Pa===obj ? File.read(obj.p) : obj end
14
+
15
+ alias :original_dump :dump
16
+
17
+ # add support with Pa
18
+ #
19
+ # Marshal.dump(obj, Pa(path))
20
+ # dump(con, [obj], limit=-1)
21
+ #
22
+ # @param [String,Pa] obj
23
+ # @return [String]
24
+ def dump(obj, *args)
25
+ case args[0]
26
+ when String, Pa
27
+ path = String===args[0] ? args[0] : args[0].p
28
+ open(path, "wb"){|f| f.write(original_dump(con))}
29
+ else
30
+ original_dump con, *args
31
+ end
32
+ end
33
+
34
+ end
35
+ end
@@ -15,11 +15,15 @@ class Pa
15
15
  NAME_EXT_PAT = /^(.+?)(?:\.([^.]+))?$/
16
16
  module Path
17
17
  extend Util::Concern
18
+
18
19
  module ClassMethods
19
20
  # get path of an object.
20
21
  #
21
22
  # return obj#path if object has a 'path' instance method
22
23
  #
24
+ # nil -> nil
25
+ #
26
+ #
23
27
  # @param [String,#path] obj
24
28
  # @return [String,nil] path
25
29
  def get(obj)
@@ -27,8 +31,10 @@ class Pa
27
31
  obj.path
28
32
  elsif String === obj
29
33
  obj
34
+ elsif obj.nil?
35
+ nil
30
36
  else
31
- raise Error, "not support type -- #{obj.inspect}(#{obj.class})"
37
+ raise ArgumentError, "Pa.get() not support type -- #{obj.inspect}(#{obj.class})"
32
38
  end
33
39
  end
34
40
 
@@ -38,6 +44,32 @@ class Pa
38
44
  Dir.getwd
39
45
  end
40
46
 
47
+ # is path an absolute path ?
48
+ #
49
+ # @param [String,Pa] path
50
+ # @return [Boolean]
51
+ def absolute?(path)
52
+ path=get(path)
53
+ File.absolute_path(path) == path
54
+ end
55
+
56
+ # is path a dangling symlink?
57
+ #
58
+ # a dangling symlink is a dead symlink.
59
+ #
60
+ # @param [String,Pa] path
61
+ # @return [Boolean]
62
+ def dangling? path
63
+ path=get(path)
64
+ if File.symlink?(path)
65
+ src = File.readlink(path)
66
+ not File.exists?(src)
67
+ else
68
+ nil
69
+ end
70
+ end # def dsymlink?
71
+
72
+
41
73
  def dir2(path)
42
74
  File.dirname(path)
43
75
  end
@@ -76,40 +108,53 @@ class Pa
76
108
  ext
77
109
  end
78
110
 
79
-
80
111
  # alias from File.absolute_path
81
112
  # @param [String,Pa] path
82
113
  # @return [String]
83
- def absolute2(path); File.absolute_path(get(path)) end
114
+ def absolute2(path)
115
+ File.absolute_path get(path)
116
+ end
84
117
 
85
118
  # alias from File.expand_path
86
119
  # @param [String,Pa] path
87
120
  # @return [String]
88
- def expand2(path); File.expand_path(get(path)) end
121
+ def expand2(path)
122
+ File.expand_path get(path)
123
+ end
89
124
 
90
125
  # shorten2 a path,
91
126
  # convert /home/user/file to ~/file
92
127
  #
93
128
  # @param [String,Pa] path
94
129
  # @return [String]
95
- def shorten2(path);
96
- get(path).sub(%r!^#{Regexp.escape(ENV["HOME"])}!, "~")
130
+ def shorten2(path)
131
+ get(path).sub /^#{Regexp.escape(ENV["HOME"])}/, "~"
97
132
  end
98
133
 
134
+ # real path
135
+ def real2(path)
136
+ File.realpath get(path)
137
+ end
99
138
 
100
-
101
- # is path an absolute path ?
102
- #
139
+ # get parent path
140
+ #
103
141
  # @param [String,Pa] path
104
- # @return [Boolean]
105
- def absolute?(path) path=get(path); File.absolute_path(path) == path end
142
+ # @param [Fixnum] n up level
143
+ # @return [String]
144
+ def parent2(path, n=1)
145
+ path = get(path)
146
+ n.times do
147
+ path = File.dirname(path)
148
+ end
149
+ path
150
+ end
106
151
 
107
152
  # split path
108
153
  #
109
154
  # @example
110
155
  # path="/home/a/file"
111
- # split(path) #=> "/home/a", "file"
112
- # split(path, :all) #=> "/", "home", "a", "file"
156
+ # split2(path) #=> "/home/a", "file"
157
+ # split2(path, :all => true) #=> "/", "home", "a", "file"
113
158
  #
114
159
  # @param [String,Pa] name
115
160
  # @param [Hash] o option
@@ -117,7 +162,7 @@ class Pa
117
162
  # @return [Array<String>]
118
163
  def split2(name, o={})
119
164
  dir, fname = File.split(get(name))
120
- ret = Util.wrap_array(basename(fname, o))
165
+ ret = Util.wrap_array(File.basename(fname))
121
166
 
122
167
  if o[:all]
123
168
  loop do
@@ -131,6 +176,7 @@ class Pa
131
176
  ret
132
177
  end
133
178
 
179
+ # special case
134
180
  def split(*args)
135
181
  dir, *names = split2(*args)
136
182
  [ Pa(dir), *names]
@@ -151,38 +197,6 @@ class Pa
151
197
 
152
198
  File.join(*paths)
153
199
  end
154
-
155
- # get parent path
156
- #
157
- # @param [String,Pa] path
158
- # @param [Fixnum] n up level
159
- # @return [String]
160
- def parent2(path, n=1)
161
- path = get(path)
162
- n.times do
163
- path = File.dirname(path)
164
- end
165
- path
166
- end
167
-
168
- # is path a dangling symlink?
169
- #
170
- # a dangling symlink is a dead symlink.
171
- #
172
- # @param [String,Pa] path
173
- # @return [Boolean]
174
- def dangling? path
175
- path=get(path)
176
- if File.symlink?(path)
177
- src = File.readlink(path)
178
- not File.exists?(src)
179
- else
180
- nil
181
- end
182
- end # def dsymlink?
183
-
184
- # real path
185
- def real2(path) File.realpath(get(path)) end
186
200
  end
187
201
 
188
202
  module InstanceMethods
@@ -215,11 +229,13 @@ class Pa
215
229
  alias fe2 fext2
216
230
 
217
231
  # fix name,2 => String
218
- alias name name2
232
+ alias base base2
219
233
  alias fname fname2
234
+ alias name name2
220
235
  alias ext ext2
221
236
  alias fext fext2
222
237
 
238
+ alias b base
223
239
  alias fn fname
224
240
  alias n name
225
241
  alias e ext
@@ -242,13 +258,23 @@ class Pa
242
258
  end
243
259
 
244
260
  # @return [String]
245
- def sub2(*args,&blk)
246
- path.sub(*args,&blk)
261
+ def sub2(*args, &blk)
262
+ path.sub(*args, &blk)
247
263
  end
248
264
 
249
265
  # @return [String]
250
- def gsub2(*args,&blk)
251
- path.gsub(*args,&blk)
266
+ def gsub2(*args, &blk)
267
+ path.gsub(*args, &blk)
268
+ end
269
+
270
+ # @return [Pa]
271
+ def sub(*args, &blk)
272
+ Pa(sub2(*args, &blk))
273
+ end
274
+
275
+ # @return [Pa]
276
+ def gsub(*args, &blk)
277
+ Pa(gsub2(*args, &blk))
252
278
  end
253
279
 
254
280
  # @return [Pa]
@@ -3,11 +3,16 @@ class Pa
3
3
  extend Util::Concern
4
4
  module ClassMethods
5
5
  # goes to File
6
- [ :exists?, :atime, :ctime, :mtime, :stat, :lstat, :size, :zero?, :executable?, :executable_real?, :world_executable?, :readable?, :readable_real?, :world_readalbe?, :writeable?, :writeable_real?, :world_writeable?, :directory?, :file?, :blockdev?, :chardev?, :piple?, :socket?, :symlink?, :dangling?, :owned?, :grpowned?, :setgid?, :setuid?, :stricky?, :identical? ].each do |name|
7
- define_method(name) { |*args|
8
- File.__send__ name, *args
9
- }
10
- end
6
+ FILE_DELEGATED_METHODS = [ :exists?, :atime, :ctime, :mtime, :stat, :lstat, :size, :zero?, :executable?, :executable_real?, :world_executable?, :readable?, :readable_real?, :world_readalbe?, :writeable?, :writeable_real?, :world_writeable?, :directory?, :file?, :blockdev?, :chardev?, :piple?, :socket?, :symlink?, :owned?, :grpowned?, :setgid?, :setuid?, :stricky?, :identical? ]
7
+
8
+ # delegated from File
9
+ FILE_DELEGATED_METHODS.each { |name|
10
+ module_eval <<-METHOD, __FILE__, __LINE__
11
+ def #{name}(*args)
12
+ File.#{name}(*args)
13
+ end
14
+ METHOD
15
+ }
11
16
 
12
17
  # @see File.chmod
13
18
  def chmod(mode, *paths)
@@ -1,3 +1,3 @@
1
1
  class Pa
2
- VERSION = "1.1.3"
2
+ VERSION = "1.1.4"
3
3
  end
@@ -134,7 +134,7 @@ describe Pa do
134
134
 
135
135
  it "_copy directory" do
136
136
  Pa._copy 'dir', 'dirc'
137
- Dir.entries('dirc').should == Dir.entries('dir')
137
+ Dir.entries('dirc').sort.should == Dir.entries('dir').sort
138
138
  end
139
139
 
140
140
  context "with :symlink" do
@@ -269,11 +269,10 @@ describe Pa do
269
269
  end
270
270
  end
271
271
 
272
- describe ".rename" do
272
+ describe ".rename2" do
273
273
  it "works" do
274
- Pa.rename('/home/guten.jpg') {|pa|
275
- pa.name+'_1'+pa.fext
276
- }.should == '/home/guten_1.jpg'
274
+ a = Pa.rename2('/home/guten.jpg') {|pa| pa.name+'_1'+pa.fext }
275
+ a.should == '/home/guten_1.jpg'
277
276
  end
278
277
  end
279
278
 
@@ -284,6 +283,4 @@ describe Pa do
284
283
  }.should == Pa('/home/guten_1.jpg')
285
284
  end
286
285
  end
287
-
288
-
289
286
  end
@@ -29,17 +29,17 @@ describe Pa do
29
29
  FileUtils.rm @files
30
30
  end
31
31
 
32
- context "call without any option" do
33
- it "returns 1 items" do
34
- Pa.glob2("*").should have(1).items
35
- end
36
- end
32
+ it "returns 1 items" do
33
+ Pa.glob2("*").should have(1).items
34
+ end
37
35
 
38
- context "call with :dotmatch option" do
39
- it "returns 2 items" do
40
- Pa.glob2("*", dotmatch: true).should have(2).items
41
- end
42
- end
36
+ it "returns 2 items with :dotmatch" do
37
+ Pa.glob2("*", dotmatch: true).should have(2).items
38
+ end
39
+
40
+ it "#glob returns Pa instead" do
41
+ Pa.glob("*")[0].should be_an_instance_of Pa
42
+ end
43
43
  end
44
44
 
45
45
  describe "#each2" do
@@ -77,13 +77,19 @@ describe Pa do
77
77
  end
78
78
 
79
79
  it "each2(.) return 'foo' not '.foo'" do
80
- Pa.each2.with_object([]){|pa,m| m<<pa}.sort.should == %w(.fa dira fa fa~)
80
+ Pa.each2.with_object([]){|(pa),m| m<<pa}.sort.should == %w(.fa dira fa fa~)
81
81
  end
82
82
 
83
83
  it "each2(nodot: true) -> list all files except dot file" do
84
- Pa.each2(nodot: true).with_object([]){|pa,m|m<<pa}.sort.should == %w(dira fa fa~)
84
+ Pa.each2(nodot: true).with_object([]){|(pa),m|m<<pa}.sort.should == %w(dira fa fa~)
85
85
  end
86
86
 
87
+ it "each returns Pa" do
88
+ Pa.each { |pa|
89
+ pa.should be_an_instance_of Pa
90
+ break
91
+ }
92
+ end
87
93
  end
88
94
 
89
95
  describe "#each2_r" do
@@ -106,8 +112,14 @@ describe Pa do
106
112
  Pa.each2_r.should be_an_instance_of Enumerator
107
113
  Pa.each2_r.with_object([]){|(pa,r),m|m<<r}.sort.should == %w(.fa dira dira/dirb dira/dirb/b fa fa~)
108
114
  end
109
- end
110
115
 
116
+ it "#each_r returns Pa" do
117
+ Pa.each_r { |pa|
118
+ pa.should be_an_instance_of Pa
119
+ break
120
+ }
121
+ end
122
+ end
111
123
 
112
124
  describe "#ls2" do
113
125
  # filea
@@ -131,5 +143,10 @@ describe Pa do
131
143
  it "call a block" do
132
144
  Pa.ls2 { |pa, fname| File.directory?(pa) }.should == ["dira"]
133
145
  end
146
+
147
+ it "#ls returns string" do
148
+ Pa.ls[0].should be_an_instance_of String
149
+ end
134
150
  end
135
151
  end
152
+
@@ -1,120 +1,247 @@
1
- require "spec_helper"
1
+ require 'spec_helper'
2
+
3
+ class T_FakePath
4
+ def path
5
+ "hello"
6
+ end
7
+ end
2
8
 
3
9
  describe Pa do
4
- context "dir and dir2" do
5
- it "#dir => Pa" do
6
- Pa.dir("/home/guten").should be_an_instance_of Pa
10
+ context 'dir and dir2' do
11
+ it '#dir => Pa' do
12
+ Pa.dir('/home/guten').should be_an_instance_of Pa
7
13
  end
8
14
 
9
- it "#dir2 => Pa" do
10
- Pa.dir2("/home/guten").should be_an_instance_of String
15
+ it '#dir2 => Pa' do
16
+ Pa.dir2('/home/guten').should be_an_instance_of String
11
17
  end
12
-
13
18
  end
14
19
 
15
- describe ".shorten2" do
16
- it "short /home/usr/file into ~/file" do
17
- ENV["HOME"] = "/home/foo"
18
- Pa.shorten2("/home/foo/file").should == "~/file"
20
+ describe 'NAME_EXT_PAT' do
21
+ it 'matchs `foo.bar`' do
22
+ 'foo.bar'.match(Pa::NAME_EXT_PAT).captures.should == %w(foo bar)
19
23
  end
20
24
 
21
- it "not short /home/other-user/file" do
22
- ENV["HOME"] = "/home/foo"
23
- Pa.shorten2("/home/bar/file").should == "/home/bar/file"
25
+ it 'matchs `foo`' do
26
+ 'foo'.match(Pa::NAME_EXT_PAT).captures.should == ['foo', nil]
24
27
  end
25
28
  end
26
29
 
27
- describe "NAME_EXT_PAT" do
28
- it "matchs `foo.bar'" do
29
- "foo.bar".match(Pa::NAME_EXT_PAT).captures.should == %w(foo bar)
30
- end
30
+ describe '.get' do
31
+ it 'get path from a path object' do
32
+ Pa.get(T_FakePath.new).should == 'hello'
33
+ end
31
34
 
32
- it "matchs `foo'" do
33
- "foo".match(Pa::NAME_EXT_PAT).captures.should == ["foo", nil]
34
- end
35
+ it 'get path from a string' do
36
+ Pa.get('foo').should == 'foo'
37
+ end
35
38
 
39
+ it 'get nil from nil' do
40
+ Pa.get(nil).should == nil
41
+ end
42
+
43
+ it 'otherwise raise ArgumentError' do
44
+ lambda { Pa.get([]) }.should raise_error(ArgumentError)
45
+ end
46
+ end
47
+
48
+ describe '.absolute?' do
49
+ it 'is true if path is a absolute path' do
50
+ Pa.absolute?('/').should == true
51
+ end
52
+
53
+ it 'is false if path is a relative path' do
54
+ Pa.absolute?('.').should == false
55
+ end
56
+ end
57
+
58
+ describe '.dangling?' do
59
+ it 'works' do
60
+ olddir=Dir.pwd
61
+ Dir.chdir("#{$specdir}/data/tmp")
62
+
63
+ begin
64
+ File.open('fa', 'w'){|f| f.puts "guten" }
65
+ File.symlink('fa', 'symlink')
66
+ File.symlink('fb', 'dangling')
67
+
68
+ Pa.dangling?('symlink').should be_false
69
+ Pa.dangling?('dangling').should be_true
70
+ ensure
71
+ FileUtils.rm_r Dir.glob("*")
72
+ Dir.chdir(olddir)
73
+ end
74
+ end
75
+ end
76
+
77
+ describe '.pwd2' do
78
+ olddir = Dir.getwd
79
+ Dir.chdir('/tmp')
80
+ begin
81
+ Pa.pwd2.should == '/tmp'
82
+ ensure
83
+ Dir.chdir(olddir)
84
+ end
85
+ end
86
+
87
+ describe '.dir2' do
88
+ it "get a path's directory name" do
89
+ Pa.dir2('/home/guten').should == '/home'
90
+ end
91
+ end
92
+
93
+ describe '.base2' do
94
+ it 'get name, ext with :ext => true' do
95
+ Pa.base2('/home/foo.bar', ext: true).should == ['foo', 'bar']
96
+ end
36
97
  end
37
98
 
38
- describe ".base2" do
39
- it "get name, ext with :ext => true" do
40
- Pa.base2("/home/foo.bar", ext: true).should == ["foo", "bar"]
99
+ describe '.ext2' do
100
+ it "get a path's extension" do
101
+ Pa.ext2('/home/a.txt').should == 'txt'
102
+ end
103
+
104
+ it 'return nil when don extension' do
105
+ Pa.ext2('/home/a').should == nil
106
+ end
107
+
108
+ it 'with complex' do
109
+ Pa.ext2('/home/a.b.c.txt').should == 'txt'
110
+ end
111
+ end
112
+
113
+ describe '.absolute2' do
114
+ it 'returns absolute_path' do
115
+ Pa.absolute2('.').should == File.absolute_path('.')
116
+ end
117
+ end
118
+
119
+ describe '.expand2' do
120
+ it 'expand_path' do
121
+ Pa.expand2('~').should == File.expand_path('~')
122
+ end
123
+ end
124
+
125
+ describe '.shorten2' do
126
+ it 'short /home/usr/file into ~/file' do
127
+ ENV['HOME'] = '/home/foo'
128
+ Pa.shorten2('/home/foo/file').should == '~/file'
129
+ end
130
+
131
+ it 'not short /home/other-user/file' do
132
+ ENV['HOME'] = '/home/foo'
133
+ Pa.shorten2('/home/bar/file').should == '/home/bar/file'
41
134
  end
42
135
  end
43
136
 
137
+ describe '.real2' do
138
+ Pa.real2('.').should == File.realpath('.')
139
+ end
140
+
44
141
  describe '.parent2' do
45
142
  before :each do
46
- @path = "/home/foo/a.txt"
143
+ @path = '/home/foo/a.txt'
47
144
  end
48
145
 
49
- it "return parent path" do
50
- Pa.parent2(@path).should == "/home/foo"
146
+ it 'return parent path' do
147
+ Pa.parent2(@path).should == '/home/foo'
51
148
  end
52
149
 
53
- it "return parent upto 2 level path" do
54
- Pa.parent2(@path, 2).should == "/home"
150
+ it 'return parent upto 2 level path' do
151
+ Pa.parent2(@path, 2).should == '/home'
55
152
  end
56
153
  end
57
-
58
- describe "#==" do
59
- it "runs ok" do
154
+
155
+ describe 'split2' do
156
+ it 'split a path into two part: dirname and basename' do
157
+ Pa.split2('/home/b/a.txt').should == ['/home/b', 'a.txt']
158
+ end
159
+
160
+ it 'with :all options: split all parts' do
161
+ Pa.split2('/home/b/a.txt', :all => true).should == ['/', 'home', 'b', 'a.txt']
162
+ end
163
+ end
164
+
165
+ describe 'split' do
166
+ it 'is a special case' do
167
+ Pa.split('/home/b/a.txt').should == [Pa('/home/b'), 'a.txt']
168
+ end
169
+ end
170
+
171
+ describe '.join2' do
172
+ it 'join a path' do
173
+ Pa.join2('/a', 'b').should == '/a/b'
174
+ end
175
+
176
+ it 'skip nil values' do
177
+ Pa.join2('/a', 'b', nil).should == '/a/b'
178
+ end
179
+
180
+ it 'skip empty values' do
181
+ Pa.join2('/a', 'b', '').should == '/a/b'
182
+ end
183
+ end
184
+
185
+ describe '#==' do
186
+ it 'runs ok' do
60
187
  (Pa('/home') == Pa('/home')).should be_true
61
188
  end
62
189
  end
63
190
 
64
- describe "#+" do
65
- it "runs ok" do
191
+ describe '#+' do
192
+ it 'runs ok' do
66
193
  (Pa('/home')+'~').should == Pa('/home~')
67
194
  end
68
195
  end
69
196
 
70
- describe "#sub2" do
71
- it "runs ok" do
197
+ describe '#sub2' do
198
+ it 'runs ok' do
72
199
  Pa('/home/foo').sub2(/o/,'').should == '/hme/foo'
73
200
  end
74
201
  end
75
202
 
76
- describe "#sub!" do
77
- it "runs ok" do
203
+ describe '#sub!' do
204
+ it 'runs ok' do
78
205
  pa = Pa('/home/foo')
79
206
  pa.sub!(/o/,'')
80
207
  pa.should == Pa('/hme/foo')
81
208
  end
82
209
  end
83
210
 
84
- describe "#gsub2" do
85
- it "runs ok" do
211
+ describe '#gsub2' do
212
+ it 'runs ok' do
86
213
  Pa('/home/foo').gsub2(/o/,'').should == '/hme/f'
87
214
  end
88
215
  end
89
216
 
90
- describe "#gsub!" do
91
- it "runs ok" do
217
+ describe '#gsub!' do
218
+ it 'runs ok' do
92
219
  pa = Pa('/home/foo')
93
220
  pa.gsub!(/o/,'')
94
221
  pa.should == Pa('/hme/f')
95
222
  end
96
223
  end
97
224
 
98
- describe "#match" do
99
- it "runs ok" do
225
+ describe '#match' do
226
+ it 'runs ok' do
100
227
  Pa('/home/foo').match(/foo/)[0].should == 'foo'
101
228
  end
102
229
  end
103
230
 
104
- describe "#start_with?" do
105
- it "runs ok" do
231
+ describe '#start_with?' do
232
+ it 'runs ok' do
106
233
  Pa('/home/foo').start_with?('/home').should be_true
107
234
  end
108
235
  end
109
236
 
110
- describe "#end_with?" do
111
- it "runs ok" do
237
+ describe '#end_with?' do
238
+ it 'runs ok' do
112
239
  Pa('/home/foo').end_with?('foo').should be_true
113
240
  end
114
241
  end
115
242
 
116
- describe "#=~" do
117
- it "runs ok" do
243
+ describe '#=~' do
244
+ it 'runs ok' do
118
245
  (Pa('/home/foo') =~ /foo/).should be_true
119
246
  end
120
247
  end
@@ -1,2 +1,3 @@
1
1
  require "pa"
2
2
 
3
+ $specdir = Pa.dir(__FILE__)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pa
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.3
4
+ version: 1.1.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-09-10 00:00:00.000000000 Z
12
+ date: 2011-12-08 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: ! 'a path library for Ruby
15
15
 
@@ -27,7 +27,8 @@ files:
27
27
  - Ragfile
28
28
  - lib/pa.rb
29
29
  - lib/pa/cmd.rb
30
- - lib/pa/dir.rb
30
+ - lib/pa/directory.rb
31
+ - lib/pa/ext.rb
31
32
  - lib/pa/path.rb
32
33
  - lib/pa/state.rb
33
34
  - lib/pa/util.rb
@@ -35,7 +36,7 @@ files:
35
36
  - pa.gemspec
36
37
  - pa.watchr
37
38
  - spec/pa/cmd_spec.rb
38
- - spec/pa/dir_spec.rb
39
+ - spec/pa/directory_spec.rb
39
40
  - spec/pa/path_spec.rb
40
41
  - spec/pa/state_spec.rb
41
42
  - spec/pa_spec.rb
@@ -60,7 +61,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
60
61
  version: '0'
61
62
  requirements: []
62
63
  rubyforge_project: xx
63
- rubygems_version: 1.8.5
64
+ rubygems_version: 1.8.11
64
65
  signing_key:
65
66
  specification_version: 3
66
67
  summary: a path library for Ruby