Class: GraphQL::Language::Cache

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

Overview

This cache is used by Parser.parse_file when it's enabled.

With Rails, parser caching may enabled by setting config.graphql.parser_cache = true in your Rails application.

The cache may be manually built by assigning GraphQL::Language::Parser.cache = GraphQL::Language::Cache.new("some_dir"). This will create a directory (tmp/cache/graphql by default) that stores a cache of parsed files.

Much like bootsnap, the parser cache needs to be cleaned up manually. You will need to clear the cache directory for each new deployment of your application. Also note that the parser cache will grow as your schema is loaded, so the cache directory must be writable.

Constant Summary collapse

DIGEST =
Digest::SHA256.new << GraphQL::VERSION

Instance Method Summary collapse

Constructor Details

#initialize(path) ⇒ Cache

Returns a new instance of Cache.



21
22
23
# File 'lib/graphql/language/cache.rb', line 21

def initialize(path)
  @path = path
end

Instance Method Details

#fetch(filename) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/graphql/language/cache.rb', line 27

def fetch(filename)
  hash = DIGEST.dup << filename
  begin
    hash << File.mtime(filename).to_i.to_s
  rescue SystemCallError
    return yield
  end
  cache_path = @path.join(hash.to_s)

  if cache_path.exist?
    Marshal.load(cache_path.read)
  else
    payload = yield
    tmp_path = "#{cache_path}.#{rand}"

    @path.mkpath
    File.binwrite(tmp_path, Marshal.dump(payload))
    File.rename(tmp_path, cache_path.to_s)
    payload
  end
end