ruby_desk 0.0.0 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +21 -14
- data/Rakefile +2 -1
- data/VERSION +1 -1
- data/lib/ruby_desk/connector.rb +149 -0
- data/lib/ruby_desk/snapshot.rb +19 -0
- data/lib/ruby_desk/team_room.rb +37 -0
- data/lib/ruby_desk/user.rb +12 -0
- data/lib/ruby_desk.rb +4 -95
- metadata +6 -5
- data/.document +0 -5
- data/.gitignore +0 -21
- data/test/test.rb +0 -46
data/README.rdoc
CHANGED
@@ -1,17 +1,24 @@
|
|
1
|
-
=
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
==
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
1
|
+
= RubyDesk
|
2
|
+
|
3
|
+
A gem built by BadrIT (www.badrit.com) that works as an interface for oDesk APIs. It can be used for both desktop and web applications
|
4
|
+
|
5
|
+
== Example
|
6
|
+
Initialize with your api key
|
7
|
+
rd = RubyDesk::Connector.new(api_key, api_secret)
|
8
|
+
|
9
|
+
Gets the URL that will ask the user to authenticate your application
|
10
|
+
rd.auth_url
|
11
|
+
|
12
|
+
This will get you the frob you need to access all APIs.
|
13
|
+
When you get the frob set it using
|
14
|
+
rd.frob = frob
|
15
|
+
|
16
|
+
After that you should request an api_token
|
17
|
+
rd.get_token
|
18
|
+
|
19
|
+
Now you are ready to use all the APIs you need
|
20
|
+
team_rooms = RubyDesk::TeamRoom.get_teamrooms(rd)
|
21
|
+
team_rooms.each { |team_room| puts team_room.id }
|
15
22
|
|
16
23
|
== Copyright
|
17
24
|
|
data/Rakefile
CHANGED
@@ -10,7 +10,8 @@ begin
|
|
10
10
|
gem.email = "ahmed.eldawy@badrit.com"
|
11
11
|
gem.homepage = "http://github.com/aseldawy/ruby_desk"
|
12
12
|
gem.authors = ["Ahmed ElDawy"]
|
13
|
-
|
13
|
+
gem.files = FileList['lib/**/*.rb', '[A-Z]*', 'test/**/*'].to_a
|
14
|
+
# gem.add_development_dependency "thoughtbot-shoulda", ">= 0"
|
14
15
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
15
16
|
end
|
16
17
|
rescue LoadError
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.1.0
|
@@ -0,0 +1,149 @@
|
|
1
|
+
require 'digest/md5'
|
2
|
+
require 'uri'
|
3
|
+
require 'net/http'
|
4
|
+
require 'net/https'
|
5
|
+
|
6
|
+
module RubyDesk
|
7
|
+
class Connector
|
8
|
+
ODESK_API_URL = "www.odesk.com/api/"
|
9
|
+
ODESK_AUTH_URL = "www.odesk.com/services/api/auth/"
|
10
|
+
DEFAULT_OPTIONS = {:secure=>true, :sign=>true, :format=>'xml'}
|
11
|
+
|
12
|
+
attr_writer :frob
|
13
|
+
|
14
|
+
def initialize(api_key=nil, api_secret=nil, frob=nil, api_token=nil)
|
15
|
+
@api_key = api_key
|
16
|
+
@api_secret = api_secret
|
17
|
+
@frob = frob
|
18
|
+
@api_token = api_token
|
19
|
+
@api_key = "991ac77f4c202873b0ab88f11762370c"
|
20
|
+
@api_secret = "c3382d5902e5a7b0"
|
21
|
+
end
|
22
|
+
|
23
|
+
# Sign the given parameters and returns the signature
|
24
|
+
def sign(params)
|
25
|
+
# sort parameters by its names (keys)
|
26
|
+
sorted_params = params.sort { |a, b| a.to_s <=> b.to_s}
|
27
|
+
|
28
|
+
# concatenate secret with names, values
|
29
|
+
concatenated = @api_secret + sorted_params.to_s
|
30
|
+
|
31
|
+
# Calculate md5 of concatenated string
|
32
|
+
md5 = Digest::MD5.hexdigest(concatenated)
|
33
|
+
|
34
|
+
# Return the calculated value as the signature
|
35
|
+
md5
|
36
|
+
end
|
37
|
+
|
38
|
+
# Returns the correct URL to go to to invoke the given api
|
39
|
+
# path: the path of the API to call. e.g. 'auth'
|
40
|
+
# params: a hash of parameters that needs to be appended
|
41
|
+
# options:
|
42
|
+
# * :secure=>false: Whether a secure connection is required or not.
|
43
|
+
# * :sign=>true: Whether you need to sign the parameters or not
|
44
|
+
def prepare_api_call(path, params = {}, options = {})
|
45
|
+
options = DEFAULT_OPTIONS.merge(options)
|
46
|
+
params[:api_sig] = sign(params) if options[:sign]
|
47
|
+
{:url=>"http#{options[:secure]? 's' : ''}://" + ODESK_API_URL + path + "." + options[:format],
|
48
|
+
:params=> params, :method=>options[:method]}
|
49
|
+
end
|
50
|
+
|
51
|
+
# invokes the given API call and returns body of the response as text
|
52
|
+
def invoke_api_call(api_call)
|
53
|
+
url = URI.parse(api_call[:url])
|
54
|
+
http = Net::HTTP.new(url.host, url.port)
|
55
|
+
http.use_ssl = true
|
56
|
+
|
57
|
+
data = api_call[:params].to_a.map{|pair| pair.join '='}.join('&')
|
58
|
+
headers = {
|
59
|
+
'Content-Type' => 'application/x-www-form-urlencoded'
|
60
|
+
}
|
61
|
+
|
62
|
+
case api_call[:method]
|
63
|
+
when :get, 'get' then
|
64
|
+
resp, data = http.request(Net::HTTP::Get.new(url.path+"?"+data, headers))
|
65
|
+
when :post, 'post' then
|
66
|
+
resp, data = http.request(Net::HTTP::Post.new(url.path, headers), data)
|
67
|
+
when :delete, 'delete' then
|
68
|
+
resp, data = http.request(Net::HTTP::Delete.new(url.path, headers), data)
|
69
|
+
end
|
70
|
+
|
71
|
+
return data
|
72
|
+
end
|
73
|
+
|
74
|
+
# Prepares an API call with the given arguments then invokes it and returns its body
|
75
|
+
def prepare_and_invoke_api_call(path, params = {}, options = {})
|
76
|
+
api_call = prepare_api_call(path, params, options)
|
77
|
+
invoke_api_call(api_call)
|
78
|
+
end
|
79
|
+
|
80
|
+
# Returns the URL that authenticates the application for the current user
|
81
|
+
def auth_url
|
82
|
+
params = {:api_key=>@api_key}
|
83
|
+
params[:api_sig] = sign(params)
|
84
|
+
"https://"+ODESK_AUTH_URL+"?"+params.to_a.map{|pair| pair.join '='}.join('&')
|
85
|
+
end
|
86
|
+
|
87
|
+
# return the URL that logs user out of odesk applications
|
88
|
+
def logout_url
|
89
|
+
"https://"+ODESK_AUTH_URL
|
90
|
+
end
|
91
|
+
|
92
|
+
# Returns an authentication frob.
|
93
|
+
# Parameters
|
94
|
+
# * frob
|
95
|
+
# * api_key
|
96
|
+
# * api_sig
|
97
|
+
#
|
98
|
+
# Return Data
|
99
|
+
# * token
|
100
|
+
def get_token
|
101
|
+
response = prepare_and_invoke_api_call 'auth/v1/keys/tokens', {:frob=>@frob, :api_key=>@api_key}, :method=>:post, :format=>'json'
|
102
|
+
json = JSON.parse(response)
|
103
|
+
@api_token = json['token']
|
104
|
+
end
|
105
|
+
|
106
|
+
# Returns an authentication frob.
|
107
|
+
#Parameters
|
108
|
+
# * api_key
|
109
|
+
# * api_sig
|
110
|
+
#
|
111
|
+
#Return Data
|
112
|
+
# * frob
|
113
|
+
|
114
|
+
def get_frob
|
115
|
+
response = prepare_and_invoke_api_call 'auth/v1/keys/frobs', {:api_key=>@api_key}, :method=>:post, :format=>'json'
|
116
|
+
json = JSON.parse(response)
|
117
|
+
@frob = json['frob']
|
118
|
+
end
|
119
|
+
|
120
|
+
# Returns the authenticated user associated with the given authorization token.
|
121
|
+
# Parameters
|
122
|
+
#
|
123
|
+
# * api_key
|
124
|
+
# * api_sig
|
125
|
+
# * api_token
|
126
|
+
#
|
127
|
+
# Return Data
|
128
|
+
#
|
129
|
+
# * token
|
130
|
+
def check_token
|
131
|
+
prepare_and_invoke_api_call 'auth/v1/keys/token', {:api_key=>@api_key, :api_token=>@api_token}, :method=>:get, :format=>'json'
|
132
|
+
json = JSON.parse(response)
|
133
|
+
# TODO what to make with results?
|
134
|
+
return json
|
135
|
+
end
|
136
|
+
|
137
|
+
# Revokes the given aut
|
138
|
+
# Parameters
|
139
|
+
# * api_key
|
140
|
+
# * api_sig
|
141
|
+
# * api_token
|
142
|
+
|
143
|
+
def revoke_token
|
144
|
+
prepare_and_invoke_api_call 'auth/v1/keys/token', {:api_key=>@api_key, :api_token=>@api_token}, :method=>:delete, :format=>'json'
|
145
|
+
@api_token = nil
|
146
|
+
end
|
147
|
+
|
148
|
+
end
|
149
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module RubyDesk
|
2
|
+
class Snapshot
|
3
|
+
attr_reader :status, :time, :billing_status, :report_url, :screenshot_img, :activity,
|
4
|
+
:online_presence, :user, :screenshot_url, :mouse_events_count, :company_id,
|
5
|
+
:timezone, :uid, :keyboard_events_count, :last_worked_status, :last_worked,
|
6
|
+
:memo, :active_window_title, :portrait_img, :report24_img, :computer_name,
|
7
|
+
:screenshot_img_thmb, :online_presence_img, :user_id, :role, :client_version,
|
8
|
+
:snapshot_api, :workdiary_api
|
9
|
+
def initialize(params={})
|
10
|
+
params.each do |k, v|
|
11
|
+
if k.to_s == 'user'
|
12
|
+
@user = RubyDesk::User.new(v)
|
13
|
+
else
|
14
|
+
self.instance_variable_set("@#{k}", v)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module RubyDesk
|
2
|
+
class TeamRoom
|
3
|
+
class << self
|
4
|
+
def get_teamrooms(connector)
|
5
|
+
response = connector.prepare_and_invoke_api_call 'team/v1/teamrooms', {:api_token=>@api_token, :api_key=>@api_key}, :method=>:get, :format=>'json'
|
6
|
+
# parses a JSON result returned from oDesk and extracts an array of TeamRooms out of it
|
7
|
+
json = JSON.parse(response)
|
8
|
+
team_rooms = []
|
9
|
+
json['teamrooms']['teamroom'].each do |teamroom|
|
10
|
+
# Append this TeamRoom to array
|
11
|
+
team_rooms << self.new(teamroom)
|
12
|
+
end
|
13
|
+
# return the resulting array
|
14
|
+
team_rooms
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
# Attribute readers for all attributes
|
20
|
+
attr_reader :company_recno, :company_name, :name, :id, :recno, :teamroom_api
|
21
|
+
|
22
|
+
# Create a new TeamRoom from a hash similar to the one in ActiveRecord::Base.
|
23
|
+
# The given hash maps each attribute name to its value
|
24
|
+
def initialize(params={})
|
25
|
+
params.each do |k, v|
|
26
|
+
self.instance_variable_set("@#{k}", v)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def snapshot(connector, online='now')
|
31
|
+
response = connector.prepare_and_invoke_api_call "team/v1/teamrooms/#{self.id}", {:api_token=>@api_token, :api_key=>@api_key, :online=>online}, :method=>:get, :format=>'json'
|
32
|
+
json = JSON.parse(response)
|
33
|
+
RubyDesk::Snapshot.new(json['teamroom']['snapshot'])
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module RubyDesk
|
2
|
+
class User
|
3
|
+
|
4
|
+
attr_accessor :messenger_id, :timezone, :uid, :timezone_offset, :last_name,
|
5
|
+
:mail, :creation_time, :first_name
|
6
|
+
def initialize(params)
|
7
|
+
params.each do |k, v|
|
8
|
+
self.instance_variable_set("@#{k}", v)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/lib/ruby_desk.rb
CHANGED
@@ -1,96 +1,5 @@
|
|
1
|
-
|
1
|
+
module RubyDesk
|
2
|
+
end
|
2
3
|
|
3
|
-
|
4
|
-
|
5
|
-
ODESK_AUTH_URL = "www.odesk.com/services/api/auth/"
|
6
|
-
DEFAULT_OPTIONS = {:secure=>true, :sign=>true, :format=>'xml'}
|
7
|
-
|
8
|
-
def initialize(api_key=nil, api_secret=nil)
|
9
|
-
@api_key = api_key
|
10
|
-
@api_secret = api_secret
|
11
|
-
@api_key = "991ac77f4c202873b0ab88f11762370c"
|
12
|
-
@api_secret = "c3382d5902e5a7b0"
|
13
|
-
end
|
14
|
-
|
15
|
-
# Sign the given parameters and updates the given
|
16
|
-
def sign(params)
|
17
|
-
# sort parameters by its names (keys)
|
18
|
-
sorted_params = params.sort { |a, b| a.to_s <=> b.to_s}
|
19
|
-
|
20
|
-
# concatenate secret with names, values
|
21
|
-
concatenated = @api_secret + sorted_params.to_s
|
22
|
-
|
23
|
-
# Calculate md5 of concatenated string
|
24
|
-
md5 = Digest::MD5.hexdigest(concatenated)
|
25
|
-
|
26
|
-
# Return the calculated value as the signature
|
27
|
-
md5
|
28
|
-
end
|
29
|
-
|
30
|
-
# Returns the correct URL to go to to invoke the given api
|
31
|
-
# path: the path of the API to call. e.g. 'auth'
|
32
|
-
# params: a hash of parameters that needs to be appended
|
33
|
-
# options:
|
34
|
-
# * :secure=>false: Whether a secure connection is required or not.
|
35
|
-
# * :sign=>true: Whether you need to sign the parameters or not
|
36
|
-
def get_api_url(path, params = {}, options = {})
|
37
|
-
options = DEFAULT_OPTIONS.merge(options)
|
38
|
-
params[:api_sig] = sign(params) if options[:sign]
|
39
|
-
{:url=>"http#{options[:secure]? 's' : ''}://" + ODESK_API_URL + path + "." + options[:format],
|
40
|
-
:params=> params, :method=>options[:method]}
|
41
|
-
end
|
42
|
-
|
43
|
-
# Returns the URL that authenticates the application for the current user
|
44
|
-
def auth_url
|
45
|
-
params = {:api_key=>@api_key}
|
46
|
-
params[:api_sig] = sign(params)
|
47
|
-
"https://"+ODESK_AUTH_URL+"?"+params.to_a.map{|pair| pair.join '='}.join('&')
|
48
|
-
end
|
49
|
-
|
50
|
-
# return the URL that logs user out of odesk applications
|
51
|
-
def logout_url
|
52
|
-
"https://"+ODESK_AUTH_URL
|
53
|
-
end
|
54
|
-
|
55
|
-
# Returns an authentication frob.
|
56
|
-
# Parameters
|
57
|
-
# * frob
|
58
|
-
# * api_key
|
59
|
-
# * api_sig
|
60
|
-
#
|
61
|
-
# Return Data
|
62
|
-
# * token
|
63
|
-
def get_token_url(frob, options={})
|
64
|
-
get_api_url 'auth/v1/keys/tokens', {:frob=>frob, :api_key=>@api_key}, options.merge(:method=>:post)
|
65
|
-
end
|
66
|
-
|
67
|
-
# Returns an authentication frob.
|
68
|
-
#Parameters
|
69
|
-
# * api_key
|
70
|
-
# * api_sig
|
71
|
-
#
|
72
|
-
#Return Data
|
73
|
-
# * frob
|
74
|
-
|
75
|
-
def get_frob_url(options={})
|
76
|
-
get_api_url 'auth/v1/keys/frobs', {:api_key=>@api_key}, options.merge(:method=>:post)
|
77
|
-
end
|
78
|
-
|
79
|
-
#Returns the authenticated user associated with the given authorization token.
|
80
|
-
# Parameters
|
81
|
-
#
|
82
|
-
# * api_key
|
83
|
-
# * api_sig
|
84
|
-
# * api_token
|
85
|
-
#
|
86
|
-
# Return Data
|
87
|
-
#
|
88
|
-
# * token
|
89
|
-
def check_token_url(api_token, options={})
|
90
|
-
get_api_url 'auth/v1/keys/token', {:api_key=>@api_key, :api_token=>@api_token}, options.merge(:method=>:get)
|
91
|
-
end
|
92
|
-
|
93
|
-
def revoke_token_url(api_token, options={})
|
94
|
-
get_api_url 'auth/v1/keys/token', {:api_key=>@api_key, :api_token=>@api_token}, options.merge(:method=>:delete)
|
95
|
-
end
|
96
|
-
end
|
4
|
+
require 'ruby_desk/connector'
|
5
|
+
require 'ruby_desk/team_room'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_desk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ahmed ElDawy
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-01-
|
12
|
+
date: 2010-01-13 00:00:00 +02:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -23,13 +23,15 @@ extra_rdoc_files:
|
|
23
23
|
- LICENSE
|
24
24
|
- README.rdoc
|
25
25
|
files:
|
26
|
-
- .document
|
27
|
-
- .gitignore
|
28
26
|
- LICENSE
|
29
27
|
- README.rdoc
|
30
28
|
- Rakefile
|
31
29
|
- VERSION
|
32
30
|
- lib/ruby_desk.rb
|
31
|
+
- lib/ruby_desk/connector.rb
|
32
|
+
- lib/ruby_desk/snapshot.rb
|
33
|
+
- lib/ruby_desk/team_room.rb
|
34
|
+
- lib/ruby_desk/user.rb
|
33
35
|
- test/helper.rb
|
34
36
|
- test/test_ruby_desk.rb
|
35
37
|
has_rdoc: true
|
@@ -63,4 +65,3 @@ summary: Wrapper for oDesk APIs in Ruby
|
|
63
65
|
test_files:
|
64
66
|
- test/test_ruby_desk.rb
|
65
67
|
- test/helper.rb
|
66
|
-
- test/test.rb
|
data/.document
DELETED
data/.gitignore
DELETED
data/test/test.rb
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
require 'net/http'
|
2
|
-
require 'net/https'
|
3
|
-
require 'uri'
|
4
|
-
require 'open-uri'
|
5
|
-
require 'ruby_desk'
|
6
|
-
require 'rubygems'
|
7
|
-
require 'json'
|
8
|
-
|
9
|
-
rd = RubyDesk.new
|
10
|
-
|
11
|
-
get_frob = rd.get_frob_url(:format=>'json')
|
12
|
-
|
13
|
-
url = URI.parse(get_frob[:url])
|
14
|
-
|
15
|
-
http = Net::HTTP.new(url.host, url.port)
|
16
|
-
http.use_ssl = true
|
17
|
-
path = url.path
|
18
|
-
|
19
|
-
data = get_frob[:params].to_a.map{|pair| pair.join '='}.join('&')
|
20
|
-
headers = {
|
21
|
-
'Content-Type' => 'application/x-www-form-urlencoded'
|
22
|
-
}
|
23
|
-
|
24
|
-
resp, data = http.post(path, data, headers)
|
25
|
-
|
26
|
-
json = JSON.parse(data)
|
27
|
-
frob = json['frob']
|
28
|
-
|
29
|
-
get_token = rd.get_token_url(frob, :format=>'json')
|
30
|
-
|
31
|
-
url = URI.parse(get_token[:url])
|
32
|
-
|
33
|
-
path = url.path
|
34
|
-
|
35
|
-
data = get_frob[:params].to_a.map{|pair| pair.join '='}.join('&')
|
36
|
-
headers = {
|
37
|
-
'Content-Type' => 'application/x-www-form-urlencoded'
|
38
|
-
}
|
39
|
-
|
40
|
-
resp, data = http.post(path, data, headers)
|
41
|
-
|
42
|
-
json = JSON.parse(data)
|
43
|
-
|
44
|
-
puts json.inspect
|
45
|
-
|
46
|
-
puts open('https://www.odesk.com/api/team/v1/teamrooms')
|