tomo 1.0.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -6
  3. data/lib/tomo/cli.rb +0 -2
  4. data/lib/tomo/cli/common_options.rb +4 -12
  5. data/lib/tomo/cli/deploy_options.rb +2 -7
  6. data/lib/tomo/cli/parser.rb +1 -6
  7. data/lib/tomo/cli/project_options.rb +1 -3
  8. data/lib/tomo/cli/rules.rb +4 -22
  9. data/lib/tomo/cli/rules/switch.rb +1 -5
  10. data/lib/tomo/cli/rules/value_switch.rb +1 -2
  11. data/lib/tomo/cli/rules_evaluator.rb +3 -13
  12. data/lib/tomo/cli/usage.rb +1 -3
  13. data/lib/tomo/commands/default.rb +1 -3
  14. data/lib/tomo/commands/init.rb +24 -1
  15. data/lib/tomo/commands/run.rb +1 -3
  16. data/lib/tomo/configuration.rb +5 -11
  17. data/lib/tomo/configuration/dsl/hosts_and_settings.rb +1 -2
  18. data/lib/tomo/configuration/plugin_resolver.rb +1 -1
  19. data/lib/tomo/configuration/plugins_registry.rb +1 -2
  20. data/lib/tomo/configuration/plugins_registry/gem_resolver.rb +1 -1
  21. data/lib/tomo/configuration/unknown_environment_error.rb +1 -4
  22. data/lib/tomo/console.rb +6 -11
  23. data/lib/tomo/console/menu.rb +1 -2
  24. data/lib/tomo/host.rb +1 -2
  25. data/lib/tomo/plugin/bundler/tasks.rb +2 -7
  26. data/lib/tomo/plugin/core/tasks.rb +3 -12
  27. data/lib/tomo/plugin/env/tasks.rb +32 -10
  28. data/lib/tomo/plugin/git.rb +1 -4
  29. data/lib/tomo/plugin/git/tasks.rb +4 -14
  30. data/lib/tomo/plugin/nodenv/tasks.rb +1 -3
  31. data/lib/tomo/plugin/puma.rb +0 -3
  32. data/lib/tomo/plugin/puma/systemd/service.erb +1 -1
  33. data/lib/tomo/plugin/puma/tasks.rb +6 -15
  34. data/lib/tomo/plugin/rails/helpers.rb +1 -1
  35. data/lib/tomo/plugin/rails/tasks.rb +6 -4
  36. data/lib/tomo/plugin/testing.rb +1 -3
  37. data/lib/tomo/remote.rb +1 -3
  38. data/lib/tomo/runtime.rb +3 -6
  39. data/lib/tomo/runtime/concurrent_ruby_thread_pool.rb +1 -4
  40. data/lib/tomo/runtime/execution_plan.rb +1 -4
  41. data/lib/tomo/runtime/explanation.rb +1 -7
  42. data/lib/tomo/runtime/settings_required_error.rb +1 -3
  43. data/lib/tomo/runtime/task_runner.rb +1 -5
  44. data/lib/tomo/runtime/unknown_task_error.rb +1 -4
  45. data/lib/tomo/script.rb +1 -5
  46. data/lib/tomo/shell_builder.rb +5 -10
  47. data/lib/tomo/ssh/child_process.rb +2 -7
  48. data/lib/tomo/ssh/connection.rb +3 -16
  49. data/lib/tomo/ssh/connection_validator.rb +1 -4
  50. data/lib/tomo/ssh/executable_error.rb +1 -2
  51. data/lib/tomo/ssh/options.rb +2 -5
  52. data/lib/tomo/task_api.rb +4 -15
  53. data/lib/tomo/templates/config.rb.erb +7 -1
  54. data/lib/tomo/testing.rb +0 -2
  55. data/lib/tomo/testing/Dockerfile +1 -3
  56. data/lib/tomo/testing/connection.rb +1 -6
  57. data/lib/tomo/testing/docker_image.rb +4 -17
  58. data/lib/tomo/testing/local.rb +1 -3
  59. data/lib/tomo/testing/mock_plugin_tester.rb +27 -4
  60. data/lib/tomo/testing/ubuntu_setup.sh +1 -2
  61. data/lib/tomo/version.rb +1 -1
  62. metadata +8 -150
  63. data/lib/tomo/testing/docker_plugin_tester.rb +0 -39
  64. data/lib/tomo/testing/plugin_tester.rb +0 -33
@@ -21,9 +21,7 @@ module Tomo
21
21
  private
22
22
 
23
23
  def settings_sentence
24
- if settings.length == 1
25
- return "a value for the #{yellow(settings.first.to_s)} setting."
26
- end
24
+ return "a value for the #{yellow(settings.first.to_s)} setting." if settings.length == 1
27
25
 
28
26
  sentence = "values for these settings:\n\n "
29
27
  sentence << settings.map { |s| yellow(s.to_s) }.join("\n ")
@@ -19,11 +19,7 @@ module Tomo
19
19
  def validate_task!(name)
20
20
  return if tasks_by_name.key?(name)
21
21
 
22
- UnknownTaskError.raise_with(
23
- name,
24
- unknown_task: name,
25
- known_tasks: tasks_by_name.keys
26
- )
22
+ UnknownTaskError.raise_with(name, unknown_task: name, known_tasks: tasks_by_name.keys)
27
23
  end
28
24
 
29
25
  def run(task:, remote:)
@@ -17,10 +17,7 @@ module Tomo
17
17
  private
18
18
 
19
19
  def spelling_suggestion
20
- sugg = Error::Suggestions.new(
21
- dictionary: known_tasks,
22
- word: unknown_task
23
- )
20
+ sugg = Error::Suggestions.new(dictionary: known_tasks, word: unknown_task)
24
21
  sugg.to_console if sugg.any?
25
22
  end
26
23
 
@@ -2,11 +2,7 @@ module Tomo
2
2
  class Script
3
3
  attr_reader :script
4
4
 
5
- def initialize(script,
6
- echo: true,
7
- pty: false,
8
- raise_on_error: true,
9
- silent: false)
5
+ def initialize(script, echo: true, pty: false, raise_on_error: true, silent: false)
10
6
  @script = script
11
7
  @echo = echo
12
8
  @pty = pty
@@ -3,8 +3,9 @@ require "shellwords"
3
3
  module Tomo
4
4
  class ShellBuilder
5
5
  def self.raw(string)
6
- string.define_singleton_method(:shellescape) { string }
7
- string
6
+ string.dup.tap do |raw_string|
7
+ raw_string.define_singleton_method(:shellescape) { string }
8
+ end
8
9
  end
9
10
 
10
11
  def initialize
@@ -45,9 +46,7 @@ module Tomo
45
46
  end
46
47
 
47
48
  def build(*command, default_chdir: nil)
48
- if @chdir.empty? && default_chdir
49
- return chdir(default_chdir) { build(*command) }
50
- end
49
+ return chdir(default_chdir) { build(*command) } if @chdir.empty? && default_chdir
51
50
 
52
51
  command_string = command_to_string(*command)
53
52
  modifiers = [cd_chdir, unset_env, export_env, set_umask].compact.flatten
@@ -97,11 +96,7 @@ module Tomo
97
96
  def set_umask
98
97
  return if @umask.nil?
99
98
 
100
- umask_value = if @umask.is_a?(Integer)
101
- @umask.to_s(8).rjust(4, "0")
102
- else
103
- @umask
104
- end
99
+ umask_value = @umask.is_a?(Integer) ? @umask.to_s(8).rjust(4, "0") : @umask
105
100
  "umask #{umask_value.to_s.shellescape}"
106
101
  end
107
102
  end
@@ -30,17 +30,12 @@ module Tomo
30
30
  end
31
31
 
32
32
  def result
33
- Result.new(
34
- exit_status: exit_status,
35
- stdout: stdout_buffer.string,
36
- stderr: stderr_buffer.string
37
- )
33
+ Result.new(exit_status: exit_status, stdout: stdout_buffer.string, stderr: stderr_buffer.string)
38
34
  end
39
35
 
40
36
  private
41
37
 
42
- attr_reader :command, :exit_status, :on_data,
43
- :stdout_buffer, :stderr_buffer
38
+ attr_reader :command, :exit_status, :on_data, :stdout_buffer, :stderr_buffer
44
39
 
45
40
  def start_io_thread(source, buffer)
46
41
  new_thread_inheriting_current_vars do
@@ -6,12 +6,7 @@ module Tomo
6
6
  module SSH
7
7
  class Connection
8
8
  def self.dry_run(host, options)
9
- new(
10
- host,
11
- options,
12
- exec_proc: proc { CLI.exit },
13
- child_proc: proc { Result.empty_success }
14
- )
9
+ new(host, options, exec_proc: proc { CLI.exit }, child_proc: proc { Result.empty_success })
15
10
  end
16
11
 
17
12
  attr_reader :host
@@ -38,9 +33,7 @@ module Tomo
38
33
  result = child_proc.call(*ssh_args, on_data: handle_data)
39
34
  logger.script_end(script, result)
40
35
 
41
- if result.failure? && script.raise_on_error?
42
- raise_run_error(script, ssh_args, result)
43
- end
36
+ raise_run_error(script, ssh_args, result) if result.failure? && script.raise_on_error?
44
37
 
45
38
  result
46
39
  end
@@ -69,13 +62,7 @@ module Tomo
69
62
  end
70
63
 
71
64
  def raise_run_error(script, ssh_args, result)
72
- ScriptError.raise_with(
73
- result.output,
74
- host: host,
75
- result: result,
76
- script: script,
77
- ssh_args: ssh_args
78
- )
65
+ ScriptError.raise_with(result.output, host: host, result: result, script: script, ssh_args: ssh_args)
79
66
  end
80
67
  end
81
68
  end
@@ -27,10 +27,7 @@ module Tomo
27
27
  end
28
28
 
29
29
  def assert_valid_connection!
30
- script = Script.new(
31
- "echo hi",
32
- silent: !Tomo.debug?, echo: false, raise_on_error: false
33
- )
30
+ script = Script.new("echo hi", silent: !Tomo.debug?, echo: false, raise_on_error: false)
34
31
  res = connection.ssh_subprocess(script, verbose: Tomo.debug?)
35
32
  raise_connection_failure(res) if res.exit_status == 255
36
33
  raise_unknown_error(res) if res.failure? || res.stdout.chomp != "hi"
@@ -7,8 +7,7 @@ module Tomo
7
7
  hint = if executable.to_s.include?("/")
8
8
  "Is the ssh binary properly installed in this location?"
9
9
  else
10
- "Is #{yellow(executable)} installed and in your "\
11
- "#{blue('$PATH')}?"
10
+ "Is #{yellow(executable)} installed and in your #{blue('$PATH')}?"
12
11
  end
13
12
 
14
13
  <<~ERROR
@@ -20,8 +20,7 @@ module Tomo
20
20
  freeze
21
21
  end
22
22
 
23
- # rubocop:disable Metrics/AbcSize
24
- def build_args(host, script, control_path, verbose)
23
+ def build_args(host, script, control_path, verbose) # rubocop:disable Metrics/AbcSize
25
24
  args = [verbose ? "-v" : ["-o", "LogLevel=ERROR"]]
26
25
  args << "-A" if forward_agent
27
26
  args << connect_timeout_option
@@ -34,13 +33,11 @@ module Tomo
34
33
 
35
34
  [executable, args, script.to_s].flatten
36
35
  end
37
- # rubocop:enable Metrics/AbcSize
38
36
 
39
37
  private
40
38
 
41
39
  attr_writer :executable
42
- attr_accessor :connect_timeout, :extra_opts, :forward_agent,
43
- :reuse_connections, :strict_host_key_checking
40
+ attr_accessor :connect_timeout, :extra_opts, :forward_agent, :reuse_connections, :strict_host_key_checking
44
41
 
45
42
  def control_opts(path, verbose)
46
43
  opts = [
@@ -9,11 +9,7 @@ module Tomo
9
9
  def_delegators :context, :paths, :settings
10
10
 
11
11
  def die(reason)
12
- Runtime::TaskAbortedError.raise_with(
13
- reason,
14
- task: context.current_task,
15
- host: remote.host
16
- )
12
+ Runtime::TaskAbortedError.raise_with(reason, task: context.current_task, host: remote.host)
17
13
  end
18
14
 
19
15
  def dry_run?
@@ -26,13 +22,9 @@ module Tomo
26
22
 
27
23
  def merge_template(path)
28
24
  working_path = paths.tomo_config_file&.dirname
29
- if working_path && path.start_with?(".")
30
- path = File.expand_path(path, working_path)
31
- end
25
+ path = File.expand_path(path, working_path) if working_path && path.start_with?(".")
32
26
 
33
- unless File.file?(path)
34
- Runtime::TemplateNotFoundError.raise_with(path: path)
35
- end
27
+ Runtime::TemplateNotFoundError.raise_with(path: path) unless File.file?(path)
36
28
  template = IO.read(path)
37
29
  ERB.new(template).result(binding)
38
30
  end
@@ -49,10 +41,7 @@ module Tomo
49
41
  missing = names.flatten.select { |sett| settings[sett].nil? }
50
42
  return if missing.empty?
51
43
 
52
- Runtime::SettingsRequiredError.raise_with(
53
- settings: missing,
54
- task: context.current_task
55
- )
44
+ Runtime::SettingsRequiredError.raise_with(settings: missing, task: context.current_task)
56
45
  end
57
46
  alias require_settings require_setting
58
47
  end
@@ -1,3 +1,6 @@
1
+ <% if rubocop? -%>
2
+ # rubocop:disable Style/FormatStringToken
3
+ <% end -%>
1
4
  plugin "git"
2
5
  plugin "env"
3
6
  plugin "bundler"
@@ -15,7 +18,7 @@ set rbenv_ruby_version: <%= RUBY_VERSION.inspect %>
15
18
  set nodenv_node_version: <%= node_version&.inspect || "nil # FIXME" %>
16
19
  set nodenv_yarn_version: <%= yarn_version.inspect %>
17
20
  set git_url: <%= git_origin_url&.inspect || "nil # FIXME" %>
18
- set git_branch: "master"
21
+ set git_branch: <%= git_branch&.inspect || "nil # FIXME" %>
19
22
  set git_exclusions: %w[
20
23
  .tomo/
21
24
  spec/
@@ -72,3 +75,6 @@ deploy do
72
75
  run "bundler:clean"
73
76
  run "core:log_revision"
74
77
  end
78
+ <% if rubocop? -%>
79
+ # rubocop:enable Style/FormatStringToken
80
+ <% end -%>
@@ -6,14 +6,12 @@ module Tomo
6
6
  autoload :CLITester, "tomo/testing/cli_tester"
7
7
  autoload :Connection, "tomo/testing/connection"
8
8
  autoload :DockerImage, "tomo/testing/docker_image"
9
- autoload :DockerPluginTester, "tomo/testing/docker_plugin_tester"
10
9
  autoload :HostExtensions, "tomo/testing/host_extensions"
11
10
  autoload :Local, "tomo/testing/local"
12
11
  autoload :LogCapturing, "tomo/testing/log_capturing"
13
12
  autoload :MockedExecError, "tomo/testing/mocked_exec_error"
14
13
  autoload :MockedExitError, "tomo/testing/mocked_exit_error"
15
14
  autoload :MockPluginTester, "tomo/testing/mock_plugin_tester"
16
- autoload :PluginTester, "tomo/testing/plugin_tester"
17
15
  autoload :RemoteExtensions, "tomo/testing/remote_extensions"
18
16
  autoload :SSHExtensions, "tomo/testing/ssh_extensions"
19
17
 
@@ -1,10 +1,8 @@
1
- FROM ubuntu:18.04
1
+ FROM ubuntu:20.04
2
2
  WORKDIR /provision
3
3
  COPY ./tomo_test_ed25519.pub /root/.ssh/authorized_keys
4
4
  COPY ./ubuntu_setup.sh ./
5
5
  RUN ./ubuntu_setup.sh
6
- COPY ./custom_setup.sh ./
7
- RUN ./custom_setup.sh
8
6
  COPY ./systemctl.rb /usr/local/bin/systemctl
9
7
  RUN chmod a+x /usr/local/bin/systemctl
10
8
  EXPOSE 22
@@ -2,12 +2,7 @@ module Tomo
2
2
  module Testing
3
3
  class Connection < Tomo::SSH::Connection
4
4
  def initialize(host, options)
5
- super(
6
- host,
7
- options,
8
- exec_proc: proc { raise MockedExecError },
9
- child_proc: method(:mock_child_process)
10
- )
5
+ super(host, options, exec_proc: proc { raise MockedExecError }, child_proc: method(:mock_child_process))
11
6
  end
12
7
 
13
8
  def ssh_exec(script)
@@ -22,13 +22,8 @@ module Tomo
22
22
  end
23
23
  @running_images = []
24
24
 
25
- attr_accessor :setup_script
26
25
  attr_reader :host
27
26
 
28
- def initialize
29
- @setup_script = "#!/bin/bash\n"
30
- end
31
-
32
27
  def build_and_run
33
28
  raise "Already running!" if frozen?
34
29
 
@@ -74,19 +69,13 @@ module Tomo
74
69
  attr_reader :container_id, :image_id, :private_key_path
75
70
 
76
71
  def pull_base_image_if_needed
77
- images = Local.capture('docker images --format "{{.ID}}" ubuntu:18.04')
78
- Local.capture("docker pull ubuntu:18.04") if images.strip.empty?
72
+ images = Local.capture('docker images --format "{{.ID}}" ubuntu:20.04')
73
+ Local.capture("docker pull ubuntu:20.04") if images.strip.empty?
79
74
  end
80
75
 
81
76
  def set_up_private_key
82
- @private_key_path = File.join(
83
- Dir.tmpdir,
84
- "tomo_test_ed25519_#{SecureRandom.hex(8)}"
85
- )
86
- FileUtils.cp(
87
- File.expand_path("tomo_test_ed25519", __dir__),
88
- private_key_path
89
- )
77
+ @private_key_path = File.join(Dir.tmpdir, "tomo_test_ed25519_#{SecureRandom.hex(8)}")
78
+ FileUtils.cp(File.expand_path("tomo_test_ed25519", __dir__), private_key_path)
90
79
  FileUtils.chmod(0o600, private_key_path)
91
80
  end
92
81
 
@@ -121,8 +110,6 @@ module Tomo
121
110
  FILES_TO_COPY.each do |file|
122
111
  FileUtils.cp(File.expand_path(file, __dir__), build_dir)
123
112
  end
124
- IO.write(File.join(build_dir, "custom_setup.sh"), setup_script)
125
- FileUtils.chmod(0o755, File.join(build_dir, "custom_setup.sh"))
126
113
  end
127
114
 
128
115
  def build_dir
@@ -41,9 +41,7 @@ module Tomo
41
41
  progress(command_str) do
42
42
  output, status = Open3.capture2e(*command)
43
43
 
44
- if raise_on_error && !status.success?
45
- raise "Command failed: #{command_str}\n#{output}"
46
- end
44
+ raise "Command failed: #{command_str}\n#{output}" if raise_on_error && !status.success?
47
45
 
48
46
  output
49
47
  end
@@ -1,10 +1,29 @@
1
1
  module Tomo
2
2
  module Testing
3
- class MockPluginTester < PluginTester
3
+ class MockPluginTester
4
+ include LogCapturing
5
+
4
6
  def initialize(*plugin_names, settings: {}, release: {})
5
- host = Host.parse("testing@host")
6
- host.release.merge!(release)
7
- super(*plugin_names, settings: settings, host: host)
7
+ @host = Host.parse("testing@host")
8
+ @host.release.merge!(release)
9
+ config = Configuration.new
10
+ config.hosts << @host
11
+ config.plugins.push(*plugin_names, "testing")
12
+ config.settings[:application] = "testing"
13
+ config.settings.merge!(settings)
14
+ @runtime = config.build_runtime
15
+ end
16
+
17
+ def call_helper(helper, *args, **kwargs)
18
+ run_task("testing:call_helper", helper, args, kwargs)
19
+ host.helper_values.pop
20
+ end
21
+
22
+ def run_task(task, *args)
23
+ capturing_logger_output do
24
+ runtime.run!(task, *args, privileged: false)
25
+ nil
26
+ end
8
27
  end
9
28
 
10
29
  def executed_script
@@ -21,6 +40,10 @@ module Tomo
21
40
  host.mock(script, **kwargs)
22
41
  self
23
42
  end
43
+
44
+ private
45
+
46
+ attr_reader :host, :runtime
24
47
  end
25
48
  end
26
49
  end
@@ -17,8 +17,7 @@ touch /var/lib/systemd/linger/deployer
17
17
 
18
18
  # Packages needed for ruby, etc.
19
19
  apt-get -y update
20
- apt-get -y install build-essential zlib1g-dev libssl-dev libreadline-dev \
21
- git-core curl locales libsqlite3-dev
20
+ apt-get -y install build-essential zlib1g-dev libssl-dev libreadline-dev git-core curl locales libsqlite3-dev
22
21
 
23
22
  apt-get -y install tzdata \
24
23
  -o DPkg::options::="--force-confdef" \
@@ -1,3 +1,3 @@
1
1
  module Tomo
2
- VERSION = "1.0.0".freeze
2
+ VERSION = "1.3.0".freeze
3
3
  end
metadata CHANGED
@@ -1,155 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tomo
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Brictson
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-04-12 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: bundler
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '2.0'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '2.0'
27
- - !ruby/object:Gem::Dependency
28
- name: concurrent-ruby
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '1.1'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '1.1'
41
- - !ruby/object:Gem::Dependency
42
- name: minitest
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '5.11'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '5.11'
55
- - !ruby/object:Gem::Dependency
56
- name: minitest-ci
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '3.4'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '3.4'
69
- - !ruby/object:Gem::Dependency
70
- name: minitest-hooks
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '1.5'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '1.5'
83
- - !ruby/object:Gem::Dependency
84
- name: minitest-reporters
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: '1.3'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - "~>"
95
- - !ruby/object:Gem::Version
96
- version: '1.3'
97
- - !ruby/object:Gem::Dependency
98
- name: rake
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - "~>"
102
- - !ruby/object:Gem::Version
103
- version: '13.0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - "~>"
109
- - !ruby/object:Gem::Version
110
- version: '13.0'
111
- - !ruby/object:Gem::Dependency
112
- name: rubocop
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - '='
116
- - !ruby/object:Gem::Version
117
- version: 0.81.0
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - '='
123
- - !ruby/object:Gem::Version
124
- version: 0.81.0
125
- - !ruby/object:Gem::Dependency
126
- name: rubocop-minitest
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - '='
130
- - !ruby/object:Gem::Version
131
- version: 0.8.1
132
- type: :development
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - '='
137
- - !ruby/object:Gem::Version
138
- version: 0.8.1
139
- - !ruby/object:Gem::Dependency
140
- name: rubocop-performance
141
- requirement: !ruby/object:Gem::Requirement
142
- requirements:
143
- - - '='
144
- - !ruby/object:Gem::Version
145
- version: 1.5.2
146
- type: :development
147
- prerelease: false
148
- version_requirements: !ruby/object:Gem::Requirement
149
- requirements:
150
- - - '='
151
- - !ruby/object:Gem::Version
152
- version: 1.5.2
11
+ date: 2020-08-08 00:00:00.000000000 Z
12
+ dependencies: []
153
13
  description: Tomo is a feature-rich deployment tool that contains everything you need
154
14
  to deploy a basic Rails app out of the box. It has an opinionated, production-tested
155
15
  set of defaults, but is easily extensible via a well-documented plugin system. Unlike
@@ -292,14 +152,12 @@ files:
292
152
  - lib/tomo/testing/cli_tester.rb
293
153
  - lib/tomo/testing/connection.rb
294
154
  - lib/tomo/testing/docker_image.rb
295
- - lib/tomo/testing/docker_plugin_tester.rb
296
155
  - lib/tomo/testing/host_extensions.rb
297
156
  - lib/tomo/testing/local.rb
298
157
  - lib/tomo/testing/log_capturing.rb
299
158
  - lib/tomo/testing/mock_plugin_tester.rb
300
159
  - lib/tomo/testing/mocked_exec_error.rb
301
160
  - lib/tomo/testing/mocked_exit_error.rb
302
- - lib/tomo/testing/plugin_tester.rb
303
161
  - lib/tomo/testing/remote_extensions.rb
304
162
  - lib/tomo/testing/ssh_extensions.rb
305
163
  - lib/tomo/testing/systemctl.rb
@@ -314,9 +172,9 @@ metadata:
314
172
  bug_tracker_uri: https://github.com/mattbrictson/tomo/issues
315
173
  changelog_uri: https://github.com/mattbrictson/tomo/releases
316
174
  source_code_uri: https://github.com/mattbrictson/tomo
317
- homepage_uri: https://tomo-deploy.com/
175
+ homepage_uri: https://github.com/mattbrictson/tomo
318
176
  documentation_uri: https://tomo-deploy.com/
319
- post_install_message:
177
+ post_install_message:
320
178
  rdoc_options: []
321
179
  require_paths:
322
180
  - lib
@@ -331,8 +189,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
331
189
  - !ruby/object:Gem::Version
332
190
  version: '0'
333
191
  requirements: []
334
- rubygems_version: 3.1.2
335
- signing_key:
192
+ rubygems_version: 3.1.4
193
+ signing_key:
336
194
  specification_version: 4
337
195
  summary: A friendly CLI for deploying Rails apps ✨
338
196
  test_files: []