onfleet-ruby 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +7 -0
- data/.rspec +2 -0
- data/Gemfile +6 -0
- data/README.md +293 -0
- data/lib/onfleet/actions/create.rb +15 -0
- data/lib/onfleet/actions/delete.rb +17 -0
- data/lib/onfleet/actions/find.rb +17 -0
- data/lib/onfleet/actions/get.rb +17 -0
- data/lib/onfleet/actions/list.rb +27 -0
- data/lib/onfleet/actions/save.rb +17 -0
- data/lib/onfleet/actions/update.rb +16 -0
- data/lib/onfleet/address.rb +4 -0
- data/lib/onfleet/admin.rb +14 -0
- data/lib/onfleet/destination.rb +12 -0
- data/lib/onfleet/errors/authentication_error.rb +3 -0
- data/lib/onfleet/errors/connection_error.rb +3 -0
- data/lib/onfleet/errors/invalid_request_error.rb +3 -0
- data/lib/onfleet/errors/onfleet_error.rb +3 -0
- data/lib/onfleet/onfleet_object.rb +102 -0
- data/lib/onfleet/organization.rb +19 -0
- data/lib/onfleet/recipient.rb +13 -0
- data/lib/onfleet/task.rb +24 -0
- data/lib/onfleet/team.rb +10 -0
- data/lib/onfleet/util.rb +35 -0
- data/lib/onfleet/vehicle.rb +4 -0
- data/lib/onfleet/worker.rb +15 -0
- data/lib/onfleet.rb +98 -0
- data/onfleet.gemspec +21 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/test_data.rb +14 -0
- metadata +103 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d7d26f7373bddd5060db0f7aadda92c8896fe089
|
4
|
+
data.tar.gz: af207526096c436c17ed7cc766558637d8847e32
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: cbea220cb12f1dba49722f296f13f3c7e412ecdd8685f0e04b73f058b62299312ffce454b0624c8b19d53034c61272cf6dbdf2065be0aa519a812d2296043361
|
7
|
+
data.tar.gz: ef25b4472e269677728b9c333cc0ef25893085c6ec426e50a0bb46bc3c733a774e2ddcf311f4bfc8edd145312cc117a279b849109ba38e77d853b35807238e10
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,293 @@
|
|
1
|
+
# Onfleet Ruby SDK
|
2
|
+
|
3
|
+
Ruby SDK for Onfleet.com's API. **This is NOT an official SDK**. [Official Documentation](http://docs.onfleet.com/docs/). The entirety of the response payload is accessible by instance methods. The raw response can is accessible through the `params` instance method on all objects.
|
4
|
+
|
5
|
+
|
6
|
+
## Usage
|
7
|
+
Install the gem.
|
8
|
+
```bash
|
9
|
+
gem install onfleet-ruby
|
10
|
+
```
|
11
|
+
|
12
|
+
Set the API Key.
|
13
|
+
```ruby
|
14
|
+
Onfleet.api_key = API_KEY
|
15
|
+
```
|
16
|
+
|
17
|
+
Objects
|
18
|
+
```ruby
|
19
|
+
Onfleet::Organization
|
20
|
+
Onfleet::Admin
|
21
|
+
Onfleet::Worker
|
22
|
+
Onfleet::Team
|
23
|
+
Onfleet::Destination
|
24
|
+
Onfleet::Recipient
|
25
|
+
Onfleet::Task
|
26
|
+
```
|
27
|
+
|
28
|
+
## Organizations
|
29
|
+
|
30
|
+
**GET**
|
31
|
+
|
32
|
+
```ruby
|
33
|
+
org = Onfleet::Organization.get
|
34
|
+
org.id # => 1234567890
|
35
|
+
org.name # => OrgName
|
36
|
+
org.email # => org@email.com
|
37
|
+
org.country # => United States
|
38
|
+
org.delegatees # => ['delegatees_id']
|
39
|
+
org.timezone # => "America/Los_Angeles"
|
40
|
+
org.time_created # => 1438713844000
|
41
|
+
org.time_last_modified # => 1438713844000
|
42
|
+
```
|
43
|
+
|
44
|
+
**GET delegatee details**
|
45
|
+
|
46
|
+
```ruby
|
47
|
+
delegatee = Onfleet::Organization.get_delegatee_details(id)
|
48
|
+
delegatee.id # => "4eKRvRGA7JW6C8TaGyuJeSrK"
|
49
|
+
delegatee.name # => "North Beach Runners"
|
50
|
+
delegatee.email # => "hello@nbr.co"
|
51
|
+
delegatee.timezone # => "America/Los_Angeles"
|
52
|
+
delegatee.country # => "US"
|
53
|
+
```
|
54
|
+
|
55
|
+
|
56
|
+
## Administrators
|
57
|
+
|
58
|
+
|
59
|
+
| Name | Type | Description |
|
60
|
+
| ----------- |--------| --------------|
|
61
|
+
| name | string | The administrator’s complete name. |
|
62
|
+
| email | string | The administrator’s email address. |
|
63
|
+
| phone | string | (Optional) The administrator's E.164-formatted phone number. |
|
64
|
+
|
65
|
+
**Create**
|
66
|
+
|
67
|
+
```ruby
|
68
|
+
admin = Onfleet::Admin.create({name: 'John Doe', email: 'john@company.com', phone: '41555546782'})
|
69
|
+
```
|
70
|
+
|
71
|
+
**Update**
|
72
|
+
```ruby
|
73
|
+
admin = Onfleet::Admin.update('ADMIN_ID', {name: 'New Name'})
|
74
|
+
# or
|
75
|
+
admin.name = "New Name"
|
76
|
+
admin.save
|
77
|
+
```
|
78
|
+
|
79
|
+
**Delete**
|
80
|
+
```ruby
|
81
|
+
Onfleet::Admin.delete('ADMIN_ID') # => true
|
82
|
+
```
|
83
|
+
|
84
|
+
**List**
|
85
|
+
```ruby
|
86
|
+
list = Onfleet::Admin.list # => [<Onfleet::Admin>]
|
87
|
+
list.first # => Onfleet::Admin
|
88
|
+
```
|
89
|
+
|
90
|
+
## Workers
|
91
|
+
Worker
|
92
|
+
|
93
|
+
| Name | Type | Description |
|
94
|
+
| ----------- |--------| --------------|
|
95
|
+
| name | string | The workers complete name. |
|
96
|
+
| phone | string | The worker's phone number. |
|
97
|
+
| teams | string Array | One or more team IDs of which the worker is a member.|
|
98
|
+
| vehicle | obect | (Optional) The worker’s vehicle, providing no vehicle details is interpreted as the worker being on foot. |
|
99
|
+
|
100
|
+
Vehicle
|
101
|
+
|
102
|
+
| Name | Type | Description |
|
103
|
+
| ------------- |--------| --------------|
|
104
|
+
| type | string | The vehicle’s type, must be one of `CAR`, `MOTORCYCLE`, `BICYCLE` or `TRUCK`. |
|
105
|
+
| description | string | (Optional) The vehicle’s make, model, year, or any other relevant identifying details. |
|
106
|
+
| license_plate | string | (Optional) The vehicle’s license plate number.|
|
107
|
+
| color | string | (Optional) The worker’s vehicle, providing no vehicle details is interpreted as the worker being on foot. |
|
108
|
+
|
109
|
+
|
110
|
+
**Create**
|
111
|
+
|
112
|
+
```ruby
|
113
|
+
worker = Onfleet::Worker.create({name: 'John Doe', email: 'john@company.com', teams: ["TEAM_ID"], vehicle: {type: 'CAR'} })
|
114
|
+
worker.name # => "John Doe"
|
115
|
+
worker.vehicle.type # => "CAR"
|
116
|
+
|
117
|
+
worker.vehicle.color = "Blue"
|
118
|
+
worker.save
|
119
|
+
|
120
|
+
worker.vehicle.color # => "Blue"
|
121
|
+
```
|
122
|
+
|
123
|
+
**Update**
|
124
|
+
```ruby
|
125
|
+
Onfleet::Worker.update({name: "New Name"}
|
126
|
+
# or
|
127
|
+
worker.name = "New Name"
|
128
|
+
work.save
|
129
|
+
worker.name # => "New Name"
|
130
|
+
```
|
131
|
+
|
132
|
+
**Delete**
|
133
|
+
```ruby
|
134
|
+
Onfleet::Worker.delete('WORKER_ID') # => true
|
135
|
+
```
|
136
|
+
|
137
|
+
**List**
|
138
|
+
```ruby
|
139
|
+
Onfleet::Worker.list
|
140
|
+
```
|
141
|
+
|
142
|
+
**Get**
|
143
|
+
```ruby
|
144
|
+
worker = Onfleet::Worker.get('WORKER_ID')
|
145
|
+
```
|
146
|
+
|
147
|
+
## Teams
|
148
|
+
|
149
|
+
**List**
|
150
|
+
```ruby
|
151
|
+
Onfleet::Team.list
|
152
|
+
```
|
153
|
+
|
154
|
+
**Get**
|
155
|
+
```ruby
|
156
|
+
Onfleet::Team.get('TEAM_ID')
|
157
|
+
```
|
158
|
+
|
159
|
+
## Destinations
|
160
|
+
Destination
|
161
|
+
|
162
|
+
| Name | Type | Description |
|
163
|
+
| ----------- |--------| --------------|
|
164
|
+
| address | object | The destination’s street address details. |
|
165
|
+
| location | array | (Optional) The `[ longitude, latitude ]` geographic coordinates. If missing, the API will geocode based on the `address` details provided. Note that geocoding may slightly modify the format of the address properties. |
|
166
|
+
| notes | string | (Optional) Notes for the destination |
|
167
|
+
|
168
|
+
Address
|
169
|
+
|
170
|
+
| Name | Type | Description |
|
171
|
+
| ----------- |--------| --------------|
|
172
|
+
| number | string | The number component of this address, it may also contain letters. |
|
173
|
+
| street | string | The street name |
|
174
|
+
| city | string | The city name |
|
175
|
+
| country | string | Name Of Country|
|
176
|
+
| apartment | string | (Optional) The apartment or suite number |
|
177
|
+
| name | string | (Optional) A name associated with this address |
|
178
|
+
| state | string | (Optional) State name |
|
179
|
+
| postal_code | string | (Optional) The postal code |
|
180
|
+
| unparsed | string | (Optional) A complete comma seperated address for ex. `148 townsend, 94102, USA`. Including this field, all other address details will be ignored. The address will be automatically geocoded. |
|
181
|
+
|
182
|
+
|
183
|
+
|
184
|
+
|
185
|
+
**Create**
|
186
|
+
```ruby
|
187
|
+
destination = Onfleet::Destination.create({address: {unparsed: '200 12th st, 94103, ca'} })
|
188
|
+
|
189
|
+
destination.street # => '12th street'
|
190
|
+
destination.number # => '200'
|
191
|
+
destination.postal_code # => '94103'
|
192
|
+
```
|
193
|
+
|
194
|
+
**Get**
|
195
|
+
```ruby
|
196
|
+
Onfleet::Destination('DEST_ID')
|
197
|
+
```
|
198
|
+
|
199
|
+
## Recipients
|
200
|
+
| Name | Type | Description |
|
201
|
+
| ----------- |--------| --------------|
|
202
|
+
| name | string | The recipient's full name. |
|
203
|
+
| phone | string | A unique valid phone number. |
|
204
|
+
| notes | string | (Optional) Notes for the recipient. |
|
205
|
+
| skip_sms_notifications | boolean | (Optional) To disable sms notification. Defaults to `false` |
|
206
|
+
| skip_phone_number_verificaton | boolean | (Optional) Whether to skip validation of the phone number. |
|
207
|
+
|
208
|
+
**Create**
|
209
|
+
```ruby
|
210
|
+
recipient = Onfleet::Recipient.create({name: 'John Doe', phone: '4155556789'})
|
211
|
+
recipient.id # => ChdA82dA~Dn232
|
212
|
+
recpient.name # => 'John Doe'
|
213
|
+
```
|
214
|
+
|
215
|
+
**Update**
|
216
|
+
```ruby
|
217
|
+
Onfleet::Recipient.update('REC_ID', {name: 'New Name'})
|
218
|
+
# or
|
219
|
+
recipient.name = "New Name"
|
220
|
+
recipient.save
|
221
|
+
```
|
222
|
+
|
223
|
+
**Get**
|
224
|
+
```ruby
|
225
|
+
Onfleet::Recipient.get('REC_ID')
|
226
|
+
```
|
227
|
+
|
228
|
+
**Find**
|
229
|
+
|
230
|
+
>######Note:
|
231
|
+
**Throws `InvalidRequestError` if cannot find resource**
|
232
|
+
|
233
|
+
```ruby
|
234
|
+
# by name (case sensitive)
|
235
|
+
rec = Onfleet::Recipient.find('name', 'John Doe')
|
236
|
+
rec.name = "John Doe"
|
237
|
+
|
238
|
+
#by phone
|
239
|
+
rec = Onfleet::Recipient.find('phone', '4155556789')
|
240
|
+
```
|
241
|
+
|
242
|
+
##Tasks
|
243
|
+
| Name | Type | Description |
|
244
|
+
| ----------- |--------| --------------|
|
245
|
+
| destination | string | `ID` of the destination. |
|
246
|
+
| recipients | string array | An array containing zero or one IDs of the task's recipients |
|
247
|
+
| merchant | string | (Optional) `ID` of merchant organization. |
|
248
|
+
| executor | string | (Optional) `ID` of the executor organization. |
|
249
|
+
| complete_after | number | (Optional) A timestamp for the earliest time the task should be completed. |
|
250
|
+
| complete_before | number | (Optional) A timestamp for the latest time the task should be completed. |
|
251
|
+
| pickup_task | boolean | (Optional) Whether the task is a pickup task. |
|
252
|
+
| dependencies | string array | (Optional) One or more IDs of tasks which must be completed prior to this task. |
|
253
|
+
| notes | notes | (Optional) Notes for the task. |
|
254
|
+
| auto_assign | object | (Optional) The automatic assignment options for the newly created task. See above for exact object structure and allowed values. |
|
255
|
+
|
256
|
+
**Create**
|
257
|
+
```ruby
|
258
|
+
# First Create a destination and Recipient
|
259
|
+
# Then create the task
|
260
|
+
task = Onfleet::Task.create({recipient: ['REC_ID'], destination: 'DEC_ID' })
|
261
|
+
```
|
262
|
+
|
263
|
+
**Update**
|
264
|
+
```ruby
|
265
|
+
Onfleet::Task.update('TASK_ID', {notes: 'Adding some notes'})
|
266
|
+
# or
|
267
|
+
task.notes = "Adding some notes"
|
268
|
+
task.save
|
269
|
+
```
|
270
|
+
|
271
|
+
**Get**
|
272
|
+
```ruby
|
273
|
+
task = Onfleet::Task.get('TASK_ID')
|
274
|
+
```
|
275
|
+
|
276
|
+
**Delete**
|
277
|
+
```ruby
|
278
|
+
Onfleet::Task.delete('TASK_ID')
|
279
|
+
```
|
280
|
+
**List**
|
281
|
+
```ruby
|
282
|
+
Onfleet::Task.list
|
283
|
+
# You can also list tasks of certain states
|
284
|
+
Onfleet::Task.list({state: 0}) # => returns all tasks with state 0, see official docs for valid states
|
285
|
+
```
|
286
|
+
|
287
|
+
**Complete**
|
288
|
+
Currently not supported
|
289
|
+
|
290
|
+
|
291
|
+
## TODO
|
292
|
+
1. Tests
|
293
|
+
2. Better error handling
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Onfleet
|
2
|
+
module Actions
|
3
|
+
module Delete
|
4
|
+
module ClassMethods
|
5
|
+
def delete id
|
6
|
+
url = "#{self.url}/#{id}"
|
7
|
+
response = Onfleet.request(url, :delete)
|
8
|
+
true
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.included base
|
13
|
+
base.extend(ClassMethods)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Onfleet
|
2
|
+
module Actions
|
3
|
+
module Find
|
4
|
+
module ClassMethods
|
5
|
+
def find field, search_term
|
6
|
+
url = "#{self.url}/#{field}/#{search_term}"
|
7
|
+
response = Onfleet.request(url, :get, search_term)
|
8
|
+
Util.constantize("#{self}").new(response)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.included base
|
13
|
+
base.extend(ClassMethods)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Onfleet
|
2
|
+
module Actions
|
3
|
+
module Get
|
4
|
+
module ClassMethods
|
5
|
+
def get id
|
6
|
+
url = "#{self.url}/#{id}"
|
7
|
+
response = Onfleet.request(url, :get)
|
8
|
+
Util.constantize("#{self}").new(response)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.included base
|
13
|
+
base.extend(ClassMethods)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Onfleet
|
2
|
+
module Actions
|
3
|
+
module List
|
4
|
+
module ClassMethods
|
5
|
+
def list query_params={}
|
6
|
+
url = "#{self.url}"
|
7
|
+
|
8
|
+
if !query_params.empty?
|
9
|
+
url += "?"
|
10
|
+
query_params.each do |key, value|
|
11
|
+
url += "#{key}=#{value}&"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
response = Onfleet.request(url, :get)
|
16
|
+
response.compact.map do |listObj|
|
17
|
+
Util.constantize("#{self}").new(listObj)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.included base
|
23
|
+
base.extend(ClassMethods)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Onfleet
|
2
|
+
module Actions
|
3
|
+
module Save
|
4
|
+
def save
|
5
|
+
if respond_to?('id') && self.id
|
6
|
+
request_type = :put
|
7
|
+
url = "#{self.url}/#{self.id}"
|
8
|
+
else
|
9
|
+
request_type = :post
|
10
|
+
url = self.url
|
11
|
+
end
|
12
|
+
response = Onfleet.request(url, request_type, self.attributes)
|
13
|
+
self.parse_response(response)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Onfleet
|
2
|
+
class Admin < OnfleetObject
|
3
|
+
include Onfleet::Actions::Create
|
4
|
+
include Onfleet::Actions::Save
|
5
|
+
include Onfleet::Actions::Update
|
6
|
+
include Onfleet::Actions::List
|
7
|
+
include Onfleet::Actions::Delete
|
8
|
+
|
9
|
+
|
10
|
+
def self.url
|
11
|
+
'/admins'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
module Onfleet
|
2
|
+
class OnfleetObject
|
3
|
+
attr_reader :params
|
4
|
+
def initialize params
|
5
|
+
if params.kind_of?(Hash)
|
6
|
+
@params = params
|
7
|
+
set_attributes(@params)
|
8
|
+
elsif params.kind_of?(String)
|
9
|
+
@params = {id: params}
|
10
|
+
set_attributes(@params)
|
11
|
+
else
|
12
|
+
@params = {}
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def parse_response response
|
17
|
+
@params = response
|
18
|
+
set_attributes(response)
|
19
|
+
self
|
20
|
+
end
|
21
|
+
|
22
|
+
def attributes
|
23
|
+
attrs = Hash.new
|
24
|
+
instance_variables.each do |var|
|
25
|
+
str = var.to_s.gsub /^@/, ''
|
26
|
+
if respond_to? "#{str}="
|
27
|
+
instance_var = instance_variable_get(var)
|
28
|
+
if klass = Util.object_classes[str]
|
29
|
+
if instance_var.is_a?(OnfleetObject)
|
30
|
+
attrs[Util.to_camel_case_lower(str).to_sym] = parse_onfleet_obj(instance_var)
|
31
|
+
elsif instance_var.is_a?(Array)
|
32
|
+
objs = []
|
33
|
+
instance_var.each do |object|
|
34
|
+
objs << parse_onfleet_obj(object)
|
35
|
+
end
|
36
|
+
attrs[Util.to_camel_case_lower(str).to_sym] = objs
|
37
|
+
else
|
38
|
+
attrs[Util.to_camel_case_lower(str).to_sym] = instance_var
|
39
|
+
end
|
40
|
+
else
|
41
|
+
attrs[Util.to_camel_case_lower(str).to_sym] = instance_var
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
attrs
|
46
|
+
end
|
47
|
+
|
48
|
+
def class_name
|
49
|
+
self.class.name.split("::").last
|
50
|
+
end
|
51
|
+
|
52
|
+
def url
|
53
|
+
"/#{CGI.escape(class_name.downcase)}s"
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def parse_onfleet_obj obj
|
59
|
+
if obj.is_a?(OnfleetObject)
|
60
|
+
if obj.is_a?(Destination) || obj.is_a?(Recipient) || obj.is_a?(Task)
|
61
|
+
obj.id
|
62
|
+
else
|
63
|
+
obj.attributes
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def set_attributes params
|
69
|
+
params.each do |key, value|
|
70
|
+
key_underscore = Util.to_underscore(key)
|
71
|
+
|
72
|
+
if klass = Util.object_classes[key.to_s]
|
73
|
+
case value
|
74
|
+
when Array
|
75
|
+
objs = []
|
76
|
+
value.each do |v|
|
77
|
+
objs << klass.new(v)
|
78
|
+
end
|
79
|
+
value = objs
|
80
|
+
when Hash
|
81
|
+
value = klass.new(value)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
if respond_to?("#{key_underscore}=")
|
86
|
+
send(:"#{key_underscore}=", value)
|
87
|
+
else
|
88
|
+
add_attrs({"#{key_underscore}" => value})
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def add_attrs attrs
|
95
|
+
attrs.each do |var, value|
|
96
|
+
self.class.class_eval { attr_accessor var }
|
97
|
+
instance_variable_set "@#{var}", value
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Onfleet
|
2
|
+
class Organization < OnfleetObject
|
3
|
+
|
4
|
+
class << self
|
5
|
+
def get
|
6
|
+
url = "/organization"
|
7
|
+
response = Onfleet.request(url, :get)
|
8
|
+
Util.constantize("#{self}").new(response)
|
9
|
+
end
|
10
|
+
|
11
|
+
def get_delegatee_details id
|
12
|
+
url = "/organizations/#{id}"
|
13
|
+
response = Onfleet.request(url, :get)
|
14
|
+
Util.constantize("#{self}").new(response)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Onfleet
|
2
|
+
class Recipient < OnfleetObject
|
3
|
+
include Onfleet::Actions::Create
|
4
|
+
include Onfleet::Actions::Update
|
5
|
+
include Onfleet::Actions::Save
|
6
|
+
include Onfleet::Actions::Find
|
7
|
+
include Onfleet::Actions::Get
|
8
|
+
|
9
|
+
def self.url
|
10
|
+
"/recipients"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/onfleet/task.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
module Onfleet
|
2
|
+
class Task < OnfleetObject
|
3
|
+
include Onfleet::Actions::Create
|
4
|
+
include Onfleet::Actions::Save
|
5
|
+
include Onfleet::Actions::Update
|
6
|
+
include Onfleet::Actions::Get
|
7
|
+
include Onfleet::Actions::List
|
8
|
+
include Onfleet::Actions::Delete
|
9
|
+
|
10
|
+
|
11
|
+
def self.url
|
12
|
+
'/tasks'
|
13
|
+
end
|
14
|
+
|
15
|
+
def complete
|
16
|
+
# CURRENTLY DOESN'T WORK
|
17
|
+
url = "#{self.url}/#{self.id}/complete"
|
18
|
+
params = {"completionDetails" => {"success" => true }}
|
19
|
+
Onfleet.request(url, :post, params)
|
20
|
+
true
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
data/lib/onfleet/team.rb
ADDED
data/lib/onfleet/util.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
module Onfleet
|
2
|
+
class Util
|
3
|
+
def self.constantize class_name
|
4
|
+
Object.const_get(class_name)
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.to_underscore key
|
8
|
+
if key.kind_of?(Symbol)
|
9
|
+
key = key.to_s
|
10
|
+
end
|
11
|
+
key.gsub(/::/, '/').
|
12
|
+
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
13
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
14
|
+
tr("-", "_").
|
15
|
+
downcase
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.to_camel_case_lower str
|
19
|
+
str.split('_').inject([]){ |buffer,e| buffer.push(buffer.empty? ? e : e.capitalize) }.join
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.object_classes
|
24
|
+
@object_classes ||= {
|
25
|
+
"address" => Address,
|
26
|
+
"recipients" => Recipient,
|
27
|
+
"recipient" => Recipient,
|
28
|
+
"tasks" => Task,
|
29
|
+
"destination" => Destination,
|
30
|
+
"vehicle" => Vehicle
|
31
|
+
}
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Onfleet
|
2
|
+
class Worker < OnfleetObject
|
3
|
+
include Onfleet::Actions::Create
|
4
|
+
include Onfleet::Actions::List
|
5
|
+
include Onfleet::Actions::Get
|
6
|
+
include Onfleet::Actions::Save
|
7
|
+
include Onfleet::Actions::Update
|
8
|
+
include Onfleet::Actions::Delete
|
9
|
+
|
10
|
+
|
11
|
+
def self.url
|
12
|
+
'/workers'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/onfleet.rb
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
require 'rest-client'
|
2
|
+
require 'json'
|
3
|
+
require 'base64'
|
4
|
+
|
5
|
+
# Utils
|
6
|
+
require 'onfleet/Util'
|
7
|
+
|
8
|
+
# Errors
|
9
|
+
require 'onfleet/errors/onfleet_error'
|
10
|
+
require 'onfleet/errors/authentication_error'
|
11
|
+
require 'onfleet/errors/invalid_request_error'
|
12
|
+
require 'onfleet/errors/connection_error'
|
13
|
+
|
14
|
+
# Actions
|
15
|
+
require 'onfleet/actions/create'
|
16
|
+
require 'onfleet/actions/find'
|
17
|
+
require 'onfleet/actions/save'
|
18
|
+
require 'onfleet/actions/update'
|
19
|
+
require 'onfleet/actions/get'
|
20
|
+
require 'onfleet/actions/list'
|
21
|
+
require 'onfleet/actions/delete'
|
22
|
+
|
23
|
+
|
24
|
+
# Resources
|
25
|
+
require 'onfleet/onfleet_object'
|
26
|
+
require 'onfleet/recipient'
|
27
|
+
require 'onfleet/destination'
|
28
|
+
require 'onfleet/address'
|
29
|
+
require 'onfleet/task'
|
30
|
+
require 'onfleet/organization'
|
31
|
+
require 'onfleet/admin'
|
32
|
+
require 'onfleet/team'
|
33
|
+
require 'onfleet/vehicle'
|
34
|
+
require 'onfleet/worker'
|
35
|
+
|
36
|
+
|
37
|
+
module Onfleet
|
38
|
+
@base_url = "https://onfleet.com/api/v2"
|
39
|
+
|
40
|
+
class << self
|
41
|
+
attr_accessor :api_key, :base_url, :encoded_api_key
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.request url, method, params={}
|
45
|
+
raise AuthenticationError.new("Set your API Key using Onfleet.api_key = <API_KEY>") unless @api_key
|
46
|
+
|
47
|
+
begin
|
48
|
+
response = RestClient::Request.execute(method: method, url: self.base_url+url, payload: params.to_json, headers: self.request_headers)
|
49
|
+
|
50
|
+
if response != ''
|
51
|
+
JSON.parse(response)
|
52
|
+
end
|
53
|
+
rescue RestClient::ExceptionWithResponse => e
|
54
|
+
if response_code = e.http_code and response_body = e.http_body
|
55
|
+
handle_api_error(response_code, JSON.parse(response_body))
|
56
|
+
else
|
57
|
+
handle_restclient_error(e)
|
58
|
+
end
|
59
|
+
rescue RestClient::Exception, Errno::ECONNREFUSED => e
|
60
|
+
handle_restclient_error(e)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
def self.request_headers
|
66
|
+
{
|
67
|
+
Authorization: "Basic #{self.encoded_api_key}"
|
68
|
+
}
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.encoded_api_key
|
72
|
+
@encoded_api_key ||= Base64.urlsafe_encode64(@api_key)
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.handle_api_error code, body
|
76
|
+
case code
|
77
|
+
when 400, 404
|
78
|
+
raise InvalidRequestError.new(body["message"])
|
79
|
+
when 401
|
80
|
+
raise AuthenticationError.new(body["message"])
|
81
|
+
else
|
82
|
+
raise OnfleetError.new(body["message"])
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.handle_restclient_error e
|
87
|
+
case e
|
88
|
+
when RestClient::RequestTimeout
|
89
|
+
message = "Could not connect to Onfleet. Check your internet connection and try again."
|
90
|
+
when RestClient::ServerBrokeConnection
|
91
|
+
message = "The connetion with onfleet terminated before the request completed. Please try again."
|
92
|
+
else
|
93
|
+
message = "There was a problem connection with Onfleet. Please try again. If the problem persists contact contact@onfleet.com"
|
94
|
+
end
|
95
|
+
|
96
|
+
raise ConnectionError.new(message)
|
97
|
+
end
|
98
|
+
end
|
data/onfleet.gemspec
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'onfleet-ruby'
|
3
|
+
s.version = '0.0.1'
|
4
|
+
s.date = '2015-08-03'
|
5
|
+
s.summary = "Onfleet ruby api"
|
6
|
+
s.description = "To interact with Onfleet's API"
|
7
|
+
s.authors = ["Nick Wargnier"]
|
8
|
+
s.email = 'nick@stylelend.com'
|
9
|
+
s.homepage =
|
10
|
+
'http://rubygems.org/gems/onfleet'
|
11
|
+
s.license = 'MIT'
|
12
|
+
|
13
|
+
s.add_dependency('rest-client', '~> 1.4')
|
14
|
+
|
15
|
+
s.add_development_dependency "rspec"
|
16
|
+
|
17
|
+
|
18
|
+
s.files = `git ls-files`.split("\n")
|
19
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
20
|
+
s.require_paths = ['lib']
|
21
|
+
end
|
data/spec/spec_helper.rb
ADDED
data/spec/test_data.rb
ADDED
metadata
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: onfleet-ruby
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Nick Wargnier
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-08-03 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rest-client
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.4'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.4'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: To interact with Onfleet's API
|
42
|
+
email: nick@stylelend.com
|
43
|
+
executables: []
|
44
|
+
extensions: []
|
45
|
+
extra_rdoc_files: []
|
46
|
+
files:
|
47
|
+
- .gitignore
|
48
|
+
- .rspec
|
49
|
+
- Gemfile
|
50
|
+
- README.md
|
51
|
+
- lib/onfleet.rb
|
52
|
+
- lib/onfleet/actions/create.rb
|
53
|
+
- lib/onfleet/actions/delete.rb
|
54
|
+
- lib/onfleet/actions/find.rb
|
55
|
+
- lib/onfleet/actions/get.rb
|
56
|
+
- lib/onfleet/actions/list.rb
|
57
|
+
- lib/onfleet/actions/save.rb
|
58
|
+
- lib/onfleet/actions/update.rb
|
59
|
+
- lib/onfleet/address.rb
|
60
|
+
- lib/onfleet/admin.rb
|
61
|
+
- lib/onfleet/destination.rb
|
62
|
+
- lib/onfleet/errors/authentication_error.rb
|
63
|
+
- lib/onfleet/errors/connection_error.rb
|
64
|
+
- lib/onfleet/errors/invalid_request_error.rb
|
65
|
+
- lib/onfleet/errors/onfleet_error.rb
|
66
|
+
- lib/onfleet/onfleet_object.rb
|
67
|
+
- lib/onfleet/organization.rb
|
68
|
+
- lib/onfleet/recipient.rb
|
69
|
+
- lib/onfleet/task.rb
|
70
|
+
- lib/onfleet/team.rb
|
71
|
+
- lib/onfleet/util.rb
|
72
|
+
- lib/onfleet/vehicle.rb
|
73
|
+
- lib/onfleet/worker.rb
|
74
|
+
- onfleet.gemspec
|
75
|
+
- spec/spec_helper.rb
|
76
|
+
- spec/test_data.rb
|
77
|
+
homepage: http://rubygems.org/gems/onfleet
|
78
|
+
licenses:
|
79
|
+
- MIT
|
80
|
+
metadata: {}
|
81
|
+
post_install_message:
|
82
|
+
rdoc_options: []
|
83
|
+
require_paths:
|
84
|
+
- lib
|
85
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
requirements: []
|
96
|
+
rubyforge_project:
|
97
|
+
rubygems_version: 2.4.5
|
98
|
+
signing_key:
|
99
|
+
specification_version: 4
|
100
|
+
summary: Onfleet ruby api
|
101
|
+
test_files:
|
102
|
+
- spec/spec_helper.rb
|
103
|
+
- spec/test_data.rb
|