hanami 1.3.5 → 2.0.0.alpha1

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 (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,169 +0,0 @@
1
- require 'pathname'
2
- require 'hanami/utils/hash'
3
-
4
- module Hanami
5
- # Read the .hanamirc file in the root of the application
6
- #
7
- # @since 0.3.0
8
- # @api private
9
- class Hanamirc
10
- # Hanamirc name file
11
- #
12
- # @since 0.3.0
13
- # @api private
14
- #
15
- # @see Hanami::Hanamirc#path_file
16
- FILE_NAME = '.hanamirc'.freeze
17
-
18
- # Project name for writing the hanamirc file
19
- #
20
- # @since 0.8.0
21
- # @api private
22
- #
23
- # @see Hanami::Hanamirc#default_options
24
- PROJECT_NAME = 'project'.freeze
25
-
26
- # Test suite default value
27
- #
28
- # @since 0.3.0
29
- # @api private
30
- #
31
- # @see Hanami::Hanamirc#default_options
32
- DEFAULT_TEST_SUITE = 'rspec'.freeze
33
-
34
- # Test suite key for writing the hanamirc file
35
- #
36
- # @since 0.3.0
37
- # @api private
38
- #
39
- # @see Hanami::Hanamirc#default_options
40
- TEST_KEY = 'test'.freeze
41
-
42
- # Template default value
43
- #
44
- # @since 0.3.0
45
- # @api private
46
- #
47
- # @see Hanami::Hanamirc#default_options
48
- DEFAULT_TEMPLATE = 'erb'.freeze
49
-
50
- # Template key for writing the hanamirc file
51
- #
52
- # @since 0.3.0
53
- # @api private
54
- #
55
- # @see Hanami::Hanamirc#default_options
56
- TEMPLATE_KEY = 'template'.freeze
57
-
58
- # Key/value separator in hanamirc file
59
- #
60
- # @since 0.8.0
61
- # @api private
62
- SEPARATOR = '='.freeze
63
-
64
- # Initialize Hanamirc class with application's root and environment options.
65
- #
66
- # @param root [Pathname] Application's root
67
- #
68
- # @see Hanami::Environment#initialize
69
- def initialize(root)
70
- @root = root
71
- end
72
-
73
- # Read hanamirc file (if exists) and parse it's values or return default.
74
- #
75
- # @return [::Hash] parsed values
76
- #
77
- # @example Default values if file doesn't exist
78
- # Hanami::Hanamirc.new(Pathname.new(Dir.pwd)).options
79
- # # => { test: 'minitest', template: 'erb' }
80
- #
81
- # @example Custom values if file doesn't exist
82
- # options = { test: 'rspec', template: 'slim' }
83
- # Hanami::Hanamirc.new(Pathname.new(Dir.pwd), options).options
84
- # # => { test: 'rspec', template: 'slim' }
85
- def options
86
- @options ||= symbolize(default_options.merge(file_options))
87
- end
88
-
89
- # Default values for writing the hanamirc file
90
- #
91
- # @since 0.5.1
92
- # @api private
93
- #
94
- # @see Hanami::Hanamirc#options
95
- def default_options
96
- @default_options ||= Utils::Hash.symbolize({
97
- PROJECT_NAME => project_name,
98
- TEST_KEY => DEFAULT_TEST_SUITE,
99
- TEMPLATE_KEY => DEFAULT_TEMPLATE
100
- }).freeze
101
- end
102
-
103
- # Check if hanamirc file exists
104
- #
105
- # @since 0.3.0
106
- # @api private
107
- #
108
- # @return [Boolean] hanamirc file's path existing
109
- def exists?
110
- path_file.exist?
111
- end
112
-
113
- private
114
-
115
- # @api private
116
- def symbolize(hash)
117
- Utils::Hash.symbolize(hash)
118
- end
119
-
120
- # Returns options from hanamirc file
121
- #
122
- # @since 0.6.0
123
- # @api private
124
- #
125
- # @return [Hash] hanamirc parsed values
126
- def file_options
127
- symbolize(exists? ? parse_file(path_file) : {})
128
- end
129
-
130
- # Read hanamirc file and parse it's values
131
- #
132
- # @since 0.8.0
133
- # @api private
134
- #
135
- # @return [Hash] hanamirc parsed values
136
- def parse_file(path)
137
- {}.tap do |hash|
138
- File.readlines(path).each do |line|
139
- key, value = line.split(SEPARATOR)
140
- hash[key] = value.strip
141
- end
142
- end
143
- end
144
-
145
- # Return the hanamirc file's path
146
- #
147
- # @since 0.3.0
148
- # @api private
149
- #
150
- # @return [Pathname] hanamirc file's path
151
- #
152
- # @see Hanami::Hanamirc::FILE_NAME
153
- def path_file
154
- @root.join FILE_NAME
155
- end
156
-
157
- # Generates a default project name based on the application directory
158
- #
159
- # @since 0.8.0
160
- # @api private
161
- #
162
- # @return [String] application_name
163
- #
164
- # @see Hanami::Hanamirc::PROJECT_NAME
165
- def project_name
166
- ::File.basename(@root)
167
- end
168
- end
169
- end
@@ -1,27 +0,0 @@
1
- # @api private
2
- module Hanami::Mailer
3
- # @since 0.5.0
4
- # @api private
5
- module Glue
6
- # @since 0.5.0
7
- # @api private
8
- def self.included(configuration)
9
- configuration.class_eval do
10
- alias_method :delivery, :delivery_method
11
- end
12
- end
13
- end
14
-
15
- Configuration.class_eval do
16
- include Glue
17
- end
18
- end
19
-
20
- # @since 0.5.0
21
- # @api private
22
- module Mailers
23
- end
24
-
25
- Hanami::Mailer.configure do
26
- namespace Mailers
27
- end
@@ -1,172 +0,0 @@
1
- require 'rack/builder'
2
- require 'hanami/utils/class'
3
-
4
- module Hanami
5
- # Rack middleware stack for an application
6
- #
7
- # @since 0.1.0
8
- # @api private
9
- class MiddlewareStack
10
- # Instantiate a middleware stack
11
- #
12
- # @param configuration [Hanami::ApplicationConfiguration] the application's configuration
13
- #
14
- # @return [Hanami::MiddlewareStack] the new stack
15
- #
16
- # @since 0.1.0
17
- # @api private
18
- #
19
- # @see Hanami::ApplicationConfiguration
20
- def initialize(configuration)
21
- @stack = []
22
- @configuration = configuration
23
- @builder = Rack::Builder.new
24
- end
25
-
26
- # Load the middleware stack
27
- #
28
- # @return [Hanami::MiddlewareStack] the loaded middleware stack
29
- #
30
- # @since 0.2.0
31
- # @api private
32
- #
33
- # @see http://rdoc.info/gems/rack/Rack/Builder
34
- def load!
35
- load_default_stack
36
- stack.each { |m, args, block| builder.use(load_middleware(m), *args, &block) }
37
- builder.run routes
38
-
39
- self
40
- end
41
-
42
- # Process a request.
43
- # This method makes the middleware stack compatible with the Rack protocol.
44
- #
45
- # @param env [Hash] a Rack env
46
- #
47
- # @return [Array] a serialized Rack response
48
- #
49
- # @since 0.1.0
50
- # @api private
51
- def call(env)
52
- builder.call(env)
53
- end
54
-
55
- # Append a middleware to the stack.
56
- #
57
- # @param middleware [Object] a Rack middleware
58
- # @param args [Array] optional arguments to pass to the Rack middleware
59
- # @param blk [Proc] an optional block to pass to the Rack middleware
60
- #
61
- # @return [Array] the middleware that was added
62
- #
63
- # @since 0.2.0
64
- #
65
- # @see Hanami::MiddlewareStack#prepend
66
- #
67
- # @example
68
- # # apps/web/application.rb
69
- # module Web
70
- # class Application < Hanami::Application
71
- # configure do
72
- # # ...
73
- # use MyRackMiddleware, foo: 'bar'
74
- # end
75
- # end
76
- # end
77
- def use(middleware, *args, &blk)
78
- stack.push [middleware, args, blk]
79
- stack.uniq!
80
- end
81
-
82
- # Prepend a middleware to the stack.
83
- #
84
- # @param middleware [Object] a Rack middleware
85
- # @param args [Array] optional arguments to pass to the Rack middleware
86
- # @param blk [Proc] an optional block to pass to the Rack middleware
87
- #
88
- # @return [Array] the middleware that was added
89
- #
90
- # @since 0.6.0
91
- #
92
- # @see Hanami::MiddlewareStack#use
93
- #
94
- # @example
95
- # # apps/web/application.rb
96
- # module Web
97
- # class Application < Hanami::Application
98
- # configure do
99
- # # ...
100
- # prepend MyRackMiddleware, foo: 'bar'
101
- # end
102
- # end
103
- # end
104
- def prepend(middleware, *args, &blk)
105
- stack.unshift [middleware, args, blk]
106
- stack.uniq!
107
- end
108
-
109
- private
110
-
111
- # @api private
112
- # @since 0.9.0
113
- attr_reader :stack
114
-
115
- # @api private
116
- # @since 0.9.0
117
- attr_reader :builder
118
-
119
- # @api private
120
- # @since 0.9.0
121
- attr_reader :configuration
122
-
123
- # @api private
124
- # @since 0.2.0
125
- def load_middleware(middleware)
126
- case middleware
127
- when String
128
- Utils::Class.load!(middleware)
129
- else
130
- middleware
131
- end
132
- end
133
-
134
- # @api private
135
- # @since 0.9.0
136
- def routes
137
- Components["#{configuration.app_name}.routes"]
138
- end
139
-
140
- # @api private
141
- # @since 0.2.0
142
- def load_default_stack
143
- @default_stack_loaded ||= begin
144
- _load_session_middleware
145
- _load_default_welcome_page
146
-
147
- true
148
- end
149
- end
150
-
151
- # Default welcome page
152
- #
153
- # @api private
154
- # @since 0.2.0
155
- def _load_default_welcome_page
156
- unless Hanami.env?(:test) || routes.defined?
157
- require 'hanami/welcome'
158
- use Hanami::Welcome
159
- end
160
- end
161
-
162
- # Add session middleware
163
- #
164
- # @api private
165
- # @since 0.2.0
166
- def _load_session_middleware
167
- if configuration.sessions.enabled?
168
- prepend(*configuration.sessions.middleware)
169
- end
170
- end
171
- end
172
- end
@@ -1,78 +0,0 @@
1
- require 'rake'
2
-
3
- module Hanami
4
- # Install Rake tasks in projects
5
- #
6
- # @since 0.6.0
7
- # @api private
8
- class RakeHelper
9
- include Rake::DSL
10
-
11
- # @since 0.6.0
12
- # @api private
13
- def self.install_tasks
14
- new.install
15
- end
16
-
17
- # @since 0.6.0
18
- # @api private
19
- #
20
- # rubocop:disable Metrics/MethodLength
21
- def install
22
- desc "Load the full project"
23
- task :environment do
24
- require 'hanami/environment'
25
- Hanami::Environment.new.require_project_environment
26
- Components.resolve('all')
27
- end
28
-
29
- # Ruby ecosystem compatibility
30
- #
31
- # Most of the SaaS automatic tasks are designed after Ruby on Rails.
32
- # They expect the following Rake tasks to be present:
33
- #
34
- # * db:migrate
35
- # * assets:precompile
36
- #
37
- # See https://github.com/heroku/heroku-buildpack-ruby/issues/442
38
- #
39
- # ===
40
- #
41
- # These Rake tasks aren't listed when someone runs `rake -T`, because we
42
- # want to encourage developers to use `hanami` commands.
43
- #
44
- # In order to migrate the database or precompile assets a developer should
45
- # use:
46
- #
47
- # * hanami db migrate
48
- # * hanami assets precompile
49
- #
50
- # This is the preferred way to run Hanami command line tasks.
51
- # Please use them when you're in control of your deployment environment.
52
- #
53
- # If you're not in control and your deployment requires these "standard"
54
- # Rake tasks, they are here to solve this only specific problem.
55
- namespace :db do
56
- task :migrate do
57
- run_hanami_command("db migrate")
58
- end
59
- end
60
-
61
- namespace :assets do
62
- task :precompile do
63
- run_hanami_command("assets precompile")
64
- end
65
- end
66
- end
67
-
68
- private
69
-
70
- # @since 1.1.0
71
- # @api private
72
- def run_hanami_command(command)
73
- require "hanami/cli/commands"
74
- Dry::CLI.new(Hanami::CLI::Commands).call(arguments: command.split(/[[:space:]]/))
75
- end
76
- # rubocop:enable Metrics/MethodLength
77
- end
78
- end
@@ -1,3 +0,0 @@
1
- require 'hanami/rake_helper'
2
-
3
- Hanami::RakeHelper.install_tasks
@@ -1,94 +0,0 @@
1
- require 'hanami/utils/class'
2
- require 'hanami/views/default'
3
- require 'hanami/views/null_view'
4
- require 'hanami/action/rack/errors'
5
-
6
- module Hanami
7
- # Rendering policy
8
- #
9
- # @since 0.1.0
10
- # @api private
11
- class RenderingPolicy
12
- # @api private
13
- STATUS = 0
14
- # @api private
15
- HEADERS = 1
16
- # @api private
17
- BODY = 2
18
-
19
- # @api private
20
- HANAMI_ACTION = 'hanami.action'.freeze
21
-
22
- # @api private
23
- SUCCESSFUL_STATUSES = (200..201).freeze
24
- # @api private
25
- RENDERABLE_FORMATS = [:all, :html].freeze
26
- # @api private
27
- ERROR_STATUS = 500
28
-
29
- # @api private
30
- def initialize(configuration)
31
- @controller_pattern = %r{#{ configuration.controller_pattern.gsub(/\%\{(controller|action)\}/) { "(?<#{ $1 }>(.*))" } }}
32
- @configuration = configuration
33
- end
34
-
35
- # @api private
36
- def render(env, response)
37
- body = _render(env, response)
38
-
39
- response[BODY] = Array(body) unless body.nil? || body.respond_to?(:each)
40
- response
41
- end
42
-
43
- private
44
- # @api private
45
- def _render(env, response)
46
- if action = renderable?(env)
47
- _render_action(action, env, response) ||
48
- _render_status_page(action, response)
49
- end
50
- end
51
-
52
- # @api private
53
- def _render_action(action, env, response)
54
- begin
55
- view_for(action, response).render(
56
- action.exposures
57
- )
58
- rescue StandardError => e
59
- Hanami::Action::Rack::Errors.set(env, e)
60
- raise e unless @configuration.handle_exceptions
61
-
62
- response[STATUS] = ERROR_STATUS
63
- false
64
- end
65
- end
66
-
67
- # @api private
68
- def _render_status_page(action, response)
69
- if render_status_page?(action, response)
70
- Hanami::Views::Default.render(@configuration.templates, response[STATUS], response: response, format: :html)
71
- end
72
- end
73
-
74
- # @api private
75
- def renderable?(env)
76
- ((action = env.delete(HANAMI_ACTION)) && action.renderable?) and action
77
- end
78
-
79
- # @api private
80
- def render_status_page?(action, response)
81
- RENDERABLE_FORMATS.include?(action.format) && !SUCCESSFUL_STATUSES.include?(response[STATUS])
82
- end
83
-
84
- # @api private
85
- def view_for(action, response)
86
- view = if response[BODY].respond_to?(:empty?) && response[BODY].empty?
87
- captures = @controller_pattern.match(action.class.name)
88
- Utils::Class.load(@configuration.view_pattern % { controller: captures[:controller], action: captures[:action] }, @configuration.namespace)
89
- end
90
-
91
- view || Views::NullView.new
92
- end
93
- end
94
- end
@@ -1,32 +0,0 @@
1
- module Hanami
2
- # @api private
3
- module Routing
4
- # The default Rack application that responds when a resource cannot be found.
5
- #
6
- # @since 0.1.0
7
- # @api private
8
- class Default
9
- # @api private
10
- DEFAULT_CODE = 404
11
- # @api private
12
- DEFAULT_BODY = ['Not Found'].freeze
13
- # @api private
14
- CONTENT_TYPE = 'Content-Type'.freeze
15
-
16
- # @api private
17
- class NullAction
18
- include Hanami::Action
19
-
20
- # @api private
21
- def call(env)
22
- end
23
- end
24
-
25
- # @api private
26
- def call(env)
27
- action = NullAction.new.tap { |a| a.call(env) }
28
- [ DEFAULT_CODE, {CONTENT_TYPE => action.content_type}, DEFAULT_BODY, action ]
29
- end
30
- end
31
- end
32
- end
data/lib/hanami/setup.rb DELETED
@@ -1,3 +0,0 @@
1
- require 'hanami'
2
-
3
- ::Bundler.require(*Hanami::Environment.new.bundler_groups)
data/lib/hanami/static.rb DELETED
@@ -1,63 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "rack/static"
4
-
5
- module Hanami
6
- # Serve static assets in deployment environments (production, staging) where
7
- # the stack doesn't include a web server.
8
- #
9
- # Web servers like Nginx are the ideal candidate to serve static assets.
10
- # They are faster than Ruby application servers (eg. Puma) and they should be
11
- # always preferred for this specific task.
12
- #
13
- # But there are some PaaS that don't allow to use web servers in front of Ruby
14
- # web applications. A classical example is Heroku, which requires the web
15
- # application to serve static assets.
16
- #
17
- # Hanami::Static is designed for this specific scenario.
18
- #
19
- # To enable it set the env variable `SERVE_STATIC_ASSETS` on `true`.
20
- #
21
- # NOTE: Please remember to precompile the assets at the deploy time with
22
- # `bundle exec hanami assets precompile`.
23
- #
24
- # @since 0.6.0
25
- # @api private
26
- #
27
- # @see http://www.rubydoc.info/gems/rack/Rack/Static
28
- class Static < ::Rack::Static
29
- # @since 0.8.0
30
- # @api private
31
- MAX_AGE = 60 * 60 * 24 * 365 # One year
32
-
33
- # @since 0.8.0
34
- # @api private
35
- HEADER_RULES = [[:all, { "Cache-Control" => "public, max-age=#{MAX_AGE}" }]].freeze
36
-
37
- # @since 0.8.0
38
- # @api private
39
- URL_PREFIX = "/"
40
-
41
- # @since 0.6.0
42
- # @api private
43
- def initialize(app, root: Hanami.public_directory, header_rules: HEADER_RULES)
44
- super(app, urls: _urls(root), root: root, header_rules: header_rules)
45
- end
46
-
47
- private
48
-
49
- # @since 0.8.0
50
- # @api private
51
- def _urls(root)
52
- return [] unless root.exist?
53
-
54
- asset_files = Pathname.glob(root.join("**", "*"))
55
- .select(&:file?)
56
-
57
- asset_files.each_with_object({}) do |path, result|
58
- path = path.relative_path_from(root)
59
- result["#{URL_PREFIX}#{path}"] = path
60
- end
61
- end
62
- end
63
- end
@@ -1,30 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title><%= title %></title>
5
- <link rel="shortcut icon" type="image/x-icon" href="/assets/favicon.ico">
6
- <style>
7
- * { margin: 0; padding: 0; }
8
- body { font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; color: #333; background-color: #ecf0f1; font-size: 16px; line-height: 24px; }
9
- h2, h3 { margin: -20px; line-height: 100px; text-align: center; }
10
- .logo { text-align: center; margin-top: 0.5em; }
11
- h2 { font-size: 30px; }
12
- h3 { font-size: 20px; line-height: 22px; color: #666; }
13
- hr { margin: 2em; color: #ecf0f1; }
14
- ul { text-align: center; }
15
- li { display: inline; margin: 2em; line-height: 24px; list-style-type: none; vertical-align: text-top;}
16
- p { margin-top: 60px; text-align: center; }
17
- a { color: #333; padding: 1px; }
18
- code { padding: .2em; background-color: #ecf0f1 }
19
- #container { margin: 20% auto; padding: 24px; width: 75%; background-color: #fff; border: 1px solid #999; border-width: 1px; }
20
- #content { margin: 30px 10px 0 10px; }
21
- #footer { margin:0 auto 0; padding: 12px; width:700px; line-height: 24px; font-size: 12px; }
22
- .bold { font-weight: bold; }
23
- </style>
24
- </head>
25
- <body>
26
- <div id="container">
27
- <h2><%= title %></h2>
28
- </div>
29
- </body>
30
- </html>