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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +51 -41
- data/FEATURES.md +2 -12
- data/LICENSE.md +1 -1
- data/README.md +5 -8
- data/bin/hanami +6 -4
- data/hanami.gemspec +24 -28
- data/lib/hanami/application.rb +44 -176
- data/lib/hanami/boot.rb +6 -0
- data/lib/hanami/cli/commands/command.rb +21 -29
- data/lib/hanami/cli/commands/server.rb +63 -14
- data/lib/hanami/cli/commands.rb +5 -42
- data/lib/hanami/configuration/cookies.rb +24 -0
- data/lib/hanami/configuration/middleware.rb +8 -28
- data/lib/hanami/configuration/security.rb +141 -0
- data/lib/hanami/configuration/sessions.rb +50 -0
- data/lib/hanami/configuration.rb +181 -191
- data/lib/hanami/container.rb +107 -0
- data/lib/hanami/frameworks.rb +24 -18
- data/lib/hanami/routes.rb +17 -205
- data/lib/hanami/server.rb +5 -69
- data/lib/hanami/version.rb +3 -1
- data/lib/hanami.rb +39 -243
- metadata +36 -233
- data/lib/hanami/action/csrf_protection.rb +0 -211
- data/lib/hanami/action/routing_helpers.rb +0 -40
- data/lib/hanami/app.rb +0 -96
- data/lib/hanami/application_configuration.rb +0 -1495
- data/lib/hanami/application_name.rb +0 -108
- data/lib/hanami/application_namespace.rb +0 -14
- data/lib/hanami/assets/asset.rb +0 -72
- data/lib/hanami/assets/static.rb +0 -102
- data/lib/hanami/cli/commands/assets/precompile.rb +0 -42
- data/lib/hanami/cli/commands/assets.rb +0 -16
- data/lib/hanami/cli/commands/console.rb +0 -95
- data/lib/hanami/cli/commands/db/apply.rb +0 -32
- data/lib/hanami/cli/commands/db/console.rb +0 -44
- data/lib/hanami/cli/commands/db/create.rb +0 -32
- data/lib/hanami/cli/commands/db/drop.rb +0 -32
- data/lib/hanami/cli/commands/db/migrate.rb +0 -39
- data/lib/hanami/cli/commands/db/prepare.rb +0 -32
- data/lib/hanami/cli/commands/db/rollback.rb +0 -59
- data/lib/hanami/cli/commands/db/version.rb +0 -32
- data/lib/hanami/cli/commands/db.rb +0 -32
- data/lib/hanami/cli/commands/destroy/action.rb +0 -137
- data/lib/hanami/cli/commands/destroy/app.rb +0 -159
- data/lib/hanami/cli/commands/destroy/mailer.rb +0 -74
- data/lib/hanami/cli/commands/destroy/migration.rb +0 -51
- data/lib/hanami/cli/commands/destroy/model.rb +0 -84
- data/lib/hanami/cli/commands/destroy.rb +0 -26
- data/lib/hanami/cli/commands/generate/action/action.erb +0 -7
- data/lib/hanami/cli/commands/generate/action/action_spec.minitest.erb +0 -11
- data/lib/hanami/cli/commands/generate/action/action_spec.rspec.erb +0 -9
- data/lib/hanami/cli/commands/generate/action/action_without_view.erb +0 -7
- data/lib/hanami/cli/commands/generate/action/view.erb +0 -7
- data/lib/hanami/cli/commands/generate/action/view_spec.minitest.erb +0 -12
- data/lib/hanami/cli/commands/generate/action/view_spec.rspec.erb +0 -10
- data/lib/hanami/cli/commands/generate/action.rb +0 -321
- data/lib/hanami/cli/commands/generate/app/application.erb +0 -313
- data/lib/hanami/cli/commands/generate/app/favicon.ico +0 -0
- data/lib/hanami/cli/commands/generate/app/gitkeep.erb +0 -0
- data/lib/hanami/cli/commands/generate/app/layout.erb +0 -7
- data/lib/hanami/cli/commands/generate/app/layout_spec.minitest.erb +0 -10
- data/lib/hanami/cli/commands/generate/app/layout_spec.rspec.erb +0 -10
- data/lib/hanami/cli/commands/generate/app/routes.erb +0 -5
- data/lib/hanami/cli/commands/generate/app/template.erb.erb +0 -10
- data/lib/hanami/cli/commands/generate/app/template.haml.erb +0 -7
- data/lib/hanami/cli/commands/generate/app/template.slim.erb +0 -8
- data/lib/hanami/cli/commands/generate/app.rb +0 -243
- data/lib/hanami/cli/commands/generate/mailer/mailer.erb +0 -9
- data/lib/hanami/cli/commands/generate/mailer/mailer_spec.minitest.erb +0 -7
- data/lib/hanami/cli/commands/generate/mailer/mailer_spec.rspec.erb +0 -5
- data/lib/hanami/cli/commands/generate/mailer.rb +0 -104
- data/lib/hanami/cli/commands/generate/migration/migration.erb +0 -4
- data/lib/hanami/cli/commands/generate/migration.rb +0 -41
- data/lib/hanami/cli/commands/generate/model/entity.erb +0 -2
- data/lib/hanami/cli/commands/generate/model/entity_spec.minitest.erb +0 -5
- data/lib/hanami/cli/commands/generate/model/entity_spec.rspec.erb +0 -3
- data/lib/hanami/cli/commands/generate/model/migration.erb +0 -10
- data/lib/hanami/cli/commands/generate/model/repository.erb +0 -5
- data/lib/hanami/cli/commands/generate/model/repository_spec.minitest.erb +0 -5
- data/lib/hanami/cli/commands/generate/model/repository_spec.rspec.erb +0 -3
- data/lib/hanami/cli/commands/generate/model.rb +0 -125
- data/lib/hanami/cli/commands/generate/secret.rb +0 -48
- data/lib/hanami/cli/commands/generate.rb +0 -28
- data/lib/hanami/cli/commands/new/.env.development.erb +0 -3
- data/lib/hanami/cli/commands/new/.env.test.erb +0 -3
- data/lib/hanami/cli/commands/new/.gitkeep.erb +0 -0
- data/lib/hanami/cli/commands/new/Gemfile.erb +0 -57
- data/lib/hanami/cli/commands/new/README.md.erb +0 -33
- data/lib/hanami/cli/commands/new/config/boot.erb +0 -2
- data/lib/hanami/cli/commands/new/config/environment.erb +0 -49
- data/lib/hanami/cli/commands/new/config.ru.erb +0 -3
- data/lib/hanami/cli/commands/new/gitignore.erb +0 -4
- data/lib/hanami/cli/commands/new/gitignore_with_sqlite.erb +0 -5
- data/lib/hanami/cli/commands/new/hanamirc.erb +0 -3
- data/lib/hanami/cli/commands/new/lib/project.erb +0 -2
- data/lib/hanami/cli/commands/new/minitest/Rakefile.erb +0 -12
- data/lib/hanami/cli/commands/new/minitest/features_helper.erb +0 -11
- data/lib/hanami/cli/commands/new/minitest/spec_helper.erb +0 -7
- data/lib/hanami/cli/commands/new/rspec/Rakefile.erb +0 -9
- data/lib/hanami/cli/commands/new/rspec/capybara.erb +0 -8
- data/lib/hanami/cli/commands/new/rspec/features_helper.erb +0 -12
- data/lib/hanami/cli/commands/new/rspec/rspec.erb +0 -2
- data/lib/hanami/cli/commands/new/rspec/spec_helper.erb +0 -103
- data/lib/hanami/cli/commands/new/schema.sql.erb +0 -0
- data/lib/hanami/cli/commands/new.rb +0 -578
- data/lib/hanami/cli/commands/project.rb +0 -421
- data/lib/hanami/cli/commands/routes.rb +0 -21
- data/lib/hanami/cli/commands/templates.rb +0 -31
- data/lib/hanami/cli/commands/version.rb +0 -19
- data/lib/hanami/common_logger.rb +0 -109
- data/lib/hanami/components/app/assets.rb +0 -59
- data/lib/hanami/components/app/controller.rb +0 -74
- data/lib/hanami/components/app/routes.rb +0 -59
- data/lib/hanami/components/app/view.rb +0 -44
- data/lib/hanami/components/component.rb +0 -182
- data/lib/hanami/components/components.rb +0 -479
- data/lib/hanami/components/routes_inspector.rb +0 -72
- data/lib/hanami/components.rb +0 -156
- data/lib/hanami/config/cookies.rb +0 -69
- data/lib/hanami/config/framework_configuration.rb +0 -43
- data/lib/hanami/config/load_paths.rb +0 -46
- data/lib/hanami/config/mapper.rb +0 -47
- data/lib/hanami/config/routes.rb +0 -20
- data/lib/hanami/config/security.rb +0 -110
- data/lib/hanami/config/sessions.rb +0 -119
- data/lib/hanami/configuration/app.rb +0 -21
- data/lib/hanami/early_hints.rb +0 -129
- data/lib/hanami/env.rb +0 -69
- data/lib/hanami/environment.rb +0 -541
- data/lib/hanami/environment_application_configurations.rb +0 -37
- data/lib/hanami/hanamirc.rb +0 -169
- data/lib/hanami/mailer/glue.rb +0 -27
- data/lib/hanami/middleware_stack.rb +0 -172
- data/lib/hanami/rake_helper.rb +0 -78
- data/lib/hanami/rake_tasks.rb +0 -3
- data/lib/hanami/rendering_policy.rb +0 -94
- data/lib/hanami/routing/default.rb +0 -32
- data/lib/hanami/setup.rb +0 -3
- data/lib/hanami/static.rb +0 -63
- data/lib/hanami/templates/default.html.erb +0 -30
- data/lib/hanami/templates/welcome.html.erb +0 -52
- data/lib/hanami/views/default.rb +0 -37
- data/lib/hanami/views/default_template_finder.rb +0 -22
- data/lib/hanami/views/null_view.rb +0 -15
- data/lib/hanami/welcome.rb +0 -41
data/lib/hanami/hanamirc.rb
DELETED
|
@@ -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
|
data/lib/hanami/mailer/glue.rb
DELETED
|
@@ -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
|
data/lib/hanami/rake_helper.rb
DELETED
|
@@ -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
|
data/lib/hanami/rake_tasks.rb
DELETED
|
@@ -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
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>
|