callr 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/callr.rb +155 -0
  3. metadata +58 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: dedea8bca6dc4bcd8e3a9e695e17fa4a8c22c66d
4
+ data.tar.gz: 2d6f70aa3ade3af8c8ae3f5673d7bee6cbf8c417
5
+ SHA512:
6
+ metadata.gz: e836e714150a495d2ea7e22c80c22f647dbd6d2fa2069bfb692a1515237ef29dfae311ee4de951256555a8f6d0b902e166a414111980a57032ff3a32c263c4f4
7
+ data.tar.gz: c419f7e452f5908a398e831e93256eec78025b4c5a89d3b3505d171e1742a22df03ed69cceb931f46610c27eb992b3fecf90b3fe0a3d19a11613de626c395a47
@@ -0,0 +1,155 @@
1
+ ###
2
+ # CALLR webservice communication library
3
+ ###
4
+
5
+ require 'net/https'
6
+ require 'uri'
7
+ require 'json'
8
+
9
+ module CALLR
10
+ class Api
11
+ @login = nil
12
+ @password = nil
13
+ @proxy = nil
14
+ @headers = {
15
+ "Expect" => "",
16
+ "Content-Type" => "application/json-rpc; charset=utf-8"
17
+ }
18
+
19
+ API_URL = "https://api.thecallr.com/"
20
+
21
+ ###
22
+ # Initialization
23
+ # @param string login
24
+ # @param string password
25
+ ###
26
+ def initialize(login, password, options = nil)
27
+ @login = login
28
+ @password = password
29
+ set_options(options)
30
+ end
31
+
32
+
33
+ public
34
+ def set_options(options)
35
+ if options.is_a?(Hash)
36
+ options = symbolize_keys(options)
37
+ set_proxy(options[:proxy]) if options.has_key?(:proxy)
38
+ end
39
+ end
40
+
41
+ def set_proxy(proxy)
42
+ if proxy.is_a?(String)
43
+ @proxy = URI.parse(proxy)
44
+ else
45
+ raise CallrLocalException.new("PROXY_NOT_STRING", 1)
46
+ end
47
+ end
48
+
49
+ ###
50
+ # Send a request to CALLR webservice
51
+ ###
52
+ def call(method, *params)
53
+ send(method, params)
54
+ end
55
+
56
+ ###
57
+ # Send a request to CALLR webservice
58
+ ###
59
+ def send(method, params = [], id = nil)
60
+ check_auth()
61
+
62
+ json = {
63
+ :id => id.nil? || id.is_a?(Integer) == false ? rand(999 - 100) + 100 : id,
64
+ :jsonrpc => "2.0",
65
+ :method => method,
66
+ :params => params.is_a?(Array) ? params : []
67
+ }.to_json
68
+
69
+ uri = URI.parse(API_URL)
70
+ http = http_or_http_proxy(uri)
71
+
72
+ req = Net::HTTP::Post.new(uri.request_uri, @headers)
73
+ req.basic_auth(@login, @password)
74
+
75
+ begin
76
+ res = http.request(req, json)
77
+ if res.code.to_i != 200
78
+ raise CallrException.new("HTTP_CODE_ERROR", -1, {:http_code => res.code.to_i, :http_message => res.message})
79
+ end
80
+ return parse_response(res)
81
+ rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Errno::ETIMEDOUT, Errno::ECONNREFUSED,
82
+ Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
83
+ raise CallrException.new("HTTP_EXCEPTION", -2, {:exception => e})
84
+ end
85
+ end
86
+
87
+
88
+ private
89
+ def symbolize_keys(hash)
90
+ res = {}
91
+ hash.map do |k,v|
92
+ res[k.to_sym] = v.is_a?(Hash) ? symbolize_keys(v) : v
93
+ end
94
+ return res
95
+ end
96
+
97
+ def check_auth
98
+ if @login.nil? || @password.nil? || @login.length == 0 || @password.length == 0
99
+ raise CallrLocalException.new("CREDENTIALS_NOT_SET", 1)
100
+ end
101
+ end
102
+
103
+ def http_or_http_proxy(uri)
104
+ if not @proxy.nil?
105
+ http = Net::HTTP::Proxy(
106
+ @proxy.host,
107
+ @proxy.port,
108
+ @proxy.user,
109
+ @proxy.password
110
+ ).new(uri.host, uri.port)
111
+ else
112
+ http = Net::HTTP.new(uri.host, uri.port)
113
+ end
114
+
115
+ http.use_ssl = uri.scheme == "https"
116
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
117
+ http.open_timeout = 10
118
+ http.read_timeout = 10
119
+
120
+ return http
121
+ end
122
+
123
+ ###
124
+ # Response analysis
125
+ ###
126
+ def parse_response(res)
127
+ begin
128
+ data = JSON.parse(res.body)
129
+ if data.nil? == false && data.has_key?("result") && data["result"].nil? == false
130
+ return data["result"]
131
+ elsif data.nil? == false && data.has_key?("error") && data["error"].nil? == false
132
+ raise CallrException.new(data["error"]["message"], data["error"]["code"], nil)
133
+ else
134
+ raise CallrException.new("INVALID_RESPONSE", -3, {:response => res.body})
135
+ end
136
+ rescue JSON::ParserError
137
+ raise CallrException.new("INVALID_RESPONSE", -3, {:response => res.body})
138
+ end
139
+ end
140
+ end
141
+
142
+ class CallrException < Exception
143
+ attr_reader :msg
144
+ attr_reader :code
145
+ attr_reader :data
146
+
147
+ def initialize(msg, code = 0, data = nil)
148
+ @msg = msg
149
+ @code = code
150
+ @data = data
151
+ end
152
+ end
153
+
154
+ class CallrLocalException < CallrException; end
155
+ end
metadata ADDED
@@ -0,0 +1,58 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: callr
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Michael Jacquin
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-09-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: json
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: 1.8.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: 1.8.1
27
+ description: Ruby SDK for CALLR API
28
+ email: mj@callr.com
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - lib/callr.rb
34
+ homepage: https://github.com/THECALLR/sdk-ruby
35
+ licenses:
36
+ - MIT
37
+ metadata: {}
38
+ post_install_message:
39
+ rdoc_options: []
40
+ require_paths:
41
+ - lib
42
+ required_ruby_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - '>='
45
+ - !ruby/object:Gem::Version
46
+ version: 1.8.0
47
+ required_rubygems_version: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - '>='
50
+ - !ruby/object:Gem::Version
51
+ version: '0'
52
+ requirements: []
53
+ rubyforge_project:
54
+ rubygems_version: 2.0.14
55
+ signing_key:
56
+ specification_version: 4
57
+ summary: CALLR SDK
58
+ test_files: []