hanami 1.3.3 → 2.0.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +46 -22
  3. data/FEATURES.md +1 -7
  4. data/LICENSE.md +1 -1
  5. data/README.md +1 -1
  6. data/bin/hanami +5 -3
  7. data/hanami.gemspec +24 -28
  8. data/lib/hanami.rb +39 -243
  9. data/lib/hanami/application.rb +44 -176
  10. data/lib/hanami/boot.rb +6 -0
  11. data/lib/hanami/cli/commands.rb +4 -41
  12. data/lib/hanami/cli/commands/command.rb +16 -26
  13. data/lib/hanami/cli/commands/server.rb +63 -14
  14. data/lib/hanami/configuration.rb +181 -191
  15. data/lib/hanami/configuration/cookies.rb +24 -0
  16. data/lib/hanami/configuration/middleware.rb +8 -28
  17. data/lib/hanami/configuration/security.rb +141 -0
  18. data/lib/hanami/configuration/sessions.rb +50 -0
  19. data/lib/hanami/container.rb +107 -0
  20. data/lib/hanami/frameworks.rb +24 -18
  21. data/lib/hanami/routes.rb +17 -205
  22. data/lib/hanami/server.rb +5 -69
  23. data/lib/hanami/version.rb +3 -1
  24. metadata +34 -222
  25. data/lib/hanami/action/csrf_protection.rb +0 -211
  26. data/lib/hanami/action/routing_helpers.rb +0 -40
  27. data/lib/hanami/app.rb +0 -96
  28. data/lib/hanami/application_configuration.rb +0 -1495
  29. data/lib/hanami/application_name.rb +0 -108
  30. data/lib/hanami/application_namespace.rb +0 -14
  31. data/lib/hanami/assets/asset.rb +0 -72
  32. data/lib/hanami/assets/static.rb +0 -102
  33. data/lib/hanami/cli/commands/assets.rb +0 -16
  34. data/lib/hanami/cli/commands/assets/precompile.rb +0 -42
  35. data/lib/hanami/cli/commands/console.rb +0 -95
  36. data/lib/hanami/cli/commands/db.rb +0 -32
  37. data/lib/hanami/cli/commands/db/apply.rb +0 -32
  38. data/lib/hanami/cli/commands/db/console.rb +0 -44
  39. data/lib/hanami/cli/commands/db/create.rb +0 -32
  40. data/lib/hanami/cli/commands/db/drop.rb +0 -32
  41. data/lib/hanami/cli/commands/db/migrate.rb +0 -39
  42. data/lib/hanami/cli/commands/db/prepare.rb +0 -32
  43. data/lib/hanami/cli/commands/db/rollback.rb +0 -59
  44. data/lib/hanami/cli/commands/db/version.rb +0 -32
  45. data/lib/hanami/cli/commands/destroy.rb +0 -26
  46. data/lib/hanami/cli/commands/destroy/action.rb +0 -137
  47. data/lib/hanami/cli/commands/destroy/app.rb +0 -159
  48. data/lib/hanami/cli/commands/destroy/mailer.rb +0 -74
  49. data/lib/hanami/cli/commands/destroy/migration.rb +0 -51
  50. data/lib/hanami/cli/commands/destroy/model.rb +0 -84
  51. data/lib/hanami/cli/commands/generate.rb +0 -28
  52. data/lib/hanami/cli/commands/generate/action.rb +0 -321
  53. data/lib/hanami/cli/commands/generate/action/action.erb +0 -7
  54. data/lib/hanami/cli/commands/generate/action/action_spec.minitest.erb +0 -11
  55. data/lib/hanami/cli/commands/generate/action/action_spec.rspec.erb +0 -9
  56. data/lib/hanami/cli/commands/generate/action/action_without_view.erb +0 -7
  57. data/lib/hanami/cli/commands/generate/action/view.erb +0 -7
  58. data/lib/hanami/cli/commands/generate/action/view_spec.minitest.erb +0 -12
  59. data/lib/hanami/cli/commands/generate/action/view_spec.rspec.erb +0 -10
  60. data/lib/hanami/cli/commands/generate/app.rb +0 -243
  61. data/lib/hanami/cli/commands/generate/app/application.erb +0 -313
  62. data/lib/hanami/cli/commands/generate/app/favicon.ico +0 -0
  63. data/lib/hanami/cli/commands/generate/app/gitkeep.erb +0 -0
  64. data/lib/hanami/cli/commands/generate/app/layout.erb +0 -7
  65. data/lib/hanami/cli/commands/generate/app/layout_spec.minitest.erb +0 -10
  66. data/lib/hanami/cli/commands/generate/app/layout_spec.rspec.erb +0 -10
  67. data/lib/hanami/cli/commands/generate/app/routes.erb +0 -5
  68. data/lib/hanami/cli/commands/generate/app/template.erb.erb +0 -10
  69. data/lib/hanami/cli/commands/generate/app/template.haml.erb +0 -7
  70. data/lib/hanami/cli/commands/generate/app/template.slim.erb +0 -8
  71. data/lib/hanami/cli/commands/generate/mailer.rb +0 -104
  72. data/lib/hanami/cli/commands/generate/mailer/mailer.erb +0 -9
  73. data/lib/hanami/cli/commands/generate/mailer/mailer_spec.minitest.erb +0 -7
  74. data/lib/hanami/cli/commands/generate/mailer/mailer_spec.rspec.erb +0 -5
  75. data/lib/hanami/cli/commands/generate/migration.rb +0 -41
  76. data/lib/hanami/cli/commands/generate/migration/migration.erb +0 -4
  77. data/lib/hanami/cli/commands/generate/model.rb +0 -125
  78. data/lib/hanami/cli/commands/generate/model/entity.erb +0 -2
  79. data/lib/hanami/cli/commands/generate/model/entity_spec.minitest.erb +0 -5
  80. data/lib/hanami/cli/commands/generate/model/entity_spec.rspec.erb +0 -3
  81. data/lib/hanami/cli/commands/generate/model/migration.erb +0 -10
  82. data/lib/hanami/cli/commands/generate/model/repository.erb +0 -5
  83. data/lib/hanami/cli/commands/generate/model/repository_spec.minitest.erb +0 -5
  84. data/lib/hanami/cli/commands/generate/model/repository_spec.rspec.erb +0 -3
  85. data/lib/hanami/cli/commands/generate/secret.rb +0 -48
  86. data/lib/hanami/cli/commands/new.rb +0 -578
  87. data/lib/hanami/cli/commands/new/.env.development.erb +0 -3
  88. data/lib/hanami/cli/commands/new/.env.test.erb +0 -3
  89. data/lib/hanami/cli/commands/new/.gitkeep.erb +0 -0
  90. data/lib/hanami/cli/commands/new/Gemfile.erb +0 -58
  91. data/lib/hanami/cli/commands/new/README.md.erb +0 -33
  92. data/lib/hanami/cli/commands/new/config.ru.erb +0 -3
  93. data/lib/hanami/cli/commands/new/config/boot.erb +0 -2
  94. data/lib/hanami/cli/commands/new/config/environment.erb +0 -49
  95. data/lib/hanami/cli/commands/new/gitignore.erb +0 -4
  96. data/lib/hanami/cli/commands/new/gitignore_with_sqlite.erb +0 -5
  97. data/lib/hanami/cli/commands/new/hanamirc.erb +0 -3
  98. data/lib/hanami/cli/commands/new/lib/project.erb +0 -2
  99. data/lib/hanami/cli/commands/new/minitest/Rakefile.erb +0 -12
  100. data/lib/hanami/cli/commands/new/minitest/features_helper.erb +0 -11
  101. data/lib/hanami/cli/commands/new/minitest/spec_helper.erb +0 -7
  102. data/lib/hanami/cli/commands/new/rspec/Rakefile.erb +0 -9
  103. data/lib/hanami/cli/commands/new/rspec/capybara.erb +0 -8
  104. data/lib/hanami/cli/commands/new/rspec/features_helper.erb +0 -12
  105. data/lib/hanami/cli/commands/new/rspec/rspec.erb +0 -2
  106. data/lib/hanami/cli/commands/new/rspec/spec_helper.erb +0 -103
  107. data/lib/hanami/cli/commands/new/schema.sql.erb +0 -0
  108. data/lib/hanami/cli/commands/project.rb +0 -421
  109. data/lib/hanami/cli/commands/routes.rb +0 -21
  110. data/lib/hanami/cli/commands/templates.rb +0 -31
  111. data/lib/hanami/cli/commands/version.rb +0 -19
  112. data/lib/hanami/common_logger.rb +0 -93
  113. data/lib/hanami/components.rb +0 -156
  114. data/lib/hanami/components/app/assets.rb +0 -59
  115. data/lib/hanami/components/app/controller.rb +0 -74
  116. data/lib/hanami/components/app/routes.rb +0 -59
  117. data/lib/hanami/components/app/view.rb +0 -44
  118. data/lib/hanami/components/component.rb +0 -182
  119. data/lib/hanami/components/components.rb +0 -479
  120. data/lib/hanami/components/routes_inspector.rb +0 -72
  121. data/lib/hanami/config/cookies.rb +0 -69
  122. data/lib/hanami/config/framework_configuration.rb +0 -43
  123. data/lib/hanami/config/load_paths.rb +0 -46
  124. data/lib/hanami/config/mapper.rb +0 -47
  125. data/lib/hanami/config/routes.rb +0 -20
  126. data/lib/hanami/config/security.rb +0 -110
  127. data/lib/hanami/config/sessions.rb +0 -103
  128. data/lib/hanami/configuration/app.rb +0 -21
  129. data/lib/hanami/early_hints.rb +0 -129
  130. data/lib/hanami/env.rb +0 -69
  131. data/lib/hanami/environment.rb +0 -541
  132. data/lib/hanami/environment_application_configurations.rb +0 -37
  133. data/lib/hanami/hanamirc.rb +0 -169
  134. data/lib/hanami/mailer/glue.rb +0 -27
  135. data/lib/hanami/middleware_stack.rb +0 -172
  136. data/lib/hanami/rake_helper.rb +0 -78
  137. data/lib/hanami/rake_tasks.rb +0 -3
  138. data/lib/hanami/rendering_policy.rb +0 -95
  139. data/lib/hanami/routing/default.rb +0 -32
  140. data/lib/hanami/setup.rb +0 -3
  141. data/lib/hanami/static.rb +0 -63
  142. data/lib/hanami/templates/default.html.erb +0 -30
  143. data/lib/hanami/templates/welcome.html.erb +0 -52
  144. data/lib/hanami/views/default.rb +0 -37
  145. data/lib/hanami/views/default_template_finder.rb +0 -22
  146. data/lib/hanami/views/null_view.rb +0 -15
  147. data/lib/hanami/welcome.rb +0 -41
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9ec1be46fff34a0e6278e8c08a20742d87622bb24ef82b5320c7f71c9900bc6d
4
- data.tar.gz: b88a1a45b04427a79a7c7d828353bca49df12de456815d35ff84c18ff09dcda0
3
+ metadata.gz: 1c197523a333228ef0596099b121a0f3a3e02c4a5a0da3f3f4fe837e794b7cf8
4
+ data.tar.gz: 5a7526ef47fc6f64ebffdae725d26a17944e390274dbc478ff52d593c7ba63b9
5
5
  SHA512:
6
- metadata.gz: 97ff7cbc39b2dca8623431ff84024f854d504618742035242f3ee6ca84af419ba6126812e2e7316f4cb1025f1b5be1b0f383ea7c9acc4947a726c4012e301ec0
7
- data.tar.gz: 53c4e2fe586a644adc84a32fa8f19ea41553796e0aeb33d40e0d60185a99bb225a6809b618693e0663569acd7bd040c402928629d8a54cdc63ee9e0a55bc5df2
6
+ metadata.gz: dd55bf77935140473affae77676eae8afe042f385dee3288dd9d80729fb887899f89950f26b83e2b793161545347cdc3dab8a5f6e0915013aa333c2caf2e080d
7
+ data.tar.gz: d254599b55640e0e3a27b718c1ae7141a40662c7291e60463d9620383cc419d49f06f5c8d1712b484f50ba758b71bf3f0ae79729452243532a0769e00478af8b
@@ -1,30 +1,54 @@
1
1
  # Hanami
2
2
  The web, with simplicity.
3
3
 
4
- ## v1.3.3 - 2019-09-20
4
+ ## v2.0.0.alpha1 - 2019-01-30
5
5
  ### Added
6
- - [Gray Manley] Standardize file loading for `.env` files (see: https://github.com/bkeepers/dotenv#what-other-env-files-can-i-use)
6
+ - [Luca Guidi] Implemented from scratch `hanami version`
7
+ - [Luca Guidi] Implemented from scratch `hanami server`
8
+ - [Luca Guidi] Main configuration is opinionated: when a setting is not specified in generated code, it uses a framework default.
9
+ - [Luca Guidi] Main configuration setting `environment`: to yield env based settings (e.g. `config.environment(:production) { |c| c.logger = {...} }`)
10
+ - [Luca Guidi] Main configuration setting `base_url`: to set the base URL of the app (e.g. `config.base_url = "https://example.com"`)
11
+ - [Luca Guidi] Main configuration setting `logger`: to set the logger options (e.g. `config.logger = { level: :info, format: :json }`)
12
+ - [Luca Guidi] Main configuration setting `routes`: to set the path to routes file (e.g. `config.routes = "path/to/routes"`)
13
+ - [Luca Guidi] Main configuration setting `cookies`: to set cookies options (e.g. `config.cookies = { max_age: 300 }`)
14
+ - [Luca Guidi] Main configuration setting `sessions`: to set session options (e.g. `config.sessions = :cookie, { secret: "abc" }`)
15
+ - [Luca Guidi] Main configuration setting `default_request_format`: to set the fallback for request format (aka MIME Type) (e.g. `config.default_request_format = :json`)
16
+ - [Luca Guidi] Main configuration setting `default_response_format`: to set the default response format (aka MIME Type) (e.g. `config.default_response_format = :json`)
17
+ - [Luca Guidi] Main configuration setting `middleware` to mount Rack middleware (e.g. `config.middleware.use MyMiddleware, "argument"`)
18
+ - [Luca Guidi] Main configuration setting `security` to set security settings (see below)
19
+ - [Luca Guidi] Main configuration setting `inflections` to configure inflections (e.g. `config.inflections { |i| i.plural "virus", "viruses" }`)
20
+ - [Luca Guidi] Main configuration security setting `x_frame_options`: defaults to `"deny"` (e.g. `config.security.x_frame_options = "sameorigin"`)
21
+ - [Luca Guidi] Main configuration security setting `x_content_type_options`: defaults to `"nosniff"` (e.g. `config.security.x_content_type_options = nil`)
22
+ - [Luca Guidi] Main configuration security setting `x_xss_protection`: defaults to `"1; mode=block"` (e.g. `config.security.x_xss_protection = "1"`)
23
+ - [Luca Guidi] Main configuration security setting `content_security_policy`: defaults to `"form-action 'self'; frame-ancestors 'self'; base-uri 'self'; default-src 'none'; script-src 'self'; connect-src 'self'; img-src 'self' https: data:; style-src 'self' 'unsafe-inline' https:; font-src 'self'; object-src 'none'; plugin-types application/pdf; child-src 'self'; frame-src 'self'; media-src 'self'"`
24
+ (e.g. `config.security.content_security_policy[:style_src] += " https://my.cdn.example"` to add another source)
25
+ (e.g. `config.security.content_security_policy[:plugin_types] = nil` to override the settings)
7
26
 
8
- ### Fixed
9
- - [Alfonso Uceda & Luca Guidi] Ensure to use `:host` option when mounting an application in main router (e.g. `mount Beta::Application.new, at: "/", host: "beta.hanami.test"`)
10
-
11
- ## v1.3.2 - 2019-07-26
12
- ### Added
13
- - [Luca Guidi] Support both `hanami-validations` 1 and 2
14
-
15
- ### Fixed
16
- - [Wisnu Adi Nurcahyo] Ensure `hanami generate` syntax for Welcome page is compatible with ZSH
17
- - [Luca Guidi] Don't let `hanami` to crash when called without `bundle exec`
18
-
19
- ## v1.3.1 - 2019-01-18
20
- ### Added
21
- - [Luca Guidi] Official support for Ruby: MRI 2.6
22
- - [Luca Guidi] Support `bundler` 2.0+
23
-
24
- ### Fixed
25
- - [Aidan Coyle] Remove from app generator support for deprecated `force_ssl` setting
26
- - [Alessandro Caporrini] Remove from app generator support for deprecated `body_parsers` setting
27
- - [Daphne Rouw & Sean Collins] Make app generator to work when code in `config/enviroment.rb` uses double quotes
27
+ ### Changed
28
+ - [Luca Guidi] Drop support for Ruby: MRI 2.3, and 2.4.
29
+ - [Luca Guidi] `Hanami::Application` must be used as superclass for main application under `config/application.rb` (e.g. `Bookshelf::Application`)
30
+ - [Luca Guidi] Main configuration is available at `config/application.rb` instead of `config/enviroment.rb`
31
+ - [Luca Guidi] Removed `Hanami.configure` in favor of main application configuration (e.g. `Bookshelf::Application.config`)
32
+ - [Luca Guidi] Removed DSL syntax for main configuration (from `cookies max_age: 600` to `config.cookies = { max_age: 600 }`)
33
+ - [Luca Guidi] Per enviroment settings must be wrapped in a block (e.g. `config.enviroment(:production) { |c| c.logger = {} }`)
34
+ - [Luca Guidi] Concrete applications are no longer supported (e.g. `Web::Application` in `apps/web/application.rb`)
35
+ - [Luca Guidi] Main routes must be configured at `config/routes.rb`:
36
+ ```ruby
37
+ # frozen_string_literal: true
38
+
39
+ Hanami.application.routes do
40
+ mount :web, at: "/" do
41
+ root to: "home#index"
42
+ end
43
+
44
+ mount :admin, at: "/admin" do
45
+ root to: "home#index"
46
+ end
47
+ end
48
+ ```
49
+ - [Luca Guidi] Per application routes are no longer supported (e.g. `apps/web/config/routes.rb`)
50
+ - [Luca Guidi] Removed `shotgun` and code reloading from the core. Code reloading is implemented by `hanami-reloader` gem.
51
+ - [Luca Guidi] Removed support for `.hanamirc`
28
52
 
29
53
  ## v1.3.0 - 2018-10-24
30
54
  ### Added
@@ -3,13 +3,7 @@
3
3
 
4
4
  ## Features
5
5
 
6
- ## v1.3.3 - 2019-09-20
7
-
8
- - Standardize file loading for `.env` files (see: https://github.com/bkeepers/dotenv#what-other-env-files-can-i-use)
9
-
10
- ## v1.3.2 - 2019-07-26
11
-
12
- ## v1.3.1 - 2019-01-18
6
+ ## v2.0.0.alpha1 - 2019-01-30
13
7
 
14
8
  ## v1.3.0 - 2018-10-24
15
9
 
data/LICENSE.md CHANGED
@@ -1,4 +1,4 @@
1
- Copyright © 2014-2019 Luca Guidi
1
+ Copyright © 2014-2017 Luca Guidi
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -33,7 +33,7 @@ These components are designed to be used independently or together in a Hanami a
33
33
 
34
34
  ## Installation
35
35
 
36
- __Hanami__ supports Ruby (MRI) 2.3+
36
+ __Hanami__ supports Ruby (MRI) 2.5+
37
37
 
38
38
  ```shell
39
39
  gem install hanami
data/bin/hanami CHANGED
@@ -1,6 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
- require 'bundler'
3
- require 'hanami/cli/commands'
2
+ # frozen_string_literal: true
4
3
 
5
- ::Bundler.require(:plugins) if File.exist?(ENV["BUNDLE_GEMFILE"] || "Gemfile")
4
+ require "bundler"
5
+ require "hanami/cli/commands"
6
+
7
+ Bundler.require(*Hanami.bundler_groups) if File.exist?(ENV["BUNDLE_GEMFILE"] || "Gemfile")
6
8
  Hanami::CLI.new(Hanami::CLI::Commands).call
@@ -1,40 +1,36 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path("../lib", __FILE__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'hanami/version'
5
+ require "hanami/version"
5
6
 
6
7
  Gem::Specification.new do |spec|
7
- spec.name = 'hanami'
8
+ spec.name = "hanami"
8
9
  spec.version = Hanami::VERSION
9
- spec.authors = ['Luca Guidi']
10
- spec.email = ['me@lucaguidi.com']
11
- spec.summary = 'The web, with simplicity'
12
- spec.description = 'Hanami is a web framework for Ruby'
13
- spec.homepage = 'http://hanamirb.org'
14
- spec.license = 'MIT'
10
+ spec.authors = ["Luca Guidi"]
11
+ spec.email = ["me@lucaguidi.com"]
12
+ spec.summary = "The web, with simplicity"
13
+ spec.description = "Hanami is a web framework for Ruby"
14
+ spec.homepage = "http://hanamirb.org"
15
+ spec.license = "MIT"
15
16
 
16
17
  spec.files = `git ls-files -c -o --exclude-standard -z -- lib/* bin/* LICENSE.md README.md CODE_OF_CONDUCT.md CHANGELOG.md FEATURES.md hanami.gemspec`.split("\x0")
17
18
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
19
  spec.test_files = spec.files.grep(%r{^(test)/})
19
- spec.require_paths = ['lib']
20
- spec.required_ruby_version = '>= 2.3.0'
20
+ spec.require_paths = ["lib"]
21
+ spec.required_ruby_version = ">= 2.5.0"
21
22
 
22
- spec.metadata['allowed_push_host'] = 'https://rubygems.org'
23
+ spec.metadata["allowed_push_host"] = "https://rubygems.org"
23
24
 
24
- spec.add_dependency 'hanami-utils', '~> 1.3'
25
- spec.add_dependency 'hanami-validations', '>= 1.3', '< 3'
26
- spec.add_dependency 'hanami-router', '~> 1.3'
27
- spec.add_dependency 'hanami-controller', '~> 1.3'
28
- spec.add_dependency 'hanami-view', '~> 1.3'
29
- spec.add_dependency 'hanami-helpers', '~> 1.3'
30
- spec.add_dependency 'hanami-mailer', '~> 1.3'
31
- spec.add_dependency 'hanami-assets', '~> 1.3'
32
- spec.add_dependency 'hanami-cli', '~> 0.3'
33
- spec.add_dependency 'concurrent-ruby', '~> 1.0'
34
- spec.add_dependency 'bundler', '>= 1.6', '< 3'
25
+ spec.add_dependency "hanami-utils", "~> 2.0.alpha"
26
+ spec.add_dependency "hanami-router", "~> 2.0.alpha"
27
+ spec.add_dependency "hanami-controller", "~> 2.0.alpha"
28
+ spec.add_dependency "hanami-cli", "~> 1.0.alpha"
29
+ spec.add_dependency "dry-system", "~> 0.10"
30
+ spec.add_dependency "dry-inflector", "~> 0.1", ">= 0.1.2"
31
+ spec.add_dependency "bundler", ">= 1.16", "< 3"
35
32
 
36
- spec.add_development_dependency 'rspec', '~> 3.7'
37
- spec.add_development_dependency 'rack-test', '~> 1.1'
38
- spec.add_development_dependency 'aruba', '~> 0.14'
39
- spec.add_development_dependency 'rake', '~> 12.0'
33
+ spec.add_development_dependency "rspec", "~> 3.8"
34
+ spec.add_development_dependency "rack-test", "~> 1.1"
35
+ spec.add_development_dependency "rake", "~> 12.0"
40
36
  end
@@ -1,4 +1,4 @@
1
- require 'thread'
1
+ # frozen_string_literal: true
2
2
 
3
3
  # A complete web framework for Ruby
4
4
  #
@@ -6,277 +6,73 @@ require 'thread'
6
6
  #
7
7
  # @see http://hanamirb.org
8
8
  module Hanami
9
- require 'hanami/version'
10
- require 'hanami/frameworks'
11
- require 'hanami/environment'
12
- require 'hanami/app'
13
- require 'hanami/application'
14
- require 'hanami/components'
15
- require 'hanami/configuration'
9
+ require "hanami/version"
10
+ require "hanami/frameworks"
11
+ require "hanami/container"
12
+ require "hanami/application"
16
13
 
17
- # @api private
18
- # @since 0.6.0
19
- DEFAULT_PUBLIC_DIRECTORY = 'public'.freeze
20
-
21
- # @api private
22
- # @since 0.9.0
23
14
  @_mutex = Mutex.new
24
- @_plugins = Concurrent::Array.new
25
15
 
26
- # Configure Hanami project
27
- #
28
- # Please note that the code for this method is generated by `hanami new`.
29
- #
30
- # @param blk [Proc] the configuration block
31
- #
32
- # @since 0.9.0
33
- #
34
- # @example
35
- # # config/environment.rb
36
- #
37
- # # ...
38
- #
39
- # Hanami.configure do
40
- # mount Admin::Application, at: "/admin"
41
- # mount Web::Application, at: "/"
42
- #
43
- # model do
44
- # adapter :sql, ENV['DATABASE_URL']
45
- #
46
- # migrations "db/migrations"
47
- # schema "db/schema.sql"
48
- # end
49
- #
50
- # mailer do
51
- # root "lib/bookshelf/mailers"
52
- #
53
- # delivery do
54
- # development :test
55
- # test :test
56
- # # production :smtp, address: ENV['SMTP_HOST'], port: ENV['SMTP_PORT']
57
- # end
58
- # end
59
- # end
60
- def self.configure(&blk)
16
+ def self.application
61
17
  @_mutex.synchronize do
62
- @_configuration = Hanami::Configuration.new(&blk)
63
- end
64
- end
18
+ raise "Hanami application not configured" unless defined?(@_application)
65
19
 
66
- # Hanami configuration
67
- #
68
- # @return [Hanami::Configuration] the configuration
69
- #
70
- # @see Hanami.configure
71
- #
72
- # @since 0.9.0
73
- # @api private
74
- def self.configuration
75
- @_mutex.synchronize do
76
- raise "Hanami not configured" unless defined?(@_configuration)
77
- @_configuration
20
+ @_application
78
21
  end
79
22
  end
80
23
 
81
- # Configure a plugin
82
- #
83
- # @see Hanami.configure
84
- #
85
- # @since 1.2.0
86
- def self.plugin(&blk)
87
- @_plugins << blk
88
- end
89
-
90
- # Plugins registry
91
- #
92
- # NOTE: We can't use `Components` registry.
93
- #
94
- # Plugins are loaded when Bundler requires `Gemfile` gems.
95
- # During this phase the `Components` that we can resolve are erased by the
96
- # first incoming request in development.
97
- # They are erased by a workaround that we had to put in place in `Hanami.boot`.
98
- # This workaround is `Components.release` and it was introduced because
99
- # `shotgun` failed to reload components, so we have to release for each
100
- # incoming request.
101
- # After the `Components` registry is cleared up, Hanami is able to resolve all
102
- # the components from scratch.
103
- #
104
- # When we'll switch to `hanami-reloader` for development, we can remove
105
- # `Components.release` and we'll be able to store plugins in `Components` and
106
- # remove `Hanami.plugins` as well.
107
- #
108
- # @since 1.2.0
109
- # @api private
110
- def self.plugins
111
- @_plugins
112
- end
24
+ def self.application=(app)
25
+ @_mutex.synchronize do
26
+ raise "Hanami application already configured" if defined?(@_application)
113
27
 
114
- # Boot your Hanami project
115
- #
116
- # NOTE: In case this is invoked many times, it guarantees that the boot
117
- # process happens only once.
118
- #
119
- # NOTE: This MUST NOT be wrapped by a Mutex, because it would cause a deadlock.
120
- #
121
- # @return [NilClass]
122
- #
123
- # @since 0.9.0
124
- def self.boot
125
- Components.release if code_reloading?
126
- Components.resolve('all')
127
- Hanami::Model.disconnect if defined?(Hanami::Model)
128
- nil
28
+ @_application = app unless app.name.nil?
29
+ end
129
30
  end
130
31
 
131
- # Main application that mounts many Rack and/or Hanami applications.
132
- #
133
- # This is used as integration point for:
134
- #
135
- # * `config.ru` (`run Hanami.app`)
136
- # * Feature tests (`Capybara.app = Hanami.app`)
137
- #
138
- #
139
- #
140
- # It lazily loads your Hanami project, in case it wasn't booted on before.
141
- # This is the case when `hanami server` isn't invoked, but we use different
142
- # ways to run the project (eg. `rackup`).
143
- #
144
- # @return [Hanami::App] the app
145
- #
146
- # @since 0.9.0
147
- # @api private
148
- #
149
- # @see Hanami.boot
150
32
  def self.app
151
- boot
152
- App.new(configuration, environment)
33
+ @_mutex.synchronize do
34
+ raise "Hanami.app not configured" unless defined?(@_app)
35
+
36
+ @_app
37
+ end
153
38
  end
154
39
 
155
- # Check if an application is allowed to load.
156
- #
157
- # The list of applications to be loaded can be set via the `HANAMI_APPS`
158
- # env variable. If the HANAMI_APPS env variable is not set, it defaults
159
- # to loading all applications.
160
- #
161
- # @return [TrueClass,FalseClass] the result of the check
162
- #
163
- # @since 1.1.0
164
- #
165
- # @example
166
- #
167
- # # Mount hanami app for specific app
168
- # Hanami.configure do
169
- # if Hanami.app?(:web)
170
- # require_relative '../apps/web/application'
171
- # mount Web::Application, at: '/'
172
- # end
173
- # end
174
- #
175
- def self.app?(app)
176
- return true unless ENV.key?('HANAMI_APPS')
40
+ def self.app=(app)
41
+ @_mutex.synchronize do
42
+ raise "Hanami.app already configured" if defined?(@_app)
177
43
 
178
- allowed_apps = ENV['HANAMI_APPS'].to_s.split(',')
179
- allowed_apps.include?(app.to_s.downcase)
44
+ @_app = app
45
+ end
180
46
  end
181
47
 
182
- # Return root of the project (top level directory).
183
- #
184
- # @return [Pathname] root path
185
- #
186
- # @since 0.3.2
187
- #
188
- # @example
189
- # Hanami.root # => #<Pathname:/Users/luca/Code/bookshelf>
190
48
  def self.root
191
- environment.root
192
- end
193
-
194
- # Project public directory
195
- #
196
- # @return [Pathname] public directory
197
- #
198
- # @since 0.6.0
199
- #
200
- # @example
201
- # Hanami.public_directory # => #<Pathname:/Users/luca/Code/bookshelf/public>
202
- def self.public_directory
203
- root.join(DEFAULT_PUBLIC_DIRECTORY)
49
+ Container.root
204
50
  end
205
51
 
206
- # Return the current environment
207
- #
208
- # @return [String] the current environment
209
- #
210
- # @since 0.3.1
211
- #
212
- # @see Hanami::Environment#environment
213
- #
214
- # @example
215
- # Hanami.env => "development"
216
52
  def self.env
217
- environment.environment
53
+ (ENV["HANAMI_ENV"] || "development").to_sym
218
54
  end
219
55
 
220
- # Check to see if specified environment(s) matches the current environment.
221
- #
222
- # If multiple names are given, it returns true, if at least one of them
223
- # matches the current environment.
224
- #
225
- # @return [TrueClass,FalseClass] the result of the check
226
- #
227
- # @since 0.3.1
228
- #
229
- # @see Hanami.env
230
- #
231
- # @example Single name
232
- # puts ENV['HANAMI_ENV'] # => "development"
233
- #
234
- # Hanami.env?(:development) # => true
235
- # Hanami.env?('development') # => true
236
- #
237
- # Hanami.env?(:production) # => false
238
- #
239
- # @example Multiple names
240
- # puts ENV['HANAMI_ENV'] # => "development"
241
- #
242
- # Hanami.env?(:development, :test) # => true
243
- # Hanami.env?(:production, :staging) # => false
244
56
  def self.env?(*names)
245
- environment.environment?(*names)
57
+ names.map(&:to_sym).include?(env)
246
58
  end
247
59
 
248
- # Current environment
249
- #
250
- # @return [Hanami::Environment] environment
251
- #
252
- # @api private
253
- # @since 0.3.2
254
- def self.environment
255
- Components.resolved('environment') do
256
- Environment.new
257
- end
60
+ def self.logger
61
+ Container[:logger]
258
62
  end
259
63
 
260
- # Check if code reloading is enabled.
261
- #
262
- # @return [TrueClass,FalseClass] the result of the check
263
- #
264
- # @since 1.0.0
265
- # @api private
266
- #
267
- # @see https://guides.hanamirb.org/projects/code-reloading
268
- def self.code_reloading?
269
- environment
270
- Components.resolve('code_reloading')
271
- Components['code_reloading']
64
+ def self.boot
65
+ @_mutex.synchronize do
66
+ raise "Hanami application already booted" if defined?(@_booted)
67
+
68
+ @_booted = true
69
+ end
70
+
71
+ Container.finalize!
72
+ self.app = application.new
272
73
  end
273
74
 
274
- # Project logger
275
- #
276
- # @return [Hanami::Logger] the logger
277
- #
278
- # @since 1.0.0
279
- def self.logger
280
- Components['logger']
75
+ def self.bundler_groups
76
+ [:plugins]
281
77
  end
282
78
  end