class Project::ProjectFile

extracts capabilities and definitions from project files

Attributes

addon_names[R]
addons[R]
capabilities[R]
definitions[R]
path[R]
project[R]

Public Class Methods

new(project:, path: @project = project) click to toggle source
# File app/project/file.rb, line 4
def initialize project:, path:
  @project = project
  @path = path
  @definitions = []
  @capabilities = []
  @addons = []
  file = File.read path
  method_names_cache = methods(false)
  instance_eval file
  sandbox = RBCM::Project::Sandbox.dup
  sandbox.module_eval(file)
  sandbox.instance_methods.each do |name|
    raise "ERROR: capability name '#{name}' not allowed" if [:node, :group].include? name
    @capabilities.append RBCM::Project::Capability.new(
      name:         name,
      content:      sandbox.instance_method(name),
      project_file: self
    )
  end
end

Private Instance Methods

addon(branch: "master", **named) click to toggle source
# File app/project/file.rb, line 29
def addon branch: "master", **named
  raise "illegal project source: #{keys}" if (
    keys = named.keys - [:github, :dir, :file]
  ).any?
  named.each do |type, name|
    @addons.append RBCM::Addon.new type: type, name: name
  end
end
group(name=nil) click to toggle source
# File app/project/file.rb, line 38
def group name=nil
  @definitions.append RBCM::Project::Definition.new(
    type:    :group,
    name:    name,
    content: Proc.new,
    project_file: self
  )
end
node(names=nil) click to toggle source
# File app/project/file.rb, line 47
def node names=nil
  [names].flatten(1).each do |name|
    @definitions.append RBCM::Project::Definition.new(
      type:         name.class == Regexp ? :pattern : :node,
      name:         name,
      content:      Proc.new,
      project_file: self
    )
  end
end
relative_path() click to toggle source
# File app/project/file.rb, line 58
def relative_path
  @path.gsub /^#{@project.path}/, ""
end