vworkapp_ruby 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/Gemfile.lock +38 -0
- data/README.md +5 -2
- data/examples/create_job.rb +1 -1
- data/examples/print_jobs.rb +2 -5
- data/lib/vworkapp_ruby.rb +3 -0
- data/lib/vworkapp_ruby/base.rb +41 -9
- data/lib/vworkapp_ruby/customer.rb +106 -0
- data/lib/vworkapp_ruby/job.rb +113 -107
- data/lib/vworkapp_ruby/location.rb +40 -0
- data/lib/vworkapp_ruby/worker.rb +66 -29
- data/spec/customer_spec.rb +152 -0
- data/spec/job_spec.rb +199 -0
- data/spec/worker_spec.rb +108 -0
- data/vworkapp_ruby.gemspec +2 -1
- metadata +11 -6
- data/lib/vworkapp_ruby/cli/job.rb +0 -5
data/.gitignore
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
vworkapp_ruby (0.0.1)
|
5
|
+
gcoder
|
6
|
+
httparty
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: http://rubygems.org/
|
10
|
+
specs:
|
11
|
+
diff-lcs (1.1.3)
|
12
|
+
gcoder (0.12.1)
|
13
|
+
hashie
|
14
|
+
ruby-hmac
|
15
|
+
yajl-ruby
|
16
|
+
hashie (1.2.0)
|
17
|
+
httparty (0.8.1)
|
18
|
+
multi_json
|
19
|
+
multi_xml
|
20
|
+
multi_json (1.0.4)
|
21
|
+
multi_xml (0.4.1)
|
22
|
+
rspec (2.7.0)
|
23
|
+
rspec-core (~> 2.7.0)
|
24
|
+
rspec-expectations (~> 2.7.0)
|
25
|
+
rspec-mocks (~> 2.7.0)
|
26
|
+
rspec-core (2.7.1)
|
27
|
+
rspec-expectations (2.7.0)
|
28
|
+
diff-lcs (~> 1.1.2)
|
29
|
+
rspec-mocks (2.7.0)
|
30
|
+
ruby-hmac (0.4.0)
|
31
|
+
yajl-ruby (1.1.0)
|
32
|
+
|
33
|
+
PLATFORMS
|
34
|
+
ruby
|
35
|
+
|
36
|
+
DEPENDENCIES
|
37
|
+
rspec
|
38
|
+
vworkapp_ruby!
|
data/README.md
CHANGED
@@ -11,5 +11,8 @@ This is a wrapper around vWorkApp's API. Go on! Use it!
|
|
11
11
|
|
12
12
|
- Broken API bits:
|
13
13
|
* What's find(:search) for??.
|
14
|
-
*
|
15
|
-
|
14
|
+
* Why can't I filter by template?
|
15
|
+
|
16
|
+
- Missing job.actual_duration, job.actual_start_at
|
17
|
+
|
18
|
+
- Should have connivence method to lookup a customer from a job
|
data/examples/create_job.rb
CHANGED
data/examples/print_jobs.rb
CHANGED
@@ -21,14 +21,11 @@ EOL
|
|
21
21
|
workers = VWorkApp::Worker.all
|
22
22
|
|
23
23
|
workers.each do |worker|
|
24
|
-
puts "Worker: #{worker.name}"
|
24
|
+
puts "Worker: #{worker.id}-#{worker.name}"
|
25
25
|
jobs = VWorkApp::Job.find(:worker_id => worker.id, :state => "not_started")
|
26
26
|
jobs.each do |job|
|
27
27
|
puts "\t #{job.third_party_id || job.id}, #{job.customer_name}, #{job.template_name}"
|
28
|
+
# p job
|
28
29
|
end
|
29
30
|
puts ""
|
30
31
|
end
|
31
|
-
|
32
|
-
# p jobs = VWorkApp::Job.find(:worker_id => 4228)["cars"]
|
33
|
-
|
34
|
-
# p job = VWorkApp::Job.show(180022)
|
data/lib/vworkapp_ruby.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'vworkapp_ruby/base'
|
2
|
+
require 'vworkapp_ruby/location'
|
2
3
|
require 'vworkapp_ruby/job'
|
3
4
|
require 'vworkapp_ruby/worker'
|
4
5
|
require 'vworkapp_ruby/customer'
|
@@ -6,3 +7,5 @@ require 'vworkapp_ruby/response_error'
|
|
6
7
|
# require 'vworkapp/proof_of_delivery'
|
7
8
|
|
8
9
|
require 'vworkapp_ruby/httparty_monkey_patch'
|
10
|
+
|
11
|
+
VW = VWorkApp
|
data/lib/vworkapp_ruby/base.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'httparty'
|
2
|
+
require 'active_support/core_ext/hash'
|
2
3
|
|
3
4
|
module VWorkApp
|
4
5
|
|
@@ -8,33 +9,64 @@ module VWorkApp
|
|
8
9
|
def api_key=(key)
|
9
10
|
@api_key = key
|
10
11
|
end
|
12
|
+
|
11
13
|
def api_key
|
12
14
|
@api_key
|
13
15
|
end
|
16
|
+
|
14
17
|
end
|
15
18
|
|
16
|
-
|
19
|
+
module AttributeEquality
|
20
|
+
def attributes_eql?(other, attributes)
|
21
|
+
attributes.each do |attribute|
|
22
|
+
return false unless self.send(attribute.to_sym) == other.send(attribute.to_sym)
|
23
|
+
end
|
24
|
+
true
|
25
|
+
end
|
26
|
+
end
|
17
27
|
|
28
|
+
class Base
|
18
29
|
include HTTParty
|
30
|
+
include AttributeEquality
|
19
31
|
|
20
32
|
base_uri 'api.vworkapp.com/api/2.0'
|
21
33
|
# http_proxy 'localhost', 8888
|
22
|
-
# format :xml
|
23
34
|
|
24
35
|
headers({
|
36
|
+
"Content-Type" => "text/xml",
|
25
37
|
"User-Agent" => "Ruby.vWorkApp.API"
|
26
38
|
})
|
27
39
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
if
|
33
|
-
|
40
|
+
def self.perform(action, url, query = {}, body = nil)
|
41
|
+
options = {}
|
42
|
+
options[:query] = { :api_key => VWorkApp.api_key }.merge(query)
|
43
|
+
|
44
|
+
if body
|
45
|
+
root = body.keys.first
|
46
|
+
body_str = body[root].to_xml(:root => root)
|
47
|
+
options[:body] = body_str
|
48
|
+
end
|
49
|
+
|
50
|
+
raw = self.send(action, url, options)
|
51
|
+
|
52
|
+
case raw.response
|
53
|
+
when Net::HTTPOK, Net::HTTPCreated
|
54
|
+
yield(raw) if block_given?
|
55
|
+
when Net::HTTPNotFound
|
56
|
+
nil
|
57
|
+
else
|
58
|
+
bad_response(raw.response)
|
34
59
|
end
|
35
|
-
|
60
|
+
end
|
61
|
+
|
62
|
+
def perform(action, url, query = {}, body = nil, &block)
|
63
|
+
self.class.perform(action, url, query, body, &block)
|
36
64
|
end
|
37
65
|
|
66
|
+
def self.bad_response(response)
|
67
|
+
raise "#{response.code} - #{response.msg}: #{response.body}"
|
68
|
+
end
|
69
|
+
|
38
70
|
end
|
39
71
|
|
40
72
|
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
module VWorkApp
|
2
|
+
|
3
|
+
class Customer < Base
|
4
|
+
attr_accessor :id, :third_party_id, :name, :site_contact, :billing_contact
|
5
|
+
|
6
|
+
#---------------
|
7
|
+
# Object Methods
|
8
|
+
#---------------
|
9
|
+
|
10
|
+
def initialize(name, id = nil, third_party_id = nil, site_contact = nil, billing_contact = nil)
|
11
|
+
@name = name
|
12
|
+
@id = id
|
13
|
+
@third_party_id = third_party_id
|
14
|
+
@site_contact = site_contact
|
15
|
+
@billing_contact = billing_contact
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.from_hash(attributes)
|
19
|
+
customer = Customer.new(attributes["name"], attributes["id"], attributes["third_party_id"])
|
20
|
+
customer.site_contact = Contact.from_hash(attributes["delivery_contact"])
|
21
|
+
customer.billing_contact = Contact.from_hash(attributes["billing_contact"])
|
22
|
+
customer
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_hash
|
26
|
+
cust_hash = { :customer => { :name => self.name } }
|
27
|
+
cust_hash[:customer][:third_party_id] = self.third_party_id if third_party_id
|
28
|
+
cust_hash[:customer][:delivery_contact] = self.site_contact.to_hash if site_contact
|
29
|
+
cust_hash[:customer][:billing_contact] = self.billing_contact.to_hash if billing_contact
|
30
|
+
cust_hash
|
31
|
+
end
|
32
|
+
|
33
|
+
def ==(other)
|
34
|
+
attributes_eql?(other, [:id, :name, :third_party_id, :site_contact, :billing_contact])
|
35
|
+
end
|
36
|
+
|
37
|
+
#---------------
|
38
|
+
# REST Methods
|
39
|
+
#---------------
|
40
|
+
|
41
|
+
def create
|
42
|
+
perform(:post, "/customers.xml", {}, self.to_hash) do |res|
|
43
|
+
Customer.from_hash(res["customer"])
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def update(use_third_party_id = false)
|
48
|
+
perform(:put, "/customers/#{id}.xml", { :use_third_party_id => use_third_party_id }, self.to_hash)
|
49
|
+
end
|
50
|
+
|
51
|
+
def delete(use_third_party_id = false)
|
52
|
+
perform(:delete, "/customers/#{id}.xml", { :use_third_party_id => use_third_party_id })
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.show(id, use_third_party_id = false)
|
56
|
+
perform(:get, "/customers/#{id}.xml", :use_third_party_id => use_third_party_id) do |res|
|
57
|
+
Customer.from_hash(res["customer"])
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.find
|
62
|
+
self.perform(:get, "/customers.xml") do |res|
|
63
|
+
res["customers"].map { |h| Customer.from_hash(h) }
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
class Contact < Base
|
70
|
+
include AttributeEquality
|
71
|
+
attr_accessor :first_name, :last_name, :phone, :mobile, :email, :location
|
72
|
+
|
73
|
+
def initialize(first_name = nil, last_name = nil, phone = nil, mobile = nil, email = nil, location = nil)
|
74
|
+
@first_name = first_name
|
75
|
+
@last_name = last_name
|
76
|
+
@phone = phone
|
77
|
+
@mobile = mobile
|
78
|
+
@email = email
|
79
|
+
@location = location
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.from_hash(attributes)
|
83
|
+
contact = Contact.new(attributes["first_name"], attributes["last_name"], attributes["phone"], attributes["mobile"], attributes["email"])
|
84
|
+
contact.location = Location.from_hash(attributes["location"])
|
85
|
+
contact
|
86
|
+
end
|
87
|
+
|
88
|
+
def to_hash
|
89
|
+
contact_hash = {
|
90
|
+
:first_name => self.first_name,
|
91
|
+
:last_name => self.last_name,
|
92
|
+
:phone => self.phone,
|
93
|
+
:mobile => self.mobile,
|
94
|
+
:email => self.email
|
95
|
+
}
|
96
|
+
contact_hash[:location] = self.location.to_hash if location
|
97
|
+
contact_hash
|
98
|
+
end
|
99
|
+
|
100
|
+
def ==(other)
|
101
|
+
attributes_eql?(other, [:first_name, :last_name, :phone, :mobile, :email, :location])
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
data/lib/vworkapp_ruby/job.rb
CHANGED
@@ -2,98 +2,26 @@ require 'gcoder'
|
|
2
2
|
|
3
3
|
module VWorkApp
|
4
4
|
|
5
|
-
class
|
6
|
-
attr_accessor :
|
7
|
-
|
8
|
-
@formatted_address = formatted_address
|
9
|
-
@lat = lat
|
10
|
-
@lng = lng
|
11
|
-
end
|
12
|
-
|
13
|
-
def self.from_address(address, region = :us)
|
14
|
-
loc = Location.geocode(address, region).first.geometry.location
|
15
|
-
self.new(address, loc.lat, loc.lng)
|
16
|
-
end
|
17
|
-
|
18
|
-
def to_hash
|
19
|
-
{ :formatted_address => formatted_address, :lat => lat, :lng => lng }
|
20
|
-
end
|
21
|
-
|
22
|
-
def self.from_hash(attributes)
|
23
|
-
return nil unless attributes
|
24
|
-
Location.new(attributes["formatted_address"], attributes["lat"], attributes["lng"])
|
25
|
-
end
|
26
|
-
|
27
|
-
private
|
28
|
-
|
29
|
-
def self.geocode(address, region)
|
30
|
-
@gecoder ||= GCoder.connect(:storage => :heap)
|
31
|
-
@gecoder[address, { :region => region }]
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
35
|
-
|
36
|
-
class Step
|
37
|
-
attr_accessor :name, :location
|
38
|
-
def initialize(name, location = nil)
|
39
|
-
@name = name
|
40
|
-
@location = location
|
41
|
-
end
|
42
|
-
|
43
|
-
def to_hash
|
44
|
-
h = { :name => name }
|
45
|
-
h.merge!({ :location => location.to_hash }) if location
|
46
|
-
h
|
47
|
-
end
|
48
|
-
|
49
|
-
def self.from_hash(attributes)
|
50
|
-
Step.new(attributes["name"], Location.from_hash(attributes["location"]))
|
51
|
-
end
|
52
|
-
|
53
|
-
end
|
5
|
+
class Job < Base
|
6
|
+
attr_accessor :id, :customer_name, :template_name, :planned_duration, :steps, :custom_fields, :third_party_id
|
7
|
+
attr_accessor :assigned_to_id, :planned_start_at, :progress_state
|
54
8
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
@name = name
|
59
|
-
@value = value
|
60
|
-
end
|
9
|
+
#---------------
|
10
|
+
# Object Methods
|
11
|
+
#---------------
|
61
12
|
|
62
|
-
def
|
63
|
-
{ :name => name.to_s, :value => value.to_s }
|
64
|
-
end
|
65
|
-
|
66
|
-
def self.from_hash(attributes)
|
67
|
-
CustomField.new(attributes["name"], attributes["value"])
|
68
|
-
end
|
69
|
-
|
70
|
-
end
|
71
|
-
|
72
|
-
class Job < Base
|
73
|
-
|
74
|
-
attr_accessor :id, :customer_name, :template_name, :planned_duration, :steps, :custom_fields, :third_party_id, :assigned_to, :planned_start_at
|
75
|
-
|
76
|
-
##
|
77
|
-
# Creates a new jobs in vWorkApp.
|
78
|
-
#
|
79
|
-
# Steps and Custom_Fields takes an array of these.
|
80
|
-
#
|
81
|
-
def initialize(customer_name, template_name, planned_duration, steps, custom_fields = nil, id = nil, third_party_id = nil, assigned_to = nil, planned_start_at = nil)
|
13
|
+
def initialize(customer_name, template_name, planned_duration, steps, custom_fields = nil, id = nil, third_party_id = nil, assigned_to_id = nil, planned_start_at = nil)
|
82
14
|
@id = id
|
83
15
|
@customer_name = customer_name
|
84
|
-
@template_name = template_name
|
16
|
+
@template_name = template_name
|
85
17
|
@planned_duration = planned_duration
|
86
18
|
@steps = steps
|
87
19
|
@custom_fields = custom_fields
|
88
20
|
@third_party_id = third_party_id
|
89
|
-
@
|
21
|
+
@assigned_to_id = assigned_to_id
|
90
22
|
@planned_start_at = planned_start_at
|
91
23
|
end
|
92
|
-
|
93
|
-
def is_new?
|
94
|
-
self.id == nil
|
95
|
-
end
|
96
|
-
|
24
|
+
|
97
25
|
def to_hash
|
98
26
|
job_hash = {
|
99
27
|
:job => {
|
@@ -109,14 +37,49 @@ module VWorkApp
|
|
109
37
|
end
|
110
38
|
|
111
39
|
def self.from_hash(attributes)
|
112
|
-
|
113
|
-
|
114
|
-
|
40
|
+
job = Job.new(attributes["customer_name"], attributes["template_name"], attributes["planned_duration"],
|
41
|
+
attributes["steps"].map { |h| Step.from_hash(h) }, nil, attributes["id"], attributes["third_party_id"])
|
42
|
+
job.custom_fields = attributes["custom_fields"].map { |h| CustomField.from_hash(h) } if attributes["custom_fields"]
|
43
|
+
|
44
|
+
job.assigned_to_id = attributes["worker_id"]
|
45
|
+
job.planned_start_at = attributes["planned_start_at"]
|
46
|
+
job.progress_state = attributes["progress_state"]
|
47
|
+
|
48
|
+
job
|
115
49
|
end
|
116
50
|
|
51
|
+
def is_new?
|
52
|
+
self.id == nil
|
53
|
+
end
|
54
|
+
|
55
|
+
def assigned_to
|
56
|
+
return nil if @assigned_to_id.nil?
|
57
|
+
@assigned_to ||= Worker.show(self.assigned_to_id)
|
58
|
+
end
|
59
|
+
|
60
|
+
def ==(other)
|
61
|
+
attributes_eql?(other, [
|
62
|
+
:id, :third_party_id, :customer_name, :template_name, :planned_duration, :planned_start_at,
|
63
|
+
:assigned_to_id, :steps, :custom_fields
|
64
|
+
])
|
65
|
+
end
|
66
|
+
|
67
|
+
#---------------
|
68
|
+
# REST Methods
|
69
|
+
#---------------
|
70
|
+
|
117
71
|
def create
|
118
|
-
|
119
|
-
|
72
|
+
perform(:post, "/jobs.xml", {}, self.to_hash) do |res|
|
73
|
+
Job.from_hash(res["job"])
|
74
|
+
end
|
75
|
+
|
76
|
+
# res = self.class.post("/jobs", :body => self.to_hash, :query => { :api_key => VWorkApp.api_key })
|
77
|
+
# if res.success?
|
78
|
+
# self.id = res["job"]["id"]
|
79
|
+
# self
|
80
|
+
# else
|
81
|
+
# self.class.bad_response(res)
|
82
|
+
# end
|
120
83
|
end
|
121
84
|
|
122
85
|
def update(id, attributes)
|
@@ -124,39 +87,82 @@ module VWorkApp
|
|
124
87
|
res.success? ? res : bad_response(res)
|
125
88
|
end
|
126
89
|
|
127
|
-
def
|
128
|
-
|
90
|
+
def delete(use_third_party_id = false)
|
91
|
+
perform(:delete, "/jobs/#{id}.xml", { :use_third_party_id => use_third_party_id })
|
92
|
+
end
|
93
|
+
|
94
|
+
def self.show(id, use_third_party_id = false)
|
95
|
+
perform(:get, "/jobs/#{id}.xml", :use_third_party_id => use_third_party_id) do |res|
|
96
|
+
Job.from_hash(res["job"])
|
97
|
+
end
|
98
|
+
# raw = get("/jobs/#{id}.xml", :query => { :api_key => VWorkApp.api_key, :use_third_party_id => use_third_party_id })
|
99
|
+
# case res
|
100
|
+
# when Net::HTTPOK
|
101
|
+
# Job.from_hash(raw["job"])
|
102
|
+
# when Net::HTTPNotFound
|
103
|
+
# nil
|
104
|
+
# else
|
105
|
+
# bad_response(res)
|
106
|
+
# end
|
129
107
|
end
|
130
108
|
|
131
|
-
##
|
132
|
-
# Returns jobs that match the given query options. Valid options are:
|
133
|
-
# - :state — Filter by state. Possible values: unallocated, allocated, assigned, not_started, started, completed.
|
134
|
-
# - :start_at — Filter by planned_start_at/last_action_time (must also give end_at).
|
135
|
-
# - :end_at — Filter by planned_start_at/last_action_time (must also give start_at).
|
136
|
-
# - :customer_name — Filter by customer name.
|
137
|
-
# - :worker_id — Filter by assigned worker.
|
138
|
-
# - :worker_third_party_id — Filter by assigned worker third party id.
|
139
|
-
# - :per_page — The number of records to return per page.
|
140
|
-
# - :page — The page of records to return.
|
141
|
-
# - :third_party_id — The third_party_id associated with the job.
|
142
109
|
def self.find(options={})
|
143
|
-
p options
|
144
110
|
third_party_id = options.delete(:third_party_id)
|
145
|
-
options[:search] = "@third_party_id=#{third_party_id}" if (third_party_id)
|
111
|
+
options[:search] = "@third_party_id=#{third_party_id.to_s}" if (third_party_id)
|
146
112
|
options[:api_key] = VWorkApp.api_key
|
147
113
|
|
148
114
|
raw = get("/jobs.xml", :query => options)
|
149
115
|
raw["jobs"].map { |h| Job.from_hash(h) }
|
150
116
|
end
|
117
|
+
|
118
|
+
end
|
119
|
+
|
120
|
+
class Step
|
121
|
+
include AttributeEquality
|
122
|
+
attr_accessor :name, :location
|
123
|
+
|
124
|
+
def initialize(name, location = nil)
|
125
|
+
@name = name
|
126
|
+
@location = location
|
127
|
+
end
|
128
|
+
|
129
|
+
def to_hash
|
130
|
+
h = { :name => name }
|
131
|
+
h.merge!({ :location => location.to_hash }) if location
|
132
|
+
h
|
133
|
+
end
|
134
|
+
|
135
|
+
def self.from_hash(attributes)
|
136
|
+
Step.new(attributes["name"], Location.from_hash(attributes["location"]))
|
137
|
+
end
|
151
138
|
|
152
|
-
def
|
153
|
-
|
139
|
+
def ==(other)
|
140
|
+
attributes_eql?(other, [:name, :location])
|
154
141
|
end
|
155
142
|
|
156
|
-
|
157
|
-
|
143
|
+
end
|
144
|
+
|
145
|
+
class CustomField
|
146
|
+
include AttributeEquality
|
147
|
+
attr_accessor :name, :value
|
148
|
+
|
149
|
+
def initialize(name, value)
|
150
|
+
@name = name
|
151
|
+
@value = value
|
158
152
|
end
|
159
|
-
|
153
|
+
|
154
|
+
def to_hash
|
155
|
+
{ :name => name.to_s, :value => value.to_s }
|
156
|
+
end
|
157
|
+
|
158
|
+
def self.from_hash(attributes)
|
159
|
+
CustomField.new(attributes["name"], attributes["value"])
|
160
|
+
end
|
161
|
+
|
162
|
+
def ==(other)
|
163
|
+
attributes_eql?(other, [:name, :value])
|
164
|
+
end
|
165
|
+
|
160
166
|
end
|
161
167
|
|
162
168
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module VWorkApp
|
2
|
+
|
3
|
+
class Location
|
4
|
+
include AttributeEquality
|
5
|
+
attr_accessor :formatted_address, :lat, :lng
|
6
|
+
|
7
|
+
def initialize(formatted_address, lat, lng)
|
8
|
+
@formatted_address = formatted_address
|
9
|
+
@lat = lat
|
10
|
+
@lng = lng
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.from_address(address, region = :us)
|
14
|
+
loc = Location.geocode(address, region).first.geometry.location
|
15
|
+
self.new(address, loc.lat, loc.lng)
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_hash
|
19
|
+
{ :formatted_address => formatted_address, :lat => lat, :lng => lng }
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.from_hash(attributes)
|
23
|
+
return nil unless attributes
|
24
|
+
Location.new(attributes["formatted_address"], attributes["lat"], attributes["lng"])
|
25
|
+
end
|
26
|
+
|
27
|
+
def ==(other)
|
28
|
+
attributes_eql?(other, [:lat, :lng])
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def self.geocode(address, region)
|
34
|
+
@gecoder ||= GCoder.connect(:storage => :heap)
|
35
|
+
@gecoder[address, { :region => region }]
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
data/lib/vworkapp_ruby/worker.rb
CHANGED
@@ -1,51 +1,88 @@
|
|
1
1
|
module VWorkApp
|
2
2
|
|
3
|
-
class
|
4
|
-
attr_accessor :lat, :lng, :recorded_at, :heading, :speed
|
5
|
-
def initialize (lat, lng, recorded_at, heading, speed)
|
6
|
-
@lat = lat
|
7
|
-
@lng = lng
|
8
|
-
@recorded_at = recorded_at
|
9
|
-
@heading = heading
|
10
|
-
@speed = speed
|
11
|
-
end
|
12
|
-
|
13
|
-
def self.from_hash(attributes)
|
14
|
-
@lat = attributes["lat"]
|
15
|
-
@lng = attributes["lng"]
|
16
|
-
@recorded_at = attributes["recorded_at"]
|
17
|
-
@heading = attributes["heading"]
|
18
|
-
@speed = attributes["speed"]
|
19
|
-
end
|
20
|
-
|
21
|
-
end
|
22
|
-
|
23
|
-
class Worker < Base
|
24
|
-
|
3
|
+
class Worker < Base
|
25
4
|
attr_accessor :id, :name, :email, :latest_telemetry, :third_party_id
|
26
5
|
|
6
|
+
#---------------
|
7
|
+
# Object Methods
|
8
|
+
#---------------
|
9
|
+
|
27
10
|
def initialize(name, email, id = nil, third_party_id = nil)
|
28
11
|
@name = name
|
29
12
|
@email = email
|
30
13
|
@id = id
|
31
14
|
@third_party_id = third_party_id
|
32
15
|
end
|
16
|
+
|
17
|
+
def self.from_hash(attributes)
|
18
|
+
worker = Worker.new(attributes["name"], attributes["email"], attributes["id"], attributes["third_party_id"])
|
19
|
+
worker.latest_telemetry = Telemetry.from_hash(attributes["latest_telemetry"]) if attributes["latest_telemetry"]
|
20
|
+
worker
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_hash
|
24
|
+
worker_hash = {
|
25
|
+
:worker => {
|
26
|
+
:name => self.name,
|
27
|
+
:email => self.email
|
28
|
+
}
|
29
|
+
}
|
30
|
+
worker_hash[:worker][:third_party_id] = self.third_party_id if third_party_id
|
31
|
+
worker_hash
|
32
|
+
end
|
33
33
|
|
34
|
-
def
|
35
|
-
|
34
|
+
def ==(other)
|
35
|
+
attributes_eql?(other, [:id, :name, :email, :third_party_id])
|
36
36
|
end
|
37
|
+
|
38
|
+
#---------------
|
39
|
+
# REST Methods
|
40
|
+
#---------------
|
41
|
+
|
42
|
+
def create
|
43
|
+
perform(:post, "/workers", {}, self.to_hash) do |res|
|
44
|
+
Worker.from_hash(res["worker"])
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def update(use_third_party_id = false)
|
49
|
+
perform(:put, "/workers/#{id}.xml", { :use_third_party_id => use_third_party_id }, self.to_hash)
|
50
|
+
end
|
51
|
+
|
52
|
+
def delete(use_third_party_id = false)
|
53
|
+
perform(:delete, "/workers/#{id}.xml", { :use_third_party_id => use_third_party_id })
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.show(id, use_third_party_id = false)
|
57
|
+
perform(:get, "/workers/#{id}.xml", :use_third_party_id => use_third_party_id) do |res|
|
58
|
+
Worker.from_hash(res["worker"])
|
59
|
+
end
|
60
|
+
end
|
37
61
|
|
38
62
|
def self.find
|
39
|
-
|
40
|
-
|
63
|
+
self.perform(:get, "/workers.xml") do |res|
|
64
|
+
res["workers"].map { |h| Worker.from_hash(h) }
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
class Telemetry
|
71
|
+
attr_accessor :lat, :lng, :recorded_at, :heading, :speed
|
72
|
+
|
73
|
+
def initialize (lat, lng, recorded_at, heading, speed)
|
74
|
+
@lat = lat
|
75
|
+
@lng = lng
|
76
|
+
@recorded_at = recorded_at
|
77
|
+
@heading = heading
|
78
|
+
@speed = speed
|
41
79
|
end
|
42
80
|
|
43
81
|
def self.from_hash(attributes)
|
44
|
-
|
45
|
-
w.latest_telemetry = Telemetry.from_hash(attributes["latest_telemetry"]) if attributes["latest_telemetry"]
|
46
|
-
w
|
82
|
+
Telemetry.new(attributes["lat"], attributes["lng"], attributes["recorded_at"], attributes["heading"], attributes["speed"])
|
47
83
|
end
|
48
84
|
|
49
85
|
end
|
50
86
|
|
87
|
+
|
51
88
|
end
|
@@ -0,0 +1,152 @@
|
|
1
|
+
require "vworkapp_ruby"
|
2
|
+
|
3
|
+
describe VW::Customer do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
VW::Customer.base_uri 'api.staging.vworkapp.com/api/2.0'
|
7
|
+
VW.api_key = "AtuogECLCV2R7uT-fkPg"
|
8
|
+
end
|
9
|
+
|
10
|
+
context "Without a known customer" do
|
11
|
+
|
12
|
+
describe "#Equals" do
|
13
|
+
|
14
|
+
it "Is equal to another customer if it has the same key attributes" do
|
15
|
+
customer_1 = VW::Customer.new("Joe's Baked Goods", 100, 200,
|
16
|
+
VW::Contact.new("Joe", "Fisher", "415-465-8888", "415-465-9999", "joe@bakary.com"),
|
17
|
+
VW::Contact.new("Bob", "Jones", "021-465-2342", "233-233-1242", "bob.jones@jones.com")
|
18
|
+
)
|
19
|
+
customer_2 = VW::Customer.new("Joe's Baked Goods", 100, 200,
|
20
|
+
VW::Contact.new("Joe", "Fisher", "415-465-8888", "415-465-9999", "joe@bakary.com"),
|
21
|
+
VW::Contact.new("Bob", "Jones", "021-465-2342", "233-233-1242", "bob.jones@jones.com")
|
22
|
+
)
|
23
|
+
customer_1.should == customer_2
|
24
|
+
end
|
25
|
+
|
26
|
+
it "Isn't equal to another worker if doesn't share the key attributes" do
|
27
|
+
customer_1 = VW::Customer.new("Joe's Baked Goods", 100, 200,
|
28
|
+
VW::Contact.new("Joe", "Fisher", "415-465-8888", "415-465-9999", "joe@bakary.com"),
|
29
|
+
VW::Contact.new("Bob", "Jones", "021-465-2342", "233-233-1242", "bob.jones@jones.com")
|
30
|
+
)
|
31
|
+
customer_2 = VW::Customer.new("Joe's Baked Goods", 100, 200,
|
32
|
+
VW::Contact.new("Joe", "Fisher", "415-465-8888", "415-465-9999", "joe@bakary.com"),
|
33
|
+
VW::Contact.new("Jeff", "Jones", "021-465-2342", "233-233-1242", "bob.jones@jones.com")
|
34
|
+
)
|
35
|
+
customer_1.should_not == customer_2
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "#Create" do
|
41
|
+
|
42
|
+
it "Assigns the new customer an id" do
|
43
|
+
@customer = VW::Customer.new("Joe's Baked Goods")
|
44
|
+
@customer = @customer.create
|
45
|
+
@customer.id.should_not be_nil
|
46
|
+
end
|
47
|
+
|
48
|
+
it "Creates a customer" do
|
49
|
+
@customer = VW::Customer.new("Joe's Baked Goods", nil, "My ID")
|
50
|
+
@customer = @customer.create
|
51
|
+
|
52
|
+
r_cust = VW::Customer.show(@customer.id)
|
53
|
+
r_cust.name.should == @customer.name
|
54
|
+
r_cust.third_party_id.should == @customer.third_party_id
|
55
|
+
end
|
56
|
+
|
57
|
+
it "Creates a customer with a billing and delivery contact" do
|
58
|
+
site_contact = VW::Contact.new("Joe", "Fisher", "415-465-8888", "415-465-9999", "joe@bakary.com")
|
59
|
+
billing_contact = VW::Contact.new("Felix", "Smith")
|
60
|
+
@customer = VW::Customer.new("Joe's Baked Goods", nil, "My ID", site_contact, billing_contact)
|
61
|
+
@customer = @customer.create
|
62
|
+
|
63
|
+
r_cust = VW::Customer.show(@customer.id)
|
64
|
+
|
65
|
+
r_cust.site_contact.should == site_contact
|
66
|
+
r_cust.billing_contact.should == billing_contact
|
67
|
+
end
|
68
|
+
|
69
|
+
it "Creates a customer with a contact location" do
|
70
|
+
pending "Can't pass a location object in yet. API should support this"
|
71
|
+
site = VW::Location.from_address("880 Harrison St, SF, USA")
|
72
|
+
@customer = VW::Customer.new("Joe's Baked Goods", nil, "My ID", VW::Contact.new("Joe", "Fisher", nil, nil, nil, site))
|
73
|
+
@customer = @customer.create
|
74
|
+
|
75
|
+
r_cust = VW::Customer.show(@customer.id)
|
76
|
+
r_cust.site_contact.location.should == site
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
after(:each) do
|
82
|
+
@customer.delete if @customer
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
context "With a known customer" do
|
88
|
+
before(:each) do
|
89
|
+
@customer = VW::Customer.new("Joe's Baked Goods")
|
90
|
+
@customer = @customer.create
|
91
|
+
end
|
92
|
+
|
93
|
+
after(:each) do
|
94
|
+
@customer.delete
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "#Show" do
|
98
|
+
it "Returns the customer" do
|
99
|
+
r_cust = VW::Customer.show(@customer.id)
|
100
|
+
r_cust.name.should == "Joe's Baked Goods"
|
101
|
+
end
|
102
|
+
|
103
|
+
it "Returns nil if not found" do
|
104
|
+
r_customer = VW::Customer.show(-1)
|
105
|
+
r_customer.should be_nil
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
describe "#Update" do
|
110
|
+
|
111
|
+
it "Updates a customer's primary details" do
|
112
|
+
@customer.name = "Jeff's Canned Beans"
|
113
|
+
@customer.third_party_id = "My Other ID"
|
114
|
+
@customer.update
|
115
|
+
r_cust = VW::Customer.show(@customer.id)
|
116
|
+
r_cust.name.should == "Jeff's Canned Beans"
|
117
|
+
r_cust.third_party_id.should == "My Other ID"
|
118
|
+
end
|
119
|
+
|
120
|
+
it "Updates a customers site and billing contacts" do
|
121
|
+
site_contact = VW::Contact.new("Joe", "Fisher", "415-465-8888", "415-465-9999", "joe@bakary.com")
|
122
|
+
billing_contact = VW::Contact.new("Felix", "Smith")
|
123
|
+
@customer.site_contact = site_contact
|
124
|
+
@customer.billing_contact = billing_contact
|
125
|
+
@customer.update
|
126
|
+
|
127
|
+
r_cust = VW::Customer.show(@customer.id)
|
128
|
+
r_cust.site_contact.should == site_contact
|
129
|
+
r_cust.billing_contact.should == billing_contact
|
130
|
+
end
|
131
|
+
|
132
|
+
end
|
133
|
+
|
134
|
+
describe "#Delete" do
|
135
|
+
it "Deletes the customer" do
|
136
|
+
@customer.delete
|
137
|
+
r_customer = VW::Customer.show(@customer.id)
|
138
|
+
r_customer.should be_nil
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
describe "#Find" do
|
143
|
+
it "Finds all customers" do
|
144
|
+
results = VW::Customer.find
|
145
|
+
results.should be_instance_of(Array)
|
146
|
+
results.should include(@customer)
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
data/spec/job_spec.rb
ADDED
@@ -0,0 +1,199 @@
|
|
1
|
+
require "vworkapp_ruby"
|
2
|
+
|
3
|
+
describe VW::Job do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
VW::Job.base_uri 'api.staging.vworkapp.com/api/2.0'
|
7
|
+
VW.api_key = "AtuogECLCV2R7uT-fkPg"
|
8
|
+
end
|
9
|
+
|
10
|
+
context "Without a known job" do
|
11
|
+
|
12
|
+
describe "#Equals" do
|
13
|
+
|
14
|
+
it "Is equal to another job if it has the same attributes, steps, and custom_fields" do
|
15
|
+
job_1 = VW::Job.new("Joe", "Std Delivery", 60,
|
16
|
+
[
|
17
|
+
VW::Step.new("Start", VWorkApp::Location.new("880 Harrison St", 37.779536, -122.401503)),
|
18
|
+
VW::Step.new("End", VWorkApp::Location.new("Other Street", 38.779536, -123.401503))
|
19
|
+
],
|
20
|
+
[
|
21
|
+
VW::CustomField.new("Note", "Hi There!")
|
22
|
+
],
|
23
|
+
100, 202, 101, Date.new(2001,2,3)
|
24
|
+
)
|
25
|
+
job_2 = VW::Job.new("Joe", "Std Delivery", 60,
|
26
|
+
[
|
27
|
+
VW::Step.new("Start", VWorkApp::Location.new("880 Harrison St!", 37.779536, -122.401503)),
|
28
|
+
VW::Step.new("End", VWorkApp::Location.new("Other Street", 38.779536, -123.401503))
|
29
|
+
],
|
30
|
+
[
|
31
|
+
VW::CustomField.new("Note", "Hi There!")
|
32
|
+
],
|
33
|
+
100, 202, 101, Date.new(2001,2,3)
|
34
|
+
)
|
35
|
+
job_1.should == job_2
|
36
|
+
end
|
37
|
+
|
38
|
+
it "Isn't equal to another job if doesn't share the key attributes" do
|
39
|
+
job_1 = VW::Job.new("Joe", "Std Delivery", 60, nil, nil, 100, 202, 101, Date.new(2001,2,3))
|
40
|
+
job_2 = VW::Job.new("Joe", "Std Delivery", 60, nil, nil, 100, 202, 101, Date.new(2001,4,3))
|
41
|
+
job_1.should_not == job_2
|
42
|
+
end
|
43
|
+
|
44
|
+
it "Isn't equal to another job if doesn't share the same steps" do
|
45
|
+
job_1 = VW::Job.new("Joe", "Std Delivery", 60, [
|
46
|
+
VW::Step.new("Start", VWorkApp::Location.new("880 Harrison St", 37.779536, -122.401503)),
|
47
|
+
VW::Step.new("End", VWorkApp::Location.new("Other Street", 38.779536, -122.401503))
|
48
|
+
])
|
49
|
+
job_2 = VW::Job.new("Joe", "Std Delivery", 60, [
|
50
|
+
VW::Step.new("Start", VWorkApp::Location.new("880 Harrison St", 37.779536, -122.401503)),
|
51
|
+
VW::Step.new("End", VWorkApp::Location.new("DIFFERENT", 38.779536, 100))
|
52
|
+
])
|
53
|
+
job_1.should_not == job_2
|
54
|
+
end
|
55
|
+
|
56
|
+
it "Isn't equal to another job if doesn't share the same custom fields" do
|
57
|
+
job_1 = VW::Job.new("Joe", "Std Delivery", 60, nil, [
|
58
|
+
VW::CustomField.new("Note1", "Value1"),
|
59
|
+
VW::CustomField.new("Note2", "Value2"),
|
60
|
+
])
|
61
|
+
job_2 = VW::Job.new("Joe", "Std Delivery", 60, nil, [
|
62
|
+
VW::CustomField.new("Note1", "Value1"),
|
63
|
+
VW::CustomField.new("Note2", "DIFFERENT"),
|
64
|
+
])
|
65
|
+
job_1.should_not == job_2
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
describe "#Create" do
|
71
|
+
|
72
|
+
it "Assigns the new job an id" do
|
73
|
+
@job = VW::Job.new("Joe", "Std Delivery", 60,
|
74
|
+
[
|
75
|
+
VW::Step.new("Start", VWorkApp::Location.new("880 Harrison St", 37.779536, -122.401503)),
|
76
|
+
VW::Step.new("End", VWorkApp::Location.new("Other Street", 38.779536, -123.401503))
|
77
|
+
],
|
78
|
+
[
|
79
|
+
VW::CustomField.new("Note", "Hi There!")
|
80
|
+
],
|
81
|
+
100, 202, 101, Date.new(2001,2,3)
|
82
|
+
)
|
83
|
+
|
84
|
+
@job = @job.create
|
85
|
+
@job.id.should_not be_nil
|
86
|
+
end
|
87
|
+
|
88
|
+
it "Creates an unassigned job" do
|
89
|
+
@job = VW::Job.new("Joe", "Std Delivery", 60,
|
90
|
+
[
|
91
|
+
VW::Step.new("Start", VWorkApp::Location.new("880 Harrison St", 37.779536, -122.401503)),
|
92
|
+
VW::Step.new("End", VWorkApp::Location.new("Other Street", 38.779536, -123.401503))
|
93
|
+
])
|
94
|
+
@job = @job.create
|
95
|
+
r_job = VW::Job.show(@job.id)
|
96
|
+
r_job.customer_name.should == @job.customer_name
|
97
|
+
r_job.template_name.should == @job.template_name
|
98
|
+
r_job.planned_duration.should == @job.planned_duration
|
99
|
+
r_job.steps.should == @job.steps
|
100
|
+
end
|
101
|
+
|
102
|
+
it "Creates an unassigned job with Custom Fields" do
|
103
|
+
@job = VW::Job.new("Joe", "Std Delivery", 60,
|
104
|
+
[
|
105
|
+
VW::Step.new("Start", VWorkApp::Location.new("880 Harrison St", 37.779536, -122.401503)),
|
106
|
+
VW::Step.new("End", VWorkApp::Location.new("Other Street", 38.779536, -123.401503))
|
107
|
+
],
|
108
|
+
[
|
109
|
+
VW::CustomField.new("Note1", "Value1"),
|
110
|
+
VW::CustomField.new("Note2", "Value2"),
|
111
|
+
]
|
112
|
+
)
|
113
|
+
@job = @job.create
|
114
|
+
r_job = VW::Job.show(@job.id)
|
115
|
+
r_job.custom_fields.should == @job.custom_fields
|
116
|
+
end
|
117
|
+
|
118
|
+
it "Creates and assigns a job" do
|
119
|
+
@worker = VW::Worker.new("Joe", "joe@example.com")
|
120
|
+
@worker = @worker.create
|
121
|
+
|
122
|
+
@job = VW::Job.new("Joe", "Std Delivery", 60,
|
123
|
+
[
|
124
|
+
VW::Step.new("Start", VWorkApp::Location.new("880 Harrison St", 37.779536, -122.401503)),
|
125
|
+
VW::Step.new("End", VWorkApp::Location.new("Other Street", 38.779536, -123.401503))
|
126
|
+
], nil, nil, @worker.id, DateTime.parse("2012-12-25 16:30"))
|
127
|
+
@job = @job.create
|
128
|
+
r_job = VW::Job.show(@job.id)
|
129
|
+
|
130
|
+
r_job.worker_id.should == @worker.id
|
131
|
+
r_job.planned_start_time.should == DateTime.parse("2012-12-25 16:30")
|
132
|
+
end
|
133
|
+
|
134
|
+
end
|
135
|
+
|
136
|
+
after(:each) do
|
137
|
+
@job.delete if @job
|
138
|
+
@worker.delete if @worker
|
139
|
+
end
|
140
|
+
|
141
|
+
end
|
142
|
+
|
143
|
+
# context "With a known job" do
|
144
|
+
# before(:each) do
|
145
|
+
# @worker = VW::Worker.new("Joe", "joe@example.com")
|
146
|
+
# @worker = @worker.create
|
147
|
+
# end
|
148
|
+
#
|
149
|
+
# after(:each) do
|
150
|
+
# @worker.delete
|
151
|
+
# end
|
152
|
+
#
|
153
|
+
# describe "#show" do
|
154
|
+
# it "Returns the worker" do
|
155
|
+
# r_worker = VW::Worker.show(@worker.id)
|
156
|
+
# r_worker.name.should == "Joe"
|
157
|
+
# r_worker.email.should == "joe@example.com"
|
158
|
+
# end
|
159
|
+
#
|
160
|
+
# it "Returns nil if not found" do
|
161
|
+
# pending("Bug in vWorkApp. Should be returning a 404 but isn't")
|
162
|
+
# r_worker = VW::Worker.show(-1)
|
163
|
+
# r_worker.should be_nil
|
164
|
+
# end
|
165
|
+
# end
|
166
|
+
#
|
167
|
+
# describe "#update" do
|
168
|
+
# it "Updates the worker" do
|
169
|
+
# @worker.name = "Joe2"
|
170
|
+
# @worker.email = "joe2@example.com"
|
171
|
+
# @worker.update
|
172
|
+
# r_worker = VW::Worker.show(@worker.id)
|
173
|
+
# r_worker.name.should == "Joe2"
|
174
|
+
# r_worker.email.should == "joe2@example.com"
|
175
|
+
# end
|
176
|
+
# end
|
177
|
+
#
|
178
|
+
# describe "#delete" do
|
179
|
+
# it "Deletes the worker" do
|
180
|
+
# @worker.delete
|
181
|
+
# # XXX Can't verify until #show is fixed
|
182
|
+
# # r_worker = VW::Worker.show(@worker.id)
|
183
|
+
# # r_worker.should be_nil
|
184
|
+
# end
|
185
|
+
# end
|
186
|
+
#
|
187
|
+
# describe "#find" do
|
188
|
+
# it "Finds all workers" do
|
189
|
+
# results = VW::Worker.find
|
190
|
+
# results.should be_instance_of(Array)
|
191
|
+
# results.should include(@worker)
|
192
|
+
# end
|
193
|
+
# end
|
194
|
+
#
|
195
|
+
# end
|
196
|
+
|
197
|
+
|
198
|
+
|
199
|
+
end
|
data/spec/worker_spec.rb
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
require "vworkapp_ruby"
|
2
|
+
|
3
|
+
describe VW::Worker do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
VW::Worker.base_uri 'api.staging.vworkapp.com/api/2.0'
|
7
|
+
VW.api_key = "AtuogECLCV2R7uT-fkPg"
|
8
|
+
end
|
9
|
+
|
10
|
+
context "Without a known worker" do
|
11
|
+
|
12
|
+
describe "#Equal" do
|
13
|
+
|
14
|
+
it "Is equal to another worker if it has the same key attributes" do
|
15
|
+
worker_1 = VW::Worker.new("Joe", "joe@example.com", 100, 200)
|
16
|
+
worker_2 = VW::Worker.new("Joe", "joe@example.com", 100, 200)
|
17
|
+
worker_1.should == worker_2
|
18
|
+
end
|
19
|
+
|
20
|
+
it "Isn't equal to another worker if doesn't share the key attributes" do
|
21
|
+
worker_1 = VW::Worker.new("Joe", "joe@example.com", 100, 200)
|
22
|
+
worker_2 = VW::Worker.new("Joe", "joe@example.com", 100, 202)
|
23
|
+
worker_1.should_not == worker_2
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "#Create" do
|
29
|
+
|
30
|
+
it "Assigns the new worker an id" do
|
31
|
+
@worker = VW::Worker.new("Joe", "joe@example.com")
|
32
|
+
@worker = @worker.create
|
33
|
+
@worker.id.should_not be_nil
|
34
|
+
end
|
35
|
+
|
36
|
+
it "Creates a worker" do
|
37
|
+
@worker = VW::Worker.new("Joe", "joe@example.com")
|
38
|
+
@worker = @worker.create
|
39
|
+
r_worker = VW::Worker.show(@worker.id)
|
40
|
+
r_worker.name.should == @worker.name
|
41
|
+
r_worker.email.should == @worker.email
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
after(:each) do
|
47
|
+
@worker.delete if @worker
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
context "With a known worker" do
|
53
|
+
before(:each) do
|
54
|
+
@worker = VW::Worker.new("Joe", "joe@example.com")
|
55
|
+
@worker = @worker.create
|
56
|
+
end
|
57
|
+
|
58
|
+
after(:each) do
|
59
|
+
@worker.delete
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "#Show" do
|
63
|
+
it "Returns the worker" do
|
64
|
+
r_worker = VW::Worker.show(@worker.id)
|
65
|
+
r_worker.name.should == "Joe"
|
66
|
+
r_worker.email.should == "joe@example.com"
|
67
|
+
end
|
68
|
+
|
69
|
+
it "Returns nil if not found" do
|
70
|
+
pending("Bug in vWorkApp. Should be returning a 404 but isn't")
|
71
|
+
r_worker = VW::Worker.show(-1)
|
72
|
+
r_worker.should be_nil
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe "#Update" do
|
77
|
+
it "Updates the worker" do
|
78
|
+
@worker.name = "Joe2"
|
79
|
+
@worker.email = "joe2@example.com"
|
80
|
+
@worker.update
|
81
|
+
r_worker = VW::Worker.show(@worker.id)
|
82
|
+
r_worker.name.should == "Joe2"
|
83
|
+
r_worker.email.should == "joe2@example.com"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe "#Delete" do
|
88
|
+
it "Deletes the worker" do
|
89
|
+
@worker.delete
|
90
|
+
# XXX Can't verify until #show is fixed
|
91
|
+
# r_worker = VW::Worker.show(@worker.id)
|
92
|
+
# r_worker.should be_nil
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
describe "#Find" do
|
97
|
+
it "Finds all workers" do
|
98
|
+
results = VW::Worker.find
|
99
|
+
results.should be_instance_of(Array)
|
100
|
+
results.should include(@worker)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
|
106
|
+
|
107
|
+
|
108
|
+
end
|
data/vworkapp_ruby.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "vworkapp_ruby"
|
3
|
-
s.version = "0.0
|
3
|
+
s.version = "0.1.0"
|
4
4
|
s.platform = Gem::Platform::RUBY
|
5
5
|
s.authors = ["vWorkApp Inc.", "Aish Fenton"]
|
6
6
|
s.email = ["info@vworkapp.com"]
|
@@ -12,6 +12,7 @@ Gem::Specification.new do |s|
|
|
12
12
|
|
13
13
|
s.add_dependency "httparty"
|
14
14
|
s.add_dependency "gcoder"
|
15
|
+
|
15
16
|
s.add_development_dependency "rspec"
|
16
17
|
|
17
18
|
s.files = `git ls-files`.split("\n") rescue ''
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vworkapp_ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 27
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
- 0
|
9
8
|
- 1
|
10
|
-
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- vWorkApp Inc.
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date:
|
19
|
+
date: 2012-01-20 00:00:00 Z
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
22
|
name: httparty
|
@@ -70,18 +70,23 @@ extensions: []
|
|
70
70
|
extra_rdoc_files: []
|
71
71
|
|
72
72
|
files:
|
73
|
+
- .gitignore
|
73
74
|
- Gemfile
|
75
|
+
- Gemfile.lock
|
74
76
|
- README.md
|
75
77
|
- examples/create_job.rb
|
76
78
|
- examples/print_jobs.rb
|
77
79
|
- lib/vworkapp_ruby.rb
|
78
80
|
- lib/vworkapp_ruby/base.rb
|
79
|
-
- lib/vworkapp_ruby/cli/job.rb
|
80
81
|
- lib/vworkapp_ruby/customer.rb
|
81
82
|
- lib/vworkapp_ruby/httparty_monkey_patch.rb
|
82
83
|
- lib/vworkapp_ruby/job.rb
|
84
|
+
- lib/vworkapp_ruby/location.rb
|
83
85
|
- lib/vworkapp_ruby/response_error.rb
|
84
86
|
- lib/vworkapp_ruby/worker.rb
|
87
|
+
- spec/customer_spec.rb
|
88
|
+
- spec/job_spec.rb
|
89
|
+
- spec/worker_spec.rb
|
85
90
|
- vworkapp_ruby.gemspec
|
86
91
|
homepage: http://api.vworkapp.com/api/
|
87
92
|
licenses: []
|
@@ -114,7 +119,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
114
119
|
requirements: []
|
115
120
|
|
116
121
|
rubyforge_project:
|
117
|
-
rubygems_version: 1.8.
|
122
|
+
rubygems_version: 1.8.11
|
118
123
|
signing_key:
|
119
124
|
specification_version: 3
|
120
125
|
summary: Simple interface to vWorkApp's api
|