Giter VIP home page Giter VIP logo

kwalify_to_json_schema's Introduction

kwalify_to_json_schema Gem Version

Kwalify schemas to JSON schemas conversion

This gem allows to convert Kwalify schemas to JSON schema.

Installation

gem install kwalify_to_json_schema

Limitations

The current implementation has the following limitations:

  • Kwalify 'date' type is not supported and is ignored
  • Kwalify 'time' type is not supported and is ignored
  • Kwalify 'timestamp' type is not supported and is ignored
  • Kwalify 'unique' within a mapping is not supported by JSON Schema and is ignored
  • Kwalify mapping default value is not supported by JSON Schema and is ignored. Only default rule is supported

Command line

The conversion can be done using the kwalify_to_json_schema command. To get help:

kwalify_to_json_schema help

Commands:
  rake convert KWALIFY_SCHEMA_FILE, RESULT_FILE    # Convert a Kwalify schema file to a JSON schema file. The result file extension will decide the format: .json or .yaml
  rake convert_dir KWALIFY_SCHEMA_DIR, RESULT_DIR  # Convert all the Kwalify schema from a directory to a JSON schema
  rake help [COMMAND]                              # Describe available commands or one specific command

Help for convert command:

kwalify_to_json_schema help

Usage:
  rake convert KWALIFY_SCHEMA_FILE, RESULT_FILE

Options:
  [--id=ID]                                                # The JSON schema identifier
  [--title=TITLE]                                          # The JSON schema title
  [--description=DESCRIPTION]                              # The JSON schema description. If not given the Kwalify description will be used if present
  [--issues-to-description], [--no-issues-to-description]  # To append the issues to the JSON schema description
  [--issues-to-stderr], [--no-issues-to-stderr]            # To write the issues to standard error output
  [--schema-version=SCHEMA_VERSION]                        # JSON schema version. Changing this value only change the value of $schema field
                                                           # Default: draft-04
  [--verbose], [--no-verbose]                              # To be verbose when converting
  [--custom-processing=CUSTOM_PROCESSING]                  # Allows to provide a pre/post processing file on handled schemas.
The given Ruby file have to provide the following class:
class CustomProcessing
    # The method will be called before conversion allowing to customize the input Kwalify schema.
    # The implementation have to return the modified schema.
    # The default implemention don't modify the schema.
    # @param kwalify_schema {Hash}
    # @return modified schema
    def preprocess(kwalify_schema)
      # TODO return modified schema
    end
    
    # The method will be called after the conversion allowing to customize the output JSON schema.
    # The implementation have to return the modified schema.
    # The default implemention don't modify the schema.
    # @param json_schema {Hash}
    # @return modified schema
    def postprocess(json_schema)
      # TODO return modified schema
    end
end


Convert a Kwalify schema file to a JSON schema file. The result file extension will decide the format: .json or .yaml

Converting a single file

The destination file extension decides if the resulting JSON schema is in JSON or YAML.

Source Kwalify file used as example:

type: map
desc: Test 'enum', 'pattern' and 'range'
mapping:
  str_enum:
    type: str
    enum:
      - A
      - B
      - C
  str_regexp:
    type: str
    pattern: /^prefix_\.*/

  number_range:
    type: number
    range:
      min: 0
      max: 9

  number_range_ex:
    type: number
    range:
      min-ex: 0
      max-ex: 9

  str_length:
    type: str
    length:
      min: 4
      max: 8
  str_length_ex:
    type: str
    length:
      min-ex: 4
      max-ex: 8

Convert to JSON format

kwalify_to_json_schema convert kwalify_schema.yaml json_schema.json

Will produce:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "description": "Test 'enum', 'pattern' and 'range'",
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "str_enum": {
      "type": "string",
      "enum": [
        "A",
        "B",
        "C"
      ]
    },
    "str_regexp": {
      "type": "string",
      "pattern": "^prefix_\\.*"
    },
    "number_range": {
      "type": "number",
      "minimum": 0,
      "maximum": 9
    },
    "number_range_ex": {
      "type": "number",
      "minimum": 0,
      "exclusiveMinimum": true,
      "maximum": 9,
      "exclusiveMaximum": true
    },
    "str_length": {
      "type": "string",
      "minLength": 4,
      "maxLength": 8
    },
    "str_length_ex": {
      "type": "string",
      "minLength": 5,
      "maxLength": 7
    }
  }
}

Convert to YAML format

kwalify_to_json_schema convert kwalify_schema.yaml json_schema.yaml

Will produce:

---
"$schema": http://json-schema.org/draft-04/schema#
description: Test 'enum', 'pattern' and 'range'
type: object
additionalProperties: false
properties:
  str_enum:
    type: string
    enum:
    - A
    - B
    - C
  str_regexp:
    type: string
    pattern: "^prefix_\\.*"
  number_range:
    type: number
    minimum: 0
    maximum: 9
  number_range_ex:
    type: number
    minimum: 0
    exclusiveMinimum: true
    maximum: 9
    exclusiveMaximum: true
  str_length:
    type: string
    minLength: 4
    maxLength: 8
  str_length_ex:
    type: string
    minLength: 5
    maxLength: 7

Converting a directory

Convert to JSON format

kwalify_to_json_schema convert_dir source_dir dest_dir --format json

Convert to YAML format

kwalify_to_json_schema convert_dir source_dir dest_dir --format yaml

Custom processing

It could happen what your schema are not stored as it and may require some transformation. It is possible to provide a custom processing class in order to pre and post process the schemas.

Example of Kwalify schemas that needs processing:

my_custom_key:
  type: map
  desc: Test 'enum', 'pattern' and 'range'
  mapping:
    str_enum:
      type: str

The schema is nested under the my_custom_key key. We have to remove it before processing and want to keep it after the conversion.

The following custom class will do the job:

# Customization of Kwalify to JSON schema
class CustomProcessing
  def preprocess(kwalify_schema)
    # Remove and keep the wrapping name
    head = kwalify_schema.first
    @name = head.first
    head.last
  end

  def postprocess(json_schema)
    # Restore the wrapping name
    { @name => json_schema }
  end
end

Let's store it in the name_wrapping_custom_processing.rb file. We can now convert using:

kwalify_to_json_schema convert --custom_processing kwalify_to_json_schema.rb kwalify_schema.yaml json_schema.yaml

Result will be:

my_custom_key:
  "$schema": http://json-schema.org/draft-04/schema#
  description: Test 'enum', 'pattern' and 'range'
  type: object
  additionalProperties: false
  properties:
    str_enum:
      type: string
      enum:
        - A
        - B
        - C

Using the API

Conversion can also be done using directly the Ruby API.

require 'kwalify_to_json_schema'

# Convert to JSON format
KwalifyToJsonSchema.convert_file("kwalify_schema.yaml", "json_schema.json")

# Convert to YAML format
KwalifyToJsonSchema.convert_file("kwalify_schema.yaml", "json_schema.yaml")

# Specify the identifier
KwalifyToJsonSchema.convert_file("kwalify_schema.yaml", "json_schema.json", { id: "schema/example.json" })

Options

The following options are available:

Name Type Default value Description
:id string nil The JSON schema identifier
:title string nil The JSON schema title
:description string nil The JSON schema description. If not given the Kwalify description will be used if present
:issues_to_description boolean false To append the issues to the JSON schema description
:issues_to_stderr boolean false To write the issues to standard error output
:custom_processing object nil To customize the conversion
:schema_version string "draft-04" JSON schema version. Changing this value only change the value of $schema field
:verbose boolean false To be verbose when converting

kwalify_to_json_schema's People

Contributors

s-ga avatar andrew-stripe avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.