hcl 0.3.0 → 0.3.1

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/CHANGELOG CHANGED
@@ -1,5 +1,17 @@
1
1
  = Recent Changes in HCl
2
2
 
3
+ == v0.3.1
4
+
5
+ * use STDERR instead of STDOUT for error reporting
6
+ * sort tasks before viewing tasks (brian@madebyrocket.com)
7
+ * resume command to resume the most recently active timer (brian@madebyrocket.com)
8
+ * show current time when on 'start', 'stop', and 'show' commands (scharfie@gmail.com)
9
+ * include client name in tasks list (scharfie@gmail.com)
10
+
11
+ == v0.3.0 Fri Apr 2 10:42:20 2010 -0700
12
+
13
+ * added support for free accounts
14
+
3
15
  == v0.2.3 Sun Aug 23 21:39:34 2009 -0700
4
16
 
5
17
  * Allow decimal time offset without a dot, closes #29.
@@ -0,0 +1,21 @@
1
+ # Hacking HCl
2
+
3
+ ## Rubygems
4
+
5
+ They're useful so we use them to install our gems. However there's no need to
6
+ explicitly include rubygems in the app. That's up the system to decide. Don't
7
+ require rubygems in the code.
8
+
9
+ We require rubygems in the test as a developer convenience.
10
+
11
+ ## Running HCl in place
12
+
13
+ This is common and supported:
14
+
15
+ ruby -rubygems -Ilib bin/hcl
16
+
17
+ Don't add dir(__FILE__)/lib to the load path in the binary. Bad manners.
18
+
19
+ ## That's it
20
+
21
+ That's it. I mostly wrote this to explain why I rolled back certain changes.
@@ -7,18 +7,22 @@ HCl is a command-line tool for interacting with Harvest time sheets using the
7
7
 
8
8
  ## Quick Start
9
9
 
10
- You can install hcl from Gemcutter:
10
+ You can install hcl directly from rubygems.org:
11
11
 
12
12
  $ gem install hcl
13
13
  $ hcl show [date]
14
14
 
15
+ or you can install from source using jeweler:
16
+
17
+ $ gem install jeweler
18
+ $ rake install
19
+
15
20
  ### Prerequisites
16
21
 
17
22
  * Ruby (tested with 1.8.7)
18
23
  * Ruby OpenSSL support (in debian/ubuntu: apt-get install libopenssl-ruby)
19
24
  * Ruby extension building support (in debian/ubuntu: apt-get install ruby-dev)
20
25
  * RubyGems 1.3.3
21
- * Gemcutter (gem install gemcutter; gem tumble)
22
26
  * Trollop option-parsing library (gem install trollop)
23
27
  * Chronic date-parsing library (gem install chronic)
24
28
  * HighLine console input library (gem install highline)
@@ -32,7 +36,9 @@ You can install hcl from Gemcutter:
32
36
  hcl unset <key>
33
37
  hcl start (<task_alias> | <project_id> <task_id>) [+time] [msg ...]
34
38
  hcl note <msg ...>
35
- hcl stop
39
+ hcl aliases
40
+ hcl stop [msg]
41
+ hcl resume
36
42
 
37
43
  ### Starting a Timer
38
44
 
@@ -95,10 +101,16 @@ commands show the timesheet for the specified day:
95
101
 
96
102
  ## Author
97
103
 
98
- [Zack Hobson][zgh], [OpenSourcery LLC][os]
104
+ HCl was designed and implemented by [Zack Hobson][zgh].
105
+
106
+ * Non-SSL support by [Michael Bleigh][mbleigh].
107
+ * Resume command by [Brian Cooke][bricooke].
108
+ * UI improvements by [Chris Scharf][scharfie].
99
109
 
100
110
  See LICENSE for copyright details.
101
111
 
102
- [zgh]: mailto:zack@opensourcery.com
103
- [os]: http://www.opensourcery.com/
112
+ [zgh]: http://github.com/zenhob
113
+ [mbleigh]: http://github.com/mbleigh
114
+ [bricooke]: http://github.com/bricooke
115
+ [scharfie]: http://github.com/scharfie
104
116
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.0
1
+ 0.3.1
data/bin/hcl CHANGED
@@ -1,6 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require 'hcl/app'
4
-
5
4
  HCl::App.command *ARGV
6
5
 
@@ -1,63 +1,55 @@
1
1
  # Generated by jeweler
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{hcl}
8
- s.version = "0.3.0"
8
+ s.version = "0.3.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Zack Hobson"]
12
- s.date = %q{2010-04-02}
12
+ s.date = %q{2011-07-13}
13
13
  s.default_executable = %q{hcl}
14
14
  s.description = %q{HCl is a command-line client for manipulating Harvest time sheets.}
15
15
  s.email = %q{zack@opensourcery.com}
16
16
  s.executables = ["hcl"]
17
17
  s.extra_rdoc_files = [
18
18
  "LICENSE",
19
- "README.markdown"
19
+ "README.markdown"
20
20
  ]
21
21
  s.files = [
22
22
  ".document",
23
- ".gitignore",
24
- "CHANGELOG",
25
- "LICENSE",
26
- "README.markdown",
27
- "Rakefile",
28
- "VERSION",
29
- "bin/hcl",
30
- "deps.rip",
31
- "hcl.gemspec",
32
- "lib/hcl/app.rb",
33
- "lib/hcl/commands.rb",
34
- "lib/hcl/day_entry.rb",
35
- "lib/hcl/project.rb",
36
- "lib/hcl/task.rb",
37
- "lib/hcl/timesheet_resource.rb",
38
- "lib/hcl/utility.rb",
39
- "test/app_test.rb",
40
- "test/day_entry_test.rb",
41
- "test/test_helper.rb",
42
- "test/utility_test.rb"
23
+ "CHANGELOG",
24
+ "HACKING.markdown",
25
+ "LICENSE",
26
+ "README.markdown",
27
+ "Rakefile",
28
+ "VERSION",
29
+ "bin/hcl",
30
+ "deps.rip",
31
+ "hcl.gemspec",
32
+ "lib/hcl/app.rb",
33
+ "lib/hcl/commands.rb",
34
+ "lib/hcl/day_entry.rb",
35
+ "lib/hcl/project.rb",
36
+ "lib/hcl/task.rb",
37
+ "lib/hcl/timesheet_resource.rb",
38
+ "lib/hcl/utility.rb",
39
+ "test/app_test.rb",
40
+ "test/day_entry_test.rb",
41
+ "test/test_helper.rb",
42
+ "test/utility_test.rb"
43
43
  ]
44
44
  s.homepage = %q{http://github.com/zenhob/hcl}
45
- s.rdoc_options = ["--charset=UTF-8"]
46
45
  s.require_paths = ["lib"]
47
- s.rubygems_version = %q{1.3.6}
46
+ s.rubygems_version = %q{1.4.1}
48
47
  s.summary = %q{Harvest timesheets from the command-line}
49
- s.test_files = [
50
- "test/app_test.rb",
51
- "test/day_entry_test.rb",
52
- "test/test_helper.rb",
53
- "test/utility_test.rb"
54
- ]
55
48
 
56
49
  if s.respond_to? :specification_version then
57
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
58
50
  s.specification_version = 3
59
51
 
60
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
52
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
61
53
  s.add_runtime_dependency(%q<termios>, [">= 0"])
62
54
  s.add_runtime_dependency(%q<trollop>, [">= 1.10.2"])
63
55
  s.add_runtime_dependency(%q<chronic>, [">= 0.2.3"])
@@ -30,7 +30,7 @@ class Net::HTTP
30
30
  end
31
31
 
32
32
  module HCl
33
- VERSION = "0.2.3"
33
+ VERSION = "0.3.1"
34
34
 
35
35
  class App
36
36
  include HCl::Utility
@@ -39,8 +39,6 @@ module HCl
39
39
  SETTINGS_FILE = "#{ENV['HOME']}/.hcl_settings"
40
40
  CONFIG_FILE = "#{ENV['HOME']}/.hcl_config"
41
41
 
42
- class UnknownCommand < StandardError; end
43
-
44
42
  def initialize
45
43
  read_config
46
44
  read_settings
@@ -73,13 +71,17 @@ module HCl
73
71
  end
74
72
  end
75
73
  else
76
- raise UnknownCommand, "unrecognized command `#{@command}'"
74
+ STDERR.puts "unrecognized command `#{@command}'"
75
+ exit 1
77
76
  end
78
77
  else
79
78
  show
80
79
  end
80
+ rescue RuntimeError => e
81
+ STDERR.puts "Error: #{e}"
82
+ exit 1
81
83
  rescue TimesheetResource::Failure => e
82
- puts "Internal failure. #{e}"
84
+ STDERR.puts "Internal failure. #{e}"
83
85
  exit 1
84
86
  end
85
87
  end
@@ -99,6 +101,7 @@ Commands:
99
101
  hcl unset <key>
100
102
  hcl start <task> [msg]
101
103
  hcl stop [msg]
104
+ hcl resume
102
105
  hcl note <msg>
103
106
 
104
107
  Examples:
@@ -51,14 +51,14 @@ module HCl
51
51
  exit 1
52
52
  end
53
53
  timer = task.start(:starting_time => starting_time, :note => args.join(' '))
54
- puts "Started timer for #{timer}."
54
+ puts "Started timer for #{timer} (at #{current_time})"
55
55
  end
56
-
56
+
57
57
  def stop
58
58
  entry = DayEntry.with_timer
59
59
  if entry
60
60
  entry.toggle
61
- puts "Stopped #{entry}."
61
+ puts "Stopped #{entry} (at #{current_time})"
62
62
  else
63
63
  puts "No running timers found."
64
64
  end
@@ -84,7 +84,22 @@ module HCl
84
84
  total_hours = total_hours + day.hours.to_f
85
85
  end
86
86
  puts "\t" + '-' * 13
87
- puts "\t#{as_hours total_hours}\ttotal"
87
+ puts "\t#{as_hours total_hours}\ttotal (as of #{current_time})"
88
+ end
89
+
90
+ def resume
91
+ entry = DayEntry.last
92
+ if entry
93
+ puts "Resumed #{entry} (at #{current_time})"
94
+ entry.toggle
95
+ else
96
+ puts "No timers found"
97
+ end
98
+ end
99
+
100
+ private
101
+ def current_time
102
+ Time.now.strftime('%I:%M %p').downcase
88
103
  end
89
104
  end
90
105
  end
@@ -11,7 +11,7 @@ module HCl
11
11
  end
12
12
 
13
13
  def to_s
14
- "#{client} #{project} #{task} (#{formatted_hours})"
14
+ "#{client} - #{project} - #{task} (#{formatted_hours})"
15
15
  end
16
16
 
17
17
  def self.from_xml xml
@@ -42,6 +42,10 @@ module HCl
42
42
  def self.with_timer
43
43
  all.detect {|t| t.running? }
44
44
  end
45
+
46
+ def self.last
47
+ all.sort {|a,b| a.updated_at<=>b.updated_at}[-1]
48
+ end
45
49
 
46
50
  def running?
47
51
  !@data[:timer_started_at].nil? && !@data[:timer_started_at].empty?
@@ -9,14 +9,25 @@ module HCl
9
9
  end)
10
10
  end
11
11
  unless tasks.empty?
12
- File.open(File.join(ENV['HOME'],'.hcl_tasks'), 'w') do |f|
12
+ File.open(cache_file, 'w') do |f|
13
13
  f.write tasks.uniq.to_yaml
14
14
  end
15
15
  end
16
16
  end
17
+
18
+ def self.cache_file
19
+ File.join(ENV['HOME'],'.hcl_tasks')
20
+ end
17
21
 
18
22
  def self.all
19
- YAML.load File.read(File.join(ENV['HOME'],'.hcl_tasks'))
23
+ tasks = File.exists?(cache_file) ? YAML.load(File.read(cache_file)) : []
24
+ tasks = tasks.sort do |a,b|
25
+ r = a.project.client <=> b.project.client
26
+ r = a.project.name <=> b.project.name if r == 0
27
+ r = a.name <=> b.name if r == 0
28
+ r
29
+ end
30
+ tasks
20
31
  end
21
32
 
22
33
  def self.find project_id, id
@@ -26,7 +37,7 @@ module HCl
26
37
  end
27
38
 
28
39
  def to_s
29
- "#{project.name} #{name}"
40
+ "#{project.client} - #{project.name} - #{name}"
30
41
  end
31
42
 
32
43
  def add opts
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hcl
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
4
+ hash: 17
5
+ prerelease:
5
6
  segments:
6
7
  - 0
7
8
  - 3
8
- - 0
9
- version: 0.3.0
9
+ - 1
10
+ version: 0.3.1
10
11
  platform: ruby
11
12
  authors:
12
13
  - Zack Hobson
@@ -14,16 +15,18 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2010-04-02 00:00:00 -07:00
18
+ date: 2011-07-13 00:00:00 -07:00
18
19
  default_executable: hcl
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
21
22
  name: termios
22
23
  prerelease: false
23
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
24
26
  requirements:
25
27
  - - ">="
26
28
  - !ruby/object:Gem::Version
29
+ hash: 3
27
30
  segments:
28
31
  - 0
29
32
  version: "0"
@@ -33,9 +36,11 @@ dependencies:
33
36
  name: trollop
34
37
  prerelease: false
35
38
  requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
36
40
  requirements:
37
41
  - - ">="
38
42
  - !ruby/object:Gem::Version
43
+ hash: 59
39
44
  segments:
40
45
  - 1
41
46
  - 10
@@ -47,9 +52,11 @@ dependencies:
47
52
  name: chronic
48
53
  prerelease: false
49
54
  requirement: &id003 !ruby/object:Gem::Requirement
55
+ none: false
50
56
  requirements:
51
57
  - - ">="
52
58
  - !ruby/object:Gem::Version
59
+ hash: 17
53
60
  segments:
54
61
  - 0
55
62
  - 2
@@ -61,9 +68,11 @@ dependencies:
61
68
  name: highline
62
69
  prerelease: false
63
70
  requirement: &id004 !ruby/object:Gem::Requirement
71
+ none: false
64
72
  requirements:
65
73
  - - ">="
66
74
  - !ruby/object:Gem::Version
75
+ hash: 1
67
76
  segments:
68
77
  - 1
69
78
  - 5
@@ -75,9 +84,11 @@ dependencies:
75
84
  name: shoulda
76
85
  prerelease: false
77
86
  requirement: &id005 !ruby/object:Gem::Requirement
87
+ none: false
78
88
  requirements:
79
89
  - - ">="
80
90
  - !ruby/object:Gem::Version
91
+ hash: 3
81
92
  segments:
82
93
  - 0
83
94
  version: "0"
@@ -87,9 +98,11 @@ dependencies:
87
98
  name: mocha
88
99
  prerelease: false
89
100
  requirement: &id006 !ruby/object:Gem::Requirement
101
+ none: false
90
102
  requirements:
91
103
  - - ">="
92
104
  - !ruby/object:Gem::Version
105
+ hash: 3
93
106
  segments:
94
107
  - 0
95
108
  version: "0"
@@ -106,8 +119,8 @@ extra_rdoc_files:
106
119
  - README.markdown
107
120
  files:
108
121
  - .document
109
- - .gitignore
110
122
  - CHANGELOG
123
+ - HACKING.markdown
111
124
  - LICENSE
112
125
  - README.markdown
113
126
  - Rakefile
@@ -131,33 +144,34 @@ homepage: http://github.com/zenhob/hcl
131
144
  licenses: []
132
145
 
133
146
  post_install_message:
134
- rdoc_options:
135
- - --charset=UTF-8
147
+ rdoc_options: []
148
+
136
149
  require_paths:
137
150
  - lib
138
151
  required_ruby_version: !ruby/object:Gem::Requirement
152
+ none: false
139
153
  requirements:
140
154
  - - ">="
141
155
  - !ruby/object:Gem::Version
156
+ hash: 3
142
157
  segments:
143
158
  - 0
144
159
  version: "0"
145
160
  required_rubygems_version: !ruby/object:Gem::Requirement
161
+ none: false
146
162
  requirements:
147
163
  - - ">="
148
164
  - !ruby/object:Gem::Version
165
+ hash: 3
149
166
  segments:
150
167
  - 0
151
168
  version: "0"
152
169
  requirements: []
153
170
 
154
171
  rubyforge_project:
155
- rubygems_version: 1.3.6
172
+ rubygems_version: 1.4.1
156
173
  signing_key:
157
174
  specification_version: 3
158
175
  summary: Harvest timesheets from the command-line
159
- test_files:
160
- - test/app_test.rb
161
- - test/day_entry_test.rb
162
- - test/test_helper.rb
163
- - test/utility_test.rb
176
+ test_files: []
177
+
data/.gitignore DELETED
@@ -1,5 +0,0 @@
1
- *.sw[nop]
2
- pkg
3
- tags
4
- doc
5
- .yardoc