Class: Fast::Cli
- Inherits:
-
Object
- Object
- Fast::Cli
- Defined in:
- lib/fast/cli.rb
Overview
Command Line Interface for Fast
Instance Attribute Summary collapse
-
#from_code ⇒ Object
readonly
rubocop:disable Metrics/ClassLength.
-
#help ⇒ Object
readonly
rubocop:disable Metrics/ClassLength.
-
#pattern ⇒ Object
readonly
rubocop:disable Metrics/ClassLength.
-
#pry ⇒ Object
readonly
rubocop:disable Metrics/ClassLength.
-
#show_sexp ⇒ Object
readonly
rubocop:disable Metrics/ClassLength.
-
#similar ⇒ Object
readonly
rubocop:disable Metrics/ClassLength.
Class Method Summary collapse
-
.run!(argv) ⇒ Object
Run a new command line interface digesting the arguments.
Instance Method Summary collapse
-
#debug(*info) ⇒ Object
Output information if #debug_mode? is true.
-
#debug_mode? ⇒ Boolean
True when “-d” or “–debug” option is passed.
-
#execute_search {|with| ... } ⇒ Object
Executes search for all files yielding the results.
-
#exit_shortcut_not_found(name) ⇒ Object
Exit process with warning message bolding the shortcut that was not found.
-
#expression ⇒ Array<Fast::Find>
Create fast expression from node pattern using the command line.
-
#find_shortcut(name) ⇒ Fast::Shortcut
Find shortcut by name.
-
#initialize(args) ⇒ Cli
constructor
A new instance of Cli.
-
#option_parser ⇒ Object
rubocop:disable Metrics/MethodLength, Metrics/AbcSize.
- #parallel? ⇒ Boolean
- #replace_args_with_shortcut(args) ⇒ Object
-
#report(file, result) ⇒ Object
Report results using the actual options binded from command line.
-
#run! ⇒ Object
Show help or search for node patterns.
-
#search ⇒ Object
Search for each file independent.
-
#search_method_name ⇒ Symbol
With ‘:capture_all` or `:search_all` depending the command line options.
Constructor Details
#initialize(args) ⇒ Cli
Returns a new instance of Cli.
50 51 52 53 54 55 56 57 58 59 |
# File 'lib/fast/cli.rb', line 50 def initialize(args) args = replace_args_with_shortcut(args) if args.first&.start_with?('.') @pattern, *@files = args.reject { |arg| arg.start_with? '-' } @colorize = STDOUT.isatty option_parser.parse! args @files = [*@files].reject { |arg| arg.start_with?('-') } end |
Instance Attribute Details
#from_code ⇒ Object (readonly)
rubocop:disable Metrics/ClassLength
49 50 51 |
# File 'lib/fast/cli.rb', line 49 def from_code @from_code end |
#help ⇒ Object (readonly)
rubocop:disable Metrics/ClassLength
49 50 51 |
# File 'lib/fast/cli.rb', line 49 def help @help end |
#pattern ⇒ Object (readonly)
rubocop:disable Metrics/ClassLength
49 50 51 |
# File 'lib/fast/cli.rb', line 49 def pattern @pattern end |
#pry ⇒ Object (readonly)
rubocop:disable Metrics/ClassLength
49 50 51 |
# File 'lib/fast/cli.rb', line 49 def pry @pry end |
#show_sexp ⇒ Object (readonly)
rubocop:disable Metrics/ClassLength
49 50 51 |
# File 'lib/fast/cli.rb', line 49 def show_sexp @show_sexp end |
#similar ⇒ Object (readonly)
rubocop:disable Metrics/ClassLength
49 50 51 |
# File 'lib/fast/cli.rb', line 49 def similar @similar end |
Class Method Details
.run!(argv) ⇒ Object
Run a new command line interface digesting the arguments
129 130 131 132 |
# File 'lib/fast/cli.rb', line 129 def self.run!(argv) argv = argv.dup new(argv).run! end |
Instance Method Details
#debug(*info) ⇒ Object
Output information if #debug_mode? is true.
187 188 189 |
# File 'lib/fast/cli.rb', line 187 def debug(*info) puts(info) if debug_mode? end |
#debug_mode? ⇒ Boolean
Returns true when “-d” or “–debug” option is passed.
182 183 184 |
# File 'lib/fast/cli.rb', line 182 def debug_mode? @debug == true end |
#execute_search {|with| ... } ⇒ Object
Executes search for all files yielding the results
168 169 170 171 172 173 174 |
# File 'lib/fast/cli.rb', line 168 def execute_search(&on_result) Fast.public_send(search_method_name, expression, @files, parallel: parallel?, on_result: on_result) end |
#exit_shortcut_not_found(name) ⇒ Object
Exit process with warning message bolding the shortcut that was not found. Prints available shortcuts as extra help and exit with code 1.
215 216 217 218 219 220 221 222 |
# File 'lib/fast/cli.rb', line 215 def exit_shortcut_not_found(name) puts "Shortcut \033[1m#{name}\033[0m not found :(" if Fast.shortcuts.any? puts "Available shortcuts are: #{Fast.shortcuts.keys.join(', ')}." Fast.load_fast_files! end exit 1 end |
#expression ⇒ Array<Fast::Find>
Create fast expression from node pattern using the command line
147 148 149 |
# File 'lib/fast/cli.rb', line 147 def expression Fast.expression(@pattern) end |
#find_shortcut(name) ⇒ Fast::Shortcut
Find shortcut by name. Preloads all ‘Fastfiles` before start.
204 205 206 207 208 209 210 211 |
# File 'lib/fast/cli.rb', line 204 def find_shortcut(name) require 'fast/shortcut' Fast.load_fast_files! shortcut = Fast.shortcuts[name] || Fast.shortcuts[name.to_sym] shortcut || exit_shortcut_not_found(name) end |
#option_parser ⇒ Object
rubocop:disable Metrics/MethodLength, Metrics/AbcSize
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
# File 'lib/fast/cli.rb', line 61 def option_parser # rubocop:disable Metrics/MethodLength, Metrics/AbcSize @option_parser ||= OptionParser.new do |opts| # rubocop:disable Metrics/BlockLength opts. = 'Usage: fast expression <files> [options]' opts.on('-d', '--debug', 'Debug fast engine') do @debug = true end opts.on('--ast', 'Print AST instead of code') do @show_sexp = true end opts.on('-p', '--parallel', 'Paralelize search') do @parallel = true end opts.on('--captures', 'Print only captures of the patterns and skip node results') do @captures = true end opts.on('--headless', 'Print results without the file name in the header') do @headless = true end opts.on('--pry', 'Jump into a pry session with results') do @pry = true require 'pry' end opts.on('-c', '--code', 'Create a pattern from code example') do if @pattern @from_code = true @pattern = Fast.ast(@pattern).to_sexp debug 'Expression from AST:', @pattern end end opts.on('-s', '--similar', 'Search for similar code.') do @similar = true @pattern = Fast.expression_from(Fast.ast(@pattern)) debug "Looking for code similar to #{@pattern}" end opts.on('--no-color', 'Disable color output') do @colorize = false end opts.on_tail('--version', 'Show version') do puts Fast::VERSION exit end opts.on_tail('-h', '--help', 'Show help. More at https://jonatas.github.io/fast') do @help = true end end end |
#parallel? ⇒ Boolean
191 192 193 |
# File 'lib/fast/cli.rb', line 191 def parallel? @parallel == true end |
#replace_args_with_shortcut(args) ⇒ Object
118 119 120 121 122 123 124 125 126 |
# File 'lib/fast/cli.rb', line 118 def replace_args_with_shortcut(args) shortcut = find_shortcut args.first[1..-1] if shortcut.single_run_with_block? shortcut.run exit else args.one? ? shortcut.args : shortcut.merge_args(args[1..-1]) end end |
#report(file, result) ⇒ Object
Report results using the actual options binded from command line.
197 198 199 |
# File 'lib/fast/cli.rb', line 197 def report(file, result) Fast.report(result, file: file, show_sexp: @show_sexp, headless: @headless, colorize: @colorize) end |
#run! ⇒ Object
Show help or search for node patterns
135 136 137 138 139 140 141 142 143 |
# File 'lib/fast/cli.rb', line 135 def run! raise 'pry and parallel options are incompatible :(' if @parallel && @pry if @help || @files.empty? && @pattern.nil? puts option_parser.help else search end end |
#search ⇒ Object
Search for each file independent. If -d (debug option) is enabled, it will output details of each search. If capture option is enabled it will only print the captures, otherwise it prints all the results.
155 156 157 158 159 160 161 162 163 164 |
# File 'lib/fast/cli.rb', line 155 def search return Fast.debug(&method(:execute_search)) if debug_mode? execute_search do |file, results| results.each do |result| binding.pry if @pry # rubocop:disable Lint/Debugger report(file, result) end end end |
#search_method_name ⇒ Symbol
Returns with ‘:capture_all` or `:search_all` depending the command line options.
177 178 179 |
# File 'lib/fast/cli.rb', line 177 def search_method_name @captures ? :capture_all : :search_all end |