modname 0.2.3 → 1.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: db801b72d84bfda8d0aea8c3fbfc0f0954605f4b
4
- data.tar.gz: 67668d19c866e0c6399a91e3c834744cae05cd93
2
+ SHA256:
3
+ metadata.gz: a75ac155dd3255d8cebd50ec9e01e629a9f64aa0b17090e482db22978baf8832
4
+ data.tar.gz: 29414f4677355f27ddda53fbfd857241adf1550c28709c955da4e2165b71d1c6
5
5
  SHA512:
6
- metadata.gz: 5854fa779812fab689e2b56cc94ec320734801312baebe5c411459f1ab091d3eb92999cc3eac0f3d44e86dd140a2a98e26a9c17e5a85f8e247a7eb14b28fb5cd
7
- data.tar.gz: 72c46d7f40051dd48b6e1077697255f68d36dc9a8a781452c6002afbeed0fd040b479225168a13deca6038fda7c8260d40b3cfd3bbddf4d7444ed80fbd6024a5
6
+ metadata.gz: 2ea30c66c31f07b5b5f928cb49c0fd8cbddd6d765042b7b3f1cdd7c08e746d0085f7dd916e32488424b3c9a594a46a9c7ccd1fe769d663b0217b49b60216e6f6
7
+ data.tar.gz: 39b3a3d68f4462308713223c71b6fc7a7b307f333f452e1b1c4cf7e9509698e075c7ab2023dd6adcc25581e87dbecceb1dde56cf62b7022b29f1c5abbdb2eed8
data/bin/modname CHANGED
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
- require "modname"
4
+ require 'modname'
4
5
 
5
6
  # modname by jeremy warner
6
7
  # easily rename files/extensions with ruby regex.
7
8
 
8
9
  Modname.run(ARGV)
9
-
@@ -1,39 +1,39 @@
1
- module Modname end
1
+ # frozen_string_literal: true
2
2
 
3
+ # Modname is a versatile file naming tool for renaming groups of files
4
+ module Modname end
3
5
 
4
- Modname::HelpBanner = <<-HELP
5
- #{'Usage:'.cyan} modname [options] <match> [transform]
6
+ Modname::HELP_BANNER = <<~HELP.freeze
7
+ #{'Usage:'.cyan} modname [options] <match> [transform]
6
8
 
7
- #{'modname | rename files, fast'.cyan}
8
- #{'--------┼----------------------------'.cyan}
9
- -e #{'|'.cyan} change file extensions
10
- -f #{'|'.cyan} force run; don't pre-check
11
- -r #{'|'.cyan} run modname recursively
12
- -h #{'|'.cyan} show more help, examples
9
+ #{'modname | rename files, fast'.cyan}
10
+ #{'--------┼----------------------------'.cyan}
11
+ -e #{'|'.cyan} change file extensions
12
+ -f #{'|'.cyan} force run; don't pre-check
13
+ -r #{'|'.cyan} run modname recursively
14
+ -h #{'|'.cyan} show more help, examples
13
15
  HELP
14
16
 
17
+ Modname::V_HELP_BANNER = <<~VHELP.freeze
18
+ #{Modname::HELP_BANNER}
19
+ #{'commands'.cyan}
20
+ file names
21
+ [match] [trans] => modify a pattern in filenames
22
+ [match] => delete a pattern from filenames
15
23
 
16
- Modname::VHelpBanner = <<-VHELP
17
- #{Modname::HelpBanner}
18
- #{'commands'.cyan}
19
- file names
20
- [match] [trans] => modify a pattern in filenames
21
- [match] => delete a pattern from filenames
24
+ extensions (-e)
25
+ [old] [new] => move file extensions, <old> to <new>
26
+ [ext] => lowercase one extension type (EXT => ext)
27
+ nil => move all extensions to lower case
22
28
 
23
- extensions (-e)
24
- [old] [new] => move file extensions, <old> to <new>
25
- [ext] => lowercase one extension type (EXT => ext)
26
- nil => move all extensions to lower case
29
+ #{'examples'.cyan}
30
+ file names
31
+ modname hello => deletes 'hello' from all filenames
32
+ modname hello byebye => replace 'hello' with byebye
27
33
 
28
- #{'examples'.cyan}
29
- file names
30
- modname hello => deletes 'hello' from all filenames
31
- modname hello byebye => replace 'hello' with byebye
34
+ extensions (-e)
35
+ modname -e txt md => move all txt files to markdown
36
+ modname -e mov mp4 => move all mov files to mp4
32
37
 
33
- extensions (-e)
34
- modname -e txt md => move all txt files to markdown
35
- modname -e mov mp4 => move all mov files to mp4
36
-
37
- #{'Note:'.cyan} <required> [optional]
38
+ #{'Note:'.cyan} <required> [optional]
38
39
  VHELP
39
-
@@ -1,31 +1,32 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # modder, the modname helper
2
4
  # generally: o-old, n-new
3
5
 
4
-
5
6
  # any module including modder should implement:
6
7
  # @transfer => hash of file transfers to occur
7
8
  # @options => hash with :recurse and :force
8
9
 
9
-
10
10
  # extensions
11
11
  module Modder
12
-
13
12
  # rename files based on regular expressions
14
13
  def regex(args = [])
15
14
  match, trans = Modder.parse args
16
15
 
17
16
  Modder.files(@options[:recurse]).each do |file|
18
- new = file.sub Regexp.new(match), trans
17
+ new = Modder.rename_base(file) do |base|
18
+ result = base.sub Regexp.new(match), trans
19
+ result.empty? ? base : result # no changes
20
+ end
19
21
 
20
- next if (new == file || new == "") # no changes
22
+ next if new.nil?
21
23
 
22
24
  @transfer[file] = new
23
25
  end
24
26
 
25
- Modder.finish @transfer, @options[:force]
27
+ Modder.finish @transfer, force: @options[:force]
26
28
  end
27
29
 
28
-
29
30
  # change one file extension to another's type
30
31
  def exts(args = [])
31
32
  match, trans = Modder.parse args
@@ -38,41 +39,39 @@ module Modder
38
39
 
39
40
  else # move match extension to targeted
40
41
  Modder.files(@options[:recurse]).each do |file|
41
- new = file.sub(/#{match}$/, trans)
42
+ new = Modder.rename_base(file) { |base| base.sub(/#{match}$/, trans) }
42
43
 
43
- next if new == file # no changes
44
+ next if new.nil?
44
45
 
45
46
  @transfer[file] = new
46
47
  end
47
48
 
48
- Modder.finish @transfer, @options[:force]
49
+ Modder.finish @transfer, force: @options[:force]
49
50
  end
50
51
  end
51
52
 
52
53
  # top level wrapper for exts
53
- def undercase_ext(ext = "")
54
+ def undercase_ext(ext = '')
54
55
  transfer = Modder.undercase_ext_get ext, @options[:recurse]
55
56
  Modder.undercase_ext_set ext, transfer, @options[:force]
56
57
  end
57
58
  end
58
59
 
59
-
60
60
  # module methods
61
61
  class << Modder
62
-
63
62
  # return appropriate args, repairing if undefined
64
63
  def parse(args)
65
64
  match = args.shift
66
65
  trans = args.shift
67
- match = "" if match.nil?
68
- trans = "" if trans.nil?
69
- return match, trans
66
+ match = '' if match.nil?
67
+ trans = '' if trans.nil?
68
+ [match, trans]
70
69
  end
71
70
 
72
71
  # double check transformations
73
72
  def confirm?
74
- print "Are these changes ok? [yN] "
75
- ($stdin.gets.chomp!).downcase[0] == "y"
73
+ print 'Are these changes ok? [yN] '
74
+ $stdin.gets.chomp.downcase[0] == 'y'
76
75
  end
77
76
 
78
77
  # return a list of files to examine
@@ -84,66 +83,73 @@ class << Modder
84
83
  end
85
84
  end
86
85
 
86
+ # apply a transformation to a file's basename only, preserving its directory.
87
+ # the block receives the basename and returns a new basename; returning it
88
+ # unchanged means no rename should happen, in which case nil is returned
89
+ def rename_base(file)
90
+ dir, base = File.split(file)
91
+ new_base = yield base
92
+
93
+ return nil if new_base == base
94
+
95
+ dir == '.' ? new_base : File.join(dir, new_base)
96
+ end
87
97
 
88
98
  # show the status of current files
89
99
  def status(transfer)
90
100
  if transfer.empty?
91
- puts "No matches found.".yellow
101
+ puts 'No matches found.'.yellow
92
102
  else
93
- puts "Planned file actions:".green
103
+ puts 'Planned file actions:'.green
94
104
  transfer.each { |o, n| puts "\t#{o} -> #{n.green}" }
95
105
  end
96
106
  end
97
107
 
98
108
  # rename all files
99
- def execute(transfer, force=false)
109
+ def execute(transfer, force: false)
100
110
  transfer.each { |o, n| Modder.rename o, n, force }
101
111
  end
102
112
 
103
-
104
113
  # finish up execution, highest level wrapper
105
- def finish(transfer, force=false)
106
-
114
+ def finish(transfer, force: false)
107
115
  # print changes, return if none
108
116
  Modder.status transfer
109
117
  return if transfer.empty?
110
118
 
111
119
  if force || Modder.confirm?
112
- Modder.execute transfer, force
113
- puts "Modifications complete."
120
+ Modder.execute transfer, force: force
121
+ puts 'Modifications complete.'
114
122
  else
115
- puts "No modifications done."
123
+ puts 'No modifications done.'
116
124
  end
117
125
  end
118
126
 
119
127
  # try to rename a given file
120
- def rename(o, n, force)
121
- begin
122
- exist = "#{'Error:'.red} target file |#{n.green}| already exists"
123
-
124
- # only overwrite when forced
125
- if (!force) && File.exist?(n)
126
- raise(exist)
127
- else
128
- File.rename(o, n)
129
- end
128
+ def rename(old, new, force)
129
+ exist = "#{'Error:'.red} target file |#{new.green}| already exists"
130
130
 
131
- rescue => e
132
- puts "#{'Error:'.red} could not move |#{o.red}| to |#{n.green}|"
133
- puts e.message
134
- end
135
- end
131
+ # only overwrite when forced
132
+ raise(exist) if (!force) && File.exist?(new)
136
133
 
134
+ File.rename(old, new)
135
+ rescue StandardError => e
136
+ puts "#{'Error:'.red} could not move |#{old.red}| to |#{new.green}|"
137
+ puts e.message
138
+ end
137
139
 
138
140
  # get all extensions to change
139
141
  def undercase_ext_get(ext, recurse)
140
- transfer = Hash.new
142
+ transfer = {}
141
143
  allexts = ext.empty?
142
144
  Modder.files(recurse).each do |file|
143
- ext = file.split(".").last if allexts
145
+ new = Modder.rename_base(file) do |base|
146
+ cur_ext = allexts ? base.split('.').last : ext
147
+ next base if cur_ext == base # no extension to change
144
148
 
145
- new = file.sub(/#{ext}$/i, ext.downcase)
146
- next if new == file || ext == file # no changes or extension
149
+ base.sub(/#{cur_ext}$/i, cur_ext.downcase)
150
+ end
151
+
152
+ next if new.nil?
147
153
 
148
154
  transfer[file] = new
149
155
  end
@@ -156,7 +162,7 @@ class << Modder
156
162
  # not case sensitive and therefore wont distiniguish between HI and hi.
157
163
  # to get around this, we can set HI to HI.hash, then set HI.hash to hi
158
164
  def undercase_ext_set(ext, transfer, force)
159
- puts "Lowering extension: ".green + (ext.empty?? "*" : ext)
165
+ puts 'Lowering extension: '.green + (ext.empty? ? '*' : ext)
160
166
 
161
167
  Modder.status transfer
162
168
  return if transfer.empty?
@@ -175,10 +181,9 @@ class << Modder
175
181
 
176
182
  Modder.execute temp
177
183
  Modder.execute final
178
- puts "Modifications complete."
184
+ puts 'Modifications complete.'
179
185
  else
180
- puts "No modifications done."
186
+ puts 'No modifications done.'
181
187
  end
182
188
  end
183
189
  end
184
-
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Modname
2
- Version = "0.2.3"
4
+ VERSION = '1.0.0'
3
5
  end
data/lib/modname.rb CHANGED
@@ -1,75 +1,76 @@
1
- # parse modname's command line args
2
-
1
+ # frozen_string_literal: true
3
2
 
4
- require "colored"
5
- require "modname/banner"
6
- require "modname/modder"
7
- require "modname/version"
3
+ # parse modname's command line args
8
4
 
5
+ require 'colored'
6
+ require_relative 'modname/banner'
7
+ require_relative 'modname/modder'
8
+ require_relative 'modname/version'
9
9
 
10
+ # Modname is a versatile file naming tool for renaming groups of files
10
11
  module Modname
11
- class << self # defining Modname.run
12
- def run(x) Driver.new.run x end
12
+ # defining Modname.run
13
+ class << self
14
+ def run(args) = Driver.new.run(args)
13
15
  end
14
- end
15
-
16
16
 
17
- class Modname::Driver
18
- include Modder
17
+ # Driver class handles command-line argument parsing and execution
18
+ class Driver
19
+ include Modder
19
20
 
20
- attr_reader :options
21
+ attr_reader :options
21
22
 
22
- def initialize
23
- @options = {:force => false, :recurse => false}
24
- @transfer = {}
25
- end
23
+ def initialize
24
+ @options = { force: false, recurse: false }
25
+ @transfer = {}
26
+ end
26
27
 
27
- # parse user arguments
28
- def run(args)
29
- if args.empty?
30
- puts Modname::HelpBanner
31
- else
32
- opts = parse args
33
- cmd = opts[:cmd]
28
+ # parse user arguments
29
+ def run(args)
30
+ if args.empty?
31
+ puts Modname::HELP_BANNER
32
+ else
33
+ opts = parse args
34
+ cmd = opts[:cmd]
34
35
 
35
- case cmd
36
- when "file"
37
- regex opts[:args]
36
+ case cmd
37
+ when 'file'
38
+ regex opts[:args]
38
39
 
39
- when "ext"
40
- exts opts[:args]
40
+ when 'ext'
41
+ exts opts[:args]
41
42
 
42
- when "help"
43
- puts Modname::VHelpBanner
43
+ when 'help'
44
+ puts Modname::V_HELP_BANNER
44
45
 
45
- when "version"
46
- puts Modname::Version
46
+ when 'version'
47
+ puts Modname::VERSION
48
+ end
47
49
  end
48
50
  end
49
- end
50
-
51
- # parse out arguments
52
- def parse(args)
53
- opts = {:cmd => "file", :args => []}
54
51
 
55
- args.each do |opt|
56
- case opt
57
- when "-f"
58
- @options[:force] = true
59
- when "-r"
60
- @options[:recurse] = true
61
- when "-e", "--ext"
62
- opts[:cmd] = "ext"
63
- when "-h", "--help"
64
- opts[:cmd] = "help"
65
- when "-v", "--version"
66
- opts[:cmd] = "version"
67
- else # command argument
68
- opts[:args] << opt
52
+ # parse out arguments
53
+ def parse(args)
54
+ opts = { cmd: 'file', args: [] }
55
+
56
+ args.each do |opt|
57
+ case opt
58
+ when '-f'
59
+ @options[:force] = true
60
+ when '-r'
61
+ @options[:recurse] = true
62
+ when '-e', '--ext'
63
+ opts[:cmd] = 'ext'
64
+ when '-h', '--help'
65
+ opts[:cmd] = 'help'
66
+ when '-v', '--version'
67
+ opts[:cmd] = 'version'
68
+ else # command argument
69
+ opts[:args] << opt
70
+ end
69
71
  end
70
- end
71
72
 
72
- opts
73
+ opts
74
+ end
73
75
  end
74
76
  end
75
-
data/readme.md CHANGED
@@ -3,8 +3,6 @@ modname
3
3
 
4
4
 
5
5
  [![Gem Version](https://badge.fury.io/rb/modname.svg)](https://badge.fury.io/rb/modname)
6
- [![Build Status](https://travis-ci.org/jeremywrnr/modname.svg?branch=master)](https://travis-ci.org/jeremywrnr/modname)
7
- [![Code Climate](https://codeclimate.com/github/jeremywrnr/modname/badges/gpa.svg)](https://codeclimate.com/github/jeremywrnr/modname)
8
6
  [![MIT](https://img.shields.io/npm/l/alt.svg?style=flat)](http://jeremywrnr.com/mit-license)
9
7
 
10
8
 
@@ -54,6 +52,12 @@ examples
54
52
  Note: <required> [optional]
55
53
  ```
56
54
 
55
+ ### examples
56
+
57
+ modname -e jpeg jpg # change all jpeg file exts to jpg
58
+ modname -e # change all file extensions to lowercase
59
+ modname '(.*)' 'jeremy \1' # use grouping to prepend string
60
+
57
61
 
58
62
  ## development / testing
59
63
 
@@ -66,16 +70,15 @@ try running `gem install bundler`. Once that is done:
66
70
  Now, we should be able to build the gem locally. This will build the local
67
71
  modname gem and link it in your path, so you can playing around with `modname`.
68
72
 
69
- rake build
73
+ just build
70
74
 
71
- This uses `rspec` and `rake` to run a suite of unit tests. To run the suite:
75
+ This uses `rspec` and `just` to run a suite of unit tests. To run the suite:
72
76
 
73
- rake
77
+ just spec
74
78
 
75
79
 
76
80
  ## todos
77
81
 
78
- - only try to rename filenames, not folders on recursive calls
79
82
  - figure out whats up with the extension globbing
80
83
  - apply optionally to directories as well
81
84
 
metadata CHANGED
@@ -1,45 +1,30 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: modname
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Warner
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2016-08-28 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
13
  name: colored
15
14
  requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
- - - ">="
16
+ - - "~>"
18
17
  - !ruby/object:Gem::Version
19
18
  version: '1.2'
20
19
  type: :runtime
21
20
  prerelease: false
22
21
  version_requirements: !ruby/object:Gem::Requirement
23
22
  requirements:
24
- - - ">="
23
+ - - "~>"
25
24
  - !ruby/object:Gem::Version
26
25
  version: '1.2'
27
26
  - !ruby/object:Gem::Dependency
28
- name: rake
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: ronn
27
+ name: rspec
43
28
  requirement: !ruby/object:Gem::Requirement
44
29
  requirements:
45
30
  - - ">="
@@ -53,7 +38,7 @@ dependencies:
53
38
  - !ruby/object:Gem::Version
54
39
  version: '0'
55
40
  - !ruby/object:Gem::Dependency
56
- name: rspec
41
+ name: rspec-mocks
57
42
  requirement: !ruby/object:Gem::Requirement
58
43
  requirements:
59
44
  - - ">="
@@ -67,19 +52,19 @@ dependencies:
67
52
  - !ruby/object:Gem::Version
68
53
  version: '0'
69
54
  - !ruby/object:Gem::Dependency
70
- name: rspec-mocks
55
+ name: simplecov
71
56
  requirement: !ruby/object:Gem::Requirement
72
57
  requirements:
73
- - - ">="
58
+ - - "~>"
74
59
  - !ruby/object:Gem::Version
75
- version: '0'
60
+ version: 0.22.0
76
61
  type: :development
77
62
  prerelease: false
78
63
  version_requirements: !ruby/object:Gem::Requirement
79
64
  requirements:
80
- - - ">="
65
+ - - "~>"
81
66
  - !ruby/object:Gem::Version
82
- version: '0'
67
+ version: 0.22.0
83
68
  description: easily rename groups of files with regex replacements.
84
69
  email: jeremywrnr@gmail.com
85
70
  executables:
@@ -97,7 +82,6 @@ homepage: http://github.com/jeremywrnr/modname
97
82
  licenses:
98
83
  - MIT
99
84
  metadata: {}
100
- post_install_message:
101
85
  rdoc_options: []
102
86
  require_paths:
103
87
  - lib
@@ -112,10 +96,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
112
96
  - !ruby/object:Gem::Version
113
97
  version: '0'
114
98
  requirements: []
115
- rubyforge_project:
116
- rubygems_version: 2.5.1
117
- signing_key:
99
+ rubygems_version: 4.0.10
118
100
  specification_version: 4
119
101
  summary: a versatile file naming tool.
120
102
  test_files: []
121
- has_rdoc: