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.
Files changed (168) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +214 -0
  3. data/FEATURES.md +156 -0
  4. data/LICENSE.md +22 -0
  5. data/README.md +80 -15
  6. data/bin/hanami +5 -0
  7. data/hanami.gemspec +27 -12
  8. data/lib/hanami.rb +78 -2
  9. data/lib/hanami/action/csrf_protection.rb +167 -0
  10. data/lib/hanami/action/routing_helpers.rb +40 -0
  11. data/lib/hanami/application.rb +244 -0
  12. data/lib/hanami/application_name.rb +101 -0
  13. data/lib/hanami/cli.rb +119 -0
  14. data/lib/hanami/cli_sub_commands/assets.rb +29 -0
  15. data/lib/hanami/cli_sub_commands/db.rb +124 -0
  16. data/lib/hanami/cli_sub_commands/destroy.rb +102 -0
  17. data/lib/hanami/cli_sub_commands/generate.rb +127 -0
  18. data/lib/hanami/commands/assets/precompile.rb +35 -0
  19. data/lib/hanami/commands/console.rb +90 -0
  20. data/lib/hanami/commands/db/abstract.rb +19 -0
  21. data/lib/hanami/commands/db/apply.rb +14 -0
  22. data/lib/hanami/commands/db/console.rb +50 -0
  23. data/lib/hanami/commands/db/create.rb +14 -0
  24. data/lib/hanami/commands/db/drop.rb +14 -0
  25. data/lib/hanami/commands/db/migrate.rb +19 -0
  26. data/lib/hanami/commands/db/prepare.rb +14 -0
  27. data/lib/hanami/commands/db/version.rb +14 -0
  28. data/lib/hanami/commands/generate/abstract.rb +63 -0
  29. data/lib/hanami/commands/generate/action.rb +262 -0
  30. data/lib/hanami/commands/generate/app.rb +116 -0
  31. data/lib/hanami/commands/generate/mailer.rb +118 -0
  32. data/lib/hanami/commands/generate/migration.rb +63 -0
  33. data/lib/hanami/commands/generate/model.rb +96 -0
  34. data/lib/hanami/commands/new/abstract.rb +128 -0
  35. data/lib/hanami/commands/new/app.rb +116 -0
  36. data/lib/hanami/commands/new/container.rb +102 -0
  37. data/lib/hanami/commands/routes.rb +41 -0
  38. data/lib/hanami/commands/server.rb +79 -0
  39. data/lib/hanami/config/configure.rb +17 -0
  40. data/lib/hanami/config/cookies.rb +68 -0
  41. data/lib/hanami/config/framework_configuration.rb +42 -0
  42. data/lib/hanami/config/load_paths.rb +27 -0
  43. data/lib/hanami/config/mapper.rb +36 -0
  44. data/lib/hanami/config/mapping.rb +12 -0
  45. data/lib/hanami/config/routes.rb +16 -0
  46. data/lib/hanami/config/security.rb +58 -0
  47. data/lib/hanami/config/sessions.rb +97 -0
  48. data/lib/hanami/configuration.rb +1728 -0
  49. data/lib/hanami/container.rb +59 -0
  50. data/lib/hanami/environment.rb +485 -0
  51. data/lib/hanami/frameworks.rb +14 -0
  52. data/lib/hanami/generators/action/action.rb.tt +8 -0
  53. data/lib/hanami/generators/action/action_spec.minitest.tt +12 -0
  54. data/lib/hanami/generators/action/action_spec.rspec.tt +11 -0
  55. data/lib/hanami/generators/action/action_without_view.rb.tt +9 -0
  56. data/lib/hanami/generators/action/template.tt +0 -0
  57. data/lib/hanami/generators/action/view.rb.tt +5 -0
  58. data/lib/hanami/generators/action/view_spec.minitest.tt +13 -0
  59. data/lib/hanami/generators/action/view_spec.rspec.tt +12 -0
  60. data/lib/hanami/generators/app/.gitkeep.tt +1 -0
  61. data/lib/hanami/generators/app/application.rb.tt +273 -0
  62. data/lib/hanami/generators/app/config/initializers/.gitkeep +0 -0
  63. data/lib/hanami/generators/app/config/routes.rb.tt +2 -0
  64. data/lib/hanami/generators/app/favicon.ico +0 -0
  65. data/lib/hanami/generators/app/templates/application.html.erb.tt +10 -0
  66. data/lib/hanami/generators/app/views/application_layout.rb.tt +7 -0
  67. data/lib/hanami/generators/application/app/.env.development.tt +4 -0
  68. data/lib/hanami/generators/application/app/.env.test.tt +4 -0
  69. data/lib/hanami/generators/application/app/.env.tt +1 -0
  70. data/lib/hanami/generators/application/app/.gitignore +0 -0
  71. data/lib/hanami/generators/application/app/.gitkeep +1 -0
  72. data/lib/hanami/generators/application/app/Gemfile.tt +37 -0
  73. data/lib/hanami/generators/application/app/Rakefile.minitest.tt +11 -0
  74. data/lib/hanami/generators/application/app/Rakefile.rspec.tt +6 -0
  75. data/lib/hanami/generators/application/app/apps/.gitkeep.tt +1 -0
  76. data/lib/hanami/generators/application/app/capybara.rb.rspec.tt +8 -0
  77. data/lib/hanami/generators/application/app/config.ru.tt +3 -0
  78. data/lib/hanami/generators/application/app/config/application.rb.tt +270 -0
  79. data/lib/hanami/generators/application/app/config/environment.rb.tt +5 -0
  80. data/lib/hanami/generators/application/app/config/initializers/.gitkeep +0 -0
  81. data/lib/hanami/generators/application/app/config/routes.rb.tt +2 -0
  82. data/lib/hanami/generators/application/app/db/.gitkeep +1 -0
  83. data/lib/hanami/generators/application/app/favicon.ico +0 -0
  84. data/lib/hanami/generators/application/app/features_helper.rb.minitest.tt +11 -0
  85. data/lib/hanami/generators/application/app/features_helper.rb.rspec.tt +12 -0
  86. data/lib/hanami/generators/application/app/gitignore.tt +2 -0
  87. data/lib/hanami/generators/application/app/gitignore_with_db.tt +4 -0
  88. data/lib/hanami/generators/application/app/hanamirc.tt +3 -0
  89. data/lib/hanami/generators/application/app/lib/app_name.rb.tt +59 -0
  90. data/lib/hanami/generators/application/app/lib/chirp/entities/.gitkeep +1 -0
  91. data/lib/hanami/generators/application/app/lib/chirp/repositories/.gitkeep +1 -0
  92. data/lib/hanami/generators/application/app/lib/config/mapping.rb.tt +7 -0
  93. data/lib/hanami/generators/application/app/rspec.rspec.tt +2 -0
  94. data/lib/hanami/generators/application/app/schema.sql.tt +0 -0
  95. data/lib/hanami/generators/application/app/spec_helper.rb.minitest.tt +7 -0
  96. data/lib/hanami/generators/application/app/spec_helper.rb.rspec.tt +104 -0
  97. data/lib/hanami/generators/application/app/templates/application.html.erb.tt +10 -0
  98. data/lib/hanami/generators/application/app/views/application_layout.rb.tt +7 -0
  99. data/lib/hanami/generators/application/container/.env.development.tt +3 -0
  100. data/lib/hanami/generators/application/container/.env.test.tt +3 -0
  101. data/lib/hanami/generators/application/container/.env.tt +1 -0
  102. data/lib/hanami/generators/application/container/.gitignore +0 -0
  103. data/lib/hanami/generators/application/container/.gitkeep +1 -0
  104. data/lib/hanami/generators/application/container/Gemfile.tt +36 -0
  105. data/lib/hanami/generators/application/container/Rakefile.minitest.tt +11 -0
  106. data/lib/hanami/generators/application/container/Rakefile.rspec.tt +6 -0
  107. data/lib/hanami/generators/application/container/capybara.rb.rspec.tt +8 -0
  108. data/lib/hanami/generators/application/container/config.ru.tt +3 -0
  109. data/lib/hanami/generators/application/container/config/environment.rb.tt +7 -0
  110. data/lib/hanami/generators/application/container/config/initializers/.gitkeep +0 -0
  111. data/lib/hanami/generators/application/container/db/.gitkeep +1 -0
  112. data/lib/hanami/generators/application/container/features_helper.rb.minitest.tt +11 -0
  113. data/lib/hanami/generators/application/container/features_helper.rb.rspec.tt +12 -0
  114. data/lib/hanami/generators/application/container/gitignore.tt +2 -0
  115. data/lib/hanami/generators/application/container/gitignore_with_db.tt +4 -0
  116. data/lib/hanami/generators/application/container/hanamirc.tt +3 -0
  117. data/lib/hanami/generators/application/container/lib/app_name.rb.tt +60 -0
  118. data/lib/hanami/generators/application/container/lib/chirp/entities/.gitkeep +1 -0
  119. data/lib/hanami/generators/application/container/lib/chirp/mailers/.gitkeep +0 -0
  120. data/lib/hanami/generators/application/container/lib/chirp/mailers/templates/.gitkeep +0 -0
  121. data/lib/hanami/generators/application/container/lib/chirp/repositories/.gitkeep +1 -0
  122. data/lib/hanami/generators/application/container/lib/config/mapping.rb.tt +7 -0
  123. data/lib/hanami/generators/application/container/rspec.rspec.tt +2 -0
  124. data/lib/hanami/generators/application/container/schema.sql.tt +0 -0
  125. data/lib/hanami/generators/application/container/spec_helper.rb.minitest.tt +7 -0
  126. data/lib/hanami/generators/application/container/spec_helper.rb.rspec.tt +104 -0
  127. data/lib/hanami/generators/database_config.rb +99 -0
  128. data/lib/hanami/generators/generatable.rb +51 -0
  129. data/lib/hanami/generators/generator.rb +35 -0
  130. data/lib/hanami/generators/mailer/mailer.rb.tt +7 -0
  131. data/lib/hanami/generators/mailer/mailer_spec.rb.tt +7 -0
  132. data/lib/hanami/generators/mailer/template.html.tt +0 -0
  133. data/lib/hanami/generators/mailer/template.txt.tt +0 -0
  134. data/lib/hanami/generators/migration/migration.rb.tt +4 -0
  135. data/lib/hanami/generators/model/entity.rb.tt +3 -0
  136. data/lib/hanami/generators/model/entity_spec.minitest.tt +5 -0
  137. data/lib/hanami/generators/model/entity_spec.rspec.tt +3 -0
  138. data/lib/hanami/generators/model/repository.rb.tt +3 -0
  139. data/lib/hanami/generators/model/repository_spec.minitest.tt +5 -0
  140. data/lib/hanami/generators/model/repository_spec.rspec.tt +3 -0
  141. data/lib/hanami/generators/test_framework.rb +42 -0
  142. data/lib/hanami/hanamirc.rb +152 -0
  143. data/lib/hanami/loader.rb +258 -0
  144. data/lib/hanami/mailer/glue.rb +68 -0
  145. data/lib/hanami/middleware.rb +143 -0
  146. data/lib/hanami/rake_helper.rb +68 -0
  147. data/lib/hanami/rake_tasks.rb +2 -0
  148. data/lib/hanami/rendering_policy.rb +77 -0
  149. data/lib/hanami/repositories/car_repository.rb +3 -0
  150. data/lib/hanami/repositories/name_repository.rb +3 -0
  151. data/lib/hanami/root.rb +7 -0
  152. data/lib/hanami/routes.rb +151 -0
  153. data/lib/hanami/routing/default.rb +25 -0
  154. data/lib/hanami/setup.rb +3 -0
  155. data/lib/hanami/static.rb +77 -0
  156. data/lib/hanami/templates/default.html.erb +9 -0
  157. data/lib/hanami/templates/welcome.html.erb +52 -0
  158. data/lib/hanami/version.rb +4 -1
  159. data/lib/hanami/views/default.rb +34 -0
  160. data/lib/hanami/views/default_template_finder.rb +20 -0
  161. data/lib/hanami/views/null_view.rb +17 -0
  162. data/lib/hanami/welcome.rb +40 -0
  163. metadata +357 -16
  164. data/.gitignore +0 -9
  165. data/Gemfile +0 -4
  166. data/Rakefile +0 -2
  167. data/bin/console +0 -14
  168. 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,2 @@
1
+ require 'hanami/rake_helper'
2
+ Hanami::RakeHelper.install_tasks
@@ -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
@@ -0,0 +1,3 @@
1
+ class CarRepository
2
+ include Hanami::Repository
3
+ end
@@ -0,0 +1,3 @@
1
+ class NameRepository
2
+ include Hanami::Repository
3
+ end
@@ -0,0 +1,7 @@
1
+ require 'hanami/environment'
2
+
3
+ module Hanami
4
+ def self.root
5
+ Hanami::Environment.new.root
6
+ end
7
+ end
@@ -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