geordi 2.11.0 → 2.12.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c18885f25960a7c8977933c0910c427cb4ca43a462b80ae272610514e7597f0e
4
- data.tar.gz: 07a5a7c2cfd084b0e148a3f02fc4a294119ea6e65d2664bde0c8f3da2f37429f
3
+ metadata.gz: 5ae46d6ac8d8dd9bf53654f65445df1d0c576833db47db589b76e94cbb5784c0
4
+ data.tar.gz: 0034075de2f4f848686463486854cfaaee3980918048ce3480c3d6dc50634f0b
5
5
  SHA512:
6
- metadata.gz: 0225535d4bce93d49b6a49cd27d53da4de8814298a835961beacebcc17c972b10c155ae6a66b136b9614725cab551e8a93868cf2c7d26f67570eb86714dca0a3
7
- data.tar.gz: 5e0d4bdf3f39f9e5253b25abd515deaac20831b0bc8694eafc2c34a1b961f7ca37a78d7149b7a5711611a7eb886b6996ed24ff4f66b67c1d5ce7e8ffd5c2695e
6
+ metadata.gz: c52e541c8204de7e79e2935211251001b9992898770632eca578678eae5b58d4d8edb5c64b2ec82fa4f797109adc76091f9293a4bd2e3a0567c1a65a050791ab
7
+ data.tar.gz: 63bdba922fb2eaccd2edd3fffe233abc67fce88587606fea218685b4ee682181ea5f8c6daf728227dfa736d838327eef6f1ae930f67dec056dcd6c23fb0d6a85
data/Gemfile CHANGED
@@ -4,6 +4,7 @@ source 'http://rubygems.org'
4
4
  gemspec
5
5
 
6
6
  gem 'aruba'
7
+ gem 'contracts', '=0.9'
7
8
  gem 'rspec-mocks'
8
9
  gem 'highline'
9
10
  gem 'parallel_tests'
@@ -1,38 +1,69 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- geordi (2.11.0)
4
+ geordi (2.12.0)
5
5
  thor (~> 0.18.0)
6
6
 
7
7
  GEM
8
8
  remote: http://rubygems.org/
9
9
  specs:
10
10
  addressable (2.3.8)
11
- aruba (0.6.2)
12
- childprocess (>= 0.3.6)
13
- cucumber (>= 1.1.1)
14
- rspec-expectations (>= 2.7.0)
15
- builder (3.2.3)
16
- childprocess (1.0.1)
17
- rake (< 13.0)
11
+ aruba (0.8.1)
12
+ childprocess (~> 0.5.6)
13
+ contracts (~> 0.9)
14
+ cucumber (>= 1.3.19)
15
+ rspec-expectations (>= 2.99)
16
+ axiom-types (0.1.1)
17
+ descendants_tracker (~> 0.0.4)
18
+ ice_nine (~> 0.11.0)
19
+ thread_safe (~> 0.3, >= 0.3.1)
20
+ builder (3.2.4)
21
+ childprocess (0.5.9)
22
+ ffi (~> 1.0, >= 1.0.11)
23
+ coderay (1.1.3)
24
+ coercible (1.0.0)
25
+ descendants_tracker (~> 0.0.1)
26
+ contracts (0.9)
18
27
  cucumber (1.3.20)
19
28
  builder (>= 2.1.2)
20
29
  diff-lcs (>= 1.1.3)
21
30
  gherkin (~> 2.12)
22
31
  multi_json (>= 1.7.5, < 2.0)
23
32
  multi_test (>= 0.1.2)
33
+ declarative (0.0.20)
34
+ declarative-option (0.1.0)
35
+ descendants_tracker (0.0.4)
36
+ thread_safe (~> 0.3, >= 0.3.1)
24
37
  diff-lcs (1.2.5)
38
+ equalizer (0.0.11)
39
+ excon (0.78.0)
40
+ faraday (1.1.0)
41
+ multipart-post (>= 1.2, < 3)
42
+ ruby2_keywords
43
+ faraday_middleware (1.0.0)
44
+ faraday (~> 1.0)
45
+ ffi (1.9.18)
25
46
  gherkin (2.12.2)
26
47
  multi_json (~> 1.3)
27
48
  highline (1.6.21)
49
+ ice_nine (0.11.2)
28
50
  launchy (2.4.3)
29
51
  addressable (~> 2.3)
30
- multi_json (1.13.1)
52
+ method_source (1.0.0)
53
+ mimemagic (0.3.5)
54
+ multi_json (1.15.0)
31
55
  multi_test (0.1.2)
56
+ multipart-post (2.1.1)
32
57
  parallel (0.5.16)
33
58
  parallel_tests (0.6.18)
34
59
  parallel
35
- rake (10.5.0)
60
+ pry (0.13.1)
61
+ coderay (~> 1.1)
62
+ method_source (~> 1.0)
63
+ representable (3.0.4)
64
+ declarative (< 0.1.0)
65
+ declarative-option (< 0.2.0)
66
+ uber (< 0.2.0)
36
67
  rspec-expectations (3.4.0)
37
68
  diff-lcs (>= 1.2.0, < 2.0)
38
69
  rspec-support (~> 3.4.0)
@@ -40,18 +71,39 @@ GEM
40
71
  diff-lcs (>= 1.2.0, < 2.0)
41
72
  rspec-support (~> 3.4.0)
42
73
  rspec-support (3.4.1)
74
+ ruby2_keywords (0.0.2)
43
75
  thor (0.18.1)
76
+ thread_safe (0.3.6)
77
+ tracker_api (1.11.0)
78
+ addressable
79
+ equalizer
80
+ excon
81
+ faraday
82
+ faraday_middleware
83
+ mimemagic
84
+ multi_json
85
+ representable
86
+ virtus
87
+ uber (0.1.0)
88
+ virtus (1.0.5)
89
+ axiom-types (~> 0.1)
90
+ coercible (~> 1.0)
91
+ descendants_tracker (~> 0.0, >= 0.0.3)
92
+ equalizer (~> 0.0, >= 0.0.9)
44
93
 
45
94
  PLATFORMS
46
95
  ruby
47
96
 
48
97
  DEPENDENCIES
49
98
  aruba
99
+ contracts (= 0.9)
50
100
  geordi!
51
101
  highline
52
102
  launchy
53
103
  parallel_tests
104
+ pry
54
105
  rspec-mocks
106
+ tracker_api
55
107
 
56
108
  BUNDLED WITH
57
109
  1.17.3
data/README.md CHANGED
@@ -54,6 +54,11 @@ Commit using a story title from Pivotal Tracker.
54
54
 
55
55
  Example: `geordi commit`
56
56
 
57
+ Any extra arguments are forwarded to `git commit -m <message>`.
58
+
59
+ If there are no staged changes, prints a warning but will continue to create
60
+ an empty commit.
61
+
57
62
  On the first execution we ask for your Pivotal Tracker API token. It will be
58
63
  stored in `~/.gitpt`.
59
64
 
@@ -135,6 +140,23 @@ instead of `cap deploy:migrations`. You can force using `deploy` by passing the
135
140
  -M option: `geordi deploy -M staging`.
136
141
 
137
142
 
143
+ ### `geordi docker`
144
+
145
+ Manage docker containers for the current project.
146
+
147
+ Manage docker containers to run your project dockerized.
148
+
149
+ It expects a docker-compose file that specifies all services, and a service
150
+ named "main" that opens a shell for the project.
151
+
152
+ There are two subcommands:
153
+
154
+ - geordi docker setup
155
+ Builds all docker containers.
156
+ - geordi docker shell
157
+ Runs the docker service named 'main'.
158
+
159
+
138
160
  ### `geordi drop-databases`
139
161
 
140
162
  Interactively delete local databases.
data/bin/geordi CHANGED
@@ -1,5 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
4
+
3
5
  require 'geordi/util'
4
6
 
5
7
  Geordi::Util.installing_missing_gems do
@@ -0,0 +1,59 @@
1
+ @same-process
2
+ Feature: The docker command
3
+
4
+ Scenario: Setup checks for existence of docker
5
+ Given the docker command cannot find the "docker" binary
6
+ When I run `geordi docker setup`
7
+ Then the output should contain "which docker"
8
+ And the output should contain "x You need to install docker first"
9
+
10
+
11
+ Scenario: Setup checks for existence of docker-compose
12
+ Given the docker command cannot find the "docker-compose" binary
13
+ When I run `geordi docker setup`
14
+ Then the output should contain "which docker-compose"
15
+ And the output should contain "x You need to install docker-compose first"
16
+
17
+
18
+ Scenario: Setup checks for existence of docker-compose.yml
19
+ When I run `geordi docker setup`
20
+ Then the output should contain "x Your project does not seem to be properly set up."
21
+
22
+
23
+ Scenario: Setup checks for service named "main"
24
+ Given a file named "docker-compose.yml" with:
25
+ """
26
+ foo: bar
27
+ """
28
+
29
+ When I run `geordi docker setup`
30
+ Then the output should contain "x Your project does not seem to be properly set up."
31
+
32
+
33
+ Scenario: Setup runs docker-compose build
34
+ Given a file named "docker-compose.yml" with:
35
+ """
36
+ services:
37
+ main: foo
38
+ """
39
+
40
+ When I run `geordi docker setup`
41
+ Then the output should contain "docker-compose build"
42
+
43
+
44
+ Scenario: Shell checks for existence of docker
45
+ Given the docker command cannot find the "docker" binary
46
+ When I run `geordi docker shell`
47
+ Then the output should contain "which docker"
48
+ And the output should contain "x You need to install docker first"
49
+
50
+
51
+ Scenario: Shell runs docker-compose run maiun
52
+ Given a file named "docker-compose.yml" with:
53
+ """
54
+ services:
55
+ main: foo
56
+ """
57
+
58
+ When I run `geordi docker shell`
59
+ Then the output should contain "docker-compose run --service-ports main"
@@ -0,0 +1,10 @@
1
+ Given(/the docker command cannot find the "(.*?)" binary/) do |command|
2
+ require 'geordi/docker'
3
+ expect_any_instance_of(Geordi::Docker).to receive(:mock_run).at_least(:once).and_wrap_original do |original, *args|
4
+ if args[0] =~ /which #{Regexp.escape(command)}/
5
+ false
6
+ else
7
+ original.call(*args)
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,60 @@
1
+ require 'aruba/cucumber'
2
+ require 'aruba/in_process'
3
+ require 'geordi/cli'
4
+
5
+ # https://github.com/erikhuda/thor/wiki/Integrating-with-Aruba-In-Process-Runs
6
+ class InProcessCliRunner
7
+
8
+ # Allow everything fun to be injected from the outside while defaulting to normal implementations.
9
+ def initialize(argv, stdin = STDIN, stdout = STDOUT, stderr = STDERR, kernel = Kernel)
10
+ @argv, @stdin, @stdout, @stderr, @kernel = argv, stdin, stdout, stderr, kernel
11
+ end
12
+
13
+ def execute!
14
+ exit_code = begin
15
+ # Thor accesses these streams directly rather than letting them be injected, so we replace them...
16
+ $stderr = @stderr
17
+ $stdin = @stdin
18
+ $stdout = @stdout
19
+
20
+ # Run our normal Thor app the way we know and love.
21
+ previous_program_name = $PROGRAM_NAME
22
+ $PROGRAM_NAME = 'geordi'
23
+ Geordi::CLI.start(@argv)
24
+
25
+ # Thor::Base#start does not have a return value, assume success if no exception is raised.
26
+ 0
27
+ rescue StandardError => e
28
+ # The ruby interpreter would pipe this to STDERR and exit 1 in the case of an unhandled exception
29
+ b = e.backtrace
30
+ @stderr.puts("#{b.shift}: #{e.message} (#{e.class})")
31
+ @stderr.puts(b.map{|s| "\tfrom #{s}"}.join("\n"))
32
+ 1
33
+ rescue SystemExit => e
34
+ e.status
35
+ ensure
36
+ # add additional cleanup code here
37
+
38
+ $stderr = STDERR
39
+ $stdin = STDIN
40
+ $stdout = STDOUT
41
+ $PROGRAM_NAME = previous_program_name
42
+ end
43
+
44
+ # Proxy our exit code back to the injected kernel.
45
+ @kernel.exit(exit_code)
46
+ end
47
+ end
48
+
49
+ Aruba.configure do |config|
50
+ config.main_class = InProcessCliRunner
51
+ config.command_launcher = :spawn
52
+ end
53
+
54
+ Before('@same-process') do
55
+ aruba.config.command_launcher = :in_process
56
+ end
57
+
58
+ Before do
59
+ @aruba_timeout_seconds = 5
60
+ end
@@ -1,4 +1,5 @@
1
- require 'aruba/cucumber'
1
+ require 'cucumber/rspec/doubles'
2
+
2
3
 
3
4
  if Gem::Version.new(RUBY_VERSION) > Gem::Version.new('1.8.7')
4
5
  require 'pry'
@@ -0,0 +1,36 @@
1
+ class DockerCLI < Thor
2
+ desc 'setup', 'Setup docker and build required docker-container for the current project.'
3
+ def setup
4
+ docker.setup
5
+ end
6
+
7
+ desc 'shell', 'Open a shell in the main docker container for the current project.'
8
+ map 'shell' => '_shell'
9
+ def _shell
10
+ docker.shell
11
+ end
12
+
13
+ private
14
+
15
+ def docker
16
+ require 'geordi/docker'
17
+ Geordi::Docker.new
18
+ end
19
+ end
20
+
21
+ desc 'docker', 'Manage docker containers for the current project.'
22
+ long_desc <<-LONGDESC
23
+ Manage docker containers to run your project dockerized.
24
+
25
+ It expects a docker-compose file that specifies all services, and a service
26
+ named "main" that opens a shell for the project.
27
+
28
+ There are two subcommands:
29
+
30
+ - geordi docker setup
31
+ Builds all docker containers.
32
+ - geordi docker shell
33
+ Runs the docker service named 'main'.
34
+
35
+ LONGDESC
36
+ subcommand 'docker', DockerCLI
@@ -11,7 +11,8 @@ module Geordi
11
11
  include Geordi::Interaction
12
12
 
13
13
  VNC_DISPLAY = ':17'
14
- VNC_SERVER_COMMAND = "vncserver #{VNC_DISPLAY} -localhost -nolisten tcp -SecurityTypes None -geometry 1280x1024"
14
+ VNC_SERVER_DEFAULT_OPTIONS = '-localhost -nolisten tcp -SecurityTypes None -geometry 1280x1024'
15
+ VNC_SERVER_COMMAND = "vncserver #{VNC_DISPLAY} #{ENV.fetch('GEORDI_VNC_OPTIONS', VNC_SERVER_DEFAULT_OPTIONS)}"
15
16
  VNC_VIEWER_COMMAND = "vncviewer #{VNC_DISPLAY}"
16
17
  VNC_ENV_VARIABLES = %w[DISPLAY BROWSER LAUNCHY_BROWSER]
17
18
 
@@ -0,0 +1,71 @@
1
+ require 'geordi/interaction'
2
+ require 'yaml'
3
+
4
+ module Geordi
5
+ class Docker
6
+ DOCKER_COMPOSE_FILE = 'docker-compose.yml'.freeze
7
+
8
+ include Interaction
9
+
10
+ def setup
11
+ check_installation_and_config
12
+ announce('Building containers...')
13
+ if execute(:system, 'docker-compose', 'build')
14
+ success('Build successful.')
15
+ else
16
+ fail('Build failed.')
17
+ end
18
+ end
19
+
20
+ def shell
21
+ check_installation_and_config
22
+ execute(:exec, 'docker-compose', 'run', '--service-ports', 'main')
23
+ end
24
+
25
+ private
26
+
27
+ def execute(kind, *args)
28
+ if ENV['GEORDI_TESTING']
29
+ puts "Stubbed run #{args.join(' ')}"
30
+ mock_run(*args)
31
+ else
32
+ send(kind, *args)
33
+ end
34
+ end
35
+
36
+ def mock_run(*args)
37
+ # exists just to be stubbed in tests
38
+ true
39
+ end
40
+
41
+ def check_installation_and_config
42
+ unless command_exists?('docker')
43
+ fail('You need to install docker first with `sudo apt install docker`. After installation please log out and back in to your system once.')
44
+ end
45
+
46
+ unless command_exists?('docker-compose')
47
+ fail('You need to install docker-compose first with `sudo apt install docker-compose`.')
48
+ end
49
+
50
+ unless docker_compose_config && (services = docker_compose_config['services']) && services.key?('main')
51
+ fail('Your project does not seem to be properly set up. Expected to find a docker-compose.yml which defines a service named "main".')
52
+ end
53
+ end
54
+
55
+ def command_exists?(command)
56
+ execute(:system, "which #{command} > /dev/null")
57
+ end
58
+
59
+ def docker_compose_config
60
+ if File.exists?(DOCKER_COMPOSE_FILE)
61
+ if YAML.respond_to?(:safe_load)
62
+ YAML.safe_load(File.read(DOCKER_COMPOSE_FILE))
63
+ else
64
+ YAML.load(File.read(DOCKER_COMPOSE_FILE))
65
+ end
66
+ end
67
+ rescue
68
+ false
69
+ end
70
+ end
71
+ end
@@ -51,7 +51,7 @@ module Geordi
51
51
  # Remove Geordi's Bundler environment when running commands.
52
52
  success = if !defined?(Bundler)
53
53
  system(*commands)
54
- elsif Gem::Version.new(Bundler::VERSION) >= Gem::Version.new('2.1.2')
54
+ elsif Gem::Version.new(Bundler::VERSION) >= Gem::Version.new('1.17.3')
55
55
  Bundler.with_original_env do
56
56
  system(*commands)
57
57
  end
@@ -1,3 +1,3 @@
1
1
  module Geordi
2
- VERSION = '2.11.0'
2
+ VERSION = '2.12.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: geordi
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.11.0
4
+ version: 2.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Henning Koch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-04 00:00:00.000000000 Z
11
+ date: 2020-11-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -81,14 +81,17 @@ files:
81
81
  - features/console.feature
82
82
  - features/cucumber.feature
83
83
  - features/deploy.feature
84
+ - features/docker.feature
84
85
  - features/dump.feature
85
86
  - features/firefox.feature
86
87
  - features/server.feature
87
88
  - features/setup.feature
88
89
  - features/shell.feature
90
+ - features/step_definitions/docker_command_steps.rb
91
+ - features/step_definitions/miscellaneous_steps.rb
92
+ - features/support/aruba.rb
89
93
  - features/support/env.rb
90
94
  - features/support/step_definitions/aruba_backport_steps.rb
91
- - features/support/step_definitions/miscellaneous_steps.rb
92
95
  - geordi.gemspec
93
96
  - lib/geordi.rb
94
97
  - lib/geordi/COMMAND_TEMPLATE
@@ -108,6 +111,7 @@ files:
108
111
  - lib/geordi/commands/cucumber.rb
109
112
  - lib/geordi/commands/delete_dumps.rb
110
113
  - lib/geordi/commands/deploy.rb
114
+ - lib/geordi/commands/docker.rb
111
115
  - lib/geordi/commands/drop_databases.rb
112
116
  - lib/geordi/commands/dump.rb
113
117
  - lib/geordi/commands/eurest.rb
@@ -130,6 +134,7 @@ files:
130
134
  - lib/geordi/commands/yarn_install.rb
131
135
  - lib/geordi/cucumber.rb
132
136
  - lib/geordi/db_cleaner.rb
137
+ - lib/geordi/docker.rb
133
138
  - lib/geordi/dump_loader.rb
134
139
  - lib/geordi/firefox_for_selenium.rb
135
140
  - lib/geordi/gitpt.rb
@@ -156,7 +161,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
156
161
  - !ruby/object:Gem::Version
157
162
  version: '0'
158
163
  requirements: []
159
- rubygems_version: 3.1.2
164
+ rubygems_version: 3.0.3
160
165
  signing_key:
161
166
  specification_version: 4
162
167
  summary: Collection of command line tools we use in our daily work with Ruby, Rails