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.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +2 -0
  3. data/.yardopts +3 -0
  4. data/CHANGELOG.md +12 -0
  5. data/Gemfile +3 -4
  6. data/exe/hanami +6 -1
  7. data/hanami-cli.gemspec +3 -2
  8. data/lib/hanami/cli/bundler.rb +95 -5
  9. data/lib/hanami/cli/command.rb +41 -0
  10. data/lib/hanami/cli/commands/app/command.rb +63 -2
  11. data/lib/hanami/cli/commands/app/console.rb +7 -3
  12. data/lib/hanami/cli/commands/app/db/create.rb +2 -0
  13. data/lib/hanami/cli/commands/app/db/create_migration.rb +3 -0
  14. data/lib/hanami/cli/commands/app/db/drop.rb +2 -0
  15. data/lib/hanami/cli/commands/app/db/migrate.rb +2 -0
  16. data/lib/hanami/cli/commands/app/db/reset.rb +2 -0
  17. data/lib/hanami/cli/commands/app/db/rollback.rb +2 -0
  18. data/lib/hanami/cli/commands/app/db/sample_data.rb +2 -0
  19. data/lib/hanami/cli/commands/app/db/seed.rb +2 -0
  20. data/lib/hanami/cli/commands/app/db/setup.rb +2 -0
  21. data/lib/hanami/cli/commands/app/db/structure/dump.rb +3 -0
  22. data/lib/hanami/cli/commands/app/db/utils/database.rb +155 -0
  23. data/lib/hanami/cli/commands/app/db/utils/database_config.rb +60 -0
  24. data/lib/hanami/cli/commands/app/db/utils/mysql.rb +33 -0
  25. data/lib/hanami/cli/commands/app/db/utils/postgres.rb +64 -0
  26. data/lib/hanami/cli/commands/app/db/utils/sqlite.rb +45 -0
  27. data/lib/hanami/cli/commands/app/db/version.rb +2 -0
  28. data/lib/hanami/cli/commands/app/generate/action.rb +10 -3
  29. data/lib/hanami/cli/commands/app/generate/slice.rb +9 -6
  30. data/lib/hanami/cli/commands/app/generate.rb +2 -0
  31. data/lib/hanami/cli/commands/app/install.rb +13 -2
  32. data/lib/hanami/cli/commands/app/middleware.rb +7 -1
  33. data/lib/hanami/cli/commands/app/routes.rb +8 -0
  34. data/lib/hanami/cli/commands/app/server.rb +10 -0
  35. data/lib/hanami/cli/commands/app/version.rb +4 -2
  36. data/lib/hanami/cli/commands/app.rb +6 -19
  37. data/lib/hanami/cli/commands/gem/new.rb +12 -13
  38. data/lib/hanami/cli/commands/gem/version.rb +4 -2
  39. data/lib/hanami/cli/commands/gem.rb +8 -5
  40. data/lib/hanami/cli/commands.rb +19 -3
  41. data/lib/hanami/cli/errors.rb +65 -0
  42. data/lib/hanami/cli/files.rb +10 -0
  43. data/lib/hanami/cli/generators/app/action.rb +11 -5
  44. data/lib/hanami/cli/generators/app/action_context.rb +22 -0
  45. data/lib/hanami/cli/generators/app/slice.rb +6 -1
  46. data/lib/hanami/cli/generators/app/slice_context.rb +8 -0
  47. data/lib/hanami/cli/generators/context.rb +14 -0
  48. data/lib/hanami/cli/generators/gem/app.rb +9 -5
  49. data/lib/hanami/cli/generators/version.rb +8 -6
  50. data/lib/hanami/cli/middleware_stack_inspector.rb +5 -0
  51. data/lib/hanami/cli/rake_tasks.rb +0 -1
  52. data/lib/hanami/cli/repl/core.rb +12 -4
  53. data/lib/hanami/cli/repl/irb.rb +3 -2
  54. data/lib/hanami/cli/repl/pry.rb +1 -3
  55. data/lib/hanami/cli/server.rb +11 -0
  56. data/lib/hanami/cli/system_call.rb +65 -7
  57. data/lib/hanami/cli/url.rb +9 -2
  58. data/lib/hanami/cli/version.rb +4 -1
  59. data/lib/hanami/cli.rb +26 -3
  60. data/lib/hanami/console/context.rb +4 -2
  61. data/lib/hanami/console/plugins/slice_readers.rb +1 -0
  62. data/lib/hanami-cli.rb +3 -0
  63. metadata +46 -25
  64. data/lib/hanami/cli/command_line.rb +0 -17
  65. data/lib/hanami/cli/commands/db/utils/database.rb +0 -133
  66. data/lib/hanami/cli/commands/db/utils/database_config.rb +0 -48
  67. data/lib/hanami/cli/commands/db/utils/mysql.rb +0 -27
  68. data/lib/hanami/cli/commands/db/utils/postgres.rb +0 -54
  69. data/lib/hanami/cli/commands/db/utils/sqlite.rb +0 -37
  70. data/lib/hanami/cli/error.rb +0 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e4242a606852c7a1d6973b79de436a19560975ccedaa454fe0512baaae8d0d56
4
- data.tar.gz: c84a8624b6488184eca17bcec24f4d875017593b901f4f9d05e8eaf3d5417db6
3
+ metadata.gz: a1351e33232b164c6e82ac6148e95eac2562e43dcd36f1a1d11aad61307f32da
4
+ data.tar.gz: 647213baac46e31addb957a6ce4d3f8b11e28e64ddb02d3cfe1569ce49015ed6
5
5
  SHA512:
6
- metadata.gz: 285b881fbca99506d4d6d4d3e926f595030cfa2f86b47e078a432ed5b2c9a8e59a1c3b556bfd4a019843bdfb3f34ccd8a170371cc8ab82492a402045a16fa00a
7
- data.tar.gz: 0d46f76cdb8c67263a60682ce3d216dbf57efce57a12fd0c363fe2e1cf43bc7217c7de36d604a1698e38e9e14ddbde1cc8290da2ba97d5abbb731026c3ccd823
6
+ metadata.gz: cb27cd6155cd93c1783402e32992104d32a41da98397ef57c0dc1b0b72edf0cb76c9203d48dc925c352f9742a16c274cf0679dc9e431c12d83ad69508478786d
7
+ data.tar.gz: 04cc7a076b6a66d30729ebaa28b9108cb41bd7515cd538d5a81a350b22850ff3fbefd27a0a9044130ed50bfa8dc34562ab6e32e57834924cc7c3e51a13468708
data/.rubocop.yml CHANGED
@@ -16,6 +16,8 @@ Naming/HeredocDelimiterNaming:
16
16
  Naming/MethodParameterName:
17
17
  AllowedNames:
18
18
  - fs
19
+ Naming/RescuedExceptionsVariableName:
20
+ Enabled: false
19
21
  Style/AccessorGrouping:
20
22
  Enabled: false
21
23
  Style/BlockDelimiters:
data/.yardopts ADDED
@@ -0,0 +1,3 @@
1
+ --markup=markdown
2
+
3
+ --plugin junk
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", require: false, platforms: :mri
8
- gem "yard", require: false
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
@@ -7,4 +7,9 @@ require "hanami/cli"
7
7
  cli = Dry::CLI.new(Hanami::CLI)
8
8
  Hanami::CLI::Bundler.require(:cli)
9
9
 
10
- cli.call
10
+ begin
11
+ cli.call
12
+ rescue Hanami::CLI::Error => exception
13
+ $stderr.puts(exception.message) # rubocop:disable Style/StderrPuts
14
+ exit(1)
15
+ end
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"
@@ -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 "Bundle install failed\n\n\n#{result.err.inspect}" unless result.successful?
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
- def bundle(cmd, env: nil, &blk)
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("#{hanami_env}#{bundle_bin} #{cmd}",
49
- env: {BUNDLE_GEMFILE => fs.expand_path(DEFAULT_GEMFILE_PATH)}, &blk)
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
- # Adapted from https://stackoverflow.com/a/5471032/498386
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)
@@ -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 "../db/utils/database"
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
- ACTION_SEPARATOR = "."
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
- # @api public
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,9 +7,11 @@ module Hanami
7
7
  module Commands
8
8
  module App
9
9
  module DB
10
+ # @api private
10
11
  class Create < App::Command
11
12
  desc "Create database"
12
13
 
14
+ # @api private
13
15
  def call(**)
14
16
  if database.create_command
15
17
  out.puts "=> database #{database.name} created"
@@ -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
@@ -7,9 +7,11 @@ module Hanami
7
7
  module Commands
8
8
  module App
9
9
  module DB
10
+ # @api private
10
11
  class Drop < App::Command
11
12
  desc "Delete database"
12
13
 
14
+ # @api private
13
15
  def call(**)
14
16
  if database.drop_command
15
17
  out.puts "=> database #{database.name} dropped"
@@ -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
 
@@ -10,9 +10,11 @@ module Hanami
10
10
  module Commands
11
11
  module App
12
12
  module DB
13
+ # @api private
13
14
  class Reset < App::Command
14
15
  desc "Drop, create, and migrate database"
15
16
 
17
+ # @api private
16
18
  def call(**)
17
19
  run_command Drop
18
20
  run_command Create
@@ -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
@@ -9,9 +9,11 @@ module Hanami
9
9
  module Commands
10
10
  module App
11
11
  module DB
12
+ # @api private
12
13
  class Setup < App::Command
13
14
  desc "Setup database"
14
15
 
16
+ # @api private
15
17
  def call(**)
16
18
  run_command Create
17
19
  run_command Migrate
@@ -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