filepath 0.6 → 0.7
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 -5
- data/README.md +14 -14
- data/filepath.gemspec +8 -10
- data/lib/filepath/core_ext/array.rb +10 -10
- data/lib/filepath/core_ext/string.rb +4 -4
- data/lib/filepath/filepath.rb +38 -38
- data/lib/filepath/filepathlist.rb +12 -12
- data/spec/filepath_spec.rb +67 -67
- data/spec/filepathlist_spec.rb +53 -53
- data/spec/fixtures.rb +21 -0
- data/spec/spec_helper.rb +13 -3
- data/spec/tasks.rb +1 -19
- metadata +36 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dc328ecf3eaa82d60d03442bf30115d7a7e94633
|
4
|
+
data.tar.gz: fdcaf08efd0cb19c50e4e6df08f29ca337c32841
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 655944ebb17b86931f7b3a8503560189b85cc89f4847e5b01251344135d730e2bc6a6702e41a2f8faec9a94268e470113ccfd2520bbb339c206ff01691a1bac9
|
7
|
+
data.tar.gz: 2ea72768cf531ab78de1faec911041dc9306b38a8a1617548de67de1eb752df468012d7237f0bf2b6ea7eb0961b91e453a676cc3be176b6e51efed4c6b308c48
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,28 +1,28 @@
|
|
1
|
-
|
1
|
+
filepath
|
2
2
|
========
|
3
3
|
|
4
|
-
filepath is a small library
|
5
|
-
|
4
|
+
filepath is a small library to manipulate paths; a modern replacement
|
5
|
+
for the standard Pathname.
|
6
6
|
|
7
|
-
filepath is built around two main classes: `
|
8
|
-
and `
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
filepath is built around two main classes: `Filepath`, that represents paths,
|
8
|
+
and `FilepathList`, lists of paths. These classes provide immutable objects
|
9
|
+
with dozens of convenience methods for common operations such as calculating
|
10
|
+
relative paths, concatenating paths, finding all the files in a directory or
|
11
|
+
modifying all the extensions of a list of filenames at once.
|
12
12
|
|
13
13
|
|
14
14
|
Features and examples
|
15
15
|
---------------------
|
16
16
|
|
17
|
-
The main purpose of
|
17
|
+
The main purpose of Filepath is to able to write
|
18
18
|
|
19
19
|
require __FILE__.as_path / 'spec' / 'tasks'
|
20
20
|
|
21
|
-
|
21
|
+
instead of cumbersome code like
|
22
22
|
|
23
23
|
require File.join(File.dirname(__FILE__), ['spec', 'tasks'])
|
24
24
|
|
25
|
-
The main features of
|
25
|
+
The main features of Filepath are…
|
26
26
|
|
27
27
|
### Path concatenation
|
28
28
|
|
@@ -52,7 +52,7 @@ The main features of FilePath are…
|
|
52
52
|
|
53
53
|
### Path traversal
|
54
54
|
|
55
|
-
file_dir =
|
55
|
+
file_dir = Filepath.new("/srv/example.org/web/html/")
|
56
56
|
file_dir.descend do |path|
|
57
57
|
is = path.readable? ? "is" : "is not!"
|
58
58
|
|
@@ -100,8 +100,8 @@ Requirements
|
|
100
100
|
The `filepath` library does not require any external library: it relies
|
101
101
|
complitely on functionalities available in the Ruby's core classes.
|
102
102
|
|
103
|
-
The `filepath` library has been tested and found compatible with Ruby 1.
|
104
|
-
Ruby
|
103
|
+
The `filepath` library has been tested and found compatible with Ruby 1.9.3,
|
104
|
+
Ruby 2.3 and JRuby 9.1.x.x.
|
105
105
|
|
106
106
|
|
107
107
|
Installation
|
data/filepath.gemspec
CHANGED
@@ -5,19 +5,16 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "filepath"
|
8
|
-
spec.version = "0.
|
8
|
+
spec.version = "0.7"
|
9
9
|
spec.authors = ["Gioele Barabucci"]
|
10
10
|
spec.email = ["gioele@svario.it"]
|
11
|
-
spec.summary = "
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
"represents paths, and `FilePathList`, lists of paths. The " +
|
16
|
-
"instances of these classes are immutable objects with dozens " +
|
17
|
-
"of convience methods for common operations such as calculating " +
|
11
|
+
spec.summary = "A small library to manipulate paths; a modern replacement " +
|
12
|
+
"for the standard Pathname."
|
13
|
+
spec.description = "The Filepath class provides immutable objects with dozens " +
|
14
|
+
"of convenience methods for common operations such as calculating " +
|
18
15
|
"relative paths, concatenating paths, finding all the files in " +
|
19
|
-
"a directory or
|
20
|
-
"
|
16
|
+
"a directory or modifying all the extensions of a list of " +
|
17
|
+
"filenames at once."
|
21
18
|
spec.homepage = "http://github.com/gioele/filepath"
|
22
19
|
spec.license = "CC0"
|
23
20
|
|
@@ -29,4 +26,5 @@ Gem::Specification.new do |spec|
|
|
29
26
|
spec.add_development_dependency "bundler", "~> 1.3"
|
30
27
|
spec.add_development_dependency "rake"
|
31
28
|
spec.add_development_dependency "rspec"
|
29
|
+
spec.add_development_dependency "rspec-collection_matchers"
|
32
30
|
end
|
@@ -4,25 +4,25 @@
|
|
4
4
|
class Array
|
5
5
|
# Generates a path using the elements of an array as path segments.
|
6
6
|
#
|
7
|
-
# `[a, b, c].as_path` is equivalent to `
|
7
|
+
# `[a, b, c].as_path` is equivalent to `Filepath.join(a, b, c)`.
|
8
8
|
#
|
9
|
-
# @example
|
9
|
+
# @example Filepath from an array of strings
|
10
10
|
#
|
11
11
|
# ["/", "foo", "bar"].as_path #=> </foo/bar>
|
12
12
|
#
|
13
|
-
# @example
|
13
|
+
# @example Filepath from an array of strings and other Filepaths
|
14
14
|
#
|
15
15
|
# server_dir = config["root_dir"] / "server"
|
16
16
|
# ["..", config_dir, "secret"].as_path #=> <../config/server/secret>
|
17
17
|
#
|
18
|
-
# @return [
|
18
|
+
# @return [Filepath] a new path generated using the element as path
|
19
19
|
# segments
|
20
20
|
#
|
21
21
|
# @note FIXME: `#as_path` should be `#to_path` but that method name
|
22
22
|
# is already used
|
23
23
|
|
24
24
|
def as_path
|
25
|
-
|
25
|
+
Filepath.join(self)
|
26
26
|
end
|
27
27
|
|
28
28
|
|
@@ -30,16 +30,16 @@ class Array
|
|
30
30
|
#
|
31
31
|
# The elements of the array must respond to `#as_path`.
|
32
32
|
#
|
33
|
-
# `ary.as_path` is equivalent to `
|
33
|
+
# `ary.as_path` is equivalent to `FilepathList.new(ary)`.
|
34
34
|
#
|
35
|
-
# @return [
|
36
|
-
# the array as
|
35
|
+
# @return [FilepathList] a new path list containing the elements of
|
36
|
+
# the array as Filepaths
|
37
37
|
#
|
38
38
|
# @see String#as_path
|
39
39
|
# @see Array#as_path
|
40
|
-
# @see
|
40
|
+
# @see Filepath#as_path
|
41
41
|
|
42
42
|
def as_path_list
|
43
|
-
|
43
|
+
FilepathList.new(self)
|
44
44
|
end
|
45
45
|
end
|
@@ -4,18 +4,18 @@
|
|
4
4
|
class String
|
5
5
|
# Generates a path from a String.
|
6
6
|
#
|
7
|
-
# `"/a/b/c".as_path` is equivalent to `
|
7
|
+
# `"/a/b/c".as_path` is equivalent to `Filepath.new("/a/b/c")`.
|
8
8
|
#
|
9
|
-
# @example
|
9
|
+
# @example Filepath from a string
|
10
10
|
#
|
11
11
|
# "/etc/ssl/certs".as_path #=> </etc/ssl/certs>
|
12
12
|
#
|
13
|
-
# @return [
|
13
|
+
# @return [Filepath] a new path generated from the string
|
14
14
|
#
|
15
15
|
# @note FIXME: `#as_path` should be `#to_path` but that method name
|
16
16
|
# is already used
|
17
17
|
|
18
18
|
def as_path
|
19
|
-
|
19
|
+
Filepath.new(self)
|
20
20
|
end
|
21
21
|
end
|
data/lib/filepath/filepath.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
# This is free software released into the public domain (CC0 license).
|
2
2
|
|
3
3
|
|
4
|
-
class
|
4
|
+
class Filepath
|
5
5
|
SEPARATOR = '/'.freeze
|
6
6
|
|
7
7
|
def initialize(path)
|
8
|
-
if path.is_a?
|
8
|
+
if path.is_a? Filepath
|
9
9
|
@segments = path.segments
|
10
10
|
elsif path.is_a? Array
|
11
11
|
@segments = path
|
@@ -18,11 +18,11 @@ class FilePath
|
|
18
18
|
attr_reader :segments
|
19
19
|
|
20
20
|
|
21
|
-
# Creates a
|
21
|
+
# Creates a Filepath joining the given segments.
|
22
22
|
#
|
23
|
-
# @return [
|
23
|
+
# @return [Filepath] a Filepath created joining the given segments
|
24
24
|
|
25
|
-
def
|
25
|
+
def Filepath.join(*raw_paths)
|
26
26
|
if (raw_paths.count == 1) && (raw_paths.first.is_a? Array)
|
27
27
|
raw_paths = raw_paths.first
|
28
28
|
end
|
@@ -32,7 +32,7 @@ class FilePath
|
|
32
32
|
segs = []
|
33
33
|
paths.each { |path| segs += path.segments }
|
34
34
|
|
35
|
-
return
|
35
|
+
return Filepath.new(segs)
|
36
36
|
end
|
37
37
|
|
38
38
|
|
@@ -42,40 +42,40 @@ class FilePath
|
|
42
42
|
#
|
43
43
|
# "a/b".as_path / "c" #=> <a/b/c>
|
44
44
|
#
|
45
|
-
# @example Append another
|
45
|
+
# @example Append another Filepath
|
46
46
|
#
|
47
47
|
# home = (ENV["HOME"] || "/root").as_path
|
48
48
|
# conf_dir = '.config'.as_path
|
49
49
|
#
|
50
50
|
# home / conf_dir #=> </home/user/.config>
|
51
51
|
#
|
52
|
-
# @param [
|
52
|
+
# @param [Filepath, String] extra_path the path to be appended to the
|
53
53
|
# current path
|
54
54
|
#
|
55
|
-
# @return [
|
55
|
+
# @return [Filepath] a new path with the given path appended
|
56
56
|
|
57
57
|
def /(extra_path)
|
58
|
-
return
|
58
|
+
return Filepath.join(self, extra_path)
|
59
59
|
end
|
60
60
|
|
61
61
|
|
62
62
|
# Append multiple paths to the current path.
|
63
63
|
#
|
64
|
-
# @return [
|
64
|
+
# @return [Filepath] a new path with all the paths appended
|
65
65
|
|
66
66
|
def join(*extra_paths)
|
67
|
-
return
|
67
|
+
return Filepath.join(self, *extra_paths)
|
68
68
|
end
|
69
69
|
|
70
70
|
|
71
|
-
# An alias for {
|
71
|
+
# An alias for {Filepath#/}.
|
72
72
|
#
|
73
|
-
# @deprecated Use the {
|
73
|
+
# @deprecated Use the {Filepath#/} (slash) method instead. This method
|
74
74
|
# does not show clearly if a path is being added or if a
|
75
75
|
# string should be added to the filename
|
76
76
|
|
77
77
|
def +(extra_path)
|
78
|
-
warn "
|
78
|
+
warn "Filepath#+ is deprecated, use Filepath#/ instead."
|
79
79
|
return self / extra_path
|
80
80
|
end
|
81
81
|
|
@@ -102,10 +102,10 @@ class FilePath
|
|
102
102
|
#
|
103
103
|
# tmp_dir.relative_to(home_dir) #=> <../../tmp>
|
104
104
|
#
|
105
|
-
# @param [
|
105
|
+
# @param [Filepath, String] base the directory to use as base for the
|
106
106
|
# relative path
|
107
107
|
#
|
108
|
-
# @return [
|
108
|
+
# @return [Filepath] the relative path
|
109
109
|
#
|
110
110
|
# @note this method operates on the normalized paths
|
111
111
|
#
|
@@ -140,7 +140,7 @@ class FilePath
|
|
140
140
|
segs = [".."] * num_parent_dirs + left_in_self
|
141
141
|
normalized_segs = normalized_relative_segs(segs)
|
142
142
|
|
143
|
-
return
|
143
|
+
return Filepath.join(normalized_segs)
|
144
144
|
end
|
145
145
|
|
146
146
|
# Calculates the relative path from a given file.
|
@@ -162,10 +162,10 @@ class FilePath
|
|
162
162
|
#
|
163
163
|
# tmp_dir.relative_to_file(rc_file) #=> <../../tmp>
|
164
164
|
#
|
165
|
-
# @param [
|
165
|
+
# @param [Filepath, String] base_file the file to use as base for the
|
166
166
|
# relative path
|
167
167
|
#
|
168
|
-
# @return [
|
168
|
+
# @return [Filepath] the relative path
|
169
169
|
#
|
170
170
|
# @see #relative_to
|
171
171
|
|
@@ -179,7 +179,7 @@ class FilePath
|
|
179
179
|
# The filename is the component of a path that appears after the last
|
180
180
|
# path separator.
|
181
181
|
#
|
182
|
-
# @return [
|
182
|
+
# @return [Filepath] the filename
|
183
183
|
|
184
184
|
def filename
|
185
185
|
segs = self.normalized_segments
|
@@ -197,7 +197,7 @@ class FilePath
|
|
197
197
|
|
198
198
|
# The dir that contains the file
|
199
199
|
#
|
200
|
-
# @return [
|
200
|
+
# @return [Filepath] the path of the parent dir
|
201
201
|
|
202
202
|
def parent_dir
|
203
203
|
return self / '..'
|
@@ -212,10 +212,10 @@ class FilePath
|
|
212
212
|
# style = post.with_filename("style.css")
|
213
213
|
# style.to_s #=> "posts/2012-02-16-hello-world/style.css"
|
214
214
|
#
|
215
|
-
# @param [
|
215
|
+
# @param [Filepath, String] new_path the path to be put in place of
|
216
216
|
# the current filename
|
217
217
|
#
|
218
|
-
# @return [
|
218
|
+
# @return [Filepath] a path with the supplied path instead of the
|
219
219
|
# current filename
|
220
220
|
#
|
221
221
|
# @see #filename
|
@@ -311,7 +311,7 @@ class FilePath
|
|
311
311
|
#
|
312
312
|
# @param [String] new_ext the new extension
|
313
313
|
#
|
314
|
-
# @return [
|
314
|
+
# @return [Filepath] a new path with the replaced extension
|
315
315
|
#
|
316
316
|
# @overload with_extension
|
317
317
|
# Removes the file extension if present.
|
@@ -325,7 +325,7 @@ class FilePath
|
|
325
325
|
# post_url = post_file.with_extension(nil)
|
326
326
|
# post_url.to_s #=> "post/welcome"
|
327
327
|
#
|
328
|
-
# @return [
|
328
|
+
# @return [Filepath] a new path without the extension
|
329
329
|
|
330
330
|
def with_extension(new_ext) # FIXME: accept block
|
331
331
|
orig_filename = filename.to_s
|
@@ -349,7 +349,7 @@ class FilePath
|
|
349
349
|
segs = @segments[0..-2]
|
350
350
|
segs << new_filename
|
351
351
|
|
352
|
-
return
|
352
|
+
return Filepath.new(segs)
|
353
353
|
end
|
354
354
|
|
355
355
|
alias :replace_extension :with_extension
|
@@ -365,7 +365,7 @@ class FilePath
|
|
365
365
|
# post_url = post_file.without_extension
|
366
366
|
# post_url.to_s #=> "post/welcome"
|
367
367
|
#
|
368
|
-
# @return [
|
368
|
+
# @return [Filepath] a new path without the extension
|
369
369
|
#
|
370
370
|
# @see #with_extension
|
371
371
|
|
@@ -454,11 +454,11 @@ class FilePath
|
|
454
454
|
#
|
455
455
|
# FIXME: document what normal form is.
|
456
456
|
#
|
457
|
-
# @return [
|
457
|
+
# @return [Filepath] a new path that does not contain `.` or `..`
|
458
458
|
# segments.
|
459
459
|
|
460
460
|
def normalized
|
461
|
-
return
|
461
|
+
return Filepath.join(self.normalized_segments)
|
462
462
|
end
|
463
463
|
|
464
464
|
alias :normalised :normalized
|
@@ -483,7 +483,7 @@ class FilePath
|
|
483
483
|
#
|
484
484
|
# @yield [path] TODO
|
485
485
|
#
|
486
|
-
# @return [
|
486
|
+
# @return [Filepath] the path itself.
|
487
487
|
#
|
488
488
|
# @see #ascend
|
489
489
|
# @see #descend
|
@@ -519,7 +519,7 @@ class FilePath
|
|
519
519
|
#
|
520
520
|
# @yield [path] TODO
|
521
521
|
#
|
522
|
-
# @return [
|
522
|
+
# @return [Filepath] the path itself.
|
523
523
|
#
|
524
524
|
# @see #each_segment
|
525
525
|
# @see #descend
|
@@ -553,7 +553,7 @@ class FilePath
|
|
553
553
|
#
|
554
554
|
# @yield [path] TODO
|
555
555
|
#
|
556
|
-
# @return [
|
556
|
+
# @return [Filepath] the path itself.
|
557
557
|
#
|
558
558
|
# @see #each_segment
|
559
559
|
# @see #ascend
|
@@ -568,7 +568,7 @@ class FilePath
|
|
568
568
|
max_depth ||= @segments.length
|
569
569
|
(1..max_depth).send(method) do |limit|
|
570
570
|
segs = @segments.take(limit)
|
571
|
-
yield
|
571
|
+
yield Filepath.join(segs)
|
572
572
|
end
|
573
573
|
|
574
574
|
return self
|
@@ -609,7 +609,7 @@ class FilePath
|
|
609
609
|
end
|
610
610
|
|
611
611
|
|
612
|
-
# @return [
|
612
|
+
# @return [Filepath] the path itself.
|
613
613
|
def as_path
|
614
614
|
self
|
615
615
|
end
|
@@ -639,7 +639,7 @@ class FilePath
|
|
639
639
|
# path1 == path2.parent_dir #=> true
|
640
640
|
# path1 == path3 #=> true
|
641
641
|
#
|
642
|
-
# @param [
|
642
|
+
# @param [Filepath, String] other the other path to compare
|
643
643
|
#
|
644
644
|
# @return [boolean] whether the other path is equivalent to the current path
|
645
645
|
#
|
@@ -928,7 +928,7 @@ class FilePath
|
|
928
928
|
glob /= pattern
|
929
929
|
|
930
930
|
raw_entries = Dir.glob(glob)
|
931
|
-
entries =
|
931
|
+
entries = FilepathList.new(raw_entries)
|
932
932
|
|
933
933
|
return entries
|
934
934
|
end
|
@@ -960,7 +960,7 @@ class FilePath
|
|
960
960
|
end
|
961
961
|
|
962
962
|
module EnvironmentInfo
|
963
|
-
def
|
963
|
+
def Filepath.getwd
|
964
964
|
return Dir.getwd.as_path
|
965
965
|
end
|
966
966
|
end
|