Shortcuts¶
The fast CLI also supports shortcuts which are mapping expressions starting
with ..
Shortcuts can keep your abstract scripts organized. Let's say you want to create your own format sql and you'll run it very often. You can create a shortcut for it and just reuse as you need.
Format SQL¶
Let's say you want to format some sql, so, here are some possible syntax to get some formatted version of an inline code:
fast .format_sql "select * from tbl"
It should return "SELECT * FROM tbl" with all reserved keywords upcased. Even it's not mandatory, it makes it much clear to scan the text.
The second option is with a sql file.
fast .format_sql /path/to/my_file.sql
Add the following script to your Fastfile to just get started:
Fast.shortcut :format_sql do
require 'fast/sql'
content = ARGV.last
method = File.exist?(content) ? :parse_sql_file : :parse_sql
ast = Fast.public_send(method, content)
ast = ast.first if ast.is_a? Array
output = Fast::SQL.replace('_', ast) do |root|
sb = root.loc.expression.source_buffer
sb.tokens.each do |token|
if token.keyword_kind == :RESERVED_KEYWORD
range = Fast::Source.range(sb, token.start, token.end)
replace(range, range.source.upcase)
end
end
end
require 'fast/cli'
puts Fast.highlight(output, sql: true)
end
Anonymize SQL¶
Read a full blog post about this shortcut.
# fast .anonymize_sql file.sql
Fast.shortcut :anonymize_sql do
require 'fast/sql'
file = ARGV.last
ast = Fast.parse_sql_file(file)
memo = {}
relnames = search("(relname $_)", ast).grep(String).uniq
pattern = "{relname (sval {#{relnames.map(&:inspect).join(' ')}})}"
content = Fast::SQL.replace(pattern, ast) do |node|
new_name = memo[node.source.tr(%|"'|, '')] ||= "x#{memo.size}"
new_name = "'#{new_name}'" if node.type == :sval
replace(node.loc.expression, new_name)
end
puts Fast.highlight(content, sql: true)
end
Check out the default shortcuts guide if you need more content about shortcuts.