module Ryespy::Listener::Fogable

Public Instance Methods

check(prefix) click to toggle source
# File lib/ryespy/listener/fogable.rb, line 5
def check(prefix)
  @logger.debug { "prefix: #{prefix}" }
  
  @logger.debug { "redis_key: #{redis_key}" }
  
  seen_files = @redis.hgetall(redis_key)
  
  unseen_files = get_unseen_files(prefix, seen_files)
  
  @logger.debug { "unseen_files: #{unseen_files}" }
  
  unseen_files.each do |filename, checksum|
    @redis.hset(redis_key, filename, checksum)
    
    # prefix is not included as it is part of key, and list operations
    # return files (virtually) recursively. Constructing Redis key in this
    # way means a file matching multiple prefixes will only notify once.
    @notifiers.each do |notifier|
      notifier.notify(self.class::SIDEKIQ_JOB_CLASS, [filename])
    end
  end
  
  @logger.info { "#{prefix}* has #{unseen_files.count} new files" }
end

Private Instance Methods

get_unseen_files(prefix, seen_files) click to toggle source
# File lib/ryespy/listener/fogable.rb, line 39
def get_unseen_files(prefix, seen_files)
  files = {}
  
  @fog_storage.directories.get(@config[:directory],
    :prefix => prefix
  ).files.each do |file|
    if file.content_type == 'application/directory' || file.content_length == 0
      next # virtual dirs or 0-length file
    end
    
    if seen_files[file.key] != file.etag # etag is server-side checksum
      files[file.key] = file.etag
    end
  end
  
  files
end
redis_key() click to toggle source
# File lib/ryespy/listener/fogable.rb, line 32
def redis_key
  [
    self.class::REDIS_KEY_PREFIX,
    @config[:directory],
  ].join(':')
end