bulldoze_renamer 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 810a46d0c33d974031e0ec0aad18faa747f24bbc1b64d759103ac2c46987d7d1
4
+ data.tar.gz: f97652392e76b61b2f4b2ef228ec141cddc12c36209b120c5c3a31baf82d0916
5
+ SHA512:
6
+ metadata.gz: b0d7863a26ffeb3293c4612dee705fedaef80cd65a89c5a69be0d71600fff259545e5d2906ae4c8c35695165b4a38b22b01ccaf0dc0342750a6dbc9e22167a78
7
+ data.tar.gz: b062a5af199faae684d5908a4d2313b096b74f03a1e8752b3342996e596994db4f6ec00c972f4146d312120986429a7e5b08ef98d394b464b866416be17215a9
@@ -0,0 +1,4 @@
1
+ # These are supported funding model platforms
2
+
3
+ github: [tomtt]
4
+ patreon: tomtt
@@ -0,0 +1,13 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
12
+ Gemfile.lock
13
+ dummy
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format progress
2
+ --color
3
+ --require spec_helper
@@ -0,0 +1,6 @@
1
+ ---
2
+ language: ruby
3
+ cache: bundler
4
+ rvm:
5
+ - 2.7.2
6
+ before_install: gem install bundler -v 2.1.4
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in bulldoze_renamer.gemspec
4
+ gemspec
5
+
6
+ gem "rake", "~> 12.0"
7
+ gem "rspec", "~> 3.0"
8
+ gem "simplecov"
9
+ gem "pry-byebug"
10
+ gem "guard-rspec"
11
+ gem "webmock"
12
+ gem "sinatra"
@@ -0,0 +1,6 @@
1
+ guard :rspec, cmd: 'rspec', failed_mode: :keep do
2
+ watch(%r{^spec/.+_spec\.rb$})
3
+ watch(%r{^spec/support/(.+)\.rb$})
4
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
5
+ watch('spec/spec_helper.rb') { "spec" }
6
+ end
@@ -0,0 +1,85 @@
1
+ # Bulldoze Renamer
2
+
3
+ Bulldoze Renamer is a tool to rename things in a code project.
4
+
5
+ Suppose you have an object that you called PoohBear but you want to now rename it to HoneyBear.
6
+
7
+ That means that everywhere in your project you want to replace `PoohBear -> HoneyBear`.
8
+ But also `pooh_bear -> honey_bear`. Any there may be some constant `POOH_BEAR_ACTIONS ->
9
+ HONEY_BEAR_ACTIONS` somewhere. And maybe the class is defined in `lib/bears/pooh_bear/pooh_bear.rb`
10
+ and so that file should be renamed `lib/bears/pooh_bear -> lib/bears/honey_bear` and
11
+ `lib/bears/pooh_bear/pooh_bear.rb -> lib/bears/honey_bear/honey_bear.rb`.
12
+
13
+ This tool aims to do all those replacements for you in the entire project in one go.
14
+
15
+ ## Installation
16
+
17
+ Install by installing the gem:
18
+
19
+ $ gem install bulldoze_renamer
20
+
21
+ ## Usage
22
+
23
+ It runs like so: `bulldoze_rename target_directory PoohBear HoneyBear`
24
+
25
+ It will only check files that are known to the git repo of the target_directory.
26
+
27
+ Invoked like this it will only show an overview of the changes that will take place.
28
+ The output looks like this:
29
+
30
+ underscore : pooh_bear -> honey_bear
31
+ camelize : PoohBear -> HoneyBear
32
+ dasherize : pooh-bear -> honey-bear
33
+ upcase : POOH_BEAR -> HONEY_BEAR
34
+ js_camelize: poohBear -> honeyBear
35
+
36
+ camelize
37
+ | upcase
38
+ | | filename
39
+ | | |
40
+ _ _ 1 lib/bears/pooh_bear
41
+ 1 1 1 lib/bears/pooh_bear/pooh_bear.rb
42
+
43
+ The first section shows the possible mappings it looks for in the target_directory.
44
+ The section below that shows which of those actually occur in which files. Files
45
+ that will need to be renamed also have a value for `filename`.
46
+
47
+ To actually perform the substitutions, add the `-p` option to the earlier command.
48
+ Then it will print out the filenames as they are being updated. That looks like
49
+ this:
50
+
51
+ Performing:
52
+ R lib/bears/pooh_bear/pooh_bear.rb -> lib/bears/pooh_bear/honey_bear.rb
53
+ d lib/bears/pooh_bear -> lib/bears/honey_bear
54
+
55
+ Where the first character denotes:
56
+ - f: substituted value in file
57
+ - r: only renamed the file
58
+ - R: renamed file and substituted values in it
59
+ - d: directory which was moved
60
+
61
+ ### Warning
62
+
63
+ As suggested by the name `bulldozer`, this tool is rather crude. Undesirable things
64
+ can happen, especially if it is not clear from the original value or target value
65
+ what type of format it should be.
66
+
67
+ For example for `pooh_bear` it is clear that it is in underscore format, but if it
68
+ were just `pooh` it could also be in js_camelize format.
69
+
70
+ Therefore there should be no issue if both original and new values have multiple words.
71
+ When replacing a single word with another single word, there should also be no issue.
72
+
73
+ But when you replace single word with multiple words it will be ambiguous which format to
74
+ use.
75
+
76
+ When you replace multiple words with a single word, that will work fine, but afterwards
77
+ renaming it again may be problematic.
78
+
79
+ Always ensure by checking changes in git that they are all correct.
80
+
81
+ ## Development
82
+
83
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
84
+
85
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "bulldoze_renamer"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,22 @@
1
+ require_relative 'lib/bulldoze_renamer/version'
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = "bulldoze_renamer"
5
+ spec.version = BulldozeRenamer::VERSION
6
+ spec.authors = ["Tom ten Thij"]
7
+ spec.email = ["code@tomtenthij.nl"]
8
+
9
+ spec.summary = %q{A gem environment to learn code in}
10
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
11
+
12
+ # Specify which files should be added to the gem when it is released.
13
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
14
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
15
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
16
+ end
17
+ spec.bindir = "exe"
18
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
+ spec.require_paths = ["lib"]
20
+ spec.add_dependency('activesupport', '>= 6')
21
+ spec.add_dependency('ruby-filemagic', '~> 0.7.2')
22
+ end
@@ -0,0 +1,5 @@
1
+ #!/bin/bash
2
+
3
+ PROJECT_PATH="$( cd "$(dirname "$0")/.." >/dev/null 2>&1 ; pwd -P )"
4
+
5
+ BUNDLE_GEMFILE=$PROJECT_PATH/Gemfile $PROJECT_PATH/exe/bulldoze_rename_rb $*
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env bundle exec ruby
2
+ # This script can only be run from elsewhere if BUNDLE_GEMFILE of this project
3
+ # has been set.
4
+
5
+ require 'bulldoze_renamer'
6
+ BulldozeRenamer::Shell.start(ARGV)
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ Encoding.default_external = 'UTF-8'
4
+
5
+ require "bulldoze_renamer/version"
6
+
7
+ module BulldozeRenamer
8
+ class LinesNotFoundError < IOError; end
9
+
10
+ def self.root
11
+ Pathname.new(File.absolute_path(File.join(File.dirname(__FILE__), '..')))
12
+ end
13
+
14
+ autoload :FileContentSubstitutor , 'bulldoze_renamer/file_content_substitutor'
15
+ autoload :FileFinder , 'bulldoze_renamer/file_finder'
16
+ autoload :RenamingOrchestrator , 'bulldoze_renamer/renaming_orchestrator'
17
+ autoload :Shell , 'bulldoze_renamer/shell'
18
+ autoload :StringInflector , 'bulldoze_renamer/string_inflector'
19
+ end
@@ -0,0 +1,46 @@
1
+ require 'tmpdir'
2
+ require 'fileutils'
3
+
4
+ module BulldozeRenamer
5
+ class FileContentSubstitutor
6
+ def initialize(dir)
7
+ @dir = dir
8
+ end
9
+
10
+ def full_path(path)
11
+ File.join(@dir, path)
12
+ end
13
+
14
+ def with_content_written_to_temporary_file(original_path, content)
15
+ Dir.mktmpdir do |dir|
16
+ filename = File.join(dir, 'replaced_content')
17
+
18
+ # First copy original file to preserve permissions, even though we will overwrite
19
+ FileUtils.cp_r(File.join(@dir, original_path), filename, preserve: true)
20
+
21
+ File.open(filename, 'w') do |f|
22
+ f.print content
23
+ end
24
+ yield(filename)
25
+ end
26
+ end
27
+
28
+ def move_directory(original_path, new_path)
29
+ FileUtils.mv(full_path(original_path), full_path(new_path))
30
+ end
31
+
32
+ def substitute_in(original_path, new_path, mappings)
33
+ content = File.read(full_path(original_path))
34
+ mappings.each do |m|
35
+ content.gsub!(m[0], m[1])
36
+ end
37
+
38
+ with_content_written_to_temporary_file(original_path, content) do |f|
39
+ FileUtils.cp_r(f, full_path(new_path), preserve: true)
40
+ if new_path != original_path
41
+ FileUtils.rm(full_path(original_path))
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,60 @@
1
+ require 'find'
2
+ require 'filemagic'
3
+
4
+ module BulldozeRenamer
5
+ class FileFinder
6
+ def self.file_magic
7
+ @@file_magic ||= FileMagic.new
8
+ end
9
+
10
+ def self.file_excluded?(file)
11
+ file.include?(".git/") ||
12
+ file.include?("node_modules") ||
13
+ File.basename(file) == '.git' ||
14
+ file == '.'
15
+ end
16
+
17
+ def self.file_considered?(file)
18
+ return true if FileTest.directory?(file)
19
+
20
+ fm = file_magic.file(file)
21
+ fm.include?('text') ||
22
+ fm.include?('JSON')
23
+ end
24
+
25
+ # Using git ls-files has many advantages but it does not
26
+ # return directories. This method extracts all directories
27
+ # as present for the files found.
28
+ def self.extract_directories(files)
29
+ result = Set.new
30
+ files.each do |f|
31
+ dir = File.dirname(f)
32
+
33
+ # File.dirname('foo') => "."
34
+ # File.dirname('/foo') => "/"
35
+ while(dir != '.' && dir != '/' && !result.include?(dir))
36
+ result << dir
37
+ dir = File.dirname(dir)
38
+ end
39
+ end
40
+ result.to_a.sort
41
+ end
42
+
43
+ def self.find(path)
44
+ files = []
45
+ Dir.chdir(path) do
46
+ files = `git ls-files`.split
47
+ files = (files + extract_directories(files)).sort
48
+
49
+ if block_given?
50
+ files.select { |f| yield(f) }
51
+ else
52
+ files.select do |p|
53
+ !file_excluded?(p) &&
54
+ file_considered?(p)
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,190 @@
1
+ require 'pp'
2
+
3
+ module BulldozeRenamer
4
+ class RenamingOrchestrator
5
+ def initialize(path:, current_name:, target_name:, perform: nil)
6
+ @path = path
7
+ @current_name = current_name
8
+ @target_name = target_name
9
+ @perform = perform
10
+ end
11
+
12
+ def count_in_content(target, content)
13
+ ('~' + content + '~').split(target).size - 1
14
+ end
15
+
16
+ def find_occurences(file, mappings)
17
+ result = {}
18
+ Dir.chdir @path do
19
+ occurs_in_filename =
20
+ mappings[:inflections][:underscore] &&
21
+ File.basename(file).include?(mappings[:inflections][:underscore][:current])
22
+ occurs_in_filename ||=
23
+ mappings[:inflections][:dasherize] &&
24
+ File.basename(file).include?(mappings[:inflections][:dasherize][:current])
25
+ result[:filename] = occurs_in_filename ? 1 : 0
26
+
27
+ unless FileTest.directory?(file)
28
+ mappings[:inflections].each do |inflection, values|
29
+ result[inflection] = count_in_content(values[:current], File.read(file))
30
+ end
31
+ end
32
+ end
33
+ result
34
+ end
35
+
36
+ def was_found(occ)
37
+ occ.values.sum > 0
38
+ end
39
+
40
+ def format_number(number)
41
+ number && number > 0 ? "%4d" % number : ' _'
42
+ end
43
+
44
+ def inflections_mapping
45
+ @inflections_mapping ||= StringInflector.new(@current_name, @target_name).mappings
46
+ end
47
+
48
+ def files
49
+ @files ||= FileFinder.find(@path)
50
+ end
51
+
52
+ def file_occurences
53
+ return @file_occurences if @file_occurences
54
+
55
+ result = {}
56
+
57
+ files.each do |file|
58
+ result[file] = find_occurences(file, inflections_mapping)
59
+ end
60
+
61
+ @file_occurences = result
62
+ end
63
+
64
+ def inflections_that_are_present
65
+ @inflections_that_are_present ||=
66
+ StringInflector.inflections + [:filename] &
67
+ file_occurences.values.inject({}) { |a,h| h.each { |k,v| v > 0 && (a[k] ||= 0 ; a[k] += v) };a }.keys
68
+ end
69
+
70
+ def report_header_file_occurences
71
+ result = ""
72
+ inflections_that_are_present.each_with_index do |inflection, index|
73
+ result += (" |" * index + ' ' + inflection.to_s + "\n")[1..-1]
74
+ end
75
+ result += (" |" * inflections_that_are_present.size + "\n")[1..-1]
76
+ result
77
+ end
78
+
79
+ def report_file_occurences_line(file)
80
+ result = ""
81
+ inflections_that_are_present.each_with_index do |inflection, index|
82
+ result += format_number(file_occurences[file][inflection])
83
+ end
84
+ result + ' ' + file + "\n"
85
+ end
86
+
87
+ def files_that_have_occurences
88
+ files.select { |f| was_found(file_occurences[f]) }
89
+ end
90
+
91
+ def report_file_occurences
92
+ result = ""
93
+ files_that_have_occurences.each do |f|
94
+ result += report_file_occurences_line(f)[1..-1]
95
+ end
96
+ result
97
+ end
98
+
99
+ def report_inflections_mapping
100
+ longest_current = inflections_mapping[:inflections].values.map { |v| v[:current].size }.max
101
+
102
+ result = ""
103
+ inflections_mapping[:inflections].each do |i, v|
104
+ result += "%-11s: %-#{longest_current}s -> %s\n" % [i, v[:current], v[:target]]
105
+ end
106
+ result + "\n"
107
+ end
108
+
109
+ def reports_for_files
110
+ report_header_file_occurences +
111
+ report_file_occurences
112
+ end
113
+
114
+ def new_filename_for(filename)
115
+ dirname = File.dirname(filename)
116
+ basename = File.basename(filename)
117
+ inflections_mapping[:inflections].each do |m, v|
118
+ if basename.include?(v[:current])
119
+ return File.join(dirname, basename.gsub(v[:current], v[:target]))
120
+ end
121
+ end
122
+ filename
123
+ end
124
+
125
+ def perform_directory!(dirname, out)
126
+ new_dirname = new_filename_for(dirname)
127
+ out.puts "d #{dirname} -> #{new_dirname}"
128
+ FileContentSubstitutor.new(@path).move_directory(dirname, new_dirname)
129
+ end
130
+
131
+ def perform_file!(filename, occurences, out)
132
+ new_filename = if occurences[:filename] > 0
133
+ x = new_filename_for(filename)
134
+ mode = 'r'
135
+ unless occurences.select { |k,v| k != :filename && v > 0 }.empty?
136
+ mode = 'R'
137
+ end
138
+
139
+ out.puts "#{mode} #{filename} -> #{x}"
140
+ x
141
+ else
142
+ out.puts "f #{filename}"
143
+ filename
144
+ end
145
+
146
+ present_mappings = occurences.select { |k,v| k != :filename && v > 0 }
147
+ mappings = present_mappings.map do |m,c|
148
+ inflections_mapping[:inflections][m].values
149
+ end
150
+
151
+ FileContentSubstitutor.new(@path).
152
+ substitute_in(filename, new_filename, mappings)
153
+ end
154
+
155
+ def perform!(out:)
156
+ out.puts "Performing:"
157
+ directories = []
158
+ files_that_have_occurences.each do |filename|
159
+ occurences = file_occurences[filename]
160
+ if FileTest.directory?(File.join(@path, filename))
161
+ directories << filename
162
+ else
163
+ perform_file!(filename, occurences, out)
164
+ end
165
+ end
166
+
167
+ directories.reverse.each do |dir|
168
+ perform_directory!(dir, out)
169
+ end
170
+
171
+ end
172
+
173
+ def self.rename_with_options(options, out:, err:)
174
+ orch = RenamingOrchestrator.new(options)
175
+ out.puts orch.report_inflections_mapping
176
+
177
+ if orch.files_that_have_occurences.empty?
178
+ out.puts "'#{options[:current_name]}' can not be found in any of the files in '#{options[:path]}'"
179
+ else
180
+ out.puts orch.reports_for_files
181
+ if options[:perform]
182
+ puts
183
+ orch.perform!(out: out)
184
+ else
185
+ out.puts "\nThis is an overview of changes that would be made\nRun same command with -p option to perform"
186
+ end
187
+ end
188
+ end
189
+ end
190
+ end
@@ -0,0 +1,50 @@
1
+ require 'optparse'
2
+
3
+ module BulldozeRenamer
4
+ class Shell
5
+ BANNER = <<"EOT"
6
+ usage: #{$0} path CurrentNameInCamelCase TargetName
7
+
8
+ Will do a crude renaming of everything in the current directory. It
9
+ uses `git ls-files` to find the files so only things checked into
10
+ git are subject to change.
11
+
12
+ This script is still potentially dangerous, use with caution.
13
+
14
+ By default only an overview is shown of what changes will be made
15
+ in what files. To actually perform those changes, pass the '-p'
16
+ option.
17
+ EOT
18
+
19
+ def self.usage(err: STDERR)
20
+ err.puts BANNER
21
+ exit 1
22
+ end
23
+
24
+ def self.start(argv, out: STDOUT, err: STDERR)
25
+ options = {
26
+ current_name: nil,
27
+ target_name: nil,
28
+ perform: false
29
+ }
30
+
31
+ OptionParser.new do |parser|
32
+ parser.banner = BANNER
33
+
34
+ parser.on("-p", "--perform", "Perform the substitutions on the files") do |perform|
35
+ options[:perform] = perform
36
+ end
37
+ end.parse! argv
38
+
39
+ unless argv.size == 3
40
+ self.usage(err: err)
41
+ end
42
+
43
+ options[:path] = argv[0]
44
+ options[:current_name] = argv[1]
45
+ options[:target_name] = argv[2]
46
+
47
+ RenamingOrchestrator.rename_with_options(options, out: out, err: err)
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,81 @@
1
+ require "active_support"
2
+ require "forwardable"
3
+
4
+ module BulldozeRenamer
5
+ class StringInflector
6
+ class StringDoesNotInflectToItselfError < ArgumentError; end
7
+
8
+ extend Forwardable
9
+
10
+ def self.active_support_inflections
11
+ [:underscore, :camelize]
12
+ end
13
+
14
+ def self.inflections
15
+ active_support_inflections + [:dasherize, :upcase, :js_camelize]
16
+ end
17
+
18
+ def_delegators ActiveSupport::Inflector, *StringInflector.active_support_inflections
19
+
20
+ def initialize(current, target)
21
+ @current = current
22
+ @target = target
23
+ end
24
+
25
+ def upcase(w)
26
+ underscore(w).upcase
27
+ end
28
+
29
+ def dasherize(w)
30
+ ActiveSupport::Inflector.dasherize(underscore(w))
31
+ end
32
+
33
+ def js_camelize(w)
34
+ c = camelize(w).dup
35
+ c[0] = c[0].downcase
36
+ c
37
+ end
38
+
39
+ def mappings
40
+ result = {
41
+ current_inflection: nil,
42
+ target_inflection: nil,
43
+ inflections: {}
44
+ }
45
+ StringInflector.inflections.each do |i|
46
+ unless result[:current_inflection]
47
+ if @current == send(i, @current)
48
+ result[:current_inflection] = i
49
+ end
50
+ end
51
+
52
+ unless result[:target_inflection]
53
+ if @target == send(i, @target)
54
+ result[:target_inflection] = i
55
+ end
56
+ end
57
+
58
+ mapping = {
59
+ current: send(i, @current),
60
+ target: send(i, @target)
61
+ }
62
+
63
+ unless result[:inflections].
64
+ values.
65
+ map { |i| i[:current] }.
66
+ include?(mapping[:current])
67
+ result[:inflections][i] = mapping
68
+ end
69
+ end
70
+
71
+ unless result[:current_inflection]
72
+ raise StringDoesNotInflectToItselfError.new(@current)
73
+ end
74
+
75
+ unless result[:target_inflection]
76
+ raise StringDoesNotInflectToItselfError.new(@target)
77
+ end
78
+ result
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,3 @@
1
+ module BulldozeRenamer
2
+ VERSION = "0.0.1"
3
+ end
metadata ADDED
@@ -0,0 +1,92 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bulldoze_renamer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Tom ten Thij
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2021-01-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '6'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: ruby-filemagic
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.7.2
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.7.2
41
+ description:
42
+ email:
43
+ - code@tomtenthij.nl
44
+ executables:
45
+ - bulldoze_rename
46
+ - bulldoze_rename_rb
47
+ extensions: []
48
+ extra_rdoc_files: []
49
+ files:
50
+ - ".github/FUNDING.yml"
51
+ - ".gitignore"
52
+ - ".rspec"
53
+ - ".travis.yml"
54
+ - Gemfile
55
+ - Guardfile
56
+ - README.md
57
+ - Rakefile
58
+ - bin/console
59
+ - bin/setup
60
+ - bulldoze_renamer.gemspec
61
+ - exe/bulldoze_rename
62
+ - exe/bulldoze_rename_rb
63
+ - lib/bulldoze_renamer.rb
64
+ - lib/bulldoze_renamer/file_content_substitutor.rb
65
+ - lib/bulldoze_renamer/file_finder.rb
66
+ - lib/bulldoze_renamer/renaming_orchestrator.rb
67
+ - lib/bulldoze_renamer/shell.rb
68
+ - lib/bulldoze_renamer/string_inflector.rb
69
+ - lib/bulldoze_renamer/version.rb
70
+ homepage:
71
+ licenses: []
72
+ metadata: {}
73
+ post_install_message:
74
+ rdoc_options: []
75
+ require_paths:
76
+ - lib
77
+ required_ruby_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: 2.3.0
82
+ required_rubygems_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ requirements: []
88
+ rubygems_version: 3.0.3
89
+ signing_key:
90
+ specification_version: 4
91
+ summary: A gem environment to learn code in
92
+ test_files: []