Class: MtimeTracker

Inherits:
Object
  • Object
show all
Defined in:
lib/spittle/mtime_tracker.rb

Instance Method Summary collapse

Constructor Details

#initialize(dir, options = {}) ⇒ MtimeTracker

Returns a new instance of MtimeTracker.



2
3
4
5
# File 'lib/spittle/mtime_tracker.rb', line 2

def initialize(dir, options = {})
  @dir = dir
  @options = options
end

Instance Method Details

#changesetObject



53
54
55
# File 'lib/spittle/mtime_tracker.rb', line 53

def changeset
  files.select{|f| file_changed?(f)}
end

#cleanupObject



7
8
9
# File 'lib/spittle/mtime_tracker.rb', line 7

def cleanup
  File.delete(mtime_file) rescue nil
end

#current_mtimesObject



26
27
28
29
30
# File 'lib/spittle/mtime_tracker.rb', line 26

def current_mtimes
  @current ||= files.inject({}) do |map, f|
    map[f] = File.mtime(f).to_i; map
  end
end

#file_changed?(file) ⇒ Boolean

Returns:

  • (Boolean)


32
33
34
# File 'lib/spittle/mtime_tracker.rb', line 32

def file_changed?(file)
  mtimes[file] != current_mtimes[file]
end

#filesObject



15
16
17
18
# File 'lib/spittle/mtime_tracker.rb', line 15

def files
  return @files if @files
  @files = without_exclusions(Dir.glob(@dir + "/**/*"))
end

#fresh?Boolean

Returns:

  • (Boolean)


11
12
13
# File 'lib/spittle/mtime_tracker.rb', line 11

def fresh?
  not File.exists?(mtime_file)
end

#has_changes?Boolean

Returns:

  • (Boolean)


57
58
59
# File 'lib/spittle/mtime_tracker.rb', line 57

def has_changes?
  not changeset.empty?
end

#mtime_fileObject



61
62
63
# File 'lib/spittle/mtime_tracker.rb', line 61

def mtime_file
  @dir + "/.mtimes"
end

#mtimesObject



36
37
38
39
40
# File 'lib/spittle/mtime_tracker.rb', line 36

def mtimes
  return @mtimes if @mtimes
  return {} unless File.exists?(mtime_file)
  @mtimes = read_mtimes
end

#read_mtimesObject



42
43
44
45
46
47
48
49
50
51
# File 'lib/spittle/mtime_tracker.rb', line 42

def read_mtimes
  mtimes = {}
  File.open(mtime_file) do |f|
    f.each do |line|
      name, time = line.split("\t")
      mtimes[name] = time.to_i
    end
  end
  mtimes
end

#resetObject



74
75
76
77
78
# File 'lib/spittle/mtime_tracker.rb', line 74

def reset
  @mtimes = nil
  @current = nil
  @files = nil
end

#updateObject



65
66
67
68
69
70
71
72
# File 'lib/spittle/mtime_tracker.rb', line 65

def update
  File.open(mtime_file, 'w') do |f|
    current = current_mtimes
    flat = current.map{|k, v| "#{k}\t#{v}\n"}.join
    f.write flat
  end
  reset
end

#without_exclusions(files) ⇒ Object



20
21
22
23
24
# File 'lib/spittle/mtime_tracker.rb', line 20

def without_exclusions(files)
  return files unless @options[:exclude]
  exclusions = [@options[:exclude]].flatten
  files.select{|f| not exclusions.any?{|e| f.match e}}
end