class Bundler::Dsl

Constants

VALID_PLATFORMS

Attributes

dependencies[RW]

Public Class Methods

evaluate(gemfile, lockfile, unlock) click to toggle source
# File lib/bundler/dsl.rb, line 8
def self.evaluate(gemfile, lockfile, unlock)
  builder = new
  builder.eval_gemfile(gemfile)
  builder.to_definition(lockfile, unlock)
end
new() click to toggle source
# File lib/bundler/dsl.rb, line 18
def initialize
  @source               = nil
  @sources              = SourceList.new
  @git_sources          = {}
  @dependencies         = []
  @groups               = []
  @install_conditionals = []
  @optional_groups      = []
  @platforms            = []
  @env                  = nil
  @ruby_version         = nil
  add_git_sources
end

Public Instance Methods

env(name) { || ... } click to toggle source
# File lib/bundler/dsl.rb, line 200
def env(name)
  @env, old = name, @env
  yield
ensure
  @env = old
end
eval_gemfile(gemfile, contents = nil) click to toggle source
# File lib/bundler/dsl.rb, line 32
def eval_gemfile(gemfile, contents = nil)
  contents ||= Bundler.read_file(gemfile.to_s)
  instance_eval(contents, gemfile.to_s, 1)
rescue Exception => e
  message = "There was an error parsing `#{File.basename gemfile.to_s}`: #{e.message}"
  raise DSLError.new(message, gemfile, e.backtrace, contents)
end
gem(name, *args) click to toggle source
# File lib/bundler/dsl.rb, line 73
def gem(name, *args)
  options = args.last.is_a?(Hash) ? args.pop.dup : {}
  version = args || [">= 0"]

  normalize_options(name, version, options)

  dep = Dependency.new(name, version, options)

  # if there's already a dependency with this name we try to prefer one
  if current = @dependencies.find { |d| d.name == dep.name }
    if current.requirement != dep.requirement
      if current.type == :development
        @dependencies.delete current
      elsif dep.type == :development
        return
      else
        raise GemfileError, "You cannot specify the same gem twice with different version requirements.\n"                              "You specified: #{current.name} (#{current.requirement}) and #{dep.name} (#{dep.requirement})"
      end

    else
      Bundler.ui.warn "Your Gemfile lists the gem #{current.name} (#{current.requirement}) more than once.\n"                            "You should probably keep only one of them.\n"                            "While it's not a problem now, it could cause errors if you change the version of just one of them later."
    end

    if current.source != dep.source
      if current.type == :development
        @dependencies.delete current
      elsif dep.type == :development
        return
      else
        raise GemfileError, "You cannot specify the same gem twice coming from different sources.\n"                              "You specified that #{dep.name} (#{dep.requirement}) should come from "                              "#{current.source || 'an unspecified source'} and #{dep.source}\n"
      end
    end
  end

  @dependencies << dep
end
gemspec(opts = nil) click to toggle source
# File lib/bundler/dsl.rb, line 40
def gemspec(opts = nil)
  path              = opts && opts[:path] || '.'
  glob              = opts && opts[:glob]
  name              = opts && opts[:name] || '{,*}'
  development_group = opts && opts[:development_group] || :development
  expanded_path     = File.expand_path(path, Bundler.default_gemfile.dirname)

  gemspecs = Dir[File.join(expanded_path, "#{name}.gemspec")]

  case gemspecs.size
  when 1
    spec = Bundler.load_gemspec(gemspecs.first)

    unless spec
      raise InvalidOption, "There was an error loading the gemspec at "              "#{file}. Make sure you can build the gem, then try again."
    end

    gem spec.name, :path => path, :glob => glob

    group(development_group) do
      spec.development_dependencies.each do |dep|
        gem dep.name, *(dep.requirement.as_list + [:type => :development])
      end
    end
  when 0
    raise InvalidOption, "There are no gemspecs at #{expanded_path}."
  else
    raise InvalidOption, "There are multiple gemspecs at #{expanded_path}. "            "Please use the :name option to specify which one should be used."
  end
end
git(uri, options = {}, &blk) click to toggle source
# File lib/bundler/dsl.rb, line 142
def git(uri, options = {}, &blk)
  unless block_given?
    msg = "You can no longer specify a git source by itself. Instead, \n"                "either use the :git option on a gem, or specify the gems that \n"                "bundler should find in the git source by passing a block to \n"                "the git method, like: \n\n"                "  git 'git://github.com/rails/rails.git' do\n"                "    gem 'rails'\n"                "  end"
    raise DeprecatedError, msg
  end

  with_source(@sources.add_git_source(normalize_hash(options).merge("uri" => uri)), &blk)
end
git_source(name, &block) click to toggle source
# File lib/bundler/dsl.rb, line 125
def git_source(name, &block)
  unless block_given?
    raise InvalidOption, "You need to pass a block to #git_source"
  end

  if valid_keys.include?(name.to_s)
    raise InvalidOption, "You cannot use #{name} as a git source. It "            "is a reserved key. Reserved keys are: #{valid_keys.join(", ")}"
  end

  @git_sources[name.to_s] = block
end
github(repo, options = {}) { || ... } click to toggle source
# File lib/bundler/dsl.rb, line 157
def github(repo, options = {})
  raise ArgumentError, "Github sources require a block" unless block_given?
  github_uri  = @git_sources["github"].call(repo)
  git_options = normalize_hash(options).merge("uri" => github_uri)
  git_source  = @sources.add_git_source(git_options)
  with_source(git_source) { yield }
end
group(*args) { || ... } click to toggle source
# File lib/bundler/dsl.rb, line 169
def group(*args, &blk)
  opts = Hash === args.last ? args.pop.dup : {}
  normalize_group_options(opts, args)

  @groups.concat args

  if opts["optional"]
    optional_groups = args - @optional_groups
    @optional_groups.concat optional_groups
  end

  yield
ensure
  args.each { @groups.pop }
end
install_if(*args, &blk) click to toggle source
# File lib/bundler/dsl.rb, line 185
def install_if(*args, &blk)
  @install_conditionals.concat args
  blk.call
ensure
  args.each { @install_conditionals.pop }
end
method_missing(name, *args) click to toggle source
# File lib/bundler/dsl.rb, line 207
def method_missing(name, *args)
  raise GemfileError, "Undefined local variable or method `#{name}' for Gemfile"
end
path(path, options = {}, &blk) click to toggle source
# File lib/bundler/dsl.rb, line 138
def path(path, options = {}, &blk)
  with_source(@sources.add_path_source(normalize_hash(options).merge("path" => Pathname.new(path))), &blk)
end
platform(*platforms)
Alias for: platforms
platforms(*platforms) { || ... } click to toggle source
# File lib/bundler/dsl.rb, line 192
def platforms(*platforms)
  @platforms.concat platforms
  yield
ensure
  platforms.each { @platforms.pop }
end
Also aliased as: platform
source(source, &blk) click to toggle source
# File lib/bundler/dsl.rb, line 115
def source(source, &blk)
  source = normalize_source(source)
  if block_given?
    with_source(@sources.add_rubygems_source("remotes" => source), &blk)
  else
    check_primary_source_safety(@sources)
    @sources.add_rubygems_remote(source)
  end
end
to_definition(lockfile, unlock) click to toggle source
# File lib/bundler/dsl.rb, line 165
def to_definition(lockfile, unlock)
  Definition.new(lockfile, @dependencies, @sources, unlock, @ruby_version, @optional_groups)
end