reenrb 0.2.2 → 0.3.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: 2253d4b2aa304bfac8b7e4659fee9ca3b514a22d4a0bb323be9619883b9448c0
4
- data.tar.gz: 3f82b6afbbe84b70878d153b56f6f75a72c2570df3b2b292c0d42a4a0057e973
3
+ metadata.gz: 6c68c858766fec42e13e8d8d70ea0c60fa1a0e56c445aa148645931ed95ab1bb
4
+ data.tar.gz: df29a4fdad7a40025640bfb85826e1a38487423656cd59cb0e72fd897a28128c
5
5
  SHA512:
6
- metadata.gz: 331ad4055d5abc194ec73fb0be6ac7479d3d2d8c41fb37980edc9c772f998a7b469da386e6b8e9c9dfe594802f9f1e39daa0081f0e109a1278fa41b1fb666a24
7
- data.tar.gz: 39d3af74b266effdb9ad82c513412539edd75b2573e97a36f41850027822c4a22029fa0b1fe6b298de177f9d794c86e80c88349dcb05b2b19541c998a572e2c2
6
+ metadata.gz: 0bd3acf09e88085731e698a952d20d8368a6b1eebfaadab2ac0128dff60b1f66c6ba635c30a4ef96b00b7d15b1aeac8d0c7e91f147971be38d0c26448138edab
7
+ data.tar.gz: ab1fdc1f3dab04893568aa4223cf05e6e99731e0517f241f61bcd1ccd74bd22fb40185d7b775b1175e09354a279e1a218d22a0d4afa3c96a7680c40ffbbba6b2
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
@@ -11,7 +11,7 @@ module Reenrb
11
11
  @list = changes_list
12
12
  end
13
13
 
14
- def execute!
14
+ def execute_all
15
15
  @list.map(&:execute)
16
16
  self
17
17
  end
@@ -42,6 +42,14 @@ module Reenrb
42
42
  Changes.new(@list.select(&:executed?))
43
43
  end
44
44
 
45
+ def failed
46
+ Changes.new(@list.select(&:failed?))
47
+ end
48
+
49
+ def any?
50
+ !@list.empty?
51
+ end
52
+
45
53
  def count
46
54
  @list.size
47
55
  end
@@ -5,22 +5,37 @@ require "tempfile"
5
5
  module Reenrb
6
6
  # Manages a temporary file with requested changes
7
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
+
8
16
  def initialize(requested_list)
9
17
  @list_file = Tempfile.new("reenrb-")
18
+ @list_file.write(INSTRUCTIONS)
10
19
  @list_file.write(requested_list.join("\n"))
11
20
  @list_file.close
12
21
  end
13
22
 
14
- def path
15
- @list_file.path
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
16
30
  end
17
31
 
18
- def allow_changes(&block)
19
- block.call(self)
20
- File.read(path).split("\n")
32
+ private
33
+
34
+ def path
35
+ @list_file.path
21
36
  end
22
37
 
23
- def blocking_edit(editor)
38
+ def await_editor(editor)
24
39
  `#{editor} #{@list_file.path}`
25
40
  end
26
41
  end
data/lib/reenrb/reen.rb CHANGED
@@ -6,7 +6,7 @@ module Reenrb
6
6
  # Reenrb::Reen.new(editor: "code -w").call("spec/fixtures/example/*")
7
7
  # Reenrb::Reen.new(editor: nil).call("spec/fixtures/example/*") { ... }
8
8
  class Reen
9
- DEL_ERROR = "Do not delete any file/folder names"
9
+ DEL_ERROR = "Do not remove any file/folder names (no changes made)"
10
10
 
11
11
  attr_reader :changes
12
12
 
@@ -15,16 +15,8 @@ module Reenrb
15
15
  @options = options
16
16
  end
17
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
18
+ def request(original_list, &block)
19
+ changed_list = ChangesFile.new(original_list).allow_changes(@editor, &block)
28
20
 
29
21
  raise(Error, DEL_ERROR) if changed_list.size != original_list.size
30
22
 
@@ -34,7 +26,7 @@ module Reenrb
34
26
 
35
27
  def execute(original_list, &block)
36
28
  @changes ||= request(original_list, &block)
37
- @changes = @changes.execute!
29
+ @changes = @changes.execute_all
38
30
  end
39
31
 
40
32
  private
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Reenrb
4
- VERSION = "0.2.2"
4
+ VERSION = "0.3.2"
5
5
  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.2
4
+ version: 0.3.2
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
@@ -105,7 +105,6 @@ files:
105
105
  - ".rubocop.yml"
106
106
  - CHANGELOG.md
107
107
  - Gemfile
108
- - Gemfile.lock
109
108
  - LICENSE.txt
110
109
  - README.md
111
110
  - Rakefile
data/Gemfile.lock DELETED
@@ -1,60 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- reenrb (0.2.2)
5
-
6
- GEM
7
- remote: https://rubygems.org/
8
- specs:
9
- ast (2.4.2)
10
- ffi (1.15.5)
11
- json (2.6.2)
12
- listen (3.7.1)
13
- rb-fsevent (~> 0.10, >= 0.10.3)
14
- rb-inotify (~> 0.9, >= 0.9.10)
15
- minitest (5.16.3)
16
- minitest-rg (5.2.0)
17
- minitest (~> 5.0)
18
- parallel (1.22.1)
19
- parser (3.1.2.1)
20
- ast (~> 2.4.1)
21
- rainbow (3.1.1)
22
- rake (13.0.6)
23
- rb-fsevent (0.11.2)
24
- rb-inotify (0.10.1)
25
- ffi (~> 1.0)
26
- regexp_parser (2.6.0)
27
- rerun (0.13.1)
28
- listen (~> 3.0)
29
- rexml (3.2.5)
30
- rubocop (1.38.0)
31
- json (~> 2.3)
32
- parallel (~> 1.10)
33
- parser (>= 3.1.2.1)
34
- rainbow (>= 2.2.2, < 4.0)
35
- regexp_parser (>= 1.8, < 3.0)
36
- rexml (>= 3.2.5, < 4.0)
37
- rubocop-ast (>= 1.23.0, < 2.0)
38
- ruby-progressbar (~> 1.7)
39
- unicode-display_width (>= 1.4.0, < 3.0)
40
- rubocop-ast (1.23.0)
41
- parser (>= 3.1.1.0)
42
- ruby-progressbar (1.11.0)
43
- rubyzip (2.3.2)
44
- unicode-display_width (2.3.0)
45
-
46
- PLATFORMS
47
- arm64-darwin-21
48
- x86_64-linux
49
-
50
- DEPENDENCIES
51
- minitest (~> 5.0)
52
- minitest-rg (~> 5.0)
53
- rake (~> 13.0)
54
- reenrb!
55
- rerun (~> 0.13)
56
- rubocop (~> 1.21)
57
- rubyzip (~> 2.3)
58
-
59
- BUNDLED WITH
60
- 2.3.8