hanami 0.7.3 → 0.8.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 +45 -0
- data/FEATURES.md +27 -0
- data/README.md +21 -0
- data/hanami.gemspec +11 -12
- data/lib/hanami.rb +1 -0
- data/lib/hanami/action/csrf_protection.rb +11 -2
- data/lib/hanami/application.rb +9 -4
- data/lib/hanami/application_name.rb +11 -8
- data/lib/hanami/assets/asset.rb +69 -0
- data/lib/hanami/assets/static.rb +108 -0
- data/lib/hanami/cli.rb +51 -26
- data/lib/hanami/cli_base.rb +31 -0
- data/lib/hanami/cli_sub_commands/assets.rb +2 -1
- data/lib/hanami/cli_sub_commands/db.rb +15 -14
- data/lib/hanami/cli_sub_commands/destroy.rb +13 -6
- data/lib/hanami/cli_sub_commands/generate.rb +10 -9
- data/lib/hanami/commands/generate/abstract.rb +3 -5
- data/lib/hanami/commands/generate/action.rb +59 -32
- data/lib/hanami/commands/generate/app.rb +8 -4
- data/lib/hanami/commands/generate/mailer.rb +2 -2
- data/lib/hanami/commands/generate/migration.rb +2 -2
- data/lib/hanami/commands/generate/model.rb +11 -5
- data/lib/hanami/commands/new/abstract.rb +14 -11
- data/lib/hanami/commands/new/app.rb +13 -15
- data/lib/hanami/commands/new/container.rb +16 -16
- data/lib/hanami/commands/server.rb +131 -55
- data/lib/hanami/config/logger.rb +200 -0
- data/lib/hanami/config/security.rb +59 -1
- data/lib/hanami/configuration.rb +14 -19
- data/lib/hanami/container.rb +20 -8
- data/lib/hanami/environment.rb +40 -20
- data/lib/hanami/frameworks.rb +1 -0
- data/lib/hanami/generators/app/application.rb.tt +79 -4
- data/lib/hanami/generators/app/config/routes.rb.tt +4 -1
- data/lib/hanami/generators/app/templates/application.html.haml.tt +7 -0
- data/lib/hanami/generators/app/templates/application.html.slim.tt +8 -0
- data/lib/hanami/generators/application/app/.env.development.tt +1 -1
- data/lib/hanami/generators/application/app/.env.test.tt +1 -1
- data/lib/hanami/generators/application/app/Gemfile.tt +21 -3
- data/lib/hanami/generators/application/app/Rakefile.minitest.tt +1 -0
- data/lib/hanami/generators/application/app/Rakefile.rspec.tt +6 -3
- data/lib/hanami/generators/application/app/config/application.rb.tt +81 -4
- data/lib/hanami/generators/application/app/config/environment.rb.tt +0 -1
- data/lib/hanami/generators/application/app/config/routes.rb.tt +4 -1
- data/lib/hanami/generators/application/app/hanamirc.tt +2 -1
- data/lib/hanami/generators/application/app/lib/app_name.rb.tt +5 -8
- data/lib/hanami/generators/application/app/spec_helper.rb.rspec.tt +2 -2
- data/lib/hanami/generators/application/app/templates/application.html.haml.tt +7 -0
- data/lib/hanami/generators/application/app/templates/application.html.slim.tt +8 -0
- data/lib/hanami/generators/application/container/.env.development.tt +1 -1
- data/lib/hanami/generators/application/container/.env.test.tt +1 -1
- data/lib/hanami/generators/application/container/Gemfile.tt +21 -2
- data/lib/hanami/generators/application/container/Rakefile.minitest.tt +1 -0
- data/lib/hanami/generators/application/container/Rakefile.rspec.tt +6 -3
- data/lib/hanami/generators/application/container/config/environment.rb.tt +1 -2
- data/lib/hanami/generators/application/container/gitignore_with_db.tt +2 -2
- data/lib/hanami/generators/application/container/hanamirc.tt +2 -1
- data/lib/hanami/generators/application/container/lib/{app_name.rb.tt → project.rb.tt} +11 -14
- data/lib/hanami/generators/application/container/spec_helper.rb.rspec.tt +2 -2
- data/lib/hanami/generators/generatable.rb +5 -0
- data/lib/hanami/generators/generator.rb +10 -1
- data/lib/hanami/generators/template_engine.rb +30 -0
- data/lib/hanami/hanamirc.rb +55 -22
- data/lib/hanami/loader.rb +8 -9
- data/lib/hanami/middleware.rb +15 -4
- data/lib/hanami/rake_helper.rb +2 -2
- data/lib/hanami/rendering_policy.rb +16 -16
- data/lib/hanami/routes.rb +66 -0
- data/lib/hanami/server.rb +85 -0
- data/lib/hanami/static.rb +45 -71
- data/lib/hanami/templates/default.html.erb +22 -1
- data/lib/hanami/templates/welcome.html.erb +2 -2
- data/lib/hanami/version.rb +2 -2
- data/lib/hanami/views/default.rb +1 -1
- data/lib/hanami/views/null_view.rb +1 -5
- metadata +35 -44
- data/lib/hanami/generators/application/app/.env.tt +0 -1
- data/lib/hanami/generators/application/app/lib/config/mapping.rb.tt +0 -7
- data/lib/hanami/generators/application/container/.env.tt +0 -1
- 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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e5372a7522c384925f3944349192e57986d50d80
|
4
|
+
data.tar.gz: 04e0cce2379b2c6a715a4651bcb20fc95283f193
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 873a49c091e733de1f09092484baacc97c618c3ffc6666d68890b4bed9df50d3245db8f4c9af505b14883355b3c30c19e33fdb3271bb505d1d7a0bccca4b9899
|
7
|
+
data.tar.gz: 760ba2f3f321c42cecaf25ffd2c9b25c60ccbbf79d1a9a65063eeb19f2df40902eac3f99cd5d028fffc91959976e874c740e1027e421cab2a9cb1b2d1f24787f
|
data/CHANGELOG.md
CHANGED
@@ -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
|
data/FEATURES.md
CHANGED
@@ -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)
|
data/hanami.gemspec
CHANGED
@@ -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.
|
20
|
+
spec.required_ruby_version = '>= 2.2.0'
|
21
21
|
|
22
|
-
spec.add_dependency 'hanami-utils',
|
23
|
-
spec.add_dependency 'hanami-
|
24
|
-
spec.add_dependency 'hanami-
|
25
|
-
spec.add_dependency 'hanami-
|
26
|
-
spec.add_dependency 'hanami-
|
27
|
-
spec.add_dependency 'hanami-
|
28
|
-
spec.add_dependency 'hanami-
|
29
|
-
spec.add_dependency '
|
30
|
-
spec.add_dependency '
|
31
|
-
spec.add_dependency '
|
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'
|
data/lib/hanami.rb
CHANGED
@@ -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
|
-
|
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
|
data/lib/hanami/application.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
39
|
+
# @return [String] the sanitized name
|
38
40
|
#
|
39
41
|
# @example
|
40
|
-
# ApplicationName.new("my-App ").to_s # => "
|
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
|
-
|
94
|
-
.
|
95
|
-
|
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
|