nrename 0.1.0 → 0.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/README.md +20 -1
- data/bin/nrename +1 -1
- data/features/options_processing.feature +0 -5
- data/features/renaming_files.feature +4 -17
- data/lib/nrename/directory.rb +15 -38
- data/lib/nrename/numbered_file.rb +51 -0
- data/lib/nrename/options.rb +46 -29
- data/lib/nrename/runner.rb +14 -0
- data/lib/nrename/version.rb +1 -1
- data/lib/nrename.rb +10 -7
- data/spec/nrename/directory_spec.rb +51 -58
- data/spec/nrename/numbered_file_spec.rb +70 -0
- data/spec/nrename/options_spec.rb +10 -14
- data/spec/spec_helper.rb +4 -0
- metadata +52 -16
data/README.md
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
[](http://travis-ci.org/vderyagin/nrename)
|
2
2
|
[](https://gemnasium.com/vderyagin/nrename)
|
3
|
+
[](https://codeclimate.com/github/vderyagin/nrename)
|
3
4
|
|
4
5
|
# Nrename
|
5
6
|
|
@@ -11,6 +12,12 @@ Command-line utility for renaming numbered files.
|
|
11
12
|
gem install nrename
|
12
13
|
```
|
13
14
|
|
15
|
+
## Compatibility ##
|
16
|
+
|
17
|
+
This gem does not have any external runtime dependencies, nor does it use any
|
18
|
+
fancy language features/syntax, so it works on pretty much every Ruby
|
19
|
+
implementation out there.
|
20
|
+
|
14
21
|
## Description ##
|
15
22
|
|
16
23
|
|
@@ -52,4 +59,16 @@ names:
|
|
52
59
|
|
53
60
|
## Usage ##
|
54
61
|
|
55
|
-
|
62
|
+
```
|
63
|
+
$ nrename --help
|
64
|
+
Usage: nrename [OPTINS] DIR...
|
65
|
+
|
66
|
+
Options:
|
67
|
+
-X, --execute Do actual work
|
68
|
+
-R, --recursive Process given directories recursively
|
69
|
+
-N, --numbers-only Leave only numbers in file name
|
70
|
+
--regexp REGEXP Use REGEXP to match filenames
|
71
|
+
-v, --[no-]verbose Run verbosely
|
72
|
+
-h, --help Display this message
|
73
|
+
--version Display version
|
74
|
+
```
|
data/bin/nrename
CHANGED
@@ -8,11 +8,6 @@ Feature: Options processing
|
|
8
8
|
Then the exit status should be 0
|
9
9
|
And the stdout should contain "Usage: nrename "
|
10
10
|
|
11
|
-
Scenario: Displaying help when run without options
|
12
|
-
When I run `nrename`
|
13
|
-
Then the exit status should be 0
|
14
|
-
And the stdout should contain "Usage: nrename "
|
15
|
-
|
16
11
|
Scenario: Displaying help when run without any options
|
17
12
|
When I run `nrename`
|
18
13
|
Then the exit status should be 0
|
@@ -20,18 +20,6 @@ Feature: Renaming files
|
|
20
20
|
| 101.txt |
|
21
21
|
| 200.txt |
|
22
22
|
|
23
|
-
Scenario: Renaming files in current directory
|
24
|
-
Given a directory named "dir"
|
25
|
-
And the following empty files inside directory "dir":
|
26
|
-
| 1.txt |
|
27
|
-
| 10.txt |
|
28
|
-
When I cd to "dir"
|
29
|
-
And I run `nrename -X`
|
30
|
-
Then the exit status should be 0
|
31
|
-
And the following files should exist:
|
32
|
-
| 01.txt |
|
33
|
-
| 10.txt |
|
34
|
-
|
35
23
|
Scenario: Dry-run
|
36
24
|
Given a directory named "dir"
|
37
25
|
And the following empty files inside directory "dir":
|
@@ -77,7 +65,7 @@ Feature: Renaming files
|
|
77
65
|
And the following empty files inside directory "bar":
|
78
66
|
| 33.txt |
|
79
67
|
| 01234.txt |
|
80
|
-
And I run `nrename -XR
|
68
|
+
And I run `nrename -XR .`
|
81
69
|
Then the exit status should be 0
|
82
70
|
And the following files should exist inside directory "foo":
|
83
71
|
| 01.txt |
|
@@ -93,7 +81,7 @@ Feature: Renaming files
|
|
93
81
|
| bb10.txt |
|
94
82
|
| cc0023.txt |
|
95
83
|
When I cd to "dir"
|
96
|
-
When I run `nrename -XN
|
84
|
+
When I run `nrename -XN .`
|
97
85
|
Then the exit status should be 0
|
98
86
|
And the following files should exist:
|
99
87
|
| 01.txt |
|
@@ -101,10 +89,9 @@ Feature: Renaming files
|
|
101
89
|
| 23.txt |
|
102
90
|
And the following files should not exist:
|
103
91
|
| bb1.txt |
|
104
|
-
|
|
92
|
+
| bb10.txt |
|
105
93
|
| cc0023.txt |
|
106
94
|
|
107
|
-
|
108
95
|
Scenario: Using custom regular expression
|
109
96
|
Given a directory named "dir"
|
110
97
|
And the following empty files inside directory "dir":
|
@@ -112,7 +99,7 @@ Feature: Renaming files
|
|
112
99
|
| 003_10.txt |
|
113
100
|
| 003_0023.txt |
|
114
101
|
When I cd to "dir"
|
115
|
-
When I run `nrename -X --regexp '^003_(\d+)\.txt'
|
102
|
+
When I run `nrename -X --regexp '^003_(\d+)\.txt' .`
|
116
103
|
Then the exit status should be 0
|
117
104
|
And the following files should exist:
|
118
105
|
| 003_01.txt |
|
data/lib/nrename/directory.rb
CHANGED
@@ -1,23 +1,26 @@
|
|
1
1
|
require 'pathname'
|
2
2
|
require 'fileutils'
|
3
|
+
require 'forwardable'
|
3
4
|
|
4
5
|
module Nrename
|
5
6
|
class Directory
|
7
|
+
extend Forwardable
|
8
|
+
|
9
|
+
def_delegator :numbered_files, :empty?
|
10
|
+
def_delegator :Nrename, :options
|
11
|
+
|
6
12
|
def initialize(dir)
|
7
13
|
@dir = Pathname.new dir
|
14
|
+
end
|
8
15
|
|
9
|
-
|
10
|
-
|
11
|
-
@verbose = opts.verbose
|
12
|
-
@execute = opts.execute
|
13
|
-
@pattern = opts.pattern
|
14
|
-
@numbers_only = opts.numbers_only
|
16
|
+
def files
|
17
|
+
@dir.children.reject &:directory?
|
15
18
|
end
|
16
19
|
|
17
20
|
def numbered_files
|
18
|
-
@numbered_files ||=
|
19
|
-
|
20
|
-
|
21
|
+
@numbered_files ||= files.
|
22
|
+
select { |file| file.basename.to_s =~ options.pattern }.
|
23
|
+
map &(NumberedFile.method :new)
|
21
24
|
end
|
22
25
|
|
23
26
|
def num_field_length
|
@@ -25,39 +28,13 @@ module Nrename
|
|
25
28
|
end
|
26
29
|
|
27
30
|
def max_number
|
28
|
-
numbered_files.map(
|
31
|
+
numbered_files.map(&:number).max
|
29
32
|
end
|
30
33
|
|
31
34
|
def normalize
|
32
|
-
numbered_files.each do |
|
33
|
-
|
34
|
-
next if old == new
|
35
|
-
FileUtils.mv old, new, {
|
36
|
-
:noop => !@execute,
|
37
|
-
:verbose => @verbose
|
38
|
-
}
|
35
|
+
numbered_files.each do |file|
|
36
|
+
file.normalize num_field_length
|
39
37
|
end
|
40
38
|
end
|
41
|
-
|
42
|
-
def normalized_name_for(path)
|
43
|
-
dirname, filename = path.split
|
44
|
-
new_filename = filename.to_s
|
45
|
-
if @numbers_only
|
46
|
-
name = adjusted_number_string_for path
|
47
|
-
extname = filename.extname
|
48
|
-
new_filename = "#{name}#{extname}"
|
49
|
-
else
|
50
|
-
new_filename[@pattern, 1] = adjusted_number_string_for(path)
|
51
|
-
end
|
52
|
-
dirname + new_filename
|
53
|
-
end
|
54
|
-
|
55
|
-
def number_for(path)
|
56
|
-
path.basename.to_s[@pattern, 1].to_i
|
57
|
-
end
|
58
|
-
|
59
|
-
def adjusted_number_string_for(path)
|
60
|
-
number_for(path).to_s.rjust num_field_length, '0'
|
61
|
-
end
|
62
39
|
end
|
63
40
|
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'forwardable'
|
4
|
+
|
5
|
+
module Nrename
|
6
|
+
class NumberedFile
|
7
|
+
attr_reader :path, :number_length
|
8
|
+
|
9
|
+
extend Forwardable
|
10
|
+
|
11
|
+
def_delegator :Nrename, :options
|
12
|
+
|
13
|
+
def initialize(path)
|
14
|
+
@path = path
|
15
|
+
end
|
16
|
+
|
17
|
+
def number
|
18
|
+
path.basename.to_s[options.pattern, 1].to_i
|
19
|
+
end
|
20
|
+
|
21
|
+
def normalize(length)
|
22
|
+
@number_length = length
|
23
|
+
new_name = normalized_path
|
24
|
+
return if path == new_name
|
25
|
+
|
26
|
+
FileUtils.mv path, new_name, {
|
27
|
+
:noop => !options.execute,
|
28
|
+
:verbose => options.verbose
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
def normalized_path
|
33
|
+
dirname, filename = path.split
|
34
|
+
new_filename = filename.to_s
|
35
|
+
|
36
|
+
if options.numbers_only
|
37
|
+
name = adjusted_number
|
38
|
+
extname = filename.extname
|
39
|
+
new_filename = "#{name}#{extname}"
|
40
|
+
else
|
41
|
+
new_filename[options.pattern, 1] = adjusted_number
|
42
|
+
end
|
43
|
+
|
44
|
+
dirname + new_filename
|
45
|
+
end
|
46
|
+
|
47
|
+
def adjusted_number
|
48
|
+
number.to_s.rjust number_length, '0'
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/lib/nrename/options.rb
CHANGED
@@ -1,30 +1,34 @@
|
|
1
|
+
require 'forwardable'
|
1
2
|
require 'optparse'
|
2
3
|
require 'ostruct'
|
4
|
+
require 'set'
|
5
|
+
require 'singleton'
|
3
6
|
|
4
7
|
module Nrename
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
+
class Options
|
9
|
+
include Singleton
|
10
|
+
|
11
|
+
def default_options
|
12
|
+
{
|
8
13
|
:numbers_only => false,
|
9
|
-
:dirs =>
|
14
|
+
:dirs => Set.new,
|
10
15
|
:execute => false,
|
11
16
|
:pattern => /(\d+)/,
|
12
17
|
:recursive => false,
|
13
18
|
:verbose => true
|
14
19
|
}
|
20
|
+
end
|
15
21
|
|
16
|
-
|
17
|
-
|
18
|
-
executable_name = File.basename $PROGRAM_NAME
|
22
|
+
extend Forwardable
|
23
|
+
def_delegators :options, *instance.default_options.keys
|
19
24
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
args << '--help'
|
24
|
-
end
|
25
|
+
def options
|
26
|
+
@options ||= OpenStruct.new default_options
|
27
|
+
end
|
25
28
|
|
29
|
+
def parser
|
26
30
|
OptionParser.new do |opts|
|
27
|
-
opts.banner = "Usage: #{executable_name} [OPTINS]
|
31
|
+
opts.banner = "Usage: #{Nrename.executable_name} [OPTINS] DIR..."
|
28
32
|
|
29
33
|
opts.separator ''
|
30
34
|
opts.separator 'Options:'
|
@@ -34,17 +38,17 @@ module Nrename
|
|
34
38
|
end
|
35
39
|
|
36
40
|
opts.on '-R', '--recursive',
|
37
|
-
|
41
|
+
'Process given directories recursively' do |rec|
|
38
42
|
options.recursive = rec
|
39
43
|
end
|
40
44
|
|
41
45
|
opts.on '-N', '--numbers-only',
|
42
|
-
|
46
|
+
'Leave only numbers in file name' do |n|
|
43
47
|
options.numbers_only = n
|
44
48
|
end
|
45
49
|
|
46
50
|
opts.on '--regexp REGEXP', Regexp,
|
47
|
-
|
51
|
+
'Use REGEXP to match filenames' do |regexp|
|
48
52
|
options.pattern = regexp
|
49
53
|
end
|
50
54
|
|
@@ -61,39 +65,52 @@ module Nrename
|
|
61
65
|
puts VERSION
|
62
66
|
exit
|
63
67
|
end
|
64
|
-
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def parse(args)
|
72
|
+
@options = nil
|
73
|
+
|
74
|
+
# Display help if called through 'nrename' executable and without arguments:
|
75
|
+
if args.empty? && Nrename.executable_name == 'nrename'
|
76
|
+
args << '--help'
|
77
|
+
end
|
78
|
+
|
79
|
+
parser.parse! args
|
65
80
|
|
66
|
-
if !options.execute && executable_name == 'nrename'
|
81
|
+
if !options.execute && Nrename.executable_name == 'nrename'
|
67
82
|
at_exit do
|
68
83
|
warn 'No renaming is done. Run with -X option to perform actual changes.'
|
69
84
|
end
|
70
85
|
end
|
71
86
|
|
87
|
+
options.dirs = extract_dirs args
|
88
|
+
|
89
|
+
self
|
90
|
+
end
|
91
|
+
|
92
|
+
def extract_dirs(args)
|
93
|
+
dirs = Set.new
|
94
|
+
|
72
95
|
args.each do |arg|
|
73
96
|
dir = File.expand_path arg
|
74
97
|
if File.directory? dir
|
75
|
-
|
98
|
+
dirs << dir
|
76
99
|
else
|
77
100
|
warn "#{dir} is not a valid directory."
|
78
101
|
exit 1
|
79
102
|
end
|
80
103
|
end
|
81
104
|
|
82
|
-
if options.dirs.empty?
|
83
|
-
options.dirs << File.expand_path('.')
|
84
|
-
end
|
85
|
-
|
86
105
|
if options.recursive
|
87
|
-
|
88
|
-
Dir.glob
|
89
|
-
|
106
|
+
dirs.dup.each do |dir|
|
107
|
+
Dir.glob(File.join dir, '**/') do |subdir|
|
108
|
+
dirs << subdir.chomp('/')
|
90
109
|
end
|
91
110
|
end
|
92
111
|
end
|
93
112
|
|
94
|
-
|
95
|
-
|
96
|
-
options
|
113
|
+
dirs
|
97
114
|
end
|
98
115
|
end
|
99
116
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Nrename
|
2
|
+
module Runner
|
3
|
+
def self.run(args)
|
4
|
+
Nrename.parse_options args
|
5
|
+
|
6
|
+
dirs = Nrename.options.dirs.map { |dir| Directory.new dir }
|
7
|
+
if dirs.all? &:empty?
|
8
|
+
warn 'No matched files to rename.'
|
9
|
+
else
|
10
|
+
dirs.each &:normalize
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/nrename/version.rb
CHANGED
data/lib/nrename.rb
CHANGED
@@ -1,19 +1,22 @@
|
|
1
1
|
libdir = File.expand_path(File.dirname __FILE__)
|
2
2
|
$:.push libdir unless $:.include? libdir
|
3
3
|
|
4
|
-
require 'nrename/version'
|
5
4
|
require 'nrename/directory'
|
5
|
+
require 'nrename/numbered_file'
|
6
6
|
require 'nrename/options'
|
7
|
+
require 'nrename/runner'
|
8
|
+
require 'nrename/version'
|
7
9
|
|
8
10
|
module Nrename
|
9
|
-
def self.
|
10
|
-
|
11
|
-
@options ||= Options.parse []
|
11
|
+
def self.executable_name
|
12
|
+
File.basename $PROGRAM_NAME
|
12
13
|
end
|
13
14
|
|
14
|
-
def self.
|
15
|
-
|
15
|
+
def self.options
|
16
|
+
Options.instance
|
17
|
+
end
|
16
18
|
|
17
|
-
|
19
|
+
def self.parse_options(args)
|
20
|
+
options.parse args
|
18
21
|
end
|
19
22
|
end
|
@@ -7,39 +7,74 @@ describe Nrename::Directory do
|
|
7
7
|
rm_rf test_dir
|
8
8
|
end
|
9
9
|
|
10
|
+
describe '#files' do
|
11
|
+
it 'returns all files inside directory' do
|
12
|
+
files = %w[1.rb 2.rb 3.rb foo.rb bar baz.java]
|
13
|
+
|
14
|
+
inside test_dir do
|
15
|
+
touch files
|
16
|
+
end
|
17
|
+
|
18
|
+
dir = Nrename::Directory.new test_dir
|
19
|
+
expect(dir).to have(files.length).files
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'ignores directories' do
|
23
|
+
files = %w[1.rb 2.rb 3.rb foo.rb bar baz.java]
|
24
|
+
dirs = %w[1 2 03 40 55]
|
25
|
+
|
26
|
+
inside test_dir do
|
27
|
+
touch files
|
28
|
+
mkdir dirs
|
29
|
+
end
|
30
|
+
|
31
|
+
dir = Nrename::Directory.new test_dir
|
32
|
+
expect(dir).to have(files.length).files
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
10
36
|
describe '#numbered_files' do
|
11
|
-
it '
|
37
|
+
it 'returns all numbered files' do
|
38
|
+
files = %w[1.rb 2.rb 3.rb]
|
39
|
+
|
12
40
|
inside test_dir do
|
13
|
-
touch
|
41
|
+
touch files
|
14
42
|
end
|
15
43
|
|
16
44
|
dir = Nrename::Directory.new test_dir
|
17
|
-
dir.
|
45
|
+
expect(dir).to have(files.length).numbered_files
|
18
46
|
end
|
19
47
|
|
20
48
|
it 'returns empty array when there is no num. files in dir' do
|
21
49
|
mkdir test_dir
|
22
50
|
dir = Nrename::Directory.new test_dir
|
23
|
-
dir.
|
51
|
+
expect(dir).to have(:no).numbered_files
|
24
52
|
end
|
25
53
|
|
26
54
|
it 'does not care about non-numbered files' do
|
55
|
+
numbered_files = %w[1.rb 2.rb 3.rb]
|
56
|
+
unnumbered_files = %w[foo.rb bar baz.java]
|
57
|
+
|
27
58
|
inside test_dir do
|
28
|
-
touch
|
59
|
+
touch numbered_files
|
60
|
+
touch unnumbered_files
|
29
61
|
end
|
30
62
|
|
31
63
|
dir = Nrename::Directory.new test_dir
|
32
|
-
dir.
|
64
|
+
expect(dir).to have(numbered_files.length).numbered_files
|
33
65
|
end
|
34
66
|
|
35
67
|
it 'does not care about directories' do
|
68
|
+
files = %w[1.rb 2.rb 3.rb]
|
69
|
+
dirs = %w[1 2 03 40 55]
|
70
|
+
|
36
71
|
inside test_dir do
|
37
|
-
touch
|
38
|
-
mkdir
|
72
|
+
touch files
|
73
|
+
mkdir dirs
|
39
74
|
end
|
40
75
|
|
41
76
|
dir = Nrename::Directory.new test_dir
|
42
|
-
dir.
|
77
|
+
expect(dir).to have(files.length).numbered_files
|
43
78
|
end
|
44
79
|
end
|
45
80
|
|
@@ -50,7 +85,7 @@ describe Nrename::Directory do
|
|
50
85
|
end
|
51
86
|
|
52
87
|
dir = Nrename::Directory.new test_dir
|
53
|
-
dir.num_field_length.
|
88
|
+
expect(dir.num_field_length).to be == 4
|
54
89
|
end
|
55
90
|
|
56
91
|
it 'ignores starting zeros in number' do
|
@@ -59,7 +94,7 @@ describe Nrename::Directory do
|
|
59
94
|
end
|
60
95
|
|
61
96
|
dir = Nrename::Directory.new test_dir
|
62
|
-
dir.num_field_length.
|
97
|
+
expect(dir.num_field_length).to be == 2
|
63
98
|
end
|
64
99
|
end
|
65
100
|
|
@@ -70,7 +105,7 @@ describe Nrename::Directory do
|
|
70
105
|
end
|
71
106
|
|
72
107
|
dir = Nrename::Directory.new test_dir
|
73
|
-
dir.max_number.
|
108
|
+
expect(dir.max_number).to be == 3
|
74
109
|
end
|
75
110
|
|
76
111
|
it 'is not fooled by fancy file names' do
|
@@ -79,7 +114,7 @@ describe Nrename::Directory do
|
|
79
114
|
end
|
80
115
|
|
81
116
|
dir = Nrename::Directory.new test_dir
|
82
|
-
dir.max_number.
|
117
|
+
expect(dir.max_number).to be == 98
|
83
118
|
end
|
84
119
|
end
|
85
120
|
|
@@ -97,52 +132,10 @@ describe Nrename::Directory do
|
|
97
132
|
dir.normalize
|
98
133
|
|
99
134
|
expected = %w[01 02 03 04 05 06 10 11]
|
100
|
-
renamed_files = Dir.entries(test_dir)
|
101
|
-
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
describe '#normalized_name_for' do
|
106
|
-
it 'returns normalized name for file' do
|
107
|
-
dir = Nrename::Directory.new test_dir
|
108
|
-
file = Pathname.new(test_dir) + 'b1.txt'
|
109
|
-
dir.stub :num_field_length => 4
|
110
|
-
new_name = dir.normalized_name_for(file).basename.to_s
|
111
|
-
new_name.should be == 'b0001.txt'
|
112
|
-
end
|
113
|
-
|
114
|
-
it 'returns bare number if numbers_only options is provided' do
|
115
|
-
Nrename.options.stub :numbers_only => true
|
116
|
-
dir = Nrename::Directory.new test_dir
|
117
|
-
file = Pathname.new(test_dir) + 'b1.txt'
|
118
|
-
dir.stub :num_field_length => 4
|
119
|
-
new_name = dir.normalized_name_for(file).basename.to_s
|
120
|
-
new_name.should be == '0001.txt'
|
121
|
-
end
|
122
|
-
end
|
135
|
+
renamed_files = Dir.entries(test_dir).
|
136
|
+
reject &(File.method :directory?)
|
123
137
|
|
124
|
-
|
125
|
-
it 'returns number for file' do
|
126
|
-
inside test_dir do
|
127
|
-
touch 'av023cd.txt'
|
128
|
-
end
|
129
|
-
|
130
|
-
dir = Nrename::Directory.new test_dir
|
131
|
-
file = dir.numbered_files.first
|
132
|
-
dir.number_for(file).should be == 23
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
describe '#adjusted_number_string_for' do
|
137
|
-
it 'returns number string adjusted to field length' do
|
138
|
-
inside test_dir do
|
139
|
-
touch 'qwe0032rty.gif'
|
140
|
-
end
|
141
|
-
|
142
|
-
dir = Nrename::Directory.new test_dir
|
143
|
-
dir.stub :num_field_length => 6
|
144
|
-
file = dir.numbered_files.first
|
145
|
-
dir.adjusted_number_string_for(file).should be == '000032'
|
138
|
+
expect(renamed_files).to match_array expected
|
146
139
|
end
|
147
140
|
end
|
148
141
|
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Nrename::NumberedFile do
|
4
|
+
def numbered_file(path)
|
5
|
+
Nrename::NumberedFile.new Pathname.new path
|
6
|
+
end
|
7
|
+
|
8
|
+
describe '#number' do
|
9
|
+
it 'returns correct number for simple cases' do
|
10
|
+
file = numbered_file '123'
|
11
|
+
expect(file.number).to be == 123
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'returns correct number for cluttered file names' do
|
15
|
+
file = numbered_file 'aa_125bb.txt'
|
16
|
+
expect(file.number).to be == 125
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'handles leading zeros the right way' do
|
20
|
+
file = numbered_file '0001.txt'
|
21
|
+
expect(file.number).to be == 1
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '#normalized_path' do
|
26
|
+
context 'leaving numbers only' do
|
27
|
+
before do
|
28
|
+
Nrename.options.stub :numbers_only => true
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'normalizes file name' do
|
32
|
+
file = numbered_file 'abc_34.rb'
|
33
|
+
|
34
|
+
file.stub :number_length => 4
|
35
|
+
expect(file.normalized_path.to_s).to be == '0034.rb'
|
36
|
+
|
37
|
+
file.stub :number_length => 5
|
38
|
+
expect(file.normalized_path.to_s).to be == '00034.rb'
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'replacing numbers' do
|
43
|
+
before do
|
44
|
+
Nrename.options.stub :numbers_only => false
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'normalizes file name' do
|
48
|
+
file = numbered_file 'abc_34.rb'
|
49
|
+
|
50
|
+
file.stub :number_length => 4
|
51
|
+
expect(file.normalized_path.to_s).to be == 'abc_0034.rb'
|
52
|
+
|
53
|
+
file.stub :number_length => 5
|
54
|
+
expect(file.normalized_path.to_s).to be == 'abc_00034.rb'
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe '#adjusted_number' do
|
60
|
+
it 'returns number, adjusted accordingly to #number_length' do
|
61
|
+
file = numbered_file 'foo123bar'
|
62
|
+
|
63
|
+
file.stub :number_length => 4
|
64
|
+
expect(file.adjusted_number).to be == '0123'
|
65
|
+
|
66
|
+
file.stub :number_length => 6
|
67
|
+
expect(file.adjusted_number).to be == '000123'
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -1,28 +1,24 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Nrename::Options do
|
4
|
-
def parse_options(args)
|
5
|
-
Nrename::Options.parse args
|
6
|
-
end
|
7
|
-
|
8
4
|
describe 'verbosity' do
|
9
5
|
it 'is on by default (when no arguments provided)' do
|
10
|
-
parse_options([]).verbose.
|
6
|
+
expect(Nrename.parse_options([]).verbose).to be_true
|
11
7
|
end
|
12
8
|
|
13
9
|
it 'is off when or "--no-verbose" switch is provided' do
|
14
|
-
parse_options(%w[--no-verbose]).verbose.
|
10
|
+
expect(Nrename.parse_options(%w[--no-verbose]).verbose).to be_false
|
15
11
|
end
|
16
12
|
end
|
17
13
|
|
18
14
|
describe 'recursive processing' do
|
19
15
|
it 'is off by default' do
|
20
|
-
parse_options([]).recursive.
|
16
|
+
expect(Nrename.parse_options([]).recursive).to be_false
|
21
17
|
end
|
22
18
|
|
23
19
|
it 'is on when "-R" of "--recursive" is provided' do
|
24
20
|
%w[-R --recursive].each do |option|
|
25
|
-
parse_options([option]).recursive.
|
21
|
+
expect(Nrename.parse_options([option]).recursive).to be_true
|
26
22
|
end
|
27
23
|
end
|
28
24
|
end
|
@@ -45,21 +41,21 @@ describe Nrename::Options do
|
|
45
41
|
subdirs.each do |subdir|
|
46
42
|
subdir_path = File.expand_path subdir, test_dir
|
47
43
|
arg = File.join test_dir, subdir
|
48
|
-
parse_options([arg]).dirs.
|
44
|
+
expect(Nrename.parse_options([arg]).dirs).to include subdir_path
|
49
45
|
end
|
50
46
|
end
|
51
47
|
|
52
|
-
it '
|
53
|
-
parse_options([]).dirs.
|
48
|
+
it 'empty if no arguments provided' do
|
49
|
+
expect(Nrename.parse_options([]).dirs).to be_empty
|
54
50
|
end
|
55
51
|
|
56
52
|
it 'recursively captures all subdirs when -R option provided' do
|
57
|
-
dirs = parse_options(['-R', test_dir]).dirs
|
53
|
+
dirs = Nrename.parse_options(['-R', test_dir]).dirs
|
58
54
|
|
59
|
-
dirs.
|
55
|
+
expect(dirs).to include test_dir
|
60
56
|
|
61
57
|
subdirs.each do |subdir|
|
62
|
-
dirs.
|
58
|
+
expect(dirs).to include File.join(test_dir, subdir)
|
63
59
|
end
|
64
60
|
end
|
65
61
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nrename
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,41 +9,72 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-08-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
16
|
-
requirement:
|
15
|
+
name: aruba
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 0.
|
21
|
+
version: 0.4.11
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.4.11
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
|
-
name: rspec
|
27
|
-
requirement:
|
31
|
+
name: guard-rspec
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ~>
|
31
36
|
- !ruby/object:Gem::Version
|
32
|
-
version: 2.
|
37
|
+
version: 1.2.1
|
33
38
|
type: :development
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 1.2.1
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
|
-
name:
|
38
|
-
requirement:
|
47
|
+
name: rake
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
51
|
- - ~>
|
42
52
|
- !ruby/object:Gem::Version
|
43
|
-
version: 0.
|
53
|
+
version: 0.9.2
|
44
54
|
type: :development
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.9.2
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rspec
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 2.11.0
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 2.11.0
|
47
78
|
description: Nrename lets you rename set of numbered files so that they can be sorted
|
48
79
|
correctly in any shell or file manager.
|
49
80
|
email:
|
@@ -61,9 +92,12 @@ files:
|
|
61
92
|
- features/support/env.rb
|
62
93
|
- lib/nrename.rb
|
63
94
|
- lib/nrename/directory.rb
|
95
|
+
- lib/nrename/numbered_file.rb
|
64
96
|
- lib/nrename/options.rb
|
97
|
+
- lib/nrename/runner.rb
|
65
98
|
- lib/nrename/version.rb
|
66
99
|
- spec/nrename/directory_spec.rb
|
100
|
+
- spec/nrename/numbered_file_spec.rb
|
67
101
|
- spec/nrename/options_spec.rb
|
68
102
|
- spec/spec_helper.rb
|
69
103
|
homepage: https://github.com/vderyagin/nrename
|
@@ -79,6 +113,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
79
113
|
- - ! '>='
|
80
114
|
- !ruby/object:Gem::Version
|
81
115
|
version: '0'
|
116
|
+
segments:
|
117
|
+
- 0
|
118
|
+
hash: 597873344998439750
|
82
119
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
83
120
|
none: false
|
84
121
|
requirements:
|
@@ -87,9 +124,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
87
124
|
version: 1.3.6
|
88
125
|
requirements: []
|
89
126
|
rubyforge_project: nrename
|
90
|
-
rubygems_version: 1.8.
|
127
|
+
rubygems_version: 1.8.24
|
91
128
|
signing_key:
|
92
129
|
specification_version: 3
|
93
130
|
summary: Command-line utility for renaming numbered files.
|
94
131
|
test_files: []
|
95
|
-
has_rdoc:
|