reenrb 0.1.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: '083216d43618c82f4f477057c5b388be39385ce3afe3984fdbb6ba59d2e9ab1c'
4
- data.tar.gz: 15d221f549392c5830f2b709d98078d572cf4638a6f5a661ab2d495626868d9e
3
+ metadata.gz: 2253d4b2aa304bfac8b7e4659fee9ca3b514a22d4a0bb323be9619883b9448c0
4
+ data.tar.gz: 3f82b6afbbe84b70878d153b56f6f75a72c2570df3b2b292c0d42a4a0057e973
5
5
  SHA512:
6
- metadata.gz: 782c7fdb66213cf0d5de16acacdea2cacfc3a01b87ad0e8376e7729434a29cc2577209477faaef9c23d14513e6050b7997697f365d8f40e2aa9665f73ebfe4c5
7
- data.tar.gz: db2ef58c4c56b262a60c85b0a70b6b12dda8d05dcf7fd504c44fce710f89a0709802e8e378f0a56fb551b1c9ea8cad6d623877de5c594787206ea6fa496b7a84
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.1.0)
4
+ reenrb (0.2.2)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -43,7 +43,7 @@ Use programmatically using the `reenrb` gem. In the example below, we specify th
43
43
  require 'reenrb'
44
44
 
45
45
  glob = Dir.glob("*")
46
- reen = Reenrb::Reen.new(options: { mock_editor: true })
46
+ reen = Reenrb::Reen.new(editor: nil)
47
47
 
48
48
  reen.execute(glob) do |tmpfile_path|
49
49
  lines = File.read(tmpfile_path).split("\n")
@@ -55,6 +55,8 @@ reen.execute(glob) do |tmpfile_path|
55
55
  end
56
56
  ```
57
57
 
58
+ You may also pass a block with an editor specified, in which case the block is run after the editor has finished.
59
+
58
60
  ## Development
59
61
 
60
62
  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.
data/bin/reen CHANGED
@@ -17,6 +17,6 @@ exit_with_error(EDITOR_MSG) if editor.empty?
17
17
 
18
18
  results = Reenrb::Reen.new(editor: editor).execute(file_list)
19
19
 
20
- changes = Reenrb::Changes.new(results).change_requested
20
+ changes = results.change_requested
21
21
 
22
22
  puts changes.summarize
@@ -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
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "change"
4
+
5
+ module Reenrb
6
+ # Change to an orignal file
7
+ class Changes
8
+ attr_reader :list
9
+
10
+ def initialize(changes_list)
11
+ @list = changes_list
12
+ end
13
+
14
+ def execute!
15
+ @list.map(&:execute)
16
+ self
17
+ end
18
+
19
+ # Queries
20
+
21
+ def rename_requested
22
+ Changes.new(@list.select(&:request_rename?))
23
+ end
24
+
25
+ def delete_requested
26
+ Changes.new(@list.select(&:request_delete?))
27
+ end
28
+
29
+ def change_requested
30
+ Changes.new(@list.reject(&:request_nothing?))
31
+ end
32
+
33
+ def rejected
34
+ Changes.new(@list.select(&:rejected?))
35
+ end
36
+
37
+ def accepted
38
+ Changes.new(@list.select(&:accepted?))
39
+ end
40
+
41
+ def executed
42
+ Changes.new(@list.select(&:executed?))
43
+ end
44
+
45
+ def count
46
+ @list.size
47
+ end
48
+
49
+ # Decoration
50
+
51
+ def summarize
52
+ return "Nothing changed" if @list.empty?
53
+
54
+ @list.map(&:to_s).join("\n")
55
+ end
56
+
57
+ # Predicates
58
+
59
+ def no_changes_requested?
60
+ list.map(&:change).all? Change::CHANGE::NONE
61
+ end
62
+
63
+ def changes_requested?
64
+ !no_changes_requested?
65
+ end
66
+
67
+ def all_executed?
68
+ @list.all?(&:executed?)
69
+ end
70
+ end
71
+ end
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.1.1"
4
+ VERSION = "0.2.2"
5
5
  end
data/lib/reenrb.rb CHANGED
@@ -1,48 +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
- # Example:
13
- # Reenrb::Reen.new(editor: "code -w").call("spec/fixtures/example/*")
14
- class Reen
15
- DEL_ERROR = "Do not delete any file/folder names"
16
-
17
- attr_reader :changes
18
-
19
- def initialize(editor: "emacs", options: {})
20
- @editor = editor
21
- @options = options
22
- end
23
-
24
- def request(original_list, &block)
25
- # original_list = Dir.glob(pattern)
26
- changed_list = ChangesFile.new(original_list).allow_changes do |file|
27
- @options[:mock_editor] ? block.call(file.path) : file.blocking_edit(@editor)
28
- end
29
-
30
- raise(Error, DEL_ERROR) if changed_list.size != original_list.size
31
-
32
- @changes = compare_lists(original_list, changed_list)
33
- end
34
-
35
- def execute(original_list, &block)
36
- @changes ||= request(original_list, &block)
37
- @changes = @changes.map(&: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
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.1.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,100 +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 request_directory?
44
- Dir.exist? @original
45
- end
46
-
47
- def request_delete?
48
- @change == CHANGE::DELETE
49
- end
50
-
51
- def request_empty_directory?
52
- Dir.empty? @original
53
- end
54
-
55
- def request_full_directory?
56
- request_directory? && !request_empty_directory?
57
- end
58
-
59
- def consider
60
- if request_full_directory? && request_delete?
61
- @status = STATUS::REJECTED
62
- @reason = "Directories with files cannot be changed"
63
- else
64
- @status = STATUS::ACCEPTED
65
- end
66
- end
67
-
68
- def executed_or_rejected
69
- %i[executed rejected].include? @status
70
- end
71
-
72
- def execute
73
- return(self) if executed_or_rejected
74
-
75
- case @change
76
- when :rename
77
- File.rename(@original, @requested)
78
- when :delete
79
- File.delete(@original)
80
- end
81
-
82
- @status = STATUS::EXECUTED
83
- self
84
- end
85
-
86
- def to_s
87
- file_desc =
88
- case @change
89
- when :rename
90
- "#{@original} -> #{@requested}"
91
- else
92
- @original
93
- end
94
-
95
- reason_desc = @status == STATUS::REJECTED ? " (failed: #{@reason})" : ""
96
-
97
- "#{CHANGES_DESC[@change]}: #{file_desc}#{reason_desc}"
98
- end
99
- end
100
- end
data/lib/changes.rb DELETED
@@ -1,46 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Reenrb
4
- # Change to an orignal file
5
- class Changes
6
- attr_reader :list
7
-
8
- def initialize(changes_list)
9
- @list = changes_list
10
- end
11
-
12
- def none
13
- Changes.new(@list.select { |c| c.change == :none })
14
- end
15
-
16
- def rename_requested
17
- Changes.new(@list.select { |c| c.change == :rename })
18
- end
19
-
20
- def delete_requested
21
- Changes.new(@list.select { |c| c.change == :delete })
22
- end
23
-
24
- def change_requested
25
- Changes.new(@list.reject { |c| c.change == :none })
26
- end
27
-
28
- def rejected
29
- Changes.new(@list.select { |c| c.status == :rejected })
30
- end
31
-
32
- def accepted
33
- Changes.new(@list.select { |c| c.status == :accepted })
34
- end
35
-
36
- def executed
37
- Changes.new(@list.select { |c| c.status == :executed })
38
- end
39
-
40
- def summarize
41
- return "Nothing changed" if @list.empty?
42
-
43
- @list.map(&:to_s).join("\n")
44
- end
45
- end
46
- end