class Psych::ScalarScanner

def tokenize string

Experimental RBS support (using type sampling data from the type_fusion project).

type Psych__ScalarScanner_tokenize_return_value = String | Symbol | Time | false | nil | Integer

def tokenize: (String string) -> Psych__ScalarScanner_tokenize_return_value

This signature was generated using 1170 samples from 2 applications.

Tokenize +string+ returning the Ruby object
def tokenize string
  return nil if string.empty?
  return @symbol_cache[string] if @symbol_cache.key?(string)
  integer_regex = @strict_integer ? INTEGER_STRICT : INTEGER_LEGACY
  # Check for a String type, being careful not to get caught by hash keys, hex values, and
  # special floats (e.g., -.inf).
  if string.match?(%r{^[^\d.:-]?[[:alpha:]_\s!@#$%\^&*(){}<>|/\\~;=]+}) || string.match?(/\n/)
    return string if string.length > 5
    if string.match?(/^[^ytonf~]/i)
      string
    elsif string == '~' || string.match?(/^null$/i)
      nil
    elsif string.match?(/^(yes|true|on)$/i)
      true
    elsif string.match?(/^(no|false|off)$/i)
      false
    else
      string
    end
  elsif string.match?(TIME)
    begin
      parse_time string
    rescue ArgumentError
      string
    end
  elsif string.match?(/^\d{4}-(?:1[012]|0\d|\d)-(?:[12]\d|3[01]|0\d|\d)$/)
    require 'date'
    begin
      class_loader.date.strptime(string, '%F', Date::GREGORIAN)
    rescue ArgumentError
      string
    end
  elsif string.match?(/^\+?\.inf$/i)
    Float::INFINITY
  elsif string.match?(/^-\.inf$/i)
    -Float::INFINITY
  elsif string.match?(/^\.nan$/i)
    Float::NAN
  elsif string.match?(/^:./)
    if string =~ /^:(["'])(.*)\1/
      @symbol_cache[string] = class_loader.symbolize($2.sub(/^:/, ''))
    else
      @symbol_cache[string] = class_loader.symbolize(string.sub(/^:/, ''))
    end
  elsif string.match?(/^[-+]?[0-9][0-9_]*(:[0-5]?[0-9]){1,2}$/)
    i = 0
    string.split(':').each_with_index do |n,e|
      i += (n.to_i * 60 ** (e - 2).abs)
    end
    i
  elsif string.match?(/^[-+]?[0-9][0-9_]*(:[0-5]?[0-9]){1,2}\.[0-9_]*$/)
    i = 0
    string.split(':').each_with_index do |n,e|
      i += (n.to_f * 60 ** (e - 2).abs)
    end
    i
  elsif string.match?(FLOAT)
    if string.match?(/\A[-+]?\.\Z/)
      string
    else
      Float(string.delete(',_').gsub(/\.([Ee]|$)/, '\1'))
    end
  elsif string.match?(integer_regex)
    parse_int string
  else
    string
  end
end