hanami 0.0.0 → 0.7.0
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 +214 -0
- data/FEATURES.md +156 -0
- data/LICENSE.md +22 -0
- data/README.md +80 -15
- data/bin/hanami +5 -0
- data/hanami.gemspec +27 -12
- data/lib/hanami.rb +78 -2
- data/lib/hanami/action/csrf_protection.rb +167 -0
- data/lib/hanami/action/routing_helpers.rb +40 -0
- data/lib/hanami/application.rb +244 -0
- data/lib/hanami/application_name.rb +101 -0
- data/lib/hanami/cli.rb +119 -0
- data/lib/hanami/cli_sub_commands/assets.rb +29 -0
- data/lib/hanami/cli_sub_commands/db.rb +124 -0
- data/lib/hanami/cli_sub_commands/destroy.rb +102 -0
- data/lib/hanami/cli_sub_commands/generate.rb +127 -0
- data/lib/hanami/commands/assets/precompile.rb +35 -0
- data/lib/hanami/commands/console.rb +90 -0
- data/lib/hanami/commands/db/abstract.rb +19 -0
- data/lib/hanami/commands/db/apply.rb +14 -0
- data/lib/hanami/commands/db/console.rb +50 -0
- data/lib/hanami/commands/db/create.rb +14 -0
- data/lib/hanami/commands/db/drop.rb +14 -0
- data/lib/hanami/commands/db/migrate.rb +19 -0
- data/lib/hanami/commands/db/prepare.rb +14 -0
- data/lib/hanami/commands/db/version.rb +14 -0
- data/lib/hanami/commands/generate/abstract.rb +63 -0
- data/lib/hanami/commands/generate/action.rb +262 -0
- data/lib/hanami/commands/generate/app.rb +116 -0
- data/lib/hanami/commands/generate/mailer.rb +118 -0
- data/lib/hanami/commands/generate/migration.rb +63 -0
- data/lib/hanami/commands/generate/model.rb +96 -0
- data/lib/hanami/commands/new/abstract.rb +128 -0
- data/lib/hanami/commands/new/app.rb +116 -0
- data/lib/hanami/commands/new/container.rb +102 -0
- data/lib/hanami/commands/routes.rb +41 -0
- data/lib/hanami/commands/server.rb +79 -0
- data/lib/hanami/config/configure.rb +17 -0
- data/lib/hanami/config/cookies.rb +68 -0
- data/lib/hanami/config/framework_configuration.rb +42 -0
- data/lib/hanami/config/load_paths.rb +27 -0
- data/lib/hanami/config/mapper.rb +36 -0
- data/lib/hanami/config/mapping.rb +12 -0
- data/lib/hanami/config/routes.rb +16 -0
- data/lib/hanami/config/security.rb +58 -0
- data/lib/hanami/config/sessions.rb +97 -0
- data/lib/hanami/configuration.rb +1728 -0
- data/lib/hanami/container.rb +59 -0
- data/lib/hanami/environment.rb +485 -0
- data/lib/hanami/frameworks.rb +14 -0
- data/lib/hanami/generators/action/action.rb.tt +8 -0
- data/lib/hanami/generators/action/action_spec.minitest.tt +12 -0
- data/lib/hanami/generators/action/action_spec.rspec.tt +11 -0
- data/lib/hanami/generators/action/action_without_view.rb.tt +9 -0
- data/lib/hanami/generators/action/template.tt +0 -0
- data/lib/hanami/generators/action/view.rb.tt +5 -0
- data/lib/hanami/generators/action/view_spec.minitest.tt +13 -0
- data/lib/hanami/generators/action/view_spec.rspec.tt +12 -0
- data/lib/hanami/generators/app/.gitkeep.tt +1 -0
- data/lib/hanami/generators/app/application.rb.tt +273 -0
- data/lib/hanami/generators/app/config/initializers/.gitkeep +0 -0
- data/lib/hanami/generators/app/config/routes.rb.tt +2 -0
- data/lib/hanami/generators/app/favicon.ico +0 -0
- data/lib/hanami/generators/app/templates/application.html.erb.tt +10 -0
- data/lib/hanami/generators/app/views/application_layout.rb.tt +7 -0
- data/lib/hanami/generators/application/app/.env.development.tt +4 -0
- data/lib/hanami/generators/application/app/.env.test.tt +4 -0
- data/lib/hanami/generators/application/app/.env.tt +1 -0
- data/lib/hanami/generators/application/app/.gitignore +0 -0
- data/lib/hanami/generators/application/app/.gitkeep +1 -0
- data/lib/hanami/generators/application/app/Gemfile.tt +37 -0
- data/lib/hanami/generators/application/app/Rakefile.minitest.tt +11 -0
- data/lib/hanami/generators/application/app/Rakefile.rspec.tt +6 -0
- data/lib/hanami/generators/application/app/apps/.gitkeep.tt +1 -0
- data/lib/hanami/generators/application/app/capybara.rb.rspec.tt +8 -0
- data/lib/hanami/generators/application/app/config.ru.tt +3 -0
- data/lib/hanami/generators/application/app/config/application.rb.tt +270 -0
- data/lib/hanami/generators/application/app/config/environment.rb.tt +5 -0
- data/lib/hanami/generators/application/app/config/initializers/.gitkeep +0 -0
- data/lib/hanami/generators/application/app/config/routes.rb.tt +2 -0
- data/lib/hanami/generators/application/app/db/.gitkeep +1 -0
- data/lib/hanami/generators/application/app/favicon.ico +0 -0
- data/lib/hanami/generators/application/app/features_helper.rb.minitest.tt +11 -0
- data/lib/hanami/generators/application/app/features_helper.rb.rspec.tt +12 -0
- data/lib/hanami/generators/application/app/gitignore.tt +2 -0
- data/lib/hanami/generators/application/app/gitignore_with_db.tt +4 -0
- data/lib/hanami/generators/application/app/hanamirc.tt +3 -0
- data/lib/hanami/generators/application/app/lib/app_name.rb.tt +59 -0
- data/lib/hanami/generators/application/app/lib/chirp/entities/.gitkeep +1 -0
- data/lib/hanami/generators/application/app/lib/chirp/repositories/.gitkeep +1 -0
- data/lib/hanami/generators/application/app/lib/config/mapping.rb.tt +7 -0
- data/lib/hanami/generators/application/app/rspec.rspec.tt +2 -0
- data/lib/hanami/generators/application/app/schema.sql.tt +0 -0
- data/lib/hanami/generators/application/app/spec_helper.rb.minitest.tt +7 -0
- data/lib/hanami/generators/application/app/spec_helper.rb.rspec.tt +104 -0
- data/lib/hanami/generators/application/app/templates/application.html.erb.tt +10 -0
- data/lib/hanami/generators/application/app/views/application_layout.rb.tt +7 -0
- data/lib/hanami/generators/application/container/.env.development.tt +3 -0
- data/lib/hanami/generators/application/container/.env.test.tt +3 -0
- data/lib/hanami/generators/application/container/.env.tt +1 -0
- data/lib/hanami/generators/application/container/.gitignore +0 -0
- data/lib/hanami/generators/application/container/.gitkeep +1 -0
- data/lib/hanami/generators/application/container/Gemfile.tt +36 -0
- data/lib/hanami/generators/application/container/Rakefile.minitest.tt +11 -0
- data/lib/hanami/generators/application/container/Rakefile.rspec.tt +6 -0
- data/lib/hanami/generators/application/container/capybara.rb.rspec.tt +8 -0
- data/lib/hanami/generators/application/container/config.ru.tt +3 -0
- data/lib/hanami/generators/application/container/config/environment.rb.tt +7 -0
- data/lib/hanami/generators/application/container/config/initializers/.gitkeep +0 -0
- data/lib/hanami/generators/application/container/db/.gitkeep +1 -0
- data/lib/hanami/generators/application/container/features_helper.rb.minitest.tt +11 -0
- data/lib/hanami/generators/application/container/features_helper.rb.rspec.tt +12 -0
- data/lib/hanami/generators/application/container/gitignore.tt +2 -0
- data/lib/hanami/generators/application/container/gitignore_with_db.tt +4 -0
- data/lib/hanami/generators/application/container/hanamirc.tt +3 -0
- data/lib/hanami/generators/application/container/lib/app_name.rb.tt +60 -0
- data/lib/hanami/generators/application/container/lib/chirp/entities/.gitkeep +1 -0
- data/lib/hanami/generators/application/container/lib/chirp/mailers/.gitkeep +0 -0
- data/lib/hanami/generators/application/container/lib/chirp/mailers/templates/.gitkeep +0 -0
- data/lib/hanami/generators/application/container/lib/chirp/repositories/.gitkeep +1 -0
- data/lib/hanami/generators/application/container/lib/config/mapping.rb.tt +7 -0
- data/lib/hanami/generators/application/container/rspec.rspec.tt +2 -0
- data/lib/hanami/generators/application/container/schema.sql.tt +0 -0
- data/lib/hanami/generators/application/container/spec_helper.rb.minitest.tt +7 -0
- data/lib/hanami/generators/application/container/spec_helper.rb.rspec.tt +104 -0
- data/lib/hanami/generators/database_config.rb +99 -0
- data/lib/hanami/generators/generatable.rb +51 -0
- data/lib/hanami/generators/generator.rb +35 -0
- data/lib/hanami/generators/mailer/mailer.rb.tt +7 -0
- data/lib/hanami/generators/mailer/mailer_spec.rb.tt +7 -0
- data/lib/hanami/generators/mailer/template.html.tt +0 -0
- data/lib/hanami/generators/mailer/template.txt.tt +0 -0
- data/lib/hanami/generators/migration/migration.rb.tt +4 -0
- data/lib/hanami/generators/model/entity.rb.tt +3 -0
- data/lib/hanami/generators/model/entity_spec.minitest.tt +5 -0
- data/lib/hanami/generators/model/entity_spec.rspec.tt +3 -0
- data/lib/hanami/generators/model/repository.rb.tt +3 -0
- data/lib/hanami/generators/model/repository_spec.minitest.tt +5 -0
- data/lib/hanami/generators/model/repository_spec.rspec.tt +3 -0
- data/lib/hanami/generators/test_framework.rb +42 -0
- data/lib/hanami/hanamirc.rb +152 -0
- data/lib/hanami/loader.rb +258 -0
- data/lib/hanami/mailer/glue.rb +68 -0
- data/lib/hanami/middleware.rb +143 -0
- data/lib/hanami/rake_helper.rb +68 -0
- data/lib/hanami/rake_tasks.rb +2 -0
- data/lib/hanami/rendering_policy.rb +77 -0
- data/lib/hanami/repositories/car_repository.rb +3 -0
- data/lib/hanami/repositories/name_repository.rb +3 -0
- data/lib/hanami/root.rb +7 -0
- data/lib/hanami/routes.rb +151 -0
- data/lib/hanami/routing/default.rb +25 -0
- data/lib/hanami/setup.rb +3 -0
- data/lib/hanami/static.rb +77 -0
- data/lib/hanami/templates/default.html.erb +9 -0
- data/lib/hanami/templates/welcome.html.erb +52 -0
- data/lib/hanami/version.rb +4 -1
- data/lib/hanami/views/default.rb +34 -0
- data/lib/hanami/views/default_template_finder.rb +20 -0
- data/lib/hanami/views/null_view.rb +17 -0
- data/lib/hanami/welcome.rb +40 -0
- metadata +357 -16
- data/.gitignore +0 -9
- data/Gemfile +0 -4
- data/Rakefile +0 -2
- data/bin/console +0 -14
- data/bin/setup +0 -8
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
require 'hanami/utils/basic_object'
|
|
2
|
+
|
|
3
|
+
module Hanami::Mailer
|
|
4
|
+
# @since 0.5.0
|
|
5
|
+
# @api private
|
|
6
|
+
class Delivery < ::Hanami::Utils::BasicObject
|
|
7
|
+
# @since 0.5.0
|
|
8
|
+
# @api private
|
|
9
|
+
def initialize(env, &blk)
|
|
10
|
+
@env = env
|
|
11
|
+
instance_eval(&blk)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# @since 0.5.0
|
|
15
|
+
# @api private
|
|
16
|
+
def to_config
|
|
17
|
+
@config
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# @since 0.5.0
|
|
21
|
+
# @api private
|
|
22
|
+
def test(*args)
|
|
23
|
+
__setup_config(:test, *args)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
# @since 0.5.0
|
|
29
|
+
# @api private
|
|
30
|
+
def method_missing(m, *args)
|
|
31
|
+
__setup_config(m, *args)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# @since 0.5.0
|
|
35
|
+
# @api private
|
|
36
|
+
def __setup_config(env, *args)
|
|
37
|
+
if env.to_s == @env
|
|
38
|
+
@config = args
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
# @since 0.5.0
|
|
45
|
+
# @api private
|
|
46
|
+
module Glue
|
|
47
|
+
|
|
48
|
+
# @since 0.5.0
|
|
49
|
+
# @api private
|
|
50
|
+
def delivery(&blk)
|
|
51
|
+
raise ArgumentError unless block_given?
|
|
52
|
+
delivery_method(*Hanami::Mailer::Delivery.new(Hanami.env, &blk).to_config)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
Configuration.class_eval do
|
|
57
|
+
include Glue
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# @since 0.5.0
|
|
62
|
+
# @api private
|
|
63
|
+
module Mailers
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
Hanami::Mailer.configure do
|
|
67
|
+
namespace Mailers
|
|
68
|
+
end
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
module Hanami
|
|
2
|
+
# Rack middleware stack for an application
|
|
3
|
+
#
|
|
4
|
+
# @since 0.1.0
|
|
5
|
+
# @api private
|
|
6
|
+
class Middleware
|
|
7
|
+
# Instantiate a middleware stack
|
|
8
|
+
#
|
|
9
|
+
# @param configuration [Hanami::Configuration] the application's configuration
|
|
10
|
+
#
|
|
11
|
+
# @return [Hanami::Middleware] the new stack
|
|
12
|
+
#
|
|
13
|
+
# @since 0.1.0
|
|
14
|
+
# @api private
|
|
15
|
+
#
|
|
16
|
+
# @see Hanami::Configuration
|
|
17
|
+
def initialize(configuration)
|
|
18
|
+
@stack = []
|
|
19
|
+
@configuration = configuration
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Load the middleware stack
|
|
23
|
+
#
|
|
24
|
+
# @param application [Hanami::Application] the application loading the middleware
|
|
25
|
+
#
|
|
26
|
+
# @return [Hanami::Middleware] the loaded middleware stack
|
|
27
|
+
#
|
|
28
|
+
# @since 0.2.0
|
|
29
|
+
# @api private
|
|
30
|
+
#
|
|
31
|
+
# @see http://rdoc.info/gems/rack/Rack/Builder
|
|
32
|
+
def load!(application, namespace)
|
|
33
|
+
@namespace = namespace
|
|
34
|
+
@builder = ::Rack::Builder.new
|
|
35
|
+
load_default_stack(application)
|
|
36
|
+
@stack.each { |m, args, block| @builder.use load_middleware(m), *args, &block }
|
|
37
|
+
@builder.run application.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::Middleware#prepend
|
|
66
|
+
def use(middleware, *args, &blk)
|
|
67
|
+
@stack.push [middleware, args, blk]
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Prepend a middleware to the stack.
|
|
71
|
+
#
|
|
72
|
+
# @param middleware [Object] a Rack middleware
|
|
73
|
+
# @param args [Array] optional arguments to pass to the Rack middleware
|
|
74
|
+
# @param blk [Proc] an optional block to pass to the Rack middleware
|
|
75
|
+
#
|
|
76
|
+
# @return [Array] the middleware that was added
|
|
77
|
+
#
|
|
78
|
+
# @since 0.6.0
|
|
79
|
+
#
|
|
80
|
+
# @see Hanami::Middleware#use
|
|
81
|
+
def prepend(middleware, *args, &blk)
|
|
82
|
+
@stack.unshift [middleware, args, blk]
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# @api private
|
|
86
|
+
# @since 0.2.0
|
|
87
|
+
def load_middleware(middleware)
|
|
88
|
+
case middleware
|
|
89
|
+
when String
|
|
90
|
+
@namespace.const_get(middleware)
|
|
91
|
+
else
|
|
92
|
+
middleware
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# @api private
|
|
97
|
+
# @since 0.2.0
|
|
98
|
+
def load_default_stack(application)
|
|
99
|
+
@default_stack_loaded ||= begin
|
|
100
|
+
_load_assets_middleware
|
|
101
|
+
_load_session_middleware
|
|
102
|
+
_load_default_welcome_page_for(application)
|
|
103
|
+
use Rack::MethodOverride
|
|
104
|
+
|
|
105
|
+
true
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# Default welcome page
|
|
110
|
+
#
|
|
111
|
+
# @api private
|
|
112
|
+
# @since 0.2.0
|
|
113
|
+
def _load_default_welcome_page_for(application)
|
|
114
|
+
unless Hanami.env?(:test) || application.routes.defined?
|
|
115
|
+
require 'hanami/welcome'
|
|
116
|
+
use Hanami::Welcome
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# Add session middleware
|
|
121
|
+
#
|
|
122
|
+
# @api private
|
|
123
|
+
# @since 0.2.0
|
|
124
|
+
def _load_session_middleware
|
|
125
|
+
if @configuration.sessions.enabled?
|
|
126
|
+
prepend(*@configuration.sessions.middleware)
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
# Use static assets middleware
|
|
131
|
+
#
|
|
132
|
+
# @api private
|
|
133
|
+
# @since 0.6.0
|
|
134
|
+
def _load_assets_middleware
|
|
135
|
+
env = Hanami.environment
|
|
136
|
+
|
|
137
|
+
if !env.container? && env.serve_static_assets?
|
|
138
|
+
require 'hanami/static'
|
|
139
|
+
use Hanami::Static
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
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
|
+
def install
|
|
20
|
+
desc "Preload project configuration"
|
|
21
|
+
task :preload do
|
|
22
|
+
require 'hanami/environment'
|
|
23
|
+
Hanami::Environment.new
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
desc "Load the full project"
|
|
27
|
+
task environment: :preload do
|
|
28
|
+
require Hanami::Environment.new.env_config
|
|
29
|
+
Hanami::Application.preload_applications!
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Ruby ecosystem compatibility
|
|
33
|
+
#
|
|
34
|
+
# Most of the SaaS automatic tasks are designed after Ruby on Rails.
|
|
35
|
+
# They expect the following Rake tasks to be present:
|
|
36
|
+
#
|
|
37
|
+
# * db:migrate
|
|
38
|
+
# * assets:precompile
|
|
39
|
+
#
|
|
40
|
+
# See https://github.com/heroku/heroku-buildpack-ruby/issues/442
|
|
41
|
+
#
|
|
42
|
+
# ===
|
|
43
|
+
#
|
|
44
|
+
# These Rake tasks aren't listed when someone runs `rake -T`, because we
|
|
45
|
+
# want to encourage developers to use `hanami` commands.
|
|
46
|
+
#
|
|
47
|
+
# In order to migrate the database or precompile assets a developer should
|
|
48
|
+
# use:
|
|
49
|
+
#
|
|
50
|
+
# * hanami db migrate
|
|
51
|
+
# * hanami assets precompile
|
|
52
|
+
#
|
|
53
|
+
# This is the preferred way to run Hanami command line tasks.
|
|
54
|
+
# Please use them when you're in control of your deployment environment.
|
|
55
|
+
namespace :db do
|
|
56
|
+
task :migrate do
|
|
57
|
+
system "bundle exec hanami db migrate"
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
namespace :assets do
|
|
62
|
+
task :precompile do
|
|
63
|
+
system "bundle exec hanami assets precompile"
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
require 'hanami/utils/class'
|
|
2
|
+
require 'hanami/views/default'
|
|
3
|
+
require 'hanami/views/null_view'
|
|
4
|
+
|
|
5
|
+
module Hanami
|
|
6
|
+
# Rendering policy
|
|
7
|
+
#
|
|
8
|
+
# @since 0.1.0
|
|
9
|
+
# @api private
|
|
10
|
+
class RenderingPolicy
|
|
11
|
+
STATUS = 0
|
|
12
|
+
HEADERS = 1
|
|
13
|
+
BODY = 2
|
|
14
|
+
|
|
15
|
+
HANAMI_ACTION = 'hanami.action'.freeze
|
|
16
|
+
|
|
17
|
+
SUCCESSFUL_STATUSES = (200..201).freeze
|
|
18
|
+
RENDERABLE_FORMATS = [:all, :html].freeze
|
|
19
|
+
|
|
20
|
+
def initialize(configuration)
|
|
21
|
+
@controller_pattern = %r{#{ configuration.controller_pattern.gsub(/\%\{(controller|action)\}/) { "(?<#{ $1 }>(.*))" } }}
|
|
22
|
+
@view_pattern = configuration.view_pattern
|
|
23
|
+
@namespace = configuration.namespace
|
|
24
|
+
@templates = configuration.templates
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def render(env, response)
|
|
28
|
+
body = _render(env, response)
|
|
29
|
+
|
|
30
|
+
response[BODY] = Array(body) unless body.nil? || body.respond_to?(:each)
|
|
31
|
+
response
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
def _render(env, response)
|
|
36
|
+
if action = renderable?(env)
|
|
37
|
+
_render_action(action, response) ||
|
|
38
|
+
_render_status_page(action, response)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def _render_action(action, response)
|
|
43
|
+
if successful?(response)
|
|
44
|
+
view_for(action, response).render(
|
|
45
|
+
action.exposures
|
|
46
|
+
)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def _render_status_page(action, response)
|
|
51
|
+
if render_status_page?(action, response)
|
|
52
|
+
Hanami::Views::Default.render(@templates, response[STATUS], response: response, format: :html)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def renderable?(env)
|
|
57
|
+
((action = env.delete(HANAMI_ACTION)) && action.renderable? ) and action
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def successful?(response)
|
|
61
|
+
SUCCESSFUL_STATUSES.include?(response[STATUS])
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def render_status_page?(action, response)
|
|
65
|
+
RENDERABLE_FORMATS.include?(action.format)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def view_for(action, response)
|
|
69
|
+
if response[BODY].respond_to?(:empty?) && response[BODY].empty?
|
|
70
|
+
captures = @controller_pattern.match(action.class.name)
|
|
71
|
+
Utils::Class.load!(@view_pattern % { controller: captures[:controller], action: captures[:action] }, @namespace)
|
|
72
|
+
else
|
|
73
|
+
Views::NullView.new(response[BODY])
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
data/lib/hanami/root.rb
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
require 'hanami/utils/escape'
|
|
2
|
+
|
|
3
|
+
module Hanami
|
|
4
|
+
# Routes factory
|
|
5
|
+
#
|
|
6
|
+
# A Hanami application has this factory instantiated by default and associated
|
|
7
|
+
# to the `Routes` constant, under the application namespace.
|
|
8
|
+
#
|
|
9
|
+
# @since 0.1.0
|
|
10
|
+
class Routes
|
|
11
|
+
# Initialize the factory
|
|
12
|
+
#
|
|
13
|
+
# @param routes [Hanami::Router] a routes set
|
|
14
|
+
#
|
|
15
|
+
# @return [Hanami::Routes] the factory
|
|
16
|
+
#
|
|
17
|
+
# @since 0.1.0
|
|
18
|
+
def initialize(routes)
|
|
19
|
+
@routes = routes
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Return a relative path for the given route name
|
|
23
|
+
#
|
|
24
|
+
# @param name [Symbol] the route name
|
|
25
|
+
# @param args [Array,nil] an optional set of arguments that is passed down
|
|
26
|
+
# to the wrapped route set.
|
|
27
|
+
#
|
|
28
|
+
# @return [Hanami::Utils::Escape::SafeString] the corresponding relative URL
|
|
29
|
+
#
|
|
30
|
+
# @raise Hanami::Routing::InvalidRouteException
|
|
31
|
+
#
|
|
32
|
+
# @since 0.1.0
|
|
33
|
+
#
|
|
34
|
+
# @see http://rdoc.info/gems/hanami-router/Hanami/Router#path-instance_method
|
|
35
|
+
#
|
|
36
|
+
# @example Basic example
|
|
37
|
+
# require 'hanami'
|
|
38
|
+
#
|
|
39
|
+
# module Bookshelf
|
|
40
|
+
# class Application < Hanami::Application
|
|
41
|
+
# configure do
|
|
42
|
+
# routes do
|
|
43
|
+
# get '/login', to: 'sessions#new', as: :login
|
|
44
|
+
# end
|
|
45
|
+
# end
|
|
46
|
+
# end
|
|
47
|
+
# end
|
|
48
|
+
#
|
|
49
|
+
# Bookshelf::Routes.path(:login)
|
|
50
|
+
# # => '/login'
|
|
51
|
+
#
|
|
52
|
+
# Bookshelf::Routes.path(:login, return_to: '/dashboard')
|
|
53
|
+
# # => '/login?return_to=%2Fdashboard'
|
|
54
|
+
#
|
|
55
|
+
# @example Dynamic finders
|
|
56
|
+
# require 'hanami'
|
|
57
|
+
#
|
|
58
|
+
# module Bookshelf
|
|
59
|
+
# class Application < Hanami::Application
|
|
60
|
+
# configure do
|
|
61
|
+
# routes do
|
|
62
|
+
# get '/login', to: 'sessions#new', as: :login
|
|
63
|
+
# end
|
|
64
|
+
# end
|
|
65
|
+
# end
|
|
66
|
+
# end
|
|
67
|
+
#
|
|
68
|
+
# Bookshelf::Routes.login_path
|
|
69
|
+
# # => '/login'
|
|
70
|
+
#
|
|
71
|
+
# Bookshelf::Routes.login_path(return_to: '/dashboard')
|
|
72
|
+
# # => '/login?return_to=%2Fdashboard'
|
|
73
|
+
def path(name, *args)
|
|
74
|
+
Utils::Escape::SafeString.new(@routes.path(name, *args))
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Return an absolute path for the given route name
|
|
78
|
+
#
|
|
79
|
+
# @param name [Symbol] the route name
|
|
80
|
+
# @param args [Array,nil] an optional set of arguments that is passed down
|
|
81
|
+
# to the wrapped route set.
|
|
82
|
+
#
|
|
83
|
+
# @return [Hanami::Utils::Escape::SafeString] the corresponding absolute URL
|
|
84
|
+
#
|
|
85
|
+
# @raise Hanami::Routing::InvalidRouteException
|
|
86
|
+
#
|
|
87
|
+
# @since 0.1.0
|
|
88
|
+
#
|
|
89
|
+
# @see http://rdoc.info/gems/hanami-router/Hanami/Router#url-instance_method
|
|
90
|
+
#
|
|
91
|
+
# @example Basic example
|
|
92
|
+
# require 'hanami'
|
|
93
|
+
#
|
|
94
|
+
# module Bookshelf
|
|
95
|
+
# class Application < Hanami::Application
|
|
96
|
+
# configure do
|
|
97
|
+
# routes do
|
|
98
|
+
# scheme 'https'
|
|
99
|
+
# host 'bookshelf.org'
|
|
100
|
+
#
|
|
101
|
+
# get '/login', to: 'sessions#new', as: :login
|
|
102
|
+
# end
|
|
103
|
+
# end
|
|
104
|
+
# end
|
|
105
|
+
# end
|
|
106
|
+
#
|
|
107
|
+
# Bookshelf::Routes.url(:login)
|
|
108
|
+
# # => 'https://bookshelf.org/login'
|
|
109
|
+
#
|
|
110
|
+
# Bookshelf::Routes.url(:login, return_to: '/dashboard')
|
|
111
|
+
# # => 'https://bookshelf.org/login?return_to=%2Fdashboard'
|
|
112
|
+
#
|
|
113
|
+
# @example Dynamic finders
|
|
114
|
+
# require 'hanami'
|
|
115
|
+
#
|
|
116
|
+
# module Bookshelf
|
|
117
|
+
# class Application < Hanami::Application
|
|
118
|
+
# configure do
|
|
119
|
+
# routes do
|
|
120
|
+
# scheme 'https'
|
|
121
|
+
# host 'bookshelf.org'
|
|
122
|
+
#
|
|
123
|
+
# get '/login', to: 'sessions#new', as: :login
|
|
124
|
+
# end
|
|
125
|
+
# end
|
|
126
|
+
# end
|
|
127
|
+
# end
|
|
128
|
+
#
|
|
129
|
+
# Bookshelf::Routes.login_url
|
|
130
|
+
# # => 'https://bookshelf.org/login'
|
|
131
|
+
#
|
|
132
|
+
# Bookshelf::Routes.login_url(return_to: '/dashboard')
|
|
133
|
+
# # => 'https://bookshelf.org/login?return_to=%2Fdashboard'
|
|
134
|
+
def url(name, *args)
|
|
135
|
+
Utils::Escape::SafeString.new(@routes.url(name, *args))
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
protected
|
|
139
|
+
# @since 0.3.0
|
|
140
|
+
# @api private
|
|
141
|
+
def method_missing(m, *args)
|
|
142
|
+
named_route, type = m.to_s.split(/\_(path|url)\z/)
|
|
143
|
+
|
|
144
|
+
if type
|
|
145
|
+
public_send(type, named_route.to_sym, *args)
|
|
146
|
+
else
|
|
147
|
+
super
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|