lib/liquidscript/cli.rb
require "thor"
module Liquidscript
class CLI < Thor
desc "compile FILES", "Compile the given file to javascript."
long_desc <<-LONGDESC
It will compile each file listed to javascript. If the file
given is `-`, it will check the standard input for file data.
By default, this will output to standard output - if this isn't
what you want, use the -o option to change it.
Note that if you pass in multiple files,
the last file's compiled output will be in this file (i.e.
multiple output files are not yet supported). If you want the
output to go to standard output, use `-` as the value.
> $ lscript compile test.liq
LONGDESC
option :out, :aliases => :o, :desc => "The output file."
def compile(*files)
files.each do |file|
puts "COMPILING: #{file}"
perform_compiliation(file,
options[:out] || file.gsub('.liq', '.js'))
end
end
desc "syntax FILES", "Syntax check given file"
long_desc <<-LONGDESC
It will run a syntax check on the file listed. If the file does
not pass the syntax check it will return the error code 1. If
the file give is - it will check the standard input.
LONGDESC
def syntax(*files)
errored = files.select do |file|
print "CHECKING: #{file} "
!preform_syntax_check(file)
end
if errored.size > 0
puts "#{errored.join(', ')} did not pass the syntax check"
exit 1
end
end
private
def perform_compiliation(file, out)
open_files(file, out) do |infile, outfile|
out = Liquidscript.compile(infile.read, :file => file)
outfile.write(out)
end
end
def preform_syntax_check(file)
open_files(file) do |infile|
Liquidscript.compile(infile.read)
puts "OK"
end
end
def open_files(inf, outf = nil)
inf = if inf == '-'
$stdin
else
File.open(inf, 'r')
end
outf = if outf == '-'
$stdout
elsif outf
File.open(outf, 'w')
end
begin
yield inf, outf
rescue StandardError => e
$stderr.puts "ERROR: #{e.class}: #{e.message}"
$stderr.puts e.backtrace[0..5].map { |s| "\t" +
s.gsub(/^lib\/liquidscript\//, "") }.join("\n")
false
ensure
( [ inf, outf].compact - [$stdin, $stdout]).each(&:close)
end
end
end
end