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