1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
##
# A semi-compatible DSL for the Bundler Gemfile and Isolate formats.
class Gem::RequestSet::GemDependencyAPI
##
# The dependency groups created by #group in the dependency API file.
attr_reader :dependency_groups
##
# A set of gems that are loaded via the +:path+ option to #gem
attr_reader :vendor_set # :nodoc:
##
# Creates a new GemDependencyAPI that will add dependencies to the
# Gem::RequestSet +set+ based on the dependency API description in +path+.
def initialize set, path
@set = set
@path = path
@current_groups = nil
@dependency_groups = Hash.new { |h, group| h[group] = [] }
@vendor_set = @set.vendor_set
end
##
# Loads the gem dependency file
def load
instance_eval File.read(@path).untaint, @path, 1
end
##
# :category: Gem Dependencies DSL
# :call-seq:
# gem(name)
# gem(name, *requirements)
# gem(name, *requirements, options)
#
# Specifies a gem dependency with the given +name+ and +requirements+. You
# may also supply +options+ following the +requirements+
def gem name, *requirements
options = requirements.pop if requirements.last.kind_of?(Hash)
options ||= {}
if directory = options.delete(:path) then
@vendor_set.add_vendor_gem name, directory
end
g = options.delete :group
all_groups = g ? Array(g) : []
groups = options.delete :groups
all_groups |= groups if groups
all_groups |= @current_groups if @current_groups
unless all_groups.empty? then
all_groups.each do |group|
gem_arguments = [name, *requirements]
gem_arguments << options unless options.empty?
@dependency_groups[group] << gem_arguments
end
return
end
@set.gem name, *requirements
end
##
# Returns the basename of the file the dependencies were loaded from
def gem_deps_file # :nodoc:
File.basename @path
end
##
# :category: Gem Dependencies DSL
# Block form for placing a dependency in the given +groups+.
def group *groups
@current_groups = groups
yield
ensure
@current_groups = nil
end
##
# :category: Gem Dependencies DSL
def platform what
if what == :ruby
yield
end
end
##
# :category: Gem Dependencies DSL
alias :platforms :platform
##
# :category: Gem Dependencies DSL
# Restricts this gem dependencies file to the given ruby +version+. The
# +:engine+ options from Bundler are currently ignored.
def ruby version, options = {}
return true if version == RUBY_VERSION
message = "Your Ruby version is #{RUBY_VERSION}, " +
"but your #{gem_deps_file} specified #{version}"
raise Gem::RubyVersionMismatch, message
end
##
# :category: Gem Dependencies DSL
def source url
end
# TODO: remove this typo name at RubyGems 3.0
Gem::RequestSet::DepedencyAPI = self # :nodoc:
end
|