Module: Regexp::Syntax

Defined in:
lib/regexp_parser/syntax/token.rb,
lib/regexp_parser/syntax.rb,
lib/regexp_parser/syntax/any.rb,
lib/regexp_parser/syntax/base.rb,
lib/regexp_parser/syntax/token.rb,
lib/regexp_parser/syntax/token/keep.rb,
lib/regexp_parser/syntax/token/meta.rb,
lib/regexp_parser/syntax/token/group.rb,
lib/regexp_parser/syntax/token/anchor.rb,
lib/regexp_parser/syntax/token/escape.rb,
lib/regexp_parser/syntax/version_lookup.rb,
lib/regexp_parser/syntax/token/assertion.rb,
lib/regexp_parser/syntax/token/quantifier.rb,
lib/regexp_parser/syntax/token/conditional.rb,
lib/regexp_parser/syntax/token/posix_class.rb,
lib/regexp_parser/syntax/token/backreference.rb,
lib/regexp_parser/syntax/token/character_set.rb,
lib/regexp_parser/syntax/token/character_type.rb,
lib/regexp_parser/syntax/token/unicode_property.rb

Overview

After loading all the tokens the map is full. Extract all tokens and types into the All and Types constants.

Defined Under Namespace

Modules: Token Classes: Any, Base, InvalidVersionNameError, NotImplementedError, SyntaxError, UnknownSyntaxNameError, V1_8_6, V1_9_1, V1_9_3, V2_0_0, V2_2_0, V2_3_0, V2_4_0, V2_4_1, V2_5_0, V2_6_0, V2_6_2, V2_6_3, V3_1_0, V3_2_0

Constant Summary collapse

VERSION_FORMAT =
'\Aruby/\d+\.\d+(\.\d+)?\z'
VERSION_REGEXP =
/#{VERSION_FORMAT}/
VERSION_CONST_REGEXP =
/\AV\d+_\d+(?:_\d+)?\z/

Class Method Summary collapse

Class Method Details

.comparable(name) ⇒ Object



62
63
64
65
# File 'lib/regexp_parser/syntax/version_lookup.rb', line 62

def comparable(name)
  # add .99 to treat versions without a patch value as latest patch version
  Gem::Version.new((name.to_s.scan(/\d+/) << 99).join('.'))
end

.const_missing(const_name) ⇒ Object



45
46
47
48
49
50
# File 'lib/regexp_parser/syntax/version_lookup.rb', line 45

def const_missing(const_name)
  if const_name =~ VERSION_CONST_REGEXP
    return fallback_version_class(const_name)
  end
  super
end

.fallback_version_class(version) ⇒ Object



52
53
54
55
56
# File 'lib/regexp_parser/syntax/version_lookup.rb', line 52

def fallback_version_class(version)
  sorted = (specified_versions + [version]).sort_by { |ver| comparable(ver) }
  index = sorted.index(version)
  index > 0 && const_get(sorted[index - 1])
end

.for(name) ⇒ Object

Returns the syntax specification class for the given syntax version name. The special names β€˜any’ and β€˜*’ return Syntax::Any.



22
23
24
# File 'lib/regexp_parser/syntax/version_lookup.rb', line 22

def for(name)
  (@alias_map ||= {})[name] ||= version_class(name)
end

.new(name) ⇒ Object



26
27
28
29
30
# File 'lib/regexp_parser/syntax/version_lookup.rb', line 26

def new(name)
  warn 'Regexp::Syntax.new is deprecated in favor of Regexp::Syntax.for. '\
       'It does not return distinct instances and will be removed in v3.0.0.'
  self.for(name)
end

.specified_versionsObject



58
59
60
# File 'lib/regexp_parser/syntax/version_lookup.rb', line 58

def specified_versions
  constants.select { |const_name| const_name =~ VERSION_CONST_REGEXP }
end

.supported?(name) ⇒ Boolean

Returns:

  • (Boolean)


32
33
34
# File 'lib/regexp_parser/syntax/version_lookup.rb', line 32

def supported?(name)
  name =~ VERSION_REGEXP && comparable(name) >= comparable('1.8.6')
end

.version_class(version) ⇒ Object



36
37
38
39
40
41
42
43
# File 'lib/regexp_parser/syntax/version_lookup.rb', line 36

def version_class(version)
  return Regexp::Syntax::Any if ['*', 'any'].include?(version.to_s)

  version =~ VERSION_REGEXP || raise(InvalidVersionNameError, version)
  warn_if_future_version(version)
  version_const_name = "V#{version.to_s.scan(/\d+/).join('_')}"
  const_get(version_const_name) || raise(UnknownSyntaxNameError, version)
end

.warn_if_future_version(const_name) ⇒ Object



67
68
69
70
71
72
# File 'lib/regexp_parser/syntax/version_lookup.rb', line 67

def warn_if_future_version(const_name)
  return if comparable(const_name) < comparable('4.0.0')

  warn('This library has only been tested up to Ruby 3.x, '\
       "but you are running with #{const_name}")
end