Class: Hanami::Environment Private

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

Overview

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

Define and expose information about the Hanami environment.

Since:

  • 0.1.0

Constant Summary collapse

LOCK =

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.

Global lock (used to serialize process of environment configuration)

Since:

  • 0.8.0

Mutex.new
RACK_ENV =

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.

Standard Rack ENV key

Since:

  • 0.1.0

'RACK_ENV'.freeze
HANAMI_ENV =

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.

Standard Hanami ENV key

Since:

  • 0.1.0

'HANAMI_ENV'.freeze
DEFAULT_ENV =

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.

Default Hanami environment

Since:

  • 0.1.0

'development'.freeze
PRODUCTION_ENV =

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.

Production environment

Since:

  • 0.6.0

'production'.freeze
RACK_ENV_DEPLOYMENT =

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.

Rack production environment (aka deployment)

Since:

  • 0.6.0

'deployment'.freeze
DEFAULT_DOTENV_ENV =

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.

Default `.env` per environment file name

Since:

  • 0.2.0

'.env.%s'.freeze
DEFAULT_CONFIG =

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.

Default configuration directory under application root

Since:

  • 0.2.0

'config'.freeze
HANAMI_HOST =

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.

Standard Hanami host ENV key

Since:

  • 0.1.0

'HANAMI_HOST'.freeze
DEFAULT_HOST =

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.

Default HTTP host

Since:

  • 0.1.0

'localhost'.freeze
LISTEN_ALL_HOST =

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.

Default IP address listen

Since:

  • 0.1.0

'0.0.0.0'.freeze
HANAMI_PORT =

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.

Standard Hanami port ENV key

Since:

  • 0.1.0

'HANAMI_PORT'.freeze
DEFAULT_PORT =

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.

Default Hanami HTTP port

Since:

  • 0.1.0

2300
DEFAULT_RACKUP =

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.

Default Rack configuration file

Since:

  • 0.2.0

'config.ru'.freeze
DEFAULT_ENVIRONMENT_CONFIG =

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.

Default environment configuration file

Since:

  • 0.2.0

'environment'.freeze
CODE_RELOADING =

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.

Code reloading per environment

Since:

  • 0.2.0

{ 'development' => true }.freeze
CONTAINER =

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.

Since:

  • 0.4.0

'container'.freeze
CONTAINER_PATH =

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.

Since:

  • 0.4.0

'apps'.freeze
APPLICATION =

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.

Since:

  • 0.4.0

'app'.freeze
APPLICATION_PATH =

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.

Since:

  • 0.4.0

'app'.freeze
SERVE_STATIC_ASSETS =

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.

Since:

  • 0.4.0

'SERVE_STATIC_ASSETS'.freeze
SERVE_STATIC_ASSETS_ENABLED =

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.

Since:

  • 0.4.0

'true'.freeze

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Hanami::Environment

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

Initialize a Hanami environment

It accepts an optional set of configurations from the CLI commands. Those settings override the defaults defined by this object.

When initialized, it sets standard `ENV` variables for Rack and Hanami, such as `RACK_ENV` and `HANAMI_ENV`.

It also evaluates configuration from `.env` and `.env.<environment>` located under the config directory. All the settings in those files will be exported as `ENV` variables.

The format of those `.env` files is compatible with `dotenv` and `foreman` gems.

Examples:

Define ENV variables from .env


# % tree .
#   .
#   # ...
#   ├── .env
#   └── .env.development

# % cat .env
#   FOO="bar"
#   XYZ="yes"

# % cat .env.development
#   FOO="ok"

require 'hanami/environment'

env = Hanami::Environment.new
env.environment   # => "development"

# Framework defined ENV vars
ENV['HANAMI_ENV']  # => "development"
ENV['RACK_ENV']   # => "development"

ENV['HANAMI_HOST'] # => "localhost"
ENV['HANAMI_PORT'] # => "2300"

# User defined ENV vars
ENV['FOO']        # => "ok"
ENV['XYZ']        # => "yes"

# Hanami::Environment evaluates `.env` first as master configuration.
# Then it evaluates `.env.development` because the current environment
# is "development". The settings defined in this last file override
# the one defined in the parent (eg `FOO` is overwritten). All the
# other settings (eg `XYZ`) will be left untouched.

Parameters:

  • options (Hash) (defaults to: {})

    override default options for various environment attributes

See Also:

Since:

  • 0.1.0


196
197
198
199
200
201
202
# File 'lib/hanami/environment.rb', line 196

def initialize(options = {})
  opts     = options.to_h.dup
  @env     = Hanami::Env.new(env: opts.delete(:env) || ENV)
  @options = Hanami::Hanamirc.new(root).options
  @options.merge! Utils::Hash.new(opts.clone).symbolize!
  LOCK.synchronize { set_env_vars! }
end

Instance Method Details

#apps_pathObject

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

Since:

  • 0.4.0


444
445
446
447
448
449
450
451
# File 'lib/hanami/environment.rb', line 444

def apps_path
  @options.fetch(:path) {
    case architecture
    when CONTAINER   then CONTAINER_PATH
    when APPLICATION then APPLICATION_PATH
    end
  }
end

#architectureObject

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

Since:

  • 0.4.0


409
410
411
412
413
414
# File 'lib/hanami/environment.rb', line 409

def architecture
  @options.fetch(:architecture) do
    puts "Cannot recognize Hanami architecture, please check `.hanamirc'"
    exit 1
  end
end

#bundler_groupsArray

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

A set of Bundler groups

Returns:

  • (Array)

    A set of groups

See Also:

Since:

  • 0.2.0


239
240
241
# File 'lib/hanami/environment.rb', line 239

def bundler_groups
  [:default, environment]
end

#code_reloading?TrueClass, FalseClass

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

Determine if activate code reloading for the current environment while running the server.

In order to decide the value, it looks up the following sources:

* CLI option `code_reloading`

If those are missing it falls back to the following defaults:

* true for development
* false for all the other environments

Returns:

  • (TrueClass, FalseClass)

    the result of the check

See Also:

Since:

  • 0.2.0


403
404
405
# File 'lib/hanami/environment.rb', line 403

def code_reloading?
  @options.fetch(:code_reloading) { !!CODE_RELOADING[environment] }
end

#configPathname

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

Application's config directory

It's the application where all the configurations are stored.

In order to decide the value, it looks up the following sources:

* CLI option `config`

If those are missing it falls back to the default one: `“config/”`.

When a relative path is given via CLI option, it assumes to be located under application's root. If absolute path, it will be used as it is.

Returns:

  • (Pathname)

    the config directory

See Also:

Since:

  • 0.2.0


284
285
286
# File 'lib/hanami/environment.rb', line 284

def config
  @config ||= root.join(@options.fetch(:config) { DEFAULT_CONFIG })
end

#container?Boolean

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

Returns:

  • (Boolean)

Since:

  • 0.4.0


418
419
420
# File 'lib/hanami/environment.rb', line 418

def container?
  architecture == CONTAINER
end

#env_configPathname Also known as: project_environment_configuration

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

Path to environment configuration file.

In order to decide the value, it looks up the following sources:

* CLI option `environment`

If those are missing it falls back to the default one: `“config/environment.rb”`.

When a relative path is given via CLI option, it assumes to be located under application's root. If absolute path, it will be used as it is.

Returns:

  • (Pathname)

    path to applications

See Also:

Since:

  • 0.1.0


367
368
369
# File 'lib/hanami/environment.rb', line 367

def env_config
  root.join(@options.fetch(:environment) { config.join(DEFAULT_ENVIRONMENT_CONFIG) })
end

#environmentString

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

The current environment

In order to decide the value, it looks up to the following `ENV` vars:

* HANAMI_ENV
* RACK_ENV

If those are missing it falls back to the default one: `“development”`.

Rack environment `“deployment”` is translated to Hanami `“production”`.

Returns:

  • (String)

    the current environment

See Also:

Since:

  • 0.1.0


220
221
222
# File 'lib/hanami/environment.rb', line 220

def environment
  @environment ||= env[HANAMI_ENV] || rack_env || DEFAULT_ENV
end

#environment?(*names) ⇒ Boolean

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

Returns:

  • (Boolean)

See Also:

  • Hanami.env?(name)

Since:

  • 0.3.1


227
228
229
# File 'lib/hanami/environment.rb', line 227

def environment?(*names)
  names.map(&:to_s).include?(environment)
end

#hostString

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

The HTTP host name

In order to decide the value, it looks up the following sources:

* CLI option `host`
* HANAMI_HOST ENV var

If those are missing it falls back to the following defaults:

* `"localhost"` for development
* `"0.0.0.0"` for all the other environments

Returns:

  • (String)

    the HTTP host name

See Also:

Since:

  • 0.1.0


306
307
308
309
310
# File 'lib/hanami/environment.rb', line 306

def host
  @host ||= @options.fetch(:host) do
    env[HANAMI_HOST] || default_host
  end
end

#portInteger

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

The HTTP port

In order to decide the value, it looks up the following sources:

* CLI option `port`
* HANAMI_PORT ENV var

If those are missing it falls back to the default one: `2300`.

Returns:

  • (Integer)

    the default port

See Also:

Since:

  • 0.1.0


326
327
328
329
330
# File 'lib/hanami/environment.rb', line 326

def port
  @port ||= @options.fetch(:port) do
    env[HANAMI_PORT] || DEFAULT_PORT
  end.to_i
end

#project_nameString

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

Project name

Returns:

  • (String)

    Project name

Since:

  • 0.8.0


249
250
251
# File 'lib/hanami/environment.rb', line 249

def project_name
  @options.fetch(:project)
end

#rackupPathname

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

Path to the Rack configuration file

In order to decide the value, it looks up the following sources:

* CLI option `rackup`

If those are missing it falls back to the default one: `“config.ru”`.

When a relative path is given via CLI option, it assumes to be located under application's root. If absolute path, it will be used as it is.

Returns:

  • (Pathname)

    path to the Rack configuration file

Since:

  • 0.2.0


346
347
348
# File 'lib/hanami/environment.rb', line 346

def rackup
  root.join(@options.fetch(:rackup) { DEFAULT_RACKUP })
end

#require_application_environmentObject Also known as: require_project_environment

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

Require application environment

Eg require "config/environment".

Since:

  • 0.4.0


379
380
381
# File 'lib/hanami/environment.rb', line 379

def require_application_environment
  require project_environment_configuration.to_s # if project_environment_configuration.exist?
end

#rootPathname

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

Application's root

It defaults to the current working directory. Hanami assumes that all the commands are executed from there.

Returns:

  • (Pathname)

    application's root

Since:

  • 0.2.0


261
262
263
# File 'lib/hanami/environment.rb', line 261

def root
  @root ||= Pathname.new(Dir.pwd)
end

#serve_static_assets?Boolean

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

Returns:

  • (Boolean)

Since:

  • 0.6.0


424
425
426
# File 'lib/hanami/environment.rb', line 424

def serve_static_assets?
  SERVE_STATIC_ASSETS_ENABLED == env[SERVE_STATIC_ASSETS]
end

#static_assets_middlewareObject

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

Since:

  • 0.6.0


430
431
432
433
434
435
436
437
438
439
440
# File 'lib/hanami/environment.rb', line 430

def static_assets_middleware
  return unless serve_static_assets?

  if environment?(:development, :test)
    require 'hanami/assets/static'
    Hanami::Assets::Static
  else
    require 'hanami/static'
    Hanami::Static
  end
end

#to_optionsHanami::Utils::Hash

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

Serialize the most relevant settings into a Hash

Returns:

  • (Hanami::Utils::Hash)

Since:

  • 0.1.0


459
460
461
462
463
464
465
466
467
468
# File 'lib/hanami/environment.rb', line 459

def to_options
  @options.merge(
    environment: environment,
    env_config:  env_config,
    apps_path:   apps_path,
    rackup:      rackup,
    host:        host,
    port:        port
  )
end