reenrb 0.2.1 → 0.3.0

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: 8f607120ef687c5ace8a02b12e3fb6306abc16aa45b6f906f3e853f995df9a51
4
+ data.tar.gz: 0d4b19262e64584508daf56c0ec2024603ff1a375d134fc000774d1e9233714e
5
5
  SHA512:
6
- metadata.gz: 3fe1b3c16fb10bdaa39c095acef4611822c2c07934081dfc1d223f2103d3cf07a3d819b50b5a1351cec1538d0fb24e03fd77d58eeef2bb212405a1c624b2f602
7
- data.tar.gz: 88bd9ad15855e04911bd87b2d620843a254c31c0b84a4919c18cdaa314b8bd8c6953280450e8cefbbc32af1489e4c5034322bff26c4a63cdc2a9c57810b04348
6
+ metadata.gz: 420f2980c0e6a22ddeb7dbfc9a6abc62a9c8845f19f0902ba975c13996e87c371da9dd003b1d70fbdca9a14ebfeae36e85bd883671bb8b9eec27aa622a1e4fe1
7
+ data.tar.gz: 971cade35548d6fbde58a07ebd3707f34e95da5933e37c37d4eef1f8f108a1714b789aa873ccbcd2331a0214c330bd93a83c4b4f52f295f04130802efff0a726
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/
data/README.md CHANGED
@@ -14,26 +14,29 @@ Or add this line to your Ruby application's Gemfile for programmatic use:
14
14
  gem 'reenrb'
15
15
  ```
16
16
 
17
- And then execute:
18
-
19
- $ bundle install
20
-
21
- Or install it yourself as:
22
-
23
- $ gem install reenrb
24
-
25
17
  ## Usage
26
18
 
27
19
  ### Command line
28
20
 
29
21
  From command line, run `reen` with file list:
30
22
 
31
- reen [file ...]
23
+ reen files [options]
24
+
25
+ where `files` are a list of files or wildcard pattern (defaults to `*`; see examples)
26
+
27
+ Options include:
28
+
29
+ - `--help` or `-h`' to see options help
30
+ - `--editor EDITOR` or `-e EDITOR`' to set the editor (defaults to $VISUAL or $EDITOR otherwise) such as `emacs` or `vi`. For Visual Studio Code use `'code -w'` to block until editor finishes.
31
+ - `--review` or `-r` request to review and confirm changes
32
32
 
33
33
  Examples:
34
34
 
35
- reen *
36
- reen myfolder/**/*.mov
35
+ reen # reen all files (*)
36
+ reen **/* # reen all files in all subfolders
37
+ reen myfolder/**/*.mov # reen all mov files in subfolders
38
+ reen *.md --editor vi # reen all markdown files using vi
39
+ reen --editor 'code -w' # reen all markdown files using vscode
37
40
 
38
41
  ### Ruby application
39
42
 
@@ -45,13 +48,10 @@ require 'reenrb'
45
48
  glob = Dir.glob("*")
46
49
  reen = Reenrb::Reen.new(editor: nil)
47
50
 
48
- reen.execute(glob) do |tmpfile_path|
49
- lines = File.read(tmpfile_path).split("\n")
50
-
51
+ reen.execute(glob) do |file|
51
52
  # Rename LICENSE.txt -> LICENSE.md
52
- index = lines.index { |l| l.include? "LICENSE.txt" }
53
- lines[index] = lines[index].gsub("txt", "md")
54
- File.write(tmpfile_path, lines.join("\n"))
53
+ index = file.list.index { |l| l.include? "LICENSE.txt" }
54
+ file.list[index] = file.list[index].gsub("txt", "md")
55
55
  end
56
56
  ```
57
57
 
data/Rakefile CHANGED
@@ -4,7 +4,7 @@ require "bundler/gem_tasks"
4
4
  require "rake/testtask"
5
5
 
6
6
  Rake::TestTask.new(:spec) do |t|
7
- t.libs << "tspecest"
7
+ t.libs << "spec"
8
8
  t.libs << "lib"
9
9
  t.test_files = FileList["spec/**/spec_*.rb"]
10
10
  end
@@ -14,18 +14,18 @@ task :respec do
14
14
  end
15
15
 
16
16
  namespace :example do
17
- task :config do
17
+ task :helper do
18
18
  require_relative "spec/fixture_helper"
19
19
  end
20
20
 
21
21
  desc "Recreates the example fixture folder"
22
- task :recreate => :config do
22
+ task :recreate => :helper do
23
23
  FixtureHelper.recreate_example_dir
24
24
  puts "Example fixture recreated"
25
25
  end
26
26
 
27
27
  desc "Deletes the example fixture folder"
28
- task :remove => :config do
28
+ task :remove => :helper do
29
29
  FixtureHelper.remove_example_dirs
30
30
  puts "Example fixture removed"
31
31
  end
data/bin/reen CHANGED
@@ -1,22 +1,87 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- EDITOR_MSG = "Editor not set in $EDITOR or $VISUAL -- please set one of those environment variables"
5
-
6
- def exit_with_error(err)
7
- puts err
8
- exit(false)
9
- end
10
-
11
4
  $LOAD_PATH.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
12
5
  require "reenrb"
6
+ require "optparse"
7
+
8
+ # Reen command line application
9
+ class ReenCLI
10
+ EDITOR_MSG = "Editor not set in $EDITOR or $VISUAL -- please set one of those environment variables"
11
+ Options = Struct.new(:editor, :review) do
12
+ def initialize(editor: nil, review: false)
13
+ editor ||= ENV["VISUAL"] || ENV["EDITOR"] # rubocop:disable Style/FetchEnvVar
14
+ super(editor, review)
15
+ end
16
+ end
17
+
18
+ attr_reader :options, :files
19
+
20
+ def initialize(args)
21
+ @options = Options.new
22
+ optparse = OptionParser.new { |parser| setup_options(parser) }
23
+ optparse.parse!(args, into: @options)
24
+
25
+ exit_with_msg(EDITOR_MSG) unless options.editor
26
+
27
+ @files = args.empty? ? Dir.glob("*") : args
28
+ rescue OptionParser::InvalidOption => e
29
+ puts "#{e.message}\n\n"
30
+ exit_with_msg(optparse)
31
+ end
32
+
33
+ def setup_options(parser)
34
+ parser.banner = "Usage: reen files [options]"
35
+ parser.version = Reenrb::VERSION
13
36
 
14
- file_list = ARGV || Dir.glob("*")
15
- editor = ENV["VISUAL"] || ENV["EDITOR"] # rubocop:disable Style/FetchEnvVar
16
- exit_with_error(EDITOR_MSG) if editor.empty?
37
+ parser.on("-e", "--editor EDITOR", "Specify EDITOR to use")
38
+ parser.on("-r", "--review", "Require review and confirmation of changes")
17
39
 
18
- results = Reenrb::Reen.new(editor: editor).execute(file_list)
40
+ parser.on("-h", "--help", "Show help for options") do
41
+ exit_with_msg(parser)
42
+ end
43
+ end
19
44
 
20
- changes = results.change_requested
45
+ def exit_with_msg(message)
46
+ puts message
47
+ exit(false)
48
+ end
21
49
 
22
- puts changes.summarize
50
+ def review_changes
51
+ puts
52
+ puts @requests.change_requested.summarize
53
+ print "\nContinue? (y/n) "
54
+ confirmation = %w[y yes].include?($stdin.gets.chomp.downcase)
55
+ exit_with_msg("Nothing changed") unless confirmation
56
+ end
57
+
58
+ def check_inputs
59
+ @files = files.empty? ? Dir.glob("*") : files
60
+ exit_with_msg(EDITOR_MSG) unless options.editor
61
+ end
62
+
63
+ def user_review?
64
+ @options.review && @requests.changes_requested?
65
+ end
66
+
67
+ def call
68
+ @requests = Reenrb::Reen.new(editor: options.editor).request(files)
69
+ review_changes if user_review?
70
+
71
+ changes = @requests
72
+ .execute_all
73
+ .change_requested
74
+
75
+ if user_review? && changes.all_executed?
76
+ puts "Changes made"
77
+ else
78
+ puts changes.summarize
79
+ end
80
+ end
81
+ end
82
+
83
+ begin
84
+ ReenCLI.new(ARGV).call
85
+ rescue Reenrb::Error => e
86
+ puts "#{e.message}\n"
87
+ end
@@ -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
@@ -9,35 +11,43 @@ module Reenrb
9
11
  @list = changes_list
10
12
  end
11
13
 
12
- def execute!
14
+ def execute_all
13
15
  @list.map(&:execute)
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?))
43
+ end
44
+
45
+ def failed
46
+ Changes.new(@list.select(&:failed?))
47
+ end
48
+
49
+ def any?
50
+ !@list.empty?
41
51
  end
42
52
 
43
53
  def count
@@ -55,7 +65,7 @@ module Reenrb
55
65
  # Predicates
56
66
 
57
67
  def no_changes_requested?
58
- list.map(&:change).all? :none
68
+ list.map(&:change).all? Change::CHANGE::NONE
59
69
  end
60
70
 
61
71
  def changes_requested?
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "tempfile"
4
+
5
+ module Reenrb
6
+ # Manages a temporary file with requested changes
7
+ class ChangesFile
8
+ INSTRUCTIONS = <<~COMMENTS
9
+ # Edit the names of any files/folders to rename or move them
10
+ # - Put a preceeding dash to delete a file or empty folder
11
+
12
+ COMMENTS
13
+
14
+ attr_accessor :list
15
+
16
+ def initialize(requested_list)
17
+ @list_file = Tempfile.new("reenrb-")
18
+ @list_file.write(INSTRUCTIONS)
19
+ @list_file.write(requested_list.join("\n"))
20
+ @list_file.close
21
+ end
22
+
23
+ def allow_changes(editor, &block)
24
+ await_editor(editor) if editor
25
+ @list = File.read(path).split("\n").map(&:strip)
26
+ .reject { |line| line.start_with?("#") || line.empty? }
27
+
28
+ block&.call(self)
29
+ @list
30
+ end
31
+
32
+ private
33
+
34
+ def path
35
+ @list_file.path
36
+ end
37
+
38
+ def await_editor(editor)
39
+ `#{editor} #{@list_file.path}`
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,40 @@
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 remove any file/folder names (no changes made)"
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)
19
+ changed_list = ChangesFile.new(original_list).allow_changes(@editor, &block)
20
+
21
+ raise(Error, DEL_ERROR) if changed_list.size != original_list.size
22
+
23
+ @changes = compare_lists(original_list, changed_list)
24
+ .then { |change_array| Changes.new(change_array) }
25
+ end
26
+
27
+ def execute(original_list, &block)
28
+ @changes ||= request(original_list, &block)
29
+ @changes = @changes.execute_all
30
+ end
31
+
32
+ private
33
+
34
+ def compare_lists(original_list, changed_list)
35
+ original_list.zip(changed_list).map do |original, revised|
36
+ Change.new(original, revised)
37
+ end
38
+ end
39
+ end
40
+ 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.3.0"
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,14 +1,14 @@
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.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Soumya Ray
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-11-06 00:00:00.000000000 Z
11
+ date: 2022-11-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -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
data/lib/changes_file.rb DELETED
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "tempfile"
4
-
5
- module Reenrb
6
- # Manages a temporary file with requested changes
7
- class ChangesFile
8
- def initialize(requested_list)
9
- @list_file = Tempfile.new("reenrb-")
10
- @list_file.write(requested_list.join("\n"))
11
- @list_file.close
12
- end
13
-
14
- def path
15
- @list_file.path
16
- end
17
-
18
- def allow_changes(&block)
19
- block.call(self)
20
- File.read(path).split("\n")
21
- end
22
-
23
- def blocking_edit(editor)
24
- `#{editor} #{@list_file.path}`
25
- end
26
- end
27
- end