hypertrack 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9716d695f09e507853ca9745f765191d5efeabda
4
+ data.tar.gz: 8a2c4b15c4770a2f9cc2952efe8b1c2cec933972
5
+ SHA512:
6
+ metadata.gz: 465a675a0ce5a9e5c70110c7b1c79243b094dcdf58f9d545243ce40ea97661dfa5d7db810ac108e42910c9f42968995473edcce51e8b582b2b608036f427f34c
7
+ data.tar.gz: eb695184c6af67acd6e5c592660586744606d95926424acb4c3aef76c866cec9da60ede42917479a8838e5ac5047270f4605ad18356fb4bbf021fdb31e407fc2
@@ -0,0 +1,44 @@
1
+ require "json"
2
+ require 'net/https'
3
+
4
+ require_relative "util"
5
+ require_relative "hypertrack/params_validator"
6
+
7
+ # Errors
8
+ require_relative "hypertrack/errors/hypertrack_errors"
9
+
10
+ # API Operations
11
+ require_relative "hypertrack/api_operations/common/create"
12
+ require_relative "hypertrack/api_operations/common/retrieve"
13
+ require_relative "hypertrack/api_operations/common/list"
14
+ require_relative "hypertrack/api_operations/common/update"
15
+ require_relative "hypertrack/api_operations/driver_api"
16
+ require_relative "hypertrack/api_operations/task_api"
17
+ require_relative "hypertrack/api_operations/trip_api"
18
+ require_relative "hypertrack/api_operations/shift_api"
19
+
20
+ # All HTTP calls made here
21
+ require_relative "hypertrack/api_client"
22
+
23
+ # HyperTrack Resouce Wrapper
24
+ require_relative "hypertrack/shared_resource"
25
+
26
+ # Resources
27
+ require_relative "hypertrack/resources/driver"
28
+ require_relative "hypertrack/resources/customer"
29
+ require_relative "hypertrack/resources/destination"
30
+ require_relative "hypertrack/resources/task"
31
+ require_relative "hypertrack/resources/trip"
32
+ require_relative "hypertrack/resources/neighbourhood"
33
+ require_relative "hypertrack/resources/fleet"
34
+ require_relative "hypertrack/resources/hub"
35
+ require_relative "hypertrack/resources/shift"
36
+ require_relative "hypertrack/resources/event"
37
+
38
+ module HyperTrack
39
+
40
+ class << self
41
+ attr_accessor :secret_key
42
+ end
43
+
44
+ end
@@ -0,0 +1,94 @@
1
+ module HyperTrack
2
+ class ApiClient
3
+
4
+ BASE_URL = "https://app.hypertrack.io/api"
5
+ API_VERSION = "v1"
6
+
7
+ VERB_MAP = {
8
+ :get => Net::HTTP::Get,
9
+ :post => Net::HTTP::Post
10
+ }
11
+
12
+ ACCEPTED_RESPONSE_CODES = [200, 201]
13
+
14
+ class << self
15
+
16
+ def create(api_path, data={})
17
+ api_uri = get_uri(api_path)
18
+ request_object = create_request_object(api_uri, :post)
19
+ request_object.body = data.to_json
20
+ make_request(api_uri, request_object)
21
+ end
22
+ alias_method :update, :create
23
+
24
+ def fetch(api_path, query_params={})
25
+ api_path = path_with_params(api_path, query_params) if query_params.is_a?(Hash) && query_params.keys.length > 0
26
+ api_uri = get_uri(api_path)
27
+ request_object = create_request_object(api_uri, :get)
28
+ make_request(api_uri, request_object)
29
+ end
30
+
31
+ private
32
+
33
+ def path_with_params(path, params)
34
+ encoded_params = URI.encode_www_form(params)
35
+ [path, encoded_params].join("?")
36
+ end
37
+
38
+ def get_auth_header
39
+ if Util.blank?(HyperTrack.secret_key)
40
+ raise HyperTrack::InvalidAPIKey.new("HyperTrack.secret_key is invalid.")
41
+ end
42
+
43
+ { "Authorization" => "token #{HyperTrack.secret_key}" }
44
+ end
45
+
46
+ def get_uri(path)
47
+ url = "#{BASE_URL}/#{API_VERSION}/#{path}"
48
+ URI.parse(url)
49
+ end
50
+
51
+ def create_request_object(api_uri, http_method)
52
+ if VERB_MAP[http_method].nil?
53
+ raise HyperTrack::MethodNotAllowed.new("Unsupported HTTP verb used - Only #{VERB_MAP.keys.map{ |x| x.to_s.upcase }} allowed")
54
+ end
55
+
56
+ header = get_auth_header
57
+ request_object = VERB_MAP[http_method].new(api_uri.path, header)
58
+ request_object['Content-Type'] = 'application/json'
59
+ request_object
60
+ end
61
+
62
+ # To-Do: Add a timeout
63
+ def make_request(api_uri, request_object)
64
+ conn = Net::HTTP.new api_uri.host, api_uri.port
65
+ conn.use_ssl = api_uri.scheme == 'https'
66
+ conn.verify_mode = OpenSSL::SSL::VERIFY_PEER
67
+ conn.cert_store = OpenSSL::X509::Store.new
68
+ conn.cert_store.set_default_paths
69
+ parse_response(conn.request(request_object))
70
+ end
71
+
72
+ def parse_response(response)
73
+ response_code = response.code.to_i
74
+
75
+ if valid_response_code?(response_code)
76
+ begin
77
+ JSON.parse(response.body)
78
+ rescue JSON::ParserError => e
79
+ raise HyperTrack::InvalidJSONResponse(response.body)
80
+ end
81
+ else
82
+ error_klass = HyperTrack::Error.defined_codes[response_code] || HyperTrack::UnknownError
83
+ raise error_klass.new(response.body, response_code)
84
+ end
85
+ end
86
+
87
+ def valid_response_code?(code)
88
+ ACCEPTED_RESPONSE_CODES.include?(code)
89
+ end
90
+
91
+ end
92
+
93
+ end
94
+ end
@@ -0,0 +1,16 @@
1
+ module HyperTrack
2
+ module ApiOperations
3
+ module Common
4
+ module Create
5
+
6
+ def create(params={})
7
+ if HyperTrack::ParamsValidator.valid_args?(params, get_class_name::REQUIRED_FIELDS, get_class_name::VALID_ATTRIBUTE_VALUES)
8
+ result = HyperTrack::ApiClient.create(get_class_name::API_BASE_PATH, params)
9
+ get_class_name.new(result['id'], result)
10
+ end
11
+ end
12
+
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,19 @@
1
+ module HyperTrack
2
+ module ApiOperations
3
+ module Common
4
+ module List
5
+
6
+ def list(filter_params={})
7
+ api_result = HyperTrack::ApiClient.fetch(get_class_name::API_BASE_PATH, filter_params)
8
+
9
+ api_result['results'].each_with_index do |opts, idx|
10
+ api_result['results'][idx] = get_class_name.new(opts['id'], opts)
11
+ end
12
+
13
+ api_result
14
+ end
15
+
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,24 @@
1
+ module HyperTrack
2
+ module ApiOperations
3
+ module Common
4
+ module Retrieve
5
+
6
+ def retrieve(id)
7
+ raise HyperTrack::InvalidParameters.new("ID is required to retrieve a #{self.name}") unless valid_retrieve_id?(id)
8
+
9
+ retrieve_customer_path = "#{get_class_name::API_BASE_PATH}#{id}/"
10
+ result = HyperTrack::ApiClient.fetch(retrieve_customer_path)
11
+
12
+ get_class_name.new(id, result)
13
+ end
14
+
15
+ private
16
+
17
+ def valid_retrieve_id?(id)
18
+ !Util.blank?(id)
19
+ end
20
+
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,33 @@
1
+ module HyperTrack
2
+ module ApiOperations
3
+ module Common
4
+ module Update
5
+
6
+ def update(path, params, required_params=[])
7
+ if HyperTrack::ParamsValidator.valid_args?(params, required_params, self.class::VALID_ATTRIBUTE_VALUES)
8
+ api_path = "#{self.class::API_BASE_PATH}#{self.id}/" + path
9
+ result = HyperTrack::ApiClient.update(api_path, params)
10
+ update_attributes_in_object(result)
11
+ end
12
+ end
13
+
14
+ private
15
+
16
+ def update_attributes_in_object(result)
17
+ result = Util.symbolize_keys(result)
18
+
19
+ self_keys = self.keys
20
+
21
+ result.each do |key, value|
22
+ if self_keys.include?(key) && self[key] != value
23
+ self[key] = value
24
+ end
25
+ end
26
+
27
+ self
28
+ end
29
+
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,25 @@
1
+ module HyperTrack
2
+ module ApiOperations
3
+ module DriverAPI
4
+
5
+ def self.included(base)
6
+ base.extend(ClassMethods)
7
+ end
8
+
9
+ module ClassMethods
10
+
11
+ def map_list(filter_params={})
12
+ map_list_path = "#{HyperTrack::Driver::API_BASE_PATH}map_list/"
13
+ result = HyperTrack::ApiClient.fetch(map_list_path, filter_params)
14
+ end
15
+
16
+ end
17
+
18
+ def overview(filter_params={})
19
+ driver_overview_path = "#{HyperTrack::Driver::API_BASE_PATH}#{self.id}/overview/"
20
+ result = HyperTrack::ApiClient.fetch(driver_overview_path, filter_params)
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,13 @@
1
+ module HyperTrack
2
+ module ApiOperations
3
+ module ShiftAPI
4
+
5
+ # Don't want to name this method as 'end'. Its a reserved keyword in Ruby.
6
+ def end_shift(params)
7
+ path = "end/"
8
+ self.update(path, params, [:end_location])
9
+ end
10
+
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,32 @@
1
+ module HyperTrack
2
+ module ApiOperations
3
+ module TaskAPI
4
+
5
+ def editable_url(params)
6
+ path = "editable_url/"
7
+ self.update(path, params, [:editable])
8
+ end
9
+
10
+ def start(params)
11
+ path = "start/"
12
+ self.update(path, params, [:start_location, :start_time])
13
+ end
14
+
15
+ def complete(params)
16
+ path = "completed/"
17
+ self.update(path, params, [:completion_location])
18
+ end
19
+
20
+ def cancel(params={})
21
+ path = "canceled/"
22
+ self.update(path, params)
23
+ end
24
+
25
+ def update_destination(params)
26
+ path = "update_destination/"
27
+ self.update(path, params, [:location])
28
+ end
29
+
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,43 @@
1
+ module HyperTrack
2
+ module ApiOperations
3
+ module TripAPI
4
+
5
+ def self.included(base)
6
+ base.extend(ClassMethods)
7
+ end
8
+
9
+ module ClassMethods
10
+
11
+ def sending_eta(params)
12
+ if HyperTrack::ParamsValidator.valid_args?(params, [:driver, :destination], HyperTrack::Trip::VALID_ATTRIBUTE_VALUES)
13
+ eta_path = "#{HyperTrack::Trip::API_BASE_PATH}lite/"
14
+ result = HyperTrack::ApiClient.update(eta_path, params)
15
+ end
16
+ end
17
+
18
+ end
19
+
20
+ # Don't want to name this method as 'end'. Its a reserved keyword in Ruby.
21
+ def end_trip(params)
22
+ path = "end/"
23
+ self.update(path, params, [:end_location])
24
+ end
25
+
26
+ def add_task(params)
27
+ path = 'add_task/'
28
+ self.update(path, params, [:task_id])
29
+ end
30
+
31
+ def remove_task(params)
32
+ path = 'remove_task/'
33
+ self.update(path, params, [:task_id])
34
+ end
35
+
36
+ def change_task_order(params)
37
+ path = 'change_task_order/'
38
+ self.update(path, params, [:task_order])
39
+ end
40
+
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,67 @@
1
+ module HyperTrack
2
+ class Error < StandardError
3
+
4
+ attr_reader :code
5
+
6
+ def self.defined_codes
7
+ {
8
+ 400 => HyperTrack::InvalidParameters,
9
+ 401 => HyperTrack::InvalidAPIKey,
10
+ 402 => HyperTrack::NoFreeCreditsLeft,
11
+ 403 => HyperTrack::AccessForbidden,
12
+ 404 => HyperTrack::ResourceNotFound,
13
+ 405 => HyperTrack::MethodNotAllowed,
14
+ 406 => HyperTrack::FormatNotAcceptable,
15
+ 410 => HyperTrack::ResourceRemovedFromServer,
16
+ 429 => HyperTrack::RateLimitExceeded,
17
+ 500 => HyperTrack::InternalServerError,
18
+ 503 => HyperTrack::ServiceTemporarilyUnavailable
19
+ }
20
+ end
21
+
22
+ def initialize(message, code=nil)
23
+ @code = code
24
+ super(message)
25
+ end
26
+
27
+ end
28
+
29
+ # Raised when - Missing or invalid parameters in API call
30
+ class InvalidParameters < Error; end
31
+
32
+ # Raised when - Missing or invalid API key
33
+ class InvalidAPIKey < Error; end
34
+
35
+ # Raised when - You don't have any free credits left
36
+ class NoFreeCreditsLeft < Error; end
37
+
38
+ # Raised when - You don’t have permission to access the resource
39
+ class AccessForbidden < Error; end
40
+
41
+ # Raised when - The resource does not exist
42
+ class ResourceNotFound < Error; end
43
+
44
+ # Raised when - You tried to access a resource with an invalid method
45
+ class MethodNotAllowed < Error; end
46
+
47
+ # Raised when - You requested a format that isn’t json
48
+ class FormatNotAcceptable < Error; end
49
+
50
+ # Raised when - The requested resource has been removed from our servers
51
+ class ResourceRemovedFromServer < Error; end
52
+
53
+ # Raised when - You have hit the rate limit for your account
54
+ class RateLimitExceeded < Error; end
55
+
56
+ # Raised when - There was an error on the server and we have been notified. Try again later.
57
+ class InternalServerError < Error; end
58
+
59
+ # Raised when - We are temporarily offline for maintenance. Please try again later.
60
+ class ServiceTemporarilyUnavailable < Error; end
61
+
62
+ # Raised when - We get an unknown response code from the API
63
+ class UnknownError < Error; end
64
+
65
+ # Raised when - We get an invalid JSON in response from API
66
+ class InvalidJSONResponse < Error; end
67
+ end
@@ -0,0 +1,46 @@
1
+ module HyperTrack
2
+ module ParamsValidator
3
+
4
+ class << self
5
+
6
+ def valid_args?(params, required_fields, valid_attr_values)
7
+ unless valid_params_object?(params)
8
+ raise HyperTrack::InvalidParameters.new("Error: Expected a Hash. Got: #{params}")
9
+ end
10
+
11
+ params = Util.symbolize_keys(params)
12
+
13
+ if missing_required_fields?(params, required_fields)
14
+ raise HyperTrack::InvalidParameters.new("Request is missing required params - #{required_fields - params.keys}")
15
+ end
16
+
17
+ params.each do |name, value|
18
+ next if Util.blank?(value) && valid_attr_values[name][:allow_nil]
19
+ next if valid_attr_values[name].nil? || valid_attr_values[name][:allowed].nil?
20
+
21
+ valid_values = valid_attr_values[name][:allowed]
22
+ if !valid_values.include?(value) && !valid_values.include?(value.to_sym)
23
+ raise HyperTrack::InvalidParameters.new("Error: Invalid #{name}: #{value}. Allowed: #{valid_values.join(', ')}")
24
+ end
25
+ end
26
+
27
+ true
28
+ end
29
+
30
+ private
31
+
32
+ def valid_params_object?(params)
33
+ params.is_a?(Hash)
34
+ end
35
+
36
+ def missing_required_fields?(params, required_fields)
37
+ required_fields.each do |field|
38
+ return true if Util.blank?(params[field])
39
+ end
40
+
41
+ false
42
+ end
43
+
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,10 @@
1
+ module HyperTrack
2
+ class Customer < HyperTrack::SharedResource
3
+
4
+ API_BASE_PATH = "customers/"
5
+ REQUIRED_FIELDS = [:name]
6
+
7
+ VALID_ATTRIBUTE_VALUES = {}
8
+
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module HyperTrack
2
+ class Destination < HyperTrack::SharedResource
3
+
4
+ API_BASE_PATH = "destinations/"
5
+ REQUIRED_FIELDS = [:customer_id]
6
+
7
+ VALID_ATTRIBUTE_VALUES = {}
8
+
9
+ end
10
+ end
@@ -0,0 +1,15 @@
1
+ module HyperTrack
2
+ class Driver < HyperTrack::SharedResource
3
+ include HyperTrack::ApiOperations::DriverAPI
4
+
5
+ API_BASE_PATH = "drivers/"
6
+ REQUIRED_FIELDS = [:name, :vehicle_type]
7
+
8
+ VALID_ATTRIBUTE_VALUES = {
9
+ vehicle_type: {
10
+ allowed: HyperTrack::SharedResource::VALID_VEHICLE_TYPES
11
+ }
12
+ }
13
+
14
+ end
15
+ end
@@ -0,0 +1,14 @@
1
+ module HyperTrack
2
+ class Event < HyperTrack::SharedResource
3
+
4
+ API_BASE_PATH = "events/"
5
+ REQUIRED_FIELDS = []
6
+
7
+ VALID_ATTRIBUTE_VALUES = {}
8
+
9
+ def self.create(params={})
10
+ raise HyperTrack::MethodNotAllowed.new("Create not allowed on HyperTrack::Event class")
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,10 @@
1
+ module HyperTrack
2
+ class Fleet < HyperTrack::SharedResource
3
+
4
+ API_BASE_PATH = "fleets/"
5
+ REQUIRED_FIELDS = [:name]
6
+
7
+ VALID_ATTRIBUTE_VALUES = {}
8
+
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module HyperTrack
2
+ class Hub < HyperTrack::SharedResource
3
+
4
+ API_BASE_PATH = "hubs/"
5
+ REQUIRED_FIELDS = [:name]
6
+
7
+ VALID_ATTRIBUTE_VALUES = {}
8
+
9
+ end
10
+ end
@@ -0,0 +1,14 @@
1
+ module HyperTrack
2
+ class Neighbourhood < HyperTrack::SharedResource
3
+
4
+ API_BASE_PATH = "neighborhoods/"
5
+ REQUIRED_FIELDS = []
6
+
7
+ VALID_ATTRIBUTE_VALUES = {}
8
+
9
+ def self.create(params={})
10
+ raise HyperTrack::MethodNotAllowed.new("Create not allowed on HyperTrack::Neighbourhood class")
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,11 @@
1
+ module HyperTrack
2
+ class Shift < HyperTrack::SharedResource
3
+ include HyperTrack::ApiOperations::ShiftAPI
4
+
5
+ API_BASE_PATH = "shifts/"
6
+ REQUIRED_FIELDS = [:driver_id, :start_location]
7
+
8
+ VALID_ATTRIBUTE_VALUES = {}
9
+
10
+ end
11
+ end
@@ -0,0 +1,22 @@
1
+ module HyperTrack
2
+ class Task < HyperTrack::SharedResource
3
+ include HyperTrack::ApiOperations::TaskAPI
4
+
5
+ API_BASE_PATH = "tasks/"
6
+ REQUIRED_FIELDS = []
7
+
8
+ VALID_ATTRIBUTE_VALUES = {
9
+ action: {
10
+ allowed: [:pickup, :delivery, :visit, :task],
11
+ allow_nil: true
12
+ },
13
+ editable: {
14
+ allowed: [:'not editable', :once, :multiple]
15
+ },
16
+ vehicle_type: {
17
+ allowed: HyperTrack::SharedResource::VALID_VEHICLE_TYPES
18
+ }
19
+ }
20
+
21
+ end
22
+ end
@@ -0,0 +1,15 @@
1
+ module HyperTrack
2
+ class Trip < HyperTrack::SharedResource
3
+ include HyperTrack::ApiOperations::TripAPI
4
+
5
+ API_BASE_PATH = "trips/"
6
+ REQUIRED_FIELDS = [:driver_id, :start_location, :tasks]
7
+
8
+ VALID_ATTRIBUTE_VALUES = {
9
+ vehicle_type: {
10
+ allowed: HyperTrack::SharedResource::VALID_VEHICLE_TYPES
11
+ }
12
+ }
13
+
14
+ end
15
+ end
@@ -0,0 +1,63 @@
1
+ module HyperTrack
2
+ class SharedResource
3
+ extend HyperTrack::ApiOperations::Common::Create
4
+ extend HyperTrack::ApiOperations::Common::Retrieve
5
+ extend HyperTrack::ApiOperations::Common::List
6
+ include HyperTrack::ApiOperations::Common::Update
7
+
8
+ VALID_VEHICLE_TYPES = [:walking, :bicycle, :motorcycle, :car, :'3-wheeler', :van] #[:flight, :train, :ship]
9
+
10
+ attr_accessor :id
11
+
12
+ def initialize(id, opts)
13
+ @id = id
14
+ @values = Util.symbolize_keys(opts)
15
+ end
16
+
17
+ def [](k)
18
+ @values[k.to_sym]
19
+ end
20
+
21
+ def []=(k, v)
22
+ @values[k.to_sym] = v
23
+ end
24
+
25
+ def keys
26
+ @values.keys
27
+ end
28
+
29
+ def values
30
+ @values.values
31
+ end
32
+
33
+ def to_json(*a)
34
+ JSON.generate(@values)
35
+ end
36
+
37
+ protected
38
+
39
+ def method_missing(name, *args)
40
+ if name[-1] == "="
41
+ name = name[0..-2]
42
+
43
+ if @values.has_key?(name.to_sym)
44
+ self[name.to_sym] = args[0]
45
+ return
46
+ end
47
+
48
+ elsif @values.has_key?(name.to_sym)
49
+ return @values[name.to_sym]
50
+ end
51
+
52
+ super
53
+ end
54
+
55
+ private
56
+
57
+ def self.get_class_name
58
+ # To-Do: Umm.. Find some better approach
59
+ Object.const_get(self.name)
60
+ end
61
+
62
+ end
63
+ end
@@ -0,0 +1,15 @@
1
+ class Util
2
+
3
+ class << self
4
+
5
+ def symbolize_keys(hash)
6
+ hash.inject({}){ |memo, (k, v)| memo[k.to_sym] = v; memo }
7
+ end
8
+
9
+ def blank?(value)
10
+ value.nil? || value.to_s.length.zero?
11
+ end
12
+
13
+ end
14
+
15
+ end
metadata ADDED
@@ -0,0 +1,82 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hypertrack
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Utsav Kesharwani
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-09-01 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'
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'
27
+ description: Ruby wrapper around HyperTrack's API. Refer http://docs.hypertrack.io/
28
+ for more information.
29
+ email: utsav.kesharwani@gmail.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - lib/hypertrack.rb
35
+ - lib/hypertrack/api_client.rb
36
+ - lib/hypertrack/api_operations/common/create.rb
37
+ - lib/hypertrack/api_operations/common/list.rb
38
+ - lib/hypertrack/api_operations/common/retrieve.rb
39
+ - lib/hypertrack/api_operations/common/update.rb
40
+ - lib/hypertrack/api_operations/driver_api.rb
41
+ - lib/hypertrack/api_operations/shift_api.rb
42
+ - lib/hypertrack/api_operations/task_api.rb
43
+ - lib/hypertrack/api_operations/trip_api.rb
44
+ - lib/hypertrack/errors/hypertrack_errors.rb
45
+ - lib/hypertrack/params_validator.rb
46
+ - lib/hypertrack/resources/customer.rb
47
+ - lib/hypertrack/resources/destination.rb
48
+ - lib/hypertrack/resources/driver.rb
49
+ - lib/hypertrack/resources/event.rb
50
+ - lib/hypertrack/resources/fleet.rb
51
+ - lib/hypertrack/resources/hub.rb
52
+ - lib/hypertrack/resources/neighbourhood.rb
53
+ - lib/hypertrack/resources/shift.rb
54
+ - lib/hypertrack/resources/task.rb
55
+ - lib/hypertrack/resources/trip.rb
56
+ - lib/hypertrack/shared_resource.rb
57
+ - lib/util.rb
58
+ homepage: http://rubygems.org/gems/hypertrack
59
+ licenses:
60
+ - MIT
61
+ metadata: {}
62
+ post_install_message:
63
+ rdoc_options: []
64
+ require_paths:
65
+ - lib
66
+ required_ruby_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - '>='
69
+ - !ruby/object:Gem::Version
70
+ version: 2.0.0
71
+ required_rubygems_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ requirements: []
77
+ rubyforge_project:
78
+ rubygems_version: 2.4.7
79
+ signing_key:
80
+ specification_version: 4
81
+ summary: Ruby bindings for the HyperTrack API!
82
+ test_files: []