1 | require 'cgi' |
||
2 | require 'set' |
||
3 | require 'openssl' |
||
4 | require 'rest_client' |
||
5 | require 'json' |
||
6 | |||
7 | # Enums |
||
8 | require 'route4me/enum/algorithm_type' |
||
9 | require 'route4me/enum/distance_unit' |
||
10 | require 'route4me/enum/device_type' |
||
11 | require 'route4me/enum/optimization_type' |
||
12 | require 'route4me/enum/travel_mode' |
||
13 | require 'route4me/enum/metric' |
||
14 | require 'route4me/enum/direction_method' |
||
15 | require 'route4me/enum/avoid' |
||
16 | |||
17 | # Errors |
||
18 | require 'route4me/errors/route4me_error' |
||
19 | require 'route4me/errors/api_error' |
||
20 | |||
21 | # Version |
||
22 | require 'route4me/version' |
||
23 | |||
24 | # Util |
||
25 | require 'route4me/util' |
||
26 | |||
27 | # Resources |
||
28 | require 'route4me/optimization_problem' |
||
29 | # require 'route4me/address' |
||
30 | require 'route4me/route' |
||
31 | require 'route4me/track' |
||
32 | |||
33 | module Route4me |
||
34 | class << self |
||
35 | attr_accessor :api_key, :api_base |
||
36 | end |
||
37 | |||
38 | @api_base = 'http://route4me.com' |
||
39 | |||
40 | def self.api_url(url='') |
||
41 | @api_base + url |
||
42 | end |
||
43 | |||
44 | def self.uri_encode(params) |
||
45 | params.map{ |k,v| "#{k}=#{Util.url_encode(v)}" }.join('&') |
||
46 | end |
||
47 | |||
48 | # codebeat:disable[LOC, ABC] |
||
49 | def self.request(method, url, opts) |
||
50 | unless @api_key |
||
51 | raise ArgumentError.new('No API key provided.') |
||
52 | end |
||
53 | |||
54 | get = opts[:get] || {} |
||
55 | json = opts[:json] || {} |
||
56 | |||
57 | url = api_url(url) |
||
58 | get[:api_key] = self.api_key |
||
59 | url += "?#{uri_encode(get)}" |
||
60 | |||
61 | case method.to_s.downcase.to_sym |
||
62 | when :post, :put |
||
63 | payload = json.to_json if json && json.any? |
||
64 | else |
||
65 | payload = nil |
||
66 | end |
||
67 | |||
68 | request_opts = { |
||
69 | method: method, open_timeout: 30, url: url, |
||
70 | timeout: 80, payload: payload |
||
71 | } |
||
72 | |||
73 | begin |
||
74 | response = execute(request_opts) |
||
75 | rescue SocketError => e |
||
76 | handle_error(e) |
||
77 | rescue RestClient::ExceptionWithResponse => e |
||
78 | if rcode = e.http_code and rbody = e.http_body |
||
0 ignored issues
–
show
Bug
introduced
by
![]() |
|||
79 | handle_api_error(rcode, rbody) |
||
80 | else |
||
81 | handle_error(e) |
||
82 | end |
||
83 | rescue RestClient::Exception, Errno::ECONNREFUSED => e |
||
84 | handle_error(e) |
||
85 | end |
||
86 | |||
87 | Util.symbolize_names(parse(response)) |
||
88 | end |
||
89 | # codebeat:enable[LOC, ABC] |
||
90 | |||
91 | def self.execute(attrs) |
||
92 | RestClient::Request.execute(attrs) |
||
93 | end |
||
94 | |||
95 | def self.parse(response) |
||
96 | begin |
||
97 | response = JSON.parse(response.body) |
||
98 | rescue JSON::ParserError |
||
99 | response = nil |
||
100 | end |
||
101 | |||
102 | response |
||
103 | end |
||
104 | |||
105 | def self.handle_error(e) |
||
106 | raise Route4meError, e.message |
||
107 | end |
||
108 | |||
109 | def self.handle_api_error(code, body) |
||
110 | begin |
||
111 | error_message = JSON.parse(body) |
||
112 | error_message = error_message['errors'] |
||
113 | rescue |
||
114 | raise Route4meError |
||
115 | end |
||
116 | |||
117 | raise ApiError, code, error_message |
||
118 | end |
||
119 | end |
||
120 |