Sha256: 525fc650ba1890c7dd9e17e55d816d92a49cc797811baaa362346a0fb6557b93

Contents?: true

Size: 1.68 KB

Versions: 4

Compression:

Stored size: 1.68 KB

Contents

require 'erb'

module TimePilot
  # Rack application displaying member counts
  class Web
    def call(env)
      dup.call!(env)
    end

    def call!(env)
      @request = Rack::Request.new(env)
      case @request.path_info
      when '/'
        dashboard
      else
        not_found
      end
    end

    # TODO: use Redis pipelining
    def dashboard
      @total_count = TimePilot.features.map do |feature_name|
        counts = TimePilot.group_classes.map do |klass|
          [klass.to_s, klass.pilot_feature_cardinality(feature_name)]
        end.to_h
        [feature_name, counts]
      end.to_h
      erb :index
    end

    def not_found
      [404, { 'Content-Type' => 'text/html' }, ['Not Found']]
    end

    def erb(view)
      [
        200,
        { 'Content-Type' => 'text/html' },
        [ERB.new(read_template(view)).result(binding)]
      ]
    end

    def read_template(view)
      File.read(File.join(__dir__, '..', '..', 'web', 'views', "#{view}.html.erb"))
    end

    def root_path
      "#{@request.env['SCRIPT_NAME']}/"
    end

    class << self
      def app
        @app ||= instance
      end

      def call(env)
        app.call(env)
      end

      def use(middleware, *args, &block)
        @app = nil
        @middleware << [middleware, args, block]
      end

      def instance
        builder = Rack::Builder.new
        @middleware.each { |c, a, b| builder.use(c, *a, &b) }
        builder.use Rack::Static,
                    urls: ['/stylesheets'],
                    root: File.join(__dir__, '..', '..', 'web', 'assets')
        builder.run new
        builder.to_app
      end

      def reset!
        @middleware = []
      end
    end
    reset!
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
time_pilot-1.0.2 lib/time_pilot/web.rb
time_pilot-1.0.1 lib/time_pilot/web.rb
time_pilot-1.0.0 lib/time_pilot/web.rb
time_pilot-0.1.1 lib/time_pilot/web.rb