All Projects → goldspecdigital → Oooas

goldspecdigital / Oooas

Licence: mit
An object oriented approach to generating OpenAPI specs, implemented in PHP.

Projects that are alternatives of or similar to Oooas

Swaggen
OpenAPI/Swagger 3.0 Parser and Swift code generator
Stars: ✭ 385 (+137.65%)
Mutual labels:  swagger, openapi, oas
openapi-schema-validator
OpenAPI schema validator for Python
Stars: ✭ 35 (-78.4%)
Mutual labels:  swagger, openapi, oas
Openapi Spec Validator
OpenAPI Spec validator
Stars: ✭ 161 (-0.62%)
Mutual labels:  swagger, openapi, oas
Openapi Core
OpenAPI core
Stars: ✭ 119 (-26.54%)
Mutual labels:  swagger, openapi, oas
Spectral
A flexible JSON/YAML linter for creating automated style guides, with baked in support for OpenAPI v2 & v3.
Stars: ✭ 876 (+440.74%)
Mutual labels:  swagger, openapi, oas
Swagger Ui
Swagger UI is a collection of HTML, JavaScript, and CSS assets that dynamically generate beautiful documentation from a Swagger-compliant API.
Stars: ✭ 21,279 (+13035.19%)
Mutual labels:  swagger, openapi, oas
Openapi Directory
🌐 Wikipedia for Web APIs. Directory of REST API definitions in OpenAPI 2.0/3.x format
Stars: ✭ 2,635 (+1526.54%)
Mutual labels:  swagger, openapi, oas
Awesome Openapi3
😎 A list of awesome projects related to OpenAPI 3.0.x, curated by the community
Stars: ✭ 469 (+189.51%)
Mutual labels:  swagger, openapi, oas
Kaizen Openapi Editor
Eclipse Editor for the Swagger-OpenAPI Description Language
Stars: ✭ 97 (-40.12%)
Mutual labels:  swagger, openapi, open-source
Prism
Turn any OpenAPI2/3 and Postman Collection file into an API server with mocking, transformations and validations.
Stars: ✭ 2,484 (+1433.33%)
Mutual labels:  swagger, openapi, oas
Mentorship Backend
Mentorship System is an application that matches women in tech to mentor each other, on career development, through 1:1 relations during a certain period of time. This is the backend of this system.
Stars: ✭ 132 (-18.52%)
Mutual labels:  swagger, openapi
Angular Swagger Ui
An angularJS implementation of Swagger UI
Stars: ✭ 131 (-19.14%)
Mutual labels:  swagger, openapi
Open Api Renderer
🎩 A React renderer for OpenAPI v3.
Stars: ✭ 127 (-21.6%)
Mutual labels:  swagger, openapi
Tsed
📐 Ts.ED is a Node.js and TypeScript framework on top of Express to write your application with TypeScript (or ES6). It provides a lot of decorators and guideline to make your code more readable and less error-prone.
Stars: ✭ 1,941 (+1098.15%)
Mutual labels:  open-source, swagger
Graphql Mesh
GraphQL Mesh — Query anything, run anywhere
Stars: ✭ 2,114 (+1204.94%)
Mutual labels:  swagger, openapi
Restful React
A consistent, declarative way of interacting with RESTful backends, featuring code-generation from Swagger and OpenAPI specs 🔥
Stars: ✭ 1,814 (+1019.75%)
Mutual labels:  swagger, openapi
Flama
🔥 Fire up your API with this flamethrower
Stars: ✭ 161 (-0.62%)
Mutual labels:  swagger, openapi
Terraform Provider Openapi
OpenAPI Terraform Provider that configures itself at runtime with the resources exposed by the service provider (defined in a swagger file)
Stars: ✭ 134 (-17.28%)
Mutual labels:  swagger, openapi
Prance
Resolving Swagger/OpenAPI 2.0 and 3.0 Parser
Stars: ✭ 133 (-17.9%)
Mutual labels:  swagger, openapi
Vs Swagger Viewer
Swagger Viewer lets you preview and validate Swagger 2.0 and OpenAPI files as you type in Visual Studio Code.
Stars: ✭ 126 (-22.22%)
Mutual labels:  swagger, openapi

Object Oriented OpenAPI Specification

GitHub stars

GitHub tag (latest SemVer) Build status Packagist PHP from Packagist Dependency count Packagist

Introduction

An object oriented approach to generating OpenAPI specs, implemented in PHP.

You can build up your API spec using immutable PHP classes, and then export the spec to JSON (or YAML with the help of another package).

This package is dependency free and makes heavy use of PHP 7 features, mainly being type hints and enabling strict types. This should make your life a lot easier when working with a good IDE that can use this information.

Installing

You can install the package via composer:

composer require goldspecdigital/oooas

Example

See the code sample below for the most basic usage:

use GoldSpecDigital\ObjectOrientedOAS\Objects\{
    Info, MediaType, Operation, PathItem, Response, Schema, Tag
};
use GoldSpecDigital\ObjectOrientedOAS\OpenApi;

// Create a tag for all the user endpoints.
$usersTag = Tag::create()
    ->name('Users')
    ->description('All user related endpoints');

// Create the info section.
$info = Info::create()
    ->title('API Specification')
    ->version('v1')
    ->description('For using the Example App API');
    
// Create the user schema.
$userSchema = Schema::object()
    ->properties(
        Schema::string('id')->format(Schema::FORMAT_UUID),
        Schema::string('name'),
        Schema::integer('age')->example(23),
        Schema::string('created_at')->format(Schema::FORMAT_DATE_TIME)
    );
    
// Create the user response.
$userResponse = Response::create()
    ->statusCode(200)
    ->description('OK')
    ->content(
        MediaType::json()->schema($userSchema)
    );
    
// Create the operation for the route (i.e. GET, POST, etc.).
$showUser = Operation::get()
    ->responses($userResponse)
    ->tags($usersTag)
    ->summary('Get an individual user')
    ->operationId('users.show');
    
// Define the /users path along with the supported operations.
$usersPath = PathItem::create()
    ->route('/users')
    ->operations($showUser);
    
// Create the main OpenAPI object composed off everything created above.
$openApi = OpenApi::create()
    ->openapi(OpenApi::OPENAPI_3_0_2)
    ->info($info)
    ->paths($usersPath)
    ->tags($usersTag);
    
header('Content-Type: application/json');
echo $openApi->toJson();

YAML output

Using the same code above will output the following YAML:

In this example, the YAML may seem simpler to look at, however once the spec starts to increase in size - the ability to reuse objects and split them into separate files easily will be a massive help.

openapi: 3.0.2
info:
  title: API Specification
  description: For using the Example App API
  version: v1
paths:
  "/users":
    get:
      tags:
      - Users
      summary: Get an individual user
      operationId: users.show
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    format: uuid
                    type: string
                  name:
                    type: string
                  age:
                    type: integer
                    example: 23
                  created_at:
                    format: date-time
                    type: string
tags:
- name: Users
  description: All user related endpoints

Outputting as JSON or YAML

Built in output to YAML has been omitted on purpose to keep this package dependency free. However, you can easily convert the array to a YAML string using several open source packages. See below for an example of outputting to both JSON and YAML:

use GoldSpecDigital\ObjectOrientedOAS\OpenApi;
use Symfony\Component\Yaml\Yaml;

$openApi = OpenApi::create();

$json = $openApi->toJson();
$array = $openApi->toArray();
$yaml = Yaml::dump($array);

Guidance

If you want to learn more about the OpenAPI schema, then have a look at the official OpenAPI Specification.

Alternatively, if you would like a quick reference, then check out the OpenAPI Map project created by Arnaud Lauret.

You can use this interactive tool to figure out what objects go where and how they relate to one another.

Usage

Setting and unsetting properties

Each object has setter methods for it's supported properties. Most of these methods allow null values which will need to be explicitly passed (see the next example for how to unset using variadic setter methods). This will have the effect of unsetting the property:

$info = Info::create()
    ->title('Example API');

$openApi = OpenApi::create()
    ->info($info);
echo $openApi->toJson(); // '{"info": {"title": "Example API"}}'

$openApi = $openApi->info(null);
echo $openApi->toJson(); // '{}'

For variadic setter methods, if you call the method and don't supply any parameters, then this will have the effect of unsetting the property:

$path = PathItem::create()
    ->route('/users');

$openApi = OpenApi::create()
    ->paths($path);
echo $openApi->toJson(); // '{"paths": {"/users": []}}'

$openApi = $openApi->paths();
echo $openApi->toJson(); // '{}'

Retrieving properties

You can easily retrieve a property using a magic getter. These have been implemented for all properties for every object. DocBlocks have been provided to give better auto-completion in IDEs:

$info = Info::create()->title('Example API');

echo $info->title; // 'Example API'

Object ID

Every object has an optional $objectId property which is a string and can either be set in the class constructor or the preferred create() method. This property is used when a parent object needs to use a name for the children.

An example of this in use is when a schema object is composed of other schema properties:

$schema = Schema::create()
    ->type(Schema::TYPE_OBJECT)
    ->properties(
        Schema::create('username')->type(Schema::TYPE_STRING),
        Schema::create('age')->type(Schema::TYPE_INTEGER)
    );
    
echo $schema->toJson();
/* 
{
  "type": "object",
  "properties": {
    "username": {
      "type": "string"
    },
    "age": {
      "type": "integer"
    }
  }
} 
*/

If an object contains any helper creation methods, then these methods also allow you to specify the $objectId property as a parameter. The code sample below is functionally identical to the one above:

$schema = Schema::object()
    ->properties(
        Schema::string('username'),
        Schema::integer('age')
    );
    
echo $schema->toJson();
/* 
{
  "type": "object",
  "properties": {
    "username": {
      "type": "string"
    },
    "age": {
      "type": "integer"
    }
  }
} 
*/

$ref

The use of $ref has been applied to every single object to use as you wish. You may substitute any object for a $ref by invoking the ref() static method on the object class:

$schema = AllOf::create()
    ->schemas(
        Schema::ref('#/components/schemas/ExampleSchema')
    );
    
echo $schema->toJson();
/*
{
  "allOf": [
    ["$ref": "#/components/schemas/ExampleSchema"]
  ]
}
*/

Specification extensions

You can add specification extensions to all objects:

$schema = Schema::create()
    ->x('foo', 'bar')
    ->x('items', Schema::array()->items(Schema::string()));
    
echo $schema->toJson();
/*
{
  "x-foo": "bar",
  "x-items": {
    "type": "array",
    "items": {
      "type": "string"
    }
  }
}
*/

echo $schema->{'x-foo'}; // 'bar'

You can also unset specification extensions by invoking the x() method and only providing the key:

$schema = Schema::create()
    ->x('foo', 'bar')
    ->x('items', Schema::array()->items(Schema::string()));

$schema = $schema->x('foo');
    
echo $schema->toJson();
/*
{
  "x-items": {
    "type": "array",
    "items": {
      "type": "string"
    }
  }
}
*/

To retrieve an array of all the specification extensions you can call the $x property:

$schema = Schema::create()
    ->x('foo', 'bar')
    ->x('items', Schema::array()->items(Schema::string()));

echo json_encode($schema->x);
/*
{
  "x-foo": "bar",
  "x-items": {
    "type": "array",
    "items": {
      "type": "string"
    }
  }
}
*/

Validation

In order to perform schema validation you must first install the justinrainbow/json-schema package:

composer require justinrainbow/json-schema:^5.2

Once installed, you may now make use of the validate() method on the OpenApi object:

$openApi = OpenApi::create();
$openApi->validate();

If you haven't installed the justinrainbow/json-schema package and attempt to use the validate() method, then a RuntimeException will be thrown.

If validation fails for the schema, then a GoldSpecDigital\ObjectOrientedOAS\Exceptions\ValidationException will be thrown. You can use the getErrors() method on this exception to retrieve all of the validation errors.

Running the tests

To run the test suite you can use the following commands:

# To run both style and unit tests.
composer test

# To run only style tests.
composer test:style

# To run only unit tests.
composer test:unit

If you receive any errors from the style tests, you can automatically fix most, if not all of the issues with the following command:

composer fix:style

Contributing

Please read CONTRIBUTING.md for details on our code of conduct, and the process for submitting pull requests to us.

Versioning

We use SemVer for versioning. For the versions available, see the tags on this repository.

Authors

See also the list of contributors who participated in this project.

License

This project is licensed under the MIT License - see the LICENSE.md file for details.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].