diff --git a/lib/travis/api/app/responders/xml.rb b/lib/travis/api/app/responders/xml.rb index 423fca46..64fb85d2 100644 --- a/lib/travis/api/app/responders/xml.rb +++ b/lib/travis/api/app/responders/xml.rb @@ -1,6 +1,22 @@ module Travis::Api::App::Responders +# This XML responder is used if the resource is a Repository, or a collection +# of Repositories. +# It returns XML data conforming to Multiple Project Summary Reporting Standard, +# as explained in http://confluence.public.thoughtworks.org/display/CI/Multiple+Project+Summary+Reporting+Standard class Xml < Base - TEMPLATE = File.read(__FILE__).split("__END__").last.strip + TEMPLATE_ERB = ERB.new <<-EOF + +<% @resource.each do |r| %> + " /> +<% end %> + + EOF STATUS = { default: 'Unknown', @@ -16,13 +32,14 @@ module Travis::Api::App::Responders } def apply? - super && resource.is_a?(Repository) && last_build + super && (single_repo?(resource) || repo_collection?(resource)) end def apply super - TEMPLATE % data + @resource = resource.is_a?(Repository) ? [resource] : resource + TEMPLATE_ERB.result(binding) end private @@ -31,39 +48,12 @@ module Travis::Api::App::Responders 'application/xml;charset=utf-8' end - def data - { - name: resource.slug, - url: File.join("https://", Travis.config.client_domain, resource.slug), - activity: activity, - label: last_build.try(:number), - status: status, - time: last_build.finished_at.try(:strftime, '%Y-%m-%dT%H:%M:%S.%L%z') - } + def single_repo?(resource) + resource.is_a?(Repository) && (@last_build || resource.last_build) end - def status - STATUS[last_build.state.to_sym] || STATUS[:default] - end - - def activity - ACTIVITY[last_build.state.to_sym] || ACTIVITY[:default] - end - - def last_build - @last_build ||= resource.last_build + def repo_collection?(resource) + resource.is_a?(ActiveRecord::Relation) && resource.first.is_a?(Repository) end end end - -__END__ - - - - diff --git a/spec/integration/v2/repositories_spec.rb b/spec/integration/v2/repositories_spec.rb index fcf89a1f..77cc42b5 100644 --- a/spec/integration/v2/repositories_spec.rb +++ b/spec/integration/v2/repositories_spec.rb @@ -87,9 +87,9 @@ describe 'Repos' do response.should deliver_cc_xml_for(Repository.by_slug('svenfuchs/minimal').first) end - it 'does not respond with cc.xml for /repos list' do + it 'respond with cc.xml for /repos list' do response = get '/repos', {}, 'HTTP_ACCEPT' => 'application/xml; version=2' - response.status.should == 406 + response.should deliver_cc_xml_for(Repository.timeline) end it 'responds with 404 when repo can\'t be found and format is png' do