teapot 2.0.0.pre.rc2 → 2.0.0.pre.rc3

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,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 24912ef656102df52a040fe466fe1a9309b28272
4
- data.tar.gz: af550a07ad4b0e6a8f95c56931df06912c38b5e7
3
+ metadata.gz: 5c635c63b5b441f820b32101a3a3389eff2ef81e
4
+ data.tar.gz: 859cf5553f07d00409b76bcbadf81dae90c9dcb9
5
5
  SHA512:
6
- metadata.gz: 637f5057b544d7e48c0bcb65c3357498f1f9a688fbff2fdfc02343a7c9d9513c7e36303a577ce68052af5494e50f799b48ca6deaa165de6edc7b9d05b7bc376d
7
- data.tar.gz: 99b568ab22dfb5e7185b48d6f6b1a6d96c5fc17bf8da80feccff1bd4d206bc07983c963c47f0aa14635d22d04f6d3d88812321983fadfe5f95f4d3caefa5c9a9
6
+ metadata.gz: cd2eef8a30f2efd10420a2c786beebc400623807d19d64465540c839f9b5fceeae59c7d0b42fa0d8924c01224de3def5ae0e4e64b5a66cdb4407db28fb85ed2d
7
+ data.tar.gz: 4ca2c4261051631ae374f671346c683d59b79002064e5b9d88a3108633fc976ab00dc1ef837f2334df69dd8b360e3c8f72e53d0ae48b63b8e89dde7cec485c43
@@ -20,5 +20,7 @@
20
20
 
21
21
  require "teapot/version"
22
22
 
23
+ require "teapot/context"
24
+
23
25
  module Teapot
24
26
  end
@@ -39,10 +39,19 @@ module Teapot
39
39
  many :targets, "Build these targets, or use them to help the dependency resolution process."
40
40
  split :argv, "Arguments passed to child process(es) of build if any."
41
41
 
42
+ # The targets to build:
43
+ def dependency_names(context)
44
+ if @targets.any?
45
+ @targets
46
+ else
47
+ context.configuration.targets[:build]
48
+ end
49
+ end
50
+
42
51
  def invoke(parent)
43
52
  context = parent.context
44
53
 
45
- chain = context.dependency_chain(@targets, context.configuration)
54
+ chain = context.dependency_chain(dependency_names(context), context.configuration)
46
55
 
47
56
  ordered = chain.ordered
48
57
 
@@ -57,7 +66,7 @@ module Teapot
57
66
  if target.build
58
67
  environment = target.environment(context.configuration, chain)
59
68
 
60
- controller.add_target(target, environment.flatten, @argv)
69
+ controller.add_target(target, environment.flatten, self.argv)
61
70
  end
62
71
  end
63
72
  end
@@ -29,18 +29,10 @@ module Teapot
29
29
  class Create < Samovar::Command
30
30
  self.description = "Create a new teapot package using the specified repository."
31
31
 
32
- options do
33
- option "-t/--target-name <name>", "The target to use to create the project", default: 'Generate/Project/Initial'
34
- end
35
-
36
32
  one :project_name, "The name of the new project in title-case, e.g. 'My Project'."
37
33
  one :source, "The source repository to use for fetching packages, e.g. https://github.com/kurocha."
38
34
  many :packages, "Any additional packages you'd like to include in the project."
39
35
 
40
- def target_name
41
- @options[:target_name]
42
- end
43
-
44
36
  def invoke(parent)
45
37
  logger = parent.logger
46
38
 
@@ -64,14 +56,22 @@ module Teapot
64
56
 
65
57
  context = nested.context
66
58
 
67
- Build[target_name, *@packages, '--', project_name].invoke(nested)
59
+ # The targets to build to create the initial project:
60
+ target_names = context.configuration.targets[:create]
68
61
 
69
- # Fetch any additional packages:
70
- Fetch[].invoke(nested)
62
+ if target_names.any?
63
+ # Generate the initial project files:
64
+ Build[*target_names].invoke(nested)
65
+
66
+ # Fetch any additional packages:
67
+ Fetch[].invoke(nested)
68
+ end
71
69
 
70
+ # Stage all files:
72
71
  index = repository.index
73
72
  index.add_all
74
73
 
74
+ # Commit the initial project files:
75
75
  Rugged::Commit.create(repository,
76
76
  tree: index.write_tree(repository),
77
77
  message: "Initial project files.",
@@ -93,19 +93,20 @@ module Teapot
93
93
  output.puts "\# Teapot v#{VERSION} configuration generated at #{Time.now.to_s}", ''
94
94
 
95
95
  output.puts "required_version #{LOADER_VERSION.dump}", ''
96
+
97
+ output.puts "define_project #{name.target.dump} do |project|"
98
+ output.puts "\tproject.title = #{name.text.dump}"
99
+ output.puts "end", ''
96
100
 
97
101
  output.puts "\# Build Targets", ''
98
102
 
99
103
  output.puts "\# Configurations", ''
100
104
 
101
105
  output.puts "define_configuration #{name.target.dump} do |configuration|"
102
-
103
106
  output.puts "\tconfiguration[:source] = #{source.dump}", ''
104
-
105
107
  packages.each do |name|
106
108
  output.puts "\tconfiguration.require #{name.dump}"
107
109
  end
108
-
109
110
  output.puts "end", ''
110
111
  end
111
112
  end
@@ -19,10 +19,20 @@
19
19
  # THE SOFTWARE.
20
20
 
21
21
  require 'samovar'
22
+
22
23
  require 'rugged'
23
24
 
24
25
  module Teapot
25
26
  module Command
27
+ class FetchError < StandardError
28
+ def initialize(package, message)
29
+ super(message)
30
+ @package = package
31
+ end
32
+
33
+ attr :package
34
+ end
35
+
26
36
  class Fetch < Samovar::Command
27
37
  self.description = "Fetch remote packages according to the specified configuration."
28
38
 
@@ -51,7 +61,7 @@ module Teapot
51
61
  next if resolved.include? package
52
62
 
53
63
  # If specific packages were listed, limit updates to them.
54
- if @packages.empty? || @packages.include?(package.name)
64
+ if @packages.nil? || @packages.empty? || @packages.include?(package.name)
55
65
  fetch_package(context, configuration, package, logger, **@options)
56
66
  end
57
67
 
@@ -120,27 +130,55 @@ module Teapot
120
130
  base_uri = URI "file://" + File.expand_path(base_uri.path, context.root) + "/"
121
131
  end
122
132
 
123
- branch = package.options.fetch(:branch, 'master')
133
+ branch_name = package.options.fetch(:branch, 'master')
124
134
 
125
135
  if package_lock
126
136
  logger.info "Package locked to commit: #{package_lock[:branch]}/#{package_lock[:commit]}"
127
137
 
128
- branch = package_lock[:branch]
138
+ branch_name = package_lock[:branch]
139
+ commit_id = package_lock[:commit]
129
140
  end
130
141
 
131
- commit = package_lock ? package_lock[:commit] : nil
132
-
133
142
  if destination_path.exist?
134
143
  logger.info "Updating package at path #{destination_path}...".color(:cyan)
135
144
 
136
145
  repository = Rugged::Repository.new(destination_path.to_s)
137
- repository.checkout(commit || 'origin/master')
146
+
147
+ # Are there uncommitted changes in the work tree?
148
+ if repository.to_enum(:status).any?
149
+ raise FetchError.new(package, "Uncommited local modifications")
150
+ end
151
+
152
+ repository.fetch('origin')
153
+ repository.checkout(branch_name)
154
+
155
+ # Essentially implement git pull:
156
+ if commit_id
157
+ # Lookup the named branch:
158
+ branch = repository.branches[branch_name].resolve
159
+ else
160
+ # Lookup the current branch and upstream commit:
161
+ branch = repository.branches[repository.head.name]
162
+ commit_id = branch.upstream.target_id
163
+ end
164
+
165
+ # Reset it to the requested commit if required:
166
+ repository.reset(commit_id, :hard)
138
167
  else
139
168
  logger.info "Cloning package at path #{destination_path}...".color(:cyan)
140
169
 
141
170
  external_url = package.external_url(context.root)
142
- repository = Rugged::Repository.clone_at(external_url.to_s, destination_path.to_s, checkout_branch: branch)
143
- repository.checkout(commit) if commit
171
+
172
+ # Clone the repository with the specified branch:
173
+ repository = Rugged::Repository.clone_at(external_url.to_s, destination_path.to_s, checkout_branch: branch_name)
174
+
175
+ # Reset it to the requested commit if required:
176
+ repository.reset(commit_id, :hard) if commit_id
177
+ end
178
+
179
+ # Rugged currently doesn't have good (any?) support for submodules, so we diretly invoke git here:
180
+ if repository.submodules.any?
181
+ system("git", "submodule", "update", "--init", "--recursive", chdir: package.path)
144
182
  end
145
183
  end
146
184
 
@@ -48,6 +48,9 @@ module Teapot
48
48
  @imports = IdentitySet.new
49
49
 
50
50
  @visibility = :private
51
+
52
+ # A list of named targets for specific purposes:
53
+ @targets = Hash.new{|hash,key| hash[key] = Array.new}
51
54
  end
52
55
 
53
56
  def freeze
@@ -56,6 +59,8 @@ module Teapot
56
59
  @imports.freeze
57
60
  @visibility.freeze
58
61
 
62
+ @targets.freeze
63
+
59
64
  super
60
65
  end
61
66
 
@@ -70,6 +75,9 @@ module Teapot
70
75
  @visibility = :public
71
76
  end
72
77
 
78
+ # A table of named targets for specific purposes.
79
+ attr :targets
80
+
73
81
  # Options used to bind packages to this configuration.
74
82
  attr :options
75
83
 
@@ -178,7 +186,7 @@ module Teapot
178
186
  # Mark this as resolved
179
187
  imported << import
180
188
 
181
- updated = self.merge(named_configuration, import.options) || updated
189
+ updated = self.update(named_configuration, import.options) || updated
182
190
  else
183
191
  # It couldn't be resolved and hasn't already been resolved...
184
192
  @imports << import
@@ -190,7 +198,7 @@ module Teapot
190
198
  end
191
199
 
192
200
  # Merge an external configuration into this configuration. We won't override already defined packages.
193
- def merge(configuration, options)
201
+ def update(configuration, options)
194
202
  updated = false
195
203
 
196
204
  configuration.packages.each do |external_package|
@@ -214,6 +222,12 @@ module Teapot
214
222
  end
215
223
  end
216
224
 
225
+ configuration.targets.each do |key, value|
226
+ @targets[key] += value
227
+
228
+ updated = true
229
+ end
230
+
217
231
  return updated
218
232
  end
219
233
 
@@ -44,7 +44,7 @@ module Teapot
44
44
  # A context represents a specific root package instance with a given configuration and all related definitions.
45
45
  # A context is stateful in the sense that package selection is specialized based on #select and #dependency_chain. These parameters are usually set up initially as part of the context setup.
46
46
  class Context
47
- def initialize(root, options = {})
47
+ def initialize(root, **options)
48
48
  @root = Path[root]
49
49
  @options = options
50
50
 
@@ -58,9 +58,7 @@ module Teapot
58
58
 
59
59
  @loaded = {}
60
60
 
61
- unless options[:fake]
62
- load_root_package(options)
63
- end
61
+ load_root_package(options) unless options[:load_root] == false
64
62
  end
65
63
 
66
64
  attr :root
@@ -96,7 +94,7 @@ module Teapot
96
94
  substitutions['TEAPOT_VERSION'] = Teapot::VERSION
97
95
 
98
96
  if @project
99
- name = Build::Name.new(@project.name)
97
+ name = @project.name
100
98
 
101
99
  # e.g. Foo Bar, typically used as a title, directory, etc.
102
100
  substitutions['PROJECT_NAME'] = name.text
@@ -31,7 +31,12 @@ module Teapot
31
31
  @authors = []
32
32
  end
33
33
 
34
+ def name
35
+ Build::Name.from_target(@name)
36
+ end
37
+
34
38
  def freeze
39
+ @title.freeze
35
40
  @summary.freeze
36
41
  @license.freeze
37
42
  @website.freeze
@@ -42,6 +47,7 @@ module Teapot
42
47
  super
43
48
  end
44
49
 
50
+ attr_accessor :title
45
51
  attr_accessor :summary
46
52
  attr_accessor :license
47
53
  attr_accessor :website
@@ -19,5 +19,5 @@
19
19
  # THE SOFTWARE.
20
20
 
21
21
  module Teapot
22
- VERSION = "2.0.0-rc2"
22
+ VERSION = "2.0.0-rc3"
23
23
  end
@@ -19,6 +19,11 @@ end
19
19
  require "bundler/setup"
20
20
  require "teapot"
21
21
 
22
+ RSpec.shared_context Teapot::Context do
23
+ let(:root) {Build::Files::Path[__dir__] + 'context'}
24
+ let(:context) {Teapot::Context.new(root, load_root: false)}
25
+ end
26
+
22
27
  RSpec.configure do |config|
23
28
  # Enable flags like --only-failures and --next-failure
24
29
  config.example_status_persistence_file_path = ".rspec_status"
@@ -0,0 +1,107 @@
1
+
2
+ # Copyright, 2016, by Samuel G. D. Williams. <http://www.codeotaku.com>
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ # of this software and associated documentation files (the "Software"), to deal
6
+ # in the Software without restriction, including without limitation the rights
7
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ # copies of the Software, and to permit persons to whom the Software is
9
+ # furnished to do so, subject to the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be included in
12
+ # all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ # THE SOFTWARE.
21
+
22
+ require 'teapot/command'
23
+
24
+ RSpec.describe Teapot::Command::Fetch, order: :defined do
25
+ let(:root) {Build::Files::Path.new(__dir__) + "fetch_spec"}
26
+ let(:project_path) {root + 'test-project'}
27
+ let(:thing_path) {root + "repositories/thing"}
28
+ let(:thing_package_path) {project_path + "teapot/packages/test/thing"}
29
+
30
+ let(:top) {Teapot::Command::Top["--root", project_path.to_s]}
31
+
32
+ context "clean project" do
33
+ subject {top['clean']}
34
+
35
+ it "should delete all packages" do
36
+ expect{subject.invoke}.to_not raise_error
37
+
38
+ expect(File).to_not be_exist(root + "test-project/teapot/packages/test")
39
+ end
40
+
41
+ it "can create thing repository" do
42
+ (thing_path + ".git").delete
43
+
44
+ system("git", "init", chdir: thing_path)
45
+ system("git", "add", "teapot.rb", chdir: thing_path)
46
+ system("git", "commit", "-m", "Teapot file for testing", chdir: thing_path)
47
+ end
48
+
49
+ let(:lockfile_path) {root + "test-project/test-lock.yml"}
50
+
51
+ it "should delete the lock file" do
52
+ lockfile_path.delete
53
+
54
+ expect(File).to_not be_exist(lockfile_path)
55
+ end
56
+ end
57
+
58
+ context "initial fetch" do
59
+ subject {top['fetch']}
60
+
61
+ it "should fetch repositories" do
62
+ expect{subject.invoke}.to_not raise_error
63
+
64
+ # Did the thing package checkout correctly?
65
+ expect(File).to be_exist(root + "test-project/teapot/packages/test/thing/teapot.rb")
66
+ end
67
+
68
+ it "should fetch repositories with no changes" do
69
+ expect{subject.invoke}.to_not raise_error
70
+
71
+ # Did the thing package checkout correctly?
72
+ expect(File).to be_exist(root + "test-project/teapot/packages/test/thing/teapot.rb")
73
+ end
74
+ end
75
+
76
+ context "fetch with worktree modifications" do
77
+ subject {top['fetch']}
78
+ let(:path) {root + "test-project/teapot/packages/test/thing/README.md"}
79
+
80
+ it "can make local modifications" do
81
+ path.write("Hello World")
82
+
83
+ expect(File).to be_exist(path)
84
+ end
85
+
86
+ it "can't fetch with local modifications" do
87
+ expect{subject.invoke}.to raise_error(Teapot::Command::FetchError, /local modifications/)
88
+
89
+ path.delete
90
+ end
91
+ end
92
+
93
+ context "fetch with upstream changes" do
94
+ subject {top['fetch', '--update']}
95
+
96
+ it "can commit upstream changes" do
97
+ system("git", "add", "README.md", chdir: thing_path)
98
+ system("git", "commit", "-m", "Add documentation", chdir: thing_path)
99
+ end
100
+
101
+ it "can fetch changes" do
102
+ expect{subject.invoke}.to_not raise_error
103
+
104
+ expect(File).to be_exist(thing_package_path + "README.md")
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,3 @@
1
+ # Thing
2
+
3
+ This thing is so great.
@@ -0,0 +1,2 @@
1
+
2
+ teapot_version "2.0"
@@ -0,0 +1,8 @@
1
+
2
+ teapot_version "2.0"
3
+
4
+ define_configuration "test" do |configuration|
5
+ configuration[:source] = "../repositories"
6
+
7
+ configuration.require "thing"
8
+ end
@@ -21,21 +21,23 @@
21
21
  require 'teapot/command'
22
22
 
23
23
  RSpec.describe Teapot::Command, order: :defined do
24
- let!(:source) {"https://github.com/kurocha"}
25
- let!(:root) {Build::Files::Path.new(__dir__) + "command_spec"}
26
- let!(:project_name) {"Test Project"}
27
- let!(:project_path) {root + 'test-project'}
24
+ let(:source) {"https://github.com/kurocha"}
25
+ # let(:source) {File.expand_path("../../../../kurocha", __dir__)}
26
+ let(:root) {Build::Files::Path.new(__dir__) + "command_spec"}
27
+ let(:project_name) {"Test Project"}
28
+ let(:project_path) {root + 'test-project'}
28
29
 
29
30
  let(:top) {Teapot::Command::Top["--root", project_path.to_s]}
30
31
 
31
32
  context Teapot::Command::Create do
32
- subject {top["create", project_name, source.to_s, "project"]}
33
+ subject {top["create", project_name, source.to_s, "generate-project", "generate-travis"]}
33
34
 
34
35
  it "should create a new project" do
35
36
  root.delete
36
37
 
37
38
  expect{subject.invoke}.to_not raise_error
38
39
  expect(project_path + "teapot.rb").to be_exist
40
+ expect(project_path + ".travis.yml").to be_exist
39
41
  end
40
42
  end
41
43
 
@@ -46,4 +48,12 @@ RSpec.describe Teapot::Command, order: :defined do
46
48
  expect{subject.invoke}.to_not raise_error
47
49
  end
48
50
  end
51
+
52
+ context Teapot::Command::Fetch do
53
+ subject {top["fetch"]}
54
+
55
+ it "should fetch any changes" do
56
+ expect{subject.invoke}.to_not raise_error
57
+ end
58
+ end
49
59
  end
@@ -0,0 +1,42 @@
1
+ # Copyright, 2016, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in
11
+ # all copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ # THE SOFTWARE.
20
+
21
+ require 'teapot/context'
22
+ require 'teapot/configuration'
23
+
24
+ RSpec.describe Teapot::Configuration do
25
+ include_context Teapot::Context
26
+
27
+ let(:master) {Teapot::Configuration.new(context, Teapot::Package.new(root + 'master', 'master'), 'master')}
28
+ let(:embedded) {Teapot::Configuration.new(context, Teapot::Package.new(root + 'embedded', 'embedded'), 'embedded')}
29
+
30
+ context "with create targets" do
31
+ before(:each) do
32
+ master.targets[:create] << "hello"
33
+ embedded.targets[:create] << "world"
34
+ end
35
+
36
+ it "can merge packages" do
37
+ expect(master.update(embedded, {})).to be_truthy
38
+
39
+ expect(master.targets[:create]).to be == ["hello", "world"]
40
+ end
41
+ end
42
+ end
@@ -38,7 +38,7 @@ Gem::Specification.new do |spec|
38
38
  spec.add_dependency "build-uri", "~> 1.0"
39
39
  spec.add_dependency "build-text", "~> 1.0"
40
40
 
41
- spec.add_dependency "samovar", "~> 1.6"
41
+ spec.add_dependency "samovar", "~> 1.7"
42
42
 
43
43
  # This could be a good option in the future for teapot fetch:
44
44
  #spec.add_dependency "rugged"
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: 2.0.0.pre.rc2
4
+ version: 2.0.0.pre.rc3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-07 00:00:00.000000000 Z
11
+ date: 2017-07-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rainbow
@@ -128,14 +128,14 @@ dependencies:
128
128
  requirements:
129
129
  - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: '1.6'
131
+ version: '1.7'
132
132
  type: :runtime
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: '1.6'
138
+ version: '1.7'
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: bundler
141
141
  requirement: !ruby/object:Gem::Requirement
@@ -220,7 +220,12 @@ files:
220
220
  - materials/teapot.png
221
221
  - materials/teapot.svg
222
222
  - spec/spec_helper.rb
223
+ - spec/teapot/command/fetch_spec.rb
224
+ - spec/teapot/command/fetch_spec/repositories/thing/README.md
225
+ - spec/teapot/command/fetch_spec/repositories/thing/teapot.rb
226
+ - spec/teapot/command/fetch_spec/test-project/teapot.rb
223
227
  - spec/teapot/command_spec.rb
228
+ - spec/teapot/configuration_spec.rb
224
229
  - spec/teapot/context_spec.rb
225
230
  - spec/teapot/context_spec/teapot.rb
226
231
  - spec/teapot/identity_set_spec.rb
@@ -253,7 +258,12 @@ specification_version: 4
253
258
  summary: Teapot is a tool for managing complex cross-platform builds.
254
259
  test_files:
255
260
  - spec/spec_helper.rb
261
+ - spec/teapot/command/fetch_spec.rb
262
+ - spec/teapot/command/fetch_spec/repositories/thing/README.md
263
+ - spec/teapot/command/fetch_spec/repositories/thing/teapot.rb
264
+ - spec/teapot/command/fetch_spec/test-project/teapot.rb
256
265
  - spec/teapot/command_spec.rb
266
+ - spec/teapot/configuration_spec.rb
257
267
  - spec/teapot/context_spec.rb
258
268
  - spec/teapot/context_spec/teapot.rb
259
269
  - spec/teapot/identity_set_spec.rb