pa 1.1.3 → 1.1.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -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