From f1b34c1d8c7d8c8dc773685f3d72e7a60743caf0 Mon Sep 17 00:00:00 2001 From: Chavez Date: Sat, 12 Mar 2016 21:45:10 -0800 Subject: [PATCH] Project recent builds params * Add params for project recent builds * Test using filter and limit query params * Update README * Update CHANGELOG --- CHANGELOG.md | 1 + README.md | 11 +- lib/circleci/project.rb | 5 +- .../project/recent_builds/success.yml | 294 ++++++++++++++++-- spec/circleci/project_spec.rb | 18 ++ 5 files changed, 297 insertions(+), 32 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 77d994f..71b19c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ * CircleCi::RecentBuilds#get - Replaces old CircleCi#organization endpoint to return all recent builds * Remove CircleCi#organization for CircleCi::RecentBuilds#get +* CircleCi::Project#recent_builds - Takes params to supply limit, offset, and filter query params # Version 0.2.2 - (2016-02-26) diff --git a/README.md b/README.md index 4e67024..771f61b 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ end * [Get Checkout Key](#get_checkout_key) * [List Checkout Keys](#list_checkout_keys) * [New Checkout Key](#new_checkout_key) - * [Recent Builds](#recent_builds) + * [Recent Builds](#project_recent_builds) * [Recent Builds Branch](#recent_builds_branch) * [Settings](#settings) * [Set Envvar](#set_envvar) @@ -517,7 +517,7 @@ Example response } ``` -#### [recent_builds](#recent_builds) +#### [recent_builds](#project_recent_builds) Endpoint: `/project/:username/:repository` @@ -525,6 +525,13 @@ Build summary for each of the last 30 recent builds, ordered by build_num. ```ruby res = CircleCi::Project.recent_builds 'username', 'reponame' + +# Use params to filter by status +# res = CircleCi::Project.recent_builds 'username', 'reponame', filter: 'failed' + +# Use params to limit and give an offset +# res = CircleCi::Project.recent_builds 'username', 'reponame', limit: 10, offset: 50 + res.success? res.body ``` diff --git a/lib/circleci/project.rb b/lib/circleci/project.rb index b8fb1d1..14ac960 100644 --- a/lib/circleci/project.rb +++ b/lib/circleci/project.rb @@ -177,10 +177,11 @@ def self.new_checkout_key(username, project, type) # # @param username [String] - User or org name who owns project # @param project [String] - Name of project + # @param params [Hash] - Parameters for builds (limit, offset, filter) # @return [CircleCi::Response] - Response object - def self.recent_builds(username, project) - CircleCi.http.get "/project/#{username}/#{project}" + def self.recent_builds(username, project, params = {}) + CircleCi.http.get "/project/#{username}/#{project}", params end ## diff --git a/spec/cassettes/project/recent_builds/success.yml b/spec/cassettes/project/recent_builds/success.yml index 1c55d13..024abe2 100644 --- a/spec/cassettes/project/recent_builds/success.yml +++ b/spec/cassettes/project/recent_builds/success.yml @@ -18,32 +18,23 @@ http_interactions: response: status: code: 200 - message: !binary |- - T0s= + message: OK headers: - !binary "Y29udGVudC1lbmNvZGluZw==": - - !binary |- - Z3ppcA== - !binary "Y29udGVudC10eXBl": - - !binary |- - YXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOA== - !binary "ZGF0ZQ==": - - !binary |- - V2VkLCAxNyBBcHIgMjAxMyAwNTowMToyNCBHTVQ= - !binary "c2VydmVy": - - !binary |- - bmdpbngvMS4xLjE5 - !binary "c2V0LWNvb2tpZQ==": - - !binary |- - cmluZy1zZXNzaW9uPWNiNTdkMTk4LTJmOTQtNDZmZS1iMTYwLWNjM2E4ZjM1 - YjM0YTtQYXRoPS87SHR0cE9ubHk7RXhwaXJlcz1XZWQsIDE2IEFwciAyMDE0 - IDIxOjE3OjU3ICswMDAwO01heC1BZ2U9MzE1MzYwMDA7U2VjdXJl - !binary "Y29udGVudC1sZW5ndGg=": - - !binary |- - NjY3 - !binary "Y29ubmVjdGlvbg==": - - !binary |- - a2VlcC1hbGl2ZQ== + content-encoding: + - gzip + content-type: + - application/json; charset=utf-8 + date: + - Wed, 17 Apr 2013 05:01:24 GMT + server: + - nginx/1.1.19 + set-cookie: + - ring-session=cb57d198-2f94-46fe-b160-cc3a8f35b34a;Path=/;HttpOnly;Expires=Wed, + 16 Apr 2014 21:17:57 +0000;Max-Age=31536000;Secure + content-length: + - '667' + connection: + - keep-alive body: encoding: ASCII-8BIT string: !binary |- @@ -62,7 +53,254 @@ http_interactions: rfOVWOer+mTTZGmePBe4Cd3YIzFPcNH5wy1tyb1QjXd0qJelq+bCOTHMPbk+ mRbrsyZcXjRCeyqyPuLYyPn0DFCvg6ayPAjIQkd974LE4KBsxoJ7mosDeH5B JsS3WG/M27Yfsy3Tl8Z8X+W/AwSoS4EfNd/j7V+eK+AY0wQAAA== - http_version: !binary |- - MS4x + http_version: '1.1' recorded_at: Wed, 17 Apr 2013 05:01:24 GMT -recorded_with: VCR 2.4.0 +- request: + method: get + uri: https://circleci.com/api/v1/project/mtchavez/rb-array-sorting?circle-token=d121d128bf0b9d185cbad163fa410d958a30d37d&limit=5 + body: + encoding: US-ASCII + string: '' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Content-Type: + - application/json + User-Agent: + - Ruby + response: + status: + code: 404 + message: Not Found + headers: + Access-Control-Allow-Origin: + - "*" + Content-Type: + - application/json; charset=utf-8 + Date: + - Sun, 13 Mar 2016 05:36:16 GMT + Server: + - nginx + Set-Cookie: + - ab_test_user_seed=0.060642484388514384;Expires=Mon, 13 Mar 2017 05:36:16 +0000;Path=/;Secure + - ring-session=g5X1XsQP2JnV3ol%2Fe0Du6tdGjo%2BbvqABn7xu4wHuMQKJGzrqRUhm0l8GG%2F0W9T92fM6kbOpK30lAaws93Yrlh45vCHj%2BWZawnzovW4Azj4GOS3fYkAleQa5e0Co3OK53aQPJMoX%2BR9IQO5YxuUf3rNxzXzL8aP35Mdt7mWUp8GmODV22xLNiMIQUQgTep0Hj374BHf2BSk04vajGQGRhYtFMeuaH5NFGttPjYFuQd70%3D--EX2jZycht%2F7QqYQJXgsxVfxwe1l%2Fg%2FwAmqVRm9gqXXo%3D;Path=/;HttpOnly;Expires=Sun, + 12 Mar 2017 01:42:55 +0000;Max-Age=31536000;Secure + X-Circleci-Identity: + - i-f5ca5776 + X-Circleci-Request-Id: + - b3b61856-41f9-4736-980f-85facb81ecb8 + X-Frame-Options: + - DENY + X-Route: + - "/api/v1/project/:username/:repo" + Content-Length: + - '31' + Connection: + - keep-alive + body: + encoding: UTF-8 + string: '{"message":"Project not found"}' + http_version: + recorded_at: Sun, 13 Mar 2016 05:36:14 GMT +- request: + method: get + uri: https://circleci.com/api/v1/project/mtchavez/circleci?circle-token=d121d128bf0b9d185cbad163fa410d958a30d37d&limit=5 + body: + encoding: US-ASCII + string: '' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Content-Type: + - application/json + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Access-Control-Allow-Origin: + - "*" + Content-Encoding: + - gzip + Content-Type: + - application/json; charset=utf-8 + Date: + - Sun, 13 Mar 2016 05:36:52 GMT + Server: + - nginx + Set-Cookie: + - ab_test_user_seed=0.9481715585859141;Expires=Mon, 13 Mar 2017 05:36:52 +0000;Path=/;Secure + - ring-session=y78vcgaOKDZ3bwlDtIouQozbLbCP3gtNdQ3yGFrAXwduBZ2pmB9TSj%2FGHz1ZDkvtGj%2B%2FV1qeKC%2BK52xUj%2BTWNtNOl9QAUQGU2jUh1voVZFfsr0L1V0qdHMJB2wsdC8EqKhhXRWnH8DkjLGvKdqXaDO85uU2PWYLqr3JKNt2Dhe028JufDDUrmfj6J6Oda900pyrOF0Y5Y7sz76ZVqSDemimDv0Cgyuv814F2mcuug2Y%3D--ZayCQT8nm01iDYonCy8wOPjeA%2BNqX%2Bwq1da9zkWRQ%2Fo%3D;Path=/;HttpOnly;Expires=Sun, + 12 Mar 2017 01:42:20 +0000;Max-Age=31536000;Secure + Strict-Transport-Security: + - max-age=15724800 + X-Circleci-Identity: + - i-27cb56a4 + X-Circleci-Request-Id: + - ed12d340-ed60-4ce1-98df-24f47a3b0879 + X-Circleci-Scopes: + - ":all" + - ":none" + - ":read-settings" + - ":status" + - ":trigger-builds" + - ":view-builds" + - ":write-settings" + X-Frame-Options: + - DENY + X-Route: + - "/api/v1/project/:username/:repo" + Content-Length: + - '1634' + Connection: + - keep-alive + body: + encoding: ASCII-8BIT + string: !binary |- + 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 + AAD//wMAENjU978vAAA= + http_version: + recorded_at: Sun, 13 Mar 2016 05:36:52 GMT +- request: + method: get + uri: https://circleci.com/api/v1/project/mtchavez/circleci?circle-token=d121d128bf0b9d185cbad163fa410d958a30d37d&filter=failed&limit=5 + body: + encoding: US-ASCII + string: '' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Content-Type: + - application/json + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Access-Control-Allow-Origin: + - "*" + Content-Encoding: + - gzip + Content-Type: + - application/json; charset=utf-8 + Date: + - Sun, 13 Mar 2016 05:39:53 GMT + Server: + - nginx + Set-Cookie: + - ab_test_user_seed=0.2840432329001864;Expires=Mon, 13 Mar 2017 05:39:53 +0000;Path=/;Secure + - ring-session=JzkZsASI7cM1UDwmNuViKW2DC2u826NwPImjt%2BpEJK3Fg9SQfFiQQwoP%2F3doAkN%2F5JP8agYS5ZQYw1AlVG27Ya5OO0aNtr9%2FcOdnRkNyF32ffggAFgSpg%2FFKkEUIECJxO%2B%2FYzpI7pqo4xUX6uxlVPN5umR3Y1BMWGS7w2oxxvhmO%2BxVISi5wCiNs%2BbJGbSPX%2F18MdYywdVNLWdBXBR7p3SR0aV8vBRfBxfwIBJciUXQ%3D--3mwfYudp1sE1w813mkpITx04%2BzsDSoiJiKPny5Ki7d4%3D;Path=/;HttpOnly;Expires=Sun, + 12 Mar 2017 01:42:09 +0000;Max-Age=31536000;Secure + Strict-Transport-Security: + - max-age=15724800 + X-Circleci-Identity: + - i-a3c95420 + X-Circleci-Request-Id: + - a4039652-7b3b-4ed0-a3eb-93c277140da0 + X-Circleci-Scopes: + - ":all" + - ":none" + - ":read-settings" + - ":status" + - ":trigger-builds" + - ":view-builds" + - ":write-settings" + X-Frame-Options: + - DENY + X-Route: + - "/api/v1/project/:username/:repo" + Content-Length: + - '1760' + Connection: + - keep-alive + body: + encoding: ASCII-8BIT + string: !binary |- + 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 + SE0pAAA= + http_version: + recorded_at: Sun, 13 Mar 2016 05:39:53 GMT +recorded_with: VCR 3.0.1 diff --git a/spec/circleci/project_spec.rb b/spec/circleci/project_spec.rb index 69aab49..0b3ed34 100644 --- a/spec/circleci/project_spec.rb +++ b/spec/circleci/project_spec.rb @@ -226,6 +226,24 @@ user['is_user'].should be user['login'].should eql 'mtchavez' end + + describe 'params' do + context 'limit' do + let(:res) { CircleCi::Project.recent_builds 'mtchavez', 'circleci', limit: 5 } + it 'returns correct total of builds' do + res.body.size.should eql 5 + end + end + + context 'filter' do + let(:res) { CircleCi::Project.recent_builds 'mtchavez', 'circleci', limit: 5, filter: 'failed' } + it 'returns builds filtered by status' do + builds = res.body + statuses = builds.map { |build| build['status'] } + statuses.each { |status| status.should eql 'failed' } + end + end + end end context 'non-utf8 encoding', vcr: { cassette_name: 'project/recent_builds/encoding', serialize_with: :json, record: :none } do