zenhob-hcl 0.2.2 → 0.2.3

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.
data/.document ADDED
@@ -0,0 +1 @@
1
+ --files CHANGELOG
data/.gitignore CHANGED
@@ -1,2 +1,5 @@
1
1
  *.sw[nop]
2
2
  pkg
3
+ tags
4
+ doc
5
+ .yardoc
data/CHANGELOG ADDED
@@ -0,0 +1,41 @@
1
+ = Recent Changes in HCl
2
+
3
+ == v0.2.3 Sun Aug 23 21:39:34 2009 -0700
4
+
5
+ * Allow decimal time offset without a dot, closes #29.
6
+ * Reverted and re-fixed: Adding note fails when task is started without notes, #26.
7
+ * Reinstate the --version option
8
+
9
+ == v0.2.2 Sun Aug 9 11:16:34 2009 -0700
10
+
11
+ * Support installation via rip, closes #27.
12
+ * Fixed: Adding note fails when task is started without notes, closes #26.
13
+ * Avoid stack trace on missing XML root node, closes #25.
14
+
15
+ == v0.2.1 Thu Jul 30 14:02:23 2009 -0700
16
+
17
+ * Fixed: Creating timers without starting them.
18
+
19
+ == v0.2.0 Thu Jul 30 11:40:33 2009 -0700
20
+
21
+ * Allow an initial time to be specified when starting a timer, closes #9.
22
+ * Always display hours as HH:MM, closes #22.
23
+ * Do not write empty task cache, closes #23.
24
+
25
+ == v0.1.3 Tue Jul 28 09:19:53 2009 -0700
26
+
27
+ * Add a note about ruby-dev for debian/ubuntu users, closes #20.
28
+ * Friendlier error message on unrecognized task, closes #18, #21.
29
+
30
+ == v0.1.2 Mon Jul 27 11:46:50 2009 -0700
31
+
32
+ * Automatically include rubygems in bin/hcl.
33
+
34
+ == v0.1.1 Fri Jul 24 19:32:32 2009 -0700
35
+
36
+ * Mention gem in README, read version from file.
37
+
38
+ == v0.1.0 Fri Jul 24 19:09:23 2009 -0700
39
+
40
+ * Initial public release
41
+
data/README.markdown CHANGED
@@ -1,4 +1,4 @@
1
- # hcl
1
+ # HCl
2
2
 
3
3
  HCl is a command-line tool for interacting with Harvest time sheets using the
4
4
  [Harvest time tracking API][htt].
data/Rakefile CHANGED
@@ -1,3 +1,10 @@
1
+ require 'rake/testtask'
2
+
3
+ Rake::TestTask.new do |t|
4
+ t.libs << 'test'
5
+ t.test_files = FileList['test/*_test.rb']
6
+ end
7
+
1
8
  begin
2
9
  require 'jeweler'
3
10
  Jeweler::Tasks.new do |gem|
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.2
1
+ 0.2.3
data/hcl.gemspec CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{hcl}
5
- s.version = "0.2.2"
5
+ s.version = "0.2.3"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Zack Hobson"]
9
- s.date = %q{2009-08-09}
9
+ s.date = %q{2009-08-23}
10
10
  s.default_executable = %q{hcl}
11
11
  s.description = %q{HCl is a command-line client for manipulating Harvest time sheets.}
12
12
  s.email = %q{zack@opensourcery.com}
@@ -16,8 +16,9 @@ Gem::Specification.new do |s|
16
16
  "README.markdown"
17
17
  ]
18
18
  s.files = [
19
- ".gitignore",
20
- ".gitmodules",
19
+ ".document",
20
+ ".gitignore",
21
+ "CHANGELOG",
21
22
  "LICENSE",
22
23
  "README.markdown",
23
24
  "Rakefile",
@@ -25,13 +26,17 @@ Gem::Specification.new do |s|
25
26
  "bin/hcl",
26
27
  "deps.rip",
27
28
  "hcl.gemspec",
28
- "hcl_conf.yml.example",
29
29
  "lib/hcl/app.rb",
30
+ "lib/hcl/commands.rb",
30
31
  "lib/hcl/day_entry.rb",
31
32
  "lib/hcl/project.rb",
32
33
  "lib/hcl/task.rb",
33
34
  "lib/hcl/timesheet_resource.rb",
34
- "lib/hcl/utility.rb"
35
+ "lib/hcl/utility.rb",
36
+ "test/app_test.rb",
37
+ "test/day_entry_test.rb",
38
+ "test/test_helper.rb",
39
+ "test/utility_test.rb"
35
40
  ]
36
41
  s.has_rdoc = true
37
42
  s.homepage = %q{http://github.com/zenhob/hcl}
@@ -39,6 +44,12 @@ Gem::Specification.new do |s|
39
44
  s.require_paths = ["lib"]
40
45
  s.rubygems_version = %q{1.3.1}
41
46
  s.summary = %q{Harvest timesheets from the command-line}
47
+ s.test_files = [
48
+ "test/app_test.rb",
49
+ "test/day_entry_test.rb",
50
+ "test/test_helper.rb",
51
+ "test/utility_test.rb"
52
+ ]
42
53
 
43
54
  if s.respond_to? :specification_version then
44
55
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
data/lib/hcl/app.rb CHANGED
@@ -11,6 +11,7 @@ require 'highline/import'
11
11
 
12
12
  ## app dependencies
13
13
  require 'hcl/utility'
14
+ require 'hcl/commands'
14
15
  require 'hcl/timesheet_resource'
15
16
  require 'hcl/project'
16
17
  require 'hcl/task'
@@ -29,51 +30,65 @@ class Net::HTTP
29
30
  end
30
31
 
31
32
  module HCl
32
- class App
33
- include HCl::Utility
34
-
35
- SETTINGS_FILE = "#{ENV['HOME']}/.hcl_settings"
36
- CONFIG_FILE = "#{ENV['HOME']}/.hcl_config"
33
+ VERSION = "0.2.3"
37
34
 
38
- class UnknownCommand < StandardError; end
35
+ class App
36
+ include HCl::Utility
37
+ include HCl::Commands
38
+
39
+ SETTINGS_FILE = "#{ENV['HOME']}/.hcl_settings"
40
+ CONFIG_FILE = "#{ENV['HOME']}/.hcl_config"
41
+
42
+ class UnknownCommand < StandardError; end
43
+
44
+ def initialize
45
+ read_config
46
+ read_settings
47
+ end
39
48
 
40
- def self.command *args
41
- hcl = new.process_args(*args).run
42
- end
49
+ # Run the given command and arguments.
50
+ def self.command *args
51
+ hcl = new.process_args(*args).run
52
+ end
43
53
 
44
- def run
45
- begin
46
- if @command
47
- if respond_to? @command
48
- result = send @command, *@args
49
- if not result.nil?
50
- if result.respond_to? :to_a
51
- puts result.to_a.join(', ')
52
- elsif result.respond_to? :to_s
53
- puts result
54
+ # Return true if the string is a known command, false otherwise.
55
+ #
56
+ # @param [#to_s] command name of command
57
+ # @return [true, false]
58
+ def command? command
59
+ Commands.instance_methods.include? command.to_s
60
+ end
61
+
62
+ # Start the application.
63
+ def run
64
+ begin
65
+ if @command
66
+ if command? @command
67
+ result = send @command, *@args
68
+ if not result.nil?
69
+ if result.respond_to? :to_a
70
+ puts result.to_a.join(', ')
71
+ elsif result.respond_to? :to_s
72
+ puts result
73
+ end
54
74
  end
75
+ else
76
+ raise UnknownCommand, "unrecognized command `#{@command}'"
55
77
  end
56
78
  else
57
- raise UnknownCommand, "unrecognized command `#{@command}'"
79
+ show
58
80
  end
59
- else
60
- show
81
+ rescue TimesheetResource::Failure => e
82
+ puts "Internal failure. #{e}"
83
+ exit 1
61
84
  end
62
- rescue TimesheetResource::Failure => e
63
- puts "Internal failure. #{e}"
64
- exit 1
65
85
  end
66
- end
67
-
68
- def initialize
69
- read_config
70
- read_settings
71
- end
72
-
73
- def process_args *args
74
- Trollop::options(args) do
75
- stop_on %w[ show tasks set unset note add rm start stop ]
76
- banner <<-EOM
86
+
87
+ def process_args *args
88
+ Trollop::options(args) do
89
+ stop_on Commands.instance_methods
90
+ version "HCl version #{VERSION}"
91
+ banner <<-EOM
77
92
  HCl is a command-line client for manipulating Harvest time sheets.
78
93
 
79
94
  Commands:
@@ -81,6 +96,7 @@ Commands:
81
96
  hcl tasks
82
97
  hcl aliases
83
98
  hcl set <key> <value ...>
99
+ hcl unset <key>
84
100
  hcl start <task> [msg]
85
101
  hcl stop [msg]
86
102
  hcl note <msg>
@@ -95,140 +111,54 @@ Examples:
95
111
 
96
112
  Options:
97
113
  EOM
98
- end
99
- @command = args.shift
100
- @args = args
101
- self
102
- end
103
-
104
- def tasks
105
- tasks = Task.all
106
- if tasks.empty?
107
- puts "No cached tasks. Run `hcl show' to populate the cache and try again."
108
- else
109
- tasks.each { |task| puts "#{task.project.id} #{task.id}\t#{task}" }
110
- end
111
- nil
112
- end
113
-
114
- def read_config
115
- if File.exists? CONFIG_FILE
116
- config = YAML::load File.read(CONFIG_FILE)
117
- TimesheetResource.configure config
118
- elsif File.exists? old_conf = File.dirname(__FILE__) + "/../hcl_conf.yml"
119
- config = YAML::load File.read(old_conf)
120
- TimesheetResource.configure config
121
- write_config config
122
- else
123
- config = {}
124
- puts "Please specify your Harvest credentials.\n"
125
- config['login'] = ask("Email Address: ")
126
- config['password'] = ask("Password: ") { |q| q.echo = false }
127
- config['subdomain'] = ask("Subdomain: ")
128
- TimesheetResource.configure config
129
- write_config config
130
- end
131
- end
132
-
133
- def write_config config
134
- puts "Writing configuration to #{CONFIG_FILE}."
135
- File.open(CONFIG_FILE, 'w') do |f|
136
- f.write config.to_yaml
137
- end
138
- end
139
-
140
- def read_settings
141
- if File.exists? SETTINGS_FILE
142
- @settings = YAML.load(File.read(SETTINGS_FILE))
143
- else
144
- @settings = {}
145
- end
146
- end
147
-
148
- def write_settings
149
- File.open(SETTINGS_FILE, 'w') do |f|
150
- f.write @settings.to_yaml
151
- end
152
- nil
153
- end
154
-
155
- def set key = nil, *args
156
- if key.nil?
157
- @settings.each do |k, v|
158
- puts "#{k}: #{v}"
159
114
  end
160
- else
161
- value = args.join(' ')
162
- @settings ||= {}
163
- @settings[key] = value
164
- write_settings
115
+ @command = args.shift
116
+ @args = args
117
+ self
165
118
  end
166
- nil
167
- end
168
-
169
- def unset key
170
- @settings.delete key
171
- write_settings
172
- end
173
119
 
174
- def aliases
175
- @settings.keys.select { |s| s =~ /^task\./ }.map { |s| s.slice(5..-1) }
176
- end
177
-
178
- def start *args
179
- starting_time = args.detect {|x| x =~ /^\+\d*(\.|:)\d+$/ }
180
- if starting_time
181
- args.delete(starting_time)
182
- starting_time = time2float starting_time
183
- end
184
- ident = args.shift
185
- task_ids = if @settings.key? "task.#{ident}"
186
- @settings["task.#{ident}"].split(/\s+/)
120
+ protected
121
+
122
+ def read_config
123
+ if File.exists? CONFIG_FILE
124
+ config = YAML::load File.read(CONFIG_FILE)
125
+ TimesheetResource.configure config
126
+ elsif File.exists? old_conf = File.dirname(__FILE__) + "/../hcl_conf.yml"
127
+ config = YAML::load File.read(old_conf)
128
+ TimesheetResource.configure config
129
+ write_config config
187
130
  else
188
- [ident, args.shift]
131
+ config = {}
132
+ puts "Please specify your Harvest credentials.\n"
133
+ config['login'] = ask("Email Address: ")
134
+ config['password'] = ask("Password: ") { |q| q.echo = false }
135
+ config['subdomain'] = ask("Subdomain: ")
136
+ TimesheetResource.configure config
137
+ write_config config
189
138
  end
190
- task = Task.find *task_ids
191
- if task.nil?
192
- puts "Unknown project/task alias, try one of the following: #{aliases.join(', ')}."
193
- exit 1
194
139
  end
195
- timer = task.start(:starting_time => starting_time, :note => args.join(' '))
196
- puts "Started timer for #{timer}."
197
- end
198
-
199
- def stop
200
- entry = DayEntry.with_timer
201
- if entry
202
- entry.toggle
203
- puts "Stopped #{entry}."
204
- else
205
- puts "No running timers found."
140
+
141
+ def write_config config
142
+ puts "Writing configuration to #{CONFIG_FILE}."
143
+ File.open(CONFIG_FILE, 'w') do |f|
144
+ f.write config.to_yaml
145
+ end
206
146
  end
207
- end
208
-
209
- def note *args
210
- message = args.join ' '
211
- entry = DayEntry.with_timer
212
- if entry
213
- entry.append_note message
214
- puts "Added note '#{message}' to #{entry}."
215
- else
216
- puts "No running timers found."
147
+
148
+ def read_settings
149
+ if File.exists? SETTINGS_FILE
150
+ @settings = YAML.load(File.read(SETTINGS_FILE))
151
+ else
152
+ @settings = {}
153
+ end
217
154
  end
218
- end
219
-
220
- def show *args
221
- date = args.empty? ? nil : Chronic.parse(args.join(' '))
222
- total_hours = 0.0
223
- DayEntry.all(date).each do |day|
224
- running = day.running? ? '(running) ' : ''
225
- puts "\t#{day.formatted_hours}\t#{running}#{day.project} #{day.notes}"[0..78]
226
- total_hours = total_hours + day.hours.to_f
155
+
156
+ def write_settings
157
+ File.open(SETTINGS_FILE, 'w') do |f|
158
+ f.write @settings.to_yaml
159
+ end
160
+ nil
227
161
  end
228
- puts "\t" + '-' * 13
229
- puts "\t#{as_hours total_hours}\ttotal"
230
- end
231
-
232
162
  end
233
163
  end
234
164
 
@@ -0,0 +1,90 @@
1
+ module HCl
2
+ module Commands
3
+ def tasks
4
+ tasks = Task.all
5
+ if tasks.empty?
6
+ puts "No cached tasks. Run `hcl show' to populate the cache and try again."
7
+ else
8
+ tasks.each { |task| puts "#{task.project.id} #{task.id}\t#{task}" }
9
+ end
10
+ nil
11
+ end
12
+
13
+ def set key = nil, *args
14
+ if key.nil?
15
+ @settings.each do |k, v|
16
+ puts "#{k}: #{v}"
17
+ end
18
+ else
19
+ value = args.join(' ')
20
+ @settings ||= {}
21
+ @settings[key] = value
22
+ write_settings
23
+ end
24
+ nil
25
+ end
26
+
27
+ def unset key
28
+ @settings.delete key
29
+ write_settings
30
+ end
31
+
32
+ def aliases
33
+ @settings.keys.select { |s| s =~ /^task\./ }.map { |s| s.slice(5..-1) }
34
+ end
35
+
36
+ def start *args
37
+ starting_time = args.detect {|x| x =~ /^\+\d*(\.|:)?\d+$/ }
38
+ if starting_time
39
+ args.delete(starting_time)
40
+ starting_time = time2float starting_time
41
+ end
42
+ ident = args.shift
43
+ task_ids = if @settings.key? "task.#{ident}"
44
+ @settings["task.#{ident}"].split(/\s+/)
45
+ else
46
+ [ident, args.shift]
47
+ end
48
+ task = Task.find *task_ids
49
+ if task.nil?
50
+ puts "Unknown project/task alias, try one of the following: #{aliases.join(', ')}."
51
+ exit 1
52
+ end
53
+ timer = task.start(:starting_time => starting_time, :note => args.join(' '))
54
+ puts "Started timer for #{timer}."
55
+ end
56
+
57
+ def stop
58
+ entry = DayEntry.with_timer
59
+ if entry
60
+ entry.toggle
61
+ puts "Stopped #{entry}."
62
+ else
63
+ puts "No running timers found."
64
+ end
65
+ end
66
+
67
+ def note *args
68
+ message = args.join ' '
69
+ entry = DayEntry.with_timer
70
+ if entry
71
+ entry.append_note message
72
+ puts "Added note '#{message}' to #{entry}."
73
+ else
74
+ puts "No running timers found."
75
+ end
76
+ end
77
+
78
+ def show *args
79
+ date = args.empty? ? nil : Chronic.parse(args.join(' '))
80
+ total_hours = 0.0
81
+ DayEntry.all(date).each do |day|
82
+ running = day.running? ? '(running) ' : ''
83
+ puts "\t#{day.formatted_hours}\t#{running}#{day.project} #{day.notes}"[0..78]
84
+ total_hours = total_hours + day.hours.to_f
85
+ end
86
+ puts "\t" + '-' * 13
87
+ puts "\t#{as_hours total_hours}\ttotal"
88
+ end
89
+ end
90
+ end
data/lib/hcl/day_entry.rb CHANGED
@@ -23,18 +23,17 @@ module HCl
23
23
  end
24
24
  end
25
25
 
26
+ def notes
27
+ super || @data[:notes] = ''
28
+ end
29
+
26
30
  # Append a string to the notes for this task.
27
31
  def append_note new_notes
28
32
  # If I don't include hours it gets reset.
29
33
  # This doens't appear to be the case for task and project.
30
- if notes.nil?
31
- notes = new_notes
32
- else
33
- notes << " #{new_notes}"
34
- end
35
34
  DayEntry.post("daily/update/#{id}", <<-EOD)
36
35
  <request>
37
- <notes>#{notes}</notes>
36
+ <notes>#{notes << " #{new_notes}"}</notes>
38
37
  <hours>#{hours}</hours>
39
38
  </request>
40
39
  EOD
data/lib/hcl/utility.rb CHANGED
@@ -1,16 +1,23 @@
1
1
  module HCl
2
2
  module Utility
3
3
  # Convert from decimal to a string of the form HH:MM.
4
+ #
5
+ # @param [#to_f] hours number of hours in decimal
6
+ # @return [String] of the form "HH:MM"
4
7
  def as_hours hours
5
8
  minutes = hours.to_f * 60.0
6
9
  sprintf "%d:%02d", (minutes / 60).to_i, (minutes % 60).to_i
7
10
  end
8
11
 
12
+ # Convert from a time span in hour or decimal format to a float.
13
+ #
14
+ # @param [String] time_string either "M:MM" or decimal
15
+ # @return [#to_f] converted to a floating-point number
9
16
  def time2float time_string
10
17
  if time_string =~ /:/
11
18
  hours, minutes = time_string.split(':')
12
19
  hours.to_f + (minutes.to_f / 60.0)
13
- elsif time_string =~ /./
20
+ else
14
21
  time_string.to_f
15
22
  end
16
23
  end
data/test/app_test.rb ADDED
@@ -0,0 +1,8 @@
1
+ require 'test_helper'
2
+ class AppTest < Test::Unit::TestCase
3
+
4
+ should "permit commands from the HCl::Commands module" do
5
+ app = HCl::App.new
6
+ assert HCl::Commands.instance_methods.all? { |c| app.command? c }
7
+ end
8
+ end
@@ -0,0 +1,49 @@
1
+ require 'test_helper'
2
+
3
+ class DayEntryTest < Test::Unit::TestCase
4
+ should "read DayEntry xml" do
5
+ entries = HCl::DayEntry.from_xml(<<-EOD)
6
+ <daily>
7
+ <for_day type="date">Wed, 18 Oct 2006</for_day>
8
+ <day_entries>
9
+ <day_entry>
10
+ <id type="integer">195168</id>
11
+ <client>Iridesco</client>
12
+ <project>Harvest</project>
13
+ <task>Backend Programming</task>
14
+ <hours type="float">2.06</hours>
15
+ <notes>Test api support</notes>
16
+ <timer_started_at type="datetime">
17
+ Wed, 18 Oct 2006 09:53:06 -0000
18
+ </timer_started_at>
19
+ <created_at type="datetime">Wed, 18 Oct 2006 09:53:06 -0000</created_at>
20
+ </day_entry>
21
+ </day_entries>
22
+ </daily>
23
+ EOD
24
+ assert_equal 1, entries.size
25
+ {
26
+ :project => 'Harvest',
27
+ :client => 'Iridesco',
28
+ :task => 'Backend Programming',
29
+ :notes => 'Test api support',
30
+ :hours => '2.06',
31
+ }.each do |method, value|
32
+ assert_equal value, entries.first.send(method)
33
+ end
34
+ end
35
+
36
+ should "append to an existing note" do
37
+ entry = HCl::DayEntry.new(:id => '1', :notes => 'yourmom.', :hours => '1.0')
38
+ HCl::DayEntry.stubs(:post)
39
+ entry.append_note('hi world')
40
+ assert_equal 'yourmom. hi world', entry.notes
41
+ end
42
+
43
+ should "append to an undefined note" do
44
+ entry = HCl::DayEntry.new(:id => '1', :notes => nil, :hours => '1.0')
45
+ HCl::DayEntry.stubs(:post)
46
+ entry.append_note('hi world')
47
+ assert_equal ' hi world', entry.notes
48
+ end
49
+ end
@@ -0,0 +1,6 @@
1
+ $:.unshift(File.dirname(__FILE__) + '/../lib')
2
+
3
+ require 'test/unit'
4
+ require 'hcl/app'
5
+ require 'shoulda'
6
+ require 'mocha'
@@ -0,0 +1,17 @@
1
+ require 'test_helper'
2
+
3
+ class UtilityTest < Test::Unit::TestCase
4
+ include HCl::Utility
5
+
6
+ should "convert decimal input when converting time2float" do
7
+ assert_equal 2.5, time2float("2.5")
8
+ end
9
+
10
+ should "convert HH:MM input when converting time2float" do
11
+ assert_equal 2.5, time2float("2:30")
12
+ end
13
+
14
+ should "assume decimal input when converting time2float" do
15
+ assert_equal 2.0, time2float("2")
16
+ end
17
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zenhob-hcl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Zack Hobson
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-08-09 00:00:00 -07:00
12
+ date: 2009-08-23 00:00:00 -07:00
13
13
  default_executable: hcl
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -62,8 +62,9 @@ extra_rdoc_files:
62
62
  - LICENSE
63
63
  - README.markdown
64
64
  files:
65
+ - .document
65
66
  - .gitignore
66
- - .gitmodules
67
+ - CHANGELOG
67
68
  - LICENSE
68
69
  - README.markdown
69
70
  - Rakefile
@@ -71,13 +72,17 @@ files:
71
72
  - bin/hcl
72
73
  - deps.rip
73
74
  - hcl.gemspec
74
- - hcl_conf.yml.example
75
75
  - lib/hcl/app.rb
76
+ - lib/hcl/commands.rb
76
77
  - lib/hcl/day_entry.rb
77
78
  - lib/hcl/project.rb
78
79
  - lib/hcl/task.rb
79
80
  - lib/hcl/timesheet_resource.rb
80
81
  - lib/hcl/utility.rb
82
+ - test/app_test.rb
83
+ - test/day_entry_test.rb
84
+ - test/test_helper.rb
85
+ - test/utility_test.rb
81
86
  has_rdoc: true
82
87
  homepage: http://github.com/zenhob/hcl
83
88
  licenses:
@@ -105,5 +110,8 @@ rubygems_version: 1.3.5
105
110
  signing_key:
106
111
  specification_version: 2
107
112
  summary: Harvest timesheets from the command-line
108
- test_files: []
109
-
113
+ test_files:
114
+ - test/app_test.rb
115
+ - test/day_entry_test.rb
116
+ - test/test_helper.rb
117
+ - test/utility_test.rb
data/.gitmodules DELETED
@@ -1,3 +0,0 @@
1
- [submodule "ext/harvest"]
2
- path = ext/harvest
3
- url = git://github.com/aiaio/harvest.git
data/hcl_conf.yml.example DELETED
@@ -1,3 +0,0 @@
1
- subdomain: mycompany
2
- login: me@mycompany.com
3
- password: secret