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 +4 -4
- data/.travis.yml +2 -1
- data/bin/teapot +6 -41
- data/lib/teapot/command.rb +123 -54
- data/lib/teapot/context.rb +7 -3
- data/lib/teapot/controller.rb +29 -20
- data/lib/teapot/controller/fetch.rb +83 -55
- data/lib/teapot/version.rb +1 -1
- data/spec/teapot/command_spec.rb +41 -0
- data/teapot.gemspec +3 -3
- metadata +20 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b6c26b7fd1bd7b215a6130f89ba2124873edeea0
|
4
|
+
data.tar.gz: c821f7f75b9adf8eaf642358d5972e837f84c031
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 84f9731a34a8c113b20487dc446cee883884bfdeb3b56739ecd4fc179339cb435a57cdee691193e528f2ebfc6bd8900ea34aae702e6a277f2dda9dab5d0f9083
|
7
|
+
data.tar.gz: f5184593cf742a328d5cf0d8b67350c3dccd4f416a97551202f897595931f94f99196b2d667d392735c98ba575e664083210116f2cf9d37b1a8ea85e7c46ff33
|
data/.travis.yml
CHANGED
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
|
-
|
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
|
-
|
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
|
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
|
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
|
-
|
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
|
72
|
+
exit 3
|
108
73
|
end
|
109
74
|
end
|
data/lib/teapot/command.rb
CHANGED
@@ -29,79 +29,148 @@ require_relative 'controller/visualize'
|
|
29
29
|
|
30
30
|
require_relative 'repository'
|
31
31
|
|
32
|
-
require '
|
33
|
-
require 'pry'
|
32
|
+
require 'flopp'
|
34
33
|
|
35
34
|
module Teapot
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
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
|
-
|
48
|
-
|
49
|
-
|
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
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
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
|
-
|
64
|
-
|
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
|
-
|
67
|
-
|
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
|
-
|
90
|
+
def invoke(parent)
|
91
|
+
parent.controller.fetch(**@options)
|
92
|
+
end
|
71
93
|
end
|
72
|
-
|
73
|
-
|
74
|
-
|
94
|
+
|
95
|
+
class List < Flopp::Command
|
96
|
+
self.description = "List provisions and dependencies of the specified package."
|
75
97
|
|
76
|
-
|
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
|
-
|
80
|
-
|
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
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
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
|
-
|
90
|
-
|
91
|
-
|
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
|
-
|
96
|
-
|
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
|
-
|
100
|
-
|
149
|
+
nested '<command>',
|
150
|
+
'create' => Create,
|
151
|
+
'generate' => Generate,
|
152
|
+
'fetch' => Fetch,
|
153
|
+
'list' => List,
|
154
|
+
'build' => Build,
|
155
|
+
'clean' => Clean
|
101
156
|
|
102
|
-
|
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
|
-
|
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
|
data/lib/teapot/context.rb
CHANGED
@@ -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[
|
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
|
data/lib/teapot/controller.rb
CHANGED
@@ -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
|
-
|
42
|
-
|
43
|
-
|
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
|
-
|
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
|
-
|
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
|
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 +
|
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
|
-
|
79
|
-
|
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
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
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
|
-
|
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
|
-
|
89
|
+
# Where we are going to put the package:
|
90
|
+
destination_path = package.path
|
97
91
|
|
98
|
-
|
92
|
+
# Make the top level directory if required:
|
93
|
+
destination_path.dirname.create
|
99
94
|
|
100
|
-
|
101
|
-
|
102
|
-
|
95
|
+
unless destination_path.exist?
|
96
|
+
destination_path.make_symlink(local_path)
|
97
|
+
end
|
98
|
+
end
|
103
99
|
|
104
|
-
|
100
|
+
def clone_or_pull_package(context, configuration, package, package_lock)
|
101
|
+
log "Fetching #{package}...".color(:cyan)
|
105
102
|
|
106
|
-
|
107
|
-
|
103
|
+
# Where we are going to put the package:
|
104
|
+
destination_path = package.path
|
108
105
|
|
109
|
-
|
110
|
-
end
|
106
|
+
base_uri = URI(package.options[:source].to_s)
|
111
107
|
|
112
|
-
|
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
|
-
|
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
|
-
|
121
|
-
|
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
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
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
|
-
|
130
|
-
|
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
|
-
|
138
|
-
|
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
|
data/lib/teapot/version.rb
CHANGED
@@ -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
|
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.
|
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-
|
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
|
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
|
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
|