hanami-cli 2.0.0.rc1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -1,16 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "hanami/cli/command"
|
4
|
-
require "hanami/cli/bundler"
|
5
|
-
require "hanami/cli/command_line"
|
6
|
-
require "hanami/cli/generators/gem/app"
|
7
|
-
require "hanami/cli/files"
|
8
3
|
require "dry/inflector"
|
4
|
+
require_relative "../../errors"
|
9
5
|
|
10
6
|
module Hanami
|
11
7
|
module CLI
|
12
8
|
module Commands
|
13
9
|
module Gem
|
10
|
+
# @since 2.0.0
|
11
|
+
# @api private
|
14
12
|
class New < Command
|
15
13
|
SKIP_INSTALL_DEFAULT = false
|
16
14
|
private_constant :SKIP_INSTALL_DEFAULT
|
@@ -28,25 +26,27 @@ module Hanami
|
|
28
26
|
"bookshelf --skip-install # Generate a new Hanami app, but it skips Hanami installation"
|
29
27
|
]
|
30
28
|
|
31
|
-
#
|
29
|
+
# @since 2.0.0
|
30
|
+
# @api private
|
32
31
|
def initialize(
|
33
32
|
fs: Hanami::CLI::Files.new,
|
34
33
|
inflector: Dry::Inflector.new,
|
35
34
|
bundler: CLI::Bundler.new(fs: fs),
|
36
|
-
|
37
|
-
generator: Generators::Gem::App.new(fs: fs, inflector: inflector, command_line: command_line),
|
35
|
+
generator: Generators::Gem::App.new(fs: fs, inflector: inflector),
|
38
36
|
**other
|
39
37
|
)
|
40
38
|
@bundler = bundler
|
41
|
-
@command_line = command_line
|
42
39
|
@generator = generator
|
43
40
|
super(fs: fs, inflector: inflector, **other)
|
44
41
|
end
|
45
|
-
# rubocop:enable Metrics/ParameterLists
|
46
42
|
|
43
|
+
# @since 2.0.0
|
44
|
+
# @api private
|
47
45
|
def call(app:, skip_install: SKIP_INSTALL_DEFAULT, **)
|
48
46
|
app = inflector.underscore(app)
|
49
47
|
|
48
|
+
raise PathAlreadyExistsError.new(app) if fs.exist?(app)
|
49
|
+
|
50
50
|
fs.mkdir(app)
|
51
51
|
fs.chdir(app) do
|
52
52
|
generator.call(app) do
|
@@ -65,12 +65,11 @@ module Hanami
|
|
65
65
|
private
|
66
66
|
|
67
67
|
attr_reader :bundler
|
68
|
-
attr_reader :command_line
|
69
68
|
attr_reader :generator
|
70
69
|
|
71
70
|
def run_install_commmand!
|
72
|
-
|
73
|
-
raise
|
71
|
+
bundler.exec("hanami install").tap do |result|
|
72
|
+
raise HanamiInstallError.new(result.err) unless result.successful?
|
74
73
|
end
|
75
74
|
end
|
76
75
|
end
|
@@ -1,14 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "hanami/cli/command"
|
4
|
-
|
5
3
|
module Hanami
|
6
4
|
module CLI
|
7
5
|
module Commands
|
8
6
|
module Gem
|
7
|
+
# @since 2.0.0
|
8
|
+
# @api private
|
9
9
|
class Version < Command
|
10
10
|
desc "Hanami version"
|
11
11
|
|
12
|
+
# @since 2.0.0
|
13
|
+
# @api private
|
12
14
|
def call(*)
|
13
15
|
version = detect_version
|
14
16
|
out.puts "v#{version}"
|
@@ -3,14 +3,17 @@
|
|
3
3
|
module Hanami
|
4
4
|
module CLI
|
5
5
|
module Commands
|
6
|
+
# Commands made available when the `hanami` CLI is executed outside of an Hanami app.
|
7
|
+
#
|
8
|
+
# @since 2.0.0
|
9
|
+
# @api public
|
6
10
|
module Gem
|
7
|
-
|
8
|
-
|
9
|
-
|
11
|
+
# @since 2.0.0
|
12
|
+
# @api private
|
10
13
|
def self.extended(base)
|
11
14
|
base.module_eval do
|
12
|
-
register "version", Version, aliases: ["v", "-v", "--version"]
|
13
|
-
register "new", New
|
15
|
+
register "version", Commands::Gem::Version, aliases: ["v", "-v", "--version"]
|
16
|
+
register "new", Commands::Gem::New
|
14
17
|
end
|
15
18
|
end
|
16
19
|
end
|
data/lib/hanami/cli/commands.rb
CHANGED
@@ -7,13 +7,29 @@ module Hanami
|
|
7
7
|
# This is typically used to determine whether to register commands that are applicable either
|
8
8
|
# inside or outside an app.
|
9
9
|
#
|
10
|
-
# @
|
10
|
+
# @return [Boolean]
|
11
|
+
#
|
12
|
+
# @api private
|
11
13
|
# @since 2.0.0
|
12
14
|
def self.within_hanami_app?
|
13
|
-
|
14
|
-
|
15
|
+
require "hanami"
|
16
|
+
|
17
|
+
!!Hanami.app_path
|
18
|
+
rescue LoadError => e
|
19
|
+
raise e unless e.path == "hanami"
|
20
|
+
|
21
|
+
# If for any reason the hanami gem isn't installed, make a simple best effort to determine
|
22
|
+
# whether we're inside an app.
|
23
|
+
File.exist?("config/app.rb") || File.exist?("app.rb")
|
15
24
|
end
|
16
25
|
|
26
|
+
# Contains the commands available for the current `hanami` CLI execution, depending on whether
|
27
|
+
# the CLI is executed inside or outside an Hanami app.
|
28
|
+
#
|
29
|
+
# @see .within_hanami_app?
|
30
|
+
#
|
31
|
+
# @api public
|
32
|
+
# @since 2.0.0
|
17
33
|
module Commands
|
18
34
|
end
|
19
35
|
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Hanami
|
4
|
+
module CLI
|
5
|
+
class Error < StandardError
|
6
|
+
end
|
7
|
+
|
8
|
+
class NotImplementedError < Error
|
9
|
+
end
|
10
|
+
|
11
|
+
class BundleInstallError < Error
|
12
|
+
def initialize(message)
|
13
|
+
super("`bundle install' failed\n\n\n#{message.inspect}")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class HanamiInstallError < Error
|
18
|
+
def initialize(message)
|
19
|
+
super("`hanami install' failed\n\n\n#{message.inspect}")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class PathAlreadyExistsError < Error
|
24
|
+
def initialize(path)
|
25
|
+
super("Cannot create new Hanami app in an existing path: `#{path}'")
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class MissingSliceError < Error
|
30
|
+
def initialize(slice)
|
31
|
+
super("slice `#{slice}' is missing, please generate with `hanami generate slice #{slice}'")
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class InvalidURLError < Error
|
36
|
+
def initialize(url)
|
37
|
+
super("invalid URL: `#{url}'")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
class InvalidURLPrefixError < Error
|
42
|
+
def initialize(url)
|
43
|
+
super("invalid URL prefix: `#{url}'")
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class InvalidActionNameError < Error
|
48
|
+
def initialize(name)
|
49
|
+
super("cannot parse controller and action name: `#{name}'\n\texample: `hanami generate action users.show'")
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
class UnknownHTTPMethodError < Error
|
54
|
+
def initialize(name)
|
55
|
+
super("unknown HTTP method: `#{name}'")
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
class UnsupportedDatabaseSchemeError < Error
|
60
|
+
def initialize(scheme)
|
61
|
+
super("`#{scheme}' is not a supported db scheme")
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
data/lib/hanami/cli/files.rb
CHANGED
@@ -2,12 +2,18 @@
|
|
2
2
|
|
3
3
|
module Hanami
|
4
4
|
module CLI
|
5
|
+
# @since 2.0.0
|
6
|
+
# @api private
|
5
7
|
class Files < Dry::Files
|
8
|
+
# @since 2.0.0
|
9
|
+
# @api private
|
6
10
|
def initialize(out: $stdout, **args)
|
7
11
|
super(**args)
|
8
12
|
@out = out
|
9
13
|
end
|
10
14
|
|
15
|
+
# @since 2.0.0
|
16
|
+
# @api private
|
11
17
|
def write(path, *content)
|
12
18
|
already_exists = exist?(path)
|
13
19
|
super
|
@@ -18,6 +24,8 @@ module Hanami
|
|
18
24
|
end
|
19
25
|
end
|
20
26
|
|
27
|
+
# @since 2.0.0
|
28
|
+
# @api private
|
21
29
|
def mkdir(path)
|
22
30
|
unless exist?(path)
|
23
31
|
super
|
@@ -25,6 +33,8 @@ module Hanami
|
|
25
33
|
end
|
26
34
|
end
|
27
35
|
|
36
|
+
# @since 2.0.0
|
37
|
+
# @api private
|
28
38
|
def chdir(path, &blk)
|
29
39
|
within_folder(path)
|
30
40
|
super
|
@@ -2,22 +2,27 @@
|
|
2
2
|
|
3
3
|
require "erb"
|
4
4
|
require "dry/files"
|
5
|
-
|
6
|
-
require "hanami/cli/generators/app/action_context"
|
7
|
-
require "hanami/cli/url"
|
5
|
+
require_relative "../../errors"
|
8
6
|
|
9
7
|
# rubocop:disable Metrics/ParameterLists
|
10
8
|
module Hanami
|
11
9
|
module CLI
|
12
10
|
module Generators
|
13
11
|
module App
|
12
|
+
# @since 2.0.0
|
13
|
+
# @api private
|
14
14
|
class Action
|
15
|
+
# @since 2.0.0
|
16
|
+
# @api private
|
15
17
|
def initialize(fs:, inflector:)
|
16
18
|
@fs = fs
|
17
19
|
@inflector = inflector
|
18
20
|
end
|
19
21
|
|
20
22
|
# rubocop:disable Layout/LineLength
|
23
|
+
|
24
|
+
# @since 2.0.0
|
25
|
+
# @api private
|
21
26
|
def call(app, controller, action, url, http, format, skip_view, slice, context: ActionContext.new(inflector, app, slice, controller, action))
|
22
27
|
if slice
|
23
28
|
generate_for_slice(controller, action, url, http, format, skip_view, slice, context)
|
@@ -25,6 +30,7 @@ module Hanami
|
|
25
30
|
generate_for_app(controller, action, url, http, format, skip_view, context)
|
26
31
|
end
|
27
32
|
end
|
33
|
+
|
28
34
|
# rubocop:enable Layout/LineLength
|
29
35
|
|
30
36
|
private
|
@@ -62,7 +68,7 @@ module Hanami
|
|
62
68
|
|
63
69
|
def generate_for_slice(controller, action, url, http, _format, _skip_view, slice, context)
|
64
70
|
slice_directory = fs.join("slices", slice)
|
65
|
-
raise
|
71
|
+
raise MissingSliceError.new(slice) unless fs.directory?(slice_directory)
|
66
72
|
|
67
73
|
fs.inject_line_at_block_bottom(
|
68
74
|
fs.join("config", "routes.rb"),
|
@@ -132,7 +138,7 @@ module Hanami
|
|
132
138
|
result = (http ||= ROUTE_RESTFUL_HTTP_METHODS.fetch(action, ROUTE_DEFAULT_HTTP_METHOD)).downcase
|
133
139
|
|
134
140
|
unless ROUTE_HTTP_METHODS.include?(result)
|
135
|
-
raise
|
141
|
+
raise UnknownHTTPMethodError.new(http)
|
136
142
|
end
|
137
143
|
|
138
144
|
result
|
@@ -6,50 +6,72 @@ require "dry/files/path"
|
|
6
6
|
module Hanami
|
7
7
|
module CLI
|
8
8
|
module Generators
|
9
|
+
# @since 2.0.0
|
10
|
+
# @api private
|
9
11
|
module App
|
12
|
+
# @since 2.0.0
|
13
|
+
# @api private
|
10
14
|
class ActionContext < SliceContext
|
15
|
+
# @since 2.0.0
|
16
|
+
# @api private
|
11
17
|
def initialize(inflector, app, slice, controller, action)
|
12
18
|
@controller = controller
|
13
19
|
@action = action
|
14
20
|
super(inflector, app, slice, nil)
|
15
21
|
end
|
16
22
|
|
23
|
+
# @since 2.0.0
|
24
|
+
# @api private
|
17
25
|
def camelized_controller_name
|
18
26
|
controller.map do |token|
|
19
27
|
inflector.camelize(token)
|
20
28
|
end.join(NAMESPACE_SEPARATOR)
|
21
29
|
end
|
22
30
|
|
31
|
+
# @since 2.0.0
|
32
|
+
# @api private
|
23
33
|
def camelized_action_name
|
24
34
|
inflector.camelize(action)
|
25
35
|
end
|
26
36
|
|
37
|
+
# @since 2.0.0
|
38
|
+
# @api private
|
27
39
|
def underscored_controller_name
|
28
40
|
controller.map do |token|
|
29
41
|
inflector.underscore(token)
|
30
42
|
end
|
31
43
|
end
|
32
44
|
|
45
|
+
# @since 2.0.0
|
46
|
+
# @api private
|
33
47
|
def underscored_action_name
|
34
48
|
inflector.underscore(action)
|
35
49
|
end
|
36
50
|
|
51
|
+
# @since 2.0.0
|
52
|
+
# @api private
|
37
53
|
def module_controller_declaration
|
38
54
|
controller.each_with_index.map do |token, i|
|
39
55
|
"#{OFFSET}#{INDENTATION * i}module #{inflector.camelize(token)}"
|
40
56
|
end.join($/)
|
41
57
|
end
|
42
58
|
|
59
|
+
# @since 2.0.0
|
60
|
+
# @api private
|
43
61
|
def module_controller_end
|
44
62
|
controller.each_with_index.map do |_, i|
|
45
63
|
"#{OFFSET}#{INDENTATION * i}end"
|
46
64
|
end.reverse.join($/)
|
47
65
|
end
|
48
66
|
|
67
|
+
# @since 2.0.0
|
68
|
+
# @api private
|
49
69
|
def module_controller_offset
|
50
70
|
"#{OFFSET}#{INDENTATION * controller.count}"
|
51
71
|
end
|
52
72
|
|
73
|
+
# @since 2.0.0
|
74
|
+
# @api private
|
53
75
|
def template_path
|
54
76
|
Dry::Files::Path["slices", underscored_slice_name, "templates", *underscored_controller_name,
|
55
77
|
"#{underscored_action_name}.html.erb"]
|
@@ -2,18 +2,23 @@
|
|
2
2
|
|
3
3
|
require "erb"
|
4
4
|
require "dry/files"
|
5
|
-
require "hanami/cli/generators/app/slice_context"
|
6
5
|
|
7
6
|
module Hanami
|
8
7
|
module CLI
|
9
8
|
module Generators
|
10
9
|
module App
|
10
|
+
# @since 2.0.0
|
11
|
+
# @api private
|
11
12
|
class Slice
|
13
|
+
# @since 2.0.0
|
14
|
+
# @api private
|
12
15
|
def initialize(fs:, inflector:)
|
13
16
|
@fs = fs
|
14
17
|
@inflector = inflector
|
15
18
|
end
|
16
19
|
|
20
|
+
# @since 2.0.0
|
21
|
+
# @api private
|
17
22
|
def call(app, slice, url, context: SliceContext.new(inflector, app, slice, url))
|
18
23
|
fs.inject_line_at_class_bottom(
|
19
24
|
fs.join("config", "routes.rb"), "class Routes", t("routes.erb", context).chomp
|
@@ -6,17 +6,25 @@ module Hanami
|
|
6
6
|
module CLI
|
7
7
|
module Generators
|
8
8
|
module App
|
9
|
+
# @since 2.0.0
|
10
|
+
# @api private
|
9
11
|
class SliceContext < Generators::Context
|
12
|
+
# @since 2.0.0
|
13
|
+
# @api private
|
10
14
|
def initialize(inflector, app, slice, url)
|
11
15
|
@slice = slice
|
12
16
|
@url = url
|
13
17
|
super(inflector, app)
|
14
18
|
end
|
15
19
|
|
20
|
+
# @since 2.0.0
|
21
|
+
# @api private
|
16
22
|
def camelized_slice_name
|
17
23
|
inflector.camelize(slice)
|
18
24
|
end
|
19
25
|
|
26
|
+
# @since 2.0.0
|
27
|
+
# @api private
|
20
28
|
def underscored_slice_name
|
21
29
|
inflector.underscore(slice)
|
22
30
|
end
|
@@ -4,25 +4,39 @@ require_relative "./version"
|
|
4
4
|
|
5
5
|
module Hanami
|
6
6
|
module CLI
|
7
|
+
# @since 2.0.0
|
8
|
+
# @api private
|
7
9
|
module Generators
|
10
|
+
# @since 2.0.0
|
11
|
+
# @api private
|
8
12
|
class Context
|
13
|
+
# @since 2.0.0
|
14
|
+
# @api private
|
9
15
|
def initialize(inflector, app)
|
10
16
|
@inflector = inflector
|
11
17
|
@app = app
|
12
18
|
end
|
13
19
|
|
20
|
+
# @since 2.0.0
|
21
|
+
# @api private
|
14
22
|
def ctx
|
15
23
|
binding
|
16
24
|
end
|
17
25
|
|
26
|
+
# @since 2.0.0
|
27
|
+
# @api private
|
18
28
|
def hanami_version
|
19
29
|
Version.gem_requirement
|
20
30
|
end
|
21
31
|
|
32
|
+
# @since 2.0.0
|
33
|
+
# @api private
|
22
34
|
def camelized_app_name
|
23
35
|
inflector.camelize(app)
|
24
36
|
end
|
25
37
|
|
38
|
+
# @since 2.0.0
|
39
|
+
# @api private
|
26
40
|
def underscored_app_name
|
27
41
|
inflector.underscore(app)
|
28
42
|
end
|
@@ -2,20 +2,26 @@
|
|
2
2
|
|
3
3
|
require "erb"
|
4
4
|
require "shellwords"
|
5
|
-
require "hanami/cli/generators/context"
|
6
5
|
|
7
6
|
module Hanami
|
8
7
|
module CLI
|
9
8
|
module Generators
|
9
|
+
# @since 2.0.0
|
10
|
+
# @api private
|
10
11
|
module Gem
|
12
|
+
# @since 2.0.0
|
13
|
+
# @api private
|
11
14
|
class App
|
12
|
-
|
15
|
+
# @since 2.0.0
|
16
|
+
# @api private
|
17
|
+
def initialize(fs:, inflector:)
|
13
18
|
super()
|
14
19
|
@fs = fs
|
15
20
|
@inflector = inflector
|
16
|
-
@command_line = command_line
|
17
21
|
end
|
18
22
|
|
23
|
+
# @since 2.0.0
|
24
|
+
# @api private
|
19
25
|
def call(app, context: Context.new(inflector, app), &blk)
|
20
26
|
generate_app(app, context)
|
21
27
|
blk.call
|
@@ -27,8 +33,6 @@ module Hanami
|
|
27
33
|
|
28
34
|
attr_reader :inflector
|
29
35
|
|
30
|
-
attr_reader :command_line
|
31
|
-
|
32
36
|
def generate_app(app, context) # rubocop:disable Metrics/AbcSize
|
33
37
|
fs.write(".env", t("env.erb", context))
|
34
38
|
|
@@ -3,6 +3,8 @@
|
|
3
3
|
module Hanami
|
4
4
|
module CLI
|
5
5
|
module Generators
|
6
|
+
# @since 2.0.0
|
7
|
+
# @api private
|
6
8
|
module Version
|
7
9
|
# @since 2.0.0
|
8
10
|
# @api private
|
@@ -30,22 +32,22 @@ module Hanami
|
|
30
32
|
version =~ /alpha|beta|rc/
|
31
33
|
end
|
32
34
|
|
33
|
-
# @since 2.0.0
|
34
|
-
# @api private
|
35
|
-
#
|
36
35
|
# @example
|
37
36
|
# Hanami::VERSION # => 2.0.0
|
38
37
|
# Hanami::CLI::Generators::Version.stable_version # => "2.0"
|
38
|
+
#
|
39
|
+
# @since 2.0.0
|
40
|
+
# @api private
|
39
41
|
def self.stable_version
|
40
42
|
version.scan(/\A\d{1,2}\.\d{1,2}/).first
|
41
43
|
end
|
42
44
|
|
43
|
-
# @since 2.0.0
|
44
|
-
# @api private
|
45
|
-
#
|
46
45
|
# @example
|
47
46
|
# Hanami::VERSION # => 2.0.0.alpha8.1
|
48
47
|
# Hanami::CLI::Generators::Version.stable_version # => "2.0.0.alpha"
|
48
|
+
#
|
49
|
+
# @since 2.0.0
|
50
|
+
# @api private
|
49
51
|
def self.prerelease_version
|
50
52
|
version.sub(/[[[:digit:]].]*\Z/, "")
|
51
53
|
end
|
@@ -2,12 +2,17 @@
|
|
2
2
|
|
3
3
|
module Hanami
|
4
4
|
module CLI
|
5
|
+
# @since 2.0.0
|
5
6
|
# @api private
|
6
7
|
class MiddlewareStackInspector
|
8
|
+
# @since 2.0.0
|
9
|
+
# @api private
|
7
10
|
def initialize(stack:)
|
8
11
|
@stack = stack
|
9
12
|
end
|
10
13
|
|
14
|
+
# @since 2.0.0
|
15
|
+
# @api private
|
11
16
|
def inspect(include_arguments: false)
|
12
17
|
max_path_length = @stack.map { |(path)| path.length }.max
|
13
18
|
|
data/lib/hanami/cli/repl/core.rb
CHANGED
@@ -1,50 +1,58 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "hanami/console/context"
|
4
|
+
require_relative "../errors"
|
4
5
|
|
5
6
|
module Hanami
|
6
7
|
module CLI
|
8
|
+
# @since 2.0.0
|
9
|
+
# @api private
|
7
10
|
module Repl
|
11
|
+
# @since 2.0.0
|
8
12
|
# @api private
|
9
13
|
class Core
|
10
|
-
# @api private
|
11
14
|
attr_reader :app
|
12
|
-
|
13
|
-
# @api private
|
14
15
|
attr_reader :opts
|
15
16
|
|
17
|
+
# @since 2.0.0
|
16
18
|
# @api private
|
17
19
|
def initialize(app, opts)
|
18
20
|
@app = app
|
19
21
|
@opts = opts
|
20
22
|
end
|
21
23
|
|
24
|
+
# @since 2.0.0
|
22
25
|
# @api private
|
23
26
|
def start
|
24
|
-
raise NotImplementedError
|
27
|
+
raise Hanami::CLI::NotImplementedError
|
25
28
|
end
|
26
29
|
|
30
|
+
# @since 2.0.0
|
27
31
|
# @api private
|
28
32
|
def context
|
29
33
|
@context ||= Hanami::Console::Context.new(app)
|
30
34
|
end
|
31
35
|
|
36
|
+
# @since 2.0.0
|
32
37
|
# @api private
|
33
38
|
def prompt
|
34
39
|
"#{name}[#{env}]"
|
35
40
|
end
|
36
41
|
|
42
|
+
# @since 2.0.0
|
37
43
|
# @api private
|
38
44
|
def name
|
39
45
|
(app.container.config.name || inflector.underscore(app.name))
|
40
46
|
.to_s.split("/")[0]
|
41
47
|
end
|
42
48
|
|
49
|
+
# @since 2.0.0
|
43
50
|
# @api private
|
44
51
|
def env
|
45
52
|
app.container.env
|
46
53
|
end
|
47
54
|
|
55
|
+
# @since 2.0.0
|
48
56
|
# @api private
|
49
57
|
def inflector
|
50
58
|
app.inflector
|
data/lib/hanami/cli/repl/irb.rb
CHANGED
data/lib/hanami/cli/repl/pry.rb
CHANGED