class European::CarryAll

Public Class Methods

load_file(file) click to toggle source
# File lib/european/carry_all.rb, line 153
def self.load_file(file)
  carry_all = CarryAll.new
  lambda {
    # TODO: Is there any way to define this.. just on an object..
    # and have that DSL file be loaded in the context of that object?
    Kernel.send :define_method, :project do |name, &block|
      carry_all.add_project(European::Project.new({name: name, proc: block, carry_all: carry_all}))
    end

    Kernel.send :define_method, :build do |name|
      carry_all.after_setup do
        ni = NameInterpreter.new name
        build_system_name = ni.prefix
        build_name = ni.name
        build_system = @build_systems[build_system_name]
        if build_system.build named: name
          raise "#{build_system} already has a build named #{name}'"
        end
        url = build_system.url_for_project_named build_name
        build = Build.new build_system: build_system, project: nil, name: build_name, url: url
        build_system.add_build build
      end
    end

    Kernel.send :define_method, :build_system do |name, &block|
      carry_all.add_build_system(European::BuildSystem.new({name: name, proc: block, carry_all: carry_all}))
    end

    Kernel.send :define_method, :deploy_system do |name, &block|
      carry_all.add_deploy_system(European::DeploySystem.new({name: name, proc: block, carry_all: carry_all}))
    end

    Kernel.send :define_method, :source_system do |name, &block|
      carry_all.add_source_system(European::SourceSystem.new({name: name, proc: block, carry_all: carry_all}))
    end
  }.call
  load file
  carry_all.setup
  carry_all
end
load_url(url) click to toggle source
# File lib/european/carry_all.rb, line 145
def self.load_url(url)
  file = Tempfile.new 'carry_all'
  url_content = open(url, ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE).read
  file.write url_content
  file.close
  load_file file.path
end
new() click to toggle source
# File lib/european/carry_all.rb, line 5
def initialize
  @projects = {}
  @build_systems = {}
  @deploy_systems = {}
  @source_systems = {}
  @post_setup_procs = []
end

Public Instance Methods

add_build_system(build_system) click to toggle source
# File lib/european/carry_all.rb, line 34
def add_build_system(build_system)
  @build_systems[build_system.name] = build_system
end
add_deploy_system(deploy_system) click to toggle source
# File lib/european/carry_all.rb, line 38
def add_deploy_system(deploy_system)
  @deploy_systems[deploy_system.name] = deploy_system
end
add_project(project) click to toggle source
# File lib/european/carry_all.rb, line 30
def add_project(project)
  @projects[project.name] = project
end
add_source_system(source_system) click to toggle source
# File lib/european/carry_all.rb, line 42
def add_source_system(source_system)
  @source_systems[source_system.name] = source_system
end
after_setup(&block) click to toggle source
# File lib/european/carry_all.rb, line 46
def after_setup(&block)
  @post_setup_procs << block
end
build_system(args) click to toggle source
# File lib/european/carry_all.rb, line 62
def build_system(args)
  named = args[:named] || raise(':named is required')
  @build_systems[named]
end
build_systems() click to toggle source
# File lib/european/carry_all.rb, line 67
def build_systems
  @build_systems.values
end
deploy_system(args) click to toggle source
# File lib/european/carry_all.rb, line 71
def deploy_system(args)
  named = args[:named] || raise(':named is required')
  @deploy_systems[named]
end
deploy_systems() click to toggle source
# File lib/european/carry_all.rb, line 76
def deploy_systems
  @deploy_systems.values
end
project(args) click to toggle source

TODO: Ack! This is shadowing the kernel defined ‘project’ from the DSL portion in load_file. Is there anyway to avoid globally defining ‘project’?

# File lib/european/carry_all.rb, line 53
def project(args)
  named = args[:named] || raise(':named is required')
  @projects[named]
end
projects() click to toggle source
# File lib/european/carry_all.rb, line 58
def projects
  @projects.values
end
register(item, action, name) click to toggle source
# File lib/european/carry_all.rb, line 89
def register(item, action, name)
  if item.class == Project
    project = item
    if action == :has_build
      ni = NameInterpreter.new name
      build_system_name = ni.prefix
      build_name = ni.name
      build_system = build_systems.find { |bs| bs.name == build_system_name }
      if build_system.build named: build_name
        raise "#{build_system} already has a build named #{build_name}'"
      end
      url = build_system.url_for_project_named build_name
      build = Build.new build_system: build_system, project: project, name: build_name, url: url
      build_system.add_build build
      build_system.add_project project
      project.add_build_system build_system
      project.add_build build
    elsif action == :is_hosted_on
      source_system = @source_systems[name]
      raise "Unknown SourceSystem '#{name}'" unless source_system
      project.source_system = source_system
      source_system.add_project project
      url = source_system.src_url_for_project_named project.name
      project.src_url = url
    elsif action == :deploys_from
      deploy_system = @deploy_systems[name]
      raise "Unknown DeploySystem '#{name}'" unless deploy_system
      project.deploy_systems << deploy_system
      deploy_system.add_project project
    elsif action == :has_deploy
      ni = NameInterpreter.new name
      deploy_system_name = ni.prefix
      build_name = ni.name
      deploy_system = deploy_systems.find { |ds| ds.name == deploy_system_name }
      if deploy_system.build named: build_name
        raise "#{deploy_system} already has a deploy named '#{build_name}'"
      end
      url = deploy_system.url_for_project_named build_name
      deploy = Build.new build_system: deploy_system, project: project, name: build_name, url: url
      deploy_system.add_build deploy
      project.add_deploy deploy
    end
  end
end
setup() click to toggle source
# File lib/european/carry_all.rb, line 13
def setup
  @source_systems.values.each { |system| system.setup }
  @build_systems.values.each { |system| system.setup }
  @deploy_systems.values.each { |system| system.setup }
  default_project = @projects['defaults']
  default_project.setup if default_project
  @projects.delete 'defaults'
  @projects.values.each do |project|
    next if project == default_project
    project.exec default_project.proc if default_project
    project.setup
  end
  @post_setup_procs.each do |proc|
    instance_eval &proc
  end
end
source_system(args) click to toggle source
# File lib/european/carry_all.rb, line 80
def source_system(args)
  named = args[:named] || raise(':named is required')
  @source_systems[named]
end
source_systems() click to toggle source
# File lib/european/carry_all.rb, line 85
def source_systems
  @source_systems.values
end