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 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