diff --git a/.travis.yml b/.travis.yml index 27dc76a5..9c38f8c1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,13 +1,7 @@ language: ruby rvm: - 1.9.3 - - rbx-19mode - - jruby-19mode before_script: - 'RAILS_ENV=test rake db:create db:schema:load --trace' notifications: irc: "irc.freenode.org#travis" -matrix: - allow_failures: - - rvm: rbx-19mode - - rvm: jruby-19mode diff --git a/lib/travis/api/app.rb b/lib/travis/api/app.rb index 68ed7981..b23bb938 100644 --- a/lib/travis/api/app.rb +++ b/lib/travis/api/app.rb @@ -86,7 +86,11 @@ module Travis::Api env['travis.global_prefix'] = env['SCRIPT_NAME'] end - Middleware.subclasses.each { |m| use(m) } + use Travis::Api::App::Middleware::ScopeCheck + use Travis::Api::App::Middleware::Logging + use Travis::Api::App::Middleware::Metriks + use Travis::Api::App::Middleware::Rewrite + Endpoint.subclasses.each { |e| map(e.prefix) { run(e.new) } } end end diff --git a/lib/travis/api/app/base.rb b/lib/travis/api/app/base.rb index f975fbb1..4fbf40c8 100644 --- a/lib/travis/api/app/base.rb +++ b/lib/travis/api/app/base.rb @@ -37,7 +37,7 @@ class Travis::Api::App disable :protection, :logging, :setup enable :raise_errors # disable :dump_errors - register :subclass_tracker + register :subclass_tracker, :expose_pattern helpers :respond_with, :mime_types end diff --git a/lib/travis/api/app/extensions/expose_pattern.rb b/lib/travis/api/app/extensions/expose_pattern.rb new file mode 100644 index 00000000..7ed0cc3e --- /dev/null +++ b/lib/travis/api/app/extensions/expose_pattern.rb @@ -0,0 +1,12 @@ +require 'travis/api/app' + +class Travis::Api::App + module Extensions + module ExposePattern + def route(verb, path, *) + condition { headers('X-Endpoint' => settings.name.to_s, 'X-Pattern' => path.to_s) } + super + end + end + end +end diff --git a/lib/travis/api/app/middleware/metriks.rb b/lib/travis/api/app/middleware/metriks.rb new file mode 100644 index 00000000..d8ac4f18 --- /dev/null +++ b/lib/travis/api/app/middleware/metriks.rb @@ -0,0 +1,29 @@ +require 'travis/api/app' +require 'metriks' + +class Travis::Api::App + class Middleware + class Metriks < Middleware + include Helpers::Accept + + before do + env['metriks.request.start'] = Time.now.utc + end + + after do + if response.status < 400 + time = Time.now.utc - env['metriks.request.start'] + if headers['X-Pattern'] + pattern = headers['X-Pattern'].gsub(/[:\/]/, ".") + metric = "api.request.endpoint.#{pattern}" + ::Metriks.timer(metric).update(time) + ::Metriks.timer('api.requests').update(time) + end + ::Metriks.meter("api.request.#{request.request_method.downcase}").mark + end + ::Metriks.meter("api.request.status.#{response.status.to_s[0]}").mark + ::Metriks.meter("api.request.version.#{accept_version}").mark + end + end + end +end diff --git a/spec/unit/extensions/expose_pattern_spec.rb b/spec/unit/extensions/expose_pattern_spec.rb new file mode 100644 index 00000000..1952665d --- /dev/null +++ b/spec/unit/extensions/expose_pattern_spec.rb @@ -0,0 +1,23 @@ +require 'spec_helper' + +class Foo < Sinatra::Base + register Travis::Api::App::Extensions::ExposePattern + + get '/:id' do + "ok" + end +end + +describe Travis::Api::App::Extensions::ExposePattern do + before { set_app(Foo) } + + example "it exposes the pattern" do + get('/foo').should be_ok + headers['X-Pattern'].should be == '/:id' + end + + example "it exposes the app class" do + get('/foo').should be_ok + headers['X-Endpoint'].should be == 'Foo' + end +end \ No newline at end of file diff --git a/spec/unit/middleware_spec.rb b/spec/unit/middleware_spec.rb deleted file mode 100644 index 58dd74ee..00000000 --- a/spec/unit/middleware_spec.rb +++ /dev/null @@ -1,12 +0,0 @@ -require 'spec_helper' - -describe Travis::Api::App::Middleware do - class MyMiddleware < Travis::Api::App::Middleware - get('/my_middleware') { 'ok' } - end - - it 'sets up middleware automatically' do - get('/my_middleware').should be_ok - body.should == "ok" - end -end