v3: expose available attributes for collections

This commit is contained in:
Konstantin Haase 2015-03-10 11:23:48 +01:00
parent 9449ada1cd
commit 3c43f7e3fd
7 changed files with 62 additions and 26 deletions

View File

@ -11,7 +11,7 @@ module Travis
def response(payload, headers = {}, content_type: 'application/json'.freeze, status: 200)
payload = JSON.pretty_generate(payload) unless payload.is_a? String
headers = { 'Content-Type'.freeze => content_type, 'Content-Length'.freeze => payload.bytesize.to_s }.merge!(headers)
[status, headers, [payload] ]
[status, headers, [payload]]
end
def location(env)

View File

@ -1,10 +0,0 @@
module Travis::API::V3
module Renderer::Collection
extend self
def render(collection_type, entry_type, entries, href: nil, script_name: nil, include: [], included: [], **)
entries &&= entries.map { |entry| Renderer[entry_type].render(entry, script_name: script_name, include: include, included: included) }
Renderer.clear(:@type => collection_type, :@href => href).merge(collection_type => entries)
end
end
end

View File

@ -0,0 +1,43 @@
module Travis::API::V3
class Renderer::CollectionRenderer
def self.render(list, **options)
new(list, **options).render
end
def self.available_attributes
@available_attributes ||= Set.new
end
def self.type(value)
define_method(:type) { value }
end
def self.collection_key(value)
define_method(:collection_key) { value }
available_attributes << value
end
def initialize(list, href: nil, included: [], **options)
@href = href
@options = options
@list = list
@included = included
end
def render
result = { :"@type" => type }
result[:@href] = @href if @href
included = @included.dup
result[collection_key] = @list.map do |entry|
rendered = render_entry(entry, included: included, mode: :standard, **@options)
included << entry
rendered
end
result
end
def render_entry(entry, **options)
Renderer.render_value(entry, **options)
end
end
end

View File

@ -1,9 +1,6 @@
module Travis::API::V3
module Renderer::Organizations
extend self
def render(repositories, **options)
Renderer[:collection].render(:organizations, :organization, repositories, **options)
end
class Renderer::Organizations < Renderer::CollectionRenderer
type :organizations
collection_key :organizations
end
end

View File

@ -1,9 +1,6 @@
module Travis::API::V3
module Renderer::Repositories
extend self
def render(repositories, **options)
Renderer[:collection].render(:repositories, :repository, repositories, **options)
end
class Renderer::Repositories < Renderer::CollectionRenderer
type :repositories
collection_key :repositories
end
end

View File

@ -0,0 +1,6 @@
module Travis::API::V3
class Renderer::Requests < Renderer::CollectionRenderer
type :requests
collection_key :requests
end
end

View File

@ -18,7 +18,8 @@ describe Travis::API::V3::ServiceIndex do
"create"=>
[{"@type"=>"template",
"request_method"=>"POST",
"uri_template"=>"#{path}repo/{repository.id}/requests"}]}},
"uri_template"=>"#{path}repo/{repository.id}/requests"}]},
"attributes"=>["requests"]},
"branch"=>
{"@type"=>"resource",
"actions"=>
@ -59,7 +60,8 @@ describe Travis::API::V3::ServiceIndex do
{"for_current_user"=>
[{"@type"=>"template",
"request_method"=>"GET",
"uri_template"=>"#{path}repos"}]}},
"uri_template"=>"#{path}repos"}]},
"attributes"=>["repositories"]},
"build"=>
{"@type"=>"resource",
"actions"=>
@ -90,7 +92,8 @@ describe Travis::API::V3::ServiceIndex do
{"for_current_user"=>
[{"@type"=>"template",
"request_method"=>"GET",
"uri_template"=>"#{path}orgs"}]}}}
"uri_template"=>"#{path}orgs"}]},
"attributes"=>["organizations"]}}
}
describe 'with /v3 prefix' do