teapot 1.0.0.pre.rc7 → 1.0.0.pre.rc9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +0 -4
- data/README.md +3 -2
- data/lib/teapot/build.rb +55 -3
- data/lib/teapot/context.rb +4 -4
- data/lib/teapot/controller/build.rb +25 -14
- data/lib/teapot/dependency.rb +40 -3
- data/lib/teapot/environment/system.rb +3 -5
- data/lib/teapot/rule.rb +9 -18
- data/lib/teapot/version.rb +1 -1
- data/spec/teapot/dependency_spec.rb +50 -0
- data/teapot.gemspec +4 -2
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c85e14574b10f98c7393860c30732ba0ce291322
|
4
|
+
data.tar.gz: 7800be07e0609957751fcdd79bdd3f454b2e9042
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dc81b95ae0929cc0a7f6c1b387e8b71276b1db78b3f9e8948b7ec72053be173f9279a56c2bb9a6ef6b1f9a6a7de3fa300edd44400e14e64146b828333bcac9a6
|
7
|
+
data.tar.gz: d097232b756dc542314069a3f464da5ed8ad7d456db959a6fe5c6c93b9bb8dc25056b0d0a8b3903ced6e33fcd308e480336735e5f6f898f25c13b0b8e738cad0
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -14,7 +14,7 @@ Teapot is a decentralised build tool for managing complex cross-platform project
|
|
14
14
|
|
15
15
|
Ensure that you already have a working install of Ruby 1.9.3+
|
16
16
|
|
17
|
-
|
17
|
+
$ gem install teapot
|
18
18
|
|
19
19
|
## Usage
|
20
20
|
|
@@ -58,9 +58,10 @@ For Mac OS X (requires Xcode Command Line Tools):
|
|
58
58
|
|
59
59
|
You need to make sure any basic tools, e.g. compilers, system libraries, are installed correctly before building. Consult the platform and library documentation for any dependencies.
|
60
60
|
|
61
|
-
##
|
61
|
+
## Open Issues
|
62
62
|
|
63
63
|
- Should packages be built into a shared prefix or should they be built into unique prefixes and joined together either via install or `-L` and `-I`?
|
64
|
+
- Relative include paths might fail to work correctly if headers are not installed into same directory.
|
64
65
|
- Should packages expose the tools required to build themselves as dependencies? e.g. should `build-cmake` as required by, say, `OpenCV`, be exposed to all who depend on `OpenCV`? Should there be a mechanism for non-public dependencies, i.e. dependencies which are not exposed to dependants?
|
65
66
|
|
66
67
|
## Contributing
|
data/lib/teapot/build.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
# Copyright, 2012, by Samuel G. D. Williams. <http://www.codeotaku.com>
|
2
|
-
#
|
2
|
+
#
|
3
3
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
4
|
# of this software and associated documentation files (the "Software"), to deal
|
5
5
|
# in the Software without restriction, including without limitation the rights
|
6
6
|
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
7
|
# copies of the Software, and to permit persons to whom the Software is
|
8
8
|
# furnished to do so, subject to the following conditions:
|
9
|
-
#
|
9
|
+
#
|
10
10
|
# The above copyright notice and this permission notice shall be included in
|
11
11
|
# all copies or substantial portions of the Software.
|
12
|
-
#
|
12
|
+
#
|
13
13
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
14
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
15
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
@@ -26,6 +26,7 @@ require 'build/makefile'
|
|
26
26
|
|
27
27
|
require 'teapot/name'
|
28
28
|
|
29
|
+
require 'graphviz'
|
29
30
|
require 'process/group'
|
30
31
|
require 'system'
|
31
32
|
|
@@ -67,6 +68,10 @@ module Teapot
|
|
67
68
|
scope.instance_exec(@arguments, &@callback)
|
68
69
|
end
|
69
70
|
end
|
71
|
+
|
72
|
+
def inspect
|
73
|
+
@rule.name.inspect
|
74
|
+
end
|
70
75
|
end
|
71
76
|
|
72
77
|
class Top < Graph::Node
|
@@ -87,6 +92,10 @@ module Teapot
|
|
87
92
|
def requires_update?
|
88
93
|
true
|
89
94
|
end
|
95
|
+
|
96
|
+
def inspect
|
97
|
+
@task_class.name.inspect
|
98
|
+
end
|
90
99
|
end
|
91
100
|
|
92
101
|
class Task < Graph::Task
|
@@ -139,7 +148,9 @@ module Teapot
|
|
139
148
|
|
140
149
|
def visit
|
141
150
|
super do
|
151
|
+
@controller.enter(self, @node)
|
142
152
|
@node.apply!(self)
|
153
|
+
@controller.exit(self, @node)
|
143
154
|
end
|
144
155
|
end
|
145
156
|
end
|
@@ -161,6 +172,8 @@ module Teapot
|
|
161
172
|
|
162
173
|
attr :top
|
163
174
|
|
175
|
+
attr :visualisation
|
176
|
+
|
164
177
|
# Because we do a depth first traversal, we can capture global state per branch, such as `@task_class`.
|
165
178
|
def traverse!(walker)
|
166
179
|
@top.each do |node|
|
@@ -186,15 +199,54 @@ module Teapot
|
|
186
199
|
end
|
187
200
|
end
|
188
201
|
|
202
|
+
def enter(task, node)
|
203
|
+
return unless @g
|
204
|
+
|
205
|
+
parent_node = @hierarchy.last
|
206
|
+
|
207
|
+
task_node = @g.nodes[node] || @g.add_node(node, shape: 'box')
|
208
|
+
|
209
|
+
if parent_node
|
210
|
+
parent_node.connect(task_node)
|
211
|
+
end
|
212
|
+
|
213
|
+
node.inputs.map{|path| path.shortest_path(Dir.pwd)}.each do |path|
|
214
|
+
input_node = @g.nodes[path.to_s] || @g.add_node(path.to_s, shape: 'box')
|
215
|
+
input_node.connect(task_node)
|
216
|
+
end
|
217
|
+
|
218
|
+
@hierarchy << task_node
|
219
|
+
end
|
220
|
+
|
221
|
+
def exit(task, node)
|
222
|
+
return unless @g
|
223
|
+
|
224
|
+
@hierarchy.pop
|
225
|
+
|
226
|
+
task_node = @g.nodes[node] || @g.add_node(node, shape: 'box')
|
227
|
+
|
228
|
+
node.outputs.map{|path| path.shortest_path(Dir.pwd)}.each do |path|
|
229
|
+
output_node = @g.nodes[path.to_s] || @g.add_node(path.to_s, shape: 'box')
|
230
|
+
output_node.connect(task_node)
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
189
234
|
def update!
|
190
235
|
group = Process::Group.new
|
191
236
|
|
237
|
+
@g = Graphviz::Graph.new('G', rankdir: "LR")
|
238
|
+
@hierarchy = []
|
239
|
+
|
192
240
|
walker = super do |walker, node|
|
193
241
|
@task_class.new(self, walker, node, group)
|
194
242
|
end
|
195
243
|
|
196
244
|
group.wait
|
197
245
|
|
246
|
+
if ENV['BUILD_GRAPH_PDF']
|
247
|
+
Graphviz::output(@g, path: ENV['BUILD_GRAPH_PDF']) rescue nil
|
248
|
+
end
|
249
|
+
|
198
250
|
return walker
|
199
251
|
end
|
200
252
|
end
|
data/lib/teapot/context.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
# Copyright, 2012, by Samuel G. D. Williams. <http://www.codeotaku.com>
|
2
|
-
#
|
2
|
+
#
|
3
3
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
4
|
# of this software and associated documentation files (the "Software"), to deal
|
5
5
|
# in the Software without restriction, including without limitation the rights
|
6
6
|
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
7
|
# copies of the Software, and to permit persons to whom the Software is
|
8
8
|
# furnished to do so, subject to the following conditions:
|
9
|
-
#
|
9
|
+
#
|
10
10
|
# The above copyright notice and this permission notice shall be included in
|
11
11
|
# all copies or substantial portions of the Software.
|
12
|
-
#
|
12
|
+
#
|
13
13
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
14
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
15
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
@@ -35,7 +35,7 @@ module Teapot
|
|
35
35
|
def self.check(definition, definitions)
|
36
36
|
previous = definitions[definition.name]
|
37
37
|
|
38
|
-
raise new(definition, previous) if previous
|
38
|
+
raise self.new(definition, previous) if previous
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
@@ -21,6 +21,8 @@
|
|
21
21
|
require 'teapot/controller'
|
22
22
|
require 'teapot/build'
|
23
23
|
|
24
|
+
$TEAPOT_DEBUG_GRAPH = false
|
25
|
+
|
24
26
|
module Teapot
|
25
27
|
class Controller
|
26
28
|
class BuildFailedError < StandardError
|
@@ -45,24 +47,33 @@ module Teapot
|
|
45
47
|
end
|
46
48
|
end
|
47
49
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
50
|
+
walker = nil
|
51
|
+
|
52
|
+
# We need to catch interrupt here, and exit with the correct exit code:
|
53
|
+
begin
|
54
|
+
controller.run do
|
55
|
+
# The graph has been dirtied because files have changed, traverse and update it:
|
56
|
+
walker = controller.update_with_log
|
57
|
+
|
58
|
+
if $TEAPOT_DEBUG_GRAPH
|
59
|
+
controller.nodes.each do |key, node|
|
60
|
+
puts "#{node.status} #{node.inspect}" unless node.clean?
|
61
|
+
end
|
56
62
|
end
|
57
63
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
+
# Only run once is asked:
|
65
|
+
unless @options[:continuous]
|
66
|
+
if walker.failed?
|
67
|
+
raise BuildFailedError.new("Failed to build all nodes successfully!")
|
68
|
+
end
|
69
|
+
|
70
|
+
break
|
64
71
|
end
|
65
72
|
end
|
73
|
+
rescue Interrupt
|
74
|
+
if walker && walker.failed?
|
75
|
+
raise BuildFailedError.new("Failed to build all nodes successfully!")
|
76
|
+
end
|
66
77
|
end
|
67
78
|
|
68
79
|
return chain, ordered
|
data/lib/teapot/dependency.rb
CHANGED
@@ -37,6 +37,14 @@ module Teapot
|
|
37
37
|
Provision = Struct.new(:value)
|
38
38
|
Alias = Struct.new(:dependencies)
|
39
39
|
|
40
|
+
def priority= value
|
41
|
+
@priority = value
|
42
|
+
end
|
43
|
+
|
44
|
+
def priority
|
45
|
+
@priority || 0
|
46
|
+
end
|
47
|
+
|
40
48
|
def provides?(name)
|
41
49
|
provisions.key? name
|
42
50
|
end
|
@@ -72,7 +80,7 @@ module Teapot
|
|
72
80
|
end
|
73
81
|
|
74
82
|
class Chain
|
75
|
-
def initialize(selection, dependencies, providers)
|
83
|
+
def initialize(selection, dependencies, providers, options = {})
|
76
84
|
# Explicitly selected targets which will be used when resolving ambiguity:
|
77
85
|
@selection = Set.new(selection)
|
78
86
|
|
@@ -88,6 +96,8 @@ module Teapot
|
|
88
96
|
@unresolved = []
|
89
97
|
@conflicts = {}
|
90
98
|
|
99
|
+
@options = options
|
100
|
+
|
91
101
|
@dependencies.each do |dependency|
|
92
102
|
expand(dependency, "<top>")
|
93
103
|
end
|
@@ -105,6 +115,25 @@ module Teapot
|
|
105
115
|
|
106
116
|
private
|
107
117
|
|
118
|
+
def ignore_priority?
|
119
|
+
@options[:ignore_priority]
|
120
|
+
end
|
121
|
+
|
122
|
+
def filter_by_priority(viable_providers)
|
123
|
+
# Sort from highest priority to lowest priority:
|
124
|
+
viable_providers = viable_providers.sort{|a,b| b.priority <=> a.priority}
|
125
|
+
|
126
|
+
# The first item has the highest priority:
|
127
|
+
highest_priority = viable_providers.first.priority
|
128
|
+
|
129
|
+
# We compute all providers with the same highest priority (may be zero):
|
130
|
+
return viable_providers.take_while{|provider| provider.priority == highest_priority}
|
131
|
+
end
|
132
|
+
|
133
|
+
def filter_by_selection(viable_providers)
|
134
|
+
return viable_providers.select{|provider| @selection.include? provider.name}
|
135
|
+
end
|
136
|
+
|
108
137
|
def find_provider(dependency, parent)
|
109
138
|
# Mostly, only one package will satisfy the dependency...
|
110
139
|
viable_providers = @providers.select{|provider| provider.provides? dependency}
|
@@ -113,9 +142,17 @@ module Teapot
|
|
113
142
|
|
114
143
|
if viable_providers.size > 1
|
115
144
|
# ... however in some cases (typically where aliases are being used) an explicit selection must be made for the build to work correctly.
|
116
|
-
explicit_providers = viable_providers
|
117
|
-
|
145
|
+
explicit_providers = filter_by_selection(viable_providers)
|
146
|
+
|
118
147
|
# puts "** Filtering to #{explicit_providers.collect(&:name).join(', ')} explicit providers.".color(:magenta)
|
148
|
+
|
149
|
+
if explicit_providers.size != 1 and !ignore_priority?
|
150
|
+
# If we were unable to select a single package, we may use the priority to limit the number of possible options:
|
151
|
+
explicit_providers = viable_providers if explicit_providers.empty?
|
152
|
+
|
153
|
+
explicit_providers = filter_by_priority(explicit_providers)
|
154
|
+
end
|
155
|
+
|
119
156
|
|
120
157
|
if explicit_providers.size == 0
|
121
158
|
# No provider was explicitly specified, thus we require explicit conflict resolution:
|
@@ -1,15 +1,15 @@
|
|
1
1
|
# Copyright, 2012, by Samuel G. D. Williams. <http://www.codeotaku.com>
|
2
|
-
#
|
2
|
+
#
|
3
3
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
4
|
# of this software and associated documentation files (the "Software"), to deal
|
5
5
|
# in the Software without restriction, including without limitation the rights
|
6
6
|
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
7
|
# copies of the Software, and to permit persons to whom the Software is
|
8
8
|
# furnished to do so, subject to the following conditions:
|
9
|
-
#
|
9
|
+
#
|
10
10
|
# The above copyright notice and this permission notice shall be included in
|
11
11
|
# all copies or substantial portions of the Software.
|
12
|
-
#
|
12
|
+
#
|
13
13
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
14
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
15
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
@@ -18,8 +18,6 @@
|
|
18
18
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
19
|
# THE SOFTWARE.
|
20
20
|
|
21
|
-
require 'rexec/environment'
|
22
|
-
|
23
21
|
require 'rainbow'
|
24
22
|
require 'rainbow/ext/string'
|
25
23
|
|
data/lib/teapot/rule.rb
CHANGED
@@ -44,26 +44,15 @@ module Teapot
|
|
44
44
|
dynamic? and @options[:implicit]
|
45
45
|
end
|
46
46
|
|
47
|
-
|
48
|
-
|
47
|
+
# Optional parameters are those that are either defined as optional or implicit.
|
48
|
+
def optional?
|
49
|
+
@options[:optional] || implicit?
|
49
50
|
end
|
50
51
|
|
51
52
|
def applicable? arguments
|
52
|
-
|
53
|
-
|
54
|
-
return
|
55
|
-
end
|
56
|
-
|
57
|
-
value = arguments[@name]
|
58
|
-
|
59
|
-
# If the parameter is optional, and wasn't provided, we are okay.
|
60
|
-
if @options[:optional]
|
61
|
-
return true if value == nil
|
62
|
-
end
|
63
|
-
|
64
|
-
# If the parameter is typed, and we don't match the expected type, we fail.
|
65
|
-
if type = @options[:typed]
|
66
|
-
return false unless type === value
|
53
|
+
value = arguments.fetch(@name) do
|
54
|
+
# Value couldn't be found, if it wasn't optional, this parameter didn't apply:
|
55
|
+
return optional?
|
67
56
|
end
|
68
57
|
|
69
58
|
# If a pattern is provided, we must match it.
|
@@ -76,8 +65,10 @@ module Teapot
|
|
76
65
|
|
77
66
|
def compute(arguments, scope)
|
78
67
|
if implicit?
|
79
|
-
|
68
|
+
# Can be replaced if supplied:
|
69
|
+
arguments[@name] || scope.instance_exec(arguments, &@dynamic)
|
80
70
|
elsif dynamic?
|
71
|
+
# Argument is optional:
|
81
72
|
scope.instance_exec(arguments[@name], arguments, &@dynamic)
|
82
73
|
else
|
83
74
|
arguments[@name]
|
data/lib/teapot/version.rb
CHANGED
@@ -29,6 +29,10 @@ module Teapot::DependencySpec
|
|
29
29
|
end
|
30
30
|
|
31
31
|
attr :name
|
32
|
+
|
33
|
+
def inspect
|
34
|
+
"<BasicDependency:#{@name}>"
|
35
|
+
end
|
32
36
|
end
|
33
37
|
|
34
38
|
describe Teapot::Dependency do
|
@@ -109,5 +113,51 @@ module Teapot::DependencySpec
|
|
109
113
|
expect(chain.conflicts).to be == {}
|
110
114
|
expect(chain.ordered).to be == [[apple, "apple"], [salad, "salad"]]
|
111
115
|
end
|
116
|
+
|
117
|
+
it "should select dependencies with high priority" do
|
118
|
+
bad_apple = BasicDependency.new('bad_apple')
|
119
|
+
bad_apple.provides 'apple'
|
120
|
+
bad_apple.priority = 20
|
121
|
+
|
122
|
+
good_apple = BasicDependency.new('good_apple')
|
123
|
+
good_apple.provides 'apple'
|
124
|
+
good_apple.priority = 40
|
125
|
+
|
126
|
+
chain = Teapot::Dependency::chain([], ['apple'], [bad_apple, good_apple])
|
127
|
+
|
128
|
+
expect(chain.unresolved).to be == []
|
129
|
+
expect(chain.conflicts).to be == {}
|
130
|
+
|
131
|
+
# Should select higher priority package by default:
|
132
|
+
expect(chain.ordered).to be == [[good_apple, 'apple']]
|
133
|
+
end
|
134
|
+
|
135
|
+
it "should expose direct dependencies" do
|
136
|
+
system = BasicDependency.new('linux')
|
137
|
+
system.provides 'linux'
|
138
|
+
system.provides 'clang'
|
139
|
+
system.provides system: 'linux'
|
140
|
+
system.provides compiler: 'clang'
|
141
|
+
|
142
|
+
library = BasicDependency.new('library')
|
143
|
+
library.provides 'library'
|
144
|
+
library.depends :system
|
145
|
+
library.depends :compiler
|
146
|
+
|
147
|
+
application = BasicDependency.new('application')
|
148
|
+
application.provides 'application'
|
149
|
+
application.depends :compiler
|
150
|
+
application.depends 'library'
|
151
|
+
|
152
|
+
chain = Teapot::Dependency::chain([], ['application'], [system, library, application])
|
153
|
+
|
154
|
+
expect(chain.unresolved).to be == []
|
155
|
+
expect(chain.conflicts).to be == {}
|
156
|
+
expect(chain.ordered).to be == [
|
157
|
+
[system, 'clang'],
|
158
|
+
[library, 'library'],
|
159
|
+
[application, 'application']
|
160
|
+
]
|
161
|
+
end
|
112
162
|
end
|
113
163
|
end
|
data/teapot.gemspec
CHANGED
@@ -24,6 +24,8 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
25
25
|
spec.require_paths = ["lib"]
|
26
26
|
|
27
|
+
spec.has_rdoc = 'yard'
|
28
|
+
|
27
29
|
spec.required_ruby_version = '>= 2.0'
|
28
30
|
|
29
31
|
spec.add_dependency "rainbow", "~> 2.0.0"
|
@@ -31,9 +33,9 @@ Gem::Specification.new do |spec|
|
|
31
33
|
|
32
34
|
spec.add_dependency "system", "~> 0.1.3"
|
33
35
|
|
34
|
-
spec.add_dependency "graphviz", "~> 0.0
|
36
|
+
spec.add_dependency "graphviz", "~> 0.1.0"
|
35
37
|
|
36
|
-
spec.add_dependency "build-files", "~> 0.2.
|
38
|
+
spec.add_dependency "build-files", "~> 0.2.9"
|
37
39
|
spec.add_dependency "build-graph", "~> 0.3.5"
|
38
40
|
spec.add_dependency "build-makefile", "~> 0.2.0"
|
39
41
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: teapot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.pre.
|
4
|
+
version: 1.0.0.pre.rc9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samuel Williams
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-10-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rainbow
|
@@ -58,28 +58,28 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0.0
|
61
|
+
version: 0.1.0
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 0.0
|
68
|
+
version: 0.1.0
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: build-files
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 0.2.
|
75
|
+
version: 0.2.9
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 0.2.
|
82
|
+
version: 0.2.9
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: build-graph
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|