compote 0.2.2
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 +7 -0
- data/.gitignore +9 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +21 -0
- data/README.md +103 -0
- data/Rakefile +7 -0
- data/bin/pry +15 -0
- data/bin/rake +12 -0
- data/bin/rspec +12 -0
- data/compote.gemspec +43 -0
- data/config/gems/rspec/.rspec +2 -0
- data/config/gems/rspec/tasks.rake +9 -0
- data/exe/compote +6 -0
- data/lib/compote.rb +22 -0
- data/lib/compote/cli.rb +74 -0
- data/lib/compote/cli/command.rb +69 -0
- data/lib/compote/cli/commands.rb +31 -0
- data/lib/compote/cli/compose.rb +41 -0
- data/lib/compote/cli/env.rb +23 -0
- data/lib/compote/cli/help.rb +23 -0
- data/lib/compote/cli/version.rb +31 -0
- data/lib/compote/config.rb +272 -0
- data/lib/compote/error.rb +144 -0
- data/lib/compote/schema.json +486 -0
- data/lib/compote/schema.rb +371 -0
- data/lib/compote/service_config.rb +81 -0
- data/lib/compote/version.rb +5 -0
- metadata +267 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 99486c3d153db32cab2c8d73aeef121c776763ac
|
4
|
+
data.tar.gz: 44dd7d9d41bbc8c55119b6a3e74ce7157b779d3c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 50e82f05fe8bdab08574c1bb7f078cebe3212d2156cce0545c64213fdfad0601d23974ef72ca5ab6cfd18e94795d55d0a9e61c9986d3098b4f5cca6a6d2fc8f9
|
7
|
+
data.tar.gz: fa6c01b6059c0a6fa4b898f344aaf10b04855f09e04b496617bd579c8f9620be1aa67c057db03071f62fa1aab4d0c35acfd772f85eed622a3d6ea7d0794c6487
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2017 Dmitry Maganov
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
# Compote
|
2
|
+
|
3
|
+
Compote is a wrapper for docker-compose. It extends compose in two ways.
|
4
|
+
|
5
|
+
Firstly, it adds additional fields in the config spec, main focus of those additions is to provide more flexibility with extending of services definitions.
|
6
|
+
|
7
|
+
Second, it adds abitility to specify custom commands as node's package.json "scripts" field do.
|
8
|
+
|
9
|
+
|
10
|
+
## Installation
|
11
|
+
|
12
|
+
$ gem install compote
|
13
|
+
|
14
|
+
|
15
|
+
## Usage
|
16
|
+
|
17
|
+
You use `compote` as you do `docker-compose` as all commands are redirected to it.
|
18
|
+
|
19
|
+
Compote will search for `docker-compote.yml` file in current directory. You also can specify a path to a compote's config with env variable `COMPOTE_FILE`.
|
20
|
+
|
21
|
+
Here are additions that compote brings.
|
22
|
+
|
23
|
+
```yml
|
24
|
+
version: '2.1' # currently only version 2.1 supported
|
25
|
+
|
26
|
+
compote: # all additions live under compote key, here on top level and in a service definition
|
27
|
+
|
28
|
+
# extends
|
29
|
+
# allows to include definitions from other files
|
30
|
+
# it can be a single string, an array of strings
|
31
|
+
# it can also be a hash where keys are paths and values are objects with optional fields "except" and "only"
|
32
|
+
# only
|
33
|
+
# all paths resolved to a current compote config file
|
34
|
+
extends:
|
35
|
+
../hello.yml: { only: [ 'volumes' ] }
|
36
|
+
|
37
|
+
# env_file
|
38
|
+
# can be a single string or array of strings
|
39
|
+
# if files specified they must exist
|
40
|
+
# if no file specified and there is .env file near config, it is used
|
41
|
+
env_file: .hello_env
|
42
|
+
|
43
|
+
# environment
|
44
|
+
# can be a hash or an array of definitions (like the environment field in a service definition)
|
45
|
+
environment:
|
46
|
+
COMPOSE_PROJECT_NAME: hello
|
47
|
+
|
48
|
+
# commands
|
49
|
+
# commands specified here will be available for invocation by "compote command KEY [ARGS...]"
|
50
|
+
# a resulted executed command will be "COMMAND [ARGS...]"
|
51
|
+
# commands executed in environment combined from shell ones, env_file and environment options.
|
52
|
+
# to list available commands call "compote commands"
|
53
|
+
commands:
|
54
|
+
hello: echo "hello"
|
55
|
+
|
56
|
+
services:
|
57
|
+
|
58
|
+
hello:
|
59
|
+
image: hello
|
60
|
+
compote:
|
61
|
+
|
62
|
+
# extends
|
63
|
+
# same as extends in top compote settings, but with a name of a extended service after a colon
|
64
|
+
# this is not the same as usual service extends, as it recursively merges everything and
|
65
|
+
# does not care about ignoring some fields like docker-compose does
|
66
|
+
# you can reproduce compose way using "except" or "only" options
|
67
|
+
extends:
|
68
|
+
- ../hello.yml:hello
|
69
|
+
- ../hello.yml:world
|
70
|
+
|
71
|
+
# volumes, networks
|
72
|
+
# allow you to specify volumes and networks inside a service defintion
|
73
|
+
# those fields will be merged in top level ones for docker-compose consumption
|
74
|
+
# having those here simplifies extending of services
|
75
|
+
volumes: {}
|
76
|
+
networks: {}
|
77
|
+
|
78
|
+
# commands
|
79
|
+
# commands specified here will be available for invocation by "compote command SERVICE:KEY [ARGS...]"
|
80
|
+
# a resulted executed command will be "compote run [OPTIONS] SERVICE [COMMAND] [ARGS]"
|
81
|
+
# a command specified will be splited into two parts - run's options and a service command
|
82
|
+
# a service command starts at first argument not starting with a dash
|
83
|
+
commands:
|
84
|
+
world: --rm bash # it will execute "docker-compose run --rm hello bash"
|
85
|
+
```
|
86
|
+
|
87
|
+
|
88
|
+
## TODO
|
89
|
+
|
90
|
+
- Tests with aruba.
|
91
|
+
- Interpolation of env variables in compote fields.
|
92
|
+
- Suggestions for misspelled commands.
|
93
|
+
- Add some power to `only` and `except` extend options for specifying nested paths.
|
94
|
+
|
95
|
+
|
96
|
+
## Contributing
|
97
|
+
|
98
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/vonagam/compote.
|
99
|
+
|
100
|
+
|
101
|
+
## License
|
102
|
+
|
103
|
+
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
data/bin/pry
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'pathname'
|
4
|
+
|
5
|
+
ENV[ 'BUNDLE_GEMFILE' ] ||= File.expand_path( '../../Gemfile', Pathname.new( __FILE__ ).realpath )
|
6
|
+
|
7
|
+
require 'rubygems'
|
8
|
+
|
9
|
+
require 'bundler/setup'
|
10
|
+
|
11
|
+
|
12
|
+
require 'compote'
|
13
|
+
|
14
|
+
|
15
|
+
load Gem.bin_path 'pry', 'pry'
|
data/bin/rake
ADDED
data/bin/rspec
ADDED
data/compote.gemspec
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
lib = File.expand_path '../lib', __FILE__
|
4
|
+
$LOAD_PATH.unshift lib unless $LOAD_PATH.include? lib
|
5
|
+
|
6
|
+
require 'compote/version'
|
7
|
+
|
8
|
+
|
9
|
+
Gem::Specification.new do | spec |
|
10
|
+
|
11
|
+
spec.name = 'compote'
|
12
|
+
spec.version = Compote::VERSION
|
13
|
+
spec.authors = [ 'Dmitry Maganov' ]
|
14
|
+
spec.email = [ 'vonagam@gmail.com' ]
|
15
|
+
|
16
|
+
spec.summary = 'Wrapper for docker-compose with additional features.'
|
17
|
+
spec.homepage = 'https://github.com/vonagam/compote'
|
18
|
+
spec.license = 'MIT'
|
19
|
+
|
20
|
+
spec.files = `git ls-files -z`.split( "\x0" ).reject { | path | path.match %r{^spec/} }
|
21
|
+
spec.bindir = 'exe'
|
22
|
+
spec.executables = spec.files.grep( %r{^exe/} ) { | path | File.basename path }
|
23
|
+
spec.require_paths = [ 'lib' ]
|
24
|
+
|
25
|
+
|
26
|
+
spec.add_dependency 'thor', '~> 0.19' # cli builder - erikhuda/thor
|
27
|
+
spec.add_dependency 'json-schema', '~> 2.8' # json scheme validator - ruby-json-schema/json-schema
|
28
|
+
spec.add_dependency 'dotenv', '~> 2.2' # env variables from .env file - bkeepers/dotenv
|
29
|
+
|
30
|
+
spec.add_development_dependency 'bundler', '~> 1.14' # dependencies manager - bundler/bundler
|
31
|
+
spec.add_development_dependency 'rake', '~> 12.0' # tasks runner - ruby/rake
|
32
|
+
spec.add_development_dependency 'rspec', '~> 3.0' # test framework - rspec/rspec
|
33
|
+
spec.add_development_dependency 'aruba', '~> 0.14' # test framework - rspec/rspec
|
34
|
+
|
35
|
+
spec.add_development_dependency 'pry', '~> 0.10' # debug console - pry/pry
|
36
|
+
spec.add_development_dependency 'pry-rescue', '~> 1.4' # start debug on exception - conradirwin/pry-rescue
|
37
|
+
spec.add_development_dependency 'pry-stack_explorer', '~> 0.4' # moving in stack vertically - pry/pry-stack_explorer
|
38
|
+
spec.add_development_dependency 'pry-byebug', '~> 3.4' # moving in stack forward - deivid-rodriguez/pry-byebug
|
39
|
+
spec.add_development_dependency 'pry-inline', '~> 1.0' # view variables values inline - seikichi/pry-inline
|
40
|
+
spec.add_development_dependency 'pry-state', '~> 0.1' # view variables values - sudhagars/pry-state
|
41
|
+
spec.add_development_dependency 'pry-doc', '~> 0.10' # view ruby core classes documentation - pry/pry-doc
|
42
|
+
|
43
|
+
end
|
data/exe/compote
ADDED
data/lib/compote.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'json-schema'
|
2
|
+
|
3
|
+
require 'dotenv'
|
4
|
+
|
5
|
+
require 'yaml'
|
6
|
+
|
7
|
+
require 'tempfile'
|
8
|
+
|
9
|
+
|
10
|
+
module Compote
|
11
|
+
|
12
|
+
require 'compote/schema'
|
13
|
+
|
14
|
+
require 'compote/config'
|
15
|
+
|
16
|
+
require 'compote/service_config'
|
17
|
+
|
18
|
+
require 'compote/error'
|
19
|
+
|
20
|
+
require 'compote/version'
|
21
|
+
|
22
|
+
end
|
data/lib/compote/cli.rb
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'compote'
|
2
|
+
|
3
|
+
require 'thor'
|
4
|
+
|
5
|
+
require 'shellwords'
|
6
|
+
|
7
|
+
|
8
|
+
module Compote
|
9
|
+
|
10
|
+
class CLI < Thor
|
11
|
+
|
12
|
+
require 'compote/cli/compose'
|
13
|
+
|
14
|
+
require 'compote/cli/command'
|
15
|
+
|
16
|
+
require 'compote/cli/commands'
|
17
|
+
|
18
|
+
require 'compote/cli/env'
|
19
|
+
|
20
|
+
require 'compote/cli/help'
|
21
|
+
|
22
|
+
require 'compote/cli/version'
|
23
|
+
|
24
|
+
protected
|
25
|
+
|
26
|
+
def load_config
|
27
|
+
|
28
|
+
path = ENV.fetch 'COMPOTE_FILE', './docker-compote.yml'
|
29
|
+
|
30
|
+
config = Config.load_config path
|
31
|
+
|
32
|
+
config
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
def run_compose ( command, *arguments )
|
37
|
+
|
38
|
+
compote_config = load_config
|
39
|
+
|
40
|
+
compose_environment = compote_config.compose_environment
|
41
|
+
|
42
|
+
compose_file = compote_config.compose_file
|
43
|
+
|
44
|
+
system compose_environment, 'docker-compose', '-f', compose_file.path, command, *arguments
|
45
|
+
|
46
|
+
exit_status = $?.exitstatus
|
47
|
+
|
48
|
+
compose_file.unlink
|
49
|
+
|
50
|
+
exit exit_status
|
51
|
+
|
52
|
+
rescue Error => error
|
53
|
+
|
54
|
+
compose_file&.unlink
|
55
|
+
|
56
|
+
exit_with_error error
|
57
|
+
|
58
|
+
ensure
|
59
|
+
|
60
|
+
compose_file&.unlink
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
def exit_with_error ( error )
|
65
|
+
|
66
|
+
say error.message, :red
|
67
|
+
|
68
|
+
exit 1
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module Compote
|
2
|
+
|
3
|
+
class CLI < Thor
|
4
|
+
|
5
|
+
desc 'command', 'Run command specified in docker-compote config'
|
6
|
+
|
7
|
+
def command ( key, *arguments )
|
8
|
+
|
9
|
+
config = load_config
|
10
|
+
|
11
|
+
commands = config.commands
|
12
|
+
|
13
|
+
command = commands[ key ]
|
14
|
+
|
15
|
+
service_name, command_name = key.include?( ':' ) ? key.split( ':' ) : [ nil, key ]
|
16
|
+
|
17
|
+
raise UndefinedCommandError.new service_name: service_name, command_name: command_name, config: config unless command
|
18
|
+
|
19
|
+
arguments = [ *Shellwords.split( command ), *arguments ]
|
20
|
+
|
21
|
+
say "Running compote command \"#{ key }\":"
|
22
|
+
|
23
|
+
if service_name
|
24
|
+
|
25
|
+
run_arguments, command_arguments = split_arguments arguments
|
26
|
+
|
27
|
+
arguments = [ 'run', *run_arguments, service_name, *command_arguments ]
|
28
|
+
|
29
|
+
say Shellwords.join [ 'compote', *arguments ]
|
30
|
+
|
31
|
+
run_compose *arguments
|
32
|
+
|
33
|
+
else
|
34
|
+
|
35
|
+
say Shellwords.join arguments
|
36
|
+
|
37
|
+
environment = config.compose_environment
|
38
|
+
|
39
|
+
exec environment, *arguments
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
rescue Error => error
|
44
|
+
|
45
|
+
exit_with_error error
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
protected
|
50
|
+
|
51
|
+
def split_arguments ( arguments )
|
52
|
+
|
53
|
+
is_run_option = true
|
54
|
+
|
55
|
+
run_arguments, command_arguments = arguments.partition do | argument |
|
56
|
+
|
57
|
+
is_run_option &&= argument.match? /\A-/
|
58
|
+
|
59
|
+
is_run_option
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
[ run_arguments, command_arguments ]
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Compote
|
2
|
+
|
3
|
+
class CLI < Thor
|
4
|
+
|
5
|
+
desc 'commands', 'List commands specified in docker-compote config'
|
6
|
+
|
7
|
+
def commands
|
8
|
+
|
9
|
+
config = load_config
|
10
|
+
|
11
|
+
commands = config.commands
|
12
|
+
|
13
|
+
if commands.empty?
|
14
|
+
|
15
|
+
say 'No commands specified'
|
16
|
+
|
17
|
+
else
|
18
|
+
|
19
|
+
say commands.map { | key, command | "#{ key } -> #{ command }" }.join "\n"
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
rescue Error => error
|
24
|
+
|
25
|
+
exit_with_error error
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|