Jsonism

Generate HTTP Client from JSON Schema.

Usage

# Prepare JSON Schema for your API
body = File.read("schema.json")
schema = JSON.parse(body)

# Create an HTTP client from JSON Schema which is a Hash object
client = Jsonism::Client.new(schema: schema)
client.methods(false) #=> [:create_app, :delete_app, :info_app, :list_app, :update_app, :list_recipe]

# GET /apps
client.list_app

# GET /apps/1
client.info_app(id: 1)

# POST /apps
client.create_app(name: "alpha")

# PATCH /apps/1
client.update_app(id: 1, name: "bravo")

# DELETE /apps/1
client.delete_app(id: 1)

# GET /recipes
client.list_recipe

# Each method returns a Jsonism::Response
client.list_app.class #=> Jsonism::Response

# Jsonism::Response has 3 methods: .status, .headers, .body
client.list_app.status #=> 200
client.list_app.headers["Content-Type"] #=> "application/json"
client.list_app.body #=> [#<Jsonism::Resources::App:0x007f871ec96240>]

# Jsonism::Response#body returns an instance of auto-defined class, or ones wrapped in Array
# This class name is assigned from its title property on JSON Schema
client.list_app.body[0].class #=> Jsonism::Resources::App
client.info_app(id: 1).body.class #=> Jsonism::Resources::App

# Auto-defined resource class inherits from Jsonism::Resources::Base
client.list_app.body[0].class.ancestors[1] #=> Jsonism::Resources::Base

# Jsonism::Resources::Base has a method: .to_hash
client.list_app.body[0].to_hash #=> {"id"=>"01234567-89ab-cdef-0123-456789abcdef", "name"=>"example"}

# Resource can respond to .delete method if a link with rel=delete is defined in schema
# DELETE /apps/1
client.list_app.body[0].body.delete

# Resource can also respond to .update method in the same rule
# PATCH /apps/1
resource = client.list_app.body[0]
resource.name = "charlie"
resource.update

Errors

StandardError
|
`---Jsonism::Error
    |
    |---Jsonism::Client::BaseUrlNotFound
    |
    `---Jsonism::Request::MissingParams