From 3c43f7e3fd52e97405909e53189db00d5ba129d6 Mon Sep 17 00:00:00 2001 From: Konstantin Haase Date: Tue, 10 Mar 2015 11:23:48 +0100 Subject: [PATCH] v3: expose available attributes for collections --- lib/travis/api/v3.rb | 2 +- lib/travis/api/v3/renderer/collection.rb | 10 ----- .../api/v3/renderer/collection_renderer.rb | 43 +++++++++++++++++++ lib/travis/api/v3/renderer/organizations.rb | 9 ++-- lib/travis/api/v3/renderer/repositories.rb | 9 ++-- lib/travis/api/v3/renderer/requests.rb | 6 +++ spec/v3/service_index_spec.rb | 9 ++-- 7 files changed, 62 insertions(+), 26 deletions(-) delete mode 100644 lib/travis/api/v3/renderer/collection.rb create mode 100644 lib/travis/api/v3/renderer/collection_renderer.rb create mode 100644 lib/travis/api/v3/renderer/requests.rb diff --git a/lib/travis/api/v3.rb b/lib/travis/api/v3.rb index 26fa774f..6ca5eabc 100644 --- a/lib/travis/api/v3.rb +++ b/lib/travis/api/v3.rb @@ -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) diff --git a/lib/travis/api/v3/renderer/collection.rb b/lib/travis/api/v3/renderer/collection.rb deleted file mode 100644 index 8b3da3bd..00000000 --- a/lib/travis/api/v3/renderer/collection.rb +++ /dev/null @@ -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 diff --git a/lib/travis/api/v3/renderer/collection_renderer.rb b/lib/travis/api/v3/renderer/collection_renderer.rb new file mode 100644 index 00000000..1be17af6 --- /dev/null +++ b/lib/travis/api/v3/renderer/collection_renderer.rb @@ -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 diff --git a/lib/travis/api/v3/renderer/organizations.rb b/lib/travis/api/v3/renderer/organizations.rb index d62ffa2e..d797b6a2 100644 --- a/lib/travis/api/v3/renderer/organizations.rb +++ b/lib/travis/api/v3/renderer/organizations.rb @@ -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 diff --git a/lib/travis/api/v3/renderer/repositories.rb b/lib/travis/api/v3/renderer/repositories.rb index 9e9830ed..defa29dc 100644 --- a/lib/travis/api/v3/renderer/repositories.rb +++ b/lib/travis/api/v3/renderer/repositories.rb @@ -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 diff --git a/lib/travis/api/v3/renderer/requests.rb b/lib/travis/api/v3/renderer/requests.rb new file mode 100644 index 00000000..651c9298 --- /dev/null +++ b/lib/travis/api/v3/renderer/requests.rb @@ -0,0 +1,6 @@ +module Travis::API::V3 + class Renderer::Requests < Renderer::CollectionRenderer + type :requests + collection_key :requests + end +end diff --git a/spec/v3/service_index_spec.rb b/spec/v3/service_index_spec.rb index b4cdb3e3..b350c6d1 100644 --- a/spec/v3/service_index_spec.rb +++ b/spec/v3/service_index_spec.rb @@ -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