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.
54 55 56 57 58 59 60 61 62 63 |
# File 'lib/fast/cli.rb', line 54 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
53 54 55 |
# File 'lib/fast/cli.rb', line 53 def from_code @from_code end |
#help ⇒ Object (readonly)
rubocop:disable Metrics/ClassLength
53 54 55 |
# File 'lib/fast/cli.rb', line 53 def help @help end |
#pattern ⇒ Object (readonly)
rubocop:disable Metrics/ClassLength
53 54 55 |
# File 'lib/fast/cli.rb', line 53 def pattern @pattern end |
#pry ⇒ Object (readonly)
rubocop:disable Metrics/ClassLength
53 54 55 |
# File 'lib/fast/cli.rb', line 53 def pry @pry end |
#show_sexp ⇒ Object (readonly)
rubocop:disable Metrics/ClassLength
53 54 55 |
# File 'lib/fast/cli.rb', line 53 def show_sexp @show_sexp end |
#similar ⇒ Object (readonly)
rubocop:disable Metrics/ClassLength
53 54 55 |
# File 'lib/fast/cli.rb', line 53 def similar @similar end |
Class Method Details
.run!(argv) ⇒ Object
Run a new command line interface digesting the arguments
143 144 145 146 |
# File 'lib/fast/cli.rb', line 143 def self.run!(argv) argv = argv.dup new(argv).run! end |
Instance Method Details
#debug(*info) ⇒ Object
Output information if #debug_mode? is true.
201 202 203 |
# File 'lib/fast/cli.rb', line 201 def debug(*info) puts(info) if debug_mode? end |
#debug_mode? ⇒ Boolean
Returns true when “-d” or “–debug” option is passed.
196 197 198 |
# File 'lib/fast/cli.rb', line 196 def debug_mode? @debug == true end |
#execute_search {|with| ... } ⇒ Object
Executes search for all files yielding the results
182 183 184 185 186 187 188 |
# File 'lib/fast/cli.rb', line 182 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.
234 235 236 237 238 239 240 241 |
# File 'lib/fast/cli.rb', line 234 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
161 162 163 |
# File 'lib/fast/cli.rb', line 161 def expression Fast.expression(@pattern) end |
#find_shortcut(name) ⇒ Fast::Shortcut
Find shortcut by name. Preloads all ‘Fastfiles` before start.
224 225 226 227 228 229 230 |
# File 'lib/fast/cli.rb', line 224 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
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 117 118 119 120 121 122 123 124 125 126 127 128 129 |
# File 'lib/fast/cli.rb', line 65 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('--link', 'Print link to repository URL instead of code') do require 'fast/git' @show_link = 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('--bodyless', 'Print results without the code details') do @bodyless = 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
205 206 207 |
# File 'lib/fast/cli.rb', line 205 def parallel? @parallel == true end |
#replace_args_with_shortcut(args) ⇒ Object
131 132 133 134 135 136 137 138 139 140 |
# File 'lib/fast/cli.rb', line 131 def replace_args_with_shortcut(args) shortcut = find_shortcut args.first[1..] if shortcut.single_run_with_block? shortcut.run exit else args.one? ? shortcut.args : shortcut.merge_args(args[1..]) end end |
#report(file, result) ⇒ Object
Report results using the actual options binded from command line.
211 212 213 214 215 216 217 218 219 |
# File 'lib/fast/cli.rb', line 211 def report(file, result) Fast.report(result, file: file, show_link: @show_link, show_sexp: @show_sexp, headless: @headless, bodyless: @bodyless, colorize: @colorize) end |
#run! ⇒ Object
Show help or search for node patterns
149 150 151 152 153 154 155 156 157 |
# File 'lib/fast/cli.rb', line 149 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.
169 170 171 172 173 174 175 176 177 178 |
# File 'lib/fast/cli.rb', line 169 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.
191 192 193 |
# File 'lib/fast/cli.rb', line 191 def search_method_name @captures ? :capture_all : :search_all end |