Merge pull request #277 from travis-ci/sf-cleanup-core

cleanup core
This commit is contained in:
Sven Fuchs 2016-06-21 15:28:39 +02:00 committed by GitHub
commit cf5ea374d4
403 changed files with 3306 additions and 7187 deletions

1
.rspec
View File

@ -1,2 +1,3 @@
--require spec_helper
--colour --colour
--tty --tty

View File

@ -3,10 +3,11 @@ gemspec
gem 's3', github: 'travis-ci/s3' gem 's3', github: 'travis-ci/s3'
gem 'travis-core', path: 'vendor' gem 'travis-core', path: 'vendor/travis-core'
gem 'travis-support', github: 'travis-ci/travis-support' gem 'travis-support', github: 'travis-ci/travis-support'
gem 'travis-amqp', github: 'travis-ci/travis-amqp' gem 'travis-amqp', github: 'travis-ci/travis-amqp'
gem 'travis-config', '~> 0.1.0' gem 'travis-config', '~> 0.1.0'
gem 'travis-settings', github: 'travis-ci/travis-settings'
gem 'travis-sidekiqs', github: 'travis-ci/travis-sidekiqs' gem 'travis-sidekiqs', github: 'travis-ci/travis-sidekiqs'
gem 'travis-yaml', github: 'travis-ci/travis-yaml' gem 'travis-yaml', github: 'travis-ci/travis-yaml'

View File

@ -45,6 +45,14 @@ GIT
specs: specs:
travis-migrations (0.0.2) travis-migrations (0.0.2)
GIT
remote: git://github.com/travis-ci/travis-settings.git
revision: d510e63b6c6f059cccae141c265e7a0c7236d1fd
specs:
travis-settings (0.0.1)
activemodel
virtus
GIT GIT
remote: git://github.com/travis-ci/travis-sidekiqs.git remote: git://github.com/travis-ci/travis-sidekiqs.git
revision: c5d4a4abc6c3737f9c43d3333efb94daa18b9fbb revision: c5d4a4abc6c3737f9c43d3333efb94daa18b9fbb
@ -69,7 +77,6 @@ PATH
remote: . remote: .
specs: specs:
travis-api (0.0.1) travis-api (0.0.1)
actionmailer (~> 3.2.19)
activerecord (~> 3.2.19) activerecord (~> 3.2.19)
coder (~> 0.4.0) coder (~> 0.4.0)
composite_primary_keys (~> 5.0) composite_primary_keys (~> 5.0)
@ -94,10 +101,9 @@ PATH
virtus (~> 1.0.0) virtus (~> 1.0.0)
PATH PATH
remote: vendor remote: vendor/travis-core
specs: specs:
travis-core (0.0.1) travis-core (0.0.1)
actionmailer (~> 3.2.19)
activerecord (~> 3.2.19) activerecord (~> 3.2.19)
coder (~> 0.4.0) coder (~> 0.4.0)
data_migrations (~> 0.0.1) data_migrations (~> 0.0.1)
@ -120,9 +126,6 @@ PATH
GEM GEM
remote: https://rubygems.org/ remote: https://rubygems.org/
specs: specs:
actionmailer (3.2.22.2)
actionpack (= 3.2.22.2)
mail (~> 2.5.4)
actionpack (3.2.22.2) actionpack (3.2.22.2)
activemodel (= 3.2.22.2) activemodel (= 3.2.22.2)
activesupport (= 3.2.22.2) activesupport (= 3.2.22.2)
@ -231,9 +234,6 @@ GEM
logging (2.1.0) logging (2.1.0)
little-plugger (~> 1.1) little-plugger (~> 1.1)
multi_json (~> 1.10) multi_json (~> 1.10)
mail (2.5.4)
mime-types (~> 1.16)
treetop (~> 1.4.8)
memcachier (0.0.2) memcachier (0.0.2)
memoist (0.14.0) memoist (0.14.0)
metaclass (0.0.4) metaclass (0.0.4)
@ -254,7 +254,6 @@ GEM
net-http-pipeline (1.0.1) net-http-pipeline (1.0.1)
os (0.9.6) os (0.9.6)
pg (0.18.4) pg (0.18.4)
polyglot (0.3.5)
proxies (0.2.1) proxies (0.2.1)
pry (0.10.3) pry (0.10.3)
coderay (~> 1.1.0) coderay (~> 1.1.0)
@ -359,9 +358,6 @@ GEM
tool (0.2.3) tool (0.2.3)
travis-config (0.1.4) travis-config (0.1.4)
hashr (~> 0.0) hashr (~> 0.0)
treetop (1.4.15)
polyglot
polyglot (>= 0.3.1)
tzinfo (0.3.49) tzinfo (0.3.49)
uber (0.0.15) uber (0.0.15)
unicorn (5.1.0) unicorn (5.1.0)
@ -415,6 +411,7 @@ DEPENDENCIES
travis-config (~> 0.1.0) travis-config (~> 0.1.0)
travis-core! travis-core!
travis-migrations! travis-migrations!
travis-settings!
travis-sidekiqs! travis-sidekiqs!
travis-support! travis-support!
travis-yaml! travis-yaml!

View File

@ -9,41 +9,36 @@ namespace :db do
end end
end end
begin # begin
require 'rspec' # require 'rspec'
require 'rspec/core/rake_task' # require 'rspec/core/rake_task'
RSpec::Core::RakeTask.new(:spec) # RSpec::Core::RakeTask.new(:spec)
#
# RSpec::Core::RakeTask.new(:spec_core) do |t|
# t.pattern = 'spec_core/**{,/*/**}/*_spec.rb'
# end
#
# task :default => [:spec, :spec_core]
# rescue LoadError => e
# puts e.inspect
# end
RSpec::Core::RakeTask.new(:spec_core) do |t| # not sure how else to include the spec_helper
t.pattern = 'spec_core/**{,/*/**}/*_spec.rb' namespace :spec do
desc 'Run all specs'
task :all do
sh 'bundle exec rspec -r spec_helper spec spec_core'
end end
task :default => [:spec, :spec_core] desc 'Run api specs'
rescue LoadError => e task :api do
puts e.inspect sh 'bundle exec rspec -r spec_helper spec'
end end
desc "generate gemspec" desc 'Run core specs'
task 'travis-api.gemspec' do task :core do
content = File.read 'travis-api.gemspec' sh 'bundle exec rspec -r spec_helper spec_core'
end
fields = {
authors: `git shortlog -sn`.scan(/[^\d\s].*/),
email: `git shortlog -sne`.scan(/[^<]+@[^>]+/),
files: `git ls-files`.split("\n").reject { |f| f =~ /^(\.|Gemfile)/ }
}
fields.each do |field, values|
updated = " s.#{field} = ["
updated << values.map { |v| "\n %p" % v }.join(',')
updated << "\n ]"
content.sub!(/ s\.#{field} = \[\n( .*\n)* \]/, updated)
end end
File.open('travis-api.gemspec', 'w') { |f| f << content } task :default => :'spec:all'
end
task default: 'travis-api.gemspec'
## can this be removed? what other rakefiles need to be included?
# tasks_path = File.expand_path('../lib/tasks/*.rake', __FILE__)
# Dir.glob(tasks_path).each { |r| import r }

View File

@ -1,35 +1,13 @@
require 'pusher' require 'pusher'
require 'travis/support' require 'travis/support'
require 'travis/support/database' require 'travis/support/database'
require 'travis_core/version' require 'travis/version'
require 'travis/redis_pool' require 'travis/redis_pool'
require 'travis/errors' require 'travis/errors'
require 'travis/commit_command'
# travis-core holds the central parts of the model layer used in both travis-ci
# (i.e. the web application) as well as travis-hub (a non-rails ui-less JRuby
# application that receives, processes and distributes messages from/to the
# workers and issues various events like email, pusher, irc notifications and
# so on).
#
# travis/model - contains ActiveRecord models that and model the main
# parts of the domain logic (e.g. repository, build, job
# etc.) and issue events on state changes (e.g.
# build:created, job:test:finished etc.)
# travis/event - contains event handlers that register for certain
# events and send out such things as email, pusher, irc
# notifications, archive builds or queue jobs for the
# workers.
# travis/mailer - contains ActionMailers for sending out email
# notifications
#
# travis-core also contains some helper classes and modules like Travis::Database
# (needed in travis-hub in order to connect to the database) and Travis::Renderer
# (our inferior layer on top of Rabl).
module Travis module Travis
class << self class << self
def services=(services) def services=(services)
# Travis.logger.info("Using services: #{services}")
@services = services @services = services
end end
@ -42,11 +20,10 @@ module Travis
require 'travis/task' require 'travis/task'
require 'travis/event' require 'travis/event'
require 'travis/addons' require 'travis/addons'
require 'travis/api' require 'travis/api/serialize'
require 'travis/config/defaults' require 'travis/config/defaults'
require 'travis/features' require 'travis/features'
require 'travis/github' require 'travis/github'
require 'travis/mailer'
require 'travis/notification' require 'travis/notification'
require 'travis/services' require 'travis/services'

View File

@ -26,10 +26,14 @@ require 'metriks/reporter/logger'
require 'metriks/librato_metrics_reporter' require 'metriks/librato_metrics_reporter'
require 'travis/support/log_subscriber/active_record_metrics' require 'travis/support/log_subscriber/active_record_metrics'
require 'fileutils' require 'fileutils'
module Travis::Api
end
require 'travis/api/app/endpoint' require 'travis/api/app/endpoint'
require 'travis/api/app/middleware' require 'travis/api/app/middleware'
require 'travis/api/instruments' require 'travis/api/instruments'
require 'travis/api/v2/http' require 'travis/api/serialize/v2'
require 'travis/api/v3' require 'travis/api/v3'
require 'travis/api/app/stack_instrumentation' require 'travis/api/app/stack_instrumentation'
require 'travis/api/app/error_handling' require 'travis/api/app/error_handling'
@ -88,14 +92,13 @@ module Travis::Api
def initialize def initialize
@app = Rack::Builder.app do @app = Rack::Builder.app do
# if stackprof = ENV['STACKPROF']
if stackprof = ENV['STACKPROF'] # require 'stackprof'
require 'stackprof' # modes = ['wall', 'cpu', 'object', 'custom']
modes = ['wall', 'cpu', 'object', 'custom'] # mode = modes.include?(stackprof) ? stackprof.to_sym : :cpu
mode = modes.include?(stackprof) ? stackprof.to_sym : :cpu # Travis.logger.info "Setting up profiler: #{mode}"
Travis.logger.info "Setting up profiler: #{mode}" # use StackProf::Middleware, enabled: true, save_every: 1, mode: mode
use StackProf::Middleware, enabled: true, save_every: 1, mode: mode # end
end
extend StackInstrumentation extend StackInstrumentation
use Travis::Api::App::Middleware::Skylight use Travis::Api::App::Middleware::Skylight

View File

@ -1,8 +1,10 @@
require 'travis/api/app'
require 'addressable/uri' require 'addressable/uri'
require 'faraday' require 'faraday'
require 'securerandom' require 'securerandom'
require 'customerio' require 'customerio'
require 'travis/api/app'
require 'travis/github/education'
require 'travis/github/oauth'
class Travis::Api::App class Travis::Api::App
class Endpoint class Endpoint
@ -186,7 +188,7 @@ class Travis::Api::App
end end
def serialize_user(user) def serialize_user(user)
rendered = Travis::Api.data(user, version: :v2) rendered = Travis::Api::Serialize.data(user, version: :v2)
rendered['user'].merge('token' => user.tokens.first.try(:token).to_s) rendered['user'].merge('token' => user.tokens.first.try(:token).to_s)
end end
@ -287,8 +289,11 @@ class Travis::Api::App
user.update_attributes info user.update_attributes info
else else
self.user = ::User.create! info self.user = ::User.create! info
Travis.run_service(:sync_user, user)
end end
Travis::Github::Oauth.update_scopes(user) # unless Travis.env == 'test'
nullify_logins(user.github_id, user.login) nullify_logins(user.github_id, user.login)
end end
@ -340,7 +345,7 @@ class Travis::Api::App
end end
def acceptable?(scopes, lossy = false) def acceptable?(scopes, lossy = false)
User::Oauth.wanted_scopes.all? do |scope| Travis::Github::Oauth.wanted_scopes.all? do |scope|
acceptable_scopes_for(scope, lossy).any? { |s| scopes.include? s } acceptable_scopes_for(scope, lossy).any? { |s| scopes.include? s }
end end
end end

View File

@ -22,6 +22,11 @@ class Travis::Api::App
status 404 status 404
else else
# DEPRECATED: this will be removed by 1st of December # DEPRECATED: this will be removed by 1st of December
#
# TODO It seems this endpoint is still in use, quite a bit:
# https://metrics.librato.com/s/metrics/api.request.restart?duration=2419200&q=api.request.restart
#
# I think we need to properly deprecate this by publishing a blog post.
Metriks.meter("api.request.restart").mark Metriks.meter("api.request.restart").mark
respond_with service(:reset_model, params) respond_with service(:reset_model, params)
end end

View File

@ -1,3 +1,5 @@
require 'travis/api/serialize'
class Travis::Api::App class Travis::Api::App
module Responders module Responders
class Json < Base class Json < Base
@ -46,7 +48,7 @@ class Travis::Api::App
if defined?(@builder) if defined?(@builder)
@builder @builder
else else
@builder = Travis::Api.builder(resource, { :version => version }.merge(options)) @builder = Travis::Api::Serialize.builder(resource, { :version => version }.merge(options))
end end
end end

View File

@ -0,0 +1,68 @@
require 'travis/api/serialize/formats'
require 'travis/api/serialize/v0'
require 'travis/api/serialize/v1'
module Travis
module Api
module Serialize
DEFAULT_VERSION = 'v2'
class << self
def data(resource, options = {})
new(resource, options).data
end
def builder(resource, options = {})
target = (options[:for] || 'http').to_s.camelize
version = (options[:version] || default_version(options)).to_s.camelize
type = (options[:type] || type_for(resource)).to_s.camelize.split('::')
([version, target] + type).inject(self) do |const, name|
begin
if const && const.const_defined?(name.to_s.camelize, false)
const.const_get(name, false)
else
nil
end
rescue NameError
nil
end
end
end
def new(resource, options = {})
builder = builder(resource, options) || raise(ArgumentError, "cannot serialize #{resource.inspect}, options: #{options.inspect}")
builder.new(resource, options[:params] || {})
end
private
def type_for(resource)
if arel_relation?(resource)
type = resource.klass.name.pluralize
else
type = resource.class
type = type.base_class if active_record?(type)
type = type.name
end
type.split('::').last
end
def arel_relation?(object)
object.respond_to?(:klass)
end
def active_record?(object)
object.respond_to?(:base_class)
end
def default_version(options)
if options[:for].to_s.downcase == "pusher"
"v0"
else
DEFAULT_VERSION
end
end
end
end
end
end

View File

@ -0,0 +1,11 @@
module Travis
module Api
module Serialize
module Formats
def format_date(date)
date && date.strftime('%Y-%m-%dT%H:%M:%SZ')
end
end
end
end
end

View File

@ -0,0 +1,25 @@
require 'active_model_serializers'
module Travis
module Api
module Serialize
class ObjectSerializer < ActiveModel::Serializer
def data
as_json
end
end
class ArraySerializer < ActiveModel::ArraySerializer
def data
as_json
end
def initialize(resource, options)
options[:each_serializer] ||= V2::Http.const_get(options[:root].to_s.singularize.camelize)
super(resource, options)
end
end
end
end
end

View File

@ -0,0 +1,6 @@
# V0 is an internal api that we can change at any time
require 'travis/api/serialize/v0/event'
require 'travis/api/serialize/v0/notification'
require 'travis/api/serialize/v0/pusher'
require 'travis/api/serialize/v0/worker'

View File

@ -0,0 +1,2 @@
require 'travis/api/serialize/v0/event/build'
require 'travis/api/serialize/v0/event/job'

View File

@ -0,0 +1,96 @@
module Travis
module Api
module Serialize
module V0
module Event
class Build
include Formats
attr_reader :build, :repository, :request, :commit, :options
def initialize(build, options = {})
@build = build
@repository = build.repository
@request = build.request
@commit = build.commit
# @options = options
end
def data(extra = {})
{
'repository' => repository_data,
'request' => request_data,
'commit' => commit_data,
'build' => build_data,
'jobs' => build.matrix.map { |job| job_data(job) }
}
end
private
def build_data
{
'id' => build.id,
'repository_id' => build.repository_id,
'commit_id' => build.commit_id,
'number' => build.number,
'pull_request' => build.pull_request?,
'pull_request_number' => build.pull_request_number,
'config' => build.config.try(:except, :source_key),
'state' => build.state.to_s,
'previous_state' => build.previous_state.to_s,
'started_at' => format_date(build.started_at),
'finished_at' => format_date(build.finished_at),
'duration' => build.duration,
'job_ids' => build.matrix_ids
}
end
def repository_data
{
'id' => repository.id,
'key' => repository.key.try(:public_key),
'slug' => repository.slug,
'name' => repository.name,
'owner_email' => repository.owner_email,
'owner_avatar_url' => repository.owner.try(:avatar_url)
}
end
def request_data
{
'token' => request.token,
'head_commit' => (request.head_commit || '')
}
end
def commit_data
{
'id' => commit.id,
'sha' => commit.commit,
'branch' => commit.branch,
'message' => commit.message,
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'compare_url' => commit.compare_url,
}
end
def job_data(job)
{
'id' => job.id,
'number' => job.number,
'state' => job.state.to_s,
'tags' => job.tags
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,37 @@
module Travis
module Api
module Serialize
module V0
module Event
class Job
include Formats
attr_reader :job
def initialize(job, options = {})
@job = job
# @options = options
end
def data(extra = {})
{
'job' => job_data,
}
end
private
def job_data
{
'queue' => job.queue,
'created_at' => job.created_at,
'started_at' => job.started_at,
'finished_at' => job.finished_at,
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,3 @@
require 'travis/api/serialize/v0/notification/build'
require 'travis/api/serialize/v0/notification/repository'
require 'travis/api/serialize/v0/notification/user'

View File

@ -0,0 +1,29 @@
module Travis
module Api
module Serialize
module V0
module Notification
class Build
attr_reader :build
def initialize(build, options = {})
@build = build
end
def data
{
'build' => build_data
}
end
def build_data
{
'id' => build.id
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,30 @@
module Travis
module Api
module Serialize
module V0
module Notification
class Repository
attr_reader :repository
def initialize(repository, options = {})
@repository = repository
end
def data
{
'repository' => repository_data
}
end
def repository_data
{
'id' => repository.id,
'slug' => repository.slug
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,30 @@
module Travis
module Api
module Serialize
module V0
module Notification
class User
attr_reader :user
def initialize(user, options = {})
@user = user
end
def data
{
'user' => user_data
}
end
def user_data
{
'id' => user.id,
'login' => user.login
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,3 @@
require 'travis/api/serialize/v0/pusher/annotation'
require 'travis/api/serialize/v0/pusher/build'
require 'travis/api/serialize/v0/pusher/job'

View File

@ -0,0 +1,35 @@
require 'travis/api/serialize/v0/pusher/annotation/created'
require 'travis/api/serialize/v0/pusher/annotation/updated'
module Travis
module Api
module Serialize
module V0
module Pusher
class Annotation
include Formats
attr_reader :annotation
def initialize(annotation, options = {})
@annotation = annotation
end
def data
{
"annotation" => {
"id" => annotation.id,
"job_id" => annotation.job_id,
"description" => annotation.description,
"url" => annotation.url,
"status" => annotation.status,
"provider_name" => annotation.annotation_provider.name,
}
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Travis
module Api
module Serialize
module V0
module Pusher
class Annotation
class Created < Annotation
end
end
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Travis
module Api
module Serialize
module V0
module Pusher
class Annotation
class Updated < Annotation
end
end
end
end
end
end
end

View File

@ -0,0 +1,112 @@
require 'travis/api/serialize/v0/pusher/build/canceled'
require 'travis/api/serialize/v0/pusher/build/created'
require 'travis/api/serialize/v0/pusher/build/received'
require 'travis/api/serialize/v0/pusher/build/started'
require 'travis/api/serialize/v0/pusher/build/finished'
module Travis
module Api
module Serialize
module V0
module Pusher
class Build
include Formats
attr_reader :build, :options
def initialize(build, options = {})
@build = build
@options = options
end
def data
{
'build' => build_data(build),
'commit' => commit_data(build.commit),
'repository' => repository_data(build.repository)
}
end
private
def build_data(build)
commit = build.commit
{
'id' => build.id,
'repository_id' => build.repository_id,
'commit_id' => build.commit_id,
'number' => build.number,
'pull_request' => build.pull_request?,
'pull_request_title' => build.pull_request_title,
'pull_request_number' => build.pull_request_number,
'state' => build.state.to_s,
'started_at' => format_date(build.started_at),
'finished_at' => format_date(build.finished_at),
'duration' => build.duration,
'job_ids' => build.matrix_ids,
'event_type' => build.event_type,
# this is a legacy thing, we should think about removing it
'commit' => commit.commit,
'branch' => commit.branch,
'message' => commit.message,
'compare_url' => commit.compare_url,
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email
}
end
def commit_data(commit)
{
'id' => commit.id,
'sha' => commit.commit,
'branch' => commit.branch,
'message' => commit.message,
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'compare_url' => commit.compare_url,
}
end
def repository_data(repository)
{
'id' => repository.id,
'slug' => repository.slug,
'description' => repository.description,
'private' => repository.private,
'last_build_id' => repository.last_build_id,
'last_build_number' => repository.last_build_number,
'last_build_state' => repository.last_build_state.to_s,
'last_build_duration' => repository.last_build_duration,
'last_build_language' => nil,
'last_build_started_at' => format_date(repository.last_build_started_at),
'last_build_finished_at' => format_date(repository.last_build_finished_at),
'github_language' => repository.github_language,
'default_branch' => {
'name' => repository.default_branch,
'last_build_id' => last_build_on_default_branch_id(repository)
},
'active' => repository.active,
'current_build_id' => repository.current_build_id
}
end
def last_build_on_default_branch_id(repository)
default_branch = Branch.where(repository_id: repository.id, name: repository.default_branch).first
if default_branch
default_branch.last_build_id
end
end
end
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Travis
module Api
module Serialize
module V0
module Pusher
class Build
class Canceled < Build
end
end
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Travis
module Api
module Serialize
module V0
module Pusher
class Build
class Created < Build
end
end
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Travis
module Api
module Serialize
module V0
module Pusher
class Build
class Finished < Build
end
end
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Travis
module Api
module Serialize
module V0
module Pusher
class Build
class Received < Build
end
end
end
end
end
end
end

View File

@ -0,0 +1,49 @@
module Travis
module Api
module Serialize
module V0
module Pusher
class Build
class Received < Build
class Job
include Formats, V1::Helpers::Legacy
attr_reader :job, :commit
def initialize(job)
@job = job
@commit = job.commit
end
def data
{
'id' => job.id,
'repository_id' => job.repository_id,
'repository_private' => repository.private,
'parent_id' => job.source_id,
'number' => job.number,
'state' => job.state.to_s,
'result' => legacy_job_result(job),
'config' => job.obfuscated_config,
'commit' => commit.commit,
'branch' => commit.branch,
'message' => commit.message,
'compare_url' => commit.compare_url,
'started_at' => format_date(job.started_at),
'finished_at' => format_date(job.finished_at),
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'allow_failure' => job.allow_failure
}
end
end
end
end
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Travis
module Api
module Serialize
module V0
module Pusher
class Build
class Started < Build
end
end
end
end
end
end
end

View File

@ -0,0 +1,49 @@
module Travis
module Api
module Serialize
module V0
module Pusher
class Build
class Started < Build
class Job
include Formats, V1::Helpers::Legacy
attr_reader :job, :commit
def initialize(job)
@job = job
@commit = job.commit
end
def data
{
'id' => job.id,
'repository_id' => job.repository_id,
'repository_private' => repository.private,
'parent_id' => job.source_id,
'number' => job.number,
'state' => job.state.to_s,
'result' => legacy_job_result(job),
'config' => job.obfuscated_config,
'commit' => commit.commit,
'branch' => commit.branch,
'message' => commit.message,
'compare_url' => commit.compare_url,
'started_at' => format_date(job.started_at),
'finished_at' => format_date(job.finished_at),
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'allow_failure' => job.allow_failure
}
end
end
end
end
end
end
end
end
end

View File

@ -0,0 +1,69 @@
require 'travis/api/serialize/v0/pusher/job/canceled'
require 'travis/api/serialize/v0/pusher/job/created'
require 'travis/api/serialize/v0/pusher/job/log'
require 'travis/api/serialize/v0/pusher/job/received'
require 'travis/api/serialize/v0/pusher/job/started'
require 'travis/api/serialize/v0/pusher/job/finished'
module Travis
module Api
module Serialize
module V0
module Pusher
class Job
include Formats
attr_reader :job, :options
def initialize(job, options = {})
@job = job
@options = options
end
def data
job_data(job).merge(
'commit' => commit_data(job.commit)
)
end
private
def job_data(job)
{
'id' => job.id,
'repository_id' => job.repository_id,
'repository_slug' => job.repository.slug,
'repository_private' => job.repository.private,
'build_id' => job.source_id,
'commit_id' => job.commit_id,
'log_id' => job.log_id,
'number' => job.number,
'state' => job.state.to_s,
'started_at' => format_date(job.started_at),
'finished_at' => format_date(job.finished_at),
'queue' => job.queue,
'allow_failure' => job.allow_failure,
'annotation_ids' => job.annotation_ids
}
end
def commit_data(commit)
{
'id' => commit.id,
'sha' => commit.commit,
'branch' => commit.branch,
'message' => commit.message,
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'compare_url' => commit.compare_url,
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Travis
module Api
module Serialize
module V0
module Pusher
class Job
class Canceled < Job
end
end
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Travis
module Api
module Serialize
module V0
module Pusher
class Job
class Created < Job
end
end
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Travis
module Api
module Serialize
module V0
module Pusher
class Job
class Finished < Job
end
end
end
end
end
end
end

View File

@ -0,0 +1,32 @@
module Travis
module Api
module Serialize
module V0
module Pusher
class Job
class Log
attr_reader :job, :options
def initialize(job, options = {})
@job = job
@options = options
end
def data
{
'id' => job.id,
'build_id' => job.source_id,
'repository_id' => job.repository_id,
'repository_private' => repository.private,
'_log' => options[:_log],
'number' => options[:number],
'final' => options[:final]
}
end
end
end
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Travis
module Api
module Serialize
module V0
module Pusher
class Job
class Received < Job
end
end
end
end
end
end
end

View File

@ -0,0 +1,14 @@
module Travis
module Api
module Serialize
module V0
module Pusher
class Job
class Started < Job
end
end
end
end
end
end
end

View File

@ -0,0 +1 @@
require 'travis/api/serialize/v0/worker/job'

View File

@ -0,0 +1,35 @@
require 'travis/api/serialize/v0/worker/job/test'
module Travis
module Api
module Serialize
module V0
module Worker
class Job
attr_reader :job
def initialize(job, options = {})
@job = job
end
def commit
job.commit
end
def repository
job.repository
end
def request
build.request
end
def build
job.source
end
end
end
end
end
end
end

View File

@ -0,0 +1,120 @@
module Travis
module Api
module Serialize
module V0
module Worker
class Job
class Test < Job
include Formats
def data
{
'type' => 'test',
# TODO legacy. remove this once workers respond to a 'job' key
'build' => job_data,
'job' => job_data,
'source' => build_data,
'repository' => repository_data,
'pull_request' => commit.pull_request? ? pull_request_data : false,
'config' => job.decrypted_config,
'queue' => job.queue,
'uuid' => Travis.uuid,
'ssh_key' => ssh_key,
'env_vars' => env_vars,
'timeouts' => timeouts
}
end
def build_data
{
'id' => build.id,
'number' => build.number
}
end
def job_data
data = {
'id' => job.id,
'number' => job.number,
'commit' => commit.commit,
'commit_range' => commit.range,
'commit_message' => commit.message,
'branch' => commit.branch,
'ref' => commit.pull_request? ? commit.ref : nil,
'state' => job.state.to_s,
'secure_env_enabled' => job.secure_env_enabled?
}
data['tag'] = request.tag_name if include_tag_name?
data['pull_request'] = commit.pull_request? ? commit.pull_request_number : false
data
end
def repository_data
{
'id' => repository.id,
'slug' => repository.slug,
'github_id' => repository.github_id,
'source_url' => repository.source_url,
'api_url' => repository.api_url,
'last_build_id' => repository.last_build_id,
'last_build_number' => repository.last_build_number,
'last_build_started_at' => format_date(repository.last_build_started_at),
'last_build_finished_at' => format_date(repository.last_build_finished_at),
'last_build_duration' => repository.last_build_duration,
'last_build_state' => repository.last_build_state.to_s,
'description' => repository.description,
'default_branch' => repository.default_branch
}
end
def pull_request_data
{
'number' => commit.pull_request_number,
'head_repo' => request.head_repo,
'base_repo' => request.base_repo,
'head_branch' => request.head_branch,
'base_branch' => request.base_branch
}
end
def ssh_key
nil
end
def env_vars
vars = settings.env_vars
vars = vars.public unless job.secure_env_enabled?
vars.map do |var|
{
'name' => var.name,
'value' => var.value.decrypt,
'public' => var.public
}
end
end
def timeouts
{ 'hard_limit' => timeout(:hard_limit), 'log_silence' => timeout(:log_silence) }
end
def timeout(type)
timeout = settings.send(:"timeout_#{type}")
timeout = timeout * 60 if timeout # worker handles timeouts in seconds
timeout
end
def include_tag_name?
Travis.config.include_tag_name_in_worker_payload && request.tag_name.present?
end
def settings
repository.settings
end
end
end
end
end
end
end
end

View File

@ -0,0 +1,4 @@
require 'travis/api/serialize/v1/archive'
require 'travis/api/serialize/v1/http'
require 'travis/api/serialize/v1/helpers'
require 'travis/api/serialize/v1/webhook'

View File

@ -0,0 +1 @@
require 'travis/api/serialize/v1/archive/build'

View File

@ -0,0 +1,52 @@
require 'travis/api/serialize/v1/archive/build/job'
module Travis
module Api
module Serialize
module V1
module Archive
class Build
include Formats
attr_reader :build, :commit, :repository
def initialize(build, options = {})
@build = build
@commit = build.commit
@repository = build.repository
end
def data
{
'id' => build.id,
'number' => build.number,
'config' => build.obfuscated_config.stringify_keys,
'result' => 0,
'started_at' => format_date(build.started_at),
'finished_at' => format_date(build.finished_at),
'duration' => build.duration,
'commit' => commit.commit,
'branch' => commit.branch,
'message' => commit.message,
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'matrix' => build.matrix.map { |job| Job.new(job).data },
'repository' => repository_data
}
end
def repository_data
{
'id' => repository.id,
'slug' => repository.slug
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,33 @@
module Travis
module Api
module Serialize
module V1
module Archive
class Build
class Job
include Formats
attr_reader :job, :commit
def initialize(job)
@job = job
@commit = job.commit
end
def data
{
'id' => job.id,
'number' => job.number,
'config' => job.obfuscated_config,
'started_at' => format_date(job.started_at),
'finished_at' => format_date(job.finished_at),
'log' => job.log_content
}
end
end
end
end
end
end
end
end

View File

@ -0,0 +1 @@
require 'travis/api/serialize/v1/helpers/legacy'

View File

@ -0,0 +1,36 @@
module Travis
module Api
module Serialize
module V1
module Helpers
module Legacy
RESULTS = {
passed: 0,
failed: 1
}
def legacy_repository_last_build_result(repository)
RESULTS[repository.last_build_state.try(:to_sym)]
end
def legacy_build_state(build)
build.finished? ? 'finished' : build.state.to_s
end
def legacy_build_result(build)
RESULTS[build.state.try(:to_sym)]
end
def legacy_job_state(job)
job.finished? ? 'finished' : job.state.to_s
end
def legacy_job_result(job)
RESULTS[job.state.try(:to_sym)]
end
end
end
end
end
end
end

View File

@ -0,0 +1,9 @@
require 'travis/api/serialize/v1/http/branches'
require 'travis/api/serialize/v1/http/build'
require 'travis/api/serialize/v1/http/builds'
require 'travis/api/serialize/v1/http/hooks'
require 'travis/api/serialize/v1/http/job'
require 'travis/api/serialize/v1/http/jobs'
require 'travis/api/serialize/v1/http/repositories'
require 'travis/api/serialize/v1/http/repository'
require 'travis/api/serialize/v1/http/user'

View File

@ -0,0 +1,45 @@
require 'travis/api/serialize/v1/helpers/legacy'
module Travis
module Api
module Serialize
module V1
module Http
class Branches
include Formats, Helpers::Legacy
attr_reader :builds, :options
def initialize(builds, options = {})
builds = builds.last_finished_builds_by_branches if builds.is_a?(Repository) # TODO remove, bc
@builds = builds
end
def cache_key
"branches-#{builds.map(&:id).join('-')}"
end
def updated_at
builds.compact.map(&:finished_at).compact.sort.first
end
def data
builds.compact.map do |build|
{
'repository_id' => build.repository_id,
'build_id' => build.id,
'commit' => build.commit.commit,
'branch' => build.commit.branch,
'message' => build.commit.message,
'result' => legacy_build_result(build),
'finished_at' => format_date(build.finished_at),
'started_at' => format_date(build.started_at)
}
end
end
end
end
end
end
end
end

View File

@ -0,0 +1,49 @@
require 'travis/api/serialize/v1/http/build/job'
module Travis
module Api
module Serialize
module V1
module Http
class Build
include Formats, Helpers::Legacy
attr_reader :build, :commit, :request
def initialize(build, options = {})
@build = build
@commit = build.commit
@request = build.request
end
def data
{
'id' => build.id,
'repository_id' => build.repository_id,
'number' => build.number,
'config' => build.obfuscated_config.stringify_keys,
'state' => legacy_build_state(build),
'result' => legacy_build_result(build),
'status' => legacy_build_result(build),
'started_at' => format_date(build.started_at),
'finished_at' => format_date(build.finished_at),
'duration' => build.duration,
'commit' => commit.commit,
'branch' => commit.branch,
'message' => commit.message,
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'compare_url' => commit.compare_url,
'event_type' => build.event_type,
'matrix' => build.matrix.map { |job| Job.new(job).data },
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,34 @@
module Travis
module Api
module Serialize
module V1
module Http
class Build
class Job
include Formats, Helpers::Legacy
attr_reader :job
def initialize(job)
@job = job
end
def data
{
'id' => job.id,
'repository_id' => job.repository_id,
'number' => job.number,
'config' => job.obfuscated_config.stringify_keys,
'result' => legacy_job_result(job),
'started_at' => format_date(job.started_at),
'finished_at' => format_date(job.finished_at),
'allow_failure' => job.allow_failure
}
end
end
end
end
end
end
end
end

View File

@ -0,0 +1,40 @@
module Travis
module Api
module Serialize
module V1
module Http
class Builds
include Formats, Helpers::Legacy
attr_reader :builds
def initialize(builds, options = {})
@builds = builds
end
def data
builds.map { |build| build_data(build) }
end
def build_data(build)
{
'id' => build.id,
'repository_id' => build.repository_id,
'number' => build.number,
'state' => legacy_build_state(build),
'result' => legacy_build_result(build),
'started_at' => format_date(build.started_at),
'finished_at' => format_date(build.finished_at),
'duration' => build.duration,
'commit' => build.commit.commit,
'branch' => build.commit.branch,
'message' => build.commit.message,
'event_type' => build.event_type,
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,36 @@
module Travis
module Api
module Serialize
module V1
module Http
class Hooks
attr_reader :repos, :options
def initialize(repos, options = {})
@repos = repos
@options = options
end
def data
repos.map { |repo| repo_data(repo) }
end
private
def repo_data(repo)
{
'uid' => [repo.owner_name, repo.name].join(':'),
'url' => "https://github.com/#{repo.owner_name}/#{repo.name}",
'name' => repo.name,
'owner_name' => repo.owner_name,
'description' => repo.description,
'active' => repo.active,
'private' => repo.private
}
end
end
end
end
end
end
end

View File

@ -1,49 +1,32 @@
module Travis module Travis
module Api module Api
module V2 module Serialize
module V1
module Http module Http
class Jobs class Job
include Formats include Formats, Helpers::Legacy
attr_reader :jobs, :options attr_reader :job, :commit
def initialize(jobs, options = {}) def initialize(job, options = {})
@jobs = jobs @job = job
@options = options @commit = job.commit
end end
def data def data
{
'jobs' => jobs.map { |job| job_data(job) },
'commits' => jobs.map { |job| commit_data(job.commit) }
}
end
private
def job_data(job)
{ {
'id' => job.id, 'id' => job.id,
'repository_id' => job.repository_id,
'repository_slug' => job.repository.slug,
'build_id' => job.source_id,
'commit_id' => job.commit_id,
'log_id' => job.log_id,
'number' => job.number, 'number' => job.number,
'config' => job.obfuscated_config.stringify_keys, 'config' => job.obfuscated_config.stringify_keys,
'state' => job.state.to_s, 'repository_id' => job.repository_id,
'build_id' => job.source_id,
'state' => job.finished? ? 'finished' : job.state.to_s,
'result' => legacy_job_result(job),
'status' => legacy_job_result(job),
'started_at' => format_date(job.started_at), 'started_at' => format_date(job.started_at),
'finished_at' => format_date(job.finished_at), 'finished_at' => format_date(job.finished_at),
'queue' => job.queue, 'log' => job.log_content,
'allow_failure' => job.allow_failure, 'commit' => commit.commit,
'tags' => job.tags
}
end
def commit_data(commit)
{
'id' => commit.id,
'sha' => commit.commit,
'branch' => commit.branch, 'branch' => commit.branch,
'message' => commit.message, 'message' => commit.message,
'committed_at' => format_date(commit.committed_at), 'committed_at' => format_date(commit.committed_at),
@ -52,6 +35,7 @@ module Travis
'committer_name' => commit.committer_name, 'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email, 'committer_email' => commit.committer_email,
'compare_url' => commit.compare_url, 'compare_url' => commit.compare_url,
'worker' => job.worker
} }
end end
end end
@ -59,3 +43,4 @@ module Travis
end end
end end
end end
end

View File

@ -0,0 +1,36 @@
module Travis
module Api
module Serialize
module V1
module Http
class Jobs
include Formats, Helpers::Legacy
attr_reader :jobs
def initialize(jobs, options = {})
@jobs = jobs
end
def data
jobs.map { |job| job_data(job) }
end
def job_data(job)
commit = job.commit
{
'id' => job.id,
'repository_id' => job.repository_id,
'number' => job.number,
'state' => legacy_job_state(job),
'queue' => job.queue,
'allow_failure' => job.allow_failure
}
end
end
end
end
end
end
end

View File

@ -1,25 +1,21 @@
module Travis module Travis
module Api module Api
module V2 module Serialize
module V1
module Http module Http
class Repositories class Repositories
include Formats include Formats, Helpers::Legacy
attr_reader :repositories, :options attr_reader :repositories
def initialize(repositories, options = {}) def initialize(repositories, options = {})
@repositories = repositories @repositories = repositories
@options = options
end end
def data def data
{ repositories.map { |repository| repository_data(repository) }
'repos' => repositories.map { |repository| repository_data(repository) }
}
end end
private
def repository_data(repository) def repository_data(repository)
{ {
'id' => repository.id, 'id' => repository.id,
@ -27,13 +23,12 @@ module Travis
'description' => repository.description, 'description' => repository.description,
'last_build_id' => repository.last_build_id, 'last_build_id' => repository.last_build_id,
'last_build_number' => repository.last_build_number, 'last_build_number' => repository.last_build_number,
'last_build_state' => repository.last_build_state.to_s, 'last_build_status' => legacy_repository_last_build_result(repository),
'last_build_result' => legacy_repository_last_build_result(repository),
'last_build_duration' => repository.last_build_duration, 'last_build_duration' => repository.last_build_duration,
'last_build_language' => nil, 'last_build_language' => nil,
'last_build_started_at' => format_date(repository.last_build_started_at), 'last_build_started_at' => format_date(repository.last_build_started_at),
'last_build_finished_at' => format_date(repository.last_build_finished_at), 'last_build_finished_at' => format_date(repository.last_build_finished_at),
'active' => repository.active,
'github_language' => repository.github_language
} }
end end
end end
@ -41,3 +36,4 @@ module Travis
end end
end end
end end
end

View File

@ -1,9 +1,10 @@
module Travis module Travis
module Api module Api
module V2 module Serialize
module V1
module Http module Http
class Repository class Repository
include Formats include Formats, Helpers::Legacy
attr_reader :repository, :options attr_reader :repository, :options
@ -12,28 +13,19 @@ module Travis
end end
def data def data
{
'repo' => repository_data(repository)
}
end
private
# TODO why does this not include the last build? (i.e. 'builds' => { last build here })
def repository_data(repository)
{ {
'id' => repository.id, 'id' => repository.id,
'slug' => repository.slug, 'slug' => repository.slug,
'active' => repository.active,
'description' => repository.description, 'description' => repository.description,
'public_key' => repository.key.public_key,
'last_build_id' => repository.last_build_id, 'last_build_id' => repository.last_build_id,
'last_build_number' => repository.last_build_number, 'last_build_number' => repository.last_build_number,
'last_build_state' => repository.last_build_state.to_s, 'last_build_status' => legacy_repository_last_build_result(repository),
'last_build_result' => legacy_repository_last_build_result(repository),
'last_build_duration' => repository.last_build_duration, 'last_build_duration' => repository.last_build_duration,
'last_build_language' => nil, 'last_build_language' => nil,
'last_build_started_at' => format_date(repository.last_build_started_at), 'last_build_started_at' => format_date(repository.last_build_started_at),
'last_build_finished_at' => format_date(repository.last_build_finished_at), 'last_build_finished_at' => format_date(repository.last_build_finished_at),
'github_language' => repository.github_language
} }
end end
end end
@ -41,4 +33,4 @@ module Travis
end end
end end
end end
end

View File

@ -0,0 +1,33 @@
module Travis
module Api
module Serialize
module V1
module Http
class User
include Formats
attr_reader :user, :options
def initialize(user, options = {})
@user = user
@options = options
end
def data
{
'login' => user.login,
'name' => user.name,
'email' => user.email,
'gravatar_id' => user.gravatar_id,
'locale' => user.locale,
'is_syncing' => user.is_syncing,
'synced_at' => format_date(user.synced_at)
}
end
end
end
end
end
end
end

View File

@ -0,0 +1 @@
require 'travis/api/serialize/v1/webhook/build'

View File

@ -0,0 +1,29 @@
require 'travis/api/serialize/v1/webhook/build/finished'
module Travis
module Api
module Serialize
module V1
module Webhook
class Build
attr_reader :build, :commit, :request, :repository, :options
def initialize(build, options = {})
@build = build
@commit = build.commit
@request = build.request
@repository = build.repository
@options = options
end
private
def build_url
["https://#{Travis.config.host}", repository.slug, 'builds', build.id].join('/')
end
end
end
end
end
end
end

View File

@ -0,0 +1,72 @@
require 'travis/api/serialize/v1/webhook/build/finished/job'
module Travis
module Api
module Serialize
module V1
module Webhook
class Build
class Finished < Build
include Formats
def data
data = {
'id' => build.id,
'repository' => repository_data,
'number' => build.number,
'config' => build.obfuscated_config.stringify_keys,
'status' => build.result,
'result' => build.result,
'status_message' => result_message,
'result_message' => result_message,
'started_at' => format_date(build.started_at),
'finished_at' => format_date(build.finished_at),
'duration' => build.duration,
'build_url' => build_url,
'commit_id' => commit.id,
'commit' => commit.commit,
'base_commit' => request.base_commit,
'head_commit' => request.head_commit,
'branch' => commit.branch,
'message' => commit.message,
'compare_url' => commit.compare_url,
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'matrix' => build.matrix.map { |job| Job.new(job, options).data },
'type' => build.event_type,
'state' => build.state.to_s,
'pull_request' => build.pull_request?,
'pull_request_number' => build.pull_request_number,
'pull_request_title' => build.pull_request_title,
'tag' => request.tag_name
}
if commit.pull_request?
data['pull_request_number'] = commit.pull_request_number
end
data
end
def repository_data
{
'id' => repository.id,
'name' => repository.name,
'owner_name' => repository.owner_name,
'url' => repository.url
}
end
def result_message
@result_message ||= ::Build::ResultMessage.new(build).short
end
end
end
end
end
end
end
end

View File

@ -0,0 +1,52 @@
module Travis
module Api
module Serialize
module V1
module Webhook
class Build
class Finished < Build
class Job
include Formats
attr_reader :job, :commit, :options
def initialize(job, options = {})
@job = job
@commit = job.commit
@options = options
end
def data
data = {
'id' => job.id,
'repository_id' => job.repository_id,
'parent_id' => job.source_id,
'number' => job.number,
'state' => job.finished? ? 'finished' : job.state.to_s,
'config' => job.obfuscated_config,
'status' => job.result,
'result' => job.result,
'commit' => commit.commit,
'branch' => commit.branch,
'message' => commit.message,
'compare_url' => commit.compare_url,
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'allow_failure' => job.allow_failure
}
data['log'] = job.log_content || '' if options[:include_logs]
data['started_at'] = format_date(job.started_at) if job.started?
data['finished_at'] = format_date(job.finished_at) if job.finished?
data
end
end
end
end
end
end
end
end
end

View File

@ -0,0 +1 @@
require 'travis/api/serialize/v2/http'

View File

@ -0,0 +1,24 @@
require 'travis/api/serialize/serializer'
require 'travis/api/serialize/v2/http/accounts'
require 'travis/api/serialize/v2/http/annotations'
require 'travis/api/serialize/v2/http/broadcasts'
require 'travis/api/serialize/v2/http/branch'
require 'travis/api/serialize/v2/http/branches'
require 'travis/api/serialize/v2/http/build'
require 'travis/api/serialize/v2/http/builds'
require 'travis/api/serialize/v2/http/caches'
require 'travis/api/serialize/v2/http/hooks'
require 'travis/api/serialize/v2/http/job'
require 'travis/api/serialize/v2/http/jobs'
require 'travis/api/serialize/v2/http/log'
require 'travis/api/serialize/v2/http/permissions'
require 'travis/api/serialize/v2/http/repositories'
require 'travis/api/serialize/v2/http/repository'
require 'travis/api/serialize/v2/http/requests'
require 'travis/api/serialize/v2/http/request'
require 'travis/api/serialize/v2/http/ssl_key'
require 'travis/api/serialize/v2/http/env_var'
require 'travis/api/serialize/v2/http/env_vars'
require 'travis/api/serialize/v2/http/user'
require 'travis/api/serialize/v2/http/validation_error'
require 'travis/api/serialize/v2/http/ssh_key'

View File

@ -0,0 +1,44 @@
require 'travis/api/serialize/formats'
module Travis
module Api
module Serialize
module V2
module Http
class Accounts
include Formats
attr_reader :accounts, :options
def initialize(accounts, options = {})
@accounts = accounts
@options = options
end
def data
{
:accounts => accounts.map { |account| account_data(account) }
}
end
private
def account_data(account)
data = {
'id' => account.id,
'name' => account.name,
'login' => account.login,
'type' => account.type.underscore,
'repos_count' => account.repos_count
}
data['avatar_url'] = account.avatar_url if account.respond_to?(:avatar_url)
data
end
end
end
end
end
end
end

View File

@ -0,0 +1,38 @@
require 'travis/api/serialize/formats'
module Travis
module Api
module Serialize
module V2
module Http
class Annotations
include Formats
def initialize(annotations, options = {})
@annotations = annotations
end
def data
{
"annotations" => @annotations.map { |annotation| build_annotation(annotation) },
}
end
private
def build_annotation(annotation)
{
"id" => annotation.id,
"job_id" => annotation.job_id,
"description" => annotation.description,
"url" => annotation.url,
"status" => annotation.status,
"provider_name" => annotation.annotation_provider.name,
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,31 @@
require 'travis/api/serialize/formats'
require 'travis/api/serialize/v2/http/branches'
module Travis
module Api
module Serialize
module V2
module Http
class Branch < Branches
include Formats
attr_reader :build, :commit, :options
def initialize(build, options = {})
@build = build
@commit = build.commit
@options = options
end
def data
{
'branch' => build_data(build),
'commit' => commit_data(commit)
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,64 @@
require 'travis/api/serialize/formats'
module Travis
module Api
module Serialize
module V2
module Http
class Branches
include Formats
attr_reader :builds, :commits, :options
def initialize(builds, options = {})
builds = builds.last_finished_builds_by_branches if builds.is_a?(Repository) # TODO remove, bc
@builds = builds
@commits = builds.map(&:commit)
@options = options
end
def data
{
'branches' => builds.map { |build| build_data(build) },
'commits' => commits.map { |commit| commit_data(commit) }
}
end
private
def build_data(build)
{
'id' => build.id,
'repository_id' => build.repository_id,
'commit_id' => build.commit_id,
'number' => build.number,
'config' => build.obfuscated_config.stringify_keys,
'state' => build.state.to_s,
'started_at' => format_date(build.started_at),
'finished_at' => format_date(build.finished_at),
'duration' => build.duration,
'job_ids' => build.matrix.map { |job| job.id },
'pull_request' => build.pull_request?
}
end
def commit_data(commit)
{
'id' => commit.id,
'sha' => commit.commit,
'branch' => commit.branch,
'message' => commit.message,
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'compare_url' => commit.compare_url,
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,33 @@
module Travis
module Api
module Serialize
module V2
module Http
class Broadcasts
attr_reader :broadcasts, :options
def initialize(broadcasts, options = {})
@broadcasts = broadcasts
@options = options
end
def data
{
'broadcasts' => broadcasts.map { |broadcast| broadcast_data(broadcast) }
}
end
private
def broadcast_data(broadcast)
{
'id' => broadcast.id,
'message' => broadcast.message
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,97 @@
require 'travis/api/serialize/formats'
module Travis
module Api
module Serialize
module V2
module Http
class Build
include Formats
attr_reader :build, :options
def initialize(build, options = {})
options[:include_jobs] = true unless options.key?(:include_jobs)
@build = build
@options = options
end
def data
{
'build' => build_data(build),
'commit' => commit_data(build.commit, build.repository),
'jobs' => options[:include_jobs] ? build.matrix.map { |job| job_data(job) } : [],
'annotations' => options[:include_jobs] ? Annotations.new(annotations(build), @options).data["annotations"] : [],
}
end
private
def build_data(build)
{
'id' => build.id,
'repository_id' => build.repository_id,
'commit_id' => build.commit_id,
'number' => build.number,
'event_type' => build.event_type,
'pull_request' => build.pull_request?,
'pull_request_title' => build.pull_request_title,
'pull_request_number' => build.pull_request_number,
'config' => build.obfuscated_config.stringify_keys,
'state' => build.state.to_s,
'started_at' => format_date(build.started_at),
'finished_at' => format_date(build.finished_at),
'duration' => build.duration,
'job_ids' => build.matrix_ids
}
end
def commit_data(commit, repository)
{
'id' => commit.id,
'sha' => commit.commit,
'branch' => commit.branch,
'branch_is_default' => branch_is_default(commit, repository),
'message' => commit.message,
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'compare_url' => commit.compare_url,
}
end
def job_data(job)
{
'id' => job.id,
'repository_id' => job.repository_id,
'build_id' => job.source_id,
'commit_id' => job.commit_id,
'log_id' => job.log_id,
'state' => job.state.to_s,
'number' => job.number,
'config' => job.obfuscated_config.stringify_keys,
'started_at' => format_date(job.started_at),
'finished_at' => format_date(job.finished_at),
'queue' => job.queue,
'allow_failure' => job.allow_failure,
'tags' => job.tags,
'annotation_ids' => job.annotation_ids,
}
end
def branch_is_default(commit, repository)
repository.default_branch == commit.branch
end
def annotations(build)
build.matrix.map(&:annotations).flatten
end
end
end
end
end
end
end

View File

@ -0,0 +1,71 @@
require 'travis/api/serialize/formats'
module Travis
module Api
module Serialize
module V2
module Http
class Builds
include Formats
attr_reader :builds, :commits, :options
def initialize(builds, options = {})
@builds = builds
@commits = builds.map(&:commit)
@options = options
end
def data
{
'builds' => builds.map { |build| build_data(build) },
'commits' => commits.map { |commit| commit_data(commit) }
}
end
private
def build_data(build)
{
'id' => build.id,
'repository_id' => build.repository_id,
'commit_id' => build.commit_id,
'number' => build.number,
'event_type' => build.event_type,
'pull_request' => build.pull_request?,
'pull_request_title' => build.pull_request_title,
'pull_request_number' => build.pull_request_number,
'config' => build.obfuscated_config.stringify_keys,
'state' => build.state.to_s,
'started_at' => format_date(build.started_at),
'finished_at' => format_date(build.finished_at),
'duration' => build.duration,
'job_ids' => matrix_ids(build)
}
end
def matrix_ids(build)
build.cached_matrix_ids || build.matrix_ids
end
def commit_data(commit)
{
'id' => commit.id,
'sha' => commit.commit,
'branch' => commit.branch,
'message' => commit.message,
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'compare_url' => commit.compare_url,
'pull_request_number' => commit.pull_request_number
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,37 @@
require 'travis/api/serialize/formats'
module Travis
module Api
module Serialize
module V2
module Http
class Caches
include Formats
attr_reader :caches, :options
def initialize(caches, options = {})
@caches = caches
@options = options
end
def data
{ 'caches' => caches.map { |cache| cache_data(cache) } }
end
private
def cache_data(cache)
{
'repository_id' => cache.repository.id,
'size' => cache.size,
'slug' => cache.slug,
'branch' => cache.branch,
'last_modified' => format_date(cache.last_modified)
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,25 @@
module Travis
module Api
module Serialize
module V2
module Http
class EnvVar < Travis::Api::Serialize::ObjectSerializer
attributes :id, :name, :value, :public, :repository_id
def value
if object.public?
object.value.decrypt
end
end
def serializable_hash
hash = super
hash.delete :value unless object.public?
hash
end
end
end
end
end
end
end

View File

@ -0,0 +1,2 @@
class Travis::Api::Serialize::V2::Http::EnvVars < Travis::Api::Serialize::ArraySerializer
end

View File

@ -0,0 +1,38 @@
module Travis
module Api
module Serialize
module V2
module Http
class Hooks
attr_reader :hooks, :options
def initialize(hooks, options = {})
@hooks = hooks
@options = options
end
def data
{
'hooks' => hooks.map { |hook| hook_data(hook) },
}
end
private
def hook_data(hook)
{
'id' => hook.id,
'name' => hook.name,
'owner_name' => hook.owner_name,
'description' => hook.description,
'active' => hook.active,
'private' => hook.private,
'admin' => hook.admin?
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,72 @@
require 'travis/api/serialize/formats'
module Travis
module Api
module Serialize
module V2
module Http
class Job
include Formats
attr_reader :job, :options
def initialize(job, options = {})
@job = job
@options = options
end
def data
{
'job' => job_data(job),
'commit' => commit_data(job.commit, job.repository),
'annotations' => Annotations.new(job.annotations, @options).data["annotations"],
}
end
private
def job_data(job)
{
'id' => job.id,
'repository_id' => job.repository_id,
'repository_slug' => job.repository.slug,
'build_id' => job.source_id,
'commit_id' => job.commit_id,
'log_id' => job.log_id,
'number' => job.number,
'config' => job.obfuscated_config.stringify_keys,
'state' => job.state.to_s,
'started_at' => format_date(job.started_at),
'finished_at' => format_date(job.finished_at),
'queue' => job.queue,
'allow_failure' => job.allow_failure,
'tags' => job.tags,
'annotation_ids' => job.annotation_ids,
}
end
def commit_data(commit, repository)
{
'id' => commit.id,
'sha' => commit.commit,
'branch' => commit.branch,
'branch_is_default' => branch_is_default(commit, repository),
'message' => commit.message,
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'compare_url' => commit.compare_url,
}
end
def branch_is_default(commit, repository)
repository.default_branch == commit.branch
end
end
end
end
end
end
end

View File

@ -0,0 +1,65 @@
require 'travis/api/serialize/formats'
module Travis
module Api
module Serialize
module V2
module Http
class Jobs
include Formats
attr_reader :jobs, :options
def initialize(jobs, options = {})
@jobs = jobs
@options = options
end
def data
{
'jobs' => jobs.map { |job| job_data(job) },
'commits' => jobs.map { |job| commit_data(job.commit) }
}
end
private
def job_data(job)
{
'id' => job.id,
'repository_id' => job.repository_id,
'repository_slug' => job.repository.slug,
'build_id' => job.source_id,
'commit_id' => job.commit_id,
'log_id' => job.log_id,
'number' => job.number,
'config' => job.obfuscated_config.stringify_keys,
'state' => job.state.to_s,
'started_at' => format_date(job.started_at),
'finished_at' => format_date(job.finished_at),
'queue' => job.queue,
'allow_failure' => job.allow_failure,
'tags' => job.tags
}
end
def commit_data(commit)
{
'id' => commit.id,
'sha' => commit.commit,
'branch' => commit.branch,
'message' => commit.message,
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'compare_url' => commit.compare_url,
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,80 @@
module Travis
module Api
module Serialize
module V2
module Http
class Log
attr_reader :log, :options
def initialize(log, options = {})
@log = log
@options = options
end
def data
log_hash = options[:chunked] ? chunked_log_data : log_data
if log.removed_at
log_hash['removed_at'] = log.removed_at
log_hash['removed_by'] = log.removed_by.name || log.removed_by.login
end
{
'log' => log_hash,
}
end
private
def log_data
{
'id' => log.id,
'job_id' => log.job_id,
'type' => log.class.name.demodulize,
'body' => log.content
}
end
def chunked_log_data
{
'id' => log.id,
'job_id' => log.job_id,
'type' => log.class.name.demodulize,
'parts' => log_parts
}
end
def log_parts
if log.removed_at
# if log is removed we don't have actual parts
parts = [{ 'number' => 1, 'content' => log.content, 'final' => true }]
else
parts = log.parts
parts = parts.where(number: part_numbers) if part_numbers
parts = parts.where(["number > ?", after]) if after
parts.sort_by(&:number).map do |part|
{
'id' => part.id,
'number' => part.number,
'content' => part.content,
'final' => part.final
}
end
end
end
def after
after = options['after'].to_i
after == 0 ? nil : after
end
def part_numbers
if numbers = options['part_numbers']
numbers.is_a?(String) ? numbers.split(',').map(&:to_i) : numbers
end
end
end
end
end
end
end
end

View File

@ -0,0 +1,52 @@
module Travis
module Api
module Serialize
module V2
module Http
class Permissions
attr_reader :permissions, :options
def initialize(permissions, options = {})
@permissions = permissions
@options = options
end
def data
{
'permissions' => repo_ids,
'admin' => admin_ids,
'pull' => pull_ids,
'push' => push_ids
}
end
private
def filtered_ids(perm = nil)
if perm
permissions.find_all { |p| p.send("#{perm}?") }.map { |permission| permission.repository_id }
else
permissions.map { |permission| permission.repository_id }
end
end
def repo_ids
filtered_ids
end
def admin_ids
filtered_ids(:admin)
end
def pull_ids
filtered_ids(:pull)
end
def push_ids
filtered_ids(:push)
end
end
end
end
end
end
end

View File

@ -0,0 +1,47 @@
require 'travis/api/serialize/formats'
module Travis
module Api
module Serialize
module V2
module Http
class Repositories
include Formats
attr_reader :repositories, :options
def initialize(repositories, options = {})
@repositories = repositories
@options = options
end
def data
{
'repos' => repositories.map { |repository| repository_data(repository) }
}
end
private
def repository_data(repository)
{
'id' => repository.id,
'slug' => repository.slug,
'description' => repository.description,
'last_build_id' => repository.last_build_id,
'last_build_number' => repository.last_build_number,
'last_build_state' => repository.last_build_state.to_s,
'last_build_duration' => repository.last_build_duration,
'last_build_language' => nil,
'last_build_started_at' => format_date(repository.last_build_started_at),
'last_build_finished_at' => format_date(repository.last_build_finished_at),
'active' => repository.active,
'github_language' => repository.github_language
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,47 @@
require 'travis/api/serialize/formats'
module Travis
module Api
module Serialize
module V2
module Http
class Repository
include Formats
attr_reader :repository, :options
def initialize(repository, options = {})
@repository = repository
end
def data
{
'repo' => repository_data(repository)
}
end
private
# TODO why does this not include the last build? (i.e. 'builds' => { last build here })
def repository_data(repository)
{
'id' => repository.id,
'slug' => repository.slug,
'active' => repository.active,
'description' => repository.description,
'last_build_id' => repository.last_build_id,
'last_build_number' => repository.last_build_number,
'last_build_state' => repository.last_build_state.to_s,
'last_build_duration' => repository.last_build_duration,
'last_build_language' => nil,
'last_build_started_at' => format_date(repository.last_build_started_at),
'last_build_finished_at' => format_date(repository.last_build_finished_at),
'github_language' => repository.github_language
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,75 @@
require 'travis/api/serialize/formats'
module Travis
module Api
module Serialize
module V2
module Http
class Request
include Formats
attr_reader :request, :commit, :options
def initialize(request, options = {})
@request = request
@commit = request.commit
@options = options
end
def data
data = {
'request' => request_data
}
if commit
data['commit'] = commit_data
end
data
end
private
def request_data
data = {
'id' => request.id,
'repository_id' => request.repository_id,
'commit_id' => request.commit_id,
'created_at' => format_date(request.created_at),
'owner_id' => request.owner_id,
'owner_type' => request.owner_type,
'event_type' => request.event_type,
'base_commit' => request.base_commit,
'head_commit' => request.head_commit,
'result' => request.result,
'message' => request.message,
'pull_request' => request.pull_request?,
'pull_request_number' => request.pull_request_number,
'pull_request_title' => request.pull_request_title,
'branch' => request.branch_name,
'tag' => request.tag_name
}
data['build_id'] = request.builds.first.id if request.builds.present?
data
end
def commit_data
{
'id' => commit.id,
'sha' => commit.commit,
'branch' => commit.branch,
'message' => commit.message,
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'compare_url' => commit.compare_url,
'pull_request_number' => commit.pull_request_number
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,72 @@
require 'travis/api/serialize/formats'
module Travis
module Api
module Serialize
module V2
module Http
class Requests
include Formats
attr_reader :requests, :commits, :options
def initialize(requests, options = {})
@requests = requests
@commits = requests.map(&:commit)
@options = options
end
def data
{
'requests' => requests.map { |request| request_data(request) },
'commits' => commits.compact.map { |commit| commit_data(commit) }
}
end
private
def request_data(request)
data = {
'id' => request.id,
'repository_id' => request.repository_id,
'commit_id' => request.commit_id,
'created_at' => format_date(request.created_at),
'owner_id' => request.owner_id,
'owner_type' => request.owner_type,
'event_type' => request.event_type,
'base_commit' => request.base_commit,
'head_commit' => request.head_commit,
'result' => request.result,
'message' => request.message,
'pull_request' => request.pull_request?,
'pull_request_number' => request.pull_request_number,
'pull_request_title' => request.pull_request_title,
'branch' => request.branch_name,
'tag' => request.tag_name
}
data['build_id'] = request.builds.first.id if request.builds.present?
data
end
def commit_data(commit)
{
'id' => commit.id,
'sha' => commit.commit,
'branch' => commit.branch,
'message' => commit.message,
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'compare_url' => commit.compare_url,
'pull_request_number' => commit.pull_request_number
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,28 @@
require 'openssl'
require 'travis/private_key'
module Travis
module Api
module Serialize
module V2
module Http
class SshKey < Travis::Api::Serialize::ObjectSerializer
attributes :id, :description, :fingerprint
def id
object.repository_id
end
def fingerprint
value = object.value.decrypt
return unless value
PrivateKey.new(value).fingerprint
rescue OpenSSL::PKey::RSAError
nil
end
end
end
end
end
end
end

View File

@ -0,0 +1,28 @@
module Travis
module Api
module Serialize
module V2
module Http
class SslKey
attr_reader :key
def initialize(key, options = {})
@key = key
end
def fingerprint
PrivateKey.new(key.private_key).fingerprint
end
def data
{
'key' => key.public_key,
'fingerprint' => fingerprint
}
end
end
end
end
end
end
end

View File

@ -0,0 +1,51 @@
require 'travis/api/serialize/formats'
require 'travis/github/oauth'
module Travis
module Api
module Serialize
module V2
module Http
class User
include Formats
attr_reader :user, :options
def initialize(user, options = {})
@user = user
@options = options
end
def data
{
'user' => user_data,
}
end
private
def user_data
{
'id' => user.id,
'name' => user.name,
'login' => user.login,
'email' => user.email,
'gravatar_id' => user.email ? Digest::MD5.hexdigest(user.email) : "",
'locale' => user.locale,
'is_syncing' => user.syncing?,
'synced_at' => format_date(user.synced_at),
'correct_scopes' => Github::Oauth.correct_scopes?(user),
'created_at' => format_date(user.created_at),
'channels' => channels
}
end
def channels
["user-#{user.id}"] + user.repository_ids.map { |id| "repo-#{id}" }
end
end
end
end
end
end
end

View File

@ -0,0 +1,40 @@
module Travis
module Api
module Serialize
module V2
module Http
class ValidationError
attr_reader :resource
def initialize(resource, options = {})
@resource = resource
end
def data
response = {
message: 'Validation failed'
}
resource.errors.to_hash.each do |name, errors|
response['errors'] ||= []
errors.each do |error_code|
response['errors'] << { field: name, code: code(error_code) }
end
end
response
end
def code(error_code)
case error_code
when :blank
'missing_field'
else
error_code.to_s
end
end
end
end
end
end
end
end

View File

@ -1,23 +0,0 @@
require 'active_model_serializers'
module Travis
module Api
class Serializer < ActiveModel::Serializer
def data
as_json
end
end
class ArraySerializer < ActiveModel::ArraySerializer
def data
as_json
end
def initialize(resource, options)
options[:each_serializer] ||= Travis::Api::V2::Http.const_get(options[:root].to_s.singularize.camelize)
super(resource, options)
end
end
end
end

View File

@ -1,8 +0,0 @@
module Travis
module Api
module V2
require 'travis/api/v2/http'
end
end
end

View File

@ -1,33 +0,0 @@
require 'travis/api/serializer'
module Travis
module Api
module V2
module Http
require 'travis/api/v2/http/accounts'
require 'travis/api/v2/http/annotations'
require 'travis/api/v2/http/broadcasts'
require 'travis/api/v2/http/branch'
require 'travis/api/v2/http/branches'
require 'travis/api/v2/http/build'
require 'travis/api/v2/http/builds'
require 'travis/api/v2/http/caches'
require 'travis/api/v2/http/hooks'
require 'travis/api/v2/http/job'
require 'travis/api/v2/http/jobs'
require 'travis/api/v2/http/log'
require 'travis/api/v2/http/permissions'
require 'travis/api/v2/http/repositories'
require 'travis/api/v2/http/repository'
require 'travis/api/v2/http/requests'
require 'travis/api/v2/http/request'
require 'travis/api/v2/http/ssl_key'
require 'travis/api/v2/http/env_var'
require 'travis/api/v2/http/env_vars'
require 'travis/api/v2/http/user'
require 'travis/api/v2/http/validation_error'
require 'travis/api/v2/http/ssh_key'
end
end
end
end

View File

@ -1,42 +0,0 @@
module Travis
module Api
module V2
module Http
class Accounts
include Formats
attr_reader :accounts, :options
def initialize(accounts, options = {})
@accounts = accounts
@options = options
end
def data
{
:accounts => accounts.map { |account| account_data(account) }
}
end
private
def account_data(account)
data = {
'id' => account.id,
'name' => account.name,
'login' => account.login,
'type' => account.type.underscore,
'repos_count' => account.repos_count
}
data['avatar_url'] = account.avatar_url if account.respond_to?(:avatar_url)
data
end
end
end
end
end
end

View File

@ -1,34 +0,0 @@
module Travis
module Api
module V2
module Http
class Annotations
include Formats
def initialize(annotations, options = {})
@annotations = annotations
end
def data
{
"annotations" => @annotations.map { |annotation| build_annotation(annotation) },
}
end
private
def build_annotation(annotation)
{
"id" => annotation.id,
"job_id" => annotation.job_id,
"description" => annotation.description,
"url" => annotation.url,
"status" => annotation.status,
"provider_name" => annotation.annotation_provider.name,
}
end
end
end
end
end
end

View File

@ -1,28 +0,0 @@
require 'travis/api/v2/http/branches'
module Travis
module Api
module V2
module Http
class Branch < Branches
include Formats
attr_reader :build, :commit, :options
def initialize(build, options = {})
@build = build
@commit = build.commit
@options = options
end
def data
{
'branch' => build_data(build),
'commit' => commit_data(commit)
}
end
end
end
end
end
end

View File

@ -1,60 +0,0 @@
module Travis
module Api
module V2
module Http
class Branches
include Formats
attr_reader :builds, :commits, :options
def initialize(builds, options = {})
builds = builds.last_finished_builds_by_branches if builds.is_a?(Repository) # TODO remove, bc
@builds = builds
@commits = builds.map(&:commit)
@options = options
end
def data
{
'branches' => builds.map { |build| build_data(build) },
'commits' => commits.map { |commit| commit_data(commit) }
}
end
private
def build_data(build)
{
'id' => build.id,
'repository_id' => build.repository_id,
'commit_id' => build.commit_id,
'number' => build.number,
'config' => build.obfuscated_config.stringify_keys,
'state' => build.state.to_s,
'started_at' => format_date(build.started_at),
'finished_at' => format_date(build.finished_at),
'duration' => build.duration,
'job_ids' => build.matrix.map { |job| job.id },
'pull_request' => build.pull_request?
}
end
def commit_data(commit)
{
'id' => commit.id,
'sha' => commit.commit,
'branch' => commit.branch,
'message' => commit.message,
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'compare_url' => commit.compare_url,
}
end
end
end
end
end
end

View File

@ -1,32 +0,0 @@
module Travis
module Api
module V2
module Http
class Broadcasts
attr_reader :broadcasts, :options
def initialize(broadcasts, options = {})
@broadcasts = broadcasts
@options = options
end
def data
{
'broadcasts' => broadcasts.map { |broadcast| broadcast_data(broadcast) }
}
end
private
def broadcast_data(broadcast)
{
'id' => broadcast.id,
'message' => broadcast.message
}
end
end
end
end
end
end

View File

@ -1,93 +0,0 @@
module Travis
module Api
module V2
module Http
class Build
include Formats
attr_reader :build, :options
def initialize(build, options = {})
options[:include_jobs] = true unless options.key?(:include_jobs)
@build = build
@options = options
end
def data
{
'build' => build_data(build),
'commit' => commit_data(build.commit, build.repository),
'jobs' => options[:include_jobs] ? build.matrix.map { |job| job_data(job) } : [],
'annotations' => options[:include_jobs] ? Annotations.new(annotations(build), @options).data["annotations"] : [],
}
end
private
def build_data(build)
{
'id' => build.id,
'repository_id' => build.repository_id,
'commit_id' => build.commit_id,
'number' => build.number,
'event_type' => build.event_type,
'pull_request' => build.pull_request?,
'pull_request_title' => build.pull_request_title,
'pull_request_number' => build.pull_request_number,
'config' => build.obfuscated_config.stringify_keys,
'state' => build.state.to_s,
'started_at' => format_date(build.started_at),
'finished_at' => format_date(build.finished_at),
'duration' => build.duration,
'job_ids' => build.matrix_ids
}
end
def commit_data(commit, repository)
{
'id' => commit.id,
'sha' => commit.commit,
'branch' => commit.branch,
'branch_is_default' => branch_is_default(commit, repository),
'message' => commit.message,
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'compare_url' => commit.compare_url,
}
end
def job_data(job)
{
'id' => job.id,
'repository_id' => job.repository_id,
'build_id' => job.source_id,
'commit_id' => job.commit_id,
'log_id' => job.log_id,
'state' => job.state.to_s,
'number' => job.number,
'config' => job.obfuscated_config.stringify_keys,
'started_at' => format_date(job.started_at),
'finished_at' => format_date(job.finished_at),
'queue' => job.queue,
'allow_failure' => job.allow_failure,
'tags' => job.tags,
'annotation_ids' => job.annotation_ids,
}
end
def branch_is_default(commit, repository)
repository.default_branch == commit.branch
end
def annotations(build)
build.matrix.map(&:annotations).flatten
end
end
end
end
end
end

View File

@ -1,67 +0,0 @@
module Travis
module Api
module V2
module Http
class Builds
include Formats
attr_reader :builds, :commits, :options
def initialize(builds, options = {})
@builds = builds
@commits = builds.map(&:commit)
@options = options
end
def data
{
'builds' => builds.map { |build| build_data(build) },
'commits' => commits.map { |commit| commit_data(commit) }
}
end
private
def build_data(build)
{
'id' => build.id,
'repository_id' => build.repository_id,
'commit_id' => build.commit_id,
'number' => build.number,
'event_type' => build.event_type,
'pull_request' => build.pull_request?,
'pull_request_title' => build.pull_request_title,
'pull_request_number' => build.pull_request_number,
'config' => build.obfuscated_config.stringify_keys,
'state' => build.state.to_s,
'started_at' => format_date(build.started_at),
'finished_at' => format_date(build.finished_at),
'duration' => build.duration,
'job_ids' => matrix_ids(build)
}
end
def matrix_ids(build)
build.cached_matrix_ids || build.matrix_ids
end
def commit_data(commit)
{
'id' => commit.id,
'sha' => commit.commit,
'branch' => commit.branch,
'message' => commit.message,
'committed_at' => format_date(commit.committed_at),
'author_name' => commit.author_name,
'author_email' => commit.author_email,
'committer_name' => commit.committer_name,
'committer_email' => commit.committer_email,
'compare_url' => commit.compare_url,
'pull_request_number' => commit.pull_request_number
}
end
end
end
end
end
end

View File

@ -1,33 +0,0 @@
module Travis
module Api
module V2
module Http
class Caches
include Formats
attr_reader :caches, :options
def initialize(caches, options = {})
@caches = caches
@options = options
end
def data
{ 'caches' => caches.map { |cache| cache_data(cache) } }
end
private
def cache_data(cache)
{
'repository_id' => cache.repository.id,
'size' => cache.size,
'slug' => cache.slug,
'branch' => cache.branch,
'last_modified' => format_date(cache.last_modified)
}
end
end
end
end
end
end

Some files were not shown because too many files have changed in this diff Show More