one_inch_punch 0.4.1 → 0.4.2
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 +8 -0
- data/bin/punch +2 -0
- data/config/hoe.rb +1 -1
- data/lib/punch/version.rb +1 -1
- data/lib/punch.rb +13 -0
- data/spec/punch_command_spec.rb +31 -1
- data/spec/punch_spec.rb +126 -0
- metadata +64 -18
data/History.txt
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
== 0.4.2 2010-08-16
|
2
|
+
|
3
|
+
* 1 tiny enhancement:
|
4
|
+
* adding some date handling for list/total/summary:
|
5
|
+
* can now take an :on option, to restrict the operation to the given date
|
6
|
+
* option can be given on command-line with --on
|
7
|
+
* :before and :after can also take dates now, converting them to times
|
8
|
+
|
1
9
|
== 0.4.1 2008-08-26
|
2
10
|
|
3
11
|
* 1 tiny enhancement:
|
data/bin/punch
CHANGED
@@ -29,6 +29,8 @@ 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('--on [DATE]', String,
|
33
|
+
"Restrict command to only on the given date") { |date| OPTIONS[:on] = Date.parse(date) }
|
32
34
|
opts.on('--at [TIME]', '--time [TIME]', String,
|
33
35
|
"Use the given time") { |time| OPTIONS[:time] = Time.parse(time) }
|
34
36
|
opts.on('-m', '--message [MESSAGE]', String,
|
data/config/hoe.rb
CHANGED
@@ -8,7 +8,7 @@ RUBYFORGE_PROJECT = 'yomendel' # The unix name for your project
|
|
8
8
|
HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
|
9
9
|
DOWNLOAD_PATH = "http://rubyforge.org/projects/#{RUBYFORGE_PROJECT}"
|
10
10
|
EXTRA_DEPENDENCIES = [
|
11
|
-
|
11
|
+
['timely', '>= 0.0.1']
|
12
12
|
] # An array of rubygem dependencies [name, version]
|
13
13
|
EXTRA_DEV_DEPENDENCIES = [
|
14
14
|
['bacon', '>= 1.1.0'],
|
data/lib/punch/version.rb
CHANGED
data/lib/punch.rb
CHANGED
@@ -3,6 +3,8 @@ $:.unshift(File.dirname(__FILE__)) unless
|
|
3
3
|
|
4
4
|
require 'yaml'
|
5
5
|
require 'time'
|
6
|
+
require 'date'
|
7
|
+
require 'timely'
|
6
8
|
require 'enumerator'
|
7
9
|
require 'punch/core_ext'
|
8
10
|
require 'punch/instance'
|
@@ -193,6 +195,7 @@ class Punch
|
|
193
195
|
|
194
196
|
def do_list_single(project, options)
|
195
197
|
return nil unless project_data = data[project]
|
198
|
+
options = fix_range_options(options)
|
196
199
|
project_data = project_data.select { |t| t['in'] > options[:after] } if options[:after]
|
197
200
|
project_data = project_data.select { |t| (t['out'] || Time.now) < options[:before] } if options[:before]
|
198
201
|
project_data
|
@@ -209,6 +212,16 @@ class Punch
|
|
209
212
|
options[:time] || options[:at] || Time.now
|
210
213
|
end
|
211
214
|
|
215
|
+
def fix_range_options(options)
|
216
|
+
if date = options[:on]
|
217
|
+
options[:after] = date
|
218
|
+
options[:before] = date + 1
|
219
|
+
end
|
220
|
+
[:after, :before].each { |k| options[k] = options[k].at_time(0) if options[k].respond_to?(:at_time) }
|
221
|
+
|
222
|
+
options
|
223
|
+
end
|
224
|
+
|
212
225
|
def projects
|
213
226
|
data.keys
|
214
227
|
end
|
data/spec/punch_command_spec.rb
CHANGED
@@ -117,6 +117,16 @@ describe 'punch command' do
|
|
117
117
|
run_command('total', '--before', time_option)
|
118
118
|
end
|
119
119
|
|
120
|
+
it "should pass on an 'on' date option given by --on" do
|
121
|
+
date_option = '2008-08-23'
|
122
|
+
date = Date.new(2008, 8, 23)
|
123
|
+
Punch.should.receive(:total) do |proj, options|
|
124
|
+
proj.should == @project
|
125
|
+
options[:on].should == date
|
126
|
+
end
|
127
|
+
run_command('total', @project, '--on', date_option)
|
128
|
+
end
|
129
|
+
|
120
130
|
it 'should also pass the formatting option' do
|
121
131
|
time_option = '2008-08-26 09:47'
|
122
132
|
Punch.should.receive(:total) do |proj, options|
|
@@ -722,6 +732,16 @@ describe 'punch command' do
|
|
722
732
|
end
|
723
733
|
run_command('list', '--before', time_option)
|
724
734
|
end
|
735
|
+
|
736
|
+
it "should pass on an 'on' date option given by --on" do
|
737
|
+
date_option = '2008-08-23'
|
738
|
+
date = Date.new(2008, 8, 23)
|
739
|
+
Punch.should.receive(:list) do |proj, options|
|
740
|
+
proj.should == @project
|
741
|
+
options[:on].should == date
|
742
|
+
end
|
743
|
+
run_command('list', @project, '--on', date_option)
|
744
|
+
end
|
725
745
|
end
|
726
746
|
|
727
747
|
it 'should not write the data' do
|
@@ -785,6 +805,16 @@ describe 'punch command' do
|
|
785
805
|
run_command('summary', @project, '--before', time_option)
|
786
806
|
end
|
787
807
|
|
808
|
+
it "should pass on an 'on' date option given by --on" do
|
809
|
+
date_option = '2008-08-23'
|
810
|
+
date = Date.new(2008, 8, 23)
|
811
|
+
Punch.should.receive(:summary) do |proj, options|
|
812
|
+
proj.should == @project
|
813
|
+
options[:on].should == date
|
814
|
+
end
|
815
|
+
run_command('summary', @project, '--on', date_option)
|
816
|
+
end
|
817
|
+
|
788
818
|
it 'should also pass the formatting option' do
|
789
819
|
time_option = '2008-08-23'
|
790
820
|
Punch.should.receive(:summary) do |proj, options|
|
@@ -816,7 +846,7 @@ describe 'punch command' do
|
|
816
846
|
run_command('summary')
|
817
847
|
end
|
818
848
|
|
819
|
-
it 'should not
|
849
|
+
it 'should not get a summary' do
|
820
850
|
Punch.should.receive(:summary).never
|
821
851
|
run_command('summary')
|
822
852
|
end
|
data/spec/punch_spec.rb
CHANGED
@@ -1085,6 +1085,48 @@ describe Punch do
|
|
1085
1085
|
Punch.list(@project, :after => @now - 2001, :before => @now - 999).should == Punch.data[@project][1, 1]
|
1086
1086
|
end
|
1087
1087
|
|
1088
|
+
describe 'handling date options' do
|
1089
|
+
before do
|
1090
|
+
# yay ugly setup!
|
1091
|
+
@date = Date.today - 4
|
1092
|
+
morning = Time.local(@date.year, @date.month, @date.day, 0, 0, 1)
|
1093
|
+
night = Time.local(@date.year, @date.month, @date.day, 23, 59, 59)
|
1094
|
+
earlier_date = @date - 2
|
1095
|
+
earlier_time = Time.local(earlier_date.year, earlier_date.month, earlier_date.day, 13, 43)
|
1096
|
+
early_date = @date - 1
|
1097
|
+
early_time = Time.local(early_date.year, early_date.month, early_date.day, 11, 25)
|
1098
|
+
later_date = @date + 1
|
1099
|
+
later_time = Time.local(later_date.year, later_date.month, later_date.day, 3, 12)
|
1100
|
+
|
1101
|
+
@data = { @project => [
|
1102
|
+
{'in' => earlier_time - 50, 'out' => earlier_time + 100},
|
1103
|
+
{'in' => early_time - 60, 'out' => early_time + 70},
|
1104
|
+
{'in' => morning, 'out' => morning + 200},
|
1105
|
+
{'in' => night - 500, 'out' => night},
|
1106
|
+
{'in' => later_time - 30, 'out' => later_time + 70}
|
1107
|
+
]
|
1108
|
+
}
|
1109
|
+
|
1110
|
+
Punch.data = @data
|
1111
|
+
end
|
1112
|
+
|
1113
|
+
it 'should accept an :on shortcut option to restrict returned data to times only on a certain day' do
|
1114
|
+
Punch.list(@project, :on => @date).should == Punch.data[@project][2, 2]
|
1115
|
+
end
|
1116
|
+
|
1117
|
+
it 'should allow the :on option to override the before/after options' do
|
1118
|
+
Punch.list(@project, :on => @date, :before => @now - 2525, :after => @now - 7575).should == Punch.data[@project][2, 2]
|
1119
|
+
end
|
1120
|
+
|
1121
|
+
it 'should allow the :after option to be a date instead of time' do
|
1122
|
+
Punch.list(@project, :after => @date).should == Punch.data[@project][2..-1]
|
1123
|
+
end
|
1124
|
+
|
1125
|
+
it 'should allow the :before option to be a date instead of time' do
|
1126
|
+
Punch.list(@project, :before => @date).should == Punch.data[@project][0, 2]
|
1127
|
+
end
|
1128
|
+
end
|
1129
|
+
|
1088
1130
|
describe 'and is punched in' do
|
1089
1131
|
before do
|
1090
1132
|
@data[@project].push({ 'in' => @now - 25 })
|
@@ -1242,6 +1284,48 @@ describe Punch do
|
|
1242
1284
|
Punch.total(@project, :format => true).should == "1:05:00"
|
1243
1285
|
end
|
1244
1286
|
|
1287
|
+
describe 'handling date options' do
|
1288
|
+
before do
|
1289
|
+
# yay ugly setup!
|
1290
|
+
@date = Date.today - 4
|
1291
|
+
morning = Time.local(@date.year, @date.month, @date.day, 0, 0, 1)
|
1292
|
+
night = Time.local(@date.year, @date.month, @date.day, 23, 59, 59)
|
1293
|
+
earlier_date = @date - 2
|
1294
|
+
earlier_time = Time.local(earlier_date.year, earlier_date.month, earlier_date.day, 13, 43)
|
1295
|
+
early_date = @date - 1
|
1296
|
+
early_time = Time.local(early_date.year, early_date.month, early_date.day, 11, 25)
|
1297
|
+
later_date = @date + 1
|
1298
|
+
later_time = Time.local(later_date.year, later_date.month, later_date.day, 3, 12)
|
1299
|
+
|
1300
|
+
@data = { @project => [
|
1301
|
+
{'in' => earlier_time - 50, 'out' => earlier_time + 100},
|
1302
|
+
{'in' => early_time - 60, 'out' => early_time + 70},
|
1303
|
+
{'in' => morning, 'out' => morning + 200},
|
1304
|
+
{'in' => night - 500, 'out' => night},
|
1305
|
+
{'in' => later_time - 30, 'out' => later_time + 70}
|
1306
|
+
]
|
1307
|
+
}
|
1308
|
+
|
1309
|
+
Punch.data = @data
|
1310
|
+
end
|
1311
|
+
|
1312
|
+
it 'should accept an :on shortcut option to restrict returned amount to times only on a certain day' do
|
1313
|
+
Punch.total(@project, :on => @date).should == 700
|
1314
|
+
end
|
1315
|
+
|
1316
|
+
it 'should allow the :on option to override the before/after options' do
|
1317
|
+
Punch.total(@project, :on => @date, :before => @now - 2525, :after => @now - 7575).should == 700
|
1318
|
+
end
|
1319
|
+
|
1320
|
+
it 'should allow the :after option to be a date instead of time' do
|
1321
|
+
Punch.total(@project, :after => @date).should == 800
|
1322
|
+
end
|
1323
|
+
|
1324
|
+
it 'should allow the :before option to be a date instead of time' do
|
1325
|
+
Punch.total(@project, :before => @date).should == 280
|
1326
|
+
end
|
1327
|
+
end
|
1328
|
+
|
1245
1329
|
describe 'and is punched in' do
|
1246
1330
|
before do
|
1247
1331
|
@data[@project].push({ 'in' => @now - 25 })
|
@@ -1599,6 +1683,48 @@ describe Punch do
|
|
1599
1683
|
it 'should format the time spent if passed a format option' do
|
1600
1684
|
Punch.summary(@project, :format => true).should == { 'unspecified' => '03:20', @message => '01:40', @other_message => '05:00' }
|
1601
1685
|
end
|
1686
|
+
|
1687
|
+
describe 'handling date options' do
|
1688
|
+
before do
|
1689
|
+
# yay ugly setup!
|
1690
|
+
@date = Date.today - 4
|
1691
|
+
morning = Time.local(@date.year, @date.month, @date.day, 0, 0, 1)
|
1692
|
+
night = Time.local(@date.year, @date.month, @date.day, 23, 59, 59)
|
1693
|
+
earlier_date = @date - 2
|
1694
|
+
earlier_time = Time.local(earlier_date.year, earlier_date.month, earlier_date.day, 13, 43)
|
1695
|
+
early_date = @date - 1
|
1696
|
+
early_time = Time.local(early_date.year, early_date.month, early_date.day, 11, 25)
|
1697
|
+
later_date = @date + 1
|
1698
|
+
later_time = Time.local(later_date.year, later_date.month, later_date.day, 3, 12)
|
1699
|
+
|
1700
|
+
@data = { @project => [
|
1701
|
+
{'in' => earlier_time - 50, 'out' => earlier_time + 100},
|
1702
|
+
{'in' => early_time - 60, 'out' => early_time + 70},
|
1703
|
+
{'in' => morning, 'out' => morning + 200},
|
1704
|
+
{'in' => night - 500, 'out' => night},
|
1705
|
+
{'in' => later_time - 30, 'out' => later_time + 70}
|
1706
|
+
]
|
1707
|
+
}
|
1708
|
+
|
1709
|
+
Punch.data = @data
|
1710
|
+
end
|
1711
|
+
|
1712
|
+
it 'should accept an :on shortcut option to restrict the summary to times only on a certain day' do
|
1713
|
+
Punch.summary(@project, :on => @date).should == { 'unspecified' => 700 }
|
1714
|
+
end
|
1715
|
+
|
1716
|
+
it 'should allow the :on option to override the before/after options' do
|
1717
|
+
Punch.summary(@project, :on => @date, :before => @now - 2525, :after => @now - 7575).should == { 'unspecified' => 700 }
|
1718
|
+
end
|
1719
|
+
|
1720
|
+
it 'should allow the :after option to be a date instead of time' do
|
1721
|
+
Punch.summary(@project, :after => @date).should == { 'unspecified' => 800 }
|
1722
|
+
end
|
1723
|
+
|
1724
|
+
it 'should allow the :before option to be a date instead of time' do
|
1725
|
+
Punch.summary(@project, :before => @date).should == { 'unspecified' => 280 }
|
1726
|
+
end
|
1727
|
+
end
|
1602
1728
|
end
|
1603
1729
|
|
1604
1730
|
describe 'when the project is currently punched in' do
|
metadata
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: one_inch_punch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 11
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 4
|
9
|
+
- 2
|
10
|
+
version: 0.4.2
|
5
11
|
platform: ruby
|
6
12
|
authors:
|
7
13
|
- Yossef Mendelssohn
|
@@ -9,39 +15,73 @@ autorequire:
|
|
9
15
|
bindir: bin
|
10
16
|
cert_chain: []
|
11
17
|
|
12
|
-
date:
|
18
|
+
date: 2010-08-16 00:00:00 -05:00
|
13
19
|
default_executable:
|
14
20
|
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: timely
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 29
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
- 0
|
33
|
+
- 1
|
34
|
+
version: 0.0.1
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
15
37
|
- !ruby/object:Gem::Dependency
|
16
38
|
name: bacon
|
17
|
-
|
18
|
-
|
19
|
-
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
20
42
|
requirements:
|
21
43
|
- - ">="
|
22
44
|
- !ruby/object:Gem::Version
|
45
|
+
hash: 19
|
46
|
+
segments:
|
47
|
+
- 1
|
48
|
+
- 1
|
49
|
+
- 0
|
23
50
|
version: 1.1.0
|
24
|
-
|
51
|
+
type: :development
|
52
|
+
version_requirements: *id002
|
25
53
|
- !ruby/object:Gem::Dependency
|
26
54
|
name: facon
|
27
|
-
|
28
|
-
|
29
|
-
|
55
|
+
prerelease: false
|
56
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
30
58
|
requirements:
|
31
59
|
- - ">="
|
32
60
|
- !ruby/object:Gem::Version
|
61
|
+
hash: 13
|
62
|
+
segments:
|
63
|
+
- 0
|
64
|
+
- 4
|
65
|
+
- 1
|
33
66
|
version: 0.4.1
|
34
|
-
|
67
|
+
type: :development
|
68
|
+
version_requirements: *id003
|
35
69
|
- !ruby/object:Gem::Dependency
|
36
70
|
name: hoe
|
37
|
-
|
38
|
-
|
39
|
-
|
71
|
+
prerelease: false
|
72
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
40
74
|
requirements:
|
41
75
|
- - ">="
|
42
76
|
- !ruby/object:Gem::Version
|
43
|
-
|
44
|
-
|
77
|
+
hash: 21
|
78
|
+
segments:
|
79
|
+
- 2
|
80
|
+
- 6
|
81
|
+
- 1
|
82
|
+
version: 2.6.1
|
83
|
+
type: :development
|
84
|
+
version_requirements: *id004
|
45
85
|
description: a simple time-tracking tool
|
46
86
|
email:
|
47
87
|
- ymendel@pobox.com
|
@@ -91,21 +131,27 @@ rdoc_options:
|
|
91
131
|
require_paths:
|
92
132
|
- lib
|
93
133
|
required_ruby_version: !ruby/object:Gem::Requirement
|
134
|
+
none: false
|
94
135
|
requirements:
|
95
136
|
- - ">="
|
96
137
|
- !ruby/object:Gem::Version
|
138
|
+
hash: 3
|
139
|
+
segments:
|
140
|
+
- 0
|
97
141
|
version: "0"
|
98
|
-
version:
|
99
142
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
143
|
+
none: false
|
100
144
|
requirements:
|
101
145
|
- - ">="
|
102
146
|
- !ruby/object:Gem::Version
|
147
|
+
hash: 3
|
148
|
+
segments:
|
149
|
+
- 0
|
103
150
|
version: "0"
|
104
|
-
version:
|
105
151
|
requirements: []
|
106
152
|
|
107
153
|
rubyforge_project: yomendel
|
108
|
-
rubygems_version: 1.3.
|
154
|
+
rubygems_version: 1.3.7
|
109
155
|
signing_key:
|
110
156
|
specification_version: 3
|
111
157
|
summary: a simple time-tracking tool
|