diff --git a/.rspec b/.rspec new file mode 100644 index 00000000..262c08ba --- /dev/null +++ b/.rspec @@ -0,0 +1,3 @@ +--colour +--tty +--format documentation diff --git a/Gemfile b/Gemfile index bf2e564b..da99c923 100644 --- a/Gemfile +++ b/Gemfile @@ -7,6 +7,7 @@ gem 's3', github: 'travis-ci/s3' gem 'travis-core', github: 'travis-ci/travis-core' gem 'travis-support', github: 'travis-ci/travis-support' +gem 'travis-amqp', github: 'travis-ci/travis-amqp' gem 'travis-config', '~> 0.1.0' gem 'travis-sidekiqs', github: 'travis-ci/travis-sidekiqs', require: nil gem 'travis-yaml', github: 'travis-ci/travis-yaml' @@ -16,7 +17,7 @@ gem 'sinatra-contrib', require: nil #github: 'sinatra/sinatra-contrib', require: gem 'active_model_serializers' gem 'unicorn' -gem 'sentry-raven', github: 'getsentry/raven-ruby' +gem 'sentry-raven' gem 'yard-sinatra', github: 'rkh/yard-sinatra' gem 'rack-contrib', github: 'rack/rack-contrib' gem 'rack-cache', github: 'rtomayko/rack-cache' @@ -35,13 +36,16 @@ gem 'stackprof' gem 'jemalloc' gem 'customerio' +group :development, :test do + gem 'travis-migrations', github: 'travis-ci/travis-migrations' +end + group :test do gem 'rspec', '~> 2.13' gem 'rspec-its' gem 'factory_girl', '~> 2.4.0' gem 'mocha', '~> 0.12' gem 'database_cleaner', '~> 0.8.0' - gem 'travis-migrations', github: 'travis-ci/travis-migrations' end group :development do diff --git a/Gemfile.lock b/Gemfile.lock index 8aa7952c..6aa0f3fb 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -5,14 +5,6 @@ GIT metriks-librato_metrics (1.0.2) metriks (>= 0.9.9.6) -GIT - remote: git://github.com/getsentry/raven-ruby.git - revision: 84392e5db701f0b5c66802aab9cc82ef9a5ad830 - specs: - sentry-raven (0.10.1) - faraday (>= 0.7.6) - uuidtools - GIT remote: git://github.com/rack/rack-contrib.git revision: 1b11346d729efd88b274cd7f704e0bca9eb3de7a @@ -48,9 +40,15 @@ GIT s3 (0.3.21) proxies (~> 0.2.0) +GIT + remote: git://github.com/travis-ci/travis-amqp.git + revision: c388299757b7eda2cc0e33cdc7d90113cf283e6a + specs: + travis-amqp (0.0.1) + GIT remote: git://github.com/travis-ci/travis-core.git - revision: f7b3a76b3f39c28bb5cf7b9dc24acec13908a11a + revision: a66c345d44fd9c28884d694acfff3b1a0fbc5232 specs: travis-core (0.0.1) actionmailer (~> 3.2.19) @@ -58,7 +56,7 @@ GIT coder (~> 0.4.0) data_migrations (~> 0.0.1) gh - hashr (~> 0.0.19) + hashr metriks (~> 0.9.7) multi_json pusher (~> 0.14.0) @@ -286,6 +284,8 @@ GEM rspec-core (>= 2.99.0.beta1) rspec-expectations (>= 2.99.0.beta1) rspec-mocks (2.99.2) + sentry-raven (0.15.3) + faraday (>= 0.7.6) sidekiq (3.3.0) celluloid (>= 0.16.0) connection_pool (>= 2.0.0) @@ -331,13 +331,12 @@ GEM treetop (1.4.15) polyglot polyglot (>= 0.3.1) - tzinfo (0.3.47) + tzinfo (0.3.48) unicorn (4.8.3) kgio (~> 2.6) rack raindrops (~> 0.7) useragent (0.13.3) - uuidtools (2.1.5) virtus (1.0.5) axiom-types (~> 0.1) coercible (~> 1.0) @@ -373,12 +372,13 @@ DEPENDENCIES rspec (~> 2.13) rspec-its s3! - sentry-raven! + sentry-raven simplecov sinatra sinatra-contrib skylight (~> 0.6.0.beta.1) stackprof + travis-amqp! travis-api! travis-config (~> 0.1.0) travis-core! diff --git a/README.md b/README.md index 5f6aaee5..4388b241 100644 --- a/README.md +++ b/README.md @@ -4,51 +4,68 @@ This is the app running on https://api.travis-ci.org/ ## Requirements +You will need the following packages to get travis-api to work: + 1. PostgreSQL 9.3 or higher -1. Redis -1. RabbitMQ -1. Nginx *NB: If working on Ubuntu please install Nginx manually from source. [This guide](http://www.rackspace.com/knowledge_center/article/ubuntu-and-debian-installing-nginx-from-source) is helpful but make sure you install the [latest stable version](https://www.nginx.com/resources/wiki/start/topics/tutorials/install/#stable), include the user name on your ubuntu machine when compiling (add `--user=[yourusername]` as an option when running `./configure`), and don't follow any subsequent server configuration steps. Travis-api will start and configure its own nginx server when run locally. +2. Bundler +3. Redis Server +4. *Optional:* RabbitMQ Server +5. Nginx - + *If working in Ubuntu please install nginx manually from source: Download and extract latest nginx version, open a terminal in extracted folder and then run the following:* +```sh-session + $ sudo apt-get install libpcre3 libpcre3-dev + $ auto/configure --user=$USER + $ make + $ sudo make install + $ sudo ln -s /usr/local/nginx/sbin/nginx /bin/nginx +``` ## Installation ### Setup - - $ bundle install - +```sh-session +$ bundle install +``` ### Database setup -NB detail for how `rake` sets up the database can be found in the `Rakefile`. In the `namespace :db` block you will see the database name for development is hardcoded to `travis-development`. If you are using a different configuration you will have to make your own adjustments. - -1. `bundle exec rake db:create` -2. for testing 'RAILS_ENV=test bundle exec rake db:create --trace' -1. Clone `travis-logs` and copy the `logs` database (assume the PostgreSQL user is `postgres`): +*You might need to create a role first. For this you should run the following:* ```sh-session -cd .. -git clone https://github.com/travis-ci/travis-logs.git -cd travis-logs -rvm jruby do bundle exec rake db:migrate # `travis-logs` requires JRuby -psql -c "DROP TABLE IF EXISTS logs CASCADE" -U postgres travis_development -pg_dump -t logs travis_logs_development | psql -U postgres travis_development +$ sudo -u postgres psql -c "CREATE USER yourusername WITH SUPERUSER PASSWORD 'yourpassword'" ``` -Repeat the database steps for `RAILS_ENV=test`. +NB detail for how `rake` sets up the database can be found in the `Rakefile`. In the `namespace :db` block you will see the database name is configured using the environment variable RAILS_ENV. If you are using a different configuration you will have to make your own adjustments. ```sh-session -RAILS_ENV=test bundle exec rake db:create -pushd ../travis-logs -RAILS_ENV=test rvm jruby do bundle exec rake db:migrate -psql -c "DROP TABLE IF EXISTS logs CASCADE" -U postgres travis_test -pg_dump -t logs travis_logs_test | psql -U postgres travis_test -popd +$ RAILS_ENV=development bundle exec rake db:create +$ RAILS_ENV=test bundle exec rake db:create +``` +#### Optional +Clone `travis-logs` and copy the `logs` database (assume the PostgreSQL user is `postgres`): +```sh-session +$ cd .. +$ git clone https://github.com/travis-ci/travis-logs.git +$ cd travis-logs +$ rvm jruby do bundle exec rake db:migrate # `travis-logs` requires JRuby +$ psql -c "DROP TABLE IF EXISTS logs CASCADE" -U postgres travis_development +$ pg_dump -t logs travis_logs_development | psql -U postgres travis_development + +$ RAILS_ENV=test bundle exec rake db:create +$ pushd ../travis-logs +$ RAILS_ENV=test rvm jruby do bundle exec rake db:migrate +$ psql -c "DROP TABLE IF EXISTS logs CASCADE" -U postgres travis_test +$ pg_dump -t logs travis_logs_test | psql -U postgres travis_test +$ popd ``` ### Run tests - - $ rake spec - +```sh-session +$ bundle exec rspec +``` ### Run the server - - $ bundle exec script/server +```sh-session +$ bundle exec script/server +``` +If you have problems with Nginx because the websocket is already in use, try restarting your computer. ## Contributing diff --git a/Rakefile b/Rakefile index 93c7d171..0b13d449 100644 --- a/Rakefile +++ b/Rakefile @@ -1,45 +1,35 @@ -require 'rake' -require 'travis/migrations' - -task default: :spec - namespace :db do - if ENV["RAILS_ENV"] == 'test' - desc 'Create and migrate the test database' + env = ENV["RAILS_ENV"] + if env != 'production' + desc "Create and migrate the #{env} database" task :create do - sh 'createdb travis_test' rescue nil - sh "psql -q travis_test < #{Gem.loaded_specs['travis-migrations'].full_gem_path}/db/structure.sql" - end - else - desc 'Create and migrate the development database' - task :create do - sh 'createdb travis_development' rescue nil - sh "psql -q travis_development < #{Gem.loaded_specs['travis-migrations'].full_gem_path}/db/structure.sql" + sh "createdb travis_#{env}" rescue nil + sh "psql -q travis_#{env} < #{Gem.loaded_specs['travis-migrations'].full_gem_path}/db/structure.sql" end end end desc "generate gemspec" task 'travis-api.gemspec' do - content = File.read 'travis-api.gemspec' + content = File.read 'travis-api.gemspec' - fields = { - authors: `git shortlog -sn`.scan(/[^\d\s].*/), - email: `git shortlog -sne`.scan(/[^<]+@[^>]+/), - files: `git ls-files`.split("\n").reject { |f| f =~ /^(\.|Gemfile)/ } - } + 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 + 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 - File.open('travis-api.gemspec', 'w') { |f| f << content } - end + File.open('travis-api.gemspec', 'w') { |f| f << content } +end +task default: 'travis-api.gemspec' - task default: 'travis-api.gemspec' - - tasks_path = File.expand_path('../lib/tasks/*.rake', __FILE__) - Dir.glob(tasks_path).each { |r| import r } +## 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 } diff --git a/lib/travis/api/app.rb b/lib/travis/api/app.rb index 6b72b8ce..624b3fc7 100644 --- a/lib/travis/api/app.rb +++ b/lib/travis/api/app.rb @@ -4,12 +4,14 @@ require 'active_record_postgres_variables' # now actually load travis require 'travis' +require 'travis/amqp' require 'travis/model' -require 'travis/support/amqp' require 'travis/states_cache' require 'rack' require 'rack/protection' -require 'rack/contrib' +require 'rack/contrib/config' +require 'rack/contrib/jsonp' +require 'rack/contrib/post_body_content_type_parser' require 'dalli' require 'memcachier' require 'rack/cache' @@ -18,11 +20,14 @@ require 'active_record' require 'redis' require 'gh' require 'raven' +require 'raven/integrations/rack' require 'sidekiq' require 'metriks/reporter/logger' require 'metriks/librato_metrics_reporter' require 'travis/support/log_subscriber/active_record_metrics' require 'fileutils' +require 'travis/api/app/endpoint' +require 'travis/api/app/middleware' require 'travis/api/instruments' require 'travis/api/v2/http' require 'travis/api/v3' @@ -171,14 +176,13 @@ module Travis::Api def self.setup! setup_travis - load_endpoints setup_endpoints @setup = true end def self.setup_travis Travis::Async.enabled = true - Travis::Amqp.config = Travis.config.amqp + Travis::Amqp.setup(Travis.config.amqp) setup_database_connections @@ -214,11 +218,6 @@ module Travis::Api Travis::Metrics.setup end - def self.load_endpoints - Dir.glob("#{__dir__}/app/middleware/*.rb").each { |f| require f[%r[(?<=lib/).+(?=\.rb$)]] } - Dir.glob("#{__dir__}/app/endpoint/*.rb").each { |f| require f[%r[(?<=lib/).+(?=\.rb$)]] } - end - def self.setup_endpoints Base.subclasses.each(&:setup) end diff --git a/lib/travis/api/app/base.rb b/lib/travis/api/app/base.rb index 1f5f4570..51e4e253 100644 --- a/lib/travis/api/app/base.rb +++ b/lib/travis/api/app/base.rb @@ -1,6 +1,8 @@ -require 'travis/api/app' require 'sinatra/base' require 'mustermann' +require 'travis/api/app' +require 'travis/api/app/extensions' +require 'travis/api/app/helpers' class Travis::Api::App # Superclass for any endpoint and middleware. diff --git a/lib/travis/api/app/endpoint.rb b/lib/travis/api/app/endpoint.rb index c4ef62f1..29323b3c 100644 --- a/lib/travis/api/app/endpoint.rb +++ b/lib/travis/api/app/endpoint.rb @@ -1,6 +1,7 @@ -require 'travis/api/app' require 'addressable/uri' require 'active_record/base' +require 'travis/api/app' +require 'travis/api/app/base' class Travis::Api::App # Superclass for HTTP endpoints. Takes care of prefixing. @@ -48,3 +49,23 @@ class Travis::Api::App end end end + +require 'travis/api/app/endpoint/accounts' +require 'travis/api/app/endpoint/authorization' +require 'travis/api/app/endpoint/branches' +require 'travis/api/app/endpoint/broadcasts' +require 'travis/api/app/endpoint/builds' +require 'travis/api/app/endpoint/documentation' +require 'travis/api/app/endpoint/endpoints' +require 'travis/api/app/endpoint/env_vars' +require 'travis/api/app/endpoint/home' +require 'travis/api/app/endpoint/hooks' +require 'travis/api/app/endpoint/jobs' +require 'travis/api/app/endpoint/lint' +require 'travis/api/app/endpoint/logs' +require 'travis/api/app/endpoint/repos' +require 'travis/api/app/endpoint/requests' +require 'travis/api/app/endpoint/setting_endpoint' +require 'travis/api/app/endpoint/singleton_settings_endpoint' +require 'travis/api/app/endpoint/uptime' +require 'travis/api/app/endpoint/users' diff --git a/lib/travis/api/app/extensions.rb b/lib/travis/api/app/extensions.rb index d7faa8fe..f6bb9c2e 100644 --- a/lib/travis/api/app/extensions.rb +++ b/lib/travis/api/app/extensions.rb @@ -1,8 +1,4 @@ -require 'travis/api/app' - -class Travis::Api::App - # Namespace for Sinatra extensions. - module Extensions - Dir.glob("#{__dir__}/extensions/*.rb").each { |f| require f[%r[(?<=lib/).+(?=\.rb$)]] } - end -end +require 'travis/api/app/extensions/expose_pattern' +require 'travis/api/app/extensions/scoping' +require 'travis/api/app/extensions/smart_constants' +require 'travis/api/app/extensions/subclass_tracker' diff --git a/lib/travis/api/app/helpers.rb b/lib/travis/api/app/helpers.rb index e09bbd8f..9612a43b 100644 --- a/lib/travis/api/app/helpers.rb +++ b/lib/travis/api/app/helpers.rb @@ -1,8 +1,7 @@ require 'travis/api/app' - -class Travis::Api::App - # Namespace for helpers. - module Helpers - Dir.glob("#{__dir__}/helpers/*.rb").each { |f| require f[%r[(?<=lib/).+(?=\.rb$)]] } - end -end +require 'travis/api/app/helpers/accept' +require 'travis/api/app/helpers/current_user' +require 'travis/api/app/helpers/db_follower' +require 'travis/api/app/helpers/flash' +require 'travis/api/app/helpers/mime_types' +require 'travis/api/app/helpers/respond_with' diff --git a/lib/travis/api/app/middleware.rb b/lib/travis/api/app/middleware.rb index 619db9d6..8cdde661 100644 --- a/lib/travis/api/app/middleware.rb +++ b/lib/travis/api/app/middleware.rb @@ -3,5 +3,11 @@ require 'travis/api/app' class Travis::Api::App # Superclass for all middleware. class Middleware < Base + require 'travis/api/app/middleware/logging' + require 'travis/api/app/middleware/metriks' + require 'travis/api/app/middleware/rewrite' + require 'travis/api/app/middleware/scope_check' + require 'travis/api/app/middleware/skylight' + require 'travis/api/app/middleware/user_agent_tracker' end end diff --git a/lib/travis/api/attack.rb b/lib/travis/api/attack.rb index 17fcd44a..d210b633 100644 --- a/lib/travis/api/attack.rb +++ b/lib/travis/api/attack.rb @@ -50,9 +50,9 @@ class Rack::Attack # Ban time: 5 hours # Ban after: 10 POST requests within five minutes to /auth/github blacklist('hammering /auth/github') do |request| - Rack::Attack::Allow2Ban.filter(request.identifier, maxretry: 2, findtime: 5.minutes, bantime: bantime(5.hours)) do - request.post? and request.path == '/auth/github' - end + Rack::Attack::Allow2Ban.filter(request.identifier, maxretry: 2, findtime: 5.minutes, bantime: bantime(5.hours)) do + request.post? and request.path == '/auth/github' + end end #### @@ -60,9 +60,9 @@ class Rack::Attack # Ban time: 1 hour # Ban after: 10 POST requests within 30 seconds blacklist('spamming with POST requests') do |request| - Rack::Attack::Allow2Ban.filter(request.identifier, maxretry: 10, findtime: 30.seconds, bantime: bantime(1.hour)) do - request.post? and not POST_WHITELISTED.include? request.path - end + Rack::Attack::Allow2Ban.filter(request.identifier, maxretry: 10, findtime: 30.seconds, bantime: bantime(1.hour)) do + request.post? and not POST_WHITELISTED.include? request.path + end end diff --git a/lib/travis/api/v3/models/repository.rb b/lib/travis/api/v3/models/repository.rb index ed35b5a2..22c26d71 100644 --- a/lib/travis/api/v3/models/repository.rb +++ b/lib/travis/api/v3/models/repository.rb @@ -62,5 +62,9 @@ module Travis::API::V3 __send__(name, *args, &block) end + + def settings + @settings ||= JSON.load(super) + end end end diff --git a/lib/travis/api/v3/services/requests/create.rb b/lib/travis/api/v3/services/requests/create.rb index c3353daf..ea3827de 100644 --- a/lib/travis/api/v3/services/requests/create.rb +++ b/lib/travis/api/v3/services/requests/create.rb @@ -1,7 +1,7 @@ module Travis::API::V3 class Services::Requests::Create < Service TIME_FRAME = 1.hour - LIMIT = 10 + LIMIT = 10 private_constant :TIME_FRAME, :LIMIT result_type :request @@ -22,14 +22,19 @@ module Travis::API::V3 accepted(remaining_requests: remaining, repository: repository, request: payload) end - def limit - Travis.config.requests_create_api_limit || LIMIT + def limit(repository) + if repository.settings.nil? + Travis.config.requests_create_api_limit || LIMIT + else + repository.settings["api_builds_rate_limit"] || Travis.config.requests_create_api_limit || LIMIT + end end def remaining_requests(repository) - return limit if access_control.full_access? + api_builds_rate_limit = limit(repository) + return api_builds_rate_limit if access_control.full_access? count = query(:requests).count(repository, TIME_FRAME) - count > limit ? 0 : limit - count + count > api_builds_rate_limit ? 0 : api_builds_rate_limit - count end end end diff --git a/spec/v3/services/requests/create_spec.rb b/spec/v3/services/requests/create_spec.rb index 23fd8460..c0dfb035 100644 --- a/spec/v3/services/requests/create_spec.rb +++ b/spec/v3/services/requests/create_spec.rb @@ -239,6 +239,26 @@ describe Travis::API::V3::Services::Requests::Create do } end + describe "overrides default request limit if included in repository.settings" do + before { repo.update_attribute(:settings, { api_builds_rate_limit: 12 }.to_json) } + + before { 10.times { repo.requests.create(event_type: 'api', result: 'accepted') } } + before { post("/v3/repo/#{repo.id}/requests", {}, headers) } + + example { expect(last_response.status).to be == 202 } + example { expect(JSON.load(body).to_s).to include( + "@type", + "repository", + "remaining_requests", + "2", + "request", + "representation", + "minimal", + "slug", + "svenfuchs/minimal") + } + end + describe "passing the token in params" do let(:params) {{ request: { token: 'foo-bar' }}} example { expect(sidekiq_params[:credentials]).to be == { diff --git a/travis-api.gemspec b/travis-api.gemspec index 92ee8839..472324a1 100644 --- a/travis-api.gemspec +++ b/travis-api.gemspec @@ -11,75 +11,85 @@ Gem::Specification.new do |s| s.authors = [ "Konstantin Haase", "Piotr Sarnacki", + "carlad", "Sven Fuchs", "Hiro Asari", "Mathias Meyer", "Josh Kalderimis", "Henrik Hodne", - "carlad", "Tyranja", - "Andre Arko", "Dan Buch", + "Andre Arko", "C. Scott Ananian", "Erik Michaels-Ober", "Brian Ford", + "Lisa P", "Steve Richert", + "Bryan Goldstein", + "Dan Rice", + "James Dennes", + "María de Antón", + "Nick Schonning", + "Patrick Williams", "Puneeth Chaganti", "Thais Camilo and Konstantin Haase", "Tim Carey-Smith", - "Bryan Goldstein", "Zachary Scott", - "James Dennes", - "rainsun", - "Nick Schonning", - "Patrick Williams", - "Dan Rice" + "rainsun" ] s.email = [ "konstantin.mailinglists@googlemail.com", "drogus@gmail.com", "me@svenfuchs.com", + "carla@travis-ci.com", "asari.ruby@gmail.com", "meyer@paperplanes.de", "josh.kalderimis@gmail.com", "me@henrikhodne.com", + "carlad@users.noreply.github.com", "henrik@hodne.io", - "konstantin.haase@gmail.com", "carla@travis-ci.org", + "konstantin.haase@gmail.com", "tyranja@cassiopeia.uberspace.de", "andre@arko.net", - "svenfuchs@artweb-design.de", "dan@travis-ci.org", - "sferik@gmail.com", + "svenfuchs@artweb-design.de", "cscott@cscott.net", - "henrik@travis-ci.com", - "steve.richert@gmail.com", + "sferik@gmail.com", "bford@engineyard.com", + "henrik@travis-ci.com", + "mail@lislis.de", + "steve.richert@gmail.com", + "brysgo@gmail.com", + "dan@meatballhat.com", + "dan@zoombody.com", + "jdennes@gmail.com", + "MariadeAnton@users.noreply.github.com", + "nschonni@gmail.com", "patrick@bittorrent.com", "punchagan@muse-amuse.in", - "carlad@users.noreply.github.com", - "dan@zoombody.com", - "rainsuner@gmail.com", "dev+narwen+rkh@rkh.im", "tim@spork.in", - "brysgo@gmail.com", "e@zzak.io", - "jdennes@gmail.com", - "nschonni@gmail.com", - "dan@meatballhat.com" + "rainsuner@gmail.com" ] s.files = [ "CONTRIBUTING.md", + "LICENSE", "Procfile", "README.md", "Rakefile", "bin/start-nginx", "config.ru", "config/database.yml", + "config/mime.types", + "config/nginx.conf.erb", "config/puma-config.rb", + "config/ruby_config.sh", "config/unicorn.rb", + "lib/active_record_postgres_variables.rb", "lib/conditional_skylight.rb", "lib/tasks/build_update_branch.rake", "lib/tasks/build_update_pull_request_data.rake", @@ -141,6 +151,7 @@ Gem::Specification.new do |s| "lib/travis/api/app/responders/xml.rb", "lib/travis/api/app/services/schedule_request.rb", "lib/travis/api/app/stack_instrumentation.rb", + "lib/travis/api/attack.rb", "lib/travis/api/instruments.rb", "lib/travis/api/serializer.rb", "lib/travis/api/v2.rb", @@ -184,6 +195,7 @@ Gem::Specification.new do |s| "lib/travis/api/v3/extensions/encrypted_column.rb", "lib/travis/api/v3/features.rb", "lib/travis/api/v3/github.rb", + "lib/travis/api/v3/metrics.rb", "lib/travis/api/v3/model.rb", "lib/travis/api/v3/models.rb", "lib/travis/api/v3/models/account.rb", @@ -201,14 +213,30 @@ Gem::Specification.new do |s| "lib/travis/api/v3/models/repository.rb", "lib/travis/api/v3/models/request.rb", "lib/travis/api/v3/models/ssl_key.rb", + "lib/travis/api/v3/models/star.rb", "lib/travis/api/v3/models/subscription.rb", "lib/travis/api/v3/models/token.rb", "lib/travis/api/v3/models/user.rb", "lib/travis/api/v3/opt_in.rb", + "lib/travis/api/v3/paginator.rb", + "lib/travis/api/v3/paginator/url_generator.rb", + "lib/travis/api/v3/permissions.rb", + "lib/travis/api/v3/permissions/account.rb", + "lib/travis/api/v3/permissions/build.rb", + "lib/travis/api/v3/permissions/generic.rb", + "lib/travis/api/v3/permissions/job.rb", + "lib/travis/api/v3/permissions/organization.rb", + "lib/travis/api/v3/permissions/repository.rb", + "lib/travis/api/v3/permissions/user.rb", "lib/travis/api/v3/queries.rb", "lib/travis/api/v3/queries/accounts.rb", "lib/travis/api/v3/queries/branch.rb", + "lib/travis/api/v3/queries/branches.rb", + "lib/travis/api/v3/queries/broadcasts.rb", "lib/travis/api/v3/queries/build.rb", + "lib/travis/api/v3/queries/builds.rb", + "lib/travis/api/v3/queries/job.rb", + "lib/travis/api/v3/queries/jobs.rb", "lib/travis/api/v3/queries/organization.rb", "lib/travis/api/v3/queries/organizations.rb", "lib/travis/api/v3/queries/owner.rb", @@ -224,15 +252,24 @@ Gem::Specification.new do |s| "lib/travis/api/v3/renderer/accounts.rb", "lib/travis/api/v3/renderer/avatar_url.rb", "lib/travis/api/v3/renderer/branch.rb", + "lib/travis/api/v3/renderer/branches.rb", + "lib/travis/api/v3/renderer/broadcast.rb", + "lib/travis/api/v3/renderer/broadcasts.rb", "lib/travis/api/v3/renderer/build.rb", + "lib/travis/api/v3/renderer/builds.rb", "lib/travis/api/v3/renderer/collection_renderer.rb", + "lib/travis/api/v3/renderer/commit.rb", "lib/travis/api/v3/renderer/error.rb", + "lib/travis/api/v3/renderer/job.rb", + "lib/travis/api/v3/renderer/jobs.rb", + "lib/travis/api/v3/renderer/lint.rb", "lib/travis/api/v3/renderer/model_renderer.rb", "lib/travis/api/v3/renderer/organization.rb", "lib/travis/api/v3/renderer/organizations.rb", "lib/travis/api/v3/renderer/owner.rb", "lib/travis/api/v3/renderer/repositories.rb", "lib/travis/api/v3/renderer/repository.rb", + "lib/travis/api/v3/renderer/request.rb", "lib/travis/api/v3/renderer/requests.rb", "lib/travis/api/v3/renderer/user.rb", "lib/travis/api/v3/result.rb", @@ -245,19 +282,34 @@ Gem::Specification.new do |s| "lib/travis/api/v3/services.rb", "lib/travis/api/v3/services/accounts/for_current_user.rb", "lib/travis/api/v3/services/branch/find.rb", + "lib/travis/api/v3/services/branches/find.rb", + "lib/travis/api/v3/services/broadcasts/for_current_user.rb", + "lib/travis/api/v3/services/build/cancel.rb", "lib/travis/api/v3/services/build/find.rb", + "lib/travis/api/v3/services/build/restart.rb", + "lib/travis/api/v3/services/builds/find.rb", + "lib/travis/api/v3/services/job/cancel.rb", + "lib/travis/api/v3/services/job/debug.rb", + "lib/travis/api/v3/services/job/find.rb", + "lib/travis/api/v3/services/job/restart.rb", + "lib/travis/api/v3/services/jobs/find.rb", + "lib/travis/api/v3/services/lint/lint.rb", "lib/travis/api/v3/services/organization/find.rb", "lib/travis/api/v3/services/organization/sync.rb", "lib/travis/api/v3/services/organizations/for_current_user.rb", "lib/travis/api/v3/services/owner/find.rb", "lib/travis/api/v3/services/repositories/for_current_user.rb", + "lib/travis/api/v3/services/repositories/for_owner.rb", "lib/travis/api/v3/services/repository/disable.rb", "lib/travis/api/v3/services/repository/enable.rb", "lib/travis/api/v3/services/repository/find.rb", + "lib/travis/api/v3/services/repository/star.rb", + "lib/travis/api/v3/services/repository/unstar.rb", "lib/travis/api/v3/services/requests/create.rb", "lib/travis/api/v3/services/requests/find.rb", "lib/travis/api/v3/services/user/current.rb", "lib/travis/api/v3/services/user/find.rb", + "lib/travis/api/v3/services/user/sync.rb", "lib/travis/api/workers/build_cancellation.rb", "lib/travis/api/workers/build_restart.rb", "lib/travis/api/workers/job_cancellation.rb", @@ -280,6 +332,8 @@ Gem::Specification.new do |s| "script/console", "script/repos_stats.rb", "script/server", + "script/web_concurrency", + "spec/active_record_postgres_variables_spec.rb", "spec/integration/error_handling_spec.rb", "spec/integration/formats_handling_spec.rb", "spec/integration/responders_spec.rb", @@ -344,7 +398,7 @@ Gem::Specification.new do |s| "spec/unit/endpoint/lint_spec.rb", "spec/unit/endpoint/logs_spec.rb", "spec/unit/endpoint/repos_spec.rb", - "spec/unit/endpoint/requests_spec.rb", + "spec/unit/endpoint/requests/throttle_spec.rb", "spec/unit/endpoint/users_spec.rb", "spec/unit/endpoint_spec.rb", "spec/unit/extensions/expose_pattern_spec.rb", @@ -358,20 +412,40 @@ Gem::Specification.new do |s| "spec/unit/middleware/user_agent_tracker_spec.rb", "spec/unit/responders/json_spec.rb", "spec/unit/responders/service_spec.rb", + "spec/v3/error_handling_spec.rb", "spec/v3/extensions/belongs_to_spec.rb", + "spec/v3/metrics_spec.rb", "spec/v3/renderer/avatar_url_spec.rb", "spec/v3/result_spec.rb", "spec/v3/service_index_spec.rb", "spec/v3/services/accounts/for_current_user_spec.rb", "spec/v3/services/branch/find_spec.rb", + "spec/v3/services/branches/find_spec.rb", + "spec/v3/services/broadcasts/for_current_user_spec.rb", + "spec/v3/services/build/cancel_spec.rb", + "spec/v3/services/build/find_spec.rb", + "spec/v3/services/build/restart_spec.rb", + "spec/v3/services/builds/find_spec.rb", + "spec/v3/services/job/cancel_spec.rb", + "spec/v3/services/job/debug_sepc.rb", + "spec/v3/services/job/find_spec.rb", + "spec/v3/services/job/restart_spec.rb", + "spec/v3/services/jobs/find_spec.rb", + "spec/v3/services/lint/lint_spec.rb", "spec/v3/services/organization/find_spec.rb", "spec/v3/services/organizations/for_current_user_spec.rb", "spec/v3/services/owner/find_spec.rb", "spec/v3/services/repositories/for_current_user_spec.rb", + "spec/v3/services/repositories/for_owner_spec.rb", + "spec/v3/services/repository/disable_spec.rb", + "spec/v3/services/repository/enable_spec.rb", "spec/v3/services/repository/find_spec.rb", + "spec/v3/services/repository/star_spec.rb", + "spec/v3/services/repository/unstar_spec.rb", "spec/v3/services/requests/create_spec.rb", "spec/v3/services/user/current_spec.rb", "spec/v3/services/user/find_spec.rb", + "spec/v3/services/user/sync_spec.rb", "tmp/.gitkeep", "travis-api.gemspec" ]