onfleet-ruby 0.1.4 → 0.1.5
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.
- checksums.yaml +5 -5
- data/.gitignore +3 -0
- data/.rspec +1 -2
- data/.rubocop.yml +26 -0
- data/.rubocop_todo.yml +38 -0
- data/.ruby-version +2 -0
- data/Gemfile +3 -3
- data/Rakefile +10 -0
- data/lib/onfleet-ruby.rb +40 -38
- data/lib/onfleet-ruby/actions/create.rb +6 -3
- data/lib/onfleet-ruby/actions/delete.rb +4 -4
- data/lib/onfleet-ruby/actions/find.rb +8 -6
- data/lib/onfleet-ruby/actions/get.rb +5 -4
- data/lib/onfleet-ruby/actions/list.rb +15 -13
- data/lib/onfleet-ruby/actions/query_metadata.rb +5 -5
- data/lib/onfleet-ruby/actions/save.rb +13 -9
- data/lib/onfleet-ruby/actions/update.rb +4 -4
- data/lib/onfleet-ruby/address.rb +1 -0
- data/lib/onfleet-ruby/admin.rb +2 -1
- data/lib/onfleet-ruby/destination.rb +2 -1
- data/lib/onfleet-ruby/errors/authentication_error.rb +1 -0
- data/lib/onfleet-ruby/errors/connection_error.rb +1 -0
- data/lib/onfleet-ruby/errors/invalid_request_error.rb +1 -0
- data/lib/onfleet-ruby/errors/onfleet_error.rb +1 -0
- data/lib/onfleet-ruby/onfleet_object.rb +58 -59
- data/lib/onfleet-ruby/organization.rb +4 -9
- data/lib/onfleet-ruby/recipient.rb +2 -1
- data/lib/onfleet-ruby/task.rb +4 -4
- data/lib/onfleet-ruby/team.rb +2 -1
- data/lib/onfleet-ruby/util.rb +22 -20
- data/lib/onfleet-ruby/vehicle.rb +1 -0
- data/lib/onfleet-ruby/webhook.rb +2 -2
- data/lib/onfleet-ruby/worker.rb +2 -1
- data/onfleet-ruby.gemspec +11 -6
- data/spec/onfleet/admin_spec.rb +70 -0
- data/spec/onfleet/destination_spec.rb +62 -0
- data/spec/onfleet/organization_spec.rb +25 -0
- data/spec/onfleet/recipient_spec.rb +75 -0
- data/spec/onfleet/task_spec.rb +123 -0
- data/spec/onfleet/team_spec.rb +30 -0
- data/spec/onfleet/webhook_spec.rb +49 -0
- data/spec/onfleet/worker_spec.rb +67 -0
- data/spec/spec_helper.rb +78 -2
- data/spec/support/http_requests/shared_examples.rb +126 -0
- metadata +97 -13
- data/spec/test_data.rb +0 -14
@@ -1,102 +1,101 @@
|
|
1
1
|
module Onfleet
|
2
2
|
class OnfleetObject
|
3
3
|
attr_reader :params
|
4
|
-
|
5
|
-
|
4
|
+
attr_accessor :id
|
5
|
+
|
6
|
+
def initialize(params)
|
7
|
+
if params.is_a?(Hash)
|
6
8
|
@params = params
|
7
|
-
|
8
|
-
elsif params.
|
9
|
-
@params = {id: params}
|
10
|
-
|
9
|
+
assign_attributes(@params)
|
10
|
+
elsif params.is_a?(String)
|
11
|
+
@params = { id: params }
|
12
|
+
assign_attributes(@params)
|
11
13
|
else
|
12
14
|
@params = {}
|
13
15
|
end
|
14
16
|
end
|
15
17
|
|
16
|
-
def parse_response
|
18
|
+
def parse_response(response)
|
17
19
|
@params = response
|
18
|
-
|
20
|
+
assign_attributes(response)
|
19
21
|
self
|
20
22
|
end
|
21
23
|
|
22
24
|
def attributes
|
23
|
-
attrs =
|
24
|
-
instance_variables.each do |var|
|
25
|
-
str = var.to_s.gsub
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
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
|
25
|
+
attrs = {}
|
26
|
+
instance_variables.reject { |var| var == '@params' }.each do |var|
|
27
|
+
str = var.to_s.gsub(/^@/, '')
|
28
|
+
next unless respond_to?("#{str}=")
|
29
|
+
instance_var = instance_variable_get(var)
|
30
|
+
if Util.object_classes[str]
|
31
|
+
if instance_var.is_a?(OnfleetObject)
|
32
|
+
attrs[Util.to_camel_case_lower(str).to_sym] = parse_onfleet_obj(instance_var)
|
33
|
+
elsif instance_var.is_a?(Array)
|
34
|
+
objs = []
|
35
|
+
instance_var.each do |object|
|
36
|
+
objs << parse_onfleet_obj(object)
|
39
37
|
end
|
38
|
+
attrs[Util.to_camel_case_lower(str).to_sym] = objs
|
40
39
|
else
|
41
40
|
attrs[Util.to_camel_case_lower(str).to_sym] = instance_var
|
42
41
|
end
|
42
|
+
else
|
43
|
+
attrs[Util.to_camel_case_lower(str).to_sym] = instance_var
|
43
44
|
end
|
44
45
|
end
|
45
46
|
attrs
|
46
47
|
end
|
47
48
|
|
48
49
|
def class_name
|
49
|
-
self.class.name.split(
|
50
|
+
self.class.name.split('::').last
|
50
51
|
end
|
51
52
|
|
52
53
|
def api_url
|
53
|
-
"
|
54
|
+
"#{CGI.escape(class_name.downcase)}s"
|
54
55
|
end
|
55
56
|
|
56
57
|
private
|
57
58
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
end
|
65
|
-
end
|
59
|
+
def parse_onfleet_obj(obj)
|
60
|
+
return unless obj.is_a?(OnfleetObject)
|
61
|
+
if obj.respond_to?('id') && obj.id && (obj.is_a?(Destination) || obj.is_a?(Recipient) || obj.is_a?(Task))
|
62
|
+
obj.id
|
63
|
+
else
|
64
|
+
obj.attributes
|
66
65
|
end
|
66
|
+
end
|
67
67
|
|
68
|
-
|
69
|
-
|
70
|
-
|
68
|
+
def assign_attributes(params)
|
69
|
+
params.each do |key, value|
|
70
|
+
key_underscore = Util.to_underscore(key)
|
71
71
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
end
|
79
|
-
value = objs
|
80
|
-
when Hash
|
81
|
-
value = klass.new(value)
|
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)
|
82
78
|
end
|
79
|
+
value = objs
|
80
|
+
when Hash
|
81
|
+
value = klass.new(value)
|
83
82
|
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
83
|
end
|
92
|
-
end
|
93
84
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
85
|
+
if respond_to?("#{key_underscore}=")
|
86
|
+
send(:"#{key_underscore}=", value)
|
87
|
+
else
|
88
|
+
add_attrs(key_underscore.to_s => value)
|
98
89
|
end
|
99
90
|
end
|
91
|
+
end
|
100
92
|
|
93
|
+
def add_attrs(attrs)
|
94
|
+
attrs.each do |var, value|
|
95
|
+
self.class.class_eval { attr_accessor var }
|
96
|
+
instance_variable_set "@#{var}", value
|
97
|
+
end
|
98
|
+
end
|
101
99
|
end
|
102
100
|
end
|
101
|
+
|
@@ -1,19 +1,14 @@
|
|
1
1
|
module Onfleet
|
2
2
|
class Organization < OnfleetObject
|
3
|
-
|
4
3
|
class << self
|
5
4
|
def get
|
6
|
-
|
7
|
-
response = Onfleet.request(url, :get)
|
8
|
-
Util.constantize("#{self}").new(response)
|
5
|
+
new(Onfleet.request('organization', :get))
|
9
6
|
end
|
10
7
|
|
11
|
-
def get_delegatee_details
|
12
|
-
|
13
|
-
response = Onfleet.request(url, :get)
|
14
|
-
Util.constantize("#{self}").new(response)
|
8
|
+
def get_delegatee_details(id)
|
9
|
+
new(Onfleet.request("organizations/#{id}", :get))
|
15
10
|
end
|
16
11
|
end
|
17
|
-
|
18
12
|
end
|
19
13
|
end
|
14
|
+
|
data/lib/onfleet-ruby/task.rb
CHANGED
@@ -9,16 +9,16 @@ module Onfleet
|
|
9
9
|
include Onfleet::Actions::QueryMetadata
|
10
10
|
|
11
11
|
def self.api_url
|
12
|
-
'
|
12
|
+
'tasks'
|
13
13
|
end
|
14
14
|
|
15
15
|
def complete
|
16
16
|
# CURRENTLY DOESN'T WORK
|
17
|
-
url = "#{self.url}/#{
|
18
|
-
params = {
|
17
|
+
url = "#{self.url}/#{id}/complete"
|
18
|
+
params = { 'completionDetails' => { 'success' => true } }
|
19
19
|
Onfleet.request(url, :post, params)
|
20
20
|
true
|
21
21
|
end
|
22
|
-
|
23
22
|
end
|
24
23
|
end
|
24
|
+
|
data/lib/onfleet-ruby/team.rb
CHANGED
data/lib/onfleet-ruby/util.rb
CHANGED
@@ -1,35 +1,37 @@
|
|
1
|
+
require 'active_support/core_ext/string/inflections'
|
2
|
+
|
1
3
|
module Onfleet
|
2
4
|
class Util
|
3
|
-
|
5
|
+
SPECIAL_PARSE = { 'skip_sms_notifications' => 'skipSMSNotifications' }.freeze
|
6
|
+
|
7
|
+
def self.constantize(class_name)
|
4
8
|
Object.const_get(class_name)
|
5
9
|
end
|
6
10
|
|
7
|
-
def self.to_underscore
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
downcase
|
11
|
+
def self.to_underscore(key)
|
12
|
+
key
|
13
|
+
.to_s
|
14
|
+
.gsub(/::/, '/')
|
15
|
+
.gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
|
16
|
+
.gsub(/([a-z\d])([A-Z])/, '\1_\2')
|
17
|
+
.tr('-', '_')
|
18
|
+
.downcase
|
16
19
|
end
|
17
20
|
|
18
|
-
def self.to_camel_case_lower
|
19
|
-
str
|
20
|
-
|
21
|
+
def self.to_camel_case_lower(str)
|
22
|
+
SPECIAL_PARSE[str] || str.camelize(:lower)
|
21
23
|
end
|
22
24
|
|
23
25
|
def self.object_classes
|
24
26
|
@object_classes ||= {
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
27
|
+
'address' => Address,
|
28
|
+
'recipients' => Recipient,
|
29
|
+
'recipient' => Recipient,
|
30
|
+
'tasks' => Task,
|
31
|
+
'destination' => Destination,
|
32
|
+
'vehicle' => Vehicle
|
31
33
|
}
|
32
34
|
end
|
33
35
|
end
|
34
|
-
|
35
36
|
end
|
37
|
+
|
data/lib/onfleet-ruby/vehicle.rb
CHANGED
data/lib/onfleet-ruby/webhook.rb
CHANGED
data/lib/onfleet-ruby/worker.rb
CHANGED
data/onfleet-ruby.gemspec
CHANGED
@@ -1,20 +1,25 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'onfleet-ruby'
|
3
|
-
s.version = '0.1.
|
3
|
+
s.version = '0.1.5'
|
4
4
|
s.date = '2016-04-08'
|
5
|
-
s.summary =
|
5
|
+
s.summary = 'Onfleet ruby api'
|
6
6
|
s.description = "To interact with Onfleet's API"
|
7
|
-
s.authors = [
|
7
|
+
s.authors = ['Nick Wargnier']
|
8
8
|
s.email = 'nick@stylelend.com'
|
9
9
|
s.homepage = 'http://rubygems.org/gems/onfleet-ruby'
|
10
10
|
s.license = 'MIT'
|
11
11
|
|
12
|
-
s.add_dependency('
|
13
|
-
|
14
|
-
s.add_development_dependency("rspec",'~> 3.3.0', '>= 3.0.0')
|
12
|
+
s.add_dependency('activesupport', '>= 4.2')
|
13
|
+
s.add_dependency('rest-client', '>= 2.0')
|
15
14
|
|
15
|
+
s.add_development_dependency('rake')
|
16
|
+
s.add_development_dependency('rspec', '~> 3.3')
|
17
|
+
s.add_development_dependency('rspec-its')
|
18
|
+
s.add_development_dependency('rubocop', '~> 0.55')
|
19
|
+
s.add_development_dependency('webmock', '~> 3.4')
|
16
20
|
|
17
21
|
s.files = `git ls-files`.split("\n")
|
18
22
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
23
|
s.require_paths = ['lib']
|
20
24
|
end
|
25
|
+
|
@@ -0,0 +1,70 @@
|
|
1
|
+
RSpec.describe Onfleet::Admin do
|
2
|
+
let(:admin) { described_class.new(params) }
|
3
|
+
let(:params) { { id: 'an-admin', name: 'An Admin' } }
|
4
|
+
|
5
|
+
describe ".list" do
|
6
|
+
subject { -> { described_class.list(query_params) } }
|
7
|
+
|
8
|
+
context "with no filter" do
|
9
|
+
let(:query_params) { nil }
|
10
|
+
it_should_behave_like Onfleet::Actions::List, path: 'admins'
|
11
|
+
end
|
12
|
+
|
13
|
+
context "with query params" do
|
14
|
+
let(:query_params) { { food: 'pizza', topping: 'mushroom' } }
|
15
|
+
it_should_behave_like Onfleet::Actions::List, path: 'admins?food=pizza&topping=mushroom'
|
16
|
+
end
|
17
|
+
|
18
|
+
context "with a URL-unsafe query param" do
|
19
|
+
let(:query_params) { { food: 'green eggs & ham' } }
|
20
|
+
it_should_behave_like Onfleet::Actions::List, path: 'admins?food=green+eggs+%26+ham'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe ".create" do
|
25
|
+
subject { -> { described_class.create(params) } }
|
26
|
+
it_should_behave_like Onfleet::Actions::Create, path: 'admins'
|
27
|
+
end
|
28
|
+
|
29
|
+
describe ".update" do
|
30
|
+
subject { -> { described_class.update(id, params) } }
|
31
|
+
let(:id) { 'an-admin' }
|
32
|
+
it_should_behave_like Onfleet::Actions::Update, path: 'admins/an-admin'
|
33
|
+
end
|
34
|
+
|
35
|
+
describe ".delete" do
|
36
|
+
subject { -> { described_class.delete(id) } }
|
37
|
+
let(:id) { 'an-admin' }
|
38
|
+
it_should_behave_like Onfleet::Actions::Delete, path: 'admins/an-admin'
|
39
|
+
end
|
40
|
+
|
41
|
+
describe ".query_by_metadata" do
|
42
|
+
subject { -> { described_class.query_by_metadata(metadata) } }
|
43
|
+
let(:metadata) { [{ name: 'color', type: 'string', value: 'ochre' }] }
|
44
|
+
it_should_behave_like Onfleet::Actions::QueryMetadata, path: 'admins'
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "#save" do
|
48
|
+
subject { -> { admin.save } }
|
49
|
+
|
50
|
+
context "with an ID attribute" do
|
51
|
+
before { expect(params[:id]).to be }
|
52
|
+
it_should_behave_like Onfleet::Actions::Update, path: 'admins/an-admin'
|
53
|
+
end
|
54
|
+
|
55
|
+
context "without an ID attribute" do
|
56
|
+
let(:params) { { name: 'An Admin' } }
|
57
|
+
it_should_behave_like Onfleet::Actions::Create, path: 'admins'
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
%i[id name email type metadata].each do |attr|
|
62
|
+
describe "##{attr}" do
|
63
|
+
subject { admin.public_send(attr) }
|
64
|
+
let(:params) { { attr => value } }
|
65
|
+
let(:value) { 'pizza' }
|
66
|
+
it { should == value }
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|