hanami 1.3.5 → 2.0.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +51 -41
  3. data/FEATURES.md +2 -12
  4. data/LICENSE.md +1 -1
  5. data/README.md +5 -8
  6. data/bin/hanami +6 -4
  7. data/hanami.gemspec +24 -28
  8. data/lib/hanami/application.rb +44 -176
  9. data/lib/hanami/boot.rb +6 -0
  10. data/lib/hanami/cli/commands/command.rb +21 -29
  11. data/lib/hanami/cli/commands/server.rb +63 -14
  12. data/lib/hanami/cli/commands.rb +5 -42
  13. data/lib/hanami/configuration/cookies.rb +24 -0
  14. data/lib/hanami/configuration/middleware.rb +8 -28
  15. data/lib/hanami/configuration/security.rb +141 -0
  16. data/lib/hanami/configuration/sessions.rb +50 -0
  17. data/lib/hanami/configuration.rb +181 -191
  18. data/lib/hanami/container.rb +107 -0
  19. data/lib/hanami/frameworks.rb +24 -18
  20. data/lib/hanami/routes.rb +17 -205
  21. data/lib/hanami/server.rb +5 -69
  22. data/lib/hanami/version.rb +3 -1
  23. data/lib/hanami.rb +39 -243
  24. metadata +36 -233
  25. data/lib/hanami/action/csrf_protection.rb +0 -211
  26. data/lib/hanami/action/routing_helpers.rb +0 -40
  27. data/lib/hanami/app.rb +0 -96
  28. data/lib/hanami/application_configuration.rb +0 -1495
  29. data/lib/hanami/application_name.rb +0 -108
  30. data/lib/hanami/application_namespace.rb +0 -14
  31. data/lib/hanami/assets/asset.rb +0 -72
  32. data/lib/hanami/assets/static.rb +0 -102
  33. data/lib/hanami/cli/commands/assets/precompile.rb +0 -42
  34. data/lib/hanami/cli/commands/assets.rb +0 -16
  35. data/lib/hanami/cli/commands/console.rb +0 -95
  36. data/lib/hanami/cli/commands/db/apply.rb +0 -32
  37. data/lib/hanami/cli/commands/db/console.rb +0 -44
  38. data/lib/hanami/cli/commands/db/create.rb +0 -32
  39. data/lib/hanami/cli/commands/db/drop.rb +0 -32
  40. data/lib/hanami/cli/commands/db/migrate.rb +0 -39
  41. data/lib/hanami/cli/commands/db/prepare.rb +0 -32
  42. data/lib/hanami/cli/commands/db/rollback.rb +0 -59
  43. data/lib/hanami/cli/commands/db/version.rb +0 -32
  44. data/lib/hanami/cli/commands/db.rb +0 -32
  45. data/lib/hanami/cli/commands/destroy/action.rb +0 -137
  46. data/lib/hanami/cli/commands/destroy/app.rb +0 -159
  47. data/lib/hanami/cli/commands/destroy/mailer.rb +0 -74
  48. data/lib/hanami/cli/commands/destroy/migration.rb +0 -51
  49. data/lib/hanami/cli/commands/destroy/model.rb +0 -84
  50. data/lib/hanami/cli/commands/destroy.rb +0 -26
  51. data/lib/hanami/cli/commands/generate/action/action.erb +0 -7
  52. data/lib/hanami/cli/commands/generate/action/action_spec.minitest.erb +0 -11
  53. data/lib/hanami/cli/commands/generate/action/action_spec.rspec.erb +0 -9
  54. data/lib/hanami/cli/commands/generate/action/action_without_view.erb +0 -7
  55. data/lib/hanami/cli/commands/generate/action/view.erb +0 -7
  56. data/lib/hanami/cli/commands/generate/action/view_spec.minitest.erb +0 -12
  57. data/lib/hanami/cli/commands/generate/action/view_spec.rspec.erb +0 -10
  58. data/lib/hanami/cli/commands/generate/action.rb +0 -321
  59. data/lib/hanami/cli/commands/generate/app/application.erb +0 -313
  60. data/lib/hanami/cli/commands/generate/app/favicon.ico +0 -0
  61. data/lib/hanami/cli/commands/generate/app/gitkeep.erb +0 -0
  62. data/lib/hanami/cli/commands/generate/app/layout.erb +0 -7
  63. data/lib/hanami/cli/commands/generate/app/layout_spec.minitest.erb +0 -10
  64. data/lib/hanami/cli/commands/generate/app/layout_spec.rspec.erb +0 -10
  65. data/lib/hanami/cli/commands/generate/app/routes.erb +0 -5
  66. data/lib/hanami/cli/commands/generate/app/template.erb.erb +0 -10
  67. data/lib/hanami/cli/commands/generate/app/template.haml.erb +0 -7
  68. data/lib/hanami/cli/commands/generate/app/template.slim.erb +0 -8
  69. data/lib/hanami/cli/commands/generate/app.rb +0 -243
  70. data/lib/hanami/cli/commands/generate/mailer/mailer.erb +0 -9
  71. data/lib/hanami/cli/commands/generate/mailer/mailer_spec.minitest.erb +0 -7
  72. data/lib/hanami/cli/commands/generate/mailer/mailer_spec.rspec.erb +0 -5
  73. data/lib/hanami/cli/commands/generate/mailer.rb +0 -104
  74. data/lib/hanami/cli/commands/generate/migration/migration.erb +0 -4
  75. data/lib/hanami/cli/commands/generate/migration.rb +0 -41
  76. data/lib/hanami/cli/commands/generate/model/entity.erb +0 -2
  77. data/lib/hanami/cli/commands/generate/model/entity_spec.minitest.erb +0 -5
  78. data/lib/hanami/cli/commands/generate/model/entity_spec.rspec.erb +0 -3
  79. data/lib/hanami/cli/commands/generate/model/migration.erb +0 -10
  80. data/lib/hanami/cli/commands/generate/model/repository.erb +0 -5
  81. data/lib/hanami/cli/commands/generate/model/repository_spec.minitest.erb +0 -5
  82. data/lib/hanami/cli/commands/generate/model/repository_spec.rspec.erb +0 -3
  83. data/lib/hanami/cli/commands/generate/model.rb +0 -125
  84. data/lib/hanami/cli/commands/generate/secret.rb +0 -48
  85. data/lib/hanami/cli/commands/generate.rb +0 -28
  86. data/lib/hanami/cli/commands/new/.env.development.erb +0 -3
  87. data/lib/hanami/cli/commands/new/.env.test.erb +0 -3
  88. data/lib/hanami/cli/commands/new/.gitkeep.erb +0 -0
  89. data/lib/hanami/cli/commands/new/Gemfile.erb +0 -57
  90. data/lib/hanami/cli/commands/new/README.md.erb +0 -33
  91. data/lib/hanami/cli/commands/new/config/boot.erb +0 -2
  92. data/lib/hanami/cli/commands/new/config/environment.erb +0 -49
  93. data/lib/hanami/cli/commands/new/config.ru.erb +0 -3
  94. data/lib/hanami/cli/commands/new/gitignore.erb +0 -4
  95. data/lib/hanami/cli/commands/new/gitignore_with_sqlite.erb +0 -5
  96. data/lib/hanami/cli/commands/new/hanamirc.erb +0 -3
  97. data/lib/hanami/cli/commands/new/lib/project.erb +0 -2
  98. data/lib/hanami/cli/commands/new/minitest/Rakefile.erb +0 -12
  99. data/lib/hanami/cli/commands/new/minitest/features_helper.erb +0 -11
  100. data/lib/hanami/cli/commands/new/minitest/spec_helper.erb +0 -7
  101. data/lib/hanami/cli/commands/new/rspec/Rakefile.erb +0 -9
  102. data/lib/hanami/cli/commands/new/rspec/capybara.erb +0 -8
  103. data/lib/hanami/cli/commands/new/rspec/features_helper.erb +0 -12
  104. data/lib/hanami/cli/commands/new/rspec/rspec.erb +0 -2
  105. data/lib/hanami/cli/commands/new/rspec/spec_helper.erb +0 -103
  106. data/lib/hanami/cli/commands/new/schema.sql.erb +0 -0
  107. data/lib/hanami/cli/commands/new.rb +0 -578
  108. data/lib/hanami/cli/commands/project.rb +0 -421
  109. data/lib/hanami/cli/commands/routes.rb +0 -21
  110. data/lib/hanami/cli/commands/templates.rb +0 -31
  111. data/lib/hanami/cli/commands/version.rb +0 -19
  112. data/lib/hanami/common_logger.rb +0 -109
  113. data/lib/hanami/components/app/assets.rb +0 -59
  114. data/lib/hanami/components/app/controller.rb +0 -74
  115. data/lib/hanami/components/app/routes.rb +0 -59
  116. data/lib/hanami/components/app/view.rb +0 -44
  117. data/lib/hanami/components/component.rb +0 -182
  118. data/lib/hanami/components/components.rb +0 -479
  119. data/lib/hanami/components/routes_inspector.rb +0 -72
  120. data/lib/hanami/components.rb +0 -156
  121. data/lib/hanami/config/cookies.rb +0 -69
  122. data/lib/hanami/config/framework_configuration.rb +0 -43
  123. data/lib/hanami/config/load_paths.rb +0 -46
  124. data/lib/hanami/config/mapper.rb +0 -47
  125. data/lib/hanami/config/routes.rb +0 -20
  126. data/lib/hanami/config/security.rb +0 -110
  127. data/lib/hanami/config/sessions.rb +0 -119
  128. data/lib/hanami/configuration/app.rb +0 -21
  129. data/lib/hanami/early_hints.rb +0 -129
  130. data/lib/hanami/env.rb +0 -69
  131. data/lib/hanami/environment.rb +0 -541
  132. data/lib/hanami/environment_application_configurations.rb +0 -37
  133. data/lib/hanami/hanamirc.rb +0 -169
  134. data/lib/hanami/mailer/glue.rb +0 -27
  135. data/lib/hanami/middleware_stack.rb +0 -172
  136. data/lib/hanami/rake_helper.rb +0 -78
  137. data/lib/hanami/rake_tasks.rb +0 -3
  138. data/lib/hanami/rendering_policy.rb +0 -94
  139. data/lib/hanami/routing/default.rb +0 -32
  140. data/lib/hanami/setup.rb +0 -3
  141. data/lib/hanami/static.rb +0 -63
  142. data/lib/hanami/templates/default.html.erb +0 -30
  143. data/lib/hanami/templates/welcome.html.erb +0 -52
  144. data/lib/hanami/views/default.rb +0 -37
  145. data/lib/hanami/views/default_template_finder.rb +0 -22
  146. data/lib/hanami/views/null_view.rb +0 -15
  147. data/lib/hanami/welcome.rb +0 -41
@@ -1,74 +0,0 @@
1
- require 'hanami/action/session'
2
- require 'hanami/action/routing_helpers'
3
-
4
- module Hanami
5
- # @since 0.9.0
6
- # @api private
7
- module Components
8
- # @since 0.9.0
9
- # @api private
10
- module App
11
- # hanami-controller configuration for a single Hanami application in the project.
12
- #
13
- # @since 0.9.0
14
- # @api private
15
- class Controller
16
- STRICT_TRANSPORT_SECURITY_HEADER = 'Strict-Transport-Security'.freeze
17
- STRICT_TRANSPORT_SECURITY_DEFAULT_VALUE = 'max-age=31536000'.freeze
18
-
19
- # Configure hanami-controller for a single Hanami application in the project.
20
- #
21
- # @param app [Hanami::Configuration::App] a Hanami application
22
- #
23
- # @since 0.9.0
24
- # @api private
25
- #
26
- # rubocop:disable Metrics/AbcSize
27
- # rubocop:disable Metrics/MethodLength
28
- def self.resolve(app)
29
- config = app.configuration
30
- namespace = app.namespace
31
-
32
- unless namespace.const_defined?('Controller', false)
33
- controller = Hanami::Controller.duplicate(namespace) do
34
- handle_exceptions config.handle_exceptions
35
- public_directory Hanami.public_directory
36
- default_request_format config.default_request_format
37
- default_response_format config.default_response_format
38
- default_headers(
39
- Hanami::Config::Security::X_FRAME_OPTIONS_HEADER => config.security.x_frame_options,
40
- Hanami::Config::Security::X_CONTENT_TYPE_OPTIONS_HEADER => config.security.x_content_type_options,
41
- Hanami::Config::Security::X_XSS_PROTECTION_HEADER => config.security.x_xss_protection,
42
- Hanami::Config::Security::CONTENT_SECURITY_POLICY_HEADER => config.security.content_security_policy
43
- )
44
- default_headers[STRICT_TRANSPORT_SECURITY_HEADER] = STRICT_TRANSPORT_SECURITY_DEFAULT_VALUE if config.force_ssl
45
-
46
- if config.cookies.enabled?
47
- require 'hanami/action/cookies'
48
- prepare { include Hanami::Action::Cookies }
49
- cookies config.cookies.default_options
50
- end
51
-
52
- if config.sessions.enabled?
53
- prepare do
54
- include Hanami::Action::Session
55
- include Hanami::Action::CSRFProtection
56
- end
57
- end
58
-
59
- prepare { include Hanami::Action::RoutingHelpers }
60
-
61
- config.controller.__apply(self)
62
- end
63
-
64
- namespace.const_set('Controller', controller)
65
- end
66
-
67
- Components.resolved "#{app.app_name}.controller", namespace.const_get('Controller').configuration
68
- end
69
- end
70
- # rubocop:enable Metrics/MethodLength
71
- # rubocop:enable Metrics/AbcSize
72
- end
73
- end
74
- end
@@ -1,59 +0,0 @@
1
- require 'hanami/routes'
2
- require 'hanami/routing/default'
3
-
4
- module Hanami
5
- # @since 0.9.0
6
- # @api private
7
- module Components
8
- # @since 0.9.0
9
- # @api private
10
- module App
11
- # hanami-router configuration for a single Hanami application in the project.
12
- #
13
- # @since 0.9.0
14
- # @api private
15
- class Routes
16
- # Configure hanami-router for a single Hanami application in the project.
17
- #
18
- # @param app [Hanami::Configuration::App] a Hanami application
19
- #
20
- # @since 0.9.0
21
- # @api private
22
- def self.resolve(app)
23
- namespace = app.namespace
24
- routes = application_routes(app)
25
-
26
- if namespace.routes.nil? # rubocop:disable Style/IfUnlessModifier
27
- namespace.routes = Hanami::Routes.new(routes)
28
- end
29
-
30
- Components.resolved("#{app.app_name}.routes", routes)
31
- end
32
-
33
- # @since 0.9.0
34
- # @api private
35
- def self.application_routes(app) # rubocop:disable Metrics/MethodLength
36
- config = app.configuration
37
- namespace = app.namespace
38
-
39
- resolver = Hanami::Routing::EndpointResolver.new(pattern: config.controller_pattern, namespace: namespace)
40
- default_app = Hanami::Routing::Default.new
41
-
42
- options = {
43
- resolver: resolver,
44
- default_app: default_app,
45
- scheme: config.scheme,
46
- host: config.host,
47
- port: config.port,
48
- prefix: config.path_prefix,
49
- force_ssl: config.force_ssl
50
- }
51
-
52
- options[:parsers] = config.body_parsers if config.body_parsers.any?
53
-
54
- Hanami::Router.new(options, &config.routes)
55
- end
56
- end
57
- end
58
- end
59
- end
@@ -1,44 +0,0 @@
1
- module Hanami
2
- # @since 0.9.0
3
- # @api private
4
- module Components
5
- # @since 0.9.0
6
- # @api private
7
- module App
8
- # hanami-view configuration for a single Hanami application in the project.
9
- #
10
- # @since 0.9.0
11
- # @api private
12
- class View
13
- # Configure hanami-view for a single Hanami application in the project.
14
- #
15
- # @param app [Hanami::Configuration::App] a Hanami application
16
- #
17
- # @since 0.9.0
18
- # @api private
19
- #
20
- # rubocop:disable Metrics/AbcSize
21
- # rubocop:disable Metrics/MethodLength
22
- def self.resolve(app)
23
- config = app.configuration
24
- namespace = app.namespace
25
-
26
- unless namespace.const_defined?('View', false)
27
- view = Hanami::View.duplicate(namespace) do
28
- root config.templates
29
- layout config.layout
30
-
31
- config.view.__apply(self)
32
- end
33
-
34
- namespace.const_set('View', view)
35
- end
36
-
37
- Components.resolved "#{app.app_name}.view", namespace.const_get('View').configuration
38
- end
39
- end
40
- # rubocop:enable Metrics/MethodLength
41
- # rubocop:enable Metrics/AbcSize
42
- end
43
- end
44
- end
@@ -1,182 +0,0 @@
1
- module Hanami
2
- # @since 0.9.0
3
- # @api private
4
- module Components
5
- # Base component
6
- #
7
- # @since 0.9.0
8
- # @api private
9
- #
10
- # @see Hanami::Components
11
- class Component
12
- # Instantiate a new component
13
- #
14
- # @param name [String] the component name
15
- # @param blk [Proc] the logic of the component
16
- #
17
- # @return [Hanami::Components::Component]
18
- #
19
- # @since 0.9.0
20
- # @api private
21
- def initialize(name, &blk)
22
- @name = name
23
- @requirements = []
24
- @_prepare = ->(*) {}
25
- @_resolve = -> {}
26
- instance_eval(&blk)
27
- end
28
-
29
- # Run or resolve the component
30
- #
31
- # @param configuration [Hanami::Configuration] the Hanami configuration for the project
32
- #
33
- # @since 0.9.0
34
- # @api private
35
- def call(configuration)
36
- resolve_requirements
37
- _prepare.call(configuration)
38
-
39
- unless _run.nil?
40
- _run.call(configuration)
41
- return
42
- end
43
-
44
- resolved(name, _resolve.call(configuration))
45
- end
46
-
47
- private
48
-
49
- # @since 1.3.0
50
- # @api private
51
- #
52
- # @see Hanami::Component#logger_interface?
53
- LOGGER_METHODS = %i[info warn debug]
54
-
55
- # Component name
56
- #
57
- # @return [String]
58
- #
59
- # @since 0.9.0
60
- # @api private
61
- attr_reader :name
62
-
63
- # Component requirements
64
- #
65
- # @return [Array<String>]
66
- #
67
- # @since 0.9.0
68
- # @api private
69
- attr_reader :requirements
70
-
71
- # Prepare logic
72
- #
73
- # @since 0.9.0
74
- # @api private
75
- attr_accessor :_prepare
76
-
77
- # Resolve logic
78
- #
79
- # @since 0.9.0
80
- # @api private
81
- attr_accessor :_resolve
82
-
83
- # Run logic
84
- #
85
- # @since 0.9.0
86
- # @api private
87
- attr_accessor :_run
88
-
89
- # Declare component requirement(s)
90
- #
91
- # @param components [Array<String>] the name of the other components to
92
- # depend on
93
- def requires(*components)
94
- self.requirements = Array(components).flatten
95
- end
96
-
97
- # Declare prepare logic
98
- #
99
- # @param blk [Proc] prepare logic
100
- #
101
- # @since 0.9.0
102
- # @api private
103
- def prepare(&blk)
104
- self._prepare = blk
105
- end
106
-
107
- # Declare resolve logic
108
- #
109
- # @param blk [Proc] resolve logic
110
- #
111
- # @since 0.9.0
112
- # @api private
113
- def resolve(&blk)
114
- self._resolve = blk
115
- end
116
-
117
- # Declare run logic
118
- #
119
- # @param blk [Proc] run logic
120
- #
121
- # @since 0.9.0
122
- # @api private
123
- def run(&blk)
124
- self._run = blk
125
- end
126
-
127
- # Set requirements
128
- #
129
- # @param names [Array<String>] the requirements
130
- #
131
- # @since 0.9.0
132
- # @api private
133
- def requirements=(names)
134
- @requirements = Array(names).flatten
135
- end
136
-
137
- # Resolve the requirements before to execute the logic of this component
138
- #
139
- # @since 0.9.0
140
- # @api private
141
- #
142
- # @see Hanami::Components.resolve
143
- def resolve_requirements
144
- Components.resolve(requirements)
145
- end
146
-
147
- # Get a registered component by name
148
- #
149
- # @param name [String] the component name
150
- #
151
- # @since 0.9.0
152
- # @api private
153
- #
154
- # @see Hanami::Components.component
155
- def component(name)
156
- Components.component(name)
157
- end
158
-
159
- # Mark a component as resolved by providing a value or a block.
160
- #
161
- # @param name [String] the name of the component to mark as resolved
162
- # @param value [Object] the optional value of the component
163
- # @param blk [Proc] the optional block which returning value is associated with the component.
164
- #
165
- # @since 0.9.0
166
- # @api private
167
- #
168
- # @see Hanami::Components.resolved
169
- def resolved(name, value = nil, &blk)
170
- Components.resolved(name, value, &blk)
171
- end
172
-
173
- # Check that instance has logger interfaces (#info, #warn and #debug)
174
- #
175
- # @since 1.3.0
176
- # @api private
177
- def logger_interface?(instance)
178
- LOGGER_METHODS.all? { |method| instance.respond_to?(method) }
179
- end
180
- end
181
- end
182
- end