Class: Hanami::Utils::Class

Inherits:
Object
  • Object
show all
Defined in:
lib/hanami/utils/class.rb

Overview

Class utilities

Since:

  • 0.1.0

Constant Summary collapse

TOKENIZE_REGEXP =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Regexp for .tokenize

Since:

  • 1.3.0

/\((.*)\)/.freeze
TOKENIZE_SEPARATOR =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Separator for .tokenize

Since:

  • 1.3.0

"|"

Class Method Summary collapse

Class Method Details

.load(name, namespace = Object) ⇒ Class, ...

Loads a class for the given name, only if it's defined.

Examples:

require 'hanami/utils/class'

module App
  module Service
    class Endpoint
    end
  end

  class ServiceEndpoint
  end
end

# basic usage
Hanami::Utils::Class.load('App::Service') # => App::Service
Hanami::Utils::Class.load(App::Service)   # => App::Service

# with explicit namespace
Hanami::Utils::Class.load('Service', App) # => App::Service

Parameters:

  • name (String, Class)

    the specific class name

  • namespace (Class, Module) (defaults to: Object)

    the Ruby namespace where we want to perform the lookup.

Returns:

  • (Class, Module, NilClass)

    the Ruby constant, or nil if not found.

Since:

  • 0.8.0


73
74
75
# File 'lib/hanami/utils/class.rb', line 73

def self.load(name, namespace = Object)
  load!(name, namespace) if namespace.const_defined?(name.to_s, false)
end

.load!(name, namespace = Object) ⇒ Class, Module

Loads a class for the given name.

Examples:

require 'hanami/utils/class'

module App
  module Service
    class Endpoint
    end
  end

  class ServiceEndpoint
  end
end

# basic usage
Hanami::Utils::Class.load!('App::Service') # => App::Service
Hanami::Utils::Class.load!(App::Service)   # => App::Service

# with explicit namespace
Hanami::Utils::Class.load!('Service', App) # => App::Service

# with missing constant
Hanami::Utils::Class.load!('Unknown') # => raises NameError

Parameters:

  • name (String, Class)

    the specific class name

  • namespace (Class, Module) (defaults to: Object)

    the Ruby namespace where we want to perform the lookup.

Returns:

  • (Class, Module)

    the found Ruby constant.

Raises:

  • (NameError)

    if no constant can be found.

Since:

  • 0.1.0


42
43
44
# File 'lib/hanami/utils/class.rb', line 42

def self.load!(name, namespace = Object)
  namespace.const_get(name.to_s, false)
end

.load_from_pattern!(pattern, namespace = Object) ⇒ Class, Module

Loads a class from the given pattern name and namespace

Examples:

require 'hanami/utils/class'

module App
  module Service
    class Endpoint
    end
  end

  class ServiceEndpoint
  end
end

# basic usage
Hanami::Utils::Class.load_from_pattern!('App::Service') # => App::Service

# with explicit namespace
Hanami::Utils::Class.load_from_pattern!('Service', App) # => App::Service

# with pattern
Hanami::Utils::Class.load_from_pattern!('App::Service(::Endpoint|Endpoint)') # => App::Service::Endpoint
Hanami::Utils::Class.load_from_pattern!('App::Service(Endpoint|::Endpoint)') # => App::ServiceEndpoint

# with missing constant
Hanami::Utils::Class.load_from_pattern!('Unknown') # => raises NameError

Parameters:

  • pattern (String)

    the class name pattern

  • namespace (Class, Module) (defaults to: Object)

    the Ruby namespace where we want to perform the lookup.

Returns:

  • (Class, Module)

    the found Ruby constant.

Raises:

  • (NameError)

    if no constant can be found.

See Also:

Since:

  • 0.3.1


114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/hanami/utils/class.rb', line 114

def self.load_from_pattern!(pattern, namespace = Object)
  Deprecation.new("Hanami::Utils::Class.load_from_pattern! is deprecated, please use Hanami::Utils::Class.load! instead") # rubocop:disable Layout/LineLength

  tokenize(pattern) do |token|
    begin
      return namespace.const_get(token, false)
    rescue NameError # rubocop:disable Lint/SuppressedException
    end
  end

  full_name = [(namespace == Object ? nil : namespace), pattern].compact.join("::")
  raise NameError.new("uninitialized constant #{full_name}")
end

.tokenize(pattern) ⇒ Object

Since:

  • 0.1.0


128
129
130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/hanami/utils/class.rb', line 128

def self.tokenize(pattern)
  if match = TOKENIZE_REGEXP.match(pattern)
    pre  = match.pre_match
    post = match.post_match
    tokens = match[1].split(TOKENIZE_SEPARATOR)
    tokens.each do |token|
      yield("#{pre}#{token}#{post}")
    end
  else
    yield(pattern)
  end

  nil
end