Module: Listen::DependencyManager

Included in:
Adapters::BSD, Adapters::Darwin, Adapters::Linux, Adapters::Polling, Adapters::Windows
Defined in:
lib/listen/dependency_manager.rb

Overview

The dependency-manager offers a simple DSL which allows classes to declare their gem dependencies and load them when needed. It raises a user-friendly exception when the dependencies can’t be loaded which has the install command in the message.

Defined Under Namespace

Classes: Dependency, Error

Constant Summary collapse

GEM_LOAD_MESSAGE =
<<-EOS.gsub(/^ {6}/, '')
  Missing dependency '%s' (version '%s')!
EOS
GEM_INSTALL_COMMAND =
<<-EOS.gsub(/^ {6}/, '')
  Please run the following to satisfy the dependency:
    gem install --version '%s' %s
EOS
BUNDLER_DECLARE_GEM =
<<-EOS.gsub(/^ {6}/, '')
  Please add the following to your Gemfile to satisfy the dependency:
    gem '%s', '%s'
EOS

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.add_loaded(dependency) ⇒ Object

Adds a loaded dependency to a list so that it doesn’t have to be loaded again by another classes.

Parameters:



53
54
55
# File 'lib/listen/dependency_manager.rb', line 53

def add_loaded(dependency)
  @_loaded_dependencies << dependency
end

.already_loaded?(dependency) ⇒ Boolean

Returns whether the dependency is alread loaded or not.

Parameters:

Returns:

  • (Boolean)


62
63
64
# File 'lib/listen/dependency_manager.rb', line 62

def already_loaded?(dependency)
  @_loaded_dependencies.include?(dependency)
end

.clear_loadedObject

Clears the list of loaded dependencies.



68
69
70
# File 'lib/listen/dependency_manager.rb', line 68

def clear_loaded
  @_loaded_dependencies.clear
end

.extended(base) ⇒ Object

Initializes the extended class.

Parameters:

  • the (Class)

    class for which some dependencies must be managed



42
43
44
45
46
# File 'lib/listen/dependency_manager.rb', line 42

def extended(base)
  base.class_eval do
    @_dependencies = Set.new
  end
end

Instance Method Details

#dependencies_loaded?Boolean

Returns whether all the dependencies has been loaded or not.

Returns:

  • (Boolean)


112
113
114
# File 'lib/listen/dependency_manager.rb', line 112

def dependencies_loaded?
  @_dependencies.empty?
end

#dependency(name, version) ⇒ Object

Registers a new dependency.

Parameters:

  • name (String)

    the name of the gem

  • version (String)

    the version of the gem



78
79
80
# File 'lib/listen/dependency_manager.rb', line 78

def dependency(name, version)
  @_dependencies << Dependency.new(name, version)
end

#load_depenenciesObject

Loads the registered dependencies.

Raises:

  • DependencyManager::Error if the dependency can’t be loaded.



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/listen/dependency_manager.rb', line 86

def load_depenencies
  @_dependencies.each do |dependency|
    begin
      next if DependencyManager.already_loaded?(dependency)
      gem(dependency.name, dependency.version)
      require(dependency.name)
      DependencyManager.add_loaded(dependency)
      @_dependencies.delete(dependency)
    rescue Gem::LoadError
      args = [dependency.name, dependency.version]
      command = if running_under_bundler?
        BUNDLER_DECLARE_GEM % args
      else
        GEM_INSTALL_COMMAND % args.reverse
      end
      message = GEM_LOAD_MESSAGE % args

      raise Error.new(message + command)
    end
  end
end