diff --git a/lib/curly.rb b/lib/curly.rb index 11461e4..1327ece 100644 --- a/lib/curly.rb +++ b/lib/curly.rb @@ -51,4 +51,5 @@ def self.valid?(template, presenter_class) require 'curly/compiler' require 'curly/presenter' require 'curly/template_handler' +require 'curly/configuration' require 'curly/railtie' if defined?(Rails) diff --git a/lib/curly/configuration.rb b/lib/curly/configuration.rb new file mode 100644 index 0000000..12f4b9c --- /dev/null +++ b/lib/curly/configuration.rb @@ -0,0 +1,27 @@ +module Curly + extend self + + def configuration + @configuration ||= Configuration.new + end + + def configure + yield(configuration) + end + + def configuration=(c) + @configuration = c + end + + def reset + @configuration = Configuration.new + end + + class Configuration + attr_accessor :cache_store + + def initialize + @cache_store = nil + end + end +end diff --git a/lib/curly/template_handler.rb b/lib/curly/template_handler.rb index d2a0852..613bb61 100644 --- a/lib/curly/template_handler.rb +++ b/lib/curly/template_handler.rb @@ -15,7 +15,19 @@ class << self # Returns a String containing the Ruby code representing the template. def call(template) instrument(template) do - compile(template) + if Curly.configuration.cache_store + cache_key = [ + "CurlyCompilation", + template.virtual_path, + template.cache_key, + ].join("/") + + Curly.configuration.cache_store.fetch(cache_key) do + compile(template) + end + else + compile(template) + end end end diff --git a/spec/configuration_spec.rb b/spec/configuration_spec.rb new file mode 100644 index 0000000..33ed722 --- /dev/null +++ b/spec/configuration_spec.rb @@ -0,0 +1,41 @@ +describe Curly::Configuration do + after do + Curly.reset + end + + describe "#cache_store" do + it "defaults to nil" do + cache_store = Curly::Configuration.new.cache_store + + expect(cache_store).to be_nil + end + end + + describe ".configure" do + before do + Curly.configure do |config| + config.cache_store = 'foobar' + end + end + + it "returns correct value for cache_store" do + presenters_namespace = Curly.configuration.cache_store + + expect(presenters_namespace).to eq('foobar') + end + end + + describe ".reset" do + it "resets the configuration to default value" do + Curly.configure do |config| + config.cache_store = 'foobarbaz' + end + + Curly.reset + + cache_store = Curly::Configuration.new.cache_store + + expect(cache_store).to be_nil + end + end +end