one_inch_punch 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +7 -0
- data/bin/punch +6 -2
- data/lib/punch/version.rb +1 -1
- data/lib/punch.rb +15 -7
- data/spec/punch_command_spec.rb +85 -5
- data/spec/punch_spec.rb +102 -1
- metadata +2 -2
data/History.txt
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
== 0.1.3 2008-09-30
|
2
|
+
|
3
|
+
* 3 enhancements:
|
4
|
+
* Punching in and out can take a time (with now as a default)
|
5
|
+
* Punching in and out can take a message (in addition to the auto-generated time-based message)
|
6
|
+
* punch command options for in/out time and message
|
7
|
+
|
1
8
|
== 0.1.2 2008-08-28
|
2
9
|
|
3
10
|
* 1 tiny enhancement:
|
data/bin/punch
CHANGED
@@ -29,6 +29,10 @@ BANNER
|
|
29
29
|
"Restrict command to only after the given time") { |time| OPTIONS[:after] = Time.parse(time) }
|
30
30
|
opts.on('--before [TIME]', String,
|
31
31
|
"Restrict command to only before the given time") { |time| OPTIONS[:before] = Time.parse(time) }
|
32
|
+
opts.on('--at [TIME]', '--time [TIME]', String,
|
33
|
+
"Use the given time to punch in/out") { |time| OPTIONS[:time] = Time.parse(time) }
|
34
|
+
opts.on('-m', '--message [MESSAGE]', String,
|
35
|
+
"Add the given log message when punching in/out") { |message| OPTIONS[:message] = message }
|
32
36
|
opts.on("-h", "--help",
|
33
37
|
"Show this help message.") { puts opts; exit }
|
34
38
|
opts.parse!(ARGV)
|
@@ -54,7 +58,7 @@ commands = {
|
|
54
58
|
'total' => lambda { |project| puts Punch.total(project, OPTIONS.merge(:format => true)).inspect },
|
55
59
|
'in' => lambda do |project|
|
56
60
|
if project
|
57
|
-
if Punch.in(project)
|
61
|
+
if Punch.in(project, OPTIONS)
|
58
62
|
Punch.write
|
59
63
|
else
|
60
64
|
puts "Already punched in to '#{project}'"
|
@@ -72,7 +76,7 @@ commands = {
|
|
72
76
|
end
|
73
77
|
end,
|
74
78
|
'out' => lambda do |project|
|
75
|
-
if Punch.out(project)
|
79
|
+
if Punch.out(project, OPTIONS)
|
76
80
|
Punch.write
|
77
81
|
else
|
78
82
|
message = 'Already punched out of '
|
data/lib/punch/version.rb
CHANGED
data/lib/punch.rb
CHANGED
@@ -50,20 +50,23 @@ module Punch
|
|
50
50
|
status(project) == 'in'
|
51
51
|
end
|
52
52
|
|
53
|
-
def in(project)
|
53
|
+
def in(project, options = {})
|
54
54
|
return false if in?(project)
|
55
55
|
data[project] ||= []
|
56
|
-
time =
|
56
|
+
time = time_from_options(options)
|
57
57
|
data[project].push({'in' => time})
|
58
58
|
log(project, "punch in @ #{time.strftime('%Y-%m-%dT%H:%M:%S%z')}")
|
59
|
+
log(project, options[:message]) if options[:message]
|
59
60
|
true
|
60
61
|
end
|
61
62
|
|
62
|
-
def out(
|
63
|
+
def out(*args)
|
64
|
+
options = args.last.is_a?(Hash) ? args.pop : {}
|
65
|
+
project = args.first
|
63
66
|
if project
|
64
|
-
return false unless do_out_single(project)
|
67
|
+
return false unless do_out_single(project, options)
|
65
68
|
else
|
66
|
-
return false unless data.keys.collect { |project| do_out_single(project) }.any?
|
69
|
+
return false unless data.keys.collect { |project| do_out_single(project, options) }.any?
|
67
70
|
end
|
68
71
|
true
|
69
72
|
end
|
@@ -105,9 +108,10 @@ module Punch
|
|
105
108
|
|
106
109
|
private
|
107
110
|
|
108
|
-
def do_out_single(project)
|
111
|
+
def do_out_single(project, options)
|
109
112
|
return false if out?(project)
|
110
|
-
time =
|
113
|
+
time = time_from_options(options)
|
114
|
+
log(project, options[:message]) if options[:message]
|
111
115
|
log(project, "punch out @ #{time.strftime('%Y-%m-%dT%H:%M:%S%z')}")
|
112
116
|
data[project].last['out'] = time
|
113
117
|
end
|
@@ -124,5 +128,9 @@ module Punch
|
|
124
128
|
return total unless options[:format]
|
125
129
|
total.elapsed_time
|
126
130
|
end
|
131
|
+
|
132
|
+
def time_from_options(options)
|
133
|
+
options[:time] || options[:at] || Time.now
|
134
|
+
end
|
127
135
|
end
|
128
136
|
end
|
data/spec/punch_command_spec.rb
CHANGED
@@ -156,10 +156,36 @@ describe 'punch command' do
|
|
156
156
|
end
|
157
157
|
|
158
158
|
it 'should punch in to the given project' do
|
159
|
-
Punch.expects(:in).with(@project)
|
159
|
+
Punch.expects(:in).with(@project, {})
|
160
160
|
run_command('in', @project)
|
161
161
|
end
|
162
162
|
|
163
|
+
it 'should pass a time if specified on the command line (with --time)' do
|
164
|
+
time_option = '2008-08-23 15:39'
|
165
|
+
time = Time.local(2008, 8, 23, 15, 39)
|
166
|
+
Punch.expects(:in).with(@project, has_entry(:time => time))
|
167
|
+
run_command('in', @project, '--time', time_option)
|
168
|
+
end
|
169
|
+
|
170
|
+
it 'should pass a time if specified on the command line (with --at)' do
|
171
|
+
time_option = '2008-08-23 15:39'
|
172
|
+
time = Time.local(2008, 8, 23, 15, 39)
|
173
|
+
Punch.expects(:in).with(@project, has_entry(:time => time))
|
174
|
+
run_command('in', @project, '--at', time_option)
|
175
|
+
end
|
176
|
+
|
177
|
+
it 'should pass a message if specified on the command line (with --message)' do
|
178
|
+
message = 'About to do some amazing work'
|
179
|
+
Punch.expects(:in).with(@project, has_entry(:message => message))
|
180
|
+
run_command('in', @project, '--message', message)
|
181
|
+
end
|
182
|
+
|
183
|
+
it 'should pass a message if specified on the command line (with -m)' do
|
184
|
+
message = 'About to do some amazing work'
|
185
|
+
Punch.expects(:in).with(@project, has_entry(:message => message))
|
186
|
+
run_command('in', @project, '-m', message)
|
187
|
+
end
|
188
|
+
|
163
189
|
describe 'when punched in successfully' do
|
164
190
|
before :each do
|
165
191
|
Punch.stubs(:in).returns(true)
|
@@ -226,13 +252,67 @@ describe 'punch command' do
|
|
226
252
|
end
|
227
253
|
|
228
254
|
it 'should punch out of the given project' do
|
229
|
-
Punch.expects(:out).with(@project)
|
255
|
+
Punch.expects(:out).with(@project, {})
|
230
256
|
run_command('out', @project)
|
231
257
|
end
|
232
258
|
|
233
|
-
it 'should
|
234
|
-
|
235
|
-
|
259
|
+
it 'should pass a time if specified on the command line (with --time)' do
|
260
|
+
time_option = '2008-08-23 15:39'
|
261
|
+
time = Time.local(2008, 8, 23, 15, 39)
|
262
|
+
Punch.expects(:out).with(@project, has_entry(:time => time))
|
263
|
+
run_command('out', @project, '--time', time_option)
|
264
|
+
end
|
265
|
+
|
266
|
+
it 'should pass a time if specified on the command line (with --at)' do
|
267
|
+
time_option = '2008-08-23 15:39'
|
268
|
+
time = Time.local(2008, 8, 23, 15, 39)
|
269
|
+
Punch.expects(:out).with(@project, has_entry(:time => time))
|
270
|
+
run_command('out', @project, '--at', time_option)
|
271
|
+
end
|
272
|
+
|
273
|
+
it 'should pass a message if specified on the command line (with --message)' do
|
274
|
+
message = 'Finished doing some stellar work'
|
275
|
+
Punch.expects(:out).with(@project, has_entry(:message => message))
|
276
|
+
run_command('out', @project, '--message', message)
|
277
|
+
end
|
278
|
+
|
279
|
+
it 'should pass a message if specified on the command line (with -m)' do
|
280
|
+
message = 'Finished doing some stellar work'
|
281
|
+
Punch.expects(:out).with(@project, has_entry(:message => message))
|
282
|
+
run_command('out', @project, '-m', message)
|
283
|
+
end
|
284
|
+
|
285
|
+
describe 'if no project given' do
|
286
|
+
it 'should punch out of all projects' do
|
287
|
+
Punch.expects(:out).with(nil, {})
|
288
|
+
run_command('out')
|
289
|
+
end
|
290
|
+
|
291
|
+
it 'should pass a time if specified on the command line (with --time)' do
|
292
|
+
time_option = '2008-08-23 15:39'
|
293
|
+
time = Time.local(2008, 8, 23, 15, 39)
|
294
|
+
Punch.expects(:out).with(nil, has_entry(:time => time))
|
295
|
+
run_command('out', '--time', time_option)
|
296
|
+
end
|
297
|
+
|
298
|
+
it 'should pass a time if specified on the command line (with --at)' do
|
299
|
+
time_option = '2008-08-23 15:39'
|
300
|
+
time = Time.local(2008, 8, 23, 15, 39)
|
301
|
+
Punch.expects(:out).with(nil, has_entry(:time => time))
|
302
|
+
run_command('out', '--at', time_option)
|
303
|
+
end
|
304
|
+
|
305
|
+
it 'should pass a message if specified on the command line (with --message)' do
|
306
|
+
message = 'Finished doing some stellar work'
|
307
|
+
Punch.expects(:out).with(nil, has_entry(:message => message))
|
308
|
+
run_command('out', '--message', message)
|
309
|
+
end
|
310
|
+
|
311
|
+
it 'should pass a message if specified on the command line (with -m)' do
|
312
|
+
message = 'Finished doing some stellar work'
|
313
|
+
Punch.expects(:out).with(nil, has_entry(:message => message))
|
314
|
+
run_command('out', '-m', message)
|
315
|
+
end
|
236
316
|
end
|
237
317
|
|
238
318
|
describe 'when punched out successfully' do
|
data/spec/punch_spec.rb
CHANGED
@@ -287,6 +287,10 @@ describe Punch do
|
|
287
287
|
lambda { Punch.in }.should raise_error(ArgumentError)
|
288
288
|
end
|
289
289
|
|
290
|
+
it 'should accept options' do
|
291
|
+
lambda { Punch.in('proj', :time => Time.now) }.should_not raise_error(ArgumentError)
|
292
|
+
end
|
293
|
+
|
290
294
|
describe 'when the project is already punched in' do
|
291
295
|
before :each do
|
292
296
|
@data = { @project => [ {'in' => @now - 50, 'out' => @now - 25}, {'in' => @now - 5} ] }
|
@@ -321,6 +325,32 @@ describe Punch do
|
|
321
325
|
Punch.in(@project)
|
322
326
|
end
|
323
327
|
|
328
|
+
it 'should use a different time if given' do
|
329
|
+
time = @now + 50
|
330
|
+
Punch.in(@project, :time => time)
|
331
|
+
Punch.data[@project].last['in'].should == time
|
332
|
+
end
|
333
|
+
|
334
|
+
it 'should log a message using the given time' do
|
335
|
+
time = @now + 75
|
336
|
+
time_str = time.strftime('%Y-%m-%dT%H:%M:%S%z')
|
337
|
+
Punch.expects(:log).with(@project, "punch in @ #{time_str}")
|
338
|
+
Punch.in(@project, :time => time)
|
339
|
+
end
|
340
|
+
|
341
|
+
it 'should log an additional message if given' do
|
342
|
+
Punch.stubs(:log) # for the time-based message
|
343
|
+
message = 'working on some stuff'
|
344
|
+
Punch.expects(:log).with(@project, message)
|
345
|
+
Punch.in(@project, :message => message)
|
346
|
+
end
|
347
|
+
|
348
|
+
it "should allow the different time to be specified using :at" do
|
349
|
+
time = @now + 50
|
350
|
+
Punch.in(@project, :at => time)
|
351
|
+
Punch.data[@project].last['in'].should == time
|
352
|
+
end
|
353
|
+
|
324
354
|
it 'should return true' do
|
325
355
|
Punch.in(@project).should == true
|
326
356
|
end
|
@@ -352,6 +382,19 @@ describe Punch do
|
|
352
382
|
Punch.in(@project)
|
353
383
|
end
|
354
384
|
|
385
|
+
it 'should use a different time if given' do
|
386
|
+
time = @now + 50
|
387
|
+
Punch.in(@project, :time => time)
|
388
|
+
Punch.data[@project].last['in'].should == time
|
389
|
+
end
|
390
|
+
|
391
|
+
it 'should log a message using the given time' do
|
392
|
+
time = @now + 75
|
393
|
+
time_str = time.strftime('%Y-%m-%dT%H:%M:%S%z')
|
394
|
+
Punch.expects(:log).with(@project, "punch in @ #{time_str}")
|
395
|
+
Punch.in(@project, :time => time)
|
396
|
+
end
|
397
|
+
|
355
398
|
it 'should return true' do
|
356
399
|
Punch.in(@project).should == true
|
357
400
|
end
|
@@ -385,6 +428,14 @@ describe Punch do
|
|
385
428
|
lambda { Punch.out }.should_not raise_error(ArgumentError)
|
386
429
|
end
|
387
430
|
|
431
|
+
it 'should accept a project name and options' do
|
432
|
+
lambda { Punch.out('proj', :time => Time.now) }.should_not raise_error(ArgumentError)
|
433
|
+
end
|
434
|
+
|
435
|
+
it 'should accept options without a project name' do
|
436
|
+
lambda { Punch.out(:time => Time.now) }.should_not raise_error(ArgumentError)
|
437
|
+
end
|
438
|
+
|
388
439
|
describe 'when the project is already punched out' do
|
389
440
|
it 'should not change the project data' do
|
390
441
|
old_data = @data.dup
|
@@ -413,12 +464,38 @@ describe Punch do
|
|
413
464
|
Punch.data[@project].last['out'].should == @now
|
414
465
|
end
|
415
466
|
|
416
|
-
it 'should log a message about punch-
|
467
|
+
it 'should log a message about punch-out time' do
|
417
468
|
time = @now.strftime('%Y-%m-%dT%H:%M:%S%z')
|
418
469
|
Punch.expects(:log).with(@project, "punch out @ #{time}")
|
419
470
|
Punch.out(@project)
|
420
471
|
end
|
421
472
|
|
473
|
+
it 'should use a different time if given' do
|
474
|
+
time = @now + 50
|
475
|
+
Punch.out(@project, :time => time)
|
476
|
+
Punch.data[@project].last['out'].should == time
|
477
|
+
end
|
478
|
+
|
479
|
+
it 'should log a message using the given time' do
|
480
|
+
time = @now + 75
|
481
|
+
time_str = time.strftime('%Y-%m-%dT%H:%M:%S%z')
|
482
|
+
Punch.expects(:log).with(@project, "punch out @ #{time_str}")
|
483
|
+
Punch.out(@project, :time => time)
|
484
|
+
end
|
485
|
+
|
486
|
+
it 'should log an additional message if given' do
|
487
|
+
Punch.stubs(:log) # for the time-based message
|
488
|
+
message = 'finished working on some stuff'
|
489
|
+
Punch.expects(:log).with(@project, message)
|
490
|
+
Punch.out(@project, :message => message)
|
491
|
+
end
|
492
|
+
|
493
|
+
it "should allow the different time to be specified using :at" do
|
494
|
+
time = @now + 50
|
495
|
+
Punch.out(@project, :at => time)
|
496
|
+
Punch.data[@project].last['out'].should == time
|
497
|
+
end
|
498
|
+
|
422
499
|
it 'should return true' do
|
423
500
|
Punch.out(@project).should == true
|
424
501
|
end
|
@@ -449,6 +526,30 @@ describe Punch do
|
|
449
526
|
Punch.out
|
450
527
|
end
|
451
528
|
|
529
|
+
it 'should use a different time if given' do
|
530
|
+
time = @now + 50
|
531
|
+
Punch.out(:time => time)
|
532
|
+
Punch.data[@projects[0]].last['out'].should == @now - 25
|
533
|
+
Punch.data[@projects[1]].last['out'].should == time
|
534
|
+
Punch.data[@projects[2]].last['out'].should == time
|
535
|
+
end
|
536
|
+
|
537
|
+
it 'should log messages using the given time' do
|
538
|
+
time = @now + 75
|
539
|
+
time_str = time.strftime('%Y-%m-%dT%H:%M:%S%z')
|
540
|
+
Punch.expects(:log).with(@projects[1], "punch out @ #{time_str}")
|
541
|
+
Punch.expects(:log).with(@projects[2], "punch out @ #{time_str}")
|
542
|
+
Punch.out(:time => time)
|
543
|
+
end
|
544
|
+
|
545
|
+
it 'should log an additional message if given' do
|
546
|
+
Punch.stubs(:log) # for the time-based messages
|
547
|
+
message = 'finished working on some stuff'
|
548
|
+
Punch.expects(:log).with(@projects[1], message)
|
549
|
+
Punch.expects(:log).with(@projects[2], message)
|
550
|
+
Punch.out(:message => message)
|
551
|
+
end
|
552
|
+
|
452
553
|
it 'should return true' do
|
453
554
|
Punch.out.should == true
|
454
555
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: one_inch_punch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yossef Mendelssohn
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-09-30 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|