Merge branch 'master' into rkh-v3-enable-disable
This commit is contained in:
commit
9ea21e6352
23
Gemfile.lock
23
Gemfile.lock
|
@ -50,7 +50,7 @@ GIT
|
||||||
|
|
||||||
GIT
|
GIT
|
||||||
remote: git://github.com/travis-ci/travis-core.git
|
remote: git://github.com/travis-ci/travis-core.git
|
||||||
revision: a82f25fb00a39c3c64b8c09c716c206e6f4c6fad
|
revision: d88d5f84eaea2996c4d325f8f4906d2fdd844125
|
||||||
specs:
|
specs:
|
||||||
travis-core (0.0.1)
|
travis-core (0.0.1)
|
||||||
actionmailer (~> 3.2.19)
|
actionmailer (~> 3.2.19)
|
||||||
|
@ -61,7 +61,7 @@ GIT
|
||||||
hashr (~> 0.0.19)
|
hashr (~> 0.0.19)
|
||||||
metriks (~> 0.9.7)
|
metriks (~> 0.9.7)
|
||||||
multi_json
|
multi_json
|
||||||
pusher (~> 0.12.0)
|
pusher (~> 0.14.0)
|
||||||
railties (~> 3.2.19)
|
railties (~> 3.2.19)
|
||||||
rake
|
rake
|
||||||
redis (~> 3.0)
|
redis (~> 3.0)
|
||||||
|
@ -95,6 +95,7 @@ PATH
|
||||||
remote: .
|
remote: .
|
||||||
specs:
|
specs:
|
||||||
travis-api (0.0.1)
|
travis-api (0.0.1)
|
||||||
|
composite_primary_keys (~> 5.0)
|
||||||
memcachier
|
memcachier
|
||||||
mustermann (~> 0.4)
|
mustermann (~> 0.4)
|
||||||
pg (~> 0.13.2)
|
pg (~> 0.13.2)
|
||||||
|
@ -154,6 +155,8 @@ GEM
|
||||||
coderay (1.1.0)
|
coderay (1.1.0)
|
||||||
coercible (1.0.0)
|
coercible (1.0.0)
|
||||||
descendants_tracker (~> 0.0.1)
|
descendants_tracker (~> 0.0.1)
|
||||||
|
composite_primary_keys (5.0.14)
|
||||||
|
activerecord (~> 3.2.0, >= 3.2.9)
|
||||||
connection_pool (2.1.1)
|
connection_pool (2.1.1)
|
||||||
daemons (1.1.9)
|
daemons (1.1.9)
|
||||||
dalli (2.7.2)
|
dalli (2.7.2)
|
||||||
|
@ -168,7 +171,7 @@ GEM
|
||||||
dotenv (0.7.0)
|
dotenv (0.7.0)
|
||||||
equalizer (0.0.9)
|
equalizer (0.0.9)
|
||||||
erubis (2.7.0)
|
erubis (2.7.0)
|
||||||
eventmachine (1.0.4)
|
eventmachine (1.0.7)
|
||||||
factory_girl (2.4.2)
|
factory_girl (2.4.2)
|
||||||
activesupport
|
activesupport
|
||||||
faraday (0.9.1)
|
faraday (0.9.1)
|
||||||
|
@ -187,9 +190,9 @@ GEM
|
||||||
hashr (0.0.22)
|
hashr (0.0.22)
|
||||||
hike (1.2.3)
|
hike (1.2.3)
|
||||||
hitimes (1.2.2)
|
hitimes (1.2.2)
|
||||||
httpclient (2.3.4.1)
|
httpclient (2.6.0.1)
|
||||||
i18n (0.6.11)
|
i18n (0.6.11)
|
||||||
ice_nine (0.11.0)
|
ice_nine (0.11.1)
|
||||||
journey (1.0.4)
|
journey (1.0.4)
|
||||||
json (1.8.1)
|
json (1.8.1)
|
||||||
kgio (2.9.2)
|
kgio (2.9.2)
|
||||||
|
@ -224,10 +227,10 @@ GEM
|
||||||
coderay (~> 1.1.0)
|
coderay (~> 1.1.0)
|
||||||
method_source (~> 0.8.1)
|
method_source (~> 0.8.1)
|
||||||
slop (~> 3.4)
|
slop (~> 3.4)
|
||||||
pusher (0.12.0)
|
pusher (0.14.4)
|
||||||
httpclient (~> 2.3.0)
|
httpclient (~> 2.5)
|
||||||
multi_json (~> 1.0)
|
multi_json (~> 1.0)
|
||||||
signature (~> 0.1.6)
|
signature (~> 0.1.8)
|
||||||
rack (1.4.5)
|
rack (1.4.5)
|
||||||
rack-attack (4.2.0)
|
rack-attack (4.2.0)
|
||||||
rack
|
rack
|
||||||
|
@ -274,7 +277,7 @@ GEM
|
||||||
json
|
json
|
||||||
redis (>= 3.0.6)
|
redis (>= 3.0.6)
|
||||||
redis-namespace (>= 1.3.1)
|
redis-namespace (>= 1.3.1)
|
||||||
signature (0.1.7)
|
signature (0.1.8)
|
||||||
simple_states (1.0.1)
|
simple_states (1.0.1)
|
||||||
activesupport
|
activesupport
|
||||||
hashr (~> 0.0.10)
|
hashr (~> 0.0.10)
|
||||||
|
@ -324,7 +327,7 @@ GEM
|
||||||
raindrops (~> 0.7)
|
raindrops (~> 0.7)
|
||||||
useragent (0.10.0)
|
useragent (0.10.0)
|
||||||
uuidtools (2.1.5)
|
uuidtools (2.1.5)
|
||||||
virtus (1.0.3)
|
virtus (1.0.4)
|
||||||
axiom-types (~> 0.1)
|
axiom-types (~> 0.1)
|
||||||
coercible (~> 1.0)
|
coercible (~> 1.0)
|
||||||
descendants_tracker (~> 0.0, >= 0.0.3)
|
descendants_tracker (~> 0.0, >= 0.0.3)
|
||||||
|
|
|
@ -98,8 +98,9 @@ class Travis::Api::App
|
||||||
respond_with service(:find_branches, params), type: :branches, version: :v2
|
respond_with service(:find_branches, params), type: :branches, version: :v2
|
||||||
end
|
end
|
||||||
|
|
||||||
# Gets lastest build on a branch branches
|
# Gets latest build on a branch
|
||||||
get '/:repository_id/branches/:branch' do
|
get '/:repository_id/branches/*' do
|
||||||
|
params[:branch] = params[:splat]
|
||||||
respond_with service(:find_branch, params), type: :branch, version: :v2
|
respond_with service(:find_branch, params), type: :branch, version: :v2
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -170,8 +171,9 @@ class Travis::Api::App
|
||||||
respond_with service(:find_branches, params), type: :branches, version: :v2
|
respond_with service(:find_branches, params), type: :branches, version: :v2
|
||||||
end
|
end
|
||||||
|
|
||||||
# Gets lastest build on a branch branches
|
# Gets latest build on a branch
|
||||||
get '/:owner_name/:name/branches/:branch' do
|
get '/:owner_name/:name/branches/*' do
|
||||||
|
params[:branch] = params[:splat]
|
||||||
respond_with service(:find_branch, params), type: :branch, version: :v2
|
respond_with service(:find_branch, params), type: :branch, version: :v2
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,7 @@ module Travis
|
||||||
end
|
end
|
||||||
|
|
||||||
extend self
|
extend self
|
||||||
|
load_dir("#{__dir__}/v3/extensions")
|
||||||
load_dir("#{__dir__}/v3")
|
load_dir("#{__dir__}/v3")
|
||||||
|
|
||||||
ClientError = Error .create(status: 400)
|
ClientError = Error .create(status: 400)
|
||||||
|
|
|
@ -24,6 +24,10 @@ module Travis::API::V3
|
||||||
visible? build.repository
|
visible? build.repository
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def branch_visible?(branch)
|
||||||
|
visible? branch.repository
|
||||||
|
end
|
||||||
|
|
||||||
def organization_visible?(organization)
|
def organization_visible?(organization)
|
||||||
unrestricted_api?
|
unrestricted_api?
|
||||||
end
|
end
|
||||||
|
@ -52,8 +56,17 @@ module Travis::API::V3
|
||||||
private
|
private
|
||||||
|
|
||||||
def dispatch(object, method = caller_locations.first.base_label)
|
def dispatch(object, method = caller_locations.first.base_label)
|
||||||
method = object.class.name.underscore + ?_.freeze + method
|
method = method_for(object.class, method)
|
||||||
send(method, object) if respond_to?(method, true)
|
send(method, object) if respond_to?(method, true)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@@method_for_cache = Tool::ThreadLocal.new
|
||||||
|
|
||||||
|
def method_for(type, method)
|
||||||
|
@@method_for_cache[[type, method]] ||= begin
|
||||||
|
prefix = type.name.sub(/^Travis::API::V3::Models::/, ''.freeze).underscore
|
||||||
|
"#{prefix}_#{method}"
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,6 +5,7 @@ module Travis::API::V3
|
||||||
attr_reader :user, :permissions
|
attr_reader :user, :permissions
|
||||||
|
|
||||||
def initialize(user)
|
def initialize(user)
|
||||||
|
user = Models::User.find(user.id) if user.is_a? ::User
|
||||||
@user = user
|
@user = user
|
||||||
@permissions = user.permissions.where(user_id: user.id)
|
@permissions = user.permissions.where(user_id: user.id)
|
||||||
super()
|
super()
|
||||||
|
|
49
lib/travis/api/v3/extensions/belongs_to.rb
Normal file
49
lib/travis/api/v3/extensions/belongs_to.rb
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
module Travis::API::V3
|
||||||
|
module Extensions
|
||||||
|
# This is a patch to ActiveRecord to allow classes for polymorphic relations to be nested in a module without the
|
||||||
|
# module name being part of the type field.
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
#
|
||||||
|
# # Without this patch
|
||||||
|
# Repository.find(2).owner.class # => User
|
||||||
|
# Travis::API::V3::Models::Repository.find(2).owner.class # => User
|
||||||
|
#
|
||||||
|
# # With this patch
|
||||||
|
# Repository.find(2).owner.class # => User
|
||||||
|
# Travis::API::V3::Models::Repository.find(2).owner.class # => Travis::API::V3::Models::User
|
||||||
|
#
|
||||||
|
# ActiveRecord does not support this out of the box. We accomplish this feature by tracking polymorphic relations
|
||||||
|
# and then adding the namespace when calling ActiveRecord::Base#[] with the foreign type key and removing it again
|
||||||
|
# in ActiveRecord::Base#[]=, so we don't break other code by accidentially writing the prefixed version to the
|
||||||
|
# database.
|
||||||
|
module BelongsTo
|
||||||
|
module ClassMethods
|
||||||
|
def polymorfic_foreign_types
|
||||||
|
@polymorfic_foreign_types ||= []
|
||||||
|
end
|
||||||
|
|
||||||
|
def belongs_to(field, options = {})
|
||||||
|
polymorfic_foreign_types << (options[:foreign_type] || "#{field}_type") if options[:polymorphic]
|
||||||
|
super
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.included(base)
|
||||||
|
base.extend(ClassMethods)
|
||||||
|
super
|
||||||
|
end
|
||||||
|
|
||||||
|
def [](key)
|
||||||
|
value = super
|
||||||
|
value &&= "#{self.class.parent}::#{value}" if self.class.polymorfic_foreign_types.include?(key)
|
||||||
|
value
|
||||||
|
end
|
||||||
|
|
||||||
|
def []=(key, value)
|
||||||
|
value &&= value.sub("#{self.class.parent}::", ''.freeze) if self.class.polymorfic_foreign_types.include?(key)
|
||||||
|
super(key, value)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
6
lib/travis/api/v3/model.rb
Normal file
6
lib/travis/api/v3/model.rb
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
module Travis::API::V3
|
||||||
|
class Model < ActiveRecord::Base
|
||||||
|
include Extensions::BelongsTo
|
||||||
|
self.abstract_class = true
|
||||||
|
end
|
||||||
|
end
|
7
lib/travis/api/v3/models.rb
Normal file
7
lib/travis/api/v3/models.rb
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
require 'composite_primary_keys'
|
||||||
|
|
||||||
|
module Travis::API::V3
|
||||||
|
module Models
|
||||||
|
extend ConstantResolver
|
||||||
|
end
|
||||||
|
end
|
8
lib/travis/api/v3/models/branch.rb
Normal file
8
lib/travis/api/v3/models/branch.rb
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
module Travis::API::V3
|
||||||
|
class Models::Branch < Model
|
||||||
|
belongs_to :repository
|
||||||
|
belongs_to :last_build, class_name: 'Travis::API::V3::Models::Build'.freeze
|
||||||
|
has_many :builds, foreign_key: [:repository_id, :branch], primary_key: [:repository_id, :name], order: 'id DESC'.freeze, conditions: { event_type: 'push' }
|
||||||
|
has_many :commits, foreign_key: [:repository_id, :branch], primary_key: [:repository_id, :name], order: 'id DESC'.freeze
|
||||||
|
end
|
||||||
|
end
|
5
lib/travis/api/v3/models/broadcast.rb
Normal file
5
lib/travis/api/v3/models/broadcast.rb
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
module Travis::API::V3
|
||||||
|
class Models::Broadcast < Model
|
||||||
|
belongs_to :recipient, polymorphic: true
|
||||||
|
end
|
||||||
|
end
|
10
lib/travis/api/v3/models/build.rb
Normal file
10
lib/travis/api/v3/models/build.rb
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
module Travis::API::V3
|
||||||
|
class Models::Build < Model
|
||||||
|
belongs_to :repository
|
||||||
|
belongs_to :commit
|
||||||
|
belongs_to :request
|
||||||
|
belongs_to :repository, autosave: true
|
||||||
|
belongs_to :owner, polymorphic: true
|
||||||
|
has_many :jobs, as: :source, order: :id, dependent: :destroy
|
||||||
|
end
|
||||||
|
end
|
6
lib/travis/api/v3/models/commit.rb
Normal file
6
lib/travis/api/v3/models/commit.rb
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
module Travis::API::V3
|
||||||
|
class Models::Commit < Model
|
||||||
|
belongs_to :repository
|
||||||
|
has_one :request
|
||||||
|
end
|
||||||
|
end
|
5
lib/travis/api/v3/models/email.rb
Normal file
5
lib/travis/api/v3/models/email.rb
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
module Travis::API::V3
|
||||||
|
class Models::Email < Model
|
||||||
|
belongs_to :user
|
||||||
|
end
|
||||||
|
end
|
10
lib/travis/api/v3/models/job.rb
Normal file
10
lib/travis/api/v3/models/job.rb
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
module Travis::API::V3
|
||||||
|
class Models::Job < Model
|
||||||
|
has_one :log, dependent: :destroy
|
||||||
|
belongs_to :repository
|
||||||
|
belongs_to :commit
|
||||||
|
belongs_to :build, autosave: true, foreign_key: 'source_id'
|
||||||
|
belongs_to :owner, polymorphic: true
|
||||||
|
serialize :config
|
||||||
|
end
|
||||||
|
end
|
7
lib/travis/api/v3/models/log.rb
Normal file
7
lib/travis/api/v3/models/log.rb
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
module Travis::API::V3
|
||||||
|
class Models::Log < Model
|
||||||
|
belongs_to :job
|
||||||
|
belongs_to :removed_by, class_name: 'User', foreign_key: :removed_by
|
||||||
|
has_many :log_parts, dependent: :destroy
|
||||||
|
end
|
||||||
|
end
|
5
lib/travis/api/v3/models/log_part.rb
Normal file
5
lib/travis/api/v3/models/log_part.rb
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
module Travis::API::V3
|
||||||
|
class Models::LogPart < Model
|
||||||
|
belongs_to :log
|
||||||
|
end
|
||||||
|
end
|
6
lib/travis/api/v3/models/membership.rb
Normal file
6
lib/travis/api/v3/models/membership.rb
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
module Travis::API::V3
|
||||||
|
class Models::Membership < Model
|
||||||
|
belongs_to :user
|
||||||
|
belongs_to :organization
|
||||||
|
end
|
||||||
|
end
|
7
lib/travis/api/v3/models/organization.rb
Normal file
7
lib/travis/api/v3/models/organization.rb
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
module Travis::API::V3
|
||||||
|
class Models::Organization < Model
|
||||||
|
has_many :memberships
|
||||||
|
has_many :users, through: :memberships
|
||||||
|
has_many :repositories, as: :owner
|
||||||
|
end
|
||||||
|
end
|
6
lib/travis/api/v3/models/permission.rb
Normal file
6
lib/travis/api/v3/models/permission.rb
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
module Travis::API::V3
|
||||||
|
class Models::Permission < Model
|
||||||
|
belongs_to :user
|
||||||
|
belongs_to :repository
|
||||||
|
end
|
||||||
|
end
|
56
lib/travis/api/v3/models/repository.rb
Normal file
56
lib/travis/api/v3/models/repository.rb
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
module Travis::API::V3
|
||||||
|
class Models::Repository < Model
|
||||||
|
has_many :commits, dependent: :delete_all
|
||||||
|
has_many :requests, dependent: :delete_all
|
||||||
|
has_many :branches, dependent: :delete_all, order: 'id DESC'.freeze
|
||||||
|
has_many :builds, dependent: :delete_all, order: 'id DESC'.freeze
|
||||||
|
has_many :permissions, dependent: :delete_all
|
||||||
|
has_many :users, through: :permissions
|
||||||
|
|
||||||
|
belongs_to :owner, polymorphic: true
|
||||||
|
|
||||||
|
has_one :last_build,
|
||||||
|
class_name: 'Travis::API::V3::Models::Build'.freeze,
|
||||||
|
order: 'id DESC'.freeze
|
||||||
|
|
||||||
|
has_one :default_branch,
|
||||||
|
foreign_key: [:repository_id, :name],
|
||||||
|
primary_key: [:id, :default_branch],
|
||||||
|
class_name: 'Travis::API::V3::Models::Branch'.freeze
|
||||||
|
|
||||||
|
after_initialize do
|
||||||
|
update_attributes! default_branch_name: 'master'.freeze unless default_branch_name
|
||||||
|
end
|
||||||
|
|
||||||
|
def slug
|
||||||
|
@slug ||= "#{owner_name}/#{name}"
|
||||||
|
end
|
||||||
|
|
||||||
|
def default_branch_name
|
||||||
|
read_attribute(:default_branch)
|
||||||
|
end
|
||||||
|
|
||||||
|
def default_branch_name=(value)
|
||||||
|
write_attribute(:default_branch, value)
|
||||||
|
end
|
||||||
|
|
||||||
|
def default_branch
|
||||||
|
super || branch(default_branch_name, create_without_build: true)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Creates a branch object on the fly if it doesn't exist.
|
||||||
|
#
|
||||||
|
# Will not create a branch object if we don't have any builds for it unless
|
||||||
|
# the create_without_build option is set to true.
|
||||||
|
def branch(name, create_without_build: false)
|
||||||
|
return nil unless branch = branches.where(name: name).first_or_initialize
|
||||||
|
return branch unless branch.new_record?
|
||||||
|
return nil unless create_without_build or branch.builds.any?
|
||||||
|
branch.last_build = branch.builds.first
|
||||||
|
branch.save!
|
||||||
|
branch
|
||||||
|
rescue ActiveRecord::RecordNotUnique
|
||||||
|
branches.where(name: name).first
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
10
lib/travis/api/v3/models/request.rb
Normal file
10
lib/travis/api/v3/models/request.rb
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
module Travis::API::V3
|
||||||
|
class Models::Request < Model
|
||||||
|
belongs_to :commit
|
||||||
|
belongs_to :repository
|
||||||
|
belongs_to :owner, polymorphic: true
|
||||||
|
has_many :builds
|
||||||
|
serialize :config
|
||||||
|
serialize :payload
|
||||||
|
end
|
||||||
|
end
|
5
lib/travis/api/v3/models/ssl_key.rb
Normal file
5
lib/travis/api/v3/models/ssl_key.rb
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
module Travis::API::V3
|
||||||
|
class Models::SSLKey < Model
|
||||||
|
belongs_to :repository
|
||||||
|
end
|
||||||
|
end
|
9
lib/travis/api/v3/models/user.rb
Normal file
9
lib/travis/api/v3/models/user.rb
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
module Travis::API::V3
|
||||||
|
class Models::User < Model
|
||||||
|
has_many :memberships, dependent: :destroy
|
||||||
|
has_many :organizations, through: :memberships
|
||||||
|
has_many :permissions, dependent: :destroy
|
||||||
|
has_many :repositories, through: :permissions
|
||||||
|
has_many :emails, dependent: :destroy
|
||||||
|
end
|
||||||
|
end
|
10
lib/travis/api/v3/queries/branch.rb
Normal file
10
lib/travis/api/v3/queries/branch.rb
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
module Travis::API::V3
|
||||||
|
class Queries::Branch < Query
|
||||||
|
params :name
|
||||||
|
|
||||||
|
def find(repository)
|
||||||
|
return repository.branch(name) if name
|
||||||
|
raise WrongParams, 'missing branch.name'.freeze
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -3,8 +3,8 @@ module Travis::API::V3
|
||||||
params :id
|
params :id
|
||||||
|
|
||||||
def find
|
def find
|
||||||
return ::Build.find_by_id(id) if id
|
return Models::Build.find_by_id(id) if id
|
||||||
raise WrongParams
|
raise WrongParams, 'missing build.id'.freeze
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,8 +3,8 @@ module Travis::API::V3
|
||||||
params :id
|
params :id
|
||||||
|
|
||||||
def find
|
def find
|
||||||
return ::Organization.find_by_id(id) if id
|
return Models::Organization.find_by_id(id) if id
|
||||||
raise WrongParams
|
raise WrongParams, 'missing organization.id'.freeze
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
module Travis::API::V3
|
module Travis::API::V3
|
||||||
class Queries::Organizations < Query
|
class Queries::Organizations < Query
|
||||||
def for_member(user)
|
def for_member(user)
|
||||||
::Organization.joins(:users).where(users: user_condition(user))
|
Models::Organization.joins(:users).where(users: user_condition(user))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -8,9 +8,10 @@ module Travis::API::V3
|
||||||
|
|
||||||
def all
|
def all
|
||||||
@all ||= begin
|
@all ||= begin
|
||||||
all = ::Repository
|
all = Models::Repository
|
||||||
all = all.where(active: bool(active)) unless active.nil?
|
all = all.where(active: bool(active)) unless active.nil?
|
||||||
all = all.where(private: bool(private)) unless private.nil?
|
all = all.where(private: bool(private)) unless private.nil?
|
||||||
|
all = all.includes(:default_branch) # TODO: use includes params
|
||||||
all
|
all
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,8 +3,8 @@ module Travis::API::V3
|
||||||
params :id
|
params :id
|
||||||
|
|
||||||
def find
|
def find
|
||||||
return ::Repository.find_by_id(id) if id
|
return Models::Repository.find_by_id(id) if id
|
||||||
raise WrongParams
|
raise WrongParams, 'missing repository.id'.freeze
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -46,9 +46,9 @@ module Travis::API::V3
|
||||||
|
|
||||||
def user_condition(value)
|
def user_condition(value)
|
||||||
case value
|
case value
|
||||||
when String then { login: value }
|
when String then { login: value }
|
||||||
when Integer then { id: value }
|
when Integer then { id: value }
|
||||||
when ::User then { id: value.id }
|
when Models::User then { id: value.id }
|
||||||
else raise WrongParams
|
else raise WrongParams
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -10,13 +10,22 @@ module Travis::API::V3
|
||||||
args.select { |key, value| !value.nil? }
|
args.select { |key, value| !value.nil? }
|
||||||
end
|
end
|
||||||
|
|
||||||
def href(type, script_name: nil, **args)
|
def href(type, string_args = nil, script_name: nil, **args)
|
||||||
expander = EXPANDER_CACHE[[type, script_name, args.keys]] ||= begin
|
args.merge! string_args if string_args
|
||||||
resource = Routes.resources.detect { |r| r.identifier == type }
|
|
||||||
unprefixed = args.keys.reject { |a| a.to_s.include? ?..freeze }
|
expander = EXPANDER_CACHE[[type, script_name, args.keys]] ||= begin
|
||||||
route = resource.route
|
resource = Routes.resources.detect { |r| r.identifier == type }
|
||||||
route &&= Mustermann.new(script_name, type: :identity) + route if script_name and not script_name.empty?
|
route = resource.route
|
||||||
generate_expander(route, type, unprefixed)
|
route &&= Mustermann.new(script_name, type: :identity) + route if script_name and not script_name.empty?
|
||||||
|
key_mapping = {}
|
||||||
|
args.keys.each do |key|
|
||||||
|
case key.to_s
|
||||||
|
when /\./ then key_mapping[key.to_sym] = key unless key.is_a? Symbol
|
||||||
|
when /^(.+)_id$/ then key_mapping[:"#{$1}.id"] = key
|
||||||
|
else key_mapping[:"#{type}.#{key}"] = key
|
||||||
|
end
|
||||||
|
end
|
||||||
|
generate_expander(route, key_mapping)
|
||||||
end
|
end
|
||||||
|
|
||||||
expander.call(args)
|
expander.call(args)
|
||||||
|
@ -24,11 +33,11 @@ module Travis::API::V3
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def generate_expander(route, prefix, unprefixed)
|
def generate_expander(route, key_mapping)
|
||||||
return proc { |**| } unless route.respond_to? :expand
|
return proc { |**| } unless route.respond_to? :expand
|
||||||
proc do |**args|
|
proc do |args|
|
||||||
unprefixed.each { |key| args[:"#{prefix}.#{key}"] = args.delete(key) }
|
key_mapping.each { |a, b| args[a] = args.delete(b) }
|
||||||
route.expand(**args)
|
route.expand(:ignore, **args)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
8
lib/travis/api/v3/renderer/branch.rb
Normal file
8
lib/travis/api/v3/renderer/branch.rb
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
require 'travis/api/v3/renderer/model_renderer'
|
||||||
|
|
||||||
|
module Travis::API::V3
|
||||||
|
class Renderer::Branch < Renderer::ModelRenderer
|
||||||
|
representation(:minimal, :name, :last_build)
|
||||||
|
representation(:standard, :name, :repository, :last_build)
|
||||||
|
end
|
||||||
|
end
|
|
@ -33,8 +33,8 @@ module Travis::API::V3
|
||||||
|
|
||||||
def href
|
def href
|
||||||
return @href if defined? @href # allows setting href to nil
|
return @href if defined? @href # allows setting href to nil
|
||||||
return unless self.class.type and model.respond_to? :id and model.id
|
return unless self.class.type and model.respond_to? :attributes
|
||||||
@href = Renderer.href(self.class.type, script_name: script_name, id: model.id)
|
@href = Renderer.href(self.class.type, model.attributes, script_name: script_name)
|
||||||
end
|
end
|
||||||
|
|
||||||
def render(representation)
|
def render(representation)
|
||||||
|
@ -47,17 +47,17 @@ module Travis::API::V3
|
||||||
result
|
result
|
||||||
end
|
end
|
||||||
|
|
||||||
def render_model(model, type: model.class.name.to_sym, mode: :minimal, **options)
|
def render_model(model, type: model.class.name[/[^:]+$/].to_sym, mode: :minimal, **options)
|
||||||
Renderer[type].render(model, mode, script_name: script_name, **options)
|
Renderer[type].render(model, mode, script_name: script_name, **options)
|
||||||
end
|
end
|
||||||
|
|
||||||
def render_value(value)
|
def render_value(value)
|
||||||
case value
|
case value
|
||||||
when Hash then value.map { |k, v| [k, render_value(v)] }.to_h
|
when Hash then value.map { |k, v| [k, render_value(v)] }.to_h
|
||||||
when Array then value.map { |v | render_value(v) }
|
when Array then value.map { |v | render_value(v) }
|
||||||
when *PRIMITIVE then value
|
when *PRIMITIVE then value
|
||||||
when Time then value.strftime('%Y-%m-%dT%H:%M:%SZ')
|
when Time then value.strftime('%Y-%m-%dT%H:%M:%SZ')
|
||||||
when Travis::Model then render_model(value)
|
when Model then render_model(value)
|
||||||
else raise ArgumentError, 'cannot render %p (%p)' % [value.class, value]
|
else raise ArgumentError, 'cannot render %p (%p)' % [value.class, value]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,15 +5,6 @@ module Travis::API::V3
|
||||||
representation(:minimal, :id, :slug)
|
representation(:minimal, :id, :slug)
|
||||||
representation(:standard, :id, :name, :slug, :description, :github_language, :active, :private, :owner, :last_build, :default_branch)
|
representation(:standard, :id, :name, :slug, :description, :github_language, :active, :private, :owner, :last_build, :default_branch)
|
||||||
|
|
||||||
def default_branch
|
|
||||||
branch_name = model.default_branch || 'master'.freeze
|
|
||||||
{
|
|
||||||
:@type => 'branch'.freeze,
|
|
||||||
:name => branch_name,
|
|
||||||
:last_build => model.last_build_on(branch_name)
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
def active
|
def active
|
||||||
!!model.active
|
!!model.active
|
||||||
end
|
end
|
||||||
|
|
|
@ -15,6 +15,11 @@ module Travis::API::V3
|
||||||
get :find
|
get :find
|
||||||
post :create
|
post :create
|
||||||
end
|
end
|
||||||
|
|
||||||
|
resource :branch do
|
||||||
|
route '/branch/{branch.name}'
|
||||||
|
get :find
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
resource :repositories do
|
resource :repositories do
|
||||||
|
|
|
@ -34,7 +34,7 @@ module Travis::API::V3
|
||||||
end
|
end
|
||||||
|
|
||||||
def route(value)
|
def route(value)
|
||||||
current_resource.route = prefix + value
|
current_resource.route = Mustermann.new(prefix) + Mustermann.new(value)
|
||||||
end
|
end
|
||||||
|
|
||||||
def get(*args)
|
def get(*args)
|
||||||
|
|
|
@ -2,6 +2,7 @@ module Travis::API::V3
|
||||||
module Services
|
module Services
|
||||||
extend ConstantResolver
|
extend ConstantResolver
|
||||||
|
|
||||||
|
Branch = Module.new { extend Services }
|
||||||
Build = Module.new { extend Services }
|
Build = Module.new { extend Services }
|
||||||
Organization = Module.new { extend Services }
|
Organization = Module.new { extend Services }
|
||||||
Organizations = Module.new { extend Services }
|
Organizations = Module.new { extend Services }
|
||||||
|
|
7
lib/travis/api/v3/services/branch/find.rb
Normal file
7
lib/travis/api/v3/services/branch/find.rb
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
module Travis::API::V3
|
||||||
|
class Services::Branch::Find < Service
|
||||||
|
def run!
|
||||||
|
find(:branch, find(:repository))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -134,6 +134,30 @@ describe 'Repos' do
|
||||||
JSON.parse(result.body).should == { 'file' => 'not found' }
|
JSON.parse(result.body).should == { 'file' => 'not found' }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'GET /repos/svenfuchs/minimal/branches' do
|
||||||
|
response = get '/repos/svenfuchs/minimal/branches', {}, headers
|
||||||
|
response.should deliver_json_for(repo.last_finished_builds_by_branches, version: 'v2', type: 'branches')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'GET /repos/1/branches' do
|
||||||
|
response = get "/repos/#{repo.id}/branches", {}, headers
|
||||||
|
response.should deliver_json_for(repo.last_finished_builds_by_branches, version: 'v2', type: 'branches')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'GET /repos/svenfuchs/minimal/branches/mybranch' do
|
||||||
|
mybuild = Factory(:build, repository: repo, state: :started, commit: Factory(:commit, branch: 'mybranch'), request: Factory(:request, event_type: 'push'))
|
||||||
|
response = get "/repos/svenfuchs/minimal/branches/mybranch", {}, headers
|
||||||
|
body = JSON.parse(response.body)
|
||||||
|
body['branch']['id'].should == mybuild.id
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'GET /repos/svenfuchs/minimal/branches/my/branch' do
|
||||||
|
mybuild = Factory(:build, repository: repo, state: :started, commit: Factory(:commit, branch: 'my/branch'), request: Factory(:request, event_type: 'push'))
|
||||||
|
response = get "/repos/svenfuchs/minimal/branches/my/branch", {}, headers
|
||||||
|
body = JSON.parse(response.body)
|
||||||
|
body['branch']['id'].should == mybuild.id
|
||||||
|
end
|
||||||
|
|
||||||
describe 'GET /repos/svenfuchs/minimal.png?branch=foo,bar' do
|
describe 'GET /repos/svenfuchs/minimal.png?branch=foo,bar' do
|
||||||
let(:on_foo) { Factory(:commit, branch: 'foo') }
|
let(:on_foo) { Factory(:commit, branch: 'foo') }
|
||||||
let(:on_bar) { Factory(:commit, branch: 'bar') }
|
let(:on_bar) { Factory(:commit, branch: 'bar') }
|
||||||
|
|
17
spec/v3/extensions/belongs_to_spec.rb
Normal file
17
spec/v3/extensions/belongs_to_spec.rb
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe Travis::API::V3::Extensions::BelongsTo do
|
||||||
|
describe 'reading polymorphic relation' do
|
||||||
|
subject(:repo) { Travis::API::V3::Models::Repository.first }
|
||||||
|
example { expect(repo.owner).to be_a(Travis::API::V3::Models::User) }
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'writing polymorphic relation' do
|
||||||
|
let(:repo) { Travis::API::V3::Models::Repository.create(owner: user) }
|
||||||
|
let(:user) { Travis::API::V3::Models::User.create }
|
||||||
|
after { repo.destroy; user.destroy }
|
||||||
|
|
||||||
|
example { expect(repo.owner).to be_a(Travis::API::V3::Models::User) }
|
||||||
|
example { expect(::Repository.find(repo.id).owner).to be_a(::User) }
|
||||||
|
end
|
||||||
|
end
|
|
@ -14,6 +14,8 @@ describe Travis::API::V3::ServiceIndex do
|
||||||
"disable" => [{"request-method"=>"POST", "uri-template"=>"#{path}repo/{repository.id}/disable"}] },
|
"disable" => [{"request-method"=>"POST", "uri-template"=>"#{path}repo/{repository.id}/disable"}] },
|
||||||
"repositories" => {
|
"repositories" => {
|
||||||
"for_current_user" => [{"request-method"=>"GET", "uri-template"=>"#{path}repos"}] },
|
"for_current_user" => [{"request-method"=>"GET", "uri-template"=>"#{path}repos"}] },
|
||||||
|
"branch" => {
|
||||||
|
"find" => [{"request-method"=>"GET", "uri-template"=>"#{path}repo/{repository.id}/branch/{branch.name}"}]},
|
||||||
"build" => {
|
"build" => {
|
||||||
"find" => [{"request-method"=>"GET", "uri-template"=>"#{path}build/{build.id}"}] },
|
"find" => [{"request-method"=>"GET", "uri-template"=>"#{path}build/{build.id}"}] },
|
||||||
"organizations" => {
|
"organizations" => {
|
||||||
|
|
29
spec/v3/services/branch/find_spec.rb
Normal file
29
spec/v3/services/branch/find_spec.rb
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe Travis::API::V3::Services::Repository::Find do
|
||||||
|
let(:repo) { Travis::API::V3::Models::Repository.where(owner_name: 'svenfuchs', name: 'minimal').first }
|
||||||
|
before { repo.default_branch.save! }
|
||||||
|
|
||||||
|
describe "public repository, existing branch" do
|
||||||
|
before { get("/v3/repo/#{repo.id}/branch/master") }
|
||||||
|
example { expect(last_response).to be_ok }
|
||||||
|
example { expect(JSON.load(body)).to be == {
|
||||||
|
"@type" => "branch",
|
||||||
|
"@href" => "/v3/repo/#{repo.id}/branch/master",
|
||||||
|
"name" => "master",
|
||||||
|
"repository" => {
|
||||||
|
"@type" => "repository",
|
||||||
|
"@href" => "/v3/repo/#{repo.id}",
|
||||||
|
"id" => repo.id,
|
||||||
|
"slug" => "svenfuchs/minimal"},
|
||||||
|
"last_build" => {
|
||||||
|
"@type" => "build",
|
||||||
|
"@href" => "/v3/build/#{repo.last_build.id}",
|
||||||
|
"id" => repo.last_build.id,
|
||||||
|
"number" => "3",
|
||||||
|
"state" => "configured",
|
||||||
|
"duration" => nil,
|
||||||
|
"started_at" => "2010-11-12T13:00:00Z",
|
||||||
|
"finished_at" => nil}}}
|
||||||
|
end
|
||||||
|
end
|
|
@ -40,6 +40,7 @@ describe Travis::API::V3::Services::Repositories::ForCurrentUser do
|
||||||
"finished_at" => "2010-11-12T12:30:20Z"},
|
"finished_at" => "2010-11-12T12:30:20Z"},
|
||||||
"default_branch" => {
|
"default_branch" => {
|
||||||
"@type" => "branch",
|
"@type" => "branch",
|
||||||
|
"@href" => "/v3/repo/#{repo.id}/branch/master",
|
||||||
"name" => "master",
|
"name" => "master",
|
||||||
"last_build" => {
|
"last_build" => {
|
||||||
"@type" => "build",
|
"@type" => "build",
|
||||||
|
|
|
@ -31,6 +31,7 @@ describe Travis::API::V3::Services::Repository::Find do
|
||||||
"finished_at" => "2010-11-12T12:30:20Z"},
|
"finished_at" => "2010-11-12T12:30:20Z"},
|
||||||
"default_branch" => {
|
"default_branch" => {
|
||||||
"@type" => "branch",
|
"@type" => "branch",
|
||||||
|
"@href" => "/v3/repo/#{repo.id}/branch/master",
|
||||||
"name" => "master",
|
"name" => "master",
|
||||||
"last_build" => {
|
"last_build" => {
|
||||||
"@type" => "build",
|
"@type" => "build",
|
||||||
|
@ -114,6 +115,7 @@ describe Travis::API::V3::Services::Repository::Find do
|
||||||
"finished_at" => "2010-11-12T12:30:20Z"},
|
"finished_at" => "2010-11-12T12:30:20Z"},
|
||||||
"default_branch" => {
|
"default_branch" => {
|
||||||
"@type" => "branch",
|
"@type" => "branch",
|
||||||
|
"@href" => "/v3/repo/#{repo.id}/branch/master",
|
||||||
"name" => "master",
|
"name" => "master",
|
||||||
"last_build" => {
|
"last_build" => {
|
||||||
"@type" => "build",
|
"@type" => "build",
|
||||||
|
@ -182,6 +184,7 @@ describe Travis::API::V3::Services::Repository::Find do
|
||||||
"finished_at" => "2010-11-12T12:30:20Z"},
|
"finished_at" => "2010-11-12T12:30:20Z"},
|
||||||
"default_branch" => {
|
"default_branch" => {
|
||||||
"@type" => "branch",
|
"@type" => "branch",
|
||||||
|
"@href" => "/v3/repo/#{repo.id}/branch/master",
|
||||||
"name" => "master",
|
"name" => "master",
|
||||||
"last_build" => {
|
"last_build" => {
|
||||||
"@type" => "build",
|
"@type" => "build",
|
||||||
|
@ -256,6 +259,7 @@ describe Travis::API::V3::Services::Repository::Find do
|
||||||
"finished_at" => "2010-11-12T12:30:20Z"},
|
"finished_at" => "2010-11-12T12:30:20Z"},
|
||||||
"default_branch" => {
|
"default_branch" => {
|
||||||
"@type" => "branch",
|
"@type" => "branch",
|
||||||
|
"@href" => "/v3/repo/#{repo.id}/branch/master",
|
||||||
"name" => "master",
|
"name" => "master",
|
||||||
"last_build" => {
|
"last_build" => {
|
||||||
"@type" => "build",
|
"@type" => "build",
|
||||||
|
|
|
@ -288,14 +288,15 @@ Gem::Specification.new do |s|
|
||||||
s.add_dependency 'travis-support'
|
s.add_dependency 'travis-support'
|
||||||
s.add_dependency 'travis-core'
|
s.add_dependency 'travis-core'
|
||||||
|
|
||||||
s.add_dependency 'pg', '~> 0.13.2'
|
s.add_dependency 'pg', '~> 0.13.2'
|
||||||
s.add_dependency 'thin', '~> 1.4'
|
s.add_dependency 'composite_primary_keys', '~> 5.0'
|
||||||
s.add_dependency 'sinatra', '~> 1.3'
|
s.add_dependency 'thin', '~> 1.4'
|
||||||
s.add_dependency 'sinatra-contrib', '~> 1.3'
|
s.add_dependency 'sinatra', '~> 1.3'
|
||||||
s.add_dependency 'mustermann', '~> 0.4'
|
s.add_dependency 'sinatra-contrib', '~> 1.3'
|
||||||
s.add_dependency 'redcarpet', '~> 2.1'
|
s.add_dependency 'mustermann', '~> 0.4'
|
||||||
s.add_dependency 'rack-ssl', '~> 1.3', '>= 1.3.3'
|
s.add_dependency 'redcarpet', '~> 2.1'
|
||||||
s.add_dependency 'rack-contrib', '~> 1.1'
|
s.add_dependency 'rack-ssl', '~> 1.3', '>= 1.3.3'
|
||||||
|
s.add_dependency 'rack-contrib', '~> 1.1'
|
||||||
s.add_dependency 'memcachier'
|
s.add_dependency 'memcachier'
|
||||||
s.add_dependency 'useragent'
|
s.add_dependency 'useragent'
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue
Block a user