Class: Code

Inherits:
Object
  • Object
show all
Defined in:
lib/code.rb,
lib/code/node.rb,
lib/code/ruby.rb,
lib/code/error.rb,
lib/code/object.rb,
lib/code/parser.rb,
lib/code/node/if.rb,
lib/code/node/not.rb,
lib/code/node/call.rb,
lib/code/node/code.rb,
lib/code/node/list.rb,
lib/code/parser/if.rb,
lib/code/node/equal.rb,
lib/code/node/power.rb,
lib/code/node/splat.rb,
lib/code/node/while.rb,
lib/code/node/base_2.rb,
lib/code/node/base_8.rb,
lib/code/node/number.rb,
lib/code/node/rescue.rb,
lib/code/node/string.rb,
lib/code/object/list.rb,
lib/code/parser/call.rb,
lib/code/parser/code.rb,
lib/code/parser/list.rb,
lib/code/parser/name.rb,
lib/code/node/base_10.rb,
lib/code/node/base_16.rb,
lib/code/node/boolean.rb,
lib/code/node/decimal.rb,
lib/code/node/nothing.rb,
lib/code/node/ternary.rb,
lib/code/object/range.rb,
lib/code/parser/class.rb,
lib/code/parser/equal.rb,
lib/code/parser/group.rb,
lib/code/parser/power.rb,
lib/code/parser/range.rb,
lib/code/parser/shift.rb,
lib/code/parser/splat.rb,
lib/code/parser/while.rb,
lib/code/node/function.rb,
lib/code/node/negation.rb,
lib/code/object/global.rb,
lib/code/object/number.rb,
lib/code/object/string.rb,
lib/code/parser/number.rb,
lib/code/parser/rescue.rb,
lib/code/parser/string.rb,
lib/code/node/operation.rb,
lib/code/node/statement.rb,
lib/code/object/boolean.rb,
lib/code/object/decimal.rb,
lib/code/object/integer.rb,
lib/code/object/nothing.rb,
lib/code/parser/boolean.rb,
lib/code/parser/greater.rb,
lib/code/parser/nothing.rb,
lib/code/parser/ternary.rb,
lib/code/object/argument.rb,
lib/code/object/function.rb,
lib/code/parser/addition.rb,
lib/code/parser/equality.rb,
lib/code/parser/function.rb,
lib/code/parser/negation.rb,
lib/code/node/dictionnary.rb,
lib/code/node/if_modifier.rb,
lib/code/node/unary_minus.rb,
lib/code/parser/operation.rb,
lib/code/parser/statement.rb,
lib/code/node/chained_call.rb,
lib/code/parser/bitwise_or.rb,
lib/code/parser/or_keyword.rb,
lib/code/parser/whitespace.rb,
lib/code/node/call_argument.rb,
lib/code/object/dictionnary.rb,
lib/code/parser/bitwise_and.rb,
lib/code/parser/dictionnary.rb,
lib/code/parser/if_modifier.rb,
lib/code/parser/not_keyword.rb,
lib/code/parser/or_operator.rb,
lib/code/parser/unary_minus.rb,
lib/code/parser/and_operator.rb,
lib/code/parser/chained_call.rb,
lib/code/object/ruby_function.rb,
lib/code/parser/equality_lower.rb,
lib/code/parser/multiplication.rb,
lib/code/node/function_parameter.rb

Defined Under Namespace

Classes: Error, Node, Object, Parser, Ruby

Constant Summary collapse

EMPTY_STRING =
""
GLOBALS =
%i[io context object]
DEFAULT_TIMEOUT =
Template::DEFAULT_TIMEOUT

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(input, io: StringIO.new, timeout: DEFAULT_TIMEOUT, ruby: {}) ⇒ Code

Returns a new instance of Code.



6
7
8
9
10
11
12
# File 'lib/code.rb', line 6

def initialize(input, io: StringIO.new, timeout: DEFAULT_TIMEOUT, ruby: {})
  @input = input
  @parsed = Timeout.timeout(timeout) { ::Code::Parser.parse(@input).to_raw }
  @io = io
  @timeout = timeout || DEFAULT_TIMEOUT
  @ruby = ::Code::Ruby.to_code(ruby || {})
end

Class Method Details

.evaluate(input, context = "", io: StringIO.new, timeout: DEFAULT_TIMEOUT, ruby: {}) ⇒ Object



14
15
16
17
18
19
20
21
22
# File 'lib/code.rb', line 14

def self.evaluate(
  input,
  context = "",
  io: StringIO.new,
  timeout: DEFAULT_TIMEOUT,
  ruby: {}
)
  new(input, io: io, timeout: timeout, ruby: ruby).evaluate(context)
end

Instance Method Details

#evaluate(context = "") ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/code.rb', line 24

def evaluate(context = "")
  Timeout.timeout(timeout) do
    if context != EMPTY_STRING
      context = ::Code.evaluate(context, timeout: timeout, io: io, ruby: ruby)
    else
      context = ::Code::Object::Dictionnary.new
    end

    if !context.is_a?(::Code::Object::Dictionnary)
      raise ::Code::Error::IncompatibleContext.new(
              "context must be a dictionnary"
            )
    end

    context = context.merge(ruby)

    ::Code::Node::Code.new(parsed).evaluate(context: context, io: io)
  end
end