pdf-core 0.8.1 → 0.10.0

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/lib/pdf/core/text.rb CHANGED
@@ -8,28 +8,46 @@
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,
18
21
  fill_stroke: 2,
19
22
  invisible: 3,
20
- fill_clip: 4, stroke_clip: 5,
23
+ fill_clip: 4,
24
+ stroke_clip: 5,
21
25
  fill_stroke_clip: 6,
22
- clip: 7
26
+ clip: 7,
23
27
  }.freeze
24
28
 
29
+ # Sygnals that a font doesn't have a name.
30
+ class BadFontFamily < StandardError
31
+ def initialize(message = 'Bad font family')
32
+ super
33
+ end
34
+ end
35
+
36
+ # @deprecated
25
37
  attr_reader :skip_encoding
26
38
 
27
39
  # Low level call to set the current font style and extract text options
28
40
  # from an options hash. Should be called from within a save_font block
29
41
  #
42
+ # @param options [Hash]
43
+ # @option options :style [Symbol, String]
44
+ # @option options :kerning [Boolean]
45
+ # @option options :size [Numeric]
46
+ # @return [void]
30
47
  def process_text_options(options)
31
48
  if options[:style]
32
- raise 'Bad font family' unless font.family
49
+ raise BadFontFamily unless font.family
50
+
33
51
  font(font.family, style: options[:style])
34
52
  end
35
53
 
@@ -43,10 +61,12 @@ module PDF
43
61
 
44
62
  # Retrieve the current default kerning setting.
45
63
  #
46
- # Defaults to true
64
+ # Defaults to `true`.
47
65
  #
66
+ # @return [Boolean]
48
67
  def default_kerning?
49
68
  return true unless defined?(@default_kerning)
69
+
50
70
  @default_kerning
51
71
  end
52
72
 
@@ -54,12 +74,15 @@ module PDF
54
74
  # be overridden using the :kerning text option when drawing text or a text
55
75
  # box.
56
76
  #
77
+ # @example
57
78
  # pdf.default_kerning = false
58
- # pdf.text('hello world') # text is not kerned
59
- # 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
60
81
  #
61
- def default_kerning(boolean)
62
- @default_kerning = boolean
82
+ # @param value [Boolean]
83
+ # @return [void]
84
+ def default_kerning(value)
85
+ @default_kerning = value
63
86
  end
64
87
 
65
88
  alias default_kerning= default_kerning
@@ -70,15 +93,18 @@ module PDF
70
93
  # overridden using the :leading text option when drawing text or a text
71
94
  # box.
72
95
  #
96
+ # @example
73
97
  # pdf.default_leading = 7
74
- # pdf.text('hello world') # a leading of 7 is used
75
- # 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
76
100
  #
77
- # Defaults to 0
101
+ # Defaults to 0.
78
102
  #
103
+ # @param number [Numeric]
104
+ # @return [Numeric]
79
105
  def default_leading(number = nil)
80
106
  if number.nil?
81
- defined?(@default_leading) && @default_leading || 0
107
+ (defined?(@default_leading) && @default_leading) || 0
82
108
  else
83
109
  @default_leading = number
84
110
  end
@@ -92,23 +118,27 @@ module PDF
92
118
  # overridden using the :direction text option when drawing text or a text
93
119
  # box.
94
120
  #
121
+ # @example
95
122
  # pdf.text_direction = :rtl
96
- # pdf.text('hello world') # prints 'dlrow olleh'
97
- # 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'
98
125
  #
99
126
  # Valid directions are:
100
127
  #
101
- # * :ltr - left-to-right (default)
102
- # * :rtl - right-to-left
128
+ # * `:ltr` -- left-to-right (default)
129
+ # * `:rtl` -- right-to-left
103
130
  #
104
131
  # Side effects:
105
132
  #
106
- # * When printing left-to-right, the default text alignment is :left
107
- # * 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`
108
135
  #
136
+ # @param direction [:ltr, :rtl]
137
+ # @return [:ltr]
138
+ # @return [:rtl]
109
139
  def text_direction(direction = nil)
110
140
  if direction.nil?
111
- defined?(@text_direction) && @text_direction || :ltr
141
+ (defined?(@text_direction) && @text_direction) || :ltr
112
142
  else
113
143
  @text_direction = direction
114
144
  end
@@ -124,33 +154,36 @@ module PDF
124
154
  # rendered using the first font that includes the glyph, starting with the
125
155
  # current font and then moving through :fallback_fonts from left to right.
126
156
  #
127
- # Call with an empty array to turn off fallback fonts
128
- #
129
- # file = "#{Prawn::DATADIR}/fonts/gkai00mp.ttf"
130
- # font_families['Kai'] = {
131
- # :normal => { :file => file, :font => 'Kai' }
132
- # }
133
- # file = "#{Prawn::DATADIR}/fonts/Action Man.dfont"
134
- # font_families['Action Man'] = {
135
- # :normal => { :file => file, :font => 'ActionMan' },
136
- # }
137
- # fallback_fonts ['Times-Roman', 'Kai']
138
- # font 'Action Man'
139
- # text 'hello ƒ 你好'
140
- # > hello prints in Action Man
141
- # > ƒ prints in Times-Roman
142
- # > 你好 prints in Kai
143
- #
144
- # 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
145
176
  #
146
177
  # Side effects:
147
178
  #
148
179
  # * Increased overhead when fallback fonts are declared as each glyph is
149
180
  # checked to see whether it exists in the current font
150
181
  #
182
+ # @param fallback_fonts [Array<String>]
183
+ # @return [Array<String>]
151
184
  def fallback_fonts(fallback_fonts = nil)
152
185
  if fallback_fonts.nil?
153
- defined?(@fallback_fonts) && @fallback_fonts || []
186
+ (defined?(@fallback_fonts) && @fallback_fonts) || []
154
187
  else
155
188
  @fallback_fonts = fallback_fonts
156
189
  end
@@ -163,140 +196,256 @@ module PDF
163
196
  # Call with a symbol and block to temporarily change the current
164
197
  # text rendering mode.
165
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
166
212
  # pdf.text_rendering_mode(:stroke) do
167
213
  # pdf.text('Outlined Text')
168
214
  # end
169
215
  #
170
- # Valid modes are:
171
- #
172
- # * :fill - fill text (default)
173
- # * :stroke - stroke text
174
- # * :fill_stroke - fill, then stroke text
175
- # * :invisible - invisible text
176
- # * :fill_clip - fill text then add to path for clipping
177
- # * :stroke_clip - stroke text then add to path for clipping
178
- # * :fill_stroke_clip - fill then stroke text, then add to path for
179
- # clipping
180
- # * :clip - add text to path for clipping
181
- 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)
182
221
  if mode.nil?
183
- return defined?(@text_rendering_mode) && @text_rendering_mode || :fill
222
+ return (defined?(@text_rendering_mode) && @text_rendering_mode) || :fill
184
223
  end
224
+
185
225
  unless MODES.key?(mode)
186
226
  raise ArgumentError,
187
227
  "mode must be between one of #{MODES.keys.join(', ')} (#{mode})"
188
228
  end
189
- original_mode = text_rendering_mode
190
229
 
191
- if original_mode == mode
230
+ if text_rendering_mode == mode
192
231
  yield
193
232
  else
194
- @text_rendering_mode = mode
195
- add_content "\n#{MODES[mode]} Tr"
196
- yield
197
- add_content "\n#{MODES[original_mode]} Tr"
198
- @text_rendering_mode = original_mode
233
+ wrap_and_restore_text_rendering_mode(mode, &block)
199
234
  end
200
235
  end
201
236
 
237
+ # Forget previously set text rendering mode.
238
+ #
239
+ # @return [void]
202
240
  def forget_text_rendering_mode!
203
241
  @text_rendering_mode = :unknown
204
242
  end
205
243
 
206
244
  # Increases or decreases the space between characters.
207
245
  # For horizontal text, a positive value will increase the space.
208
- # For veritical text, a positive value will decrease the space.
246
+ # For vertical text, a positive value will decrease the space.
209
247
  #
210
- def character_spacing(amount = nil)
248
+ # Call with no arguments to retrieve current character spacing.
249
+ #
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)
211
255
  if amount.nil?
212
- return defined?(@character_spacing) && @character_spacing || 0
256
+ return (defined?(@character_spacing) && @character_spacing) || 0
213
257
  end
214
- original_character_spacing = character_spacing
215
- if original_character_spacing == amount
258
+
259
+ if character_spacing == amount
216
260
  yield
217
261
  else
218
- @character_spacing = amount
219
- add_content "\n#{PDF::Core.real(amount)} Tc"
220
- yield
221
- add_content "\n#{PDF::Core.real(original_character_spacing)} Tc"
222
- @character_spacing = original_character_spacing
262
+ wrap_and_restore_character_spacing(amount, &block)
223
263
  end
224
264
  end
225
265
 
226
266
  # Increases or decreases the space between words.
227
267
  # For horizontal text, a positive value will increase the space.
228
- # For veritical text, a positive value will decrease the space.
268
+ # For vertical text, a positive value will decrease the space.
269
+ #
270
+ # Call with no arguments to retrieve current word spacing.
229
271
  #
230
- def word_spacing(amount = nil)
231
- return defined?(@word_spacing) && @word_spacing || 0 if amount.nil?
232
- original_word_spacing = word_spacing
233
- if original_word_spacing == amount
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
234
280
  yield
235
281
  else
236
- @word_spacing = amount
237
- add_content "\n#{PDF::Core.real(amount)} Tw"
238
- yield
239
- add_content "\n#{PDF::Core.real(original_word_spacing)} Tw"
240
-
241
- @word_spacing = original_word_spacing
282
+ wrap_and_restore_word_spacing(amount, &block)
242
283
  end
243
284
  end
244
285
 
245
- # Set the horizontal scaling. amount is a number specifying the
246
- # percentage of the normal width.
247
- 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)
248
293
  if amount.nil?
249
- return defined?(@horizontal_text_scaling) &&
250
- @horizontal_text_scaling || 100
294
+ return (defined?(@horizontal_text_scaling) && @horizontal_text_scaling) || 100
251
295
  end
252
296
 
253
- original_horizontal_text_scaling = horizontal_text_scaling
254
- if original_horizontal_text_scaling == amount
297
+ if horizontal_text_scaling == amount
255
298
  yield
256
299
  else
257
- @horizontal_text_scaling = amount
258
- 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
259
318
  yield
260
- add_content "\n#{PDF::Core.real(original_horizontal_text_scaling)} Tz"
261
- @horizontal_text_scaling = original_horizontal_text_scaling
319
+ else
320
+ wrap_and_restore_rise(amount, &block)
262
321
  end
263
322
  end
264
323
 
265
- # rubocop: disable Naming/UncommunicativeMethodParamName
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]
266
332
  def add_text_content(text, x, y, options)
267
333
  chunks = font.encode_text(text, options)
268
334
 
269
- add_content "\nBT"
335
+ add_content("\nBT")
270
336
 
271
337
  if options[:rotate]
272
- rad = options[:rotate].to_f * Math::PI / 180
338
+ rad = Float(options[:rotate]) * Math::PI / 180
273
339
  array = [
274
340
  Math.cos(rad),
275
341
  Math.sin(rad),
276
342
  -Math.sin(rad),
277
343
  Math.cos(rad),
278
- x, y
344
+ x, y,
279
345
  ]
280
- add_content "#{PDF::Core.real_params(array)} Tm"
346
+ add_content("#{PDF::Core.real_params(array)} Tm")
281
347
  else
282
- add_content "#{PDF::Core.real_params([x, y])} Td"
348
+ add_content("#{PDF::Core.real(x)} #{PDF::Core.real(y)} Td")
283
349
  end
284
350
 
285
351
  chunks.each do |(subset, string)|
286
352
  font.add_to_current_page(subset)
287
- add_content [
288
- PDF::Core.pdf_object(font.identifier_for(subset), true),
289
- PDF::Core.pdf_object(font_size, true),
290
- 'Tf'
291
- ].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
+ )
292
360
 
293
361
  operation = options[:kerning] && string.is_a?(Array) ? 'TJ' : 'Tj'
294
- 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
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
295
443
  end
444
+ end
296
445
 
297
- add_content "ET\n"
446
+ def update_rise_state
447
+ add_content("\n#{PDF::Core.real(rise)} Ts")
298
448
  end
299
- # rubocop: enable Naming/UncommunicativeMethodParamName
300
449
  end
301
450
  end
302
451
  end
@@ -2,11 +2,20 @@
2
2
 
3
3
  module PDF
4
4
  module Core
5
+ # Utility methods
5
6
  module Utils
7
+ module_function
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]
6
16
  def deep_clone(object)
7
17
  Marshal.load(Marshal.dump(object))
8
18
  end
9
- module_function :deep_clone
10
19
  end
11
20
  end
12
21
  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.8.1'
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'
8
- spec.files = Dir.glob('lib/**/**/*') +
9
- %w[COPYING GPLv2 GPLv3 LICENSE] +
10
- %w[Gemfile Rakefile] +
11
- ['pdf-core.gemspec']
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.'
9
+ spec.files =
10
+ Dir.glob('lib/**/**/*') +
11
+ %w[COPYING GPLv2 GPLv3 LICENSE] +
12
+ ['pdf-core.gemspec']
12
13
  spec.require_path = 'lib'
13
- spec.required_ruby_version = '>= 2.3'
14
+ spec.required_ruby_version = '>= 2.7'
14
15
  spec.required_rubygems_version = '>= 1.3.6'
15
16
 
16
- spec.cert_chain = ['certs/pointlessone.pem']
17
- if $PROGRAM_NAME.end_with? 'gem'
18
- 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
19
25
  end
20
26
 
21
- # spec.extra_rdoc_files = %w{README.md LICENSE COPYING GPLv2 GPLv3}
22
- # spec.rdoc_options << '--title' << 'Prawn Documentation' <<
23
- # '--main' << 'README.md' << '-q'
24
27
  spec.authors = [
25
- 'Gregory Brown', 'Brad Ediger', 'Daniel Nelson', 'Jonathan Greenberg',
26
- 'James Healy'
28
+ 'Alexander Mankuta', 'Gregory Brown', 'Brad Ediger', 'Daniel Nelson',
29
+ 'Jonathan Greenberg', 'James Healy',
27
30
  ]
28
31
  spec.email = [
29
- 'gregory.t.brown@gmail.com', 'brad@bradediger.com', 'dnelson@bluejade.com',
30
- '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',
31
34
  ]
32
- spec.rubyforge_project = 'prawn'
33
- spec.licenses = %w[PRAWN GPL-2.0 GPL-3.0]
34
- spec.add_development_dependency('bundler')
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
+ }
35
45
  spec.add_development_dependency('pdf-inspector', '~> 1.1.0')
36
46
  spec.add_development_dependency('pdf-reader', '~>1.2')
37
- spec.add_development_dependency('rake')
38
- spec.add_development_dependency('rspec')
39
- spec.add_development_dependency('rubocop', '~> 0.55')
40
- spec.add_development_dependency('rubocop-rspec', '~> 1.25')
41
- spec.add_development_dependency('simplecov')
42
- spec.homepage = 'http://prawn.majesticseacreature.com'
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