recode 0.0.1
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.
- checksums.yaml +7 -0
- data/README.md +17 -0
- data/bin/recode +16 -0
- data/lib/recode/change_variations.rb +14 -0
- data/lib/recode/cli.rb +13 -0
- data/lib/recode/command.rb +59 -0
- data/lib/recode/diffing.rb +19 -0
- data/lib/recode/exceptions.rb +3 -0
- data/lib/recode/handler/apply.rb +15 -0
- data/lib/recode/handler/base.rb +29 -0
- data/lib/recode/handler/output.rb +13 -0
- data/lib/recode/handler/prompt.rb +36 -0
- data/lib/recode/runner.rb +62 -0
- data/lib/recode/version.rb +3 -0
- data/lib/recode.rb +15 -0
- metadata +113 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 921e3c461e66aa6a0c098c01ee004dcd509ba0ff2d3e856af43bc81270f3ca63
|
4
|
+
data.tar.gz: f7dcbfec8d7ef26660a8d7f4fb83a91e4f56184f8884131a9bca577b12440799
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2d62e6784ced7afb96d01d4947691e52fb286adf56e927821c5ff9e37a69f23756f54b86e9eba06ea1f26834651931751ec69c1176648d762f8267a66d9f2547
|
7
|
+
data.tar.gz: 37c79f46d9d376fd5036cc583fa6c4783d7385001d5390e4f7b6ba0182268c1ac332ec4fb1ae4eb7298ec15523ff2fed3e259ef56aacde1932c1860ccc4a15fe
|
data/README.md
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# Recode - Command line refactoring utility
|
2
|
+
|
3
|
+
[](https://badge.fury.io/rb/recode)
|
4
|
+
[](https://github.com/DannyBen/recode/actions?query=workflow%3ATest)
|
5
|
+
[](https://codeclimate.com/github/DannyBen/recode/maintainability)
|
6
|
+
|
7
|
+
---
|
8
|
+
|
9
|
+
## Installation
|
10
|
+
|
11
|
+
$ gem install recode
|
12
|
+
|
13
|
+
|
14
|
+
|
15
|
+
## Usage
|
16
|
+
|
17
|
+
TODO
|
data/bin/recode
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'recode/cli'
|
3
|
+
include Colsole
|
4
|
+
|
5
|
+
router = Recode::CLI.router
|
6
|
+
|
7
|
+
begin
|
8
|
+
exit router.run ARGV
|
9
|
+
rescue Interrupt, Recode::Abort
|
10
|
+
say "\nGoodbye"
|
11
|
+
exit 1
|
12
|
+
rescue => e
|
13
|
+
puts e.backtrace.reverse if ENV['DEBUG']
|
14
|
+
say! "!txtred!#{e.class}: #{e.message}"
|
15
|
+
exit 1
|
16
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Recode
|
2
|
+
module ChangeVariations
|
3
|
+
using Strings::Inflection::Extensions
|
4
|
+
|
5
|
+
def change_variations(old_string, new_string)
|
6
|
+
result = []
|
7
|
+
result << [old_string.pluralize.downcase, new_string.pluralize.downcase]
|
8
|
+
result << [old_string.pluralize, new_string.pluralize]
|
9
|
+
result << [old_string.downcase, new_string.downcase]
|
10
|
+
result << [old_string, new_string]
|
11
|
+
result.uniq
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/recode/cli.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
module Recode
|
2
|
+
class Command < MisterBin::Command
|
3
|
+
help "Code Refactoring Utility"
|
4
|
+
|
5
|
+
usage "recode OLD [to] NEW [in] EXTENSIONS... [options]"
|
6
|
+
usage "recode (-h|--help)"
|
7
|
+
|
8
|
+
option "-a --apply", "Apply changes"
|
9
|
+
option "-p --prompt", "Apply changes interactively "
|
10
|
+
|
11
|
+
param "OLD", "Old string, singular and capitalized"
|
12
|
+
param "NEW", "New string, singular and capitalized"
|
13
|
+
param "EXTENSIONS", "Space delimited file extensions"
|
14
|
+
|
15
|
+
example "recode refactor Member User rb"
|
16
|
+
example "recode refactor Member to User in rb js"
|
17
|
+
example "recode refactor Member to User in rb js --apply"
|
18
|
+
example "recode refactor Member to User in rb js -p"
|
19
|
+
|
20
|
+
def run
|
21
|
+
runner = Runner.new path: path,
|
22
|
+
extensions: extensions,
|
23
|
+
old_string: old_string,
|
24
|
+
new_string: new_string
|
25
|
+
|
26
|
+
runner.execute handler
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def handler
|
32
|
+
if args['--prompt']
|
33
|
+
Handler::Prompt.new
|
34
|
+
elsif args['--apply']
|
35
|
+
Handler::Apply.new
|
36
|
+
else
|
37
|
+
Handler::Output.new
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def path
|
42
|
+
"."
|
43
|
+
end
|
44
|
+
|
45
|
+
def extensions
|
46
|
+
args['EXTENSIONS']
|
47
|
+
end
|
48
|
+
|
49
|
+
def old_string
|
50
|
+
args['OLD']
|
51
|
+
end
|
52
|
+
|
53
|
+
def new_string
|
54
|
+
args['NEW']
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Recode
|
2
|
+
module Diffing
|
3
|
+
def diff(source, target)
|
4
|
+
diffy.new "#{source}\n", "#{target}\n", context: 1
|
5
|
+
end
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
def diffy
|
10
|
+
@diffy ||= diffy!
|
11
|
+
end
|
12
|
+
|
13
|
+
def diffy!
|
14
|
+
Diffy::Diff.default_format = :color
|
15
|
+
Diffy::Diff
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Recode
|
2
|
+
module Handler
|
3
|
+
class Base
|
4
|
+
include Diffing
|
5
|
+
include Colsole
|
6
|
+
|
7
|
+
def show_rename(source:, target:)
|
8
|
+
say "\n!txtpur!" + ("_" * terminal_width)
|
9
|
+
say "!txtpur!rename:"
|
10
|
+
puts diff source, target
|
11
|
+
end
|
12
|
+
|
13
|
+
def show_edit(file:, before:, after:)
|
14
|
+
say "\n!txtblu!" + ("_" * terminal_width)
|
15
|
+
say "!txtblu!edit: #{file}"
|
16
|
+
puts diff before, after
|
17
|
+
end
|
18
|
+
|
19
|
+
def rename_file(source, target)
|
20
|
+
FileUtils.mkdir_p File.dirname target
|
21
|
+
FileUtils.mv source, target
|
22
|
+
end
|
23
|
+
|
24
|
+
def save_file(file, content)
|
25
|
+
File.write file, content
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'io/console'
|
2
|
+
|
3
|
+
module Recode
|
4
|
+
module Handler
|
5
|
+
class Prompt < Output
|
6
|
+
def rename(source:, target:)
|
7
|
+
super
|
8
|
+
rename_file source, target if apply?
|
9
|
+
end
|
10
|
+
|
11
|
+
def edit(file:, before:, after:)
|
12
|
+
super
|
13
|
+
save_file file, after if apply?
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def apply?
|
19
|
+
say "\nApply? !undgrn!Y!txtrst!es, !undgrn!n!txtrst!o, !undgrn!q!txtrst!uit : "
|
20
|
+
answer = $stdin.getch.downcase
|
21
|
+
|
22
|
+
if answer == 'q' or answer == "\u0003"
|
23
|
+
say "!txtblu!Quit"
|
24
|
+
raise Recode::Abort
|
25
|
+
elsif answer == 'n'
|
26
|
+
say "!txtred!No"
|
27
|
+
false
|
28
|
+
else
|
29
|
+
say "!txtgrn!Yes"
|
30
|
+
true
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module Recode
|
2
|
+
class Runner
|
3
|
+
include Colsole
|
4
|
+
include ChangeVariations
|
5
|
+
|
6
|
+
attr_accessor :path, :extensions, :old_string, :new_string
|
7
|
+
attr_accessor :handler
|
8
|
+
|
9
|
+
def initialize(path: nil, extensions: nil, old_string: nil, new_string: nil)
|
10
|
+
@path, @extensions = path, extensions
|
11
|
+
@old_string, @new_string = old_string, new_string
|
12
|
+
end
|
13
|
+
|
14
|
+
def execute(handler)
|
15
|
+
@handler = handler
|
16
|
+
refactor_filenames
|
17
|
+
refactor_contents
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def refactor_filenames
|
23
|
+
files.each { |file| refactor_filename file }
|
24
|
+
refresh_files
|
25
|
+
end
|
26
|
+
|
27
|
+
def refactor_contents
|
28
|
+
files.each { |file| refactor_content file }
|
29
|
+
end
|
30
|
+
|
31
|
+
def refactor_filename(file)
|
32
|
+
target = apply_changes file
|
33
|
+
payload = { source: file, target: target }
|
34
|
+
handler.rename **payload unless target == file
|
35
|
+
end
|
36
|
+
|
37
|
+
def refactor_content(file)
|
38
|
+
before = File.read file
|
39
|
+
after = apply_changes before
|
40
|
+
payload = { file: file, before: before, after: after }
|
41
|
+
handler.edit **payload unless before == after
|
42
|
+
end
|
43
|
+
|
44
|
+
def apply_changes(string)
|
45
|
+
result = string.dup
|
46
|
+
changes.each { |from, to| result.gsub!(from, to) }
|
47
|
+
result
|
48
|
+
end
|
49
|
+
|
50
|
+
def changes
|
51
|
+
@changes ||= change_variations old_string, new_string
|
52
|
+
end
|
53
|
+
|
54
|
+
def files
|
55
|
+
@files ||= Dir["#{path}/**/*.{#{extensions.join ','}}"].sort
|
56
|
+
end
|
57
|
+
|
58
|
+
def refresh_files
|
59
|
+
@files = nil
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
data/lib/recode.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'diffy'
|
2
|
+
require 'colsole'
|
3
|
+
require 'strings-inflection'
|
4
|
+
require 'strings/inflection/extensions'
|
5
|
+
|
6
|
+
require 'recode/exceptions'
|
7
|
+
require 'recode/diffing'
|
8
|
+
require 'recode/handler/base'
|
9
|
+
require 'recode/handler/output'
|
10
|
+
require 'recode/handler/apply'
|
11
|
+
require 'recode/handler/prompt'
|
12
|
+
require 'recode/change_variations'
|
13
|
+
require 'recode/runner'
|
14
|
+
|
15
|
+
require 'byebug' if ENV['BYEBUG']
|
metadata
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: recode
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Danny Ben Shitrit
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-05-15 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: mister_bin
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.7'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.7'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: colsole
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.7'
|
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'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: diffy
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.3'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.3'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: strings-inflection
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0.1'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0.1'
|
69
|
+
description: Command line utility for refactoring code
|
70
|
+
email: db@dannyben.com
|
71
|
+
executables:
|
72
|
+
- recode
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- README.md
|
77
|
+
- bin/recode
|
78
|
+
- lib/recode.rb
|
79
|
+
- lib/recode/change_variations.rb
|
80
|
+
- lib/recode/cli.rb
|
81
|
+
- lib/recode/command.rb
|
82
|
+
- lib/recode/diffing.rb
|
83
|
+
- lib/recode/exceptions.rb
|
84
|
+
- lib/recode/handler/apply.rb
|
85
|
+
- lib/recode/handler/base.rb
|
86
|
+
- lib/recode/handler/output.rb
|
87
|
+
- lib/recode/handler/prompt.rb
|
88
|
+
- lib/recode/runner.rb
|
89
|
+
- lib/recode/version.rb
|
90
|
+
homepage: https://github.com/dannyben/recode
|
91
|
+
licenses:
|
92
|
+
- MIT
|
93
|
+
metadata: {}
|
94
|
+
post_install_message:
|
95
|
+
rdoc_options: []
|
96
|
+
require_paths:
|
97
|
+
- lib
|
98
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 2.4.0
|
103
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
104
|
+
requirements:
|
105
|
+
- - ">="
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
version: '0'
|
108
|
+
requirements: []
|
109
|
+
rubygems_version: 3.1.2
|
110
|
+
signing_key:
|
111
|
+
specification_version: 4
|
112
|
+
summary: Command line utility for refactoring code
|
113
|
+
test_files: []
|