hanami 1.3.5 → 2.0.0.alpha4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (172) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +196 -5
  3. data/FEATURES.md +1 -3
  4. data/README.md +4 -4
  5. data/hanami.gemspec +27 -30
  6. data/lib/hanami/application/autoloader/inflector_adapter.rb +22 -0
  7. data/lib/hanami/application/container/boot/inflector.rb +7 -0
  8. data/lib/hanami/application/container/boot/logger.rb +7 -0
  9. data/lib/hanami/application/container/boot/rack_logger.rb +19 -0
  10. data/lib/hanami/application/container/boot/rack_monitor.rb +12 -0
  11. data/lib/hanami/application/container/boot/routes_helper.rb +9 -0
  12. data/lib/hanami/application/container/boot/settings.rb +7 -0
  13. data/lib/hanami/application/router.rb +59 -0
  14. data/lib/hanami/application/routes.rb +55 -0
  15. data/lib/hanami/application/routes_helper.rb +34 -0
  16. data/lib/hanami/application/routing/middleware/stack.rb +89 -0
  17. data/lib/hanami/application/routing/resolver/node.rb +50 -0
  18. data/lib/hanami/application/routing/resolver/trie.rb +59 -0
  19. data/lib/hanami/application/routing/resolver.rb +87 -0
  20. data/lib/hanami/application/settings/dotenv_store.rb +60 -0
  21. data/lib/hanami/application/settings.rb +93 -0
  22. data/lib/hanami/application.rb +349 -174
  23. data/lib/hanami/assets/application_configuration.rb +63 -0
  24. data/lib/hanami/assets/configuration.rb +54 -0
  25. data/lib/hanami/boot.rb +5 -0
  26. data/lib/hanami/cli/application/cli.rb +40 -0
  27. data/lib/hanami/cli/application/command.rb +47 -0
  28. data/lib/hanami/cli/application/commands/console.rb +81 -0
  29. data/lib/hanami/cli/application/commands.rb +16 -0
  30. data/lib/hanami/cli/base_command.rb +48 -0
  31. data/lib/hanami/cli/commands/command.rb +23 -31
  32. data/lib/hanami/cli/commands/server.rb +63 -14
  33. data/lib/hanami/cli/commands.rb +5 -41
  34. data/lib/hanami/configuration/logger.rb +40 -0
  35. data/lib/hanami/configuration/middleware.rb +9 -29
  36. data/lib/hanami/configuration/null_configuration.rb +14 -0
  37. data/lib/hanami/configuration/router.rb +52 -0
  38. data/lib/hanami/configuration/sessions.rb +50 -0
  39. data/lib/hanami/configuration.rb +152 -185
  40. data/lib/hanami/init.rb +5 -0
  41. data/lib/hanami/server.rb +5 -69
  42. data/lib/hanami/setup.rb +8 -2
  43. data/lib/hanami/slice.rb +167 -0
  44. data/lib/hanami/version.rb +3 -1
  45. data/lib/hanami/web/rack_logger.rb +96 -0
  46. data/lib/hanami.rb +42 -241
  47. metadata +88 -222
  48. data/bin/hanami +0 -6
  49. data/lib/hanami/action/csrf_protection.rb +0 -211
  50. data/lib/hanami/action/routing_helpers.rb +0 -40
  51. data/lib/hanami/app.rb +0 -96
  52. data/lib/hanami/application_configuration.rb +0 -1495
  53. data/lib/hanami/application_name.rb +0 -108
  54. data/lib/hanami/application_namespace.rb +0 -14
  55. data/lib/hanami/assets/asset.rb +0 -72
  56. data/lib/hanami/assets/static.rb +0 -102
  57. data/lib/hanami/cli/commands/assets/precompile.rb +0 -42
  58. data/lib/hanami/cli/commands/assets.rb +0 -16
  59. data/lib/hanami/cli/commands/console.rb +0 -95
  60. data/lib/hanami/cli/commands/db/apply.rb +0 -32
  61. data/lib/hanami/cli/commands/db/console.rb +0 -44
  62. data/lib/hanami/cli/commands/db/create.rb +0 -32
  63. data/lib/hanami/cli/commands/db/drop.rb +0 -32
  64. data/lib/hanami/cli/commands/db/migrate.rb +0 -39
  65. data/lib/hanami/cli/commands/db/prepare.rb +0 -32
  66. data/lib/hanami/cli/commands/db/rollback.rb +0 -59
  67. data/lib/hanami/cli/commands/db/version.rb +0 -32
  68. data/lib/hanami/cli/commands/db.rb +0 -32
  69. data/lib/hanami/cli/commands/destroy/action.rb +0 -137
  70. data/lib/hanami/cli/commands/destroy/app.rb +0 -159
  71. data/lib/hanami/cli/commands/destroy/mailer.rb +0 -74
  72. data/lib/hanami/cli/commands/destroy/migration.rb +0 -51
  73. data/lib/hanami/cli/commands/destroy/model.rb +0 -84
  74. data/lib/hanami/cli/commands/destroy.rb +0 -26
  75. data/lib/hanami/cli/commands/generate/action/action.erb +0 -7
  76. data/lib/hanami/cli/commands/generate/action/action_spec.minitest.erb +0 -11
  77. data/lib/hanami/cli/commands/generate/action/action_spec.rspec.erb +0 -9
  78. data/lib/hanami/cli/commands/generate/action/action_without_view.erb +0 -7
  79. data/lib/hanami/cli/commands/generate/action/view.erb +0 -7
  80. data/lib/hanami/cli/commands/generate/action/view_spec.minitest.erb +0 -12
  81. data/lib/hanami/cli/commands/generate/action/view_spec.rspec.erb +0 -10
  82. data/lib/hanami/cli/commands/generate/action.rb +0 -321
  83. data/lib/hanami/cli/commands/generate/app/application.erb +0 -313
  84. data/lib/hanami/cli/commands/generate/app/favicon.ico +0 -0
  85. data/lib/hanami/cli/commands/generate/app/gitkeep.erb +0 -0
  86. data/lib/hanami/cli/commands/generate/app/layout.erb +0 -7
  87. data/lib/hanami/cli/commands/generate/app/layout_spec.minitest.erb +0 -10
  88. data/lib/hanami/cli/commands/generate/app/layout_spec.rspec.erb +0 -10
  89. data/lib/hanami/cli/commands/generate/app/routes.erb +0 -5
  90. data/lib/hanami/cli/commands/generate/app/template.erb.erb +0 -10
  91. data/lib/hanami/cli/commands/generate/app/template.haml.erb +0 -7
  92. data/lib/hanami/cli/commands/generate/app/template.slim.erb +0 -8
  93. data/lib/hanami/cli/commands/generate/app.rb +0 -243
  94. data/lib/hanami/cli/commands/generate/mailer/mailer.erb +0 -9
  95. data/lib/hanami/cli/commands/generate/mailer/mailer_spec.minitest.erb +0 -7
  96. data/lib/hanami/cli/commands/generate/mailer/mailer_spec.rspec.erb +0 -5
  97. data/lib/hanami/cli/commands/generate/mailer.rb +0 -104
  98. data/lib/hanami/cli/commands/generate/migration/migration.erb +0 -4
  99. data/lib/hanami/cli/commands/generate/migration.rb +0 -41
  100. data/lib/hanami/cli/commands/generate/model/entity.erb +0 -2
  101. data/lib/hanami/cli/commands/generate/model/entity_spec.minitest.erb +0 -5
  102. data/lib/hanami/cli/commands/generate/model/entity_spec.rspec.erb +0 -3
  103. data/lib/hanami/cli/commands/generate/model/migration.erb +0 -10
  104. data/lib/hanami/cli/commands/generate/model/repository.erb +0 -5
  105. data/lib/hanami/cli/commands/generate/model/repository_spec.minitest.erb +0 -5
  106. data/lib/hanami/cli/commands/generate/model/repository_spec.rspec.erb +0 -3
  107. data/lib/hanami/cli/commands/generate/model.rb +0 -125
  108. data/lib/hanami/cli/commands/generate/secret.rb +0 -48
  109. data/lib/hanami/cli/commands/generate.rb +0 -28
  110. data/lib/hanami/cli/commands/new/.env.development.erb +0 -3
  111. data/lib/hanami/cli/commands/new/.env.test.erb +0 -3
  112. data/lib/hanami/cli/commands/new/.gitkeep.erb +0 -0
  113. data/lib/hanami/cli/commands/new/Gemfile.erb +0 -57
  114. data/lib/hanami/cli/commands/new/README.md.erb +0 -33
  115. data/lib/hanami/cli/commands/new/config/boot.erb +0 -2
  116. data/lib/hanami/cli/commands/new/config/environment.erb +0 -49
  117. data/lib/hanami/cli/commands/new/config.ru.erb +0 -3
  118. data/lib/hanami/cli/commands/new/gitignore.erb +0 -4
  119. data/lib/hanami/cli/commands/new/gitignore_with_sqlite.erb +0 -5
  120. data/lib/hanami/cli/commands/new/hanamirc.erb +0 -3
  121. data/lib/hanami/cli/commands/new/lib/project.erb +0 -2
  122. data/lib/hanami/cli/commands/new/minitest/Rakefile.erb +0 -12
  123. data/lib/hanami/cli/commands/new/minitest/features_helper.erb +0 -11
  124. data/lib/hanami/cli/commands/new/minitest/spec_helper.erb +0 -7
  125. data/lib/hanami/cli/commands/new/rspec/Rakefile.erb +0 -9
  126. data/lib/hanami/cli/commands/new/rspec/capybara.erb +0 -8
  127. data/lib/hanami/cli/commands/new/rspec/features_helper.erb +0 -12
  128. data/lib/hanami/cli/commands/new/rspec/rspec.erb +0 -2
  129. data/lib/hanami/cli/commands/new/rspec/spec_helper.erb +0 -103
  130. data/lib/hanami/cli/commands/new/schema.sql.erb +0 -0
  131. data/lib/hanami/cli/commands/new.rb +0 -578
  132. data/lib/hanami/cli/commands/project.rb +0 -421
  133. data/lib/hanami/cli/commands/routes.rb +0 -21
  134. data/lib/hanami/cli/commands/templates.rb +0 -31
  135. data/lib/hanami/cli/commands/version.rb +0 -19
  136. data/lib/hanami/common_logger.rb +0 -109
  137. data/lib/hanami/components/app/assets.rb +0 -59
  138. data/lib/hanami/components/app/controller.rb +0 -74
  139. data/lib/hanami/components/app/routes.rb +0 -59
  140. data/lib/hanami/components/app/view.rb +0 -44
  141. data/lib/hanami/components/component.rb +0 -182
  142. data/lib/hanami/components/components.rb +0 -479
  143. data/lib/hanami/components/routes_inspector.rb +0 -72
  144. data/lib/hanami/components.rb +0 -156
  145. data/lib/hanami/config/cookies.rb +0 -69
  146. data/lib/hanami/config/framework_configuration.rb +0 -43
  147. data/lib/hanami/config/load_paths.rb +0 -46
  148. data/lib/hanami/config/mapper.rb +0 -47
  149. data/lib/hanami/config/routes.rb +0 -20
  150. data/lib/hanami/config/security.rb +0 -110
  151. data/lib/hanami/config/sessions.rb +0 -119
  152. data/lib/hanami/configuration/app.rb +0 -21
  153. data/lib/hanami/early_hints.rb +0 -129
  154. data/lib/hanami/env.rb +0 -69
  155. data/lib/hanami/environment.rb +0 -541
  156. data/lib/hanami/environment_application_configurations.rb +0 -37
  157. data/lib/hanami/frameworks.rb +0 -22
  158. data/lib/hanami/hanamirc.rb +0 -169
  159. data/lib/hanami/mailer/glue.rb +0 -27
  160. data/lib/hanami/middleware_stack.rb +0 -172
  161. data/lib/hanami/rake_helper.rb +0 -78
  162. data/lib/hanami/rake_tasks.rb +0 -3
  163. data/lib/hanami/rendering_policy.rb +0 -94
  164. data/lib/hanami/routes.rb +0 -219
  165. data/lib/hanami/routing/default.rb +0 -32
  166. data/lib/hanami/static.rb +0 -63
  167. data/lib/hanami/templates/default.html.erb +0 -30
  168. data/lib/hanami/templates/welcome.html.erb +0 -52
  169. data/lib/hanami/views/default.rb +0 -37
  170. data/lib/hanami/views/default_template_finder.rb +0 -22
  171. data/lib/hanami/views/null_view.rb +0 -15
  172. data/lib/hanami/welcome.rb +0 -41
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "hanami/cli"
4
+ require_relative "commands"
5
+
6
+ module Hanami
7
+ class CLI
8
+ module Application
9
+ # Hanami application CLI
10
+ class CLI < Hanami::CLI
11
+ attr_reader :application
12
+
13
+ def initialize(application: nil, commands: Commands)
14
+ super(commands)
15
+ @application = application
16
+ end
17
+
18
+ private
19
+
20
+ # TODO: we should make a prepare_command method upstream
21
+ def parse(result, out)
22
+ command, arguments = super
23
+
24
+ if command.respond_to?(:with_application)
25
+ # Set HANAMI_ENV before the application inits to ensure all aspects
26
+ # of the boot process respect the provided env
27
+ ENV["HANAMI_ENV"] = arguments[:env] if arguments[:env]
28
+
29
+ require "hanami/init"
30
+ application = Hanami.application
31
+
32
+ [command.with_application(application), arguments]
33
+ else
34
+ [command, arguments]
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../base_command"
4
+
5
+ module Hanami
6
+ class CLI
7
+ module Application
8
+ # Hanami application CLI command (intended to run inside application directory)
9
+ class Command < BaseCommand
10
+ def self.inherited(klass)
11
+ super
12
+
13
+ klass.option :env, aliases: ["-e"], default: nil, desc: "Application environment"
14
+ end
15
+
16
+ attr_reader :application
17
+
18
+ def initialize(application: nil, **opts)
19
+ super(**opts)
20
+ @application = application
21
+ end
22
+
23
+ def with_application(application)
24
+ self.class.new(
25
+ command_name: @command_name,
26
+ application: application,
27
+ out: out,
28
+ inflector: application.inflector,
29
+ files: files,
30
+ )
31
+ end
32
+
33
+ private
34
+
35
+ def run_command(klass, *args)
36
+ klass.new(
37
+ command_name: klass.name,
38
+ application: application,
39
+ out: out,
40
+ inflector: application.inflector,
41
+ files: files,
42
+ ).call(*args)
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "hanami/cli"
4
+ require "hanami/cli/application/command"
5
+ require "hanami/console/context"
6
+
7
+ module Hanami
8
+ class CLI
9
+ module Application
10
+ module Commands # rubocop:disable Style/Documentation
11
+ # Hanami application `console` CLI command
12
+ class Console < Command
13
+ REPL =
14
+ begin
15
+ require "pry"
16
+ Pry
17
+ rescue LoadError
18
+ require "irb"
19
+ IRB
20
+ end
21
+
22
+ desc "Open interactive console"
23
+
24
+ def call(**)
25
+ measure "#{prompt_prefix} booted in" do
26
+ out.puts "=> starting #{prompt_prefix} console"
27
+ application.init
28
+ end
29
+
30
+ start_repl
31
+ end
32
+
33
+ private
34
+
35
+ def start_repl
36
+ context = Hanami::Console::Context.new(application)
37
+
38
+ case REPL.name.to_sym
39
+ when :Pry
40
+ start_pry(context)
41
+ when :IRB
42
+ start_irb(context)
43
+ end
44
+ end
45
+
46
+ def start_pry(context)
47
+ # https://github.com/pry/pry/pull/1877
48
+ if Gem.loaded_specs["pry"].version >= Gem::Version.new("0.13.0")
49
+ Pry.prompt = Pry::Prompt.new(:hanami, "Hanami Console prompt.", prompt_procs)
50
+ Pry.start(context)
51
+ else
52
+ Pry.start(context, prompt_procs)
53
+ end
54
+ end
55
+
56
+ def start_irb(context)
57
+ IRB.start(context, prompt_procs)
58
+ end
59
+
60
+ def prompt_procs
61
+ [proc { default_prompt }, proc { indented_prompt }]
62
+ end
63
+
64
+ def default_prompt
65
+ "#{prompt_prefix}> "
66
+ end
67
+
68
+ def indented_prompt
69
+ "#{prompt_prefix}* "
70
+ end
71
+
72
+ def prompt_prefix
73
+ "#{inflector.underscore(application.application_name)}[#{application.config.env}]"
74
+ end
75
+ end
76
+
77
+ register "console", Console
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "hanami/cli/registry"
4
+
5
+ module Hanami
6
+ class CLI
7
+ module Application
8
+ # Hanami application CLI commands registry
9
+ module Commands
10
+ extend Hanami::CLI::Registry
11
+
12
+ require_relative "commands/console"
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dry/inflector"
4
+ require "hanami/cli/command"
5
+ require "hanami/utils/files"
6
+
7
+ module Hanami
8
+ class CLI
9
+ # Base class for Hanami application CLI commands
10
+ class BaseCommand < Hanami::CLI::Command
11
+ attr_reader :out
12
+ attr_reader :inflector
13
+ attr_reader :files
14
+
15
+ def initialize(
16
+ command_name:,
17
+ out: $stdout,
18
+ inflector: Dry::Inflector.new,
19
+ files: Hanami::Utils::Files
20
+ )
21
+ super(command_name: command_name)
22
+
23
+ @out = out
24
+ @inflector = inflector
25
+ @files = files
26
+ end
27
+
28
+ private
29
+
30
+ def run_command(klass, *args)
31
+ klass.new(
32
+ command_name: klass.name,
33
+ application: application,
34
+ out: out,
35
+ files: files,
36
+ ).call(*args)
37
+ end
38
+
39
+ def measure(desc)
40
+ start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
41
+ yield
42
+ stop = Process.clock_gettime(Process::CLOCK_MONOTONIC)
43
+
44
+ out.puts "=> #{desc} in #{(stop - start).round(1)}s"
45
+ end
46
+ end
47
+ end
48
+ end
@@ -1,12 +1,10 @@
1
- require 'hanami'
2
- require 'hanami/environment'
3
- require 'hanami/components'
4
- require 'dry/cli/command'
5
- require 'hanami/cli/commands/project'
6
- require 'hanami/cli/commands/templates'
7
- require 'concurrent'
8
- require 'hanami/utils/files'
9
- require 'erb'
1
+ # frozen_string_literal: true
2
+
3
+ require "hanami"
4
+ require "hanami/cli/command"
5
+ require "concurrent"
6
+ require "hanami/utils/files"
7
+ require "erb"
10
8
 
11
9
  module Hanami
12
10
  # Hanami CLI
@@ -72,30 +70,22 @@ module Hanami
72
70
  # @since 1.1.0
73
71
  # @api private
74
72
  def call(**options)
75
- if self.class.requirements.any?
76
- environment = Hanami::Environment.new(options)
77
- environment.require_project_environment
78
-
79
- requirements.resolved('environment', environment)
80
- requirements.resolve(self.class.requirements)
81
-
82
- options = environment.to_options.merge(options)
83
- end
84
-
85
- super(**options)
86
- rescue StandardError => e
87
- warn e.message
88
- warn e.backtrace.join("\n\t")
73
+ # FIXME: merge ENV vars (like HANAMI_ENV) into **options
74
+ super(options)
75
+ rescue StandardError => exception
76
+ warn exception.message
77
+ warn exception.backtrace.join("\n\t")
89
78
  exit(1)
90
79
  end
91
80
  end
92
81
 
93
82
  # @since 1.1.0
94
83
  # @api private
95
- def initialize(out: $stdout, files: Utils::Files)
96
- @out = out
97
- @files = files
98
- @templates = Templates.new(self.class)
84
+ def initialize(command_name:, out: $stdout, files: Utils::Files)
85
+ super(command_name: command_name)
86
+
87
+ @out = out
88
+ @files = files
99
89
  end
100
90
 
101
91
  private
@@ -107,7 +97,7 @@ module Hanami
107
97
  class Renderer
108
98
  # @since 1.1.0
109
99
  # @api private
110
- TRIM_MODE = "-".freeze
100
+ TRIM_MODE = "-"
111
101
 
112
102
  # @since 1.1.0
113
103
  # @api private
@@ -124,7 +114,7 @@ module Hanami
124
114
 
125
115
  # @since 1.1.0
126
116
  # @api private
127
- SAY_FORMATTER = "%<operation>12s %<path>s\n".freeze
117
+ SAY_FORMATTER = "%<operation>12s %<path>s\n"
128
118
 
129
119
  # @since 1.1.0
130
120
  # @api private
@@ -165,13 +155,15 @@ module Hanami
165
155
  # @since 1.1.0
166
156
  # @api private
167
157
  def project
168
- Project
158
+ # FIXME: is this still useful?
159
+ raise "it used to be implemented as Project"
169
160
  end
170
161
 
171
162
  # @since 1.1.0
172
163
  # @api private
173
164
  def requirements
174
- Hanami::Components
165
+ # FIXME: require components via the new Hanami::Container
166
+ raise "it used to be implemented as Hanami::Components"
175
167
  end
176
168
  end
177
169
  end
@@ -1,35 +1,84 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Hanami
4
+ # Hanami CLI
5
+ #
6
+ # @since 1.1.0
2
7
  class CLI
3
8
  module Commands
4
9
  # @since 1.1.0
5
10
  # @api private
6
11
  class Server < Command
7
- requires 'code_reloading'
8
-
9
12
  desc "Start Hanami server (only for development)"
10
13
 
11
- option :server, desc: "Force a server engine (eg, webrick, puma, thin, etc..)"
12
- option :host, desc: "The host address to bind to"
13
- option :port, desc: "The port to run the server on", aliases: ["-p"]
14
- option :debug, desc: "Turn on debug output"
15
- option :warn, desc: "Turn on warnings"
16
- option :daemonize, desc: "Daemonize the server"
17
- option :pid, desc: "Path to write a pid file after daemonize"
18
- option :code_reloading, desc: "Code reloading", type: :boolean, default: true
14
+ option :server, desc: "Force a server engine (eg, webrick, puma, thin, etc..)"
15
+ option :host, desc: "The host address to bind to"
16
+ option :port, desc: "The port to run the server on", aliases: ["-p"]
17
+ option :debug, desc: "Turn on debug output", type: :boolean
18
+ option :warn, desc: "Turn on warnings", type: :boolean
19
+ option :daemonize, desc: "Daemonize the server", type: :boolean
20
+ option :pid, desc: "Path to write a pid file after daemonize"
19
21
 
20
22
  example [
21
23
  " # Basic usage (it uses the bundled server engine)",
22
24
  "--server=webrick # Force `webrick` server engine",
23
25
  "--host=0.0.0.0 # Bind to a host",
24
- "--port=2306 # Bind to a port",
25
- "--no-code-reloading # Disable code reloading"
26
+ "--port=2306 # Bind to a port"
26
27
  ]
27
28
 
28
29
  # @since 1.1.0
29
30
  # @api private
30
- def call(*)
31
+ def call(**args)
32
+ require "hanami"
33
+ require "hanami/container"
31
34
  require "hanami/server"
32
- Hanami::Server.new.start
35
+
36
+ options = parse_arguments(args)
37
+ Hanami::Server.new(options).start
38
+ end
39
+
40
+ private
41
+
42
+ DEFAULT_CONFIG = "config.ru"
43
+ private_constant :DEFAULT_CONFIG
44
+
45
+ DEFAULT_HOST = "0.0.0.0"
46
+ private_constant :DEFAULT_HOST
47
+
48
+ DEFAULT_PORT = "2300"
49
+ private_constant :DEFAULT_PORT
50
+
51
+ OPTIONAL_SETTINGS = %i[
52
+ server
53
+ debug
54
+ warn
55
+ daemonize
56
+ pid
57
+ ].freeze
58
+
59
+ def parse_arguments(args)
60
+ Hanami::Container.start(:env)
61
+
62
+ {
63
+ config: DEFAULT_CONFIG,
64
+ Host: host(args),
65
+ Port: port(args),
66
+ AccessLog: []
67
+ }.merge(
68
+ args.slice(*OPTIONAL_SETTINGS)
69
+ )
70
+ end
71
+
72
+ def host(args)
73
+ args.fetch(:host) do
74
+ ENV.fetch("HANAMI_HOST", DEFAULT_HOST)
75
+ end
76
+ end
77
+
78
+ def port(args)
79
+ args.fetch(:port) do
80
+ ENV.fetch("HANAMI_PORT", DEFAULT_PORT)
81
+ end
33
82
  end
34
83
  end
35
84
  end
@@ -1,5 +1,7 @@
1
- require 'dry/cli'
2
- require 'ostruct'
1
+ # frozen_string_literal: true
2
+
3
+ require "dry/cli"
4
+ require "ostruct"
3
5
 
4
6
  module Hanami
5
7
  # Hanami CLI
@@ -23,7 +25,7 @@ module Hanami
23
25
  # module CLI
24
26
  # module Commands
25
27
  # class Generate < Hanami::CLI::Command
26
- # desc "Generate Webpack config"
28
+ # desc "Generate Webpack configuration"
27
29
  #
28
30
  # def call(*)
29
31
  # # ...
@@ -56,46 +58,8 @@ module Hanami
56
58
  module Commands
57
59
  extend Dry::CLI::Registry
58
60
 
59
- # CLI command context
60
- #
61
- # @since 1.1.0
62
- # @api private
63
- class Context < OpenStruct
64
- # @since 1.1.0
65
- # @api private
66
- def initialize(data)
67
- data = data.each_with_object({}) do |(k, v), result|
68
- v = Utils::String.new(v) if v.is_a?(::String)
69
- result[k] = v
70
- end
71
-
72
- super(data)
73
- freeze
74
- end
75
-
76
- # @since 1.1.0
77
- # @api private
78
- def with(data)
79
- self.class.new(to_h.merge(data))
80
- end
81
-
82
- # @since 1.1.0
83
- # @api private
84
- def binding
85
- super
86
- end
87
- end
88
-
89
61
  require "hanami/cli/commands/command"
90
- require "hanami/cli/commands/assets"
91
- require "hanami/cli/commands/console"
92
- require "hanami/cli/commands/db"
93
- require "hanami/cli/commands/destroy"
94
- require "hanami/cli/commands/generate"
95
- require "hanami/cli/commands/new"
96
- require "hanami/cli/commands/routes"
97
62
  require "hanami/cli/commands/server"
98
- require "hanami/cli/commands/version"
99
63
  end
100
64
  end
101
65
  end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dry/configurable"
4
+ require "hanami/logger"
5
+
6
+ module Hanami
7
+ class Configuration
8
+ # Hanami logger configuration
9
+ #
10
+ # @since 2.0.0
11
+ class Logger
12
+ include Dry::Configurable
13
+
14
+ protected :config
15
+
16
+ setting :logger_class, default: Hanami::Logger
17
+
18
+ setting :options, default: {level: :debug}
19
+
20
+ # Currently used for logging of Rack requests only.
21
+ #
22
+ # TODO: incorporate this into the standard logging some way or another
23
+ setting :filter_params, default: %w[_csrf password password_confirmation].freeze
24
+
25
+ private
26
+
27
+ def method_missing(name, *args, &block)
28
+ if config.respond_to?(name)
29
+ config.public_send(name, *args, &block)
30
+ else
31
+ super
32
+ end
33
+ end
34
+
35
+ def respond_to_missing?(name, _incude_all = false)
36
+ config.respond_to?(name) || super
37
+ end
38
+ end
39
+ end
40
+ end
@@ -1,39 +1,19 @@
1
- require "concurrent"
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Hanami
4
- # @api private
5
4
  class Configuration
6
- # Middleware configuration
7
- # @since 1.2.0
5
+ # Hanami application configured Rack middleware
6
+ #
7
+ # @since 2.0.0
8
8
  class Middleware
9
- # @api private
10
- # @since 1.2.0
11
- def initialize
12
- @middleware = Concurrent::Array.new
13
- end
9
+ attr_reader :stack
14
10
 
15
- # Use a Rack middleware
16
- #
17
- # @param middleware [#call] a Rack middleware
18
- # @param args [Array<Object>] an optional set of options
19
- # @param blk [Proc] an optional block to pass to the middleware
20
- #
21
- # @since 1.2.0
22
- #
23
- # @example
24
- # # config/environment.rb
25
- # # ...
26
- # Hanami.configure do
27
- # middleware.use MyRackMiddleware
28
- # end
29
- def use(middleware, *args, &blk)
30
- @middleware.push([middleware, args, blk])
11
+ def initialize
12
+ @stack = []
31
13
  end
32
14
 
33
- # @api private
34
- # @since 1.2.0
35
- def each(&blk)
36
- @middleware.each(&blk)
15
+ def use(middleware, *args, &block)
16
+ stack.push([middleware, *args, block].compact)
37
17
  end
38
18
  end
39
19
  end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dry/configurable"
4
+
5
+ module Hanami
6
+ class Configuration
7
+ # NullConfiguration can serve as a fallback configuration object when out-of-gem
8
+ # configuration objects are not available (specifically, when the hanami-controller or
9
+ # hanami-view gems are not loaded)
10
+ class NullConfiguration
11
+ include Dry::Configurable
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dry/configurable"
4
+ require_relative "../application/routing/resolver"
5
+
6
+ module Hanami
7
+ class Configuration
8
+ # Hanami router configuration
9
+ #
10
+ # @since 2.0.0
11
+ # @api private
12
+ class Router
13
+ include Dry::Configurable
14
+
15
+ # Base configuration is provided so router config can include the `base_url`
16
+ attr_reader :base_configuration
17
+ private :base_configuration
18
+
19
+ # @api private
20
+ # @since 2.0.0
21
+ def initialize(base_configuration)
22
+ @base_configuration = base_configuration
23
+ end
24
+
25
+ setting :routes_path, default: File.join("config", "routes")
26
+
27
+ setting :routes_class_name, default: "Routes"
28
+
29
+ setting :resolver, default: Application::Routing::Resolver
30
+
31
+ # @api private
32
+ # @since 2.0.0
33
+ def options
34
+ {base_url: base_configuration.base_url}
35
+ end
36
+
37
+ private
38
+
39
+ def method_missing(name, *args, &block)
40
+ if config.respond_to?(name)
41
+ config.public_send(name, *args, &block)
42
+ else
43
+ super
44
+ end
45
+ end
46
+
47
+ def respond_to_missing?(name, _include_all = false)
48
+ config.respond_to?(name) || super
49
+ end
50
+ end
51
+ end
52
+ end