class MetaCommit::Container

Constants

BUILTIN_EXTENSION

Public Class Methods

new() click to toggle source
Calls superclass method
# File lib/meta_commit/container.rb, line 8
def initialize
  super
  register :parser_classes, []
  register :diff_classes, []
end

Public Instance Methods

boot(config_store) click to toggle source

@param [MetaCommit::ConfigStore] config_store @return [MetaCommit::Container]

# File lib/meta_commit/container.rb, line 16
def boot(config_store)
  load_packages(config_store.get(:extensions))

  register :diff_factory, MetaCommit::Factories::DiffFactory.new(self[:diff_classes])
  register :parser_factory, MetaCommit::Factories::ParserFactory.new(self[:parser_classes])
  register :parse_command, MetaCommit::Services::Parse.new(self[:parser_factory])
  register :contextual_ast_node_factory, MetaCommit::Factories::ContextualAstNodeFactory.new

  self
end

Protected Instance Methods

camelize(extension_name) click to toggle source

@param [String] extension_name @return [String]

# File lib/meta_commit/container.rb, line 79
def camelize(extension_name)
  return extension_name.slice(0, 1).capitalize + extension_name.slice(1..-1) unless extension_name.include?('_') #  capitalize only first letter if name is not in snake case
  extension_name.split('_').collect(&:capitalize).join
end
extension_class(extension) click to toggle source

@param [String] extension name @return [Class] extension class

# File lib/meta_commit/container.rb, line 71
def extension_class(extension)
  "MetaCommit::Extension::#{extension}::Locator".split('::').inject(Object) {|o, c| o.const_get(c)}
end
load_builtin_extension() click to toggle source
# File lib/meta_commit/container.rb, line 47
def load_builtin_extension
  require 'meta_commit/extensions/builtin'

  extension = extension_class(camelize(without_extension_prefix('builtin'))).new

  self[:parser_classes].concat(extension.parsers)
  self[:diff_classes].concat(extension.diffs)
end
load_packages(extensions_to_load) click to toggle source

@param [Array<String>] extensions_to_load

# File lib/meta_commit/container.rb, line 28
def load_packages(extensions_to_load)
  # @TODO refactor so it search in GEM_HOME dir (?)
  required_extensions(extensions_to_load).each do |gem|
    gem.require_paths.each do |path|
      gem_source_path = File.join(gem.full_gem_path, path)
      $LOAD_PATH.unshift gem_source_path
      require gem.name
    end

    extension = extension_class(camelize(without_extension_prefix(gem.name))).new

    self[:parser_classes].concat(extension.parsers)
    self[:diff_classes].concat(extension.diffs)
  end
  load_builtin_extension if extensions_to_load.include?(BUILTIN_EXTENSION)
end
required_extensions(extensions_to_load) click to toggle source

@param [Array<String>] extensions_to_load @return [Array<String>]

# File lib/meta_commit/container.rb, line 60
def required_extensions(extensions_to_load)
  extensions = Gem::Specification.find_all.select do |gem|
    gem.name =~ /^meta_commit_/ && gem.name != 'meta_commit_contracts' && extensions_to_load.include?(without_extension_prefix gem.name)
  end
  extensions.uniq {|gem| gem.name}
end
without_extension_prefix(extension_name) click to toggle source

@param [String] extension_name @return [String]

# File lib/meta_commit/container.rb, line 88
def without_extension_prefix(extension_name)
  extension_name.sub('meta_commit_', '')
end