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.
@@ -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: []