From 62e5cba79cc4aee9c6ba598400ad243da3867343 Mon Sep 17 00:00:00 2001 From: Zac Flamig Date: Sat, 21 Apr 2018 21:07:57 -0500 Subject: [PATCH 1/4] feat(openapi): 3.0 --- openapis/swagger.yaml | 901 +++++++++++++++++++++--------------------- 1 file changed, 456 insertions(+), 445 deletions(-) diff --git a/openapis/swagger.yaml b/openapis/swagger.yaml index 508fa5a1..6b527987 100644 --- a/openapis/swagger.yaml +++ b/openapis/swagger.yaml @@ -1,8 +1,10 @@ -swagger: '2.0' +openapi: 3.0.0 +servers: + - url: 'https://data.example.domain/' info: description: >- - Indexd is a data indexing and tracking service. The code is open - source on [github](https://github.com/uc-cdis/indexd) + Indexd is a data indexing and tracking service. The code is open source on + [github](https://github.com/uc-cdis/indexd) version: 1.0.0 title: Indexd OpenAPI Specification termsOfService: 'http://cdis.uchicago.edu/terms/' @@ -11,8 +13,6 @@ info: license: name: Apache 2.0 url: 'http://www.apache.org/licenses/LICENSE-2.0.html' -host: data.example.domain -basePath: / tags: - name: global description: 'Search for an alias or index, potentially even a distributed search.' @@ -33,61 +33,60 @@ tags: url: 'https://github.com/uc-cdis/indexd' - name: system description: System endpoints -schemes: - - https paths: '/{UUID}': get: tags: - global - summary: Get the metadata associated with the given id, alias, or distributed identifier + summary: >- + Get the metadata associated with the given id, alias, or distributed + identifier description: Multiple status values can be provided with comma separated strings - operationId: getEntry - produces: - - application/json + operationId: getEntryGlobal parameters: - name: UUID in: path description: entry id required: true - type: string + schema: + type: string responses: '200': description: successful operation - schema: - $ref: '#/definitions/OutputInfo' + content: + application/json: + schema: + $ref: '#/components/schemas/OutputInfo' '400': description: Invalid status value '404': description: Record not found security: [] - '/index': + /index: post: tags: - index summary: Add a new entry to the index description: '' operationId: addEntry - consumes: - - application/json - produces: - - application/json - parameters: - - in: body - name: body - description: Metadata object that needs to be added to the store - required: true - schema: - $ref: '#/definitions/InputInfo' responses: '200': description: successful operation - schema: - $ref: '#/definitions/OutputRef' + content: + application/json: + schema: + $ref: '#/components/schemas/OutputRef' '400': description: Invalid input security: - basic_auth: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/InputInfo' + description: Metadata object that needs to be added to the store + required: true get: tags: - index @@ -99,39 +98,40 @@ paths: in: query description: metadata associated with the entry required: false - type: string - produces: - - application/json + schema: + type: string responses: '200': description: successful operation - schema: - type: object - properties: - ids: - type: array - items: - $ref: '#/definitions/DID' - size: - type: integer - format: int64 - description: size in bytes - start: - type: integer - format: int64 - description: start index for the pagination - limit: - type: integer - format: int64 - description: number of dids to return - file_name: - type: string - urls: - type: array - items: - type: string - hashes: - $ref: '#/definitions/HashInfo' + content: + application/json: + schema: + type: object + properties: + ids: + type: array + items: + $ref: '#/components/schemas/DID' + size: + type: integer + format: int64 + description: size in bytes + start: + type: integer + format: int64 + description: start index for the pagination + limit: + type: integer + format: int64 + description: number of dids to return + file_name: + type: string + urls: + type: array + items: + type: string + hashes: + $ref: '#/components/schemas/HashInfo' security: [] '/index/{UUID}': get: @@ -140,113 +140,118 @@ paths: summary: Get the metadata associated with the given id description: Multiple status values can be provided with comma separated strings operationId: getEntry - produces: - - application/json parameters: - name: UUID in: path description: entry id required: true - type: string + schema: + type: string responses: '200': description: successful operation - schema: - $ref: '#/definitions/OutputInfo' + content: + application/json: + schema: + $ref: '#/components/schemas/OutputInfo' '400': description: Invalid status value security: [] post: tags: - index - summary: >- - Add new version for the document associated to the provided uuid. - description: Since data content is immutable, when you want to change the size or hash, a new index document with new uuid need to be created as its new version. That uuid is returned in the did field of the response + summary: Add new version for the document associated to the provided uuid. + description: >- + Since data content is immutable, when you want to change the size or + hash, a new index document with new uuid need to be created as its new + version. That uuid is returned in the did field of the response operationId: addNewVersion - produces: - - application/json parameters: - name: UUID in: path description: the uuid associated to the record needed to have new version required: true - type: string - - in: body - name: body - description: index record metadata for the new version - required: true schema: - $ref: '#/definitions/VersionInputInfo' + type: string responses: '200': description: successful operation - schema: - $ref: '#/definitions/OutputRef' + content: + application/json: + schema: + $ref: '#/components/schemas/OutputRef' '400': description: Invalid status value security: - basic_auth: [] - '/index/{DID}': + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/VersionInputInfo' + description: index record metadata for the new version + required: true put: tags: - index summary: Update an existing entry in the index description: '' operationId: updateEntry - consumes: - - application/json - produces: - - application/json parameters: - - name: DID + - name: UUID in: path description: entry id required: true - type: string + schema: + type: string - name: rev in: query description: data revision - simple consistency mechanism required: true - type: string - - in: body - name: body - description: index record that needs to be updated - required: true schema: - $ref: '#/definitions/UpdateInputInfo' + type: string responses: '200': description: success - schema: - $ref: '#/definitions/OutputRef' + content: + application/json: + schema: + $ref: '#/components/schemas/OutputRef' '400': description: Invalid input security: - basic_auth: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateInputInfo' + description: index record that needs to be updated + required: true delete: tags: - index summary: Delete an entry from the index description: '' operationId: deleteEntry - produces: - - application/json parameters: - - name: DID + - name: UUID in: path description: entry id required: true - type: string + schema: + type: string - name: rev in: query description: data revision - simple consistency mechanism required: true - type: string + schema: + type: string responses: - '400': - description: Invalid ID supplied '200': description: Record is deleted successfully + '400': + description: Invalid ID supplied security: - basic_auth: [] '/index/{UUID}/latest': @@ -258,19 +263,20 @@ paths: given id description: Multiple status values can be provided with comma separated strings operationId: getLatestVersion - produces: - - application/json parameters: - name: UUID in: path description: entry id required: true - type: string + schema: + type: string responses: '200': description: successful operation - schema: - $ref: '#/definitions/OutputInfo' + content: + application/json: + schema: + $ref: '#/components/schemas/OutputInfo' '400': description: Invalid status value security: [] @@ -281,139 +287,145 @@ paths: summary: Get the metadata of index record versions associated with the given id description: Multiple status values can be provided with comma separated strings operationId: getAllVersions - produces: - - application/json parameters: - name: UUID in: path description: entry id required: true - type: string + schema: + type: string responses: '200': description: successful operation - schema: - type: array - items: - $ref: '#/definitions/OutputInfo' + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/OutputInfo' '400': description: Invalid status value security: [] - '/alias/': + /alias/: get: tags: - alias summary: list aliases with pagination - operationId: listEntries - consumes: - - application/json - produces: - - application/json + operationId: listAliasEntries parameters: - name: size in: query - type: integer - format: int64 required: false description: size in bytes + schema: + type: integer + format: int64 - name: start in: query - type: integer - format: int64 required: false description: start index for the pagination + schema: + type: integer + format: int64 - name: limit in: query - type: integer required: false description: number of aliases to return + schema: + type: integer - name: hash in: query required: false - format: string + schema: + type: string + format: string responses: '200': description: successful operation - schema: - type: object - properties: - aliases: - type: array - items: - type: string - size: - type: integer - format: int64 - description: size in bytes - start: - type: integer - format: int64 - description: start index for the pagination - limit: - type: integer - format: int64 - description: number of aliases to return - hashes: - $ref: '#/definitions/HashInfo' + content: + application/json: + schema: + type: object + properties: + aliases: + type: array + items: + type: string + size: + type: integer + format: int64 + description: size in bytes + start: + type: integer + format: int64 + description: start index for the pagination + limit: + type: integer + format: int64 + description: number of aliases to return + hashes: + $ref: '#/components/schemas/HashInfo' '/alias/{ALIASSTRING}': put: tags: - alias summary: Create or update an alias description: '' - operationId: upsertEntry - consumes: - - application/json - produces: - - application/json + operationId: upsertAliasEntry parameters: - name: ALIASSTRING in: path - type: string required: true description: 'alias like ark:/31807/DC1-TESTARK' + schema: + type: string - name: rev in: query - type: string - pattern: '^[a-z,0-9]{8}$' required: false - description: Revision of the current alias to be updated. If you do not specify this then the last update wins in races. - - in: body - name: body - description: Metadata object that needs to be added to the store - required: true + description: >- + Revision of the current alias to be updated. If you do not specify + this then the last update wins in races. schema: - $ref: '#/definitions/AliasInputInfo' + type: string + pattern: '^[a-z,0-9]{8}$' responses: '200': description: successful operation - schema: - $ref: '#/definitions/AliasRef' + content: + application/json: + schema: + $ref: '#/components/schemas/AliasRef' '400': description: Invalid input security: - basic_auth: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AliasInputInfo' + description: Metadata object that needs to be added to the store + required: true get: tags: - alias summary: Fetch an alias description: '' - operationId: getEntry - consumes: - - application/json - produces: - - application/json + operationId: getAliasEntry parameters: - name: ALIASSTRING in: path - type: string required: true description: 'alias like ark:/31807/DC1-TESTARK' + schema: + type: string responses: '200': description: successful operation - schema: - $ref: '#/definitions/AliasOutputInfo' + content: + application/json: + schema: + $ref: '#/components/schemas/AliasOutputInfo' '400': description: Invalid input security: [] @@ -422,28 +434,28 @@ paths: - alias summary: Delete an alias description: '' - operationId: deleteEntry - consumes: - - application/json - produces: - - application/json + operationId: deleteAliasEntry parameters: - name: ALIASSTRING in: path - type: string required: true description: 'alias like ark:/31807/DC1-TESTARK' + schema: + type: string - name: rev in: query - type: string - pattern: '^[a-z,0-9]{8}$' required: false description: Revision of the current alias to be deleted. + schema: + type: string + pattern: '^[a-z,0-9]{8}$' responses: '200': description: successful operation - schema: - $ref: '#/definitions/AliasRef' + content: + application/json: + schema: + $ref: '#/components/schemas/AliasRef' '400': description: Invalid input security: @@ -454,10 +466,8 @@ paths: - system summary: Returns if IndexD is healthy or not description: >- - Health check endpoint which checks if IndexD can connect to its - backing datastore or not. - produces: - - application/text + Health check endpoint which checks if IndexD can connect to its backing + datastore or not. responses: '200': description: Healthy @@ -468,281 +478,282 @@ paths: tags: - system summary: Returns the version of IndexD - produces: - - application/json responses: '200': description: successful operation - schema: - $ref: '#/definitions/SystemVersionOutputRef' + content: + application/json: + schema: + $ref: '#/components/schemas/SystemVersionOutputRef' /_stats: get: tags: - system summary: Returns basic information about the records in IndexD - produces: - - application/json responses: '200': description: successful operation - schema: - $ref: '#/definitions/SystemStatsOutputRef' -securityDefinitions: - cdis_auth: - type: oauth2 - authorizationUrl: 'https://data-commons.org/oauth/dialog' - flow: implicit - scopes: - 'write:index': modify any entry in the index - 'read:index': read any entry from the index - basic_auth: - type: basic - name: basic_auth - in: header -definitions: - HashInfo: - type: object - properties: - md5: - type: string - pattern: '^[0-9a-f]{32}$' - sha: - type: string - pattern: '^[0-9a-f]{40}$' - sha256: - type: string - pattern: '^[0-9a-f]{64}$' - sha512: - type: string - pattern: '^[0-9a-f]{128}$' - crc: - type: string - pattern: '^[0-9a-f]{8}$' - etag: - type: string - pattern: '^[0-9a-f]{32}(-\d+)?$' - VersionInputInfo: - type: object - required: - - size - - hashes - - urls - - form - properties: - form: - type: string - description: how the entry was submitted to storage - enum: - - object - - container - - multipart - size: - type: integer - format: int64 - description: size in bytes - file_name: - type: string - metadata: - type: string - version: - type: string - urls: - type: array - items: - type: string - hashes: - $ref: '#/definitions/HashInfo' - InputInfo: - type: object - required: - - size - - hashes - - urls - - form - properties: - did: - $ref: "#/definitions/DID" - baseid: - $ref: "#/definitions/UUID" - form: - type: string - description: how the entry was submitted to storage - enum: - - object - - container - - multipart - size: - type: integer - format: int64 - description: size in bytes - file_name: - type: string - metadata: - type: string - version: - type: string - urls: - type: array - items: - type: string - hashes: - $ref: '#/definitions/HashInfo' - UpdateInputInfo: - type: object - properties: - base_id: - type: string - pattern: >- - ^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$ - file_name: - type: string - metadata: - type: object - version: - type: string - urls: - type: array - items: - type: string - OutputRef: - type: object - properties: - did: - $ref: "#/definitions/DID" - baseid: - $ref: "#/definitions/UUID" - rev: - type: string - pattern: '^[0-9a-f]{8}$' - AliasInputInfo: - type: object - properties: - release: - type: string - description: has the entity been released? - enum: - - public - - private - - controlled - size: - type: integer - format: int64 - description: size in bytes - keeper_authority: - description: who is keeping this entry up to date? - type: string - host_authority: - description: who is hosting this entity? - type: array - items: - type: string - hashes: - $ref: '#/definitions/HashInfo' - metadata: - type: string - AliasRef: - type: object - properties: - name: - type: string - rev: - type: string - pattern: '^[0-9a-f]{8}$' - AliasOutputInfo: - type: object - properties: - name: - type: string - rev: - type: string - pattern: '^[0-9a-f]{8}$' - release: - type: string - description: has the entity been released? - enum: - - public - - private - - controlled - size: - type: integer - format: int64 - description: size in bytes - keeper_authority: - description: who is keeping this entry up to date? - type: string - host_authority: - description: who is hosting this entity? - type: array - items: - type: string - hashes: - $ref: '#/definitions/HashInfo' - metadata: - type: string - DID: - type: string - pattern: >- - ^.*[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$ - UUID: - type: string - pattern: >- - ^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$ - OutputInfo: - type: object - properties: - did: - $ref: "#/definitions/DID" - baseid: - $ref: "#/definitions/UUID" - rev: - type: string - pattern: '^[0-9a-f]{8}$' - form: - type: string - description: how the entry was submitted to storage - enum: - - object - - container - - multipart - size: - type: integer - format: int64 - description: size in bytes - file_name: - type: string - version: - type: string - urls: - type: array - items: - type: string - hashes: - $ref: '#/definitions/HashInfo' - updated_date_by: - type: string - format: date-time - description: last updated time - metadata: - type: object - description: user defined optional metadata - SystemVersionOutputRef: - type: object - properties: - commit: - type: string - description: the current git commit hash for this version - version: - type: string - description: the current git tag version - SystemStatsOutputRef: - type: object - properties: - fileCount: - type: integer - description: the number of records stored in IndexD - totalFileSize: - type: integer - description: the accumulated size of the object files recorded in IndexD + content: + application/json: + schema: + $ref: '#/components/schemas/SystemStatsOutputRef' externalDocs: description: Find out more about Swagger url: 'http://swagger.io' +components: + securitySchemes: + cdis_auth: + type: oauth2 + flows: + implicit: + authorizationUrl: 'https://data-commons.org/oauth/dialog' + scopes: + 'write:index': modify any entry in the index + 'read:index': read any entry from the index + basic_auth: + type: http + scheme: basic + schemas: + HashInfo: + type: object + properties: + md5: + type: string + pattern: '^[0-9a-f]{32}$' + sha: + type: string + pattern: '^[0-9a-f]{40}$' + sha256: + type: string + pattern: '^[0-9a-f]{64}$' + sha512: + type: string + pattern: '^[0-9a-f]{128}$' + crc: + type: string + pattern: '^[0-9a-f]{8}$' + etag: + type: string + pattern: '^[0-9a-f]{32}(-\d+)?$' + VersionInputInfo: + type: object + required: + - size + - hashes + - urls + - form + properties: + form: + type: string + description: how the entry was submitted to storage + enum: + - object + - container + - multipart + size: + type: integer + format: int64 + description: size in bytes + file_name: + type: string + metadata: + type: string + version: + type: string + urls: + type: array + items: + type: string + hashes: + $ref: '#/components/schemas/HashInfo' + InputInfo: + type: object + required: + - size + - hashes + - urls + - form + properties: + did: + $ref: '#/components/schemas/DID' + baseid: + $ref: '#/components/schemas/UUID' + form: + type: string + description: how the entry was submitted to storage + enum: + - object + - container + - multipart + size: + type: integer + format: int64 + description: size in bytes + file_name: + type: string + metadata: + type: string + version: + type: string + urls: + type: array + items: + type: string + hashes: + $ref: '#/components/schemas/HashInfo' + UpdateInputInfo: + type: object + properties: + base_id: + type: string + pattern: >- + ^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$ + file_name: + type: string + metadata: + type: object + version: + type: string + urls: + type: array + items: + type: string + OutputRef: + type: object + properties: + did: + $ref: '#/components/schemas/DID' + baseid: + $ref: '#/components/schemas/UUID' + rev: + type: string + pattern: '^[0-9a-f]{8}$' + AliasInputInfo: + type: object + properties: + release: + type: string + description: has the entity been released? + enum: + - public + - private + - controlled + size: + type: integer + format: int64 + description: size in bytes + keeper_authority: + description: who is keeping this entry up to date? + type: string + host_authority: + description: who is hosting this entity? + type: array + items: + type: string + hashes: + $ref: '#/components/schemas/HashInfo' + metadata: + type: string + AliasRef: + type: object + properties: + name: + type: string + rev: + type: string + pattern: '^[0-9a-f]{8}$' + AliasOutputInfo: + type: object + properties: + name: + type: string + rev: + type: string + pattern: '^[0-9a-f]{8}$' + release: + type: string + description: has the entity been released? + enum: + - public + - private + - controlled + size: + type: integer + format: int64 + description: size in bytes + keeper_authority: + description: who is keeping this entry up to date? + type: string + host_authority: + description: who is hosting this entity? + type: array + items: + type: string + hashes: + $ref: '#/components/schemas/HashInfo' + metadata: + type: string + DID: + type: string + pattern: >- + ^.*[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$ + UUID: + type: string + pattern: >- + ^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$ + OutputInfo: + type: object + properties: + did: + $ref: '#/components/schemas/DID' + baseid: + $ref: '#/components/schemas/UUID' + rev: + type: string + pattern: '^[0-9a-f]{8}$' + form: + type: string + description: how the entry was submitted to storage + enum: + - object + - container + - multipart + size: + type: integer + format: int64 + description: size in bytes + file_name: + type: string + version: + type: string + urls: + type: array + items: + type: string + hashes: + $ref: '#/components/schemas/HashInfo' + updated_date_by: + type: string + format: date-time + description: last updated time + metadata: + type: object + description: user defined optional metadata + SystemVersionOutputRef: + type: object + properties: + commit: + type: string + description: the current git commit hash for this version + version: + type: string + description: the current git tag version + SystemStatsOutputRef: + type: object + properties: + fileCount: + type: integer + description: the number of records stored in IndexD + totalFileSize: + type: integer + description: the accumulated size of the object files recorded in IndexD From 936ed079f921a0229a33de642f5c7a4ad20d4063 Mon Sep 17 00:00:00 2001 From: Zac Flamig Date: Sun, 22 Apr 2018 10:39:14 -0500 Subject: [PATCH 2/4] feat(codegen): New version for 3.0 --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 150f5cc1..d73a4fc7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,8 +11,8 @@ addons: sudo: false install: - - "wget https://oss.sonatype.org/content/repositories/releases/io/swagger/swagger-codegen-cli/2.3.1/swagger-codegen-cli-2.3.1.jar" - - "java -jar swagger-codegen-cli-2.3.1.jar generate -i openapis/swagger.yaml -l python -o swagger_client" + - "wget https://oss.sonatype.org/content/repositories/snapshots/io/swagger/swagger-codegen-cli/3.0.0-SNAPSHOT/swagger-codegen-cli-3.0.0-20180411.134218-60.jar" + - "java -jar swagger-codegen-cli-3.0.0-20180411.134218-60.jar generate -i openapis/swagger.yaml -l python -o swagger_client" - "cd swagger_client; python setup.py install; cd .." - "python setup.py install --force" - "pip install -r test-requirements.txt" From 5bb8ddfde1c104f9f48f23503b221bea3f8b66b2 Mon Sep 17 00:00:00 2001 From: Zac Flamig Date: Mon, 25 Feb 2019 22:21:02 -0600 Subject: [PATCH 3/4] Update .travis.yml --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index d73a4fc7..03e86a8c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,8 +11,8 @@ addons: sudo: false install: - - "wget https://oss.sonatype.org/content/repositories/snapshots/io/swagger/swagger-codegen-cli/3.0.0-SNAPSHOT/swagger-codegen-cli-3.0.0-20180411.134218-60.jar" - - "java -jar swagger-codegen-cli-3.0.0-20180411.134218-60.jar generate -i openapis/swagger.yaml -l python -o swagger_client" + - "wget https://oss.sonatype.org/content/repositories/snapshots/org/openapitools/openapi-generator-cli/4.0.0-SNAPSHOT/openapi-generator-cli-4.0.0-20190225.145928-329.jar" + - "java -jar openapi-generator-cli-4.0.0-20190225.145928-329.jar generate -i openapis/swagger.yaml -l python -o swagger_client" - "cd swagger_client; python setup.py install; cd .." - "python setup.py install --force" - "pip install -r test-requirements.txt" From 3a1be4dee37f14d41d90b44e7173641bd7dde792 Mon Sep 17 00:00:00 2001 From: Zac Flamig Date: Mon, 25 Feb 2019 22:25:05 -0600 Subject: [PATCH 4/4] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 03e86a8c..f30f4e69 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,7 +12,7 @@ sudo: false install: - "wget https://oss.sonatype.org/content/repositories/snapshots/org/openapitools/openapi-generator-cli/4.0.0-SNAPSHOT/openapi-generator-cli-4.0.0-20190225.145928-329.jar" - - "java -jar openapi-generator-cli-4.0.0-20190225.145928-329.jar generate -i openapis/swagger.yaml -l python -o swagger_client" + - "java -jar openapi-generator-cli-4.0.0-20190225.145928-329.jar generate -i openapis/swagger.yaml -g python -o swagger_client" - "cd swagger_client; python setup.py install; cd .." - "python setup.py install --force" - "pip install -r test-requirements.txt"