v3: add @href to payloads
This commit is contained in:
parent
89f96c98ec
commit
32c2d9b0b9
|
@ -14,6 +14,12 @@ module Travis
|
||||||
[status, headers, [payload] ]
|
[status, headers, [payload] ]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def location(env)
|
||||||
|
location = env['SCRIPT_NAME'.freeze].to_s + env['PATH_INFO'.freeze].to_s
|
||||||
|
location << ??.freeze << env['QUERY_STRING'.freeze] if env['QUERY_STRING'.freeze] and not env['QUERY_STRING'.freeze].empty?
|
||||||
|
location
|
||||||
|
end
|
||||||
|
|
||||||
extend self
|
extend self
|
||||||
load_dir("#{__dir__}/v3")
|
load_dir("#{__dir__}/v3")
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
module Travis::API::V3
|
module Travis::API::V3
|
||||||
module Renderer
|
module Renderer
|
||||||
|
EXPANDER_CACHE = Tool::ThreadLocal.new
|
||||||
|
private_constant :EXPANDER_CACHE
|
||||||
|
|
||||||
extend ConstantResolver
|
extend ConstantResolver
|
||||||
extend self
|
extend self
|
||||||
|
|
||||||
|
@ -15,5 +18,31 @@ module Travis::API::V3
|
||||||
value = object.public_send(attribute)
|
value = object.public_send(attribute)
|
||||||
value.nil? ? defaults[attribute] : value
|
value.nil? ? defaults[attribute] : value
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def clear(**args)
|
||||||
|
args.select { |key, value| !value.nil? }
|
||||||
|
end
|
||||||
|
|
||||||
|
def href(type, script_name: nil, **args)
|
||||||
|
expander = EXPANDER_CACHE[[type, script_name, args.keys]] ||= begin
|
||||||
|
resource = Routes.resources.detect { |r| r.identifier == type }
|
||||||
|
unprefixed = args.keys.reject { |a| a.to_s.include? ?..freeze }
|
||||||
|
route = resource.route
|
||||||
|
route &&= Mustermann.new(script_name, type: :identity) + route if script_name and not script_name.empty?
|
||||||
|
generate_expander(route, type, unprefixed)
|
||||||
|
end
|
||||||
|
|
||||||
|
expander.call(args)
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def generate_expander(route, prefix, unprefixed)
|
||||||
|
return proc { |**| } unless route.respond_to? :expand
|
||||||
|
proc do |**args|
|
||||||
|
unprefixed.each { |key| args[:"#{prefix}.#{key}"] = args.delete(key) }
|
||||||
|
route.expand(**args)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -2,7 +2,7 @@ module Travis::API::V3
|
||||||
module Renderer::Error
|
module Renderer::Error
|
||||||
extend self
|
extend self
|
||||||
|
|
||||||
def render(type)
|
def render(type, **)
|
||||||
{
|
{
|
||||||
:@type => 'pending'.freeze,
|
:@type => 'pending'.freeze,
|
||||||
:resource_type => type
|
:resource_type => type
|
||||||
|
|
|
@ -2,9 +2,9 @@ module Travis::API::V3
|
||||||
module Renderer::Collection
|
module Renderer::Collection
|
||||||
extend self
|
extend self
|
||||||
|
|
||||||
def render(collection_type, entry_type, entries, **additional)
|
def render(collection_type, entry_type, entries, href: nil, script_name: nil, **additional)
|
||||||
entries &&= entries.map { |entry| Renderer[entry_type].render(entry) }
|
entries &&= entries.map { |entry| Renderer[entry_type].render(entry, script_name: script_name) }
|
||||||
{ :@type => collection_type, collection_type => entries, **additional }
|
Renderer.clear(:@type => collection_type, :@href => href).merge(collection_type => entries, **additional)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -2,7 +2,7 @@ module Travis::API::V3
|
||||||
module Renderer::Error
|
module Renderer::Error
|
||||||
extend self
|
extend self
|
||||||
|
|
||||||
def render(error)
|
def render(error, **)
|
||||||
{
|
{
|
||||||
:@type => 'error'.freeze,
|
:@type => 'error'.freeze,
|
||||||
:error_type => error.type,
|
:error_type => error.type,
|
||||||
|
|
|
@ -3,7 +3,7 @@ module Travis::API::V3
|
||||||
DIRECT_ATTRIBUTES = %i[id login name github_id]
|
DIRECT_ATTRIBUTES = %i[id login name github_id]
|
||||||
extend self
|
extend self
|
||||||
|
|
||||||
def render(organization)
|
def render(organization, **)
|
||||||
{ :@type => 'organization'.freeze, **direct_attributes(organization) }
|
{ :@type => 'organization'.freeze, **direct_attributes(organization) }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -2,8 +2,8 @@ module Travis::API::V3
|
||||||
module Renderer::Organizations
|
module Renderer::Organizations
|
||||||
extend self
|
extend self
|
||||||
|
|
||||||
def render(repositories)
|
def render(repositories, **options)
|
||||||
Renderer[:collection].render(:organizations, :organization, repositories)
|
Renderer[:collection].render(:organizations, :organization, repositories, **options)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -2,8 +2,8 @@ module Travis::API::V3
|
||||||
module Renderer::Repositories
|
module Renderer::Repositories
|
||||||
extend self
|
extend self
|
||||||
|
|
||||||
def render(repositories)
|
def render(repositories, **options)
|
||||||
Renderer[:collection].render(:repositories, :repository, repositories)
|
Renderer[:collection].render(:repositories, :repository, repositories, **options)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -4,8 +4,12 @@ module Travis::API::V3
|
||||||
DEFAULTS = { active: false, default_branch: 'master' }
|
DEFAULTS = { active: false, default_branch: 'master' }
|
||||||
extend self
|
extend self
|
||||||
|
|
||||||
def render(repository)
|
def render(repository, script_name: nil, **)
|
||||||
{ :@type => 'repository'.freeze, **Renderer.get_attributes(repository, *DIRECT_ATTRIBUTES, **DEFAULTS), **nested_resources(repository) }
|
{
|
||||||
|
:@type => 'repository'.freeze,
|
||||||
|
:@href => Renderer.href(:repository, id: repository.id, script_name: script_name),
|
||||||
|
**Renderer.get_attributes(repository, *DIRECT_ATTRIBUTES, **DEFAULTS), **nested_resources(repository)
|
||||||
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
def nested_resources(repository)
|
def nested_resources(repository)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
module Travis::API::V3
|
module Travis::API::V3
|
||||||
class Result
|
class Result
|
||||||
attr_accessor :type, :resource, :status
|
attr_accessor :type, :resource, :status, :href
|
||||||
|
|
||||||
def initialize(type, resource = [], status: 200)
|
def initialize(type, resource = [], status: 200)
|
||||||
@type, @resource, @status = type, resource, status
|
@type, @resource, @status = type, resource, status
|
||||||
|
@ -15,8 +15,10 @@ module Travis::API::V3
|
||||||
self
|
self
|
||||||
end
|
end
|
||||||
|
|
||||||
def render
|
def render(params, env)
|
||||||
Renderer[type].render(resource)
|
href = self.href
|
||||||
|
href = V3.location(env) if href.nil? and env['REQUEST_METHOD'.freeze] == 'GET'.freeze
|
||||||
|
Renderer[type].render(resource, href: href, script_name: env['SCRIPT_NAME'.freeze])
|
||||||
end
|
end
|
||||||
|
|
||||||
def method_missing(method, *args)
|
def method_missing(method, *args)
|
||||||
|
|
|
@ -19,15 +19,15 @@ module Travis::API::V3
|
||||||
|
|
||||||
service = factory.new(access_control, env_params.merge(params))
|
service = factory.new(access_control, env_params.merge(params))
|
||||||
result = service.run
|
result = service.run
|
||||||
render(result, env_params)
|
render(result, env_params, env)
|
||||||
rescue Error => error
|
rescue Error => error
|
||||||
result = Result.new(:error, error)
|
result = Result.new(:error, error)
|
||||||
headers = error.status == 404 ? CASCADE : {}
|
headers = error.status == 404 ? CASCADE : {}
|
||||||
V3.response(result.render, headers, status: error.status)
|
V3.response(result.render(env_params, env), headers, status: error.status)
|
||||||
end
|
end
|
||||||
|
|
||||||
def render(result, env_params)
|
def render(result, env_params, env)
|
||||||
V3.response(result.render, status: result.status)
|
V3.response(result.render(env_params, env), status: result.status)
|
||||||
end
|
end
|
||||||
|
|
||||||
def service_index(env)
|
def service_index(env)
|
||||||
|
|
|
@ -19,6 +19,7 @@ describe Travis::API::V3::Services::Organizations::ForCurrentUser do
|
||||||
example { expect(last_response).to be_ok }
|
example { expect(last_response).to be_ok }
|
||||||
example { expect(JSON.load(body)).to be == {
|
example { expect(JSON.load(body)).to be == {
|
||||||
"@type" => "organizations",
|
"@type" => "organizations",
|
||||||
|
"@href" => "/v3/orgs",
|
||||||
"organizations" => [{
|
"organizations" => [{
|
||||||
"@type" => "organization",
|
"@type" => "organization",
|
||||||
"id" => org.id,
|
"id" => org.id,
|
||||||
|
|
|
@ -14,8 +14,10 @@ describe Travis::API::V3::Services::Repositories::ForCurrentUser do
|
||||||
example { expect(last_response).to be_ok }
|
example { expect(last_response).to be_ok }
|
||||||
example { expect(JSON.load(body)).to be == {
|
example { expect(JSON.load(body)).to be == {
|
||||||
"@type" => "repositories",
|
"@type" => "repositories",
|
||||||
|
"@href" => "/v3/repos",
|
||||||
"repositories" => [{
|
"repositories" => [{
|
||||||
"@type" => "repository",
|
"@type" => "repository",
|
||||||
|
"@href" => "/v3/repo/#{repo.id}",
|
||||||
"id" => repo.id,
|
"id" => repo.id,
|
||||||
"name" => "minimal",
|
"name" => "minimal",
|
||||||
"slug" => "svenfuchs/minimal",
|
"slug" => "svenfuchs/minimal",
|
||||||
|
@ -40,9 +42,10 @@ describe Travis::API::V3::Services::Repositories::ForCurrentUser do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "filter: private=false" do
|
describe "filter: private=false" do
|
||||||
before { get("/v3/repos", {"repository.private" => "false"}, headers) }
|
before { get("/v3/repos", {"repository.private" => "false"}, headers) }
|
||||||
example { expect(last_response) .to be_ok }
|
example { expect(last_response) .to be_ok }
|
||||||
example { expect(JSON.load(body)['repositories']) .to be == [] }
|
example { expect(JSON.load(body)['repositories']) .to be == [] }
|
||||||
|
example { expect(JSON.load(body)['@href']) .to be == "/v3/repos?repository.private=false" }
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "filter: active=false" do
|
describe "filter: active=false" do
|
||||||
|
|
|
@ -8,6 +8,7 @@ describe Travis::API::V3::Services::Repository::Find do
|
||||||
example { expect(last_response).to be_ok }
|
example { expect(last_response).to be_ok }
|
||||||
example { expect(JSON.load(body)).to be == {
|
example { expect(JSON.load(body)).to be == {
|
||||||
"@type" => "repository",
|
"@type" => "repository",
|
||||||
|
"@href" => "/v3/repo/#{repo.id}",
|
||||||
"id" => repo.id,
|
"id" => repo.id,
|
||||||
"name" => "minimal",
|
"name" => "minimal",
|
||||||
"slug" => "svenfuchs/minimal",
|
"slug" => "svenfuchs/minimal",
|
||||||
|
@ -78,6 +79,7 @@ describe Travis::API::V3::Services::Repository::Find do
|
||||||
example { expect(last_response).to be_ok }
|
example { expect(last_response).to be_ok }
|
||||||
example { expect(JSON.load(body)).to be == {
|
example { expect(JSON.load(body)).to be == {
|
||||||
"@type" => "repository",
|
"@type" => "repository",
|
||||||
|
"@href" => "/v3/repo/#{repo.id}",
|
||||||
"id" => repo.id,
|
"id" => repo.id,
|
||||||
"name" => "minimal",
|
"name" => "minimal",
|
||||||
"slug" => "svenfuchs/minimal",
|
"slug" => "svenfuchs/minimal",
|
||||||
|
@ -133,6 +135,7 @@ describe Travis::API::V3::Services::Repository::Find do
|
||||||
example { expect(last_response).to be_ok }
|
example { expect(last_response).to be_ok }
|
||||||
example { expect(JSON.load(body)).to be == {
|
example { expect(JSON.load(body)).to be == {
|
||||||
"@type" => "repository",
|
"@type" => "repository",
|
||||||
|
"@href" => "/v3/repo/#{repo.id}",
|
||||||
"id" => repo.id,
|
"id" => repo.id,
|
||||||
"name" => "minimal",
|
"name" => "minimal",
|
||||||
"slug" => "svenfuchs/minimal",
|
"slug" => "svenfuchs/minimal",
|
||||||
|
@ -194,6 +197,7 @@ describe Travis::API::V3::Services::Repository::Find do
|
||||||
example { expect(last_response).to be_ok }
|
example { expect(last_response).to be_ok }
|
||||||
example { expect(JSON.load(body)).to be == {
|
example { expect(JSON.load(body)).to be == {
|
||||||
"@type" => "repository",
|
"@type" => "repository",
|
||||||
|
"@href" => "/v3/repo/#{repo.id}",
|
||||||
"id" => repo.id,
|
"id" => repo.id,
|
||||||
"name" => "minimal",
|
"name" => "minimal",
|
||||||
"slug" => "svenfuchs/minimal",
|
"slug" => "svenfuchs/minimal",
|
||||||
|
|
Loading…
Reference in New Issue
Block a user