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.
- checksums.yaml +4 -4
- data/.rubocop.yml +4 -1
- data/CHANGELOG.md +17 -2
- data/Gemfile +1 -0
- data/lib/hanami/cli/commands/app/command.rb +0 -1
- data/lib/hanami/cli/commands/app/console.rb +1 -0
- data/lib/hanami/cli/commands/app/generate/action.rb +9 -9
- data/lib/hanami/cli/commands/app/middlewares.rb +47 -0
- data/lib/hanami/cli/commands/app.rb +9 -11
- data/lib/hanami/cli/commands.rb +12 -3
- data/lib/hanami/cli/generators/app/action/action.erb +5 -5
- data/lib/hanami/cli/generators/app/action/slice_action.erb +13 -0
- data/lib/hanami/cli/generators/app/action.rb +42 -25
- data/lib/hanami/cli/generators/app/action_context.rb +2 -2
- data/lib/hanami/cli/generators/app/slice/action.erb +0 -2
- data/lib/hanami/cli/generators/app/slice/routes.erb +3 -2
- data/lib/hanami/cli/generators/app/slice/slice.erb +6 -0
- data/lib/hanami/cli/generators/app/slice.rb +11 -10
- data/lib/hanami/cli/generators/gem/app/gemfile.erb +8 -3
- data/lib/hanami/cli/generators/gem/app/routes.erb +0 -2
- data/lib/hanami/cli/generators/gem/app/settings.erb +3 -1
- data/lib/hanami/cli/generators/gem/app/types.erb +3 -2
- data/lib/hanami/cli/middleware_stack_inspector.rb +41 -0
- data/lib/hanami/cli/version.rb +1 -1
- metadata +7 -10
- data/lib/hanami/cli/generators/gem/app/operation.erb +0 -9
- data/lib/hanami/cli/generators/gem/app/relation.erb +0 -7
- data/lib/hanami/cli/generators/gem/app/repository.erb +0 -9
- data/lib/hanami/cli/generators/gem/app/transformations.erb +0 -13
- data/lib/hanami/cli/generators/gem/app/view.erb +0 -9
- data/lib/hanami/cli/generators/gem/app/view_context.erb +0 -10
- 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:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 511daafabba67025eb83dd27f06c62a9809ab89c8901445e5c00f15bbf8fd8ca
         | 
| 4 | 
            +
              data.tar.gz: 7d303b0c72fb47c2cf0ba107af0e6899d83b14b580565f4b30c43f4bc87ab4f9
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 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 | 
            -
                -  | 
| 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  | 
| 12 | 
            -
            - [Marc  | 
| 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 |  | 
| @@ -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 | 
            -
             | 
| 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( | 
| 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( | 
| 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 | 
            -
                     | 
| 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", | 
| 31 | 
            -
                        register "routes", | 
| 31 | 
            +
                        register "server", Commands::App::Server, aliases: ["s"]
         | 
| 32 | 
            +
                        register "routes", Commands::App::Routes
         | 
| 33 | 
            +
                        register "middlewares", Commands::App::Middlewares
         | 
| 32 34 |  | 
| 33 | 
            -
                         | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 36 | 
            -
                         | 
| 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
         | 
    
        data/lib/hanami/cli/commands.rb
    CHANGED
    
    | @@ -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 | 
            -
                   | 
| 7 | 
            -
                    File.exist?("app.rb")
         | 
| 15 | 
            +
                  !!Hanami.app_path
         | 
| 8 16 | 
             
                end
         | 
| 9 17 |  | 
| 10 18 | 
             
                module Commands
         | 
| 11 19 | 
             
                end
         | 
| 12 20 |  | 
| 13 | 
            -
                 | 
| 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 | 
            -
             | 
| 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 %> < <%=  | 
| 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( | 
| 22 | 
            -
                         | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 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,  | 
| 14 | 
            +
                        super(inflector, app, slice, nil)
         | 
| 15 15 | 
             
                      end
         | 
| 16 16 |  | 
| 17 17 | 
             
                      def classified_controller_name
         | 
| @@ -1,2 +1,3 @@ | |
| 1 | 
            -
             | 
| 2 | 
            -
             | 
| 1 | 
            +
             | 
| 2 | 
            +
            slice :<%= underscored_slice_name %>, at: "<%= slice_url_prefix %>" do
         | 
| 3 | 
            +
            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)) | 
| 18 | 
            -
                        fs. | 
| 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 " | 
| 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,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
         | 
| @@ -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
         | 
    
        data/lib/hanami/cli/version.rb
    CHANGED
    
    
    
        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. | 
| 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- | 
| 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. | 
| 258 | 
            +
            rubygems_version: 3.3.7
         | 
| 262 259 | 
             
            signing_key:
         | 
| 263 260 | 
             
            specification_version: 4
         | 
| 264 261 | 
             
            summary: Hanami CLI
         | 
| @@ -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
         |