Class: Lotus::Environment Private

Inherits:
Object
  • Object
show all
Defined in:
lib/lotus/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 Lotus environment.

Since:

  • 0.1.0

Constant Summary collapse

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
LOTUS_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 Lotus ENV key

Since:

  • 0.1.0

'LOTUS_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 Lotus environment

Since:

  • 0.1.0

'development'.freeze
DEFAULT_DOTENV =

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` file name

Since:

  • 0.2.0

'.env'.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
LOTUS_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 Lotus host ENV key

Since:

  • 0.1.0

'LOTUS_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
LOTUS_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 Lotus port ENV key

Since:

  • 0.1.0

'LOTUS_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 Lotus 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

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Lotus::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 Lotus 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 Lotus, such as `RACK_ENV` and `LOTUS_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 'lotus/environment'

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

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

ENV['LOTUS_HOST'] # => "localhost"
ENV['LOTUS_PORT'] # => "2300"

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

# Lotus::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



175
176
177
178
179
180
# File 'lib/lotus/environment.rb', line 175

def initialize(options = {})
  @options = Lotus::Lotusrc.new(root, options).read
  @options.merge! Utils::Hash.new(options).symbolize!
  @mutex   = Mutex.new
  @mutex.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



390
391
392
393
394
395
396
397
# File 'lib/lotus/environment.rb', line 390

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



375
376
377
378
379
380
# File 'lib/lotus/environment.rb', line 375

def architecture
  @options.fetch(:architecture) {
    puts "Cannot recognize Lotus architecture, please check `.lotusrc'"
    exit 1
  }
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



215
216
217
# File 'lib/lotus/environment.rb', line 215

def bundler_groups
  [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



363
364
365
366
367
368
369
370
371
# File 'lib/lotus/environment.rb', line 363

def code_reloading?
  # JRuby doesn't implement fork that's why shotgun cannot be used.
  if Utils.jruby?
    puts "JRuby doesn't support code reloading."
    false
  else
    @options.fetch(:code_reloading) { !!CODE_RELOADING[environment] }
  end
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



250
251
252
# File 'lib/lotus/environment.rb', line 250

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



384
385
386
# File 'lib/lotus/environment.rb', line 384

def container?
  architecture == CONTAINER
end

#env_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.

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



331
332
333
# File 'lib/lotus/environment.rb', line 331

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:

* LOTUS_ENV
* RACK_ENV

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

Returns:

  • (String)

    the current environment

See Also:

Since:

  • 0.1.0



196
197
198
# File 'lib/lotus/environment.rb', line 196

def environment
  @environment ||= ENV[LOTUS_ENV] || 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:

  • Lotus.env?(name)

Since:

  • 0.3.1



203
204
205
# File 'lib/lotus/environment.rb', line 203

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`
* LOTUS_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



272
273
274
275
276
# File 'lib/lotus/environment.rb', line 272

def host
  @host ||= @options.fetch(:host) {
    ENV[LOTUS_HOST] || default_host
  }
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`
* LOTUS_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



292
293
294
# File 'lib/lotus/environment.rb', line 292

def port
  @port ||= @options.fetch(:port) { ENV[LOTUS_PORT] || DEFAULT_PORT }.to_i
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



310
311
312
# File 'lib/lotus/environment.rb', line 310

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

#require_application_environmentObject

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



341
342
343
# File 'lib/lotus/environment.rb', line 341

def require_application_environment
  require env_config.to_s
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. Lotus assumes that all the commands are executed from there.

Returns:

  • (Pathname)

    application’s root

Since:

  • 0.2.0



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

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

#to_optionsLotus::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:

  • (Lotus::Utils::Hash)

Since:

  • 0.1.0



405
406
407
408
409
410
411
412
413
414
# File 'lib/lotus/environment.rb', line 405

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