invoice_printer 1.3.0 → 2.0.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.
@@ -16,11 +16,15 @@ item = InvoicePrinter::Document::Item.new(
16
16
  invoice = InvoicePrinter::Document.new(
17
17
  number: 'NO. 198900000001',
18
18
  provider_name: 'John White',
19
+ # Deprecated 1.3 API, use provider_lines
20
+ # Here for compatibility test
19
21
  provider_street: '5th Avenue',
20
22
  provider_street_number: '1',
21
23
  provider_postcode: '747 05',
22
24
  provider_city: 'NYC',
23
25
  purchaser_name: 'Will Black',
26
+ # Deprecated 1.3 API, use purchaser_lines
27
+ # Here for compatibility test
24
28
  purchaser_street: '7th Avenue',
25
29
  purchaser_street_number: '1',
26
30
  purchaser_postcode: '747 70',
@@ -2,6 +2,11 @@ lib = File.expand_path('../lib', __FILE__)
2
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
3
  require 'invoice_printer/version'
4
4
 
5
+ SERVER_FILES = [
6
+ 'bin/invoice_printer_server',
7
+ 'lib/invoice_printer/server.rb'
8
+ ]
9
+
5
10
  Gem::Specification.new do |spec|
6
11
  spec.name = 'invoice_printer'
7
12
  spec.version = InvoicePrinter::VERSION
@@ -12,8 +17,10 @@ Gem::Specification.new do |spec|
12
17
  spec.homepage = 'https://github.com/strzibny/invoice_printer'
13
18
  spec.license = 'MIT'
14
19
 
20
+ # Remove server files
15
21
  # Remove .pdf files as they take a lot of space
16
22
  package_files = `git ls-files -z`.split("\x0")
23
+ .reject{ |file| SERVER_FILES.include?(file) }
17
24
  .reject{ |file| file.match /.*\.pdf/ }
18
25
 
19
26
  spec.files = package_files
@@ -23,11 +30,9 @@ Gem::Specification.new do |spec|
23
30
  spec.bindir = 'bin'
24
31
 
25
32
  spec.add_dependency 'json', '~> 2.1'
26
- spec.add_dependency 'roda', '3.5.0'
27
- spec.add_dependency 'puma', '~> 3.9'
28
- spec.add_dependency 'prawn', '2.1.0'
29
- spec.add_dependency 'prawn-layout', '0.8.4'
33
+ spec.add_dependency 'prawn', '~> 2.1.0'
34
+ spec.add_dependency 'prawn-layout', '~> 0.8.4'
30
35
 
31
- spec.add_development_dependency 'bundler', '~> 1.7'
32
- spec.add_development_dependency 'rake', '~> 10.0'
36
+ spec.add_development_dependency 'bundler', '>= 1.7'
37
+ spec.add_development_dependency 'rake', '>= 10.0'
33
38
  end
@@ -0,0 +1,35 @@
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'invoice_printer/version'
4
+
5
+ SERVER_FILES = [
6
+ 'bin/invoice_printer_server',
7
+ 'lib/invoice_printer/server.rb',
8
+ 'lib/invoice_printer/version.rb'
9
+ ]
10
+
11
+ Gem::Specification.new do |spec|
12
+ spec.name = 'invoice_printer_server'
13
+ spec.version = InvoicePrinter::VERSION
14
+ spec.authors = ['Josef Strzibny']
15
+ spec.email = ['strzibny@strzibny.name']
16
+ spec.summary = 'Super simple PDF invoicing in pure Ruby'
17
+ spec.description = 'Super simple and fast PDF invoicing in pure Ruby (based on Prawn library).'
18
+ spec.homepage = 'https://github.com/strzibny/invoice_printer'
19
+ spec.license = 'MIT'
20
+
21
+ # Include only server files
22
+ spec.files = SERVER_FILES
23
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
24
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
25
+ spec.require_paths = ['lib']
26
+ spec.bindir = 'bin'
27
+
28
+ spec.add_dependency 'invoice_printer', InvoicePrinter::VERSION
29
+ spec.add_dependency 'json', '~> 2.1'
30
+ spec.add_dependency 'roda', '~> 3.5'
31
+ spec.add_dependency 'puma', '>= 3.9.0'
32
+
33
+ spec.add_development_dependency 'bundler', '>= 1.7'
34
+ spec.add_development_dependency 'rake', '>= 10.0'
35
+ end
@@ -8,21 +8,11 @@ module InvoicePrinter
8
8
  # provider_name: 'Business s.r.o.',
9
9
  # provider_tax_id: '56565656',
10
10
  # provider_tax_id2: '465454',
11
- # provider_street: 'Rolnicka',
12
- # provider_street_number: '1',
13
- # provider_postcode: '747 05',
14
- # provider_city: 'Opava',
15
- # provider_city_part: 'Katerinky',
16
- # provider_extra_address_line: 'Czech Republic',
11
+ # provider_lines: "Rolnicka 1\n747 05 Opava",
17
12
  # purchaser_name: 'Adam',
18
13
  # purchaser_tax_id: '',
19
14
  # purchaser_tax_id2: '',
20
- # purchaser_street: 'Ostravska',
21
- # purchaser_street_number: '1',
22
- # purchaser_postcode: '747 70',
23
- # purchaser_city: 'Opava',
24
- # purchaser_city_part: '',
25
- # purchaser_extra_address_line: '',
15
+ # purchaser_lines: "Ostravska 2\n747 05 Opava",
26
16
  # issue_date: '19/03/3939',
27
17
  # due_date: '19/03/3939',
28
18
  # subtotal: '$ 150',
@@ -48,6 +38,7 @@ module InvoicePrinter
48
38
  :provider_name,
49
39
  :provider_tax_id,
50
40
  :provider_tax_id2,
41
+ :provider_lines,
51
42
  # Provider address fields
52
43
  :provider_street,
53
44
  :provider_street_number,
@@ -59,6 +50,7 @@ module InvoicePrinter
59
50
  :purchaser_name,
60
51
  :purchaser_tax_id,
61
52
  :purchaser_tax_id2,
53
+ :purchaser_lines,
62
54
  # Purchaser address fields
63
55
  :purchaser_street,
64
56
  :purchaser_street_number,
@@ -94,6 +86,7 @@ module InvoicePrinter
94
86
  provider_city: json['provider_city'],
95
87
  provider_city_part: json['provider_city_part'],
96
88
  provider_extra_address_line: json['provider_extra_address_line'],
89
+ provider_lines: json['provider_lines'],
97
90
  purchaser_name: json['purchaser_name'],
98
91
  purchaser_tax_id: json['purchaser_tax_id'],
99
92
  purchaser_tax_id2: json['purchaser_tax_id2'],
@@ -103,6 +96,7 @@ module InvoicePrinter
103
96
  purchaser_city: json['purchaser_city'],
104
97
  purchaser_city_part: json['purchaser_city_part'],
105
98
  purchaser_extra_address_line: json['purchaser_extra_address_line'],
99
+ purchaser_lines: json['purchaser_lines'],
106
100
  issue_date: json['issue_date'],
107
101
  due_date: json['due_date'],
108
102
  subtotal: json['subtotal'],
@@ -130,6 +124,7 @@ module InvoicePrinter
130
124
  provider_city: nil,
131
125
  provider_city_part: nil,
132
126
  provider_extra_address_line: nil,
127
+ provider_lines: nil,
133
128
  purchaser_name: nil,
134
129
  purchaser_tax_id: nil,
135
130
  purchaser_tax_id2: nil,
@@ -139,6 +134,7 @@ module InvoicePrinter
139
134
  purchaser_city: nil,
140
135
  purchaser_city_part: nil,
141
136
  purchaser_extra_address_line: nil,
137
+ purchaser_lines: nil,
142
138
  issue_date: nil,
143
139
  due_date: nil,
144
140
  subtotal: nil,
@@ -162,6 +158,7 @@ module InvoicePrinter
162
158
  @provider_city = String(provider_city)
163
159
  @provider_city_part = String(provider_city_part)
164
160
  @provider_extra_address_line = String(provider_extra_address_line)
161
+ @provider_lines = String(provider_lines)
165
162
  @purchaser_name = String(purchaser_name)
166
163
  @purchaser_tax_id = String(purchaser_tax_id)
167
164
  @purchaser_tax_id2 = String(purchaser_tax_id2)
@@ -171,6 +168,7 @@ module InvoicePrinter
171
168
  @purchaser_city = String(purchaser_city)
172
169
  @purchaser_city_part = String(purchaser_city_part)
173
170
  @purchaser_extra_address_line = String(purchaser_extra_address_line)
171
+ @purchaser_lines = String(purchaser_lines)
174
172
  @issue_date = String(issue_date)
175
173
  @due_date = String(due_date)
176
174
  @subtotal = String(subtotal)
@@ -184,6 +182,8 @@ module InvoicePrinter
184
182
  @items = items
185
183
  @note = String(note)
186
184
 
185
+
186
+
187
187
  raise InvalidInput, 'items are not only a type of InvoicePrinter::Document::Item' \
188
188
  unless @items.select{ |i| !i.is_a?(InvoicePrinter::Document::Item) }.empty?
189
189
  end
@@ -200,6 +200,7 @@ module InvoicePrinter
200
200
  'provider_city': @provider_city,
201
201
  'provider_city_part': @provider_city_part,
202
202
  'provider_extra_address_line': @provider_extra_address_line,
203
+ 'provider_lines': @provider_lines,
203
204
  'purchaser_name': @purchaser_name,
204
205
  'purchaser_tax_id': @purchaser_tax_id,
205
206
  'purchaser_tax_id2': @purchaser_tax_id2,
@@ -209,6 +210,7 @@ module InvoicePrinter
209
210
  'purchaser_city': @purchaser_city,
210
211
  'purchaser_city_part': @purchaser_city_part,
211
212
  'purchaser_extra_address_line': @purchaser_extra_address_line,
213
+ 'purchaser_lines': @purchaser_lines,
212
214
  'issue_date': @issue_date,
213
215
  'due_date': @due_date,
214
216
  'subtotal': @subtotal,
@@ -101,6 +101,36 @@ module InvoicePrinter
101
101
  end
102
102
  end
103
103
 
104
+ # Version 2.1 deprecation warnings
105
+ warnings = [
106
+ @document.provider_street,
107
+ @document.provider_street_number,
108
+ @document.provider_postcode,
109
+ @document.provider_city,
110
+ @document.provider_city_part,
111
+ @document.provider_extra_address_line,
112
+ @document.purchaser_street,
113
+ @document.purchaser_street_number,
114
+ @document.purchaser_postcode,
115
+ @document.purchaser_city,
116
+ @document.purchaser_city_part,
117
+ @document.purchaser_extra_address_line
118
+ ].delete_if(&:empty?)
119
+
120
+ unless warnings.empty?
121
+ warning = <<~WARN
122
+ WARNING: Following values are used in deprecated fields and
123
+ won't be rendered in future versions of InvoicePrinter:
124
+
125
+ #{warnings.join(", ")}
126
+
127
+ Use new provider_lines and purchaser_lines fields instead of
128
+ the old address fields.
129
+ WARN
130
+
131
+ $stderr.puts warning
132
+ end
133
+
104
134
  build_pdf
105
135
  end
106
136
 
@@ -189,7 +219,7 @@ module InvoicePrinter
189
219
  # Build the following provider box:
190
220
  #
191
221
  # ------------------------------------------
192
- # | Provider Optinal provider sublabel|
222
+ # | Provider Optional provider sublabel|
193
223
  # | PROVIDER co. |
194
224
  # | 5th Street |
195
225
  # | 747 27 City |
@@ -221,39 +251,55 @@ module InvoicePrinter
221
251
  align: :right
222
252
  )
223
253
  end
224
- @pdf.text_box(
225
- "#{@document.provider_street} #{@document.provider_street_number}",
226
- size: 10,
227
- at: [10, y(620) - @push_down],
228
- width: x(240)
229
- )
230
- @pdf.text_box(
231
- @document.provider_postcode,
232
- size: 10,
233
- at: [10, y(605) - @push_down],
234
- width: x(240)
235
- )
236
- @pdf.text_box(
237
- @document.provider_city,
238
- size: 10,
239
- at: [60, y(605) - @push_down],
240
- width: x(240)
241
- )
242
- unless @document.provider_city_part.empty?
254
+ # Render provider_lines if present
255
+ if !@document.provider_lines.empty?
256
+ lines = @document.provider_lines.split("\n")
257
+ line_y = 618
258
+ lines.each_with_index do |line, index|
259
+ next if index > 3
260
+
261
+ @pdf.text_box(
262
+ "#{line}",
263
+ size: 10,
264
+ at: [10, y(line_y - index*15) - @push_down],
265
+ width: x(240)
266
+ )
267
+ end
268
+ else
243
269
  @pdf.text_box(
244
- @document.provider_city_part,
270
+ "#{@document.provider_street} #{@document.provider_street_number}",
245
271
  size: 10,
246
- at: [60, y(590) - @push_down],
272
+ at: [10, y(620) - @push_down],
247
273
  width: x(240)
248
274
  )
249
- end
250
- unless @document.provider_extra_address_line.empty?
251
275
  @pdf.text_box(
252
- @document.provider_extra_address_line,
276
+ @document.provider_postcode,
253
277
  size: 10,
254
- at: [10, y(575) - @push_down],
278
+ at: [10, y(605) - @push_down],
255
279
  width: x(240)
256
280
  )
281
+ @pdf.text_box(
282
+ @document.provider_city,
283
+ size: 10,
284
+ at: [60, y(605) - @push_down],
285
+ width: x(240)
286
+ )
287
+ unless @document.provider_city_part.empty?
288
+ @pdf.text_box(
289
+ @document.provider_city_part,
290
+ size: 10,
291
+ at: [60, y(590) - @push_down],
292
+ width: x(240)
293
+ )
294
+ end
295
+ unless @document.provider_extra_address_line.empty?
296
+ @pdf.text_box(
297
+ @document.provider_extra_address_line,
298
+ size: 10,
299
+ at: [10, y(575) - @push_down],
300
+ width: x(240)
301
+ )
302
+ end
257
303
  end
258
304
  unless @document.provider_tax_id.empty?
259
305
  @pdf.text_box(
@@ -310,39 +356,55 @@ module InvoicePrinter
310
356
  align: :right
311
357
  )
312
358
  end
313
- @pdf.text_box(
314
- "#{@document.purchaser_street} #{@document.purchaser_street_number}",
315
- size: 10,
316
- at: [x(284), y(620) - @push_down],
317
- width: x(240)
318
- )
319
- @pdf.text_box(
320
- @document.purchaser_postcode,
321
- size: 10,
322
- at: [x(284), y(605) - @push_down],
323
- width: x(240)
324
- )
325
- @pdf.text_box(
326
- @document.purchaser_city,
327
- size: 10,
328
- at: [x(334), y(605) - @push_down],
329
- width: x(240)
330
- )
331
- unless @document.purchaser_city_part.empty?
359
+ # Render purchaser_lines if present
360
+ if !@document.purchaser_lines.empty?
361
+ lines = @document.purchaser_lines.split("\n")
362
+ line_y = 618
363
+ lines.each_with_index do |line, index|
364
+ next if index > 3
365
+
366
+ @pdf.text_box(
367
+ "#{line}",
368
+ size: 10,
369
+ at: [x(284), y(line_y - index*15) - @push_down],
370
+ width: x(240)
371
+ )
372
+ end
373
+ else
332
374
  @pdf.text_box(
333
- @document.purchaser_city_part,
375
+ "#{@document.purchaser_street} #{@document.purchaser_street_number}",
334
376
  size: 10,
335
- at: [x(334), y(590) - @push_down],
377
+ at: [x(284), y(620) - @push_down],
336
378
  width: x(240)
337
379
  )
338
- end
339
- unless @document.purchaser_extra_address_line.empty?
340
380
  @pdf.text_box(
341
- @document.purchaser_extra_address_line,
381
+ @document.purchaser_postcode,
342
382
  size: 10,
343
- at: [x(284), y(575) - @push_down],
383
+ at: [x(284), y(605) - @push_down],
344
384
  width: x(240)
345
385
  )
386
+ @pdf.text_box(
387
+ @document.purchaser_city,
388
+ size: 10,
389
+ at: [x(334), y(605) - @push_down],
390
+ width: x(240)
391
+ )
392
+ unless @document.purchaser_city_part.empty?
393
+ @pdf.text_box(
394
+ @document.purchaser_city_part,
395
+ size: 10,
396
+ at: [x(334), y(590) - @push_down],
397
+ width: x(240)
398
+ )
399
+ end
400
+ unless @document.purchaser_extra_address_line.empty?
401
+ @pdf.text_box(
402
+ @document.purchaser_extra_address_line,
403
+ size: 10,
404
+ at: [x(284), y(575) - @push_down],
405
+ width: x(240)
406
+ )
407
+ end
346
408
  end
347
409
  unless @document.purchaser_tax_id.empty?
348
410
  @pdf.text_box(
@@ -1,3 +1,3 @@
1
1
  module InvoicePrinter
2
- VERSION = '1.3.0'
2
+ VERSION = '2.0.0.alpha1'
3
3
  end
@@ -5,9 +5,12 @@ class CLITest < Minitest::Test
5
5
  include InvoicePrinterHelpers
6
6
 
7
7
  def setup
8
+ t = Time.now.strftime("%Y%m%d")
9
+ tmpname = "/tmp/invoice-#{t}-#{$$}-#{rand(0x100000000).to_s(36)}-fd"
10
+
8
11
  @invoice = InvoicePrinter::Document.new(default_document_params)
9
12
  @invoice_as_json = @invoice.to_json
10
- @output_path = Dir::Tmpname.make_tmpname('/tmp/invoice', nil)
13
+ @output_path = tmpname
11
14
  end
12
15
 
13
16
  def teardown
@@ -25,11 +25,9 @@ module InvoicePrinter
25
25
  strings = []
26
26
  strings << @document.provider_name
27
27
  strings << @labels[:provider]
28
- strings << "#{@document.provider_street} #{@document.provider_street_number}".strip
29
- strings << @document.provider_postcode
30
- strings << @document.provider_city
31
- strings << @document.provider_city_part
32
- strings << @document.provider_extra_address_line
28
+ @document.provider_lines.split("\n").each do |line|
29
+ strings << line
30
+ end
33
31
  strings << "#{@labels[:tax_id]}: #{@document.provider_tax_id}" \
34
32
  unless @document.provider_tax_id.empty?
35
33
  strings << "#{@labels[:tax_id2]}: #{@document.provider_tax_id2}" \
@@ -42,11 +40,9 @@ module InvoicePrinter
42
40
  strings = []
43
41
  strings << @document.purchaser_name
44
42
  strings << @labels[:purchaser]
45
- strings << "#{@document.purchaser_street} #{@document.purchaser_street_number}".strip
46
- strings << @document.purchaser_postcode
47
- strings << @document.purchaser_city
48
- strings << @document.purchaser_city_part
49
- strings << @document.purchaser_extra_address_line
43
+ @document.purchaser_lines.split("\n").each do |line|
44
+ strings << line
45
+ end
50
46
  strings << "#{@labels[:tax_id]}: #{@document.purchaser_tax_id}" \
51
47
  unless @document.purchaser_tax_id.empty?
52
48
  strings << "#{@labels[:tax_id2]}: #{@document.purchaser_tax_id2}" \