tickspot-rb 0.1.0

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.
@@ -0,0 +1,9 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ .DS_STORE
6
+ .Trashes
7
+ .rvmrc
8
+ Gemfile.lock
9
+ coverage/*
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --order random
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source 'http://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in tickspot-rb.gemspec
4
+ gemspec
5
+
6
+ platforms :jruby do
7
+ gem 'jruby-openssl', '~> 0.7.6'
8
+ end
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2012 Chris Mason
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,43 @@
1
+ # Tickspot-rb
2
+
3
+ Ruby wrapper for the [Tick API](http://www.tickspot.com/api/).
4
+
5
+ ## Installation
6
+
7
+ $ gem install tickspot-rb
8
+
9
+ ## Example Usage
10
+
11
+ require 'tickspot'
12
+
13
+ tick = Tickspot::Client.new('myCompanyName', 'myemail@example.com', 'myTickPassword')
14
+ tick.clients
15
+
16
+ => [{"id"=>123, "name"=>"Acme"}, {"id"=>231, "name"=>"Sterling Cooper"}, {"id"=>321, "name"=>"Justice League"}]
17
+
18
+ You can also initialize the client with a configuration block:
19
+
20
+ # config/initializers/tickspot.rb (for instance)
21
+ Tickspot.configure do |config|
22
+ config.company = 'acme'
23
+ config.email = 'wilie@acme.com'
24
+ config.password = 'secret'
25
+ end
26
+
27
+ # elsewhere
28
+ client = Tickspot::Client.new
29
+
30
+ ## Note on Patches/Pull Requests
31
+
32
+ * Fork the project.
33
+ * Make your feature addition or bug fix.
34
+ * Add tests for it. This is important so I don't break it in a
35
+ future version unintentionally.
36
+ * Commit, do not mess with rakefile, version, or history.
37
+ (if you want to have your own version, that is fine but
38
+ bump version in a commit by itself I can ignore when I pull)
39
+ * Send me a pull request. Bonus points for topic branches.
40
+
41
+ ## Copyright
42
+
43
+ Copyright (c) 2012 Chris Mason. See LICENSE for details.
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,25 @@
1
+ module Tickspot
2
+
3
+ class << self
4
+ attr_accessor :company, :email, :password
5
+
6
+ # config/initializers/tickspot.rb (for instance)
7
+ #
8
+ # Tickspot.configure do |config|
9
+ # config.company = 'acme'
10
+ # config.email = 'wilie@acme.com'
11
+ # config.password = 'secret'
12
+ # end
13
+ #
14
+ # elsewhere
15
+ #
16
+ # client = Tickspot::Client.new
17
+ def configure
18
+ yield self
19
+ true
20
+ end
21
+ end
22
+
23
+ autoload :Client, "tickspot/client"
24
+ autoload :Version, "tickspot/version"
25
+ end
@@ -0,0 +1,146 @@
1
+ require 'httparty'
2
+ require 'hashie'
3
+
4
+ module Tickspot
5
+
6
+ class Client
7
+ include HTTParty
8
+ attr_reader :company, :email, :password
9
+
10
+ def initialize(company = Tickspot.company, email = Tickspot.email, password = Tickspot.password)
11
+ @company = company
12
+ @email = email
13
+ @password = password
14
+
15
+ self.class.base_uri "https://#{@company}.tickspot.com/api"
16
+ end
17
+ # The clients method will return a list of all clients
18
+ # and can only be accessed by admins on the subscription.
19
+ #
20
+ # Optional paramaters:
21
+ # open => [true|false]
22
+ #
23
+ def clients(options = {})
24
+ options.merge!(:email => @email, :password => @password)
25
+ self.class.post("/clients", :query => options)["clients"].map {|obj| Hashie::Mash.new obj }
26
+ end
27
+
28
+ # The projects method will return projects filtered by the parameters provided.
29
+ # Admin can see all projects on the subscription,
30
+ # while non-admins can only access the projects they are assigned.
31
+ #
32
+ # Optional parameters:
33
+ # project_id
34
+ # open [true|false]
35
+ # project_billable [true|false]
36
+ #
37
+ def projects(options = {})
38
+ options.merge!(:email => @email, :password => @password)
39
+ self.class.post("/projects", :query => options)["projects"].map {|obj| Hashie::Mash.new obj }
40
+ end
41
+
42
+ # The tasks method will return a list of all the current tasks for a specified project
43
+ # and can only be accessed by admins on the subscription.
44
+ #
45
+ # Required parameters:
46
+ # project_id
47
+ #
48
+ # Optional Parameters:
49
+ # task_id
50
+ # open [true|false]
51
+ # task_billable [true|false]
52
+ #
53
+ def tasks(options = {})
54
+ options.merge!(:email => @email, :password => @password)
55
+ self.class.post("/tasks", :query => options)["tasks"].map {|obj| Hashie::Mash.new obj }
56
+ end
57
+
58
+ # The method will return a list of all clients, projects, and tasks
59
+ # that are assigned to the user and available for time entries (open).
60
+ #
61
+ def clients_projects_tasks
62
+ self.class.post("/clients_projects_tasks", :query => {:email => @email, :password => @password})["clients"].map {|obj| Hashie::Mash.new obj }
63
+ end
64
+
65
+ # The entries method will return a list of all entries that meet the provided criteria.
66
+ # Either a start and end date have to be provided or an updated_at time.
67
+ # The entries will be in the start and end date range or they will be after
68
+ # the updated_at time depending on what criteria is provided.
69
+ # Each of the optional parameters will further filter the response.
70
+ #
71
+ # Required parameters:
72
+ # start_date
73
+ # end_date
74
+ # OR
75
+ # updated_at
76
+ #
77
+ # Optional Parameters:
78
+ # project_id
79
+ # task_id
80
+ # user_id
81
+ # user_email
82
+ # client_id
83
+ # entry_billable [true|false]
84
+ # billed [true|false]
85
+ #
86
+ def entries(options = {})
87
+ options.merge!(:email => @email, :password => @password)
88
+ self.class.post("/entries", :query => options)["entries"].map {|obj| Hashie::Mash.new obj }
89
+ end
90
+
91
+ # The users method will return a list of the most recently used tasks.
92
+ # This is useful for generating quick links for a user to select a task they have been using recently.
93
+ #
94
+ def recent_tasks
95
+ self.class.post("/recent_tasks", :query => {:email => @email, :password => @password})['recent_tasks'].map {|obj| Hashie::Mash.new obj }
96
+ end
97
+
98
+ # The users method will return a list of users.
99
+ #
100
+ # Optional parameters:
101
+ # project_id
102
+ #
103
+ def users(options = {})
104
+ options.merge!(:email => @email, :password => @password)
105
+ self.class.post("/users", :query => options)['users'].map {|obj| Hashie::Mash.new obj }
106
+ end
107
+
108
+ # The create_entry method will accept a time entry for a specified task_id
109
+ # and return the created entry along with the task and project stats.
110
+ #
111
+ # Require parameters:
112
+ # task_id
113
+ # hours
114
+ # date
115
+ #
116
+ # Optional parameters:
117
+ # notes
118
+ #
119
+ def create_entry(options = {})
120
+ options.merge!(:email => @email, :password => @password)
121
+ self.class.post("/create_entry", :query => options)
122
+ end
123
+
124
+ # The update_entry method will allow you to modify attributes of an existing entry.
125
+ # The only required parameter is the id of the entry.
126
+ # Additional parameters must be provided for any attribute that you wish to update.
127
+ # For example, if you are only changing the billed attribute,
128
+ # your post should only include the required parameters and the billed parameter.
129
+ #
130
+ # Require parameters:
131
+ # id
132
+ #
133
+ # Optional parameters:
134
+ # hours
135
+ # date
136
+ # billed
137
+ # task_id
138
+ # user_id
139
+ # notes
140
+ #
141
+ def update_entry(options = {})
142
+ options.merge!(:email => @email, :password => @password)
143
+ self.class.post("/update_entry", :query => options)
144
+ end
145
+ end
146
+ end
@@ -0,0 +1,3 @@
1
+ module Tickspot
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,74 @@
1
+ require 'spec_helper'
2
+
3
+ describe Tickspot::Client do
4
+ describe "instantiation" do
5
+ before(:each) do
6
+ Tickspot.configure do |config|
7
+ config.company = 'foo'
8
+ config.email = 'foo@example.com'
9
+ config.password = 'foo-secret'
10
+ end
11
+ end
12
+
13
+ context "without arguments" do
14
+ let (:client) { Tickspot::Client.new }
15
+ it "uses credentials from Tickspot" do
16
+ client.company.should == 'foo'
17
+ client.email.should == 'foo@example.com'
18
+ client.password.should == 'foo-secret'
19
+ end
20
+ end
21
+
22
+ context "with arguments" do
23
+ let (:client) { Tickspot::Client.new('bar', 'bar@example.com', 'bar-secret') }
24
+ it "uses the passed in credentials" do
25
+ client.company.should == 'bar'
26
+ client.email.should == 'bar@example.com'
27
+ client.password.should == 'bar-secret'
28
+ end
29
+ end
30
+ end
31
+
32
+ describe "accessing API" do
33
+ let (:client) { Tickspot::Client.new('bar', 'bar@example.com', 'bar-secret') }
34
+
35
+ it "properly configures the base uri" do
36
+ client.class.base_uri.should == 'https://bar.tickspot.com/api'
37
+ end
38
+
39
+ it "gets a list of clients" do
40
+ fake_post("clients")
41
+ results = client.clients
42
+ results.should have(3).clients
43
+ results.first.should be_an_instance_of(Hashie::Mash)
44
+ end
45
+
46
+ it "gets a list of users" do
47
+ fake_post("users")
48
+ results = client.users
49
+ results.should have(3).users
50
+ results.first.should be_an_instance_of(Hashie::Mash)
51
+ end
52
+
53
+ it "gets a list of projects" do
54
+ fake_post("projects")
55
+ results = client.projects
56
+ results.should have(1).project
57
+ results.first.should be_an_instance_of(Hashie::Mash)
58
+ end
59
+
60
+ it "gets a list of tasks" do
61
+ fake_post("tasks", {:project_id => 42})
62
+ results = client.tasks(:project_id => 42)
63
+ results.should have(1).task
64
+ results.first.should be_an_instance_of(Hashie::Mash)
65
+ end
66
+
67
+ it "gets a list of entries" do
68
+ fake_post("entries", {:updated_at => "2012-03-29"})
69
+ results = client.entries(:updated_at => "2012-03-29")
70
+ results.should have(1).entry
71
+ results.first.should be_an_instance_of(Hashie::Mash)
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,15 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <clients type="array">
3
+ <client>
4
+ <id type="integer">12341</id>
5
+ <name>Starfleet Command</name>
6
+ </client>
7
+ <client>
8
+ <id type="integer">12342</id>
9
+ <name>The Vulcans</name>
10
+ </client>
11
+ <client>
12
+ <id type="integer">12343</id>
13
+ <name>The Cardassians</name>
14
+ </client>
15
+ </clients>
@@ -0,0 +1,21 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <entries type="array">
3
+ <entry>
4
+ <id type="integer">24</id>
5
+ <task_id type="integer">14</task_id>
6
+ <user_id type="integer">3</user_id>
7
+ <date type="date">2008-03-08</date>
8
+ <hours type="float">1.00</hours>
9
+ <notes>Had trouble with tribbles.</notes>
10
+ <billable>true</billable>
11
+ <billed>true</billed>
12
+ <created_at type="datetime">Tue, 07 Oct 2008 14:46:16 -0400</created_at>
13
+ <updated_at type="datetime">Tue, 07 Oct 2008 14:46:16 -0400</updated_at>
14
+ <user_email>scotty@enterprise.com</user_email>
15
+ <task_name>Remove converter assembly</task_name>
16
+ <sum_hours type="float">2.00</sum_hours>
17
+ <budget type="float">10.00</budget>
18
+ <project_name>Realign dilithium crystals</project_name>
19
+ <client_name>Starfleet Command</client_name>
20
+ </entry>
21
+ </entries>
@@ -0,0 +1,31 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <projects type="array">
3
+ <project>
4
+ <id type="integer">7</id>
5
+ <name>Realign dilithium crystals</name>
6
+ <budget type="float">50</budget>
7
+ <client_id type="integer">4</client_id>
8
+ <owner_id type="integer">14</owner_id>
9
+ <opened_on type="date">2006-01-01</opened_on>
10
+ <closed_on type="date"></closed_on>
11
+ <created_at type="datetime">Tue, 07 Oct 2008 14:46:16 -0400</created_at>
12
+ <updated_at type="datetime">Tue, 07 Oct 2008 14:46:16 -0400</updated_at>
13
+ <client_name>Starfleet Command</client_name>
14
+ <sum_hours type="float">22.5</sum_hours>
15
+ <user_count type="integer">2</user_count>
16
+ <tasks type="array">
17
+ <task>
18
+ <id type="integer">14</id>
19
+ <name>Remove converter assembly</name>
20
+ <position type="integer">1</position>
21
+ <project_id type="integer">2</project_id>
22
+ <opened_on type="date">2006-01-01</opened_on>
23
+ <closed_on type="date"></closed_on>
24
+ <budget type="float">50</budget>
25
+ <billable type="boolean">true</billable>
26
+ <sum_hours type="float">22.5</sum_hours>
27
+ <user_count type="integer">2</user_count>
28
+ </task>
29
+ </tasks>
30
+ </project>
31
+ </projects>
@@ -0,0 +1,15 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <tasks type="array">
3
+ <task>
4
+ <id type="integer">14</id>
5
+ <name>Remove converter assembly</name>
6
+ <position type="integer">1</position>
7
+ <project_id type="integer">2</project_id>
8
+ <opened_on type="date">2006-01-01</opened_on>
9
+ <closed_on type="date"></closed_on>
10
+ <budget type="float">50</budget>
11
+ <billable type="boolean">true</billable>
12
+ <sum_hours type="float">22.5</sum_hours>
13
+ <user_count type="integer">2</user_count>
14
+ </task>
15
+ </tasks>
@@ -0,0 +1,27 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <users type="array">
3
+ <user>
4
+ <id type="integer">64272</id>
5
+ <first_name>Bugs</first_name>
6
+ <last_name>Bunny</last_name>
7
+ <email>bugs@example.com</email>
8
+ <created_at type="datetime">Thu, 04 Nov 2010 17:31:06 -0400</created_at>
9
+ <updated_at type="datetime">Thu, 04 Nov 2010 17:31:06 -0400</updated_at>
10
+ </user>
11
+ <user>
12
+ <id type="integer">64272</id>
13
+ <first_name>Elmer</first_name>
14
+ <last_name>Fudd</last_name>
15
+ <email>elmer@example.com</email>
16
+ <created_at type="datetime">Thu, 04 Nov 2010 17:31:06 -0400</created_at>
17
+ <updated_at type="datetime">Thu, 04 Nov 2010 17:31:06 -0400</updated_at>
18
+ </user>
19
+ <user>
20
+ <id type="integer">64272</id>
21
+ <first_name>Daffy</first_name>
22
+ <last_name>Duck</last_name>
23
+ <email>daffy@example.com</email>
24
+ <created_at type="datetime">Thu, 04 Nov 2010 17:31:06 -0400</created_at>
25
+ <updated_at type="datetime">Thu, 04 Nov 2010 17:31:06 -0400</updated_at>
26
+ </user>
27
+ </users>
@@ -0,0 +1,24 @@
1
+ $:.unshift File.expand_path('..', __FILE__)
2
+ $:.unshift File.expand_path('../../lib', __FILE__)
3
+ require 'simplecov'
4
+ SimpleCov.start
5
+ require 'tickspot'
6
+ require 'rspec'
7
+ require 'webmock/rspec'
8
+
9
+ RSpec.configure do |config|
10
+ #
11
+ end
12
+
13
+ def fake_post(resource, params = {})
14
+ params.merge!(:email => 'bar@example.com', :password => 'bar-secret')
15
+ stub_request(:post, "https://bar.tickspot.com/api/#{resource}"
16
+ ).with(:query => params
17
+ ).to_return(:body => fixture_file("#{resource}.xml"), :status => 200, :headers => {'Content-Type' => 'application/xml'})
18
+ end
19
+
20
+ def fixture_file(filename)
21
+ return '' if filename == ''
22
+ file_path = File.expand_path(File.dirname(__FILE__) + '/fixtures/' + filename)
23
+ File.read(file_path)
24
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe Tickspot do
4
+
5
+ before(:each) do
6
+ Tickspot.company = nil
7
+ Tickspot.email = nil
8
+ Tickspot.password = nil
9
+ end
10
+
11
+ it "should be able to set the company" do
12
+ Tickspot.company = 'acme'
13
+ Tickspot.company.should == 'acme'
14
+ end
15
+
16
+ it "shoudl be able to set the email" do
17
+ Tickspot.email = 'my_email@example.com'
18
+ Tickspot.email.should == 'my_email@example.com'
19
+ end
20
+
21
+ it "should be able to set the password" do
22
+ Tickspot.password = 'double_secret_probation'
23
+ Tickspot.password.should == 'double_secret_probation'
24
+ end
25
+ it "should be able to set the company, email, and password via configuration block" do
26
+ Tickspot.configure do |config|
27
+ config.company = 'acme'
28
+ config.email = 'my_email@example.com'
29
+ config.password = 'double_secret_probation'
30
+ end
31
+
32
+ Tickspot.company.should == 'acme'
33
+ Tickspot.email.should == 'my_email@example.com'
34
+ Tickspot.password.should == 'double_secret_probation'
35
+ end
36
+ end
@@ -0,0 +1,28 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "tickspot/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "tickspot-rb"
7
+ s.version = Tickspot::VERSION
8
+ s.authors = ["Chris Mason"]
9
+ s.email = ["chris@chaione.com"]
10
+ s.homepage = "https://github.com/cmason/tickspot-rb"
11
+ s.description = %q{Ruby wrapper for the Tick API http://tickspot.com/api}
12
+ s.summary = s.description
13
+
14
+ s.rubyforge_project = "tickspot-rb"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ['lib']
20
+
21
+ # specify any dependencies here; for example:
22
+ s.add_runtime_dependency 'hashie'
23
+ s.add_runtime_dependency 'httparty'
24
+ s.add_development_dependency 'rake'
25
+ s.add_development_dependency 'rspec'
26
+ s.add_development_dependency 'simplecov'
27
+ s.add_development_dependency 'webmock'
28
+ end
metadata ADDED
@@ -0,0 +1,137 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tickspot-rb
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Chris Mason
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-03-30 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: hashie
16
+ requirement: &70120337962020 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70120337962020
25
+ - !ruby/object:Gem::Dependency
26
+ name: httparty
27
+ requirement: &70120337961280 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *70120337961280
36
+ - !ruby/object:Gem::Dependency
37
+ name: rake
38
+ requirement: &70120337960600 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *70120337960600
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec
49
+ requirement: &70120337959840 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *70120337959840
58
+ - !ruby/object:Gem::Dependency
59
+ name: simplecov
60
+ requirement: &70120337959380 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *70120337959380
69
+ - !ruby/object:Gem::Dependency
70
+ name: webmock
71
+ requirement: &70120337958600 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *70120337958600
80
+ description: Ruby wrapper for the Tick API http://tickspot.com/api
81
+ email:
82
+ - chris@chaione.com
83
+ executables: []
84
+ extensions: []
85
+ extra_rdoc_files: []
86
+ files:
87
+ - .gitignore
88
+ - .rspec
89
+ - Gemfile
90
+ - LICENSE
91
+ - README.md
92
+ - Rakefile
93
+ - lib/tickspot.rb
94
+ - lib/tickspot/client.rb
95
+ - lib/tickspot/version.rb
96
+ - spec/client_spec.rb
97
+ - spec/fixtures/clients.xml
98
+ - spec/fixtures/entries.xml
99
+ - spec/fixtures/projects.xml
100
+ - spec/fixtures/tasks.xml
101
+ - spec/fixtures/users.xml
102
+ - spec/spec_helper.rb
103
+ - spec/tickspot_spec.rb
104
+ - tickspot-rb.gemspec
105
+ homepage: https://github.com/cmason/tickspot-rb
106
+ licenses: []
107
+ post_install_message:
108
+ rdoc_options: []
109
+ require_paths:
110
+ - lib
111
+ required_ruby_version: !ruby/object:Gem::Requirement
112
+ none: false
113
+ requirements:
114
+ - - ! '>='
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ required_rubygems_version: !ruby/object:Gem::Requirement
118
+ none: false
119
+ requirements:
120
+ - - ! '>='
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
123
+ requirements: []
124
+ rubyforge_project: tickspot-rb
125
+ rubygems_version: 1.8.17
126
+ signing_key:
127
+ specification_version: 3
128
+ summary: Ruby wrapper for the Tick API http://tickspot.com/api
129
+ test_files:
130
+ - spec/client_spec.rb
131
+ - spec/fixtures/clients.xml
132
+ - spec/fixtures/entries.xml
133
+ - spec/fixtures/projects.xml
134
+ - spec/fixtures/tasks.xml
135
+ - spec/fixtures/users.xml
136
+ - spec/spec_helper.rb
137
+ - spec/tickspot_spec.rb