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.
Files changed (46) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +3 -0
  3. data/.rspec +1 -2
  4. data/.rubocop.yml +26 -0
  5. data/.rubocop_todo.yml +38 -0
  6. data/.ruby-version +2 -0
  7. data/Gemfile +3 -3
  8. data/Rakefile +10 -0
  9. data/lib/onfleet-ruby.rb +40 -38
  10. data/lib/onfleet-ruby/actions/create.rb +6 -3
  11. data/lib/onfleet-ruby/actions/delete.rb +4 -4
  12. data/lib/onfleet-ruby/actions/find.rb +8 -6
  13. data/lib/onfleet-ruby/actions/get.rb +5 -4
  14. data/lib/onfleet-ruby/actions/list.rb +15 -13
  15. data/lib/onfleet-ruby/actions/query_metadata.rb +5 -5
  16. data/lib/onfleet-ruby/actions/save.rb +13 -9
  17. data/lib/onfleet-ruby/actions/update.rb +4 -4
  18. data/lib/onfleet-ruby/address.rb +1 -0
  19. data/lib/onfleet-ruby/admin.rb +2 -1
  20. data/lib/onfleet-ruby/destination.rb +2 -1
  21. data/lib/onfleet-ruby/errors/authentication_error.rb +1 -0
  22. data/lib/onfleet-ruby/errors/connection_error.rb +1 -0
  23. data/lib/onfleet-ruby/errors/invalid_request_error.rb +1 -0
  24. data/lib/onfleet-ruby/errors/onfleet_error.rb +1 -0
  25. data/lib/onfleet-ruby/onfleet_object.rb +58 -59
  26. data/lib/onfleet-ruby/organization.rb +4 -9
  27. data/lib/onfleet-ruby/recipient.rb +2 -1
  28. data/lib/onfleet-ruby/task.rb +4 -4
  29. data/lib/onfleet-ruby/team.rb +2 -1
  30. data/lib/onfleet-ruby/util.rb +22 -20
  31. data/lib/onfleet-ruby/vehicle.rb +1 -0
  32. data/lib/onfleet-ruby/webhook.rb +2 -2
  33. data/lib/onfleet-ruby/worker.rb +2 -1
  34. data/onfleet-ruby.gemspec +11 -6
  35. data/spec/onfleet/admin_spec.rb +70 -0
  36. data/spec/onfleet/destination_spec.rb +62 -0
  37. data/spec/onfleet/organization_spec.rb +25 -0
  38. data/spec/onfleet/recipient_spec.rb +75 -0
  39. data/spec/onfleet/task_spec.rb +123 -0
  40. data/spec/onfleet/team_spec.rb +30 -0
  41. data/spec/onfleet/webhook_spec.rb +49 -0
  42. data/spec/onfleet/worker_spec.rb +67 -0
  43. data/spec/spec_helper.rb +78 -2
  44. data/spec/support/http_requests/shared_examples.rb +126 -0
  45. metadata +97 -13
  46. data/spec/test_data.rb +0 -14
@@ -6,7 +6,8 @@ module Onfleet
6
6
  include Onfleet::Actions::QueryMetadata
7
7
 
8
8
  def self.api_url
9
- '/destinations'
9
+ 'destinations'
10
10
  end
11
11
  end
12
12
  end
13
+
@@ -1,3 +1,4 @@
1
1
  module Onfleet
2
2
  class AuthenticationError < OnfleetError; end
3
3
  end
4
+
@@ -1,3 +1,4 @@
1
1
  module Onfleet
2
2
  class ConnectionError < OnfleetError; end
3
3
  end
4
+
@@ -1,3 +1,4 @@
1
1
  module Onfleet
2
2
  class InvalidRequestError < OnfleetError; end
3
3
  end
4
+
@@ -1,3 +1,4 @@
1
1
  module Onfleet
2
2
  class OnfleetError < StandardError; end
3
3
  end
4
+
@@ -1,102 +1,101 @@
1
1
  module Onfleet
2
2
  class OnfleetObject
3
3
  attr_reader :params
4
- def initialize params
5
- if params.kind_of?(Hash)
4
+ attr_accessor :id
5
+
6
+ def initialize(params)
7
+ if params.is_a?(Hash)
6
8
  @params = params
7
- set_attributes(@params)
8
- elsif params.kind_of?(String)
9
- @params = {id: params}
10
- set_attributes(@params)
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 response
18
+ def parse_response(response)
17
19
  @params = response
18
- set_attributes(response)
20
+ assign_attributes(response)
19
21
  self
20
22
  end
21
23
 
22
24
  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
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("::").last
50
+ self.class.name.split('::').last
50
51
  end
51
52
 
52
53
  def api_url
53
- "/#{CGI.escape(class_name.downcase)}s"
54
+ "#{CGI.escape(class_name.downcase)}s"
54
55
  end
55
56
 
56
57
  private
57
58
 
58
- def parse_onfleet_obj obj
59
- if obj.is_a?(OnfleetObject)
60
- if obj.respond_to?('id') && obj.id && (obj.is_a?(Destination) || obj.is_a?(Recipient) || obj.is_a?(Task))
61
- obj.id
62
- else
63
- obj.attributes
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
- def set_attributes params
69
- params.each do |key, value|
70
- key_underscore = Util.to_underscore(key)
68
+ def assign_attributes(params)
69
+ params.each do |key, value|
70
+ key_underscore = Util.to_underscore(key)
71
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)
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
- def add_attrs attrs
95
- attrs.each do |var, value|
96
- self.class.class_eval { attr_accessor var }
97
- instance_variable_set "@#{var}", value
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
- url = "/organization"
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 id
12
- url = "/organizations/#{id}"
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
+
@@ -8,7 +8,8 @@ module Onfleet
8
8
  include Onfleet::Actions::QueryMetadata
9
9
 
10
10
  def self.api_url
11
- "/recipients"
11
+ 'recipients'
12
12
  end
13
13
  end
14
14
  end
15
+
@@ -9,16 +9,16 @@ module Onfleet
9
9
  include Onfleet::Actions::QueryMetadata
10
10
 
11
11
  def self.api_url
12
- '/tasks'
12
+ 'tasks'
13
13
  end
14
14
 
15
15
  def complete
16
16
  # CURRENTLY DOESN'T WORK
17
- url = "#{self.url}/#{self.id}/complete"
18
- params = {"completionDetails" => {"success" => true }}
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
+
@@ -4,7 +4,8 @@ module Onfleet
4
4
  include Onfleet::Actions::Get
5
5
 
6
6
  def self.api_url
7
- '/teams'
7
+ 'teams'
8
8
  end
9
9
  end
10
10
  end
11
+
@@ -1,35 +1,37 @@
1
+ require 'active_support/core_ext/string/inflections'
2
+
1
3
  module Onfleet
2
4
  class Util
3
- def self.constantize class_name
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 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
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 str
19
- str.split('_').inject([]){ |buffer,e| buffer.push(buffer.empty? ? e : e.capitalize) }.join
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
- "address" => Address,
26
- "recipients" => Recipient,
27
- "recipient" => Recipient,
28
- "tasks" => Task,
29
- "destination" => Destination,
30
- "vehicle" => Vehicle
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
+
@@ -2,3 +2,4 @@ module Onfleet
2
2
  class Vehicle < OnfleetObject
3
3
  end
4
4
  end
5
+
@@ -5,9 +5,9 @@ module Onfleet
5
5
  include Onfleet::Actions::Save
6
6
  include Onfleet::Actions::Delete
7
7
 
8
-
9
8
  def self.api_url
10
- '/webhooks'
9
+ 'webhooks'
11
10
  end
12
11
  end
13
12
  end
13
+
@@ -9,7 +9,8 @@ module Onfleet
9
9
  include Onfleet::Actions::QueryMetadata
10
10
 
11
11
  def self.api_url
12
- '/workers'
12
+ 'workers'
13
13
  end
14
14
  end
15
15
  end
16
+
@@ -1,20 +1,25 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'onfleet-ruby'
3
- s.version = '0.1.4'
3
+ s.version = '0.1.5'
4
4
  s.date = '2016-04-08'
5
- s.summary = "Onfleet ruby api"
5
+ s.summary = 'Onfleet ruby api'
6
6
  s.description = "To interact with Onfleet's API"
7
- s.authors = ["Nick Wargnier"]
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('rest-client', '~> 1.4')
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
+