mass_rename 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7edd5c212e388cb8fc2a4428c7affeb4e08f3d38e4372fa4a5825fa27bffd968
4
- data.tar.gz: 3ca138a9b6cad0152a66779bd385d5d2894e56b4ae3cb543986ca4be4df2cf82
3
+ metadata.gz: 88558a4ffaaa6213acef188079224f1d5d689a96551c83ff1dfc6b043b72feb0
4
+ data.tar.gz: fcf9cf9dbbbcfd429a940a24100dce9e1c2ce1cdcfc5a2c60f3bba7b6d3fa34a
5
5
  SHA512:
6
- metadata.gz: 1a48a071f955e229d5cae832194275d894e4cfaa1c743a3150b71dc9060233acf2c9a0b0b56ad3e1b82590ff32c2bf53bf9760435f214708dacbbf58c28fa48a
7
- data.tar.gz: d4bb6e97e20e244521e90adbbec332d33d77acbe5bcfe6f0c6655e7944d519e56fa996ff6ddbd837fa48c06f6f6e267dde8dab71870c6fba41ed2a714d0e44c1
6
+ metadata.gz: 2dff9b27f94844eb59530982664263bee4d1569cfdfb12039c9194d809f6b381cd0533987e3014f2cbc834346173b0f57597d5bf32a830fd7cd984ce0f63eeff
7
+ data.tar.gz: 7b85b80460931c08c427fed46435395ee0f7c2f05c5fa738b240b103a883191c3941681f555d401e14f8aaf5638798fb003b56c24dbb6325206b6aacf7e91627
data/.rubocop.yml CHANGED
@@ -1,3 +1,3 @@
1
1
  inherit_from: .rubocop_todo.yml
2
2
  AllCops:
3
- TargetRubyVersion: 2.4
3
+ TargetRubyVersion: 2.5
data/.rubocop_todo.yml CHANGED
@@ -1,26 +1,36 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config`
3
- # on 2017-09-22 22:01:45 -0700 using RuboCop version 0.50.0.
3
+ # on 2018-07-25 09:19:19 -1000 using RuboCop version 0.58.1.
4
4
  # The point is for the user to remove these configuration records
5
5
  # one by one as the offenses are removed from the code base.
6
6
  # Note that changes in the inspected code, or installation of new
7
7
  # versions of RuboCop, may require this file to be generated again.
8
8
 
9
+ # Offense count: 1
10
+ # Configuration parameters: Include.
11
+ # Include: **/*.gemspec
12
+ Gemspec/RequiredRubyVersion:
13
+ Exclude:
14
+ - 'mass_rename.gemspec'
15
+
16
+ # Offense count: 1
17
+ # Cop supports --auto-correct.
18
+ # Configuration parameters: EnforcedStyle.
19
+ # SupportedStyles: auto_detection, squiggly, active_support, powerpack, unindent
20
+ Layout/IndentHeredoc:
21
+ Exclude:
22
+ - 'spec/mass_rename_spec.rb'
23
+
9
24
  # Offense count: 2
10
25
  # Configuration parameters: CountComments, ExcludedMethods.
26
+ # ExcludedMethods: refine
11
27
  Metrics/BlockLength:
12
- Max: 35
13
-
14
- # Offense count: 6
15
- # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
16
- # URISchemes: http, https
17
- Metrics/LineLength:
18
- Max: 120
28
+ Max: 116
19
29
 
20
30
  # Offense count: 1
21
31
  # Configuration parameters: CountComments.
22
32
  Metrics/MethodLength:
23
- Max: 15
33
+ Max: 24
24
34
 
25
35
  # Offense count: 1
26
36
  Style/Documentation:
@@ -28,3 +38,9 @@ Style/Documentation:
28
38
  - 'spec/**/*'
29
39
  - 'test/**/*'
30
40
  - 'lib/mass_rename.rb'
41
+
42
+ # Offense count: 29
43
+ # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
44
+ # URISchemes: http, https
45
+ Metrics/LineLength:
46
+ Max: 121
data/README.md CHANGED
@@ -30,11 +30,14 @@ Or install it yourself as:
30
30
  -v, --version Display version
31
31
  -h, --help Print this help
32
32
 
33
- The following example will recursively rename files matching the pattern "some_file_pattern_(\d)", capture the digit character,
34
- and rename all matching files with the replacement "\1_new_name", substituting the captured digit for "\1".
35
- ```
36
- mass_rename --recursive -d target_dir -f "some_file_pattern_(\d)" -r "\1_new_name"
37
- ```
33
+ This tool is essentially a multi-string gsub, so treat the filter and replacement patterns the same as you would when
34
+ using gsub -- capture groups and back references are very helpful!
35
+
36
+ The following example will recursively rename files matching the pattern "some_file_pattern_(\d)", capture the digit
37
+ character, and rename all matching files with the replacement "\1_new_name", using a back reference for the captured
38
+ digit.
39
+
40
+ mass_rename --recursive -d target_dir -f "some_file_pattern_(\d)" -r "\1_new_name"
38
41
 
39
42
  ## Development
40
43
 
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'mass_rename'
4
5
 
data/lib/mass_rename.rb CHANGED
@@ -6,74 +6,71 @@ require 'fileutils'
6
6
  require 'mass_rename/version'
7
7
 
8
8
  module MassRename
9
- # Processes the provided options from the command line.
10
- # Usage and effects for different options are given by running the script with the '-h' flag.
11
- #
12
- # @param args [Array] the arguments to the CLI
13
- # @return [Hash] the arguments as a hash
14
- def self.process_options(args)
15
- options = {}
16
- OptionParser.new do |parser|
17
- parser.banner = 'Usage: mass_rename [options]'
9
+ class << self
10
+ # Processes the provided options from the command line.
11
+ # Usage and effects for different options are given by running the script with the '-h' flag.
12
+ #
13
+ # @param args [Array] the arguments to the CLI
14
+ # @return [Hash] the arguments as a hash
15
+ def process_options(args)
16
+ options = {}
17
+ OptionParser.new do |parser|
18
+ parser.banner = 'Usage: mass_rename [options]'
18
19
 
19
- parser.on('-d', '--dir NAME', 'Select a different working directory') do |dir_name|
20
- options[:directory] = dir_name
21
- end
20
+ parser.on('-d', '--dir NAME', 'Select a different working directory') do |dir_name|
21
+ options[:directory] = dir_name
22
+ end
22
23
 
23
- parser.on('-f', '--filter PATTERN', 'Filter files using a regular expression') do |regex|
24
- options[:filter] = Regexp.new(regex)
25
- end
24
+ parser.on('-f', '--filter PATTERN', 'Filter files using a regular expression') do |regex|
25
+ options[:filter] = Regexp.new(regex)
26
+ end
26
27
 
27
- parser.on('-r', '--replace PATTERN', 'Replace matched file names with a replacement string') do |replacement|
28
- options[:replacement] = replacement
29
- end
28
+ parser.on('-r', '--replace PATTERN', 'Replace matched file names with a replacement string') do |replacement|
29
+ options[:replacement] = replacement
30
+ end
30
31
 
31
- parser.on('--recursive', 'Select files in the target directory and all its subdirectories') do |recursive|
32
- options[:recursive] = recursive
33
- end
32
+ parser.on('--recursive', 'Select files in the target directory and all its subdirectories') do |recursive|
33
+ options[:recursive] = recursive
34
+ end
34
35
 
35
- parser.on('-v', '--version', 'Display version') do
36
- puts MassRename::VERSION
37
- end
36
+ parser.on('-v', '--version', 'Display version') do
37
+ puts MassRename::VERSION
38
+ end
38
39
 
39
- parser.on('-h', '--help', 'Print this help') do
40
- puts parser
41
- end
40
+ parser.on('-h', '--help', 'Print this help') do
41
+ puts parser
42
+ end
42
43
 
43
- parser.parse!(args)
44
+ parser.parse!(args)
45
+ end
46
+ options
44
47
  end
45
- options
46
- end
47
48
 
48
- # Returns a list of file names matching a pattern, optionally recursive.
49
- #
50
- # @param options [Hash] the options returned by {MassRename#process_options}
51
- # @return [Array<String>] the files matching the filter
52
- def self.file_list(options)
53
- Dir.glob(options[:recursive] ? '**/*' : '*').select do |path|
54
- path =~ options[:filter]
49
+ # Returns a list of file names matching a pattern, optionally recursive.
50
+ #
51
+ # @param options [Hash] the options returned by {MassRename#process_options}
52
+ # @return [Array<String>] the files matching the filter
53
+ def file_list(options)
54
+ Dir.glob(options[:recursive] ? '**/*' : '*').select { |path| path =~ options[:filter] }
55
55
  end
56
- end
57
56
 
58
- # Renames a file according to a pattern. The format of the replacement pattern is what you'd
59
- # pass to +String#gsub+.
60
- #
61
- # @param path [String] the path of the file to rename
62
- # @param options [Hash] the options returned by {MassRename#process_options}
63
- def self.rename(path, options)
64
- new_path = path.gsub(options[:filter], options[:replacement])
65
- FileUtils.mv(path, new_path)
66
- end
57
+ # Renames a file according to a pattern. The format of the replacement pattern is what you'd
58
+ # pass to +String#gsub+.
59
+ #
60
+ # @param path [String] the path of the file to rename
61
+ # @param options [Hash] the options returned by {MassRename#process_options}
62
+ def rename(path, options)
63
+ FileUtils.mv(path, path.gsub(options[:filter], options[:replacement]))
64
+ end
67
65
 
68
- # Main entry point for this library. Processes the given options and then renames files
69
- # matching the filter according to the given replacement string.
70
- #
71
- # @param args [Array<String>] arguments to parse. Equal to ARGV if you're not doing anything fancy.
72
- def self.run(args)
73
- options = MassRename.process_options(args)
74
- Dir.chdir(options[:directory]) if options[:directory]
75
- MassRename.file_list(options).each do |path|
76
- MassRename.rename(path, options)
66
+ # Main entry point for this library. Processes the given options and then renames files
67
+ # matching the filter according to the given replacement string.
68
+ #
69
+ # @param args [Array<String>] arguments to parse. Equal to ARGV if you're not doing anything fancy.
70
+ def run(args)
71
+ options = MassRename.process_options(args)
72
+ Dir.chdir(options[:directory]) if options[:directory]
73
+ MassRename.file_list(options).each { |path| MassRename.rename(path, options) }
77
74
  end
78
75
  end
79
76
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MassRename
4
- VERSION = '1.0.1'
4
+ VERSION = '1.1.0'
5
5
  end
data/mass_rename.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require File.expand_path("../lib/mass_rename/version", __FILE__)
3
+ require File.expand_path('lib/mass_rename/version', File.dirname(__FILE__))
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = 'mass_rename'
@@ -11,18 +11,17 @@ Gem::Specification.new do |spec|
11
11
  spec.homepage = 'https://github.com/lucis-fluxum/mass_rename'
12
12
  spec.license = 'MIT'
13
13
 
14
- spec.platform = Gem::Platform::RUBY
15
- spec.required_ruby_version = '>= 1.9'
14
+ spec.required_ruby_version = '>= 1.9.3'
16
15
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^spec/}) }
17
- spec.bindir = 'exe'
18
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
16
+ spec.test_files = `git ls-files -z -- spec/*`.split("\x0")
17
+ spec.executables = ['mass_rename']
19
18
 
20
19
  spec.metadata['yard.run'] = 'yri'
21
20
 
22
21
  spec.add_development_dependency 'bundler'
22
+ spec.add_development_dependency 'codecov'
23
23
  spec.add_development_dependency 'rake'
24
24
  spec.add_development_dependency 'rspec'
25
25
  spec.add_development_dependency 'simplecov'
26
- spec.add_development_dependency 'codecov'
27
26
  spec.add_development_dependency 'yard'
28
27
  end
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,142 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe MassRename do
6
+ it 'has a version number' do
7
+ expect(MassRename::VERSION).not_to be nil
8
+ end
9
+
10
+ describe '.process_options' do
11
+ let(:usage) do
12
+ <<-USAGE
13
+ Usage: mass_rename [options]
14
+ -d, --dir NAME Select a different working directory
15
+ -f, --filter PATTERN Filter files using a regular expression
16
+ -r, --replace PATTERN Replace matched file names with a replacement string
17
+ --recursive Select files in the target directory and all its subdirectories
18
+ -v, --version Display version
19
+ -h, --help Print this help
20
+ USAGE
21
+ end
22
+
23
+ describe 'parses -d, --dir' do
24
+ %w[-d --dir].each do |arg|
25
+ context "#{arg} with value" do
26
+ subject { MassRename.process_options([arg, 'some_dir']) }
27
+ it('returns options hash with directory') { is_expected.to eq(directory: 'some_dir') }
28
+ end
29
+
30
+ context "#{arg} without value" do
31
+ subject { -> { MassRename.process_options([arg]) } }
32
+ it('raises an error') { is_expected.to raise_error(OptionParser::MissingArgument) }
33
+ end
34
+ end
35
+ end
36
+
37
+ describe 'parses -f, --filter' do
38
+ %w[-f --filter].each do |arg|
39
+ context "#{arg} with value" do
40
+ subject { MassRename.process_options([arg, '\w+[0-9]+']) }
41
+ it('returns options hash with filter') { is_expected.to eq(filter: /\w+[0-9]+/) }
42
+ end
43
+
44
+ context "#{arg} without value" do
45
+ subject { -> { MassRename.process_options([arg]) } }
46
+ it('raises an error') { is_expected.to raise_error(OptionParser::MissingArgument) }
47
+ end
48
+ end
49
+ end
50
+
51
+ describe 'parses -r, --replace' do
52
+ %w[-r --replace].each do |arg|
53
+ context "#{arg} with value" do
54
+ subject { MassRename.process_options([arg, 'something \1 \2']) }
55
+ it('returns options hash with filter') { is_expected.to eq(replacement: 'something \1 \2') }
56
+ end
57
+
58
+ context "#{arg} without value" do
59
+ subject { -> { MassRename.process_options([arg]) } }
60
+ it('raises an error') { is_expected.to raise_error(OptionParser::MissingArgument) }
61
+ end
62
+ end
63
+ end
64
+
65
+ it 'parses -v, --version' do
66
+ %w[-v --version].each do |arg|
67
+ expect { MassRename.process_options([arg]) }.to output("#{MassRename::VERSION}\n").to_stdout
68
+ end
69
+ end
70
+
71
+ it 'parses -h, --help' do
72
+ %w[-h --help].each do |arg|
73
+ expect { MassRename.process_options([arg]) }.to output(usage).to_stdout
74
+ end
75
+ end
76
+ end
77
+
78
+ describe '.file_list' do
79
+ before(:all) do
80
+ Dir.chdir('spec/fixtures')
81
+ end
82
+
83
+ [true, false].product([/example file \d\.txt/, nil]).each do |recursive, filter|
84
+ context "recursive: #{recursive}, filter: #{filter.inspect}" do
85
+ subject { MassRename.file_list(recursive: recursive, filter: filter) }
86
+ let(:files) { Array.new(10) { |n| "example file #{n}.txt" } }
87
+ let(:nested_files) { Array.new(5) { |n| "some_dir/example file #{n}.txt" } }
88
+
89
+ if !filter.nil? && recursive
90
+ it('returns a list of filenames (recursive)') { is_expected.to match_array(nested_files + files) }
91
+ elsif !filter.nil? && !recursive
92
+ it('returns a list of filenames (non-recursive)') { is_expected.to match_array(files) }
93
+ else
94
+ it('returns empty array') { is_expected.to be_empty }
95
+ end
96
+ end
97
+ end
98
+
99
+ after(:all) do
100
+ Dir.chdir('../../')
101
+ end
102
+ end
103
+
104
+ describe '.rename' do
105
+ let(:options) { { filter: /example (.*) (\d)/, replacement: 'renamed \1 #00\2' } }
106
+
107
+ it 'renames a file with replacement string' do
108
+ 10.times do |n|
109
+ MassRename.rename("spec/fixtures/example file #{n}.txt", options)
110
+ expect(File).to exist("spec/fixtures/renamed file #00#{n}.txt")
111
+ end
112
+ end
113
+
114
+ after(:each) do
115
+ reset_fixtures
116
+ end
117
+ end
118
+
119
+ describe '.run' do
120
+ let(:files) { Array.new(10) { |n| "file ##{n} renamed.txt" } }
121
+ let(:nested_files) { Array.new(5) { |n| "some_dir/file ##{n} renamed.txt" } }
122
+
123
+ subject { MassRename.file_list(recursive: false, filter: /file #\d renamed\.txt/) }
124
+ let(:options) { ['-d', 'spec/fixtures', '-f', 'example (.*) (\d)', '-r', '\1 #\2 renamed'] }
125
+ it 'renames multiple files (non-recursive)' do
126
+ MassRename.run(options)
127
+ is_expected.to match_array(files)
128
+ end
129
+
130
+ subject { MassRename.file_list(recursive: true, filter: /file #\d renamed\.txt/) }
131
+ let(:options_recursive) { ['-d', 'spec/fixtures', '-f', 'example (.*) (\d)', '-r', '\1 #\2 renamed', '--recursive'] }
132
+ it 'renames multiple files (recursive)' do
133
+ MassRename.run(options_recursive)
134
+ is_expected.to match_array(nested_files + files)
135
+ end
136
+
137
+ after(:each) do
138
+ Dir.chdir('../../')
139
+ reset_fixtures
140
+ end
141
+ end
142
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'simplecov'
4
+ SimpleCov.start
5
+
6
+ if ENV['CI'] == 'true'
7
+ require 'codecov'
8
+ SimpleCov.formatter = SimpleCov::Formatter::Codecov
9
+ end
10
+
11
+ require 'bundler/setup'
12
+ require 'mass_rename'
13
+
14
+ RSpec.configure do |config|
15
+ # Enable flags like --only-failures and --next-failure
16
+ config.example_status_persistence_file_path = '.rspec_status'
17
+
18
+ # Disable RSpec exposing methods globally on `Module` and `main`
19
+ config.disable_monkey_patching!
20
+
21
+ config.expect_with :rspec do |c|
22
+ c.syntax = :expect
23
+ end
24
+ end
25
+
26
+ def reset_fixtures
27
+ FileUtils.rm_r(Dir.glob('spec/fixtures/*'))
28
+ 10.times { |n| FileUtils.touch "spec/fixtures/example file #{n}.txt" }
29
+ Dir.mkdir('spec/fixtures/some_dir')
30
+ 5.times { |n| FileUtils.touch "spec/fixtures/some_dir/example file #{n}.txt" }
31
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mass_rename
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luc Street
8
8
  autorequire:
9
- bindir: exe
9
+ bindir: bin
10
10
  cert_chain: []
11
- date: 2018-06-27 00:00:00.000000000 Z
11
+ date: 2018-07-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -25,7 +25,7 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: rake
28
+ name: codecov
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
@@ -39,7 +39,7 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: rspec
42
+ name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
@@ -53,7 +53,7 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: simplecov
56
+ name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
@@ -67,7 +67,7 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: codecov
70
+ name: simplecov
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
@@ -112,11 +112,28 @@ files:
112
112
  - README.md
113
113
  - Rakefile
114
114
  - bin/console
115
+ - bin/mass_rename
115
116
  - bin/setup
116
- - exe/mass_rename
117
117
  - lib/mass_rename.rb
118
118
  - lib/mass_rename/version.rb
119
119
  - mass_rename.gemspec
120
+ - spec/fixtures/example file 0.txt
121
+ - spec/fixtures/example file 1.txt
122
+ - spec/fixtures/example file 2.txt
123
+ - spec/fixtures/example file 3.txt
124
+ - spec/fixtures/example file 4.txt
125
+ - spec/fixtures/example file 5.txt
126
+ - spec/fixtures/example file 6.txt
127
+ - spec/fixtures/example file 7.txt
128
+ - spec/fixtures/example file 8.txt
129
+ - spec/fixtures/example file 9.txt
130
+ - spec/fixtures/some_dir/example file 0.txt
131
+ - spec/fixtures/some_dir/example file 1.txt
132
+ - spec/fixtures/some_dir/example file 2.txt
133
+ - spec/fixtures/some_dir/example file 3.txt
134
+ - spec/fixtures/some_dir/example file 4.txt
135
+ - spec/mass_rename_spec.rb
136
+ - spec/spec_helper.rb
120
137
  homepage: https://github.com/lucis-fluxum/mass_rename
121
138
  licenses:
122
139
  - MIT
@@ -130,7 +147,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
130
147
  requirements:
131
148
  - - ">="
132
149
  - !ruby/object:Gem::Version
133
- version: '1.9'
150
+ version: 1.9.3
134
151
  required_rubygems_version: !ruby/object:Gem::Requirement
135
152
  requirements:
136
153
  - - ">="
@@ -142,4 +159,21 @@ rubygems_version: 2.7.6
142
159
  signing_key:
143
160
  specification_version: 4
144
161
  summary: Mass rename files.
145
- test_files: []
162
+ test_files:
163
+ - spec/fixtures/example file 0.txt
164
+ - spec/fixtures/example file 1.txt
165
+ - spec/fixtures/example file 2.txt
166
+ - spec/fixtures/example file 3.txt
167
+ - spec/fixtures/example file 4.txt
168
+ - spec/fixtures/example file 5.txt
169
+ - spec/fixtures/example file 6.txt
170
+ - spec/fixtures/example file 7.txt
171
+ - spec/fixtures/example file 8.txt
172
+ - spec/fixtures/example file 9.txt
173
+ - spec/fixtures/some_dir/example file 0.txt
174
+ - spec/fixtures/some_dir/example file 1.txt
175
+ - spec/fixtures/some_dir/example file 2.txt
176
+ - spec/fixtures/some_dir/example file 3.txt
177
+ - spec/fixtures/some_dir/example file 4.txt
178
+ - spec/mass_rename_spec.rb
179
+ - spec/spec_helper.rb