pdfkit 0.8.4.3.2 → 0.8.7.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a9763236251a08873c269bb76fa8cbc81e64111a9bd94ea7a167c0e96ad1e0dc
4
- data.tar.gz: ab65d5b9648ec671a22191cf7eca7b14d6c4b07917e45adf479046360f7adfd7
3
+ metadata.gz: d5a276883efaa6bba1349d1077bee9ed23e466e48006d7b87a8e6c6ffbbd83bb
4
+ data.tar.gz: 33632dc0ae3a917efe7a4d227ea3f1ef52a2901f125b5102f687d8058c32a135
5
5
  SHA512:
6
- metadata.gz: 8ce66b221fce28fb3be395a199fdb4fc3c660a1702302c4b453bc40f39033cadc41fff9ea8a5f0e612f12a1040fbdad31e738823c6d9cf3ea2456a9ebf55b999
7
- data.tar.gz: 73827642f8a0d5a87745eb9d853f9a9a9e0d62ea7ab9f31e552be71cba2c4ce7b340da992ab0eabd145a0fbb6395a30d953396fc1bf25f7410db5df9572eb6e1
6
+ metadata.gz: 8694cd8411e17b0a960a5a931f84960031a935bfdb2f6fc43b6b460c8434644694e0b8dd764fb151cb722b947c9775c9540bd2b5935a0bbb5021705bbe7f8b52
7
+ data.tar.gz: 55fdc04026f173baa10fc1f349323b243f6ef9d17142a9ab196cdc4302c2444e7a72dcf1ba68c31c3a953ab1559add63c257a1c5c1012e9a3216765ae386457e
@@ -12,8 +12,8 @@ jobs:
12
12
  steps:
13
13
  # Drafts your next Release notes as Pull Requests are merged into "master"
14
14
  - uses: release-drafter/release-drafter@v5
15
- with:
15
+ # with:
16
16
  # (Optional) specify config name to use, relative to .github/. Default: release-drafter.yml
17
17
  # config-name: my-config.yml
18
18
  env:
19
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
19
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -0,0 +1,71 @@
1
+ name: Test workflow
2
+
3
+ on: [push, pull_request]
4
+
5
+ jobs:
6
+ test:
7
+ strategy:
8
+ fail-fast: false
9
+ matrix:
10
+ os: [ubuntu-latest]
11
+ ruby:
12
+ - '2.5'
13
+ - '2.6'
14
+ - '2.7'
15
+ - '3.0'
16
+ - '3.1'
17
+ rails:
18
+ - '~> 4.1'
19
+ - '~> 5.2'
20
+ - '~> 6.0.0'
21
+ - '~> 6.1'
22
+ - '~> 7.0.0'
23
+ exclude:
24
+ - ruby: '2.5'
25
+ rails: '~> 7.0.0'
26
+ - ruby: '2.6'
27
+ rails: '~> 7.0.0'
28
+ - ruby: '2.7'
29
+ rails: '~> 4.1'
30
+ - ruby: '3.0'
31
+ rails: '~> 4.1'
32
+ - ruby: '3.0'
33
+ rails: '~> 5.2'
34
+ - ruby: '3.1'
35
+ rails: '~> 4.1'
36
+ - ruby: '3.1'
37
+ rails: '~> 5.2'
38
+ - ruby: '3.1'
39
+ rails: '~> 6.0.0'
40
+ runs-on: ${{ matrix.os }}
41
+ env:
42
+ RAILS_VERSION: ${{ matrix.rails }}
43
+ steps:
44
+ - uses: actions/checkout@v2
45
+ - uses: ruby/setup-ruby@v1
46
+ # rubygems-update's latest is no longer compatible with ruby 2.5, so conditionally run ruby-setup setting the
47
+ # rubygem version the most recent valid version for 2.5:
48
+ # https://rubygems.org/gems/rubygems-update/versions/3.3.26
49
+ if: ${{ matrix.ruby == '2.5' }}
50
+ with:
51
+ ruby-version: ${{ matrix.ruby }}
52
+ rubygems: 3.3.26
53
+ bundler: latest
54
+ bundler-cache: true
55
+ - uses: ruby/setup-ruby@v1
56
+ # otherwise, we can use rubygems latest
57
+ if: ${{ matrix.ruby != '2.5' }}
58
+ with:
59
+ ruby-version: ${{ matrix.ruby }}
60
+ rubygems: latest
61
+ bundler: latest
62
+ bundler-cache: true
63
+
64
+ - name: Setup wkhtmltopdf
65
+ run: |
66
+ sudo apt-get install -y xfonts-base xfonts-75dpi
67
+ wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox_0.12.6-1.bionic_amd64.deb
68
+ sudo dpkg -i wkhtmltox_0.12.6-1.bionic_amd64.deb
69
+
70
+ - name: Run tests
71
+ run: bundle exec rake
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.6.4
1
+ 2.6.9
data/.travis.yml CHANGED
@@ -1,10 +1,40 @@
1
1
  language: ruby
2
2
 
3
3
  rvm:
4
- - 2.3
5
- - 2.4
6
4
  - 2.5
7
5
  - 2.6
6
+ - 2.7
7
+ - 3.0
8
+ - 3.1
9
+
10
+ env:
11
+ matrix:
12
+ - RAILS_VERSION="~> 4.1"
13
+ - RAILS_VERSION="~> 5.2"
14
+ - RAILS_VERSION="~> 6.0.0"
15
+ - RAILS_VERSION="~> 6.1"
16
+ - RAILS_VERSION="~> 7.0.0"
17
+
18
+ jobs:
19
+ exclude:
20
+ - rvm: 2.5
21
+ env: RAILS_VERSION="~> 7.0.0"
22
+ - rvm: 2.6
23
+ env: RAILS_VERSION="~> 7.0.0"
24
+ - rvm: 2.7
25
+ env: RAILS_VERSION="~> 4.1"
26
+ - rvm: 3.0
27
+ env: RAILS_VERSION="~> 4.1"
28
+ - rvm: 3.0
29
+ env: RAILS_VERSION="~> 5.2"
30
+ - rvm: 3.1
31
+ env: RAILS_VERSION="~> 4.1"
32
+ - rvm: 3.1
33
+ env: RAILS_VERSION="~> 5.2"
34
+ - rvm: 3.1
35
+ env: RAILS_VERSION="~> 6.0.0"
36
+
37
+ cache: bundler
8
38
 
9
39
  before_install:
10
40
  - gem update --system
data/CHANGELOG.md CHANGED
@@ -1,3 +1,37 @@
1
+ 2023-02-27
2
+ =================
3
+ * Bump to 0.8.7.3
4
+ * Allow passing a `Pathname` object to the `path` argument by @yujideveloper in https://github.com/pdfkit/pdfkit/pull/522
5
+ * Update repeatable options by @mguidetti in https://github.com/pdfkit/pdfkit/pull/524
6
+
7
+ 2022-10-18
8
+ =================
9
+ * Bump to 0.8.7.2
10
+ * Call IO.popen with an Array of command arguments (#519)
11
+
12
+ 2022-10-17
13
+ =================
14
+ * Bump to 0.8.7.1
15
+ * Support non-lower-case Content-Type header provided by app (#516)
16
+
17
+ 2022-10-02
18
+ =================
19
+ * Bump to 0.8.7
20
+ * Lowercase the header names for rack 3 changes (#511)
21
+ * Partially escaped URLs should be escaped (#509)
22
+
23
+ 2022-04-11
24
+ =================
25
+ * Bump to 0.8.6
26
+ * Update ruby and rails versions
27
+
28
+ 2021-01-23
29
+ =================
30
+ * Bump to 0.8.5
31
+ * Make `PDFKit::VERSION` public (#484)
32
+ * Fix to render stylesheets as html safe string on Rails 6 (#483)
33
+ * Adds support for Rails 6
34
+
1
35
  2020-08-16
2
36
  =================
3
37
  * Bump to 0.8.4.3.2
data/Gemfile CHANGED
@@ -1,7 +1,7 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  group :test do
4
- gem 'activesupport', '~> 4.1'
4
+ gem 'activesupport', ENV['RAILS_VERSION'] || '~> 4.1'
5
5
  gem 'simplecov', require: false
6
6
  end
7
7
 
data/README.md CHANGED
@@ -2,6 +2,11 @@
2
2
 
3
3
  Create PDFs using plain old HTML+CSS. Uses [wkhtmltopdf](http://github.com/antialize/wkhtmltopdf) on the back-end which renders HTML using Webkit.
4
4
 
5
+ ## Supported versions
6
+
7
+ - Ruby 2.5, 2.6, 2.7, 3.0, 3.1
8
+ - Rails 4.2, 5.2, 6.0, 6.1, 7.0
9
+
5
10
  ## Install
6
11
 
7
12
  ### PDFKit
@@ -58,7 +63,7 @@ PDFKit.new(html, protocol: 'https').to_file
58
63
  ```
59
64
 
60
65
  ### Using cookies in scraping
61
- If you want to pass a cookie to cookie to pdfkit to scrape a website, you can
66
+ If you want to pass a cookie to pdfkit to scrape a website, you can
62
67
  pass it in a hash:
63
68
  ```ruby
64
69
  kit = PDFKit.new(url, cookie: {cookie_name: :cookie_value})
@@ -167,7 +172,7 @@ Will cause the .pdf to be saved to `path/to/saved.pdf` in addition to being sent
167
172
  asset host.
168
173
 
169
174
  * **Mangled output in the browser:** Be sure that your HTTP response
170
- headers specify "Content-Type: application/pdf"
175
+ headers specify "content-type: application/pdf"
171
176
 
172
177
  ## Note on Patches/Pull Requests
173
178
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class PDFKit
2
4
  class Configuration
3
5
  attr_accessor :meta_tag_prefix, :root_url
@@ -26,7 +28,7 @@ class PDFKit
26
28
 
27
29
  def default_wkhtmltopdf
28
30
  return @default_command_path if @default_command_path
29
- if defined?(Bundler::GemfileError) && File.exists?('Gemfile')
31
+ if defined?(Bundler::GemfileError) && File.exist?('Gemfile')
30
32
  @default_command_path = `bundle exec which wkhtmltopdf`.chomp.lines.last
31
33
  end
32
34
  @default_command_path = `which wkhtmltopdf`.chomp if @default_command_path.nil? || @default_command_path.empty?
@@ -43,7 +45,7 @@ class PDFKit
43
45
  end
44
46
 
45
47
  def executable
46
- using_xvfb? ? "xvfb-run #{wkhtmltopdf}" : wkhtmltopdf
48
+ using_xvfb? ? ['xvfb-run', wkhtmltopdf] : wkhtmltopdf
47
49
  end
48
50
 
49
51
  def using_xvfb?
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class PDFKit
2
4
  module HTMLPreprocessor
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class PDFKit
2
4
  class Middleware
3
5
  def initialize(app, options = {}, conditions = {})
@@ -20,7 +22,8 @@ class PDFKit
20
22
  status, headers, response = @app.call(env)
21
23
 
22
24
  begin
23
- if rendering_pdf? && headers['Content-Type'] =~ /text\/html|application\/xhtml\+xml/
25
+ content_type_header = headers.has_key?('Content-Type') ? 'Content-Type' : 'content-type'
26
+ if rendering_pdf? && headers[content_type_header] =~ /text\/html|application\/xhtml\+xml/
24
27
  body = response.respond_to?(:body) ? response.body : response.join
25
28
  body = body.join if body.is_a?(Array)
26
29
 
@@ -42,13 +45,13 @@ class PDFKit
42
45
 
43
46
  unless @caching
44
47
  # Do not cache PDFs
45
- headers.delete('ETag')
46
- headers.delete('Cache-Control')
48
+ headers.delete('etag')
49
+ headers.delete('cache-control')
47
50
  end
48
51
 
49
- headers['Content-Length'] = (body.respond_to?(:bytesize) ? body.bytesize : body.size).to_s
50
- headers['Content-Type'] = 'application/pdf'
51
- headers['Content-Disposition'] ||= @conditions[:disposition] || 'inline'
52
+ headers['content-length'] = (body.respond_to?(:bytesize) ? body.bytesize : body.size).to_s
53
+ headers[content_type_header] = 'application/pdf'
54
+ headers['content-disposition'] ||= @conditions[:disposition] || 'inline'
52
55
  end
53
56
  rescue StandardError => e
54
57
  status = 500
data/lib/pdfkit/os.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rbconfig'
2
4
 
3
5
  class PDFKit
data/lib/pdfkit/pdfkit.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'shellwords'
2
4
  require 'tempfile'
3
5
 
@@ -6,8 +8,8 @@ class PDFKit
6
8
 
7
9
  class NoExecutableError < Error
8
10
  def initialize
9
- msg = "No wkhtmltopdf executable found at #{PDFKit.configuration.wkhtmltopdf}\n"
10
- msg << ">> Please install wkhtmltopdf - https://github.com/pdfkit/PDFKit/wiki/Installing-WKHTMLTOPDF"
11
+ msg = "No wkhtmltopdf executable found at #{PDFKit.configuration.wkhtmltopdf}\n" \
12
+ ">> Please install wkhtmltopdf - https://github.com/pdfkit/PDFKit/wiki/Installing-WKHTMLTOPDF"
11
13
  super(msg)
12
14
  end
13
15
  end
@@ -40,20 +42,15 @@ class PDFKit
40
42
  @renderer = WkHTMLtoPDF.new options
41
43
  @renderer.normalize_options
42
44
 
43
- raise NoExecutableError unless File.exists?(PDFKit.configuration.wkhtmltopdf)
45
+ raise NoExecutableError unless File.exist?(PDFKit.configuration.wkhtmltopdf)
44
46
  end
45
47
 
46
48
  def command(path = nil)
47
- args = @renderer.options_for_command
48
- shell_escaped_command = [executable, OS::shell_escape_for_os(args)].join ' '
49
-
50
- # In order to allow for URL parameters (e.g. https://www.google.com/search?q=pdfkit) we do
51
- # not escape the source. The user is responsible for ensuring that no vulnerabilities exist
52
- # in the source. Please see https://github.com/pdfkit/pdfkit/issues/164.
53
- input_for_command = @source.to_input_for_command
54
- output_for_command = path ? Shellwords.shellescape(path) : '-'
55
-
56
- "#{shell_escaped_command} #{input_for_command} #{output_for_command}"
49
+ args = [*executable]
50
+ args.concat(@renderer.options_for_command)
51
+ args << @source.to_input_for_command
52
+ args << (path ? path.to_s : '-')
53
+ args
57
54
  end
58
55
 
59
56
  def options
@@ -114,7 +111,9 @@ class PDFKit
114
111
  end
115
112
 
116
113
  def style_tag_for(stylesheet)
117
- "<style>#{File.read(stylesheet)}</style>"
114
+ style = "<style>#{File.read(stylesheet)}</style>"
115
+ style = style.html_safe if style.respond_to?(:html_safe)
116
+ style
118
117
  end
119
118
 
120
119
  def preprocess_html
@@ -129,7 +128,9 @@ class PDFKit
129
128
 
130
129
  stylesheets.each do |stylesheet|
131
130
  if @source.to_s.match(/<\/head>/)
132
- @source = Source.new(@source.to_s.gsub(/(<\/head>)/) {|s| style_tag_for(stylesheet) + s })
131
+ @source = Source.new(@source.to_s.gsub(/(<\/head>)/) {|s|
132
+ style_tag_for(stylesheet) + (s.respond_to?(:html_safe) ? s.html_safe : s)
133
+ })
133
134
  else
134
135
  @source.to_s.insert(0, style_tag_for(stylesheet))
135
136
  end
data/lib/pdfkit/source.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'tempfile'
2
4
  require 'uri'
3
5
 
@@ -7,6 +9,8 @@ class PDFKit
7
9
 
8
10
  def initialize(url_file_or_html)
9
11
  @source = url_file_or_html
12
+ # @source is assumed to be modifiable, so make sure it is.
13
+ @source = @source.dup if @source.is_a?(String) && @source.frozen?
10
14
  end
11
15
 
12
16
  def url?
@@ -25,7 +29,7 @@ class PDFKit
25
29
  if file?
26
30
  @source.path
27
31
  elsif url?
28
- %{"#{shell_safe_url}"}
32
+ escaped_url
29
33
  else
30
34
  SOURCE_FROM_STDIN
31
35
  end
@@ -37,12 +41,12 @@ class PDFKit
37
41
 
38
42
  private
39
43
 
40
- def shell_safe_url
41
- url_needs_escaping? ? URI::escape(@source) : @source
44
+ def escaped_url
45
+ url_needs_escaping? ? URI::DEFAULT_PARSER.escape(@source) : @source
42
46
  end
43
47
 
44
48
  def url_needs_escaping?
45
- URI::decode(@source) == @source
49
+ URI::DEFAULT_PARSER.escape(URI::DEFAULT_PARSER.unescape(@source)) != @source
46
50
  end
47
51
  end
48
52
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class PDFKit
2
- VERSION = '0.8.4.3.2'
4
+ VERSION = '0.8.7.3'
3
5
  end
@@ -1,10 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class PDFKit
2
4
  class WkHTMLtoPDF
3
5
  attr_reader :options
4
- # Pulled from:
5
- # https://github.com/wkhtmltopdf/wkhtmltopdf/blob/ebf9b6cfc4c58a31349fb94c568b254fac37b3d3/README_WKHTMLTOIMAGE#L27
6
- REPEATABLE_OPTIONS = %w[--allow --cookie --custom-header --post --post-file --run-script]
7
- SPECIAL_OPTIONS = %w[cover toc]
6
+ # Pulled from:
7
+ # https://github.com/wkhtmltopdf/wkhtmltopdf/blob/6a57c1449797d6cb915921fb747f3ac36199241f/docs/usage/wkhtmltopdf.txt#L104
8
+ REPEATABLE_OPTIONS = %w[--allow --bypass-proxy-for --cookie --custom-header --post --post-file --run-script --replace].freeze
9
+ SPECIAL_OPTIONS = %w[cover toc].freeze
8
10
 
9
11
  def initialize(options)
10
12
  @options = options
@@ -62,7 +64,7 @@ class PDFKit
62
64
  when Array
63
65
  value.flatten.collect{|x| x.to_s}
64
66
  else
65
- (OS::host_is_windows? && value.to_s.index(' ')) ? "'#{ value.to_s }'" : value.to_s
67
+ value.to_s
66
68
  end
67
69
  end
68
70
 
data/lib/pdfkit.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'pdfkit/source'
2
4
  require 'pdfkit/pdfkit'
3
5
  require 'pdfkit/middleware'
@@ -5,3 +7,4 @@ require 'pdfkit/html_preprocessor'
5
7
  require 'pdfkit/os'
6
8
  require 'pdfkit/configuration'
7
9
  require 'pdfkit/wkhtmltopdf'
10
+ require 'pdfkit/version'
data/pdfkit.gemspec CHANGED
@@ -18,13 +18,15 @@ Gem::Specification.new do |s|
18
18
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
19
  s.require_paths = ["lib"]
20
20
 
21
+ s.required_ruby_version = ">= 2.5"
22
+
21
23
  s.requirements << "wkhtmltopdf"
22
24
 
23
25
  # Development Dependencies
24
26
  s.add_development_dependency(%q<activesupport>, [">= 4.1.11"])
25
27
  s.add_development_dependency(%q<mocha>, [">= 0.9.10"])
26
28
  s.add_development_dependency(%q<rack-test>, [">= 0.5.6"])
27
- s.add_development_dependency(%q<rake>, ["~>12.3.3"])
28
- s.add_development_dependency(%q<rdoc>, ["~> 4.0.1"])
29
+ s.add_development_dependency(%q<rake>, [">= 12.3.3"])
30
+ s.add_development_dependency(%q<rdoc>, [">= 4.0.1"])
29
31
  s.add_development_dependency(%q<rspec>, ["~> 3.0"])
30
32
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe PDFKit::Configuration do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe PDFKit::HTMLPreprocessor do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  def app; Rack::Lint.new(@app); end
@@ -17,7 +19,7 @@ end
17
19
 
18
20
  describe PDFKit::Middleware do
19
21
  let(:headers) do
20
- {'Content-Type' => "text/html"}
22
+ {'content-type' => "text/html"}
21
23
  end
22
24
 
23
25
  describe "#call" do
@@ -53,36 +55,36 @@ describe PDFKit::Middleware do
53
55
  describe "caching" do
54
56
  let(:headers) do
55
57
  {
56
- 'Content-Type' => "text/html",
57
- 'ETag' => 'foo',
58
- 'Cache-Control' => 'max-age=2592000, public'
58
+ 'content-type' => "text/html",
59
+ 'etag' => 'foo',
60
+ 'cache-control' => 'max-age=2592000, public'
59
61
  }
60
62
  end
61
63
 
62
64
  context "by default" do
63
65
  before { mock_app }
64
66
 
65
- it "deletes ETag" do
67
+ it "deletes etag" do
66
68
  get 'http://www.example.org/public/test.pdf'
67
- expect(last_response.headers["ETag"]).to be_nil
69
+ expect(last_response.headers["etag"]).to be_nil
68
70
  end
69
- it "deletes Cache-Control" do
71
+ it "deletes cache-control" do
70
72
  get 'http://www.example.org/public/test.pdf'
71
- expect(last_response.headers["Cache-Control"]).to be_nil
73
+ expect(last_response.headers["cache-control"]).to be_nil
72
74
  end
73
75
  end
74
76
 
75
77
  context "when on" do
76
78
  before { mock_app({}, :caching => true) }
77
79
 
78
- it "preserves ETag" do
80
+ it "preserves etag" do
79
81
  get 'http://www.example.org/public/test.pdf'
80
- expect(last_response.headers["ETag"]).not_to be_nil
82
+ expect(last_response.headers["etag"]).not_to be_nil
81
83
  end
82
84
 
83
- it "preserves Cache-Control" do
85
+ it "preserves cache-control" do
84
86
  get 'http://www.example.org/public/test.pdf'
85
- expect(last_response.headers["Cache-Control"]).not_to be_nil
87
+ expect(last_response.headers["cache-control"]).not_to be_nil
86
88
  end
87
89
  end
88
90
  end
@@ -97,7 +99,7 @@ describe PDFKit::Middleware do
97
99
  context "matching" do
98
100
  specify do
99
101
  get 'http://www.example.org/public/test.pdf'
100
- expect(last_response.headers["Content-Type"]).to eq("application/pdf")
102
+ expect(last_response.headers["content-type"]).to eq("application/pdf")
101
103
  expect(last_response.body.bytesize).to eq(PDFKit.new("Hello world!").to_pdf.bytesize)
102
104
  end
103
105
  end
@@ -105,7 +107,7 @@ describe PDFKit::Middleware do
105
107
  context "not matching" do
106
108
  specify do
107
109
  get 'http://www.example.org/secret/test.pdf'
108
- expect(last_response.headers["Content-Type"]).to eq("text/html")
110
+ expect(last_response.headers["content-type"]).to eq("text/html")
109
111
  expect(last_response.body).to eq("Hello world!")
110
112
  end
111
113
  end
@@ -117,7 +119,7 @@ describe PDFKit::Middleware do
117
119
  context "matching" do
118
120
  specify do
119
121
  get 'http://www.example.org/public/test.pdf'
120
- expect(last_response.headers["Content-Type"]).to eq("application/pdf")
122
+ expect(last_response.headers["content-type"]).to eq("application/pdf")
121
123
  expect(last_response.body.bytesize).to eq(PDFKit.new("Hello world!").to_pdf.bytesize)
122
124
  end
123
125
  end
@@ -125,7 +127,7 @@ describe PDFKit::Middleware do
125
127
  context "not matching" do
126
128
  specify do
127
129
  get 'http://www.example.org/secret/test.pdf'
128
- expect(last_response.headers["Content-Type"]).to eq("text/html")
130
+ expect(last_response.headers["content-type"]).to eq("text/html")
129
131
  expect(last_response.body).to eq("Hello world!")
130
132
  end
131
133
  end
@@ -139,7 +141,7 @@ describe PDFKit::Middleware do
139
141
  context "matching" do
140
142
  specify do
141
143
  get 'http://www.example.org/public/test.pdf'
142
- expect(last_response.headers["Content-Type"]).to eq("application/pdf")
144
+ expect(last_response.headers["content-type"]).to eq("application/pdf")
143
145
  expect(last_response.body.bytesize).to eq(PDFKit.new("Hello world!").to_pdf.bytesize)
144
146
  end
145
147
  end
@@ -147,7 +149,7 @@ describe PDFKit::Middleware do
147
149
  context "not matching" do
148
150
  specify do
149
151
  get 'http://www.example.org/secret/test.pdf'
150
- expect(last_response.headers["Content-Type"]).to eq("text/html")
152
+ expect(last_response.headers["content-type"]).to eq("text/html")
151
153
  expect(last_response.body).to eq("Hello world!")
152
154
  end
153
155
  end
@@ -159,7 +161,7 @@ describe PDFKit::Middleware do
159
161
  context "matching" do
160
162
  specify do
161
163
  get 'http://www.example.org/public/test.pdf'
162
- expect(last_response.headers["Content-Type"]).to eq("application/pdf")
164
+ expect(last_response.headers["content-type"]).to eq("application/pdf")
163
165
  expect(last_response.body.bytesize).to eq(PDFKit.new("Hello world!").to_pdf.bytesize)
164
166
  end
165
167
  end
@@ -167,7 +169,7 @@ describe PDFKit::Middleware do
167
169
  context "not matching" do
168
170
  specify do
169
171
  get 'http://www.example.org/secret/test.pdf'
170
- expect(last_response.headers["Content-Type"]).to eq("text/html")
172
+ expect(last_response.headers["content-type"]).to eq("text/html")
171
173
  expect(last_response.body).to eq("Hello world!")
172
174
  end
173
175
  end
@@ -185,7 +187,7 @@ describe PDFKit::Middleware do
185
187
  context "matching" do
186
188
  specify do
187
189
  get 'http://www.example.org/public/test.pdf'
188
- expect(last_response.headers["Content-Type"]).to eq("application/pdf")
190
+ expect(last_response.headers["content-type"]).to eq("application/pdf")
189
191
  expect(last_response.body.bytesize).to eq(PDFKit.new("Hello world!").to_pdf.bytesize)
190
192
  end
191
193
  end
@@ -193,7 +195,7 @@ describe PDFKit::Middleware do
193
195
  context "not matching" do
194
196
  specify do
195
197
  get 'http://www.example.org/secret/test.pdf'
196
- expect(last_response.headers["Content-Type"]).to eq("text/html")
198
+ expect(last_response.headers["content-type"]).to eq("text/html")
197
199
  expect(last_response.body).to eq("Hello world!")
198
200
  end
199
201
  end
@@ -205,7 +207,7 @@ describe PDFKit::Middleware do
205
207
  context "matching" do
206
208
  specify do
207
209
  get 'http://www.example.org/public/test.pdf'
208
- expect(last_response.headers["Content-Type"]).to eq("application/pdf")
210
+ expect(last_response.headers["content-type"]).to eq("application/pdf")
209
211
  expect(last_response.body.bytesize).to eq(PDFKit.new("Hello world!").to_pdf.bytesize)
210
212
  end
211
213
  end
@@ -213,7 +215,7 @@ describe PDFKit::Middleware do
213
215
  context "not matching" do
214
216
  specify do
215
217
  get 'http://www.example.org/secret/test.pdf'
216
- expect(last_response.headers["Content-Type"]).to eq("text/html")
218
+ expect(last_response.headers["content-type"]).to eq("text/html")
217
219
  expect(last_response.body).to eq("Hello world!")
218
220
  end
219
221
  end
@@ -227,7 +229,7 @@ describe PDFKit::Middleware do
227
229
  context "matching" do
228
230
  specify do
229
231
  get 'http://www.example.org/public/test.pdf'
230
- expect(last_response.headers["Content-Type"]).to eq("application/pdf")
232
+ expect(last_response.headers["content-type"]).to eq("application/pdf")
231
233
  expect(last_response.body.bytesize).to eq(PDFKit.new("Hello world!").to_pdf.bytesize)
232
234
  end
233
235
  end
@@ -235,7 +237,7 @@ describe PDFKit::Middleware do
235
237
  context "not matching" do
236
238
  specify do
237
239
  get 'http://www.example.org/secret/test.pdf'
238
- expect(last_response.headers["Content-Type"]).to eq("text/html")
240
+ expect(last_response.headers["content-type"]).to eq("text/html")
239
241
  expect(last_response.body).to eq("Hello world!")
240
242
  end
241
243
  end
@@ -247,7 +249,7 @@ describe PDFKit::Middleware do
247
249
  context "matching" do
248
250
  specify do
249
251
  get 'http://www.example.org/public/test.pdf'
250
- expect(last_response.headers["Content-Type"]).to eq("application/pdf")
252
+ expect(last_response.headers["content-type"]).to eq("application/pdf")
251
253
  expect(last_response.body.bytesize).to eq(PDFKit.new("Hello world!").to_pdf.bytesize)
252
254
  end
253
255
  end
@@ -255,7 +257,7 @@ describe PDFKit::Middleware do
255
257
  context "not matching" do
256
258
  specify do
257
259
  get 'http://www.example.org/secret/test.pdf'
258
- expect(last_response.headers["Content-Type"]).to eq("text/html")
260
+ expect(last_response.headers["content-type"]).to eq("text/html")
259
261
  expect(last_response.body).to eq("Hello world!")
260
262
  end
261
263
  end
@@ -267,8 +269,8 @@ describe PDFKit::Middleware do
267
269
  describe "saving generated pdf to disk" do
268
270
  before do
269
271
  #make sure tests don't find an old test_save.pdf
270
- File.delete('spec/test_save.pdf') if File.exists?('spec/test_save.pdf')
271
- expect(File.exists?('spec/test_save.pdf')).to eq(false)
272
+ File.delete('spec/test_save.pdf') if File.exist?('spec/test_save.pdf')
273
+ expect(File.exist?('spec/test_save.pdf')).to eq(false)
272
274
  end
273
275
 
274
276
  context "when header PDFKit-save-pdf is present" do
@@ -276,7 +278,7 @@ describe PDFKit::Middleware do
276
278
  headers = { 'PDFKit-save-pdf' => 'spec/test_save.pdf' }
277
279
  mock_app({}, {only: '/public'}, headers)
278
280
  get 'http://www.example.org/public/test_save.pdf'
279
- expect(File.exists?('spec/test_save.pdf')).to eq(true)
281
+ expect(File.exist?('spec/test_save.pdf')).to eq(true)
280
282
  end
281
283
 
282
284
  it "does not raise when target directory does not exist" do
@@ -292,7 +294,7 @@ describe PDFKit::Middleware do
292
294
  it "does not saved the .pdf to disk" do
293
295
  mock_app({}, {only: '/public'}, {} )
294
296
  get 'http://www.example.org/public/test_save.pdf'
295
- expect(File.exists?('spec/test_save.pdf')).to eq(false)
297
+ expect(File.exist?('spec/test_save.pdf')).to eq(false)
296
298
  end
297
299
  end
298
300
  end
@@ -346,14 +348,14 @@ describe PDFKit::Middleware do
346
348
  describe "doesn't overwrite existing value" do
347
349
  let(:headers) do
348
350
  super().merge({
349
- 'Content-Disposition' => 'attachment; filename=report-20200101.pdf'
351
+ 'content-disposition' => 'attachment; filename=report-20200101.pdf'
350
352
  })
351
353
  end
352
354
 
353
355
  specify do
354
356
  mock_app({}, { :disposition => 'inline' })
355
357
  get 'http://www.example.org/public/test.pdf'
356
- expect(last_response.headers["Content-Disposition"]).to eq('attachment; filename=report-20200101.pdf')
358
+ expect(last_response.headers["content-disposition"]).to eq('attachment; filename=report-20200101.pdf')
357
359
  end
358
360
  end
359
361
 
@@ -362,7 +364,7 @@ describe PDFKit::Middleware do
362
364
  specify do
363
365
  mock_app
364
366
  get 'http://www.example.org/public/test.pdf'
365
- expect(last_response.headers["Content-Disposition"]).to eq("inline")
367
+ expect(last_response.headers["content-disposition"]).to eq("inline")
366
368
  end
367
369
  end
368
370
 
@@ -370,7 +372,7 @@ describe PDFKit::Middleware do
370
372
  specify do
371
373
  mock_app({}, { :disposition => 'inline' })
372
374
  get 'http://www.example.org/public/test.pdf'
373
- expect(last_response.headers["Content-Disposition"]).to eq("inline")
375
+ expect(last_response.headers["content-disposition"]).to eq("inline")
374
376
  end
375
377
  end
376
378
  end
@@ -380,7 +382,7 @@ describe PDFKit::Middleware do
380
382
  specify do
381
383
  mock_app({}, { :disposition => 'attachment' })
382
384
  get 'http://www.example.org/public/test.pdf'
383
- expect(last_response.headers["Content-Disposition"]).to eq("attachment")
385
+ expect(last_response.headers["content-disposition"]).to eq("attachment")
384
386
  end
385
387
  end
386
388
 
@@ -388,7 +390,7 @@ describe PDFKit::Middleware do
388
390
  specify do
389
391
  mock_app({}, { :disposition => 'attachment; filename=report.pdf' })
390
392
  get 'http://www.example.org/public/test.pdf'
391
- expect(last_response.headers["Content-Disposition"]).to eq("attachment; filename=report.pdf")
393
+ expect(last_response.headers["content-disposition"]).to eq("attachment; filename=report.pdf")
392
394
  end
393
395
  end
394
396
  end
@@ -420,6 +422,29 @@ describe PDFKit::Middleware do
420
422
  end
421
423
  end
422
424
 
425
+ describe "content type header" do
426
+ before { mock_app }
427
+
428
+ context "lower case" do
429
+ specify "header gets correctly updated" do
430
+ get 'http://www.example.org/public/test.pdf'
431
+ expect(last_response.headers["content-type"]).to eq("application/pdf")
432
+ end
433
+ end
434
+
435
+ context "mixed case" do
436
+ let(:headers) do
437
+ {'Content-Type' => "text/html"}
438
+ end
439
+
440
+ specify "header gets correctly updated" do
441
+ pending("this test only applies to rack 2.x and is rejected by rack 3.x") if Rack.release >= "3.0.0"
442
+ get 'http://www.example.org/public/test.pdf'
443
+ expect(last_response.headers["Content-Type"]).to eq("application/pdf")
444
+ end
445
+ end
446
+ end
447
+
423
448
  describe "remove .pdf from PATH_INFO and REQUEST_URI" do
424
449
  before { mock_app }
425
450
 
@@ -444,7 +469,7 @@ describe PDFKit::Middleware do
444
469
  main_app = lambda { |env|
445
470
  @env = env
446
471
  @env['SCRIPT_NAME'] = '/example.org'
447
- headers = {'Content-Type' => "text/html"}
472
+ headers = {'content-type' => "text/html"}
448
473
  [200, headers, @body || ['Hello world!']]
449
474
  }
450
475
 
data/spec/os_spec.rb CHANGED
@@ -1,4 +1,6 @@
1
1
  #encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
2
4
  require 'spec_helper'
3
5
  require 'rbconfig'
4
6
 
data/spec/pdfkit_spec.rb CHANGED
@@ -1,4 +1,6 @@
1
1
  #encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
2
4
  require 'spec_helper'
3
5
 
4
6
  describe PDFKit do
@@ -27,7 +29,7 @@ describe PDFKit do
27
29
  file_path = File.join(SPEC_ROOT,'fixtures','example.html')
28
30
  pdfkit = PDFKit.new(Tempfile.new(file_path))
29
31
  expect(pdfkit.source).to be_file
30
- expect(pdfkit.source.to_s).to match /^#{Dir.tmpdir}/
32
+ expect(pdfkit.source.to_s).to match(/^#{Dir.tmpdir}/)
31
33
  end
32
34
 
33
35
  # Options
@@ -43,8 +45,8 @@ describe PDFKit do
43
45
  end
44
46
 
45
47
  it "transforms complex keys into command-line arguments" do
46
- pdfkit = PDFKit.new('html', :replace => {'value' => 'something else'} )
47
- expect(pdfkit.options).to have_key('--replace')
48
+ pdfkit = PDFKit.new('html', :header_left => {'value' => 'something else'} )
49
+ expect(pdfkit.options).to have_key('--header-left')
48
50
  end
49
51
 
50
52
  it "drops options with false or falsey values" do
@@ -70,8 +72,8 @@ describe PDFKit do
70
72
  end
71
73
 
72
74
  it "parses hash option values into an array" do
73
- pdfkit = PDFKit.new('html', :replace => {'value' => 'something else'} )
74
- expect(pdfkit.options['--replace']).to eql ['value', 'something else']
75
+ pdfkit = PDFKit.new('html', :header_left => {'value' => 'something else'} )
76
+ expect(pdfkit.options['--header-left']).to eql ['value', 'something else']
75
77
  end
76
78
 
77
79
  it "flattens hash options into the key" do
@@ -82,8 +84,8 @@ describe PDFKit do
82
84
  end
83
85
 
84
86
  it "parses array option values into a string" do
85
- pdfkit = PDFKit.new('html', :replace => ['value', 'something else'] )
86
- expect(pdfkit.options['--replace']).to eql ['value', 'something else']
87
+ pdfkit = PDFKit.new('html', :header_left => ['value', 'something else'] )
88
+ expect(pdfkit.options['--header-left']).to eql ['value', 'something else']
87
89
  end
88
90
 
89
91
  it "flattens array options" do
@@ -173,22 +175,36 @@ describe PDFKit do
173
175
  it "constructs the correct command" do
174
176
  pdfkit = PDFKit.new('html', :page_size => 'Letter', :toc_l1_font_size => 12, :replace => {'foo' => 'bar'})
175
177
  command = pdfkit.command
176
- expect(command).to include "wkhtmltopdf"
177
- expect(command).to include "--page-size Letter"
178
- expect(command).to include "--toc-l1-font-size 12"
179
- expect(command).to include "--replace foo bar"
178
+ expect(command.first).to match(/wkhtmltopdf/)
179
+ expect(command).to contain %w[--page-size Letter]
180
+ expect(command).to contain %w[--toc-l1-font-size 12]
181
+ expect(command).to contain %w[--replace foo bar]
182
+ end
183
+
184
+ it "contains a specified by path argument" do
185
+ pdfkit = PDFKit.new('html')
186
+ command = pdfkit.command("/foo/bar")
187
+ expect(command.first).to match(/wkhtmltopdf/)
188
+ expect(command.last).to eq("/foo/bar")
189
+ end
190
+
191
+ it "contains a specified by path argument of Pathname" do
192
+ pdfkit = PDFKit.new('html')
193
+ command = pdfkit.command(Pathname.new("/foo/bar"))
194
+ expect(command.first).to match(/wkhtmltopdf/)
195
+ expect(command.last).to eq("/foo/bar")
180
196
  end
181
197
 
182
198
  it "sets up one cookie when hash has only one cookie" do
183
199
  pdfkit = PDFKit.new('html', cookie: {cookie_name: :cookie_value})
184
200
  command = pdfkit.command
185
- expect(command).to include "--cookie cookie_name cookie_value"
201
+ expect(command).to contain %w[--cookie cookie_name cookie_value]
186
202
  end
187
203
 
188
- it "does not break Windows paths" do
204
+ it "does not split Windows paths that contain spaces" do
189
205
  pdfkit = PDFKit.new('html')
190
206
  allow(PDFKit.configuration).to receive(:wkhtmltopdf).and_return 'c:/Program Files/wkhtmltopdf/wkhtmltopdf.exe'
191
- expect(pdfkit.command).not_to include('Program\ Files')
207
+ expect(pdfkit.command).not_to contain(%w[c:/Program Files/wkhtmltopdf/wkhtmltopdf.exe])
192
208
  end
193
209
 
194
210
  it "does not shell escape source URLs" do
@@ -205,15 +221,15 @@ describe PDFKit do
205
221
  it "sets up multiple cookies when passed multiple cookies" do
206
222
  pdfkit = PDFKit.new('html', :cookie => {:cookie_name1 => :cookie_val1, :cookie_name2 => :cookie_val2})
207
223
  command = pdfkit.command
208
- expect(command).to include "--cookie cookie_name1 cookie_val1"
209
- expect(command).to include "--cookie cookie_name2 cookie_val2"
224
+ expect(command).to contain %w[--cookie cookie_name1 cookie_val1]
225
+ expect(command).to contain %w[--cookie cookie_name2 cookie_val2]
210
226
  end
211
227
 
212
228
  it "sets up multiple cookies when passed an array of tuples" do
213
229
  pdfkit = PDFKit.new('html', :cookie => [[:cookie_name1, :cookie_val1], [:cookie_name2, :cookie_val2]])
214
230
  command = pdfkit.command
215
- expect(command).to include "--cookie cookie_name1 cookie_val1"
216
- expect(command).to include "--cookie cookie_name2 cookie_val2"
231
+ expect(command).to contain %w[--cookie cookie_name1 cookie_val1]
232
+ expect(command).to contain %w[--cookie cookie_name2 cookie_val2]
217
233
  end
218
234
 
219
235
  it "will not include default options it is told to omit" do
@@ -227,48 +243,57 @@ describe PDFKit do
227
243
  expect(pdfkit.command).not_to include('--disable-smart-shrinking')
228
244
  end
229
245
 
230
- it "encapsulates string arguments in quotes" do
246
+ it "must not split string arguments containing spaces" do
231
247
  pdfkit = PDFKit.new('html', :header_center => "foo [page]")
232
- expect(pdfkit.command).to include "--header-center foo\\ \\[page\\]"
248
+ expect(pdfkit.command).to contain ['--header-center', 'foo [page]']
233
249
  end
234
250
 
235
- it "sanitizes string arguments" do
251
+ it "paramatarizes string arguments" do
236
252
  pdfkit = PDFKit.new('html', :header_center => "$(ls)")
237
- expect(pdfkit.command).to include "--header-center \\$\\(ls\\)"
253
+ expect(pdfkit.command).to contain %w[--header-center $(ls)]
238
254
  end
239
255
 
240
256
  it "read the source from stdin if it is html" do
241
257
  pdfkit = PDFKit.new('html')
242
- expect(pdfkit.command).to match /- -$/
258
+ command = pdfkit.command
259
+ expect(command[-2]).to eq('-')
260
+ expect(command[-1]).to eq('-')
243
261
  end
244
262
 
245
263
  it "specifies the URL to the source if it is a url" do
246
264
  pdfkit = PDFKit.new('http://google.com')
247
- expect(pdfkit.command).to match /"http:\/\/google.com" -$/
265
+ command = pdfkit.command
266
+ expect(command[-2]).to eq("http://google.com")
267
+ expect(command[-1]).to eq("-")
248
268
  end
249
269
 
250
270
  it "does not break Windows paths" do
251
271
  pdfkit = PDFKit.new('html')
252
272
  allow(PDFKit.configuration).to receive(:wkhtmltopdf).and_return 'c:/Program Files/wkhtmltopdf/wkhtmltopdf.exe'
253
- expect(pdfkit.command).not_to include('Program\ Files')
273
+ expect(pdfkit.command).not_to contain ['Program', 'Files']
254
274
  end
255
275
 
256
276
  it "specifies the path to the source if it is a file" do
257
277
  file_path = File.join(SPEC_ROOT,'fixtures','example.html')
258
278
  pdfkit = PDFKit.new(File.new(file_path))
259
- expect(pdfkit.command).to match /#{file_path} -$/
279
+ command = pdfkit.command
280
+ expect(command[-2]).to eq(file_path)
281
+ expect(command[-1]).to eq('-')
260
282
  end
261
283
 
262
284
  it "specifies the path to the source if it is a tempfile" do
263
285
  file_path = File.join(SPEC_ROOT,'fixtures','example.html')
264
286
  pdfkit = PDFKit.new(Tempfile.new(file_path))
265
- expect(pdfkit.command).to match /#{Dir.tmpdir}\S+ -$/
287
+ command = pdfkit.command
288
+ expect(command[-2]).to start_with(Dir.tmpdir)
289
+ expect(command[-1]).to eq('-')
266
290
  end
267
291
 
268
292
  it "specifies the path for the ouput if a path is given" do
269
293
  file_path = "/path/to/output.pdf"
270
294
  pdfkit = PDFKit.new("html")
271
- expect(pdfkit.command(file_path)).to match /#{file_path}$/
295
+ command = pdfkit.command(file_path)
296
+ expect(command.last).to eq(file_path)
272
297
  end
273
298
 
274
299
  it "detects special pdfkit meta tags" do
@@ -282,8 +307,8 @@ describe PDFKit do
282
307
  }
283
308
  pdfkit = PDFKit.new(body)
284
309
  command = pdfkit.command
285
- expect(command).to include "--page-size Legal"
286
- expect(command).to include "--orientation Landscape"
310
+ expect(command).to contain %w[--page-size Legal]
311
+ expect(command).to contain %w[--orientation Landscape]
287
312
  end
288
313
 
289
314
  it "detects cookies meta tag" do
@@ -297,7 +322,7 @@ describe PDFKit do
297
322
  }
298
323
  pdfkit = PDFKit.new(body)
299
324
  command = pdfkit.command
300
- expect(command).to include "--cookie rails_session rails_session_value --cookie cookie_variable cookie_variable_value"
325
+ expect(command).to contain %w[--cookie rails_session rails_session_value --cookie cookie_variable cookie_variable_value]
301
326
  end
302
327
 
303
328
  it "detects disable_smart_shrinking meta tag" do
@@ -311,7 +336,7 @@ describe PDFKit do
311
336
  pdfkit = PDFKit.new(body)
312
337
  command = pdfkit.command
313
338
  expect(command).to include "--disable-smart-shrinking"
314
- expect(command).not_to include "--disable-smart-shrinking true"
339
+ expect(command).not_to contain %w[--disable-smart-shrinking true]
315
340
  end
316
341
 
317
342
  it "detects names with hyphens instead of underscores" do
@@ -340,8 +365,8 @@ describe PDFKit do
340
365
  }
341
366
  pdfkit = PDFKit.new(body)
342
367
  command = pdfkit.command
343
- expect(command).to include "--page-size Legal"
344
- expect(command).to include "--orientation Landscape"
368
+ expect(command).to contain %w[--page-size Legal]
369
+ expect(command).to contain %w[--orientation Landscape]
345
370
  end
346
371
 
347
372
  it "skips non-pdfkit meta tags" do
@@ -356,8 +381,8 @@ describe PDFKit do
356
381
  }
357
382
  pdfkit = PDFKit.new(body)
358
383
  command = pdfkit.command
359
- expect(command).not_to include "--page-size Legal"
360
- expect(command).to include "--orientation Landscape"
384
+ expect(command).not_to contain %w[--page-size Legal]
385
+ expect(command).to contain %w[--orientation Landscape]
361
386
  end
362
387
 
363
388
  it "does not use quiet when told to" do
@@ -420,14 +445,9 @@ describe PDFKit do
420
445
  allow(PDFKit::OS).to receive(:host_is_windows?).and_return(true)
421
446
  end
422
447
 
423
- it "escapes special windows characters" do
424
- pdf = PDFKit.new('html', :title => 'hello(world)')
425
- expect(pdf.command).to include 'hello^(world^)'
426
- end
427
-
428
448
  it "quotes spaces in options" do
429
449
  pdf = PDFKit.new('html', :title => 'hello world')
430
- expect(pdf.command).to include "--title 'hello world'"
450
+ expect(pdf.command).to contain ['--title', "hello world"]
431
451
  end
432
452
  end
433
453
  end
@@ -501,6 +521,14 @@ describe PDFKit do
501
521
  expect(pdfkit.source.to_s).to include("<style>#{File.read(css)}</style></head>")
502
522
  end
503
523
 
524
+ it "can deal with ActiveSupport::SafeBuffer if the HTML doesn't have a head tag" do
525
+ pdfkit = PDFKit.new(ActiveSupport::SafeBuffer.new "<html><body>Hai!</body></html>")
526
+ css = File.join(SPEC_ROOT,'fixtures','example.css')
527
+ pdfkit.stylesheets << css
528
+ pdfkit.to_pdf
529
+ expect(pdfkit.source.to_s).to include("<style>#{File.read(css)}</style>")
530
+ end
531
+
504
532
  it "escapes \\X in stylesheets" do
505
533
  pdfkit = PDFKit.new("<html><head></head><body>Hai!</body></html>")
506
534
  css = File.join(SPEC_ROOT,'fixtures','example_with_hex_symbol.css')
data/spec/source_spec.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe PDFKit::Source do
@@ -73,14 +75,14 @@ describe PDFKit::Source do
73
75
  end
74
76
 
75
77
  describe "#to_input_for_command" do
76
- it "URI escapes source URLs and encloses them in quotes to accomodate ampersands" do
77
- source = PDFKit::Source.new("https://www.google.com/search?q='cat<dev/zero>/dev/null'")
78
- expect(source.to_input_for_command).to eq "\"https://www.google.com/search?q='cat%3Cdev/zero%3E/dev/null'\""
78
+ it "URI escapes source URI" do
79
+ source = PDFKit::Source.new("https://www.google.com/search?q=foo bar")
80
+ expect(source.to_input_for_command).to eq "https://www.google.com/search?q=foo%20bar"
79
81
  end
80
82
 
81
83
  it "does not URI escape previously escaped source URLs" do
82
- source = PDFKit::Source.new("https://www.google.com/search?q='cat%3Cdev/zero%3E/dev/null'")
83
- expect(source.to_input_for_command).to eq "\"https://www.google.com/search?q='cat%3Cdev/zero%3E/dev/null'\""
84
+ source = PDFKit::Source.new("https://www.google.com/search?q=foo%20bar")
85
+ expect(source.to_input_for_command).to eq "https://www.google.com/search?q=foo%20bar"
84
86
  end
85
87
 
86
88
  it "returns a '-' for HTML strings to indicate that we send that content through STDIN" do
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  SPEC_ROOT = File.dirname(__FILE__)
2
4
  $LOAD_PATH.unshift(SPEC_ROOT)
3
5
  $LOAD_PATH.unshift(File.join(SPEC_ROOT, '..', 'lib'))
@@ -6,14 +8,26 @@ SimpleCov.start do
6
8
  add_filter 'spec/'
7
9
  end
8
10
 
11
+ Warning[:deprecated] = true if defined?(Warning.[]=)
12
+
9
13
  require 'pdfkit'
10
14
  require 'rspec'
11
15
  require 'mocha'
12
16
  require 'rack'
13
17
  require 'rack/test'
14
18
  require 'active_support'
15
- require 'custom_wkhtmltopdf_path' if File.exists?(File.join(SPEC_ROOT, 'custom_wkhtmltopdf_path.rb'))
19
+ require 'custom_wkhtmltopdf_path' if File.exist?(File.join(SPEC_ROOT, 'custom_wkhtmltopdf_path.rb'))
16
20
 
17
21
  RSpec.configure do |config|
18
22
  include Rack::Test::Methods
19
23
  end
24
+
25
+ RSpec::Matchers.define :contain do |expected|
26
+ match do |actual|
27
+ (0..(actual.length - expected.length)).any? do |base_index|
28
+ expected.each_with_index.all? do |expected_element,index|
29
+ actual[base_index+index] == expected_element
30
+ end
31
+ end
32
+ end
33
+ end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pdfkit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.4.3.2
4
+ version: 0.8.7.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jared Pace
8
8
  - Relevance
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2020-08-16 00:00:00.000000000 Z
12
+ date: 2023-05-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -57,28 +57,28 @@ dependencies:
57
57
  name: rake
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
- - - "~>"
60
+ - - ">="
61
61
  - !ruby/object:Gem::Version
62
62
  version: 12.3.3
63
63
  type: :development
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
- - - "~>"
67
+ - - ">="
68
68
  - !ruby/object:Gem::Version
69
69
  version: 12.3.3
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: rdoc
72
72
  requirement: !ruby/object:Gem::Requirement
73
73
  requirements:
74
- - - "~>"
74
+ - - ">="
75
75
  - !ruby/object:Gem::Version
76
76
  version: 4.0.1
77
77
  type: :development
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
- - - "~>"
81
+ - - ">="
82
82
  - !ruby/object:Gem::Version
83
83
  version: 4.0.1
84
84
  - !ruby/object:Gem::Dependency
@@ -105,6 +105,7 @@ files:
105
105
  - ".document"
106
106
  - ".github/workflows/release-drafter.yml"
107
107
  - ".github/workflows/stale.yml"
108
+ - ".github/workflows/test.yml"
108
109
  - ".gitignore"
109
110
  - ".rspec"
110
111
  - ".ruby-gemset"
@@ -140,7 +141,7 @@ homepage: https://github.com/pdfkit/pdfkit
140
141
  licenses:
141
142
  - MIT
142
143
  metadata: {}
143
- post_install_message:
144
+ post_install_message:
144
145
  rdoc_options: []
145
146
  require_paths:
146
147
  - lib
@@ -148,7 +149,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
148
149
  requirements:
149
150
  - - ">="
150
151
  - !ruby/object:Gem::Version
151
- version: '0'
152
+ version: '2.5'
152
153
  required_rubygems_version: !ruby/object:Gem::Requirement
153
154
  requirements:
154
155
  - - ">="
@@ -156,8 +157,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
156
157
  version: '0'
157
158
  requirements:
158
159
  - wkhtmltopdf
159
- rubygems_version: 3.0.3
160
- signing_key:
160
+ rubygems_version: 3.0.3.1
161
+ signing_key:
161
162
  specification_version: 4
162
163
  summary: HTML+CSS -> PDF
163
164
  test_files: