hcl 0.3.0 → 0.3.1

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