harvested 1.0.1 → 1.2.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.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MGIyYjlkMDdjZWI1MTRlMjZlZTk2MmI1OWVjNGY2ZDkxNDAyMTZjZg==
5
+ data.tar.gz: !binary |-
6
+ MDliY2MxNTEwMjFhZmE4NGZhMDJmYzhlNTBjM2JhYzU0MTAxMzAwZA==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ NGM1NmJkOWVmNTVkNTRlMmFjMjY1ZjBkMWY4YzQ4YmNkYzU3M2FlY2JhZGY1
10
+ ZmVkNWRiMGU5YjI5NmJkZDZiMjk3Yjk1MjFhZmI3ZTVkZTQ0ZTFlZWNjNmVm
11
+ MGUyZTU5OGNjMGU2MmFiMzBjNTg4NWVmNDA4YjQ4ZGNiMWIyYTA=
12
+ data.tar.gz: !binary |-
13
+ MjU1NmUxMTY0M2I4OTgxOThlMzEwMDJkODdlMDQ2NmNhMDBhMWU5Njg4MjEw
14
+ YTg4MjFhZGE3OGYyNDE2NGViZTczNTZjMzA3N2ExZWU1MDQ4NWY0OWViOTFh
15
+ NDk4MDQ3NTRkNWQxZDU1M2JlNmZlZDQ3Yjg2NmE3NGExNmZhYjE=
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 1.9.3-p429
1
+ 1.9.3
data/HISTORY CHANGED
@@ -1,3 +1,8 @@
1
+ 1.2.0 - February 21, 2014
2
+ * Adds time.trackable_projects: projects that the current user can create entries for
3
+ * Show hint on error for projects.all as unprivileged user
4
+ 1.1.0 - December 13, 2013
5
+ * Adds ability to toggle timers (thanks Eli Fatsi - @efatsi)
1
6
  1.0.1 - June 21, 2013
2
7
  * Adds ability to pass updated_since paramter to report methods (thanks Pete McWilliams)
3
8
  * Adds ability to create time entries for a given user
data/README.md CHANGED
@@ -87,11 +87,6 @@ Using [rvm](https://rvm.beginrescueend.com/) you can run the tests against the p
87
87
 
88
88
  Each runtime needs to be installed in rvm along with the bundler gem.
89
89
 
90
- ## TODO
91
-
92
- * Write Documentation
93
- * Allow Timer Toggling
94
-
95
90
  ## Notes on Harvest Estimates
96
91
 
97
92
  Estimates aren't currently supported due to lack of an API. If this opens up, harvested will include them.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.1
1
+ 1.2.0
data/harvested.gemspec CHANGED
@@ -2,14 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
+ # stub: harvested 1.2.0 ruby lib
5
6
 
6
7
  Gem::Specification.new do |s|
7
8
  s.name = "harvested"
8
- s.version = "1.0.1"
9
+ s.version = "1.2.0"
9
10
 
10
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
+ s.require_paths = ["lib"]
11
13
  s.authors = ["Zach Moazeni"]
12
- s.date = "2013-06-21"
14
+ s.date = "2014-02-21"
13
15
  s.description = "Harvested wraps the Harvest API concisely without the use of Rails dependencies. More information about the Harvest API can be found on their website (http://www.getharvest.com/api). For support hit up the Mailing List (http://groups.google.com/group/harvested)"
14
16
  s.email = "zach.moazeni@gmail.com"
15
17
  s.extra_rdoc_files = [
@@ -73,6 +75,7 @@ Gem::Specification.new do |s|
73
75
  "lib/harvest/task_assignment.rb",
74
76
  "lib/harvest/time_entry.rb",
75
77
  "lib/harvest/timezones.rb",
78
+ "lib/harvest/trackable_project.rb",
76
79
  "lib/harvest/user.rb",
77
80
  "lib/harvest/user_assignment.rb",
78
81
  "lib/harvested.rb",
@@ -99,6 +102,7 @@ Gem::Specification.new do |s|
99
102
  "spec/harvest/task_assignment_spec.rb",
100
103
  "spec/harvest/task_spec.rb",
101
104
  "spec/harvest/time_entry_spec.rb",
105
+ "spec/harvest/trackable_project_spec.rb",
102
106
  "spec/harvest/user_assignment_spec.rb",
103
107
  "spec/harvest/user_spec.rb",
104
108
  "spec/spec_helper.rb",
@@ -108,12 +112,11 @@ Gem::Specification.new do |s|
108
112
  "spec/test_rubies"
109
113
  ]
110
114
  s.homepage = "http://github.com/zmoazeni/harvested"
111
- s.require_paths = ["lib"]
112
- s.rubygems_version = "1.8.25"
115
+ s.rubygems_version = "2.2.1"
113
116
  s.summary = "A Ruby Wrapper for the Harvest API http://www.getharvest.com/"
114
117
 
115
118
  if s.respond_to? :specification_version then
116
- s.specification_version = 3
119
+ s.specification_version = 4
117
120
 
118
121
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
119
122
  s.add_runtime_dependency(%q<httparty>, [">= 0"])
@@ -4,6 +4,14 @@ module Harvest
4
4
  api_model Harvest::Project
5
5
 
6
6
  include Harvest::Behavior::Crud
7
+
8
+ # Retrieves all projects. Note: this requires project manager or administrator authorization.
9
+ # @return [Harvest::Project]
10
+ def all(*)
11
+ super
12
+ rescue NotFound => e
13
+ raise NotFound.new(e.response, e.params, "Do you have sufficient priveleges? If not, consider using time.trackable_projects instead.")
14
+ end
7
15
 
8
16
  # Creates and Assigns a task to the project
9
17
  #
@@ -8,11 +8,18 @@ module Harvest
8
8
  end
9
9
 
10
10
  def all(date = ::Time.now, user = nil)
11
- date = ::Time.parse(date) if String === date
12
- response = request(:get, credentials, "/daily/#{date.yday}/#{date.year}", :query => of_user_query(user))
13
- Harvest::TimeEntry.parse(JSON.parse(response.body)["day_entries"])
11
+ Harvest::TimeEntry.parse(daily(date, user)["day_entries"])
12
+ end
13
+
14
+ def trackable_projects(date = ::Time.now, user = nil)
15
+ Harvest::TrackableProject.parse(daily(date, user)["projects"])
14
16
  end
15
17
 
18
+ def toggle(id, user = nil)
19
+ response = request(:get, credentials, "/daily/timer/#{id}", :query => of_user_query(user))
20
+ Harvest::TimeEntry.parse(response.parsed_response).first
21
+ end
22
+
16
23
  def create(entry, user = nil)
17
24
  response = request(:post, credentials, '/daily/add', :body => entry.to_json, :query => of_user_query(user))
18
25
  Harvest::TimeEntry.parse(response.parsed_response).first
@@ -27,6 +34,15 @@ module Harvest
27
34
  request(:delete, credentials, "/daily/delete/#{entry.to_i}", :query => of_user_query(user))
28
35
  entry.id
29
36
  end
37
+
38
+
39
+ private
40
+
41
+ def daily(date, user)
42
+ date = ::Time.parse(date) if String === date
43
+ response = request(:get, credentials, "/daily/#{date.yday}/#{date.year}", :query => of_user_query(user))
44
+ JSON.parse(response.body)
45
+ end
30
46
  end
31
47
  end
32
48
  end
@@ -4,15 +4,17 @@ module Harvest
4
4
  class HTTPError < StandardError
5
5
  attr_reader :response
6
6
  attr_reader :params
7
+ attr_reader :hint
7
8
 
8
- def initialize(response, params = {})
9
+ def initialize(response, params = {}, hint = nil)
9
10
  @response = response
10
11
  @params = params
12
+ @hint = hint
11
13
  super(response)
12
14
  end
13
15
 
14
16
  def to_s
15
- "#{self.class.to_s} : #{response.code} #{response.body}"
17
+ "#{self.class.to_s} : #{response.code} #{response.body}" + (hint ? "\n#{hint}" : "")
16
18
  end
17
19
  end
18
20
 
@@ -0,0 +1,38 @@
1
+ module Harvest
2
+
3
+ # The model for project-tasks combinations that can be added to the timesheet
4
+ #
5
+ # == Fields
6
+ # [+id+] the id of the project
7
+ # [+name+] the name of the project
8
+ # [+client+] the name of the client of the project
9
+ # [+client_id+] the client id of the project
10
+ # [+tasks+] trackable tasks for the project
11
+ class TrackableProject < Hashie::Mash
12
+ include Harvest::Model
13
+
14
+ skip_json_root true
15
+
16
+ def initialize(args = {}, _ = nil)
17
+ args = args.to_hash.stringify_keys
18
+ self.tasks = args.delete("tasks") if args["tasks"]
19
+ super
20
+ end
21
+
22
+ def tasks=(tasks)
23
+ self["tasks"] = Task.parse(tasks)
24
+ end
25
+
26
+ # The model for trackable tasks
27
+ #
28
+ # == Fields
29
+ # [+id+] the id of the task
30
+ # [+name+] the name of the task
31
+ # [+billable+] whether the task is billable by default
32
+ class Task < Hashie::Mash
33
+ include Harvest::Model
34
+
35
+ skip_json_root true
36
+ end
37
+ end
38
+ end
data/lib/harvested.rb CHANGED
@@ -19,7 +19,7 @@ require 'harvest/timezones'
19
19
  require 'harvest/base'
20
20
 
21
21
  %w(crud activatable).each {|a| require "harvest/behavior/#{a}"}
22
- %w(model client contact project task user rate_limit_status task_assignment user_assignment expense_category expense time_entry invoice_category line_item invoice invoice_payment).each {|a| require "harvest/#{a}"}
22
+ %w(model client contact project task user rate_limit_status task_assignment user_assignment expense_category expense time_entry invoice_category line_item invoice invoice_payment trackable_project).each {|a| require "harvest/#{a}"}
23
23
  %w(base account clients contacts projects tasks users task_assignments user_assignments expense_categories expenses time reports invoice_categories invoices invoice_payments).each {|a| require "harvest/api/#{a}"}
24
24
 
25
25
  module Harvest
@@ -4,7 +4,7 @@ describe 'account information' do
4
4
  it 'returns the rate limit when requested' do
5
5
  cassette('account1') do
6
6
  status = harvest.account.rate_limit_status
7
- status.max_calls.should == 100
7
+ status.max_calls.should == 500
8
8
  end
9
9
  end
10
10
 
@@ -23,7 +23,7 @@ describe 'harvest invoices' do
23
23
  invoice = harvest.invoices.create(invoice)
24
24
 
25
25
  invoice.subject.should == "Invoice for Joe's Stream Cleaning"
26
- invoice.amount.should == "2400.0"
26
+ invoice.amount.should == 2400.0
27
27
  invoice.line_items.size.should == 1
28
28
 
29
29
  invoice.subject = "Updated Invoice for Joe"
@@ -31,7 +31,7 @@ describe 'harvest invoices' do
31
31
 
32
32
  invoice = harvest.invoices.update(invoice)
33
33
  invoice.subject.should == "Updated Invoice for Joe"
34
- invoice.amount.should == "4800.0"
34
+ invoice.amount.should == 4800.0
35
35
  invoice.line_items.size.should == 2
36
36
 
37
37
  harvest.invoices.delete(invoice)
@@ -75,13 +75,13 @@ describe 'harvest invoices' do
75
75
  invoice = harvest.invoices.create(invoice)
76
76
 
77
77
  invoice.subject.should == "Invoice for Frannie's Widgets"
78
- invoice.amount.should == "2400.0"
78
+ invoice.amount.should == 2400.0
79
79
  invoice.line_items.size.should == 1
80
80
  invoice.due_at.should == "2011-05-31"
81
81
 
82
82
  invoice = harvest.invoices.find(invoice.id)
83
83
  invoice.subject.should == "Invoice for Frannie's Widgets"
84
- invoice.amount.should == "2400.0"
84
+ invoice.amount.should == 2400.0
85
85
  invoice.line_items.size.should == 1
86
86
 
87
87
  invoices = harvest.invoices.all
@@ -8,11 +8,11 @@ describe 'harvest tasks' do
8
8
  "billable_by_default" => true,
9
9
  "default_hourly_rate" => 120
10
10
  )
11
- task.default_hourly_rate.should == "120.0"
11
+ task.default_hourly_rate.should == 120.0
12
12
 
13
13
  task.default_hourly_rate = 140
14
14
  task = harvest.tasks.update(task)
15
- task.default_hourly_rate.should == "140.0"
15
+ task.default_hourly_rate.should == 140.0
16
16
 
17
17
  harvest.tasks.delete(task)
18
18
  harvest.tasks.all.select {|t| t.name == "A crud task"}.should == []
@@ -53,7 +53,7 @@ describe 'harvest tasks' do
53
53
 
54
54
  assignment1.hourly_rate = 100
55
55
  assignment1 = harvest.task_assignments.update(assignment1)
56
- assignment1.hourly_rate.should == "100.0"
56
+ assignment1.hourly_rate.should == 100.0
57
57
 
58
58
  harvest.task_assignments.delete(assignment1)
59
59
  all_assignments = harvest.task_assignments.all(project)
@@ -49,5 +49,49 @@ describe 'harvest time tracking' do
49
49
  end
50
50
  end
51
51
 
52
- it 'allows toggling of timers'
52
+ it 'allows toggling of timers' do
53
+ cassette("time_tracking3") do
54
+ client = harvest.clients.create("name" => "Jane's Used Car Shop")
55
+ project = harvest.projects.create("name" => "Tracking Project", "client_id" => client.id)
56
+ harvest.projects.create_task(project, "A billable task")
57
+ task = harvest.tasks.all.detect {|t| t.name == "A billable task"}
58
+
59
+ entry = harvest.time.create("notes" => "Test api support", "hours" => 3, "spent_at" => "2009/12/28", "task_id" => task.id, "project_id" => project.id)
60
+
61
+ # start existing timer
62
+ started_entry = harvest.time.toggle(entry.id)
63
+ started_entry.timer_started_at.should_not be_nil
64
+
65
+ # stop started timer
66
+ stopped_entry = harvest.time.toggle(started_entry.id)
67
+ stopped_entry.timer_started_at.should be_nil
68
+ end
69
+ end
70
+
71
+ it 'allows retrieving trackable projects and tasks' do
72
+ cassette("time_tracking4") do
73
+ client = harvest.clients.create("name" => "Bobby's Coffee Shop")
74
+ project = harvest.projects.create("name" => "Bobby's Trackable Project", "client_id" => client.id)
75
+ harvest.projects.create_task(project, "A billable task for Bobby")
76
+
77
+ trackable_projects = harvest.time.trackable_projects
78
+ trackable_project = trackable_projects.find {|p| p.name == "Bobby's Trackable Project" }
79
+ trackable_projects.first.client.should == "Bobbys Coffee Shop"
80
+ trackable_projects.first.tasks.first.name.should == "A billable task for Bobby"
81
+ end
82
+ end
83
+
84
+ it 'allows for absence of trackable projects' do
85
+ cassette("time_tracking5") do
86
+ user = harvest.users.create(
87
+ "email" => "gary@example.com",
88
+ "first_name" => "Gary",
89
+ "last_name" => "Doe",
90
+ "password" => "secure"
91
+ )
92
+
93
+ trackable_projects = harvest.time.trackable_projects(Time.now, user)
94
+ trackable_projects.should == []
95
+ end
96
+ end
53
97
  end
@@ -92,7 +92,7 @@ describe 'harvest users' do
92
92
 
93
93
  assignment.hourly_rate = 100
94
94
  assignment = harvest.user_assignments.update(assignment)
95
- assignment.hourly_rate.should == "100.0"
95
+ assignment.hourly_rate.should == 100.0
96
96
 
97
97
  harvest.user_assignments.delete(assignment)
98
98
  all_assignments = harvest.user_assignments.all(project)
@@ -0,0 +1,8 @@
1
+ require 'spec_helper'
2
+
3
+ describe Harvest::TrackableProject do
4
+ it "creates task objects" do
5
+ projects = Harvest::TrackableProject.parse('[{"tasks":[{"id":123}]}]').first
6
+ projects.tasks.first.id.should == 123
7
+ end
8
+ end
@@ -37,7 +37,7 @@ module HarvestedHelpers
37
37
  # we store expenses on this date in the tests
38
38
  harvest.expenses.all(Time.utc(2009, 12, 28)).each {|e| harvest.expenses.delete(e) }
39
39
 
40
- %w(expense_categories projects invoices contacts clients tasks).each do |collection|
40
+ %w(expense_categories time projects invoices contacts clients tasks).each do |collection|
41
41
  harvest.send(collection).all.each {|m| harvest.send(collection).delete(m) }
42
42
  end
43
43
  end
metadata CHANGED
@@ -1,20 +1,19 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: harvested
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
5
- prerelease:
4
+ version: !binary |-
5
+ MS4yLjA=
6
6
  platform: ruby
7
7
  authors:
8
8
  - Zach Moazeni
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-06-21 00:00:00.000000000 Z
12
+ date: 2014-02-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: httparty
16
16
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
17
  requirements:
19
18
  - - ! '>='
20
19
  - !ruby/object:Gem::Version
@@ -22,7 +21,6 @@ dependencies:
22
21
  type: :runtime
23
22
  prerelease: false
24
23
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
24
  requirements:
27
25
  - - ! '>='
28
26
  - !ruby/object:Gem::Version
@@ -30,23 +28,22 @@ dependencies:
30
28
  - !ruby/object:Gem::Dependency
31
29
  name: hashie
32
30
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
31
  requirements:
35
32
  - - ~>
36
33
  - !ruby/object:Gem::Version
37
- version: '1'
34
+ version: !binary |-
35
+ MQ==
38
36
  type: :runtime
39
37
  prerelease: false
40
38
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
39
  requirements:
43
40
  - - ~>
44
41
  - !ruby/object:Gem::Version
45
- version: '1'
42
+ version: !binary |-
43
+ MQ==
46
44
  - !ruby/object:Gem::Dependency
47
45
  name: json
48
46
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
47
  requirements:
51
48
  - - ! '>='
52
49
  - !ruby/object:Gem::Version
@@ -54,7 +51,6 @@ dependencies:
54
51
  type: :runtime
55
52
  prerelease: false
56
53
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
54
  requirements:
59
55
  - - ! '>='
60
56
  - !ruby/object:Gem::Version
@@ -62,23 +58,22 @@ dependencies:
62
58
  - !ruby/object:Gem::Dependency
63
59
  name: rspec
64
60
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
61
  requirements:
67
62
  - - ~>
68
63
  - !ruby/object:Gem::Version
69
- version: '2'
64
+ version: !binary |-
65
+ Mg==
70
66
  type: :development
71
67
  prerelease: false
72
68
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
69
  requirements:
75
70
  - - ~>
76
71
  - !ruby/object:Gem::Version
77
- version: '2'
72
+ version: !binary |-
73
+ Mg==
78
74
  - !ruby/object:Gem::Dependency
79
75
  name: jruby-openssl
80
76
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
77
  requirements:
83
78
  - - ! '>='
84
79
  - !ruby/object:Gem::Version
@@ -86,7 +81,6 @@ dependencies:
86
81
  type: :development
87
82
  prerelease: false
88
83
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
84
  requirements:
91
85
  - - ! '>='
92
86
  - !ruby/object:Gem::Version
@@ -94,7 +88,6 @@ dependencies:
94
88
  - !ruby/object:Gem::Dependency
95
89
  name: webmock
96
90
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
91
  requirements:
99
92
  - - ! '>='
100
93
  - !ruby/object:Gem::Version
@@ -102,7 +95,6 @@ dependencies:
102
95
  type: :development
103
96
  prerelease: false
104
97
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
98
  requirements:
107
99
  - - ! '>='
108
100
  - !ruby/object:Gem::Version
@@ -110,7 +102,6 @@ dependencies:
110
102
  - !ruby/object:Gem::Dependency
111
103
  name: vcr
112
104
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
105
  requirements:
115
106
  - - ! '>='
116
107
  - !ruby/object:Gem::Version
@@ -118,7 +109,6 @@ dependencies:
118
109
  type: :development
119
110
  prerelease: false
120
111
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
112
  requirements:
123
113
  - - ! '>='
124
114
  - !ruby/object:Gem::Version
@@ -126,7 +116,6 @@ dependencies:
126
116
  - !ruby/object:Gem::Dependency
127
117
  name: jeweler
128
118
  requirement: !ruby/object:Gem::Requirement
129
- none: false
130
119
  requirements:
131
120
  - - ! '>='
132
121
  - !ruby/object:Gem::Version
@@ -134,7 +123,6 @@ dependencies:
134
123
  type: :development
135
124
  prerelease: false
136
125
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
126
  requirements:
139
127
  - - ! '>='
140
128
  - !ruby/object:Gem::Version
@@ -142,7 +130,6 @@ dependencies:
142
130
  - !ruby/object:Gem::Dependency
143
131
  name: debugger
144
132
  requirement: !ruby/object:Gem::Requirement
145
- none: false
146
133
  requirements:
147
134
  - - ! '>='
148
135
  - !ruby/object:Gem::Version
@@ -150,7 +137,6 @@ dependencies:
150
137
  type: :development
151
138
  prerelease: false
152
139
  version_requirements: !ruby/object:Gem::Requirement
153
- none: false
154
140
  requirements:
155
141
  - - ! '>='
156
142
  - !ruby/object:Gem::Version
@@ -158,7 +144,6 @@ dependencies:
158
144
  - !ruby/object:Gem::Dependency
159
145
  name: factory_girl
160
146
  requirement: !ruby/object:Gem::Requirement
161
- none: false
162
147
  requirements:
163
148
  - - ! '>='
164
149
  - !ruby/object:Gem::Version
@@ -166,7 +151,6 @@ dependencies:
166
151
  type: :development
167
152
  prerelease: false
168
153
  version_requirements: !ruby/object:Gem::Requirement
169
- none: false
170
154
  requirements:
171
155
  - - ! '>='
172
156
  - !ruby/object:Gem::Version
@@ -174,7 +158,6 @@ dependencies:
174
158
  - !ruby/object:Gem::Dependency
175
159
  name: yard
176
160
  requirement: !ruby/object:Gem::Requirement
177
- none: false
178
161
  requirements:
179
162
  - - ! '>='
180
163
  - !ruby/object:Gem::Version
@@ -182,7 +165,6 @@ dependencies:
182
165
  type: :development
183
166
  prerelease: false
184
167
  version_requirements: !ruby/object:Gem::Requirement
185
- none: false
186
168
  requirements:
187
169
  - - ! '>='
188
170
  - !ruby/object:Gem::Version
@@ -190,7 +172,6 @@ dependencies:
190
172
  - !ruby/object:Gem::Dependency
191
173
  name: redcarpet
192
174
  requirement: !ruby/object:Gem::Requirement
193
- none: false
194
175
  requirements:
195
176
  - - ! '>='
196
177
  - !ruby/object:Gem::Version
@@ -198,7 +179,6 @@ dependencies:
198
179
  type: :development
199
180
  prerelease: false
200
181
  version_requirements: !ruby/object:Gem::Requirement
201
- none: false
202
182
  requirements:
203
183
  - - ! '>='
204
184
  - !ruby/object:Gem::Version
@@ -269,6 +249,7 @@ files:
269
249
  - lib/harvest/task_assignment.rb
270
250
  - lib/harvest/time_entry.rb
271
251
  - lib/harvest/timezones.rb
252
+ - lib/harvest/trackable_project.rb
272
253
  - lib/harvest/user.rb
273
254
  - lib/harvest/user_assignment.rb
274
255
  - lib/harvested.rb
@@ -295,6 +276,7 @@ files:
295
276
  - spec/harvest/task_assignment_spec.rb
296
277
  - spec/harvest/task_spec.rb
297
278
  - spec/harvest/time_entry_spec.rb
279
+ - spec/harvest/trackable_project_spec.rb
298
280
  - spec/harvest/user_assignment_spec.rb
299
281
  - spec/harvest/user_spec.rb
300
282
  - spec/spec_helper.rb
@@ -304,29 +286,25 @@ files:
304
286
  - spec/test_rubies
305
287
  homepage: http://github.com/zmoazeni/harvested
306
288
  licenses: []
289
+ metadata: {}
307
290
  post_install_message:
308
291
  rdoc_options: []
309
292
  require_paths:
310
293
  - lib
311
294
  required_ruby_version: !ruby/object:Gem::Requirement
312
- none: false
313
295
  requirements:
314
296
  - - ! '>='
315
297
  - !ruby/object:Gem::Version
316
298
  version: '0'
317
- segments:
318
- - 0
319
- hash: -4545923220079875304
320
299
  required_rubygems_version: !ruby/object:Gem::Requirement
321
- none: false
322
300
  requirements:
323
301
  - - ! '>='
324
302
  - !ruby/object:Gem::Version
325
303
  version: '0'
326
304
  requirements: []
327
305
  rubyforge_project:
328
- rubygems_version: 1.8.25
306
+ rubygems_version: 2.2.1
329
307
  signing_key:
330
- specification_version: 3
308
+ specification_version: 4
331
309
  summary: A Ruby Wrapper for the Harvest API http://www.getharvest.com/
332
310
  test_files: []