hcl 0.3.2 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 045ee48931cd77620aacf51495ce49a0e4621602
4
+ data.tar.gz: 61957cdfa90886797d896efabfcd5b7cb90db63b
5
+ SHA512:
6
+ metadata.gz: ec4895148c586158a395ae08de8e225fe94cea6a2d2102e90ebd99003bd1776314d0ebf871dcbfadebb38ee22029b60b9b79b3961be1078c7dbbc676469a7b4e
7
+ data.tar.gz: 3411878c71f1f625f9b983a77041108826ea74c1f8723559ec6ccce09798a7436dfc89abac31fa765faed4f72090342f3bf1f69e9318affeb8d16a7e2008141d
data/CHANGELOG CHANGED
@@ -1,5 +1,15 @@
1
1
  = Recent Changes in HCl
2
2
 
3
+ == v0.4.1
4
+
5
+ * update dependencies
6
+
7
+ == v0.4.0
8
+
9
+ * start a timer or add a note without having to specify the sub-command
10
+ * aliases can be specified with "@" anywhere on the command line
11
+ * added alias and unalias to simplify setting task aliases
12
+
3
13
  == v0.3.2
4
14
 
5
15
  * fixed support for modern Rubies
data/README.markdown CHANGED
@@ -40,51 +40,53 @@ or you can install from source using jeweler:
40
40
  hcl stop [msg]
41
41
  hcl resume
42
42
 
43
- ### Starting a Timer
43
+ ### Available Projects and Tasks
44
44
 
45
45
  To start a new timer you need to identify the project and task. After you've
46
46
  used the show command you can use the tasks command to view a cached list of
47
- available tasks. The first two numbers in each row are the project and task
48
- IDs. You need both values to start a timer:
47
+ available tasks.
49
48
 
50
- $ hcl show
51
- -------------
52
- 0:00 total
53
49
  $ hcl tasks
54
- 1234 5678 ClientX Software Development
55
- 1234 9876 ClientX Admin
56
- $ hcl start 1234 5678 adding a new feature
57
50
 
58
- ### Task Aliases
51
+ ### Starting a Timer
59
52
 
60
53
  Since it's not practical to enter two long numbers every time you want to
61
54
  identify a task, HCl supports task aliases:
62
55
 
63
- $ hcl set task.xdev 1234 5678
64
- $ hcl start xdev adding a new feature
56
+ $ hcl alias xdev 1234 5678
57
+ $ hcl @xdev Adding a new feature!
65
58
 
66
59
  ### Starting a Timer with Initial Time
67
60
 
68
61
  You can also provide an initial time when starting a new timer.
69
62
  This can be expressed in floating-point or HH:MM. The following two
70
- commands are identical:
63
+ commands are equivalent:
71
64
 
72
- $ hcl start xdev +0:15 adding a new feature
73
- $ hcl start +.25 xdev adding a new feature
65
+ $ hcl @xdev +0:15 Adding a new feature!
66
+ $ hcl +.25 @xdev Adding a new feature!
74
67
 
75
68
  ### Adding Notes to a Running Task
76
69
 
77
- While a task is running you can append strings to the note for that task:
70
+ While a task is running you can append lines to the task notes.
71
+ Providing the note command is optional, just the bare message will work.
72
+ These two commands are equivalent:
78
73
 
79
- $ hcl note Found a good time
80
- $ hcl note or not, whatever...
74
+ $ hcl Found a good time!
75
+ $ hcl note Found a good time!
81
76
 
82
77
  ### Stopping a Timer
83
78
 
84
79
  The following command will stop a running timer (currently only one timer at
85
- a time is supported):
80
+ a time is supported). You can provide a message when stopping a timer as
81
+ well:
82
+
83
+ $ hcl stop All done!
84
+
85
+ ### Resuming a Timer
86
+
87
+ You can easily resume the last stopped timer:
86
88
 
87
- $ hcl stop
89
+ $ hcl resume
88
90
 
89
91
  ### Date Formats
90
92
 
data/Rakefile CHANGED
@@ -11,12 +11,13 @@ begin
11
11
  gem.name = "hcl"
12
12
  gem.summary = "Harvest timesheets from the command-line"
13
13
  gem.description = "HCl is a command-line client for manipulating Harvest time sheets."
14
- gem.email = "zack@opensourcery.com"
14
+ gem.email = "zack@zackhobson.com"
15
15
  gem.homepage = "http://github.com/zenhob/hcl"
16
16
  gem.authors = ["Zack Hobson"]
17
- gem.add_dependency "trollop", ">= 1.10.2"
18
- gem.add_dependency "chronic", ">= 0.2.3"
19
- gem.add_dependency "highline", ">= 1.5.1"
17
+ gem.license = "MIT"
18
+ gem.add_dependency "trollop"
19
+ gem.add_dependency "chronic"
20
+ gem.add_dependency "highline"
20
21
  gem.add_development_dependency "shoulda"
21
22
  gem.add_development_dependency "mocha"
22
23
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.2
1
+ 0.4.1
data/hcl.gemspec CHANGED
@@ -4,15 +4,14 @@
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
- s.name = %q{hcl}
8
- s.version = "0.3.1"
7
+ s.name = "hcl"
8
+ s.version = "0.4.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{2011-07-13}
13
- s.default_executable = %q{hcl}
14
- s.description = %q{HCl is a command-line client for manipulating Harvest time sheets.}
15
- s.email = %q{zack@opensourcery.com}
12
+ s.date = "2013-11-18"
13
+ s.description = "HCl is a command-line client for manipulating Harvest time sheets."
14
+ s.email = "zack@zackhobson.com"
16
15
  s.executables = ["hcl"]
17
16
  s.extra_rdoc_files = [
18
17
  "LICENSE",
@@ -41,34 +40,32 @@ Gem::Specification.new do |s|
41
40
  "test/test_helper.rb",
42
41
  "test/utility_test.rb"
43
42
  ]
44
- s.homepage = %q{http://github.com/zenhob/hcl}
43
+ s.homepage = "http://github.com/zenhob/hcl"
44
+ s.licenses = ["MIT"]
45
45
  s.require_paths = ["lib"]
46
- s.rubygems_version = %q{1.4.1}
47
- s.summary = %q{Harvest timesheets from the command-line}
46
+ s.rubygems_version = "2.0.3"
47
+ s.summary = "Harvest timesheets from the command-line"
48
48
 
49
49
  if s.respond_to? :specification_version then
50
- s.specification_version = 3
50
+ s.specification_version = 4
51
51
 
52
52
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
53
- s.add_runtime_dependency(%q<termios>, [">= 0"])
54
- s.add_runtime_dependency(%q<trollop>, [">= 1.10.2"])
55
- s.add_runtime_dependency(%q<chronic>, [">= 0.2.3"])
56
- s.add_runtime_dependency(%q<highline>, [">= 1.5.1"])
53
+ s.add_runtime_dependency(%q<trollop>, [">= 0"])
54
+ s.add_runtime_dependency(%q<chronic>, [">= 0"])
55
+ s.add_runtime_dependency(%q<highline>, [">= 0"])
57
56
  s.add_development_dependency(%q<shoulda>, [">= 0"])
58
57
  s.add_development_dependency(%q<mocha>, [">= 0"])
59
58
  else
60
- s.add_dependency(%q<termios>, [">= 0"])
61
- s.add_dependency(%q<trollop>, [">= 1.10.2"])
62
- s.add_dependency(%q<chronic>, [">= 0.2.3"])
63
- s.add_dependency(%q<highline>, [">= 1.5.1"])
59
+ s.add_dependency(%q<trollop>, [">= 0"])
60
+ s.add_dependency(%q<chronic>, [">= 0"])
61
+ s.add_dependency(%q<highline>, [">= 0"])
64
62
  s.add_dependency(%q<shoulda>, [">= 0"])
65
63
  s.add_dependency(%q<mocha>, [">= 0"])
66
64
  end
67
65
  else
68
- s.add_dependency(%q<termios>, [">= 0"])
69
- s.add_dependency(%q<trollop>, [">= 1.10.2"])
70
- s.add_dependency(%q<chronic>, [">= 0.2.3"])
71
- s.add_dependency(%q<highline>, [">= 1.5.1"])
66
+ s.add_dependency(%q<trollop>, [">= 0"])
67
+ s.add_dependency(%q<chronic>, [">= 0"])
68
+ s.add_dependency(%q<highline>, [">= 0"])
72
69
  s.add_dependency(%q<shoulda>, [">= 0"])
73
70
  s.add_dependency(%q<mocha>, [">= 0"])
74
71
  end
data/lib/hcl/app.rb CHANGED
@@ -3,6 +3,7 @@ require 'yaml'
3
3
  require 'rexml/document'
4
4
  require 'net/http'
5
5
  require 'net/https'
6
+ require 'fileutils'
6
7
 
7
8
  ## gem dependencies
8
9
  require 'chronic'
@@ -35,11 +36,14 @@ module HCl
35
36
  class App
36
37
  include HCl::Utility
37
38
  include HCl::Commands
38
-
39
- SETTINGS_FILE = "#{ENV['HOME']}/.hcl_settings"
40
- CONFIG_FILE = "#{ENV['HOME']}/.hcl_config"
41
-
39
+
40
+ SETTINGS_FILE = "#{ENV['HOME']}/.hcl/settings.yml"
41
+ CONFIG_FILE = "#{ENV['HOME']}/.hcl/config.yml"
42
+ OLD_SETTINGS_FILE = "#{ENV['HOME']}/.hcl_settings"
43
+ OLD_CONFIG_FILE = "#{ENV['HOME']}/.hcl_config"
44
+
42
45
  def initialize
46
+ FileUtils.mkdir_p(File.join(ENV['HOME'], ".hcl"))
43
47
  read_config
44
48
  read_settings
45
49
  end
@@ -56,7 +60,15 @@ module HCl
56
60
  def command? command
57
61
  Commands.method_defined? command
58
62
  end
59
-
63
+
64
+ def start_or_note *args
65
+ if DayEntry.with_timer
66
+ note *args
67
+ else
68
+ start *args
69
+ end
70
+ end
71
+
60
72
  # Start the application.
61
73
  def run
62
74
  begin
@@ -71,8 +83,7 @@ module HCl
71
83
  end
72
84
  end
73
85
  else
74
- STDERR.puts "unrecognized command `#{@command}'"
75
- exit 1
86
+ start_or_note @command, *@args
76
87
  end
77
88
  else
78
89
  show
@@ -88,7 +99,7 @@ module HCl
88
99
  exit 1
89
100
  end
90
101
  end
91
-
102
+
92
103
  def process_args *args
93
104
  Trollop::options(args) do
94
105
  stop_on Commands.instance_methods
@@ -97,23 +108,38 @@ module HCl
97
108
  HCl is a command-line client for manipulating Harvest time sheets.
98
109
 
99
110
  Commands:
100
- hcl show [date]
111
+ # show all available tasks
101
112
  hcl tasks
113
+
114
+ # set a task alias
115
+ hcl alias <task> <project_id> <task_id>
116
+
117
+ # list task aliases
102
118
  hcl aliases
103
- hcl set <key> <value ...>
104
- hcl unset <key>
105
- hcl start <task> [msg]
106
- hcl stop [msg]
119
+
120
+ # start a task using an alias
121
+ hcl @<task> [+time] [message]
122
+
123
+ # display the daily timesheet
124
+ hcl show [date]
125
+
126
+ # stop a running timer
127
+ hcl stop [message]
128
+
129
+ # resume the last stopped timer
107
130
  hcl resume
108
- hcl note <msg>
131
+
132
+ # add a line to your running timer
133
+ hcl note <message>
109
134
 
110
135
  Examples:
111
- $ hcl tasks
112
- $ hcl start 1234 4567 this is my log message
113
- $ hcl set task.mytask 1234 4567
114
- $ hcl start mytask this is my next log message
115
- $ hcl show yesterday
116
- $ hcl show last tuesday
136
+ hcl alias mytask 1234 4567
137
+ hcl @mytask +:15 Doing a thing that I started 15 minutes ago.
138
+ hcl Adding a note to my running task.
139
+ hcl stop That's enough for now.
140
+ hcl resume
141
+ hcl show yesterday
142
+ hcl show last tuesday
117
143
 
118
144
  Options:
119
145
  EOM
@@ -124,13 +150,13 @@ EOM
124
150
  end
125
151
 
126
152
  protected
127
-
153
+
128
154
  def read_config
129
155
  if File.exists? CONFIG_FILE
130
156
  config = YAML::load File.read(CONFIG_FILE)
131
157
  TimesheetResource.configure config
132
- elsif File.exists? old_conf = File.dirname(__FILE__) + "/../hcl_conf.yml"
133
- config = YAML::load File.read(old_conf)
158
+ elsif File.exists? OLD_CONFIG_FILE
159
+ config = YAML::load File.read(OLD_CONFIG_FILE)
134
160
  TimesheetResource.configure config
135
161
  write_config config
136
162
  else
@@ -144,22 +170,26 @@ EOM
144
170
  write_config config
145
171
  end
146
172
  end
147
-
173
+
148
174
  def write_config config
149
175
  puts "Writing configuration to #{CONFIG_FILE}."
150
176
  File.open(CONFIG_FILE, 'w') do |f|
151
177
  f.write config.to_yaml
152
178
  end
179
+ FileUtils.chmod 0400, CONFIG_FILE
153
180
  end
154
-
181
+
155
182
  def read_settings
156
183
  if File.exists? SETTINGS_FILE
157
184
  @settings = YAML.load(File.read(SETTINGS_FILE))
185
+ elsif File.exists? OLD_SETTINGS_FILE
186
+ @settings = YAML.load(File.read(OLD_SETTINGS_FILE))
187
+ write_settings
158
188
  else
159
189
  @settings = {}
160
190
  end
161
191
  end
162
-
192
+
163
193
  def write_settings
164
194
  File.open(SETTINGS_FILE, 'w') do |f|
165
195
  f.write @settings.to_yaml
data/lib/hcl/commands.rb CHANGED
@@ -9,7 +9,7 @@ module HCl
9
9
  end
10
10
  nil
11
11
  end
12
-
12
+
13
13
  def set key = nil, *args
14
14
  if key.nil?
15
15
  @settings.each do |k, v|
@@ -23,37 +23,66 @@ module HCl
23
23
  end
24
24
  nil
25
25
  end
26
-
26
+
27
27
  def unset key
28
28
  @settings.delete key
29
29
  write_settings
30
30
  end
31
-
31
+
32
+ def unalias task
33
+ unset "task.#{task}"
34
+ puts "Removed task alias @#{task}."
35
+ end
36
+
37
+ def alias task_name, *value
38
+ task = Task.find *value
39
+ if task
40
+ set "task.#{task_name}", *value
41
+ puts "Added alias @#{task_name} for #{task}."
42
+ else
43
+ puts "Unrecognized project and task ID: #{value.inspect}"
44
+ end
45
+ end
46
+
32
47
  def aliases
33
- @settings.keys.select { |s| s =~ /^task\./ }.map { |s| s.slice(5..-1) }
48
+ @settings.keys.select { |s| s =~ /^task\./ }.map { |s| "@"+s.slice(5..-1) }
34
49
  end
35
-
50
+
36
51
  def start *args
37
52
  starting_time = args.detect {|x| x =~ /^\+\d*(\.|:)?\d+$/ }
38
53
  if starting_time
39
54
  args.delete(starting_time)
40
55
  starting_time = time2float starting_time
41
56
  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]
57
+ ident = args.detect {|a| a[0] == '@' }
58
+ if ident
59
+ args.delete(ident)
60
+ ident = ident.slice(1..-1)
61
+ else
62
+ ident = args.shift
63
+ end
64
+ if ident
65
+ task_ids = if @settings.key? "task.#{ident}"
66
+ @settings["task.#{ident}"].split(/\s+/)
67
+ else
68
+ [ident, args.shift]
69
+ end
70
+ task = Task.find *task_ids
71
+ if task.nil?
72
+ puts "Unknown task alias, try one of the following: ", aliases.join(', ')
73
+ exit 1
47
74
  end
48
- task = Task.find *task_ids
49
- if task.nil?
50
- puts "Unknown project/task alias, try one of the following: #{aliases.join(', ')}."
75
+ timer = task.start(
76
+ :starting_time => starting_time,
77
+ :note => args.join(' ')
78
+ )
79
+ puts "Started timer for #{timer} (at #{current_time})"
80
+ else
81
+ puts "You must provide a task alias to start a timer:", aliases.join(', ')
51
82
  exit 1
52
83
  end
53
- timer = task.start(:starting_time => starting_time, :note => args.join(' '))
54
- puts "Started timer for #{timer} (at #{current_time})"
55
84
  end
56
-
85
+
57
86
  def stop *args
58
87
  entry = DayEntry.with_timer
59
88
  if entry
@@ -64,30 +93,31 @@ module HCl
64
93
  puts "No running timers found."
65
94
  end
66
95
  end
67
-
96
+
68
97
  def note *args
69
98
  message = args.join ' '
70
99
  entry = DayEntry.with_timer
71
100
  if entry
72
101
  entry.append_note message
73
- puts "Added note '#{message}' to #{entry}."
102
+ puts "Added note to #{entry}."
74
103
  else
75
104
  puts "No running timers found."
76
105
  end
77
106
  end
78
-
107
+
79
108
  def show *args
80
109
  date = args.empty? ? nil : Chronic.parse(args.join(' '))
81
110
  total_hours = 0.0
82
111
  DayEntry.all(date).each do |day|
83
112
  running = day.running? ? '(running) ' : ''
84
- puts "\t#{day.formatted_hours}\t#{running}#{day.project} #{day.notes}"[0..78]
113
+ columns = HighLine::SystemExtensions.terminal_size[0]
114
+ puts "\t#{day.formatted_hours}\t#{running}#{day.project}: #{day.notes.lines.last}"[0..columns-1]
85
115
  total_hours = total_hours + day.hours.to_f
86
116
  end
87
117
  puts "\t" + '-' * 13
88
118
  puts "\t#{as_hours total_hours}\ttotal (as of #{current_time})"
89
119
  end
90
-
120
+
91
121
  def resume
92
122
  entry = DayEntry.last
93
123
  if entry
@@ -97,7 +127,7 @@ module HCl
97
127
  puts "No timers found"
98
128
  end
99
129
  end
100
-
130
+
101
131
  private
102
132
  def current_time
103
133
  Time.now.strftime('%I:%M %p').downcase
data/lib/hcl/day_entry.rb CHANGED
@@ -31,18 +31,15 @@ module HCl
31
31
  def append_note new_notes
32
32
  # If I don't include hours it gets reset.
33
33
  # This doens't appear to be the case for task and project.
34
- DayEntry.post("daily/update/#{id}", <<-EOD)
35
- <request>
36
- <notes>#{notes << " #{new_notes}"}</notes>
37
- <hours>#{hours}</hours>
38
- </request>
39
- EOD
34
+ (self.notes << "\n#{new_notes}").lstrip!
35
+ DayEntry.post "daily/update/#{id}",
36
+ %{<request><notes>#{notes}</notes><hours>#{hours}</hours></request>}
40
37
  end
41
38
 
42
39
  def self.with_timer
43
40
  all.detect {|t| t.running? }
44
41
  end
45
-
42
+
46
43
  def self.last
47
44
  all.sort {|a,b| a.updated_at<=>b.updated_at}[-1]
48
45
  end
@@ -65,6 +62,5 @@ module HCl
65
62
  def formatted_hours
66
63
  as_hours hours
67
64
  end
68
-
69
65
  end
70
66
  end
data/lib/hcl/task.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require 'fileutils'
2
+
1
3
  module HCl
2
4
  class Task < TimesheetResource
3
5
  def self.cache_tasks doc
@@ -9,14 +11,19 @@ module HCl
9
11
  end)
10
12
  end
11
13
  unless tasks.empty?
14
+ FileUtils.mkdir_p(cache_dir)
12
15
  File.open(cache_file, 'w') do |f|
13
16
  f.write tasks.uniq.to_yaml
14
17
  end
15
18
  end
16
19
  end
17
-
20
+
18
21
  def self.cache_file
19
- File.join(ENV['HOME'],'.hcl_tasks')
22
+ File.join(cache_dir, 'tasks.yml')
23
+ end
24
+
25
+ def self.cache_dir
26
+ File.join(ENV['HOME'],'.hcl/cache')
20
27
  end
21
28
 
22
29
  def self.all
@@ -63,7 +70,6 @@ module HCl
63
70
  DayEntry.from_xml(Task.get("daily/timer/#{day.id}")).first
64
71
  end
65
72
  end
66
-
67
73
  end
68
74
  end
69
75
 
@@ -12,7 +12,7 @@ module HCl
12
12
  yield self
13
13
  end
14
14
  end
15
-
15
+
16
16
  # configuration accessors
17
17
  %w[ login password subdomain ssl ].each do |config_var|
18
18
  class_eval <<-EOC
@@ -24,11 +24,11 @@ module HCl
24
24
  end
25
25
  EOC
26
26
  end
27
-
27
+
28
28
  def initialize params
29
29
  @data = params
30
30
  end
31
-
31
+
32
32
  def self.get action
33
33
  http_do Net::HTTP::Get, action
34
34
  end
@@ -53,7 +53,7 @@ module HCl
53
53
  raise Failure, "Unexpected response from the upstream API"
54
54
  end
55
55
  end
56
-
56
+
57
57
  def id
58
58
  @data[:id]
59
59
  end
@@ -37,13 +37,13 @@ class DayEntryTest < Test::Unit::TestCase
37
37
  entry = HCl::DayEntry.new(:id => '1', :notes => 'yourmom.', :hours => '1.0')
38
38
  HCl::DayEntry.stubs(:post)
39
39
  entry.append_note('hi world')
40
- assert_equal 'yourmom. hi world', entry.notes
40
+ assert_equal "yourmom.\nhi world", entry.notes
41
41
  end
42
42
 
43
43
  should "append to an undefined note" do
44
44
  entry = HCl::DayEntry.new(:id => '1', :notes => nil, :hours => '1.0')
45
45
  HCl::DayEntry.stubs(:post)
46
46
  entry.append_note('hi world')
47
- assert_equal ' hi world', entry.notes
47
+ assert_equal 'hi world', entry.notes
48
48
  end
49
49
  end
data/test/test_helper.rb CHANGED
@@ -4,4 +4,4 @@ require 'rubygems'
4
4
  require 'test/unit'
5
5
  require 'hcl/app'
6
6
  require 'shoulda'
7
- require 'mocha'
7
+ require 'mocha/setup'
metadata CHANGED
@@ -1,109 +1,94 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: hcl
3
- version: !ruby/object:Gem::Version
4
- hash: 23
5
- prerelease:
6
- segments:
7
- - 0
8
- - 3
9
- - 2
10
- version: 0.3.2
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.1
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - Zack Hobson
14
8
  autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
-
18
- date: 2011-12-30 00:00:00 -08:00
19
- default_executable: hcl
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
11
+ date: 2013-11-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
22
14
  name: trollop
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 59
30
- segments:
31
- - 1
32
- - 10
33
- - 2
34
- version: 1.10.2
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
35
20
  type: :runtime
36
- version_requirements: *id001
37
- - !ruby/object:Gem::Dependency
38
- name: chronic
39
21
  prerelease: false
40
- requirement: &id002 !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
43
- - - ">="
44
- - !ruby/object:Gem::Version
45
- hash: 17
46
- segments:
47
- - 0
48
- - 2
49
- - 3
50
- version: 0.2.3
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: chronic
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
51
34
  type: :runtime
52
- version_requirements: *id002
53
- - !ruby/object:Gem::Dependency
54
- name: highline
55
35
  prerelease: false
56
- requirement: &id003 !ruby/object:Gem::Requirement
57
- none: false
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- hash: 1
62
- segments:
63
- - 1
64
- - 5
65
- - 1
66
- version: 1.5.1
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: highline
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
67
48
  type: :runtime
68
- version_requirements: *id003
69
- - !ruby/object:Gem::Dependency
70
- name: shoulda
71
49
  prerelease: false
72
- requirement: &id004 !ruby/object:Gem::Requirement
73
- none: false
74
- requirements:
75
- - - ">="
76
- - !ruby/object:Gem::Version
77
- hash: 3
78
- segments:
79
- - 0
80
- version: "0"
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: shoulda
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
81
62
  type: :development
82
- version_requirements: *id004
83
- - !ruby/object:Gem::Dependency
84
- name: mocha
85
63
  prerelease: false
86
- requirement: &id005 !ruby/object:Gem::Requirement
87
- none: false
88
- requirements:
89
- - - ">="
90
- - !ruby/object:Gem::Version
91
- hash: 3
92
- segments:
93
- - 0
94
- version: "0"
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: mocha
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
95
76
  type: :development
96
- version_requirements: *id005
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
97
83
  description: HCl is a command-line client for manipulating Harvest time sheets.
98
- email: zack@opensourcery.com
99
- executables:
84
+ email: zack@zackhobson.com
85
+ executables:
100
86
  - hcl
101
87
  extensions: []
102
-
103
- extra_rdoc_files:
88
+ extra_rdoc_files:
104
89
  - LICENSE
105
90
  - README.markdown
106
- files:
91
+ files:
107
92
  - .document
108
93
  - CHANGELOG
109
94
  - HACKING.markdown
@@ -125,39 +110,28 @@ files:
125
110
  - test/day_entry_test.rb
126
111
  - test/test_helper.rb
127
112
  - test/utility_test.rb
128
- has_rdoc: true
129
113
  homepage: http://github.com/zenhob/hcl
130
- licenses: []
131
-
114
+ licenses:
115
+ - MIT
116
+ metadata: {}
132
117
  post_install_message:
133
118
  rdoc_options: []
134
-
135
- require_paths:
119
+ require_paths:
136
120
  - lib
137
- required_ruby_version: !ruby/object:Gem::Requirement
138
- none: false
139
- requirements:
140
- - - ">="
141
- - !ruby/object:Gem::Version
142
- hash: 3
143
- segments:
144
- - 0
145
- version: "0"
146
- required_rubygems_version: !ruby/object:Gem::Requirement
147
- none: false
148
- requirements:
149
- - - ">="
150
- - !ruby/object:Gem::Version
151
- hash: 3
152
- segments:
153
- - 0
154
- version: "0"
121
+ required_ruby_version: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ required_rubygems_version: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - '>='
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
155
131
  requirements: []
156
-
157
132
  rubyforge_project:
158
- rubygems_version: 1.4.1
133
+ rubygems_version: 2.0.3
159
134
  signing_key:
160
- specification_version: 3
135
+ specification_version: 4
161
136
  summary: Harvest timesheets from the command-line
162
137
  test_files: []
163
-