wicked_pdf 1.1.0 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,6 @@
1
- require 'open-uri'
1
+ require 'net/http'
2
+ # If webpacker is used, need to check for version
3
+ require 'webpacker/version' if defined?(Webpacker)
2
4
 
3
5
  class WickedPdf
4
6
  module WickedPdfHelper
@@ -27,6 +29,32 @@ class WickedPdf
27
29
  end.html_safe
28
30
  end
29
31
 
32
+ def wicked_pdf_stylesheet_pack_tag(*sources)
33
+ return unless defined?(Webpacker)
34
+ if running_in_development?
35
+ stylesheet_pack_tag(*sources)
36
+ else
37
+ css_text = sources.collect do |source|
38
+ source = WickedPdfHelper.add_extension(source, 'css')
39
+ wicked_pdf_stylesheet_link_tag(webpacker_source_url(source))
40
+ end.join("\n")
41
+ css_text.respond_to?(:html_safe) ? css_text.html_safe : css_text
42
+ end
43
+ end
44
+
45
+ def wicked_pdf_javascript_pack_tag(*sources)
46
+ return unless defined?(Webpacker)
47
+
48
+ if running_in_development?
49
+ javascript_pack_tag(*sources)
50
+ else
51
+ sources.collect do |source|
52
+ source = WickedPdfHelper.add_extension(source, 'js')
53
+ "<script type='text/javascript'>#{read_asset(webpacker_source_url(source))}</script>"
54
+ end.join("\n").html_safe
55
+ end
56
+ end
57
+
30
58
  def wicked_pdf_image_tag(img, options = {})
31
59
  image_tag wicked_pdf_asset_path(img), options
32
60
  end
@@ -68,15 +96,20 @@ class WickedPdf
68
96
  end
69
97
  else
70
98
  asset = find_asset(source)
71
- asset ? asset.pathname : File.join(Rails.public_path, source)
99
+ if asset
100
+ # older versions need pathname, Sprockets 4 supports only filename
101
+ asset.respond_to?(:filename) ? asset.filename : asset.pathname
102
+ else
103
+ File.join(Rails.public_path, source)
104
+ end
72
105
  end
73
106
  end
74
107
 
75
108
  def find_asset(path)
76
109
  if Rails.application.assets.respond_to?(:find_asset)
77
- Rails.application.assets.find_asset(path)
110
+ Rails.application.assets.find_asset(path, :base_path => Rails.application.root.to_s)
78
111
  else
79
- Sprockets::Railtie.build_environment(Rails.application).find_asset(path)
112
+ Sprockets::Railtie.build_environment(Rails.application).find_asset(path, :base_path => Rails.application.root.to_s)
80
113
  end
81
114
  end
82
115
 
@@ -93,7 +126,8 @@ class WickedPdf
93
126
  end
94
127
 
95
128
  def precompiled_or_absolute_asset?(source)
96
- Rails.configuration.assets.compile == false ||
129
+ !Rails.configuration.respond_to?(:assets) ||
130
+ Rails.configuration.assets.compile == false ||
97
131
  source.to_s[0] == '/' ||
98
132
  source.to_s.match(/\Ahttps?\:\/\//)
99
133
  end
@@ -112,8 +146,7 @@ class WickedPdf
112
146
  end
113
147
 
114
148
  def read_from_uri(uri)
115
- encoding = ':UTF-8' if RUBY_VERSION > '1.8'
116
- asset = open(uri, "r#{encoding}", &:read)
149
+ asset = Net::HTTP.get(URI(uri))
117
150
  asset = gzip(asset) if WickedPdf.config[:expect_gzipped_remote_assets]
118
151
  asset
119
152
  end
@@ -125,6 +158,28 @@ class WickedPdf
125
158
  rescue Zlib::GzipFile::Error
126
159
  nil
127
160
  end
161
+
162
+ def webpacker_source_url(source)
163
+ return unless defined?(Webpacker) && defined?(Webpacker::VERSION)
164
+ # In Webpacker 3.2.0 asset_pack_url is introduced
165
+ if Webpacker::VERSION >= '3.2.0'
166
+ asset_pack_url(source)
167
+ else
168
+ source_path = asset_pack_path(source)
169
+ # Remove last slash from root path
170
+ root_url[0...-1] + source_path
171
+ end
172
+ end
173
+
174
+ def running_in_development?
175
+ return unless defined?(Webpacker)
176
+ # :dev_server method was added in webpacker 3.0.0
177
+ if Webpacker.respond_to?(:dev_server)
178
+ Webpacker.dev_server.running?
179
+ else
180
+ Rails.env.development? || Rails.env.test?
181
+ end
182
+ end
128
183
  end
129
184
  end
130
185
  end
@@ -23,8 +23,9 @@ class WickedPdf
23
23
 
24
24
  def wicked_pdf_javascript_src_tag(jsfile, options = {})
25
25
  jsfile = WickedPdfHelper.add_extension(jsfile, 'js')
26
+ type = ::Mime.respond_to?(:[]) ? ::Mime[:js] : ::Mime::JS # ::Mime[:js] cannot be used in Rails 2.3.
26
27
  src = "file:///#{WickedPdfHelper.root_path.join('public', 'javascripts', jsfile)}"
27
- content_tag('script', '', { 'type' => Mime::JS, 'src' => path_to_javascript(src) }.merge(options))
28
+ content_tag('script', '', { 'type' => type, 'src' => path_to_javascript(src) }.merge(options))
28
29
  end
29
30
 
30
31
  def wicked_pdf_javascript_include_tag(*sources)
data/lib/wicked_pdf.rb CHANGED
@@ -1,32 +1,19 @@
1
1
  # wkhtml2pdf Ruby interface
2
- # http://code.google.com/p/wkhtmltopdf/
2
+ # http://wkhtmltopdf.org/
3
3
 
4
4
  require 'logger'
5
5
  require 'digest/md5'
6
6
  require 'rbconfig'
7
+ require 'open3'
7
8
 
8
- if (RbConfig::CONFIG['target_os'] =~ /mswin|mingw/) && (RUBY_VERSION < '1.9')
9
- require 'win32/open3'
10
- else
11
- require 'open3'
12
- end
13
-
14
- begin
15
- require 'active_support/core_ext/module/attribute_accessors'
16
- rescue LoadError
17
- require 'active_support/core_ext/class/attribute_accessors'
18
- end
19
-
20
- begin
21
- require 'active_support/core_ext/object/blank'
22
- rescue LoadError
23
- require 'active_support/core_ext/blank'
24
- end
9
+ require 'active_support/core_ext/module/attribute_accessors'
10
+ require 'active_support/core_ext/object/blank'
25
11
 
26
12
  require 'wicked_pdf/version'
27
13
  require 'wicked_pdf/railtie'
28
14
  require 'wicked_pdf/tempfile'
29
15
  require 'wicked_pdf/middleware'
16
+ require 'wicked_pdf/progress'
30
17
 
31
18
  class WickedPdf
32
19
  DEFAULT_BINARY_VERSION = Gem::Version.new('0.9.9')
@@ -36,6 +23,8 @@ class WickedPdf
36
23
  cattr_accessor :config
37
24
  attr_accessor :binary_version
38
25
 
26
+ include Progress
27
+
39
28
  def initialize(wkhtmltopdf_binary_path = nil)
40
29
  @exe_path = wkhtmltopdf_binary_path || find_wkhtmltopdf_binary_path
41
30
  raise "Location of #{EXE_NAME} unknown" if @exe_path.empty?
@@ -68,15 +57,18 @@ class WickedPdf
68
57
  options.merge!(WickedPdf.config) { |_key, option, _config| option }
69
58
  generated_pdf_file = WickedPdfTempfile.new('wicked_pdf_generated_file.pdf', options[:temp_path])
70
59
  command = [@exe_path]
71
- command << '-q' unless on_windows? # suppress errors on stdout
72
60
  command += parse_options(options)
73
61
  command << url
74
62
  command << generated_pdf_file.path.to_s
75
63
 
76
64
  print_command(command.inspect) if in_development_mode?
77
65
 
78
- err = Open3.popen3(*command) do |_stdin, _stdout, stderr|
79
- stderr.read
66
+ if track_progress?(options)
67
+ invoke_with_progress(command, options)
68
+ else
69
+ err = Open3.popen3(*command) do |_stdin, _stdout, stderr|
70
+ stderr.read
71
+ end
80
72
  end
81
73
  if options[:return_file]
82
74
  return_file = options.delete(:return_file)
@@ -85,9 +77,10 @@ class WickedPdf
85
77
  generated_pdf_file.rewind
86
78
  generated_pdf_file.binmode
87
79
  pdf = generated_pdf_file.read
80
+ raise "Error generating PDF\n Command Error: #{err}" if options[:raise_on_all_errors] && !err.empty?
88
81
  raise "PDF could not be generated!\n Command Error: #{err}" if pdf && pdf.rstrip.empty?
89
82
  pdf
90
- rescue => e
83
+ rescue StandardError => e
91
84
  raise "Failed to execute:\n#{command}\nError: #{e}"
92
85
  ensure
93
86
  generated_pdf_file.close! if generated_pdf_file && !return_file
@@ -96,7 +89,7 @@ class WickedPdf
96
89
  private
97
90
 
98
91
  def in_development_mode?
99
- return Rails.env == 'development' if defined?(Rails)
92
+ return Rails.env == 'development' if defined?(Rails.env)
100
93
  RAILS_ENV == 'development' if defined?(RAILS_ENV)
101
94
  end
102
95
 
@@ -105,19 +98,19 @@ class WickedPdf
105
98
  end
106
99
 
107
100
  def print_command(cmd)
108
- p '*' * 15 + cmd + '*' * 15
101
+ Rails.logger.debug '[wicked_pdf]: ' + cmd
109
102
  end
110
103
 
111
104
  def retrieve_binary_version
112
105
  _stdin, stdout, _stderr = Open3.popen3(@exe_path + ' -V')
113
106
  @binary_version = parse_version(stdout.gets(nil))
114
- rescue
107
+ rescue StandardError
115
108
  DEFAULT_BINARY_VERSION
116
109
  end
117
110
 
118
111
  def parse_version(version_info)
119
112
  match_data = /wkhtmltopdf\s*(\d*\.\d*\.\d*\w*)/.match(version_info)
120
- if match_data && (2 == match_data.length)
113
+ if match_data && (match_data.length == 2)
121
114
  Gem::Version.new(match_data[1])
122
115
  else
123
116
  DEFAULT_BINARY_VERSION
@@ -195,24 +188,26 @@ class WickedPdf
195
188
 
196
189
  def parse_header_footer(options)
197
190
  r = []
198
- [:header, :footer].collect do |hf|
199
- next if options[hf].blank?
200
- opt_hf = options[hf]
201
- r += make_options(opt_hf, [:center, :font_name, :left, :right], hf.to_s)
202
- r += make_options(opt_hf, [:font_size, :spacing], hf.to_s, :numeric)
203
- r += make_options(opt_hf, [:line], hf.to_s, :boolean)
204
- if options[hf] && options[hf][:content]
205
- @hf_tempfiles = [] unless defined?(@hf_tempfiles)
206
- @hf_tempfiles.push(tf = WickedPdfTempfile.new("wicked_#{hf}_pdf.html"))
207
- tf.write options[hf][:content]
208
- tf.flush
209
- options[hf][:html] = {}
210
- options[hf][:html][:url] = "file:///#{tf.path}"
211
- end
212
- unless opt_hf[:html].blank?
213
- r += make_option("#{hf}-html", opt_hf[:html][:url]) unless opt_hf[:html][:url].blank?
191
+ unless options.blank?
192
+ [:header, :footer].collect do |hf|
193
+ next if options[hf].blank?
194
+ opt_hf = options[hf]
195
+ r += make_options(opt_hf, [:center, :font_name, :left, :right], hf.to_s)
196
+ r += make_options(opt_hf, [:font_size, :spacing], hf.to_s, :numeric)
197
+ r += make_options(opt_hf, [:line], hf.to_s, :boolean)
198
+ if options[hf] && options[hf][:content]
199
+ @hf_tempfiles = [] unless defined?(@hf_tempfiles)
200
+ @hf_tempfiles.push(tf = WickedPdfTempfile.new("wicked_#{hf}_pdf.html"))
201
+ tf.write options[hf][:content]
202
+ tf.flush
203
+ options[hf][:html] = {}
204
+ options[hf][:html][:url] = "file:///#{tf.path}"
205
+ end
206
+ unless opt_hf[:html].blank?
207
+ r += make_option("#{hf}-html", opt_hf[:html][:url]) unless opt_hf[:html][:url].blank?
208
+ end
214
209
  end
215
- end unless options.blank?
210
+ end
216
211
  r
217
212
  end
218
213
 
@@ -284,10 +279,12 @@ class WickedPdf
284
279
  :dpi,
285
280
  :page_size,
286
281
  :page_width,
287
- :title])
282
+ :title,
283
+ :log_level])
288
284
  r += make_options(options, [:lowquality,
289
285
  :grayscale,
290
- :no_pdf_compression], '', :boolean)
286
+ :no_pdf_compression,
287
+ :quiet], '', :boolean)
291
288
  r += make_options(options, [:image_dpi,
292
289
  :image_quality,
293
290
  :page_height], '', :numeric)
@@ -322,18 +319,21 @@ class WickedPdf
322
319
  :disable_smart_shrinking,
323
320
  :use_xserver,
324
321
  :no_background,
322
+ :images,
323
+ :no_images,
325
324
  :no_stop_slow_scripts], '', :boolean)
326
325
  end
327
326
  r
328
327
  end
329
328
 
330
329
  def find_wkhtmltopdf_binary_path
331
- possible_locations = (ENV['PATH'].split(':') + %w(/usr/bin /usr/local/bin ~/bin)).uniq
330
+ possible_locations = (ENV['PATH'].split(':') + %w[/usr/bin /usr/local/bin]).uniq
331
+ possible_locations += %w[~/bin] if ENV.key?('HOME')
332
332
  exe_path ||= WickedPdf.config[:exe_path] unless WickedPdf.config.empty?
333
333
  exe_path ||= begin
334
- detected_path = (defined?(Bundler) ? `bundle exec which wkhtmltopdf` : `which wkhtmltopdf`).chomp
334
+ detected_path = (defined?(Bundler) ? Bundler.which('wkhtmltopdf') : `which wkhtmltopdf`).chomp
335
335
  detected_path.present? && detected_path
336
- rescue
336
+ rescue StandardError
337
337
  nil
338
338
  end
339
339
  exe_path ||= possible_locations.map { |l| File.expand_path("#{l}/#{EXE_NAME}") }.find { |location| File.exist?(location) }
@@ -0,0 +1,4 @@
1
+ test:
2
+ adapter: sqlite3
3
+ database: ":memory:"
4
+ timeout: 500
@@ -0,0 +1,3 @@
1
+ //= link_tree ../images
2
+ //= link wicked.js
3
+ //= link wicked.css
@@ -5,10 +5,32 @@ module ActionController
5
5
  def render_to_string(opts = {})
6
6
  opts.to_s
7
7
  end
8
+
9
+ def self.alias_method_chain(_target, _feature); end
10
+ end
11
+ end
12
+
13
+ module ActionControllerMock
14
+ class Base
15
+ def render(_)
16
+ [:base]
17
+ end
18
+
19
+ def render_to_string; end
20
+
21
+ def self.after_action(_); end
8
22
  end
9
23
  end
10
24
 
11
25
  class PdfHelperTest < ActionController::TestCase
26
+ module SomePatch
27
+ def render(_)
28
+ super.tap do |s|
29
+ s << :patched
30
+ end
31
+ end
32
+ end
33
+
12
34
  def setup
13
35
  @ac = ActionController::Base.new
14
36
  end
@@ -22,4 +44,53 @@ class PdfHelperTest < ActionController::TestCase
22
44
  :header => { :html => { :template => 'hf.html.erb' } })
23
45
  assert_match %r{^file:\/\/\/.*wicked_header_pdf.*\.html}, options[:header][:html][:url]
24
46
  end
47
+
48
+ test 'should not interfere with already prepended patches' do
49
+ # Emulate railtie
50
+ if Rails::VERSION::MAJOR >= 5
51
+ # this spec tests the following:
52
+ # if another gem prepends a render method to ActionController::Base
53
+ # before wicked_pdf does, does calling render trigger an infinite loop?
54
+ # this spec fails with 6392bea1fe3a41682dfd7c20fd9c179b5a758f59 because PdfHelper
55
+ # aliases the render method prepended by the other gem to render_without_pdf, then
56
+ # base_evals its own definition of render, which calls render_with_pdf -> render_without_pdf.
57
+ # If the other gem uses the prepend inhertinance pattern (calling super instead of aliasing),
58
+ # when it calls super it calls the base_eval'd version of render instead of going up the
59
+ # inheritance chain, causing an infinite loop.
60
+
61
+ # This fiddling with consts is required to get around the fact that PdfHelper checks
62
+ # that it is being prepended to ActionController::Base
63
+ OriginalBase = ActionController::Base
64
+ ActionController.send(:remove_const, :Base)
65
+ ActionController.const_set(:Base, ActionControllerMock::Base)
66
+
67
+ # Emulate another gem being loaded before wicked
68
+ ActionController::Base.prepend(SomePatch)
69
+ ActionController::Base.prepend(::WickedPdf::PdfHelper)
70
+
71
+ begin
72
+ # test that wicked's render method is actually called
73
+ ac = ActionController::Base.new
74
+ ac.expects(:render_with_wicked_pdf)
75
+ ac.render(:cats)
76
+
77
+ # test that calling render does not trigger infinite loop
78
+ ac = ActionController::Base.new
79
+ assert_equal [:base, :patched], ac.render(:cats)
80
+ rescue SystemStackError
81
+ assert_equal true, false # force spec failure
82
+ ensure
83
+ ActionController.send(:remove_const, :Base)
84
+ ActionController.const_set(:Base, OriginalBase)
85
+ end
86
+ end
87
+ end
88
+
89
+ test 'should call after_action instead of after_filter when able' do
90
+ ActionController::Base.expects(:after_filter).with(:clean_temp_files).never
91
+ ActionController::Base.expects(:after_action).with(:clean_temp_files).once
92
+ ActionController::Base.class_eval do
93
+ include ::WickedPdf::PdfHelper
94
+ end
95
+ end
25
96
  end
data/test/test_helper.rb CHANGED
@@ -5,13 +5,8 @@ require File.expand_path('../dummy/config/environment.rb', __FILE__)
5
5
 
6
6
  require 'test/unit'
7
7
  require 'mocha'
8
-
9
- if Rails::VERSION::MAJOR == 2
10
- require 'test_help'
11
- else
12
- require 'rails/test_help'
13
- require 'mocha/test_unit'
14
- end
8
+ require 'rails/test_help'
9
+ require 'mocha/test_unit'
15
10
 
16
11
  require 'wicked_pdf'
17
12
 
@@ -24,7 +19,15 @@ if (assets_dir = Rails.root.join('app/assets')) && File.directory?(assets_dir)
24
19
  File.open(destination, 'w') { |f| f.write(source) }
25
20
 
26
21
  # Copy JS file
27
- destination = assets_dir.join('javascripts/wicked.js')
22
+ js_dir = assets_dir.join('javascripts')
23
+ Dir.mkdir(js_dir) unless File.directory?(js_dir)
24
+ destination = js_dir.join('wicked.js')
28
25
  source = File.read('test/fixtures/wicked.js')
29
26
  File.open(destination, 'w') { |f| f.write(source) }
27
+
28
+ config_dir = assets_dir.join('config')
29
+ Dir.mkdir(config_dir) unless File.directory?(config_dir)
30
+ source = File.read('test/fixtures/manifest.js')
31
+ destination = config_dir.join('manifest.js')
32
+ File.open(destination, 'w') { |f| f.write(source) }
30
33
  end
@@ -1,5 +1,4 @@
1
1
  require 'test_helper'
2
-
3
2
  WickedPdf.config = { :exe_path => ENV['WKHTMLTOPDF_BIN'] || '/usr/local/bin/wkhtmltopdf' }
4
3
  HTML_DOCUMENT = '<html><body>Hello World</body></html>'.freeze
5
4
 
@@ -7,7 +6,10 @@ HTML_DOCUMENT = '<html><body>Hello World</body></html>'.freeze
7
6
  # Also, smash the returned array of options into a single string for
8
7
  # convenience in testing below.
9
8
  class WickedPdf
9
+ undef :binary_version
10
+ undef :binary_version=
10
11
  attr_accessor :binary_version
12
+
11
13
  def get_parsed_options(opts)
12
14
  parse_options(opts).join(' ')
13
15
  end
@@ -131,6 +133,11 @@ class WickedPdfTest < ActiveSupport::TestCase
131
133
  assert_equal '--outline-depth 5', @wp.get_parsed_options(:outline => { :outline_depth => 5 }).strip
132
134
  end
133
135
 
136
+ test 'should parse no_images option' do
137
+ assert_equal '--no-images', @wp.get_parsed_options(:no_images => true).strip
138
+ assert_equal '--images', @wp.get_parsed_options(:images => true).strip
139
+ end
140
+
134
141
  test 'should parse margins options' do
135
142
  [:top, :bottom, :left, :right].each do |o|
136
143
  assert_equal "--margin-#{o} 12", @wp.get_parsed_options(:margin => { o => '12' }).strip
@@ -200,7 +207,7 @@ class WickedPdfTest < ActiveSupport::TestCase
200
207
  test 'should not use double dash options for version without dashes' do
201
208
  @wp.binary_version = WickedPdf::BINARY_VERSION_WITHOUT_DASHES
202
209
 
203
- %w(toc cover).each do |name|
210
+ %w[toc cover].each do |name|
204
211
  assert_equal @wp.get_valid_option(name), name
205
212
  end
206
213
  end
@@ -208,7 +215,7 @@ class WickedPdfTest < ActiveSupport::TestCase
208
215
  test 'should use double dash options for version with dashes' do
209
216
  @wp.binary_version = Gem::Version.new('0.11.0')
210
217
 
211
- %w(toc cover).each do |name|
218
+ %w[toc cover].each do |name|
212
219
  assert_equal @wp.get_valid_option(name), "--#{name}"
213
220
  end
214
221
  end
@@ -218,4 +225,16 @@ class WickedPdfTest < ActiveSupport::TestCase
218
225
  cover_option = @wp.get_valid_option('cover')
219
226
  assert_equal @wp.get_parsed_options(options), "--disable-javascript --header-center 3 #{cover_option} http://example.org"
220
227
  end
228
+
229
+ test 'should output progress when creating pdfs on compatible hosts' do
230
+ wp = WickedPdf.new
231
+ output = []
232
+ options = { :progress => proc { |o| output << o } }
233
+ wp.pdf_from_string HTML_DOCUMENT, options
234
+ if RbConfig::CONFIG['target_os'] =~ /mswin|mingw/
235
+ assert_empty output
236
+ else
237
+ assert(output.collect { |l| !l.match(/Loading/).nil? }.include?(true)) # should output something like "Loading pages (1/5)"
238
+ end
239
+ end
221
240
  end
@@ -0,0 +1,50 @@
1
+
2
+
3
+ class WkhtmltopdfLocationTest < ActiveSupport::TestCase
4
+ setup do
5
+ @saved_config = WickedPdf.config
6
+ WickedPdf.config = {}
7
+ end
8
+
9
+ teardown do
10
+ WickedPdf.config = @saved_config
11
+ end
12
+
13
+ test 'should correctly locate wkhtmltopdf without bundler' do
14
+ bundler_module = Bundler
15
+ Object.send(:remove_const, :Bundler)
16
+
17
+ assert_nothing_raised do
18
+ WickedPdf.new
19
+ end
20
+
21
+ Object.const_set(:Bundler, bundler_module)
22
+ end
23
+
24
+ test 'should correctly locate wkhtmltopdf with bundler' do
25
+ assert_nothing_raised do
26
+ WickedPdf.new
27
+ end
28
+ end
29
+
30
+ class LocationNonWritableTest < ActiveSupport::TestCase
31
+ setup do
32
+ @saved_config = WickedPdf.config
33
+ WickedPdf.config = {}
34
+
35
+ @old_home = ENV['HOME']
36
+ ENV['HOME'] = '/not/a/writable/directory'
37
+ end
38
+
39
+ teardown do
40
+ WickedPdf.config = @saved_config
41
+ ENV['HOME'] = @old_home
42
+ end
43
+
44
+ test 'should correctly locate wkhtmltopdf with bundler while HOME is set to a non-writable directory' do
45
+ assert_nothing_raised do
46
+ WickedPdf.new
47
+ end
48
+ end
49
+ end
50
+ end
data/wicked_pdf.gemspec CHANGED
@@ -1,4 +1,4 @@
1
- # coding: utf-8
1
+
2
2
  lib = File.expand_path('../lib', __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'wicked_pdf/version'
@@ -7,28 +7,36 @@ require 'English'
7
7
  Gem::Specification.new do |spec|
8
8
  spec.name = 'wicked_pdf'
9
9
  spec.version = WickedPdf::VERSION
10
- spec.authors = ['Miles Z. Sterrett']
11
- spec.email = 'miles.sterrett@gmail.com'
10
+ spec.authors = ['Miles Z. Sterrett', 'David Jones']
11
+ spec.email = ['miles.sterrett@gmail.com', 'unixmonkey1@gmail.com']
12
12
  spec.summary = 'PDF generator (from HTML) gem for Ruby on Rails'
13
13
  spec.homepage = 'https://github.com/mileszs/wicked_pdf'
14
14
  spec.license = 'MIT'
15
15
  spec.date = Time.now.strftime('%Y-%m-%d')
16
- spec.description = <<desc
17
- Wicked PDF uses the shell utility wkhtmltopdf to serve a PDF file to a user from HTML.
18
- In other words, rather than dealing with a PDF generation DSL of some sort,
19
- you simply write an HTML view as you would normally, and let Wicked take care of the hard stuff.
20
- desc
16
+ spec.description = <<DESC.gsub(/^\s+/, '')
17
+ Wicked PDF uses the shell utility wkhtmltopdf to serve a PDF file to a user from HTML.
18
+ In other words, rather than dealing with a PDF generation DSL of some sort,
19
+ you simply write an HTML view as you would normally, and let Wicked take care of the hard stuff.
20
+ DESC
21
+ spec.metadata = {
22
+ 'changelog_uri' => 'https://github.com/mileszs/wicked_pdf/blob/master/CHANGELOG.md'
23
+ }
21
24
 
25
+ spec.required_ruby_version = Gem::Requirement.new('>= 2.2')
22
26
  spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
23
27
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
24
28
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
25
29
  spec.require_paths = ['lib']
26
30
 
31
+ spec.requirements << 'wkhtmltopdf'
32
+
33
+ spec.add_dependency 'activesupport'
34
+
27
35
  spec.add_development_dependency 'rails'
28
- spec.add_development_dependency 'bundler', '~> 1.3'
36
+ spec.add_development_dependency 'bundler'
29
37
  spec.add_development_dependency 'rake'
30
- spec.add_development_dependency 'rubocop' if RUBY_VERSION >= '2.0.0'
31
- spec.add_development_dependency 'sqlite3'
32
- spec.add_development_dependency 'mocha'
38
+ spec.add_development_dependency 'rubocop', '~> 0.68.0'
39
+ spec.add_development_dependency 'sqlite3', '~> 1.3'
40
+ spec.add_development_dependency 'mocha', '= 1.3'
33
41
  spec.add_development_dependency 'test-unit'
34
42
  end