nice way to manage the steam middleware stack
did
committed Feb 19, 2015
commit 208475bd526138b53828497082dadece77c4ee3a
Showing 6
changed files with
166 additions
and 56 deletions
bin/steam.rb
+4
-4
| @@ | @@ -24,16 +24,16 @@ Locomotive::Common.configure do |config| |
| config.notifier = Locomotive::Common::Logger.setup(File.join(path, 'log/steam.log')) | |
| end | |
| - | server = Locomotive::Steam::Server.new |
| + | app = Locomotive::Steam::Server.to_app |
| # Note: alt thin settings (Threaded) | |
| - | server = Thin::Server.new('localhost', '8080', server.to_app) |
| + | server = Thin::Server.new('localhost', '8080', app) |
| server.threaded = true | |
| server.start | |
| - | # FIXME: Rack::Handler::Thin.run server.to_app (not threaded) |
| + | # FIXME: Rack::Handler::Thin.run app (not threaded) |
| # WEBRick rack handler | |
| - | # Rack::Handler::WEBrick.run server.to_app |
| + | # Rack::Handler::WEBrick.run app |
| Locomotive::Common::Logger.info 'Server started...' | |
locomotive/steam/configuration.rb b/lib/locomotive/steam/configuration.rb
+4
-2
| @@ | @@ -1,4 +1,4 @@ |
| - | require_relative 'middlewares/proxy_stack' |
| + | require_relative 'middlewares/stack_proxy' |
| module Locomotive | |
| module Steam | |
| @@ | @@ -32,7 +32,9 @@ module Locomotive |
| # end | |
| # | |
| attr_accessor :middleware | |
| - | def middleware; @middleware ||= Middlewares::ProxyStack.new; end |
| + | def middleware |
| + | @middleware ||= Middlewares::StackProxy.new(&Locomotive::Steam::Server.default_middlewares) |
| + | end |
| # Add the checksum of a theme asset at the end of its path to allow public caching. | |
| # | |
locomotive/steam/middlewares/stack_proxy.rb b/lib/locomotive/steam/middlewares/stack_proxy.rb
+46
-0
| @@ | @@ -0,0 +1,46 @@ |
| + | module Locomotive::Steam::Middlewares |
| + | |
| + | class StackProxy |
| + | |
| + | attr_reader :list, :operations |
| + | |
| + | def initialize(&block) |
| + | @list = [] |
| + | instance_eval(&block) if block_given? |
| + | end |
| + | |
| + | def use(*args) |
| + | @list << args |
| + | end |
| + | |
| + | def insert_before(index, *args) |
| + | @list.insert(index_of(index), args) |
| + | end |
| + | |
| + | def insert_after(index, *args) |
| + | @list.insert(index_of(index) + 1, args) |
| + | end |
| + | |
| + | def delete(index) |
| + | @list.delete_at(index_of(index)) |
| + | end |
| + | |
| + | alias :insert :insert_before |
| + | |
| + | def inject(builder) |
| + | @list.each do |args| |
| + | builder.use(*args) |
| + | end |
| + | end |
| + | |
| + | def index_of(index) |
| + | if index.is_a?(Integer) |
| + | index |
| + | else |
| + | @list.index { |args| args[0] == index } |
| + | end |
| + | end |
| + | |
| + | end |
| + | |
| + | end |
locomotive/steam/server.rb b/lib/locomotive/steam/server.rb
+44
-49
| @@ | @@ -13,68 +13,63 @@ require 'dragonfly/middleware' |
| require_relative 'middlewares' | |
| module Locomotive::Steam | |
| - | class Server |
| + | module Server |
| - | # attr_reader :options |
| + | class << self |
| - | # def initialize(options = {}) |
| - | # @options = prepare_options(options) |
| - | # end |
| + | def default_middlewares |
| + | server, configuration = self, self.configuration |
| - | def to_app |
| - | server = self |
| + | -> (stack) { |
| + | use Middlewares::Favicon |
| - | Rack::Builder.new do |
| - | server.serve_assets(self) if server.configuration.serve_assets |
| + | if configuration.serve_assets |
| + | use ::Rack::Static, { |
| + | root: configuration.assets_path, |
| + | urls: ['/images', '/fonts', '/samples', '/media'] |
| + | } |
| + | use Middlewares::DynamicAssets, { |
| + | root: configuration.assets_path, |
| + | minify: configuration.minify_assets |
| + | } |
| + | end |
| - | use Middlewares::Favicon |
| + | use Rack::Lint |
| + | use Rack::Session::Moneta, configuration.moneta |
| - | use Rack::Lint |
| - | use Rack::Session::Moneta, server.configuration.moneta |
| - | |
| - | use Middlewares::DefaultEnv |
| - | use Middlewares::Logging |
| - | use Middlewares::Site |
| - | use Middlewares::Timezone |
| - | use Middlewares::EntrySubmission |
| - | use Middlewares::Locale |
| - | use Middlewares::Path |
| - | use Middlewares::Page |
| - | use Middlewares::TemplatizedPage |
| + | server.steam_middleware_stack.each { |k| use k } |
| + | } |
| + | end |
| - | run Middlewares::Renderer.new(nil) |
| + | def steam_middleware_stack |
| + | [ |
| + | Middlewares::DefaultEnv, |
| + | Middlewares::Logging, |
| + | Middlewares::Site, |
| + | Middlewares::Timezone, |
| + | Middlewares::EntrySubmission, |
| + | Middlewares::Locale, |
| + | Middlewares::Path, |
| + | Middlewares::Page, |
| + | Middlewares::TemplatizedPage |
| + | ] |
| end | |
| - | end |
| - | def serve_assets(builder) |
| - | builder.use ::Rack::Static, { |
| - | root: configuration.assets_path, |
| - | urls: ['/images', '/fonts', '/samples', '/media'] |
| - | } |
| + | def to_app |
| + | stack = configuration.middleware |
| - | builder.use Middlewares::DynamicAssets, { |
| - | root: configuration.assets_path, |
| - | minify: configuration.minify_assets |
| - | } |
| - | end |
| + | Rack::Builder.new do |
| + | stack.inject(self) |
| - | def configuration |
| - | Locomotive::Steam.configuration |
| - | end |
| - | |
| - | # def options |
| + | run Middlewares::Renderer.new(nil) |
| + | end |
| + | end |
| - | # end |
| + | def configuration |
| + | Locomotive::Steam.configuration |
| + | end |
| - | # def prepare_options(options) |
| - | # { |
| - | # serve_assets: false, |
| - | # minify_assets: false, |
| - | # moneta: { |
| - | # store: Moneta.new(:Memory, expires: true) |
| - | # } |
| - | # }.merge(options) |
| - | # end |
| + | end |
| end | |
| end | |
spec/support/helpers.rb
+1
-1
| @@ | @@ -30,7 +30,7 @@ module Spec |
| end | |
| Locomotive::Common::Logger.info 'Server started...' | |
| - | Locomotive::Steam::Server.new.to_app |
| + | Locomotive::Steam::Server.to_app |
| end | |
| def default_fixture_site_path | |
spec/unit/middlewares/stack_proxy_spec.rb
+67
-0
| @@ | @@ -0,0 +1,67 @@ |
| + | require 'spec_helper' |
| + | |
| + | require_relative '../../../lib/locomotive/steam/middlewares/stack_proxy' |
| + | |
| + | describe Locomotive::Steam::Middlewares::StackProxy do |
| + | |
| + | let(:klass) { Locomotive::Steam::Middlewares::StackProxy } |
| + | let(:proxy) { klass.new } |
| + | |
| + | describe '#initialize' do |
| + | |
| + | let(:args) { DefaultMiddleware } |
| + | subject do |
| + | klass.new { use(DefaultMiddleware) } |
| + | end |
| + | |
| + | it 'adds it to the list' do |
| + | expect(subject.list.size).to eq 1 |
| + | expect(subject.list.first).to eq [DefaultMiddleware] |
| + | end |
| + | |
| + | end |
| + | |
| + | describe '#use' do |
| + | |
| + | let(:args) { DefaultMiddleware } |
| + | before { proxy.use(*args) } |
| + | |
| + | it 'adds it to the operations' do |
| + | expect(proxy.list.size).to eq 1 |
| + | expect(proxy.list.first).to eq [DefaultMiddleware] |
| + | end |
| + | |
| + | end |
| + | |
| + | describe 'manipulating middlewares' do |
| + | |
| + | before do |
| + | proxy.use DefaultMiddleware |
| + | proxy.use SimpleMiddleware |
| + | |
| + | proxy.insert_before SimpleMiddleware, FooMiddleware |
| + | proxy.use BarMiddleware, { answer: 42 } |
| + | proxy.delete SimpleMiddleware |
| + | proxy.insert_after 1, FancyMiddleware |
| + | end |
| + | |
| + | subject { proxy.list } |
| + | |
| + | it do |
| + | is_expected.to eq([ |
| + | [DefaultMiddleware], |
| + | [FooMiddleware], |
| + | [FancyMiddleware], |
| + | [BarMiddleware, { answer: 42 }] |
| + | ]) |
| + | end |
| + | |
| + | end |
| + | |
| + | class SimpleMiddleware; end |
| + | class DefaultMiddleware; end |
| + | class FooMiddleware; end |
| + | class BarMiddleware; end |
| + | class FancyMiddleware; end |
| + | |
| + | end |