diff --git a/Gemfile.lock b/Gemfile.lock
index 5ed03d5e..7b578f37 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -139,7 +139,7 @@ GEM
foreman (0.63.0)
dotenv (>= 0.7)
thor (>= 0.13.6)
- gh (0.13.0)
+ gh (0.13.2)
addressable
backports
faraday (~> 0.8)
diff --git a/lib/travis/api/app/responders/xml.rb b/lib/travis/api/app/responders/xml.rb
index 423fca46..410dec84 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
+ @resource = Array(resource)
+ super && @resource.first.is_a?(Repository)
end
def apply
super
- TEMPLATE % data
+ TEMPLATE_ERB.result(binding)
end
private
@@ -30,40 +47,5 @@ module Travis::Api::App::Responders
def content_type
'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')
- }
- 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
- end
end
end
-
-__END__
-
-
-
-
diff --git a/spec/integration/v2/repositories_spec.rb b/spec/integration/v2/repositories_spec.rb
index 139c2c5c..30f2d100 100644
--- a/spec/integration/v2/repositories_spec.rb
+++ b/spec/integration/v2/repositories_spec.rb
@@ -107,9 +107,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 'responds 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
diff --git a/spec/support/matchers.rb b/spec/support/matchers.rb
index 798c9709..883a49f2 100644
--- a/spec/support/matchers.rb
+++ b/spec/support/matchers.rb
@@ -54,7 +54,7 @@ RSpec::Matchers.define :deliver_result_image_for do |name|
end
end
-RSpec::Matchers.define :deliver_cc_xml_for do |repo|
+RSpec::Matchers.define :deliver_cc_xml_for do |obj|
match do |response|
body = response.body
@@ -62,6 +62,8 @@ RSpec::Matchers.define :deliver_cc_xml_for do |repo|
"expected #{body} to be a valid cc.xml"
end
+ repo = Array(obj).first
+
body.include?('') && body.include?(%(name="#{repo.slug}")) && body.include?("https://www.example.com/#{repo.slug}")
end
end