pdfh 0.1.4 → 0.1.5

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
  SHA256:
3
- metadata.gz: abfe40299db0b68678beba21f329093fa9ecde2caa3e9df684e16b312c9b8fe2
4
- data.tar.gz: 49ee2fc202fbc0cbe279185c4177c27f543c6946d9decdbc4fbf67af9e6b8bf8
3
+ metadata.gz: 84b58e13bf988d132601b4a22e7d58d2a9fedf0dbaefbe31263d49e441457361
4
+ data.tar.gz: c5c5faa977695d1e6cb0d42a692f1c951ce23d1fc07fe27e1dc714f16890a9e8
5
5
  SHA512:
6
- metadata.gz: 60b8883dd62e730ac46306d79d3cd967cd220d8486fe3cf0e21597a7f1c642271528d8a94a37ab21a3cb01bb805cd4f054f46bb918381c39b4325cb3467a2ae0
7
- data.tar.gz: 1cd81d3feb7305d5df3119eee85de42587dcae07ddffc9966cdc86e3c87420f0925f105c41fa9d689c2cc68f6b2c75f5ad8260974abd6997a209691595e03c12
6
+ metadata.gz: c76919c53cc31219265484721f441dc36b5194e859ca8bb0c71528374012e72dab1dde8e3edf47745494501c27d0a0ffcbfb12480a385cef63dfe9dd20e8bffe
7
+ data.tar.gz: 041110ee2ffa94ce826d020d3e44e7779768358a3e1b8abe89b2743751ee1f1f46319d3ca680d8de9fab04c1dd816e14fa90571d327ab88772d3f53927dabf40
@@ -6,3 +6,13 @@ AllCops:
6
6
 
7
7
  Metrics/LineLength:
8
8
  Enabled: false
9
+
10
+ Metrics/BlockLength:
11
+ Exclude:
12
+ - pdfh.gemspec
13
+
14
+ Metrics/MethodLength:
15
+ Max: 15
16
+
17
+ Metrics/AbcSize:
18
+ Max: 15
@@ -1 +1 @@
1
- ruby-2.6.0
1
+ ruby-2.6.2
@@ -1,3 +1,11 @@
1
+ ## v0.1.5
2
+ * Add print_cmd field in config file for information purposes
3
+ * Settings now validates a no existing directory
4
+ * Refactor for easier maintenance
5
+
6
+ ## v0.1.4
7
+ * Add titleize format when writing new file
8
+
1
9
  ## v0.1.3
2
10
  * Fixed copy companion files, which was not copying the files.
3
11
 
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- pdfh (0.1.3)
4
+ pdfh (0.1.5)
5
5
  colorize (~> 0.8.1)
6
6
 
7
7
  GEM
@@ -12,7 +12,7 @@ GEM
12
12
  diff-lcs (1.3)
13
13
  docile (1.3.1)
14
14
  hirb (0.7.3)
15
- json (2.1.0)
15
+ json (2.2.0)
16
16
  rake (10.5.0)
17
17
  rspec (3.8.0)
18
18
  rspec-core (~> 3.8.0)
data/exe/pdfh CHANGED
@@ -4,6 +4,7 @@
4
4
  require 'optparse'
5
5
  require 'pdfh'
6
6
  require 'pdfh/version'
7
+ require 'pdfh/utils'
7
8
 
8
9
  options = {}
9
10
  opt = OptionParser.new do |opts|
@@ -24,7 +25,7 @@ end
24
25
  begin
25
26
  opt.parse!
26
27
  rescue OptionParser::InvalidOption => e
27
- puts "Error, #{e.message}".colorize(:red)
28
+ Pdfh.print_error e, exit_app: false
28
29
  puts opt
29
30
  exit 1
30
31
  end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ ##
4
+ # Extends String class when required
5
+ module Extensions
6
+ ##
7
+ # Adds new functionality to string Class
8
+ refine String do
9
+ def titleize
10
+ split.map(&:capitalize).join(' ')
11
+ end
12
+ end
13
+ end
@@ -12,41 +12,69 @@ module Pdfh
12
12
  Verbose.active = options[:verbose]
13
13
  Dry.active = options[:dry]
14
14
 
15
- settings = Settings.new(search_config_file)
15
+ @settings = Settings.new(search_config_file)
16
+ puts "Destination path: #{@settings.base_path.light_blue}"
17
+ @settings.scrape_dirs.each do |work_directory|
18
+ process_directory(work_directory)
19
+ end
20
+ rescue StandardError => e
21
+ print_error e
22
+ end
16
23
 
17
- settings.scrape_dirs.each do |work_directory|
18
- print_separator(work_directory)
19
- ignored_files = []
20
- Dir["#{work_directory}/*.pdf"].each do |file|
21
- base_name = File.basename(file, File.extname(file))
22
- type = settings.match_doc_type(file)
23
- unless type
24
- ignored_files << base_name
25
- next
26
- end
24
+ def self.search_config_file
25
+ name = File.basename($PROGRAM_NAME)
26
+ names_to_look = ["#{name}.yml", "#{name}.yaml"]
27
+ dir_order = [Dir.pwd, File.expand_path('~')]
27
28
 
28
- pad = 12
29
- puts "Working on #{base_name.colorize(:light_green)}"
30
- print_ident 'Type', type.name, :light_blue, width: pad
31
- doc = Document.new(file, type)
32
- print_ident 'Sub-Type', doc.sub_type, :light_blue, width: pad
33
- print_ident 'Period', doc.period, :light_blue, width: pad
34
- print_ident 'New Name', doc.new_name, :light_blue, width: pad
35
- print_ident 'Store Path', doc.store_path, :light_blue, width: pad
36
- print_ident 'Other files', doc.companion_files(join: true), :light_blue, width: pad
37
- doc.write_pdf(settings.base_path)
29
+ dir_order.each do |dir|
30
+ names_to_look.each do |file|
31
+ f = File.join(dir, file)
32
+ return f if File.file?(f)
38
33
  end
34
+ end
39
35
 
40
- puts "\nNo account was matched for these PDF files:" unless ignored_files.empty?
41
- ignored_files.each.with_index(1) do |file, index|
42
- print_ident index, file, :red
36
+ raise StandardError, "no configuraton file (#{names_to_look.join(' or ')}) was found\n within paths: #{dir_order.join(', ')}"
37
+ end
38
+
39
+ ##
40
+ # @param [String] work_directory
41
+ def self.process_directory(work_directory)
42
+ print_separator work_directory
43
+ ignored_files = []
44
+ Dir["#{work_directory}/*.pdf"].each do |pdf_file|
45
+ type = @settings.match_doc_type(pdf_file)
46
+ if type
47
+ process_document(pdf_file, type)
48
+ else
49
+ ignored_files << basename_without_ext(pdf_file)
43
50
  end
44
51
  end
45
- rescue StandardError => e
46
- line = e.backtrace[0].match(/:(\d+)/)[1]
47
- puts "Error, #{e.message}. #{line}".colorize(:red)
48
- exit 1
52
+
53
+ puts "\nNo account was matched for these PDF files:" unless ignored_files.empty?
54
+ ignored_files.each.with_index(1) { |file, index| print_ident index, file, :magenta }
55
+ end
56
+
57
+ ##
58
+ # Generate document, and process actions
59
+ # @param [String] file
60
+ # @param [Type] type
61
+ # rubocop:disable Metrics/AbcSize
62
+ def self.process_document(file, type)
63
+ puts "Working on #{basename_without_ext(file).colorize(:light_green)}"
64
+ pad = 12
65
+ print_ident 'Type', type.name, :light_blue, width: pad
66
+ doc = Document.new(file, type)
67
+ print_ident 'Sub-Type', doc.sub_type, :light_blue, width: pad
68
+ print_ident 'Period', doc.period, :light_blue, width: pad
69
+ print_ident 'New Name', doc.new_name, :light_blue, width: pad
70
+ print_ident 'Store Path', doc.store_path, :light_blue, width: pad
71
+ print_ident 'Other files', doc.companion_files(join: true), :light_blue, width: pad
72
+ print_ident 'Print CMD', doc.print_cmd, :light_blue, width: pad
73
+ doc.write_pdf(@settings.base_path)
74
+ rescue StandardError => err
75
+ puts " Doc Error: #{err.message}".colorize(:red)
49
76
  end
77
+ # rubocop:enable Metrics/AbcSize
50
78
 
51
79
  def self.print_separator(title)
52
80
  _rows, cols = `stty size`.split.map(&:to_i)
@@ -62,18 +90,7 @@ module Pdfh
62
90
  puts "#{' ' * 4}#{field_str}: #{value_str}"
63
91
  end
64
92
 
65
- def self.search_config_file
66
- name = File.basename($PROGRAM_NAME)
67
- names_to_look = ["#{name}.yml", "#{name}.yaml"]
68
- dir_order = [Dir.pwd, File.expand_path('~')]
69
-
70
- dir_order.each do |dir|
71
- names_to_look.each do |file|
72
- f = File.join(dir, file)
73
- return f if File.file?(f)
74
- end
75
- end
76
-
77
- raise StandardError, "no configuraton file (#{names_to_look.join(' or ')}) was found\n within paths: #{dir_order.join(', ')}"
93
+ def self.basename_without_ext(file)
94
+ File.basename(file, File.extname(file))
78
95
  end
79
96
  end
@@ -1,73 +1,75 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'fileutils'
4
+ require 'pdfh/month'
5
+ require 'pdfh/pdf_handler'
4
6
  require 'ext/string'
5
7
 
8
+ ##
9
+ # main module
6
10
  module Pdfh
7
- using Pdfh::String
11
+ using Extensions
12
+
13
+ ##
14
+ # Regular Date Error, when there is not match
15
+ class ReDateError < StandardError
16
+ def initialize(message = 'No data matched your date regular expression')
17
+ super(message)
18
+ end
19
+ end
8
20
 
9
21
  ##
10
22
  # Handles the PDF detected by the rules
11
- # TODO: Replace command utils with this gem
12
- # require 'pdf-reader'
13
- #
14
- # reader = PDF::Reader.new(temp)
15
- # reader.pages.each do |page|
16
- # @text << page.text
17
- # end
18
23
  class Document
19
- attr_accessor :text, :type, :file, :extra
20
-
21
- MONTHS = {
22
- enero: 1,
23
- febrero: 2,
24
- marzo: 3,
25
- abril: 4,
26
- mayo: 5,
27
- junio: 6,
28
- julio: 7,
29
- agosto: 8,
30
- septiembre: 9,
31
- octubre: 10,
32
- noviembre: 11,
33
- diciembre: 12
34
- }.freeze
24
+ attr_reader :text, :type, :file, :extra
35
25
 
36
26
  def initialize(file, type, _options = {})
27
+ raise IOError, "File #{file} not found" unless File.exist?(file)
28
+
37
29
  @file = file
38
30
  @type = type
39
31
  @month_offset = 0
40
32
  @year_offset = 0
41
33
 
42
- raise IOError, "File #{file} not found" unless File.exist?(file)
34
+ @pdf_doc = PdfHandler.new(file, @type.pwd)
43
35
 
44
36
  Verbose.print "=== Type: #{type_name} =================="
45
- @text = pdf_text
46
- Verbose.print " Text extracted: #{@text}"
37
+ @text = @pdf_doc.extract_text
47
38
  @sub_type = extract_subtype(@type.sub_types)
48
39
  Verbose.print " SubType: #{@sub_type}"
49
40
  @month, @year, @extra = match_data
50
41
  Verbose.print "==== Assigned: #{@month}, #{@year}, #{@extra} ==( Month, Year, Extra )================"
51
- @companion = find_companion_files
42
+ find_companion_files
43
+ end
44
+
45
+ def write_pdf(base_path)
46
+ full_path = File.join(base_path, store_path, new_name)
47
+ dir_path = File.join(base_path, store_path)
48
+
49
+ @pdf_doc.write_pdf(dir_path, full_path)
50
+
51
+ return if Dry.active?
52
+
53
+ make_document_backup
54
+ copy_companion_files(dir_path)
52
55
  end
53
56
 
54
57
  def period
55
- m = month.to_s.rjust(2, '0')
56
- y = year
57
- "#{y}-#{m}"
58
+ formated_month = month.to_s.rjust(2, '0')
59
+ "#{year}-#{formated_month}"
58
60
  end
59
61
 
60
62
  def month
61
- m = normalize_month + @month_offset
63
+ month = Month.normalize(@month) + @month_offset
62
64
 
63
- case m
65
+ case month
64
66
  when 0 then
65
67
  @year_offset = -1
66
68
  12
67
69
  when 13 then
68
70
  @year_offset = 1
69
71
  1
70
- else m
72
+ else month
71
73
  end
72
74
  end
73
75
 
@@ -99,11 +101,11 @@ module Pdfh
99
101
  def new_name
100
102
  template = @type.to_h.key?(:name_template) ? @type.name_template : '{original}'
101
103
  new_name = template
102
- .gsub(/\{original\}/, file_name_only)
103
- .gsub(/\{period\}/, period)
104
- .gsub(/\{type\}/, type_name)
105
- .gsub(/\{subtype\}/, sub_type)
106
- .gsub(/\{extra\}/, extra || '')
104
+ .sub('{original}', file_name_only)
105
+ .sub('{period}', period)
106
+ .sub('{type}', type_name)
107
+ .sub('{subtype}', sub_type)
108
+ .sub('{extra}', extra || '')
107
109
  "#{new_name}.pdf"
108
110
  end
109
111
 
@@ -111,6 +113,13 @@ module Pdfh
111
113
  @type.store_path.gsub(/\{YEAR\}/, year.to_s)
112
114
  end
113
115
 
116
+ def print_cmd
117
+ return 'N/A' if type.print_cmd.nil? || type.print_cmd.empty?
118
+
119
+ relative_path = File.join(store_path, new_name)
120
+ "#{type.print_cmd} #{relative_path}"
121
+ end
122
+
114
123
  def to_s
115
124
  <<~STR
116
125
  Name: #{file_name_only}
@@ -122,6 +131,7 @@ module Pdfh
122
131
  New Name: #{new_name}
123
132
  StorePath: #{store_path}
124
133
  Companion: #{companion_files(join: true)}
134
+ Print Cmd: #{print_cmd}
125
135
  STR
126
136
  end
127
137
 
@@ -131,30 +141,6 @@ module Pdfh
131
141
  @companion.empty? ? 'N/A' : @companion.join(', ')
132
142
  end
133
143
 
134
- def write_pdf(base_path)
135
- Verbose.print '~~~~~~~~~~~~~~~~~~ Writing PDFs'
136
- full_path = File.join(base_path, store_path, new_name)
137
- dir_path = File.join(base_path, store_path)
138
-
139
- raise IOError, "Path #{dir_path} was not found." unless Dir.exist?(dir_path)
140
-
141
- password_opt = "--password='#{@type.pwd}'" if @type.pwd
142
- cmd = %(qpdf #{password_opt} --decrypt '#{@file}' '#{full_path}')
143
- Verbose.print " Write pdf command: #{cmd}"
144
-
145
- return if Dry.active?
146
-
147
- _result = `#{cmd}`
148
- raise IOError, "File #{full_path} was not created." unless File.file?(full_path)
149
-
150
- # Making backup of original
151
- Dir.chdir(home_dir) do
152
- File.rename(file, backup_name)
153
- end
154
-
155
- copy_companion_files(dir_path)
156
- end
157
-
158
144
  private
159
145
 
160
146
  ##
@@ -174,60 +160,46 @@ module Pdfh
174
160
  nil
175
161
  end
176
162
 
177
- def normalize_month
178
- month_num = @month.to_i
179
- return month_num if month_num.positive?
180
-
181
- if @month.size == 3
182
- MONTHS.keys.each do |mon|
183
- return MONTHS[mon] if mon.to_s[0, 3] == @month
184
- end
185
- end
186
-
187
- MONTHS[@month.to_sym]
188
- end
189
-
190
163
  def home_dir
191
164
  File.dirname(@file)
192
165
  end
193
166
 
194
- def pdf_text
195
- temp = `mktemp`.chomp
196
- Verbose.print " --> #{temp} temporal file assigned."
197
-
198
- password_opt = "--password='#{@type.pwd}'" if @type.pwd
199
- cmd = %(qpdf #{password_opt} --decrypt --stream-data=uncompress '#{@file}' '#{temp}')
200
- Verbose.print " Command: #{cmd}"
201
- _result = `#{cmd}`
202
- Verbose.print 'Password removed.'
203
-
204
- cmd2 = %(pdftotext -enc UTF-8 '#{temp}' -)
205
- Verbose.print " Command: #{cmd2}"
206
- `#{cmd2}`
207
- end
208
-
167
+ ##
168
+ # named matches can appear in any order with names 'd', 'm' and 'y'
169
+ # unamed matches needs to be in order month, year
170
+ # @return [Array] - format [month, year, day]
209
171
  def match_data
210
172
  Verbose.print '~~~~~~~~~~~~~~~~~~ RegEx'
211
173
  Verbose.print " Using regex: #{@type.re_date}"
212
174
  Verbose.print " named: #{@type.re_date.named_captures}"
213
175
  matched = @type.re_date.match(@text)
176
+ raise ReDateError unless matched
177
+
214
178
  Verbose.print " captured: #{matched.captures}"
215
179
 
216
180
  return matched.captures.map(&:downcase) if @type.re_date.named_captures.empty?
217
181
 
218
- extra = matched.captures.size > 2 ? matched[3] : nil
182
+ extra = matched.captures.size > 2 ? matched[:d] : nil
219
183
  [matched[:m].downcase, matched[:y], extra]
220
184
  end
221
185
 
186
+ ##
187
+ # Create a backup of original document
188
+ def make_document_backup
189
+ Dir.chdir(home_dir) do
190
+ File.rename(file, backup_name)
191
+ end
192
+ end
193
+
222
194
  def find_companion_files
223
195
  Verbose.print '~~~~~~~~~~~~~~~~~~ Searching Companion files'
224
196
  Verbose.print " Working on dir: #{home_dir}"
225
197
  Dir.chdir(home_dir) do
226
198
  all_files = Dir["#{file_name_only}.*"]
227
- companion = all_files.reject { |f| f.include? 'pdf' }
199
+ companion = all_files.reject { |file| file.include? 'pdf' }
228
200
  Verbose.print " - #{companion.join(', ')}"
229
201
 
230
- companion || []
202
+ @companion = companion || []
231
203
  end
232
204
  end
233
205
 
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfh
4
+ ##
5
+ # Handles Month convertions
6
+ class Month
7
+ MONTHS = {
8
+ enero: 1,
9
+ febrero: 2,
10
+ marzo: 3,
11
+ abril: 4,
12
+ mayo: 5,
13
+ junio: 6,
14
+ julio: 7,
15
+ agosto: 8,
16
+ septiembre: 9,
17
+ octubre: 10,
18
+ noviembre: 11,
19
+ diciembre: 12
20
+ }.freeze
21
+
22
+ ##
23
+ # @param [String] month
24
+ # @return [Integer]
25
+ def self.normalize(month)
26
+ # When param is a number
27
+ month_num = month.to_i
28
+ return month_num if month_num.between?(1, 12) # (1..12).include?(month_num)
29
+
30
+ # When param is a 3 char month: 'mar', 'nov'
31
+ if month.size == 3
32
+ MONTHS.keys.each do |mon|
33
+ return MONTHS[mon] if mon.to_s[0, 3] == month
34
+ end
35
+ end
36
+
37
+ # When param has a direct match
38
+ MONTHS[month.to_sym]
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfh
4
+ ##
5
+ # Handles the Pdf document text extraction and password removal
6
+ # TODO: Replace command utils with this gem
7
+ # require 'pdf-reader'
8
+ #
9
+ # reader = PDF::Reader.new(temp)
10
+ # reader.pages.each do |page|
11
+ # @text << page.text
12
+ # end
13
+ class PdfHandler
14
+ attr_reader :file, :password
15
+
16
+ def initialize(file, password)
17
+ @file = file
18
+ @password = password
19
+ end
20
+
21
+ ##
22
+ # Gets the text from the pdf in order to execute
23
+ # the regular expresiom matches
24
+ def extract_text
25
+ temp = `mktemp`.chomp
26
+ Verbose.print " --> #{temp} temporal file assigned."
27
+
28
+ password_opt = "--password='#{@password}'" if @password
29
+ cmd = %(qpdf #{password_opt} --decrypt --stream-data=uncompress '#{@file}' '#{temp}')
30
+ Verbose.print " Command: #{cmd}"
31
+ _result = `#{cmd}`
32
+
33
+ cmd2 = %(pdftotext -enc UTF-8 '#{temp}' -)
34
+ Verbose.print " Command: #{cmd2}"
35
+ text = `#{cmd2}`
36
+ Verbose.print " Text extracted: #{text}"
37
+ text
38
+ end
39
+
40
+ def write_pdf(dir_path, full_path)
41
+ Verbose.print '~~~~~~~~~~~~~~~~~~ Writing PDFs'
42
+ raise IOError, "Path #{dir_path} not found." unless Dir.exist?(dir_path)
43
+
44
+ password_opt = "--password='#{@password}'" if @password
45
+ cmd = %(qpdf #{password_opt} --decrypt '#{@file}' '#{full_path}')
46
+ Verbose.print " Write pdf command: #{cmd}"
47
+
48
+ return if Dry.active?
49
+
50
+ _result = `#{cmd}`
51
+ raise IOError, "File #{full_path} was not created." unless File.file?(full_path)
52
+ end
53
+ end
54
+ end
@@ -8,20 +8,18 @@ module Pdfh
8
8
  ##
9
9
  # Handles the config yaml data mapping, and associates a file name with a doc type
10
10
  class Settings
11
- attr_accessor :scrape_dirs, :base_path, :document_types
11
+ attr_reader :scrape_dirs, :base_path, :document_types
12
12
 
13
13
  def initialize(file)
14
14
  file_hash = YAML.load_file(file)
15
15
  Verbose.print "Loaded configuration file: #{file}"
16
16
 
17
- self.scrape_dirs = file_hash['scrape_dirs'].map do |d|
18
- File.expand_path(d)
19
- end
20
- self.base_path = File.expand_path(file_hash['base_path'])
21
- self.document_types = process_doc_types(file_hash['document_types'])
17
+ @scrape_dirs = process_scrape_dirs(file_hash['scrape_dirs'])
18
+ @base_path = File.expand_path(file_hash['base_path'])
19
+ @document_types = process_doc_types(file_hash['document_types'])
22
20
 
23
21
  Verbose.print 'Processing directories:'
24
- scrape_dirs.each { |d| Verbose.print " - #{d}" }
22
+ scrape_dirs.each { |dir| Verbose.print " - #{dir}" }
25
23
  Verbose.print
26
24
  end
27
25
 
@@ -38,6 +36,18 @@ module Pdfh
38
36
 
39
37
  private
40
38
 
39
+ def process_scrape_dirs(scrape_dirs_list)
40
+ scrape_dirs_list.map do |dir|
41
+ expanded = File.expand_path(dir)
42
+ dir_exists = File.directory?(expanded)
43
+ if dir_exists
44
+ expanded
45
+ else
46
+ Verbose.print " ** Directory #{dir} does not exists."
47
+ end
48
+ end.compact
49
+ end
50
+
41
51
  def process_doc_types(doc_types)
42
52
  doc_types.map do |x|
43
53
  object = OpenStruct.new(x)
@@ -2,9 +2,8 @@
2
2
 
3
3
  require 'colorize'
4
4
 
5
+ # Contains all generic short functionality
5
6
  module Pdfh
6
- class Error < StandardError; end
7
-
8
7
  ##
9
8
  # Keeps Verbose option in whole project
10
9
  class Verbose
@@ -34,4 +33,10 @@ module Pdfh
34
33
  end
35
34
  end
36
35
  end
36
+
37
+ def self.print_error(exception, exit_app: true)
38
+ line = exception.backtrace[0].match(/:(?<line>\d+)/)[:line]
39
+ puts "Error, Line[#{line}]: #{exception.message}.".colorize(:red)
40
+ exit 1 if exit_app
41
+ end
37
42
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Pdfh
4
- VERSION = '0.1.4'
4
+ VERSION = '0.1.5'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pdfh
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Isaias Piña
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-01-28 00:00:00.000000000 Z
11
+ date: 2019-04-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colorize
@@ -119,8 +119,11 @@ files:
119
119
  - bin/console
120
120
  - bin/setup
121
121
  - exe/pdfh
122
+ - lib/ext/string.rb
122
123
  - lib/pdfh.rb
123
124
  - lib/pdfh/document.rb
125
+ - lib/pdfh/month.rb
126
+ - lib/pdfh/pdf_handler.rb
124
127
  - lib/pdfh/settings.rb
125
128
  - lib/pdfh/utils.rb
126
129
  - lib/pdfh/version.rb
@@ -148,7 +151,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
148
151
  - !ruby/object:Gem::Version
149
152
  version: '0'
150
153
  requirements: []
151
- rubygems_version: 3.0.1
154
+ rubygems_version: 3.0.3
152
155
  signing_key:
153
156
  specification_version: 4
154
157
  summary: Organize PDF files