hanami-cli 2.0.0.beta1 → 2.0.0.beta2

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 (32) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +4 -1
  3. data/CHANGELOG.md +17 -2
  4. data/Gemfile +1 -0
  5. data/lib/hanami/cli/commands/app/command.rb +0 -1
  6. data/lib/hanami/cli/commands/app/console.rb +1 -0
  7. data/lib/hanami/cli/commands/app/generate/action.rb +9 -9
  8. data/lib/hanami/cli/commands/app/middlewares.rb +47 -0
  9. data/lib/hanami/cli/commands/app.rb +9 -11
  10. data/lib/hanami/cli/commands.rb +12 -3
  11. data/lib/hanami/cli/generators/app/action/action.erb +5 -5
  12. data/lib/hanami/cli/generators/app/action/slice_action.erb +13 -0
  13. data/lib/hanami/cli/generators/app/action.rb +42 -25
  14. data/lib/hanami/cli/generators/app/action_context.rb +2 -2
  15. data/lib/hanami/cli/generators/app/slice/action.erb +0 -2
  16. data/lib/hanami/cli/generators/app/slice/routes.erb +3 -2
  17. data/lib/hanami/cli/generators/app/slice/slice.erb +6 -0
  18. data/lib/hanami/cli/generators/app/slice.rb +11 -10
  19. data/lib/hanami/cli/generators/gem/app/gemfile.erb +8 -3
  20. data/lib/hanami/cli/generators/gem/app/routes.erb +0 -2
  21. data/lib/hanami/cli/generators/gem/app/settings.erb +3 -1
  22. data/lib/hanami/cli/generators/gem/app/types.erb +3 -2
  23. data/lib/hanami/cli/middleware_stack_inspector.rb +41 -0
  24. data/lib/hanami/cli/version.rb +1 -1
  25. metadata +7 -10
  26. data/lib/hanami/cli/generators/gem/app/operation.erb +0 -9
  27. data/lib/hanami/cli/generators/gem/app/relation.erb +0 -7
  28. data/lib/hanami/cli/generators/gem/app/repository.erb +0 -9
  29. data/lib/hanami/cli/generators/gem/app/transformations.erb +0 -13
  30. data/lib/hanami/cli/generators/gem/app/view.erb +0 -9
  31. data/lib/hanami/cli/generators/gem/app/view_context.erb +0 -10
  32. data/lib/hanami/cli/generators/gem/app/view_part.erb +0 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8d2d0f04510c5ac3d7c729c2830997ec692f9d9be7161b199cf87fcfd1284cf3
4
- data.tar.gz: 970de26f0dfdaba799141c24b72ea84ab94721d378f62c3bbbfe494e9a63c3bd
3
+ metadata.gz: 511daafabba67025eb83dd27f06c62a9809ab89c8901445e5c00f15bbf8fd8ca
4
+ data.tar.gz: 7d303b0c72fb47c2cf0ba107af0e6899d83b14b580565f4b30c43f4bc87ab4f9
5
5
  SHA512:
6
- metadata.gz: 5dab4fa87022146327320394b66cdd8efb18ca9c2f98eb743bc65f38017a5904a0f06db3d45aca5990e51fac27868f0e9c026feab80639bf97791353670a219b
7
- data.tar.gz: 594c4c1f6fa03910543700dbcfa0ff16f5be462cc4f39b19c9918d66de3b071beeb9e8b187ae39d3f55285296126d1378a188cd87b08d575d00d9ef1a0b21ffd
6
+ metadata.gz: 716e634d4c572a09cd9954484d9dafc6affaafc13d03ec1e79703436b3efd305d1823dc4d35e92207b5388ebc33aef9f9ba603089cf73b3aec904957fe760bd6
7
+ data.tar.gz: e7d545d1cd6bfabcc5b4305b755c319c06a4e688e74a4639765c8f0026aac6b039d3459d670014a096ebd726b4a3192f694e273285341698b52a02b0762ae4a4
data/.rubocop.yml CHANGED
@@ -7,9 +7,10 @@ inherit_from:
7
7
  Layout/LineLength:
8
8
  Exclude:
9
9
  - Gemfile
10
+ - 'spec/**/*.rb'
10
11
  Lint/EmptyFile:
11
12
  Exclude:
12
- - "spec/fixtures/**/*.rb"
13
+ - 'spec/fixtures/**/*.rb'
13
14
  Naming/HeredocDelimiterNaming:
14
15
  Enabled: false
15
16
  Naming/MethodParameterName:
@@ -29,3 +30,5 @@ Style/TrailingCommaInArrayLiteral:
29
30
  Enabled: false
30
31
  Style/TrailingCommaInHashLiteral:
31
32
  Enabled: false
33
+ Style/StringConcatenation:
34
+ Enabled: false
data/CHANGELOG.md CHANGED
@@ -2,14 +2,29 @@
2
2
 
3
3
  Hanami Command Line Interface
4
4
 
5
+ ## v2.0.0.beta2 - 2022-08-16
6
+
7
+ ### Added
8
+
9
+ - [Luca Guidi] Added `hanami generate slice` command, for generating a new slice [#32]
10
+ - [Luca Guidi] Added `hanami generate action` command, for generating a new action in the app or a slice [#33]
11
+ - [Marc Busqué] Added `hanami middlewares` command, for listing middleware configed in app and/or in `config/routes.rb` [#30]
12
+
13
+ ### Changed
14
+
15
+ - [Marc Busqué, Tim Riley] `hanami` command will detect the app even when called inside nested subdirectories [#34]
16
+ - [Seb Wilgosz] Include hanami-validations in generated app’s `Gemfile`, allowing action classes to specify `.params` [#31]
17
+ - [Tim Riley] Include dry-types in generated app’s `Gemfile`, which is used by the types module defined in `lib/[app_name]/types.rb` (dry-types is no longer a hard dependency of the hanami gem as of 2.0.0.beta2) [#29]
18
+ - [Tim Riley] Include dotenv in generated app’s `Gemfile`, allowing `ENV` values to be loaded from `.env*` files [#29]
19
+
5
20
  ## v2.0.0.beta1 - 2022-07-20
6
21
 
7
22
  ### Added
8
23
 
9
24
  - [Luca Guidi] Implemented `hanami new` to generate a new Hanami app
10
25
  - [Piotr Solnica] Implemented `hanami console` to start an interactive console (REPL)
11
- - [Marc Busque] Implemented `hanami server` to start a HTTP server based on Rack
12
- - [Marc Busque] Implemented `hanami routes` to print app routes
26
+ - [Marc Busqué] Implemented `hanami server` to start a HTTP server based on Rack
27
+ - [Marc Busqué] Implemented `hanami routes` to print app routes
13
28
  - [Luca Guidi] Implemented `hanami version` to print app Hanami version
14
29
 
15
30
  ## v2.0.0.alpha8.1 - 2022-05-23
data/Gemfile CHANGED
@@ -8,6 +8,7 @@ unless ENV["CI"]
8
8
  gem "yard", require: false
9
9
  end
10
10
 
11
+ gem "dry-files", require: false, github: "dry-rb/dry-files", branch: :main
11
12
  gem "hanami", require: false, github: "hanami/hanami", branch: :main
12
13
  gem "hanami-router", github: "hanami/router", branch: :main
13
14
 
@@ -22,7 +22,6 @@ module Hanami
22
22
 
23
23
  def self.inherited(klass)
24
24
  super
25
- klass.option(:env, required: false, desc: "App's environment")
26
25
  klass.prepend(Environment)
27
26
  end
28
27
 
@@ -25,6 +25,7 @@ module Hanami
25
25
 
26
26
  desc "App REPL"
27
27
 
28
+ option :env, required: false, desc: "Application environment"
28
29
  option :repl, required: false, desc: "REPL gem that should be used ('pry' or 'irb')"
29
30
 
30
31
  # @api private
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "hanami/cli/command"
3
+ require "hanami/cli/commands/app/command"
4
4
  require "hanami/cli/generators/app/action"
5
5
  require "dry/inflector"
6
6
  require "dry/files"
@@ -11,7 +11,7 @@ module Hanami
11
11
  module Commands
12
12
  module App
13
13
  module Generate
14
- class Action < Command
14
+ class Action < App::Command
15
15
  # TODO: ideally the default format should lookup
16
16
  # slice configuration (Action's `default_response_format`)
17
17
  DEFAULT_FORMAT = "html"
@@ -20,13 +20,13 @@ module Hanami
20
20
  DEFAULT_SKIP_VIEW = false
21
21
  private_constant :DEFAULT_SKIP_VIEW
22
22
 
23
- argument :slice, required: true, desc: "Slice name"
24
23
  argument :name, required: true, desc: "Action name"
25
24
  option :url, required: false, type: :string, desc: "Action URL"
26
25
  option :http, required: false, type: :string, desc: "Action HTTP method"
27
- option :format, required: false, type: :string, default: DEFAULT_FORMAT, desc: "Template format"
28
- option :skip_view, required: false, type: :boolean, default: DEFAULT_SKIP_VIEW,
29
- desc: "Skip view and template generation"
26
+ # option :format, required: false, type: :string, default: DEFAULT_FORMAT, desc: "Template format"
27
+ # option :skip_view, required: false, type: :boolean, default: DEFAULT_SKIP_VIEW,
28
+ # desc: "Skip view and template generation"
29
+ option :slice, required: false, desc: "Slice name"
30
30
 
31
31
  def initialize(fs: Dry::Files.new, inflector: Dry::Inflector.new,
32
32
  generator: Generators::App::Action.new(fs: fs, inflector: inflector), **)
@@ -35,8 +35,8 @@ module Hanami
35
35
  end
36
36
 
37
37
  # rubocop:disable Metrics/ParameterLists
38
- def call(slice:, name:, url: nil, http: nil, format: DEFAULT_FORMAT, skip_view: DEFAULT_SKIP_VIEW, **)
39
- slice = inflector.underscore(Shellwords.shellescape(slice))
38
+ def call(name:, url: nil, http: nil, format: DEFAULT_FORMAT, skip_view: DEFAULT_SKIP_VIEW, slice: nil, **)
39
+ slice = inflector.underscore(Shellwords.shellescape(slice)) if slice
40
40
  name = inflector.underscore(Shellwords.shellescape(name))
41
41
  *controller, action = name.split(ACTION_SEPARATOR)
42
42
 
@@ -44,7 +44,7 @@ module Hanami
44
44
  raise ArgumentError.new("cannot parse controller and action name: `#{name}'\n\texample: users.show")
45
45
  end
46
46
 
47
- generator.call(slice, controller, action, url, http, format, skip_view)
47
+ generator.call(app.namespace, controller, action, url, http, format, skip_view, slice)
48
48
  end
49
49
  # rubocop:enable Metrics/ParameterLists
50
50
 
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "hanami"
4
+ require "hanami/cli/middleware_stack_inspector"
5
+
6
+ module Hanami
7
+ module CLI
8
+ module Commands
9
+ module App
10
+ # List registered middlewares in the app router
11
+ #
12
+ # It outputs middlewares registered along with the paths where they
13
+ # apply:
14
+ #
15
+ # ```
16
+ # $ hanami middlewares
17
+ # / Rack::Session::Cookie
18
+ # ```
19
+ #
20
+ # Given arguments can be inspected:
21
+ #
22
+ # ```
23
+ # $ hanami middlewares --with-arguments
24
+ # / Rack::Session::Cookie args: [{:secret=>"foo"}]
25
+ # ```
26
+ class Middlewares < Hanami::CLI::Command
27
+ desc "List all the registered middlewares"
28
+
29
+ DEFAULT_WITH_ARGUMENTS = false
30
+
31
+ option :with_arguments, default: DEFAULT_WITH_ARGUMENTS, required: false,
32
+ desc: "Include inspected arguments", type: :boolean
33
+
34
+ # @api private
35
+ def call(with_arguments: DEFAULT_WITH_ARGUMENTS)
36
+ require "hanami/prepare"
37
+
38
+ if Hanami.app.router
39
+ inspector = MiddlewareStackInspector.new(stack: Hanami.app.router.middleware_stack)
40
+ out.puts inspector.inspect(include_arguments: with_arguments)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -9,7 +9,8 @@ module Hanami
9
9
  require_relative "app/console"
10
10
  require_relative "app/server"
11
11
  require_relative "app/routes"
12
- # require_relative "app/generate"
12
+ require_relative "app/generate"
13
+ require_relative "app/middlewares"
13
14
  # require_relative "app/db/create"
14
15
  # require_relative "app/db/create_migration"
15
16
  # require_relative "app/db/drop"
@@ -27,17 +28,14 @@ module Hanami
27
28
  register "version", Commands::App::Version, aliases: ["v", "-v", "--version"]
28
29
  register "install", Commands::App::Install
29
30
  register "console", Commands::App::Console, aliases: ["c"]
30
- register "server", Commands::App::Server, aliases: ["s"]
31
- register "routes", Commands::App::Routes
31
+ register "server", Commands::App::Server, aliases: ["s"]
32
+ register "routes", Commands::App::Routes
33
+ register "middlewares", Commands::App::Middlewares
32
34
 
33
- # FIXME: temporary disabled for Hanami v2.0.0.alpha2
34
- # register "install", Install
35
-
36
- # FIXME: temporary disabled for Hanami v2.0.0.alpha2
37
- # register "generate", aliases: ["g"] do |prefix|
38
- # prefix.register "slice", Generate::Slice
39
- # prefix.register "action", Generate::Action
40
- # end
35
+ register "generate", aliases: ["g"] do |prefix|
36
+ prefix.register "slice", Generate::Slice
37
+ prefix.register "action", Generate::Action
38
+ end
41
39
  end
42
40
  end
43
41
  end
@@ -1,16 +1,25 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "hanami"
4
+
3
5
  module Hanami
4
6
  module CLI
7
+ # Returns true if the CLI is being called from inside an Hanami app.
8
+ #
9
+ # This is typically used to determine whether to register commands that are applicable either
10
+ # inside or outside an app.
11
+ #
12
+ # @api public
13
+ # @since 2.0.0
5
14
  def self.within_hanami_app?
6
- File.exist?("config/app.rb") ||
7
- File.exist?("app.rb")
15
+ !!Hanami.app_path
8
16
  end
9
17
 
10
18
  module Commands
11
19
  end
12
20
 
13
- def self.register_commands!(within_hanami_app = Hanami::CLI.within_hanami_app?)
21
+ # @api private
22
+ def self.register_commands!(within_hanami_app = within_hanami_app?)
14
23
  commands = if within_hanami_app
15
24
  require_relative "commands/app"
16
25
  Commands::App
@@ -1,12 +1,12 @@
1
- # auto_register: false
2
1
  # frozen_string_literal: true
3
2
 
4
- require "<%= underscored_slice_name %>/action"
5
-
6
- module <%= classified_slice_name %>
3
+ module <%= classified_app_name %>
7
4
  module Actions
8
5
  <%= module_controller_declaration %>
9
- <%= module_controller_offset %>class <%= classified_action_name %> < <%= classified_slice_name %>::Action
6
+ <%= module_controller_offset %>class <%= classified_action_name %> < <%= classified_app_name %>::Action
7
+ <%= module_controller_offset %> def handle(*, response)
8
+ <%= module_controller_offset %> response.body = self.class.name
9
+ <%= module_controller_offset %> end
10
10
  <%= module_controller_offset %>end
11
11
  <%= module_controller_end %>
12
12
  end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module <%= classified_slice_name %>
4
+ module Actions
5
+ <%= module_controller_declaration %>
6
+ <%= module_controller_offset %>class <%= classified_action_name %> < <%= classified_slice_name %>::Action
7
+ <%= module_controller_offset %> def handle(*, response)
8
+ <%= module_controller_offset %> response.body = self.class.name
9
+ <%= module_controller_offset %> end
10
+ <%= module_controller_offset %>end
11
+ <%= module_controller_end %>
12
+ end
13
+ end
@@ -5,6 +5,7 @@ require "dry/files"
5
5
  require "hanami/cli/generators/app/action_context"
6
6
  require "hanami/cli/url"
7
7
 
8
+ # rubocop:disable Metrics/ParameterLists
8
9
  module Hanami
9
10
  module CLI
10
11
  module Generators
@@ -15,35 +16,15 @@ module Hanami
15
16
  @inflector = inflector
16
17
  end
17
18
 
18
- # rubocop:disable Metrics/AbcSize
19
- # rubocop:disable Metrics/ParameterLists
20
19
  # rubocop:disable Layout/LineLength
21
- def call(slice, controller, action, url, http, format, skip_view, context: ActionContext.new(inflector, slice, controller, action))
22
- slice_directory = fs.join("slices", slice)
23
- raise ArgumentError.new("slice not found `#{slice}'") unless fs.directory?(slice_directory)
24
-
25
- fs.inject_line_at_block_bottom(
26
- fs.join("config", "routes.rb"),
27
- slice_matcher(slice),
28
- route(controller, action, url, http)
29
- )
30
-
31
- fs.chdir(slice_directory) do
32
- fs.mkdir(directory = fs.join("actions", controller))
33
- fs.write(fs.join(directory, "#{action}.rb"), t("action.erb", context))
34
-
35
- unless skip_view
36
- fs.mkdir(directory = fs.join("views", controller))
37
- fs.write(fs.join(directory, "#{action}.rb"), t("view.erb", context))
38
-
39
- fs.mkdir(directory = fs.join("templates", controller))
40
- fs.write(fs.join(directory, "#{action}.#{format}.erb"), t(template_format(format), context))
41
- end
20
+ def call(app, controller, action, url, http, format, skip_view, slice, context: ActionContext.new(inflector, app, slice, controller, action))
21
+ if slice
22
+ generate_for_slice(controller, action, url, http, format, skip_view, slice, context)
23
+ else
24
+ generate_for_app(controller, action, url, http, format, skip_view, context)
42
25
  end
43
26
  end
44
27
  # rubocop:enable Layout/LineLength
45
- # rubocop:enable Metrics/ParameterLists
46
- # rubocop:enable Metrics/AbcSize
47
28
 
48
29
  private
49
30
 
@@ -75,6 +56,41 @@ module Hanami
75
56
 
76
57
  attr_reader :inflector
77
58
 
59
+ def generate_for_slice(controller, action, url, http, _format, _skip_view, slice, context)
60
+ slice_directory = fs.join("slices", slice)
61
+ raise ArgumentError.new("slice not found `#{slice}'") unless fs.directory?(slice_directory)
62
+
63
+ fs.inject_line_at_block_bottom(
64
+ fs.join("config", "routes.rb"),
65
+ slice_matcher(slice),
66
+ route(controller, action, url, http)
67
+ )
68
+
69
+ fs.chdir(slice_directory) do
70
+ fs.mkdir(directory = fs.join("actions", controller))
71
+ fs.write(fs.join(directory, "#{action}.rb"), t("slice_action.erb", context))
72
+
73
+ # unless skip_view
74
+ # fs.mkdir(directory = fs.join("views", controller))
75
+ # fs.write(fs.join(directory, "#{action}.rb"), t("view.erb", context))
76
+ #
77
+ # fs.mkdir(directory = fs.join("templates", controller))
78
+ # fs.write(fs.join(directory, "#{action}.#{format}.erb"), t(template_format(format), context))
79
+ # end
80
+ end
81
+ end
82
+
83
+ def generate_for_app(controller, action, url, http, _format, _skip_view, context)
84
+ fs.inject_line_at_block_bottom(
85
+ fs.join("config", "routes.rb"),
86
+ /define/,
87
+ route(controller, action, url, http)
88
+ )
89
+
90
+ fs.mkdir(directory = fs.join("app", "actions", controller))
91
+ fs.write(fs.join(directory, "#{action}.rb"), t("action.erb", context))
92
+ end
93
+
78
94
  def slice_matcher(slice)
79
95
  /slice[[:space:]]*:#{slice}/
80
96
  end
@@ -121,3 +137,4 @@ module Hanami
121
137
  end
122
138
  end
123
139
  end
140
+ # rubocop:enable Metrics/ParameterLists
@@ -8,10 +8,10 @@ module Hanami
8
8
  module Generators
9
9
  module App
10
10
  class ActionContext < SliceContext
11
- def initialize(inflector, slice, controller, action)
11
+ def initialize(inflector, app, slice, controller, action)
12
12
  @controller = controller
13
13
  @action = action
14
- super(inflector, nil, slice, nil)
14
+ super(inflector, app, slice, nil)
15
15
  end
16
16
 
17
17
  def classified_controller_name
@@ -1,8 +1,6 @@
1
1
  # auto_register: false
2
2
  # frozen_string_literal: true
3
3
 
4
- require "<%= underscored_app_name %>/action"
5
-
6
4
  module <%= classified_slice_name %>
7
5
  class Action < <%= classified_app_name %>::Action
8
6
  end
@@ -1,2 +1,3 @@
1
- slice :<%= underscored_slice_name %>, at: "<%= slice_url_prefix %>" do
2
- end
1
+
2
+ slice :<%= underscored_slice_name %>, at: "<%= slice_url_prefix %>" do
3
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module <%= classified_slice_name %>
4
+ class Slice < Hanami::Slice
5
+ end
6
+ end
@@ -14,23 +14,24 @@ module Hanami
14
14
  @inflector = inflector
15
15
  end
16
16
 
17
- def call(app, slice, slice_url_prefix, context: SliceContext.new(inflector, app, slice, slice_url_prefix)) # rubocop:disable Metrics/AbcSize
18
- fs.inject_line_before_last(fs.join("config", "routes.rb"), /end/, t("routes.erb", context).chomp)
17
+ def call(app, slice, slice_url_prefix, context: SliceContext.new(inflector, app, slice, slice_url_prefix))
18
+ fs.inject_line_at_block_bottom(fs.join("config", "routes.rb"), /define/, t("routes.erb", context).chomp)
19
19
 
20
20
  fs.mkdir(directory = "slices/#{slice}")
21
21
 
22
22
  fs.chdir(directory) do
23
+ # fs.write("config/slice.rb", t("slice.erb", context))
23
24
  fs.write("action.rb", t("action.erb", context))
24
- fs.write("view.rb", t("view.erb", context))
25
- fs.write("entities.rb", t("entities.erb", context))
26
- fs.write("repository.rb", t("repository.erb", context))
25
+ # fs.write("view.rb", t("view.erb", context))
26
+ # fs.write("entities.rb", t("entities.erb", context))
27
+ # fs.write("repository.rb", t("repository.erb", context))
27
28
 
28
29
  fs.write("actions/.keep", t("keep.erb", context))
29
- fs.write("views/.keep", t("keep.erb", context))
30
- fs.write("templates/.keep", t("keep.erb", context))
31
- fs.write("templates/layouts/.keep", t("keep.erb", context))
32
- fs.write("entities/.keep", t("keep.erb", context))
33
- fs.write("repositories/.keep", t("keep.erb", context))
30
+ # fs.write("views/.keep", t("keep.erb", context))
31
+ # fs.write("templates/.keep", t("keep.erb", context))
32
+ # fs.write("templates/layouts/.keep", t("keep.erb", context))
33
+ # fs.write("entities/.keep", t("keep.erb", context))
34
+ # fs.write("repositories/.keep", t("keep.erb", context))
34
35
  end
35
36
  end
36
37
 
@@ -2,13 +2,18 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "rake"
6
-
5
+ gem "hanami", "<%= hanami_version %>"
7
6
  gem "hanami-router", "<%= hanami_version %>"
8
7
  gem "hanami-controller", "<%= hanami_version %>"
9
- gem "hanami", "<%= hanami_version %>"
8
+ gem "hanami-validations", "<%= hanami_version %>"
10
9
 
10
+ gem "dry-types"
11
11
  gem "puma"
12
+ gem "rake"
13
+
14
+ group :development, :test do
15
+ gem "dotenv"
16
+ end
12
17
 
13
18
  group :cli, :development, :test do
14
19
  gem "hanami-rspec"
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "hanami/routes"
4
-
5
3
  module <%= classified_app_name %>
6
4
  class Routes < Hanami::Routes
7
5
  define do
@@ -1,9 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "<%= underscored_app_name %>/types"
4
- require "hanami/settings"
5
4
 
6
5
  module <%= classified_app_name %>
7
6
  class Settings < Hanami::Settings
7
+ # Define your app settings here, for example:
8
+ #
9
+ # setting :my_flag, default: false, constructor: Types::Params::Bool
8
10
  end
9
11
  end
@@ -1,10 +1,11 @@
1
- # auto_register: false
2
1
  # frozen_string_literal: true
3
2
 
4
3
  require "dry/types"
5
4
 
6
5
  module <%= classified_app_name %>
6
+ Types = Dry.Types
7
+
7
8
  module Types
8
- include Dry.Types
9
+ # Define your custom types here
9
10
  end
10
11
  end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hanami
4
+ module CLI
5
+ # @api private
6
+ class MiddlewareStackInspector
7
+ def initialize(stack:)
8
+ @stack = stack
9
+ end
10
+
11
+ def inspect(include_arguments: false)
12
+ max_path_length = @stack.map { |(path)| path.length }.max
13
+
14
+ @stack.map { |path, middlewares|
15
+ middlewares.map { |(middleware, arguments)|
16
+ "#{path.ljust(max_path_length + 3)} #{format_middleware(middleware)}".tap { |line|
17
+ line << " #{format_arguments(arguments)}" if include_arguments
18
+ }
19
+ }
20
+ }.join("\n") + "\n"
21
+ end
22
+
23
+ private
24
+
25
+ def format_middleware(middleware)
26
+ case middleware
27
+ when Class
28
+ middleware.name || "(class)"
29
+ when Module
30
+ middleware.name || "(module)"
31
+ else
32
+ "#{middleware.class.name} (instance)"
33
+ end
34
+ end
35
+
36
+ def format_arguments(arguments)
37
+ "args: #{arguments.inspect}"
38
+ end
39
+ end
40
+ end
41
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Hanami
4
4
  module CLI
5
- VERSION = "2.0.0.beta1"
5
+ VERSION = "2.0.0.beta2"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hanami-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.beta1
4
+ version: 2.0.0.beta2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luca Guidi
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-07-20 00:00:00.000000000 Z
11
+ date: 2022-08-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -175,6 +175,7 @@ files:
175
175
  - lib/hanami/cli/commands/app/generate/action.rb
176
176
  - lib/hanami/cli/commands/app/generate/slice.rb
177
177
  - lib/hanami/cli/commands/app/install.rb
178
+ - lib/hanami/cli/commands/app/middlewares.rb
178
179
  - lib/hanami/cli/commands/app/routes.rb
179
180
  - lib/hanami/cli/commands/app/server.rb
180
181
  - lib/hanami/cli/commands/app/version.rb
@@ -189,6 +190,7 @@ files:
189
190
  - lib/hanami/cli/error.rb
190
191
  - lib/hanami/cli/generators/app/action.rb
191
192
  - lib/hanami/cli/generators/app/action/action.erb
193
+ - lib/hanami/cli/generators/app/action/slice_action.erb
192
194
  - lib/hanami/cli/generators/app/action/template.erb
193
195
  - lib/hanami/cli/generators/app/action/template.html.erb
194
196
  - lib/hanami/cli/generators/app/action/view.erb
@@ -199,6 +201,7 @@ files:
199
201
  - lib/hanami/cli/generators/app/slice/keep.erb
200
202
  - lib/hanami/cli/generators/app/slice/repository.erb
201
203
  - lib/hanami/cli/generators/app/slice/routes.erb
204
+ - lib/hanami/cli/generators/app/slice/slice.erb
202
205
  - lib/hanami/cli/generators/app/slice/view.erb
203
206
  - lib/hanami/cli/generators/app/slice_context.rb
204
207
  - lib/hanami/cli/generators/context.rb
@@ -209,20 +212,14 @@ files:
209
212
  - lib/hanami/cli/generators/gem/app/env.erb
210
213
  - lib/hanami/cli/generators/gem/app/gemfile.erb
211
214
  - lib/hanami/cli/generators/gem/app/keep.erb
212
- - lib/hanami/cli/generators/gem/app/operation.erb
213
215
  - lib/hanami/cli/generators/gem/app/rakefile.erb
214
216
  - lib/hanami/cli/generators/gem/app/readme.erb
215
- - lib/hanami/cli/generators/gem/app/relation.erb
216
- - lib/hanami/cli/generators/gem/app/repository.erb
217
217
  - lib/hanami/cli/generators/gem/app/routes.erb
218
218
  - lib/hanami/cli/generators/gem/app/settings.erb
219
- - lib/hanami/cli/generators/gem/app/transformations.erb
220
219
  - lib/hanami/cli/generators/gem/app/types.erb
221
220
  - lib/hanami/cli/generators/gem/app/validator.erb
222
- - lib/hanami/cli/generators/gem/app/view.erb
223
- - lib/hanami/cli/generators/gem/app/view_context.erb
224
- - lib/hanami/cli/generators/gem/app/view_part.erb
225
221
  - lib/hanami/cli/generators/version.rb
222
+ - lib/hanami/cli/middleware_stack_inspector.rb
226
223
  - lib/hanami/cli/rake_tasks.rb
227
224
  - lib/hanami/cli/repl/core.rb
228
225
  - lib/hanami/cli/repl/irb.rb
@@ -258,7 +255,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
258
255
  - !ruby/object:Gem::Version
259
256
  version: 1.3.1
260
257
  requirements: []
261
- rubygems_version: 3.3.3
258
+ rubygems_version: 3.3.7
262
259
  signing_key:
263
260
  specification_version: 4
264
261
  summary: Hanami CLI
@@ -1,9 +0,0 @@
1
- # auto_register: false
2
- # frozen_string_literal: true
3
-
4
- require "hanami/operation"
5
-
6
- module <%= classified_app_name %>
7
- class Operation < Hanami::Operation
8
- end
9
- end
@@ -1,7 +0,0 @@
1
- # auto_register: false
2
- # frozen_string_literal: true
3
-
4
- module <%= classified_app_name %>
5
- class Relation < Hanami::Relation
6
- end
7
- end
@@ -1,9 +0,0 @@
1
- # auto_register: false
2
- # frozen_string_literal: true
3
-
4
- require "hanami/repository"
5
-
6
- module <%= classified_app_name %>
7
- class Repository < Hanami::Repository
8
- end
9
- end
@@ -1,13 +0,0 @@
1
- # auto_register: false
2
- # frozen_string_literal: true
3
-
4
- require "dry/transformer"
5
-
6
- module <%= classified_app_name %>
7
- module Transformations
8
- extend Dry::Transformer::Registry
9
-
10
- import Dry::Transformer::ArrayTransformations
11
- import Dry::Transformer::HashTransformations
12
- end
13
- end
@@ -1,9 +0,0 @@
1
- # auto_register: false
2
- # frozen_string_literal: true
3
-
4
- require "hanami/view"
5
-
6
- module <%= classified_app_name %>
7
- class View < Hanami::View
8
- end
9
- end
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "hanami/view/context"
4
-
5
- module <%= classified_app_name %>
6
- module Views
7
- class Context < Hanami::View::Context
8
- end
9
- end
10
- end
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "hanami/view/part"
4
-
5
- module <%= classified_app_name %>
6
- module Views
7
- class Part < Hanami::View::Part
8
- end
9
- end
10
- end