module Tennpipes::Loader

Public Instance Methods

after_load(&block) click to toggle source

Hooks to be called after a load/reload.

@yield []

The given block will be called after Tennpipes was loaded/reloaded.

@return [Array<Proc>]

The load/reload hooks.

@example

after_load do
  DataMapper.finalize
end
# File lib/tennpipes-base/loader.rb, line 37
def after_load(&block)
  @_after_load ||= []
  @_after_load << block if block_given?
  @_after_load
end
before_load(&block) click to toggle source

Hooks to be called before a load/reload.

@yield []

The given block will be called before Tennpipes was loaded/reloaded.

@return [Array<Proc>]

The load/reload before hooks.

@example

before_load do
  pre_initialize_something
end
# File lib/tennpipes-base/loader.rb, line 17
def before_load(&block)
  @_before_load ||= []
  @_before_load << block if block_given?
  @_before_load
end
called_from() click to toggle source

This adds the ability to instantiate {Tennpipes.load!} after {Tennpipes::Application} definition.

# File lib/tennpipes-base/loader.rb, line 107
def called_from
  @_called_from || first_caller
end
clear!() click to toggle source

Clear the tennpipes env.

@return [NilClass]

# File lib/tennpipes-base/loader.rb, line 82
def clear!
  clear_middleware!
  mounted_apps.clear
  @_dependency_paths = nil
  before_load.clear
  after_load.clear
  global_configurations.clear
  Reloader.clear!
  Thread.current[:tennpipes_loaded] = nil
end
dependency_paths() click to toggle source

Returns default list of path globs to load as dependencies. Appends custom dependency patterns to the be loaded for Tennpipes.

@return [Array<String>]

The dependencey paths.

@example

Tennpipes.dependency_paths << "#{Tennpipes.root}/uploaders/*.rb"
# File lib/tennpipes-base/loader.rb, line 182
def dependency_paths
  @_dependency_paths ||= default_dependency_paths + modules_dependency_paths
end
load!() click to toggle source

Requires necessary dependencies as well as application files from root lib and models.

@return [Boolean]

returns true if Tennpipes is not already bootstraped otherwise else.
# File lib/tennpipes-base/loader.rb, line 50
def load!
  return false if loaded?
  began_at = Time.now
  @_called_from = first_caller
  set_encoding
  Tennpipes.logger
  Reloader.lock!
  before_load.each(&:call)
  require_dependencies(*dependency_paths)
  after_load.each(&:call)
  logger.devel "Loaded Tennpipes in #{Time.now - began_at} seconds"
  precompile_all_routes!
  Thread.current[:tennpipes_loaded] = true
end
loaded?() click to toggle source

Determines whether Tennpipes was loaded with {Tennpipes.load!}.

@return [Boolean]

Specifies whether Tennpipes was loaded.
# File lib/tennpipes-base/loader.rb, line 117
def loaded?
  Thread.current[:tennpipes_loaded]
end
precompile_all_routes!() click to toggle source

Precompiles all routes if :precompile_routes is set to true

# File lib/tennpipes-base/loader.rb, line 68
def precompile_all_routes!
  mounted_apps.each do |app|
    app_obj = app.app_obj
    next unless app_obj.respond_to?(:precompile_routes?) && app_obj.precompile_routes?
    app_obj.setup_application!
    logger.devel "Precompiled routes of #{app_obj} (routes size #{app_obj.compiled_router.routes.size})"
  end
end
reload!() click to toggle source

Method for reloading required applications and their files.

# File lib/tennpipes-base/loader.rb, line 96
def reload!
  return unless Reloader.changed?
  before_load.each(&:call)
  Reloader.reload!
  after_load.each(&:call)
end
require_dependencies(*paths) click to toggle source

Attempts to require all dependency libs that we need. If you use this method we can perform correctly a Tennpipes.reload! Another good thing that this method are dependency check, for example:

# models
#  \-- a.rb => require something of b.rb
#  \-- b.rb

In the example above if we do:

Dir["/models/*.rb"].each { |r| require r }

We get an error, because we try to require first a.rb that need something of b.rb.

With this method we don't have this problem.

@param [Array<String>] paths

The paths to require.

@example For require all our app libs we need to do:

require_dependencies("#{Tennpipes.root}/lib/**/*.rb")
# File lib/tennpipes-base/loader.rb, line 145
def require_dependencies(*paths)
  options = paths.extract_options!.merge( :cyclic => true )
  files = paths.flatten.flat_map{ |path| Dir.glob(path).sort_by{ |filename| filename.count('/') } }.uniq

  until files.empty?
    error = fatal = loaded = nil

    files.dup.each do |file|
      begin
        Reloader.safe_load(file, options)
        files.delete(file)
        loaded = true
      rescue NameError, LoadError => error
        logger.devel "Cyclic dependency reload for #{error.class}: #{error.message}"
      rescue Exception => fatal
        break
      end
    end

    if fatal || !loaded
      exception = fatal || error
      logger.exception exception, :short
      raise exception
    end
  end
end

Private Instance Methods

default_dependency_paths() click to toggle source
# File lib/tennpipes-base/loader.rb, line 192
def default_dependency_paths
  @default_dependency_paths ||= [
    "#{root}/config/database.rb",
    "#{root}/lib/**/*.rb",
    "#{root}/models/**/*.rb",
    "#{root}/shared/**/*.rb",
    "#{root}/config/apps.rb",
  ]
end
modules_dependency_paths() click to toggle source
# File lib/tennpipes-base/loader.rb, line 188
def modules_dependency_paths
  modules.map(&:dependency_paths).flatten
end