Class: Chuckle::Cache

Inherits:
Object
  • Object
show all
Defined in:
lib/chuckle/cache.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(client) ⇒ Cache

Returns a new instance of Cache.



7
8
9
10
11
# File 'lib/chuckle/cache.rb', line 7

def initialize(client)
  @client = client

  self.hits = self.misses = 0
end

Instance Attribute Details

#hitsObject

Returns the value of attribute hits.



5
6
7
# File 'lib/chuckle/cache.rb', line 5

def hits
  @hits
end

#missesObject

Returns the value of attribute misses.



5
6
7
# File 'lib/chuckle/cache.rb', line 5

def misses
  @misses
end

Instance Method Details

#body_path(request) ⇒ Object



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/chuckle/cache.rb', line 51

def body_path(request)
  uri = request.uri

  # calculate body_path
  s = @client.cache_dir
  s = "#{s}/#{pathify(uri.host)}"
  s = "#{s}/#{pathify(uri.path)}"
  if uri.query
    q = "?#{uri.query}"
    s = "#{s}#{pathify(q)}"
  end
  if body = request.body
    s = "#{s},#{pathify(body)}"
  end

  # shorten long paths to md5 checksum
  if s.length > 250
    dir, base = File.dirname(s), File.basename(s)
    s = "#{dir}/#{Util.md5(base)}"
  end

  s
end

#clear(request) ⇒ Object



33
34
35
36
# File 'lib/chuckle/cache.rb', line 33

def clear(request)
  Util.rm_if_necessary(request.headers_path)
  Util.rm_if_necessary(request.body_path)
end

#exists?(request) ⇒ Boolean

Returns:

  • (Boolean)


38
39
40
# File 'lib/chuckle/cache.rb', line 38

def exists?(request)
  File.exists?(request.body_path)
end

#expired?(request) ⇒ Boolean

Returns:

  • (Boolean)


42
43
44
45
46
47
48
49
# File 'lib/chuckle/cache.rb', line 42

def expired?(request)
  return false if @client.expires_in == :never
  return false if !exists?(request)
  if File.stat(request.body_path).mtime + @client.expires_in < Time.now
    clear(request)
    true
  end
end

#get(request) ⇒ Object



13
14
15
16
17
18
19
20
# File 'lib/chuckle/cache.rb', line 13

def get(request)
  if !exists?(request) || expired?(request)
    self.misses += 1
    return
  end
  self.hits += 1
  Response.new(request)
end

#set(request, curl) ⇒ Object



22
23
24
25
26
27
28
29
30
31
# File 'lib/chuckle/cache.rb', line 22

def set(request, curl)
  # mkdirs
  FileUtils.mkdir_p([File.dirname(request.headers_path), File.dirname(request.body_path)])

  # now mv
  FileUtils.mv(curl.headers_path, request.headers_path)
  FileUtils.mv(curl.body_path, request.body_path)

  Response.new(request)
end