pdf-core 0.9.0 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/pdf/core/text.rb CHANGED
@@ -8,10 +8,13 @@
8
8
 
9
9
  module PDF
10
10
  module Core
11
- module Text #:nodoc:
11
+ # Low-level text rendering.
12
+ module Text
13
+ # Valid options of text drawing.
12
14
  # These should be used as a base. Extensions may build on this list
13
- #
14
15
  VALID_OPTIONS = %i[kerning size style].freeze
16
+
17
+ # text rendering modes
15
18
  MODES = {
16
19
  fill: 0,
17
20
  stroke: 1,
@@ -20,20 +23,27 @@ module PDF
20
23
  fill_clip: 4,
21
24
  stroke_clip: 5,
22
25
  fill_stroke_clip: 6,
23
- clip: 7
26
+ clip: 7,
24
27
  }.freeze
25
28
 
29
+ # Sygnals that a font doesn't have a name.
26
30
  class BadFontFamily < StandardError
27
31
  def initialize(message = 'Bad font family')
28
32
  super
29
33
  end
30
34
  end
31
35
 
36
+ # @deprecated
32
37
  attr_reader :skip_encoding
33
38
 
34
39
  # Low level call to set the current font style and extract text options
35
40
  # from an options hash. Should be called from within a save_font block
36
41
  #
42
+ # @param options [Hash]
43
+ # @option options :style [Symbol, String]
44
+ # @option options :kerning [Boolean]
45
+ # @option options :size [Numeric]
46
+ # @return [void]
37
47
  def process_text_options(options)
38
48
  if options[:style]
39
49
  raise BadFontFamily unless font.family
@@ -51,8 +61,9 @@ module PDF
51
61
 
52
62
  # Retrieve the current default kerning setting.
53
63
  #
54
- # Defaults to true
64
+ # Defaults to `true`.
55
65
  #
66
+ # @return [Boolean]
56
67
  def default_kerning?
57
68
  return true unless defined?(@default_kerning)
58
69
 
@@ -63,12 +74,15 @@ module PDF
63
74
  # be overridden using the :kerning text option when drawing text or a text
64
75
  # box.
65
76
  #
77
+ # @example
66
78
  # pdf.default_kerning = false
67
- # pdf.text('hello world') # text is not kerned
68
- # pdf.text('hello world', :kerning => true) # text is kerned
79
+ # pdf.text('hello world') # text is not kerned
80
+ # pdf.text('hello world', kerning: true) # text is kerned
69
81
  #
70
- def default_kerning(boolean)
71
- @default_kerning = boolean
82
+ # @param value [Boolean]
83
+ # @return [void]
84
+ def default_kerning(value)
85
+ @default_kerning = value
72
86
  end
73
87
 
74
88
  alias default_kerning= default_kerning
@@ -79,15 +93,18 @@ module PDF
79
93
  # overridden using the :leading text option when drawing text or a text
80
94
  # box.
81
95
  #
96
+ # @example
82
97
  # pdf.default_leading = 7
83
- # pdf.text('hello world') # a leading of 7 is used
84
- # pdf.text('hello world', :leading => 0) # a leading of 0 is used
98
+ # pdf.text('hello world') # a leading of 7 is used
99
+ # pdf.text('hello world', leading: 0) # a leading of 0 is used
85
100
  #
86
- # Defaults to 0
101
+ # Defaults to 0.
87
102
  #
103
+ # @param number [Numeric]
104
+ # @return [Numeric]
88
105
  def default_leading(number = nil)
89
106
  if number.nil?
90
- defined?(@default_leading) && @default_leading || 0
107
+ (defined?(@default_leading) && @default_leading) || 0
91
108
  else
92
109
  @default_leading = number
93
110
  end
@@ -101,23 +118,27 @@ module PDF
101
118
  # overridden using the :direction text option when drawing text or a text
102
119
  # box.
103
120
  #
121
+ # @example
104
122
  # pdf.text_direction = :rtl
105
- # pdf.text('hello world') # prints 'dlrow olleh'
106
- # pdf.text('hello world', :direction => :ltr) # prints 'hello world'
123
+ # pdf.text('hello world') # prints 'dlrow olleh'
124
+ # pdf.text('hello world', direction: :ltr) # prints 'hello world'
107
125
  #
108
126
  # Valid directions are:
109
127
  #
110
- # * :ltr - left-to-right (default)
111
- # * :rtl - right-to-left
128
+ # * `:ltr` -- left-to-right (default)
129
+ # * `:rtl` -- right-to-left
112
130
  #
113
131
  # Side effects:
114
132
  #
115
- # * When printing left-to-right, the default text alignment is :left
116
- # * When printing right-to-left, the default text alignment is :right
133
+ # * When printing left-to-right, the default text alignment is `:left`
134
+ # * When printing right-to-left, the default text alignment is `:right`
117
135
  #
136
+ # @param direction [:ltr, :rtl]
137
+ # @return [:ltr]
138
+ # @return [:rtl]
118
139
  def text_direction(direction = nil)
119
140
  if direction.nil?
120
- defined?(@text_direction) && @text_direction || :ltr
141
+ (defined?(@text_direction) && @text_direction) || :ltr
121
142
  else
122
143
  @text_direction = direction
123
144
  end
@@ -133,33 +154,36 @@ module PDF
133
154
  # rendered using the first font that includes the glyph, starting with the
134
155
  # current font and then moving through :fallback_fonts from left to right.
135
156
  #
136
- # Call with an empty array to turn off fallback fonts
137
- #
138
- # file = "#{Prawn::DATADIR}/fonts/gkai00mp.ttf"
139
- # font_families['Kai'] = {
140
- # :normal => { :file => file, :font => 'Kai' }
141
- # }
142
- # file = "#{Prawn::DATADIR}/fonts/Action Man.dfont"
143
- # font_families['Action Man'] = {
144
- # :normal => { :file => file, :font => 'ActionMan' },
145
- # }
146
- # fallback_fonts ['Times-Roman', 'Kai']
147
- # font 'Action Man'
148
- # text 'hello ƒ 你好'
149
- # > hello prints in Action Man
150
- # > ƒ prints in Times-Roman
151
- # > 你好 prints in Kai
152
- #
153
- # fallback_fonts [] # clears document-wide fallback fonts
157
+ # Call with an empty array to turn off fallback fonts.
158
+ #
159
+ # @example
160
+ # file = "#{Prawn::DATADIR}/fonts/gkai00mp.ttf"
161
+ # font_families['Kai'] = {
162
+ # normal: { file: file, font: 'Kai' }
163
+ # }
164
+ # file = "#{Prawn::DATADIR}/fonts/Action Man.dfont"
165
+ # font_families['Action Man'] = {
166
+ # normal: { file: file, font: 'ActionMan' },
167
+ # }
168
+ # fallback_fonts ['Times-Roman', 'Kai']
169
+ # font 'Action Man'
170
+ # text 'hello ƒ 你好'
171
+ # # hello prints in Action Man
172
+ # # ƒ prints in Times-Roman
173
+ # # 你好 prints in Kai
174
+ #
175
+ # fallback_fonts [] # clears document-wide fallback fonts
154
176
  #
155
177
  # Side effects:
156
178
  #
157
179
  # * Increased overhead when fallback fonts are declared as each glyph is
158
180
  # checked to see whether it exists in the current font
159
181
  #
182
+ # @param fallback_fonts [Array<String>]
183
+ # @return [Array<String>]
160
184
  def fallback_fonts(fallback_fonts = nil)
161
185
  if fallback_fonts.nil?
162
- defined?(@fallback_fonts) && @fallback_fonts || []
186
+ (defined?(@fallback_fonts) && @fallback_fonts) || []
163
187
  else
164
188
  @fallback_fonts = fallback_fonts
165
189
  end
@@ -172,139 +196,255 @@ module PDF
172
196
  # Call with a symbol and block to temporarily change the current
173
197
  # text rendering mode.
174
198
  #
199
+ # Valid modes are:
200
+ #
201
+ # * `:fill` - fill text (default)
202
+ # * `:stroke` - stroke text
203
+ # * `:fill_stroke` - fill, then stroke text
204
+ # * `:invisible` - invisible text
205
+ # * `:fill_clip` - fill text then add to path for clipping
206
+ # * `:stroke_clip` - stroke text then add to path for clipping
207
+ # * `:fill_stroke_clip` - fill then stroke text, then add to path for
208
+ # clipping
209
+ # * `:clip` - add text to path for clipping
210
+ #
211
+ # @example
175
212
  # pdf.text_rendering_mode(:stroke) do
176
213
  # pdf.text('Outlined Text')
177
214
  # end
178
215
  #
179
- # Valid modes are:
180
- #
181
- # * :fill - fill text (default)
182
- # * :stroke - stroke text
183
- # * :fill_stroke - fill, then stroke text
184
- # * :invisible - invisible text
185
- # * :fill_clip - fill text then add to path for clipping
186
- # * :stroke_clip - stroke text then add to path for clipping
187
- # * :fill_stroke_clip - fill then stroke text, then add to path for
188
- # clipping
189
- # * :clip - add text to path for clipping
190
- def text_rendering_mode(mode = nil)
216
+ # @param mode [Symbol]
217
+ # @yield Temporariliy set text rendering mode
218
+ # @return [Symbol] if called withouth mode
219
+ # @return [void] otherwise
220
+ def text_rendering_mode(mode = nil, &block)
191
221
  if mode.nil?
192
- return defined?(@text_rendering_mode) && @text_rendering_mode || :fill
222
+ return (defined?(@text_rendering_mode) && @text_rendering_mode) || :fill
193
223
  end
194
224
 
195
225
  unless MODES.key?(mode)
196
226
  raise ArgumentError,
197
227
  "mode must be between one of #{MODES.keys.join(', ')} (#{mode})"
198
228
  end
199
- original_mode = text_rendering_mode
200
229
 
201
- if original_mode == mode
230
+ if text_rendering_mode == mode
202
231
  yield
203
232
  else
204
- @text_rendering_mode = mode
205
- add_content "\n#{MODES[mode]} Tr"
206
- yield
207
- add_content "\n#{MODES[original_mode]} Tr"
208
- @text_rendering_mode = original_mode
233
+ wrap_and_restore_text_rendering_mode(mode, &block)
209
234
  end
210
235
  end
211
236
 
237
+ # Forget previously set text rendering mode.
238
+ #
239
+ # @return [void]
212
240
  def forget_text_rendering_mode!
213
241
  @text_rendering_mode = :unknown
214
242
  end
215
243
 
216
244
  # Increases or decreases the space between characters.
217
245
  # For horizontal text, a positive value will increase the space.
218
- # For veritical text, a positive value will decrease the space.
246
+ # For vertical text, a positive value will decrease the space.
247
+ #
248
+ # Call with no arguments to retrieve current character spacing.
219
249
  #
220
- def character_spacing(amount = nil)
250
+ # @param amount [Numeric]
251
+ # @yield Temporarily set character spacing
252
+ # @return [Numeric] if called without amount
253
+ # @return [void] otherwise
254
+ def character_spacing(amount = nil, &block)
221
255
  if amount.nil?
222
- return defined?(@character_spacing) && @character_spacing || 0
256
+ return (defined?(@character_spacing) && @character_spacing) || 0
223
257
  end
224
258
 
225
- original_character_spacing = character_spacing
226
- if original_character_spacing == amount
259
+ if character_spacing == amount
227
260
  yield
228
261
  else
229
- @character_spacing = amount
230
- add_content "\n#{PDF::Core.real(amount)} Tc"
231
- yield
232
- add_content "\n#{PDF::Core.real(original_character_spacing)} Tc"
233
- @character_spacing = original_character_spacing
262
+ wrap_and_restore_character_spacing(amount, &block)
234
263
  end
235
264
  end
236
265
 
237
266
  # Increases or decreases the space between words.
238
267
  # For horizontal text, a positive value will increase the space.
239
- # For veritical text, a positive value will decrease the space.
268
+ # For vertical text, a positive value will decrease the space.
240
269
  #
241
- def word_spacing(amount = nil)
242
- return defined?(@word_spacing) && @word_spacing || 0 if amount.nil?
243
-
244
- original_word_spacing = word_spacing
245
- if original_word_spacing == amount
270
+ # Call with no arguments to retrieve current word spacing.
271
+ #
272
+ # @param amount [Numeric]
273
+ # @yield Temporarily set word spacing
274
+ # @return [Numeric] if called without amount
275
+ # @return [void] otherwise
276
+ def word_spacing(amount = nil, &block)
277
+ return (defined?(@word_spacing) && @word_spacing) || 0 if amount.nil?
278
+
279
+ if word_spacing == amount
246
280
  yield
247
281
  else
248
- @word_spacing = amount
249
- add_content "\n#{PDF::Core.real(amount)} Tw"
250
- yield
251
- add_content "\n#{PDF::Core.real(original_word_spacing)} Tw"
252
-
253
- @word_spacing = original_word_spacing
282
+ wrap_and_restore_word_spacing(amount, &block)
254
283
  end
255
284
  end
256
285
 
257
- # Set the horizontal scaling. amount is a number specifying the
258
- # percentage of the normal width.
259
- def horizontal_text_scaling(amount = nil)
286
+ # Set the horizontal scaling.
287
+ #
288
+ # @param amount [Numeric] the percentage of the normal width.
289
+ # @yield Temporarili set text scaling
290
+ # @return [Numeric] if called with no arguments
291
+ # @return [void] otherwise
292
+ def horizontal_text_scaling(amount = nil, &block)
260
293
  if amount.nil?
261
- return defined?(@horizontal_text_scaling) && @horizontal_text_scaling || 100
294
+ return (defined?(@horizontal_text_scaling) && @horizontal_text_scaling) || 100
262
295
  end
263
296
 
264
- original_horizontal_text_scaling = horizontal_text_scaling
265
- if original_horizontal_text_scaling == amount
297
+ if horizontal_text_scaling == amount
266
298
  yield
267
299
  else
268
- @horizontal_text_scaling = amount
269
- add_content "\n#{PDF::Core.real(amount)} Tz"
300
+ wrap_and_restore_horizontal_text_scaling(amount, &block)
301
+ end
302
+ end
303
+
304
+ # Move the baseline up or down from its default location.
305
+ # Positive values move the baseline up, negative values move it down, and
306
+ # a zero value resets the baseline to its default location.
307
+ #
308
+ # @param amount [Numeric]
309
+ # @yield Temporarily set text rise
310
+ # @return [Numeric] if called with no arguments
311
+ # @return [void] otherwise
312
+ def rise(amount = nil, &block)
313
+ if amount.nil?
314
+ return (defined?(@rise) && @rise) || 0
315
+ end
316
+
317
+ if rise == amount
270
318
  yield
271
- add_content "\n#{PDF::Core.real(original_horizontal_text_scaling)} Tz"
272
- @horizontal_text_scaling = original_horizontal_text_scaling
319
+ else
320
+ wrap_and_restore_rise(amount, &block)
273
321
  end
274
322
  end
275
323
 
324
+ # Add a text object to content stream.
325
+ #
326
+ # @param text [String]
327
+ # @param x [Numeric] horizontal position of the text origin on the page
328
+ # @param y [Numeric] vertical position of the text origin on the page
329
+ # @param options [Hash]
330
+ # @option options :rotate [Numeric] text rotation angle in degrees
331
+ # @option options :kerning [Boolean]
276
332
  def add_text_content(text, x, y, options)
277
333
  chunks = font.encode_text(text, options)
278
334
 
279
- add_content "\nBT"
335
+ add_content("\nBT")
280
336
 
281
337
  if options[:rotate]
282
- rad = options[:rotate].to_f * Math::PI / 180
338
+ rad = Float(options[:rotate]) * Math::PI / 180
283
339
  array = [
284
340
  Math.cos(rad),
285
341
  Math.sin(rad),
286
342
  -Math.sin(rad),
287
343
  Math.cos(rad),
288
- x, y
344
+ x, y,
289
345
  ]
290
- add_content "#{PDF::Core.real_params(array)} Tm"
346
+ add_content("#{PDF::Core.real_params(array)} Tm")
291
347
  else
292
- add_content "#{PDF::Core.real_params([x, y])} Td"
348
+ add_content("#{PDF::Core.real(x)} #{PDF::Core.real(y)} Td")
293
349
  end
294
350
 
295
351
  chunks.each do |(subset, string)|
296
352
  font.add_to_current_page(subset)
297
- add_content [
298
- PDF::Core.pdf_object(font.identifier_for(subset), true),
299
- PDF::Core.pdf_object(font_size, true),
300
- 'Tf'
301
- ].join(' ')
353
+ add_content(
354
+ [
355
+ PDF::Core.pdf_object(font.identifier_for(subset), true),
356
+ PDF::Core.pdf_object(font_size, true),
357
+ 'Tf',
358
+ ].join(' '),
359
+ )
302
360
 
303
361
  operation = options[:kerning] && string.is_a?(Array) ? 'TJ' : 'Tj'
304
- add_content "#{PDF::Core.pdf_object(string, true)} #{operation}"
362
+ add_content("#{PDF::Core.pdf_object(string, true)} #{operation}")
363
+ end
364
+
365
+ add_content("ET\n")
366
+ end
367
+
368
+ private
369
+
370
+ def wrap_and_restore_text_rendering_mode(block_value)
371
+ original_value = text_rendering_mode
372
+ @text_rendering_mode = block_value
373
+ update_text_rendering_mode_state
374
+ begin
375
+ yield
376
+ ensure
377
+ @text_rendering_mode = original_value
378
+ update_text_rendering_mode_state
305
379
  end
380
+ end
381
+
382
+ def update_text_rendering_mode_state
383
+ add_content("\n#{MODES[text_rendering_mode]} Tr")
384
+ end
385
+
386
+ def wrap_and_restore_character_spacing(block_value)
387
+ original_value = character_spacing
388
+ @character_spacing = block_value
389
+ update_character_spacing_state
390
+ begin
391
+ yield
392
+ ensure
393
+ @character_spacing = original_value
394
+ update_character_spacing_state
395
+ end
396
+ end
397
+
398
+ def update_character_spacing_state
399
+ add_content("\n#{PDF::Core.real(character_spacing)} Tc")
400
+ end
401
+
402
+ def wrap_and_restore_word_spacing(block_value)
403
+ original_value = word_spacing
404
+ @word_spacing = block_value
405
+ update_word_spacing_state
406
+ begin
407
+ yield
408
+ ensure
409
+ @word_spacing = original_value
410
+ update_word_spacing_state
411
+ end
412
+ end
413
+
414
+ def update_word_spacing_state
415
+ add_content("\n#{PDF::Core.real(word_spacing)} Tw")
416
+ end
417
+
418
+ def wrap_and_restore_horizontal_text_scaling(block_value)
419
+ original_value = horizontal_text_scaling
420
+ @horizontal_text_scaling = block_value
421
+ update_horizontal_text_scaling_state
422
+ begin
423
+ yield
424
+ ensure
425
+ @horizontal_text_scaling = original_value
426
+ update_horizontal_text_scaling_state
427
+ end
428
+ end
429
+
430
+ def update_horizontal_text_scaling_state
431
+ add_content("\n#{PDF::Core.real(horizontal_text_scaling)} Tz")
432
+ end
433
+
434
+ def wrap_and_restore_rise(block_value)
435
+ original_value = rise
436
+ @rise = block_value
437
+ update_rise_state
438
+ begin
439
+ yield
440
+ ensure
441
+ @rise = original_value
442
+ update_rise_state
443
+ end
444
+ end
306
445
 
307
- add_content "ET\n"
446
+ def update_rise_state
447
+ add_content("\n#{PDF::Core.real(rise)} Ts")
308
448
  end
309
449
  end
310
450
  end
@@ -2,9 +2,17 @@
2
2
 
3
3
  module PDF
4
4
  module Core
5
+ # Utility methods
5
6
  module Utils
6
7
  module_function
7
8
 
9
+ # Deep clone an object.
10
+ # It uses marshal-demarshal trick. Since it's supposed to be use only on
11
+ # objects that can be serialized into PDF it shouldn't have any issues
12
+ # with objects that can not be marshaled.
13
+ #
14
+ # @param object [any]
15
+ # @return [any]
8
16
  def deep_clone(object)
9
17
  Marshal.load(Marshal.dump(object))
10
18
  end
data/lib/pdf/core.rb CHANGED
@@ -1,5 +1,31 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # Top level Module
4
+ module PDF
5
+ # PDF::Core is concerned with low-level PDF functions such as serialization,
6
+ # content streams and such.
7
+ #
8
+ # It's extracted from Prawn but at the moment is not entirely independent.
9
+ module Core
10
+ # PDF::Core-specific errors
11
+ module Errors
12
+ # This error indicates failure of {PDF::Core.pdf_object}
13
+ class FailedObjectConversion < StandardError
14
+ end
15
+
16
+ # This error occurs when a graphic state is being restored but the graphic
17
+ # state stack is empty.
18
+ class EmptyGraphicStateStack < StandardError
19
+ end
20
+
21
+ # This error is raised when page layout is set to anything other than
22
+ # `:portrait` or `:landscape`
23
+ class InvalidPageLayout < StandardError
24
+ end
25
+ end
26
+ end
27
+ end
28
+
3
29
  require_relative 'core/pdf_object'
4
30
  require_relative 'core/annotations'
5
31
  require_relative 'core/byte_string'
@@ -19,19 +45,3 @@ require_relative 'core/outline_root'
19
45
  require_relative 'core/outline_item'
20
46
  require_relative 'core/renderer'
21
47
  require_relative 'core/text'
22
-
23
- module PDF
24
- module Core
25
- module Errors
26
- # This error is raised when pdf_object() fails
27
- FailedObjectConversion = Class.new(StandardError)
28
-
29
- # This error is raise when trying to restore a graphic state that
30
- EmptyGraphicStateStack = Class.new(StandardError)
31
-
32
- # This error is raised when Document#page_layout is set to anything
33
- # other than :portrait or :landscape
34
- InvalidPageLayout = Class.new(StandardError)
35
- end
36
- end
37
- end
data/pdf-core.gemspec CHANGED
@@ -2,43 +2,47 @@
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = 'pdf-core'
5
- spec.version = '0.9.0'
5
+ spec.version = '0.10.0'
6
6
  spec.platform = Gem::Platform::RUBY
7
- spec.summary = 'PDF::Core is used by Prawn to render PDF documents'
7
+ spec.summary = 'Low level PDF generator.'
8
+ spec.description = 'PDF::Core is used by Prawn to render PDF documents. It provides low-level format support.'
8
9
  spec.files =
9
10
  Dir.glob('lib/**/**/*') +
10
11
  %w[COPYING GPLv2 GPLv3 LICENSE] +
11
- %w[Gemfile Rakefile] +
12
12
  ['pdf-core.gemspec']
13
13
  spec.require_path = 'lib'
14
- spec.required_ruby_version = '>= 2.5'
14
+ spec.required_ruby_version = '>= 2.7'
15
15
  spec.required_rubygems_version = '>= 1.3.6'
16
16
 
17
- spec.cert_chain = ['certs/pointlessone.pem']
18
- if $PROGRAM_NAME.end_with? 'gem'
19
- spec.signing_key = File.expand_path('~/.gem/gem-private_key.pem')
17
+ if File.basename($PROGRAM_NAME) == 'gem' && ARGV.include?('build')
18
+ signing_key = File.expand_path('~/.gem/gem-private_key.pem')
19
+ if File.exist?(signing_key)
20
+ spec.cert_chain = ['certs/pointlessone.pem']
21
+ spec.signing_key = signing_key
22
+ else
23
+ warn 'WARNING: Signing key is missing. The gem is not signed and its authenticity can not be verified.'
24
+ end
20
25
  end
21
26
 
22
- # spec.extra_rdoc_files = %w{README.md LICENSE COPYING GPLv2 GPLv3}
23
- # spec.rdoc_options << '--title' << 'Prawn Documentation' <<
24
- # '--main' << 'README.md' << '-q'
25
27
  spec.authors = [
26
- 'Gregory Brown', 'Brad Ediger', 'Daniel Nelson', 'Jonathan Greenberg',
27
- 'James Healy'
28
+ 'Alexander Mankuta', 'Gregory Brown', 'Brad Ediger', 'Daniel Nelson',
29
+ 'Jonathan Greenberg', 'James Healy',
28
30
  ]
29
31
  spec.email = [
30
- 'gregory.t.brown@gmail.com', 'brad@bradediger.com', 'dnelson@bluejade.com',
31
- 'greenberg@entryway.net', 'jimmy@deefa.com'
32
+ 'alex@pointless.one', 'gregory.t.brown@gmail.com', 'brad@bradediger.com',
33
+ 'dnelson@bluejade.com', 'greenberg@entryway.net', 'jimmy@deefa.com',
32
34
  ]
33
- spec.licenses = %w[PRAWN GPL-2.0 GPL-3.0]
35
+ spec.licenses = %w[Nonstandard GPL-2.0-only GPL-3.0-only]
36
+ spec.homepage = 'http://prawnpdf.org/'
37
+ spec.metadata = {
38
+ 'rubygems_mfa_required' => 'true',
39
+ 'homepage_uri' => spec.homepage,
40
+ 'changelog_uri' => "https://github.com/prawnpdf/pdf-core/blob/#{spec.version}/CHANGELOG.md",
41
+ 'source_code_uri' => 'https://github.com/prawnpdf/pdf-core',
42
+ 'documentation_uri' => "https://prawnpdf.org/docs/pdf-core/#{spec.version}/",
43
+ 'bug_tracker_uri' => 'https://github.com/prawnpdf/pdf-core/issues',
44
+ }
34
45
  spec.add_development_dependency('pdf-inspector', '~> 1.1.0')
35
46
  spec.add_development_dependency('pdf-reader', '~>1.2')
36
- spec.add_development_dependency('rake')
37
- spec.add_development_dependency('rspec')
38
- spec.add_development_dependency('rubocop', '~> 0.93')
39
- spec.add_development_dependency('rubocop-performance', '~> 1.8')
40
- spec.add_development_dependency('rubocop-rspec', '~> 1.44')
41
- spec.add_development_dependency('simplecov')
42
- spec.homepage = 'http://prawnpdf.org'
43
- spec.description = 'PDF::Core is used by Prawn to render PDF documents'
47
+ spec.add_development_dependency('prawn-dev', '~> 0.4.0')
44
48
  end
data.tar.gz.sig CHANGED
Binary file