Class: Bundler::Dsl

Inherits:
Object
  • Object
show all
Defined in:
lib/bundler/dsl.rb

Constant Summary collapse

VALID_PLATFORMS =
Bundler::Dependency::PLATFORM_MAP.keys.freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeDsl

Returns a new instance of Dsl.



13
14
15
16
17
18
19
20
21
# File 'lib/bundler/dsl.rb', line 13

def initialize
  @rubygems_source = Source::Rubygems.new
  @source          = nil
  @sources         = []
  @dependencies    = []
  @groups          = []
  @platforms       = []
  @env             = nil
end

Class Method Details

.deprecate(name, replacement = nil) ⇒ Object

Deprecated methods



144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/bundler/dsl.rb', line 144

def self.deprecate(name, replacement = nil)
  define_method(name) do |*|
    message = "'#{name}' has been removed from the Gemfile DSL, "
    if replacement
      message << "and has been replaced with '#{replacement}'."
    else
      message << "and is no longer supported."
    end
    message << "\nSee the README for more information on upgrading from Bundler 0.8."
    raise DeprecatedError, message
  end
end

.evaluate(gemfile, lockfile, unlock) ⇒ Object



5
6
7
8
9
# File 'lib/bundler/dsl.rb', line 5

def self.evaluate(gemfile, lockfile, unlock)
  builder = new
  builder.instance_eval(Bundler.read_file(gemfile.to_s), gemfile.to_s, 1)
  builder.to_definition(lockfile, unlock)
end

Instance Method Details

#env(name) ⇒ Object



135
136
137
138
139
140
# File 'lib/bundler/dsl.rb', line 135

def env(name)
  @env, old = name, @env
  yield
ensure
  @env = old
end

#gem(name, *args) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/bundler/dsl.rb', line 47

def gem(name, *args)
  if name.is_a?(Symbol)
    raise GemfileError, %{You need to specify gem names as Strings. Use 'gem "#{name.to_s}"' instead.}
  end

  options = Hash === args.last ? args.pop : {}
  version = args || [">= 0"]

  _deprecated_options(options)
  _normalize_options(name, version, options)

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

  if current = @dependencies.find { |d| d.name == dep.name }
    if current.requirement != dep.requirement
      raise DslError, "You cannot specify the same gem twice with different version requirements. " \
                      "You specified: #{current.name} (#{current.requirement}) and " \
                      "#{dep.name} (#{dep.requirement})"
    end

    if current.source != dep.source
      raise DslError, "You cannot specify the same gem twice coming from different sources. You " \
                      "specified that #{dep.name} (#{dep.requirement}) should come from " \
                      "#{current.source || 'an unspecfied source'} and #{dep.source}"
    end
  end
  @dependencies << Dependency.new(name, version, options)
end

#gemspec(opts = nil) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/bundler/dsl.rb', line 23

def gemspec(opts = nil)
  path              = opts && opts[:path] || '.'
  name              = opts && opts[:name] || '*'
  development_group = opts && opts[:development_group] || :development
  path              = File.expand_path(path, Bundler.default_gemfile.dirname)
  gemspecs = Dir[File.join(path, "#{name}.gemspec")]

  case gemspecs.size
  when 1
    spec = Bundler.load_gemspec(gemspecs.first)
    raise InvalidOption, "There was an error loading the gemspec at #{gemspecs.first}." unless spec
    gem spec.name, :path => path
    group(development_group) do
      spec.development_dependencies.each do |dep|
        gem dep.name, *dep.requirement.as_list
      end
    end
  when 0
    raise InvalidOption, "There are no gemspecs at #{path}."
  else
    raise InvalidOption, "There are multiple gemspecs at #{path}. Please use the :name option to specify which one."
  end
end

#git(uri, options = {}, source_options = {}, &blk) ⇒ Object



99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/bundler/dsl.rb', line 99

def git(uri, options = {}, source_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

  source Source::Git.new(_normalize_hash(options).merge("uri" => uri)), source_options, &blk
end

#group(*args, &blk) ⇒ Object



120
121
122
123
124
125
# File 'lib/bundler/dsl.rb', line 120

def group(*args, &blk)
  @groups.concat args
  yield
ensure
  args.each { @groups.pop }
end

#path(path, options = {}, source_options = {}, &blk) ⇒ Object



95
96
97
# File 'lib/bundler/dsl.rb', line 95

def path(path, options = {}, source_options = {}, &blk)
  source Source::Path.new(_normalize_hash(options).merge("path" => Pathname.new(path))), source_options, &blk
end

#platforms(*platforms) ⇒ Object Also known as: platform



127
128
129
130
131
132
# File 'lib/bundler/dsl.rb', line 127

def platforms(*platforms)
  @platforms.concat platforms
  yield
ensure
  platforms.each { @platforms.pop }
end

#source(source, options = {}) ⇒ Object



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/bundler/dsl.rb', line 76

def source(source, options = {})
  case source
  when :gemcutter, :rubygems, :rubyforge then
    rubygems_source "http://rubygems.org"
    return
  when String
    rubygems_source source
    return
  end

  @source = source
  options[:prepend] ? @sources.unshift(@source) : @sources << @source

  yield if block_given?
  @source
ensure
  @source = nil
end

#to_definition(lockfile, unlock) ⇒ Object



114
115
116
117
118
# File 'lib/bundler/dsl.rb', line 114

def to_definition(lockfile, unlock)
  @sources << @rubygems_source
  @sources.uniq!
  Definition.new(lockfile, @dependencies, @sources, unlock)
end