rbinvoice 0.2.4 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +54 -0
- data/Rakefile +1 -33
- data/VERSION +1 -1
- data/lib/rbinvoice.rb +3 -0
- data/lib/rbinvoice/options.rb +9 -2
- data/lib/rbinvoice/version.rb +3 -0
- data/rbinvoice.gemspec +20 -65
- data/templates/invoice.tex.liquid +1 -1
- metadata +9 -44
- data/README.html +0 -43
data/.gitignore
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
# rcov generated
|
2
|
+
coverage
|
3
|
+
|
4
|
+
# rdoc generated
|
5
|
+
rdoc
|
6
|
+
|
7
|
+
# yard generated
|
8
|
+
doc
|
9
|
+
.yardoc
|
10
|
+
|
11
|
+
# bundler
|
12
|
+
.bundle
|
13
|
+
|
14
|
+
# jeweler generated
|
15
|
+
pkg
|
16
|
+
|
17
|
+
# Have editor/IDE/OS specific files you need to ignore? Consider using a global gitignore:
|
18
|
+
#
|
19
|
+
# * Create a file at ~/.gitignore
|
20
|
+
# * Include files you want ignored
|
21
|
+
# * Run: git config --global core.excludesfile ~/.gitignore
|
22
|
+
#
|
23
|
+
# After doing this, these files will be ignored in all your git projects,
|
24
|
+
# saving you from having to 'pollute' every project you touch with them
|
25
|
+
#
|
26
|
+
# Not sure what to needs to be ignored for particular editors/OSes? Here's some ideas to get you started. (Remember, remove the leading # of the line)
|
27
|
+
#
|
28
|
+
# For MacOS:
|
29
|
+
#
|
30
|
+
.DS_Store
|
31
|
+
|
32
|
+
# For TextMate
|
33
|
+
#*.tmproj
|
34
|
+
#tmtags
|
35
|
+
|
36
|
+
# For emacs:
|
37
|
+
*~
|
38
|
+
\#*
|
39
|
+
.\#*
|
40
|
+
|
41
|
+
# For vim:
|
42
|
+
.*.swp
|
43
|
+
.*.swo
|
44
|
+
|
45
|
+
# For redcar:
|
46
|
+
#.redcar
|
47
|
+
|
48
|
+
# For rubinius:
|
49
|
+
#*.rbc
|
50
|
+
|
51
|
+
tmp
|
52
|
+
README.html
|
53
|
+
|
54
|
+
rbinvoice*.gem
|
data/Rakefile
CHANGED
@@ -9,24 +9,6 @@ rescue Bundler::BundlerError => e
|
|
9
9
|
$stderr.puts "Run `bundle install` to install missing gems"
|
10
10
|
exit e.status_code
|
11
11
|
end
|
12
|
-
require 'rake'
|
13
|
-
|
14
|
-
require 'jeweler'
|
15
|
-
Jeweler::Tasks.new do |gem|
|
16
|
-
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
17
|
-
gem.name = "rbinvoice"
|
18
|
-
gem.homepage = "http://github.com/pjungwir/rbinvoice"
|
19
|
-
gem.license = "MIT"
|
20
|
-
gem.summary = 'Used to invoice my clients'
|
21
|
-
gem.description = <<-EOT
|
22
|
-
Reads hours from a Google Spreadsheet and generates a PDF invoice.
|
23
|
-
EOT
|
24
|
-
gem.email = "pj@illuminatedcomputing.com"
|
25
|
-
gem.authors = ["Paul A. Jungwirth"]
|
26
|
-
gem.executables << 'rbinvoice'
|
27
|
-
# dependencies defined in Gemfile
|
28
|
-
end
|
29
|
-
Jeweler::RubygemsDotOrgTasks.new
|
30
12
|
|
31
13
|
require 'rspec/core'
|
32
14
|
require 'rspec/core/rake_task'
|
@@ -34,24 +16,10 @@ RSpec::Core::RakeTask.new(:spec) do |spec|
|
|
34
16
|
spec.pattern = FileList['spec/**/*_spec.rb']
|
35
17
|
end
|
36
18
|
|
37
|
-
=begin
|
38
|
-
RSpec::Core::RakeTask.new(:rcov) do |spec|
|
39
|
-
spec.pattern = 'spec/**/*_spec.rb'
|
40
|
-
spec.rcov = true
|
41
|
-
end
|
42
|
-
=end
|
43
|
-
|
44
19
|
task :default => :spec
|
45
20
|
|
46
|
-
require 'rdoc/task'
|
47
|
-
Rake::RDocTask.new do |rdoc|
|
48
|
-
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
49
21
|
|
50
|
-
|
51
|
-
rdoc.title = "rbinvoice #{version}"
|
52
|
-
rdoc.rdoc_files.include('README*')
|
53
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
54
|
-
end
|
22
|
+
Bundler::GemHelper.install_tasks
|
55
23
|
|
56
24
|
task :run, [] => [] do |t, args|
|
57
25
|
require 'rbinvoice'
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.4.0
|
data/lib/rbinvoice.rb
CHANGED
@@ -48,6 +48,8 @@ module RbInvoice
|
|
48
48
|
parse_date(earliest_task_date(hours))
|
49
49
|
end
|
50
50
|
start_date, end_date = RbInvoice::Options::find_invoice_bounds(earliest_date, freq)
|
51
|
+
opts[:start_date] = start_date
|
52
|
+
opts[:end_date] = end_date
|
51
53
|
tasks = hourly_breakdown(client, start_date, end_date, opts)
|
52
54
|
while tasks.size > 0
|
53
55
|
filename = RbInvoice::Options::default_out_filename(opts)
|
@@ -100,6 +102,7 @@ module RbInvoice
|
|
100
102
|
total_duration: decimal_to_interval(items.inject(0) {|t, item| t + item['duration_decimal']}),
|
101
103
|
total_price: "%0.02f" % items.inject(0) {|t, item| t + item['price_decimal']},
|
102
104
|
dba: escape_for_latex(opts[:dba]),
|
105
|
+
payment_due: opts[:payment_due],
|
103
106
|
client_full_name: escape_for_latex(full_name),
|
104
107
|
client_address: escape_for_latex(address),
|
105
108
|
client_description: escape_for_latex(description),
|
data/lib/rbinvoice/options.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'yaml'
|
2
2
|
require 'trollop'
|
3
3
|
require 'rbinvoice/util'
|
4
|
+
require 'rbinvoice/version'
|
4
5
|
|
5
6
|
module RbInvoice
|
6
7
|
module Options
|
@@ -199,6 +200,10 @@ module RbInvoice
|
|
199
200
|
key_for_client(data, client, :dba) || opts[:dba] || 'Illuminated Computing Inc.'
|
200
201
|
end
|
201
202
|
|
203
|
+
def self.payment_due_for_client(data, opts, client)
|
204
|
+
key_for_client(data, client, :payment_due) || opts[:payment_due] || 'upon receipt'
|
205
|
+
end
|
206
|
+
|
202
207
|
def self.full_name_for_client(data, opts, client)
|
203
208
|
key_for_client(data, client, :full_name)
|
204
209
|
end
|
@@ -208,12 +213,13 @@ module RbInvoice
|
|
208
213
|
end
|
209
214
|
|
210
215
|
def self.description_for_client(data, opts, client)
|
211
|
-
key_for_client(data, client, :description)
|
216
|
+
desc = key_for_client(data, client, :description)
|
217
|
+
"#{desc} from #{opts[:start_date].strftime("%B %-d")} to #{opts[:end_date].strftime("%B %-d, %Y")}."
|
212
218
|
end
|
213
219
|
|
214
220
|
def self.parse_command_line(argv)
|
215
221
|
opts = Trollop::options(argv) do
|
216
|
-
version "rbinvoice
|
222
|
+
version "rbinvoice #{::RbInvoice::VERSION} (c) 2012 Paul A. Jungwirth"
|
217
223
|
banner <<-EOH
|
218
224
|
USAGE: rbinvoice [options] <client> [filename]
|
219
225
|
EOH
|
@@ -260,6 +266,7 @@ module RbInvoice
|
|
260
266
|
opts[:end_date] = Date.strptime(opts[:end_date], "%Y-%m-%d") if opts[:end_date]
|
261
267
|
|
262
268
|
opts[:dba] = dba_for_client(opts[:data], opts, opts[:client])
|
269
|
+
opts[:payment_due] = payment_due_for_client(opts[:data], opts, opts[:client])
|
263
270
|
# Read the list of past invoices.
|
264
271
|
# If there are none, assume there is only one invoice to do.
|
265
272
|
|
data/rbinvoice.gemspec
CHANGED
@@ -1,78 +1,33 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
-
# -*- encoding: utf-8 -*-
|
1
|
+
$:.push File.dirname(__FILE__) + "/lib"
|
2
|
+
require 'rbinvoice/version'
|
5
3
|
|
6
4
|
Gem::Specification.new do |s|
|
7
5
|
s.name = "rbinvoice"
|
8
|
-
s.version =
|
6
|
+
s.version = RbInvoice::VERSION
|
9
7
|
|
10
|
-
s.
|
11
|
-
s.authors = ["Paul A. Jungwirth"]
|
12
|
-
s.date = "2013-03-15"
|
8
|
+
s.summary = "Used to invoice my clients"
|
13
9
|
s.description = " Reads hours from a Google Spreadsheet and generates a PDF invoice.\n"
|
14
|
-
s.email = "pj@illuminatedcomputing.com"
|
15
|
-
s.executables = ["rbinvoice", "rbinvoice"]
|
16
|
-
s.extra_rdoc_files = [
|
17
|
-
"LICENSE.txt",
|
18
|
-
"README.html",
|
19
|
-
"README.md",
|
20
|
-
"TODO"
|
21
|
-
]
|
22
|
-
s.files = [
|
23
|
-
"Gemfile",
|
24
|
-
"Gemfile.lock",
|
25
|
-
"LICENSE.txt",
|
26
|
-
"NOTES",
|
27
|
-
"README.md",
|
28
|
-
"Rakefile",
|
29
|
-
"TODO",
|
30
|
-
"VERSION",
|
31
|
-
"bin/rbinvoice",
|
32
|
-
"lib/rbinvoice.rb",
|
33
|
-
"lib/rbinvoice/options.rb",
|
34
|
-
"lib/rbinvoice/util.rb",
|
35
|
-
"rbinvoice.gemspec",
|
36
|
-
"spec/options_spec.rb",
|
37
|
-
"templates/invoice.tex.liquid"
|
38
|
-
]
|
39
10
|
s.homepage = "http://github.com/pjungwir/rbinvoice"
|
11
|
+
s.date = "2013-03-15"
|
12
|
+
s.authors = ["Paul A. Jungwirth"]
|
13
|
+
s.email = "pj@illuminatedcomputing.com"
|
14
|
+
|
40
15
|
s.licenses = ["MIT"]
|
16
|
+
|
41
17
|
s.require_paths = ["lib"]
|
18
|
+
s.executables = ["rbinvoice", "rbinvoice"]
|
42
19
|
s.rubygems_version = "1.8.24"
|
43
|
-
s.summary = "Used to invoice my clients"
|
44
20
|
|
45
|
-
|
46
|
-
|
21
|
+
s.files = `git ls-files`.split("\n")
|
22
|
+
s.test_files = `git ls-files -- {test,spec,fixtures}/*`.split("\n")
|
23
|
+
|
24
|
+
s.add_runtime_dependency 'trollop', '>= 0'
|
25
|
+
s.add_runtime_dependency 'roo', '>= 0'
|
26
|
+
s.add_runtime_dependency 'prawn', '>= 0'
|
27
|
+
s.add_runtime_dependency 'liquid', '>= 0'
|
28
|
+
|
29
|
+
s.add_development_dependency 'rspec', '~> 2.4.0'
|
30
|
+
s.add_development_dependency 'bundler', '>= 0'
|
47
31
|
|
48
|
-
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
49
|
-
s.add_runtime_dependency(%q<trollop>, [">= 0"])
|
50
|
-
s.add_runtime_dependency(%q<roo>, [">= 0"])
|
51
|
-
s.add_runtime_dependency(%q<prawn>, [">= 0"])
|
52
|
-
s.add_runtime_dependency(%q<liquid>, [">= 0"])
|
53
|
-
s.add_development_dependency(%q<rspec>, [">= 0"])
|
54
|
-
s.add_development_dependency(%q<bundler>, [">= 0"])
|
55
|
-
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
56
|
-
s.add_development_dependency(%q<simplecov>, [">= 0"])
|
57
|
-
else
|
58
|
-
s.add_dependency(%q<trollop>, [">= 0"])
|
59
|
-
s.add_dependency(%q<roo>, [">= 0"])
|
60
|
-
s.add_dependency(%q<prawn>, [">= 0"])
|
61
|
-
s.add_dependency(%q<liquid>, [">= 0"])
|
62
|
-
s.add_dependency(%q<rspec>, [">= 0"])
|
63
|
-
s.add_dependency(%q<bundler>, [">= 0"])
|
64
|
-
s.add_dependency(%q<jeweler>, [">= 0"])
|
65
|
-
s.add_dependency(%q<simplecov>, [">= 0"])
|
66
|
-
end
|
67
|
-
else
|
68
|
-
s.add_dependency(%q<trollop>, [">= 0"])
|
69
|
-
s.add_dependency(%q<roo>, [">= 0"])
|
70
|
-
s.add_dependency(%q<prawn>, [">= 0"])
|
71
|
-
s.add_dependency(%q<liquid>, [">= 0"])
|
72
|
-
s.add_dependency(%q<rspec>, [">= 0"])
|
73
|
-
s.add_dependency(%q<bundler>, [">= 0"])
|
74
|
-
s.add_dependency(%q<jeweler>, [">= 0"])
|
75
|
-
s.add_dependency(%q<simplecov>, [">= 0"])
|
76
|
-
end
|
77
32
|
end
|
78
33
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbinvoice
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -80,17 +80,17 @@ dependencies:
|
|
80
80
|
requirement: !ruby/object:Gem::Requirement
|
81
81
|
none: false
|
82
82
|
requirements:
|
83
|
-
- -
|
83
|
+
- - ~>
|
84
84
|
- !ruby/object:Gem::Version
|
85
|
-
version:
|
85
|
+
version: 2.4.0
|
86
86
|
type: :development
|
87
87
|
prerelease: false
|
88
88
|
version_requirements: !ruby/object:Gem::Requirement
|
89
89
|
none: false
|
90
90
|
requirements:
|
91
|
-
- -
|
91
|
+
- - ~>
|
92
92
|
- !ruby/object:Gem::Version
|
93
|
-
version:
|
93
|
+
version: 2.4.0
|
94
94
|
- !ruby/object:Gem::Dependency
|
95
95
|
name: bundler
|
96
96
|
requirement: !ruby/object:Gem::Requirement
|
@@ -107,38 +107,6 @@ dependencies:
|
|
107
107
|
- - ! '>='
|
108
108
|
- !ruby/object:Gem::Version
|
109
109
|
version: '0'
|
110
|
-
- !ruby/object:Gem::Dependency
|
111
|
-
name: jeweler
|
112
|
-
requirement: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
|
-
requirements:
|
115
|
-
- - ! '>='
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '0'
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
|
-
requirements:
|
123
|
-
- - ! '>='
|
124
|
-
- !ruby/object:Gem::Version
|
125
|
-
version: '0'
|
126
|
-
- !ruby/object:Gem::Dependency
|
127
|
-
name: simplecov
|
128
|
-
requirement: !ruby/object:Gem::Requirement
|
129
|
-
none: false
|
130
|
-
requirements:
|
131
|
-
- - ! '>='
|
132
|
-
- !ruby/object:Gem::Version
|
133
|
-
version: '0'
|
134
|
-
type: :development
|
135
|
-
prerelease: false
|
136
|
-
version_requirements: !ruby/object:Gem::Requirement
|
137
|
-
none: false
|
138
|
-
requirements:
|
139
|
-
- - ! '>='
|
140
|
-
- !ruby/object:Gem::Version
|
141
|
-
version: '0'
|
142
110
|
description: ! ' Reads hours from a Google Spreadsheet and generates a PDF invoice.
|
143
111
|
|
144
112
|
'
|
@@ -146,12 +114,9 @@ email: pj@illuminatedcomputing.com
|
|
146
114
|
executables:
|
147
115
|
- rbinvoice
|
148
116
|
extensions: []
|
149
|
-
extra_rdoc_files:
|
150
|
-
- LICENSE.txt
|
151
|
-
- README.html
|
152
|
-
- README.md
|
153
|
-
- TODO
|
117
|
+
extra_rdoc_files: []
|
154
118
|
files:
|
119
|
+
- .gitignore
|
155
120
|
- Gemfile
|
156
121
|
- Gemfile.lock
|
157
122
|
- LICENSE.txt
|
@@ -164,10 +129,10 @@ files:
|
|
164
129
|
- lib/rbinvoice.rb
|
165
130
|
- lib/rbinvoice/options.rb
|
166
131
|
- lib/rbinvoice/util.rb
|
132
|
+
- lib/rbinvoice/version.rb
|
167
133
|
- rbinvoice.gemspec
|
168
134
|
- spec/options_spec.rb
|
169
135
|
- templates/invoice.tex.liquid
|
170
|
-
- README.html
|
171
136
|
homepage: http://github.com/pjungwir/rbinvoice
|
172
137
|
licenses:
|
173
138
|
- MIT
|
@@ -183,7 +148,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
183
148
|
version: '0'
|
184
149
|
segments:
|
185
150
|
- 0
|
186
|
-
hash:
|
151
|
+
hash: 3119729522843240763
|
187
152
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
188
153
|
none: false
|
189
154
|
requirements:
|
data/README.html
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
<h1>rbinvoice</h1>
|
2
|
-
|
3
|
-
<p>rbinvoice lets you generate PDF invoices from a Google Spreadsheet.
|
4
|
-
It's pretty obscure; you probably haven't heard of it.</p>
|
5
|
-
|
6
|
-
<h2>Input</h2>
|
7
|
-
|
8
|
-
<p>RbInvoice reads your hours from a Google Spreadsheet, which should be formatted like this:</p>
|
9
|
-
|
10
|
-
<table>
|
11
|
-
<tr>
|
12
|
-
<td colspan="7"><b style="font-size:120%">My Time Tracking</b></td>
|
13
|
-
</tr>
|
14
|
-
<tr>
|
15
|
-
<td><b>Weekday</b></td>
|
16
|
-
<td><b>Day</b></td>
|
17
|
-
<td><b>Task</b></td>
|
18
|
-
<td><b>Notes</b></td>
|
19
|
-
<td><b>Start</b></td>
|
20
|
-
<td><b>Stop</b></td>
|
21
|
-
<td><b>Total</b></td>
|
22
|
-
</tr>
|
23
|
-
<tr>
|
24
|
-
<td>T</td>
|
25
|
-
<td>3/20/2012</td>
|
26
|
-
<td>BigCorp</td>
|
27
|
-
<td>API</td>
|
28
|
-
<td>8:00</td>
|
29
|
-
<td>12:15</td>
|
30
|
-
<td>4:15</td>
|
31
|
-
</tr>
|
32
|
-
<tr>
|
33
|
-
<td>T</td>
|
34
|
-
<td>3/20/2012</td>
|
35
|
-
<td>SmallCorp</td>
|
36
|
-
<td>Shopping Cart</td>
|
37
|
-
<td>13:00</td>
|
38
|
-
<td>17:15</td>
|
39
|
-
<td>4:00</td>
|
40
|
-
</tr>
|
41
|
-
</table>
|
42
|
-
|
43
|
-
<p>Columns B, E, F, and G should have a Date format. </p>
|