tickspot_api 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/tickspot/data.rb +37 -0
- data/lib/tickspot/tickspot.rb +140 -0
- data/lib/tickspot_api.rb +5 -0
- data/spec/fixtures/clients.xml +19 -0
- data/spec/fixtures/clients_projects_tasks.xml +63 -0
- data/spec/fixtures/clients_projects_tasks.yml +37 -0
- data/spec/fixtures/create_entry.xml +48 -0
- data/spec/fixtures/not_auth.xml +13 -0
- data/spec/fixtures/projects.xml +67 -0
- data/spec/fixtures/projects.yml +44 -0
- data/spec/fixtures/recent_tasks.xml +15 -0
- data/spec/fixtures/recent_tasks.yml +9 -0
- data/spec/fixtures/tasks.xml +45 -0
- data/spec/fixtures/update_entry.xml +13 -0
- data/spec/fixtures/users.xml +31 -0
- data/spec/fixtures/users.yml +13 -0
- data/spec/gen_fixtures.rb +21 -0
- data/spec/spec_helper.rb +15 -0
- data/spec/test.yml +37 -0
- data/spec/tickspot_spec.rb +132 -0
- metadata +97 -0
@@ -0,0 +1,37 @@
|
|
1
|
+
module Tickspot
|
2
|
+
class Data
|
3
|
+
|
4
|
+
def initialize(parsed)
|
5
|
+
# @data = parsed
|
6
|
+
# raise unless parsed.class == Hash
|
7
|
+
@data = parsed#[parsed.keys.first]
|
8
|
+
end
|
9
|
+
|
10
|
+
def id
|
11
|
+
self.method_missing(:id)
|
12
|
+
end
|
13
|
+
|
14
|
+
# def empty?
|
15
|
+
# if @hash["type"] == "array" && @hash["content"] == "\n"
|
16
|
+
# true
|
17
|
+
# else
|
18
|
+
# false
|
19
|
+
# end
|
20
|
+
# end
|
21
|
+
|
22
|
+
def method_missing(method, *args)
|
23
|
+
puts "->#{method}, #{args}"
|
24
|
+
return Data.new(@data[args.first]) if @data.class == Array
|
25
|
+
if @data.has_key?(method.to_s)
|
26
|
+
entry = @data[method.to_s]
|
27
|
+
# return entry[0] unless entry[0].class == Hash && entry[0].has_key?("content")
|
28
|
+
# return entry[0]["content"]
|
29
|
+
# entry = Data.new(entry) if entry.class == Hash
|
30
|
+
entry
|
31
|
+
else
|
32
|
+
super
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,140 @@
|
|
1
|
+
require 'httparty'
|
2
|
+
|
3
|
+
module Tickspot
|
4
|
+
class Api
|
5
|
+
include HTTParty
|
6
|
+
format :xml
|
7
|
+
|
8
|
+
def initialize(site, u, p) #config = nil
|
9
|
+
@auth = {email: u, password: p}
|
10
|
+
self.class.base_uri "https://#{site}.tickspot.com"
|
11
|
+
# default_params :output => 'json'
|
12
|
+
|
13
|
+
# @cache = {}
|
14
|
+
# set_config(config) if config.nil?
|
15
|
+
# load_config(find_config) unless config.nil?
|
16
|
+
# @domain = config.company + "tickspot.com"
|
17
|
+
end
|
18
|
+
|
19
|
+
# def load_config filename
|
20
|
+
# raise "ERROR: Cannot find file #{filename}" unless File.exists? filename
|
21
|
+
# config = YAML.load_file(filename)
|
22
|
+
|
23
|
+
# @ts = Tickspot.new "#{config['company']}.tickspot.com", config['email'], config['password']
|
24
|
+
# conf.save_file @config_file
|
25
|
+
# YAML::dump(conf, @config_file)
|
26
|
+
# end
|
27
|
+
|
28
|
+
# def find_config
|
29
|
+
# search current dir and up
|
30
|
+
# '~/.tickconfig'
|
31
|
+
# end
|
32
|
+
|
33
|
+
# def set_config config
|
34
|
+
# raise 'Incorrect params' unless config.company and config.email and config.password
|
35
|
+
# @company = config['company'] if config.has_key? 'company'
|
36
|
+
# @email = config['email'] if config.has_key? 'email'
|
37
|
+
# @password = config['password'] if config.has_key? 'password'
|
38
|
+
# end
|
39
|
+
|
40
|
+
# http://tickspot.com/api/
|
41
|
+
# The API response is wrapped within a top level XML node which normally matches the method name
|
42
|
+
# but on some methods it differs
|
43
|
+
|
44
|
+
# Optional : :open [true|false]
|
45
|
+
def clients optional_params = {}
|
46
|
+
request('clients', optional_params)['clients']
|
47
|
+
end
|
48
|
+
|
49
|
+
# Optional : :project_id, :open [true|false], :project_billable [true|false]
|
50
|
+
def projects optional_params = {}
|
51
|
+
request('projects', optional_params)['projects']
|
52
|
+
end
|
53
|
+
|
54
|
+
# Required : :project_id
|
55
|
+
# Optional : :task_id, :open [true|false], :task_billable [true|false]
|
56
|
+
def tasks required_params, optional_params = {}
|
57
|
+
check required_params, [:project_id]
|
58
|
+
# check optional_params, [:task_id, :open, :task_billable], false
|
59
|
+
request('tasks', required_params.merge(optional_params))['tasks']
|
60
|
+
end
|
61
|
+
|
62
|
+
def clients_projects_tasks optional_params = {}
|
63
|
+
request('clients_projects_tasks', optional_params)['clients']
|
64
|
+
end
|
65
|
+
|
66
|
+
# Required : :start_date, :end_date OR :updated_at
|
67
|
+
# Optional : :project_id, :task_id, :user_id, :user_email, :client_id, :entry_billable [true|false], :billed [true|false]
|
68
|
+
def entries required_params, optional_params = {}
|
69
|
+
check required_params, [:start_date, :end_date]
|
70
|
+
# updated_at
|
71
|
+
request('entries', required_params.merge(optional_params))['entries']
|
72
|
+
end
|
73
|
+
|
74
|
+
def recent_tasks optional_params = {}
|
75
|
+
request('recent_tasks', optional_params)['tasks']
|
76
|
+
end
|
77
|
+
|
78
|
+
# Optional : :project_id
|
79
|
+
def users optional_params = {}
|
80
|
+
request('users', optional_params)['users']
|
81
|
+
end
|
82
|
+
|
83
|
+
# Required : :task_id, :hours, :date
|
84
|
+
# Optional : :notes
|
85
|
+
def create_entry required_params, optional_params = {}
|
86
|
+
check required_params, [:task_id, :hours, :date]
|
87
|
+
request('entry', required_params.merge(optional_params))['entry']
|
88
|
+
end
|
89
|
+
|
90
|
+
# Required : :id
|
91
|
+
# Optional : :hours, :date, :billed, :task_id, :user_id, :notes
|
92
|
+
def update_entry required_params, optional_params = {}
|
93
|
+
check required_params, [:id]
|
94
|
+
request('create_entry', required_params.merge(optional_params))['entry']
|
95
|
+
end
|
96
|
+
|
97
|
+
# private
|
98
|
+
|
99
|
+
def request method, params
|
100
|
+
# optional_params.delete 'reload'
|
101
|
+
# if !@cache.has_key?(method) || (params.has_key?('reload') && params['reload'] == true) # refresh/force/
|
102
|
+
# save cache on every access, load before reading
|
103
|
+
ret = self.class.post("/api/#{method}", :query => @auth.merge(params))
|
104
|
+
# raise Unauthorized if response.is_a? Net::HTTPUnauthorized
|
105
|
+
# ret = @cache[method]
|
106
|
+
# ret = Data.new @cache[method]['users']
|
107
|
+
# ret = Data.new @cache[method]
|
108
|
+
# @cache[method] = request_result
|
109
|
+
# end
|
110
|
+
ret
|
111
|
+
end
|
112
|
+
|
113
|
+
def check hash, keys
|
114
|
+
#, optional = false
|
115
|
+
expecting = "expecting one of '#{keys}'"
|
116
|
+
raise "Must be a hash, #{expecting}" unless hash.is_a? Hash
|
117
|
+
keys.each do |key|
|
118
|
+
msg = "Required parameter missing : #{key}, #{expecting}"
|
119
|
+
raise msg unless hash.has_key?(key)
|
120
|
+
#and optional
|
121
|
+
return unless hash.has_key?(key)
|
122
|
+
#and optional
|
123
|
+
end
|
124
|
+
true
|
125
|
+
end
|
126
|
+
|
127
|
+
class Unauthorized < RuntimeError
|
128
|
+
def message
|
129
|
+
"You are not authorized to perform this action. If your login information is correct, you may be calling at admin-only action. See http://tickspot.com/api/ for more information."
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
class IncorrectParam < RuntimeError
|
134
|
+
def message(p)
|
135
|
+
"#{p}"
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
end
|
140
|
+
end
|
data/lib/tickspot_api.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
HTTP/1.1 200 OK
|
2
|
+
Date: Sat, 19 May 2012 14:46:43 GMT
|
3
|
+
Server: Apache/2.2.9 (Ubuntu) Phusion_Passenger/3.0.11 mod_ssl/2.2.9 OpenSSL/0.9.8g
|
4
|
+
X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 3.0.11
|
5
|
+
ETag: "cf7f9ff83de2674ddf4a9eb8389e5cb8"
|
6
|
+
X-Runtime: 5
|
7
|
+
Cache-Control: private, max-age=0, must-revalidate
|
8
|
+
Content-Length: 160
|
9
|
+
Status: 200
|
10
|
+
Connection: close
|
11
|
+
Content-Type: application/xml; charset=utf-8
|
12
|
+
|
13
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
14
|
+
<clients type="array">
|
15
|
+
<client>
|
16
|
+
<id type="integer">128542</id>
|
17
|
+
<name>TestClient2</name>
|
18
|
+
</client>
|
19
|
+
</clients>
|
@@ -0,0 +1,63 @@
|
|
1
|
+
HTTP/1.1 200 OK
|
2
|
+
Date: Sat, 19 May 2012 14:46:46 GMT
|
3
|
+
Server: Apache/2.2.9 (Ubuntu) Phusion_Passenger/3.0.11 mod_ssl/2.2.9 OpenSSL/0.9.8g
|
4
|
+
X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 3.0.11
|
5
|
+
ETag: "11fd1b0d8276fd96cc2a4332ca7cdb5c"
|
6
|
+
X-Runtime: 11
|
7
|
+
Cache-Control: private, max-age=0, must-revalidate
|
8
|
+
Content-Length: 2082
|
9
|
+
Status: 200
|
10
|
+
Connection: close
|
11
|
+
Content-Type: application/xml; charset=utf-8
|
12
|
+
|
13
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
14
|
+
<clients type="array">
|
15
|
+
<client>
|
16
|
+
<id type="integer">128542</id>
|
17
|
+
<name>TestClient2</name>
|
18
|
+
<projects type="array">
|
19
|
+
<project>
|
20
|
+
<id type="integer">408314</id>
|
21
|
+
<name type="text">TestClient-TestProject</name>
|
22
|
+
<budget type="float">100.00</budget>
|
23
|
+
<client_id type="integer">128542</client_id>
|
24
|
+
<opened_on type="date">2012-05-14</opened_on>
|
25
|
+
<closed_on type="date"></closed_on>
|
26
|
+
<created_at type="datetime">Mon, 14 May 2012 02:44:46 -0400</created_at>
|
27
|
+
<updated_at type="datetime">Mon, 14 May 2012 02:49:57 -0400</updated_at>
|
28
|
+
<tasks type="array">
|
29
|
+
<task>
|
30
|
+
<id type="integer">2162941</id>
|
31
|
+
<name>TestClient-TestProject-TestTask1</name>
|
32
|
+
<position type="integer">1</position>
|
33
|
+
<project_id type="integer">408314</project_id>
|
34
|
+
<opened_on type="date">2012-05-14</opened_on>
|
35
|
+
<closed_on type="date"></closed_on>
|
36
|
+
<budget type="float">10.00</budget>
|
37
|
+
<billable type="boolean"></billable>
|
38
|
+
</task>
|
39
|
+
<task>
|
40
|
+
<id type="integer">2162942</id>
|
41
|
+
<name>TestClient-TestProject-TestTask2</name>
|
42
|
+
<position type="integer">2</position>
|
43
|
+
<project_id type="integer">408314</project_id>
|
44
|
+
<opened_on type="date">2012-05-14</opened_on>
|
45
|
+
<closed_on type="date"></closed_on>
|
46
|
+
<budget type="float">90.00</budget>
|
47
|
+
<billable type="boolean"></billable>
|
48
|
+
</task>
|
49
|
+
<task>
|
50
|
+
<id type="integer">2162943</id>
|
51
|
+
<name>TestClient-TestProject-TestTask3</name>
|
52
|
+
<position type="integer">3</position>
|
53
|
+
<project_id type="integer">408314</project_id>
|
54
|
+
<opened_on type="date">2012-05-14</opened_on>
|
55
|
+
<closed_on type="date"></closed_on>
|
56
|
+
<budget type="float">0.00</budget>
|
57
|
+
<billable type="boolean"></billable>
|
58
|
+
</task>
|
59
|
+
</tasks>
|
60
|
+
</project>
|
61
|
+
</projects>
|
62
|
+
</client>
|
63
|
+
</clients>
|
@@ -0,0 +1,37 @@
|
|
1
|
+
---
|
2
|
+
- id: 128542
|
3
|
+
name: TestClient2
|
4
|
+
projects:
|
5
|
+
- id: 408314
|
6
|
+
name: TestClient-TestProject
|
7
|
+
budget: 100.0
|
8
|
+
client_id: 128542
|
9
|
+
opened_on: 2012-05-14
|
10
|
+
closed_on:
|
11
|
+
created_at: 2012-05-14 06:44:46.000000000 Z
|
12
|
+
updated_at: 2012-05-14 06:49:57.000000000 Z
|
13
|
+
tasks:
|
14
|
+
- id: 2162941
|
15
|
+
name: TestClient-TestProject-TestTask1
|
16
|
+
position: 1
|
17
|
+
project_id: 408314
|
18
|
+
opened_on: 2012-05-14
|
19
|
+
closed_on:
|
20
|
+
budget: 10.0
|
21
|
+
billable:
|
22
|
+
- id: 2162942
|
23
|
+
name: TestClient-TestProject-TestTask2
|
24
|
+
position: 2
|
25
|
+
project_id: 408314
|
26
|
+
opened_on: 2012-05-14
|
27
|
+
closed_on:
|
28
|
+
budget: 90.0
|
29
|
+
billable:
|
30
|
+
- id: 2162943
|
31
|
+
name: TestClient-TestProject-TestTask3
|
32
|
+
position: 3
|
33
|
+
project_id: 408314
|
34
|
+
opened_on: 2012-05-14
|
35
|
+
closed_on:
|
36
|
+
budget: 0.0
|
37
|
+
billable:
|
@@ -0,0 +1,48 @@
|
|
1
|
+
HTTP/1.1 200 OK
|
2
|
+
Date: Sat, 19 May 2012 14:53:59 GMT
|
3
|
+
Server: Apache/2.2.9 (Ubuntu) Phusion_Passenger/3.0.11 mod_ssl/2.2.9 OpenSSL/0.9.8g
|
4
|
+
X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 3.0.11
|
5
|
+
ETag: "53e653461f8eae95665a3b4ef8f4f31d"
|
6
|
+
X-Runtime: 16
|
7
|
+
Cache-Control: private, max-age=0, must-revalidate
|
8
|
+
Content-Length: 1449
|
9
|
+
Status: 200
|
10
|
+
Connection: close
|
11
|
+
Content-Type: application/xml; charset=utf-8
|
12
|
+
|
13
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
14
|
+
<entry>
|
15
|
+
<id type="integer">13372505</id>
|
16
|
+
<task_id type="integer">2162941</task_id>
|
17
|
+
<user_id type="integer">86580</user_id>
|
18
|
+
<date type="date">2012-05-19</date>
|
19
|
+
<hours type="float">1.00</hours>
|
20
|
+
<notes></notes>
|
21
|
+
<created_at type="datetime">Sat, 19 May 2012 10:53:59 -0400</created_at>
|
22
|
+
<updated_at type="datetime">Sat, 19 May 2012 10:53:59 -0400</updated_at>
|
23
|
+
<user_email type="text">tickspot@ianvaughan.co.uk</user_email>
|
24
|
+
<task>
|
25
|
+
<id type="integer">2162941</id>
|
26
|
+
<name>TestClient-TestProject-TestTask1</name>
|
27
|
+
<position type="integer">1</position>
|
28
|
+
<project_id type="integer">408314</project_id>
|
29
|
+
<opened_on type="date">2012-05-14</opened_on>
|
30
|
+
<closed_on type="date"></closed_on>
|
31
|
+
<budget type="float">10.00</budget>
|
32
|
+
<billable type="boolean">true</billable>
|
33
|
+
<total_hours>1.00</total_hours>
|
34
|
+
<user_count>1</user_count>
|
35
|
+
</task>
|
36
|
+
<project>
|
37
|
+
<id type="integer">408314</id>
|
38
|
+
<name>TestClient-TestProject</name>
|
39
|
+
<budget type="float">100.00</budget>
|
40
|
+
<client_id type="integer">128542</client_id>
|
41
|
+
<opened_on type="date">2012-05-14</opened_on>
|
42
|
+
<closed_on type="date"></closed_on>
|
43
|
+
<created_at type="datetime">Mon, 14 May 2012 02:44:46 -0400</created_at>
|
44
|
+
<updated_at type="datetime">Mon, 14 May 2012 02:49:57 -0400</updated_at>
|
45
|
+
<total_hours type="float">1.00</total_hours>
|
46
|
+
<client_name>TestClient2</client_name>
|
47
|
+
</project>
|
48
|
+
</entry>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
HTTP/1.1 401 Authorization Required
|
2
|
+
Date: Sat, 19 May 2012 14:44:16 GMT
|
3
|
+
Server: Apache/2.2.9 (Ubuntu) Phusion_Passenger/3.0.11 mod_ssl/2.2.9 OpenSSL/0.9.8g
|
4
|
+
X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 3.0.11
|
5
|
+
X-Runtime: 1
|
6
|
+
Cache-Control: no-cache
|
7
|
+
Content-Length: 43
|
8
|
+
Status: 401
|
9
|
+
Vary: Accept-Encoding
|
10
|
+
Connection: close
|
11
|
+
Content-Type: text/html; charset=utf-8
|
12
|
+
|
13
|
+
The user information provided is not valid.
|
@@ -0,0 +1,67 @@
|
|
1
|
+
HTTP/1.1 200 OK
|
2
|
+
Date: Sat, 19 May 2012 14:46:45 GMT
|
3
|
+
Server: Apache/2.2.9 (Ubuntu) Phusion_Passenger/3.0.11 mod_ssl/2.2.9 OpenSSL/0.9.8g
|
4
|
+
X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 3.0.11
|
5
|
+
ETag: "4983022a23b3e64874dcac888b5a6e25"
|
6
|
+
X-Runtime: 13
|
7
|
+
Cache-Control: private, max-age=0, must-revalidate
|
8
|
+
Content-Length: 2262
|
9
|
+
Status: 200
|
10
|
+
Connection: close
|
11
|
+
Content-Type: application/xml; charset=utf-8
|
12
|
+
|
13
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
14
|
+
<projects type="array">
|
15
|
+
<project>
|
16
|
+
<id type="integer">408314</id>
|
17
|
+
<name>TestClient-TestProject</name>
|
18
|
+
<budget type="float">100.00</budget>
|
19
|
+
<client_id type="integer">128542</client_id>
|
20
|
+
<owner_id type="integer">86580</owner_id>
|
21
|
+
<opened_on type="date">2012-05-14</opened_on>
|
22
|
+
<closed_on type="date"></closed_on>
|
23
|
+
<created_at type="datetime">Mon, 14 May 2012 02:44:46 -0400</created_at>
|
24
|
+
<updated_at type="datetime">Mon, 14 May 2012 02:49:57 -0400</updated_at>
|
25
|
+
<client_name>TestClient2</client_name>
|
26
|
+
<sum_hours type="float">0.00</sum_hours>
|
27
|
+
<user_count type="integer">0</user_count>
|
28
|
+
<tasks type="array">
|
29
|
+
<task>
|
30
|
+
<id type="integer">2162941</id>
|
31
|
+
<name>TestClient-TestProject-TestTask1</name>
|
32
|
+
<position type="integer">1</position>
|
33
|
+
<project_id type="integer">408314</project_id>
|
34
|
+
<opened_on type="date">2012-05-14</opened_on>
|
35
|
+
<closed_on type="date"></closed_on>
|
36
|
+
<budget type="float">10.00</budget>
|
37
|
+
<billable type="boolean">true</billable>
|
38
|
+
<sum_hours type="float">0.00</sum_hours>
|
39
|
+
<user_count type="integer">0</user_count>
|
40
|
+
</task>
|
41
|
+
<task>
|
42
|
+
<id type="integer">2162942</id>
|
43
|
+
<name>TestClient-TestProject-TestTask2</name>
|
44
|
+
<position type="integer">2</position>
|
45
|
+
<project_id type="integer">408314</project_id>
|
46
|
+
<opened_on type="date">2012-05-14</opened_on>
|
47
|
+
<closed_on type="date"></closed_on>
|
48
|
+
<budget type="float">90.00</budget>
|
49
|
+
<billable type="boolean">true</billable>
|
50
|
+
<sum_hours type="float">0.00</sum_hours>
|
51
|
+
<user_count type="integer">0</user_count>
|
52
|
+
</task>
|
53
|
+
<task>
|
54
|
+
<id type="integer">2162943</id>
|
55
|
+
<name>TestClient-TestProject-TestTask3</name>
|
56
|
+
<position type="integer">3</position>
|
57
|
+
<project_id type="integer">408314</project_id>
|
58
|
+
<opened_on type="date">2012-05-14</opened_on>
|
59
|
+
<closed_on type="date"></closed_on>
|
60
|
+
<budget type="float">0.00</budget>
|
61
|
+
<billable type="boolean">true</billable>
|
62
|
+
<sum_hours type="float">0.00</sum_hours>
|
63
|
+
<user_count type="integer">0</user_count>
|
64
|
+
</task>
|
65
|
+
</tasks>
|
66
|
+
</project>
|
67
|
+
</projects>
|
@@ -0,0 +1,44 @@
|
|
1
|
+
---
|
2
|
+
- id: 408314
|
3
|
+
name: TestClient-TestProject
|
4
|
+
budget: 100.0
|
5
|
+
client_id: 128542
|
6
|
+
owner_id: 86580
|
7
|
+
opened_on: 2012-05-14
|
8
|
+
closed_on:
|
9
|
+
created_at: 2012-05-14 06:44:46.000000000 Z
|
10
|
+
updated_at: 2012-05-14 06:49:57.000000000 Z
|
11
|
+
client_name: TestClient2
|
12
|
+
sum_hours: 1.0
|
13
|
+
user_count: 1
|
14
|
+
tasks:
|
15
|
+
- id: 2162941
|
16
|
+
name: TestClient-TestProject-TestTask1
|
17
|
+
position: 1
|
18
|
+
project_id: 408314
|
19
|
+
opened_on: 2012-05-14
|
20
|
+
closed_on:
|
21
|
+
budget: 10.0
|
22
|
+
billable: true
|
23
|
+
sum_hours: 1.0
|
24
|
+
user_count: 1
|
25
|
+
- id: 2162942
|
26
|
+
name: TestClient-TestProject-TestTask2
|
27
|
+
position: 2
|
28
|
+
project_id: 408314
|
29
|
+
opened_on: 2012-05-14
|
30
|
+
closed_on:
|
31
|
+
budget: 90.0
|
32
|
+
billable: true
|
33
|
+
sum_hours: 0.0
|
34
|
+
user_count: 0
|
35
|
+
- id: 2162943
|
36
|
+
name: TestClient-TestProject-TestTask3
|
37
|
+
position: 3
|
38
|
+
project_id: 408314
|
39
|
+
opened_on: 2012-05-14
|
40
|
+
closed_on:
|
41
|
+
budget: 0.0
|
42
|
+
billable: true
|
43
|
+
sum_hours: 0.0
|
44
|
+
user_count: 0
|
@@ -0,0 +1,15 @@
|
|
1
|
+
HTTP/1.1 200 OK
|
2
|
+
Date: Sat, 19 May 2012 14:50:27 GMT
|
3
|
+
Server: Apache/2.2.9 (Ubuntu) Phusion_Passenger/3.0.11 mod_ssl/2.2.9 OpenSSL/0.9.8g
|
4
|
+
X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 3.0.11
|
5
|
+
ETag: "07c22d37714abcccbac7ce5bc330498f"
|
6
|
+
X-Runtime: 4
|
7
|
+
Cache-Control: private, max-age=0, must-revalidate
|
8
|
+
Content-Length: 69
|
9
|
+
Status: 200
|
10
|
+
Connection: close
|
11
|
+
Content-Type: application/xml; charset=utf-8
|
12
|
+
|
13
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
14
|
+
<tasks type="array">
|
15
|
+
</tasks>
|
@@ -0,0 +1,45 @@
|
|
1
|
+
HTTP/1.1 200 OK
|
2
|
+
Date: Sat, 19 May 2012 14:48:31 GMT
|
3
|
+
Server: Apache/2.2.9 (Ubuntu) Phusion_Passenger/3.0.11 mod_ssl/2.2.9 OpenSSL/0.9.8g
|
4
|
+
X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 3.0.11
|
5
|
+
ETag: "7f4bc0c9b4c4c30f4b6997f7f115ad20"
|
6
|
+
X-Runtime: 9
|
7
|
+
Cache-Control: private, max-age=0, must-revalidate
|
8
|
+
Content-Length: 1187
|
9
|
+
Status: 200
|
10
|
+
Connection: close
|
11
|
+
Content-Type: application/xml; charset=utf-8
|
12
|
+
|
13
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
14
|
+
<tasks type="array">
|
15
|
+
<task>
|
16
|
+
<id type="integer">2162941</id>
|
17
|
+
<name>TestClient-TestProject-TestTask1</name>
|
18
|
+
<position type="integer">1</position>
|
19
|
+
<project_id type="integer">408314</project_id>
|
20
|
+
<opened_on type="date">2012-05-14</opened_on>
|
21
|
+
<closed_on type="date"></closed_on>
|
22
|
+
<budget type="float">10.00</budget>
|
23
|
+
<billable type="boolean">true</billable>
|
24
|
+
</task>
|
25
|
+
<task>
|
26
|
+
<id type="integer">2162942</id>
|
27
|
+
<name>TestClient-TestProject-TestTask2</name>
|
28
|
+
<position type="integer">2</position>
|
29
|
+
<project_id type="integer">408314</project_id>
|
30
|
+
<opened_on type="date">2012-05-14</opened_on>
|
31
|
+
<closed_on type="date"></closed_on>
|
32
|
+
<budget type="float">90.00</budget>
|
33
|
+
<billable type="boolean">true</billable>
|
34
|
+
</task>
|
35
|
+
<task>
|
36
|
+
<id type="integer">2162943</id>
|
37
|
+
<name>TestClient-TestProject-TestTask3</name>
|
38
|
+
<position type="integer">3</position>
|
39
|
+
<project_id type="integer">408314</project_id>
|
40
|
+
<opened_on type="date">2012-05-14</opened_on>
|
41
|
+
<closed_on type="date"></closed_on>
|
42
|
+
<budget type="float">0.00</budget>
|
43
|
+
<billable type="boolean">true</billable>
|
44
|
+
</task>
|
45
|
+
</tasks>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
HTTP/1.1 200 OK
|
2
|
+
Date: Sat, 19 May 2012 14:56:21 GMT
|
3
|
+
Server: Apache/2.2.9 (Ubuntu) Phusion_Passenger/3.0.11 mod_ssl/2.2.9 OpenSSL/0.9.8g
|
4
|
+
X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 3.0.11
|
5
|
+
X-Runtime: 12
|
6
|
+
Cache-Control: no-cache
|
7
|
+
Content-Length: 1
|
8
|
+
Status: 200
|
9
|
+
Vary: Accept-Encoding
|
10
|
+
Connection: close
|
11
|
+
Content-Type: text/html; charset=utf-8
|
12
|
+
|
13
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
HTTP/1.1 200 OK
|
2
|
+
Date: Sat, 19 May 2012 14:46:44 GMT
|
3
|
+
Server: Apache/2.2.9 (Ubuntu) Phusion_Passenger/3.0.11 mod_ssl/2.2.9 OpenSSL/0.9.8g
|
4
|
+
X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 3.0.11
|
5
|
+
ETag: "8f56151c33771f6b04d474fb81cc5e58"
|
6
|
+
X-Runtime: 6
|
7
|
+
Cache-Control: private, max-age=0, must-revalidate
|
8
|
+
Content-Length: 755
|
9
|
+
Status: 200
|
10
|
+
Connection: close
|
11
|
+
Content-Type: application/xml; charset=utf-8
|
12
|
+
|
13
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
14
|
+
<users type="array">
|
15
|
+
<user>
|
16
|
+
<id type="integer">86580</id>
|
17
|
+
<first_name>Ian</first_name>
|
18
|
+
<last_name>Vaughan</last_name>
|
19
|
+
<email>tickspot@ianvaughan.co.uk</email>
|
20
|
+
<created_at type="datetime">Mon, 14 May 2012 02:41:23 -0400</created_at>
|
21
|
+
<updated_at type="datetime">Mon, 14 May 2012 02:43:06 -0400</updated_at>
|
22
|
+
</user>
|
23
|
+
<user>
|
24
|
+
<id type="integer">86583</id>
|
25
|
+
<first_name>TickSpotTestUser-FirstName</first_name>
|
26
|
+
<last_name>TickSpotTestUser-LastName</last_name>
|
27
|
+
<email>tickspot-test@ianvaughan.co.uk</email>
|
28
|
+
<created_at type="datetime">Mon, 14 May 2012 02:51:24 -0400</created_at>
|
29
|
+
<updated_at type="datetime">Mon, 14 May 2012 02:57:57 -0400</updated_at>
|
30
|
+
</user>
|
31
|
+
</users>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
---
|
2
|
+
- id: 86580
|
3
|
+
first_name: Ian
|
4
|
+
last_name: Vaughan
|
5
|
+
email: tickspot@ianvaughan.co.uk
|
6
|
+
created_at: 2012-05-14 06:41:23.000000000 Z
|
7
|
+
updated_at: 2012-05-14 06:43:06.000000000 Z
|
8
|
+
- id: 86583
|
9
|
+
first_name: TickSpotTestUser-FirstName
|
10
|
+
last_name: TickSpotTestUser-LastName
|
11
|
+
email: tickspot-test@ianvaughan.co.uk
|
12
|
+
created_at: 2012-05-14 06:51:24.000000000 Z
|
13
|
+
updated_at: 2012-05-14 06:57:57.000000000 Z
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require './lib/tickspot'
|
2
|
+
TS = Tickspot::Api.new 'company', 'email', 'password'
|
3
|
+
|
4
|
+
def save name
|
5
|
+
File.open("spec/fixtures/#{name}.yml", 'w') do |f|
|
6
|
+
yield f
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def access method
|
11
|
+
save method do |f|
|
12
|
+
YAML.dump TS.send(method), f
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
%w{users projects clients_projects_tasks recent_tasks}.each do |m|
|
17
|
+
access m
|
18
|
+
end
|
19
|
+
|
20
|
+
# ts.tasks
|
21
|
+
# ts.entries
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
require 'rspec/autorun'
|
3
|
+
|
4
|
+
require 'fakeweb'
|
5
|
+
|
6
|
+
FakeWeb.allow_net_connect = false
|
7
|
+
|
8
|
+
RSpec.configure do |c|
|
9
|
+
# c.mock_with :rspec
|
10
|
+
|
11
|
+
# def fixture(filename)
|
12
|
+
# File.dirname(__FILE__) + '/fixtures/' + filename
|
13
|
+
# end
|
14
|
+
|
15
|
+
end
|
data/spec/test.yml
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
---
|
2
|
+
- id: 128542
|
3
|
+
name: TestClient2
|
4
|
+
projects:
|
5
|
+
- id: 408314
|
6
|
+
name: TestClient-TestProject
|
7
|
+
budget: 100.0
|
8
|
+
client_id: 128542
|
9
|
+
opened_on: 2012-05-14
|
10
|
+
closed_on:
|
11
|
+
created_at: 2012-05-14 06:44:46.000000000 Z
|
12
|
+
updated_at: 2012-05-14 06:49:57.000000000 Z
|
13
|
+
tasks:
|
14
|
+
- id: 2162941
|
15
|
+
name: TestClient-TestProject-TestTask1
|
16
|
+
position: 1
|
17
|
+
project_id: 408314
|
18
|
+
opened_on: 2012-05-14
|
19
|
+
closed_on:
|
20
|
+
budget: 10.0
|
21
|
+
billable:
|
22
|
+
- id: 2162942
|
23
|
+
name: TestClient-TestProject-TestTask2
|
24
|
+
position: 2
|
25
|
+
project_id: 408314
|
26
|
+
opened_on: 2012-05-14
|
27
|
+
closed_on:
|
28
|
+
budget: 90.0
|
29
|
+
billable:
|
30
|
+
- id: 2162943
|
31
|
+
name: TestClient-TestProject-TestTask3
|
32
|
+
position: 3
|
33
|
+
project_id: 408314
|
34
|
+
opened_on: 2012-05-14
|
35
|
+
closed_on:
|
36
|
+
budget: 0.0
|
37
|
+
billable:
|
@@ -0,0 +1,132 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require './lib/tickspot'
|
3
|
+
|
4
|
+
module Tickspot
|
5
|
+
describe Api do
|
6
|
+
|
7
|
+
context 'init' do
|
8
|
+
# it 'should init the object data' do
|
9
|
+
# # Api.expects.base_uri = "https://company.tickspot.com"
|
10
|
+
# # Api.expects.auth = {email: u, password: p}
|
11
|
+
end
|
12
|
+
|
13
|
+
context 'helpers' do
|
14
|
+
|
15
|
+
before do
|
16
|
+
@ts = Api.new '', '', ''
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should check params' do
|
20
|
+
@ts.check({:id => 1, :name => 'foo'}, [:id]).should be_true
|
21
|
+
@ts.check({:id => 1, :name => 'foo'}, [:id, :name]).should be_true
|
22
|
+
@ts.check({:id => 1, :name => 'foo', :foo => 'bar'}, [:id, :name]).should be_true
|
23
|
+
lambda {
|
24
|
+
@ts.check({:id => 1, :name => 'foo'}, [:id, :name, :foo])
|
25
|
+
}.should raise_error
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'requests' do
|
30
|
+
before do
|
31
|
+
@c = 'company'
|
32
|
+
@u = 'user@email.com'
|
33
|
+
@p = 'password'
|
34
|
+
@ts = Api.new @c, @u, @p
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should request tickspot' do
|
38
|
+
# request = "https://#{@c}.tickspot.com/api/clients?email=#{@u}&password=#{@p}"
|
39
|
+
request = %r{https://company.tickspot.com/api/clients}
|
40
|
+
FakeWeb.register_uri(:post, request, :response => File.join(File.dirname(__FILE__), 'fixtures', 'clients.xml')) # body: 'hi')
|
41
|
+
|
42
|
+
result = {"clients"=>[{"id"=>128542, "name"=>"TestClient2"}]}
|
43
|
+
@ts.request('clients', {}).should eq result
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'should do a post request with the parameters' do
|
47
|
+
# HTTParty.any_instance.
|
48
|
+
Api.should_receive(:post).with(
|
49
|
+
# https://#{@c}.tickspot.com
|
50
|
+
"/api/test",
|
51
|
+
:query => {
|
52
|
+
:email => @u,
|
53
|
+
:password => @p
|
54
|
+
}
|
55
|
+
).and_return()#@result)
|
56
|
+
|
57
|
+
@ts.request('test', {})
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should pass every argument in the query hash' do
|
61
|
+
Api.should_receive(:post).with(
|
62
|
+
'/api/test',
|
63
|
+
:query => {
|
64
|
+
:email => @u,
|
65
|
+
:password => @p,
|
66
|
+
:woo => 'bleh'
|
67
|
+
}
|
68
|
+
).and_return(@result)
|
69
|
+
|
70
|
+
@ts.request('test', :woo => 'bleh')
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'should strip the top level node' do
|
74
|
+
pending
|
75
|
+
# HTTParty
|
76
|
+
Api.stub!(:post).and_return(@result)
|
77
|
+
|
78
|
+
@ts.request('test', {}).should == []
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context 'methods' do
|
83
|
+
|
84
|
+
before do
|
85
|
+
c = 'company'
|
86
|
+
u = 'user@email.com'
|
87
|
+
p = 'password'
|
88
|
+
@ts = Api.new c, u, p
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'should get clients' do
|
92
|
+
h = {'clients' => [{ 'id' => 128542, 'name' => 'TestClient2' }] }
|
93
|
+
@ts.stub(:request).and_return(h)
|
94
|
+
|
95
|
+
@ts.clients.should eq h['clients']
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'should get clients with options' do
|
99
|
+
h = {'clients' => [{ 'id' => 128542, 'name' => 'TestClient2' }] }
|
100
|
+
# should_recive {:open => true}
|
101
|
+
@ts.stub(:request).and_return(h)
|
102
|
+
|
103
|
+
@ts.clients('open').should eq h['clients']
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'should get clients_projects_tasks' do
|
107
|
+
# h = {"clients"=>[{"id"=>128542, "name"=>"TestClient2", "projects"=>[{"id"=>408314, "name"=>"TestClient-TestProject", "budget"=>100.0, "client_id"=>128542, "opened_on"=>#<Date: 2012-05-14 ((2456062j,0s,0n),+0s,2299161j)>, "closed_on"=>nil, "created_at"=>2012-05-14 06:44:46 UTC, "updated_at"=>2012-05-14 06:49:57 UTC, "tasks"=>[{"id"=>2162941, "name"=>"TestClient-TestProject-TestTask1", "position"=>1, "project_id"=>408314, "opened_on"=>#<Date: 2012-05-14 ((2456062j,0s,0n),+0s,2299161j)>, "closed_on"=>nil, "budget"=>10.0, "billable"=>nil}, {"id"=>2162942, "name"=>"TestClient-TestProject-TestTask2", "position"=>2, "project_id"=>408314, "opened_on"=>#<Date: 2012-05-14 ((2456062j,0s,0n),+0s,2299161j)>, "closed_on"=>nil, "budget"=>90.0, "billable"=>nil}, {"id"=>2162943, "name"=>"TestClient-TestProject-TestTask3", "position"=>3, "project_id"=>408314, "opened_on"=>#<Date: 2012-05-14 ((2456062j,0s,0n),+0s,2299161j)>, "closed_on"=>nil, "budget"=>0.0, "billable"=>nil}]}]}]}
|
108
|
+
h = {"clients"=>[{"id"=>128542, "name"=>"TestClient2", "projects"=>[{"id"=>408314, "name"=>"TestClient-TestProject", "budget"=>100.0, "client_id"=>128542, "opened_on"=>0, "closed_on"=>nil, "created_at"=>0, "updated_at"=>0, "tasks"=>[{"id"=>2162941, "name"=>"TestClient-TestProject-TestTask1", "position"=>1, "project_id"=>408314, "opened_on"=>0, "closed_on"=>nil, "budget"=>10.0, "billable"=>nil}, {"id"=>2162942, "name"=>"TestClient-TestProject-TestTask2", "position"=>2, "project_id"=>408314, "opened_on"=>0, "closed_on"=>nil, "budget"=>90.0, "billable"=>nil}, {"id"=>2162943, "name"=>"TestClient-TestProject-TestTask3", "position"=>3, "project_id"=>408314, "opened_on"=>0, "closed_on"=>nil, "budget"=>0.0, "billable"=>nil}]}]}]}
|
109
|
+
@ts.stub(:request).and_return(h)
|
110
|
+
|
111
|
+
@ts.clients_projects_tasks.should eq h['clients']
|
112
|
+
end
|
113
|
+
|
114
|
+
it 'should get projects' do
|
115
|
+
# h = {"projects"=>[{"id"=>408314, "name"=>"TestClient-TestProject", "budget"=>100.0, "client_id"=>128542, "owner_id"=>86580, "opened_on"=>#<Date: 2012-05-14 ((2456062j,0s,0n),+0s,2299161j)>, "closed_on"=>nil, "created_at"=>2012-05-14 06:44:46 UTC, "updated_at"=>2012-05-14 06:49:57 UTC, "client_name"=>"TestClient2", "sum_hours"=>0.0, "user_count"=>0, "tasks"=>[{"id"=>2162941, "name"=>"TestClient-TestProject-TestTask1", "position"=>1, "project_id"=>408314, "opened_on"=>#<Date: 2012-05-14 ((2456062j,0s,0n),+0s,2299161j)>, "closed_on"=>nil, "budget"=>10.0, "billable"=>true, "sum_hours"=>0.0, "user_count"=>0}, {"id"=>2162942, "name"=>"TestClient-TestProject-TestTask2", "position"=>2, "project_id"=>408314, "opened_on"=>#<Date: 2012-05-14 ((2456062j,0s,0n),+0s,2299161j)>, "closed_on"=>nil, "budget"=>90.0, "billable"=>true, "sum_hours"=>0.0, "user_count"=>0}, {"id"=>2162943, "name"=>"TestClient-TestProject-TestTask3", "position"=>3, "project_id"=>408314, "opened_on"=>#<Date: 2012-05-14 ((2456062j,0s,0n),+0s,2299161j)>, "closed_on"=>nil, "budget"=>0.0, "billable"=>true, "sum_hours"=>0.0, "user_count"=>0}]}]}
|
116
|
+
h = {"projects"=>[{"id"=>408314, "name"=>"TestClient-TestProject", "budget"=>100.0, "client_id"=>128542, "owner_id"=>86580, "opened_on"=>0, "closed_on"=>nil, "created_at"=>1, "updated_at"=>1, "client_name"=>"TestClient2", "sum_hours"=>0.0, "user_count"=>0, "tasks"=>[{"id"=>2162941, "name"=>"TestClient-TestProject-TestTask1", "position"=>1, "project_id"=>408314, "opened_on"=>1, "closed_on"=>nil, "budget"=>10.0, "billable"=>true, "sum_hours"=>0.0, "user_count"=>0}, {"id"=>2162942, "name"=>"TestClient-TestProject-TestTask2", "position"=>2, "project_id"=>408314, "opened_on"=>2, "closed_on"=>nil, "budget"=>90.0, "billable"=>true, "sum_hours"=>0.0, "user_count"=>0}, {"id"=>2162943, "name"=>"TestClient-TestProject-TestTask3", "position"=>3, "project_id"=>408314, "opened_on"=>1, "closed_on"=>nil, "budget"=>0.0, "billable"=>true, "sum_hours"=>0.0, "user_count"=>0}]}]}
|
117
|
+
@ts.stub(:request).and_return(h)
|
118
|
+
|
119
|
+
@ts.projects.should eq h['projects']
|
120
|
+
end
|
121
|
+
|
122
|
+
it 'should get tasks' do
|
123
|
+
# h = {"tasks"=>[{"id"=>2162941, "name"=>"TestClient-TestProject-TestTask1", "position"=>1, "project_id"=>408314, "opened_on"=>#<Date: 2012-05-14 ((2456062j,0s,0n),+0s,2299161j)>, "closed_on"=>nil, "budget"=>10.0, "billable"=>true}, {"id"=>2162942, "name"=>"TestClient-TestProject-TestTask2", "position"=>2, "project_id"=>408314, "opened_on"=>#<Date: 2012-05-14 ((2456062j,0s,0n),+0s,2299161j)>, "closed_on"=>nil, "budget"=>90.0, "billable"=>true}, {"id"=>2162943, "name"=>"TestClient-TestProject-TestTask3", "position"=>3, "project_id"=>408314, "opened_on"=>#<Date: 2012-05-14 ((2456062j,0s,0n),+0s,2299161j)>, "closed_on"=>nil, "budget"=>0.0, "billable"=>true}]}
|
124
|
+
h = {"tasks"=>[{"id"=>2162941, "name"=>"TestClient-TestProject-TestTask1", "position"=>1, "project_id"=>408314, "opened_on"=>0, "closed_on"=>nil, "budget"=>10.0, "billable"=>true}, {"id"=>2162942, "name"=>"TestClient-TestProject-TestTask2", "position"=>2, "project_id"=>408314, "opened_on"=>1, "closed_on"=>nil, "budget"=>90.0, "billable"=>true}, {"id"=>2162943, "name"=>"TestClient-TestProject-TestTask3", "position"=>3, "project_id"=>408314, "opened_on"=>3, "closed_on"=>nil, "budget"=>0.0, "billable"=>true}]}
|
125
|
+
@ts.stub(:request).and_return(h)
|
126
|
+
|
127
|
+
@ts.tasks(project_id: 2162941).should eq h['tasks']
|
128
|
+
end
|
129
|
+
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
metadata
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: tickspot_api
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.5
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Ian Vaughan
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-05-19 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
description: This allows your application easy access to the Tickspot API
|
31
|
+
email: github@ianvaughan.co.uk
|
32
|
+
executables: []
|
33
|
+
extensions: []
|
34
|
+
extra_rdoc_files: []
|
35
|
+
files:
|
36
|
+
- lib/tickspot/data.rb
|
37
|
+
- lib/tickspot/tickspot.rb
|
38
|
+
- lib/tickspot_api.rb
|
39
|
+
- spec/fixtures/clients.xml
|
40
|
+
- spec/fixtures/clients_projects_tasks.xml
|
41
|
+
- spec/fixtures/clients_projects_tasks.yml
|
42
|
+
- spec/fixtures/create_entry.xml
|
43
|
+
- spec/fixtures/not_auth.xml
|
44
|
+
- spec/fixtures/projects.xml
|
45
|
+
- spec/fixtures/projects.yml
|
46
|
+
- spec/fixtures/recent_tasks.xml
|
47
|
+
- spec/fixtures/recent_tasks.yml
|
48
|
+
- spec/fixtures/tasks.xml
|
49
|
+
- spec/fixtures/update_entry.xml
|
50
|
+
- spec/fixtures/users.xml
|
51
|
+
- spec/fixtures/users.yml
|
52
|
+
- spec/gen_fixtures.rb
|
53
|
+
- spec/spec_helper.rb
|
54
|
+
- spec/test.yml
|
55
|
+
- spec/tickspot_spec.rb
|
56
|
+
homepage: http://github.com/ianvaughan/tickspot-api
|
57
|
+
licenses: []
|
58
|
+
post_install_message:
|
59
|
+
rdoc_options: []
|
60
|
+
require_paths:
|
61
|
+
- lib
|
62
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
63
|
+
none: false
|
64
|
+
requirements:
|
65
|
+
- - ! '>='
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
|
+
none: false
|
70
|
+
requirements:
|
71
|
+
- - ! '>='
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '0'
|
74
|
+
requirements: []
|
75
|
+
rubyforge_project:
|
76
|
+
rubygems_version: 1.8.24
|
77
|
+
signing_key:
|
78
|
+
specification_version: 3
|
79
|
+
summary: Ruby wrapper for the Tickspot API
|
80
|
+
test_files:
|
81
|
+
- spec/fixtures/clients.xml
|
82
|
+
- spec/fixtures/clients_projects_tasks.xml
|
83
|
+
- spec/fixtures/clients_projects_tasks.yml
|
84
|
+
- spec/fixtures/create_entry.xml
|
85
|
+
- spec/fixtures/not_auth.xml
|
86
|
+
- spec/fixtures/projects.xml
|
87
|
+
- spec/fixtures/projects.yml
|
88
|
+
- spec/fixtures/recent_tasks.xml
|
89
|
+
- spec/fixtures/recent_tasks.yml
|
90
|
+
- spec/fixtures/tasks.xml
|
91
|
+
- spec/fixtures/update_entry.xml
|
92
|
+
- spec/fixtures/users.xml
|
93
|
+
- spec/fixtures/users.yml
|
94
|
+
- spec/gen_fixtures.rb
|
95
|
+
- spec/spec_helper.rb
|
96
|
+
- spec/test.yml
|
97
|
+
- spec/tickspot_spec.rb
|