hike 0.1.0 → 0.1.1
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.
- data/lib/hike.rb +2 -1
- data/lib/hike/directory_index.rb +44 -0
- data/lib/hike/trail.rb +13 -4
- metadata +4 -3
data/lib/hike.rb
CHANGED
@@ -0,0 +1,44 @@
|
|
1
|
+
module Hike
|
2
|
+
class DirectoryIndex
|
3
|
+
def initialize
|
4
|
+
expire
|
5
|
+
end
|
6
|
+
|
7
|
+
def expire
|
8
|
+
expire_mtimes
|
9
|
+
expire_files
|
10
|
+
end
|
11
|
+
|
12
|
+
def expire_mtimes
|
13
|
+
@mtimes = {}
|
14
|
+
true
|
15
|
+
end
|
16
|
+
|
17
|
+
def expire_files
|
18
|
+
@files = {}
|
19
|
+
true
|
20
|
+
end
|
21
|
+
|
22
|
+
def mtime(dirname)
|
23
|
+
@mtimes[dirname] ||= File.directory?(dirname) && File.mtime(dirname)
|
24
|
+
end
|
25
|
+
|
26
|
+
def files(dirname)
|
27
|
+
if current_mtime = mtime(dirname)
|
28
|
+
cached_mtime, files = @files[dirname]
|
29
|
+
if current_mtime == cached_mtime
|
30
|
+
return files
|
31
|
+
else
|
32
|
+
files = Dir.entries(dirname).select do |entry|
|
33
|
+
File.file?(File.join(dirname, entry))
|
34
|
+
end
|
35
|
+
end
|
36
|
+
else
|
37
|
+
files = []
|
38
|
+
end
|
39
|
+
|
40
|
+
@files[dirname] = [current_mtime, files]
|
41
|
+
files
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/lib/hike/trail.rb
CHANGED
@@ -4,12 +4,14 @@ module Hike
|
|
4
4
|
|
5
5
|
def initialize(root)
|
6
6
|
@root = File.expand_path(root)
|
7
|
+
@index = DirectoryIndex.new
|
7
8
|
@paths = Paths.new(@root)
|
8
9
|
@extensions = Extensions.new
|
9
10
|
end
|
10
11
|
|
11
|
-
def find(
|
12
|
-
|
12
|
+
def find(*logical_paths)
|
13
|
+
@index.expire_mtimes
|
14
|
+
candidates = candidates_for_paths(logical_paths)
|
13
15
|
|
14
16
|
paths.each do |path|
|
15
17
|
candidates.each do |candidate|
|
@@ -22,7 +24,13 @@ module Hike
|
|
22
24
|
end
|
23
25
|
|
24
26
|
protected
|
25
|
-
def
|
27
|
+
def candidates_for_paths(logical_paths)
|
28
|
+
logical_paths.map do |logical_path|
|
29
|
+
candidates_for_path(logical_path)
|
30
|
+
end.flatten
|
31
|
+
end
|
32
|
+
|
33
|
+
def candidates_for_path(logical_path)
|
26
34
|
candidates = extensions.map { |ext| logical_path + ext }
|
27
35
|
candidates.unshift(logical_path) if has_extension?(logical_path)
|
28
36
|
candidates
|
@@ -33,7 +41,8 @@ module Hike
|
|
33
41
|
end
|
34
42
|
|
35
43
|
def exists?(path)
|
36
|
-
File.
|
44
|
+
dirname, basename = File.dirname(path), File.basename(path)
|
45
|
+
@index.files(dirname).include?(basename)
|
37
46
|
end
|
38
47
|
end
|
39
48
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hike
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 1
|
10
|
+
version: 0.1.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Sam Stephenson
|
@@ -29,6 +29,7 @@ extensions: []
|
|
29
29
|
extra_rdoc_files: []
|
30
30
|
|
31
31
|
files:
|
32
|
+
- lib/hike/directory_index.rb
|
32
33
|
- lib/hike/extensions.rb
|
33
34
|
- lib/hike/normalized_array.rb
|
34
35
|
- lib/hike/paths.rb
|