dru 0.6.0 → 1.0.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
  SHA256:
3
- metadata.gz: f75222fea85c8eefdd69ea93f802d91ebee51005ba4c1101ced62c4982743b2b
4
- data.tar.gz: 39838ee39b7a874223b4b7986ff4574fc22067e1944a50c2d3169843a36d781c
3
+ metadata.gz: 8712f6e940546178246f68aa0272b599a90a9f4c94cb02263b444ebe11f01f4b
4
+ data.tar.gz: ec001fa5801d5d355d79f7fcc98f03ce84d0a028d4ef33a31efa4bcf160b370f
5
5
  SHA512:
6
- metadata.gz: '09f30684009c75b7d32b458e14de955d950bb9113653c843d2b22a895ae4ecde977cb6a5551a0a568d307f6eea3e7526a1049c311f199c72609b4beaa0dfd366'
7
- data.tar.gz: b9b79033ee1d5e9624e59fd4fb056c7a05f0144d1f96681e9d5624203cf52ca1bb6e91de969d98465d01af7d01c6909bb56eb7aa2fda74df940747be00b96957
6
+ metadata.gz: 53c266f1b5d69ee119b0e540057677198387f0795208d9c260a96ac3b5fdbf10b1b73a9fc00890c94dad9c3b51c3d2295eab693361b665e6118abf817a4da6f2
7
+ data.tar.gz: 3545358f7885e0fc64aa4f268e2aae67cc2ca646cfb462dc03b6c2b63276e44e94cac93d535a0fe462081cb5cee20b5196fc0919b072f8a8c3daee9534c112ea
@@ -0,0 +1,77 @@
1
+ # Ruby CircleCI 2.1 configuration file
2
+ #
3
+ # Check https://circleci.com/docs/2.0/language-ruby/ for more details
4
+ #
5
+ version: 2.1
6
+
7
+ workflows:
8
+ version: 2
9
+
10
+ commit:
11
+ jobs:
12
+ - build
13
+ - tests:
14
+ requires:
15
+ - build
16
+ - upload-coverage:
17
+ requires:
18
+ - tests
19
+
20
+ defaults: &defaults
21
+ working_directory: ~/repo
22
+ docker:
23
+ - image: circleci/ruby:2.5.1
24
+
25
+ jobs:
26
+ build:
27
+ <<: *defaults
28
+ steps:
29
+ - run:
30
+ name: Download cc-test-reporter
31
+ command: |
32
+ mkdir -p tmp/
33
+ curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./tmp/cc-test-reporter
34
+ chmod +x ./tmp/cc-test-reporter
35
+ - persist_to_workspace:
36
+ root: tmp
37
+ paths:
38
+ - cc-test-reporter
39
+
40
+ tests:
41
+ <<: *defaults
42
+ steps:
43
+ - checkout
44
+ - attach_workspace:
45
+ at: ~/repo/tmp
46
+ # Download and cache dependencies
47
+ - restore_cache:
48
+ keys:
49
+ - v1-dependencies-{{ checksum "Gemfile.lock" }}
50
+ # fallback to using the latest cache if no exact match is found
51
+ - v1-dependencies-
52
+ - run:
53
+ name: Install dependencies
54
+ command: |
55
+ bundle install --jobs=4 --retry=3 --path vendor/bundle
56
+ - save_cache:
57
+ paths:
58
+ - ./vendor/bundle
59
+ key: v1-dependencies-{{ checksum "Gemfile.lock" }}
60
+ - run:
61
+ name: Run tests
62
+ command: |
63
+ bundle exec rspec
64
+ ./tmp/cc-test-reporter format-coverage -t simplecov -o tmp/codeclimate.json coverage/.resultset.json
65
+ - persist_to_workspace:
66
+ root: tmp
67
+ paths:
68
+ - codeclimate.json
69
+ upload-coverage:
70
+ <<: *defaults
71
+ steps:
72
+ - attach_workspace:
73
+ at: ~/repo/tmp
74
+ - run:
75
+ name: Upload coverage results to Code Climate
76
+ command: |
77
+ ./tmp/cc-test-reporter upload-coverage -i tmp/codeclimate.json
@@ -1,41 +1,26 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- dru (0.6.0)
4
+ dru (1.0.0)
5
5
  pastel (~> 0.7.2)
6
6
  thor (~> 0.20.0)
7
- tty-color (~> 0.4.2)
8
7
  tty-command (~> 0.8.0)
9
8
  tty-config (~> 0.2.0)
10
- tty-cursor (~> 0.5.0)
11
- tty-editor (~> 0.4.0)
12
- tty-file (~> 0.6.0)
13
- tty-font (~> 0.2.0)
14
- tty-markdown (~> 0.4.0)
15
- tty-pager (~> 0.11.0)
16
- tty-platform (~> 0.1.0)
17
- tty-progressbar (~> 0.15.0)
18
- tty-prompt (~> 0.16.1)
19
- tty-screen (~> 0.6.4)
20
- tty-spinner (~> 0.8.0)
21
- tty-table (~> 0.10.0)
22
- tty-tree (~> 0.1.0)
23
9
  tty-which (~> 0.3.0)
24
10
 
25
11
  GEM
26
12
  remote: https://rubygems.org/
27
13
  specs:
28
14
  diff-lcs (1.3)
15
+ docile (1.3.1)
29
16
  equatable (0.5.0)
30
- kramdown (1.16.2)
31
- necromancer (0.4.0)
17
+ json (2.2.0)
32
18
  pastel (0.7.2)
33
19
  equatable (~> 0.5.0)
34
20
  tty-color (~> 0.4.0)
35
21
  rake (10.5.0)
36
22
  rake-compiler (1.0.5)
37
23
  rake
38
- rouge (3.1.1)
39
24
  rspec (3.8.0)
40
25
  rspec-core (~> 3.8.0)
41
26
  rspec-expectations (~> 3.8.0)
@@ -49,66 +34,17 @@ GEM
49
34
  diff-lcs (>= 1.2.0, < 2.0)
50
35
  rspec-support (~> 3.8.0)
51
36
  rspec-support (3.8.0)
52
- strings (0.1.4)
53
- strings-ansi (~> 0.1.0)
54
- unicode-display_width (~> 1.4.0)
55
- unicode_utils (~> 1.4.0)
56
- strings-ansi (0.1.0)
37
+ simplecov (0.16.1)
38
+ docile (~> 1.1)
39
+ json (>= 1.8, < 3)
40
+ simplecov-html (~> 0.10.0)
41
+ simplecov-html (0.10.2)
57
42
  thor (0.20.3)
58
- timers (4.2.0)
59
43
  tty-color (0.4.3)
60
44
  tty-command (0.8.2)
61
45
  pastel (~> 0.7.0)
62
46
  tty-config (0.2.0)
63
- tty-cursor (0.5.0)
64
- tty-editor (0.4.0)
65
- tty-prompt (~> 0.16.0)
66
- tty-which (~> 0.3.0)
67
- tty-file (0.6.0)
68
- diff-lcs (~> 1.3.0)
69
- pastel (~> 0.7.2)
70
- tty-prompt (~> 0.16.1)
71
- tty-font (0.2.0)
72
- tty-markdown (0.4.0)
73
- kramdown (~> 1.16.2)
74
- pastel (~> 0.7.2)
75
- rouge (~> 3.1.0)
76
- strings (~> 0.1.0)
77
- tty-color (~> 0.4.2)
78
- tty-screen (~> 0.6.4)
79
- tty-pager (0.11.0)
80
- strings (~> 0.1.0)
81
- tty-screen (~> 0.6.4)
82
- tty-which (~> 0.3.0)
83
- tty-platform (0.1.0)
84
- tty-progressbar (0.15.1)
85
- tty-cursor (~> 0.5.0)
86
- tty-screen (~> 0.6.4)
87
- unicode-display_width (~> 1.3)
88
- tty-prompt (0.16.1)
89
- necromancer (~> 0.4.0)
90
- pastel (~> 0.7.0)
91
- timers (~> 4.0)
92
- tty-cursor (~> 0.5.0)
93
- tty-reader (~> 0.3.0)
94
- tty-reader (0.3.0)
95
- tty-cursor (~> 0.5.0)
96
- tty-screen (~> 0.6.4)
97
- wisper (~> 2.0.0)
98
- tty-screen (0.6.5)
99
- tty-spinner (0.8.0)
100
- tty-cursor (>= 0.5.0)
101
- tty-table (0.10.0)
102
- equatable (~> 0.5.0)
103
- necromancer (~> 0.4.0)
104
- pastel (~> 0.7.2)
105
- strings (~> 0.1.0)
106
- tty-screen (~> 0.6.4)
107
- tty-tree (0.1.0)
108
47
  tty-which (0.3.0)
109
- unicode-display_width (1.4.0)
110
- unicode_utils (1.4.0)
111
- wisper (2.0.0)
112
48
 
113
49
  PLATFORMS
114
50
  ruby
@@ -119,6 +55,7 @@ DEPENDENCIES
119
55
  rake (~> 10.0)
120
56
  rake-compiler
121
57
  rspec (~> 3.0)
58
+ simplecov (~> 0.16.1)
122
59
 
123
60
  BUNDLED WITH
124
- 1.16.2
61
+ 1.17.3
data/README.md CHANGED
@@ -1,28 +1,75 @@
1
+ [![Gem Version](https://badge.fury.io/rb/dru.svg)](https://badge.fury.io/rb/dru)
2
+ [![CircleCI](https://circleci.com/gh/nebulab/dru/tree/master.svg?style=svg)](https://circleci.com/gh/nebulab/dru/tree/master)
3
+ [![Maintainability](https://api.codeclimate.com/v1/badges/9049d097bf908467eb85/maintainability)](https://codeclimate.com/github/nebulab/dru/maintainability)
4
+ [![Test Coverage](https://api.codeclimate.com/v1/badges/9049d097bf908467eb85/test_coverage)](https://codeclimate.com/github/nebulab/dru/test_coverage)
5
+
1
6
  # Dru
2
7
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/dru`. To experiment with that code, run `bin/console` for an interactive prompt.
8
+ DRU is a run utility to work on your projects with docker-compose where you can't put your config files inside the folder and also enhance the docker-compose command with custom commands, custom aliases, and environments support.
4
9
 
5
- TODO: Delete this and the text above, and describe your gem
10
+ ## Why should you use DRU?
6
11
 
7
- ## Installation
12
+ Sometimes when we are working on projects, we can't put docker related configuration files into the project folder
13
+ or push it into our version control system.
8
14
 
9
- Add this line to your application's Gemfile:
15
+ Sure, we can always put the docker configuration files in a different place, but every time we have to run a command, it looks like:
10
16
 
11
- ```ruby
12
- gem 'dru'
13
- ```
17
+ $ docker-compose -f ~/config_folder/docker-compose.yml up
18
+
19
+ and if we have another docker configuration for a different environment the things go even worst:
20
+
21
+ $ docker-compose -f ~/config_folder/docker-compose.yml -f ~/config_folder/docker-compose.test.yml up
22
+
23
+ By following some simple conventions, DRU let we run the first command with:
24
+
25
+ $ dru up
14
26
 
15
- And then execute:
27
+ and the second will be like:
16
28
 
17
- $ bundle
29
+ $ dru -e test up
18
30
 
19
- Or install it yourself as:
31
+ Furthermore, if we need to access the docker container shell, with vanilla docker-compose:
32
+
33
+ $ docker-compose -f ~/config_folder/docker-compose.yml run --rm --entrypoint sh container_name
34
+
35
+ with DRU:
36
+
37
+ $ dru shell container_name
38
+
39
+ ## Installation
20
40
 
21
41
  $ gem install dru
22
42
 
23
43
  ## Usage
24
44
 
25
- TODO: Write usage instructions here
45
+ Run:
46
+
47
+ $ dru help
48
+
49
+ for the list of the available commands.
50
+
51
+ All commands follow the same conventions. When you run a DRU command, by default it will look for a `docker-compose.yml` file into the `~/.dru/project_folder` where `project_folder` has the same name as the current working directory.
52
+
53
+ Suppose that you are in a directory called `example_project`, when you run a DRU command (e.g. `dru up`) it will search for a `docker-compose.yml` file into the `~/.dru/example_project` folder.
54
+
55
+ DRU also supports environments, that means that if you add the `-e test` option, it will combine the `~/.dru/example_project/docker-compose.yml` and `~/.dru/example_project/docker-compose.test.yml` into a single configuration.
56
+
57
+ Essentially it will run `docker-compose -f ~/.dru/example_project/docker-compose.yml -f ~/.dru/example_project/docker-compose.test.yml` when the second file name is given by the environment option. See [docker-compose documentation](https://docs.docker.com/compose/reference/overview/#specifying-multiple-compose-files) for more informations.
58
+
59
+ ## Configuration
60
+
61
+ To override the default configuration you have to create the file `.druconfig` under your home folder:
62
+
63
+ ```yaml
64
+ # ~/.druconfig
65
+
66
+ # default: ~/.dru if you like, you can set a custom location (path) for your docker configurations projects like ~/docker-config
67
+ docker_projects_folder: ~/.dru
68
+
69
+ # optional: use this if you want to create custom aliases
70
+ alias:
71
+ shell: run --rm --entrypoint sh
72
+ ```
26
73
 
27
74
  ## Development
28
75
 
@@ -32,12 +79,16 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
32
79
 
33
80
  ## Contributing
34
81
 
35
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/dru. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
82
+ Bug reports and pull requests are welcome on GitHub at https://github.com/nebulab/dru. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
83
+
84
+ ## License
85
+
86
+ DRU is copyright © 2019 [Nebulab](http://nebulab.it/). It is free software, and may be redistributed under the terms specified in the [license](LICENSE.txt).
36
87
 
37
- ## Code of Conduct
88
+ ## About
38
89
 
39
- Everyone interacting in the Dru project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/dru/blob/master/CODE_OF_CONDUCT.md).
90
+ ![Nebulab](http://nebulab.it/assets/images/public/logo.svg)
40
91
 
41
- ## Copyright
92
+ DRU is funded and maintained by the [Nebulab](http://nebulab.it/) team.
42
93
 
43
- Copyright (c) 2018 Nebulab. See [MIT License](LICENSE.txt) for further details.
94
+ We firmly believe in the power of open-source. [Contact us](http://nebulab.it/contact-us/) if you like our work and you need help with your project design or development.
@@ -35,22 +35,8 @@ Gem::Specification.new do |spec|
35
35
  spec.require_paths = ["lib"]
36
36
  spec.extensions = ["ext/dru/extconf.rb"]
37
37
 
38
- spec.add_dependency "tty-color", "~> 0.4.2"
39
38
  spec.add_dependency "tty-command", "~> 0.8.0"
40
39
  spec.add_dependency "tty-config", "~> 0.2.0"
41
- spec.add_dependency "tty-cursor", "~> 0.5.0"
42
- spec.add_dependency "tty-editor", "~> 0.4.0"
43
- spec.add_dependency "tty-file", "~> 0.6.0"
44
- spec.add_dependency "tty-font", "~> 0.2.0"
45
- spec.add_dependency "tty-markdown", "~> 0.4.0"
46
- spec.add_dependency "tty-pager", "~> 0.11.0"
47
- spec.add_dependency "tty-platform", "~> 0.1.0"
48
- spec.add_dependency "tty-progressbar", "~> 0.15.0"
49
- spec.add_dependency "tty-prompt", "~> 0.16.1"
50
- spec.add_dependency "tty-screen", "~> 0.6.4"
51
- spec.add_dependency "tty-spinner", "~> 0.8.0"
52
- spec.add_dependency "tty-table", "~> 0.10.0"
53
- spec.add_dependency "tty-tree", "~> 0.1.0"
54
40
  spec.add_dependency "tty-which", "~> 0.3.0"
55
41
  spec.add_dependency "pastel", "~> 0.7.2"
56
42
  spec.add_dependency "thor", "~> 0.20.0"
@@ -59,4 +45,5 @@ Gem::Specification.new do |spec|
59
45
  spec.add_development_dependency "rake", "~> 10.0"
60
46
  spec.add_development_dependency "rake-compiler"
61
47
  spec.add_development_dependency "rspec", "~> 3.0"
48
+ spec.add_development_dependency "simplecov", "~> 0.16.1"
62
49
  end
data/exe/dru CHANGED
@@ -6,13 +6,11 @@ $:.unshift(lib_path) if !$:.include?(lib_path)
6
6
  require 'dru'
7
7
 
8
8
  Signal.trap('INT') do
9
- warn("\n#{caller.join("\n")}: interrupted")
10
9
  exit(1)
11
10
  end
12
11
 
13
12
  begin
14
- Dru::CLI.start(Dru::Argv.new.parse)
15
- rescue Dru::CLI::Error => err
16
- puts "ERROR: #{err.message}"
13
+ Dru::CLI.start(Dru::Argv.parse)
14
+ rescue Dru::CLI::Error
17
15
  exit 1
18
16
  end
data/lib/dru.rb CHANGED
@@ -4,10 +4,11 @@ require "dru/cli"
4
4
 
5
5
  module Dru
6
6
  DRUCONFIG = File.expand_path('~/.druconfig')
7
+ DOCKER_COMMAND = 'docker'.freeze
7
8
  DOCKER_COMPOSE_COMMAND = 'docker-compose'.freeze
8
- DOCKER_COMPOSE_COMMANDS = %w[build bundle config create events images kill
9
- logs pause port ps pull push restart rm scale
10
- start stop top unpause]
9
+ DOCKER_COMPOSE_COMMANDS = %w[build bundle config create down events exec images kill
10
+ logs pause port ps pull push restart rm run scale
11
+ start stop top unpause up]
11
12
 
12
13
  def self.config
13
14
  Config.instance.tap { |instance| instance.config_file_path = DRUCONFIG }
@@ -1,27 +1,66 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'shellwords'
4
+
3
5
  module Dru
4
6
  class Argv
5
7
  attr_reader :argv
6
8
 
9
+ def self.parse(*args)
10
+ new(*args).parse
11
+ end
12
+
7
13
  def initialize(argv = ARGV)
8
- @argv = argv
14
+ @argv = argv.dup
9
15
  end
10
16
 
11
17
  def parse
12
- return argv unless docker_compose_command_index
18
+ return argv unless known_command
13
19
 
14
- argv.dup.insert(docker_compose_command_index, Thor::Options::OPTS_END)
20
+ if dru_command?(known_command)
21
+ parse_dru_command
22
+ elsif docker_compose_command?(known_command)
23
+ parse_docker_compose_command
24
+ else
25
+ parse_alias_command
26
+ end
15
27
  end
16
28
 
17
29
  private
18
30
 
19
- def docker_compose_command_index
20
- argv.index { |arg| docker_compose_command?(arg) }
31
+ def parse_docker_compose_command
32
+ argv.insert(known_command_index, Thor::Options::OPTS_END)
33
+ end
34
+
35
+ def parse_dru_command
36
+ argv.unshift(argv.delete(known_command))
37
+ end
38
+
39
+ def parse_alias_command
40
+ argv[known_command_index] = Shellwords.split(Dru.config.alias[known_command])
41
+ @argv = self.class.parse(argv.flatten)
42
+ end
43
+
44
+ def known_command
45
+ argv[known_command_index] if known_command_index
46
+ end
47
+
48
+ def known_command_index
49
+ @known_command_index ||= argv.index do |arg|
50
+ dru_command?(arg) || docker_compose_command?(arg) || alias_command?(arg)
51
+ end
52
+ end
53
+
54
+ def docker_compose_command?(command)
55
+ Dru::DOCKER_COMPOSE_COMMANDS.include?(command)
56
+ end
57
+
58
+ def dru_command?(command)
59
+ Dru::CLI.commands.keys.push('help').include?(command)
21
60
  end
22
61
 
23
- def docker_compose_command?(arg)
24
- Dru::DOCKER_COMPOSE_COMMANDS.include?(arg)
62
+ def alias_command?(command)
63
+ Dru.config.alias.respond_to?(command)
25
64
  end
26
65
  end
27
66
  end
@@ -16,6 +16,8 @@ module Dru
16
16
 
17
17
  default_command :docker_compose
18
18
 
19
+ stop_on_unknown_option! :attach, :up
20
+
19
21
  def self.help(shell, subcommand = false)
20
22
  shell.say `#{DOCKER_COMPOSE_COMMAND} help`
21
23
  shell.say
@@ -50,73 +52,18 @@ Usage:
50
52
  end
51
53
  end
52
54
 
53
- desc 'down', 'Stops containers and removes containers, networks, volumes, and images created by `up`.'
54
- method_option :help, aliases: '-h', type: :boolean,
55
- desc: 'Display usage information'
56
- def down(*)
57
- if options[:help]
58
- invoke :help, ['down']
59
- else
60
- require_relative 'commands/down'
61
- Dru::Commands::Down.new.execute
62
- end
63
- end
64
-
65
- desc 'attach', 'Attach local standard input, output, and error streams to a running container'
55
+ desc 'attach [OPTIONS] SERVICE', 'Attach local standard input, output, and error streams to a running service'
66
56
  method_option :help, aliases: '-h', type: :boolean,
67
57
  desc: 'Display usage information'
68
- method_option :container, aliases: '-c', type: :string, default: 'app',
69
- desc: 'Container name'
70
- def attach(*)
71
- if options[:help]
58
+ method_option :detach_keys, type: :string, default: 'ctrl-d',
59
+ desc: 'Override the key sequence for detaching a container'
60
+ def attach(service = nil)
61
+ if options[:help] || service.nil?
72
62
  invoke :help, ['attach']
73
63
  else
74
64
  require_relative 'commands/attach'
75
- Dru::Commands::Attach.new(options: options).execute
76
- end
77
- end
78
-
79
- desc 'exec', 'Execute a command in a running container.'
80
- method_option :help, aliases: '-h', type: :boolean,
81
- desc: 'Display usage information'
82
- method_option :container, aliases: '-c', type: :string, default: 'app',
83
- desc: 'Container name'
84
- def exec(*command)
85
- if options[:help]
86
- invoke :help, ['exec']
87
- else
88
- require_relative 'commands/exec'
89
- Dru::Commands::Exec.new(command: command, options: options).execute
90
- end
91
- end
92
-
93
- desc 'up', 'Build, (re)create, start, and attach to default container'
94
- method_option :help, aliases: '-h', type: :boolean,
95
- desc: 'Display usage information'
96
- method_option :detach, aliases: '-d', type: :boolean,
97
- desc: 'Detached mode'
98
- def up(*)
99
- if options[:help]
100
- invoke :help, ['up']
101
- else
102
- require_relative 'commands/up'
103
- Dru::Commands::Up.new(options: options).execute
104
- end
105
- end
106
-
107
- desc 'run', 'Command description...'
108
- method_option :help, aliases: '-h', type: :boolean,
109
- desc: 'Display usage information'
110
- method_option :container, aliases: '-c', type: :string, default: 'app',
111
- desc: 'Container name'
112
- def runner(*command)
113
- if options[:help]
114
- invoke :help, ['runner']
115
- else
116
- require_relative 'commands/runner'
117
- Dru::Commands::Runner.new(command: command, options: options).execute
65
+ Dru::Commands::Attach.new(service: service, options: options).execute
118
66
  end
119
67
  end
120
- map %w(run) => :runner
121
68
  end
122
69
  end
@@ -6,16 +6,8 @@ module Dru
6
6
  class Command
7
7
  extend Forwardable
8
8
 
9
- class MissingContainerError < StandardError
10
- def initialize(msg = 'Missing container')
11
- super
12
- end
13
- end
14
-
15
9
  attr_accessor :options
16
10
 
17
- def_delegators :command, :run
18
-
19
11
  # Execute this command
20
12
  #
21
13
  # @api public
@@ -36,76 +28,6 @@ module Dru
36
28
  TTY::Command.new({ printer: :quiet, uuid: false }.merge(options))
37
29
  end
38
30
 
39
- # The cursor movement
40
- #
41
- # @see http://www.rubydoc.info/gems/tty-cursor
42
- #
43
- # @api public
44
- def cursor
45
- require 'tty-cursor'
46
- TTY::Cursor
47
- end
48
-
49
- # Open a file or text in the user's preferred editor
50
- #
51
- # @see http://www.rubydoc.info/gems/tty-editor
52
- #
53
- # @api public
54
- def editor
55
- require 'tty-editor'
56
- TTY::Editor
57
- end
58
-
59
- # File manipulation utility methods
60
- #
61
- # @see http://www.rubydoc.info/gems/tty-file
62
- #
63
- # @api public
64
- def generator
65
- require 'tty-file'
66
- TTY::File
67
- end
68
-
69
- # Terminal output paging
70
- #
71
- # @see http://www.rubydoc.info/gems/tty-pager
72
- #
73
- # @api public
74
- def pager(**options)
75
- require 'tty-pager'
76
- TTY::Pager.new(options)
77
- end
78
-
79
- # Terminal platform and OS properties
80
- #
81
- # @see http://www.rubydoc.info/gems/tty-pager
82
- #
83
- # @api public
84
- def platform
85
- require 'tty-platform'
86
- TTY::Platform.new
87
- end
88
-
89
- # The interactive prompt
90
- #
91
- # @see http://www.rubydoc.info/gems/tty-prompt
92
- #
93
- # @api public
94
- def prompt(**options)
95
- require 'tty-prompt'
96
- TTY::Prompt.new(options)
97
- end
98
-
99
- # Get terminal screen properties
100
- #
101
- # @see http://www.rubydoc.info/gems/tty-screen
102
- #
103
- # @api public
104
- def screen
105
- require 'tty-screen'
106
- TTY::Screen
107
- end
108
-
109
31
  # The unix which utility
110
32
  #
111
33
  # @see http://www.rubydoc.info/gems/tty-which
@@ -142,26 +64,39 @@ module Dru
142
64
  File.join(project_configuration_path, 'docker-compose.yml')
143
65
  end
144
66
 
145
- def environment_docker_compose
146
- return unless environment
147
-
148
- File.join(project_configuration_path, "docker-compose.#{environment}.yml")
67
+ def override_docker_compose
68
+ override = environment || 'override'
69
+ docker_compose_file = File.join(project_configuration_path, "docker-compose.#{override}.yml")
70
+ return unless File.exist?(docker_compose_file)
71
+ docker_compose_file
149
72
  end
150
73
 
151
74
  def docker_compose_paths
152
- docker_compose_default_path + docker_compose_environment_path
75
+ docker_compose_default_path + docker_compose_override_path
153
76
  end
154
77
 
155
- def run_docker_compose_command(*args, **options)
156
- if options[:tty]
157
- system(DOCKER_COMPOSE_COMMAND, *docker_compose_paths, *args)
158
- else
159
- command(options).run(DOCKER_COMPOSE_COMMAND, *docker_compose_paths, *args)
78
+ def run(*command, **options)
79
+ command(options).run!(*command, { in: '/dev/tty', err: '/dev/tty' }.merge(options)).tap do |result|
80
+ raise Dru::CLI::Error, result.err unless result.success?
160
81
  end
161
82
  end
162
83
 
163
- def container_name_to_id(container_name = 'app')
164
- run_docker_compose_command('ps', '-q', container_name, printer: :null).first
84
+ def run_docker_compose_command(*command, **options)
85
+ run(DOCKER_COMPOSE_COMMAND, '-p', docker_compose_project_name, *docker_compose_paths, *command, **options)
86
+ end
87
+
88
+ def run_docker_command(*command, **options)
89
+ run(DOCKER_COMMAND, *command, **options)
90
+ end
91
+
92
+ def container_name_to_id(container_name)
93
+ run_docker_compose_command('ps', '-q', container_name, only_output_on_error: true).out.strip
94
+ end
95
+
96
+ def docker_compose_project_name
97
+ return project_name unless environment
98
+
99
+ "#{project_name}_#{environment}"
165
100
  end
166
101
 
167
102
  private
@@ -170,10 +105,10 @@ module Dru
170
105
  ['-f', default_docker_compose]
171
106
  end
172
107
 
173
- def docker_compose_environment_path
174
- return [] unless environment_docker_compose
108
+ def docker_compose_override_path
109
+ return [] unless override_docker_compose
175
110
 
176
- ['-f', environment_docker_compose]
111
+ ['-f', override_docker_compose]
177
112
  end
178
113
  end
179
114
  end
@@ -1,25 +1,29 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../container_command'
4
- require_relative './down'
3
+ require_relative '../command'
5
4
 
6
5
  module Dru
7
6
  module Commands
8
- class Attach < Dru::ContainerCommand
9
- DOCKER_ATTACH_COMMAND = 'docker attach --detach-keys="ctrl-d"'.freeze
7
+ class Attach < Dru::Command
8
+ ATTACH_COMMAND = 'attach'
9
+
10
+ def initialize(service:, options:)
11
+ @service = service
12
+ @options = options
13
+ end
10
14
 
11
15
  def execute(input: $stdin, output: $stdout)
12
- stop_docker_compose if attach_to_container
16
+ run_docker_command(ATTACH_COMMAND, detach_keys, container_id)
13
17
  end
14
18
 
15
19
  private
16
20
 
17
- def stop_docker_compose
18
- Down.new.execute
21
+ def detach_keys
22
+ "--detach-keys=#{@options[:detach_keys]}"
19
23
  end
20
24
 
21
- def attach_to_container
22
- system "#{DOCKER_ATTACH_COMMAND} #{container_name_to_id(container)}"
25
+ def container_id
26
+ container_name_to_id(@service)
23
27
  end
24
28
  end
25
29
  end
@@ -5,15 +5,13 @@ require_relative '../command'
5
5
  module Dru
6
6
  module Commands
7
7
  class DockerCompose < Dru::Command
8
- attr_reader :command
9
-
10
8
  def initialize(options:, command:)
11
9
  @options = options
12
10
  @command = command
13
11
  end
14
12
 
15
13
  def execute(input: $stdin, output: $stdout)
16
- run_docker_compose_command(*command, tty: true)
14
+ run_docker_compose_command(*@command, tty: true)
17
15
  end
18
16
  end
19
17
  end
@@ -8,10 +8,11 @@ module Dru
8
8
  extend Forwardable
9
9
  include Singleton
10
10
 
11
- def_delegators :configs, :docker_projects_folder
11
+ def_delegators :configs, :docker_projects_folder, :alias
12
12
 
13
13
  DEFAULT = {
14
- 'docker_projects_folder' => "~/.dru"
14
+ 'docker_projects_folder' => "~/.dru",
15
+ 'alias' => {}
15
16
  }.freeze
16
17
 
17
18
  attr_reader :config_file_path
@@ -29,6 +30,7 @@ module Dru
29
30
 
30
31
  def user_configs
31
32
  return {} unless config_file_path && File.file?(config_file_path)
33
+
32
34
  YAML.load_file(config_file_path) || {}
33
35
  end
34
36
  end
@@ -1,3 +1,3 @@
1
1
  module Dru
2
- VERSION = "0.6.0"
2
+ VERSION = "1.0.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dru
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christian Rimondi
@@ -9,22 +9,8 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2019-01-25 00:00:00.000000000 Z
12
+ date: 2019-03-22 00:00:00.000000000 Z
13
13
  dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: tty-color
16
- requirement: !ruby/object:Gem::Requirement
17
- requirements:
18
- - - "~>"
19
- - !ruby/object:Gem::Version
20
- version: 0.4.2
21
- type: :runtime
22
- prerelease: false
23
- version_requirements: !ruby/object:Gem::Requirement
24
- requirements:
25
- - - "~>"
26
- - !ruby/object:Gem::Version
27
- version: 0.4.2
28
14
  - !ruby/object:Gem::Dependency
29
15
  name: tty-command
30
16
  requirement: !ruby/object:Gem::Requirement
@@ -53,188 +39,6 @@ dependencies:
53
39
  - - "~>"
54
40
  - !ruby/object:Gem::Version
55
41
  version: 0.2.0
56
- - !ruby/object:Gem::Dependency
57
- name: tty-cursor
58
- requirement: !ruby/object:Gem::Requirement
59
- requirements:
60
- - - "~>"
61
- - !ruby/object:Gem::Version
62
- version: 0.5.0
63
- type: :runtime
64
- prerelease: false
65
- version_requirements: !ruby/object:Gem::Requirement
66
- requirements:
67
- - - "~>"
68
- - !ruby/object:Gem::Version
69
- version: 0.5.0
70
- - !ruby/object:Gem::Dependency
71
- name: tty-editor
72
- requirement: !ruby/object:Gem::Requirement
73
- requirements:
74
- - - "~>"
75
- - !ruby/object:Gem::Version
76
- version: 0.4.0
77
- type: :runtime
78
- prerelease: false
79
- version_requirements: !ruby/object:Gem::Requirement
80
- requirements:
81
- - - "~>"
82
- - !ruby/object:Gem::Version
83
- version: 0.4.0
84
- - !ruby/object:Gem::Dependency
85
- name: tty-file
86
- requirement: !ruby/object:Gem::Requirement
87
- requirements:
88
- - - "~>"
89
- - !ruby/object:Gem::Version
90
- version: 0.6.0
91
- type: :runtime
92
- prerelease: false
93
- version_requirements: !ruby/object:Gem::Requirement
94
- requirements:
95
- - - "~>"
96
- - !ruby/object:Gem::Version
97
- version: 0.6.0
98
- - !ruby/object:Gem::Dependency
99
- name: tty-font
100
- requirement: !ruby/object:Gem::Requirement
101
- requirements:
102
- - - "~>"
103
- - !ruby/object:Gem::Version
104
- version: 0.2.0
105
- type: :runtime
106
- prerelease: false
107
- version_requirements: !ruby/object:Gem::Requirement
108
- requirements:
109
- - - "~>"
110
- - !ruby/object:Gem::Version
111
- version: 0.2.0
112
- - !ruby/object:Gem::Dependency
113
- name: tty-markdown
114
- requirement: !ruby/object:Gem::Requirement
115
- requirements:
116
- - - "~>"
117
- - !ruby/object:Gem::Version
118
- version: 0.4.0
119
- type: :runtime
120
- prerelease: false
121
- version_requirements: !ruby/object:Gem::Requirement
122
- requirements:
123
- - - "~>"
124
- - !ruby/object:Gem::Version
125
- version: 0.4.0
126
- - !ruby/object:Gem::Dependency
127
- name: tty-pager
128
- requirement: !ruby/object:Gem::Requirement
129
- requirements:
130
- - - "~>"
131
- - !ruby/object:Gem::Version
132
- version: 0.11.0
133
- type: :runtime
134
- prerelease: false
135
- version_requirements: !ruby/object:Gem::Requirement
136
- requirements:
137
- - - "~>"
138
- - !ruby/object:Gem::Version
139
- version: 0.11.0
140
- - !ruby/object:Gem::Dependency
141
- name: tty-platform
142
- requirement: !ruby/object:Gem::Requirement
143
- requirements:
144
- - - "~>"
145
- - !ruby/object:Gem::Version
146
- version: 0.1.0
147
- type: :runtime
148
- prerelease: false
149
- version_requirements: !ruby/object:Gem::Requirement
150
- requirements:
151
- - - "~>"
152
- - !ruby/object:Gem::Version
153
- version: 0.1.0
154
- - !ruby/object:Gem::Dependency
155
- name: tty-progressbar
156
- requirement: !ruby/object:Gem::Requirement
157
- requirements:
158
- - - "~>"
159
- - !ruby/object:Gem::Version
160
- version: 0.15.0
161
- type: :runtime
162
- prerelease: false
163
- version_requirements: !ruby/object:Gem::Requirement
164
- requirements:
165
- - - "~>"
166
- - !ruby/object:Gem::Version
167
- version: 0.15.0
168
- - !ruby/object:Gem::Dependency
169
- name: tty-prompt
170
- requirement: !ruby/object:Gem::Requirement
171
- requirements:
172
- - - "~>"
173
- - !ruby/object:Gem::Version
174
- version: 0.16.1
175
- type: :runtime
176
- prerelease: false
177
- version_requirements: !ruby/object:Gem::Requirement
178
- requirements:
179
- - - "~>"
180
- - !ruby/object:Gem::Version
181
- version: 0.16.1
182
- - !ruby/object:Gem::Dependency
183
- name: tty-screen
184
- requirement: !ruby/object:Gem::Requirement
185
- requirements:
186
- - - "~>"
187
- - !ruby/object:Gem::Version
188
- version: 0.6.4
189
- type: :runtime
190
- prerelease: false
191
- version_requirements: !ruby/object:Gem::Requirement
192
- requirements:
193
- - - "~>"
194
- - !ruby/object:Gem::Version
195
- version: 0.6.4
196
- - !ruby/object:Gem::Dependency
197
- name: tty-spinner
198
- requirement: !ruby/object:Gem::Requirement
199
- requirements:
200
- - - "~>"
201
- - !ruby/object:Gem::Version
202
- version: 0.8.0
203
- type: :runtime
204
- prerelease: false
205
- version_requirements: !ruby/object:Gem::Requirement
206
- requirements:
207
- - - "~>"
208
- - !ruby/object:Gem::Version
209
- version: 0.8.0
210
- - !ruby/object:Gem::Dependency
211
- name: tty-table
212
- requirement: !ruby/object:Gem::Requirement
213
- requirements:
214
- - - "~>"
215
- - !ruby/object:Gem::Version
216
- version: 0.10.0
217
- type: :runtime
218
- prerelease: false
219
- version_requirements: !ruby/object:Gem::Requirement
220
- requirements:
221
- - - "~>"
222
- - !ruby/object:Gem::Version
223
- version: 0.10.0
224
- - !ruby/object:Gem::Dependency
225
- name: tty-tree
226
- requirement: !ruby/object:Gem::Requirement
227
- requirements:
228
- - - "~>"
229
- - !ruby/object:Gem::Version
230
- version: 0.1.0
231
- type: :runtime
232
- prerelease: false
233
- version_requirements: !ruby/object:Gem::Requirement
234
- requirements:
235
- - - "~>"
236
- - !ruby/object:Gem::Version
237
- version: 0.1.0
238
42
  - !ruby/object:Gem::Dependency
239
43
  name: tty-which
240
44
  requirement: !ruby/object:Gem::Requirement
@@ -333,6 +137,20 @@ dependencies:
333
137
  - - "~>"
334
138
  - !ruby/object:Gem::Version
335
139
  version: '3.0'
140
+ - !ruby/object:Gem::Dependency
141
+ name: simplecov
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - "~>"
145
+ - !ruby/object:Gem::Version
146
+ version: 0.16.1
147
+ type: :development
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - "~>"
152
+ - !ruby/object:Gem::Version
153
+ version: 0.16.1
336
154
  description: " A ruby tool to simplify the development workflow with Docker Compose
337
155
  and Docker.\n"
338
156
  email:
@@ -344,10 +162,10 @@ extensions:
344
162
  - ext/dru/extconf.rb
345
163
  extra_rdoc_files: []
346
164
  files:
165
+ - ".circleci/config.yml"
347
166
  - ".gitignore"
348
167
  - ".rspec"
349
168
  - ".travis.yml"
350
- - CODE_OF_CONDUCT.md
351
169
  - Gemfile
352
170
  - Gemfile.lock
353
171
  - LICENSE.txt
@@ -367,12 +185,7 @@ files:
367
185
  - lib/dru/commands/.gitkeep
368
186
  - lib/dru/commands/attach.rb
369
187
  - lib/dru/commands/docker_compose.rb
370
- - lib/dru/commands/down.rb
371
- - lib/dru/commands/exec.rb
372
- - lib/dru/commands/runner.rb
373
- - lib/dru/commands/up.rb
374
188
  - lib/dru/config.rb
375
- - lib/dru/container_command.rb
376
189
  - lib/dru/templates/.gitkeep
377
190
  - lib/dru/templates/attach/.gitkeep
378
191
  - lib/dru/templates/docker_compose/.gitkeep
@@ -1,74 +0,0 @@
1
- # Contributor Covenant Code of Conduct
2
-
3
- ## Our Pledge
4
-
5
- In the interest of fostering an open and welcoming environment, we as
6
- contributors and maintainers pledge to making participation in our project and
7
- our community a harassment-free experience for everyone, regardless of age, body
8
- size, disability, ethnicity, gender identity and expression, level of experience,
9
- nationality, personal appearance, race, religion, or sexual identity and
10
- orientation.
11
-
12
- ## Our Standards
13
-
14
- Examples of behavior that contributes to creating a positive environment
15
- include:
16
-
17
- * Using welcoming and inclusive language
18
- * Being respectful of differing viewpoints and experiences
19
- * Gracefully accepting constructive criticism
20
- * Focusing on what is best for the community
21
- * Showing empathy towards other community members
22
-
23
- Examples of unacceptable behavior by participants include:
24
-
25
- * The use of sexualized language or imagery and unwelcome sexual attention or
26
- advances
27
- * Trolling, insulting/derogatory comments, and personal or political attacks
28
- * Public or private harassment
29
- * Publishing others' private information, such as a physical or electronic
30
- address, without explicit permission
31
- * Other conduct which could reasonably be considered inappropriate in a
32
- professional setting
33
-
34
- ## Our Responsibilities
35
-
36
- Project maintainers are responsible for clarifying the standards of acceptable
37
- behavior and are expected to take appropriate and fair corrective action in
38
- response to any instances of unacceptable behavior.
39
-
40
- Project maintainers have the right and responsibility to remove, edit, or
41
- reject comments, commits, code, wiki edits, issues, and other contributions
42
- that are not aligned to this Code of Conduct, or to ban temporarily or
43
- permanently any contributor for other behaviors that they deem inappropriate,
44
- threatening, offensive, or harmful.
45
-
46
- ## Scope
47
-
48
- This Code of Conduct applies both within project spaces and in public spaces
49
- when an individual is representing the project or its community. Examples of
50
- representing a project or community include using an official project e-mail
51
- address, posting via an official social media account, or acting as an appointed
52
- representative at an online or offline event. Representation of a project may be
53
- further defined and clarified by project maintainers.
54
-
55
- ## Enforcement
56
-
57
- Instances of abusive, harassing, or otherwise unacceptable behavior may be
58
- reported by contacting the project team at christian.rimondi@gmail.com. All
59
- complaints will be reviewed and investigated and will result in a response that
60
- is deemed necessary and appropriate to the circumstances. The project team is
61
- obligated to maintain confidentiality with regard to the reporter of an incident.
62
- Further details of specific enforcement policies may be posted separately.
63
-
64
- Project maintainers who do not follow or enforce the Code of Conduct in good
65
- faith may face temporary or permanent repercussions as determined by other
66
- members of the project's leadership.
67
-
68
- ## Attribution
69
-
70
- This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
71
- available at [http://contributor-covenant.org/version/1/4][version]
72
-
73
- [homepage]: http://contributor-covenant.org
74
- [version]: http://contributor-covenant.org/version/1/4/
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../command'
4
-
5
- module Dru
6
- module Commands
7
- class Down < Dru::Command
8
- def execute(input: $stdin, output: $stdout)
9
- run_docker_compose_command('down')
10
- end
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../container_command'
4
-
5
- module Dru
6
- module Commands
7
- class Exec < Dru::ContainerCommand
8
- def execute(input: $stdin, output: $stdout)
9
- run_docker_compose_command('exec', container, *@command, tty: true)
10
- end
11
- end
12
- end
13
- end
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../container_command'
4
-
5
- module Dru
6
- module Commands
7
- class Runner < Dru::ContainerCommand
8
- def execute(input: $stdin, output: $stdout)
9
- run_docker_compose_command('run', '--rm', '--entrypoint', 'sh -c', container, command, tty: true)
10
- end
11
-
12
- private
13
-
14
- def command
15
- @command.join(' ')
16
- end
17
- end
18
- end
19
- end
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../command'
4
- require_relative './attach'
5
-
6
- module Dru
7
- module Commands
8
- class Up < Dru::Command
9
- def initialize(options:)
10
- @options = options
11
- end
12
-
13
- def execute(input: $stdin, output: $stdout)
14
- start_docker_compose
15
- return if options[:detach]
16
-
17
- attach_to_default_container
18
- end
19
-
20
- private
21
-
22
- def start_docker_compose
23
- run_docker_compose_command('up', '-d')
24
- end
25
-
26
- def attach_to_default_container
27
- Attach.new(options: { container: 'app' }).execute
28
- end
29
- end
30
- end
31
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative './command'
4
-
5
- module Dru
6
- class ContainerCommand < Command
7
- def initialize(command: nil, options:)
8
- raise MissingContainerError unless options[:container]
9
-
10
- @options = options
11
- @command = command || []
12
- end
13
-
14
- def execute(input: $stdin, output: $stdout)
15
- raise NotImplementedError
16
- end
17
-
18
- protected
19
-
20
- def container
21
- options[:container]
22
- end
23
- end
24
- end