diff --git a/lib/travis/api/app/helpers/mime_types.rb b/lib/travis/api/app/helpers/mime_types.rb index 9e002e62..cf31b505 100644 --- a/lib/travis/api/app/helpers/mime_types.rb +++ b/lib/travis/api/app/helpers/mime_types.rb @@ -18,6 +18,10 @@ class Travis::Api::App def png? request.accept =~ %r(image/png) end + + def atom? + request.accept =~ %r(application/atom+xml) + end end end end diff --git a/lib/travis/api/app/helpers/respond_with.rb b/lib/travis/api/app/helpers/respond_with.rb index 19f4c4fd..611f789f 100644 --- a/lib/travis/api/app/helpers/respond_with.rb +++ b/lib/travis/api/app/helpers/respond_with.rb @@ -49,7 +49,7 @@ class Travis::Api::App end def responders(resource, options) - [:Json, :Image, :Xml, :Plain].map do |name| + [:Json, :Atom, :Image, :Xml, :Plain].map do |name| Responders.const_get(name) end end diff --git a/lib/travis/api/app/middleware/rewrite.rb b/lib/travis/api/app/middleware/rewrite.rb index 8ac8b9f2..1f1a6f86 100644 --- a/lib/travis/api/app/middleware/rewrite.rb +++ b/lib/travis/api/app/middleware/rewrite.rb @@ -3,7 +3,7 @@ require 'travis/api/app' class Travis::Api::App class Middleware class Rewrite < Middleware - FORMAT = %r(\.(json|xml|png|txt)$) + FORMAT = %r(\.(json|xml|png|txt|atom)$) V1_REPO_URL = %r(^(/[^/]+/[^/]+(?:/builds(?:/[\d]+)?|/cc)?)$) helpers :accept @@ -56,6 +56,10 @@ class Travis::Api::App env['travis.format'] == 'xml' end + def atom? + env['travis.format'] == 'atom' + end + def v1? accept_version == 'v1' end diff --git a/lib/travis/api/app/responders.rb b/lib/travis/api/app/responders.rb index a81ac108..30c9ae54 100644 --- a/lib/travis/api/app/responders.rb +++ b/lib/travis/api/app/responders.rb @@ -2,6 +2,7 @@ require 'travis/api/app' class Travis::Api::App module Responders + autoload :Atom, 'travis/api/app/responders/atom' autoload :Base, 'travis/api/app/responders/base' autoload :Image, 'travis/api/app/responders/image' autoload :Json, 'travis/api/app/responders/json' diff --git a/lib/travis/api/app/responders/atom.rb b/lib/travis/api/app/responders/atom.rb new file mode 100644 index 00000000..163cf7a3 --- /dev/null +++ b/lib/travis/api/app/responders/atom.rb @@ -0,0 +1,60 @@ +module Travis::Api::App::Responders + require 'date' + + class Atom < Base + ATOM_FEED_ERB = ERB.new <<-EOF + + + + + <%= resource.first.repository.slug %> Builds + + repo:<%= resource.first.repository.id %> + Copyright (c) <%= DateTime.now.strftime("%Y") %> Travis CI GmbH + <%= DateTime.now.rfc3339 %> + + <% resource.each do |build| %> + + <%= build.repository.slug %> Build #<%= build.number %> + " /> + repo:<%= build.repository.id %>:build:<%= build.id %> + <%= ::DateTime.parse(build.updated_at.to_s).rfc3339 %> + + <p> + <%= build.commit.message.encode(:xml => :text) %> (<%= build.commit.committer_name %>) + <br/><br/> + State: <%= build.state %> + <br/> + Started at: <%= build.started_at ? build.started_at : 'not started' %> + <br/> + Finished at: <%= build.finished_at ? build.finished_at : + build.started_at ? 'still running' : 'not started' %> + </p> + + + <%= build.commit.committer_name %> + + + <% end %> + + + EOF + + def apply? + super && resource.is_a?(ActiveRecord::Relation) && resource.first.is_a?(Build) + end + + def apply + super + + ATOM_FEED_ERB.result(binding) + end + + private + + def content_type + 'application/atom+xml;charset=utf-8' + end + + end +end diff --git a/spec/integration/v1/repositories_spec.rb b/spec/integration/v1/repositories_spec.rb index 4f5795bf..a7482a94 100644 --- a/spec/integration/v1/repositories_spec.rb +++ b/spec/integration/v1/repositories_spec.rb @@ -95,4 +95,20 @@ describe 'v1 repos' do get('/svenfuchs/minimal.png?branch=foo,bar').should deliver_result_image_for('passing') end end + + context 'with "Accept: application/atom+xml" header' do + let(:headers) { { 'HTTP_ACCEPT' => 'application/atom+xml' } } + it 'GET /repositories/svenfuchs/minimal/builds' do + response = get '/repositories/svenfuchs/minimal/builds', {}, headers + response.content_type.should =~ /^application\/atom\+xml/ + end + end + + context 'with .atom extension and "Accept: */*" header' do + let(:headers) { { 'HTTP_ACCEPT' => '*/*' } } + it 'GET /repositories/svenfuchs/minimal/builds.atom' do + response = get '/repositories/svenfuchs/minimal/builds.atom', {}, headers + response.content_type.should =~ /^application\/atom\+xml/ + end + end end diff --git a/spec/integration/v2/repositories_spec.rb b/spec/integration/v2/repositories_spec.rb index 3d95ca0c..fcf89a1f 100644 --- a/spec/integration/v2/repositories_spec.rb +++ b/spec/integration/v2/repositories_spec.rb @@ -139,4 +139,20 @@ describe 'Repos' do result.should deliver_result_image_for('passing') end end + + context 'with "Accept: application/atom+xml" header' do + let(:headers) { { 'HTTP_ACCEPT' => 'application/atom+xml' } } + it 'GET /repositories/svenfuchs/minimal/builds' do + response = get '/repositories/svenfuchs/minimal/builds', {}, headers + response.content_type.should =~ /^application\/atom\+xml/ + end + end + + context 'with .atom extension' do + let(:headers) { { 'HTTP_ACCEPT' => '*/*' } } + it 'GET /repositories/svenfuchs/minimal/builds.atom' do + response = get '/repositories/svenfuchs/minimal/builds.atom', {}, headers + response.content_type.should =~ /^application\/atom\+xml/ + end + end end diff --git a/travis-api.gemspec b/travis-api.gemspec index b6596011..5f0d342c 100644 --- a/travis-api.gemspec +++ b/travis-api.gemspec @@ -22,7 +22,8 @@ Gem::Specification.new do |s| "Nick Schonning", "Patrick Williams", "James Dennes", - "Tim Carey-Smith" + "Tim Carey-Smith", + "Hiro Asari" ] s.email = [ @@ -135,6 +136,7 @@ Gem::Specification.new do |s| "lib/travis/api/app/middleware/rewrite.rb", "lib/travis/api/app/middleware/scope_check.rb", "lib/travis/api/app/responders.rb", + "lib/travis/api/app/responders/atom.rb", "lib/travis/api/app/responders/base.rb", "lib/travis/api/app/responders/image.rb", "lib/travis/api/app/responders/json.rb",