pdfmd 1.4.3 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +14 -0
- data/README.md +16 -6
- data/Rakefile +141 -0
- data/lib/pdfmd/explain.hiera.md +9 -2
- data/lib/pdfmd/rename.rb +81 -13
- data/lib/pdfmd/sort.rb +68 -21
- data/lib/pdfmd.rb +55 -23
- data/lib/string_extend.rb +25 -0
- data/pdfmd.gemspec +5 -5
- data/test/test_default.pdf +0 -0
- data/test/test_rename.rb +72 -0
- data/test/test_show.rb +45 -0
- data/test/test_sort.rb +97 -0
- metadata +40 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 71b69c4e8462e3e8e9b8fe27df5fc9b6a472292b
|
4
|
+
data.tar.gz: 55cb0726b99937d3cbaad55bb803d8c652315f4c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 01a4b983e7eaaade73851e51d8193ad5e3c6911db00f87852b816c0848b2d0042c3acc651419e1d77226129582691d544fef85cce4395eb665fa51274eee7d64
|
7
|
+
data.tar.gz: 87b8640a0b5c3a1286a5fcd214afdc01c2c1f72a07a996da93a50603caa13a20699e6d907dcd18c03344266d686e7dc934114b93289e2e200da006b8506d5e4a
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
# Version 1.5.0
|
2
|
+
- Added option 'dryrun' to command 'sort'.
|
3
|
+
- Added option 'logfilepath' to command 'sort'
|
4
|
+
- Added more Hiera support to command 'sort'.
|
5
|
+
- Added logfilepath to command 'sort'.
|
6
|
+
- Added logentry for the answer of the interaction with the command 'sort' (parameter -i).
|
7
|
+
- Bugfix: logic for parameters was not working correctly.
|
8
|
+
- Change: Default value for logging is not 'false'.
|
9
|
+
- Bugfix: Entry in Logfile shows now if the file is moved or copied.
|
10
|
+
- Bugfix: Error message when logging and the logfile did not exist yet. File is now created correctly when necessary.
|
11
|
+
- Added Hiera support to command 'rename'.
|
12
|
+
- Command 'rename': Changed hiera parameter 'destination' to 'outputdir'.
|
13
|
+
- Added Tests for 'sort','rename' and 'show'
|
14
|
+
|
1
15
|
# Version 1.4.3
|
2
16
|
- Bugfix: Commata in author field showed up in the filename after renaming.
|
3
17
|
|
data/README.md
CHANGED
@@ -60,24 +60,27 @@ So in order to get more information just run the required _help_ command:
|
|
60
60
|
|
61
61
|
```
|
62
62
|
# Show general possibilities:
|
63
|
-
$ pdfmd
|
63
|
+
$ pdfmd
|
64
64
|
|
65
65
|
# Show more information about <action>
|
66
|
-
$ pdfmd
|
66
|
+
$ pdfmd help <action>
|
67
67
|
```
|
68
68
|
|
69
69
|
My usual workflow is like this:
|
70
70
|
|
71
71
|
```
|
72
|
-
$ pdfmd
|
73
|
-
$ pdfmd
|
72
|
+
$ pdfmd show test.pdf
|
73
|
+
$ pdfmd edit -t all test.pdf
|
74
74
|
...
|
75
|
-
$ pdfmd
|
75
|
+
$ pdfmd rename test.pdf
|
76
76
|
$ mv 20150101-me-dok-testdocument.pdf /my/pdf/directory
|
77
|
+
...
|
78
|
+
$ pdfmd sort .
|
77
79
|
```
|
78
80
|
|
79
81
|
There's an underlogic in the renaming and sorting of the files according to the metadata. Make sure you read at least the help-information before you use it.
|
80
82
|
|
83
|
+
It's also usefull to define some default settings in Hiera to avoid unnecessary typing.
|
81
84
|
|
82
85
|
__HINT__: Before you start using the script, make sure you have a backup of your files or you know what you're doing. If you loose information/files I will not be able to help you.
|
83
86
|
|
@@ -90,8 +93,15 @@ pdfmd::config:
|
|
90
93
|
sort:
|
91
94
|
destination : /data/tmp
|
92
95
|
copy : true
|
93
|
-
|
96
|
+
log : true
|
97
|
+
logfilepath : /var/log/pdfmd.log # Needs create/write rights on this file
|
94
98
|
interactive : false
|
99
|
+
rename:
|
100
|
+
#allkeywords : true # Does not make sense in combination with _keywords_
|
101
|
+
keywords : 2
|
102
|
+
outputdir : /data/output/sorted
|
103
|
+
copy : true
|
104
|
+
|
95
105
|
```
|
96
106
|
|
97
107
|
Information about which hiera configuration settings are available can be either found in `pdfmd help <command>` or `pdfmd explain hiera`.
|
data/Rakefile
ADDED
@@ -0,0 +1,141 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'tmpdir'
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
TMPDIR = Dir.mktmpdir
|
6
|
+
EXAMPLEPDF = './test/test_default.pdf'
|
7
|
+
TARGETPDF = TMPDIR + '/' + File.basename(EXAMPLEPDF)
|
8
|
+
PDFMD = './lib/pdfmd.rb'
|
9
|
+
$testResults = Hash.new
|
10
|
+
|
11
|
+
desc 'test pdfmd'
|
12
|
+
task :test do
|
13
|
+
sections = ARGV.last
|
14
|
+
#puts ARGV.last
|
15
|
+
#puts sections
|
16
|
+
task sections.to_sym do ; end
|
17
|
+
|
18
|
+
case sections
|
19
|
+
when 'rename'
|
20
|
+
rename
|
21
|
+
when 'show'
|
22
|
+
show
|
23
|
+
when 'sort'
|
24
|
+
sort
|
25
|
+
else
|
26
|
+
show
|
27
|
+
rename
|
28
|
+
sort
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
#
|
34
|
+
# init Tmpdir
|
35
|
+
# Reset the temporary directory into a known state
|
36
|
+
# 1. Delete the tmp dir
|
37
|
+
# 2. Create the tmp dir
|
38
|
+
# 3. copy the default file back into it
|
39
|
+
def initTmpDir
|
40
|
+
FileUtils.rm_rf TMPDIR
|
41
|
+
FileUtils.mkdir TMPDIR
|
42
|
+
FileUtils.cp(EXAMPLEPDF, TMPDIR + '/')
|
43
|
+
end
|
44
|
+
|
45
|
+
#
|
46
|
+
# Testing command 'sort'
|
47
|
+
#
|
48
|
+
def sort
|
49
|
+
|
50
|
+
puts "Testing command 'sort'"
|
51
|
+
require_relative './test/test_sort.rb'
|
52
|
+
|
53
|
+
# Cleanup after Tests
|
54
|
+
FileUtils.rm_rf TMPDIR
|
55
|
+
showTestResults
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
#
|
61
|
+
# Testing command 'show'
|
62
|
+
#
|
63
|
+
def show
|
64
|
+
|
65
|
+
puts "Testing command 'show'"
|
66
|
+
require_relative './test/test_show.rb'
|
67
|
+
# Cleanup after Tests
|
68
|
+
FileUtils.rm_rf TMPDIR
|
69
|
+
showTestResults
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
# Testing command 'rename'
|
74
|
+
#
|
75
|
+
def rename
|
76
|
+
|
77
|
+
puts "Testing command 'rename'"
|
78
|
+
require_relative './test/test_rename.rb'
|
79
|
+
|
80
|
+
# Cleanup after Tests
|
81
|
+
FileUtils.rm_rf TMPDIR
|
82
|
+
showTestResults
|
83
|
+
|
84
|
+
end # End of Task test rename
|
85
|
+
|
86
|
+
################################################################################
|
87
|
+
# Helper methods
|
88
|
+
################################################################################
|
89
|
+
|
90
|
+
#
|
91
|
+
# Show the test results
|
92
|
+
def showTestResults
|
93
|
+
|
94
|
+
$testResults.sort.each do |key,value|
|
95
|
+
if value[:result] == 'OK'
|
96
|
+
puts 'Test ' + key + ' : ' + value[:result].to_s
|
97
|
+
else
|
98
|
+
puts 'Test ' + key + ' : ' + value[:result].to_s
|
99
|
+
puts ' Command: ' + value[:command].to_s
|
100
|
+
exit 1
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
#
|
106
|
+
# Read the PDF files in the TMPDIR
|
107
|
+
def readFilesInDir(targetdir)
|
108
|
+
filedata = Hash.new
|
109
|
+
files= Dir.glob(targetdir + "/*.pdf")
|
110
|
+
files.sort.each do |filename|
|
111
|
+
filedata[filename] = readExifData(filename)
|
112
|
+
end
|
113
|
+
return filedata
|
114
|
+
end
|
115
|
+
|
116
|
+
#
|
117
|
+
# Read the Exifdata of a given file
|
118
|
+
def readExifData(filepath)
|
119
|
+
|
120
|
+
exifdata = Hash.new
|
121
|
+
|
122
|
+
exifdatatext = `exiftool #{filepath}`
|
123
|
+
exifdatatext.each_line do |line|
|
124
|
+
case line
|
125
|
+
when /^author.*/i
|
126
|
+
exifdata['author'] = line.split(' : ').last.chomp
|
127
|
+
when /^title.*/i
|
128
|
+
exifdata['title'] = line.split(' : ').last.chomp
|
129
|
+
when /^subject.*/i
|
130
|
+
exifdata['subject'] = line.split(' : ').last.chomp
|
131
|
+
when /^keywords.*/i
|
132
|
+
exifdata['keywords'] = line.split(' : ').last.chomp
|
133
|
+
when /^Create\ Date.*/i
|
134
|
+
exifdata['createdate'] = line.split(' : ').last.chomp
|
135
|
+
end
|
136
|
+
end
|
137
|
+
return exifdata
|
138
|
+
end
|
139
|
+
|
140
|
+
|
141
|
+
|
data/lib/pdfmd/explain.hiera.md
CHANGED
@@ -12,7 +12,14 @@ Configure default settings in hiera:
|
|
12
12
|
---
|
13
13
|
pdfmd::config:
|
14
14
|
sort:
|
15
|
-
destination : /
|
15
|
+
destination : /data/output
|
16
|
+
copy : true
|
17
|
+
log : true
|
18
|
+
logfilepath : /var/log/pdfmd.log
|
19
|
+
interactive : true
|
20
|
+
rename:
|
21
|
+
allkeywords : true
|
22
|
+
keywords : 4
|
23
|
+
outputdir : /data/output/sorted
|
16
24
|
copy : true
|
17
|
-
logfile : /var/log/pdfmd.log
|
18
25
|
|
data/lib/pdfmd/rename.rb
CHANGED
@@ -1,16 +1,18 @@
|
|
1
1
|
#
|
2
2
|
# Thor command 'rename'
|
3
3
|
#
|
4
|
-
# TODO: Define outputdir from Hiera
|
5
|
-
# TODO: Add option for copy when renaming
|
6
4
|
# TODO: Add option to create outputdir if not existing
|
7
5
|
# TODO: Define option to create outputdir via Hiera
|
8
6
|
#
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
7
|
+
require_relative '../string_extend'
|
8
|
+
|
9
|
+
filename = ENV.fetch('PDFMD_FILENAME')
|
10
|
+
opt_allkeywords = ENV.fetch('PDFMD_ALLKEYWORDS')
|
11
|
+
outputdir = ENV.fetch('PDFMD_OUTPUTDIR') == 'false' ? false : ENV.fetch('PDFMD_OUTPUTDIR')
|
12
|
+
dryrun = ENV.fetch('PDFMD_DRYRUN') == 'false' ? false : true
|
13
|
+
opt_numberKeywords = ENV.fetch('PDFMD_NUMBERKEYWORDS')
|
14
|
+
opt_copy = ENV.fetch('PDFMD_COPY')
|
15
|
+
hieraDefaults = queryHiera('pdfmd::config')
|
14
16
|
|
15
17
|
metadata = readMetadata(filename).each do |key,value|
|
16
18
|
|
@@ -23,6 +25,63 @@ metadata = readMetadata(filename).each do |key,value|
|
|
23
25
|
|
24
26
|
end
|
25
27
|
|
28
|
+
|
29
|
+
# Determine the status of allkeywords
|
30
|
+
# Default value is false
|
31
|
+
if opt_allkeywords == 'true'
|
32
|
+
opt_allkeywords = true
|
33
|
+
elsif opt_allkeywords.blank? and
|
34
|
+
not hieraDefaults['rename'].nil? and
|
35
|
+
not hieraDefaults['rename']['allkeywords'].nil?
|
36
|
+
|
37
|
+
opt_allkeywords = hieraDefaults['rename']['allkeywords']
|
38
|
+
|
39
|
+
elsif opt_allkeywords == 'false' or
|
40
|
+
opt_allkeywords.blank?
|
41
|
+
|
42
|
+
opt_allkeywords = false
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
#
|
47
|
+
# Determine the number of keywords
|
48
|
+
# Default value is 3
|
49
|
+
if opt_numberKeywords.blank? and
|
50
|
+
not hieraDefaults['rename'].nil? and
|
51
|
+
not hieraDefaults['rename']['keywords'].nil?
|
52
|
+
|
53
|
+
opt_numberKeywords = hieraDefaults['rename']['keywords']
|
54
|
+
|
55
|
+
elsif opt_numberKeywords.to_i.is_a? Integer and
|
56
|
+
opt_numberKeywords.to_i > 0
|
57
|
+
|
58
|
+
opt_numberKeywords = opt_numberKeywords.to_i
|
59
|
+
|
60
|
+
else
|
61
|
+
|
62
|
+
opt_numberKeywords = 3
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
#
|
67
|
+
# Determine the status of the copy parameter
|
68
|
+
if opt_copy.blank? and
|
69
|
+
not hieraDefaults['rename'].nil? and
|
70
|
+
not hieraDefaults['rename']['copy'].nil?
|
71
|
+
|
72
|
+
opt_copy = hieraDefaults['rename']['copy']
|
73
|
+
|
74
|
+
elsif opt_copy == 'true'
|
75
|
+
|
76
|
+
opt_copy = true
|
77
|
+
|
78
|
+
else
|
79
|
+
|
80
|
+
opt_copy = false
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
|
26
85
|
date = metadata['createdate'].gsub(/\ \d{2}\:\d{2}\:\d{2}.*$/,'').gsub(/\:/,'')
|
27
86
|
author = metadata['author'].gsub(/\./,'_').gsub(/\-/,'').gsub(/\s/,'_').gsub(/\,/,'_').gsub(/\_\_/,'_')
|
28
87
|
I18n.enforce_available_locales = false
|
@@ -98,8 +157,8 @@ if not metadata['keywords'].empty?
|
|
98
157
|
|
99
158
|
# Exit condition limits the number of keywords used in the filename
|
100
159
|
# unless all keywords shall be added
|
101
|
-
if not
|
102
|
-
counter
|
160
|
+
if not opt_allkeywords
|
161
|
+
counter >= opt_numberKeywords-1 ? break : counter = counter + 1
|
103
162
|
end
|
104
163
|
if value.match(/(kvi|fak|ord|kdn)/i)
|
105
164
|
keywords == '' ? keywords = '-' + value : keywords = value + '-' + keywords
|
@@ -107,6 +166,7 @@ if not metadata['keywords'].empty?
|
|
107
166
|
keywords == '' ? keywords = '-' + value : keywords.concat('-' + value)
|
108
167
|
end
|
109
168
|
end
|
169
|
+
|
110
170
|
# Normalise the keywords as well
|
111
171
|
#
|
112
172
|
I18n.enforce_available_locales = false
|
@@ -136,17 +196,25 @@ newFilename = date + '-' +
|
|
136
196
|
|
137
197
|
# Output directory checks
|
138
198
|
if outputdir
|
199
|
+
|
139
200
|
if not File.exist?(outputdir)
|
140
201
|
puts "Error: output dir '#{outputdir}' not found. Abort."
|
141
202
|
exit 1
|
142
203
|
end
|
204
|
+
|
143
205
|
else
|
144
|
-
|
145
|
-
outputdir
|
206
|
+
|
207
|
+
# Try to get the outputdir from hiera
|
208
|
+
outputdir = (not hieraDefaults['rename'].nil? and not hieraDefaults['rename']['outputdir'].nil?) ? hieraDefaults['rename']['outputdir'] : File.dirname(filename)
|
209
|
+
|
146
210
|
end
|
147
211
|
|
148
212
|
if not dryrun and filename != newFilename.downcase
|
149
|
-
|
213
|
+
|
214
|
+
# Copy of me the file to the new name
|
215
|
+
command = opt_copy ? 'cp' : 'mv'
|
216
|
+
`#{command} -v '#{filename}' '#{outputdir}/#{newFilename.downcase}'`
|
217
|
+
|
150
218
|
else
|
151
|
-
puts filename + "\n => " + newFilename.downcase
|
219
|
+
puts filename + "\n => " + outputdir + '/' + newFilename.downcase
|
152
220
|
end
|
data/lib/pdfmd/sort.rb
CHANGED
@@ -1,25 +1,39 @@
|
|
1
|
+
#
|
2
|
+
# == File: sort.rb
|
3
|
+
#
|
4
|
+
# Actions for the sort command
|
5
|
+
#
|
1
6
|
inputDir = ENV.fetch('PDFMD_INPUTDIR')
|
2
7
|
|
3
8
|
require_relative('./methods.rb')
|
9
|
+
require_relative '../string_extend.rb'
|
4
10
|
require 'fileutils'
|
5
11
|
|
6
12
|
opt_destination = ENV.fetch('PDFMD_DESTINATION')
|
13
|
+
opt_dryrun = ENV.fetch('PDFMD_DRYRUN') == 'true' ? true : false
|
7
14
|
opt_copy = ENV.fetch('PDFMD_COPY')
|
8
15
|
opt_log = ENV.fetch('PDFMD_LOG')
|
16
|
+
opt_logfilepath = ENV.fetch('PDFMD_LOGFILEPATH')
|
9
17
|
opt_interactive = ENV.fetch('PDFMD_INTERACTIVE')
|
18
|
+
hieraDefaults = queryHiera('pdfmd::config')
|
10
19
|
|
11
|
-
|
12
|
-
|
13
|
-
copyAction = opt_copy
|
14
|
-
if
|
20
|
+
# Determin the setting for the copy/move action when sorting
|
21
|
+
# Use HieraDefaults if nothing has been set.
|
22
|
+
copyAction = opt_copy
|
23
|
+
if copyAction.blank? and hieraDefaults['sort']['copy'] == true
|
15
24
|
copyAction = true
|
16
|
-
|
25
|
+
elsif copyAction.blank? or copyAction == 'false'
|
26
|
+
copyAction = false
|
17
27
|
end
|
18
28
|
|
19
|
-
|
20
|
-
if opt_interactive.
|
29
|
+
# Determine the setting for interaction
|
30
|
+
if opt_interactive.blank? and hieraDefaults['sort']['interactive'] == true
|
31
|
+
puts 'Setting interactive from hiera'
|
32
|
+
interactiveAction = true
|
33
|
+
elsif opt_interactive == 'true'
|
21
34
|
interactiveAction = true
|
22
|
-
|
35
|
+
elsif opt_interactive.blank? or opt_interactive == 'false'
|
36
|
+
interactiveAction = false
|
23
37
|
end
|
24
38
|
|
25
39
|
# Fetch alternate destination from hiera if available
|
@@ -35,26 +49,55 @@ if destination.nil? or destination == ''
|
|
35
49
|
puts 'Abort.'
|
36
50
|
exit 1
|
37
51
|
end
|
52
|
+
end
|
38
53
|
|
54
|
+
# Determine the state of the logging
|
55
|
+
if (opt_log.blank? and hieraDefaults['sort']['log'] == true) or
|
56
|
+
opt_log == 'true'
|
57
|
+
logenable = true
|
58
|
+
elsif opt_log.blank? or opt_log == 'false'
|
59
|
+
logenable = false
|
39
60
|
end
|
40
61
|
|
41
|
-
logenable
|
42
|
-
|
62
|
+
if logenable
|
63
|
+
|
64
|
+
if opt_logfilepath.blank? and
|
65
|
+
( hieraDefaults['sort']['logfilepath'].nil? or
|
66
|
+
hieraDefaults['sort']['logfilepath'].blank? or
|
67
|
+
hieraDefaults['sort'].nil? )
|
68
|
+
|
69
|
+
logfile = Dir.pwd.chomp('/') + '/' + File.basename(ENV['PDFMD'], '.*') + '.log'
|
70
|
+
|
71
|
+
elsif not opt_logfilepath.blank?
|
72
|
+
|
73
|
+
if File.directory? opt_logfilepath
|
74
|
+
abort('Logfilepath is a directory. Abort.')
|
75
|
+
exit 1
|
76
|
+
end
|
77
|
+
|
78
|
+
logfile = opt_logfilepath
|
43
79
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
80
|
+
elsif opt_logfilepath.blank? and
|
81
|
+
not hieraDefaults['sort']['logfilepath'].blank?
|
82
|
+
|
83
|
+
logfile = hieraDefaults['sort']['logfilepath']
|
84
|
+
|
85
|
+
else
|
86
|
+
|
87
|
+
logfile = Dir.pwd.chomp('/') + '/' + File.basename(ENV['PDFMD'], '.*') + '.log'
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
$logger = Logger.new(logfile)
|
48
92
|
end
|
49
|
-
logenable ? $logger = Logger.new(logfile) : ''
|
50
93
|
|
51
94
|
# Input validation
|
52
95
|
!File.exist?(inputDir) ? abort('Input directory does not exist. Abort.'): ''
|
53
|
-
File.directory?(inputDir) ? '' : abort('Input is a single file')
|
96
|
+
File.directory?(inputDir) ? '' : abort('Input is a single file. Not implemented yet. Abort.')
|
54
97
|
File.file?(destination) ? abort("Output '#{destination}' is an existing file. Cannot create directory with the same name. Abort") : ''
|
55
98
|
unless File.directory?(destination)
|
56
99
|
FileUtils.mkdir_p(destination)
|
57
|
-
$logger.info("Destination '#{destination}' has been created.")
|
100
|
+
logenable ? $logger.info("Destination '#{destination}' has been created.") : ''
|
58
101
|
end
|
59
102
|
|
60
103
|
# Iterate through all files
|
@@ -63,6 +106,7 @@ Dir[inputDir.chomp('/') + '/*.pdf'].sort.each do |file|
|
|
63
106
|
if interactiveAction
|
64
107
|
answer = readUserInput("Process '#{file}' ([y]/n): ")
|
65
108
|
answer = answer.empty? ? 'y' : answer
|
109
|
+
logenable ? $logger.info("Interactive answer for file '#{file}' : #{answer}") : ''
|
66
110
|
answer.match(/y/) ? '' : next
|
67
111
|
end
|
68
112
|
|
@@ -80,15 +124,17 @@ Dir[inputDir.chomp('/') + '/*.pdf'].sort.each do |file|
|
|
80
124
|
|
81
125
|
filedestination = destination.chomp('/') + '/' + author + '/' + Pathname.new(file).basename.to_s
|
82
126
|
|
127
|
+
|
83
128
|
# Final check before touching the filesystem
|
84
129
|
if not File.exist?(filedestination)
|
85
|
-
$logger.info("File '#{file}' => '#{filedestination}'")
|
86
130
|
|
87
131
|
# Move/Copy the file
|
88
|
-
if copyAction
|
89
|
-
FileUtils.cp(file, filedestination)
|
132
|
+
if copyAction
|
133
|
+
opt_dryrun ? '' : FileUtils.cp(file, filedestination)
|
134
|
+
logenable ? $logger.info("File copied '#{file}' => '#{filedestination}'") : ''
|
90
135
|
else
|
91
|
-
FileUtils.mv(file,filedestination)
|
136
|
+
opt_dryrun ? '' : FileUtils.mv(file,filedestination)
|
137
|
+
logenable ? $logger.info("File moved '#{file}' => '#{filedestination}'") : ''
|
92
138
|
end
|
93
139
|
|
94
140
|
else
|
@@ -96,5 +142,6 @@ Dir[inputDir.chomp('/') + '/*.pdf'].sort.each do |file|
|
|
96
142
|
end
|
97
143
|
else
|
98
144
|
logenable ? $logger.warn("Missing tag 'Author' for file '#{file}'. Skipping.") : (puts "Missing tag 'Author' for file '#{file}'. Skipping")
|
145
|
+
next
|
99
146
|
end
|
100
147
|
end
|
data/lib/pdfmd.rb
CHANGED
@@ -41,9 +41,9 @@
|
|
41
41
|
# TODO: Include password protected PDF documents as well
|
42
42
|
# TODO: Fix broken PDF files automatically
|
43
43
|
# TODO: Enable logging in more functions than only "sort"
|
44
|
+
# TODO: command 'hiera' to show the current settings
|
44
45
|
# TODO: Read this: http://lostechies.com/derickbailey/2011/04/29/writing-a-thor-application/
|
45
46
|
# TODO: ... and this: http://blog.paracode.com/2012/05/17/building-your-tools-with-thor/
|
46
|
-
# TODO: Create Gem: http://yehudakatz.com/2010/04/02/using-gemspecs-as-intended/
|
47
47
|
# gs \
|
48
48
|
# -o repaired.pdf \
|
49
49
|
# -sDEVICE=pdfwrite \
|
@@ -62,7 +62,7 @@ require "i18n"
|
|
62
62
|
require 'pathname'
|
63
63
|
require 'logger'
|
64
64
|
|
65
|
-
VERSION = '1.
|
65
|
+
VERSION = '1.5.0'
|
66
66
|
|
67
67
|
# Include general usage methods
|
68
68
|
require_relative('pdfmd/methods.rb')
|
@@ -316,12 +316,18 @@ class DOC < Thor
|
|
316
316
|
|
317
317
|
[*log|l*]
|
318
318
|
\x5 Disable/Enable the logging.
|
319
|
-
|
319
|
+
|
320
|
+
Default: enabled.
|
321
|
+
|
322
|
+
[*logfilepath|p*]
|
323
|
+
\x5 Set an alternate path for the logfile. If not path is chosen, the logfile is being created in the current working directory as `pdfmd.log`.
|
320
324
|
|
321
325
|
[*interactive|i*]
|
322
|
-
\x5 Disable/Enable interactive sorting. This will ask for confirmation for
|
323
|
-
|
324
|
-
|
326
|
+
\x5 Disable/Enable interactive sorting. This will ask for confirmation for each sorting action.
|
327
|
+
|
328
|
+
Default: disabled.
|
329
|
+
|
330
|
+
|
325
331
|
|
326
332
|
=== Replacement rules
|
327
333
|
|
@@ -343,27 +349,28 @@ class DOC < Thor
|
|
343
349
|
\x5sort:
|
344
350
|
\x5 key: value
|
345
351
|
|
352
|
+
See the README file for an example how to define the values in Hiera.
|
353
|
+
|
346
354
|
=== Hiera defaults
|
347
355
|
|
348
|
-
The following values can be influenced by the hiera configuration in the
|
349
|
-
section 'sort'. Commandline parameter will overwrite the defaults coming
|
350
|
-
from hiera unless otherwise notet.
|
356
|
+
The following values can be influenced by the hiera configuration in the section 'sort'. Commandline parameter will overwrite the defaults coming from hiera unless otherwise notet.
|
351
357
|
|
352
358
|
[*copy*]
|
353
359
|
\x5 If set to true copies the files from the source directory instead of moving them.
|
354
360
|
|
355
361
|
[*destination*]
|
356
|
-
\x5 Specifies the default output directory (root-directory). Either this or the
|
357
|
-
|
362
|
+
\x5 Specifies the default output directory (root-directory). Either this or the command line parameter for destinations must be set.
|
363
|
+
|
364
|
+
[*log*]
|
365
|
+
\x5 Enables (true) or disables (false) logging.
|
358
366
|
|
359
|
-
[*
|
360
|
-
\x5
|
361
|
-
|
362
|
-
|
367
|
+
[*logfilepath*]
|
368
|
+
\x5 Specifes the default path for the logfile. If no path is set and logging is enable, the logfile will be created in the current working directory.
|
369
|
+
|
370
|
+
Default is the current working directory with the filename `pdfmd.log`
|
363
371
|
|
364
372
|
[*interactive*]
|
365
|
-
\x5
|
366
|
-
running the script.
|
373
|
+
\x5 If set to true, each file must be acknowledged to be processed when running the script.
|
367
374
|
|
368
375
|
=== Example
|
369
376
|
|
@@ -377,15 +384,20 @@ class DOC < Thor
|
|
377
384
|
LONGDESC
|
378
385
|
method_option :destination, :aliases => '-d', :required => false, :type => :string, :desc => 'Defines the output directory'
|
379
386
|
method_option :copy, :aliases => '-c', :required => false, :type => :boolean, :desc => 'Copy files instead of moving them'
|
380
|
-
method_option :log, :aliases => '-l', :required => false, :type => :boolean, :desc => 'Enable/Disable creation of log files'
|
381
|
-
method_option :
|
387
|
+
method_option :log, :aliases => '-l', :required => false, :type => :boolean, :desc => 'Enable/Disable creation of log files'
|
388
|
+
method_option :logfilepath, :aliases => '-p', :required => false, :type => :string, :desc => 'Change the default logfilepath'
|
389
|
+
method_option :interactive, :aliases => '-i', :required => false, :type => :boolean, :desc => 'Enable/Disable interactive sorting'
|
390
|
+
method_option :dryrun, :aliases => '-n', :required => false, :type => :boolean, :desc => 'Run without changing something'
|
382
391
|
def sort(inputDir)
|
383
392
|
|
384
393
|
ENV['PDFMD_INPUTDIR'] = inputDir
|
385
394
|
ENV['PDFMD_DESTINATION'] = options[:destination].to_s
|
386
395
|
ENV['PDFMD_COPY'] = options[:copy].to_s
|
387
396
|
ENV['PDFMD_LOG'] = options[:log].to_s
|
397
|
+
ENV['PDFMD_LOGFILEPATH'] = options[:logfilepath].to_s
|
388
398
|
ENV['PDFMD_INTERACTIVE'] = options[:interactive].to_s
|
399
|
+
ENV['PDFMD_DRYRUN'] = options['dryrun'].to_s
|
400
|
+
ENV['PDFMD'] = __FILE__
|
389
401
|
require_relative('./pdfmd/sort.rb')
|
390
402
|
|
391
403
|
end
|
@@ -408,13 +420,31 @@ class DOC < Thor
|
|
408
420
|
--all-keywords, -a
|
409
421
|
\x5 Use all keywords from the meta information in the file name and ignore the limit.
|
410
422
|
|
423
|
+
Hiera parameter: allkeywords [true|false]
|
424
|
+
|
425
|
+
Default: false
|
426
|
+
|
411
427
|
--keywwords, -k
|
412
428
|
\x5 Set the number of keywords used in the filename to a new value.
|
413
|
-
|
429
|
+
|
430
|
+
Hiera parameter: keywords <integer>
|
431
|
+
|
432
|
+
Default: 3
|
414
433
|
|
415
434
|
--outputdir, -o
|
416
435
|
\x5 Rename the file and move it to the directory defined in '--outputdir'.
|
417
436
|
|
437
|
+
Hiera parameter: outputdir </file/path/>
|
438
|
+
|
439
|
+
Default: current file directory
|
440
|
+
|
441
|
+
--copy, -c
|
442
|
+
\x5 Copy the file instead of moving it to the new name or destination.
|
443
|
+
|
444
|
+
Hiera parameter: copy [true|false]
|
445
|
+
|
446
|
+
Default: false
|
447
|
+
|
418
448
|
The directory must exist at runtime.
|
419
449
|
|
420
450
|
== Example
|
@@ -502,9 +532,10 @@ class DOC < Thor
|
|
502
532
|
|
503
533
|
LONGDESC
|
504
534
|
method_option :dryrun, :type => :boolean, :aliases => '-n', :desc => 'Run without making changes', :default => false, :required => false
|
505
|
-
method_option :allkeywords, :type => :boolean, :aliases => '-a', :desc => 'Add all keywords (no limit)', :
|
506
|
-
method_option :keywords, :type => :numeric, :aliases => '-k', :desc => 'Number of keywords to include (Default: 3)', :
|
507
|
-
method_option :outputdir, :aliases => '-o', :type => :string, :desc => 'Speficy output directory', :default =>
|
535
|
+
method_option :allkeywords, :type => :boolean, :aliases => '-a', :desc => 'Add all keywords (no limit)', :required => false
|
536
|
+
method_option :keywords, :type => :numeric, :aliases => '-k', :desc => 'Number of keywords to include (Default: 3)', :required => false
|
537
|
+
method_option :outputdir, :aliases => '-o', :type => :string, :desc => 'Speficy output directory', :default => false, :required => :false
|
538
|
+
method_option :copy, :aliases => '-c', :type => :boolean, :desc => 'Copy instead of moving the file when renaming'
|
508
539
|
def rename(filename)
|
509
540
|
|
510
541
|
ENV['PDFMD_FILENAME'] = filename
|
@@ -512,6 +543,7 @@ class DOC < Thor
|
|
512
543
|
ENV['PDFMD_ALLKEYWORDS'] = options[:allkeywords].to_s
|
513
544
|
ENV['PDFMD_OUTPUTDIR'] = options[:outputdir].to_s
|
514
545
|
ENV['PDFMD_NUMBERKEYWORDS'] = options[:keywords].to_s
|
546
|
+
ENV['PDFMD_COPY'] = options[:copy].to_s
|
515
547
|
require_relative('./pdfmd/rename.rb')
|
516
548
|
|
517
549
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#
|
2
|
+
# Helper file with class extensions for string
|
3
|
+
#
|
4
|
+
class String
|
5
|
+
|
6
|
+
#
|
7
|
+
# Boolean function
|
8
|
+
#
|
9
|
+
# 'true|t|yes|y|1' == true
|
10
|
+
# 'false|f|no|n|0' == false
|
11
|
+
# emtpy string is error
|
12
|
+
#
|
13
|
+
def to_bool
|
14
|
+
return true if self == true || self =~ (/\A(true|t|yes|y|1)\Z/i)
|
15
|
+
return false if self == false || self =~ (/\A(false|f|no|n|0)\Z/i)
|
16
|
+
raise ArgumentError.new("invalid value for Boolean: \"#{self}\"")
|
17
|
+
end
|
18
|
+
|
19
|
+
#
|
20
|
+
# method to check if a string is empty
|
21
|
+
#
|
22
|
+
def blank?
|
23
|
+
self.strip.empty?
|
24
|
+
end
|
25
|
+
end
|
data/pdfmd.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'pdfmd'
|
3
|
-
s.version =
|
3
|
+
s.version = `grep -m 1 VERSION lib/pdfmd.rb | awk -F"'" '{ print $2 '}`
|
4
4
|
s.date = Time.now.strftime("%Y-%m-%d").to_s
|
5
5
|
s.summary = "pdfmd - pdf-meta-data management"
|
6
6
|
s.description = <<-EOF
|
@@ -17,8 +17,8 @@ Gem::Specification.new do |s|
|
|
17
17
|
s.executable = 'pdfmd'
|
18
18
|
s.homepage = 'https://github.com/Micronarrativ/ruby-pmd'
|
19
19
|
s.license = 'MIT'
|
20
|
-
s.add_dependency "thor", '0.19.1'
|
21
|
-
s.add_dependency 'highline', '1.7.1'
|
22
|
-
s.add_dependency 'fileutils', '0.7'
|
23
|
-
s.add_dependency 'i18n', '0.6.11'
|
20
|
+
s.add_dependency "thor", '~>0.19', '>= 0.19.1'
|
21
|
+
s.add_dependency 'highline', '~>1.7', '>= 1.7.1'
|
22
|
+
s.add_dependency 'fileutils', '~>0.7','>= 0.7'
|
23
|
+
s.add_dependency 'i18n', '~>0.6', '>= 0.6.11'
|
24
24
|
end
|
Binary file
|
data/test/test_rename.rb
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
# Standard renaming
|
2
|
+
# Test 001
|
3
|
+
initTmpDir
|
4
|
+
commandparameter = " rename -o #{TMPDIR}"
|
5
|
+
`#{PDFMD} #{commandparameter} #{TARGETPDF}`.chomp
|
6
|
+
files = readFilesInDir(TMPDIR)
|
7
|
+
if files.size == 1 and
|
8
|
+
File.basename(files.keys[0]) == '19700101-example_author-dok-some_keywords-kdn1111111-test_subject.pdf'
|
9
|
+
result = 'OK'
|
10
|
+
else
|
11
|
+
result = 'failed'
|
12
|
+
end
|
13
|
+
$testResults = { '001' => {:result => result, :command => commandparameter }}
|
14
|
+
|
15
|
+
|
16
|
+
# Test 002
|
17
|
+
# renaming with copy
|
18
|
+
initTmpDir
|
19
|
+
commandparameter = " rename -c -o #{TMPDIR}"
|
20
|
+
`#{PDFMD} #{commandparameter} #{TARGETPDF}`.chomp
|
21
|
+
files = readFilesInDir(TMPDIR)
|
22
|
+
if files.size == 2 and
|
23
|
+
File.basename(files.keys[0]) == '19700101-example_author-dok-some_keywords-kdn1111111-test_subject.pdf' and
|
24
|
+
File.basename(files.keys[1]) == 'test_default.pdf'
|
25
|
+
result = 'OK'
|
26
|
+
else
|
27
|
+
result = 'failed'
|
28
|
+
end
|
29
|
+
$testResults.store('002', {:result => result, :command => commandparameter })
|
30
|
+
|
31
|
+
# Test 003
|
32
|
+
# Testing Dryrun
|
33
|
+
initTmpDir
|
34
|
+
commandparameter = ' rename -n '
|
35
|
+
`#{PDFMD} #{commandparameter} #{TARGETPDF} >>/dev/null`.chomp
|
36
|
+
files = readFilesInDir(TMPDIR)
|
37
|
+
if files.size == 1 and
|
38
|
+
File.basename(files.keys[0]) == 'test_default.pdf'
|
39
|
+
result = 'OK'
|
40
|
+
else
|
41
|
+
result = 'failed'
|
42
|
+
end
|
43
|
+
$testResults.store('003', {:result => result, :command => commandparameter })
|
44
|
+
|
45
|
+
# Test 004
|
46
|
+
# Testing all keywords (-a)
|
47
|
+
initTmpDir
|
48
|
+
commandparameter = " rename -a -o #{TMPDIR}"
|
49
|
+
`#{PDFMD} #{commandparameter} #{TARGETPDF}`.chomp
|
50
|
+
files = readFilesInDir(TMPDIR)
|
51
|
+
if files.size == 1 and
|
52
|
+
File.basename(files.keys[0]) == '19700101-example_author-dok-some_keywords-kdn1111111-test_subject-author-some_feature-customernumber_1111111.pdf'
|
53
|
+
result = 'OK'
|
54
|
+
else
|
55
|
+
result = 'failed'
|
56
|
+
end
|
57
|
+
$testResults.store('004', {:result => result, :command => commandparameter })
|
58
|
+
|
59
|
+
# Test 005
|
60
|
+
# Testing number of keywords
|
61
|
+
# this might be buggy
|
62
|
+
initTmpDir
|
63
|
+
commandparameter = " rename -k 1 -o #{TMPDIR}"
|
64
|
+
`#{PDFMD} #{commandparameter} #{TARGETPDF}`.chomp
|
65
|
+
files = readFilesInDir(TMPDIR)
|
66
|
+
if files.size == 1 and
|
67
|
+
File.basename(files.keys[0]) == '19700101-example_author-dok-test_subject.pdf'
|
68
|
+
result = 'OK'
|
69
|
+
else
|
70
|
+
result = 'failed'
|
71
|
+
end
|
72
|
+
$testResults.store('005', {:result => result, :command => commandparameter })
|
data/test/test_show.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
# Standard Show
|
2
|
+
# Test 001
|
3
|
+
initTmpDir
|
4
|
+
commandparameter = ' show '
|
5
|
+
showContent = `#{PDFMD} #{commandparameter} #{TARGETPDF}`.chomp
|
6
|
+
expectedContent = 'Author : Example Author
|
7
|
+
Creator : Writer
|
8
|
+
CreateDate : 1970:01:01 00:00:00
|
9
|
+
Subject : Test Subject
|
10
|
+
Title : Test Dokument
|
11
|
+
Keywords : Some Keywords, Author, some feature, Customernumber 1111111, Kundenummer 1111111'
|
12
|
+
if showContent == expectedContent
|
13
|
+
result = 'OK'
|
14
|
+
else
|
15
|
+
result = 'failed'
|
16
|
+
end
|
17
|
+
$testResults = { '001' => {:result => result, :command => commandparameter }}
|
18
|
+
|
19
|
+
# Show single tags
|
20
|
+
# Test 002
|
21
|
+
initTmpDir
|
22
|
+
commandparameter = ' show -t author'
|
23
|
+
showContent = `#{PDFMD} #{commandparameter} #{TARGETPDF}`.chomp
|
24
|
+
expectedContent = 'Example Author'
|
25
|
+
if showContent == expectedContent
|
26
|
+
result = 'OK'
|
27
|
+
else
|
28
|
+
result = 'failed'
|
29
|
+
end
|
30
|
+
$testResults.store('002', {:result => result, :command => commandparameter })
|
31
|
+
|
32
|
+
# Test 003
|
33
|
+
# Show multiple tags
|
34
|
+
initTmpDir
|
35
|
+
commandparameter = ' show -t author,subject'
|
36
|
+
showContent = `#{PDFMD} #{commandparameter} #{TARGETPDF}`.chomp
|
37
|
+
expectedContent = 'Example Author
|
38
|
+
Test Subject'
|
39
|
+
if showContent == expectedContent
|
40
|
+
result = 'OK'
|
41
|
+
else
|
42
|
+
result = 'failed'
|
43
|
+
end
|
44
|
+
$testResults.store('003', {:result => result, :command => commandparameter })
|
45
|
+
|
data/test/test_sort.rb
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
# Testing the results of the command 'sort'
|
2
|
+
#
|
3
|
+
# Test 001
|
4
|
+
# Testing Abort when running on a single file
|
5
|
+
initTmpDir
|
6
|
+
commandparameter = " sort -d #{TMPDIR}/target "
|
7
|
+
`#{PDFMD} #{commandparameter} #{TARGETPDF} 2>/dev/null`
|
8
|
+
if $?.to_s.match(/.*exit 1/)
|
9
|
+
result = 'OK'
|
10
|
+
else
|
11
|
+
result = 'failed'
|
12
|
+
end
|
13
|
+
$testResults = { '001' => {:result => result, :command => commandparameter }}
|
14
|
+
|
15
|
+
|
16
|
+
# Test 002
|
17
|
+
# Testing Sorting on a dir
|
18
|
+
initTmpDir
|
19
|
+
commandparameter = " sort -d #{TMPDIR}/target "
|
20
|
+
`#{PDFMD} #{commandparameter} #{TMPDIR}`
|
21
|
+
files = readFilesInDir(TMPDIR + '/target/example_author')
|
22
|
+
if files.size == 1 and
|
23
|
+
File.basename(files.keys[0]) == 'test_default.pdf'
|
24
|
+
result = 'OK'
|
25
|
+
else
|
26
|
+
result = 'failed'
|
27
|
+
end
|
28
|
+
$testResults.store('002',{:result => result, :command => commandparameter })
|
29
|
+
|
30
|
+
# Test 003
|
31
|
+
# Testing sorting on a dir with copy instead of moving
|
32
|
+
initTmpDir
|
33
|
+
commandparameter = " sort -d #{TMPDIR}/target -c "
|
34
|
+
`#{PDFMD} #{commandparameter} #{TMPDIR}`
|
35
|
+
filesTarget = readFilesInDir(TMPDIR + '/target/example_author')
|
36
|
+
filesSource = readFilesInDir(TMPDIR)
|
37
|
+
if filesTarget.size == 1 and
|
38
|
+
filesSource.size == 1 and
|
39
|
+
File.basename(filesTarget.keys[0]) == 'test_default.pdf' and
|
40
|
+
File.basename(filesSource.keys[0]) == 'test_default.pdf'
|
41
|
+
result = 'OK'
|
42
|
+
else
|
43
|
+
result = 'failed'
|
44
|
+
end
|
45
|
+
$testResults.store('003',{:result => result, :command => commandparameter })
|
46
|
+
|
47
|
+
# Test 004
|
48
|
+
# Testing sorting on a dir with dryrun option
|
49
|
+
initTmpDir
|
50
|
+
commandparameter = " sort -d #{TMPDIR}/target -n "
|
51
|
+
`#{PDFMD} #{commandparameter} #{TMPDIR}`
|
52
|
+
filesTarget = readFilesInDir(TMPDIR + '/target/example_author')
|
53
|
+
filesSource = readFilesInDir(TMPDIR)
|
54
|
+
if filesTarget.size == 0 and
|
55
|
+
filesSource.size == 1 and
|
56
|
+
File.basename(filesSource.keys[0]) == 'test_default.pdf'
|
57
|
+
result = 'OK'
|
58
|
+
else
|
59
|
+
result = 'failed'
|
60
|
+
end
|
61
|
+
$testResults.store('004',{:result => result, :command => commandparameter })
|
62
|
+
|
63
|
+
# Test 005
|
64
|
+
# Testing sorting on a dir with log creation
|
65
|
+
# and default log location (changed in this case)
|
66
|
+
initTmpDir
|
67
|
+
commandparameter = " sort -d #{TMPDIR}/target -l -p #{TMPDIR}/pdfmd.log"
|
68
|
+
`#{PDFMD} #{commandparameter} #{TMPDIR}`
|
69
|
+
filesTarget = readFilesInDir(TMPDIR + '/target/example_author')
|
70
|
+
filesSource = readFilesInDir(TMPDIR)
|
71
|
+
if filesTarget.size == 1 and
|
72
|
+
filesSource.size == 0 and
|
73
|
+
File.basename(filesTarget.keys[0]) == 'test_default.pdf' and
|
74
|
+
File.exist?(TMPDIR + '/pdfmd.log')
|
75
|
+
result = 'OK'
|
76
|
+
else
|
77
|
+
result = 'failed'
|
78
|
+
end
|
79
|
+
$testResults.store('005',{:result => result, :command => commandparameter })
|
80
|
+
|
81
|
+
# Test 006
|
82
|
+
# Testing sorting on a dir without log creation
|
83
|
+
initTmpDir
|
84
|
+
commandparameter = " sort -d #{TMPDIR}/target -l false -p #{TMPDIR}/pdfmd.log"
|
85
|
+
`#{PDFMD} #{commandparameter} #{TMPDIR}`
|
86
|
+
filesTarget = readFilesInDir(TMPDIR + '/target/example_author')
|
87
|
+
filesSource = readFilesInDir(TMPDIR)
|
88
|
+
if filesTarget.size == 1 and
|
89
|
+
filesSource.size == 0 and
|
90
|
+
File.basename(filesTarget.keys[0]) == 'test_default.pdf' and
|
91
|
+
not File.exist?(TMPDIR + '/pdfmd.log')
|
92
|
+
result = 'OK'
|
93
|
+
else
|
94
|
+
result = 'failed'
|
95
|
+
end
|
96
|
+
$testResults.store('006',{:result => result, :command => commandparameter })
|
97
|
+
|
metadata
CHANGED
@@ -1,69 +1,93 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pdfmd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Roos
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.19'
|
20
|
+
- - ">="
|
18
21
|
- !ruby/object:Gem::Version
|
19
22
|
version: 0.19.1
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
|
-
- -
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0.19'
|
30
|
+
- - ">="
|
25
31
|
- !ruby/object:Gem::Version
|
26
32
|
version: 0.19.1
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
34
|
name: highline
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
30
36
|
requirements:
|
31
|
-
- -
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '1.7'
|
40
|
+
- - ">="
|
32
41
|
- !ruby/object:Gem::Version
|
33
42
|
version: 1.7.1
|
34
43
|
type: :runtime
|
35
44
|
prerelease: false
|
36
45
|
version_requirements: !ruby/object:Gem::Requirement
|
37
46
|
requirements:
|
38
|
-
- -
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '1.7'
|
50
|
+
- - ">="
|
39
51
|
- !ruby/object:Gem::Version
|
40
52
|
version: 1.7.1
|
41
53
|
- !ruby/object:Gem::Dependency
|
42
54
|
name: fileutils
|
43
55
|
requirement: !ruby/object:Gem::Requirement
|
44
56
|
requirements:
|
45
|
-
- -
|
57
|
+
- - "~>"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '0.7'
|
60
|
+
- - ">="
|
46
61
|
- !ruby/object:Gem::Version
|
47
62
|
version: '0.7'
|
48
63
|
type: :runtime
|
49
64
|
prerelease: false
|
50
65
|
version_requirements: !ruby/object:Gem::Requirement
|
51
66
|
requirements:
|
52
|
-
- -
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0.7'
|
70
|
+
- - ">="
|
53
71
|
- !ruby/object:Gem::Version
|
54
72
|
version: '0.7'
|
55
73
|
- !ruby/object:Gem::Dependency
|
56
74
|
name: i18n
|
57
75
|
requirement: !ruby/object:Gem::Requirement
|
58
76
|
requirements:
|
59
|
-
- -
|
77
|
+
- - "~>"
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0.6'
|
80
|
+
- - ">="
|
60
81
|
- !ruby/object:Gem::Version
|
61
82
|
version: 0.6.11
|
62
83
|
type: :runtime
|
63
84
|
prerelease: false
|
64
85
|
version_requirements: !ruby/object:Gem::Requirement
|
65
86
|
requirements:
|
66
|
-
- -
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0.6'
|
90
|
+
- - ">="
|
67
91
|
- !ruby/object:Gem::Version
|
68
92
|
version: 0.6.11
|
69
93
|
description: |2
|
@@ -80,6 +104,7 @@ files:
|
|
80
104
|
- CHANGELOG.md
|
81
105
|
- LICENSE
|
82
106
|
- README.md
|
107
|
+
- Rakefile
|
83
108
|
- bin/pdfmd
|
84
109
|
- lib/pdfmd.rb
|
85
110
|
- lib/pdfmd/check.rb
|
@@ -95,7 +120,12 @@ files:
|
|
95
120
|
- lib/pdfmd/rename.rb
|
96
121
|
- lib/pdfmd/show.rb
|
97
122
|
- lib/pdfmd/sort.rb
|
123
|
+
- lib/string_extend.rb
|
98
124
|
- pdfmd.gemspec
|
125
|
+
- test/test_default.pdf
|
126
|
+
- test/test_rename.rb
|
127
|
+
- test/test_show.rb
|
128
|
+
- test/test_sort.rb
|
99
129
|
homepage: https://github.com/Micronarrativ/ruby-pmd
|
100
130
|
licenses:
|
101
131
|
- MIT
|