teapot 1.1.2 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e1ba885e20ffa47e9a547dfff26ae744bab48818
4
- data.tar.gz: 58ee0e7fe91f9e1d4a8bc9f2738b6db0157cd31c
3
+ metadata.gz: b6c26b7fd1bd7b215a6130f89ba2124873edeea0
4
+ data.tar.gz: c821f7f75b9adf8eaf642358d5972e837f84c031
5
5
  SHA512:
6
- metadata.gz: b43e0131d630c2ead6a7f227d8d0a032668cd7623fe55fbe41c43446ab75709ab0e594b76230d82931fb9a1b424d694e4c47b48560995c67bd5b74eceffb233e
7
- data.tar.gz: 7d33816958b4074785eed639758e44ff2206c9073c4fea310da6d2ab3a147a6f0a8b42eae26be4e92a0804fb4ca7da2b8f589e7ce29193799408195fda547d79
6
+ metadata.gz: 84f9731a34a8c113b20487dc446cee883884bfdeb3b56739ecd4fc179339cb435a57cdee691193e528f2ebfc6bd8900ea34aae702e6a277f2dda9dab5d0f9083
7
+ data.tar.gz: f5184593cf742a328d5cf0d8b67350c3dccd4f416a97551202f897595931f94f99196b2d667d392735c98ba575e664083210116f2cf9d37b1a8ea85e7c46ff33
data/.travis.yml CHANGED
@@ -2,7 +2,8 @@ language: ruby
2
2
  sudo: false
3
3
  before_install:
4
4
  # For testing purposes:
5
- - git config --local user.name "Samuel Williams"
5
+ - git config --global user.name "Samuel Williams"
6
+ - git config --global user.email "samuel@oriontransfer.net"
6
7
  rvm:
7
8
  - 2.1.8
8
9
  - 2.2.4
data/bin/teapot CHANGED
@@ -35,47 +35,16 @@ ensure
35
35
  $stderr.puts Rainbow("Elapsed Time: %0.3fs" % elapsed_time).magenta
36
36
  end
37
37
 
38
- def parse_argv
39
- if split_index = ARGV.index('--')
40
- ARGV.shift(split_index).tap{ARGV.shift}
41
- else
42
- ARGV.slice!(0..-1)
43
- end
44
- end
45
-
46
- # Get the arguments up until "--"
47
- ARGUMENTS = parse_argv
48
-
49
- OPTIONS = Trollop::options(ARGUMENTS) do
50
- banner Rainbow("Teapot: a decentralised package manager and build tool.").bright.blue
51
- version "teapot #{Teapot::VERSION}"
52
-
53
- opt :configuration, "Specify a specific build configuration.", :type => :string
54
-
55
- opt :limit, "Limit build to <i> concurrent processes at once where possible", :type => :integer
56
-
57
- opt :only, "Only compiled direct dependencies."
58
- opt :continuous, "Run the build graph continually (experimental).", :type => :boolean, :short => :n
59
-
60
- opt :in, "Work in the given directory.", :type => :string
61
- opt :unlock, "Don't use package lockfile when fetching."
62
-
63
- opt :force, "Force the operation if it would otherwise be be stopped due to a warning."
64
-
65
- opt :verbose, "Verbose output and error backtraces.", :type => :boolean
66
-
67
- opt :version, "Print version and exit", :short => :none
68
- opt :help, "Show this message"
69
- end
38
+ options = Teapot::Command::Top.parse(ARGV)
70
39
 
71
40
  track_time do
72
41
  begin
73
- Teapot::Command.new(ARGUMENTS, OPTIONS).invoke
42
+ options.invoke
74
43
  rescue Teapot::IncompatibleTeapotError => error
75
44
  $stderr.puts error.message.color(:red)
76
45
  $stderr.puts "Supported minimum version #{Teapot::MINIMUM_LOADER_VERSION.dump} to #{Teapot::LOADER_VERSION.dump}."
77
46
 
78
- exit -3
47
+ exit 1
79
48
  rescue Teapot::Dependency::UnresolvedDependencyError => error
80
49
  $stderr.puts "Unresolved dependencies:"
81
50
 
@@ -93,17 +62,13 @@ track_time do
93
62
 
94
63
  $stderr.puts "Cannot continue due to unresolved dependencies!".color(:red)
95
64
 
96
- exit -5
65
+ exit 2
97
66
  rescue StandardError => error
98
67
  $stderr.puts error.message.color(:red)
99
68
 
100
69
  # Could be nice to have some improved error reporting.
101
- if OPTIONS[:verbose]
102
- $stderr.puts error.backtrace
103
- else
104
- $stderr.puts "Run with --verbose for more details."
105
- end
70
+ $stderr.puts error.backtrace
106
71
 
107
- exit -10
72
+ exit 3
108
73
  end
109
74
  end
@@ -29,79 +29,148 @@ require_relative 'controller/visualize'
29
29
 
30
30
  require_relative 'repository'
31
31
 
32
- require 'trollop'
33
- require 'pry'
32
+ require 'flopp'
34
33
 
35
34
  module Teapot
36
- # This module implements all top-level teapot commands.
37
- class Command
38
- def initialize(arguments, options)
39
- @action, *@arguments = arguments
40
- @options = options
41
- end
42
-
43
- def controller(root = nil)
44
- Teapot::Controller.new(root || @options[:in] || Dir.getwd, @options)
35
+ module Command
36
+ class Create < Flopp::Command
37
+ self.description = "Create a new teapot package using the specified repository."
38
+
39
+ one :project_name, "The name of the new project in title-case, e.g. 'My Project'."
40
+ one :source, "The source repository to use for fetching packages, e.g. https://github.com/kurocha."
41
+ many :packages, "Any additional packages you'd like to include in the project."
42
+
43
+ def invoke(parent)
44
+ project_path = parent.root || project_name.gsub(/\s+/, '-').downcase
45
+ root = ::Build::Files::Path.expand(project_path)
46
+
47
+ if root.exist?
48
+ raise ArgumentError.new("#{root} already exists!")
49
+ end
50
+
51
+ # Make the path:
52
+ root.create
53
+
54
+ Teapot::Repository.new(root).init!
55
+
56
+ parent.controller(root).create(@project_name, @source, @packages)
57
+ end
45
58
  end
46
-
47
- def invoke
48
- if @action == "invoke"
49
- fail "The meaning of life is 42."
59
+
60
+ class Generate < Flopp::Command
61
+ self.description = "Run a generator to create files in your project."
62
+
63
+ options do
64
+ option '-f/--force', "Force the generator to run even if the current work-tree is dirty."
50
65
  end
51
66
 
52
- self.send(@action)
53
- end
54
-
55
- def clean
56
- controller.clean
57
- end
58
-
59
- def fetch
60
- controller.fetch
67
+ one :generator_name, "The name of the generator to be invoked."
68
+ many :arguments, "The arguments that will be passed to the generator."
69
+
70
+ def invoke(parent)
71
+ generator_name, *arguments = @arguments
72
+
73
+ parent.controller.generate(@generator_name, @arguments, @options[:force])
74
+ end
61
75
  end
62
-
63
- def list
64
- only = nil
76
+
77
+ class Fetch < Flopp::Command
78
+ self.description = "Fetch remote packages according to the specified configuration."
79
+
80
+ # 3 typical use cases:
81
+ # - fetch current packages according to lockfile
82
+ # - write current pacakges into lockfile
83
+ # - update packages and update lockfile
65
84
 
66
- if @arguments.any?
67
- only = Set.new(@arguments)
85
+ options do
86
+ option '--update', "Update dependencies to the latest versions."
87
+ option '--local', "Don't update from source, assume updated local packages."
68
88
  end
69
89
 
70
- controller.list(only)
90
+ def invoke(parent)
91
+ parent.controller.fetch(**@options)
92
+ end
71
93
  end
72
-
73
- def generate
74
- generator_name, *arguments = @arguments
94
+
95
+ class List < Flopp::Command
96
+ self.description = "List provisions and dependencies of the specified package."
75
97
 
76
- controller.generate(generator_name, arguments, @options[:force])
98
+ many :packages, "Limit the listing to only these packages, or all packages if none specified."
99
+
100
+ def invoke(parent)
101
+ if @packages.any?
102
+ only = Set.new(@packages)
103
+ end
104
+
105
+ parent.controller.list(only)
106
+ end
77
107
  end
78
-
79
- def build
80
- controller.build(@arguments)
108
+
109
+ class Build < Flopp::Command
110
+ self.description = "Build the specified target."
111
+
112
+ options do
113
+ option '-j/-l/--limit <n>', "Limit the build to <n> concurrent processes."
114
+ option '--only', "Only compile direct dependencies."
115
+ option '-c/--continuous', "Run the build graph continually (experimental)."
116
+ end
117
+
118
+ many :targets, "Build these targets, or use them to help the dependency resolution process."
119
+ split :argv, "Arguments passed to child process(es) of build if any."
120
+
121
+ def invoke(parent)
122
+ # TODO: This is a bit of a hack, figure out a way to pass it directly through to build subsystem.
123
+ ARGV.replace(@argv) if @argv
124
+
125
+ parent.controller.build(@targets)
126
+ end
81
127
  end
82
-
83
- alias brew build
84
-
85
- def visualize
86
- controller.visualize(@arguments)
128
+
129
+ class Clean < Flopp::Command
130
+ self.description = "Delete everything in the teapot directory."
131
+
132
+ def invoke(parent)
133
+ parent.controller.clean
134
+ end
87
135
  end
88
136
 
89
- def create
90
- project_name, source, *packages = @arguments
91
- project_path = @options[:in] || project_name.gsub(/\s+/, '-').downcase
92
-
93
- root = Build::Files::Path.expand(project_path)
137
+ class Top < Flopp::Command
138
+ self.description = "A decentralised package manager and build tool."
139
+ #version "1.0.0"
94
140
 
95
- if root.exist?
96
- abort "#{root} already exists!".color(:red)
141
+ options do
142
+ option '-c/--configuration <name>', "Specify a specific build configuration.", default: ENV['TEAPOT_CONFIGURATION']
143
+ option '-i/--in/--root <path>', "Work in the given root directory."
144
+ option '--verbose | --quiet', "Verbosity of output for debugging.", key: :logging
145
+ option '-h/--help', "Print out help information."
146
+ option '-v/--version', "Print out the application version."
97
147
  end
98
148
 
99
- # Make the path:
100
- root.create
149
+ nested '<command>',
150
+ 'create' => Create,
151
+ 'generate' => Generate,
152
+ 'fetch' => Fetch,
153
+ 'list' => List,
154
+ 'build' => Build,
155
+ 'clean' => Clean
101
156
 
102
- Teapot::Repository.new(root).init!
157
+ def root
158
+ @options[:root] || Dir.getwd
159
+ end
160
+
161
+ def controller(root = nil, **options)
162
+ Teapot::Controller.new(root || self.root, @options)
163
+ end
103
164
 
104
- controller(root).create(project_name, source, packages)
165
+ def invoke(program_name: File.basename($0))
166
+ if @command.nil? or @options[:help]
167
+ print_usage(program_name)
168
+ elsif @options[:version]
169
+ puts "teapot v#{Teapot::VERSION}"
170
+ else
171
+ @command.invoke(self)
172
+ end
173
+ end
105
174
  end
106
175
  end
107
- end
176
+ end
@@ -195,12 +195,16 @@ module Teapot
195
195
  # Find the default configuration, if it exists:
196
196
  @default_configuration = defined.default_configuration
197
197
 
198
- if options[:configuration]
199
- @configuration = @configurations[options[:configuration]]
198
+ if configuration_name = options[:configuration]
199
+ @configuration = @configurations[configuration_name]
200
200
  else
201
201
  @configuration = @default_configuration
202
202
  end
203
-
203
+
204
+ if @configuration.nil?
205
+ raise ArgumentError.new("Could not load configuration: #{configuration_name}")
206
+ end
207
+
204
208
  # Materialize the configuration:
205
209
  @configuration.materialize if @configuration
206
210
  end
@@ -30,37 +30,46 @@ require 'build/logger'
30
30
 
31
31
  module Teapot
32
32
  class Controller
33
- MAXIMUM_FETCH_DEPTH = 20
34
-
35
33
  def initialize(root, options)
36
34
  @root = Pathname(root)
37
35
  @options = options
38
36
 
39
- log_output = @options.fetch(:log, $stdout)
40
-
41
- @logger = Logger.new(log_output)
42
-
43
- @logger.formatter = Build::CompactFormatter.new(verbose: options[:verbose])
44
-
45
- if options[:verbose]
46
- @logger.level = Logger::DEBUG
47
- else
48
- @logger.level = Logger::INFO
49
- end
50
-
51
- @options[:maximum_fetch_depth] ||= MAXIMUM_FETCH_DEPTH
37
+ @log_output = @options.fetch(:log, $stdout)
38
+ @logging = @options[:logging]
39
+ end
40
+
41
+ def verbose?
42
+ @logging == :verbose
52
43
  end
53
44
 
54
- attr :logger
45
+ def quiet?
46
+ @logging == :quiet
47
+ end
48
+
49
+ def logger
50
+ @logger ||= Logger.new(@log_output).tap do |logger|
51
+ logger.formatter = Build::CompactFormatter.new(verbose: verbose?)
52
+
53
+ if verbose?
54
+ logger.level = Logger::DEBUG
55
+ elsif quiet?
56
+ logger.level = Logger::WARN
57
+ else
58
+ logger.level = Logger::INFO
59
+ end
60
+ end
61
+ end
55
62
 
56
63
  def log(*args)
57
- @logger.info(*args)
64
+ logger.info(*args)
65
+ end
66
+
67
+ def configuration
68
+ @options[:configuration]
58
69
  end
59
70
 
60
71
  def context
61
- @context ||= Context.new(@root,
62
- :configuration => @options[:configuration]
63
- )
72
+ @context ||= Context.new(@root, configuration: configuration)
64
73
  end
65
74
 
66
75
  # Reload the current context, e.g. if it's been modified by a generator.
@@ -23,17 +23,16 @@ require_relative '../repository'
23
23
 
24
24
  module Teapot
25
25
  class Controller
26
- def fetch
26
+ def fetch(**options)
27
27
  resolved = Set.new
28
28
  configuration = context.configuration
29
29
  unresolved = context.unresolved(configuration.packages)
30
- tries = 0
31
30
 
32
- while tries < @options[:maximum_fetch_depth]
31
+ while true
33
32
  configuration.packages.each do |package|
34
33
  next if resolved.include? package
35
34
 
36
- fetch_package(context, configuration, package)
35
+ fetch_package(context, configuration, package, **options)
37
36
 
38
37
  # We are done with this package, don't try to process it again:
39
38
  resolved << package
@@ -49,8 +48,6 @@ module Teapot
49
48
  if previously_unresolved == unresolved || unresolved.count == 0
50
49
  break
51
50
  end
52
-
53
- tries += 1
54
51
  end
55
52
 
56
53
  if unresolved.count > 0
@@ -66,77 +63,108 @@ module Teapot
66
63
  private
67
64
 
68
65
  def current_commit(package)
69
- IO.popen(['git', '--git-dir', (package.path + ".git").to_s, 'rev-parse', '--verify', 'HEAD']) do |io|
66
+ IO.popen(['git', '--git-dir', (package.path + '.git').to_s, 'rev-parse', '--verify', 'HEAD']) do |io|
70
67
  io.read.chomp!
71
68
  end
72
69
  end
73
-
74
- def fetch_package(context, configuration, package)
75
- destination_path = package.path
76
- lock_store = configuration.lock_store
77
70
 
78
- if package.local?
79
- log "Linking local #{package}...".color(:cyan)
71
+ def current_branch(package)
72
+ IO.popen(['git', '--git-dir', (package.path + '.git').to_s, 'rev-parse', '--abbrev-ref', 'HEAD']) do |io|
73
+ io.read.chomp!
74
+ end
75
+ end
80
76
 
81
- local_path = context.root + package.options[:local]
82
-
83
- # Make the top level directory if required:
84
- destination_path.dirname.create
77
+ def current_metadata(package)
78
+ {
79
+ branch: current_branch(package),
80
+ commit: current_commit(package)
81
+ }
82
+ end
83
+
84
+ def link_local_package(context, configuration, package)
85
+ log "Linking local #{package}...".color(:cyan)
85
86
 
86
- unless destination_path.exist?
87
- destination_path.make_symlink(local_path)
88
- end
89
- elsif package.external?
90
- package_lock = nil
91
-
92
- unless @options[:unlock]
93
- package_lock = lock_store.transaction(true){|store| store[package.name]}
94
- end
87
+ local_path = context.root + package.options[:local]
95
88
 
96
- log "Fetching #{package}...".color(:cyan)
89
+ # Where we are going to put the package:
90
+ destination_path = package.path
97
91
 
98
- base_uri = URI(package.options[:source].to_s)
92
+ # Make the top level directory if required:
93
+ destination_path.dirname.create
99
94
 
100
- if base_uri.scheme == nil || base_uri.scheme == 'file'
101
- base_uri = URI "file://" + File.expand_path(base_uri.path, context.root) + "/"
102
- end
95
+ unless destination_path.exist?
96
+ destination_path.make_symlink(local_path)
97
+ end
98
+ end
103
99
 
104
- branch = package.options.fetch(:version, 'master')
100
+ def clone_or_pull_package(context, configuration, package, package_lock)
101
+ log "Fetching #{package}...".color(:cyan)
105
102
 
106
- if package_lock
107
- log "Package locked to commit: #{package_lock[:branch]}/#{package_lock[:commit]}"
103
+ # Where we are going to put the package:
104
+ destination_path = package.path
108
105
 
109
- branch = package_lock[:branch]
110
- end
106
+ base_uri = URI(package.options[:source].to_s)
111
107
 
112
- commit = package_lock ? package_lock[:commit] : nil
108
+ if base_uri.scheme == nil || base_uri.scheme == 'file'
109
+ base_uri = URI "file://" + File.expand_path(base_uri.path, context.root) + "/"
110
+ end
113
111
 
114
- unless destination_path.exist?
115
- log "Cloning package at path #{destination_path} ...".color(:cyan)
116
-
117
- begin
118
- external_url = package.external_url(context.root)
112
+ branch = package.options.fetch(:branch, 'master')
119
113
 
120
- Repository.new(destination_path).clone!(external_url, branch, commit)
121
- rescue
122
- log "Failed to clone #{external_url}...".color(:red)
114
+ if package_lock
115
+ log "Package locked to commit: #{package_lock[:branch]}/#{package_lock[:commit]}"
123
116
 
124
- raise
125
- end
126
- else
127
- log "Updating package at path #{destination_path} ...".color(:cyan)
117
+ branch = package_lock[:branch]
118
+ end
119
+
120
+ commit = package_lock ? package_lock[:commit] : nil
121
+
122
+ unless destination_path.exist?
123
+ log "Cloning package at path #{destination_path} ...".color(:cyan)
124
+
125
+ begin
126
+ external_url = package.external_url(context.root)
127
+
128
+ Repository.new(destination_path).clone!(external_url, branch, commit)
129
+ rescue
130
+ log "Failed to clone #{external_url}...".color(:red)
131
+
132
+ raise
133
+ end
134
+ else
135
+ log "Updating package at path #{destination_path} ...".color(:cyan)
128
136
 
129
- commit = package_lock ? package_lock[:commit] : nil
130
- Repository.new(destination_path).update(branch, commit)
137
+ commit = package_lock ? package_lock[:commit] : nil
138
+ Repository.new(destination_path).update(branch, commit)
139
+ end
140
+ end
141
+
142
+ def fetch_package(context, configuration, package, update: false, local: false)
143
+ if package.local?
144
+ link_local_package(context, configuration, package)
145
+ elsif package.external?
146
+ lock_store = configuration.lock_store
147
+
148
+ # If we are updating, don't bother reading the current branch/commit details.
149
+ unless update
150
+ package_lock = lock_store.transaction(true){|store| store[package.name]}
151
+ end
152
+
153
+ unless local
154
+ clone_or_pull_package(context, configuration, package, package_lock)
131
155
  end
132
156
 
133
157
  # Lock the package, unless it was already locked:
134
158
  unless package_lock
159
+ metadata = current_metadata(package)
160
+
135
161
  lock_store.transaction do |store|
136
- store[package.name] = {
137
- :branch => branch,
138
- :commit => current_commit(package)
139
- }
162
+ store_metadata = store[package.name]
163
+
164
+ if store_metadata.nil? or store_metadata[:commit] != metadata[:commit]
165
+ log("Updating lockfile for package #{package.name}: #{metadata[:commit]}...")
166
+ store[package.name] = metadata
167
+ end
140
168
  end
141
169
  end
142
170
  end
@@ -19,5 +19,5 @@
19
19
  # THE SOFTWARE.
20
20
 
21
21
  module Teapot
22
- VERSION = "1.1.2"
22
+ VERSION = "1.2.0"
23
23
  end
@@ -0,0 +1,41 @@
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/command'
22
+
23
+ module Teapot::CommandSpec
24
+ ROOT = Build::Files::Path.new(__dir__) + "command_spec"
25
+ PROJECT_PATH = ROOT + 'test-project'
26
+
27
+ describe Teapot::Command::Top.parse(["--in", PROJECT_PATH.to_s, "create", "test-project", "https://github.com/kurocha", "project"]) do
28
+ before do
29
+ ROOT.mkpath
30
+ end
31
+
32
+ after do
33
+ PROJECT_PATH.delete
34
+ end
35
+
36
+ it "should create a new project" do
37
+ expect{subject.invoke}.to_not raise_error
38
+ expect(PROJECT_PATH + "teapot.rb").to be_exist
39
+ end
40
+ end
41
+ end
data/teapot.gemspec CHANGED
@@ -28,9 +28,7 @@ Gem::Specification.new do |spec|
28
28
 
29
29
  spec.required_ruby_version = '>= 2.1'
30
30
 
31
- spec.add_dependency "rainbow", "~> 2.0.0"
32
- spec.add_dependency "trollop", "~> 2.1"
33
-
31
+ spec.add_dependency "rainbow", "~> 2.0"
34
32
  spec.add_dependency "system", "~> 0.1.3"
35
33
 
36
34
  spec.add_dependency "graphviz", "~> 0.3.0"
@@ -38,6 +36,8 @@ Gem::Specification.new do |spec|
38
36
  spec.add_dependency "build", "~> 1.0.7"
39
37
  spec.add_dependency "build-files", "~> 1.0.4"
40
38
 
39
+ spec.add_dependency "flopp", "~> 1.0.1"
40
+
41
41
  # This could be a good option in the future for teapot fetch:
42
42
  #spec.add_dependency "rugged"
43
43
 
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.1.2
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-15 00:00:00.000000000 Z
11
+ date: 2016-04-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rainbow
@@ -16,28 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 2.0.0
19
+ version: '2.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 2.0.0
27
- - !ruby/object:Gem::Dependency
28
- name: trollop
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '2.1'
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '2.1'
26
+ version: '2.0'
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: system
43
29
  requirement: !ruby/object:Gem::Requirement
@@ -94,6 +80,20 @@ dependencies:
94
80
  - - "~>"
95
81
  - !ruby/object:Gem::Version
96
82
  version: 1.0.4
83
+ - !ruby/object:Gem::Dependency
84
+ name: flopp
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 1.0.1
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 1.0.1
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: bundler
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -185,6 +185,7 @@ files:
185
185
  - materials/kurocha.svg
186
186
  - materials/teapot.png
187
187
  - materials/teapot.svg
188
+ - spec/teapot/command_spec.rb
188
189
  - spec/teapot/context_spec.rb
189
190
  - spec/teapot/context_spec/teapot.rb
190
191
  - spec/teapot/dependency_spec.rb
@@ -225,6 +226,7 @@ signing_key:
225
226
  specification_version: 4
226
227
  summary: Teapot is a tool for managing complex cross-platform builds.
227
228
  test_files:
229
+ - spec/teapot/command_spec.rb
228
230
  - spec/teapot/context_spec.rb
229
231
  - spec/teapot/context_spec/teapot.rb
230
232
  - spec/teapot/dependency_spec.rb