Sha256: 24b1ff696387477e62f4e3d6b69804324fb27b844885bbc8160fb4f0fc6d7a2d

Contents?: true

Size: 1.42 KB

Versions: 1

Compression:

Stored size: 1.42 KB

Contents

require 'rack'

module Rack
  class Revision
    File = ::File
    @@revision = nil

    def initialize(app, options={})
      initialize_options(options)

      @app = app
      @dir = Dir.pwd
    end

    def call(env)
      if @options[:rack_env]
        env[@options[:rack_env]] = revision
      end

      status, headers, body = @app.call(env)

      if @options[:header]
        headers[@options[:header]] = revision
      end

      [status, headers, body]
    end

    def reset_revision
      @@revision = nil
    end

    protected

    def revision
      @@revision ||= (fetch_from_env || fetch_from_file || fetch_default)
    end

    def fetch_from_env
      ENV[@options[:env_var]]
    end

    def fetch_from_file
      if ::File.exist?(detected_filename)
        ::File.read(detected_filename).strip
      end
    end

    def fetch_default
      @options[:default]
    end

    def detected_filename
      @file ||= (@options[:filename] =~ /\A\// ? @options[:filename] : File.join(@dir, @options[:filename]))
    end

    def initialize_options(options)
      @options = {
        :header   => options[:header].nil? ? "X-Revision" : options[:header],
        :rack_env => options[:rack_env].nil? ? "rack.app_revision" : options[:rack_env],
        :env_var  => options[:env_var]  || "RACK_REVISION",
        :filename => options[:filename] || "REVISION",
        :default  => options[:default]  || "UNDEFINED"
      }
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rack-revision-1.1.1 lib/rack/revision.rb