Sha256: 09b60055c0d12d956fabe687809ba48241a1617d9a52b1197e67b7b505ec05f9

Contents?: true

Size: 1.54 KB

Versions: 2

Compression:

Stored size: 1.54 KB

Contents

require 'fileutils'

module Nitro

# Adds support for caching.

module Caching

	# Output caching.

	module Output

		def self.append_features(base) # :nodoc: 
			super
			base.extend(ClassMethods)
			base.module_eval do
				cattr_accessor :output_cache_root, 'public'
			end
		end

		module ClassMethods

			def do_cache_output(path, content)
				filepath = output_cache_path(path)
				FileUtils.makedirs(File.dirname(filepath))
				File.open(filepath, 'w+') { |f| f.write(content) }
				Logger.debug "Cached page: #{filepath}" if $DBG
			end

			# Enable output caching for the given actions.

			def cache_output(*actions)
				return unless (caching_enabled and Caching.caching_enabled)

				str = actions.collect { |a| ":#{a}" }.join(', ')

				module_eval %{
					post "do_cache_output", :only => [ #{str} ]
				}
			end

			private

			def output_cache_path(path)
				filename = ((path.empty? || path == '/') ? '/index' : path.dup)
#				filename.gsub!(/\/$/, '')
				filename << 'index.html' unless (name.split('/').last || name).include? '.'
				return output_cache_root + '/' + filename 										
			end
			
		end

		private

		def do_cache_output
			if caching_enabled and Caching.caching_enabled and caching_allowed?
				self.class.do_cache_output(@request.uri, @out)
			end
		end

		def expire_output(name)
			begin
				FileUtils.rm("#{context.dispatcher.public_root}/#{name}/index.html")
			rescue Object
				# gmosx: is this the right thing to do?
			end
		end
		
		def caching_allowed?
			!@request.post?
		end

	end

end

end

# * George Moschovitis  <gm@navel.gr>

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
nitro-0.18.0 lib/nitro/caching/output.rb
nitro-0.18.1 lib/nitro/caching/output.rb