teapot 0.7.2 → 0.7.3

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 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