Package: pactum
PactumThe HTTP-API specification sketchbook for pythonistaspipinstallpactumWithPactumyou canspecifyHTTP-APIs using pure python.Pactum is easy to use, easy to extend and easy to contribute:Easy to useThe only requirements to start writing an API specification withpactumispactumpackage itself and some knowledge of python.importpactumclassMyAPI(pactum.API):name='My API'versions=[...]Easy to extendUsing thevisitor patternyou can create
exporters and extensions for any format or service you want.Take a look atpactum/exporters/openapi.py.ArchitectureAlways keepthis diagramin mind when defining your APIs.TutorialCreate a file called specs.py and start defining your API.You can define aResourceobject for your API.frompactumimportAction,API,Resource,Response,Versionfrompactumimportfields,verbsclassOrder(Resource):fields=[fields.IntegerField(name='code',required=True),fields.TimestampField(name='created_at'),fields.StringField(name='item')]resource=Order()error_resource=Resource(name='ErrorResource'fields=[fields.StringField(name='error',required=False)])You can define any element of your specification by calling it directly as inerror_resourceor by class definition as inMyResourceand then calling it.List resources are definitions of lists of the same resource.list_order_resource=ListResource(resource=resource)You can defineResponseobjects withstatus,description(optional)  aheader(optional) and aResource/ListResourceobject asbody(optionally)...list_response=Response(status=200,description='Here is your orders list.',body=list_resource)detail_response=Response(status=200,description='Here is your order.',body=resource)error_response=Response(status=404,resource=error_resource,headers=[('Content-type':'application-json')])... andRequestobjects withverb,description,header(optional) and aResource/ListResourceobject aspayload.get_request=Request(verb=verbs.GET)AnActiongroups your request and a list of responses for a specified action passed in the description parameter.list_action=Action(description='Returns a list of resources.',request=get_request,responses=[error_response,list_response])detail_action=Action(description='Returns a resource based on its code.',request=get_request,responses=[error_response,detail_response])The Action object, as all other elements in Pactum, receive a description string
that sets the.__doc__attribute and can be the docstring of the class
if the object is defined by class definition.A route can have a list of actions in an HTTP path.classOrderListRoute(Route):path='/orders'actions=[list_action]list_route=OrderListRoute()detail_route=OrderRoute(path='/orders/{code}',actions=detail_action)Your routes can be grouped in API versions.classV1(Version):name='V1'routes=[list_route,detail_route]v1=V1()Then you can define your API. ;)classOrdersAPI(API):name='Orders API'versions=[v1]api=OrdersAPI()Be happy and ready to export your specification to any format you want.Exporting to openapi specs.Pactum has a command that exports your specification to OpenAPI. You can call it by using:pactum-openapi <spec_file.py> <output_file> [--format=<json or yaml>]Road to version 1.Test elements .accept(visitor) methods.Support for version selectors (Versions should be specified on HTTP header, path, or custom fields)Stabilize the way we work with path parameters.Support for Authorization and Authentication Specifications.Support for extensions.Behaviors