hanami 2.0.3 → 2.1.0.beta1
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 +19 -0
- data/LICENSE.md +1 -1
- data/README.md +25 -9
- data/hanami.gemspec +2 -2
- data/lib/hanami/config/actions.rb +0 -4
- data/lib/hanami/config/views.rb +0 -4
- data/lib/hanami/config.rb +54 -0
- data/lib/hanami/extensions/action/slice_configured_action.rb +15 -7
- data/lib/hanami/extensions/action.rb +4 -4
- data/lib/hanami/extensions/router/errors.rb +58 -0
- data/lib/hanami/extensions/view/context.rb +129 -60
- data/lib/hanami/extensions/view/part.rb +26 -0
- data/lib/hanami/extensions/view/scope.rb +26 -0
- data/lib/hanami/extensions/view/slice_configured_context.rb +0 -2
- data/lib/hanami/extensions/view/slice_configured_helpers.rb +44 -0
- data/lib/hanami/extensions/view/slice_configured_view.rb +106 -21
- data/lib/hanami/extensions/view/standard_helpers.rb +14 -0
- data/lib/hanami/extensions.rb +10 -3
- data/lib/hanami/helpers/form_helper/form_builder.rb +1391 -0
- data/lib/hanami/helpers/form_helper/values.rb +75 -0
- data/lib/hanami/helpers/form_helper.rb +213 -0
- data/lib/hanami/middleware/public_errors_app.rb +75 -0
- data/lib/hanami/middleware/render_errors.rb +93 -0
- data/lib/hanami/slice.rb +27 -2
- data/lib/hanami/slice_configurable.rb +3 -2
- data/lib/hanami/version.rb +1 -1
- data/lib/hanami/web/rack_logger.rb +1 -1
- data/lib/hanami.rb +1 -1
- data/spec/integration/action/view_rendering/view_context_spec.rb +221 -0
- data/spec/integration/action/view_rendering_spec.rb +0 -18
- data/spec/integration/rack_app/middleware_spec.rb +23 -23
- data/spec/integration/rack_app/rack_app_spec.rb +5 -1
- data/spec/integration/view/config/default_context_spec.rb +149 -0
- data/spec/integration/view/{inflector_spec.rb → config/inflector_spec.rb} +1 -1
- data/spec/integration/view/config/part_class_spec.rb +147 -0
- data/spec/integration/view/config/part_namespace_spec.rb +103 -0
- data/spec/integration/view/config/paths_spec.rb +119 -0
- data/spec/integration/view/config/scope_class_spec.rb +147 -0
- data/spec/integration/view/config/scope_namespace_spec.rb +103 -0
- data/spec/integration/view/config/template_spec.rb +38 -0
- data/spec/integration/view/context/request_spec.rb +3 -7
- data/spec/integration/view/helpers/form_helper_spec.rb +174 -0
- data/spec/integration/view/helpers/part_helpers_spec.rb +124 -0
- data/spec/integration/view/helpers/scope_helpers_spec.rb +84 -0
- data/spec/integration/view/helpers/user_defined_helpers/part_helpers_spec.rb +162 -0
- data/spec/integration/view/helpers/user_defined_helpers/scope_helpers_spec.rb +119 -0
- data/spec/integration/view/slice_configuration_spec.rb +9 -9
- data/spec/integration/web/render_detailed_errors_spec.rb +90 -0
- data/spec/integration/web/render_errors_spec.rb +240 -0
- data/spec/spec_helper.rb +1 -1
- data/spec/support/matchers.rb +32 -0
- data/spec/unit/hanami/config/actions/default_values_spec.rb +0 -4
- data/spec/unit/hanami/config/render_detailed_errors_spec.rb +25 -0
- data/spec/unit/hanami/config/render_errors_spec.rb +25 -0
- data/spec/unit/hanami/config/views_spec.rb +0 -18
- data/spec/unit/hanami/extensions/view/context_spec.rb +59 -0
- data/spec/unit/hanami/helpers/form_helper_spec.rb +2826 -0
- data/spec/unit/hanami/router/errors/not_allowed_error_spec.rb +27 -0
- data/spec/unit/hanami/router/errors/not_found_error_spec.rb +22 -0
- data/spec/unit/hanami/slice_configurable_spec.rb +18 -0
- data/spec/unit/hanami/version_spec.rb +1 -1
- data/spec/unit/hanami/web/rack_logger_spec.rb +1 -1
- metadata +65 -33
- data/spec/integration/action/view_integration_spec.rb +0 -165
- data/spec/integration/view/part_namespace_spec.rb +0 -96
- data/spec/integration/view/path_spec.rb +0 -56
- data/spec/integration/view/template_spec.rb +0 -68
- data/spec/isolation/hanami/application/already_configured_spec.rb +0 -19
- data/spec/isolation/hanami/application/inherit_anonymous_class_spec.rb +0 -10
- data/spec/isolation/hanami/application/inherit_concrete_class_spec.rb +0 -14
- data/spec/isolation/hanami/application/not_configured_spec.rb +0 -9
- data/spec/isolation/hanami/application/routes/configured_spec.rb +0 -44
- data/spec/isolation/hanami/application/routes/not_configured_spec.rb +0 -16
- data/spec/isolation/hanami/boot/success_spec.rb +0 -50
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "hanami/router"
|
4
|
+
require "hanami/extensions/router/errors"
|
5
|
+
|
6
|
+
RSpec.describe(Hanami::Router::NotAllowedError) do
|
7
|
+
subject(:error) { described_class.new(env, allowed_methods) }
|
8
|
+
|
9
|
+
let(:env) { Rack::MockRequest.env_for("http://example.com/example", method: "POST") }
|
10
|
+
let(:allowed_methods) { ["GET", "HEAD"] }
|
11
|
+
|
12
|
+
it "is a Hanami::Router::Error" do
|
13
|
+
expect(error.class).to be < Hanami::Router::Error
|
14
|
+
end
|
15
|
+
|
16
|
+
it "returns a relevant message" do
|
17
|
+
expect(error.to_s).to eq "Only GET, HEAD requests are allowed at /example"
|
18
|
+
end
|
19
|
+
|
20
|
+
it "returns the env" do
|
21
|
+
expect(error.env).to be env
|
22
|
+
end
|
23
|
+
|
24
|
+
it "returns the allowed methods" do
|
25
|
+
expect(error.allowed_methods).to be allowed_methods
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "hanami/router"
|
4
|
+
require "hanami/extensions/router/errors"
|
5
|
+
|
6
|
+
RSpec.describe(Hanami::Router::NotFoundError) do
|
7
|
+
subject(:error) { described_class.new(env) }
|
8
|
+
|
9
|
+
let(:env) { Rack::MockRequest.env_for("http://example.com/example", method: "GET") }
|
10
|
+
|
11
|
+
it "is a Hanami::Router::Error" do
|
12
|
+
expect(error.class).to be < Hanami::Router::Error
|
13
|
+
end
|
14
|
+
|
15
|
+
it "returns a relevant message" do
|
16
|
+
expect(error.to_s).to eq "No route found for GET /example"
|
17
|
+
end
|
18
|
+
|
19
|
+
it "returns the env" do
|
20
|
+
expect(error.env).to be env
|
21
|
+
end
|
22
|
+
end
|
@@ -72,6 +72,24 @@ RSpec.describe Hanami::SliceConfigurable, :app_integration do
|
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
75
|
+
context "subclass inside slice with name overlapping another slice" do
|
76
|
+
let(:app_modules) { super() << :ExternalAdmin }
|
77
|
+
|
78
|
+
before do
|
79
|
+
TestApp::App.register_slice :external_admin
|
80
|
+
|
81
|
+
module ExternalAdmin
|
82
|
+
class MySubclass < TestApp::BaseClass; end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
subject(:subclass) { ExternalAdmin::MySubclass }
|
87
|
+
|
88
|
+
it "calls `configure_for_slice` with the correct matching slice" do
|
89
|
+
expect(subclass.traces).to eq [ExternalAdmin::Slice]
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
75
93
|
context "class inside app" do
|
76
94
|
before do
|
77
95
|
module TestApp
|
@@ -42,7 +42,7 @@ RSpec.describe Hanami::Web::RackLogger do
|
|
42
42
|
verb = "POST"
|
43
43
|
|
44
44
|
env = Rack::MockRequest.env_for(path, method: verb)
|
45
|
-
env["
|
45
|
+
env["CONTENT_LENGTH"] = content_length
|
46
46
|
env["REMOTE_ADDR"] = ip
|
47
47
|
|
48
48
|
params = {"user" => {"password" => "secret"}}
|
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.0.
|
4
|
+
version: 2.1.0.beta1
|
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-06-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -162,28 +162,28 @@ dependencies:
|
|
162
162
|
requirements:
|
163
163
|
- - "~>"
|
164
164
|
- !ruby/object:Gem::Version
|
165
|
-
version:
|
165
|
+
version: 2.1.beta
|
166
166
|
type: :runtime
|
167
167
|
prerelease: false
|
168
168
|
version_requirements: !ruby/object:Gem::Requirement
|
169
169
|
requirements:
|
170
170
|
- - "~>"
|
171
171
|
- !ruby/object:Gem::Version
|
172
|
-
version:
|
172
|
+
version: 2.1.beta
|
173
173
|
- !ruby/object:Gem::Dependency
|
174
174
|
name: hanami-utils
|
175
175
|
requirement: !ruby/object:Gem::Requirement
|
176
176
|
requirements:
|
177
177
|
- - "~>"
|
178
178
|
- !ruby/object:Gem::Version
|
179
|
-
version:
|
179
|
+
version: 2.1.beta
|
180
180
|
type: :runtime
|
181
181
|
prerelease: false
|
182
182
|
version_requirements: !ruby/object:Gem::Requirement
|
183
183
|
requirements:
|
184
184
|
- - "~>"
|
185
185
|
- !ruby/object:Gem::Version
|
186
|
-
version:
|
186
|
+
version: 2.1.beta
|
187
187
|
- !ruby/object:Gem::Dependency
|
188
188
|
name: zeitwerk
|
189
189
|
requirement: !ruby/object:Gem::Requirement
|
@@ -273,10 +273,20 @@ files:
|
|
273
273
|
- lib/hanami/extensions.rb
|
274
274
|
- lib/hanami/extensions/action.rb
|
275
275
|
- lib/hanami/extensions/action/slice_configured_action.rb
|
276
|
+
- lib/hanami/extensions/router/errors.rb
|
276
277
|
- lib/hanami/extensions/view.rb
|
277
278
|
- lib/hanami/extensions/view/context.rb
|
279
|
+
- lib/hanami/extensions/view/part.rb
|
280
|
+
- lib/hanami/extensions/view/scope.rb
|
278
281
|
- lib/hanami/extensions/view/slice_configured_context.rb
|
282
|
+
- lib/hanami/extensions/view/slice_configured_helpers.rb
|
279
283
|
- lib/hanami/extensions/view/slice_configured_view.rb
|
284
|
+
- lib/hanami/extensions/view/standard_helpers.rb
|
285
|
+
- lib/hanami/helpers/form_helper.rb
|
286
|
+
- lib/hanami/helpers/form_helper/form_builder.rb
|
287
|
+
- lib/hanami/helpers/form_helper/values.rb
|
288
|
+
- lib/hanami/middleware/public_errors_app.rb
|
289
|
+
- lib/hanami/middleware/render_errors.rb
|
280
290
|
- lib/hanami/port.rb
|
281
291
|
- lib/hanami/prepare.rb
|
282
292
|
- lib/hanami/providers/inflector.rb
|
@@ -305,9 +315,9 @@ files:
|
|
305
315
|
- spec/integration/action/routes_spec.rb
|
306
316
|
- spec/integration/action/sessions_spec.rb
|
307
317
|
- spec/integration/action/slice_configuration_spec.rb
|
308
|
-
- spec/integration/action/view_integration_spec.rb
|
309
318
|
- spec/integration/action/view_rendering/automatic_rendering_spec.rb
|
310
319
|
- spec/integration/action/view_rendering/paired_view_inference_spec.rb
|
320
|
+
- spec/integration/action/view_rendering/view_context_spec.rb
|
311
321
|
- spec/integration/action/view_rendering_spec.rb
|
312
322
|
- spec/integration/code_loading/loading_from_app_spec.rb
|
313
323
|
- spec/integration/code_loading/loading_from_lib_spec.rb
|
@@ -340,27 +350,32 @@ files:
|
|
340
350
|
- spec/integration/slices/slice_registrations_spec.rb
|
341
351
|
- spec/integration/slices/slice_routing_spec.rb
|
342
352
|
- spec/integration/slices_spec.rb
|
353
|
+
- spec/integration/view/config/default_context_spec.rb
|
354
|
+
- spec/integration/view/config/inflector_spec.rb
|
355
|
+
- spec/integration/view/config/part_class_spec.rb
|
356
|
+
- spec/integration/view/config/part_namespace_spec.rb
|
357
|
+
- spec/integration/view/config/paths_spec.rb
|
358
|
+
- spec/integration/view/config/scope_class_spec.rb
|
359
|
+
- spec/integration/view/config/scope_namespace_spec.rb
|
360
|
+
- spec/integration/view/config/template_spec.rb
|
343
361
|
- spec/integration/view/context/assets_spec.rb
|
344
362
|
- spec/integration/view/context/inflector_spec.rb
|
345
363
|
- spec/integration/view/context/request_spec.rb
|
346
364
|
- spec/integration/view/context/routes_spec.rb
|
347
365
|
- spec/integration/view/context/settings_spec.rb
|
348
|
-
- spec/integration/view/
|
349
|
-
- spec/integration/view/
|
350
|
-
- spec/integration/view/
|
366
|
+
- spec/integration/view/helpers/form_helper_spec.rb
|
367
|
+
- spec/integration/view/helpers/part_helpers_spec.rb
|
368
|
+
- spec/integration/view/helpers/scope_helpers_spec.rb
|
369
|
+
- spec/integration/view/helpers/user_defined_helpers/part_helpers_spec.rb
|
370
|
+
- spec/integration/view/helpers/user_defined_helpers/scope_helpers_spec.rb
|
351
371
|
- spec/integration/view/slice_configuration_spec.rb
|
352
|
-
- spec/integration/view/template_spec.rb
|
353
372
|
- spec/integration/view/views_spec.rb
|
354
|
-
- spec/
|
355
|
-
- spec/
|
356
|
-
- spec/isolation/hanami/application/inherit_concrete_class_spec.rb
|
357
|
-
- spec/isolation/hanami/application/not_configured_spec.rb
|
358
|
-
- spec/isolation/hanami/application/routes/configured_spec.rb
|
359
|
-
- spec/isolation/hanami/application/routes/not_configured_spec.rb
|
360
|
-
- spec/isolation/hanami/boot/success_spec.rb
|
373
|
+
- spec/integration/web/render_detailed_errors_spec.rb
|
374
|
+
- spec/integration/web/render_errors_spec.rb
|
361
375
|
- spec/spec_helper.rb
|
362
376
|
- spec/support/app_integration.rb
|
363
377
|
- spec/support/coverage.rb
|
378
|
+
- spec/support/matchers.rb
|
364
379
|
- spec/support/rspec.rb
|
365
380
|
- spec/support/shared_examples/cli/generate/app.rb
|
366
381
|
- spec/support/shared_examples/cli/generate/migration.rb
|
@@ -375,11 +390,17 @@ files:
|
|
375
390
|
- spec/unit/hanami/config/base_url_spec.rb
|
376
391
|
- spec/unit/hanami/config/inflector_spec.rb
|
377
392
|
- spec/unit/hanami/config/logger_spec.rb
|
393
|
+
- spec/unit/hanami/config/render_detailed_errors_spec.rb
|
394
|
+
- spec/unit/hanami/config/render_errors_spec.rb
|
378
395
|
- spec/unit/hanami/config/router_spec.rb
|
379
396
|
- spec/unit/hanami/config/slices_spec.rb
|
380
397
|
- spec/unit/hanami/config/views_spec.rb
|
381
398
|
- spec/unit/hanami/env_spec.rb
|
399
|
+
- spec/unit/hanami/extensions/view/context_spec.rb
|
400
|
+
- spec/unit/hanami/helpers/form_helper_spec.rb
|
382
401
|
- spec/unit/hanami/port_spec.rb
|
402
|
+
- spec/unit/hanami/router/errors/not_allowed_error_spec.rb
|
403
|
+
- spec/unit/hanami/router/errors/not_found_error_spec.rb
|
383
404
|
- spec/unit/hanami/settings/env_store_spec.rb
|
384
405
|
- spec/unit/hanami/settings_spec.rb
|
385
406
|
- spec/unit/hanami/slice_configurable_spec.rb
|
@@ -404,11 +425,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
404
425
|
version: '3.0'
|
405
426
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
406
427
|
requirements:
|
407
|
-
- - "
|
428
|
+
- - ">"
|
408
429
|
- !ruby/object:Gem::Version
|
409
|
-
version:
|
430
|
+
version: 1.3.1
|
410
431
|
requirements: []
|
411
|
-
rubygems_version: 3.4.
|
432
|
+
rubygems_version: 3.4.13
|
412
433
|
signing_key:
|
413
434
|
specification_version: 4
|
414
435
|
summary: The web, with simplicity
|
@@ -419,9 +440,9 @@ test_files:
|
|
419
440
|
- spec/integration/action/routes_spec.rb
|
420
441
|
- spec/integration/action/sessions_spec.rb
|
421
442
|
- spec/integration/action/slice_configuration_spec.rb
|
422
|
-
- spec/integration/action/view_integration_spec.rb
|
423
443
|
- spec/integration/action/view_rendering/automatic_rendering_spec.rb
|
424
444
|
- spec/integration/action/view_rendering/paired_view_inference_spec.rb
|
445
|
+
- spec/integration/action/view_rendering/view_context_spec.rb
|
425
446
|
- spec/integration/action/view_rendering_spec.rb
|
426
447
|
- spec/integration/code_loading/loading_from_app_spec.rb
|
427
448
|
- spec/integration/code_loading/loading_from_lib_spec.rb
|
@@ -454,27 +475,32 @@ test_files:
|
|
454
475
|
- spec/integration/slices/slice_registrations_spec.rb
|
455
476
|
- spec/integration/slices/slice_routing_spec.rb
|
456
477
|
- spec/integration/slices_spec.rb
|
478
|
+
- spec/integration/view/config/default_context_spec.rb
|
479
|
+
- spec/integration/view/config/inflector_spec.rb
|
480
|
+
- spec/integration/view/config/part_class_spec.rb
|
481
|
+
- spec/integration/view/config/part_namespace_spec.rb
|
482
|
+
- spec/integration/view/config/paths_spec.rb
|
483
|
+
- spec/integration/view/config/scope_class_spec.rb
|
484
|
+
- spec/integration/view/config/scope_namespace_spec.rb
|
485
|
+
- spec/integration/view/config/template_spec.rb
|
457
486
|
- spec/integration/view/context/assets_spec.rb
|
458
487
|
- spec/integration/view/context/inflector_spec.rb
|
459
488
|
- spec/integration/view/context/request_spec.rb
|
460
489
|
- spec/integration/view/context/routes_spec.rb
|
461
490
|
- spec/integration/view/context/settings_spec.rb
|
462
|
-
- spec/integration/view/
|
463
|
-
- spec/integration/view/
|
464
|
-
- spec/integration/view/
|
491
|
+
- spec/integration/view/helpers/form_helper_spec.rb
|
492
|
+
- spec/integration/view/helpers/part_helpers_spec.rb
|
493
|
+
- spec/integration/view/helpers/scope_helpers_spec.rb
|
494
|
+
- spec/integration/view/helpers/user_defined_helpers/part_helpers_spec.rb
|
495
|
+
- spec/integration/view/helpers/user_defined_helpers/scope_helpers_spec.rb
|
465
496
|
- spec/integration/view/slice_configuration_spec.rb
|
466
|
-
- spec/integration/view/template_spec.rb
|
467
497
|
- spec/integration/view/views_spec.rb
|
468
|
-
- spec/
|
469
|
-
- spec/
|
470
|
-
- spec/isolation/hanami/application/inherit_concrete_class_spec.rb
|
471
|
-
- spec/isolation/hanami/application/not_configured_spec.rb
|
472
|
-
- spec/isolation/hanami/application/routes/configured_spec.rb
|
473
|
-
- spec/isolation/hanami/application/routes/not_configured_spec.rb
|
474
|
-
- spec/isolation/hanami/boot/success_spec.rb
|
498
|
+
- spec/integration/web/render_detailed_errors_spec.rb
|
499
|
+
- spec/integration/web/render_errors_spec.rb
|
475
500
|
- spec/spec_helper.rb
|
476
501
|
- spec/support/app_integration.rb
|
477
502
|
- spec/support/coverage.rb
|
503
|
+
- spec/support/matchers.rb
|
478
504
|
- spec/support/rspec.rb
|
479
505
|
- spec/support/shared_examples/cli/generate/app.rb
|
480
506
|
- spec/support/shared_examples/cli/generate/migration.rb
|
@@ -489,11 +515,17 @@ test_files:
|
|
489
515
|
- spec/unit/hanami/config/base_url_spec.rb
|
490
516
|
- spec/unit/hanami/config/inflector_spec.rb
|
491
517
|
- spec/unit/hanami/config/logger_spec.rb
|
518
|
+
- spec/unit/hanami/config/render_detailed_errors_spec.rb
|
519
|
+
- spec/unit/hanami/config/render_errors_spec.rb
|
492
520
|
- spec/unit/hanami/config/router_spec.rb
|
493
521
|
- spec/unit/hanami/config/slices_spec.rb
|
494
522
|
- spec/unit/hanami/config/views_spec.rb
|
495
523
|
- spec/unit/hanami/env_spec.rb
|
524
|
+
- spec/unit/hanami/extensions/view/context_spec.rb
|
525
|
+
- spec/unit/hanami/helpers/form_helper_spec.rb
|
496
526
|
- spec/unit/hanami/port_spec.rb
|
527
|
+
- spec/unit/hanami/router/errors/not_allowed_error_spec.rb
|
528
|
+
- spec/unit/hanami/router/errors/not_found_error_spec.rb
|
497
529
|
- spec/unit/hanami/settings/env_store_spec.rb
|
498
530
|
- spec/unit/hanami/settings_spec.rb
|
499
531
|
- spec/unit/hanami/slice_configurable_spec.rb
|
@@ -1,165 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
RSpec.describe "App action / View integration", :app_integration do
|
4
|
-
before do
|
5
|
-
module TestApp
|
6
|
-
class App < Hanami::App
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
Hanami.app.instance_eval(&app_hook) if respond_to?(:app_hook)
|
11
|
-
Hanami.app.prepare
|
12
|
-
|
13
|
-
module TestApp
|
14
|
-
class Action < Hanami::Action; end
|
15
|
-
end
|
16
|
-
|
17
|
-
module TestApp
|
18
|
-
module Actions
|
19
|
-
module Articles
|
20
|
-
class Index < TestApp::Action; end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
let(:action_class) { TestApp::Actions::Articles::Index }
|
27
|
-
subject(:action) { action_class.new(**action_args) }
|
28
|
-
let(:action_args) { {} }
|
29
|
-
|
30
|
-
describe "#view_context" do
|
31
|
-
subject(:view_context) { action.view_context }
|
32
|
-
|
33
|
-
context "Explicitly injected view context" do
|
34
|
-
let(:view_context) { double(:view_context) }
|
35
|
-
let(:action_args) { {view_context: view_context} }
|
36
|
-
|
37
|
-
it "returns the injected object" do
|
38
|
-
is_expected.to eql view_context
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
context "No view context registered" do
|
43
|
-
it "is nil" do
|
44
|
-
is_expected.to be_nil
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
context "Default view context identifier" do
|
49
|
-
context "View context registered in slice" do
|
50
|
-
before do
|
51
|
-
TestApp::App.register "views.context", slice_view_context
|
52
|
-
end
|
53
|
-
|
54
|
-
let(:slice_view_context) { double(:slice_view_context) }
|
55
|
-
|
56
|
-
it "is the slice's view context" do
|
57
|
-
is_expected.to eql slice_view_context
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
context "View context registered in app" do
|
62
|
-
before do
|
63
|
-
Hanami.app.register "views.context", app_view_context
|
64
|
-
end
|
65
|
-
|
66
|
-
let(:app_view_context) { double(:app_view_context) }
|
67
|
-
|
68
|
-
it "is the apps's view context" do
|
69
|
-
is_expected.to eql app_view_context
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
context "custom view context identifier" do
|
75
|
-
let(:app_hook) {
|
76
|
-
proc do |app|
|
77
|
-
app.config.actions.view_context_identifier = "view.custom_context"
|
78
|
-
end
|
79
|
-
}
|
80
|
-
|
81
|
-
before do
|
82
|
-
TestApp::App.register "view.custom_context", custom_view_context
|
83
|
-
end
|
84
|
-
|
85
|
-
let(:custom_view_context) { double(:custom_view_context) }
|
86
|
-
|
87
|
-
it "is the context registered with the custom identifier" do
|
88
|
-
is_expected.to eql custom_view_context
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
describe "#view_options" do
|
94
|
-
subject(:view_options) { action.send(:view_options, req, res) }
|
95
|
-
let(:req) { double(:req) }
|
96
|
-
let(:res) { double(:res) }
|
97
|
-
|
98
|
-
context "without view context" do
|
99
|
-
it "is an empty hash" do
|
100
|
-
is_expected.to eq({})
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
context "with view context" do
|
105
|
-
let(:initial_view_context) { double(:initial_view_context) }
|
106
|
-
let(:action_args) { {view_context: initial_view_context} }
|
107
|
-
|
108
|
-
context "default #view_context_options" do
|
109
|
-
let(:request_view_context) { double(:request_view_context) }
|
110
|
-
|
111
|
-
before do
|
112
|
-
allow(initial_view_context).to receive(:with).with(
|
113
|
-
request: req,
|
114
|
-
response: res,
|
115
|
-
) { request_view_context }
|
116
|
-
end
|
117
|
-
|
118
|
-
it "is the view context with the request and response provided" do
|
119
|
-
is_expected.to eq(context: request_view_context)
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
context "custom #view_context_options" do
|
124
|
-
let(:custom_view_context) { double(:custom_view_context)}
|
125
|
-
|
126
|
-
before do
|
127
|
-
action_class.class_eval do
|
128
|
-
def view_context_options(req, res)
|
129
|
-
{custom_option: "custom option"}
|
130
|
-
end
|
131
|
-
end
|
132
|
-
|
133
|
-
allow(initial_view_context).to receive(:with).with(
|
134
|
-
custom_option: "custom option"
|
135
|
-
) { custom_view_context }
|
136
|
-
end
|
137
|
-
|
138
|
-
it "is the view context with the custom options provided" do
|
139
|
-
is_expected.to eq(context: custom_view_context)
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
context "specialized method (calling super) defined in action class" do
|
144
|
-
let(:request_view_context) { double(:request_view_context) }
|
145
|
-
|
146
|
-
before do
|
147
|
-
allow(initial_view_context).to receive(:with).with(
|
148
|
-
request: req,
|
149
|
-
response: res,
|
150
|
-
) { request_view_context }
|
151
|
-
|
152
|
-
action_class.class_eval do
|
153
|
-
def view_options(req, res)
|
154
|
-
super.merge(extra_option: "extra option")
|
155
|
-
end
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
it "includes the options provided by the specialized method" do
|
160
|
-
is_expected.to eq(context: request_view_context, extra_option: "extra option")
|
161
|
-
end
|
162
|
-
end
|
163
|
-
end
|
164
|
-
end
|
165
|
-
end
|
@@ -1,96 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "hanami"
|
4
|
-
|
5
|
-
RSpec.describe "App view / Part namespace", :app_integration do
|
6
|
-
before do
|
7
|
-
module TestApp
|
8
|
-
class App < Hanami::App
|
9
|
-
config.root = "/test_app"
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
Hanami.app.instance_eval(&app_hook) if respond_to?(:app_hook)
|
14
|
-
Hanami.app.register_slice :main
|
15
|
-
Hanami.app.prepare
|
16
|
-
|
17
|
-
# The parts module (or any related setup) must exist _before_ we subclass
|
18
|
-
# Hanami::View, because the parts_namespace is configured at the time of
|
19
|
-
# subclassing (which happens right below)
|
20
|
-
parts_module! if respond_to?(:parts_module!)
|
21
|
-
|
22
|
-
module TestApp
|
23
|
-
class View < Hanami::View
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
module TestApp
|
28
|
-
module Views
|
29
|
-
module Article
|
30
|
-
class Index < TestApp::View
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
subject(:part_namespace) { view_class.config.part_namespace }
|
38
|
-
|
39
|
-
let(:view_class) { TestApp::Views::Article::Index }
|
40
|
-
|
41
|
-
context "default parts_path" do
|
42
|
-
let(:parts_module!) do
|
43
|
-
module TestApp
|
44
|
-
module Views
|
45
|
-
module Parts
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
it "is View::Parts" do
|
52
|
-
is_expected.to eq TestApp::Views::Parts
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
context "custom parts_path configured" do
|
57
|
-
let(:app_hook) {
|
58
|
-
proc do
|
59
|
-
config.views.parts_path = "views/custom_parts"
|
60
|
-
end
|
61
|
-
}
|
62
|
-
|
63
|
-
context "parts module exists" do
|
64
|
-
let(:parts_module!) do
|
65
|
-
module TestApp
|
66
|
-
module Views
|
67
|
-
module CustomParts
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
it "is the matching module within the slice" do
|
74
|
-
is_expected.to eq TestApp::Views::CustomParts
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
context "namespace does not exist" do
|
79
|
-
it "is nil" do
|
80
|
-
is_expected.to be_nil
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
context "nil parts_path configured" do
|
86
|
-
let(:app_hook) {
|
87
|
-
proc do
|
88
|
-
config.views.parts_path = nil
|
89
|
-
end
|
90
|
-
}
|
91
|
-
|
92
|
-
it "is nil" do
|
93
|
-
is_expected.to be_nil
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
@@ -1,56 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "hanami"
|
4
|
-
|
5
|
-
RSpec.describe "App view / Path", :app_integration do
|
6
|
-
before do
|
7
|
-
module TestApp
|
8
|
-
class App < Hanami::App
|
9
|
-
config.root = "/test_app"
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
Hanami.app.instance_eval(&app_hook) if respond_to?(:app_hook)
|
14
|
-
Hanami.app.register_slice :main
|
15
|
-
Hanami.app.prepare
|
16
|
-
|
17
|
-
module TestApp
|
18
|
-
class View < Hanami::View
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
let(:view_class) { TestApp::View }
|
24
|
-
|
25
|
-
subject(:paths) { view_class.config.paths }
|
26
|
-
|
27
|
-
context "default path" do
|
28
|
-
it "is 'templates' appended to the slice's root path" do
|
29
|
-
expect(paths.map { |path| path.dir.to_s }).to eq ["/test_app/app/templates"]
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
context "relative path provided in app config" do
|
34
|
-
let(:app_hook) {
|
35
|
-
proc do
|
36
|
-
config.views.paths = ["my_templates"]
|
37
|
-
end
|
38
|
-
}
|
39
|
-
|
40
|
-
it "configures the path as the relative path appended to the slice's root path" do
|
41
|
-
expect(paths.map { |path| path.dir.to_s }).to eq ["/test_app/app/my_templates"]
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
context "absolute path provided in app config" do
|
46
|
-
let(:app_hook) {
|
47
|
-
proc do
|
48
|
-
config.views.paths = ["/absolute/path"]
|
49
|
-
end
|
50
|
-
}
|
51
|
-
|
52
|
-
it "leaves the absolute path in place" do
|
53
|
-
expect(paths.map { |path| path.dir.to_s }).to eq ["/absolute/path"]
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|