modname 0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "modname"
4
+
5
+ # modname by jeremy warner
6
+ # easily rename files/extensions with ruby regex.
7
+
8
+ Modname.run(ARGV)
9
+
@@ -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
+
@@ -0,0 +1,3 @@
1
+ module Modname
2
+ Version = "0.2"
3
+ end
@@ -0,0 +1,28 @@
1
+ modname
2
+ =======
3
+
4
+
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
+ [![MIT](https://img.shields.io/npm/l/alt.svg?style=flat)](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: []