reenrb 0.2.1 → 0.2.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ef0b76de4c05fb0949d2b65b6b7f79d3265fb1474e109de5186a788b1c32602c
4
- data.tar.gz: 5c4a47408deed235d05236615380fdc35a099f4049d7fce833e3a06af48c2d96
3
+ metadata.gz: 2253d4b2aa304bfac8b7e4659fee9ca3b514a22d4a0bb323be9619883b9448c0
4
+ data.tar.gz: 3f82b6afbbe84b70878d153b56f6f75a72c2570df3b2b292c0d42a4a0057e973
5
5
  SHA512:
6
- metadata.gz: 3fe1b3c16fb10bdaa39c095acef4611822c2c07934081dfc1d223f2103d3cf07a3d819b50b5a1351cec1538d0fb24e03fd77d58eeef2bb212405a1c624b2f602
7
- data.tar.gz: 88bd9ad15855e04911bd87b2d620843a254c31c0b84a4919c18cdaa314b8bd8c6953280450e8cefbbc32af1489e4c5034322bff26c4a63cdc2a9c57810b04348
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
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- reenrb (0.2.1)
4
+ reenrb (0.2.2)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -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
- # Inspection
19
+ # Queries
18
20
 
19
21
  def rename_requested
20
- Changes.new(@list.select { |c| c.change == :rename })
22
+ Changes.new(@list.select(&:request_rename?))
21
23
  end
22
24
 
23
25
  def delete_requested
24
- Changes.new(@list.select { |c| c.change == :delete })
26
+ Changes.new(@list.select(&:request_delete?))
25
27
  end
26
28
 
27
29
  def change_requested
28
- Changes.new(@list.reject { |c| c.change == :none })
30
+ Changes.new(@list.reject(&:request_nothing?))
29
31
  end
30
32
 
31
33
  def rejected
32
- Changes.new(@list.select { |c| c.status == :rejected })
34
+ Changes.new(@list.select(&:rejected?))
33
35
  end
34
36
 
35
37
  def accepted
36
- Changes.new(@list.select { |c| c.status == :accepted })
38
+ Changes.new(@list.select(&:accepted?))
37
39
  end
38
40
 
39
41
  def executed
40
- Changes.new(@list.select { |c| c.status == :executed })
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? :none
60
+ list.map(&:change).all? Change::CHANGE::NONE
59
61
  end
60
62
 
61
63
  def changes_requested?
File without changes
@@ -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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Reenrb
4
- VERSION = "0.2.1"
4
+ VERSION = "0.2.2"
5
5
  end
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.1
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