avm 0.28.0 → 0.31.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 +4 -4
- data/lib/avm/application_stereotypes/base.rb +11 -1
- data/lib/avm/applications/base/stereotype.rb +31 -0
- data/lib/avm/applications/base.rb +17 -0
- data/lib/avm/instances/base/auto_values/install.rb +48 -0
- data/lib/avm/instances/base/auto_values.rb +1 -1
- data/lib/avm/instances/base.rb +4 -4
- data/lib/avm/instances/entry_keys.rb +7 -6
- data/lib/avm/instances.rb +3 -2
- data/lib/avm/registry/application_stereotypes/build_available.rb +9 -6
- data/lib/avm/registry/application_stereotypes/stereotype_builder.rb +8 -5
- data/lib/avm/registry/application_stereotypes.rb +26 -10
- data/lib/avm/registry/instances.rb +1 -1
- data/lib/avm/registry/source_generators.rb +16 -0
- data/lib/avm/registry.rb +2 -1
- data/lib/avm/scms/base.rb +2 -0
- data/lib/avm/source_generators/base.rb +29 -0
- data/lib/avm/source_generators.rb +9 -0
- data/lib/avm/sources/base.rb +4 -4
- data/lib/avm/version.rb +1 -1
- data/lib/avm/with/application_stereotype.rb +35 -0
- data/lib/avm/with/extra_subcommands.rb +44 -0
- metadata +13 -11
- data/lib/avm/application_stereotypes/base/by_gem.rb +0 -17
- data/lib/avm/application_stereotypes/base/detection.rb +0 -34
- data/lib/avm/instances/base/auto_values/access.rb +0 -40
- data/lib/avm/with_application_stereotype.rb +0 -23
- data/lib/avm/with_dynamic_runners.rb +0 -42
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: aea575c3e0ebcc43678325a4a682ea17c915ecae1eb6d133335b3e94ace56ca3
         | 
| 4 | 
            +
              data.tar.gz: 2ed8fc21068a44f5ae816aa098a866650f32511b09afca2e75af2b620cd89f9b
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 3c87d398c755f55f71a827167bfbe0131d08d5df55af5497ccc7fd239cd059e59c9f251dbe448ca13df30c31da76e147dc2bd8e0d1501130000a219313b5e39d
         | 
| 7 | 
            +
              data.tar.gz: e188963cfc504522f52eb86e7de7490427c194496c61e2d6771bdfdd697de9d9e6647cc0c1c772c6f19b3799bdd05c3054f999caa8168708a29e910d19398431
         | 
| @@ -5,7 +5,11 @@ require 'eac_ruby_utils/core_ext' | |
| 5 5 | 
             
            module Avm
         | 
| 6 6 | 
             
              module ApplicationStereotypes
         | 
| 7 7 | 
             
                class Base
         | 
| 8 | 
            -
                   | 
| 8 | 
            +
                  enable_listable
         | 
| 9 | 
            +
                  lists.add_symbol :resource, :instance, :source, :source_generator
         | 
| 10 | 
            +
                  common_constructor :namespace_module, :resources do
         | 
| 11 | 
            +
                    self.resources = self.class.lists.resource.hash_keys_validate!(resources)
         | 
| 12 | 
            +
                  end
         | 
| 9 13 |  | 
| 10 14 | 
             
                  # @return [String]
         | 
| 11 15 | 
             
                  def name
         | 
| @@ -16,6 +20,12 @@ module Avm | |
| 16 20 | 
             
                  def to_s
         | 
| 17 21 | 
             
                    name
         | 
| 18 22 | 
             
                  end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                  lists.resource.each_value do |resource|
         | 
| 25 | 
            +
                    define_method "#{resource}_class" do
         | 
| 26 | 
            +
                      resources[resource]
         | 
| 27 | 
            +
                    end
         | 
| 28 | 
            +
                  end
         | 
| 19 29 | 
             
                end
         | 
| 20 30 | 
             
              end
         | 
| 21 31 | 
             
            end
         | 
| @@ -0,0 +1,31 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'avm/registry'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module Avm
         | 
| 6 | 
            +
              module Applications
         | 
| 7 | 
            +
                class Base
         | 
| 8 | 
            +
                  module Stereotype
         | 
| 9 | 
            +
                    # @return [Avm::ApplicationStereotypes::Base, nil]
         | 
| 10 | 
            +
                    def stereotype_by_configuration
         | 
| 11 | 
            +
                      entry('stereotype').optional_value.if_present do |v|
         | 
| 12 | 
            +
                        ::Avm::Registry.application_stereotypes.detect(v)
         | 
| 13 | 
            +
                      end
         | 
| 14 | 
            +
                    end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                    # @return [Avm::ApplicationStereotypes::Base, nil]
         | 
| 17 | 
            +
                    def stereotype_by_source
         | 
| 18 | 
            +
                      ::Avm::Registry.application_stereotypes.detect_optional(local_source.class)
         | 
| 19 | 
            +
                    end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                    private
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                    # @return [Avm::ApplicationStereotypes::Base]
         | 
| 24 | 
            +
                    def stereotype_uncached
         | 
| 25 | 
            +
                      stereotype_by_configuration || stereotype_by_source ||
         | 
| 26 | 
            +
                        raise("Could not find stereotype for application \"#{self}\"")
         | 
| 27 | 
            +
                    end
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
            end
         | 
| @@ -1,13 +1,18 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 3 | 
             
            require 'avm/instances/entries'
         | 
| 4 | 
            +
            require 'avm/registry'
         | 
| 4 5 | 
             
            require 'eac_ruby_utils/core_ext'
         | 
| 5 6 |  | 
| 6 7 | 
             
            module Avm
         | 
| 7 8 | 
             
              module Applications
         | 
| 8 9 | 
             
                class Base
         | 
| 10 | 
            +
                  enable_simple_cache
         | 
| 11 | 
            +
                  require_sub __FILE__, include_modules: true
         | 
| 9 12 | 
             
                  include ::Avm::Instances::Entries
         | 
| 10 13 |  | 
| 14 | 
            +
                  LOCAL_INSTANCE_SUFFIX = 'dev'
         | 
| 15 | 
            +
             | 
| 11 16 | 
             
                  common_constructor :id do
         | 
| 12 17 | 
             
                    self.id = id.to_s
         | 
| 13 18 | 
             
                  end
         | 
| @@ -23,6 +28,18 @@ module Avm | |
| 23 28 | 
             
                  def name
         | 
| 24 29 | 
             
                    entry(::Avm::Instances::EntryKeys::NAME).read
         | 
| 25 30 | 
             
                  end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  private
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  # @return [Avm::Instances::Base]
         | 
| 35 | 
            +
                  def local_instance_uncached
         | 
| 36 | 
            +
                    instance(LOCAL_INSTANCE_SUFFIX)
         | 
| 37 | 
            +
                  end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                  # @return [Avm::Sources::Base]
         | 
| 40 | 
            +
                  def local_source_uncached
         | 
| 41 | 
            +
                    ::Avm::Registry.sources.detect(local_instance.fs_path)
         | 
| 42 | 
            +
                  end
         | 
| 26 43 | 
             
                end
         | 
| 27 44 | 
             
              end
         | 
| 28 45 | 
             
            end
         | 
| @@ -0,0 +1,48 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'avm/instances/entry_keys'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module Avm
         | 
| 6 | 
            +
              module Instances
         | 
| 7 | 
            +
                class Base
         | 
| 8 | 
            +
                  module AutoValues
         | 
| 9 | 
            +
                    module Install
         | 
| 10 | 
            +
                      def auto_access
         | 
| 11 | 
            +
                        read_entry_optional(::Avm::Instances::EntryKeys::INSTALL_URL).present? ? 'ssh' : 'local'
         | 
| 12 | 
            +
                      end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                      def auto_install_hostname
         | 
| 15 | 
            +
                        inherited_entry_value(::Avm::Instances::EntryKeys::HOST_ID,
         | 
| 16 | 
            +
                                              ::Avm::Instances::EntryKeys::INSTALL_HOSTNAME)
         | 
| 17 | 
            +
                      end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                      def auto_install_port
         | 
| 20 | 
            +
                        inherited_entry_value(::Avm::Instances::EntryKeys::HOST_ID,
         | 
| 21 | 
            +
                                              ::Avm::Instances::EntryKeys::INSTALL_PORT) || 22
         | 
| 22 | 
            +
                      end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                      def auto_install_username
         | 
| 25 | 
            +
                        inherited_entry_value(::Avm::Instances::EntryKeys::HOST_ID,
         | 
| 26 | 
            +
                                              ::Avm::Instances::EntryKeys::INSTALL_USERNAME)
         | 
| 27 | 
            +
                      end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                      def auto_install_url
         | 
| 30 | 
            +
                        inherited_entry_value(::Avm::Instances::EntryKeys::HOST_ID,
         | 
| 31 | 
            +
                                              ::Avm::Instances::EntryKeys::INSTALL_URL) ||
         | 
| 32 | 
            +
                          auto_install_url_by_parts
         | 
| 33 | 
            +
                      end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                      def auto_install_url_by_parts
         | 
| 36 | 
            +
                        read_entry_optional(::Avm::Instances::EntryKeys::INSTALL_HOSTNAME).if_present do |a|
         | 
| 37 | 
            +
                          a = read_entry_optional(::Avm::Instances::EntryKeys::INSTALL_USERNAME)
         | 
| 38 | 
            +
                                .if_present(a) { |v| "#{v}@#{a}" }
         | 
| 39 | 
            +
                          a = read_entry_optional(::Avm::Instances::EntryKeys::INSTALL_PORT)
         | 
| 40 | 
            +
                                .if_present(a) { |v| "#{a}:#{v}" }
         | 
| 41 | 
            +
                          "ssh://#{a}"
         | 
| 42 | 
            +
                        end
         | 
| 43 | 
            +
                      end
         | 
| 44 | 
            +
                    end
         | 
| 45 | 
            +
                  end
         | 
| 46 | 
            +
                end
         | 
| 47 | 
            +
              end
         | 
| 48 | 
            +
            end
         | 
| @@ -10,7 +10,7 @@ module Avm | |
| 10 10 | 
             
                    extend ::ActiveSupport::Concern
         | 
| 11 11 |  | 
| 12 12 | 
             
                    included do
         | 
| 13 | 
            -
                      %w[ | 
| 13 | 
            +
                      %w[Admin Data Database Filesystem Install Mailer Ruby Source System Web]
         | 
| 14 14 | 
             
                        .each do |class_name|
         | 
| 15 15 | 
             
                        include const_get(class_name)
         | 
| 16 16 | 
             
                      end
         | 
    
        data/lib/avm/instances/base.rb
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            -
            require 'avm/ | 
| 4 | 
            -
            require 'avm/ | 
| 3 | 
            +
            require 'avm/with/application_stereotype'
         | 
| 4 | 
            +
            require 'avm/with/extra_subcommands'
         | 
| 5 5 | 
             
            require 'eac_ruby_utils/require_sub'
         | 
| 6 6 | 
             
            require 'eac_ruby_utils/simple_cache'
         | 
| 7 7 | 
             
            require 'avm/instances/entries'
         | 
| @@ -14,8 +14,8 @@ module Avm | |
| 14 14 | 
             
                  enable_simple_cache
         | 
| 15 15 | 
             
                  require_sub __FILE__, include_modules: true
         | 
| 16 16 | 
             
                  include ::Avm::Instances::Entries
         | 
| 17 | 
            -
                  include ::Avm:: | 
| 18 | 
            -
                  include ::Avm:: | 
| 17 | 
            +
                  include ::Avm::With::ExtraSubcommands
         | 
| 18 | 
            +
                  include ::Avm::With::ApplicationStereotype
         | 
| 19 19 |  | 
| 20 20 | 
             
                  lists.add_string :access, :local, :ssh
         | 
| 21 21 |  | 
| @@ -5,6 +5,8 @@ require 'eac_ruby_utils/core_ext' | |
| 5 5 | 
             
            module Avm
         | 
| 6 6 | 
             
              module Instances
         | 
| 7 7 | 
             
                module EntryKeys
         | 
| 8 | 
            +
                  URI_FIELDS = %i[fragment hostname password path port query scheme url username].freeze
         | 
| 9 | 
            +
             | 
| 8 10 | 
             
                  class << self
         | 
| 9 11 | 
             
                    def all
         | 
| 10 12 | 
             
                      all_keys.to_a
         | 
| @@ -43,17 +45,16 @@ module Avm | |
| 43 45 |  | 
| 44 46 | 
             
                  {
         | 
| 45 47 | 
             
                    '' => %w[data_fs_path fs_path host_id name source_instance_id],
         | 
| 46 | 
            -
                    admin: %w[ | 
| 47 | 
            -
                    database: %w[id  | 
| 48 | 
            +
                    admin: URI_FIELDS + %w[api_key],
         | 
| 49 | 
            +
                    database: URI_FIELDS + %w[id limit name system timeout extra],
         | 
| 48 50 | 
             
                    docker: %w[registry],
         | 
| 49 51 | 
             
                    fs: %w[url],
         | 
| 52 | 
            +
                    install: URI_FIELDS,
         | 
| 50 53 | 
             
                    mailer: {
         | 
| 51 54 | 
             
                      '' => %w[id from reply_to],
         | 
| 52 | 
            -
                      smtp: %w[address  | 
| 53 | 
            -
                               starttls_auto tls]
         | 
| 55 | 
            +
                      smtp: URI_FIELDS + %w[address domain authentication openssl_verify_mode starttls_auto tls]
         | 
| 54 56 | 
             
                    },
         | 
| 55 | 
            -
                     | 
| 56 | 
            -
                    web: %w[authority hostname path port scheme url userinfo]
         | 
| 57 | 
            +
                    web: URI_FIELDS + %w[authority userinfo]
         | 
| 57 58 | 
             
                  }.each { |prefix, suffixes| keys_consts_set(prefix, suffixes) }
         | 
| 58 59 | 
             
                end
         | 
| 59 60 | 
             
              end
         | 
    
        data/lib/avm/instances.rb
    CHANGED
    
    
| @@ -1,5 +1,6 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            +
            require 'avm/application_stereotypes/base'
         | 
| 3 4 | 
             
            require 'avm/registry/application_stereotypes/stereotype_builder'
         | 
| 4 5 | 
             
            require 'eac_ruby_utils/core_ext'
         | 
| 5 6 |  | 
| @@ -13,8 +14,7 @@ module Avm | |
| 13 14 |  | 
| 14 15 | 
             
                    def result
         | 
| 15 16 | 
             
                      reset_buffer
         | 
| 16 | 
            -
                       | 
| 17 | 
            -
                      read_sources_registry
         | 
| 17 | 
            +
                      read_registries
         | 
| 18 18 | 
             
                      buffer.values.map(&:build)
         | 
| 19 19 | 
             
                    end
         | 
| 20 20 |  | 
| @@ -29,12 +29,15 @@ module Avm | |
| 29 29 | 
             
                      buffer[object.stereotype_namespace_module].add_object(type, object)
         | 
| 30 30 | 
             
                    end
         | 
| 31 31 |  | 
| 32 | 
            -
                    def  | 
| 33 | 
            -
                      ::Avm:: | 
| 32 | 
            +
                    def read_registries
         | 
| 33 | 
            +
                      ::Avm::ApplicationStereotypes::Base.lists.resource.each_value do |resource|
         | 
| 34 | 
            +
                        read_registry(resource)
         | 
| 35 | 
            +
                      end
         | 
| 34 36 | 
             
                    end
         | 
| 35 37 |  | 
| 36 | 
            -
                    def  | 
| 37 | 
            -
                      ::Avm::Registry. | 
| 38 | 
            +
                    def read_registry(resource)
         | 
| 39 | 
            +
                      ::Avm::Registry.send(resource.to_s.pluralize).available
         | 
| 40 | 
            +
                        .each { |obj| read_object(resource, obj) }
         | 
| 38 41 | 
             
                    end
         | 
| 39 42 |  | 
| 40 43 | 
             
                    def reset_buffer
         | 
| @@ -10,20 +10,23 @@ module Avm | |
| 10 10 | 
             
                    common_constructor :namespace_module
         | 
| 11 11 |  | 
| 12 12 | 
             
                    def add_object(type, object)
         | 
| 13 | 
            -
                       | 
| 14 | 
            -
                      raise "#{attr_method} is already present" if  | 
| 13 | 
            +
                      type = type.to_sym
         | 
| 14 | 
            +
                      raise "#{attr_method} is already present" if resources.key?(type)
         | 
| 15 15 |  | 
| 16 | 
            -
                       | 
| 16 | 
            +
                      resources[::Avm::ApplicationStereotypes::Base.lists.resource.value_validate!(type)] =
         | 
| 17 | 
            +
                        object
         | 
| 17 18 | 
             
                    end
         | 
| 18 19 |  | 
| 19 20 | 
             
                    # @return [Avm::ApplicationStereotypes::Base]
         | 
| 20 21 | 
             
                    def build
         | 
| 21 | 
            -
                      ::Avm::ApplicationStereotypes::Base.new(namespace_module,  | 
| 22 | 
            +
                      ::Avm::ApplicationStereotypes::Base.new(namespace_module, resources)
         | 
| 22 23 | 
             
                    end
         | 
| 23 24 |  | 
| 24 25 | 
             
                    private
         | 
| 25 26 |  | 
| 26 | 
            -
                     | 
| 27 | 
            +
                    def resources
         | 
| 28 | 
            +
                      @resources ||= {}
         | 
| 29 | 
            +
                    end
         | 
| 27 30 | 
             
                  end
         | 
| 28 31 | 
             
                end
         | 
| 29 32 | 
             
              end
         | 
| @@ -1,5 +1,7 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            +
            require 'avm/instances/base'
         | 
| 4 | 
            +
            require 'avm/sources/base'
         | 
| 3 5 | 
             
            require 'eac_ruby_utils/core_ext'
         | 
| 4 6 |  | 
| 5 7 | 
             
            module Avm
         | 
| @@ -10,26 +12,40 @@ module Avm | |
| 10 12 |  | 
| 11 13 | 
             
                  common_constructor :module_suffix
         | 
| 12 14 |  | 
| 15 | 
            +
                  def detect(obj)
         | 
| 16 | 
            +
                    detect_optional(obj) || raise_not_found(obj)
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  def detect_optional(obj)
         | 
| 20 | 
            +
                    detect_by_instance_class(obj) || detect_by_source_class(obj) || detecy_by_name(obj)
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
             | 
| 13 23 | 
             
                  private
         | 
| 14 24 |  | 
| 15 25 | 
             
                  def available_uncached
         | 
| 16 26 | 
             
                    build_available
         | 
| 17 27 | 
             
                  end
         | 
| 18 28 |  | 
| 19 | 
            -
                   | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
                     | 
| 29 | 
            +
                  def detect_by_instance_class(obj)
         | 
| 30 | 
            +
                    return nil unless obj.is_a?(::Class) && obj < ::Avm::Instances::Base
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                    available.find { |a| a.instance_class == obj }
         | 
| 23 33 | 
             
                  end
         | 
| 24 34 |  | 
| 25 | 
            -
                  def  | 
| 26 | 
            -
                     | 
| 27 | 
            -
             | 
| 35 | 
            +
                  def detecy_by_name(obj)
         | 
| 36 | 
            +
                    return nil unless obj.is_a?(::String)
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                    available.find { |a| a.name == obj }
         | 
| 39 | 
            +
                  end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                  def detect_by_source_class(obj)
         | 
| 42 | 
            +
                    return nil unless obj.is_a?(::Class) && obj < ::Avm::Sources::Base
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                    available.find { |a| a.source_class == obj }
         | 
| 28 45 | 
             
                  end
         | 
| 29 46 |  | 
| 30 | 
            -
                  def  | 
| 31 | 
            -
                     | 
| 32 | 
            -
                      .map { |klass| class_detect(klass, registered_initialize_args) }.find(&:present?)
         | 
| 47 | 
            +
                  def raise_not_found(obj)
         | 
| 48 | 
            +
                    raise("No registered module valid for #{obj} (Available: #{available.join(', ')})")
         | 
| 33 49 | 
             
                  end
         | 
| 34 50 | 
             
                end
         | 
| 35 51 | 
             
              end
         | 
| @@ -9,7 +9,7 @@ module Avm | |
| 9 9 | 
             
                  # @return [Avm::Instances::Base, nil]
         | 
| 10 10 | 
             
                  def class_detect(klass, detect_args)
         | 
| 11 11 | 
             
                    r = ::Avm::Instances::Base.by_id(*detect_args)
         | 
| 12 | 
            -
                    r.application.stereotype.instance_class == klass ?  | 
| 12 | 
            +
                    r.application.stereotype.instance_class == klass ? klass.by_id(*detect_args) : nil
         | 
| 13 13 | 
             
                  end
         | 
| 14 14 | 
             
                end
         | 
| 15 15 | 
             
              end
         | 
| @@ -0,0 +1,16 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'avm/instances/base'
         | 
| 4 | 
            +
            require 'avm/registry/from_gems'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            module Avm
         | 
| 7 | 
            +
              module Registry
         | 
| 8 | 
            +
                class SourceGenerators < ::Avm::Registry::FromGems
         | 
| 9 | 
            +
                  # @return [Avm::Instances::Base, nil]
         | 
| 10 | 
            +
                  def class_detect(klass, detect_args)
         | 
| 11 | 
            +
                    stereotype_name, target_path = detect_args
         | 
| 12 | 
            +
                    klass.application_stereotype.name == stereotype_name ? klass.new(target_path) : nil
         | 
| 13 | 
            +
                  end
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
            end
         | 
    
        data/lib/avm/registry.rb
    CHANGED
    
    | @@ -7,7 +7,8 @@ module Avm | |
| 7 7 | 
             
              module Registry
         | 
| 8 8 | 
             
                require_sub __FILE__
         | 
| 9 9 | 
             
                enable_listable
         | 
| 10 | 
            -
                lists.add_symbol :category, :application_stereotypes, :instances, :runners, :scms, | 
| 10 | 
            +
                lists.add_symbol :category, :application_stereotypes, :instances, :runners, :scms,
         | 
| 11 | 
            +
                                 :source_generators, :sources
         | 
| 11 12 |  | 
| 12 13 | 
             
                WITH_PATH = [CATEGORY_SCMS, CATEGORY_SOURCES].freeze
         | 
| 13 14 |  | 
    
        data/lib/avm/scms/base.rb
    CHANGED
    
    | @@ -1,5 +1,6 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            +
            require 'avm/with/application_stereotype'
         | 
| 3 4 | 
             
            require 'eac_ruby_utils/core_ext'
         | 
| 4 5 |  | 
| 5 6 | 
             
            module Avm
         | 
| @@ -7,6 +8,7 @@ module Avm | |
| 7 8 | 
             
                class Base
         | 
| 8 9 | 
             
                  enable_abstract_methods
         | 
| 9 10 | 
             
                  enable_simple_cache
         | 
| 11 | 
            +
                  include ::Avm::With::ApplicationStereotype
         | 
| 10 12 | 
             
                  abstract_methods :update, :valid?
         | 
| 11 13 | 
             
                  common_constructor :path do
         | 
| 12 14 | 
             
                    self.path = path.to_pathname
         | 
| @@ -0,0 +1,29 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'avm/with/application_stereotype'
         | 
| 4 | 
            +
            require 'eac_ruby_utils/core_ext'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            module Avm
         | 
| 7 | 
            +
              module SourceGenerators
         | 
| 8 | 
            +
                class Base
         | 
| 9 | 
            +
                  include ::Avm::With::ApplicationStereotype
         | 
| 10 | 
            +
                  common_constructor :target_path do
         | 
| 11 | 
            +
                    self.target_path = target_path.to_pathname
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  def perform
         | 
| 15 | 
            +
                    assert_clear_directory
         | 
| 16 | 
            +
                    apply_template
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  def assert_clear_directory
         | 
| 20 | 
            +
                    target_path.mkpath
         | 
| 21 | 
            +
                    raise "\"#{target_path}\" is not empty" if target_path.children.any?
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                  def apply_template
         | 
| 25 | 
            +
                    template.apply(self, target_path)
         | 
| 26 | 
            +
                  end
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
            end
         | 
    
        data/lib/avm/sources/base.rb
    CHANGED
    
    | @@ -2,8 +2,8 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            require 'avm/registry'
         | 
| 4 4 | 
             
            require 'avm/scms/null'
         | 
| 5 | 
            -
            require 'avm/ | 
| 6 | 
            -
            require 'avm/ | 
| 5 | 
            +
            require 'avm/with/application_stereotype'
         | 
| 6 | 
            +
            require 'avm/with/extra_subcommands'
         | 
| 7 7 | 
             
            require 'eac_git'
         | 
| 8 8 | 
             
            require 'eac_ruby_utils/core_ext'
         | 
| 9 9 |  | 
| @@ -11,8 +11,8 @@ module Avm | |
| 11 11 | 
             
              module Sources
         | 
| 12 12 | 
             
                class Base
         | 
| 13 13 | 
             
                  require_sub __FILE__, include_modules: true
         | 
| 14 | 
            -
                  include ::Avm:: | 
| 15 | 
            -
                  include ::Avm:: | 
| 14 | 
            +
                  include ::Avm::With::ApplicationStereotype
         | 
| 15 | 
            +
                  include ::Avm::With::ExtraSubcommands
         | 
| 16 16 | 
             
                  compare_by :path
         | 
| 17 17 | 
             
                  enable_abstract_methods
         | 
| 18 18 | 
             
                  enable_simple_cache
         | 
    
        data/lib/avm/version.rb
    CHANGED
    
    
| @@ -0,0 +1,35 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'eac_ruby_utils/core_ext'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module Avm
         | 
| 6 | 
            +
              module With
         | 
| 7 | 
            +
                module ApplicationStereotype
         | 
| 8 | 
            +
                  common_concern do
         | 
| 9 | 
            +
                    include ClassMethods
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  module ClassMethods
         | 
| 13 | 
            +
                    # @return [Avm::ApplicationStereotype::Base]
         | 
| 14 | 
            +
                    def application_stereotype
         | 
| 15 | 
            +
                      @application_stereotype ||=
         | 
| 16 | 
            +
                        ::Avm::Registry.application_stereotypes.detect(application_stereotype_name)
         | 
| 17 | 
            +
                    end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                    # @return [String]
         | 
| 20 | 
            +
                    def application_stereotype_name
         | 
| 21 | 
            +
                      stereotype_namespace_module.name.demodulize
         | 
| 22 | 
            +
                    end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                    # @return [Module]
         | 
| 25 | 
            +
                    def stereotype_namespace_module
         | 
| 26 | 
            +
                      module_parent.module_parent
         | 
| 27 | 
            +
                    end
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  def stereotype_namespace_module
         | 
| 31 | 
            +
                    self.class.stereotype_namespace_module
         | 
| 32 | 
            +
                  end
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
            end
         | 
| @@ -0,0 +1,44 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'eac_cli/runner_with/subcommands'
         | 
| 4 | 
            +
            require 'eac_ruby_utils/core_ext'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            module Avm
         | 
| 7 | 
            +
              module With
         | 
| 8 | 
            +
                module ExtraSubcommands
         | 
| 9 | 
            +
                  # @return [Hash<String, EacCli::Runner>]
         | 
| 10 | 
            +
                  def extra_available_subcommands
         | 
| 11 | 
            +
                    extra_available_subcommands_from_runners_module
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  # @return [Hash<String, EacCli::Runner>]
         | 
| 15 | 
            +
                  def extra_available_subcommands_from_runners_module
         | 
| 16 | 
            +
                    self.class.ancestors.reverse.inject({}) do |a, e|
         | 
| 17 | 
            +
                      a.merge(RunnersFromModule.new(e).result)
         | 
| 18 | 
            +
                    end
         | 
| 19 | 
            +
                  end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                  class RunnersFromModule
         | 
| 22 | 
            +
                    enable_simple_cache
         | 
| 23 | 
            +
                    common_constructor :the_module
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                    # @return [Hash<String, EacCli::Runner>]
         | 
| 26 | 
            +
                    def result
         | 
| 27 | 
            +
                      return {} if runners_module.blank?
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                      ::EacCli::RunnerWith::Subcommands.subcommands_from_module(runners_module)
         | 
| 30 | 
            +
                    end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                    def runners_module_uncached
         | 
| 33 | 
            +
                      return nil if the_module.module_parent.blank?
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                      begin
         | 
| 36 | 
            +
                        the_module.module_parent.const_get('Runners')
         | 
| 37 | 
            +
                      rescue ::NameError
         | 
| 38 | 
            +
                        nil
         | 
| 39 | 
            +
                      end
         | 
| 40 | 
            +
                    end
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
              end
         | 
| 44 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: avm
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.31.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Eduardo H. Bogoni
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2022- | 
| 11 | 
            +
            date: 2022-08-01 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: eac_cli
         | 
| @@ -36,14 +36,14 @@ dependencies: | |
| 36 36 | 
             
                requirements:
         | 
| 37 37 | 
             
                - - "~>"
         | 
| 38 38 | 
             
                  - !ruby/object:Gem::Version
         | 
| 39 | 
            -
                    version: '0. | 
| 39 | 
            +
                    version: '0.10'
         | 
| 40 40 | 
             
              type: :runtime
         | 
| 41 41 | 
             
              prerelease: false
         | 
| 42 42 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 43 43 | 
             
                requirements:
         | 
| 44 44 | 
             
                - - "~>"
         | 
| 45 45 | 
             
                  - !ruby/object:Gem::Version
         | 
| 46 | 
            -
                    version: '0. | 
| 46 | 
            +
                    version: '0.10'
         | 
| 47 47 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 48 48 | 
             
              name: eac_docker
         | 
| 49 49 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -78,14 +78,14 @@ dependencies: | |
| 78 78 | 
             
                requirements:
         | 
| 79 79 | 
             
                - - "~>"
         | 
| 80 80 | 
             
                  - !ruby/object:Gem::Version
         | 
| 81 | 
            -
                    version: '0. | 
| 81 | 
            +
                    version: '0.97'
         | 
| 82 82 | 
             
              type: :runtime
         | 
| 83 83 | 
             
              prerelease: false
         | 
| 84 84 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 85 85 | 
             
                requirements:
         | 
| 86 86 | 
             
                - - "~>"
         | 
| 87 87 | 
             
                  - !ruby/object:Gem::Version
         | 
| 88 | 
            -
                    version: '0. | 
| 88 | 
            +
                    version: '0.97'
         | 
| 89 89 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 90 90 | 
             
              name: eac_templates
         | 
| 91 91 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -197,10 +197,9 @@ files: | |
| 197 197 | 
             
            - lib/avm.rb
         | 
| 198 198 | 
             
            - lib/avm/application_stereotypes.rb
         | 
| 199 199 | 
             
            - lib/avm/application_stereotypes/base.rb
         | 
| 200 | 
            -
            - lib/avm/application_stereotypes/base/by_gem.rb
         | 
| 201 | 
            -
            - lib/avm/application_stereotypes/base/detection.rb
         | 
| 202 200 | 
             
            - lib/avm/applications.rb
         | 
| 203 201 | 
             
            - lib/avm/applications/base.rb
         | 
| 202 | 
            +
            - lib/avm/applications/base/stereotype.rb
         | 
| 204 203 | 
             
            - lib/avm/data/instance.rb
         | 
| 205 204 | 
             
            - lib/avm/data/instance/files_unit.rb
         | 
| 206 205 | 
             
            - lib/avm/data/instance/package.rb
         | 
| @@ -218,11 +217,11 @@ files: | |
| 218 217 | 
             
            - lib/avm/instances.rb
         | 
| 219 218 | 
             
            - lib/avm/instances/base.rb
         | 
| 220 219 | 
             
            - lib/avm/instances/base/auto_values.rb
         | 
| 221 | 
            -
            - lib/avm/instances/base/auto_values/access.rb
         | 
| 222 220 | 
             
            - lib/avm/instances/base/auto_values/admin.rb
         | 
| 223 221 | 
             
            - lib/avm/instances/base/auto_values/data.rb
         | 
| 224 222 | 
             
            - lib/avm/instances/base/auto_values/database.rb
         | 
| 225 223 | 
             
            - lib/avm/instances/base/auto_values/filesystem.rb
         | 
| 224 | 
            +
            - lib/avm/instances/base/auto_values/install.rb
         | 
| 226 225 | 
             
            - lib/avm/instances/base/auto_values/mailer.rb
         | 
| 227 226 | 
             
            - lib/avm/instances/base/auto_values/ruby.rb
         | 
| 228 227 | 
             
            - lib/avm/instances/base/auto_values/source.rb
         | 
| @@ -251,6 +250,7 @@ files: | |
| 251 250 | 
             
            - lib/avm/registry/instances.rb
         | 
| 252 251 | 
             
            - lib/avm/registry/runners.rb
         | 
| 253 252 | 
             
            - lib/avm/registry/scms.rb
         | 
| 253 | 
            +
            - lib/avm/registry/source_generators.rb
         | 
| 254 254 | 
             
            - lib/avm/registry/sources.rb
         | 
| 255 255 | 
             
            - lib/avm/registry/with_path.rb
         | 
| 256 256 | 
             
            - lib/avm/registry/with_path/cache.rb
         | 
| @@ -267,6 +267,8 @@ files: | |
| 267 267 | 
             
            - lib/avm/self/docker_image.rb
         | 
| 268 268 | 
             
            - lib/avm/self/instance.rb
         | 
| 269 269 | 
             
            - lib/avm/self/instance/entry_keys.rb
         | 
| 270 | 
            +
            - lib/avm/source_generators.rb
         | 
| 271 | 
            +
            - lib/avm/source_generators/base.rb
         | 
| 270 272 | 
             
            - lib/avm/sources.rb
         | 
| 271 273 | 
             
            - lib/avm/sources/base.rb
         | 
| 272 274 | 
             
            - lib/avm/sources/base/configuration.rb
         | 
| @@ -286,8 +288,8 @@ files: | |
| 286 288 | 
             
            - lib/avm/sync.rb
         | 
| 287 289 | 
             
            - lib/avm/version.rb
         | 
| 288 290 | 
             
            - lib/avm/version_number.rb
         | 
| 289 | 
            -
            - lib/avm/ | 
| 290 | 
            -
            - lib/avm/ | 
| 291 | 
            +
            - lib/avm/with/application_stereotype.rb
         | 
| 292 | 
            +
            - lib/avm/with/extra_subcommands.rb
         | 
| 291 293 | 
             
            homepage: 
         | 
| 292 294 | 
             
            licenses: []
         | 
| 293 295 | 
             
            metadata: {}
         | 
| @@ -1,17 +0,0 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            module Avm
         | 
| 4 | 
            -
              module ApplicationStereotypes
         | 
| 5 | 
            -
                class Base
         | 
| 6 | 
            -
                  module ByGem
         | 
| 7 | 
            -
                    common_concern
         | 
| 8 | 
            -
             | 
| 9 | 
            -
                    module ClassMethods
         | 
| 10 | 
            -
                      def by_gem(gem_name)
         | 
| 11 | 
            -
                        new(gem_name.gsub('-', '/').camelize)
         | 
| 12 | 
            -
                      end
         | 
| 13 | 
            -
                    end
         | 
| 14 | 
            -
                  end
         | 
| 15 | 
            -
                end
         | 
| 16 | 
            -
              end
         | 
| 17 | 
            -
            end
         | 
| @@ -1,34 +0,0 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            module Avm
         | 
| 4 | 
            -
              module ApplicationStereotypes
         | 
| 5 | 
            -
                class Base
         | 
| 6 | 
            -
                  module Detection
         | 
| 7 | 
            -
                    common_concern
         | 
| 8 | 
            -
             | 
| 9 | 
            -
                    module ClassMethods
         | 
| 10 | 
            -
                      # @return [Class<Avm::Sources::Base>, nil]
         | 
| 11 | 
            -
                      def detect(object)
         | 
| 12 | 
            -
                        return singleton_instance if
         | 
| 13 | 
            -
                        %w[name instance_class source_class].any? { |t| send("detect_by_#{t}?", object) }
         | 
| 14 | 
            -
                      end
         | 
| 15 | 
            -
             | 
| 16 | 
            -
                      # @return [Boolean]
         | 
| 17 | 
            -
                      def detect_by_instance_class?(object)
         | 
| 18 | 
            -
                        object.is_a?(::Class) && singleton_instance.instance_class == object
         | 
| 19 | 
            -
                      end
         | 
| 20 | 
            -
             | 
| 21 | 
            -
                      # @return [Boolean]
         | 
| 22 | 
            -
                      def detect_by_name?(object)
         | 
| 23 | 
            -
                        object.is_a?(::String) && singleton_instance.name == object
         | 
| 24 | 
            -
                      end
         | 
| 25 | 
            -
             | 
| 26 | 
            -
                      # @return [Boolean]
         | 
| 27 | 
            -
                      def detect_by_source_class?(object)
         | 
| 28 | 
            -
                        object.is_a?(::Class) && singleton_instance.source_class == object
         | 
| 29 | 
            -
                      end
         | 
| 30 | 
            -
                    end
         | 
| 31 | 
            -
                  end
         | 
| 32 | 
            -
                end
         | 
| 33 | 
            -
              end
         | 
| 34 | 
            -
            end
         | 
| @@ -1,40 +0,0 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            module Avm
         | 
| 4 | 
            -
              module Instances
         | 
| 5 | 
            -
                class Base
         | 
| 6 | 
            -
                  module AutoValues
         | 
| 7 | 
            -
                    module Access
         | 
| 8 | 
            -
                      def auto_access
         | 
| 9 | 
            -
                        read_entry_optional('ssh.url').present? ? 'ssh' : 'local'
         | 
| 10 | 
            -
                      end
         | 
| 11 | 
            -
             | 
| 12 | 
            -
                      def auto_ssh_hostname
         | 
| 13 | 
            -
                        inherited_entry_value(::Avm::Instances::EntryKeys::HOST_ID, 'ssh.hostname')
         | 
| 14 | 
            -
                      end
         | 
| 15 | 
            -
             | 
| 16 | 
            -
                      def auto_ssh_port
         | 
| 17 | 
            -
                        inherited_entry_value(::Avm::Instances::EntryKeys::HOST_ID, 'ssh.port') || 22
         | 
| 18 | 
            -
                      end
         | 
| 19 | 
            -
             | 
| 20 | 
            -
                      def auto_ssh_username
         | 
| 21 | 
            -
                        inherited_entry_value(::Avm::Instances::EntryKeys::HOST_ID, 'ssh.username')
         | 
| 22 | 
            -
                      end
         | 
| 23 | 
            -
             | 
| 24 | 
            -
                      def auto_ssh_url
         | 
| 25 | 
            -
                        inherited_entry_value(::Avm::Instances::EntryKeys::HOST_ID, 'ssh.url') ||
         | 
| 26 | 
            -
                          auto_ssh_url_by_parts
         | 
| 27 | 
            -
                      end
         | 
| 28 | 
            -
             | 
| 29 | 
            -
                      def auto_ssh_url_by_parts
         | 
| 30 | 
            -
                        read_entry_optional('ssh.hostname').if_present do |a|
         | 
| 31 | 
            -
                          a = read_entry_optional('ssh.username').if_present(a) { |v| "#{v}@#{a}" }
         | 
| 32 | 
            -
                          a = read_entry_optional('ssh.port').if_present(a) { |v| "#{a}:#{v}" }
         | 
| 33 | 
            -
                          "ssh://#{a}"
         | 
| 34 | 
            -
                        end
         | 
| 35 | 
            -
                      end
         | 
| 36 | 
            -
                    end
         | 
| 37 | 
            -
                  end
         | 
| 38 | 
            -
                end
         | 
| 39 | 
            -
              end
         | 
| 40 | 
            -
            end
         | 
| @@ -1,23 +0,0 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            require 'eac_cli/runner_with/subcommands'
         | 
| 4 | 
            -
            require 'eac_ruby_utils/core_ext'
         | 
| 5 | 
            -
             | 
| 6 | 
            -
            module Avm
         | 
| 7 | 
            -
              module WithApplicationStereotype
         | 
| 8 | 
            -
                common_concern do
         | 
| 9 | 
            -
                  include ClassMethods
         | 
| 10 | 
            -
                end
         | 
| 11 | 
            -
             | 
| 12 | 
            -
                module ClassMethods
         | 
| 13 | 
            -
                  # @return [Module]
         | 
| 14 | 
            -
                  def stereotype_namespace_module
         | 
| 15 | 
            -
                    module_parent.module_parent
         | 
| 16 | 
            -
                  end
         | 
| 17 | 
            -
                end
         | 
| 18 | 
            -
             | 
| 19 | 
            -
                def stereotype_namespace_module
         | 
| 20 | 
            -
                  self.class.stereotype_namespace_module
         | 
| 21 | 
            -
                end
         | 
| 22 | 
            -
              end
         | 
| 23 | 
            -
            end
         | 
| @@ -1,42 +0,0 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            require 'eac_cli/runner_with/subcommands'
         | 
| 4 | 
            -
            require 'eac_ruby_utils/core_ext'
         | 
| 5 | 
            -
             | 
| 6 | 
            -
            module Avm
         | 
| 7 | 
            -
              module WithDynamicRunners
         | 
| 8 | 
            -
                # @return [Hash<String, EacCli::Runner>]
         | 
| 9 | 
            -
                def extra_available_subcommands
         | 
| 10 | 
            -
                  extra_available_subcommands_from_runners_module
         | 
| 11 | 
            -
                end
         | 
| 12 | 
            -
             | 
| 13 | 
            -
                # @return [Hash<String, EacCli::Runner>]
         | 
| 14 | 
            -
                def extra_available_subcommands_from_runners_module
         | 
| 15 | 
            -
                  self.class.ancestors.reverse.inject({}) do |a, e|
         | 
| 16 | 
            -
                    a.merge(RunnersFromModule.new(e).result)
         | 
| 17 | 
            -
                  end
         | 
| 18 | 
            -
                end
         | 
| 19 | 
            -
             | 
| 20 | 
            -
                class RunnersFromModule
         | 
| 21 | 
            -
                  enable_simple_cache
         | 
| 22 | 
            -
                  common_constructor :the_module
         | 
| 23 | 
            -
             | 
| 24 | 
            -
                  # @return [Hash<String, EacCli::Runner>]
         | 
| 25 | 
            -
                  def result
         | 
| 26 | 
            -
                    return {} if runners_module.blank?
         | 
| 27 | 
            -
             | 
| 28 | 
            -
                    ::EacCli::RunnerWith::Subcommands.subcommands_from_module(runners_module)
         | 
| 29 | 
            -
                  end
         | 
| 30 | 
            -
             | 
| 31 | 
            -
                  def runners_module_uncached
         | 
| 32 | 
            -
                    return nil if the_module.module_parent.blank?
         | 
| 33 | 
            -
             | 
| 34 | 
            -
                    begin
         | 
| 35 | 
            -
                      the_module.module_parent.const_get('Runners')
         | 
| 36 | 
            -
                    rescue ::NameError
         | 
| 37 | 
            -
                      nil
         | 
| 38 | 
            -
                    end
         | 
| 39 | 
            -
                  end
         | 
| 40 | 
            -
                end
         | 
| 41 | 
            -
              end
         | 
| 42 | 
            -
            end
         |