module Clayful

Public Class Methods

base_url() click to toggle source
# File lib/clayful.rb, line 26
def self.base_url; @@base_url end
base_url=(v;) click to toggle source
# File lib/clayful.rb, line 27
def self.base_url=v; @@base_url = v end
call_api(options) click to toggle source
# File lib/clayful.rb, line 132
def self.call_api(options)

        extracted = self.extract_request_arguments(options)

        extracted = extracted.merge({
                'request_url'    => self.get_endpoint(extracted['request_url']),
                'model_name'     => options['model_name'],
                'method_name'    => options['method_name'],
                'uses_form_data' => !!options['uses_form_data'],
                'error'          => nil,
                'response'       => nil,
        })

        # Extend default headers with header options
        extracted['headers'] = @@default_headers.clone.merge(extracted['headers'])

        self.trigger('request', extracted)

        begin

                response = self.plugins['request'].call(extracted)

                extracted['response'] = response

                self.trigger('response', extracted)

                return response

        rescue Clayful::Exception => e

                extracted['error'] = e

                self.trigger('response', extracted)

                raise # re-raise the error

        end

end
config(options = {}) click to toggle source
# File lib/clayful.rb, line 173
def self.config(options = {})

        headers = self.options_to_headers(options)

        @@default_headers = @@default_headers.merge(headers)

end
default_headers() click to toggle source
# File lib/clayful.rb, line 29
def self.default_headers; @@default_headers end
default_headers=(v;) click to toggle source
# File lib/clayful.rb, line 30
def self.default_headers=v; @@default_headers = v end
extract_request_arguments(options = {}) click to toggle source
# File lib/clayful.rb, line 94
def self.extract_request_arguments(options = {})

        result = {
                'http_method' => options['http_method'],
                'request_url' => options['path'],
                'payload'     => nil,
                'query'       => {},
                'headers'     => {},
                'meta'        => {}
        }

        rest = options['args'].slice(options['params'].length..-1)

        options['params'].each.with_index do |key, i|

                result['request_url'] = result['request_url'].sub('{' + key + '}', options['args'][i].to_s)
        end

        http_method = options['http_method']

        if (http_method == 'POST' or http_method == 'PUT') and (not options['without_payload'])

                result['payload'] = rest.shift
        end

        query_headers = rest[0] ? rest[0] : {}
        query = query_headers.fetch('query', {})
        meta = query_headers.fetch('meta', {})

        result['query'] = self.normalize_query_values(query)
        result['headers'] = self.options_to_headers(query_headers)
        result['meta'] = meta

        result

end
format_image_url(base_url, options = {}) click to toggle source
# File lib/clayful.rb, line 231
def self.format_image_url(base_url, options = {})

        query = []

        normalized = self.normalize_query_values(options)

        normalized.each do |k, v|
                query.push("#{k}=#{v}")
        end

        query = query.join('&')

        query.empty? ? base_url : base_url + '?' + query

end
format_number(number, currency = {}) click to toggle source
# File lib/clayful.rb, line 248
def self.format_number(number, currency = {})

        if not number.is_a? Numeric

                return ''
        end

        precision = currency.fetch('precision', nil)
        delimiter = currency.fetch('delimiter', {})
        thousands = delimiter.fetch('thousands', '')
        decimal = delimiter.fetch('decimal', '.')

        if precision.is_a? Numeric

                # Conver to float to keep '.n'
                n = (10 ** precision).to_f

                number = (number * n).round / n

                # To deal with 0.0 case..
                if precision == 0

                        number = number.round
                end

        end

        a, b = number.to_s.split('.')

        a = a.reverse.scan(/.{1,3}/).join(thousands).reverse
        b = b ? b : ''

        if precision.is_a? Numeric

                diff = precision - b.length
                diff = diff < 0 ? 0 : diff

                b += '0' * diff

        end

        decimal = b.empty? ? '' : decimal

        [a, b].join(decimal)

end
format_price(number, currency = {}) click to toggle source
# File lib/clayful.rb, line 296
def self.format_price(number, currency = {})

        formatted_number = self.format_number(number, currency)

        if formatted_number.empty?

                return ''
        end

        symbol = currency.fetch('symbol', '')
        format_string = currency.fetch('format', '{price}')

        format_string
                .sub('{symbol}', symbol)
                .sub('{price}', formatted_number)

end
get_endpoint(path) click to toggle source
# File lib/clayful.rb, line 80
def self.get_endpoint(path)

        @@base_url + path

end
install(scope, plugin) click to toggle source
# File lib/clayful.rb, line 182
def self.install(scope, plugin)

        if @@plugins[scope]

                @@plugins[scope] = plugin
        end

end
listeners() click to toggle source
# File lib/clayful.rb, line 35
def self.listeners; @@listeners end
listeners=(v;) click to toggle source
# File lib/clayful.rb, line 36
def self.listeners=v; @@listeners = v end
normalize_query_values(query = {}) click to toggle source
# File lib/clayful.rb, line 87
def self.normalize_query_values(query = {})

        Hash[ query.map { |k, v| [k.to_s, ERB::Util.url_encode(v.to_s)] } ]

end
off(event_name, callback) click to toggle source
# File lib/clayful.rb, line 204
def self.off(event_name, callback)

        listeners = @@listeners[event_name]

        if listeners

                listeners.delete(callback)
        end

end
on(event_name, callback) click to toggle source
# File lib/clayful.rb, line 192
def self.on(event_name, callback)

        listeners = @@listeners[event_name]

        if listeners

                listeners.push(callback)
        end

end
options_to_headers(o = {}) click to toggle source
# File lib/clayful.rb, line 39
def self.options_to_headers(o = {})

        headers = {}

        if o['language']
                headers['Accept-Language'] = o['language']
        end

        if o['currency']
                headers['Accept-Currency'] = o['currency']
        end

        if o['time_zone']
                headers['Accept-Time-Zone'] = o['time_zone']
        end

        if o['client']
                headers['Authorization'] = 'Bearer ' + o['client']
        end

        if o['customer']
                headers['Authorization-Customer'] = o['customer']
        end

        if o['reCAPTCHA']
                headers['reCAPTCHA-Response'] = o['reCAPTCHA']
        end

        if o['debug_language']
                headers['Accept-Debug-Language'] = o['debug_language']
        end

        if o['headers']
                headers = headers.merge(o['headers'])
        end

        headers

end
plugins() click to toggle source
# File lib/clayful.rb, line 32
def self.plugins; @@plugins end
plugins=(v;) click to toggle source
# File lib/clayful.rb, line 33
def self.plugins=v; @@plugins = v end
trigger(event_name, data) click to toggle source
# File lib/clayful.rb, line 216
def self.trigger(event_name, data)

        listeners = @@listeners[event_name]

        if listeners

                listeners.each do |listener|

                        listener.call(data)
                end
        end

end