one_inch_punch 0.1.2 → 0.1.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/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
|