module A9n

Based on github.com/rails/rails/blob/master/activesupport/lib/active_support/string_inquirer.rb

Constants

ConfigurationNotLoadedError
DEFAULT_LOG_LEVEL
EXTENSION_LIST
Error
KeyNotFoundError
MissingConfigurationDataError
MissingConfigurationVariablesError
MissingEnvVariableError
NoSuchConfigurationVariableError
RootNotSetError
STRICT_MODE
UnknownEnvError
VERSION

Attributes

logger[W]

Public Class Methods

app() click to toggle source
# File lib/a9n.rb, line 44
def app
  @app ||= rails_app
end
app=(app_instance) click to toggle source
# File lib/a9n.rb, line 48
def app=(app_instance)
  @app = app_instance
end
app_env() click to toggle source
# File lib/a9n.rb, line 40
def app_env
  app.env if app.respond_to?(:env)
end
app_root() click to toggle source
# File lib/a9n.rb, line 56
def app_root
  app.root if app.respond_to?(:root)
end
default_files() click to toggle source
# File lib/a9n.rb, line 92
def default_files
  files  = Dir[root.join("config/{#{A9n::Scope::ROOT_NAMES.join(',')}}.#{EXTENSION_LIST}").to_s]
  files += Dir[root.join("config/a9n/*.#{EXTENSION_LIST}")]
  files.map { |f| f.sub(/.example$/, '') }.uniq.sort
end
env() click to toggle source
# File lib/a9n.rb, line 26
def env
  @env ||= ::A9n::StringInquirer.new(
    app_env ||
    env_var('APP_ENV') ||
    env_var('RACK_ENV') ||
    env_var('RAILS_ENV') ||
    raise(UnknownEnvError)
  )
end
env=(value) click to toggle source
# File lib/a9n.rb, line 36
def env=(value)
  @env = ::A9n::StringInquirer.new(value)
end
env_var(name, strict: false) click to toggle source
# File lib/a9n.rb, line 82
def env_var(name, strict: false)
  raise A9n::MissingEnvVariableError, name if strict && !ENV.key?(name)

  if ENV[name].is_a?(::String)
    ENV[name].dup.force_encoding(Encoding::UTF_8).freeze
  else
    ENV[name].dup.freeze
  end
end
groups() click to toggle source
# File lib/a9n.rb, line 74
def groups
  ['default', env].compact.freeze
end
load(*files) click to toggle source
# File lib/a9n.rb, line 98
def load(*files)
  require_local_extension
  files = files.empty? ? default_files : absolute_paths_for(files)
  files.map { |file| load_file(file) }
end
logger() click to toggle source
# File lib/a9n.rb, line 116
def logger
  @logger ||= ::Logger.new($stdout, level: fetch(:log_level, DEFAULT_LOG_LEVEL))
end
method_missing(name, *args) click to toggle source
# File lib/a9n.rb, line 120
def method_missing(name, *args)
  load if storage.empty?
  storage.send(name, *args)
end
mode() click to toggle source
# File lib/a9n.rb, line 108
def mode
  ENV['A9N_MODE'] || STRICT_MODE
end
rails_app() click to toggle source
# File lib/a9n.rb, line 78
def rails_app
  defined?(Rails) ? Rails : nil
end
root() click to toggle source
# File lib/a9n.rb, line 52
def root
  @root ||= app_root || root_from_bundle_env || raise(RootNotSetError)
end
root=(path) click to toggle source
# File lib/a9n.rb, line 70
def root=(path)
  @root = path.to_s.empty? ? nil : Pathname.new(path.to_s).freeze
end
root_from_bundle_env() click to toggle source
# File lib/a9n.rb, line 60
def root_from_bundle_env
  return nil unless ENV['BUNDLE_GEMFILE']

  dir = File.dirname(ENV.fetch('BUNDLE_GEMFILE', nil))

  return nil unless File.directory?(dir)

  Pathname.new(dir)
end
storage() click to toggle source
# File lib/a9n.rb, line 104
def storage
  @storage ||= A9n::Struct.new
end
strict?() click to toggle source
# File lib/a9n.rb, line 112
def strict?
  mode == STRICT_MODE
end

Private Class Methods

absolute_paths_for(files) click to toggle source
# File lib/a9n.rb, line 146
def absolute_paths_for(files)
  files.map { |file| Pathname.new(file).absolute? ? file : root.join('config', file).to_s }
end
define_root_geters(*names) click to toggle source
# File lib/a9n.rb, line 160
def define_root_geters(*names)
  names.each do |name|
    next if respond_to?(name)

    define_singleton_method(name) { storage.fetch(name) }
  end
end
load_file(file) click to toggle source
# File lib/a9n.rb, line 127
def load_file(file)
  scope = A9n::Scope.form_file_path(file)
  scope_data = A9n::Loader.new(file, scope, env).get
  setup_scope(scope, scope_data)
end
require_local_extension() click to toggle source
# File lib/a9n.rb, line 150
def require_local_extension
  return if root.nil?

  local_extension_file = File.join(root, 'config/a9n.rb')

  return unless File.exist?(local_extension_file)

  require local_extension_file
end
setup_scope(scope, data) click to toggle source
# File lib/a9n.rb, line 133
def setup_scope(scope, data)
  if scope.root?
    storage.merge(data)
    def_delegator(:storage, :fetch) unless respond_to?(:fetch)
    define_root_geters(*data.keys)
  else
    storage[scope.name] = data
    define_root_geters(scope.name)
  end

  data
end