hanami-cli 2.0.0.rc1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/.rubocop.yml +2 -0
 - data/.yardopts +3 -0
 - data/CHANGELOG.md +12 -0
 - data/Gemfile +3 -4
 - data/exe/hanami +6 -1
 - data/hanami-cli.gemspec +3 -2
 - data/lib/hanami/cli/bundler.rb +95 -5
 - data/lib/hanami/cli/command.rb +41 -0
 - data/lib/hanami/cli/commands/app/command.rb +63 -2
 - data/lib/hanami/cli/commands/app/console.rb +7 -3
 - data/lib/hanami/cli/commands/app/db/create.rb +2 -0
 - data/lib/hanami/cli/commands/app/db/create_migration.rb +3 -0
 - data/lib/hanami/cli/commands/app/db/drop.rb +2 -0
 - data/lib/hanami/cli/commands/app/db/migrate.rb +2 -0
 - data/lib/hanami/cli/commands/app/db/reset.rb +2 -0
 - data/lib/hanami/cli/commands/app/db/rollback.rb +2 -0
 - data/lib/hanami/cli/commands/app/db/sample_data.rb +2 -0
 - data/lib/hanami/cli/commands/app/db/seed.rb +2 -0
 - data/lib/hanami/cli/commands/app/db/setup.rb +2 -0
 - data/lib/hanami/cli/commands/app/db/structure/dump.rb +3 -0
 - data/lib/hanami/cli/commands/app/db/utils/database.rb +155 -0
 - data/lib/hanami/cli/commands/app/db/utils/database_config.rb +60 -0
 - data/lib/hanami/cli/commands/app/db/utils/mysql.rb +33 -0
 - data/lib/hanami/cli/commands/app/db/utils/postgres.rb +64 -0
 - data/lib/hanami/cli/commands/app/db/utils/sqlite.rb +45 -0
 - data/lib/hanami/cli/commands/app/db/version.rb +2 -0
 - data/lib/hanami/cli/commands/app/generate/action.rb +10 -3
 - data/lib/hanami/cli/commands/app/generate/slice.rb +9 -6
 - data/lib/hanami/cli/commands/app/generate.rb +2 -0
 - data/lib/hanami/cli/commands/app/install.rb +13 -2
 - data/lib/hanami/cli/commands/app/middleware.rb +7 -1
 - data/lib/hanami/cli/commands/app/routes.rb +8 -0
 - data/lib/hanami/cli/commands/app/server.rb +10 -0
 - data/lib/hanami/cli/commands/app/version.rb +4 -2
 - data/lib/hanami/cli/commands/app.rb +6 -19
 - data/lib/hanami/cli/commands/gem/new.rb +12 -13
 - data/lib/hanami/cli/commands/gem/version.rb +4 -2
 - data/lib/hanami/cli/commands/gem.rb +8 -5
 - data/lib/hanami/cli/commands.rb +19 -3
 - data/lib/hanami/cli/errors.rb +65 -0
 - data/lib/hanami/cli/files.rb +10 -0
 - data/lib/hanami/cli/generators/app/action.rb +11 -5
 - data/lib/hanami/cli/generators/app/action_context.rb +22 -0
 - data/lib/hanami/cli/generators/app/slice.rb +6 -1
 - data/lib/hanami/cli/generators/app/slice_context.rb +8 -0
 - data/lib/hanami/cli/generators/context.rb +14 -0
 - data/lib/hanami/cli/generators/gem/app.rb +9 -5
 - data/lib/hanami/cli/generators/version.rb +8 -6
 - data/lib/hanami/cli/middleware_stack_inspector.rb +5 -0
 - data/lib/hanami/cli/rake_tasks.rb +0 -1
 - data/lib/hanami/cli/repl/core.rb +12 -4
 - data/lib/hanami/cli/repl/irb.rb +3 -2
 - data/lib/hanami/cli/repl/pry.rb +1 -3
 - data/lib/hanami/cli/server.rb +11 -0
 - data/lib/hanami/cli/system_call.rb +65 -7
 - data/lib/hanami/cli/url.rb +9 -2
 - data/lib/hanami/cli/version.rb +4 -1
 - data/lib/hanami/cli.rb +26 -3
 - data/lib/hanami/console/context.rb +4 -2
 - data/lib/hanami/console/plugins/slice_readers.rb +1 -0
 - data/lib/hanami-cli.rb +3 -0
 - metadata +46 -25
 - data/lib/hanami/cli/command_line.rb +0 -17
 - data/lib/hanami/cli/commands/db/utils/database.rb +0 -133
 - data/lib/hanami/cli/commands/db/utils/database_config.rb +0 -48
 - data/lib/hanami/cli/commands/db/utils/mysql.rb +0 -27
 - data/lib/hanami/cli/commands/db/utils/postgres.rb +0 -54
 - data/lib/hanami/cli/commands/db/utils/sqlite.rb +0 -37
 - data/lib/hanami/cli/error.rb +0 -8
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: a1351e33232b164c6e82ac6148e95eac2562e43dcd36f1a1d11aad61307f32da
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 647213baac46e31addb957a6ce4d3f8b11e28e64ddb02d3cfe1569ce49015ed6
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: cb27cd6155cd93c1783402e32992104d32a41da98397ef57c0dc1b0b72edf0cb76c9203d48dc925c352f9742a16c274cf0679dc9e431c12d83ad69508478786d
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 04cc7a076b6a66d30729ebaa28b9108cb41bd7515cd538d5a81a350b22850ff3fbefd27a0a9044130ed50bfa8dc34562ab6e32e57834924cc7c3e51a13468708
         
     | 
    
        data/.rubocop.yml
    CHANGED
    
    
    
        data/.yardopts
    ADDED
    
    
    
        data/CHANGELOG.md
    CHANGED
    
    | 
         @@ -2,6 +2,18 @@ 
     | 
|
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            Hanami Command Line Interface
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
      
 5 
     | 
    
         
            +
            ## v2.0.0 - 2022-11-22
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            ### Added
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            - [Tim Riley] Use Zeitwerk to autoload the gem
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            ### Fixed
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            - [Luca Guidi] In case of internal exception, don't print the stack trace to stderr, print the error message, exit with 1.
         
     | 
| 
      
 14 
     | 
    
         
            +
            - [Tim Riley] Ensure to be able to run `hanami` CLI in Hanami app subdirectories.
         
     | 
| 
      
 15 
     | 
    
         
            +
            - [Sean Collins] Return an error when trying to run `hanami new` with an existing target path (file or directory)
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
       5 
17 
     | 
    
         
             
            ## v2.0.0.rc1 - 2022-11-08
         
     | 
| 
       6 
18 
     | 
    
         | 
| 
       7 
19 
     | 
    
         
             
            ## v2.0.0.beta4 - 2022-10-24
         
     | 
    
        data/Gemfile
    CHANGED
    
    | 
         @@ -4,12 +4,11 @@ source "https://rubygems.org" 
     | 
|
| 
       4 
4 
     | 
    
         
             
            gemspec
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
            unless ENV["CI"]
         
     | 
| 
       7 
     | 
    
         
            -
              gem "byebug",  
     | 
| 
       8 
     | 
    
         
            -
              gem "yard" 
     | 
| 
      
 7 
     | 
    
         
            +
              gem "byebug", platforms: :mri
         
     | 
| 
      
 8 
     | 
    
         
            +
              gem "yard"
         
     | 
| 
      
 9 
     | 
    
         
            +
              gem "yard-junk"
         
     | 
| 
       9 
10 
     | 
    
         
             
            end
         
     | 
| 
       10 
11 
     | 
    
         | 
| 
       11 
     | 
    
         
            -
            gem "dry-system", "~> 1.0.0.rc1"
         
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
12 
     | 
    
         
             
            gem "hanami", github: "hanami/hanami", branch: "main"
         
     | 
| 
       14 
13 
     | 
    
         
             
            gem "hanami-utils", github: "hanami/utils", branch: "main"
         
     | 
| 
       15 
14 
     | 
    
         
             
            gem "hanami-router", github: "hanami/router", branch: "main"
         
     | 
    
        data/exe/hanami
    CHANGED
    
    
    
        data/hanami-cli.gemspec
    CHANGED
    
    | 
         @@ -31,10 +31,11 @@ Gem::Specification.new do |spec| 
     | 
|
| 
       31 
31 
     | 
    
         
             
              spec.required_ruby_version = ">= 3.0"
         
     | 
| 
       32 
32 
     | 
    
         | 
| 
       33 
33 
     | 
    
         
             
              spec.add_dependency "bundler", "~> 2.1"
         
     | 
| 
       34 
     | 
    
         
            -
              spec.add_dependency "rake", "~> 13.0"
         
     | 
| 
       35 
34 
     | 
    
         
             
              spec.add_dependency "dry-cli", "~> 1.0", "< 2"
         
     | 
| 
       36 
     | 
    
         
            -
              spec.add_dependency "dry-files", "~> 1.0", "< 2"
         
     | 
| 
      
 35 
     | 
    
         
            +
              spec.add_dependency "dry-files", "~> 1.0", ">= 1.0.1", "< 2"
         
     | 
| 
       37 
36 
     | 
    
         
             
              spec.add_dependency "dry-inflector", "~> 1.0", "< 2"
         
     | 
| 
      
 37 
     | 
    
         
            +
              spec.add_dependency "rake", "~> 13.0"
         
     | 
| 
      
 38 
     | 
    
         
            +
              spec.add_dependency "zeitwerk", "~> 2.6"
         
     | 
| 
       38 
39 
     | 
    
         | 
| 
       39 
40 
     | 
    
         
             
              spec.add_development_dependency "rspec", "~> 3.9"
         
     | 
| 
       40 
41 
     | 
    
         
             
              spec.add_development_dependency "rubocop", "~> 1.0"
         
     | 
    
        data/lib/hanami/cli/bundler.rb
    CHANGED
    
    | 
         @@ -5,58 +5,148 @@ require "open3" 
     | 
|
| 
       5 
5 
     | 
    
         
             
            require "etc"
         
     | 
| 
       6 
6 
     | 
    
         
             
            require "dry/files"
         
     | 
| 
       7 
7 
     | 
    
         
             
            require_relative "./system_call"
         
     | 
| 
      
 8 
     | 
    
         
            +
            require_relative "./errors"
         
     | 
| 
       8 
9 
     | 
    
         | 
| 
       9 
10 
     | 
    
         
             
            module Hanami
         
     | 
| 
       10 
11 
     | 
    
         
             
              module CLI
         
     | 
| 
      
 12 
     | 
    
         
            +
                # Conveniences for running `bundler` from CLI commands.
         
     | 
| 
      
 13 
     | 
    
         
            +
                #
         
     | 
| 
      
 14 
     | 
    
         
            +
                # @since 2.0.0
         
     | 
| 
      
 15 
     | 
    
         
            +
                # @api public
         
     | 
| 
       11 
16 
     | 
    
         
             
                class Bundler
         
     | 
| 
      
 17 
     | 
    
         
            +
                  # @since 2.0.0
         
     | 
| 
      
 18 
     | 
    
         
            +
                  # @api private
         
     | 
| 
       12 
19 
     | 
    
         
             
                  BUNDLE_GEMFILE = "BUNDLE_GEMFILE"
         
     | 
| 
       13 
20 
     | 
    
         
             
                  private_constant :BUNDLE_GEMFILE
         
     | 
| 
       14 
21 
     | 
    
         | 
| 
      
 22 
     | 
    
         
            +
                  # @since 2.0.0
         
     | 
| 
      
 23 
     | 
    
         
            +
                  # @api private
         
     | 
| 
       15 
24 
     | 
    
         
             
                  DEFAULT_GEMFILE_PATH = "Gemfile"
         
     | 
| 
       16 
25 
     | 
    
         
             
                  private_constant :DEFAULT_GEMFILE_PATH
         
     | 
| 
       17 
26 
     | 
    
         | 
| 
      
 27 
     | 
    
         
            +
                  # If a `Gemfile` exists, sets up the Bundler environment and loads all the gems from the given
         
     | 
| 
      
 28 
     | 
    
         
            +
                  # groups.
         
     | 
| 
      
 29 
     | 
    
         
            +
                  #
         
     | 
| 
      
 30 
     | 
    
         
            +
                  # This can be called multiple times with different groups.
         
     | 
| 
      
 31 
     | 
    
         
            +
                  #
         
     | 
| 
      
 32 
     | 
    
         
            +
                  # This is a convenience wrapper for `Bundler.require`.
         
     | 
| 
      
 33 
     | 
    
         
            +
                  #
         
     | 
| 
      
 34 
     | 
    
         
            +
                  # @see https://rubydoc.info/gems/bundler/Bundler#require-class_method
         
     | 
| 
      
 35 
     | 
    
         
            +
                  #
         
     | 
| 
      
 36 
     | 
    
         
            +
                  # @return [void]
         
     | 
| 
      
 37 
     | 
    
         
            +
                  #
         
     | 
| 
      
 38 
     | 
    
         
            +
                  # @since 2.0.0
         
     | 
| 
      
 39 
     | 
    
         
            +
                  # @api public
         
     | 
| 
       18 
40 
     | 
    
         
             
                  def self.require(*groups)
         
     | 
| 
       19 
41 
     | 
    
         
             
                    return unless File.exist?(ENV.fetch(BUNDLE_GEMFILE) { DEFAULT_GEMFILE_PATH })
         
     | 
| 
       20 
42 
     | 
    
         | 
| 
       21 
43 
     | 
    
         
             
                    ::Bundler.require(*groups)
         
     | 
| 
       22 
44 
     | 
    
         
             
                  end
         
     | 
| 
       23 
45 
     | 
    
         | 
| 
      
 46 
     | 
    
         
            +
                  # Returns a new bundler.
         
     | 
| 
      
 47 
     | 
    
         
            +
                  #
         
     | 
| 
      
 48 
     | 
    
         
            +
                  # @param fs [Dry::Files] the filesystem interaction object
         
     | 
| 
      
 49 
     | 
    
         
            +
                  # @param system_call [SystemCall] convenience object for making system calls
         
     | 
| 
      
 50 
     | 
    
         
            +
                  #
         
     | 
| 
      
 51 
     | 
    
         
            +
                  # @since 2.0.0
         
     | 
| 
      
 52 
     | 
    
         
            +
                  # @api public
         
     | 
| 
       24 
53 
     | 
    
         
             
                  def initialize(fs: Dry::Files.new, system_call: SystemCall.new)
         
     | 
| 
       25 
54 
     | 
    
         
             
                    @fs = fs
         
     | 
| 
       26 
55 
     | 
    
         
             
                    @system_call = system_call
         
     | 
| 
       27 
56 
     | 
    
         
             
                  end
         
     | 
| 
       28 
57 
     | 
    
         | 
| 
      
 58 
     | 
    
         
            +
                  # Runs `bundle install` for the Hanami app.
         
     | 
| 
      
 59 
     | 
    
         
            +
                  #
         
     | 
| 
      
 60 
     | 
    
         
            +
                  # @return [SystemCall::Result] the result of the `bundle` command execution
         
     | 
| 
      
 61 
     | 
    
         
            +
                  #
         
     | 
| 
      
 62 
     | 
    
         
            +
                  # @since 2.0.0
         
     | 
| 
      
 63 
     | 
    
         
            +
                  # @api public
         
     | 
| 
       29 
64 
     | 
    
         
             
                  def install
         
     | 
| 
       30 
65 
     | 
    
         
             
                    parallelism_level = Etc.nprocessors
         
     | 
| 
       31 
66 
     | 
    
         
             
                    bundle "install --jobs=#{parallelism_level} --quiet --no-color"
         
     | 
| 
       32 
67 
     | 
    
         
             
                  end
         
     | 
| 
       33 
68 
     | 
    
         | 
| 
      
 69 
     | 
    
         
            +
                  # Runs `bundle install` for the Hanami app and raises an error if the command does not execute
         
     | 
| 
      
 70 
     | 
    
         
            +
                  # successfully.
         
     | 
| 
      
 71 
     | 
    
         
            +
                  #
         
     | 
| 
      
 72 
     | 
    
         
            +
                  # @return [SystemCall::Result] the result of the `bundle` command execution
         
     | 
| 
      
 73 
     | 
    
         
            +
                  #
         
     | 
| 
      
 74 
     | 
    
         
            +
                  # @raise [StandardError] if the `bundle` command does not execute successfully
         
     | 
| 
      
 75 
     | 
    
         
            +
                  #
         
     | 
| 
      
 76 
     | 
    
         
            +
                  # @since 2.0.0
         
     | 
| 
      
 77 
     | 
    
         
            +
                  # @api public
         
     | 
| 
       34 
78 
     | 
    
         
             
                  def install!
         
     | 
| 
       35 
79 
     | 
    
         
             
                    install.tap do |result|
         
     | 
| 
       36 
     | 
    
         
            -
                      raise  
     | 
| 
      
 80 
     | 
    
         
            +
                      raise BundleInstallError.new(result.err) unless result.successful?
         
     | 
| 
       37 
81 
     | 
    
         
             
                    end
         
     | 
| 
       38 
82 
     | 
    
         
             
                  end
         
     | 
| 
       39 
83 
     | 
    
         | 
| 
      
 84 
     | 
    
         
            +
                  # Executes the given command prefixed by `bundle exec`.
         
     | 
| 
      
 85 
     | 
    
         
            +
                  #
         
     | 
| 
      
 86 
     | 
    
         
            +
                  # @return [SystemCall::Result] the result of the command execution
         
     | 
| 
      
 87 
     | 
    
         
            +
                  #
         
     | 
| 
      
 88 
     | 
    
         
            +
                  # @since 2.0.0
         
     | 
| 
      
 89 
     | 
    
         
            +
                  # @api public
         
     | 
| 
       40 
90 
     | 
    
         
             
                  def exec(cmd, env: nil, &blk)
         
     | 
| 
       41 
91 
     | 
    
         
             
                    bundle("exec #{cmd}", env: env, &blk)
         
     | 
| 
       42 
92 
     | 
    
         
             
                  end
         
     | 
| 
       43 
93 
     | 
    
         | 
| 
       44 
     | 
    
         
            -
                   
     | 
| 
      
 94 
     | 
    
         
            +
                  # Executes the given command prefixed by `bundle`.
         
     | 
| 
      
 95 
     | 
    
         
            +
                  #
         
     | 
| 
      
 96 
     | 
    
         
            +
                  # This is how you should execute all bundle subcommands.
         
     | 
| 
      
 97 
     | 
    
         
            +
                  #
         
     | 
| 
      
 98 
     | 
    
         
            +
                  # @param cmd [String] the commands to prefix with `bundle`
         
     | 
| 
      
 99 
     | 
    
         
            +
                  # @param env [Hash<String, String>] an optional hash of environment variables to set before
         
     | 
| 
      
 100 
     | 
    
         
            +
                  #   executing the command
         
     | 
| 
      
 101 
     | 
    
         
            +
                  #
         
     | 
| 
      
 102 
     | 
    
         
            +
                  # @overload bundle(cmd, env: nil)
         
     | 
| 
      
 103 
     | 
    
         
            +
                  #
         
     | 
| 
      
 104 
     | 
    
         
            +
                  # @overload bundle(cmd, env: nil, &blk)
         
     | 
| 
      
 105 
     | 
    
         
            +
                  #   Executes the command and passes the given block to the `Open3.popen3` method called
         
     | 
| 
      
 106 
     | 
    
         
            +
                  #   internally.
         
     | 
| 
      
 107 
     | 
    
         
            +
                  #
         
     | 
| 
      
 108 
     | 
    
         
            +
                  #   @example
         
     | 
| 
      
 109 
     | 
    
         
            +
                  #     bundle("info") do |stdin, stdout, stderr, wait_thread|
         
     | 
| 
      
 110 
     | 
    
         
            +
                  #       # ...
         
     | 
| 
      
 111 
     | 
    
         
            +
                  #     end
         
     | 
| 
      
 112 
     | 
    
         
            +
                  #
         
     | 
| 
      
 113 
     | 
    
         
            +
                  # @see SystemCall#call
         
     | 
| 
      
 114 
     | 
    
         
            +
                  #
         
     | 
| 
      
 115 
     | 
    
         
            +
                  # @since 2.0.0
         
     | 
| 
      
 116 
     | 
    
         
            +
                  # @api public
         
     | 
| 
      
 117 
     | 
    
         
            +
                  def bundle(cmd, env: nil, &block)
         
     | 
| 
       45 
118 
     | 
    
         
             
                    bundle_bin = which("bundle")
         
     | 
| 
       46 
119 
     | 
    
         
             
                    hanami_env = "HANAMI_ENV=#{env} " unless env.nil?
         
     | 
| 
       47 
120 
     | 
    
         | 
| 
       48 
     | 
    
         
            -
                    system_call.call( 
     | 
| 
       49 
     | 
    
         
            -
             
     | 
| 
      
 121 
     | 
    
         
            +
                    system_call.call(
         
     | 
| 
      
 122 
     | 
    
         
            +
                      "#{hanami_env}#{bundle_bin} #{cmd}",
         
     | 
| 
      
 123 
     | 
    
         
            +
                      env: {BUNDLE_GEMFILE => fs.expand_path(DEFAULT_GEMFILE_PATH)},
         
     | 
| 
      
 124 
     | 
    
         
            +
                      &block
         
     | 
| 
      
 125 
     | 
    
         
            +
                    )
         
     | 
| 
       50 
126 
     | 
    
         
             
                  end
         
     | 
| 
       51 
127 
     | 
    
         | 
| 
       52 
128 
     | 
    
         
             
                  private
         
     | 
| 
       53 
129 
     | 
    
         | 
| 
      
 130 
     | 
    
         
            +
                  # @return [Dry::Files]
         
     | 
| 
      
 131 
     | 
    
         
            +
                  #
         
     | 
| 
      
 132 
     | 
    
         
            +
                  # @since 2.0.0
         
     | 
| 
      
 133 
     | 
    
         
            +
                  # @api public
         
     | 
| 
       54 
134 
     | 
    
         
             
                  attr_reader :fs
         
     | 
| 
       55 
135 
     | 
    
         | 
| 
      
 136 
     | 
    
         
            +
                  # @return [SystemCall]
         
     | 
| 
      
 137 
     | 
    
         
            +
                  #
         
     | 
| 
      
 138 
     | 
    
         
            +
                  # @since 2.0.0
         
     | 
| 
      
 139 
     | 
    
         
            +
                  # @api public
         
     | 
| 
       56 
140 
     | 
    
         
             
                  attr_reader :system_call
         
     | 
| 
       57 
141 
     | 
    
         | 
| 
       58 
     | 
    
         
            -
                  #  
     | 
| 
      
 142 
     | 
    
         
            +
                  # Returns the full path to the given executable, or nil if not found in the path.
         
     | 
| 
      
 143 
     | 
    
         
            +
                  #
         
     | 
| 
      
 144 
     | 
    
         
            +
                  # @return [Pathname, nil]
         
     | 
| 
      
 145 
     | 
    
         
            +
                  #
         
     | 
| 
      
 146 
     | 
    
         
            +
                  # @since 2.0.0
         
     | 
| 
      
 147 
     | 
    
         
            +
                  # @api private
         
     | 
| 
       59 
148 
     | 
    
         
             
                  def which(cmd)
         
     | 
| 
      
 149 
     | 
    
         
            +
                    # Adapted from https://stackoverflow.com/a/5471032/498386
         
     | 
| 
       60 
150 
     | 
    
         
             
                    ENV["PATH"].split(File::PATH_SEPARATOR).each do |path|
         
     | 
| 
       61 
151 
     | 
    
         
             
                      exe = fs.join(path, cmd)
         
     | 
| 
       62 
152 
     | 
    
         
             
                      return exe if fs.executable?(exe) && !fs.directory?(exe)
         
     | 
    
        data/lib/hanami/cli/command.rb
    CHANGED
    
    | 
         @@ -6,7 +6,24 @@ require "dry/inflector" 
     | 
|
| 
       6 
6 
     | 
    
         | 
| 
       7 
7 
     | 
    
         
             
            module Hanami
         
     | 
| 
       8 
8 
     | 
    
         
             
              module CLI
         
     | 
| 
      
 9 
     | 
    
         
            +
                # Base class for `hanami` CLI commands.
         
     | 
| 
      
 10 
     | 
    
         
            +
                #
         
     | 
| 
      
 11 
     | 
    
         
            +
                # @api public
         
     | 
| 
      
 12 
     | 
    
         
            +
                # @since 2.0.0
         
     | 
| 
       9 
13 
     | 
    
         
             
                class Command < Dry::CLI::Command
         
     | 
| 
      
 14 
     | 
    
         
            +
                  # Returns a new command.
         
     | 
| 
      
 15 
     | 
    
         
            +
                  #
         
     | 
| 
      
 16 
     | 
    
         
            +
                  # This method does not need to be called directly when creating comments for the CLI. Commands
         
     | 
| 
      
 17 
     | 
    
         
            +
                  # are registered as classes, and the CLI framework will initialize the command when needed.
         
     | 
| 
      
 18 
     | 
    
         
            +
                  # This means that all parameters for `#initialize` should also be given default arguments.
         
     | 
| 
      
 19 
     | 
    
         
            +
                  #
         
     | 
| 
      
 20 
     | 
    
         
            +
                  # @param out [IO] I/O stream for standard command output
         
     | 
| 
      
 21 
     | 
    
         
            +
                  # @param err [IO] I/O stream for comment errror output
         
     | 
| 
      
 22 
     | 
    
         
            +
                  # @param fs [Dry::Files] object for managing file system interactions
         
     | 
| 
      
 23 
     | 
    
         
            +
                  # @param inflector [Dry::Inflector] inflector for any command-level inflections
         
     | 
| 
      
 24 
     | 
    
         
            +
                  #
         
     | 
| 
      
 25 
     | 
    
         
            +
                  # @since 2.0.0
         
     | 
| 
      
 26 
     | 
    
         
            +
                  # @api public
         
     | 
| 
       10 
27 
     | 
    
         
             
                  def initialize(out: $stdout, err: $stderr, fs: Dry::Files.new, inflector: Dry::Inflector.new)
         
     | 
| 
       11 
28 
     | 
    
         
             
                    super()
         
     | 
| 
       12 
29 
     | 
    
         
             
                    @out = out
         
     | 
| 
         @@ -17,12 +34,36 @@ module Hanami 
     | 
|
| 
       17 
34 
     | 
    
         | 
| 
       18 
35 
     | 
    
         
             
                  private
         
     | 
| 
       19 
36 
     | 
    
         | 
| 
      
 37 
     | 
    
         
            +
                  # Returns the I/O stream for standard command output.
         
     | 
| 
      
 38 
     | 
    
         
            +
                  #
         
     | 
| 
      
 39 
     | 
    
         
            +
                  # @return [IO]
         
     | 
| 
      
 40 
     | 
    
         
            +
                  #
         
     | 
| 
      
 41 
     | 
    
         
            +
                  # @since 2.0.0
         
     | 
| 
      
 42 
     | 
    
         
            +
                  # @api public
         
     | 
| 
       20 
43 
     | 
    
         
             
                  attr_reader :out
         
     | 
| 
       21 
44 
     | 
    
         | 
| 
      
 45 
     | 
    
         
            +
                  # Returns the I/O stream for command error output.
         
     | 
| 
      
 46 
     | 
    
         
            +
                  #
         
     | 
| 
      
 47 
     | 
    
         
            +
                  # @return [IO]
         
     | 
| 
      
 48 
     | 
    
         
            +
                  #
         
     | 
| 
      
 49 
     | 
    
         
            +
                  # @since 2.0.0
         
     | 
| 
      
 50 
     | 
    
         
            +
                  # @api public
         
     | 
| 
       22 
51 
     | 
    
         
             
                  attr_reader :err
         
     | 
| 
       23 
52 
     | 
    
         | 
| 
      
 53 
     | 
    
         
            +
                  # Returns the object for managing file system interactions.
         
     | 
| 
      
 54 
     | 
    
         
            +
                  #
         
     | 
| 
      
 55 
     | 
    
         
            +
                  # @return [Dry::Files]
         
     | 
| 
      
 56 
     | 
    
         
            +
                  #
         
     | 
| 
      
 57 
     | 
    
         
            +
                  # @since 2.0.0
         
     | 
| 
      
 58 
     | 
    
         
            +
                  # @api public
         
     | 
| 
       24 
59 
     | 
    
         
             
                  attr_reader :fs
         
     | 
| 
       25 
60 
     | 
    
         | 
| 
      
 61 
     | 
    
         
            +
                  # Returns the inflector.
         
     | 
| 
      
 62 
     | 
    
         
            +
                  #
         
     | 
| 
      
 63 
     | 
    
         
            +
                  # @return [Dry::Inflector]
         
     | 
| 
      
 64 
     | 
    
         
            +
                  #
         
     | 
| 
      
 65 
     | 
    
         
            +
                  # @since 2.0.0
         
     | 
| 
      
 66 
     | 
    
         
            +
                  # @api public
         
     | 
| 
       26 
67 
     | 
    
         
             
                  attr_reader :inflector
         
     | 
| 
       27 
68 
     | 
    
         
             
                end
         
     | 
| 
       28 
69 
     | 
    
         
             
              end
         
     | 
| 
         @@ -1,16 +1,33 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # frozen_string_literal: true
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            require "dry/files"
         
     | 
| 
       4 
     | 
    
         
            -
            require_relative " 
     | 
| 
      
 4 
     | 
    
         
            +
            require_relative "db/utils/database"
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
            module Hanami
         
     | 
| 
       7 
7 
     | 
    
         
             
              module CLI
         
     | 
| 
       8 
8 
     | 
    
         
             
                module Commands
         
     | 
| 
       9 
9 
     | 
    
         
             
                  module App
         
     | 
| 
      
 10 
     | 
    
         
            +
                    # Base class for `hanami` CLI commands intended to be executed within an existing Hanami
         
     | 
| 
      
 11 
     | 
    
         
            +
                    # app.
         
     | 
| 
      
 12 
     | 
    
         
            +
                    #
         
     | 
| 
      
 13 
     | 
    
         
            +
                    # @since 2.0.0
         
     | 
| 
      
 14 
     | 
    
         
            +
                    # @api public
         
     | 
| 
       10 
15 
     | 
    
         
             
                    class Command < Hanami::CLI::Command
         
     | 
| 
       11 
     | 
    
         
            -
                       
     | 
| 
      
 16 
     | 
    
         
            +
                      # @since 2.0.0
         
     | 
| 
      
 17 
     | 
    
         
            +
                      # @api private
         
     | 
| 
      
 18 
     | 
    
         
            +
                      ACTION_SEPARATOR = "." # TODO: rename to container key separator
         
     | 
| 
       12 
19 
     | 
    
         | 
| 
      
 20 
     | 
    
         
            +
                      # Overloads {Hanami::CLI::Commands::App::Command#call} to ensure an appropriate `HANAMI_ENV`
         
     | 
| 
      
 21 
     | 
    
         
            +
                      # environment variable is set.
         
     | 
| 
      
 22 
     | 
    
         
            +
                      #
         
     | 
| 
      
 23 
     | 
    
         
            +
                      # Uses an `--env` option if provided, then falls back to an already-set `HANAMI_ENV`
         
     | 
| 
      
 24 
     | 
    
         
            +
                      # environment variable, and defaults to "development" in the absence of both.
         
     | 
| 
      
 25 
     | 
    
         
            +
                      #
         
     | 
| 
      
 26 
     | 
    
         
            +
                      # @since 2.0.0
         
     | 
| 
      
 27 
     | 
    
         
            +
                      # @api private
         
     | 
| 
       13 
28 
     | 
    
         
             
                      module Environment
         
     | 
| 
      
 29 
     | 
    
         
            +
                        # @since 2.0.0
         
     | 
| 
      
 30 
     | 
    
         
            +
                        # @api private
         
     | 
| 
       14 
31 
     | 
    
         
             
                        def call(*args, **opts)
         
     | 
| 
       15 
32 
     | 
    
         
             
                          env = opts[:env]
         
     | 
| 
       16 
33 
     | 
    
         | 
| 
         @@ -22,11 +39,21 @@ module Hanami 
     | 
|
| 
       22 
39 
     | 
    
         
             
                        end
         
     | 
| 
       23 
40 
     | 
    
         
             
                      end
         
     | 
| 
       24 
41 
     | 
    
         | 
| 
      
 42 
     | 
    
         
            +
                      # @since 2.0.0
         
     | 
| 
      
 43 
     | 
    
         
            +
                      # @api private
         
     | 
| 
       25 
44 
     | 
    
         
             
                      def self.inherited(klass)
         
     | 
| 
       26 
45 
     | 
    
         
             
                        super
         
     | 
| 
       27 
46 
     | 
    
         
             
                        klass.prepend(Environment)
         
     | 
| 
       28 
47 
     | 
    
         
             
                      end
         
     | 
| 
       29 
48 
     | 
    
         | 
| 
      
 49 
     | 
    
         
            +
                      # Returns the Hanami app class.
         
     | 
| 
      
 50 
     | 
    
         
            +
                      #
         
     | 
| 
      
 51 
     | 
    
         
            +
                      # @return [Hanami::App] the Hanami app
         
     | 
| 
      
 52 
     | 
    
         
            +
                      #
         
     | 
| 
      
 53 
     | 
    
         
            +
                      # @raise [Hanami::AppLoadError] if the app has not been loaded
         
     | 
| 
      
 54 
     | 
    
         
            +
                      #
         
     | 
| 
      
 55 
     | 
    
         
            +
                      # @since 2.0.0
         
     | 
| 
      
 56 
     | 
    
         
            +
                      # @api public
         
     | 
| 
       30 
57 
     | 
    
         
             
                      def app
         
     | 
| 
       31 
58 
     | 
    
         
             
                        @app ||=
         
     | 
| 
       32 
59 
     | 
    
         
             
                          begin
         
     | 
| 
         @@ -35,6 +62,13 @@ module Hanami 
     | 
|
| 
       35 
62 
     | 
    
         
             
                          end
         
     | 
| 
       36 
63 
     | 
    
         
             
                      end
         
     | 
| 
       37 
64 
     | 
    
         | 
| 
      
 65 
     | 
    
         
            +
                      # Runs another CLI command via its command class.
         
     | 
| 
      
 66 
     | 
    
         
            +
                      #
         
     | 
| 
      
 67 
     | 
    
         
            +
                      # @param klass [Hanami::CLI::Command]
         
     | 
| 
      
 68 
     | 
    
         
            +
                      # @param args [Array] any additional arguments to pass to the command's `#call` method.
         
     | 
| 
      
 69 
     | 
    
         
            +
                      #
         
     | 
| 
      
 70 
     | 
    
         
            +
                      # @since 2.0.0
         
     | 
| 
      
 71 
     | 
    
         
            +
                      # @api public
         
     | 
| 
       38 
72 
     | 
    
         
             
                      def run_command(klass, *args)
         
     | 
| 
       39 
73 
     | 
    
         
             
                        klass.new(
         
     | 
| 
       40 
74 
     | 
    
         
             
                          out: out,
         
     | 
| 
         @@ -43,6 +77,27 @@ module Hanami 
     | 
|
| 
       43 
77 
     | 
    
         
             
                        ).call(*args)
         
     | 
| 
       44 
78 
     | 
    
         
             
                      end
         
     | 
| 
       45 
79 
     | 
    
         | 
| 
      
 80 
     | 
    
         
            +
                      # Executes a given block and prints string to the `out` stream with details of the time
         
     | 
| 
      
 81 
     | 
    
         
            +
                      # taken to execute.
         
     | 
| 
      
 82 
     | 
    
         
            +
                      #
         
     | 
| 
      
 83 
     | 
    
         
            +
                      # If the block returns a falsey value, then a failure message is printed.
         
     | 
| 
      
 84 
     | 
    
         
            +
                      #
         
     | 
| 
      
 85 
     | 
    
         
            +
                      # @example
         
     | 
| 
      
 86 
     | 
    
         
            +
                      #   measure("Reverse the polarity of the neutron flow") do
         
     | 
| 
      
 87 
     | 
    
         
            +
                      #     # reverses the polarity, returns a truthy value
         
     | 
| 
      
 88 
     | 
    
         
            +
                      #   end
         
     | 
| 
      
 89 
     | 
    
         
            +
                      #   # printed to `out`:
         
     | 
| 
      
 90 
     | 
    
         
            +
                      #   # => Reverse the polarity of the neutron flow in 2s
         
     | 
| 
      
 91 
     | 
    
         
            +
                      #
         
     | 
| 
      
 92 
     | 
    
         
            +
                      # @example
         
     | 
| 
      
 93 
     | 
    
         
            +
                      #   measure("Disable the time dilation device") do
         
     | 
| 
      
 94 
     | 
    
         
            +
                      #     # attempts to disable the device, returns a falsey favlue
         
     | 
| 
      
 95 
     | 
    
         
            +
                      #   end
         
     | 
| 
      
 96 
     | 
    
         
            +
                      #   # printed to `out`:
         
     | 
| 
      
 97 
     | 
    
         
            +
                      #   # !!! => Disable the time dilation device FAILED
         
     | 
| 
      
 98 
     | 
    
         
            +
                      #
         
     | 
| 
      
 99 
     | 
    
         
            +
                      # @since 2.0.0
         
     | 
| 
      
 100 
     | 
    
         
            +
                      # @api public
         
     | 
| 
       46 
101 
     | 
    
         
             
                      def measure(desc)
         
     | 
| 
       47 
102 
     | 
    
         
             
                        start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
         
     | 
| 
       48 
103 
     | 
    
         
             
                        result = yield
         
     | 
| 
         @@ -55,10 +110,16 @@ module Hanami 
     | 
|
| 
       55 
110 
     | 
    
         
             
                        end
         
     | 
| 
       56 
111 
     | 
    
         
             
                      end
         
     | 
| 
       57 
112 
     | 
    
         | 
| 
      
 113 
     | 
    
         
            +
                      # This is NOT AVAILABLE as of the 2.0.0 release.
         
     | 
| 
      
 114 
     | 
    
         
            +
                      #
         
     | 
| 
      
 115 
     | 
    
         
            +
                      # @api private
         
     | 
| 
       58 
116 
     | 
    
         
             
                      def database
         
     | 
| 
       59 
117 
     | 
    
         
             
                        @database ||= Commands::DB::Utils::Database[app]
         
     | 
| 
       60 
118 
     | 
    
         
             
                      end
         
     | 
| 
       61 
119 
     | 
    
         | 
| 
      
 120 
     | 
    
         
            +
                      # This is NOT AVAILABLE as of the 2.0.0 release.
         
     | 
| 
      
 121 
     | 
    
         
            +
                      #
         
     | 
| 
      
 122 
     | 
    
         
            +
                      # @api private
         
     | 
| 
       62 
123 
     | 
    
         
             
                      def database_config
         
     | 
| 
       63 
124 
     | 
    
         
             
                        database.config
         
     | 
| 
       64 
125 
     | 
    
         
             
                      end
         
     | 
| 
         @@ -8,23 +8,26 @@ module Hanami 
     | 
|
| 
       8 
8 
     | 
    
         
             
              module CLI
         
     | 
| 
       9 
9 
     | 
    
         
             
                module Commands
         
     | 
| 
       10 
10 
     | 
    
         
             
                  module App
         
     | 
| 
       11 
     | 
    
         
            -
                    # @ 
     | 
| 
      
 11 
     | 
    
         
            +
                    # @since 2.0.0
         
     | 
| 
      
 12 
     | 
    
         
            +
                    # @api private
         
     | 
| 
       12 
13 
     | 
    
         
             
                    class Console < App::Command
         
     | 
| 
      
 14 
     | 
    
         
            +
                      # @since 2.0.0
         
     | 
| 
      
 15 
     | 
    
         
            +
                      # @api private
         
     | 
| 
       13 
16 
     | 
    
         
             
                      ENGINES = {
         
     | 
| 
       14 
17 
     | 
    
         
             
                        "pry" => -> (*args) {
         
     | 
| 
       15 
18 
     | 
    
         
             
                          begin
         
     | 
| 
       16 
     | 
    
         
            -
                            require "hanami/cli/repl/pry"
         
     | 
| 
       17 
19 
     | 
    
         
             
                            Repl::Pry.new(*args)
         
     | 
| 
       18 
20 
     | 
    
         
             
                          rescue LoadError # rubocop:disable Lint/SuppressedException
         
     | 
| 
       19 
21 
     | 
    
         
             
                          end
         
     | 
| 
       20 
22 
     | 
    
         
             
                        },
         
     | 
| 
       21 
23 
     | 
    
         
             
                        "irb" => -> (*args) {
         
     | 
| 
       22 
     | 
    
         
            -
                          require "hanami/cli/repl/irb"
         
     | 
| 
       23 
24 
     | 
    
         
             
                          Repl::Irb.new(*args)
         
     | 
| 
       24 
25 
     | 
    
         
             
                        },
         
     | 
| 
       25 
26 
     | 
    
         
             
                      }.freeze
         
     | 
| 
       26 
27 
     | 
    
         
             
                      private_constant :ENGINES
         
     | 
| 
       27 
28 
     | 
    
         | 
| 
      
 29 
     | 
    
         
            +
                      # @since 2.0.0
         
     | 
| 
      
 30 
     | 
    
         
            +
                      # @api private
         
     | 
| 
       28 
31 
     | 
    
         
             
                      DEFAULT_ENGINE = "irb"
         
     | 
| 
       29 
32 
     | 
    
         
             
                      private_constant :DEFAULT_ENGINE
         
     | 
| 
       30 
33 
     | 
    
         | 
| 
         @@ -32,6 +35,7 @@ module Hanami 
     | 
|
| 
       32 
35 
     | 
    
         | 
| 
       33 
36 
     | 
    
         
             
                      option :engine, required: false, desc: "Console engine", values: ENGINES.keys
         
     | 
| 
       34 
37 
     | 
    
         | 
| 
      
 38 
     | 
    
         
            +
                      # @since 2.0.0
         
     | 
| 
       35 
39 
     | 
    
         
             
                      # @api private
         
     | 
| 
       36 
40 
     | 
    
         
             
                      def call(engine: nil, **opts)
         
     | 
| 
       37 
41 
     | 
    
         
             
                        console_engine = resolve_engine(engine, opts)
         
     | 
| 
         @@ -7,12 +7,15 @@ module Hanami 
     | 
|
| 
       7 
7 
     | 
    
         
             
              module CLI
         
     | 
| 
       8 
8 
     | 
    
         
             
                module Commands
         
     | 
| 
       9 
9 
     | 
    
         
             
                  module App
         
     | 
| 
      
 10 
     | 
    
         
            +
                    # @api private
         
     | 
| 
       10 
11 
     | 
    
         
             
                    module DB
         
     | 
| 
      
 12 
     | 
    
         
            +
                      # @api private
         
     | 
| 
       11 
13 
     | 
    
         
             
                      class CreateMigration < App::Command
         
     | 
| 
       12 
14 
     | 
    
         
             
                        desc "Create new migration file"
         
     | 
| 
       13 
15 
     | 
    
         | 
| 
       14 
16 
     | 
    
         
             
                        argument :name, desc: "Migration file name"
         
     | 
| 
       15 
17 
     | 
    
         | 
| 
      
 18 
     | 
    
         
            +
                        # @api private
         
     | 
| 
       16 
19 
     | 
    
         
             
                        def call(name:, **)
         
     | 
| 
       17 
20 
     | 
    
         
             
                          migrator = database.migrator
         
     | 
| 
       18 
21 
     | 
    
         
             
                          version = migrator.generate_version
         
     | 
| 
         @@ -8,11 +8,13 @@ module Hanami 
     | 
|
| 
       8 
8 
     | 
    
         
             
                module Commands
         
     | 
| 
       9 
9 
     | 
    
         
             
                  module App
         
     | 
| 
       10 
10 
     | 
    
         
             
                    module DB
         
     | 
| 
      
 11 
     | 
    
         
            +
                      # @api private
         
     | 
| 
       11 
12 
     | 
    
         
             
                      class Migrate < App::Command
         
     | 
| 
       12 
13 
     | 
    
         
             
                        desc "Migrates database"
         
     | 
| 
       13 
14 
     | 
    
         | 
| 
       14 
15 
     | 
    
         
             
                        option :target, desc: "Target migration number", aliases: ["-t"]
         
     | 
| 
       15 
16 
     | 
    
         | 
| 
      
 17 
     | 
    
         
            +
                        # @api private
         
     | 
| 
       16 
18 
     | 
    
         
             
                        def call(target: nil, **)
         
     | 
| 
       17 
19 
     | 
    
         
             
                          return true if Dir[File.join(app.root, "db/migrate/*.rb")].empty?
         
     | 
| 
       18 
20 
     | 
    
         | 
| 
         @@ -8,12 +8,14 @@ module Hanami 
     | 
|
| 
       8 
8 
     | 
    
         
             
                module Commands
         
     | 
| 
       9 
9 
     | 
    
         
             
                  module App
         
     | 
| 
       10 
10 
     | 
    
         
             
                    module DB
         
     | 
| 
      
 11 
     | 
    
         
            +
                      # @api private
         
     | 
| 
       11 
12 
     | 
    
         
             
                      class Rollback < App::Command
         
     | 
| 
       12 
13 
     | 
    
         
             
                        desc "Rollback database to a previous migration"
         
     | 
| 
       13 
14 
     | 
    
         | 
| 
       14 
15 
     | 
    
         
             
                        option :target, desc: "Target migration number", aliases: ["-t"]
         
     | 
| 
       15 
16 
     | 
    
         
             
                        option :dump, desc: "Dump structure after rolling back"
         
     | 
| 
       16 
17 
     | 
    
         | 
| 
      
 18 
     | 
    
         
            +
                        # @api private
         
     | 
| 
       17 
19 
     | 
    
         
             
                        def call(target: nil, dump: true, **)
         
     | 
| 
       18 
20 
     | 
    
         
             
                          migration_code, migration_name = find_migration(target)
         
     | 
| 
       19 
21 
     | 
    
         | 
| 
         @@ -8,11 +8,13 @@ module Hanami 
     | 
|
| 
       8 
8 
     | 
    
         
             
                module Commands
         
     | 
| 
       9 
9 
     | 
    
         
             
                  module App
         
     | 
| 
       10 
10 
     | 
    
         
             
                    module DB
         
     | 
| 
      
 11 
     | 
    
         
            +
                      # @api private
         
     | 
| 
       11 
12 
     | 
    
         
             
                      class SampleData < App::Command
         
     | 
| 
       12 
13 
     | 
    
         
             
                        FILE_PATH = "db/sample_data.rb"
         
     | 
| 
       13 
14 
     | 
    
         | 
| 
       14 
15 
     | 
    
         
             
                        desc "Load sample data"
         
     | 
| 
       15 
16 
     | 
    
         | 
| 
      
 17 
     | 
    
         
            +
                        # @api private
         
     | 
| 
       16 
18 
     | 
    
         
             
                        def call(**)
         
     | 
| 
       17 
19 
     | 
    
         
             
                          if has_file?
         
     | 
| 
       18 
20 
     | 
    
         
             
                            measure "sample data loaded from #{FILE_PATH}" do
         
     | 
| 
         @@ -8,11 +8,13 @@ module Hanami 
     | 
|
| 
       8 
8 
     | 
    
         
             
                module Commands
         
     | 
| 
       9 
9 
     | 
    
         
             
                  module App
         
     | 
| 
       10 
10 
     | 
    
         
             
                    module DB
         
     | 
| 
      
 11 
     | 
    
         
            +
                      # @api private
         
     | 
| 
       11 
12 
     | 
    
         
             
                      class Seed < App::Command
         
     | 
| 
       12 
13 
     | 
    
         
             
                        FILE_PATH = "db/seeds.rb"
         
     | 
| 
       13 
14 
     | 
    
         | 
| 
       14 
15 
     | 
    
         
             
                        desc "Load seed data"
         
     | 
| 
       15 
16 
     | 
    
         | 
| 
      
 17 
     | 
    
         
            +
                        # @api private
         
     | 
| 
       16 
18 
     | 
    
         
             
                        def call(**)
         
     | 
| 
       17 
19 
     | 
    
         
             
                          if has_file?
         
     | 
| 
       18 
20 
     | 
    
         
             
                            measure "seed data loaded from #{FILE_PATH}" do
         
     | 
| 
         @@ -7,10 +7,13 @@ module Hanami 
     | 
|
| 
       7 
7 
     | 
    
         
             
                module Commands
         
     | 
| 
       8 
8 
     | 
    
         
             
                  module App
         
     | 
| 
       9 
9 
     | 
    
         
             
                    module DB
         
     | 
| 
      
 10 
     | 
    
         
            +
                      # @api private
         
     | 
| 
       10 
11 
     | 
    
         
             
                      module Structure
         
     | 
| 
      
 12 
     | 
    
         
            +
                        # @api private
         
     | 
| 
       11 
13 
     | 
    
         
             
                        class Dump < App::Command
         
     | 
| 
       12 
14 
     | 
    
         
             
                          desc "Dumps database structure to db/structure.sql file"
         
     | 
| 
       13 
15 
     | 
    
         | 
| 
      
 16 
     | 
    
         
            +
                          # @api private
         
     | 
| 
       14 
17 
     | 
    
         
             
                          def call(*)
         
     | 
| 
       15 
18 
     | 
    
         
             
                            measure("#{database.name} structure dumped to db/structure.sql") do
         
     | 
| 
       16 
19 
     | 
    
         
             
                              database.dump_command
         
     |