Class: EMDirWatcher::Entry
- Inherits:
-
Object
- Object
- EMDirWatcher::Entry
- Defined in:
- lib/em-dir-watcher/tree.rb
Instance Attribute Summary collapse
-
#relative_path ⇒ Object
readonly
Returns the value of attribute relative_path.
Instance Method Summary collapse
- #compute_entries ⇒ Object
- #compute_entry_names ⇒ Object
- #compute_file_mtime ⇒ Object
- #compute_is_file ⇒ Object
- #exists? ⇒ Boolean
- #full_path ⇒ Object
-
#initialize(tree, relative_path, ancestor_matches_inclusions) ⇒ Entry
constructor
A new instance of Entry.
- #recursive_file_entries ⇒ Object
- #refresh!(changed_relative_paths, refresh_subtree) ⇒ Object
- #refresh_file!(changed_relative_paths) ⇒ Object
- #relative_path_of(entry_name) ⇒ Object
- #scoped_refresh!(changed_relative_paths, relative_scope, refresh_subtree) ⇒ Object
Constructor Details
#initialize(tree, relative_path, ancestor_matches_inclusions) ⇒ Entry
Returns a new instance of Entry.
11 12 13 14 15 16 17 18 |
# File 'lib/em-dir-watcher/tree.rb', line 11 def initialize tree, relative_path, ancestor_matches_inclusions @tree = tree @matches_inclusions = ancestor_matches_inclusions || @tree.includes?(relative_path) @relative_path = relative_path @is_file = false @file_mtime = Time.at(0) @entries = {} end |
Instance Attribute Details
#relative_path ⇒ Object (readonly)
Returns the value of attribute relative_path.
9 10 11 |
# File 'lib/em-dir-watcher/tree.rb', line 9 def relative_path @relative_path end |
Instance Method Details
#compute_entries ⇒ Object
48 49 50 51 52 53 54 55 56 |
# File 'lib/em-dir-watcher/tree.rb', line 48 def compute_entries new_entries = {} compute_entry_names.each do |entry_name| entry_relative_path = relative_path_of entry_name next if @tree.excludes? entry_relative_path new_entries[entry_name] = @entries[entry_name] || Entry.new(@tree, entry_relative_path, @matches_inclusions) end new_entries end |
#compute_entry_names ⇒ Object
38 39 40 41 42 |
# File 'lib/em-dir-watcher/tree.rb', line 38 def compute_entry_names Dir.entries(full_path) - ['.', '..'] rescue Errno::ENOENT, Errno::ENOTDIR [] end |
#compute_file_mtime ⇒ Object
32 33 34 35 36 |
# File 'lib/em-dir-watcher/tree.rb', line 32 def compute_file_mtime if FileTest.symlink?(full_path) then Time.at(0) else File.mtime(full_path) end rescue Errno::ENOENT, Errno::ENOTDIR Time.at(0) end |
#compute_is_file ⇒ Object
28 29 30 |
# File 'lib/em-dir-watcher/tree.rb', line 28 def compute_is_file FileTest.file? full_path end |
#exists? ⇒ Boolean
24 25 26 |
# File 'lib/em-dir-watcher/tree.rb', line 24 def exists? File.exists? full_path end |
#full_path ⇒ Object
20 21 22 |
# File 'lib/em-dir-watcher/tree.rb', line 20 def full_path if @relative_path.empty? then @tree.full_path else File.join(@tree.full_path, @relative_path) end end |
#recursive_file_entries ⇒ Object
103 104 105 106 107 108 109 |
# File 'lib/em-dir-watcher/tree.rb', line 103 def recursive_file_entries if @is_file self else @entries.values.collect { |entry| entry.recursive_file_entries }.flatten end end |
#refresh!(changed_relative_paths, refresh_subtree) ⇒ Object
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
# File 'lib/em-dir-watcher/tree.rb', line 70 def refresh! changed_relative_paths, refresh_subtree refresh_file! changed_relative_paths old_entries, @entries = @entries, compute_entries if refresh_subtree entries_to_refresh = Set.new(@entries.values) + Set.new(old_entries.values) entries_to_refresh.each { |entry| entry.refresh! changed_relative_paths, true } else new_set, old_set = Set.new(@entries.values), Set.new(old_entries.values) removed_entries, added_entries = old_set - new_set, new_set - old_set still_existing_entries = old_set - removed_entries added_or_removed_entries = added_entries + removed_entries added_or_removed_entries.each { |entry| entry.refresh! changed_relative_paths, true } still_existing_entries.each { |entry| entry.refresh_file! changed_relative_paths } end end |
#refresh_file!(changed_relative_paths) ⇒ Object
58 59 60 61 62 63 64 65 66 67 68 |
# File 'lib/em-dir-watcher/tree.rb', line 58 def refresh_file! changed_relative_paths if @matches_inclusions used_to_be_file, @is_file = @is_file, compute_is_file previous_file_mtime, @file_mtime = @file_mtime, compute_file_mtime if used_to_be_file changed_relative_paths << @relative_path if not @is_file or previous_file_mtime != @file_mtime elsif @is_file changed_relative_paths << @relative_path end end end |
#relative_path_of(entry_name) ⇒ Object
44 45 46 |
# File 'lib/em-dir-watcher/tree.rb', line 44 def relative_path_of entry_name if @relative_path.empty? then entry_name else File.join(@relative_path, entry_name) end end |
#scoped_refresh!(changed_relative_paths, relative_scope, refresh_subtree) ⇒ Object
88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
# File 'lib/em-dir-watcher/tree.rb', line 88 def scoped_refresh! changed_relative_paths, relative_scope, refresh_subtree if relative_scope.size == 0 refresh! changed_relative_paths, refresh_subtree else entry_name, children_relative_scope = relative_scope[0], relative_scope[1..-1] entry_relative_path = relative_path_of entry_name return if @tree.excludes? entry_relative_path entry = (@entries[entry_name] ||= Entry.new(@tree, entry_relative_path, @matches_inclusions)) entry.scoped_refresh! changed_relative_paths, children_relative_scope, refresh_subtree if relative_scope.size == 1 @entries.delete entry_name unless entry.exists? end end end |