Merge pull request #163 from travis-ci/rkh-v3-separate-models
API v3: No longer use models from travis-core
This commit is contained in:
commit
f100a2b927
|
@ -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: 4cfa414b1d384e518d567c70d572b34a74cbf0bf
|
||||||
specs:
|
specs:
|
||||||
travis-core (0.0.1)
|
travis-core (0.0.1)
|
||||||
actionmailer (~> 3.2.19)
|
actionmailer (~> 3.2.19)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -52,8 +52,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
|
5
lib/travis/api/v3/models.rb
Normal file
5
lib/travis/api/v3/models.rb
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
module Travis::API::V3
|
||||||
|
module Models
|
||||||
|
extend ConstantResolver
|
||||||
|
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
|
23
lib/travis/api/v3/models/repository.rb
Normal file
23
lib/travis/api/v3/models/repository.rb
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
module Travis::API::V3
|
||||||
|
class Models::Repository < Model
|
||||||
|
has_many :commits, dependent: :delete_all
|
||||||
|
has_many :requests, dependent: :delete_all
|
||||||
|
has_many :builds, dependent: :delete_all
|
||||||
|
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
|
||||||
|
|
||||||
|
def slug
|
||||||
|
@slug ||= "#{owner_name}/#{name}"
|
||||||
|
end
|
||||||
|
|
||||||
|
def last_build_on(branch)
|
||||||
|
builds.order('id DESC'.freeze).where(branch: branch, event_type: 'push'.freeze).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
|
|
@ -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,7 +8,7 @@ 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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
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
|
Loading…
Reference in New Issue
Block a user