harvested 1.0.1 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
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: []