teapot 1.1.2 → 1.2.0

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