hanami 0.0.0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|