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 ⇒ Object
-
#exit_shortcut_not_found(name) ⇒ Object
Exit process with warning message bolding the shortcut that was not found.
-
#expression ⇒ Object
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.
- #replace_args_with_shortcut(args) ⇒ Object
-
#report(result, file) ⇒ 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.
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
125 126 127 128 |
# File 'lib/fast/cli.rb', line 125 def self.run!(argv) argv = argv.dup new(argv).run! end |
Instance Method Details
#debug(*info) ⇒ Object
Output information if #debug_mode? is true.
175 176 177 |
# File 'lib/fast/cli.rb', line 175 def debug(*info) puts(info) if debug_mode? end |
#debug_mode? ⇒ Boolean
Returns true when “-d” or “–debug” option is passed.
170 171 172 |
# File 'lib/fast/cli.rb', line 170 def debug_mode? @debug == true end |
#execute_search ⇒ Object
161 162 163 164 165 166 167 |
# File 'lib/fast/cli.rb', line 161 def execute_search method_name = @captures ? :capture_all : :search_all (Fast.public_send(method_name, expression, @files) || []).each do |file, results| results = [results] unless results.is_a?(Array) yield file, results end 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.
199 200 201 202 203 |
# File 'lib/fast/cli.rb', line 199 def exit_shortcut_not_found(name) puts "Shortcut \033[1m#{name}\033[0m not found :(" puts "Available shortcuts are: #{Fast.shortcuts.keys.join(', ')}." if Fast.shortcuts.any? exit 1 end |
#expression ⇒ Object
Create fast expression from node pattern using the command line
140 141 142 |
# File 'lib/fast/cli.rb', line 140 def expression Fast.expression(@pattern) end |
#find_shortcut(name) ⇒ Fast::Shortcut
Find shortcut by name. Preloads all ‘Fastfiles` before start.
188 189 190 191 192 193 194 195 |
# File 'lib/fast/cli.rb', line 188 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 |
# 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('--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 |
#replace_args_with_shortcut(args) ⇒ Object
114 115 116 117 118 119 120 121 122 |
# File 'lib/fast/cli.rb', line 114 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(result, file) ⇒ Object
Report results using the actual options binded from command line.
181 182 183 |
# File 'lib/fast/cli.rb', line 181 def report(result, file) Fast.report(result, file: file, show_sexp: @show_sexp, headless: @headless, colorize: @colorize) end |
#run! ⇒ Object
Show help or search for node patterns
131 132 133 134 135 136 137 |
# File 'lib/fast/cli.rb', line 131 def run! 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.
148 149 150 151 152 153 154 155 156 157 158 159 |
# File 'lib/fast/cli.rb', line 148 def search if debug_mode? Fast.debug { execute_search } else execute_search do |file, results| results.each do |result| binding.pry if @pry # rubocop:disable Lint/Debugger report(result, file) end end end end |