Pratt 1.6.8-x86-linux
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/.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
|