freelancer 0.1.0 → 0.1.1
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.
- data/.gitignore +2 -0
- data/Gemfile +2 -2
- data/README.rdoc +9 -12
- data/Rakefile +55 -12
- data/VERSION +1 -1
- data/freelancer.gemspec +12 -9
- data/lib/freelancer.rb +3 -0
- data/lib/freelancer/api/common.rb +98 -0
- data/lib/freelancer/api/employer.rb +169 -0
- data/lib/freelancer/api/freelancer.rb +85 -0
- data/lib/freelancer/api/message.rb +42 -0
- data/lib/freelancer/api/payment.rb +184 -0
- data/lib/freelancer/api/profile.rb +40 -0
- data/lib/freelancer/api/project.rb +20 -0
- data/lib/freelancer/client.rb +23 -13
- data/lib/freelancer/models/project.rb +6 -0
- data/lib/freelancer/models/status_confirmation.rb +28 -0
- data/test/fixtures/error.json +1 -0
- data/test/fixtures/status_confirmation.json +1 -0
- data/test/freelancer/api/common_api_test.rb +97 -0
- data/test/freelancer/api/employer_api_test.rb +258 -0
- data/test/freelancer/api/freelancer_api_test.rb +76 -0
- data/test/freelancer/api/message_api_test.rb +44 -0
- data/test/freelancer/api/payment_api_test.rb +169 -1
- data/test/freelancer/api/profile_api_test.rb +57 -0
- data/test/freelancer/api/project_api_test.rb +19 -0
- data/test/freelancer/client_test.rb +22 -2
- metadata +15 -10
@@ -30,6 +30,91 @@ module Freelancer
|
|
30
30
|
|
31
31
|
end
|
32
32
|
|
33
|
+
# Place a bid on a project
|
34
|
+
#
|
35
|
+
# Valid parameters are:
|
36
|
+
# - project_id: the id of the project to bid on
|
37
|
+
# - amount: the amount of money to offer taking the project for
|
38
|
+
# - description: the bid description
|
39
|
+
# - days: the estimated number of days to complete the project
|
40
|
+
# - notify_on_underbid: if notifications should be send when someone bids lower than this bid
|
41
|
+
# - highlighted: if this bid is highlighted or not
|
42
|
+
# - milestone: declares the initial milestone percentage for the bid
|
43
|
+
def bid_on_project(*args)
|
44
|
+
|
45
|
+
params = extract_params(args)
|
46
|
+
|
47
|
+
# Execute the service call
|
48
|
+
result = api_get("/Freelancer/placeBidOnProject.json", build_api_params({
|
49
|
+
:projectid => params[:project_id],
|
50
|
+
:amount => params[:amount],
|
51
|
+
:description => params[:description],
|
52
|
+
:days => params[:days],
|
53
|
+
:notificationStatus => params[:notify_on_underbid],
|
54
|
+
:highlighted => params[:highlighted],
|
55
|
+
:milestone => params[:milestone]
|
56
|
+
}))
|
57
|
+
|
58
|
+
# Parse and return the response
|
59
|
+
::Freelancer::Models::StatusConfirmation.parse(result, :shift => :"json-result")
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
# Retract a bid from a project
|
64
|
+
#
|
65
|
+
# Valid parameters are:
|
66
|
+
# - project_id: the id of the project to withdraw bid from
|
67
|
+
def retract_bid_from_project(*args)
|
68
|
+
|
69
|
+
params = extract_params(args)
|
70
|
+
|
71
|
+
# Execute the service call
|
72
|
+
result = api_get("/Freelancer/retractBidFromProject.json", build_api_params({
|
73
|
+
:projectid => params[:project_id]
|
74
|
+
}))
|
75
|
+
|
76
|
+
# Parse and return the response
|
77
|
+
::Freelancer::Models::StatusConfirmation.parse(result, :shift => :"json-result")
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
# Accept a won bid
|
82
|
+
#
|
83
|
+
# Valid parameters are:
|
84
|
+
# - project_id: the id of the project to accept the offer on
|
85
|
+
def accept_won_bid(*args)
|
86
|
+
|
87
|
+
params = extract_params(args)
|
88
|
+
|
89
|
+
# Execute the service call
|
90
|
+
result = api_get("/Freelancer/acceptBidWon.json", build_api_params({
|
91
|
+
:projectid => params[:project_id]
|
92
|
+
}))
|
93
|
+
|
94
|
+
# Parse and return the response
|
95
|
+
::Freelancer::Models::StatusConfirmation.parse(result, :shift => :"json-result")
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
# Reject a won bid
|
100
|
+
#
|
101
|
+
# Valid parameters are:
|
102
|
+
# - project_id: the id of the project to reject the offer on
|
103
|
+
def reject_won_bid(*args)
|
104
|
+
|
105
|
+
params = extract_params(args)
|
106
|
+
|
107
|
+
# Execute the service call
|
108
|
+
result = api_get("/Freelancer/acceptBidWon.json", build_api_params({
|
109
|
+
:projectid => params[:project_id],
|
110
|
+
:state => 0
|
111
|
+
}))
|
112
|
+
|
113
|
+
# Parse and return the response
|
114
|
+
::Freelancer::Models::StatusConfirmation.parse(result, :shift => :"json-result")
|
115
|
+
|
116
|
+
end
|
117
|
+
|
33
118
|
end
|
34
119
|
end
|
35
120
|
end
|
@@ -83,6 +83,48 @@ module Freelancer
|
|
83
83
|
|
84
84
|
end
|
85
85
|
|
86
|
+
# Send a private message to another user
|
87
|
+
#
|
88
|
+
# Valid parameters are:
|
89
|
+
# - project_id: the id of the project to send message for
|
90
|
+
# - text: the text of the message to send
|
91
|
+
# - user_id: the id of the user to send the message to
|
92
|
+
# - username: the username of the user to send the message to
|
93
|
+
def send_message(*args)
|
94
|
+
|
95
|
+
params = extract_params(args)
|
96
|
+
|
97
|
+
# Execute the service call
|
98
|
+
result = api_get("/Message/sendMessage.json", build_api_params({
|
99
|
+
:projectid => params[:project_id],
|
100
|
+
:messagetext => params[:text],
|
101
|
+
:userid => params[:user_id],
|
102
|
+
:username => params[:username]
|
103
|
+
}))
|
104
|
+
|
105
|
+
# Parse and return the response
|
106
|
+
::Freelancer::Models::StatusConfirmation.parse(result, :shift => :"json-result")
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
# Mark a message as read
|
111
|
+
#
|
112
|
+
# Valid parameters are:
|
113
|
+
# - message_id: the id of the message to mark as read
|
114
|
+
def mark_message_as_read(*args)
|
115
|
+
|
116
|
+
params = extract_params(args)
|
117
|
+
|
118
|
+
# Execute the service call
|
119
|
+
result = api_get("/Message/markMessageAsRead.json", build_api_params({
|
120
|
+
:id => params[:message_id]
|
121
|
+
}))
|
122
|
+
|
123
|
+
# Parse and return the response
|
124
|
+
::Freelancer::Models::StatusConfirmation.parse(result, :shift => :"json-result")
|
125
|
+
|
126
|
+
end
|
127
|
+
|
86
128
|
end
|
87
129
|
end
|
88
130
|
end
|
@@ -117,6 +117,190 @@ module Freelancer
|
|
117
117
|
|
118
118
|
end
|
119
119
|
|
120
|
+
# Request withdrawal of funds
|
121
|
+
#
|
122
|
+
# Valid parameters are:
|
123
|
+
# - amount: the amount of money to withdraw
|
124
|
+
# - method: the withdrawal method (paypal, moneybooker, wire, paynoneer)
|
125
|
+
# - wire_comment: withdrawal comment for wire transfer
|
126
|
+
# - paypal_email: paypal account to withdraw to
|
127
|
+
# - moneybooker_account: moneybooker account to withdraw to
|
128
|
+
# - description: description for wire transfer withdrawal
|
129
|
+
# - country_code: country code for wire transfer withdrawal
|
130
|
+
def request_withdrawal(*args)
|
131
|
+
|
132
|
+
params = extract_params(args)
|
133
|
+
|
134
|
+
# Execute the service call
|
135
|
+
result = api_get("/Payment/requestWithdrawal.json", build_api_params({
|
136
|
+
:amount => params[:amount],
|
137
|
+
:method => params[:method],
|
138
|
+
:additionaltext => params[:wire_comment],
|
139
|
+
:paypalemail => params[:paypal_email],
|
140
|
+
:mb_account => params[:moneybooker_account],
|
141
|
+
:description => params[:description],
|
142
|
+
:country_code => params[:country_code]
|
143
|
+
}))
|
144
|
+
|
145
|
+
# Parse and return the response
|
146
|
+
::Freelancer::Models::StatusConfirmation.parse(result, :shift => :"json-result")
|
147
|
+
|
148
|
+
end
|
149
|
+
|
150
|
+
# Create a new milestone payment
|
151
|
+
#
|
152
|
+
# Valid parameters are:
|
153
|
+
# - project_id: the id of the project to create the payment for
|
154
|
+
# - amount: the amount of money to add to the milestone payment
|
155
|
+
# - user_id: the id of the user to make out the payment to
|
156
|
+
# - username: the username of the user to make out the payment to
|
157
|
+
# - comment: the comment of the payment
|
158
|
+
# - type: the milestone payment type (partial, full or other)
|
159
|
+
def create_milestone_payment(*args)
|
160
|
+
|
161
|
+
params = extract_params(args)
|
162
|
+
|
163
|
+
# Execute the service call
|
164
|
+
result = api_get("/Payment/createMilestonePayment.json", build_api_params({
|
165
|
+
:projectid => params[:project_id],
|
166
|
+
:amount => params[:amount],
|
167
|
+
:touserid => params[:user_id],
|
168
|
+
:tousername => params[:username],
|
169
|
+
:reasontext => params[:comment],
|
170
|
+
:reasontype => params[:type]
|
171
|
+
}))
|
172
|
+
|
173
|
+
# Parse and return the response
|
174
|
+
::Freelancer::Models::StatusConfirmation.parse(result, :shift => :"json-result")
|
175
|
+
|
176
|
+
end
|
177
|
+
|
178
|
+
# Transfer money to another user
|
179
|
+
#
|
180
|
+
# Valid parameters are:
|
181
|
+
# - project_id: the id of the project to transfer money for
|
182
|
+
# - amount: the amount of money to transfer
|
183
|
+
# - user_id: the id of the user to transfer the money to
|
184
|
+
# - username: the username of the user to transfer the money to
|
185
|
+
# - comment: the comment of the transfer
|
186
|
+
# - type: the transfer type (partial, full or other)
|
187
|
+
def transfer_money(*args)
|
188
|
+
|
189
|
+
params = extract_params(args)
|
190
|
+
|
191
|
+
# Execute the service call
|
192
|
+
result = api_get("/Payment/transferMoney.json", build_api_params({
|
193
|
+
:projectid => params[:project_id],
|
194
|
+
:amount => params[:amount],
|
195
|
+
:touserid => params[:user_id],
|
196
|
+
:tousername => params[:username],
|
197
|
+
:reasontext => params[:comment],
|
198
|
+
:reasontype => params[:type]
|
199
|
+
}))
|
200
|
+
|
201
|
+
# Parse and return the response
|
202
|
+
::Freelancer::Models::StatusConfirmation.parse(result, :shift => :"json-result")
|
203
|
+
|
204
|
+
end
|
205
|
+
|
206
|
+
# Cancel a money withdrawal request
|
207
|
+
#
|
208
|
+
# Valid parameters are:
|
209
|
+
# - withdrawal_id: the id of the withdrawal to cancel
|
210
|
+
def cancel_withdrawal(*args)
|
211
|
+
|
212
|
+
params = extract_params(args)
|
213
|
+
|
214
|
+
# Execute the service call
|
215
|
+
result = api_get("/Payment/requestCancelWithdrawal.json", build_api_params({
|
216
|
+
:withdrawalid => params[:withdrawal_id]
|
217
|
+
}))
|
218
|
+
|
219
|
+
# Parse and return the response
|
220
|
+
::Freelancer::Models::StatusConfirmation.parse(result, :shift => :"json-result")
|
221
|
+
|
222
|
+
end
|
223
|
+
|
224
|
+
# Cancel a milestone payment
|
225
|
+
#
|
226
|
+
# Valid parameters are:
|
227
|
+
# - transaction_id: the id of the milestone transaction to cancel
|
228
|
+
def cancel_milestone(*args)
|
229
|
+
|
230
|
+
params = extract_params(args)
|
231
|
+
|
232
|
+
# Execute the service call
|
233
|
+
result = api_get("/Payment/cancelMilestone.json", build_api_params({
|
234
|
+
:transactionid => params[:transaction_id]
|
235
|
+
}))
|
236
|
+
|
237
|
+
# Parse and return the response
|
238
|
+
::Freelancer::Models::StatusConfirmation.parse(result, :shift => :"json-result")
|
239
|
+
|
240
|
+
end
|
241
|
+
|
242
|
+
# Request to release a milestone payment
|
243
|
+
#
|
244
|
+
# Valid parameters are:
|
245
|
+
# - transaction_id: the id of the milestone transaction to release
|
246
|
+
def request_release_milestone(*args)
|
247
|
+
|
248
|
+
params = extract_params(args)
|
249
|
+
|
250
|
+
# Execute the service call
|
251
|
+
result = api_get("/Payment/requestReleaseMilestone.json", build_api_params({
|
252
|
+
:transactionid => params[:transaction_id]
|
253
|
+
}))
|
254
|
+
|
255
|
+
# Parse and return the response
|
256
|
+
::Freelancer::Models::StatusConfirmation.parse(result, :shift => :"json-result")
|
257
|
+
|
258
|
+
end
|
259
|
+
|
260
|
+
# Release a milestone payment
|
261
|
+
#
|
262
|
+
# Valid parameters are:
|
263
|
+
# - transaction_id: the id of the milestone transaction to release
|
264
|
+
# - full_name: the full name of the payer (signature)
|
265
|
+
def release_milestone(*args)
|
266
|
+
|
267
|
+
params = extract_params(args)
|
268
|
+
|
269
|
+
# Execute the service call
|
270
|
+
result = api_get("/Payment/releaseMilestone.json", build_api_params({
|
271
|
+
:transactionid => params[:transaction_id],
|
272
|
+
:fullname => params[:full_name]
|
273
|
+
}))
|
274
|
+
|
275
|
+
# Parse and return the response
|
276
|
+
::Freelancer::Models::StatusConfirmation.parse(result, :shift => :"json-result")
|
277
|
+
|
278
|
+
end
|
279
|
+
|
280
|
+
# Prepare a transfer to validate it before actually transfering
|
281
|
+
#
|
282
|
+
# Valid parameters are:
|
283
|
+
# - project_id: the id of the project to transfer money for
|
284
|
+
# - amount: the amount of money to transfer
|
285
|
+
# - user_id: the id of the user to transfer money to
|
286
|
+
# - type: the type of transfer (partial, full or other)
|
287
|
+
def prepare_transfer(*args)
|
288
|
+
|
289
|
+
params = extract_params(args)
|
290
|
+
|
291
|
+
# Execute the service call
|
292
|
+
result = api_get("/Payment/prepareTransfer.json", build_api_params({
|
293
|
+
:projectid => params[:project_id],
|
294
|
+
:amount => params[:amount],
|
295
|
+
:touserid => params[:user_id],
|
296
|
+
:reasontype => params[:type]
|
297
|
+
}))
|
298
|
+
|
299
|
+
# Parse and return the response
|
300
|
+
::Freelancer::Models::StatusConfirmation.parse(result, :shift => :"json-result")
|
301
|
+
|
302
|
+
end
|
303
|
+
|
120
304
|
end
|
121
305
|
end
|
122
306
|
end
|
@@ -11,6 +11,46 @@ module Freelancer
|
|
11
11
|
|
12
12
|
end
|
13
13
|
|
14
|
+
# Update one or more attributes for the current user. This method takes a
|
15
|
+
# User object, and this should in most cases have been populated by the
|
16
|
+
# account_details method before passed to the update_account_details
|
17
|
+
# method to ensure that no data gets lost.
|
18
|
+
def update_account_details(account)
|
19
|
+
|
20
|
+
# Prepare a map of update parameters
|
21
|
+
params = {}
|
22
|
+
params[:fullname] = account.name
|
23
|
+
params[:company_name] = account.company
|
24
|
+
params[:type_of_work] = account.type_of_work
|
25
|
+
params[:addressline1] = account.address.street_name
|
26
|
+
params[:addressline2] = account.address.street_name_2
|
27
|
+
params[:city] = account.address.city
|
28
|
+
params[:state] = account.address.state
|
29
|
+
params[:country] = account.address.country
|
30
|
+
params[:postalcode] = account.address.postal_code
|
31
|
+
params[:phone] = account.phone_number
|
32
|
+
params[:fax] = account.fax_number
|
33
|
+
params[:notificationformat] = account.notifications.notification_format
|
34
|
+
params[:emailnotificationstatus] = account.notifications.email
|
35
|
+
params[:receivenewsstatus] = account.notifications.news
|
36
|
+
params[:bidwonnotificationstatus] = account.notifications.bid_won
|
37
|
+
params[:bidplacednotificationstatus] = account.notifications.bid_placed
|
38
|
+
params[:newprivatemessagestatus] = account.notifications.new_private_message
|
39
|
+
params[:qualificationcsv] = account.qualifications.join(",")
|
40
|
+
params[:profiletext] = account.profile_text
|
41
|
+
params[:vision] = account.vision
|
42
|
+
params[:keywords] = account.keywords
|
43
|
+
params[:hourlyrate] = account.hourly_rate
|
44
|
+
params[:skills] = account.skills.join("\n")
|
45
|
+
|
46
|
+
# Execute the service call
|
47
|
+
result = api_get("/Profile/setProfileInfo.json", params)
|
48
|
+
|
49
|
+
# Parse and return the response
|
50
|
+
::Freelancer::Models::StatusConfirmation.parse(result, :shift => :"json-result")
|
51
|
+
|
52
|
+
end
|
53
|
+
|
14
54
|
# Retrieve profile information about a specific user
|
15
55
|
#
|
16
56
|
# Valid parameters are:
|
@@ -126,6 +126,26 @@ module Freelancer
|
|
126
126
|
|
127
127
|
end
|
128
128
|
|
129
|
+
# Post a public message for a project
|
130
|
+
#
|
131
|
+
# Valid parameters are:
|
132
|
+
# - project_id: the id of the project to post the message to
|
133
|
+
# - message: the message to post
|
134
|
+
def post_public_project_message(*args)
|
135
|
+
|
136
|
+
params = extract_params(args)
|
137
|
+
|
138
|
+
# Execute the service call
|
139
|
+
result = api_get("/Project/postPublicMessage.json", build_api_params({
|
140
|
+
:projectid => params[:project_id],
|
141
|
+
:messagetext => params[:message]
|
142
|
+
}))
|
143
|
+
|
144
|
+
# Parse and return the response
|
145
|
+
::Freelancer::Models::StatusConfirmation.parse(result, :shift => :"json-result")
|
146
|
+
|
147
|
+
end
|
148
|
+
|
129
149
|
end
|
130
150
|
|
131
151
|
end
|
data/lib/freelancer/client.rb
CHANGED
@@ -75,7 +75,7 @@ module Freelancer
|
|
75
75
|
return response.body
|
76
76
|
end
|
77
77
|
|
78
|
-
# Execute a GET-
|
78
|
+
# Execute a GET-request for the specified API method and return the raw
|
79
79
|
# result.
|
80
80
|
def api_get_raw(method, options = {})
|
81
81
|
response = access_token.get(to_uri(method, options))
|
@@ -83,14 +83,6 @@ module Freelancer
|
|
83
83
|
response.body
|
84
84
|
end
|
85
85
|
|
86
|
-
# Execute a POST-request for the specified API method
|
87
|
-
# TODO: Finish this method, it should probably return some JSON decoded
|
88
|
-
# string.
|
89
|
-
def api_post(method, body)
|
90
|
-
response = access_token.post(method, body)
|
91
|
-
response.body
|
92
|
-
end
|
93
|
-
|
94
86
|
private
|
95
87
|
|
96
88
|
# Extract params from an array of arguments. Copied from ActiveSupport.
|
@@ -114,11 +106,29 @@ module Freelancer
|
|
114
106
|
|
115
107
|
case response.code.to_i
|
116
108
|
when 1..199
|
117
|
-
raise "
|
109
|
+
raise FreelancerRequestError.new("Got response code #{response.code} when executing API request")
|
118
110
|
when 201..503
|
119
|
-
raise "
|
111
|
+
raise FreelancerRequestError.new("Got response code #{response.code} when executing API request")
|
120
112
|
end
|
121
|
-
|
113
|
+
|
114
|
+
# Attempt to convert the response to a JSON data structure
|
115
|
+
json = JSONMapper::Parser.parse(response.body)
|
116
|
+
|
117
|
+
# If we didn't get a proper response, raise an error
|
118
|
+
raise FreelancerResponseError.new("No or invalid response received when executing API request") if json.nil?
|
119
|
+
|
120
|
+
# If the JSON data has an error element as the only element,
|
121
|
+
# assume this request fails
|
122
|
+
if json.keys.size == 1 && json.keys.first == :errors
|
123
|
+
|
124
|
+
error_code = json[:errors][:error][:code]
|
125
|
+
error_message = json[:errors][:error][:msg]
|
126
|
+
error_description = json[:errors][:error][:longmsg]
|
127
|
+
|
128
|
+
raise FreelancerResponseError.new("#{error_message} - #{error_description} (code #{error_code})")
|
129
|
+
|
130
|
+
end
|
131
|
+
|
122
132
|
end
|
123
133
|
|
124
134
|
# Create a URI from the specified method and options
|
@@ -128,7 +138,7 @@ module Freelancer
|
|
128
138
|
unless options.nil? || options.empty?
|
129
139
|
uri.query = to_query(options)
|
130
140
|
end
|
131
|
-
|
141
|
+
|
132
142
|
return uri.to_s
|
133
143
|
|
134
144
|
end
|