Class: Opal::CLI

Inherits:
Object show all
Defined in:
opal/lib/opal/cli.rb

Class Attribute Summary collapse

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = nil) ⇒ CLI

Returns a new instance of CLI

Raises:

  • (ArgumentError)


28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'opal/lib/opal/cli.rb', line 28

def initialize options = nil
  options ||= {}

  # Runner
  @runner_type = options.delete(:runner)    || :nodejs
  @port       = options.delete(:port)       || 3000

  @options    = options
  @compile    = !!options.delete(:compile)
  @sexp       = options.delete(:sexp)
  @file       = options.delete(:file)
  @no_exit    = options.delete(:no_exit)
  @argv       = options.delete(:argv)       || []
  @evals      = options.delete(:evals)      || []
  @requires   = options.delete(:requires)   || []
  @load_paths = options.delete(:load_paths) || []
  @gems       = options.delete(:gems)       || []
  @stubs      = options.delete(:stubs)      || []
  @preload    = options.delete(:preload)    || []
  @output     = options.delete(:output)     || self.class.stdout || $stdout
  @verbose    = options.fetch(:verbose, false); options.delete(:verbose)
  @debug      = options.fetch(:debug, false);   options.delete(:debug)
  @filename   = options.fetch(:filename) { @file && @file.path }; options.delete(:filename)
  @skip_opal_require = options.delete(:skip_opal_require)
  @compiler_options = Hash[
    *compiler_option_names.map do |option|
      key = option.to_sym
      next unless options.has_key? key
      value = options.delete(key)
      [key, value]
    end.compact.flatten
  ]

  raise ArgumentError, "no runnable code provided (evals or file)" if @evals.empty? and @file.nil?
  raise ArgumentError, "unknown options: #{options.inspect}" unless @options.empty?
end

Class Attribute Details

.stdoutObject

Returns the value of attribute stdout



25
26
27
# File 'opal/lib/opal/cli.rb', line 25

def stdout
  @stdout
end

Instance Attribute Details

#argvObject (readonly)

Returns the value of attribute argv



8
9
10
# File 'opal/lib/opal/cli.rb', line 8

def argv
  @argv
end

#compiler_optionsObject (readonly)

Returns the value of attribute compiler_options



8
9
10
# File 'opal/lib/opal/cli.rb', line 8

def compiler_options
  @compiler_options
end

#debugObject (readonly)

Returns the value of attribute debug



8
9
10
# File 'opal/lib/opal/cli.rb', line 8

def debug
  @debug
end

#evalsObject (readonly)

Returns the value of attribute evals



8
9
10
# File 'opal/lib/opal/cli.rb', line 8

def evals
  @evals
end

#exit_statusObject (readonly)

Returns the value of attribute exit_status



88
89
90
# File 'opal/lib/opal/cli.rb', line 88

def exit_status
  @exit_status
end

#fileObject (readonly)

Returns the value of attribute file



8
9
10
# File 'opal/lib/opal/cli.rb', line 8

def file
  @file
end

#filenameObject (readonly)

Returns the value of attribute filename



8
9
10
# File 'opal/lib/opal/cli.rb', line 8

def filename
  @filename
end

#gemsObject (readonly)

Returns the value of attribute gems



8
9
10
# File 'opal/lib/opal/cli.rb', line 8

def gems
  @gems
end

#load_pathsObject (readonly)

Returns the value of attribute load_paths



8
9
10
# File 'opal/lib/opal/cli.rb', line 8

def load_paths
  @load_paths
end

#no_exitObject (readonly)

Returns the value of attribute no_exit



8
9
10
# File 'opal/lib/opal/cli.rb', line 8

def no_exit
  @no_exit
end

#optionsObject (readonly)

Returns the value of attribute options



8
9
10
# File 'opal/lib/opal/cli.rb', line 8

def options
  @options
end

#outputObject (readonly)

Returns the value of attribute output



8
9
10
# File 'opal/lib/opal/cli.rb', line 8

def output
  @output
end

#portObject (readonly)

Returns the value of attribute port



8
9
10
# File 'opal/lib/opal/cli.rb', line 8

def port
  @port
end

#preloadObject (readonly)

Returns the value of attribute preload



8
9
10
# File 'opal/lib/opal/cli.rb', line 8

def preload
  @preload
end

#requiresObject (readonly)

Returns the value of attribute requires



8
9
10
# File 'opal/lib/opal/cli.rb', line 8

def requires
  @requires
end

#stubsObject (readonly)

Returns the value of attribute stubs



8
9
10
# File 'opal/lib/opal/cli.rb', line 8

def stubs
  @stubs
end

#verboseObject (readonly)

Returns the value of attribute verbose



8
9
10
# File 'opal/lib/opal/cli.rb', line 8

def verbose
  @verbose
end

Instance Method Details

#buildObject



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
# File 'opal/lib/opal/cli.rb', line 90

def build
  builder = Opal::Builder.new stubs: stubs, compiler_options: compiler_options
  builder.append_paths(*load_paths)
  gems.each { |gem_name| builder.use_gem gem_name }

  builder.build 'opal' unless skip_opal_require?

  preload.each { |path| builder.build_require(path) }

  # FLAGS
  builder.build_str '$VERBOSE = true', '(flags)' if verbose
  builder.build_str '$DEBUG = true', '(flags)' if debug

  # REQUIRES: -r
  requires.each do |local_require|
    builder.build(local_require)
  end

  if evals.any?
    builder.build_str(evals.join("\n"), '-e')
  else
    if file and (filename != '-' or evals.empty?)
      builder.build_str(file.read, filename)
    end
  end

  builder.build_str 'Kernel.exit', '(exit)' unless no_exit

  builder
end

#compile?Boolean

Returns:

  • (Boolean)


12
13
14
# File 'opal/lib/opal/cli.rb', line 12

def compile?
  @compile
end

#compiled_sourceObject



121
122
123
# File 'opal/lib/opal/cli.rb', line 121

def compiled_source
  build.to_s
end

#compiler_option_namesObject



146
147
148
149
150
151
152
153
154
155
# File 'opal/lib/opal/cli.rb', line 146

def compiler_option_names
  %w[
    method_missing
    arity_check
    dynamic_require_severity
    source_map_enabled
    irb_enabled
    inline_operators
  ]
end

#mapObject



140
141
142
143
144
# File 'opal/lib/opal/cli.rb', line 140

def map
  compiler = Opal::Compiler.compile(file.read, options.merge(:file => file.path))
  compiler.compile
  compiler.source_map
end

#puts(*args) ⇒ Object



157
158
159
# File 'opal/lib/opal/cli.rb', line 157

def puts(*args)
  output.puts(*args)
end

#runObject



65
66
67
68
69
70
71
# File 'opal/lib/opal/cli.rb', line 65

def run
  case
  when sexp?;    show_sexp
  when compile?; show_compiled_source
  else           run_code
  end
end

#run_codeObject



83
84
85
86
# File 'opal/lib/opal/cli.rb', line 83

def run_code
  runner.run(compiled_source, argv)
  @exit_status = runner.exit_status
end

#runnerObject



73
74
75
76
77
78
79
80
81
# File 'opal/lib/opal/cli.rb', line 73

def runner
  @runner ||= case @runner_type
              when :server;      CliRunners::Server.new(output, port)
              when :nodejs;      CliRunners::Nodejs.new(output)
              when :phantomjs;   CliRunners::Phantomjs.new(output)
              when :applescript; CliRunners::AppleScript.new(output)
              else raise ArgumentError, @runner_type.inspect
              end
end

#sexp?Boolean

Returns:

  • (Boolean)


16
17
18
# File 'opal/lib/opal/cli.rb', line 16

def sexp?
  @sexp
end

#show_compiled_sourceObject



125
126
127
# File 'opal/lib/opal/cli.rb', line 125

def show_compiled_source
  puts compiled_source
end

#show_sexpObject



129
130
131
132
133
134
135
136
137
138
# File 'opal/lib/opal/cli.rb', line 129

def show_sexp
  if evals.any?
    sexp = Opal::Parser.new.parse(evals.join("\n"), '-e')
  else
    if file and (file.path != '-' or evals.empty?)
      sexp = Opal::Parser.new.parse(file.read, file.path)
    end
  end
  puts sexp.inspect
end

#skip_opal_require?Boolean

Returns:

  • (Boolean)


20
21
22
# File 'opal/lib/opal/cli.rb', line 20

def skip_opal_require?
  @skip_opal_require
end