filter_rename 1.0.0 → 1.2.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.
data/lib/filter_rename.rb CHANGED
@@ -1,30 +1,35 @@
1
- require 'fileutils'
2
- require 'filter_rename/version'
3
- require 'filter_rename/config'
4
- require 'filter_rename/filter_base'
5
- require 'filter_rename/filters'
6
- require 'filter_rename/filter_pipe'
7
- require 'filter_rename/filename'
8
- require 'filter_rename/filename_factory'
9
- require 'filter_rename/utils'
1
+ # frozen_string_literal: true
2
+
3
+ require "fileutils"
4
+ require "filter_rename/version"
5
+ require "filter_rename/config"
6
+ require "filter_rename/filter_base"
7
+ require "filter_rename/filters"
8
+ require "filter_rename/filter_pipe"
9
+ require "filter_rename/filename"
10
+ require "filter_rename/filename_factory"
11
+ require "filter_rename/utils"
10
12
 
11
13
  module FilterRename
12
-
14
+ #
15
+ # Facade class for all the operations.
16
+ #
13
17
  class Builder
14
-
15
18
  def initialize(options)
16
19
  @cfg = Config.new(options.global)
17
20
  @filters = FilterList.new(options.filters)
18
21
  @files = options.files
19
22
  @show_macro = options.show_macro
23
+ @help_config = options.help_config
20
24
  end
21
25
 
22
- def preview
26
+ def diff
27
+ expand_files!
23
28
  raise MissingFiles if @files.empty?
24
29
 
25
30
  @filters.expand_macros!(@cfg.macro)
26
31
 
27
- Messages.label "Preview:"
32
+ Messages.label "Diff:"
28
33
 
29
34
  @files.each do |src|
30
35
  fp = FilterPipe.new(src, @filters, @cfg).apply
@@ -33,13 +38,16 @@ module FilterRename
33
38
  end
34
39
 
35
40
  def apply
41
+ expand_files!
36
42
  raise MissingFiles if @files.empty?
37
43
 
38
44
  @filters.expand_macros!(@cfg.macro)
45
+ renamed = 0
46
+ skipped = 0
47
+ errors = 0
39
48
 
40
49
  Messages.label "Apply:"
41
50
  @files.each do |src|
42
-
43
51
  fp = FilterPipe.new(src, @filters, @cfg).apply
44
52
 
45
53
  if fp.changed?
@@ -47,91 +55,149 @@ module FilterRename
47
55
 
48
56
  if old_data[:full_filename]
49
57
  Messages.renamed!(old_data, fp.dest)
50
- Messages.changed_tags(fp, old_data, false) if fp.source.class.has_writable_tags
51
- else
58
+ Messages.changed_tags(fp, old_data, header: false) if fp.source.class.writable_tags?
59
+ renamed += 1
60
+ elsif fp.source.class.writable_tags?
52
61
  Messages.changed_tags(fp, old_data)
62
+ renamed += 1
63
+ else
64
+ Messages.file_exists(fp)
65
+ Messages.file_hash(fp, @cfg.global.hash_type) if @cfg.global.hash_if_exists
66
+ errors += 1
53
67
  end
54
-
55
68
  else
56
69
  Messages.skipping(fp)
70
+ skipped += 1
57
71
  end
58
72
  end
73
+ Messages.renaming_summary(renamed, skipped, errors)
59
74
  end
60
75
 
61
76
  def globals
62
- Messages.label 'Global configurations:'
77
+ Messages.label "Global configurations:"
63
78
  Messages.config_list @cfg.global
64
79
  end
65
80
 
66
81
  def configs
67
- Messages.label 'Filter\'s configurations:'
82
+ Messages.label "Filter's configurations:"
68
83
  Messages.config_list @cfg.filter
69
84
  end
70
85
 
71
86
  def words
72
- Messages.label 'Groups and subgroups of words available for translation:'
87
+ Messages.label "Groups and subgroups of words available for translation:"
73
88
  Messages.config_multilist @cfg.words
74
89
  end
75
90
 
76
91
  def dry_run
92
+ expand_files!
77
93
  raise MissingFiles if @files.empty?
78
94
 
79
95
  @filters.expand_macros!(@cfg.macro)
80
- cache = []
96
+ cache = {}
97
+ renamed = 0
98
+ skipped = 0
99
+ errors = 0
81
100
 
82
101
  Messages.label "Dry Run:"
83
102
  @files.each do |src|
84
-
85
103
  fp = FilterPipe.new(src, @filters, @cfg).apply
86
104
 
87
105
  if fp.unchanged?
88
106
  Messages.skipping(fp)
89
- elsif (cache.include?(fp.dest.full_filename) || fp.dest.exists?)
107
+ skipped += 1
108
+ elsif cache.keys.include?(fp.dest.full_filename) || fp.dest.exists?
90
109
  if fp.source.full_filename == fp.dest.full_filename
91
110
  Messages.changed_tags(fp)
92
111
  else
93
112
  Messages.file_exists(fp)
113
+ Messages.file_hash(fp, @cfg.global.hash_type, cache[fp.dest.full_filename]) if @cfg.global.hash_if_exists
114
+ errors += 1
94
115
  end
95
116
  else
96
117
  Messages.renamed(fp)
97
- Messages.changed_tags(fp, {}, false) if fp.source.class.has_writable_tags
98
- cache << fp.dest.full_filename
118
+ Messages.changed_tags(fp, {}, header: false) if fp.source.class.writable_tags?
119
+ cache[fp.dest.full_filename] = fp.dest
120
+ renamed += 1
99
121
  end
100
122
  end
123
+ Messages.renaming_summary(renamed, skipped, errors)
101
124
  end
102
125
 
103
126
  def targets
127
+ expand_files!
104
128
  raise MissingFiles if @files.empty?
105
129
 
106
- Messages.label 'Targets:'
130
+ view = @cfg.global.inline_targets ? :inline_targets : :column_targets
131
+ Messages.label "Targets:"
107
132
  @files.each do |src|
133
+ fname = FilenameFactory.create(src, @cfg.global)
134
+
135
+ Messages.multi fname.full_filename
136
+ Messages.send(view, fname)
137
+ end
138
+ end
139
+
140
+ def values
141
+ expand_files!
142
+ raise MissingFiles if @files.empty?
108
143
 
144
+ view = @cfg.global.inline_targets ? :inline_target_values : :column_target_values
145
+ Messages.label "Target values:"
146
+ @files.each do |src|
109
147
  fname = FilenameFactory.create(src, @cfg.global)
110
148
 
111
149
  Messages.multi fname.full_filename
112
- Messages.send(@cfg.global.targets == :short ? :short_targets : :long_targets, fname)
150
+ Messages.send(view, fname)
113
151
  end
114
152
  end
115
153
 
116
154
  def macros
117
- Messages.label 'Macros:'
118
- Messages.list @cfg.macro.get_macros
155
+ Messages.label "Macros:"
156
+ Messages.list @cfg.macro.macros
119
157
  end
120
158
 
121
159
  def show_macro
122
160
  Messages.label "Macro: #{@show_macro}"
123
161
  macro = @cfg.macro.get_macro(@show_macro)
124
- if macro.class == Array
162
+ if macro.instance_of?(Array)
125
163
  macro.each do |k|
126
- Messages.item k.keys.first.to_s + ': ' + k.values.first.map { |x| '"' + x.to_s.green + '"' }.join(',')
164
+ Messages.item "#{k.keys.first}: " + k.values.first.map { |x| "\"#{x.to_s.green}\"" }.join(",")
127
165
  end
128
- elsif macro.class == Hash
166
+ elsif macro.instance_of?(Hash)
129
167
  macro.each do |k, v|
130
- Messages.item k.to_s + ': ' + v.map { |x| '"' + x.to_s.green + '"' }.join(', ')
168
+ Messages.item "#{k}: " + v.map { |x| "\"#{x.to_s.green}\"" }.join(", ")
131
169
  end
132
170
  end
133
171
  end
134
172
 
135
- end
173
+ def help_config
174
+ name = @help_config.downcase.gsub("-", "_").gsub(/^--/, "")
175
+
176
+ if name =~ /^g_/
177
+ name = name.gsub(/^g_/, "")
178
+ @help_config = GlobalConfig::OPTIONS[name.to_sym]
179
+ elsif @help_config =~ /^f_/
180
+ name = name.gsub(/^f_/, "")
181
+ @help_config = FilterConfig::OPTIONS[name.to_sym]
182
+ elsif FilterConfig::OPTIONS.key?(name.to_sym)
183
+ @help_config = FilterConfig::OPTIONS[name.to_sym]
184
+ elsif GlobalConfig::OPTIONS.key?(name.to_sym)
185
+ @help_config = GlobalConfig::OPTIONS[name.to_sym]
186
+ else
187
+ raise InvalidOption, name
188
+ end
189
+ Messages.help_option name, @help_config
190
+ end
191
+
192
+ private
193
+
194
+ def expand_files!
195
+ @files = @files.map do |f|
196
+ f = File.expand_path(f.chomp)
197
+ raise FileNotFound, f if @cfg.global.check_source && !File.exist?(f)
136
198
 
199
+ f
200
+ end
201
+ end
202
+ end
137
203
  end
@@ -1,19 +1,27 @@
1
1
  ---
2
2
  :global:
3
- :hash_type: :none
3
+ :hash_type: :md5
4
+ :hash_on_tags: false
5
+ :hash_if_exists: true
4
6
  :date_format: '%Y-%m-%d'
5
7
  :counter_length: 3
6
8
  :counter_start: 0
7
- :targets: :short
8
- :pdf_metadata: false
9
- :image_metadata: false
9
+ :inline_targets: true
10
+ :pdf_metadata: true
11
+ :image_metadata: true
12
+ :audio_metadata: true
13
+ :mimemagic: true
14
+ :essential_tags: false
15
+ :check_source: true
10
16
  :filter:
11
17
  :lang: :en
12
18
  :word_separator: " "
19
+ :number_separator: '.'
20
+ :occurrence_separator: '-'
13
21
  :target: :name
14
22
  :ignore_case: true
15
23
  :grep: '.*'
16
- :grep_on: :source
24
+ :grep_on_dest: false
17
25
  :grep_exclude: false
18
26
  # full_filename, :full_path, :filename, <target>
19
27
  :grep_target: :full_filename
@@ -27,6 +35,12 @@
27
35
  :fr: ['Salut']
28
36
  :es: ['Hola']
29
37
  :pt: ['Olá']
38
+ :months:
39
+ :short: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
40
+ :long: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
41
+ :days:
42
+ :short: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
43
+ :long: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
30
44
  :short_months:
31
45
  :en: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
32
46
  :it: ['Gen', 'Feb', 'Mar', 'Apr', 'Mag', 'Giu', 'Lug', 'Ago', 'Set', 'Ott', 'Nov', 'Dic']
@@ -70,32 +84,32 @@
70
84
  :squeeze:
71
85
  - ' '
72
86
  -
73
- :translate_words:
87
+ :translate:
74
88
  - :long_months
75
89
  - :it
76
90
  - :en
77
91
  -
78
- :translate_words:
92
+ :translate:
79
93
  - :long_months
80
94
  - :es
81
95
  - :en
82
96
  -
83
- :translate_words:
97
+ :translate:
84
98
  - :long_months
85
99
  - :fr
86
100
  - :en
87
101
  -
88
- :translate_words:
102
+ :translate:
89
103
  - :long_months
90
104
  - :de
91
105
  - :en
92
106
  -
93
- :translate_words:
107
+ :translate:
94
108
  - :long_months
95
109
  - :hr
96
110
  - :en
97
111
  -
98
- :translate_words:
112
+ :translate:
99
113
  - :long_months
100
114
  - :pt
101
115
  - :en
@@ -113,7 +127,7 @@
113
127
  - '\1 \2'
114
128
  append_issue:
115
129
  :move_to:
116
- - '(Issue|Volume) ([0-9]+)'
130
+ - 'Volume +([0-9]+)|Issue +([0-9]+)'
117
131
  - 'tmp'
118
132
  :template:
119
133
  - '<name> #<tmp>'
@@ -144,7 +158,7 @@
144
158
  - ignore_case:false
145
159
  -
146
160
  :replace:
147
- - "([A-Z])([a-z!']+)"
161
+ - "(?<![A-Z])([A-Z])([a-z!',-]+)"
148
162
  - " \\1\\2 "
149
163
  -
150
164
  :replace:
metadata CHANGED
@@ -1,59 +1,44 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: filter_rename
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fabio Mucciante
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2020-03-16 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
- name: bundler
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '2.0'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '2.0'
27
- - !ruby/object:Gem::Dependency
28
- name: rake
13
+ name: differ
29
14
  requirement: !ruby/object:Gem::Requirement
30
15
  requirements:
31
- - - "~>"
16
+ - - ">="
32
17
  - !ruby/object:Gem::Version
33
- version: '13.0'
34
- type: :development
18
+ version: '0'
19
+ type: :runtime
35
20
  prerelease: false
36
21
  version_requirements: !ruby/object:Gem::Requirement
37
22
  requirements:
38
- - - "~>"
23
+ - - ">="
39
24
  - !ruby/object:Gem::Version
40
- version: '13.0'
25
+ version: '0'
41
26
  - !ruby/object:Gem::Dependency
42
- name: rspec
27
+ name: exiv2
43
28
  requirement: !ruby/object:Gem::Requirement
44
29
  requirements:
45
- - - "~>"
30
+ - - ">="
46
31
  - !ruby/object:Gem::Version
47
- version: '3.0'
48
- type: :development
32
+ version: '0'
33
+ type: :runtime
49
34
  prerelease: false
50
35
  version_requirements: !ruby/object:Gem::Requirement
51
36
  requirements:
52
- - - "~>"
37
+ - - ">="
53
38
  - !ruby/object:Gem::Version
54
- version: '3.0'
39
+ version: '0'
55
40
  - !ruby/object:Gem::Dependency
56
- name: mp3info
41
+ name: fastimage
57
42
  requirement: !ruby/object:Gem::Requirement
58
43
  requirements:
59
44
  - - ">="
@@ -67,7 +52,7 @@ dependencies:
67
52
  - !ruby/object:Gem::Version
68
53
  version: '0'
69
54
  - !ruby/object:Gem::Dependency
70
- name: mimemagic
55
+ name: keisan
71
56
  requirement: !ruby/object:Gem::Requirement
72
57
  requirements:
73
58
  - - ">="
@@ -81,7 +66,7 @@ dependencies:
81
66
  - !ruby/object:Gem::Version
82
67
  version: '0'
83
68
  - !ruby/object:Gem::Dependency
84
- name: differ
69
+ name: mimemagic
85
70
  requirement: !ruby/object:Gem::Requirement
86
71
  requirements:
87
72
  - - ">="
@@ -95,7 +80,7 @@ dependencies:
95
80
  - !ruby/object:Gem::Version
96
81
  version: '0'
97
82
  - !ruby/object:Gem::Dependency
98
- name: exiv2
83
+ name: mp3info
99
84
  requirement: !ruby/object:Gem::Requirement
100
85
  requirements:
101
86
  - - ">="
@@ -109,7 +94,7 @@ dependencies:
109
94
  - !ruby/object:Gem::Version
110
95
  version: '0'
111
96
  - !ruby/object:Gem::Dependency
112
- name: fastimage
97
+ name: pdf-reader
113
98
  requirement: !ruby/object:Gem::Requirement
114
99
  requirements:
115
100
  - - ">="
@@ -123,7 +108,7 @@ dependencies:
123
108
  - !ruby/object:Gem::Version
124
109
  version: '0'
125
110
  - !ruby/object:Gem::Dependency
126
- name: pdf-reader
111
+ name: taglib-ruby
127
112
  requirement: !ruby/object:Gem::Requirement
128
113
  requirements:
129
114
  - - ">="
@@ -136,8 +121,9 @@ dependencies:
136
121
  - - ">="
137
122
  - !ruby/object:Gem::Version
138
123
  version: '0'
139
- description: Rename filenames applying a cascade of commands called filters in specified
140
- portion of it called targets.
124
+ description: FilterRename is a bulk renaming tool, based on the concept of filters
125
+ as small operations to perform over sections of the full filename logically represented
126
+ in targets.
141
127
  email:
142
128
  - fabio.mucciante@gmail.com
143
129
  executables:
@@ -145,8 +131,12 @@ executables:
145
131
  extensions: []
146
132
  extra_rdoc_files: []
147
133
  files:
134
+ - ".github/FUNDING.yml"
135
+ - ".github/workflows/gem-push.yml"
136
+ - ".github/workflows/main.yml"
148
137
  - ".gitignore"
149
138
  - ".rspec"
139
+ - ".rubocop.yml"
150
140
  - ".travis.yml"
151
141
  - CODE_OF_CONDUCT.md
152
142
  - Gemfile
@@ -163,6 +153,7 @@ files:
163
153
  - lib/filter_rename/config.rb
164
154
  - lib/filter_rename/filename.rb
165
155
  - lib/filter_rename/filename_factory.rb
156
+ - lib/filter_rename/filetype/audio_filename.rb
166
157
  - lib/filter_rename/filetype/image_filename.rb
167
158
  - lib/filter_rename/filetype/mp3_filename.rb
168
159
  - lib/filter_rename/filetype/pdf_filename.rb
@@ -176,11 +167,11 @@ licenses:
176
167
  - GPL-3.0
177
168
  metadata:
178
169
  bug_tracker_uri: https://github.com/fabiomux/filter_rename/issues
179
- documentation_uri: https://www.rubydoc.info/gems/filter_rename/1.0.0
180
- homepage_uri: https://github.com/fabiomux/filter_rename
170
+ homepage_uri: https://freeaptitude.altervista.org/projects/filter-rename.html
181
171
  source_code_uri: https://github.com/fabiomux/filter_rename
172
+ changelog_uri: https://freeaptitude.altervista.org/projects/filter-rename.html#changelog
182
173
  wiki_uri: https://github.com/fabiomux/filter_rename/wiki
183
- post_install_message:
174
+ rubygems_mfa_required: 'true'
184
175
  rdoc_options: []
185
176
  require_paths:
186
177
  - lib
@@ -188,15 +179,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
188
179
  requirements:
189
180
  - - ">="
190
181
  - !ruby/object:Gem::Version
191
- version: '0'
182
+ version: 2.5.0
192
183
  required_rubygems_version: !ruby/object:Gem::Requirement
193
184
  requirements:
194
185
  - - ">="
195
186
  - !ruby/object:Gem::Version
196
187
  version: '0'
197
188
  requirements: []
198
- rubygems_version: 3.0.8
199
- signing_key:
189
+ rubygems_version: 3.6.7
200
190
  specification_version: 4
201
- summary: Rename filenames through a chain of filter.
191
+ summary: File renaming tool which make use of a chain of actions called filters.
202
192
  test_files: []