class Jsonism::Definer

Public Class Methods

call(*args) click to toggle source

Utility wrapper

# File lib/jsonism/definer.rb, line 4
def self.call(*args)
  new(*args).call
end
new(client: nil, schema: nil) click to toggle source

@param client [Jsonism::Client] @param schema [JsonSchema::Schema] JSON Schema

# File lib/jsonism/definer.rb, line 18
def initialize(client: nil, schema: nil)
  @client = client
  @schema = schema
end

Public Instance Methods

call() click to toggle source

Defines methods to call HTTP request from its JSON schema

# File lib/jsonism/definer.rb, line 24
def call
  define_methods_into(@client)
  define_classes
end

Private Instance Methods

define_classes() click to toggle source
# File lib/jsonism/definer.rb, line 38
def define_classes
  @schema.properties.each do |name, schema|
    unless Resources.const_defined?(name.camelize)
      Resources.const_set(
        name.camelize,
        Class.new(Resources::Base) do
          schema.properties.each do |name, schema|
            define_method(name) do
              @properties[name]
            end

            if schema.read_only
              read_only_property name
            else
              define_method("#{name}=") do |value|
                change(name, value) if @properties[name] != value
              end
            end
          end

          schema.links.each do |link|
            if link.rel == "delete"
              include Resources::Deletable
              self.link_for_deletion = Link.new(link: link)
            end

            if link.rel == "update"
              include Resources::Updatable
              self.link_for_update = Link.new(link: link)
            end
          end
        end
      )
    end
  end
end
define_methods_into(client) click to toggle source

Defines methods into client @example

client.list_app
client.info_app(id: 1)
# File lib/jsonism/definer.rb, line 79
def define_methods_into(client)
  links.each do |link|
    @client.define_singleton_method(link.method_signature) do |params = {}, headers = {}|
      Request.call(client: client, headers: headers, link: link, params: params)
    end
  end
end