class FakeData::Method

Constants

ARGUMENT_SPLIT_MATCHER

TODO: better argument splitting does not works with arrays, hash etc method(1, [1, 2])

LEFT_BRACKET_MATCHER
METHOD_MATCHER

TODO: problem with parsing “test()” => method = test; arguments = [“()”]

RIGHT_BRACKET_MATCHER

Attributes

arguments[R]
klass[R]
method[R]
raw[R]

Public Class Methods

new(raw) click to toggle source
# File lib/fake_data/method.rb, line 16
def initialize raw
  @raw = raw
  @klass, @method, @arguments = parse(@raw)
end

Public Instance Methods

call() click to toggle source
# File lib/fake_data/method.rb, line 25
def call
  eval(source)
end
source() click to toggle source
# File lib/fake_data/method.rb, line 21
def source
  make_call(klass, method, arguments)
end
to_s() click to toggle source
# File lib/fake_data/method.rb, line 29
def to_s
  source
end

Private Instance Methods

camelize(str) click to toggle source

Helpers

# File lib/fake_data/method.rb, line 119
def camelize(str)
  str.split('_').map {|w| w.capitalize}.join
end
make_call(klass, method, arguments = []) click to toggle source
# File lib/fake_data/method.rb, line 127
def make_call klass, method, arguments = []
  call = klass ? "#{klass}.#{method}" : method
  "#{call}(#{arguments.join(", ")})"
end
parse(raw) click to toggle source
# File lib/fake_data/method.rb, line 35
def parse raw
  match     = resolve(raw)
  klass     = resolve_klass(match["klass"])
  method    = resolve_method(klass, match["method"])
  arguments = resolve_arguments(klass, method, match["args1"] || match["args2"])

  return [klass, method, arguments]
end
parse_arguments(klass, method, arguments_string) click to toggle source
# File lib/fake_data/method.rb, line 106
def parse_arguments klass, method, arguments_string
  if arguments_string
    arguments_string.
      strip.
      gsub(LEFT_BRACKET_MATCHER, '').
      gsub(RIGHT_BRACKET_MATCHER, '').
      split(ARGUMENT_SPLIT_MATCHER)
  else
    []
  end
end
parse_klass(klass_string) click to toggle source

Parsers

# File lib/fake_data/method.rb, line 95
def parse_klass klass_string
  return nil unless klass_string
  parts = klass_string.split("::").map {|s| s.split(".")}.flatten
  "::#{parts.map {|s| camelize(s)}.join("::")}"
end
parse_method(klass, method_string) click to toggle source
# File lib/fake_data/method.rb, line 101
def parse_method klass, method_string
  # TODO make some validations
  method_string
end
raise_custom(error, reason) click to toggle source
# File lib/fake_data/method.rb, line 123
def raise_custom error, reason
  raise error, "FakeData: can't parse '#{raw}'. Reason: #{reason}."
end
resolve(raw) click to toggle source

Resolvers

# File lib/fake_data/method.rb, line 45
def resolve raw
  match = raw.match(METHOD_MATCHER)
  raise_custom NoMethodError, "missing method" unless match
  match
end
resolve_arguments(klass, method, arguments_string) click to toggle source
# File lib/fake_data/method.rb, line 80
def resolve_arguments klass, method, arguments_string
  arguments = parse_arguments(klass, method, arguments_string)
  call = make_call(klass, method, arguments)

  begin
    eval(call)
  rescue ArgumentError
    raise_custom ArgumentError, "'#{call}' has #{ex.message}"
  rescue
  end

  arguments
end
resolve_klass(klass_string) click to toggle source
# File lib/fake_data/method.rb, line 51
def resolve_klass klass_string
  if klass = parse_klass(klass_string)
    begin
      eval(klass)
    rescue NameError
      raise_custom NameError, "'#{klass}' is not valid class"
    rescue
    end

    klass
  end
end
resolve_method(klass, method_string) click to toggle source
# File lib/fake_data/method.rb, line 64
def resolve_method klass, method_string
  raise_custom NoMethodError, "missing method" unless method_string

  method = parse_method(klass, method_string)
  call = make_call(klass, method)

  begin
    eval(call)
  rescue NameError, NoMethodError
    raise_custom NoMethodError, "'#{call}' is not valid method"
  rescue
  end

  method_string
end