Modify builds scope filtering in builds API

This commit is contained in:
Tomasz Maczukin 2016-01-08 14:01:31 +01:00
parent a862ade55b
commit 549a2fa787
4 changed files with 39 additions and 16 deletions

View file

@ -94,6 +94,10 @@ module Ci
new_build.save new_build.save
new_build new_build
end end
def available_statuses
state_machines[:status].states.map &:value
end
end end
state_machine :status, initial: :pending do state_machine :status, initial: :pending do

View file

@ -11,7 +11,7 @@ GET /projects/:id/builds
Parameters: Parameters:
- `id` (required) - The ID of a project - `id` (required) - The ID of a project
- `scope` (optional) - The scope of builds to show (one of: `all`, `finished`, `running`; default: `all`) - `scope` (optional) - The scope of builds to show (one or array of: pending, running, failed, success, canceled; if none provided showing all builds)
```json ```json
[ [
@ -64,8 +64,7 @@ Parameters:
- `id` (required) - The ID of a project - `id` (required) - The ID of a project
- `sha` (required) - The SHA id of a commit - `sha` (required) - The SHA id of a commit
- `scope` (optional) - The scope of builds to show (one of: `all`, `finished`, `running`; default: `all`) - `scope` (optional) - The scope of builds to show (one or array of: pending, running, failed, success, canceled; if none provided showing all builds)
```json ```json
[ [

View file

@ -8,9 +8,8 @@ module API
# #
# Parameters: # Parameters:
# id (required) - The ID of a project # id (required) - The ID of a project
# scope (optional) - The scope of builds to show (one of: all, finished, running; default: all) # scope (optional) - The scope of builds to show (one or array of: pending, running, failed, success, canceled;
# page (optional) - The page number for pagination # if none provided showing all builds)
# per_page (ooptional) - The value of items per page to show
# Example Request: # Example Request:
# GET /projects/:id/builds # GET /projects/:id/builds
get ':id/builds' do get ':id/builds' do
@ -24,7 +23,8 @@ module API
# Parameters: # Parameters:
# id (required) - The ID of a project # id (required) - The ID of a project
# sha (required) - The SHA id of a commit # sha (required) - The SHA id of a commit
# scope (optional) - The scope of builds to show (one of: all, finished, running; default: all) # scope (optional) - The scope of builds to show (one or array of: pending, running, failed, success, canceled;
# if none provided showing all builds)
# Example Request: # Example Request:
# GET /projects/:id/builds/commit/:sha # GET /projects/:id/builds/commit/:sha
get ':id/builds/commit/:sha' do get ':id/builds/commit/:sha' do
@ -112,14 +112,21 @@ module API
end end
def filter_builds(builds, scope) def filter_builds(builds, scope)
case scope available_scopes = Ci::Build.available_statuses
when 'finished' scope =
builds.finished if scope.is_a?(String) || scope.is_a?(Symbol)
when 'running' available_scopes & [scope.to_s]
builds.running elsif scope.is_a?(Array)
else available_scopes & scope
builds elsif scope.respond_to?(:to_h)
end available_scopes & scope.to_h.values
else
[]
end
return builds if scope.empty?
builds.where(status: scope)
end end
def authorize_manage_builds! def authorize_manage_builds!

View file

@ -18,7 +18,20 @@ describe API::API, api: true do
it 'should return project builds' do it 'should return project builds' do
get api("/projects/#{project.id}/builds", user) get api("/projects/#{project.id}/builds", user)
puts json_response expect(response.status).to eq(200)
expect(json_response).to be_an Array
end
it 'should filter project with one scope element' do
get api("/projects/#{project.id}/builds?scope=pending", user)
expect(response.status).to eq(200)
expect(json_response).to be_an Array
end
it 'should filter project with array of scope elements' do
get api("/projects/#{project.id}/builds?scope[0]=pending&scope[1]=running", user)
expect(response.status).to eq(200) expect(response.status).to eq(200)
expect(json_response).to be_an Array expect(json_response).to be_an Array
end end