Class: Pho::FileManagement::AbstractFileManager

Inherits:
Object
  • Object
show all
Defined in:
lib/pho/file_management.rb

Direct Known Subclasses

FileManager, RDFManager

Constant Summary collapse

OK =
"ok"
FAIL =
"fail"
TRACKING_DIR =
".pho"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(store, dir, ok_suffix = OK, fail_suffix = FAIL) ⇒ AbstractFileManager



14
15
16
17
18
19
# File 'lib/pho/file_management.rb', line 14

def initialize(store, dir, ok_suffix=OK, fail_suffix=FAIL)
  @store = store
  @dir = dir
  @ok_suffix = ok_suffix
  @fail_suffix = fail_suffix
end

Instance Attribute Details

#dirObject (readonly)

Returns the value of attribute dir.



7
8
9
# File 'lib/pho/file_management.rb', line 7

def dir
  @dir
end

#store(recursive = false) ⇒ Object (readonly)

Store all files that match the file name in directory



22
23
24
# File 'lib/pho/file_management.rb', line 22

def store
  @store
end

Instance Method Details

#changed?(file) ⇒ Boolean

Has this file changed (i.e have a newer mtime) than its tracking file Allows files that have been updated in a collection to be easily identified New files (i.e untracked) are always considered to be changed



82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/pho/file_management.rb', line 82

def changed?(file)
  if !stored?(file)
    return true
  end
  ok_file = get_ok_file_for(file)
  fail_file = get_fail_file_for(file)
  f = File.new(file)        
  if ( 
      ( File.exists?(ok_file) && f.stat.mtime > File.new(ok_file).stat.mtime ) or
      ( File.exists?(fail_file) && f.stat.mtime > File.new(fail_file).stat.mtime )
     )
    return true
  end        
  return false        
end

#changed_files(recursive = false) ⇒ Object



106
107
108
109
110
111
112
# File 'lib/pho/file_management.rb', line 106

def changed_files(recursive=false)
  changed = Array.new
  list(recursive).each do |file|
    changed << file if changed?(file)
  end
  return changed
end

#failures(recursive = false) ⇒ Object

List failures



124
125
126
127
128
129
130
# File 'lib/pho/file_management.rb', line 124

def failures(recursive=false)
  fails = Array.new
  list(recursive).each do |file|
    fails << file if File.exists?( get_fail_file_for(file) )
  end
  return fails
end

#get_fail_file_for(filename) ⇒ Object



152
153
154
155
156
157
# File 'lib/pho/file_management.rb', line 152

def get_fail_file_for(filename)
  relative_path = filename.gsub(@dir, "")
  base = File.basename(filename)
  relative_path = relative_path.gsub(base, "#{TRACKING_DIR}/#{base}")
  return "#{@dir}#{relative_path}.#{@fail_suffix}"              
end

#get_ok_file_for(filename) ⇒ Object



159
160
161
162
163
164
# File 'lib/pho/file_management.rb', line 159

def get_ok_file_for(filename)
  relative_path = filename.gsub(@dir, "")
  base = File.basename(filename)
  relative_path = relative_path.gsub(base, "#{TRACKING_DIR}/#{base}")
  return "#{@dir}#{relative_path}.#{@ok_suffix}"              
end

#new_files(recursive = false) ⇒ Object

List any new files in the directory



115
116
117
118
119
120
121
# File 'lib/pho/file_management.rb', line 115

def new_files(recursive=false)
  newfiles = Array.new
  list(recursive).each do |file|
    newfiles << file if !stored?(file)            
  end
  return newfiles
end

#reset(recursive = false) ⇒ Object

Reset the directory to clear out any previous statuses



55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/pho/file_management.rb', line 55

def reset(recursive=false)
  if recursive
    pattern = "**/#{TRACKING_DIR}/*"
  else
    pattern = "/#{TRACKING_DIR}/*"
  end        
  Dir.glob( File.join(@dir, "#{pattern}.#{@fail_suffix}") ).each do |file|
    File.delete(file)
  end
  Dir.glob( File.join(@dir, "#{pattern}.#{@ok_suffix}") ).each do |file|
    File.delete(file)
  end         
end

#retry_failures(recursive = false) ⇒ Object

Retry anything known to have failed



31
32
33
34
35
36
37
38
39
# File 'lib/pho/file_management.rb', line 31

def retry_failures(recursive=false)
  retries = failures(recursive)
  retries.each do |filename|
    File.delete( get_fail_file_for(filename) )
    #store it
    file = File.new(filename)
    store_file(file, filename)      
  end
end

#store_changes(recursive = false) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/pho/file_management.rb', line 41

def store_changes(recursive=false)
  changes = changed_files(recursive)
  changes.each do |filename|
    #cleanup tracking files
    f = get_fail_file_for(filename)
    File.delete( f ) if File.exists?(f)
    f = get_ok_file_for(filename)
    File.delete( f ) if File.exists?(f)
    file = File.new(filename)
    store_file(file, filename)
  end
end

#stored?(file) ⇒ Boolean

returns true if there is a fail or ok file, false otherwise



70
71
72
73
74
75
76
77
# File 'lib/pho/file_management.rb', line 70

def stored?(file)
  ok_file = get_ok_file_for(file)
  fail_file = get_fail_file_for(file)        
  if ( File.exists?(ok_file) or File.exists?(fail_file) )
    return true
  end        
  return false
end

#stored_files(recursive = false) ⇒ Object



98
99
100
101
102
103
104
# File 'lib/pho/file_management.rb', line 98

def stored_files(recursive=false)
  stored = Array.new
  list(recursive).each do |file|
    stored << file if stored?(file)
  end
  return stored
end

#successes(recursive = false) ⇒ Object

List successes



133
134
135
136
137
138
139
# File 'lib/pho/file_management.rb', line 133

def successes(recursive=false)
  successes = Array.new
  list(recursive).each do |file|
    successes << file if File.exists?( get_ok_file_for(file) )
  end
  return successes
end

#summary(recursive = false) ⇒ Object

Summarize the state of the collection to the provided IO object Creates a simple report



143
144
145
146
147
148
149
150
# File 'lib/pho/file_management.rb', line 143

def summary(recursive=false)
   failures = failures(recursive)
   successes = successes(recursive)
   newfiles = new_files(recursive)
   total = failures.size + successes.size + newfiles.size
   summary = "#{@dir} #{recursive ? " and sub-directories" : ""} contains #{total} files: #{successes.size} stored, #{failures.size} failed, #{newfiles.size} new"
   return summary     
end