hanami 0.7.3 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +45 -0
  3. data/FEATURES.md +27 -0
  4. data/README.md +21 -0
  5. data/hanami.gemspec +11 -12
  6. data/lib/hanami.rb +1 -0
  7. data/lib/hanami/action/csrf_protection.rb +11 -2
  8. data/lib/hanami/application.rb +9 -4
  9. data/lib/hanami/application_name.rb +11 -8
  10. data/lib/hanami/assets/asset.rb +69 -0
  11. data/lib/hanami/assets/static.rb +108 -0
  12. data/lib/hanami/cli.rb +51 -26
  13. data/lib/hanami/cli_base.rb +31 -0
  14. data/lib/hanami/cli_sub_commands/assets.rb +2 -1
  15. data/lib/hanami/cli_sub_commands/db.rb +15 -14
  16. data/lib/hanami/cli_sub_commands/destroy.rb +13 -6
  17. data/lib/hanami/cli_sub_commands/generate.rb +10 -9
  18. data/lib/hanami/commands/generate/abstract.rb +3 -5
  19. data/lib/hanami/commands/generate/action.rb +59 -32
  20. data/lib/hanami/commands/generate/app.rb +8 -4
  21. data/lib/hanami/commands/generate/mailer.rb +2 -2
  22. data/lib/hanami/commands/generate/migration.rb +2 -2
  23. data/lib/hanami/commands/generate/model.rb +11 -5
  24. data/lib/hanami/commands/new/abstract.rb +14 -11
  25. data/lib/hanami/commands/new/app.rb +13 -15
  26. data/lib/hanami/commands/new/container.rb +16 -16
  27. data/lib/hanami/commands/server.rb +131 -55
  28. data/lib/hanami/config/logger.rb +200 -0
  29. data/lib/hanami/config/security.rb +59 -1
  30. data/lib/hanami/configuration.rb +14 -19
  31. data/lib/hanami/container.rb +20 -8
  32. data/lib/hanami/environment.rb +40 -20
  33. data/lib/hanami/frameworks.rb +1 -0
  34. data/lib/hanami/generators/app/application.rb.tt +79 -4
  35. data/lib/hanami/generators/app/config/routes.rb.tt +4 -1
  36. data/lib/hanami/generators/app/templates/application.html.haml.tt +7 -0
  37. data/lib/hanami/generators/app/templates/application.html.slim.tt +8 -0
  38. data/lib/hanami/generators/application/app/.env.development.tt +1 -1
  39. data/lib/hanami/generators/application/app/.env.test.tt +1 -1
  40. data/lib/hanami/generators/application/app/Gemfile.tt +21 -3
  41. data/lib/hanami/generators/application/app/Rakefile.minitest.tt +1 -0
  42. data/lib/hanami/generators/application/app/Rakefile.rspec.tt +6 -3
  43. data/lib/hanami/generators/application/app/config/application.rb.tt +81 -4
  44. data/lib/hanami/generators/application/app/config/environment.rb.tt +0 -1
  45. data/lib/hanami/generators/application/app/config/routes.rb.tt +4 -1
  46. data/lib/hanami/generators/application/app/hanamirc.tt +2 -1
  47. data/lib/hanami/generators/application/app/lib/app_name.rb.tt +5 -8
  48. data/lib/hanami/generators/application/app/spec_helper.rb.rspec.tt +2 -2
  49. data/lib/hanami/generators/application/app/templates/application.html.haml.tt +7 -0
  50. data/lib/hanami/generators/application/app/templates/application.html.slim.tt +8 -0
  51. data/lib/hanami/generators/application/container/.env.development.tt +1 -1
  52. data/lib/hanami/generators/application/container/.env.test.tt +1 -1
  53. data/lib/hanami/generators/application/container/Gemfile.tt +21 -2
  54. data/lib/hanami/generators/application/container/Rakefile.minitest.tt +1 -0
  55. data/lib/hanami/generators/application/container/Rakefile.rspec.tt +6 -3
  56. data/lib/hanami/generators/application/container/config/environment.rb.tt +1 -2
  57. data/lib/hanami/generators/application/container/gitignore_with_db.tt +2 -2
  58. data/lib/hanami/generators/application/container/hanamirc.tt +2 -1
  59. data/lib/hanami/generators/application/container/lib/{app_name.rb.tt → project.rb.tt} +11 -14
  60. data/lib/hanami/generators/application/container/spec_helper.rb.rspec.tt +2 -2
  61. data/lib/hanami/generators/generatable.rb +5 -0
  62. data/lib/hanami/generators/generator.rb +10 -1
  63. data/lib/hanami/generators/template_engine.rb +30 -0
  64. data/lib/hanami/hanamirc.rb +55 -22
  65. data/lib/hanami/loader.rb +8 -9
  66. data/lib/hanami/middleware.rb +15 -4
  67. data/lib/hanami/rake_helper.rb +2 -2
  68. data/lib/hanami/rendering_policy.rb +16 -16
  69. data/lib/hanami/routes.rb +66 -0
  70. data/lib/hanami/server.rb +85 -0
  71. data/lib/hanami/static.rb +45 -71
  72. data/lib/hanami/templates/default.html.erb +22 -1
  73. data/lib/hanami/templates/welcome.html.erb +2 -2
  74. data/lib/hanami/version.rb +2 -2
  75. data/lib/hanami/views/default.rb +1 -1
  76. data/lib/hanami/views/null_view.rb +1 -5
  77. metadata +35 -44
  78. data/lib/hanami/generators/application/app/.env.tt +0 -1
  79. data/lib/hanami/generators/application/app/lib/config/mapping.rb.tt +0 -7
  80. data/lib/hanami/generators/application/container/.env.tt +0 -1
  81. data/lib/hanami/generators/application/container/lib/config/mapping.rb.tt +0 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9f690b4641c733251f086db66182a3412f5cbe45
4
- data.tar.gz: 47ca659b5da14141c6cd363bae90817334aef305
3
+ metadata.gz: e5372a7522c384925f3944349192e57986d50d80
4
+ data.tar.gz: 04e0cce2379b2c6a715a4651bcb20fc95283f193
5
5
  SHA512:
6
- metadata.gz: ae9e8b1894ad22e6b8b8760ac07ec102bb01d4164424d509540d8364dfbe3695b7588c7dc5ec0665bfdac6e71cd230cc4338f883dec4826a17ddda07bcc11afb
7
- data.tar.gz: 88c91f38c37c3f1d28943c3e0d1d1ceb7001f3cfaec21115693154c30a8de0e3378949cdff30e5e4a20f1ddaeb70ab699cae8c6b790aca46b2954f542fe4e0fd
6
+ metadata.gz: 873a49c091e733de1f09092484baacc97c618c3ffc6666d68890b4bed9df50d3245db8f4c9af505b14883355b3c30c19e33fdb3271bb505d1d7a0bccca4b9899
7
+ data.tar.gz: 760ba2f3f321c42cecaf25ffd2c9b25c60ccbbf79d1a9a65063eeb19f2df40902eac3f99cd5d028fffc91959976e874c740e1027e421cab2a9cb1b2d1f24787f
@@ -1,6 +1,51 @@
1
1
  # Hanami
2
2
  The web, with simplicity.
3
3
 
4
+ ## v0.8.0 - 2016-07-22
5
+ ### Added
6
+ - [Luca Guidi] Generate new projects with Subresurce Integrity enabled in production (security).
7
+ - [Luca Guidi] Include `X-XSS-Protection: 1; mode=block` in default response headers (security).
8
+ - [Luca Guidi] Include `X-Content-Type-Options: nosniff` in default response headers (security).
9
+ - [Trung Lê & Neil Matatall] Added support for Content Security Policy 1.1 and 2.0
10
+ - [Andrey Deryabin] Experimental code reloading with `entr(1)`
11
+ - [Anton Davydov] Introduced JSON logging formatter for production environment
12
+ - [Anton Davydov] Allow to set logging formatters per app and per environment
13
+ - [Anton Davydov] Allow to set logging levels per app and per environment
14
+ - [Anton Davydov] Application logging now can log to any stream: standard out, file, `IO` and `StringIO` objects.
15
+ - [Andrey Deryabin] Allow new projects to be generated with `--template` CLI argument (eg. `hanami new bookshelf --template=haml`)
16
+ - [Sean Collins] Add `--version` and `-v` for `hanami version` CLI
17
+
18
+ ### Fixed
19
+ - [Josh Bodah] Ensure consistent CLI messages
20
+ - [Andrey Morskov] Ensure consistent user experience and messages for generators
21
+ - [Luca Guidi] Fixed generators for camel case project names
22
+ - [Anton Davydov] Fixed model generator for camel case project names
23
+ - [Leonardo Saraiva] Fix `Rakefile` generation to safely ignore missing RSpec in production
24
+ - [Sean Collins] When generate an action, append routes to route file (instead of prepend)
25
+ - [Sean Collins] When an action is destroyed via CLI, ensure to remove the corresponding route
26
+ - [Bernardo Farah] Fix `require_relative` paths for nested generated actions and views unit tests
27
+ - [Anton Davydov] If database and assets Rake tasks fails, ensure to exit the process with a non-successful code
28
+ - [Luca Guidi] remove `Shotgun::Static` in favor of `Hanami::Assets::Static` for development/test and `Hanami::Static` for production
29
+ - [Alexandr Subbotin] Load initializers in alphabetical order
30
+ - [Matt McFarland] Fix server side error when CSRF token is not sent
31
+ - [Erol Fornoles] Fix route generations for mounted apps
32
+ - [Mahesh] Fix destroy action for application architecture
33
+ - [Karim Tarek & akhramov] Reference rendering errors in Rack env's `rack.exception` variable. This enables compatibility with exception reporting SaaS.
34
+ - [Luca Guidi] Detect assets dependencies changes in development (Sass/SCSS)
35
+ - [Luca Guidi & Lucas Amorim] Make model generator not dependendent on the current directory name, but to the project name stored in `.hanamirc`
36
+
37
+ ### Changed
38
+ – [Luca Guidi] Drop support for Ruby 2.0 and 2.1
39
+ - [Trung Lê] Database env var is now `DATABASE_URL` (without the project name prefix like `BOOKSHELF_DATABASE_URL`
40
+ - [Trung Lê] `lib/config/mapping.rb` is no longer generated for new projects and no longer loaded.
41
+ - [Anton Davydov] New generated projects will depend (in their `Gemfile`) on `hanami` tiny version (`~> 0.8'`) instead of patch version (`0.8.0`)
42
+ - [Andrey Deryabin] `dotenv` is now a soft dependency that will be added to the `Gemfile` `:development` and `:test` groups for new generated projects.
43
+ - [Andrey Deryabin] `shotgun` is now a soft dependency that will be added to the `Gemfile` `:development` group for new generated projects.
44
+ - [Anton Davydov] New logo in welcome page
45
+ - [Ozawa Sakuro] Remove `require 'rubygems'` from generated code (projects, apps, routes, etc..)
46
+ - [Eric Freese] Disable Ruby warnings in generated `Rakefile` for Minitest/RSpec tasks
47
+ - [Luca Guidi] Allow views to render any HTTP status code. In actions use `halt(422)` for default status page or `self.status = 422` for view rendering.
48
+
4
49
  ## v0.7.3 - 2016-05-23
5
50
  ### Fixed
6
51
  - [Pascal Betz] Use `Shotgun::Static` to serve static files in development mode and avoid to reload the env
@@ -3,8 +3,35 @@
3
3
 
4
4
  ## Features
5
5
 
6
+ ## v0.8.0 - 2016-07-22
7
+
8
+ - New validation syntax based on predicates
9
+ - Custom and shared predicates for validations
10
+ - High level rules for validations
11
+ - Validations error messages with I18n support (via optional `i18n` gem)
12
+ - Mount applications in subdomains
13
+ - Added support for Content Security Policy 1.1 and 2.0
14
+ - Subresurce Integrity
15
+ - Include `X-Content-Type-Options` and `X-XSS-Protection` in default response headers
16
+ - Support for several JSON engines (via optional `multi_json` gem)
17
+ - JSON Logging for production
18
+ - Per environment logging levels, stream (file, stdout), formatters
19
+ - Introduced `#local` for views, layouts and templates to safely access locals by avoiding `nil` values
20
+ - Added `datalist` form helper
21
+ - CC and BCC support for mailers
22
+ - Experimental code reloading via `entr(1)`
23
+ - CLI: `hanami new` can be used with `--template` argument to generate a new project with (`erb`/`haml`/`slim`) templates
24
+
25
+ ## v0.7.3 - 2016-05-23
26
+
27
+ ## v0.7.2 - 2016-02-09
28
+
29
+ ## v0.7.1 - 2016-02-05
30
+
6
31
  ## v0.7.0 - 2016-01-22
7
32
 
33
+ - Renamed from Lotus to Hanami
34
+
8
35
  ## v0.6.1 - 2016-01-19
9
36
 
10
37
  ## v0.6.0 - 2016-01-12
data/README.md CHANGED
@@ -19,6 +19,14 @@ Hanami combines small yet powerful frameworks:
19
19
  These components are designed to be used independently or together in a Hanami application.
20
20
  If you aren't familiar with them, please take time to go through their READMEs.
21
21
 
22
+ ## Donations
23
+
24
+ You can give back to Open Source, by supporting Hanami development via a [donation](https://salt.bountysource.com/teams/hanami). :green_heart:
25
+
26
+ ### Supporters
27
+
28
+ * [James Carlson](https://github.com/jxxcarlson)
29
+
22
30
  ## Status
23
31
 
24
32
  [![Gem Version](https://badge.fury.io/rb/hanami.svg)](http://badge.fury.io/rb/hanami)
@@ -91,6 +99,19 @@ This Code of Conduct is adapted from the Contributor Covenant, version 1.1.0, av
91
99
  4. Push to the branch (`git push origin my-new-feature`)
92
100
  5. Create a new Pull Request
93
101
 
102
+ ### How To Use Hanami HEAD
103
+
104
+ If you want to test Hanami HEAD to try a new feature or to test a bug fix here how to do:
105
+
106
+ ```
107
+ git clone https://github.com/hanami/hanami.git
108
+ cd hanami && bundle
109
+ bundle exec hanami new --hanami-head=true bookshelf
110
+ cd bookshelf
111
+ vim Gemfile # edit with: gem 'hanami', path: '..'
112
+ bundle
113
+ ```
114
+
94
115
  ## Versioning
95
116
 
96
117
  __Hanami__ uses [Semantic Versioning 2.0.0](http://semver.org)
@@ -17,19 +17,18 @@ Gem::Specification.new do |spec|
17
17
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
18
  spec.test_files = spec.files.grep(%r{^(test)/})
19
19
  spec.require_paths = ['lib']
20
- spec.required_ruby_version = '>= 2.0.0'
20
+ spec.required_ruby_version = '>= 2.2.0'
21
21
 
22
- spec.add_dependency 'hanami-utils', '~> 0.7'
23
- spec.add_dependency 'hanami-router', '~> 0.6'
24
- spec.add_dependency 'hanami-controller', '~> 0.6'
25
- spec.add_dependency 'hanami-view', '~> 0.6'
26
- spec.add_dependency 'hanami-helpers', '~> 0.3'
27
- spec.add_dependency 'hanami-mailer', '~> 0.2'
28
- spec.add_dependency 'hanami-assets', '~> 0.2'
29
- spec.add_dependency 'shotgun', '~> 0.9'
30
- spec.add_dependency 'dotenv', '~> 2.0'
31
- spec.add_dependency 'thor', '~> 0.19'
32
- spec.add_dependency 'bundler', '~> 1.6'
22
+ spec.add_dependency 'hanami-utils', '~> 0.8'
23
+ spec.add_dependency 'hanami-validations', '~> 0.6'
24
+ spec.add_dependency 'hanami-router', '~> 0.7'
25
+ spec.add_dependency 'hanami-controller', '~> 0.7'
26
+ spec.add_dependency 'hanami-view', '~> 0.7'
27
+ spec.add_dependency 'hanami-helpers', '~> 0.4'
28
+ spec.add_dependency 'hanami-mailer', '~> 0.3'
29
+ spec.add_dependency 'hanami-assets', '~> 0.3'
30
+ spec.add_dependency 'thor', '~> 0.19'
31
+ spec.add_dependency 'bundler', '~> 1.6'
33
32
 
34
33
  spec.add_development_dependency 'minispec-metadata', '~> 3.2.1'
35
34
  spec.add_development_dependency 'minitest', '~> 5'
@@ -2,6 +2,7 @@ require 'hanami/version'
2
2
  require 'hanami/application'
3
3
  require 'hanami/container'
4
4
  require 'hanami/environment'
5
+ require 'hanami/server'
5
6
 
6
7
  # A complete web framework for Ruby
7
8
  #
@@ -128,8 +128,17 @@ module Hanami
128
128
  # @since 0.4.0
129
129
  # @api private
130
130
  def invalid_csrf_token?
131
- verify_csrf_token? &&
132
- ! ::Rack::Utils.secure_compare(session[CSRF_TOKEN], params[CSRF_TOKEN])
131
+ return false unless verify_csrf_token?
132
+
133
+ missing_csrf_token? ||
134
+ !::Rack::Utils.secure_compare(session[CSRF_TOKEN], params[CSRF_TOKEN])
135
+ end
136
+
137
+ # Verify the CSRF token was passed in params.
138
+ #
139
+ # @api private
140
+ def missing_csrf_token?
141
+ Hanami::Utils::Blank.blank?(params[CSRF_TOKEN])
133
142
  end
134
143
 
135
144
  # Generates a random CSRF Token
@@ -40,6 +40,10 @@ module Hanami
40
40
  end
41
41
  end
42
42
 
43
+ # @since 0.8.0
44
+ # @api private
45
+ LOCK = Mutex.new
46
+
43
47
  # Return the routes for this application
44
48
  #
45
49
  # @return [Hanami::Router] a route set
@@ -122,6 +126,9 @@ module Hanami
122
126
  end
123
127
 
124
128
  class << self
129
+ # @since 0.2.0
130
+ # @api private
131
+ @@applications = Set.new
125
132
 
126
133
  # Registry of Hanami applications in the current Ruby process
127
134
  #
@@ -130,9 +137,7 @@ module Hanami
130
137
  # @since 0.2.0
131
138
  # @api private
132
139
  def applications
133
- synchronize do
134
- @@applications ||= Set.new
135
- end
140
+ @@applications
136
141
  end
137
142
 
138
143
  # Configure the application.
@@ -238,7 +243,7 @@ module Hanami
238
243
  # @since 0.2.0
239
244
  # @api private
240
245
  def synchronize
241
- Mutex.new.synchronize do
246
+ LOCK.synchronize do
242
247
  yield
243
248
  end
244
249
  end
@@ -1,3 +1,5 @@
1
+ require 'hanami/utils/string'
2
+
1
3
  module Hanami
2
4
  # An application name.
3
5
  #
@@ -34,16 +36,20 @@ module Hanami
34
36
 
35
37
  # Returns the cleaned application name.
36
38
  #
37
- # @return [String] the santized name
39
+ # @return [String] the sanitized name
38
40
  #
39
41
  # @example
40
- # ApplicationName.new("my-App ").to_s # => "my-app"
42
+ # ApplicationName.new("my-App ").to_s # => "my_app"
41
43
  #
42
44
  # @since 0.2.1
43
45
  def to_s
44
46
  @name
45
47
  end
46
48
 
49
+ # @api private
50
+ # @since 0.8.0
51
+ alias_method :to_str, :to_s
52
+
47
53
  # Returns the application name uppercased with non-alphanumeric characters
48
54
  # as underscores.
49
55
  #
@@ -90,12 +96,9 @@ module Hanami
90
96
  # @api private
91
97
  # @since 0.2.1
92
98
  def sanitize(name)
93
- name
94
- .downcase
95
- .strip
96
- .gsub(/\s/, '_')
97
- .gsub(/_{2,}/, '_')
98
- .gsub(/-/, '_')
99
+ Utils::String.new(
100
+ name.strip
101
+ ).underscore.to_s
99
102
  end
100
103
  end
101
104
  end
@@ -0,0 +1,69 @@
1
+ module Hanami
2
+ module Assets
3
+ # Requested asset
4
+ #
5
+ # @since 0.8.0
6
+ # @api private
7
+ class Asset
8
+ # @since 0.8.0
9
+ # @api private
10
+ PUBLIC_DIRECTORY = Hanami.public_directory.join('**', '*').to_s.freeze
11
+
12
+ # @since 0.8.0
13
+ # @api private
14
+ URL_SEPARATOR = '/'.freeze
15
+
16
+ # @since 0.8.0
17
+ # @api private
18
+ attr_reader :path
19
+
20
+ # @since 0.8.0
21
+ # @api private
22
+ attr_reader :config
23
+
24
+ # @since 0.8.0
25
+ # @api private
26
+ attr_reader :original
27
+
28
+ # @since 0.8.0
29
+ # @api private
30
+ def initialize(sources, path)
31
+ @path = path
32
+ @prefix, @config = sources.find { |p, _| path.start_with?(p) }
33
+
34
+ if @prefix && @config
35
+ @original = @config.sources.find(@path.sub(@prefix, ''))
36
+ end
37
+ end
38
+
39
+ # @since 0.8.0
40
+ # @api private
41
+ def precompile?
42
+ original && config
43
+ end
44
+
45
+ # @since 0.8.0
46
+ # @api private
47
+ def exist?
48
+ return true unless original.nil?
49
+
50
+ file_path = path.tr(URL_SEPARATOR, ::File::SEPARATOR)
51
+ destination = find_asset do |a|
52
+ a.end_with?(file_path)
53
+ end
54
+
55
+ !destination.nil?
56
+ end
57
+
58
+ private
59
+
60
+ # @since 0.8.0
61
+ # @api private
62
+ def find_asset
63
+ Dir[PUBLIC_DIRECTORY].find do |asset|
64
+ yield asset unless ::File.directory?(asset)
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,108 @@
1
+ require 'hanami/static'
2
+ require 'hanami/assets/compiler'
3
+ require 'hanami/assets/asset'
4
+
5
+ # Copyright notice
6
+ #
7
+ # This file contains a method copied from Rack::Static (rack gem).
8
+ #
9
+ # Rack - Copyright (C) 2007 Christian Neukirchen
10
+ # Released under the MIT License
11
+
12
+ module Hanami
13
+ module Assets
14
+ # Serve static assets in development enviroments (development, test).
15
+ #
16
+ # While serving static assets is a role delegated in production to web
17
+ # servers (like Nginx), in development it's rare to use a web server.
18
+ # For this purpose Hanami enables this Rack middleware to serve static
19
+ # assets in development (and test) phase.
20
+ #
21
+ # The other important role of `Hanami::Assets::Static` is to lazily compile
22
+ # (or copy) the assets into the public directory.
23
+ #
24
+ # @since 0.8.0
25
+ # @api private
26
+ #
27
+ # @see Hanami::Static
28
+ class Static < Hanami::Static
29
+ # @since 0.8.0
30
+ # @api private
31
+ PATH_INFO = 'PATH_INFO'.freeze
32
+
33
+ # @since 0.8.0
34
+ # @api private
35
+ def initialize(app)
36
+ super(app, header_rules: [])
37
+ @sources = _sources_from_applications
38
+ end
39
+
40
+ # @since 0.8.0
41
+ # @api private
42
+ def call(env)
43
+ asset = Assets::Asset.new(@sources, env[PATH_INFO])
44
+
45
+ if serve?(asset)
46
+ precompile(asset)
47
+ serve(env, asset)
48
+ else
49
+ @app.call(env)
50
+ end
51
+ end
52
+
53
+ private
54
+
55
+ # @since 0.8.0
56
+ # @api private
57
+ def serve?(asset)
58
+ can_serve(asset.path) || asset.exist? || asset.precompile?
59
+ end
60
+
61
+ # @since 0.8.0
62
+ # @api private
63
+ def precompile(asset)
64
+ Hanami::Assets::Compiler.compile(asset.config, asset.original) if asset.precompile?
65
+ end
66
+
67
+ # Copyright notice
68
+ #
69
+ # This method is copied from Rack::Static#call
70
+ #
71
+ # Rack - Copyright (C) 2007 Christian Neukirchen
72
+ # Released under the MIT License
73
+ #
74
+ # @since 0.8.0
75
+ # @api private
76
+ #
77
+ # @see http://www.rubydoc.info/gems/rack/Rack%2FStatic%3Acall
78
+ def serve(env, asset)
79
+ path = asset.path
80
+ env[PATH_INFO] = (path =~ /\/$/ ? path + @index : @urls[path]) if overwrite_file_path(path)
81
+ path = env[PATH_INFO]
82
+ response = @file_server.call(env)
83
+
84
+ headers = response[1]
85
+ applicable_rules(path).each do |_, new_headers|
86
+ new_headers.each { |field, content| headers[field] = content }
87
+ end
88
+
89
+ response
90
+ end
91
+
92
+ # @since 0.8.0
93
+ # @api private
94
+ def _sources_from_applications
95
+ Hanami::Application.applications.each_with_object({}) do |application, result|
96
+ config = _assets_configuration(application)
97
+ result["#{config.prefix}/"] = config
98
+ end
99
+ end
100
+
101
+ # @since 0.8.0
102
+ # @api private
103
+ def _assets_configuration(application)
104
+ application.configuration.namespace::Assets.configuration
105
+ end
106
+ end
107
+ end
108
+ end