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
|