From 539752e9bd56d752ad6d01e9044cdc7f47149881 Mon Sep 17 00:00:00 2001 From: Xavier Noria Date: Fri, 3 Feb 2023 22:45:12 +0100 Subject: [PATCH] Load with Zeitwerk --- Gemfile.lock | 2 ++ bin/mrsk | 2 +- lib/mrsk.rb | 8 ++++++-- lib/mrsk/cli.rb | 4 ---- lib/mrsk/cli/accessory.rb | 2 -- lib/mrsk/cli/app.rb | 10 ++++------ lib/mrsk/cli/build.rb | 4 +--- lib/mrsk/cli/main.rb | 10 ---------- lib/mrsk/cli/prune.rb | 2 -- lib/mrsk/cli/registry.rb | 2 -- lib/mrsk/cli/server.rb | 2 -- lib/mrsk/cli/traefik.rb | 2 -- lib/mrsk/commander.rb | 11 +---------- lib/mrsk/commands/accessory.rb | 4 +--- lib/mrsk/commands/app.rb | 2 -- lib/mrsk/commands/auditor.rb | 1 - lib/mrsk/commands/builder.rb | 7 ------- lib/mrsk/commands/builder/base.rb | 2 -- lib/mrsk/commands/builder/multiarch.rb | 2 -- lib/mrsk/commands/builder/multiarch/remote.rb | 2 -- lib/mrsk/commands/builder/native.rb | 2 -- lib/mrsk/commands/builder/native/remote.rb | 2 -- lib/mrsk/commands/prune.rb | 1 - lib/mrsk/commands/registry.rb | 2 -- lib/mrsk/commands/traefik.rb | 2 -- lib/mrsk/configuration.rb | 4 ---- mrsk.gemspec | 1 + test/cli/cli_test_case.rb | 1 - test/commander_test.rb | 1 - test/commands/accessory_test.rb | 4 +--- test/commands/app_test.rb | 2 -- test/commands/builder_test.rb | 2 -- test/commands/registry_test.rb | 4 +--- test/commands/traefik_test.rb | 2 -- test/configuration/accessory_test.rb | 3 +-- test/configuration/role_test.rb | 9 ++++----- test/configuration_test.rb | 1 - test/test_helper.rb | 1 + 38 files changed, 25 insertions(+), 100 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 5591da14..850fb735 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -6,6 +6,7 @@ PATH dotenv (~> 2.8) sshkit (~> 1.21) thor (~> 1.2) + zeitwerk (~> 2.5) GEM remote: https://rubygems.org/ @@ -91,6 +92,7 @@ PLATFORMS arm64-darwin-22 x86_64-darwin-20 x86_64-darwin-21 + x86_64-darwin-22 x86_64-linux DEPENDENCIES diff --git a/bin/mrsk b/bin/mrsk index d156bed1..dac9af62 100755 --- a/bin/mrsk +++ b/bin/mrsk @@ -4,7 +4,7 @@ Thread.report_on_exception = false require "dotenv/load" -require "mrsk/cli" +require "mrsk" begin Mrsk::Cli::Main.start(ARGV) diff --git a/lib/mrsk.rb b/lib/mrsk.rb index 3adf2bef..19b86051 100644 --- a/lib/mrsk.rb +++ b/lib/mrsk.rb @@ -1,5 +1,9 @@ module Mrsk end -require "mrsk/version" -require "mrsk/commander" +require "zeitwerk" + +loader = Zeitwerk::Loader.for_gem +loader.ignore("#{__dir__}/mrsk/sshkit_with_ext.rb") +loader.setup +loader.eager_load # We need all commands loaded. diff --git a/lib/mrsk/cli.rb b/lib/mrsk/cli.rb index 35fc8f44..62323076 100644 --- a/lib/mrsk/cli.rb +++ b/lib/mrsk/cli.rb @@ -1,9 +1,5 @@ -require "mrsk" - module Mrsk::Cli end # SSHKit uses instance eval, so we need a global const for ergonomics MRSK = Mrsk::Commander.new - -require "mrsk/cli/main" diff --git a/lib/mrsk/cli/accessory.rb b/lib/mrsk/cli/accessory.rb index 549ba8e0..5bf9ff9b 100644 --- a/lib/mrsk/cli/accessory.rb +++ b/lib/mrsk/cli/accessory.rb @@ -1,5 +1,3 @@ -require "mrsk/cli/base" - class Mrsk::Cli::Accessory < Mrsk::Cli::Base desc "boot [NAME]", "Boot accessory service on host (use NAME=all to boot all accessories)" def boot(name) diff --git a/lib/mrsk/cli/app.rb b/lib/mrsk/cli/app.rb index 9d3e5b58..e4c71493 100644 --- a/lib/mrsk/cli/app.rb +++ b/lib/mrsk/cli/app.rb @@ -1,5 +1,3 @@ -require "mrsk/cli/base" - class Mrsk::Cli::App < Mrsk::Cli::Base desc "boot", "Boot app on servers (or reboot app if already running)" def boot @@ -40,7 +38,7 @@ class Mrsk::Cli::App < Mrsk::Cli::Base execute *MRSK.app.start, raise_on_non_zero_exit: false end end - + desc "stop", "Stop app on servers" def stop on(MRSK.hosts) do @@ -48,12 +46,12 @@ class Mrsk::Cli::App < Mrsk::Cli::Base execute *MRSK.app.stop, raise_on_non_zero_exit: false end end - + desc "details", "Display details about app containers" def details on(MRSK.hosts) { |host| puts_by_host host, capture_with_info(*MRSK.app.info) } end - + desc "exec [CMD]", "Execute a custom command on servers" option :interactive, aliases: "-i", type: :boolean, default: false, desc: "Execute command over ssh for an interactive shell (use for console/bash)" option :reuse, type: :boolean, default: false, desc: "Reuse currently running container instead of starting a new one" @@ -110,7 +108,7 @@ class Mrsk::Cli::App < Mrsk::Cli::Base def current on(MRSK.hosts) { |host| puts_by_host host, capture_with_info(*MRSK.app.current_container_id) } end - + desc "logs", "Show lines from app on servers" option :since, aliases: "-s", desc: "Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)" option :lines, type: :numeric, aliases: "-n", desc: "Number of log lines to pull from each server" diff --git a/lib/mrsk/cli/build.rb b/lib/mrsk/cli/build.rb index 2873dfed..f52c8223 100644 --- a/lib/mrsk/cli/build.rb +++ b/lib/mrsk/cli/build.rb @@ -1,5 +1,3 @@ -require "mrsk/cli/base" - class Mrsk::Cli::Build < Mrsk::Cli::Base desc "deliver", "Deliver a newly built app image to servers" def deliver @@ -11,7 +9,7 @@ class Mrsk::Cli::Build < Mrsk::Cli::Base def push cli = self - run_locally do + run_locally do begin MRSK.with_verbosity(:debug) { execute *MRSK.builder.push } rescue SSHKit::Command::Failed => e diff --git a/lib/mrsk/cli/main.rb b/lib/mrsk/cli/main.rb index dd570c50..c1b985c3 100644 --- a/lib/mrsk/cli/main.rb +++ b/lib/mrsk/cli/main.rb @@ -1,13 +1,3 @@ -require "mrsk/cli/base" - -require "mrsk/cli/accessory" -require "mrsk/cli/app" -require "mrsk/cli/build" -require "mrsk/cli/prune" -require "mrsk/cli/registry" -require "mrsk/cli/server" -require "mrsk/cli/traefik" - class Mrsk::Cli::Main < Mrsk::Cli::Base desc "setup", "Setup all accessories and deploy the app to servers" def setup diff --git a/lib/mrsk/cli/prune.rb b/lib/mrsk/cli/prune.rb index 32bd7f04..91e881ce 100644 --- a/lib/mrsk/cli/prune.rb +++ b/lib/mrsk/cli/prune.rb @@ -1,5 +1,3 @@ -require "mrsk/cli/base" - class Mrsk::Cli::Prune < Mrsk::Cli::Base desc "all", "Prune unused images and stopped containers" def all diff --git a/lib/mrsk/cli/registry.rb b/lib/mrsk/cli/registry.rb index 939e7c33..5342c32f 100644 --- a/lib/mrsk/cli/registry.rb +++ b/lib/mrsk/cli/registry.rb @@ -1,5 +1,3 @@ -require "mrsk/cli/base" - class Mrsk::Cli::Registry < Mrsk::Cli::Base desc "login", "Login to the registry locally and remotely" def login diff --git a/lib/mrsk/cli/server.rb b/lib/mrsk/cli/server.rb index f015d1d0..ce8ab2cd 100644 --- a/lib/mrsk/cli/server.rb +++ b/lib/mrsk/cli/server.rb @@ -1,5 +1,3 @@ -require "mrsk/cli/base" - class Mrsk::Cli::Server < Mrsk::Cli::Base desc "bootstrap", "Ensure Docker is installed on the servers" def bootstrap diff --git a/lib/mrsk/cli/traefik.rb b/lib/mrsk/cli/traefik.rb index 04cb108e..b77d16ce 100644 --- a/lib/mrsk/cli/traefik.rb +++ b/lib/mrsk/cli/traefik.rb @@ -1,5 +1,3 @@ -require "mrsk/cli/base" - class Mrsk::Cli::Traefik < Mrsk::Cli::Base desc "boot", "Boot Traefik on servers" def boot diff --git a/lib/mrsk/commander.rb b/lib/mrsk/commander.rb index 3dd95941..661f8a15 100644 --- a/lib/mrsk/commander.rb +++ b/lib/mrsk/commander.rb @@ -1,14 +1,5 @@ require "active_support/core_ext/enumerable" -require "mrsk/configuration" -require "mrsk/commands/accessory" -require "mrsk/commands/app" -require "mrsk/commands/auditor" -require "mrsk/commands/builder" -require "mrsk/commands/prune" -require "mrsk/commands/traefik" -require "mrsk/commands/registry" - class Mrsk::Commander attr_accessor :config_file, :destination, :verbosity, :version @@ -83,7 +74,7 @@ class Mrsk::Commander end - def with_verbosity(level) + def with_verbosity(level) old_level = SSHKit.config.output_verbosity SSHKit.config.output_verbosity = level yield diff --git a/lib/mrsk/commands/accessory.rb b/lib/mrsk/commands/accessory.rb index 6cc6bf5c..0e9c5c12 100644 --- a/lib/mrsk/commands/accessory.rb +++ b/lib/mrsk/commands/accessory.rb @@ -1,5 +1,3 @@ -require "mrsk/commands/base" - class Mrsk::Commands::Accessory < Mrsk::Commands::Base attr_reader :accessory_config delegate :service_name, :image, :host, :port, :files, :directories, :env_args, :volume_args, :label_args, to: :accessory_config @@ -10,7 +8,7 @@ class Mrsk::Commands::Accessory < Mrsk::Commands::Base end def run - docker :run, + docker :run, "--name", service_name, "-d", "--restart", "unless-stopped", diff --git a/lib/mrsk/commands/app.rb b/lib/mrsk/commands/app.rb index 37d4d00d..ae4fce97 100644 --- a/lib/mrsk/commands/app.rb +++ b/lib/mrsk/commands/app.rb @@ -1,5 +1,3 @@ -require "mrsk/commands/base" - class Mrsk::Commands::App < Mrsk::Commands::Base def run(role: :web) role = config.role(role) diff --git a/lib/mrsk/commands/auditor.rb b/lib/mrsk/commands/auditor.rb index 951abaae..692844c8 100644 --- a/lib/mrsk/commands/auditor.rb +++ b/lib/mrsk/commands/auditor.rb @@ -1,5 +1,4 @@ require "active_support/core_ext/time/conversions" -require "mrsk/commands/base" class Mrsk::Commands::Auditor < Mrsk::Commands::Base def record(line) diff --git a/lib/mrsk/commands/builder.rb b/lib/mrsk/commands/builder.rb index e24768d1..70957afe 100644 --- a/lib/mrsk/commands/builder.rb +++ b/lib/mrsk/commands/builder.rb @@ -1,5 +1,3 @@ -require "mrsk/commands/base" - class Mrsk::Commands::Builder < Mrsk::Commands::Base delegate :create, :remove, :push, :pull, :info, to: :target @@ -36,8 +34,3 @@ class Mrsk::Commands::Builder < Mrsk::Commands::Base @multiarch_remote ||= Mrsk::Commands::Builder::Multiarch::Remote.new(config) end end - -require "mrsk/commands/builder/native" -require "mrsk/commands/builder/native/remote" -require "mrsk/commands/builder/multiarch" -require "mrsk/commands/builder/multiarch/remote" diff --git a/lib/mrsk/commands/builder/base.rb b/lib/mrsk/commands/builder/base.rb index 792ebee1..8e0003c7 100644 --- a/lib/mrsk/commands/builder/base.rb +++ b/lib/mrsk/commands/builder/base.rb @@ -1,5 +1,3 @@ -require "mrsk/commands/base" - class Mrsk::Commands::Builder::Base < Mrsk::Commands::Base delegate :argumentize, to: Mrsk::Utils diff --git a/lib/mrsk/commands/builder/multiarch.rb b/lib/mrsk/commands/builder/multiarch.rb index bc87a86f..9b1fcb19 100644 --- a/lib/mrsk/commands/builder/multiarch.rb +++ b/lib/mrsk/commands/builder/multiarch.rb @@ -1,5 +1,3 @@ -require "mrsk/commands/builder/base" - class Mrsk::Commands::Builder::Multiarch < Mrsk::Commands::Builder::Base def create docker :buildx, :create, "--use", "--name", builder_name diff --git a/lib/mrsk/commands/builder/multiarch/remote.rb b/lib/mrsk/commands/builder/multiarch/remote.rb index b49de328..5ca10048 100644 --- a/lib/mrsk/commands/builder/multiarch/remote.rb +++ b/lib/mrsk/commands/builder/multiarch/remote.rb @@ -1,5 +1,3 @@ -require "mrsk/commands/builder/multiarch" - class Mrsk::Commands::Builder::Multiarch::Remote < Mrsk::Commands::Builder::Multiarch def create combine \ diff --git a/lib/mrsk/commands/builder/native.rb b/lib/mrsk/commands/builder/native.rb index 310ace07..18140eb3 100644 --- a/lib/mrsk/commands/builder/native.rb +++ b/lib/mrsk/commands/builder/native.rb @@ -1,5 +1,3 @@ -require "mrsk/commands/builder/base" - class Mrsk::Commands::Builder::Native < Mrsk::Commands::Builder::Base def create # No-op on native diff --git a/lib/mrsk/commands/builder/native/remote.rb b/lib/mrsk/commands/builder/native/remote.rb index d3089fdb..4a457309 100644 --- a/lib/mrsk/commands/builder/native/remote.rb +++ b/lib/mrsk/commands/builder/native/remote.rb @@ -1,5 +1,3 @@ -require "mrsk/commands/builder/native" - class Mrsk::Commands::Builder::Native::Remote < Mrsk::Commands::Builder::Native def create chain \ diff --git a/lib/mrsk/commands/prune.rb b/lib/mrsk/commands/prune.rb index 19451b67..dd9b14b8 100644 --- a/lib/mrsk/commands/prune.rb +++ b/lib/mrsk/commands/prune.rb @@ -1,4 +1,3 @@ -require "mrsk/commands/base" require "active_support/duration" require "active_support/core_ext/numeric/time" diff --git a/lib/mrsk/commands/registry.rb b/lib/mrsk/commands/registry.rb index 8d05b0cb..4e9b1ce4 100644 --- a/lib/mrsk/commands/registry.rb +++ b/lib/mrsk/commands/registry.rb @@ -1,5 +1,3 @@ -require "mrsk/commands/base" - class Mrsk::Commands::Registry < Mrsk::Commands::Base delegate :registry, to: :config diff --git a/lib/mrsk/commands/traefik.rb b/lib/mrsk/commands/traefik.rb index f8f7aee7..dd0715cf 100644 --- a/lib/mrsk/commands/traefik.rb +++ b/lib/mrsk/commands/traefik.rb @@ -1,5 +1,3 @@ -require "mrsk/commands/base" - class Mrsk::Commands::Traefik < Mrsk::Commands::Base def run docker :run, "--name traefik", diff --git a/lib/mrsk/configuration.rb b/lib/mrsk/configuration.rb index 23723214..6e7dff38 100644 --- a/lib/mrsk/configuration.rb +++ b/lib/mrsk/configuration.rb @@ -3,7 +3,6 @@ require "active_support/core_ext/string/inquiry" require "active_support/core_ext/module/delegation" require "pathname" require "erb" -require "mrsk/utils" class Mrsk::Configuration delegate :service, :image, :servers, :env, :labels, :registry, :builder, to: :raw_config, allow_nil: true @@ -171,6 +170,3 @@ class Mrsk::Configuration raw_config.servers.is_a?(Array) ? [ "web" ] : raw_config.servers.keys.sort end end - -require "mrsk/configuration/role" -require "mrsk/configuration/accessory" diff --git a/mrsk.gemspec b/mrsk.gemspec index 78952cb6..7cbfb888 100644 --- a/mrsk.gemspec +++ b/mrsk.gemspec @@ -16,4 +16,5 @@ Gem::Specification.new do |spec| spec.add_dependency "sshkit", "~> 1.21" spec.add_dependency "thor", "~> 1.2" spec.add_dependency "dotenv", "~> 2.8" + spec.add_dependency "zeitwerk", "~> 2.5" end diff --git a/test/cli/cli_test_case.rb b/test/cli/cli_test_case.rb index c0cecbdd..f7a0ad07 100644 --- a/test/cli/cli_test_case.rb +++ b/test/cli/cli_test_case.rb @@ -1,6 +1,5 @@ require "test_helper" require "active_support/testing/stream" -require "mrsk/cli" class CliTestCase < ActiveSupport::TestCase include ActiveSupport::Testing::Stream diff --git a/test/commander_test.rb b/test/commander_test.rb index 5b3ed297..89ac4627 100644 --- a/test/commander_test.rb +++ b/test/commander_test.rb @@ -1,5 +1,4 @@ require "test_helper" -require "mrsk/commander" class CommanderTest < ActiveSupport::TestCase setup do diff --git a/test/commands/accessory_test.rb b/test/commands/accessory_test.rb index 21886440..8a68cbb7 100644 --- a/test/commands/accessory_test.rb +++ b/test/commands/accessory_test.rb @@ -1,10 +1,8 @@ require "test_helper" -require "mrsk/configuration" -require "mrsk/commands/accessory" class CommandsAccessoryTest < ActiveSupport::TestCase setup do - @config = { + @config = { service: "app", image: "dhh/app", registry: { "username" => "dhh", "password" => "secret" }, servers: [ "1.1.1.1" ], accessories: { diff --git a/test/commands/app_test.rb b/test/commands/app_test.rb index c888bcff..2cbc0eec 100644 --- a/test/commands/app_test.rb +++ b/test/commands/app_test.rb @@ -1,6 +1,4 @@ require "test_helper" -require "mrsk/configuration" -require "mrsk/commands/app" class CommandsAppTest < ActiveSupport::TestCase setup do diff --git a/test/commands/builder_test.rb b/test/commands/builder_test.rb index 14aee153..dfd43313 100644 --- a/test/commands/builder_test.rb +++ b/test/commands/builder_test.rb @@ -1,6 +1,4 @@ require "test_helper" -require "mrsk/configuration" -require "mrsk/commands/builder" class CommandsBuilderTest < ActiveSupport::TestCase setup do diff --git a/test/commands/registry_test.rb b/test/commands/registry_test.rb index 390f2208..15a2c312 100755 --- a/test/commands/registry_test.rb +++ b/test/commands/registry_test.rb @@ -1,10 +1,8 @@ require "test_helper" -require "mrsk/configuration" -require "mrsk/commands/registry" class CommandsRegistryTest < ActiveSupport::TestCase setup do - @config = { service: "app", + @config = { service: "app", image: "dhh/app", registry: { "username" => "dhh", "password" => "secret", diff --git a/test/commands/traefik_test.rb b/test/commands/traefik_test.rb index 8f204ea5..b529b3bc 100644 --- a/test/commands/traefik_test.rb +++ b/test/commands/traefik_test.rb @@ -1,6 +1,4 @@ require "test_helper" -require "mrsk/configuration" -require "mrsk/commands/traefik" class CommandsTraefikTest < ActiveSupport::TestCase setup do diff --git a/test/configuration/accessory_test.rb b/test/configuration/accessory_test.rb index cee4511c..7f90e82a 100644 --- a/test/configuration/accessory_test.rb +++ b/test/configuration/accessory_test.rb @@ -1,5 +1,4 @@ require "test_helper" -require "mrsk/configuration" class ConfigurationAccessoryTest < ActiveSupport::TestCase setup do @@ -66,7 +65,7 @@ class ConfigurationAccessoryTest < ActiveSupport::TestCase test "missing host" do @deploy[:accessories]["mysql"]["host"] = nil @config = Mrsk::Configuration.new(@deploy) - + assert_raises(ArgumentError) do @config.accessory(:mysql).host end diff --git a/test/configuration/role_test.rb b/test/configuration/role_test.rb index 5c67b798..52970395 100644 --- a/test/configuration/role_test.rb +++ b/test/configuration/role_test.rb @@ -1,5 +1,4 @@ require "test_helper" -require "mrsk/configuration" class ConfigurationRoleTest < ActiveSupport::TestCase setup do @@ -63,7 +62,7 @@ class ConfigurationRoleTest < ActiveSupport::TestCase end test "default traefik label on non-web role" do - config = Mrsk::Configuration.new(@deploy_with_roles.tap { |c| + config = Mrsk::Configuration.new(@deploy_with_roles.tap { |c| c[:servers]["beta"] = { "traefik" => "true", "hosts" => [ "1.1.1.5" ] } }) @@ -97,7 +96,7 @@ class ConfigurationRoleTest < ActiveSupport::TestCase ENV["REDIS_PASSWORD"] = "secret456" ENV["DB_PASSWORD"] = "secret123" - + assert_equal ["-e", "REDIS_PASSWORD=secret456", "-e", "DB_PASSWORD=secret123", "-e", "REDIS_URL=redis://a/b", "-e", "WEB_CONCURRENCY=4"], @config_with_roles.role(:workers).env_args ensure ENV["REDIS_PASSWORD"] = nil @@ -116,7 +115,7 @@ class ConfigurationRoleTest < ActiveSupport::TestCase } ENV["DB_PASSWORD"] = "secret123" - + assert_equal ["-e", "DB_PASSWORD=secret123", "-e", "REDIS_URL=redis://a/b", "-e", "WEB_CONCURRENCY=4"], @config_with_roles.role(:workers).env_args ensure ENV["DB_PASSWORD"] = nil @@ -133,7 +132,7 @@ class ConfigurationRoleTest < ActiveSupport::TestCase } ENV["REDIS_PASSWORD"] = "secret456" - + assert_equal ["-e", "REDIS_PASSWORD=secret456", "-e", "REDIS_URL=redis://a/b", "-e", "WEB_CONCURRENCY=4"], @config_with_roles.role(:workers).env_args ensure ENV["REDIS_PASSWORD"] = nil diff --git a/test/configuration_test.rb b/test/configuration_test.rb index 1cd45fcb..7cbebabd 100644 --- a/test/configuration_test.rb +++ b/test/configuration_test.rb @@ -1,5 +1,4 @@ require "test_helper" -require "mrsk/configuration" class ConfigurationTest < ActiveSupport::TestCase setup do diff --git a/test/test_helper.rb b/test/test_helper.rb index 732b5af4..4c381df2 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -5,6 +5,7 @@ require "debug" require "mocha/minitest" # using #stubs that can alter returns require "minitest/autorun" # using #stub that take args require "sshkit" +require "mrsk" ActiveSupport::LogSubscriber.logger = ActiveSupport::Logger.new(STDOUT) if ENV["VERBOSE"]