modname 0.2
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 +7 -0
- data/bin/modname +9 -0
- data/lib/modname.rb +75 -0
- data/lib/modname/banner.rb +38 -0
- data/lib/modname/modder.rb +178 -0
- data/lib/modname/version.rb +3 -0
- data/readme.md +28 -0
- metadata +106 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 4f50f9ac75d94e1198c7428c0320ae0b21c8bee7
|
4
|
+
data.tar.gz: 6cec21fe52d84ba870a7f8000f6262112c28bf1e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b0798503891d854c2e9ff18a90dd3b93216444295853600e5a232a266a022d2a49c718d2fe00574a0ad4d660e594916e651121bab8ef69952017c1a9910b02b4
|
7
|
+
data.tar.gz: b6f70e107bd19b801e9d39c1cb0bc42178278e146e19cb597fe5220e5826541db3cfc7b425918894d3c351a9ca54496055106adb0ab41a3b60e3a49db79d928f
|
data/bin/modname
ADDED
data/lib/modname.rb
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
# parse modname's command line args
|
2
|
+
|
3
|
+
|
4
|
+
require "colored"
|
5
|
+
require "modname/banner"
|
6
|
+
require "modname/modder"
|
7
|
+
require "modname/version"
|
8
|
+
|
9
|
+
|
10
|
+
module Modname
|
11
|
+
class << self # defining Modname.run
|
12
|
+
def run(x) Driver.new.run x end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
class Modname::Driver
|
18
|
+
include Modder
|
19
|
+
|
20
|
+
attr_reader :options
|
21
|
+
|
22
|
+
def initialize
|
23
|
+
@options = {:force => false, :recurse => false}
|
24
|
+
@transfer = {}
|
25
|
+
end
|
26
|
+
|
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]
|
34
|
+
|
35
|
+
case cmd
|
36
|
+
when "file"
|
37
|
+
regex opts[:args]
|
38
|
+
|
39
|
+
when "ext"
|
40
|
+
exts opts[:args]
|
41
|
+
|
42
|
+
when "help"
|
43
|
+
puts Modname::VHelpBanner
|
44
|
+
|
45
|
+
when "version"
|
46
|
+
puts Modname::Version
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# parse out arguments
|
52
|
+
def parse(args)
|
53
|
+
opts = {:cmd => "file", :args => []}
|
54
|
+
|
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
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
opts
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Modname end
|
2
|
+
|
3
|
+
|
4
|
+
Modname::HelpBanner = <<-HELP
|
5
|
+
#{'Usage:'.cyan} modname [options] <match> [transform]
|
6
|
+
|
7
|
+
#{'modname | rename files, fast'.cyan}
|
8
|
+
-e #{'|'.cyan} change file extensions
|
9
|
+
-f #{'|'.cyan} force run; don't pre-check
|
10
|
+
-r #{'|'.cyan} run modname recursively
|
11
|
+
-h #{'|'.cyan} show more help, examples
|
12
|
+
HELP
|
13
|
+
|
14
|
+
|
15
|
+
Modname::VHelpBanner = <<-VHELP
|
16
|
+
#{Modname::HelpBanner}
|
17
|
+
#{'commands'.cyan}
|
18
|
+
file names
|
19
|
+
[match] [trans] => modify a pattern in filenames
|
20
|
+
[match] => delete a pattern from filenames
|
21
|
+
|
22
|
+
extensions (-e)
|
23
|
+
[old] [new] => move file extensions, <old> to <new>
|
24
|
+
[ext] => lowercase one extension type (EXT => ext)
|
25
|
+
nil => move all extensions to lower case
|
26
|
+
|
27
|
+
#{'examples'.cyan}
|
28
|
+
file names
|
29
|
+
modname hello => deletes 'hello' from all filenames
|
30
|
+
modname hello byebye => replace 'hello' with byebye
|
31
|
+
|
32
|
+
extensions (-e)
|
33
|
+
modname -e txt md => move all txt files to markdown
|
34
|
+
modname -e mov mp4 => move all mov files to mp4
|
35
|
+
|
36
|
+
#{'Note:'.cyan} <required> [optional]
|
37
|
+
VHELP
|
38
|
+
|
@@ -0,0 +1,178 @@
|
|
1
|
+
# modder, the modname helper
|
2
|
+
# generally: o-old, n-new
|
3
|
+
|
4
|
+
|
5
|
+
# any module including modder should implement:
|
6
|
+
# @transfer => hash of file transfers to occur
|
7
|
+
# @options => hash with :recurse and :force
|
8
|
+
|
9
|
+
|
10
|
+
# extensions
|
11
|
+
module Modder
|
12
|
+
|
13
|
+
# rename files based on regular expressions
|
14
|
+
def regex(args = [])
|
15
|
+
match, trans = Modder.parse args
|
16
|
+
|
17
|
+
Modder.files(@options[:recurse]).each do |file|
|
18
|
+
new = file.sub Regexp.new(match), trans
|
19
|
+
|
20
|
+
next if (new == file || new == "") # no changes
|
21
|
+
|
22
|
+
@transfer[file] = new
|
23
|
+
end
|
24
|
+
|
25
|
+
Modder.finish @transfer, @options[:force]
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
# change one file extension to another's type
|
30
|
+
def exts(args = [])
|
31
|
+
match, trans = Modder.parse args
|
32
|
+
|
33
|
+
if match.empty? && trans.empty? # do all
|
34
|
+
undercase_ext
|
35
|
+
|
36
|
+
elsif trans.empty? # undercase one ext
|
37
|
+
undercase_ext match
|
38
|
+
|
39
|
+
else # move match extension to targeted
|
40
|
+
Modder.files(@options[:recurse]).each do |file|
|
41
|
+
new = file.sub /#{match}$/, trans
|
42
|
+
|
43
|
+
next if new == file # no changes
|
44
|
+
|
45
|
+
@transfer[file] = new
|
46
|
+
end
|
47
|
+
|
48
|
+
Modder.finish @transfer, @options[:force]
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# top level wrapper for exts
|
53
|
+
def undercase_ext(ext = "")
|
54
|
+
transfer = Modder.undercase_ext_get ext, @options[:recurse]
|
55
|
+
Modder.undercase_ext_set ext, transfer, @options[:force]
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
# module methods
|
61
|
+
class << Modder
|
62
|
+
|
63
|
+
# return appropriate args, repairing if undefined
|
64
|
+
def parse(args)
|
65
|
+
match = args.shift
|
66
|
+
trans = args.shift
|
67
|
+
match = "" if match.nil?
|
68
|
+
trans = "" if trans.nil?
|
69
|
+
return match, trans
|
70
|
+
end
|
71
|
+
|
72
|
+
# double check transformations
|
73
|
+
def confirm?
|
74
|
+
print "Are these changes ok? [yN] "
|
75
|
+
($stdin.gets.chomp!).downcase[0] == "y"
|
76
|
+
end
|
77
|
+
|
78
|
+
# return a list of files to examine
|
79
|
+
def files(recurse)
|
80
|
+
if recurse
|
81
|
+
Dir['**/*'].select { |f| File.file?(f) }
|
82
|
+
else
|
83
|
+
Dir.entries(Dir.pwd).select { |f| File.file? f }
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
|
88
|
+
# show the status of current files
|
89
|
+
def status(transfer)
|
90
|
+
if transfer.empty?
|
91
|
+
puts "No matches found.".yellow
|
92
|
+
else
|
93
|
+
puts "Planned file actions:".green
|
94
|
+
transfer.each { |o, n| puts "\t#{o} -> #{n.green}" }
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
# rename all files
|
99
|
+
def execute(transfer)
|
100
|
+
transfer.each { |o, n| Modder.rename o, n }
|
101
|
+
end
|
102
|
+
|
103
|
+
|
104
|
+
# finish up execution, highest level wrapper
|
105
|
+
def finish(transfer, force)
|
106
|
+
|
107
|
+
# print changes, return if none
|
108
|
+
Modder.status transfer
|
109
|
+
return if transfer.empty?
|
110
|
+
|
111
|
+
if force || Modder.confirm?
|
112
|
+
Modder.execute transfer
|
113
|
+
puts "Modifications complete."
|
114
|
+
else
|
115
|
+
puts "No modifications done."
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
# try to rename a given file
|
120
|
+
def rename(o, n)
|
121
|
+
begin
|
122
|
+
exist = "#{'Error:'.red} target file |#{n.green}| already exists"
|
123
|
+
(File.exist? n) ? raise(exist) : File.rename(o, n)
|
124
|
+
|
125
|
+
rescue => e
|
126
|
+
puts "#{'Error:'.red} could not move |#{o.red}| to |#{n.green}|"
|
127
|
+
puts e.message
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
|
132
|
+
# get all extensions to change
|
133
|
+
def undercase_ext_get(ext, recurse)
|
134
|
+
transfer = Hash.new
|
135
|
+
allexts = ext.empty?
|
136
|
+
Modder.files(recurse).each do |file|
|
137
|
+
ext = file.split(".").last if allexts
|
138
|
+
|
139
|
+
new = file.sub /#{ext}$/i, ext.downcase
|
140
|
+
next if new == file || ext == file # no changes or extension
|
141
|
+
|
142
|
+
transfer[file] = new
|
143
|
+
end
|
144
|
+
|
145
|
+
transfer
|
146
|
+
end
|
147
|
+
|
148
|
+
# set all extensions to change
|
149
|
+
# this involves moving it to a tmp file first, since most file systems are
|
150
|
+
# not case sensitive and therefore wont distiniguish between HI and hi.
|
151
|
+
# to get around this, we can set HI to HI.hash, then set HI.hash to hi
|
152
|
+
def undercase_ext_set(ext, transfer, force)
|
153
|
+
puts "Lowering extension: ".green + (ext.empty?? "*" : ext)
|
154
|
+
|
155
|
+
Modder.status transfer
|
156
|
+
return if transfer.empty?
|
157
|
+
|
158
|
+
# confirm current changes
|
159
|
+
if force || Modder.confirm?
|
160
|
+
final = {}
|
161
|
+
temp = {}
|
162
|
+
|
163
|
+
# create hash temp map
|
164
|
+
transfer.each do |k, v|
|
165
|
+
tempfile = (v.hash * v.object_id).abs.to_s
|
166
|
+
final[tempfile] = v
|
167
|
+
temp[k] = tempfile
|
168
|
+
end
|
169
|
+
|
170
|
+
Modder.execute temp
|
171
|
+
Modder.execute final
|
172
|
+
puts "Modifications complete."
|
173
|
+
else
|
174
|
+
puts "No modifications done."
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
data/readme.md
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
modname
|
2
|
+
=======
|
3
|
+
|
4
|
+
|
5
|
+
[](https://badge.fury.io/rb/modname)
|
6
|
+
[](https://travis-ci.org/jeremywrnr/modname)
|
7
|
+
[](http://jeremywrnr.com/mit-license)
|
8
|
+
|
9
|
+
|
10
|
+
a versatile file naming tool.
|
11
|
+
|
12
|
+
easily rename groups of files with regex replacements.
|
13
|
+
|
14
|
+
also supports easily changing file extensions.
|
15
|
+
|
16
|
+
|
17
|
+
## setup
|
18
|
+
|
19
|
+
$ [sudo] gem install modname
|
20
|
+
|
21
|
+
## modname usage
|
22
|
+
|
23
|
+
## about
|
24
|
+
|
25
|
+
## development / testing
|
26
|
+
|
27
|
+
## todos
|
28
|
+
|
metadata
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: modname
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.2'
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jeremy Warner
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-01-18 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: colored
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.2'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.2'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: ronn
|
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: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec-mocks
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: easily rename groups of files with regex replacements.
|
70
|
+
email: jeremywrnr@gmail.com
|
71
|
+
executables:
|
72
|
+
- modname
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- bin/modname
|
77
|
+
- lib/modname.rb
|
78
|
+
- lib/modname/banner.rb
|
79
|
+
- lib/modname/modder.rb
|
80
|
+
- lib/modname/version.rb
|
81
|
+
- readme.md
|
82
|
+
homepage: http://github.com/jeremywrnr/booker
|
83
|
+
licenses:
|
84
|
+
- MIT
|
85
|
+
metadata: {}
|
86
|
+
post_install_message:
|
87
|
+
rdoc_options: []
|
88
|
+
require_paths:
|
89
|
+
- lib
|
90
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
100
|
+
requirements: []
|
101
|
+
rubyforge_project:
|
102
|
+
rubygems_version: 2.5.1
|
103
|
+
signing_key:
|
104
|
+
specification_version: 4
|
105
|
+
summary: a versatile file naming tool.
|
106
|
+
test_files: []
|