reenrb 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +14 -1
- data/Gemfile.lock +1 -1
- data/lib/reenrb/actions/delete.rb +20 -0
- data/lib/reenrb/actions/file_rename.rb +20 -0
- data/lib/reenrb/actions/nothing.rb +17 -0
- data/lib/reenrb/change.rb +119 -0
- data/lib/{changes.rb → reenrb/changes.rb} +10 -8
- data/lib/{changes_file.rb → reenrb/changes_file.rb} +0 -0
- data/lib/reenrb/reen.rb +48 -0
- data/lib/reenrb/version.rb +1 -1
- data/lib/reenrb.rb +4 -48
- metadata +8 -4
- data/lib/change.rb +0 -108
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2253d4b2aa304bfac8b7e4659fee9ca3b514a22d4a0bb323be9619883b9448c0
|
4
|
+
data.tar.gz: 3f82b6afbbe84b70878d153b56f6f75a72c2570df3b2b292c0d42a4a0057e973
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 331ad4055d5abc194ec73fb0be6ac7479d3d2d8c41fb37980edc9c772f998a7b469da386e6b8e9c9dfe594802f9f1e39daa0081f0e109a1278fa41b1fb666a24
|
7
|
+
data.tar.gz: 39d3af74b266effdb9ad82c513412539edd75b2573e97a36f41850027822c4a22029fa0b1fe6b298de177f9d794c86e80c88349dcb05b2b19541c998a572e2c2
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,18 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
All notable changes to this project will be documented in this file.
|
4
|
+
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
7
|
+
|
1
8
|
## [Unreleased]
|
2
9
|
|
10
|
+
## [0.2.1] - 2022-11-05
|
11
|
+
|
12
|
+
### Changed
|
13
|
+
|
14
|
+
- Simplified API for passing block to request/execute
|
15
|
+
|
3
16
|
## [0.1.0] - 2022-11-05
|
4
17
|
|
5
|
-
- Initial release
|
18
|
+
- Initial release: CLI and API working
|
data/Gemfile.lock
CHANGED
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Reenrb
|
4
|
+
module Actions
|
5
|
+
# Deletes a file
|
6
|
+
class FileDelete
|
7
|
+
def initialize(old_name, new_name)
|
8
|
+
@old_name = old_name
|
9
|
+
@new_name = new_name
|
10
|
+
end
|
11
|
+
|
12
|
+
def call
|
13
|
+
File.delete(@old_name)
|
14
|
+
nil
|
15
|
+
rescue Errno::ENOENT
|
16
|
+
"Could not delete"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Reenrb
|
4
|
+
module Actions
|
5
|
+
# Renames files
|
6
|
+
class FileRename
|
7
|
+
def initialize(old_name, new_name)
|
8
|
+
@old_name = old_name
|
9
|
+
@new_name = new_name
|
10
|
+
end
|
11
|
+
|
12
|
+
def call
|
13
|
+
File.rename(@old_name, @new_name)
|
14
|
+
nil
|
15
|
+
rescue Errno::ENOENT
|
16
|
+
"No such target file or directory"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Reenrb
|
4
|
+
module Actions
|
5
|
+
# Does nothing to items
|
6
|
+
class DoNothing
|
7
|
+
def initialize(old_name, new_name)
|
8
|
+
@old_name = old_name
|
9
|
+
@new_name = new_name
|
10
|
+
end
|
11
|
+
|
12
|
+
def call
|
13
|
+
nil
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "actions/delete"
|
4
|
+
require_relative "actions/file_rename"
|
5
|
+
require_relative "actions/nothing"
|
6
|
+
|
7
|
+
module Reenrb
|
8
|
+
# Change to an orignal file
|
9
|
+
class Change
|
10
|
+
attr_reader :original, :requested, :change, :status
|
11
|
+
|
12
|
+
module STATUS
|
13
|
+
ACCEPTED = :accepted
|
14
|
+
REJECTED = :rejected
|
15
|
+
EXECUTED = :executed
|
16
|
+
FAILED = :failed
|
17
|
+
end
|
18
|
+
|
19
|
+
module CHANGE
|
20
|
+
NONE = :none
|
21
|
+
DELETE = :delete
|
22
|
+
RENAME = :rename
|
23
|
+
end
|
24
|
+
|
25
|
+
ACTION_HANDLER = {
|
26
|
+
CHANGE::NONE => Actions::DoNothing,
|
27
|
+
CHANGE::DELETE => Actions::FileDelete,
|
28
|
+
CHANGE::RENAME => Actions::FileRename
|
29
|
+
}.freeze
|
30
|
+
|
31
|
+
CHANGES_DESC = {
|
32
|
+
CHANGE::NONE => "Nothing",
|
33
|
+
CHANGE::DELETE => "Deleting",
|
34
|
+
CHANGE::RENAME => "Renaming"
|
35
|
+
}.freeze
|
36
|
+
|
37
|
+
def initialize(original, requested)
|
38
|
+
@original = original
|
39
|
+
@requested = requested
|
40
|
+
@change = compare
|
41
|
+
consider
|
42
|
+
end
|
43
|
+
|
44
|
+
def compare
|
45
|
+
if original == requested
|
46
|
+
CHANGE::NONE
|
47
|
+
elsif requested.start_with? "-"
|
48
|
+
CHANGE::DELETE
|
49
|
+
else
|
50
|
+
CHANGE::RENAME
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def consider
|
55
|
+
if request_full_dir? && request_delete?
|
56
|
+
@status = STATUS::REJECTED
|
57
|
+
@reason = "Directories with files cannot be changed"
|
58
|
+
else
|
59
|
+
@status = STATUS::ACCEPTED
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def execute
|
64
|
+
return(self) if not_accepted?
|
65
|
+
|
66
|
+
@status = STATUS::EXECUTED
|
67
|
+
error = ACTION_HANDLER[@change].new(original, requested).call
|
68
|
+
|
69
|
+
if error
|
70
|
+
@status = STATUS::FAILED
|
71
|
+
@reason = error
|
72
|
+
end
|
73
|
+
|
74
|
+
self
|
75
|
+
end
|
76
|
+
|
77
|
+
# Predicates
|
78
|
+
|
79
|
+
def request_dir? = Dir.exist?(@original)
|
80
|
+
|
81
|
+
def request_nothing? = @change == CHANGE::NONE
|
82
|
+
|
83
|
+
def request_rename? = @change == CHANGE::RENAME
|
84
|
+
|
85
|
+
def request_delete? = @change == CHANGE::DELETE
|
86
|
+
|
87
|
+
def request_empty_dir? = Dir.empty?(@original)
|
88
|
+
|
89
|
+
def accepted? = @status == STATUS::ACCEPTED
|
90
|
+
|
91
|
+
def not_accepted? = !accepted?
|
92
|
+
|
93
|
+
def executed? = @status == STATUS::EXECUTED
|
94
|
+
|
95
|
+
def rejected? = @status == STATUS::REJECTED
|
96
|
+
|
97
|
+
def failed? = @status == STATUS::FAILED
|
98
|
+
|
99
|
+
def request_full_dir? = request_dir? && !request_empty_dir?
|
100
|
+
|
101
|
+
def executed_or_rejected? = %i[executed rejected].include?(@status)
|
102
|
+
|
103
|
+
# Decoration
|
104
|
+
|
105
|
+
def to_s
|
106
|
+
file_desc =
|
107
|
+
case @change
|
108
|
+
when CHANGE::RENAME
|
109
|
+
"#{@original} -> #{@requested}"
|
110
|
+
else
|
111
|
+
@original
|
112
|
+
end
|
113
|
+
|
114
|
+
reason_desc = rejected? || failed? ? " (failed: #{@reason})" : ""
|
115
|
+
|
116
|
+
"#{CHANGES_DESC[@change]}: #{file_desc}#{reason_desc}"
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative "change"
|
4
|
+
|
3
5
|
module Reenrb
|
4
6
|
# Change to an orignal file
|
5
7
|
class Changes
|
@@ -14,30 +16,30 @@ module Reenrb
|
|
14
16
|
self
|
15
17
|
end
|
16
18
|
|
17
|
-
#
|
19
|
+
# Queries
|
18
20
|
|
19
21
|
def rename_requested
|
20
|
-
Changes.new(@list.select
|
22
|
+
Changes.new(@list.select(&:request_rename?))
|
21
23
|
end
|
22
24
|
|
23
25
|
def delete_requested
|
24
|
-
Changes.new(@list.select
|
26
|
+
Changes.new(@list.select(&:request_delete?))
|
25
27
|
end
|
26
28
|
|
27
29
|
def change_requested
|
28
|
-
Changes.new(@list.reject
|
30
|
+
Changes.new(@list.reject(&:request_nothing?))
|
29
31
|
end
|
30
32
|
|
31
33
|
def rejected
|
32
|
-
Changes.new(@list.select
|
34
|
+
Changes.new(@list.select(&:rejected?))
|
33
35
|
end
|
34
36
|
|
35
37
|
def accepted
|
36
|
-
Changes.new(@list.select
|
38
|
+
Changes.new(@list.select(&:accepted?))
|
37
39
|
end
|
38
40
|
|
39
41
|
def executed
|
40
|
-
Changes.new(@list.select
|
42
|
+
Changes.new(@list.select(&:executed?))
|
41
43
|
end
|
42
44
|
|
43
45
|
def count
|
@@ -55,7 +57,7 @@ module Reenrb
|
|
55
57
|
# Predicates
|
56
58
|
|
57
59
|
def no_changes_requested?
|
58
|
-
list.map(&:change).all?
|
60
|
+
list.map(&:change).all? Change::CHANGE::NONE
|
59
61
|
end
|
60
62
|
|
61
63
|
def changes_requested?
|
File without changes
|
data/lib/reenrb/reen.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Reenrb
|
4
|
+
# Renames pattern of files with given editor
|
5
|
+
# Examples:
|
6
|
+
# Reenrb::Reen.new(editor: "code -w").call("spec/fixtures/example/*")
|
7
|
+
# Reenrb::Reen.new(editor: nil).call("spec/fixtures/example/*") { ... }
|
8
|
+
class Reen
|
9
|
+
DEL_ERROR = "Do not delete any file/folder names"
|
10
|
+
|
11
|
+
attr_reader :changes
|
12
|
+
|
13
|
+
def initialize(editor: "emacs", options: {})
|
14
|
+
@editor = editor
|
15
|
+
@options = options
|
16
|
+
end
|
17
|
+
|
18
|
+
def request(original_list, &block) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
19
|
+
changed_list = ChangesFile.new(original_list).allow_changes do |file|
|
20
|
+
file.blocking_edit(@editor) if @editor
|
21
|
+
|
22
|
+
if block
|
23
|
+
lines = File.read(file.path).split("\n")
|
24
|
+
new_lines = block.call(lines) || lines
|
25
|
+
File.write(file.path, new_lines.join("\n"))
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
raise(Error, DEL_ERROR) if changed_list.size != original_list.size
|
30
|
+
|
31
|
+
@changes = compare_lists(original_list, changed_list)
|
32
|
+
.then { |change_array| Changes.new(change_array) }
|
33
|
+
end
|
34
|
+
|
35
|
+
def execute(original_list, &block)
|
36
|
+
@changes ||= request(original_list, &block)
|
37
|
+
@changes = @changes.execute!
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def compare_lists(original_list, changed_list)
|
43
|
+
original_list.zip(changed_list).map do |original, revised|
|
44
|
+
Change.new(original, revised)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/lib/reenrb/version.rb
CHANGED
data/lib/reenrb.rb
CHANGED
@@ -1,55 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative "reenrb/version"
|
4
|
-
require_relative "changes_file"
|
5
|
-
require_relative "change"
|
6
|
-
require_relative "changes"
|
4
|
+
require_relative "reenrb/changes_file"
|
5
|
+
require_relative "reenrb/change"
|
6
|
+
require_relative "reenrb/changes"
|
7
|
+
require_relative "reenrb/reen"
|
7
8
|
|
8
9
|
module Reenrb
|
9
10
|
class Error < StandardError; end
|
10
|
-
|
11
|
-
# Renames pattern of files with given editor
|
12
|
-
# Examples:
|
13
|
-
# Reenrb::Reen.new(editor: "code -w").call("spec/fixtures/example/*")
|
14
|
-
# Reenrb::Reen.new(editor: nil).call("spec/fixtures/example/*") { ... }
|
15
|
-
class Reen
|
16
|
-
DEL_ERROR = "Do not delete any file/folder names"
|
17
|
-
|
18
|
-
attr_reader :changes
|
19
|
-
|
20
|
-
def initialize(editor: "emacs", options: {})
|
21
|
-
@editor = editor
|
22
|
-
@options = options
|
23
|
-
end
|
24
|
-
|
25
|
-
def request(original_list, &block) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
26
|
-
changed_list = ChangesFile.new(original_list).allow_changes do |file|
|
27
|
-
file.blocking_edit(@editor) if @editor
|
28
|
-
|
29
|
-
if block
|
30
|
-
lines = File.read(file.path).split("\n")
|
31
|
-
new_lines = block.call(lines) || lines
|
32
|
-
File.write(file.path, new_lines.join("\n"))
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
raise(Error, DEL_ERROR) if changed_list.size != original_list.size
|
37
|
-
|
38
|
-
@changes = compare_lists(original_list, changed_list)
|
39
|
-
.then { |change_array| Changes.new(change_array) }
|
40
|
-
end
|
41
|
-
|
42
|
-
def execute(original_list, &block)
|
43
|
-
@changes ||= request(original_list, &block)
|
44
|
-
@changes = @changes.execute!
|
45
|
-
end
|
46
|
-
|
47
|
-
private
|
48
|
-
|
49
|
-
def compare_lists(original_list, changed_list)
|
50
|
-
original_list.zip(changed_list).map do |original, revised|
|
51
|
-
Change.new(original, revised)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
11
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: reenrb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Soumya Ray
|
@@ -110,10 +110,14 @@ files:
|
|
110
110
|
- README.md
|
111
111
|
- Rakefile
|
112
112
|
- bin/reen
|
113
|
-
- lib/change.rb
|
114
|
-
- lib/changes.rb
|
115
|
-
- lib/changes_file.rb
|
116
113
|
- lib/reenrb.rb
|
114
|
+
- lib/reenrb/actions/delete.rb
|
115
|
+
- lib/reenrb/actions/file_rename.rb
|
116
|
+
- lib/reenrb/actions/nothing.rb
|
117
|
+
- lib/reenrb/change.rb
|
118
|
+
- lib/reenrb/changes.rb
|
119
|
+
- lib/reenrb/changes_file.rb
|
120
|
+
- lib/reenrb/reen.rb
|
117
121
|
- lib/reenrb/version.rb
|
118
122
|
- reenrb.gemspec
|
119
123
|
- sig/reenrb.rbs
|
data/lib/change.rb
DELETED
@@ -1,108 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Reenrb
|
4
|
-
# Change to an orignal file
|
5
|
-
class Change
|
6
|
-
attr_reader :original, :requested, :change, :status
|
7
|
-
|
8
|
-
module STATUS
|
9
|
-
ACCEPTED = :accepted
|
10
|
-
REJECTED = :rejected
|
11
|
-
EXECUTED = :executed
|
12
|
-
end
|
13
|
-
|
14
|
-
module CHANGE
|
15
|
-
NONE = :none
|
16
|
-
DELETE = :delete
|
17
|
-
RENAME = :rename
|
18
|
-
end
|
19
|
-
|
20
|
-
CHANGES_DESC = {
|
21
|
-
none: "Nothing",
|
22
|
-
delete: "Deleting",
|
23
|
-
rename: "Renaming"
|
24
|
-
}.freeze
|
25
|
-
|
26
|
-
def initialize(original, requested)
|
27
|
-
@original = original
|
28
|
-
@requested = requested
|
29
|
-
@change = compare
|
30
|
-
consider
|
31
|
-
end
|
32
|
-
|
33
|
-
def compare
|
34
|
-
if original == requested
|
35
|
-
:none
|
36
|
-
elsif requested.start_with? "-"
|
37
|
-
:delete
|
38
|
-
else
|
39
|
-
:rename
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def consider
|
44
|
-
if request_full_directory? && request_delete?
|
45
|
-
@status = STATUS::REJECTED
|
46
|
-
@reason = "Directories with files cannot be changed"
|
47
|
-
else
|
48
|
-
@status = STATUS::ACCEPTED
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def execute
|
53
|
-
return(self) if executed_or_rejected?
|
54
|
-
|
55
|
-
case @change
|
56
|
-
when :rename
|
57
|
-
File.rename(@original, @requested)
|
58
|
-
when :delete
|
59
|
-
File.delete(@original)
|
60
|
-
end
|
61
|
-
|
62
|
-
@status = STATUS::EXECUTED
|
63
|
-
self
|
64
|
-
end
|
65
|
-
|
66
|
-
# Inspection
|
67
|
-
|
68
|
-
def request_directory?
|
69
|
-
Dir.exist? @original
|
70
|
-
end
|
71
|
-
|
72
|
-
def request_delete?
|
73
|
-
@change == CHANGE::DELETE
|
74
|
-
end
|
75
|
-
|
76
|
-
def request_empty_directory?
|
77
|
-
Dir.empty? @original
|
78
|
-
end
|
79
|
-
|
80
|
-
def executed?
|
81
|
-
@status == STATUS::EXECUTED
|
82
|
-
end
|
83
|
-
|
84
|
-
def request_full_directory?
|
85
|
-
request_directory? && !request_empty_directory?
|
86
|
-
end
|
87
|
-
|
88
|
-
def executed_or_rejected?
|
89
|
-
%i[executed rejected].include? @status
|
90
|
-
end
|
91
|
-
|
92
|
-
# Decoration
|
93
|
-
|
94
|
-
def to_s
|
95
|
-
file_desc =
|
96
|
-
case @change
|
97
|
-
when :rename
|
98
|
-
"#{@original} -> #{@requested}"
|
99
|
-
else
|
100
|
-
@original
|
101
|
-
end
|
102
|
-
|
103
|
-
reason_desc = @status == STATUS::REJECTED ? " (failed: #{@reason})" : ""
|
104
|
-
|
105
|
-
"#{CHANGES_DESC[@change]}: #{file_desc}#{reason_desc}"
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|