v3: expose available attributes for collections
This commit is contained in:
parent
9449ada1cd
commit
3c43f7e3fd
|
@ -11,7 +11,7 @@ module Travis
|
||||||
def response(payload, headers = {}, content_type: 'application/json'.freeze, status: 200)
|
def response(payload, headers = {}, content_type: 'application/json'.freeze, status: 200)
|
||||||
payload = JSON.pretty_generate(payload) unless payload.is_a? String
|
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)
|
headers = { 'Content-Type'.freeze => content_type, 'Content-Length'.freeze => payload.bytesize.to_s }.merge!(headers)
|
||||||
[status, headers, [payload] ]
|
[status, headers, [payload]]
|
||||||
end
|
end
|
||||||
|
|
||||||
def location(env)
|
def location(env)
|
||||||
|
|
|
@ -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
|
|
43
lib/travis/api/v3/renderer/collection_renderer.rb
Normal file
43
lib/travis/api/v3/renderer/collection_renderer.rb
Normal 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
|
|
@ -1,9 +1,6 @@
|
||||||
module Travis::API::V3
|
module Travis::API::V3
|
||||||
module Renderer::Organizations
|
class Renderer::Organizations < Renderer::CollectionRenderer
|
||||||
extend self
|
type :organizations
|
||||||
|
collection_key :organizations
|
||||||
def render(repositories, **options)
|
|
||||||
Renderer[:collection].render(:organizations, :organization, repositories, **options)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,9 +1,6 @@
|
||||||
module Travis::API::V3
|
module Travis::API::V3
|
||||||
module Renderer::Repositories
|
class Renderer::Repositories < Renderer::CollectionRenderer
|
||||||
extend self
|
type :repositories
|
||||||
|
collection_key :repositories
|
||||||
def render(repositories, **options)
|
|
||||||
Renderer[:collection].render(:repositories, :repository, repositories, **options)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
6
lib/travis/api/v3/renderer/requests.rb
Normal file
6
lib/travis/api/v3/renderer/requests.rb
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
module Travis::API::V3
|
||||||
|
class Renderer::Requests < Renderer::CollectionRenderer
|
||||||
|
type :requests
|
||||||
|
collection_key :requests
|
||||||
|
end
|
||||||
|
end
|
|
@ -18,7 +18,8 @@ describe Travis::API::V3::ServiceIndex do
|
||||||
"create"=>
|
"create"=>
|
||||||
[{"@type"=>"template",
|
[{"@type"=>"template",
|
||||||
"request_method"=>"POST",
|
"request_method"=>"POST",
|
||||||
"uri_template"=>"#{path}repo/{repository.id}/requests"}]}},
|
"uri_template"=>"#{path}repo/{repository.id}/requests"}]},
|
||||||
|
"attributes"=>["requests"]},
|
||||||
"branch"=>
|
"branch"=>
|
||||||
{"@type"=>"resource",
|
{"@type"=>"resource",
|
||||||
"actions"=>
|
"actions"=>
|
||||||
|
@ -59,7 +60,8 @@ describe Travis::API::V3::ServiceIndex do
|
||||||
{"for_current_user"=>
|
{"for_current_user"=>
|
||||||
[{"@type"=>"template",
|
[{"@type"=>"template",
|
||||||
"request_method"=>"GET",
|
"request_method"=>"GET",
|
||||||
"uri_template"=>"#{path}repos"}]}},
|
"uri_template"=>"#{path}repos"}]},
|
||||||
|
"attributes"=>["repositories"]},
|
||||||
"build"=>
|
"build"=>
|
||||||
{"@type"=>"resource",
|
{"@type"=>"resource",
|
||||||
"actions"=>
|
"actions"=>
|
||||||
|
@ -90,7 +92,8 @@ describe Travis::API::V3::ServiceIndex do
|
||||||
{"for_current_user"=>
|
{"for_current_user"=>
|
||||||
[{"@type"=>"template",
|
[{"@type"=>"template",
|
||||||
"request_method"=>"GET",
|
"request_method"=>"GET",
|
||||||
"uri_template"=>"#{path}orgs"}]}}}
|
"uri_template"=>"#{path}orgs"}]},
|
||||||
|
"attributes"=>["organizations"]}}
|
||||||
}
|
}
|
||||||
|
|
||||||
describe 'with /v3 prefix' do
|
describe 'with /v3 prefix' do
|
||||||
|
|
Loading…
Reference in New Issue
Block a user