Skip to main content

Python library to check Swagger Spec backward compatibility

Project description

https://img.shields.io/travis/com/Yelp/swagger-spec-compatibility.svg https://img.shields.io/codecov/c/gh/Yelp/swagger-spec-compatibility.svg PyPi version Supported Python versions

swagger-spec-compatibility

About

swagger-spec-compatibility is a Yelp maintained library that provides tools to automatically detect the safety of Swagger/OpenAPI 2.0 specification changes with respect to backwards compatibility.

swagger-spec-compatibility aims to give developers confidence that their spec changes are safe and that clients built with previous versions of the Swagger spec can continue to communicate correctly.

Documentation

More documentation is available at swagger-spec-compatibility.readthedocs.org.

How to Install

# to install the latest released version
$ pip install swagger-spec-compatiblity

# to install the latest master [from Github]
$ pip install git+https://github.com/Yelp/swagger-spec-compatibility

Example Usage

The commands below assume that the library is already installed

$ swagger_spec_compatibility -h

usage: swagger_spec_compatibility [-h]
                              [-r {MIS-E001,MIS-E002,REQ-E001,REQ-E002,REQ-E003,RES-E001,RES-E002,RES-E003} [{MIS-E001,MIS-E002,REQ-E001,REQ-E002,REQ-E003,RES-E001,RES-E002,RES-E003} ...]]
                              {explain,run} ...

Tool for the identification of backward incompatible changes between two swagger specs.

The tool provides the following level of results:
- WARNING: the Swagger specs are technically compatible but the are likely to break known Swagger implementations
- ERROR: new Swagger spec does introduce a breaking change respect the old implementation

positional arguments:
  {explain,run}         help for sub-command
    explain             explain selected rules
    run                 run backward compatibility detection

optional arguments:
  -h, --help            show this help message and exit
  -r {MIS-E001,MIS-E002,REQ-E001,REQ-E002,REQ-E003,RES-E001,RES-E002,RES-E003} [{MIS-E001,MIS-E002,REQ-E001,REQ-E002,REQ-E003,RES-E001,RES-E002,RES-E003} ...], --rules {MIS-E001,MIS-E002,REQ-E001,REQ-E002,REQ-E003,RES-E001,RES-E002,RES-E003} [{MIS-E001,MIS-E002,REQ-E001,REQ-E002,REQ-E003,RES-E001,RES-E002,RES-E003} ...]
                        Rules to apply for compatibility detection. (default:
                        ['MIS-E001', 'MIS-E002', 'REQ-E001', 'REQ-E002',
                        'REQ-E003', 'RES-E001', 'RES-E002', 'RES-E003'])
$ swagger_spec_compatibility explain -r=REQ-E001 -r=REQ-E002 explain
Rules explanation
[REQ-E001] Added Required Property in Request contract:
    Adding a required property to an object used in requests leads client request to fail if the property is not present.
[REQ-E002] Removed Enum value from Request contract:
    Removing an enum value from a request parameter is backward incompatible as a previously valid request will not be
    valid. This happens because a request containing the removed enum value, valid according to the "old" Swagger spec, is
    not valid according to the new specs.
$ old_spec_path=docs/source/rules/examples/REQ-E001/old.yaml
$ new_spec_path=docs/source/rules/examples/REQ-E001/new.yaml

# Run with all the registered rules
$ swagger_spec_compatibility run ${old_spec_path} ${new_spec_path}
ERROR rules:
    [REQ-E001] Added Required Property in Request contract : #/paths//endpoint/post/parameters/0/schema
$ echo $?
1

# Run with a subset of registered rules
$ swagger_spec_compatibility -r=MIS-E001 -r=MIS-E002 run ${old_spec_path} ${new_spec_path}
$ echo $?
0

Development

Code is documented using Sphinx.

virtualenv is recommended to keep dependencies and libraries isolated.

Setup

# Initialize your dev environment
$ make minimal

# Ensure that you have activated the virtualenvironment
$ source ./venv/bin/activate

Tip: If you have aactivator installed the virtual environment will be automatically activated

How to define a new compatibility rule

Use the following steps to define a new rule:

  1. Define a new rule class in swagger_spec_compatibility/rules/

# Example of the file content  (assume that the file will be named FILE.py)
class RuleClassName(BaseRule):
    description = ''
    error_code = 'ERROR_CODE'
    error_level = Level.LEVEL
    rule_type = RuleType.TYPE
    short_name = ''

    @classmethod
    def validate(cls, left_spec, right_spec):
        # type: (Spec, Spec) -> typing.Iterable[ValidationMessage]
        # Implement here your logic
        raise NotImplemented()

 # Please make sure that:
 #  * `description` and `short_name` are reasonably explicative to support `swagger_spec_compatibility explain` command
 #  * `error_code` has REQ- prefix for `RuleType.REQUEST_CONTRACT`, RES- for `RuleType.RESPONSE_CONTRACT` and MIS- for `RuleType.MISCELLANEOUS`
  1. Add tests to ensure that your rule behaves as expected (tests in tests/rules/FILE_test.py)

  1. Add documentation for the defined rule in docs/source/rules/ERROR_CODE.rst. Try to be consistent with the style of the others documentation pages

  2. Add example of a Swagger spec change that triggers the rule in docs/source/rules/examples/ERROR_CODE.rst. Ensure to define a tester.py file that will make explicit the backward incompatible change through the usage of a bravado client (check the other testers for examples). NOTE: The testers are executed by automated tests, this is intended to ensure that documentation is in sync with the codebase.

  3. [Optional] Add integration tests to ensure that no regressions will be introduced and/or to validate edge cases of the new rule. Integration tests are defined as follow: case-<incremental number>-<number of expected reports>-reports-<short description> directory with two files: old.yaml and new.yaml. The two files represent two versions of the swagger specs that need to be checked for backward compatibility.

Contributing

  1. Fork it ( http://github.com/Yelp/swagger-spec-compatibility/fork )

  2. Create your feature branch (git checkout -b my-new-feature)

  3. Add your modifications

  4. Commit your changes (git commit -m "Add some feature")

  5. Push to the branch (git push origin my-new-feature)

  6. Create new Pull Request

License

Copyright 2019 Yelp, Inc.

Swagger Spec Compatibility is licensed with a Apache License 2.0.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

swagger-spec-compatibility-1.2.0.tar.gz (19.4 kB view details)

Uploaded Source

Built Distribution

swagger_spec_compatibility-1.2.0-py2.py3-none-any.whl (39.3 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file swagger-spec-compatibility-1.2.0.tar.gz.

File metadata

  • Download URL: swagger-spec-compatibility-1.2.0.tar.gz
  • Upload date:
  • Size: 19.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.21.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.5.6

File hashes

Hashes for swagger-spec-compatibility-1.2.0.tar.gz
Algorithm Hash digest
SHA256 0e9b92660b1297c9e3ae5dd422dd23f33dcc2cea169d585d8946c027cf7b082c
MD5 5c4a48398cc2f624bde57e518eced226
BLAKE2b-256 1874a4c026fa909688e570f6223e57ec84cf321cf1ec44f8f64a2b26a55e9ca3

See more details on using hashes here.

File details

Details for the file swagger_spec_compatibility-1.2.0-py2.py3-none-any.whl.

File metadata

  • Download URL: swagger_spec_compatibility-1.2.0-py2.py3-none-any.whl
  • Upload date:
  • Size: 39.3 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.21.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.5.6

File hashes

Hashes for swagger_spec_compatibility-1.2.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 a2215558fec8ef66f7b938c7de8d96efceacfa05e1fa575c7a45d4fcabf4eb01
MD5 8c833afb9be29dfb7ff03fcc1fd03de3
BLAKE2b-256 09c67e7ee99991c5b9d5eed24eecdc8b9ddb976d012344d73a4f80de29f492d3

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page