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