Pratt 1.6.8-x86-linux
Sign up to get free protection for your applications and to get access to all the features.
- data/.exrc +61 -0
- data/.gitignore +6 -0
- data/History.txt +6 -0
- data/Manifest.txt +46 -0
- data/Pratt.gemspec +173 -0
- data/Pratt.mm +1867 -0
- data/README.txt +67 -0
- data/Rakefile +96 -0
- data/TODO +56 -0
- data/VERSION +1 -0
- data/bin/pratt +13 -0
- data/config.rb +19 -0
- data/db/sqlite_databases_go_here +0 -0
- data/db/zips.csv.zip +0 -0
- data/lib/models.rb +8 -0
- data/lib/pratt.rb +308 -0
- data/lib/pratt/core_ext.rb +6 -0
- data/lib/pratt/core_ext/array.rb +20 -0
- data/lib/pratt/core_ext/float.rb +29 -0
- data/lib/pratt/core_ext/nil.rb +5 -0
- data/lib/pratt/core_ext/numeric.rb +9 -0
- data/lib/pratt/core_ext/string.rb +31 -0
- data/lib/pratt/core_ext/time.rb +20 -0
- data/lib/pratt/dialogs.rb +81 -0
- data/lib/pratt/formatting.rb +19 -0
- data/lib/pratt/project_actions.rb +25 -0
- data/lib/pratt/reports.rb +140 -0
- data/models/app.rb +39 -0
- data/models/customer.rb +50 -0
- data/models/invoice.rb +28 -0
- data/models/invoice_whence.rb +18 -0
- data/models/payment.rb +22 -0
- data/models/pratt.rb +15 -0
- data/models/project.rb +89 -0
- data/models/whence.rb +77 -0
- data/models/zip.rb +27 -0
- data/pratt.mm +1875 -0
- data/spec/app_spec.rb +48 -0
- data/spec/array_spec.rb +24 -0
- data/spec/customer_spec.rb +31 -0
- data/spec/fixtures/empty_graph.expectation +8 -0
- data/spec/fixtures/graph.expectation +13 -0
- data/spec/fixtures/proportions.expectation +4 -0
- data/spec/float_spec.rb +24 -0
- data/spec/formatting_spec.rb +7 -0
- data/spec/money_spec.rb +9 -0
- data/spec/nil_class_spec.rb +8 -0
- data/spec/numeric_spec.rb +30 -0
- data/spec/payment_spec.rb +19 -0
- data/spec/pratt_spec.rb +106 -0
- data/spec/project_spec.rb +182 -0
- data/spec/rcov.opts +0 -0
- data/spec/report_action_spec.rb +83 -0
- data/spec/report_spec.rb +205 -0
- data/spec/seed_data.rb +33 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +24 -0
- data/spec/string_ext_spec.rb +33 -0
- data/spec/whence_spec.rb +54 -0
- data/tasks/pratt.rb +87 -0
- data/templates/model.eruby +12 -0
- data/templates/spec.eruby +8 -0
- data/views/current.eruby +5 -0
- data/views/general-invoice.eruby +538 -0
- data/views/graph.eruby +16 -0
- data/views/invoice.eruby +148 -0
- data/views/main.rb +90 -0
- data/views/pid.eruby +3 -0
- data/views/pop.rb +78 -0
- data/views/proportions.eruby +4 -0
- data/views/raw.eruby +11 -0
- metadata +275 -0
data/views/graph.eruby
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
Project detail
|
2
|
+
<% if scale %>
|
3
|
+
by <%= scale.red %> from
|
4
|
+
<%= when_to.send("beginning_of_#{scale}").strftime(Pratt::FMT).blue %> to <%= when_to.send("end_of_#{scale}").strftime(Pratt::FMT).blue %>
|
5
|
+
<% end %>
|
6
|
+
<%= ' '.with_label('') << 'dys'.underline << ' '*5 << 'hrs'.underline << ' '*5 << 'min'.underline << ' '*3 << 'total'.underline %>
|
7
|
+
<%= ( '-'.or '·')*67 %>
|
8
|
+
|
9
|
+
<% @projects.each do |proj| %>
|
10
|
+
<% hour_spent = proj.time_spent(scale, when_to) %>
|
11
|
+
<% if show_all or ( !show_all and hour_spent != 0.0 ) %>
|
12
|
+
<%= ('|'.or '⋮').with_label(proj.name) %> <%= (hour_spent / 24).format_integer.cyan %> day <%= (hour_spent % 24).format_integer.yellow %> hour <%= (60*(hour_spent - hour_spent.to_i)).format_integer.green %> min <%= hour_spent.pretty_print.blue %>
|
13
|
+
<% end %>
|
14
|
+
<% end %>
|
15
|
+
|
16
|
+
<%= ( '-'.or '·' )*67 %>
|
data/views/invoice.eruby
ADDED
@@ -0,0 +1,148 @@
|
|
1
|
+
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
2
|
+
<HTML>
|
3
|
+
<HEAD>
|
4
|
+
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=utf-8">
|
5
|
+
<TITLE></TITLE>
|
6
|
+
<META NAME="GENERATOR" CONTENT="OpenOffice.org 3.0 (Linux)">
|
7
|
+
<META NAME="AUTHOR" CONTENT=" ">
|
8
|
+
<META NAME="CREATED" CONTENT="20090930;9550000">
|
9
|
+
<META NAME="CHANGED" CONTENT="20091001;21332000">
|
10
|
+
<META NAME="Info 2" CONTENT="">
|
11
|
+
<META NAME="Info 3" CONTENT="">
|
12
|
+
<META NAME="Info 4" CONTENT="">
|
13
|
+
<META NAME="_TemplateID" CONTENT="TC100726791033">
|
14
|
+
<STYLE TYPE="text/css">
|
15
|
+
<!--
|
16
|
+
@page { margin-left: 0.5in; margin-right: 0.5in; margin-top: 0.5in; margin-bottom: 0.51in }
|
17
|
+
P { margin-bottom: 0.08in; direction: ltr; color: #000000; text-align: left; widows: 2; orphans: 2 }
|
18
|
+
P.western { font-family: "Calibri", sans-serif; font-size: 12pt; so-language: en-US }
|
19
|
+
P.cjk { font-family: "Times New Roman", serif; font-size: 12pt; so-language: zxx }
|
20
|
+
P.ctl { font-family: "Calibri", sans-serif; font-size: 12pt; so-language: ar-SA }
|
21
|
+
-->
|
22
|
+
</STYLE>
|
23
|
+
</HEAD>
|
24
|
+
<BODY LANG="en-US" TEXT="#000000" DIR="LTR">
|
25
|
+
<CENTER>
|
26
|
+
<TABLE WIDTH=720 BORDER=0 CELLPADDING=5 CELLSPACING=0 STYLE="page-break-before: always">
|
27
|
+
<COL WIDTH=351>
|
28
|
+
<COL WIDTH=349>
|
29
|
+
<TR VALIGN=TOP>
|
30
|
+
<TD ROWSPAN=2 WIDTH=351 HEIGHT=43>
|
31
|
+
<P STYLE="margin-top: 0.1in; margin-bottom: 0in"><B>QualitySmith LLC</B></P>
|
32
|
+
<P STYLE="margin-bottom: 0in"><FONT SIZE=2 STYLE="font-size: 9pt">106 N 2<SUP>nd</SUP> </FONT> </P>
|
33
|
+
<P STYLE="margin-bottom: 0in"><FONT SIZE=2 STYLE="font-size: 9pt">Walla Walla, WA 99362</FONT></P>
|
34
|
+
<P STYLE="margin-bottom: 0in"><FONT SIZE=2 STYLE="font-size: 9pt">Phone 509-522-0222</FONT></P>
|
35
|
+
<P><FONT SIZE=2 STYLE="font-size: 9pt">Fax </FONT> </P>
|
36
|
+
</TD>
|
37
|
+
<TD WIDTH=349>
|
38
|
+
<P ALIGN=RIGHT><FONT COLOR="#7f7f7f"><FONT SIZE=5 STYLE="font-size: 20pt"><B>INVOICE</B></FONT></FONT></P>
|
39
|
+
</TD>
|
40
|
+
</TR>
|
41
|
+
<TR>
|
42
|
+
<TD WIDTH=349 VALIGN=BOTTOM>
|
43
|
+
<P ALIGN=RIGHT><FONT SIZE=1 STYLE="font-size: 8pt">Date: <%= when_to.send("beginning_of_#{scale}").strftime(Pratt::INVOICE_FMT) %> to <%= when_to.send("end_of_#{scale}").strftime(Pratt::INVOICE_FMT) %></FONT></P>
|
44
|
+
</TD>
|
45
|
+
</TR>
|
46
|
+
</TABLE>
|
47
|
+
</CENTER>
|
48
|
+
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
49
|
+
</P>
|
50
|
+
<CENTER>
|
51
|
+
<TABLE WIDTH=720 BORDER=0 CELLPADDING=5 CELLSPACING=0>
|
52
|
+
<COL WIDTH=350>
|
53
|
+
<COL WIDTH=350>
|
54
|
+
<TR VALIGN=TOP>
|
55
|
+
<TD WIDTH=350 HEIGHT=86>
|
56
|
+
<P STYLE="margin-bottom: 0in"><FONT SIZE=1 STYLE="font-size: 8pt"><B>To:</B></FONT></P>
|
57
|
+
<P STYLE="margin-bottom: 0in"><FONT SIZE=2 STYLE="font-size: 9pt">Scott Noel-Hemming</FONT></P>
|
58
|
+
<P STYLE="margin-bottom: 0in"><FONT SIZE=2 STYLE="font-size: 9pt">Frogstarr78 Software</FONT></P>
|
59
|
+
<P STYLE="margin-bottom: 0in"><FONT SIZE=2 STYLE="font-size: 9pt">312 NW 7<SUP>th</SUP> </FONT> </P>
|
60
|
+
<P STYLE="margin-bottom: 0in"><FONT SIZE=2 STYLE="font-size: 9pt">Milton-Freewater, OR, 97862</FONT></P>
|
61
|
+
<P><FONT SIZE=2 STYLE="font-size: 9pt">509.200.9190</FONT></P>
|
62
|
+
</TD>
|
63
|
+
<TD WIDTH=350>
|
64
|
+
<P><BR>
|
65
|
+
</P>
|
66
|
+
</TD>
|
67
|
+
</TR>
|
68
|
+
</TABLE>
|
69
|
+
</CENTER>
|
70
|
+
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
71
|
+
</P>
|
72
|
+
<CENTER>
|
73
|
+
<TABLE WIDTH=722 BORDER=1 BORDERCOLOR="#000000" CELLPADDING=3 CELLSPACING=0 RULES=ROWS>
|
74
|
+
<COLGROUP>
|
75
|
+
<COL WIDTH=408>
|
76
|
+
<COL WIDTH=96>
|
77
|
+
</COLGROUP>
|
78
|
+
<COLGROUP>
|
79
|
+
<COL WIDTH=96>
|
80
|
+
</COLGROUP>
|
81
|
+
<COLGROUP>
|
82
|
+
<COL WIDTH=97>
|
83
|
+
</COLGROUP>
|
84
|
+
<TR>
|
85
|
+
<TD WIDTH=408 HEIGHT=12>
|
86
|
+
<P ALIGN=CENTER><FONT SIZE=1 STYLE="font-size: 8pt"><B>DESCRIPTION</B></FONT></P>
|
87
|
+
</TD>
|
88
|
+
<TD WIDTH=96>
|
89
|
+
<P ALIGN=CENTER><FONT SIZE=1 STYLE="font-size: 8pt"><B>HOURS</B></FONT></P>
|
90
|
+
</TD>
|
91
|
+
<TD WIDTH=96>
|
92
|
+
<P ALIGN=CENTER><FONT SIZE=1 STYLE="font-size: 8pt"><B>RATE</B></FONT></P>
|
93
|
+
</TD>
|
94
|
+
<TD WIDTH=97>
|
95
|
+
<P ALIGN=CENTER><FONT SIZE=1 STYLE="font-size: 8pt"><B>AMOUNT</B></FONT></P>
|
96
|
+
</TD>
|
97
|
+
</TR>
|
98
|
+
<% @projects.each do |project| %>
|
99
|
+
<TR>
|
100
|
+
<TD WIDTH=408 HEIGHT=13>
|
101
|
+
<P><%= project.name %></P>
|
102
|
+
</TD>
|
103
|
+
<TD WIDTH=96>
|
104
|
+
<P ALIGN=RIGHT><%= project.time_spent(scale, when_to).pretty_print %></P>
|
105
|
+
</TD>
|
106
|
+
<TD WIDTH=96>
|
107
|
+
<P ALIGN=RIGHT><%= project.payment.pretty_print %></P>
|
108
|
+
</TD>
|
109
|
+
<TD WIDTH=97>
|
110
|
+
<P ALIGN=RIGHT><FONT SIZE=2><%= project.amount( project.time_spent( scale, when_to ) ).pretty_print %></FONT></P>
|
111
|
+
</TD>
|
112
|
+
</TR>
|
113
|
+
<% end %>
|
114
|
+
<TR>
|
115
|
+
<TD WIDTH=408 HEIGHT=13 VALIGN=TOP>
|
116
|
+
<P CLASS="western"><BR>
|
117
|
+
</P>
|
118
|
+
</TD>
|
119
|
+
<TD COLSPAN=2 WIDTH=198>
|
120
|
+
<P ALIGN=RIGHT><FONT SIZE=1 STYLE="font-size: 8pt">TOTAL</FONT></P>
|
121
|
+
</TD>
|
122
|
+
<TD WIDTH=97>
|
123
|
+
<P ALIGN=RIGHT><FONT SIZE=2><%= @total.pretty_print %></FONT></P>
|
124
|
+
</TD>
|
125
|
+
</TR>
|
126
|
+
</TABLE>
|
127
|
+
</CENTER>
|
128
|
+
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
129
|
+
</P>
|
130
|
+
<CENTER>
|
131
|
+
<TABLE WIDTH=720 BORDER=0 CELLPADDING=8 CELLSPACING=0>
|
132
|
+
<COL WIDTH=704>
|
133
|
+
<TR>
|
134
|
+
<TD WIDTH=704 HEIGHT=90 VALIGN=TOP>
|
135
|
+
<P><FONT SIZE=2 STYLE="font-size: 9pt">Make all checks payable to Frogstarr78 Software</FONT></P>
|
136
|
+
</TD>
|
137
|
+
</TR>
|
138
|
+
<TR>
|
139
|
+
<TD WIDTH=704 HEIGHT=13>
|
140
|
+
<P ALIGN=CENTER><FONT SIZE=1 STYLE="font-size: 8pt"><B>Thank you for your business!</B></FONT></P>
|
141
|
+
</TD>
|
142
|
+
</TR>
|
143
|
+
</TABLE>
|
144
|
+
</CENTER>
|
145
|
+
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
146
|
+
</P>
|
147
|
+
</BODY>
|
148
|
+
</HTML>
|
data/views/main.rb
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'tk'
|
3
|
+
require 'tkextlib/tile'
|
4
|
+
require 'optparse'
|
5
|
+
require 'ostruct'
|
6
|
+
|
7
|
+
include Tk::Tile
|
8
|
+
|
9
|
+
opts = OpenStruct.new
|
10
|
+
opts.projects = []
|
11
|
+
opts.current = -1
|
12
|
+
|
13
|
+
ARGV.options do |opt|
|
14
|
+
opt.on('-p x,y,z', "--projects x,y,z", Array, "List of projects to display.") do |projs|
|
15
|
+
opts.projects = projs
|
16
|
+
end
|
17
|
+
opt.on('-c', '--current CURRENT', String, "Set the current task.") do |cur|
|
18
|
+
opts.current = opts.projects.index(cur)
|
19
|
+
end
|
20
|
+
opt.parse!
|
21
|
+
end
|
22
|
+
|
23
|
+
if opts.projects.empty?
|
24
|
+
raise 'No Projects' if ARGV.empty?
|
25
|
+
opts.projects = ARGV.split(',')
|
26
|
+
end
|
27
|
+
|
28
|
+
opts.current = opts.projects.index(opts.current) if opts.current == -1
|
29
|
+
|
30
|
+
root = TkRoot.new { title "Pratt Main" }
|
31
|
+
|
32
|
+
button_holder = Frame.new(root){ padding "5 5 5 5" }
|
33
|
+
button_holder_top = Frame.new(button_holder) { padding "5 5 5 5" }
|
34
|
+
|
35
|
+
project_combo = TCombobox.new(button_holder_top)
|
36
|
+
project_combo.values = opts.projects
|
37
|
+
project_combo.current = opts.current || 0
|
38
|
+
project_combo.pack('side' => 'bottom', 'fill' => 'y')
|
39
|
+
|
40
|
+
change = proc {
|
41
|
+
Process.detach(
|
42
|
+
fork { system("ruby bin/pratt --project '#{project_combo.get}' --change --begin --unlock") }
|
43
|
+
)
|
44
|
+
exit
|
45
|
+
}
|
46
|
+
quit = proc {
|
47
|
+
Process.detach(
|
48
|
+
fork { system("ruby bin/pratt --project '#{project_combo.get}' --end --unlock --quit") }
|
49
|
+
)
|
50
|
+
exit
|
51
|
+
}
|
52
|
+
start = proc {
|
53
|
+
Process.detach(
|
54
|
+
fork { system("ruby bin/pratt --project '#{project_combo.get}' --begin --unlock") }
|
55
|
+
)
|
56
|
+
exit
|
57
|
+
}
|
58
|
+
|
59
|
+
Label.new(button_holder_top) { text "What will you be working on?" }.pack('side' => 'top', :fill => 'y')
|
60
|
+
|
61
|
+
button_holder_bottom = Frame.new(button_holder) { padding "5 5 5 5" }
|
62
|
+
TkButton.new(button_holder_bottom) do
|
63
|
+
text 'Start'
|
64
|
+
command start
|
65
|
+
underline 0
|
66
|
+
end.pack :side => 'left', :fill => 'y'
|
67
|
+
root.bind("Alt-s", start)
|
68
|
+
#root.bind("Return", start)
|
69
|
+
|
70
|
+
TkButton.new(button_holder_bottom) do
|
71
|
+
text 'Change'
|
72
|
+
command change
|
73
|
+
underline 0
|
74
|
+
end.pack :side => 'left', :fill => 'y'
|
75
|
+
root.bind("Alt-c", change)
|
76
|
+
|
77
|
+
TkButton.new(button_holder_bottom) do
|
78
|
+
text 'Quit'
|
79
|
+
command quit
|
80
|
+
underline 0
|
81
|
+
end.pack :side => 'right', :fill => 'y'
|
82
|
+
root.bind("Alt-q", quit)
|
83
|
+
root.bind("Control-q", quit)
|
84
|
+
root.bind("Destroy", quit)
|
85
|
+
|
86
|
+
button_holder_top.pack( :side => 'top' , :fill => 'y')
|
87
|
+
button_holder_bottom.pack(:side => 'bottom', :fill => 'y')
|
88
|
+
button_holder.pack( :side => 'top', :fill => 'y')
|
89
|
+
|
90
|
+
Tk.mainloop
|
data/views/pid.eruby
ADDED
data/views/pop.rb
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'tk'
|
3
|
+
require 'tkextlib/tile'
|
4
|
+
require 'optparse'
|
5
|
+
require 'ostruct'
|
6
|
+
|
7
|
+
include Tk::Tile
|
8
|
+
|
9
|
+
opts = OpenStruct.new
|
10
|
+
opts.project_name = ''
|
11
|
+
opts.start_time = ''
|
12
|
+
opts.project_time = ''
|
13
|
+
|
14
|
+
ARGV.options do |opt|
|
15
|
+
opt.on('-p', '--project PROJECT', String, "Set the current task.") do |proj|
|
16
|
+
opts.project_name = proj
|
17
|
+
end
|
18
|
+
opt.on('-s', '--start START_TIME', String, "Set the current task.") do |time|
|
19
|
+
opts.start_time = time
|
20
|
+
end
|
21
|
+
opt.on('-t', '--project_time PROJECT_TIME', String, "Set the current task.") do |time|
|
22
|
+
opts.project_time = time
|
23
|
+
end
|
24
|
+
opt.parse!
|
25
|
+
end
|
26
|
+
|
27
|
+
yes = proc {
|
28
|
+
c = fork { system("ruby bin/pratt --project '#{opts.project_name}' --restart --unlock") }
|
29
|
+
Process.detach(c)
|
30
|
+
exit
|
31
|
+
}
|
32
|
+
adjust = proc {
|
33
|
+
c = fork { system("ruby bin/pratt --project '#{opts.project_name}' --end --unlock --gui") }
|
34
|
+
Process.detach(c)
|
35
|
+
exit
|
36
|
+
}
|
37
|
+
|
38
|
+
root = TkRoot.new { title "Pratt Reminder" }
|
39
|
+
|
40
|
+
frm = Frame.new(root) { padding "5 5 5 5" }
|
41
|
+
top_frm = Frame.new(frm) { padding "5 5 5 5" }
|
42
|
+
|
43
|
+
Label.new(top_frm) do
|
44
|
+
text "Have you been working on: "
|
45
|
+
end.pack(:side => 'top', :fill => 'y')
|
46
|
+
|
47
|
+
Label.new(top_frm) do
|
48
|
+
text opts.project_name
|
49
|
+
end.pack(:side => 'top', :fill => 'y')
|
50
|
+
|
51
|
+
Label.new(top_frm) do
|
52
|
+
text "started:
|
53
|
+
#{opts.start_time}
|
54
|
+
total time:
|
55
|
+
#{opts.project_time.gsub(/\e\[[0-9]+m/, '')}."
|
56
|
+
end.pack(:side => 'bottom', :fill => 'y')
|
57
|
+
|
58
|
+
botm_frm = Frame.new(frm) { padding "5 5 5 5" }
|
59
|
+
TkButton.new(botm_frm) do
|
60
|
+
text "Yes"
|
61
|
+
command yes
|
62
|
+
underline 0
|
63
|
+
end.pack('side' => 'left', :fill => 'y')
|
64
|
+
root.bind("Alt-y", yes)
|
65
|
+
#root.bind("Return", yes)
|
66
|
+
|
67
|
+
TkButton.new(botm_frm) do
|
68
|
+
text "Adjust"
|
69
|
+
command adjust
|
70
|
+
underline 0
|
71
|
+
end.pack('side' => 'right', :fill => 'y')
|
72
|
+
root.bind("Alt-a", adjust)
|
73
|
+
|
74
|
+
top_frm.pack( :side => 'top', :fill => 'y')
|
75
|
+
botm_frm.pack(:side => 'bottom', :fill => 'y')
|
76
|
+
frm.pack( :side => 'top', :fill => 'y')
|
77
|
+
|
78
|
+
Tk.mainloop
|
@@ -0,0 +1,4 @@
|
|
1
|
+
<%= @scaled_total.to_f.pretty_print.underline.with_label("Total") %> hrs
|
2
|
+
<%= @primary.to_f.percentage( @scaled_total ).green.with_label(Project.primary.name) %>
|
3
|
+
<%= @off_total.to_f.percentage( @scaled_total).yellow.with_label(Project.off.name) %>
|
4
|
+
<%= @rest_total.to_f.percentage( @scaled_total ).red.with_label('Other') %>
|
data/views/raw.eruby
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
<% colors = %w(red red_on_yellow red_on_white green green_on_blue yellow yellow_on_blue blue magenta magenta_on_blue cyan white white_on_green white_on_blue white_on_magenta black_on_yellow black_on_blue black_on_green black_on_magenta black_on_cyan black_on_red).sort
|
2
|
+
@whences.each do |whence|
|
3
|
+
color = colors[whence.project.id%colors.size]
|
4
|
+
%>
|
5
|
+
<%= ('|'.or '⌈').with_label whence.project.name %><%= whence.start_at.strftime(Pratt::FMT).send(color) -%>
|
6
|
+
<% if whence.end_at -%>
|
7
|
+
<%= '-'.or '' %> <%= whence.end_at.strftime(Pratt::FMT).send(color) %><%= '|'.or '⌋' %> <%= "%6.2f"% [(whence.end_at-whence.start_at)/60] %> min
|
8
|
+
<% else %>
|
9
|
+
...
|
10
|
+
<% end %>
|
11
|
+
<% end %>
|
metadata
ADDED
@@ -0,0 +1,275 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: Pratt
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 1
|
7
|
+
- 6
|
8
|
+
- 8
|
9
|
+
version: 1.6.8
|
10
|
+
platform: x86-linux
|
11
|
+
authors:
|
12
|
+
- Scott Noel-Hemming
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-06-01 00:00:00 -07:00
|
18
|
+
default_executable: pratt
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: rspec
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 1
|
29
|
+
- 2
|
30
|
+
- 6
|
31
|
+
version: 1.2.6
|
32
|
+
type: :development
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: mocha
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 0
|
43
|
+
- 9
|
44
|
+
- 5
|
45
|
+
version: 0.9.5
|
46
|
+
type: :development
|
47
|
+
version_requirements: *id002
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: activerecord
|
50
|
+
prerelease: false
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
segments:
|
56
|
+
- 2
|
57
|
+
- 1
|
58
|
+
- 1
|
59
|
+
version: 2.1.1
|
60
|
+
type: :runtime
|
61
|
+
version_requirements: *id003
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: sqlite3-ruby
|
64
|
+
prerelease: false
|
65
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
segments:
|
70
|
+
- 1
|
71
|
+
- 2
|
72
|
+
- 4
|
73
|
+
version: 1.2.4
|
74
|
+
type: :runtime
|
75
|
+
version_requirements: *id004
|
76
|
+
- !ruby/object:Gem::Dependency
|
77
|
+
name: shifty_week
|
78
|
+
prerelease: false
|
79
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
segments:
|
84
|
+
- 0
|
85
|
+
- 1
|
86
|
+
- 0
|
87
|
+
version: 0.1.0
|
88
|
+
type: :runtime
|
89
|
+
version_requirements: *id005
|
90
|
+
- !ruby/object:Gem::Dependency
|
91
|
+
name: erubis
|
92
|
+
prerelease: false
|
93
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - "="
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
segments:
|
98
|
+
- 2
|
99
|
+
- 6
|
100
|
+
- 5
|
101
|
+
version: 2.6.5
|
102
|
+
type: :runtime
|
103
|
+
version_requirements: *id006
|
104
|
+
- !ruby/object:Gem::Dependency
|
105
|
+
name: chronic
|
106
|
+
prerelease: false
|
107
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - "="
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
segments:
|
112
|
+
- 0
|
113
|
+
- 2
|
114
|
+
- 3
|
115
|
+
version: 0.2.3
|
116
|
+
type: :runtime
|
117
|
+
version_requirements: *id007
|
118
|
+
- !ruby/object:Gem::Dependency
|
119
|
+
name: colored
|
120
|
+
prerelease: false
|
121
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - "="
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
segments:
|
126
|
+
- 1
|
127
|
+
- 2
|
128
|
+
version: "1.2"
|
129
|
+
type: :runtime
|
130
|
+
version_requirements: *id008
|
131
|
+
description: "\n\
|
132
|
+
\t Need a way to keep track of your time, but get caught up in work? Or constant interruptions?\n\
|
133
|
+
\t Yeah you know who I'm talking about. Those people from the [abc] department always \"NEEDING xyz FEATURE NOW!!!\".\n\
|
134
|
+
\t Seriously though. I'm usually just loose track of time. I wanted an app that I could start with a task I think \n\
|
135
|
+
\t I'll be working on, but that get's in my face constantly to ensure I'm still working on it. And if I'm not any longer,\n\
|
136
|
+
\t provides an easy way of changing to another task, or if I have changed tasks and not already updated the app, would \n\
|
137
|
+
\t provide an easy way of changing the task of the previously recorded interval. That's what this is intended to do.\n\n\
|
138
|
+
\t Time Tracking.\n\
|
139
|
+
\t Proactively set what you expect to work on.\n\
|
140
|
+
\t Reactively modify what you are no longer working on.\n "
|
141
|
+
email: frogstarr78@gmail.com
|
142
|
+
executables:
|
143
|
+
- pratt
|
144
|
+
extensions: []
|
145
|
+
|
146
|
+
extra_rdoc_files:
|
147
|
+
- README.txt
|
148
|
+
- TODO
|
149
|
+
files:
|
150
|
+
- .exrc
|
151
|
+
- .gitignore
|
152
|
+
- History.txt
|
153
|
+
- Manifest.txt
|
154
|
+
- Pratt.gemspec
|
155
|
+
- Pratt.mm
|
156
|
+
- README.txt
|
157
|
+
- Rakefile
|
158
|
+
- TODO
|
159
|
+
- VERSION
|
160
|
+
- bin/pratt
|
161
|
+
- config.rb
|
162
|
+
- db/sqlite_databases_go_here
|
163
|
+
- db/zips.csv.zip
|
164
|
+
- lib/models.rb
|
165
|
+
- lib/pratt.rb
|
166
|
+
- lib/pratt/core_ext.rb
|
167
|
+
- lib/pratt/core_ext/array.rb
|
168
|
+
- lib/pratt/core_ext/float.rb
|
169
|
+
- lib/pratt/core_ext/nil.rb
|
170
|
+
- lib/pratt/core_ext/numeric.rb
|
171
|
+
- lib/pratt/core_ext/string.rb
|
172
|
+
- lib/pratt/core_ext/time.rb
|
173
|
+
- lib/pratt/dialogs.rb
|
174
|
+
- lib/pratt/formatting.rb
|
175
|
+
- lib/pratt/project_actions.rb
|
176
|
+
- lib/pratt/reports.rb
|
177
|
+
- models/app.rb
|
178
|
+
- models/customer.rb
|
179
|
+
- models/invoice.rb
|
180
|
+
- models/invoice_whence.rb
|
181
|
+
- models/payment.rb
|
182
|
+
- models/pratt.rb
|
183
|
+
- models/project.rb
|
184
|
+
- models/whence.rb
|
185
|
+
- models/zip.rb
|
186
|
+
- pratt.mm
|
187
|
+
- reports/travel.log
|
188
|
+
- reports/travel.log.2009
|
189
|
+
- spec/app_spec.rb
|
190
|
+
- spec/array_spec.rb
|
191
|
+
- spec/customer_spec.rb
|
192
|
+
- spec/fixtures/empty_graph.expectation
|
193
|
+
- spec/fixtures/graph.expectation
|
194
|
+
- spec/fixtures/proportions.expectation
|
195
|
+
- spec/float_spec.rb
|
196
|
+
- spec/formatting_spec.rb
|
197
|
+
- spec/money_spec.rb
|
198
|
+
- spec/nil_class_spec.rb
|
199
|
+
- spec/numeric_spec.rb
|
200
|
+
- spec/payment_spec.rb
|
201
|
+
- spec/pratt_spec.rb
|
202
|
+
- spec/project_spec.rb
|
203
|
+
- spec/rcov.opts
|
204
|
+
- spec/report_action_spec.rb
|
205
|
+
- spec/report_spec.rb
|
206
|
+
- spec/seed_data.rb
|
207
|
+
- spec/spec.opts
|
208
|
+
- spec/spec_helper.rb
|
209
|
+
- spec/string_ext_spec.rb
|
210
|
+
- spec/whence_spec.rb
|
211
|
+
- tasks/pratt.rb
|
212
|
+
- templates/model.eruby
|
213
|
+
- templates/spec.eruby
|
214
|
+
- views/current.eruby
|
215
|
+
- views/general-invoice.eruby
|
216
|
+
- views/graph.eruby
|
217
|
+
- views/invoice.eruby
|
218
|
+
- views/main.rb
|
219
|
+
- views/pid.eruby
|
220
|
+
- views/pop.rb
|
221
|
+
- views/proportions.eruby
|
222
|
+
- views/raw.eruby
|
223
|
+
has_rdoc: true
|
224
|
+
homepage: http://github.com/frogstarr78/pratt
|
225
|
+
licenses: []
|
226
|
+
|
227
|
+
post_install_message:
|
228
|
+
rdoc_options:
|
229
|
+
- --charset=UTF-8
|
230
|
+
require_paths:
|
231
|
+
- lib
|
232
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
233
|
+
requirements:
|
234
|
+
- - ">="
|
235
|
+
- !ruby/object:Gem::Version
|
236
|
+
segments:
|
237
|
+
- 0
|
238
|
+
version: "0"
|
239
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
240
|
+
requirements:
|
241
|
+
- - ">="
|
242
|
+
- !ruby/object:Gem::Version
|
243
|
+
segments:
|
244
|
+
- 0
|
245
|
+
version: "0"
|
246
|
+
requirements: []
|
247
|
+
|
248
|
+
rubyforge_project: Pratt
|
249
|
+
rubygems_version: 1.3.6
|
250
|
+
signing_key:
|
251
|
+
specification_version: 3
|
252
|
+
summary: Pro/Re-Active Time Tracker. Track time based on what you expect to be working on, with frequent prompts to ensure accuracy.
|
253
|
+
test_files:
|
254
|
+
- spec/nil_class_spec.rb
|
255
|
+
- spec/whence_spec.rb
|
256
|
+
- spec/array_spec.rb
|
257
|
+
- spec/spec_helper.rb
|
258
|
+
- spec/float_spec.rb
|
259
|
+
- spec/pratt_spec.rb
|
260
|
+
- spec/seed_data.rb
|
261
|
+
- spec/project_spec.rb
|
262
|
+
- spec/numeric_spec.rb
|
263
|
+
- spec/app_spec.rb
|
264
|
+
- spec/formatting_spec.rb
|
265
|
+
- spec/string_ext_spec.rb
|
266
|
+
- spec/customer_spec.rb
|
267
|
+
- spec/report_spec.rb
|
268
|
+
- spec/money_spec.rb
|
269
|
+
- spec/report_action_spec.rb
|
270
|
+
- spec/payment_spec.rb
|
271
|
+
- spec/rcov.opts
|
272
|
+
- spec/spec.opts
|
273
|
+
- spec/fixtures/empty_graph.expectation
|
274
|
+
- spec/fixtures/proportions.expectation
|
275
|
+
- spec/fixtures/graph.expectation
|