Class: Bundler::Dsl

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

Constant Summary

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

Instance Attribute Summary (collapse)

Class Method Summary (collapse)

Instance Method Summary (collapse)

Methods included from RubyDsl

#ruby

Constructor Details

- (Dsl) initialize

Returns a new instance of Dsl



18
19
20
21
22
23
24
25
26
27
28
# File 'lib/bundler/dsl.rb', line 18

def initialize
  @source          = nil
  @sources         = SourceList.new
  @git_sources     = {}
  @dependencies    = []
  @groups          = []
  @platforms       = []
  @env             = nil
  @ruby_version    = nil
  add_github_sources
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

- (Object) method_missing(name, *args)

Raises:



177
178
179
180
181
# File 'lib/bundler/dsl.rb', line 177

def method_missing(name, *args)
  location = caller[0].split(':')[0..1].join(':')
  raise GemfileError, "Undefined local variable or method `#{name}' for Gemfile\n" \
    "        from #{location}"
end

Instance Attribute Details

- (Object) dependencies

Returns the value of attribute dependencies



16
17
18
# File 'lib/bundler/dsl.rb', line 16

def dependencies
  @dependencies
end

Class Method Details

+ (Object) evaluate(gemfile, lockfile, unlock)



8
9
10
11
12
# 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

Instance Method Details

- (Object) env(name)



170
171
172
173
174
175
# File 'lib/bundler/dsl.rb', line 170

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

- (Object) eval_gemfile(gemfile, contents = nil)



30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/bundler/dsl.rb', line 30

def eval_gemfile(gemfile, contents = nil)
  contents ||= Bundler.read_file(gemfile.to_s)
  instance_eval(contents, gemfile.to_s, 1)
rescue SyntaxError => e
  syntax_msg = e.message.gsub("#{gemfile.to_s}:", 'on line ')
  raise GemfileError, "Gemfile syntax error #{syntax_msg}"
rescue ScriptError, RegexpError, NameError, ArgumentError => e
  e.backtrace[0] = "#{e.backtrace[0]}: #{e.message} (#{e.class})"
  Bundler.ui.warn e.backtrace.join("\n       ")
  raise GemfileError, "There was an error in your Gemfile," \
    " and Bundler cannot continue."
end

- (Object) gem(name, *args)



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/bundler/dsl.rb', line 68

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

- (Object) gemspec(opts = nil)



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/bundler/dsl.rb', line 43

def gemspec(opts = nil)
  path              = opts && opts[:path] || '.'
  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)
    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 + [: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."
  end
end

- (Object) git(uri, options = {}, &blk)



136
137
138
139
140
141
142
143
144
145
146
147
148
149
# File 'lib/bundler/dsl.rb', line 136

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

- (Object) git_source(name, &block)



119
120
121
122
123
124
125
126
127
128
129
130
# File 'lib/bundler/dsl.rb', line 119

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

- (Object) group(*args, &blk)



155
156
157
158
159
160
# File 'lib/bundler/dsl.rb', line 155

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

- (Object) path(path, options = {}, &blk)



132
133
134
# File 'lib/bundler/dsl.rb', line 132

def path(path, options = {}, &blk)
  with_source(@sources.add_path_source(normalize_hash(options).merge("path" => Pathname.new(path))), &blk)
end

- (Object) platforms(*platforms) Also known as: platform



162
163
164
165
166
167
# File 'lib/bundler/dsl.rb', line 162

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

- (Object) source(source, &blk)



110
111
112
113
114
115
116
117
# File 'lib/bundler/dsl.rb', line 110

def source(source, &blk)
  source = normalize_source(source)
  if block_given?
    with_source(@sources.add_rubygems_source("remotes" => source), &blk)
  else
    @sources.add_rubygems_remote(source)
  end
end

- (Object) to_definition(lockfile, unlock)



151
152
153
# File 'lib/bundler/dsl.rb', line 151

def to_definition(lockfile, unlock)
  Definition.new(lockfile, @dependencies, @sources, unlock, @ruby_version)
end