hanami 2.1.0.beta1 → 2.1.0.beta2.1
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +27 -4
- data/README.md +1 -1
- data/lib/hanami/app.rb +5 -0
- data/lib/hanami/config/actions.rb +4 -7
- data/lib/hanami/config/assets.rb +84 -0
- data/lib/hanami/config/null_config.rb +3 -0
- data/lib/hanami/config.rb +17 -5
- data/lib/hanami/extensions/action.rb +4 -2
- data/lib/hanami/extensions/view/standard_helpers.rb +4 -0
- data/lib/hanami/helpers/assets_helper.rb +772 -0
- data/lib/hanami/middleware/assets.rb +21 -0
- data/lib/hanami/middleware/render_errors.rb +4 -7
- data/lib/hanami/providers/assets.rb +44 -0
- data/lib/hanami/rake_tasks.rb +19 -18
- data/lib/hanami/settings.rb +1 -1
- data/lib/hanami/slice.rb +25 -4
- data/lib/hanami/version.rb +1 -1
- data/lib/hanami.rb +2 -2
- data/spec/integration/assets/assets_spec.rb +101 -0
- data/spec/integration/assets/serve_static_assets_spec.rb +152 -0
- data/spec/integration/logging/exception_logging_spec.rb +115 -0
- data/spec/integration/logging/notifications_spec.rb +68 -0
- data/spec/integration/logging/request_logging_spec.rb +128 -0
- data/spec/integration/rack_app/middleware_spec.rb +4 -4
- data/spec/integration/rack_app/rack_app_spec.rb +0 -221
- data/spec/integration/rake_tasks_spec.rb +107 -0
- data/spec/integration/view/context/assets_spec.rb +3 -9
- data/spec/integration/web/render_detailed_errors_spec.rb +17 -0
- data/spec/integration/web/render_errors_spec.rb +6 -4
- data/spec/support/app_integration.rb +46 -2
- data/spec/unit/hanami/config/actions/content_security_policy_spec.rb +24 -36
- data/spec/unit/hanami/config/actions/csrf_protection_spec.rb +4 -3
- data/spec/unit/hanami/config/actions/default_values_spec.rb +3 -2
- data/spec/unit/hanami/env_spec.rb +11 -25
- data/spec/unit/hanami/helpers/assets_helper/asset_url_spec.rb +109 -0
- data/spec/unit/hanami/helpers/assets_helper/audio_spec.rb +136 -0
- data/spec/unit/hanami/helpers/assets_helper/favicon_spec.rb +91 -0
- data/spec/unit/hanami/helpers/assets_helper/image_spec.rb +96 -0
- data/spec/unit/hanami/helpers/assets_helper/javascript_spec.rb +147 -0
- data/spec/unit/hanami/helpers/assets_helper/stylesheet_spec.rb +130 -0
- data/spec/unit/hanami/helpers/assets_helper/video_spec.rb +136 -0
- data/spec/unit/hanami/version_spec.rb +1 -1
- metadata +32 -4
- data/lib/hanami/assets/app_config.rb +0 -61
- data/lib/hanami/assets/config.rb +0 -53
@@ -0,0 +1,147 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RSpec.describe Hanami::Helpers::AssetsHelper, "#javascript", :app_integration do
|
4
|
+
subject(:obj) {
|
5
|
+
helpers = described_class
|
6
|
+
Class.new {
|
7
|
+
include helpers
|
8
|
+
|
9
|
+
attr_reader :_context
|
10
|
+
|
11
|
+
def initialize(context)
|
12
|
+
@_context = context
|
13
|
+
end
|
14
|
+
}.new(context)
|
15
|
+
}
|
16
|
+
|
17
|
+
def javascript(...)
|
18
|
+
subject.javascript(...)
|
19
|
+
end
|
20
|
+
|
21
|
+
let(:context) { TestApp::Views::Context.new }
|
22
|
+
let(:root) { make_tmp_directory }
|
23
|
+
|
24
|
+
before do
|
25
|
+
with_directory(root) do
|
26
|
+
write "config/app.rb", <<~RUBY
|
27
|
+
module TestApp
|
28
|
+
class App < Hanami::App
|
29
|
+
config.logger.stream = StringIO.new
|
30
|
+
end
|
31
|
+
end
|
32
|
+
RUBY
|
33
|
+
|
34
|
+
write "app/views/context.rb", <<~RUBY
|
35
|
+
# auto_register: false
|
36
|
+
|
37
|
+
require "hanami/view/context"
|
38
|
+
|
39
|
+
module TestApp
|
40
|
+
module Views
|
41
|
+
class Context < Hanami::View::Context
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
RUBY
|
46
|
+
|
47
|
+
write "app/assets/js/app.ts", <<~JS
|
48
|
+
import "../css/app.css";
|
49
|
+
|
50
|
+
console.log("Hello from index.ts");
|
51
|
+
JS
|
52
|
+
|
53
|
+
write "app/assets/css/app.css", <<~CSS
|
54
|
+
.btn {
|
55
|
+
background: #f00;
|
56
|
+
}
|
57
|
+
CSS
|
58
|
+
|
59
|
+
stub_assets("feature-a.js")
|
60
|
+
|
61
|
+
require "hanami/setup"
|
62
|
+
before_prepare if respond_to?(:before_prepare)
|
63
|
+
require "hanami/prepare"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
it "returns an instance of SafeString" do
|
68
|
+
actual = javascript("feature-a")
|
69
|
+
expect(actual).to be_instance_of(::Hanami::View::HTML::SafeString)
|
70
|
+
end
|
71
|
+
|
72
|
+
it "is aliased as #js" do
|
73
|
+
expect(subject.js("feature-a")).to eq javascript("feature-a")
|
74
|
+
end
|
75
|
+
|
76
|
+
it "is aliased as #javascript_tag" do
|
77
|
+
expect(subject.javascript_tag("feature-a")).to eq javascript("feature-a")
|
78
|
+
end
|
79
|
+
|
80
|
+
it "renders <script> tag" do
|
81
|
+
actual = javascript("feature-a")
|
82
|
+
expect(actual).to eq(%(<script src="/assets/feature-a.js" type="text/javascript"></script>))
|
83
|
+
end
|
84
|
+
|
85
|
+
xit "renders <script> tag without appending ext after query string" do
|
86
|
+
actual = javascript("feature-x?callback=init")
|
87
|
+
expect(actual).to eq(%(<script src="/assets/feature-x?callback=init" type="text/javascript"></script>))
|
88
|
+
end
|
89
|
+
|
90
|
+
it "renders <script> tag with a defer attribute" do
|
91
|
+
actual = javascript("feature-a", defer: true)
|
92
|
+
expect(actual).to eq(%(<script src="/assets/feature-a.js" type="text/javascript" defer="defer"></script>))
|
93
|
+
end
|
94
|
+
|
95
|
+
it "renders <script> tag with an integrity attribute" do
|
96
|
+
actual = javascript("feature-a", integrity: "sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC")
|
97
|
+
expect(actual).to eq(%(<script src="/assets/feature-a.js" type="text/javascript" integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC" crossorigin="anonymous"></script>))
|
98
|
+
end
|
99
|
+
|
100
|
+
it "renders <script> tag with a crossorigin attribute" do
|
101
|
+
actual = javascript("feature-a", integrity: "sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC", crossorigin: "use-credentials")
|
102
|
+
expect(actual).to eq(%(<script src="/assets/feature-a.js" type="text/javascript" integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC" crossorigin="use-credentials"></script>))
|
103
|
+
end
|
104
|
+
|
105
|
+
it "ignores src passed as an option" do
|
106
|
+
actual = javascript("feature-a", src: "wrong")
|
107
|
+
expect(actual).to eq(%(<script src="/assets/feature-a.js" type="text/javascript"></script>))
|
108
|
+
end
|
109
|
+
|
110
|
+
describe "async option" do
|
111
|
+
it "renders <script> tag with an async=true if async option is true" do
|
112
|
+
actual = javascript("feature-a", async: true)
|
113
|
+
expect(actual).to eq(%(<script src="/assets/feature-a.js" type="text/javascript" async="async"></script>))
|
114
|
+
end
|
115
|
+
|
116
|
+
it "renders <script> tag without an async=true if async option is false" do
|
117
|
+
actual = javascript("feature-a", async: false)
|
118
|
+
expect(actual).to eq(%(<script src="/assets/feature-a.js" type="text/javascript"></script>))
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
describe "subresource_integrity mode" do
|
123
|
+
def before_prepare
|
124
|
+
Hanami.app.config.assets.subresource_integrity = [:sha384]
|
125
|
+
end
|
126
|
+
|
127
|
+
before { compile_assets! }
|
128
|
+
|
129
|
+
it "includes subresource_integrity and crossorigin attributes" do
|
130
|
+
actual = javascript("app")
|
131
|
+
expect(actual).to match(%r{<script src="/assets/app-[A-Z0-9]{8}.js" type="text/javascript" integrity="sha384-[A-Za-z0-9+/]{64}" crossorigin="anonymous"></script>})
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
describe "cdn mode" do
|
136
|
+
let(:base_url) { "https://hanami.test" }
|
137
|
+
|
138
|
+
def before_prepare
|
139
|
+
Hanami.app.config.assets.base_url = "https://hanami.test"
|
140
|
+
end
|
141
|
+
|
142
|
+
it "returns absolute url for src attribute" do
|
143
|
+
actual = javascript("feature-a")
|
144
|
+
expect(actual).to eq(%(<script src="#{base_url}/assets/feature-a.js" type="text/javascript"></script>))
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RSpec.describe Hanami::Helpers::AssetsHelper, "#stylesheet", :app_integration do
|
4
|
+
subject(:obj) {
|
5
|
+
helpers = described_class
|
6
|
+
Class.new {
|
7
|
+
include helpers
|
8
|
+
|
9
|
+
attr_reader :_context
|
10
|
+
|
11
|
+
def initialize(context)
|
12
|
+
@_context = context
|
13
|
+
end
|
14
|
+
}.new(context)
|
15
|
+
}
|
16
|
+
|
17
|
+
def stylesheet(...)
|
18
|
+
subject.stylesheet(...)
|
19
|
+
end
|
20
|
+
|
21
|
+
let(:context) { TestApp::Views::Context.new }
|
22
|
+
let(:root) { make_tmp_directory }
|
23
|
+
|
24
|
+
before do
|
25
|
+
with_directory(root) do
|
26
|
+
write "config/app.rb", <<~RUBY
|
27
|
+
module TestApp
|
28
|
+
class App < Hanami::App
|
29
|
+
config.logger.stream = StringIO.new
|
30
|
+
end
|
31
|
+
end
|
32
|
+
RUBY
|
33
|
+
|
34
|
+
write "app/views/context.rb", <<~RUBY
|
35
|
+
# auto_register: false
|
36
|
+
|
37
|
+
require "hanami/view/context"
|
38
|
+
|
39
|
+
module TestApp
|
40
|
+
module Views
|
41
|
+
class Context < Hanami::View::Context
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
RUBY
|
46
|
+
|
47
|
+
write "app/assets/js/app.ts", <<~JS
|
48
|
+
import "../css/app.css";
|
49
|
+
|
50
|
+
console.log("Hello from index.ts");
|
51
|
+
JS
|
52
|
+
|
53
|
+
write "app/assets/css/app.css", <<~CSS
|
54
|
+
.btn {
|
55
|
+
background: #f00;
|
56
|
+
}
|
57
|
+
CSS
|
58
|
+
|
59
|
+
stub_assets("main.css")
|
60
|
+
|
61
|
+
require "hanami/setup"
|
62
|
+
before_prepare if respond_to?(:before_prepare)
|
63
|
+
require "hanami/prepare"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
it "returns an instance of SafeString" do
|
68
|
+
actual = stylesheet("main")
|
69
|
+
expect(actual).to be_instance_of(::Hanami::View::HTML::SafeString)
|
70
|
+
end
|
71
|
+
|
72
|
+
it "is aliased as #css" do
|
73
|
+
expect(subject.css("main")).to eq stylesheet("main")
|
74
|
+
end
|
75
|
+
|
76
|
+
it "is aliased as #stylesheet_link_tag" do
|
77
|
+
expect(subject.stylesheet_link_tag("main")).to eq stylesheet("main")
|
78
|
+
end
|
79
|
+
|
80
|
+
it "renders <link> tag" do
|
81
|
+
actual = stylesheet("main")
|
82
|
+
expect(actual).to eq(%(<link href="/assets/main.css" type="text/css" rel="stylesheet">))
|
83
|
+
end
|
84
|
+
|
85
|
+
xit "renders <link> tag without appending ext after query string" do
|
86
|
+
actual = stylesheet("fonts?font=Helvetica")
|
87
|
+
expect(actual).to eq(%(<link href="/assets/fonts?font=Helvetica" type="text/css" rel="stylesheet">))
|
88
|
+
end
|
89
|
+
|
90
|
+
it "renders <link> tag with an integrity attribute" do
|
91
|
+
actual = stylesheet("main", integrity: "sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC")
|
92
|
+
expect(actual).to eq(%(<link href="/assets/main.css" type="text/css" rel="stylesheet" integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC" crossorigin="anonymous">))
|
93
|
+
end
|
94
|
+
|
95
|
+
it "renders <link> tag with a crossorigin attribute" do
|
96
|
+
actual = stylesheet("main", integrity: "sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC", crossorigin: "use-credentials")
|
97
|
+
expect(actual).to eq(%(<link href="/assets/main.css" type="text/css" rel="stylesheet" integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC" crossorigin="use-credentials">))
|
98
|
+
end
|
99
|
+
|
100
|
+
it "ignores href passed as an option" do
|
101
|
+
actual = stylesheet("main", href: "wrong")
|
102
|
+
expect(actual).to eq(%(<link href="/assets/main.css" type="text/css" rel="stylesheet">))
|
103
|
+
end
|
104
|
+
|
105
|
+
describe "subresource_integrity mode" do
|
106
|
+
def before_prepare
|
107
|
+
Hanami.app.config.assets.subresource_integrity = [:sha384]
|
108
|
+
end
|
109
|
+
|
110
|
+
before { compile_assets! }
|
111
|
+
|
112
|
+
it "includes subresource_integrity and crossorigin attributes" do
|
113
|
+
actual = stylesheet("app")
|
114
|
+
expect(actual).to match(%r{<link href="/assets/app-[A-Z0-9]{8}.css" type="text/css" rel="stylesheet" integrity="sha384-[A-Za-z0-9+/]{64}" crossorigin="anonymous">})
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
describe "cdn mode" do
|
119
|
+
let(:base_url) { "https://hanami.test" }
|
120
|
+
|
121
|
+
def before_prepare
|
122
|
+
Hanami.app.config.assets.base_url = base_url
|
123
|
+
end
|
124
|
+
|
125
|
+
it "returns absolute url for href attribute" do
|
126
|
+
actual = stylesheet("main")
|
127
|
+
expect(actual).to eq(%(<link href="#{base_url}/assets/main.css" type="text/css" rel="stylesheet">))
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
@@ -0,0 +1,136 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RSpec.describe Hanami::Helpers::AssetsHelper, "#video", :app_integration do
|
4
|
+
subject(:obj) {
|
5
|
+
helpers = described_class
|
6
|
+
Class.new {
|
7
|
+
include helpers
|
8
|
+
|
9
|
+
attr_reader :_context
|
10
|
+
|
11
|
+
def initialize(context)
|
12
|
+
@_context = context
|
13
|
+
end
|
14
|
+
}.new(context)
|
15
|
+
}
|
16
|
+
|
17
|
+
def video(...)
|
18
|
+
subject.video(...)
|
19
|
+
end
|
20
|
+
|
21
|
+
let(:context) { TestApp::Views::Context.new }
|
22
|
+
let(:root) { make_tmp_directory }
|
23
|
+
|
24
|
+
before do
|
25
|
+
with_directory(root) do
|
26
|
+
write "config/app.rb", <<~RUBY
|
27
|
+
module TestApp
|
28
|
+
class App < Hanami::App
|
29
|
+
config.logger.stream = StringIO.new
|
30
|
+
end
|
31
|
+
end
|
32
|
+
RUBY
|
33
|
+
|
34
|
+
write "app/views/context.rb", <<~RUBY
|
35
|
+
# auto_register: false
|
36
|
+
|
37
|
+
require "hanami/view/context"
|
38
|
+
|
39
|
+
module TestApp
|
40
|
+
module Views
|
41
|
+
class Context < Hanami::View::Context
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
RUBY
|
46
|
+
|
47
|
+
stub_assets("movie.mp4", "movie.en.vtt")
|
48
|
+
|
49
|
+
require "hanami/setup"
|
50
|
+
before_prepare if respond_to?(:before_prepare)
|
51
|
+
require "hanami/prepare"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
it "returns an instance of HtmlBuilder" do
|
56
|
+
actual = video("movie.mp4")
|
57
|
+
expect(actual).to be_instance_of(::Hanami::View::HTML::SafeString)
|
58
|
+
end
|
59
|
+
|
60
|
+
it "renders <video> tag" do
|
61
|
+
actual = video("movie.mp4").to_s
|
62
|
+
expect(actual).to eq(%(<video src="/assets/movie.mp4"></video>))
|
63
|
+
end
|
64
|
+
|
65
|
+
it "is aliased as #video_tag" do
|
66
|
+
expect(video("movie.mp4")).to eq(subject.video_tag("movie.mp4"))
|
67
|
+
end
|
68
|
+
|
69
|
+
it "renders with html attributes" do
|
70
|
+
actual = video("movie.mp4", autoplay: true, controls: true).to_s
|
71
|
+
expect(actual).to eq(%(<video autoplay="autoplay" controls="controls" src="/assets/movie.mp4"></video>))
|
72
|
+
end
|
73
|
+
|
74
|
+
it "renders with fallback content" do
|
75
|
+
actual = video("movie.mp4") do
|
76
|
+
"Your browser does not support the video tag"
|
77
|
+
end.to_s
|
78
|
+
|
79
|
+
expect(actual).to eq(%(<video src="/assets/movie.mp4">Your browser does not support the video tag</video>))
|
80
|
+
end
|
81
|
+
|
82
|
+
it "renders with tracks" do
|
83
|
+
actual = video("movie.mp4") do
|
84
|
+
tag.track kind: "captions", src: subject.asset_url("movie.en.vtt"), srclang: "en", label: "English"
|
85
|
+
end.to_s
|
86
|
+
|
87
|
+
expect(actual).to eq(%(<video src="/assets/movie.mp4"><track kind="captions" src="/assets/movie.en.vtt" srclang="en" label="English"></video>))
|
88
|
+
end
|
89
|
+
|
90
|
+
xit "renders with sources" do
|
91
|
+
actual = subject.video do
|
92
|
+
tag.text "Your browser does not support the video tag"
|
93
|
+
tag.source src: subject.asset_url("movie.mp4"), type: "video/mp4"
|
94
|
+
tag.source src: subject.asset_url("movie.ogg"), type: "video/ogg"
|
95
|
+
end.to_s
|
96
|
+
|
97
|
+
expect(actual).to eq(%(<video>Your browser does not support the video tag<source src="/assets/movie.mp4" type="video/mp4"><source src="/assets/movie.ogg" type="video/ogg"></video>))
|
98
|
+
end
|
99
|
+
|
100
|
+
it "raises an exception when no arguments" do
|
101
|
+
expect do
|
102
|
+
video
|
103
|
+
end.to raise_error(
|
104
|
+
ArgumentError,
|
105
|
+
"You should provide a source via `src` option or with a `source` HTML tag"
|
106
|
+
)
|
107
|
+
end
|
108
|
+
|
109
|
+
it "raises an exception when no src and no block" do
|
110
|
+
expect do
|
111
|
+
video(content: true)
|
112
|
+
end.to raise_error(
|
113
|
+
ArgumentError,
|
114
|
+
"You should provide a source via `src` option or with a `source` HTML tag"
|
115
|
+
)
|
116
|
+
end
|
117
|
+
|
118
|
+
describe "cdn mode" do
|
119
|
+
let(:base_url) { "https://hanami.test" }
|
120
|
+
|
121
|
+
def before_prepare
|
122
|
+
Hanami.app.config.assets.base_url = "https://hanami.test"
|
123
|
+
end
|
124
|
+
|
125
|
+
it "returns absolute url for src attribute" do
|
126
|
+
actual = video("movie.mp4").to_s
|
127
|
+
expect(actual).to eq(%(<video src="#{base_url}/assets/movie.mp4"></video>))
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
private
|
132
|
+
|
133
|
+
def tag(...)
|
134
|
+
subject.__send__(:tag, ...)
|
135
|
+
end
|
136
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hanami
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.0.
|
4
|
+
version: 2.1.0.beta2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luca Guidi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-10-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -255,14 +255,13 @@ files:
|
|
255
255
|
- hanami.gemspec
|
256
256
|
- lib/hanami.rb
|
257
257
|
- lib/hanami/app.rb
|
258
|
-
- lib/hanami/assets/app_config.rb
|
259
|
-
- lib/hanami/assets/config.rb
|
260
258
|
- lib/hanami/boot.rb
|
261
259
|
- lib/hanami/config.rb
|
262
260
|
- lib/hanami/config/actions.rb
|
263
261
|
- lib/hanami/config/actions/content_security_policy.rb
|
264
262
|
- lib/hanami/config/actions/cookies.rb
|
265
263
|
- lib/hanami/config/actions/sessions.rb
|
264
|
+
- lib/hanami/config/assets.rb
|
266
265
|
- lib/hanami/config/logger.rb
|
267
266
|
- lib/hanami/config/null_config.rb
|
268
267
|
- lib/hanami/config/router.rb
|
@@ -282,13 +281,16 @@ files:
|
|
282
281
|
- lib/hanami/extensions/view/slice_configured_helpers.rb
|
283
282
|
- lib/hanami/extensions/view/slice_configured_view.rb
|
284
283
|
- lib/hanami/extensions/view/standard_helpers.rb
|
284
|
+
- lib/hanami/helpers/assets_helper.rb
|
285
285
|
- lib/hanami/helpers/form_helper.rb
|
286
286
|
- lib/hanami/helpers/form_helper/form_builder.rb
|
287
287
|
- lib/hanami/helpers/form_helper/values.rb
|
288
|
+
- lib/hanami/middleware/assets.rb
|
288
289
|
- lib/hanami/middleware/public_errors_app.rb
|
289
290
|
- lib/hanami/middleware/render_errors.rb
|
290
291
|
- lib/hanami/port.rb
|
291
292
|
- lib/hanami/prepare.rb
|
293
|
+
- lib/hanami/providers/assets.rb
|
292
294
|
- lib/hanami/providers/inflector.rb
|
293
295
|
- lib/hanami/providers/logger.rb
|
294
296
|
- lib/hanami/providers/rack.rb
|
@@ -319,6 +321,8 @@ files:
|
|
319
321
|
- spec/integration/action/view_rendering/paired_view_inference_spec.rb
|
320
322
|
- spec/integration/action/view_rendering/view_context_spec.rb
|
321
323
|
- spec/integration/action/view_rendering_spec.rb
|
324
|
+
- spec/integration/assets/assets_spec.rb
|
325
|
+
- spec/integration/assets/serve_static_assets_spec.rb
|
322
326
|
- spec/integration/code_loading/loading_from_app_spec.rb
|
323
327
|
- spec/integration/code_loading/loading_from_lib_spec.rb
|
324
328
|
- spec/integration/code_loading/loading_from_slice_spec.rb
|
@@ -333,10 +337,14 @@ files:
|
|
333
337
|
- spec/integration/container/standard_providers/rack_provider_spec.rb
|
334
338
|
- spec/integration/container/standard_providers_spec.rb
|
335
339
|
- spec/integration/dotenv_loading_spec.rb
|
340
|
+
- spec/integration/logging/exception_logging_spec.rb
|
341
|
+
- spec/integration/logging/notifications_spec.rb
|
342
|
+
- spec/integration/logging/request_logging_spec.rb
|
336
343
|
- spec/integration/rack_app/body_parser_spec.rb
|
337
344
|
- spec/integration/rack_app/middleware_spec.rb
|
338
345
|
- spec/integration/rack_app/non_booted_rack_app_spec.rb
|
339
346
|
- spec/integration/rack_app/rack_app_spec.rb
|
347
|
+
- spec/integration/rake_tasks_spec.rb
|
340
348
|
- spec/integration/settings/access_in_slice_class_body_spec.rb
|
341
349
|
- spec/integration/settings/access_to_constants_spec.rb
|
342
350
|
- spec/integration/settings/loading_from_env_spec.rb
|
@@ -397,6 +405,13 @@ files:
|
|
397
405
|
- spec/unit/hanami/config/views_spec.rb
|
398
406
|
- spec/unit/hanami/env_spec.rb
|
399
407
|
- spec/unit/hanami/extensions/view/context_spec.rb
|
408
|
+
- spec/unit/hanami/helpers/assets_helper/asset_url_spec.rb
|
409
|
+
- spec/unit/hanami/helpers/assets_helper/audio_spec.rb
|
410
|
+
- spec/unit/hanami/helpers/assets_helper/favicon_spec.rb
|
411
|
+
- spec/unit/hanami/helpers/assets_helper/image_spec.rb
|
412
|
+
- spec/unit/hanami/helpers/assets_helper/javascript_spec.rb
|
413
|
+
- spec/unit/hanami/helpers/assets_helper/stylesheet_spec.rb
|
414
|
+
- spec/unit/hanami/helpers/assets_helper/video_spec.rb
|
400
415
|
- spec/unit/hanami/helpers/form_helper_spec.rb
|
401
416
|
- spec/unit/hanami/port_spec.rb
|
402
417
|
- spec/unit/hanami/router/errors/not_allowed_error_spec.rb
|
@@ -444,6 +459,8 @@ test_files:
|
|
444
459
|
- spec/integration/action/view_rendering/paired_view_inference_spec.rb
|
445
460
|
- spec/integration/action/view_rendering/view_context_spec.rb
|
446
461
|
- spec/integration/action/view_rendering_spec.rb
|
462
|
+
- spec/integration/assets/assets_spec.rb
|
463
|
+
- spec/integration/assets/serve_static_assets_spec.rb
|
447
464
|
- spec/integration/code_loading/loading_from_app_spec.rb
|
448
465
|
- spec/integration/code_loading/loading_from_lib_spec.rb
|
449
466
|
- spec/integration/code_loading/loading_from_slice_spec.rb
|
@@ -458,10 +475,14 @@ test_files:
|
|
458
475
|
- spec/integration/container/standard_providers/rack_provider_spec.rb
|
459
476
|
- spec/integration/container/standard_providers_spec.rb
|
460
477
|
- spec/integration/dotenv_loading_spec.rb
|
478
|
+
- spec/integration/logging/exception_logging_spec.rb
|
479
|
+
- spec/integration/logging/notifications_spec.rb
|
480
|
+
- spec/integration/logging/request_logging_spec.rb
|
461
481
|
- spec/integration/rack_app/body_parser_spec.rb
|
462
482
|
- spec/integration/rack_app/middleware_spec.rb
|
463
483
|
- spec/integration/rack_app/non_booted_rack_app_spec.rb
|
464
484
|
- spec/integration/rack_app/rack_app_spec.rb
|
485
|
+
- spec/integration/rake_tasks_spec.rb
|
465
486
|
- spec/integration/settings/access_in_slice_class_body_spec.rb
|
466
487
|
- spec/integration/settings/access_to_constants_spec.rb
|
467
488
|
- spec/integration/settings/loading_from_env_spec.rb
|
@@ -522,6 +543,13 @@ test_files:
|
|
522
543
|
- spec/unit/hanami/config/views_spec.rb
|
523
544
|
- spec/unit/hanami/env_spec.rb
|
524
545
|
- spec/unit/hanami/extensions/view/context_spec.rb
|
546
|
+
- spec/unit/hanami/helpers/assets_helper/asset_url_spec.rb
|
547
|
+
- spec/unit/hanami/helpers/assets_helper/audio_spec.rb
|
548
|
+
- spec/unit/hanami/helpers/assets_helper/favicon_spec.rb
|
549
|
+
- spec/unit/hanami/helpers/assets_helper/image_spec.rb
|
550
|
+
- spec/unit/hanami/helpers/assets_helper/javascript_spec.rb
|
551
|
+
- spec/unit/hanami/helpers/assets_helper/stylesheet_spec.rb
|
552
|
+
- spec/unit/hanami/helpers/assets_helper/video_spec.rb
|
525
553
|
- spec/unit/hanami/helpers/form_helper_spec.rb
|
526
554
|
- spec/unit/hanami/port_spec.rb
|
527
555
|
- spec/unit/hanami/router/errors/not_allowed_error_spec.rb
|
@@ -1,61 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "dry/configurable"
|
4
|
-
|
5
|
-
module Hanami
|
6
|
-
# @api private
|
7
|
-
module Assets
|
8
|
-
# App config for assets.
|
9
|
-
#
|
10
|
-
# This is NOT RELEASED as of 2.0.0.
|
11
|
-
#
|
12
|
-
# @api private
|
13
|
-
class AppConfig
|
14
|
-
include Dry::Configurable
|
15
|
-
|
16
|
-
attr_reader :base_config
|
17
|
-
protected :base_config
|
18
|
-
|
19
|
-
setting :server_url, default: "http://localhost:8080"
|
20
|
-
|
21
|
-
def initialize(*)
|
22
|
-
super
|
23
|
-
|
24
|
-
@base_config = Assets::Config.new
|
25
|
-
end
|
26
|
-
|
27
|
-
def initialize_copy(source)
|
28
|
-
super
|
29
|
-
@base_config = source.base_config.dup
|
30
|
-
end
|
31
|
-
|
32
|
-
def finalize!
|
33
|
-
end
|
34
|
-
|
35
|
-
# Returns the list of available settings
|
36
|
-
#
|
37
|
-
# @return [Set]
|
38
|
-
#
|
39
|
-
# @api private
|
40
|
-
def settings
|
41
|
-
base_config.settings + self.class.settings
|
42
|
-
end
|
43
|
-
|
44
|
-
private
|
45
|
-
|
46
|
-
def method_missing(name, *args, &block)
|
47
|
-
if config.respond_to?(name)
|
48
|
-
config.public_send(name, *args, &block)
|
49
|
-
elsif base_config.respond_to?(name)
|
50
|
-
base_config.public_send(name, *args, &block)
|
51
|
-
else
|
52
|
-
super
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
def respond_to_missing?(name, _incude_all = false)
|
57
|
-
config.respond_to?(name) || base_config.respond_to?(name) || super
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
data/lib/hanami/assets/config.rb
DELETED
@@ -1,53 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "dry/configurable"
|
4
|
-
|
5
|
-
module Hanami
|
6
|
-
module Assets
|
7
|
-
# App config for assets.
|
8
|
-
#
|
9
|
-
# This is NOT RELEASED as of 2.0.0.
|
10
|
-
#
|
11
|
-
# @api private
|
12
|
-
class Config
|
13
|
-
include Dry::Configurable
|
14
|
-
|
15
|
-
# Initialize the Config
|
16
|
-
#
|
17
|
-
# @yield [config] the config object
|
18
|
-
#
|
19
|
-
# @return [Config]
|
20
|
-
#
|
21
|
-
# @since 2.0.0
|
22
|
-
# @api private
|
23
|
-
def initialize(*)
|
24
|
-
super
|
25
|
-
yield self if block_given?
|
26
|
-
end
|
27
|
-
|
28
|
-
# Returns the list of available settings
|
29
|
-
#
|
30
|
-
# @return [Set]
|
31
|
-
#
|
32
|
-
# @since 2.0.0
|
33
|
-
# @api private
|
34
|
-
def settings
|
35
|
-
self.class.settings
|
36
|
-
end
|
37
|
-
|
38
|
-
private
|
39
|
-
|
40
|
-
def method_missing(name, *args, &block)
|
41
|
-
if config.respond_to?(name)
|
42
|
-
config.public_send(name, *args, &block)
|
43
|
-
else
|
44
|
-
super
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
def respond_to_missing?(name, _incude_all = false)
|
49
|
-
config.respond_to?(name) || super
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|