Sha256: 93c96872882f2ee5291d996d7e5346ff7fa208986a3daec7672bd9fc4859abed

Contents?: true

Size: 1.24 KB

Versions: 10

Compression:

Stored size: 1.24 KB

Contents

# frozen_string_literal: true

class Code
  EMPTY_STRING = ""
  GLOBALS = %i[output error context object].freeze
  DEFAULT_TIMEOUT = 0

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

  def self.evaluate(
    input,
    context = EMPTY_STRING,
    output: StringIO.new,
    error: StringIO.new,
    timeout: DEFAULT_TIMEOUT,
    ruby: {}
  )
    new(input, output:, error:, timeout:, ruby:).evaluate(context)
  end

  def evaluate(context = EMPTY_STRING)
    Timeout.timeout(timeout) do
      context =
        if context == EMPTY_STRING
          Object::Context.new
        else
          Code.evaluate(
            context,
            timeout:,
            output:,
            error:,
            ruby:
          ).code_to_context
        end

      context = ruby.merge(context)

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

  private

  attr_reader :input, :parsed, :timeout, :output, :error, :ruby
end

Version data entries

10 entries across 10 versions & 1 rubygems

Version Path
code-ruby-0.8.5 lib/code.rb
code-ruby-0.8.4 lib/code.rb
code-ruby-0.8.3 lib/code.rb
code-ruby-0.8.2 lib/code.rb
code-ruby-0.8.1 lib/code.rb
code-ruby-0.8.0 lib/code.rb
code-ruby-0.7.8 lib/code.rb
code-ruby-0.7.7 lib/code.rb
code-ruby-0.7.6 lib/code.rb
code-ruby-0.7.5 lib/code.rb