teapot 0.7.2 → 0.7.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZTQyYjk5NWYwZDFhYTJiMmZjOWEzYmE3MGY2ODM2YTBhM2I5NTU2Ng==
4
+ ZTYzMjgzYTc0NDJhNWYyMmVjMWM4ZTBkMWUxM2Y4MDgyNmU1OTI4OA==
5
5
  data.tar.gz: !binary |-
6
- N2NhM2YzMWViNGNjMGVkNWZlMjZmNDMxNzM2NDNhMWU0N2Y5ZmQ4ZQ==
6
+ ZDExZGU3NmRmMWMxYjE3MmFlNjY1ZTJkZWUzMmVmZjdlNmRlNjlmYg==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- OTRmYmYzN2M4YzRhYmJmMGE5MTY0ZDdlYmI1MGQyMjRhZWYxMzQ2OTg3ODQx
10
- ODg3ZTFhYWE2NDBkNzcwYTYzNzlmODRlNGQ2ZTZkYWJiZGE5OTc0ZWQ4N2Yz
11
- Njk0YjYzNzliMjkyZDdmNDE1NGZjZmM1MThmNWZjZmQ3OWRlMjk=
9
+ NWRlNzAwY2Y4YjUwYjY5YmFjOTExNmIzN2RlNjFlOWRkNGQ2MzUxZmQ4OWMx
10
+ MTFmYzcwODUxZTBlNTI2MDkzMDYzZjEwNWYwMjY0NDFjOWY4MDFjMjcyNjNh
11
+ NjZlOGQ0NzdlYjBjMWIxZTU3MzM4MDdkYzVhNWU0NDZmNDY4ZTc=
12
12
  data.tar.gz: !binary |-
13
- NmNjMGYyNjlkNTY4YmI5YmI5YmI3YmIzYWJiNTRiODFlMzc2M2U0MmYwOWQ2
14
- MmI0ZTM2N2M3NTE2ZjFiYWE1NWJmYTlkMzdlZTIyNDUxYTM2MzIwYmFlMThk
15
- MzUwYjU0ZDBjMTdkZjMwNDhiMzdmM2E1NzAyNzA1YmJiODAxNmE=
13
+ NGQxYzFiZGVlNDk1NmZhYTI5NWVlNmFjMjczYjlkYTEyM2VmNGE3YjQ4ZjEx
14
+ Y2UwM2QwYjMzZWExM2JiY2RiNDIzN2VmNTljZGQyMDUxY2Y3NmZiZDVhODlh
15
+ YjY0MGM0Y2E0NmZkMzg4ODdhYmYxODlkZjMxNjFmNjk2NGUwNGY=
data/bin/teapot CHANGED
@@ -35,7 +35,7 @@ OPTIONS = Trollop::options do
35
35
  opt :only, "Only compiled direct dependencies."
36
36
  opt :in, "Work in the given directory.", :type => :string
37
37
 
38
- opt :configuration, "Specify a specific build configuration.", :type => :string, :default => Teapot::DEFAULT_CONFIGURATION_NAME
38
+ opt :configuration, "Specify a specific build configuration.", :type => :string
39
39
  end
40
40
 
41
41
  def make_controller(root = nil)
@@ -109,6 +109,22 @@ time = Benchmark.measure do
109
109
  $stderr.puts error.message.color(:red)
110
110
  rescue Teapot::Commands::CommandError => error
111
111
  $stderr.puts error.message.color(:red)
112
+ rescue Teapot::Dependency::UnresolvedDependencyError => error
113
+ $stderr.puts "Unresolved dependencies:"
114
+
115
+ error.chain.unresolved.each do |(name, parent)|
116
+ $stderr.puts "#{parent} depends on #{name.inspect}".color(:red)
117
+
118
+ conflicts = error.chain.conflicts[name]
119
+
120
+ if conflicts
121
+ conflicts.each do |conflict|
122
+ $stderr.puts " - provided by #{conflict.inspect}".color(:red)
123
+ end
124
+ end
125
+ end
126
+
127
+ $stderr.puts "Cannot continue due to unresolved dependencies!".color(:red)
112
128
  end
113
129
  end
114
130
 
@@ -144,10 +144,10 @@ module Teapot
144
144
 
145
145
  # Enumerate all imports and attempt to resolve the packages:
146
146
  @imports.each do |import|
147
- resolved_configuration = @context.configuration_named(import.name)
147
+ named_configuration = @context.configurations[import.name]
148
148
 
149
- if resolved_configuration
150
- configuration.append(resolved_configuration, import.options)
149
+ if named_configuration
150
+ configuration.append(named_configuration.materialize, import.options)
151
151
  else
152
152
  # It couldn't be resolved...
153
153
  configuration.imports << import
@@ -55,7 +55,17 @@ module Teapot
55
55
  defined = load(root_package)
56
56
 
57
57
  # Find the default configuration, if it exists:
58
+
58
59
  @default_configuration = defined.default_configuration
60
+
61
+ if options[:configuration]
62
+ @configuration = @configurations[options[:configuration]]
63
+ else
64
+ @configuration = @default_configuration
65
+ end
66
+
67
+ # Materialize the configuration:
68
+ @configuration = @configuration.materialize if @configuration
59
69
  end
60
70
 
61
71
  attr :root
@@ -63,8 +73,16 @@ module Teapot
63
73
 
64
74
  attr :targets
65
75
  attr :generators
76
+
77
+ # All public configurations.
66
78
  attr :configurations
67
79
 
80
+ # The context's primary configuration.
81
+ attr :configuration
82
+
83
+ attr :dependencies
84
+ attr :selection
85
+
68
86
  def select(names)
69
87
  names.each do |name|
70
88
  if @targets.key? name
@@ -75,8 +93,13 @@ module Teapot
75
93
  end
76
94
  end
77
95
 
78
- attr :dependencies
79
- attr :selection
96
+ def dependency_chain(dependency_names, configuration = @configuration)
97
+ configuration.load_all
98
+
99
+ select(dependency_names)
100
+
101
+ Dependency::chain(@selection, @dependencies, @targets.values)
102
+ end
80
103
 
81
104
  def direct_targets(ordered)
82
105
  @dependencies.collect do |dependency|
@@ -125,20 +148,6 @@ module Teapot
125
148
  end
126
149
  end
127
150
 
128
- attr :default_configuration
129
-
130
- def configuration_named(name)
131
- if name == DEFAULT_CONFIGURATION_NAME
132
- configuration = @default_configuration
133
- else
134
- configuration = @configurations[name]
135
- end
136
-
137
- if configuration
138
- configuration.materialize
139
- end
140
- end
141
-
142
151
  def unresolved(packages)
143
152
  failed_to_load = Set.new
144
153
 
@@ -22,35 +22,9 @@ require 'teapot/controller'
22
22
 
23
23
  module Teapot
24
24
  class Controller
25
- def build(package_names)
26
- context, configuration = load_teapot
25
+ def build(dependency_names)
26
+ chain = context.dependency_chain(dependency_names, context.configuration)
27
27
 
28
- configuration.load_all
29
-
30
- context.select(package_names)
31
-
32
- chain = Dependency::chain(context.selection, context.dependencies, context.targets.values)
33
-
34
- if chain.unresolved.size > 0
35
- log "Unresolved dependencies:"
36
-
37
- chain.unresolved.each do |(name, parent)|
38
- log "#{parent} depends on #{name.inspect}".color(:red)
39
-
40
- conflicts = chain.conflicts[name]
41
-
42
- if conflicts
43
- conflicts.each do |conflict|
44
- log " - provided by #{conflict.inspect}".color(:red)
45
- end
46
- end
47
- end
48
-
49
- abort "Cannot continue build due to unresolved dependencies!".color(:red)
50
- end
51
-
52
- log "Resolved: #{chain.resolved.inspect}".color(:magenta)
53
-
54
28
  ordered = chain.ordered
55
29
 
56
30
  if @options[:only]
@@ -61,7 +35,7 @@ module Teapot
61
35
  log "Building #{target.name} for dependency #{dependency}...".color(:cyan)
62
36
 
63
37
  if target.respond_to?(:build!) and !@options[:dry]
64
- target.build!(configuration)
38
+ target.build!(context.configuration)
65
39
  end
66
40
  end
67
41
 
@@ -23,13 +23,11 @@ require 'teapot/controller'
23
23
  module Teapot
24
24
  class Controller
25
25
  def clean
26
- context, configuration = load_teapot
27
-
28
26
  log "Removing #{configuration.platforms_path}...".color(:cyan)
29
- FileUtils.rm_rf configuration.platforms_path
27
+ FileUtils.rm_rf context.configuration.platforms_path
30
28
 
31
29
  log "Removing #{configuration.packages_path}...".color(:cyan)
32
- FileUtils.rm_rf configuration.packages_path
30
+ FileUtils.rm_rf context.configuration.packages_path
33
31
  end
34
32
  end
35
33
  end
@@ -56,8 +56,6 @@ module Teapot
56
56
  private
57
57
 
58
58
  def generate_project(project_name)
59
- context, configuration = load_teapot
60
-
61
59
  if context.generators.key? 'project'
62
60
  generate('project', [project_name])
63
61
  end
@@ -23,9 +23,8 @@ require 'teapot/controller'
23
23
  module Teapot
24
24
  class Controller
25
25
  def fetch
26
- context, configuration = load_teapot
27
-
28
26
  resolved = Set.new
27
+ configuration = context.configuration
29
28
  unresolved = context.unresolved(configuration.packages)
30
29
  tries = 0
31
30
 
@@ -23,9 +23,7 @@ require 'teapot/controller'
23
23
  module Teapot
24
24
  class Controller
25
25
  def generate(name, arguments)
26
- context, configuration = load_teapot
27
-
28
- configuration.load_all
26
+ context.configuration.load_all
29
27
 
30
28
  generator = context.generators[name]
31
29
 
@@ -23,10 +23,8 @@ require 'teapot/controller'
23
23
  module Teapot
24
24
  class Controller
25
25
  def list
26
- context, configuration = load_teapot
27
-
28
26
  # Should this somehow consider context.root_package?
29
- configuration.packages.each do |package|
27
+ context.configuration.packages.each do |package|
30
28
  log "Package #{package.name} (from #{package.path}):".bright
31
29
 
32
30
  begin
@@ -42,15 +42,10 @@ module Teapot
42
42
  @log_output.puts *args
43
43
  end
44
44
 
45
- private
46
-
47
- def load_teapot
48
- configuration_name = @options[:configuration] || DEFAULT_CONFIGURATION_NAME
49
-
50
- context = Context.new(@root)
51
- configuration = context.configuration_named(configuration_name)
52
-
53
- return context, configuration
45
+ def context
46
+ @context ||= Context.new(@root,
47
+ :configuration => @options[:configuration]
48
+ )
54
49
  end
55
50
  end
56
51
  end
@@ -24,6 +24,16 @@ require 'teapot/environment'
24
24
 
25
25
  module Teapot
26
26
  module Dependency
27
+ class UnresolvedDependencyError < StandardError
28
+ def initialize(chain)
29
+ super "Unresolved dependency chain!"
30
+
31
+ @chain = chain
32
+ end
33
+
34
+ attr :chain
35
+ end
36
+
27
37
  Provision = Struct.new(:value)
28
38
  Alias = Struct.new(:dependencies)
29
39
 
@@ -149,10 +159,10 @@ module Teapot
149
159
 
150
160
  # We will now satisfy this dependency by satisfying any dependent dependencies, but we no longer need to revisit this one.
151
161
  @resolved << dependency
152
-
162
+
153
163
  if Alias === provision
154
164
  # puts "** Resolving alias #{provision}".color(:magenta)
155
-
165
+
156
166
  provision.dependencies.each do |dependency|
157
167
  expand(dependency, provider)
158
168
  end
@@ -160,23 +170,30 @@ module Teapot
160
170
  # puts "** Appending #{dependency} -> provisions".color(:magenta)
161
171
  @provisions << provision
162
172
  end
163
-
173
+
164
174
  unless @resolved.include?(provider)
165
175
  # We are now satisfying the provider by expanding all its own dependencies:
166
176
  @resolved << provider
167
-
177
+
168
178
  provider.dependencies.each do |dependency|
169
179
  expand(dependency, provider)
170
180
  end
171
-
181
+
172
182
  # puts "** Appending #{dependency} -> ordered".color(:magenta)
173
183
  @ordered << [provider, dependency]
174
184
  end
175
185
  end
176
186
  end
177
187
 
188
+ # An `UnresolvedDependencyError` will be thrown if there are any unresolved dependencies.
178
189
  def self.chain(selection, dependencies, providers)
179
- Chain.new(selection, dependencies, providers)
190
+ chain = Chain.new(selection, dependencies, providers)
191
+
192
+ if chain.unresolved.size > 0
193
+ raise UnresolvedDependencyError.new(chain)
194
+ end
195
+
196
+ return chain
180
197
  end
181
198
  end
182
199
  end
@@ -76,7 +76,7 @@ module Teapot
76
76
  end
77
77
 
78
78
  def apply(text)
79
- return text unless @ordered.count
79
+ return text unless @ordered.count > 0
80
80
 
81
81
  grouped = [[@ordered.first]]
82
82
 
data/lib/teapot/target.rb CHANGED
@@ -44,9 +44,7 @@ module Teapot
44
44
  @build = Proc.new(&block)
45
45
  end
46
46
 
47
- def build!(configuration, config = {})
48
- return unless @build
49
-
47
+ def build_environment(configuration)
50
48
  # Reduce the number of keystrokes for good health:
51
49
  context = configuration.context
52
50
 
@@ -54,9 +52,6 @@ module Teapot
54
52
 
55
53
  environments = []
56
54
 
57
- # The base configuration environment:
58
- # environments << configuration.environment
59
-
60
55
  # Calculate the dependency chain's ordered environments:
61
56
  environments += chain.provisions.collect do |provision|
62
57
  Environment.new(&provision.value)
@@ -68,7 +63,7 @@ module Teapot
68
63
  # Merge all the environments together:
69
64
  environment = Environment.combine(*environments)
70
65
 
71
- local_build = environment.merge do
66
+ environment.merge do
72
67
  default platforms_path configuration.platforms_path
73
68
  default build_prefix {platforms_path + "cache/#{platform_name}-#{variant}"}
74
69
  default install_prefix {platforms_path + "#{platform_name}-#{variant}"}
@@ -76,8 +71,14 @@ module Teapot
76
71
  append buildflags {"-I#{install_prefix + "include"}"}
77
72
  append linkflags {"-L#{install_prefix + "lib"}"}
78
73
  end
74
+ end
75
+
76
+ def build!(configuration)
77
+ return unless @build
78
+
79
+ local_environment = build_environment(configuration)
79
80
 
80
- @build.call(local_build)
81
+ @build.call(local_environment)
81
82
  end
82
83
  end
83
84
  end
@@ -19,5 +19,5 @@
19
19
  # THE SOFTWARE.
20
20
 
21
21
  module Teapot
22
- VERSION = "0.7.2"
22
+ VERSION = "0.7.3"
23
23
  end
@@ -84,11 +84,11 @@ class TestDependency < Test::Unit::TestCase
84
84
  salad.depends 'fruit'
85
85
  salad.provides 'salad'
86
86
 
87
- chain = Teapot::Dependency::chain([], ['salad'], [apple, bananna, salad])
87
+ chain = Teapot::Dependency::Chain.new([], ['salad'], [apple, bananna, salad])
88
88
  assert_equal ["fruit", salad], chain.unresolved.first
89
89
  assert_equal({"fruit" => [apple, bananna]}, chain.conflicts)
90
90
 
91
- chain = Teapot::Dependency::chain(['apple'], ['salad'], [apple, bananna, salad])
91
+ chain = Teapot::Dependency::Chain.new(['apple'], ['salad'], [apple, bananna, salad])
92
92
  assert_equal([], chain.unresolved)
93
93
  assert_equal({}, chain.conflicts)
94
94
  end
data/test/test_teapot.rb CHANGED
@@ -36,7 +36,7 @@ class TestConfig < Test::Unit::TestCase
36
36
  # No targets were defined:
37
37
  assert_equal 0, context.targets.count
38
38
 
39
- default_configuration = context.default_configuration
39
+ default_configuration = context.configuration
40
40
 
41
41
  # 13 defined packages + 1 implicit package.
42
42
  assert_equal 14, default_configuration.packages.count
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: 0.7.2
4
+ version: 0.7.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-03-31 00:00:00.000000000 Z
11
+ date: 2013-04-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rainbow