pdfinfo 1.0.3 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8de9b34e6b07e216baf33dd87f483e41edf284c1
4
- data.tar.gz: 20f286868afbde83b138c3a780d626f7b15e2c8b
3
+ metadata.gz: 23b45e11649bee36c2f385cb0306bfea02176fea
4
+ data.tar.gz: 787ac72eb44158aa770b988e27bb1b77056ce36b
5
5
  SHA512:
6
- metadata.gz: 1649532afbe24edf37248f94afe1c57724f0ac4f4a1aa187cff31bb4ce73b7d2ffea93f1360e4c1112fca35b328d445f1e6ac4017c6310bc3b1acb92d22cf08d
7
- data.tar.gz: 3d667764447ec721ac6444b83fd4632340a0201f72b5f2dde5441520f4e77753cd5fcc2327f6ab6f6ff81699eb453cec2c083a3e07189ba4fcb99ac0104e2516
6
+ metadata.gz: 11b841bf60de8835e2b9338781f07fa871f584f65c3849e1694bdc0fd46fcd626ec6a02160902f8516853b51f6cdb7930cb574f5b2119465f48d8fbfdaa8a75e
7
+ data.tar.gz: 21411e292115d76a446410ee38e6db9c4be9090bc972ed754d6e92aa18a113ceec1bf8d961c12f3f600a7ea4dac0a967eb5be8010420eb7a0b0f935e51bc9ecd
data/lib/pdfinfo.rb CHANGED
@@ -4,6 +4,16 @@ require 'shellwords'
4
4
  class Pdfinfo
5
5
  DIMENSIONS_REGEXP = /([\d\.]+) x ([\d\.]+)/
6
6
 
7
+ class PdfinfoError < ::StandardError
8
+ end
9
+
10
+ class CommandNotFound < PdfinfoError
11
+ def initialize(command)
12
+ super("Command Not Found - '#{command}'")
13
+ end
14
+ end
15
+
16
+
7
17
  attr_reader :title,
8
18
  :subject,
9
19
  :keywords,
@@ -20,14 +30,15 @@ class Pdfinfo
20
30
  :pdf_version
21
31
 
22
32
  def self.exec(file_path, opts = {})
33
+ raise CommandNotFound, 'pdfinfo' unless pdfinfo_command?
23
34
  flags = []
24
35
  flags.concat(['-enc', opts.fetch(:encoding, 'UTF-8')])
25
36
  flags.concat(['-opw', opts[:owner_password]]) if opts[:owner_password]
26
37
  flags.concat(['-upw', opts[:user_password]]) if opts[:user_password]
27
38
 
28
- command = Shellwords.join([pdfinfo_command, *flags, file_path])
39
+ command = Shellwords.join([pdfinfo_command, *flags, file_path.to_s])
29
40
  stdout, status = Open3.capture2(command)
30
- stdout.encode('UTF-8', invalid: :replace, replace: '')
41
+ stdout.encode('UTF-8', invalid: :replace, replace: '', undef: :replace)
31
42
  end
32
43
 
33
44
  def self.pdfinfo_command
@@ -38,6 +49,10 @@ class Pdfinfo
38
49
  @pdfinfo_command = cmd
39
50
  end
40
51
 
52
+ def self.pdfinfo_command?
53
+ system("type #{pdfinfo_command} >/dev/null 2>&1")
54
+ end
55
+
41
56
  def initialize(source_path, opts = {})
42
57
  info_hash = parse_shell_response(Pdfinfo.exec(source_path, opts))
43
58
 
@@ -53,7 +68,7 @@ class Pdfinfo
53
68
  @form = info_hash['Form']
54
69
  @pdf_version = info_hash['PDF version']
55
70
 
56
- @keywords = (info_hash['Keywords'] || "").split(/\s/)
71
+ @keywords = (info_hash['Keywords'] || '').split(/\s/)
57
72
  @creation_date = presence(info_hash['CreationDate']) ? Time.parse(info_hash['CreationDate']) : nil
58
73
 
59
74
  raw_usage_rights = Hash[info_hash['Encrypted'].scan(/(\w+):(\w+)/)]
@@ -77,16 +92,8 @@ class Pdfinfo
77
92
  @encrypted
78
93
  end
79
94
 
80
- def printable?
81
- @usage_rights[:print]
82
- end
83
-
84
- def copyable?
85
- @usage_rights[:copy]
86
- end
87
-
88
- def changeable?
89
- @usage_rights[:change]
95
+ %w(print copy change).each do |ur|
96
+ define_method("#{ur}able?") { @usage_rights[ur.to_sym] }
90
97
  end
91
98
  alias modifiable? changeable?
92
99
 
@@ -98,6 +105,7 @@ class Pdfinfo
98
105
  def presence(val)
99
106
  (val.nil? || val.empty?) ? nil : val
100
107
  end
108
+
101
109
  def parse_shell_response(response_str)
102
110
  Hash[response_str.split(/\n/).map {|kv| kv.split(/:/, 2).map(&:strip) }]
103
111
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pdfinfo
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Venegas
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-27 00:00:00.000000000 Z
11
+ date: 2014-11-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,31 +66,28 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: coveralls
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  description: Simple ruby wrapper around the pdfinfo executable
70
- email:
71
- - RVenegas2@Gmail.com
84
+ email: rvenegas2@gmail.com
72
85
  executables: []
73
86
  extensions: []
74
87
  extra_rdoc_files: []
75
88
  files:
76
- - ".gitignore"
77
- - ".rake_tasks~"
78
- - ".rspec"
79
- - ".ruby-gemset"
80
- - ".ruby-version"
81
- - Gemfile
82
- - LICENSE.txt
83
- - README.md
84
- - Rakefile
85
89
  - lib/pdfinfo.rb
86
- - lib/pdfinfo/version.rb
87
- - lib/tasks/generate_pdf.rake
88
- - pdfinfo.gemspec
89
- - spec/fixtures/shell_responses/encrypted.txt
90
- - spec/fixtures/shell_responses/test.txt
91
- - spec/pdfinfo_spec.rb
92
- - spec/spec_helper.rb
93
- homepage: ''
90
+ homepage: https://github.com/RyanV/pdfinfo
94
91
  licenses:
95
92
  - MIT
96
93
  metadata: {}
@@ -102,7 +99,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
102
99
  requirements:
103
100
  - - ">="
104
101
  - !ruby/object:Gem::Version
105
- version: '0'
102
+ version: 1.9.3
106
103
  required_rubygems_version: !ruby/object:Gem::Requirement
107
104
  requirements:
108
105
  - - ">="
@@ -110,12 +107,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
110
107
  version: '0'
111
108
  requirements: []
112
109
  rubyforge_project:
113
- rubygems_version: 2.2.2
110
+ rubygems_version: 2.4.4
114
111
  signing_key:
115
112
  specification_version: 4
116
113
  summary: Simple ruby wrapper around the pdfinfo executable
117
- test_files:
118
- - spec/fixtures/shell_responses/encrypted.txt
119
- - spec/fixtures/shell_responses/test.txt
120
- - spec/pdfinfo_spec.rb
121
- - spec/spec_helper.rb
114
+ test_files: []
data/.gitignore DELETED
@@ -1,24 +0,0 @@
1
- *.gem
2
- *.rbc
3
- .bundle
4
- .config
5
- .yardoc
6
- Gemfile.lock
7
- InstalledFiles
8
- _yardoc
9
- coverage
10
- doc/
11
- lib/bundler/man
12
- pkg
13
- rdoc
14
- spec/reports
15
- test/tmp
16
- test/version_tmp
17
- tmp
18
- *.bundle
19
- *.so
20
- *.o
21
- *.a
22
- mkmf.log
23
- .idea
24
- spec/fixtures/pdfs/*
data/.rake_tasks~ DELETED
@@ -1,5 +0,0 @@
1
- build
2
- generate_pdf
3
- install
4
- release
5
- spec
data/.rspec DELETED
@@ -1,3 +0,0 @@
1
- --color
2
- --format documentation
3
- --require spec_helper
data/.ruby-gemset DELETED
@@ -1 +0,0 @@
1
- pdfinfo
data/.ruby-version DELETED
@@ -1 +0,0 @@
1
- 2.1.2
data/Gemfile DELETED
@@ -1,3 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gemspec
data/LICENSE.txt DELETED
@@ -1,22 +0,0 @@
1
- Copyright (c) 2014 Ryan Venegas
2
-
3
- MIT License
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining
6
- a copy of this software and associated documentation files (the
7
- "Software"), to deal in the Software without restriction, including
8
- without limitation the rights to use, copy, modify, merge, publish,
9
- distribute, sublicense, and/or sell copies of the Software, and to
10
- permit persons to whom the Software is furnished to do so, subject to
11
- the following conditions:
12
-
13
- The above copyright notice and this permission notice shall be
14
- included in all copies or substantial portions of the Software.
15
-
16
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md DELETED
@@ -1,92 +0,0 @@
1
- # Pdfinfo
2
-
3
- Simple ruby wrapper around the pdfinfo command.
4
- This gem was written and tested around xpdf version 3.04.
5
-
6
-
7
- ## Depdendecies
8
-
9
- usage of this gem assumes that you have xpdf installed (which gives us access to the pdfinfo command). The fastest way to install xpdf:
10
-
11
- $ brew install xpdf
12
-
13
- ## Installation
14
-
15
- Add this line to your application's Gemfile:
16
-
17
- gem 'pdfinfo', '~> 1.0.0'
18
-
19
- And then execute:
20
-
21
- $ bundle
22
-
23
- Or install it yourself as:
24
-
25
- $ gem install pdfinfo
26
-
27
- ## Usage
28
-
29
-
30
- ```ruby
31
- pdfinfo = Pdfinfo.new("path/to/file.pdf")
32
-
33
- pdfinfo.title #=> "Title" # or nil
34
- pdfinfo.subject #=> "Subject" # or nil
35
- pdfinfo.keywords #=> ["Keyword1", "Keyword2"] # or nil
36
- pdfinfo.author #=> "Author Name" # or nil
37
- pdfinfo.creator #=> "Creator Name" # or nil
38
- pdfinfo.producer #=> "Producer Name" # or nil
39
- ddfinfo.creation_date #=> 2014-10-26 20:50:45 -0700 # Time object
40
- pdfinfo.form #=> "none"
41
- pdfinfo.page_count #=> 3
42
- pdfinfo.width #=> 612
43
- pdfinfo.height #=> 792
44
- pdfinfo.size #=> 1521 # file size in bytes
45
- pdfinfo.pdf_version #=> "1.3"
46
- pdfinfo.encrypted? #=> false # or true
47
- pdfinfo.usage_rights #=> {print: true, copy: true, change: true, add_notes: true}
48
- pdfinfo.printable? #=> true # or false
49
- pdfinfo.copyable? #=> true # or false
50
- pdfinfo.changeable? #=> true # or false
51
- pdfinfo.modifiable? #=> true # or false. alias for #changeable?
52
- pdfinfo.annotatable? #=> true # or false
53
- pdfinfo.tagged? #=> false # or true
54
- ```
55
- For encrypted files with a password you can pass in the user or owner password as options
56
-
57
- ```ruby
58
- pdfinfo = Pdfinfo.new("path/to/encrypted.pdf", user_password: 'foo')
59
- # pdfinfo = Pdfinfo.new("path/to/encrypted.pdf", owner_password: 'foo')
60
- pdfinfo.encrypted? #=> true
61
- pdfinfo.usage_rights #=> {print: false, copy: false, change: false, add_notes: false}
62
- ```
63
-
64
- You can directly set the location of the executable if its not located in your environment $PATH or you just want to point to a different location.
65
-
66
- ```ruby
67
- Pdfinfo.pdfinfo_command = '/another/bin/path/pdfinfo'
68
- Pdfinfo.pdfinfo_command #=> '/another/bin/path/pdfinfo'
69
- ```
70
-
71
- ## Running specs
72
-
73
- generate pdf fixtures by first running
74
-
75
- $ rake generate_fixtures
76
-
77
- Then run specs by running
78
-
79
- $ rake
80
-
81
- ## Contributing
82
-
83
- 1. Fork it ( https://github.com/[my-github-username]/pdfinfo/fork )
84
- 2. Create your feature branch (`git checkout -b my-new-feature`)
85
- 3. Commit your changes (`git commit -am 'Add some feature'`)
86
- 4. Push to the branch (`git push origin my-new-feature`)
87
- 5. Create a new Pull Request
88
-
89
- ## TODO
90
- * Error handling
91
- * type coersion is getting messy in initialize. refactor.
92
- * Add #to_hash/#to_h/#as_json method to output all metadata as a hash
data/Rakefile DELETED
@@ -1,8 +0,0 @@
1
- require "bundler/gem_tasks"
2
-
3
- require 'rspec/core/rake_task'
4
- RSpec::Core::RakeTask.new(:spec)
5
-
6
- task :default => :spec
7
-
8
- load File.expand_path("../lib/tasks/generate_pdf.rake", __FILE__)
@@ -1,3 +0,0 @@
1
- class Pdfinfo
2
- VERSION = '1.0.3'
3
- end
@@ -1,56 +0,0 @@
1
- require 'time'
2
-
3
- desc 'generates pdf for testing'
4
- task :generate_fixtures do
5
- class PdfGenerator
6
- ROOT_DIR = File.expand_path("../../..", __FILE__)
7
- METADATA_OPTIONS = {
8
- Title: "Pdfinfo Title",
9
- Author: "Pdfinfo Author",
10
- Subject: "Pdfinfo Subject",
11
- Keywords: "Keyword1 Keyword2",
12
- Creator: "Pdfinfo Creator",
13
- Producer: "Pdfinfo Producer",
14
- CreationDate: Time.parse("2014-10-26 18:23:25 -0700")
15
- }
16
- ENCRYPTION_PERMISSIONS = {
17
- print_document: false,
18
- modify_contents: false,
19
- copy_contents: false,
20
- modify_annotations: false
21
- }
22
- ENCRYPTION_OPTIONS = {
23
- user_password: 'foo',
24
- owner_password: 'bar',
25
- permissions: ENCRYPTION_PERMISSIONS
26
- }
27
-
28
- def self.generate(dest_path, opts = {})
29
- new(opts).write_to(dest_path)
30
- end
31
-
32
- def initialize(opts = {})
33
- @encryption = opts[:encryption]
34
- end
35
-
36
- # @param [String] dest_path path relative to gem root directory to write file to
37
- def write_to(dest_path)
38
- require 'prawn'
39
-
40
- dest_path = File.join(ROOT_DIR, dest_path)
41
-
42
- Prawn::Document.generate(dest_path, skip_page_creation: true, info: METADATA_OPTIONS, page_size: 'A4') do |pdf|
43
- 1.upto(5) do |n|
44
- pdf.start_new_page
45
- pdf.text("Page #{n}")
46
- end
47
-
48
- pdf.encrypt_document(ENCRYPTION_OPTIONS) if @encryption
49
- end
50
- end
51
- end
52
-
53
-
54
- PdfGenerator.generate("spec/fixtures/pdfs/test.pdf")
55
- PdfGenerator.generate("spec/fixtures/pdfs/encrypted.pdf", encryption: true)
56
- end
data/pdfinfo.gemspec DELETED
@@ -1,24 +0,0 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'pdfinfo/version'
5
-
6
- Gem::Specification.new do |spec|
7
- spec.name = "pdfinfo"
8
- spec.version = Pdfinfo::VERSION
9
- spec.authors = ["Ryan Venegas"]
10
- spec.email = ["RVenegas2@Gmail.com"]
11
- spec.summary = %q{Simple ruby wrapper around the pdfinfo executable}
12
- spec.description = %q{Simple ruby wrapper around the pdfinfo executable}
13
- spec.homepage = ""
14
- spec.license = "MIT"
15
-
16
- spec.files = `git ls-files -z`.split("\x0")
17
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
- spec.require_paths = ["lib"]
19
-
20
- spec.add_development_dependency "bundler", "~> 1.6"
21
- spec.add_development_dependency "prawn"
22
- spec.add_development_dependency "rspec", '~> 3.1.0'
23
- spec.add_development_dependency "rake"
24
- end
@@ -1,15 +0,0 @@
1
- Title: Pdfinfo Title
2
- Subject: Pdfinfo Subject
3
- Keywords: Keyword1 Keyword2
4
- Author: Pdfinfo Author
5
- Creator: Pdfinfo Creator
6
- Producer: Pdfinfo Producer
7
- CreationDate: Sun Oct 26 18:23:25 2014
8
- Tagged: no
9
- Form: none
10
- Pages: 5
11
- Encrypted: yes (print:no copy:no change:no addNotes:no)
12
- Page size: 595.28 x 841.89 pts (A4) (rotated 0 degrees)
13
- File size: 2861 bytes
14
- Optimized: no
15
- PDF version: 1.3
@@ -1,15 +0,0 @@
1
- Title: Pdfinfo Title
2
- Subject: Pdfinfo Subject
3
- Keywords: Keyword1 Keyword2
4
- Author: Pdfinfo Author
5
- Creator: Pdfinfo Creator
6
- Producer: Pdfinfo Producer
7
- CreationDate: Sun Oct 26 18:23:25 2014
8
- Tagged: no
9
- Form: none
10
- Pages: 5
11
- Encrypted: no
12
- Page size: 595.28 x 841.89 pts (A4) (rotated 0 degrees)
13
- File size: 2867 bytes
14
- Optimized: no
15
- PDF version: 1.3
data/spec/pdfinfo_spec.rb DELETED
@@ -1,309 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe Pdfinfo do
4
- let(:pdf_path) { fixture_path('pdfs/test.pdf') }
5
- let(:pdfinfo) { described_class.new(pdf_path) }
6
- let(:encrypted_response) { File.read(fixture_path('shell_responses/encrypted.txt')).chomp }
7
- let(:unencrypted_response) { File.read(fixture_path('shell_responses/test.txt')).chomp }
8
- let(:mock_response) { unencrypted_response }
9
-
10
-
11
- def modified_response(response, key, new_value = '')
12
- response.sub(/(?<=#{key}:)(.+)$/, new_value)
13
- end
14
-
15
- before(:each) do |ex|
16
- unless ex.metadata[:skip_mock_response]
17
- allow(Open3).to receive(:capture2).and_return([mock_response, nil])
18
- end
19
- end
20
-
21
- specify "mock responses match", :skip_mock_response do
22
- expect(`pdfinfo -upw foo #{fixture_path('pdfs/encrypted.pdf')}`.chomp).to eq(encrypted_response)
23
- expect(`pdfinfo #{fixture_path('pdfs/test.pdf')}`.chomp).to eq(unencrypted_response)
24
- end
25
-
26
- describe '.pdfinfo_command' do
27
- it "falls back to pdfinfo" do
28
- Pdfinfo.pdfinfo_command = nil
29
- expect(Pdfinfo.pdfinfo_command).to eq('pdfinfo')
30
- end
31
-
32
- it 'allows the command to be changed' do
33
- Pdfinfo.pdfinfo_command = '/another/bin/path/pdfinfo'
34
- expect(Pdfinfo.pdfinfo_command).to eq('/another/bin/path/pdfinfo')
35
- end
36
- end
37
-
38
- describe '.exec' do
39
- context 'with no options given' do
40
- it 'runs the pdfinfo command without flags' do
41
- expect(Open3).to receive(:capture2).with("pdfinfo -enc UTF-8 path/to/file.pdf")
42
- Pdfinfo.new("path/to/file.pdf")
43
- end
44
- end
45
-
46
- context "passing in :user_password" do
47
- it 'runs the pdfinfo command passing the user password flag' do
48
- expect(Open3).to receive(:capture2).with("pdfinfo -enc UTF-8 -upw foo path/to/file.pdf")
49
- Pdfinfo.new("path/to/file.pdf", user_password: 'foo')
50
- end
51
- end
52
- context 'passing in :owner_password' do
53
- it 'runs the pdfinfo command passing the user password flag' do
54
- expect(Open3).to receive(:capture2).with("pdfinfo -enc UTF-8 -opw bar path/to/file.pdf")
55
- Pdfinfo.new("path/to/file.pdf", owner_password: 'bar')
56
- end
57
- end
58
-
59
- context "when passed a path with spaces" do
60
- it 'should escape the file path' do
61
- expect(Open3).to receive(:capture2).with("pdfinfo -enc UTF-8 path/to/file\\ with\\ spaces.pdf")
62
- Pdfinfo.new("path/to/file with spaces.pdf")
63
- end
64
- end
65
- end
66
-
67
- describe '#title' do
68
- context 'when given a title' do
69
- it 'returns the title' do
70
- expect(pdfinfo.title).to eq('Pdfinfo Title')
71
- end
72
- end
73
- context 'when title is not present' do
74
- let(:mock_response) { modified_response(unencrypted_response, 'Title', '') }
75
- it 'returns nil' do
76
- expect(pdfinfo.title).to be_nil
77
- end
78
- end
79
- end
80
-
81
- describe '#subject' do
82
- context 'when given a subject' do
83
- it 'returns the subject' do
84
- expect(pdfinfo.subject).to eq('Pdfinfo Subject')
85
- end
86
- end
87
- context 'when subject value is not present' do
88
- let(:mock_response) { modified_response(unencrypted_response, 'Subject', '') }
89
- it 'returns nil' do
90
- expect(pdfinfo.subject).to be_nil
91
- end
92
- end
93
- context 'when subject key is not present' do
94
- let(:mock_response) { unencrypted_response.sub(/^Subject.*\n/, '') }
95
- it 'returns nil' do
96
- expect(pdfinfo.subject).to be_nil
97
- end
98
- end
99
- end
100
-
101
- describe '#keywords' do
102
- context 'when given keywords' do
103
- it 'returns the keywords' do
104
- expect(pdfinfo.keywords).to eq(['Keyword1', 'Keyword2'])
105
- end
106
- end
107
- context 'when keywords value is not present' do
108
- let(:mock_response) { modified_response(unencrypted_response, 'Keywords', '') }
109
- it 'returns an empty array' do
110
- expect(pdfinfo.keywords).to eq([])
111
- end
112
- end
113
- context 'when keywords key is not present' do
114
- let(:mock_response) { unencrypted_response.sub(/^Keywords.*\n/, '') }
115
- it 'returns an empty array' do
116
- expect(pdfinfo.keywords).to eq([])
117
- end
118
- end
119
- end
120
-
121
- describe '#author' do
122
- context 'when given an author' do
123
- it 'returns the author' do
124
- expect(pdfinfo.author).to eq('Pdfinfo Author')
125
- end
126
- end
127
- context 'when author is not present' do
128
- let(:mock_response) { modified_response(unencrypted_response, 'Author', '') }
129
- it 'returns nil' do
130
- expect(pdfinfo.author).to be_nil
131
- end
132
- end
133
- end
134
-
135
- describe '#creation_date' do
136
- context 'when given an author' do
137
- it 'returns a time object' do
138
- expect(pdfinfo.creation_date).to be_an_instance_of(Time)
139
- end
140
- it 'returns the time correctly parsed' do
141
- expect(pdfinfo.creation_date).to eq(Time.parse("2014-10-26 18:23:25 -0700"))
142
- end
143
- end
144
- context 'when creation date value is not present' do
145
- let(:mock_response) { modified_response(unencrypted_response, 'CreationDate', '') }
146
- it 'returns nil' do
147
- expect(pdfinfo.creation_date).to be_nil
148
- end
149
- end
150
- context 'when creation date key is not present' do
151
- let(:mock_response) { unencrypted_response.sub(/^CreationDate.*\n/, '') }
152
- it 'returns nil' do
153
- expect(pdfinfo.creation_date).to be_nil
154
- end
155
- end
156
- end
157
-
158
- describe '#creator' do
159
- context 'when given a creator' do
160
- it { expect(pdfinfo.creator).to eq('Pdfinfo Creator') }
161
- end
162
- context 'when creator is not present' do
163
- let(:mock_response) { modified_response(unencrypted_response, 'Creator', '') }
164
- it { expect(pdfinfo.creator).to be_nil }
165
- end
166
- end
167
-
168
- describe '#producer' do
169
- context 'when given a creator' do
170
- it { expect(pdfinfo.producer).to eq('Pdfinfo Producer') }
171
- end
172
- context 'when creator is not present' do
173
- let(:mock_response) { modified_response(unencrypted_response, 'Producer', '') }
174
- it { expect(pdfinfo.producer).to be_nil }
175
- end
176
- end
177
-
178
- describe '#tagged?' do
179
- context 'when tagged' do
180
- let(:mock_response) { modified_response(unencrypted_response, 'Tagged', 'yes') }
181
- it { expect(pdfinfo.tagged?).to eq(true) }
182
- end
183
- context 'when not tagged' do
184
- let(:mock_response) { modified_response(unencrypted_response, 'Tagged', 'no') }
185
- it { expect(pdfinfo.tagged?).to eq(false) }
186
- end
187
- end
188
-
189
- describe '#form' do
190
- it { expect(pdfinfo.form).to eq('none') }
191
- end
192
-
193
- describe '#page_count' do
194
- it 'returns a fixnum value of the number of pages' do
195
- expect(pdfinfo.page_count).to eq(5)
196
- end
197
- end
198
-
199
- describe '#encrypted?' do
200
- context 'given encrypted pdf' do
201
- let(:mock_response) { encrypted_response }
202
- it { expect(pdfinfo.encrypted?).to eq(true) }
203
- end
204
- context 'given unencrypted pdf' do
205
- let(:mock_response) { unencrypted_response }
206
- it { expect(pdfinfo.encrypted?).to eq(false) }
207
- end
208
- end
209
-
210
- describe '#usage_rights' do
211
- context 'given encrypted pdf (all flags off)' do
212
- let(:mock_response) { encrypted_response }
213
- it 'returns a permissions hash' do
214
- expect(pdfinfo.usage_rights).to eq({
215
- print: false,
216
- copy: false,
217
- change: false,
218
- add_notes: false
219
- })
220
- end
221
- end
222
- context 'given unencrypted pdf' do
223
- let(:mock_response) { unencrypted_response }
224
- it 'returns a permissions hash' do
225
- expect(pdfinfo.usage_rights).to eq({
226
- print: true,
227
- copy: true,
228
- change: true,
229
- add_notes: true
230
- })
231
- end
232
- end
233
- end
234
-
235
- describe '#printable?' do
236
- context 'given a pdf that is printable' do
237
- let(:mock_response) { unencrypted_response }
238
- it { expect(pdfinfo.printable?).to eq(true) }
239
- end
240
- context 'given a pdf that is not printable' do
241
- let(:mock_response) { encrypted_response }
242
- it { expect(pdfinfo.printable?).to eq(false) }
243
- end
244
- end
245
-
246
- describe '#copyable?' do
247
- context 'given a pdf that is copyable' do
248
- let(:mock_response) { unencrypted_response }
249
- it { expect(pdfinfo.copyable?).to eq(true) }
250
- end
251
- context 'given a pdf that is not copyable' do
252
- let(:mock_response) { encrypted_response }
253
- it { expect(pdfinfo.copyable?).to eq(false) }
254
- end
255
- end
256
-
257
- describe '#changeable?' do
258
- context 'given a pdf that is changeable' do
259
- let(:mock_response) { unencrypted_response }
260
- it { expect(pdfinfo.changeable?).to eq(true) }
261
- end
262
- context 'given a pdf that is not changeable' do
263
- let(:mock_response) { encrypted_response }
264
- it { expect(pdfinfo.changeable?).to eq(false) }
265
- end
266
- end
267
-
268
- describe "#modifiable? (alias to changeable?)" do
269
- context 'given a pdf that is changeable' do
270
- let(:mock_response) { unencrypted_response }
271
- it { expect(pdfinfo.modifiable?).to eq(true) }
272
- end
273
- context 'given a pdf that is not changeable' do
274
- let(:mock_response) { encrypted_response }
275
- it { expect(pdfinfo.modifiable?).to eq(false) }
276
- end
277
- end
278
-
279
- describe '#annotatable?' do
280
- context 'given a pdf that is annotatable' do
281
- let(:mock_response) { unencrypted_response }
282
- it { expect(pdfinfo.annotatable?).to eq(true) }
283
- end
284
- context 'given a pdf that is not annotatable' do
285
- let(:mock_response) { encrypted_response }
286
- it { expect(pdfinfo.annotatable?).to eq(false) }
287
- end
288
- end
289
-
290
- describe '#width' do
291
- it { expect(pdfinfo.width).to eq(595.28) }
292
- end
293
-
294
- describe '#height' do
295
- it { expect(pdfinfo.height).to eq(841.89) }
296
- end
297
-
298
- describe '#size' do
299
- it 'returns a fixnm value for the file size in bytes' do
300
- expect(pdfinfo.file_size).to eq(2867)
301
- end
302
- end
303
-
304
- describe '#pdf_version' do
305
- it 'returns a string value for the PDF spec version' do
306
- expect(pdfinfo.pdf_version).to eq('1.3')
307
- end
308
- end
309
- end
data/spec/spec_helper.rb DELETED
@@ -1,36 +0,0 @@
1
- require File.expand_path("#{__dir__}/../lib/pdfinfo")
2
-
3
- RSpec.configure do |config|
4
- config.expect_with :rspec do |expectations|
5
- # expectations.include_chain_clauses_in_custom_matcher_descriptions = true
6
- end
7
-
8
- config.mock_with :rspec do |mocks|
9
- mocks.verify_partial_doubles = true
10
- end
11
-
12
- config.filter_run :focus
13
- config.run_all_when_everything_filtered = true
14
-
15
- config.disable_monkey_patching!
16
-
17
- config.warnings = false
18
-
19
- if config.files_to_run.one?
20
- config.default_formatter = 'doc'
21
- end
22
-
23
- # config.profile_examples = 10
24
-
25
- config.order = :random
26
-
27
- Kernel.srand config.seed
28
-
29
- config.before(:each) do
30
- Pdfinfo.instance_variable_set(:@pdfinfo_command, nil)
31
- end
32
- end
33
-
34
- def fixture_path(path)
35
- Pathname.new(File.expand_path(File.join("../fixtures", path), __FILE__))
36
- end