hanami 2.0.3 → 2.1.0.beta2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (103) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +37 -2
  3. data/LICENSE.md +1 -1
  4. data/README.md +26 -10
  5. data/hanami.gemspec +2 -2
  6. data/lib/hanami/app.rb +5 -0
  7. data/lib/hanami/config/actions.rb +4 -11
  8. data/lib/hanami/config/assets.rb +84 -0
  9. data/lib/hanami/config/null_config.rb +3 -0
  10. data/lib/hanami/config/views.rb +0 -4
  11. data/lib/hanami/config.rb +71 -5
  12. data/lib/hanami/extensions/action/slice_configured_action.rb +15 -7
  13. data/lib/hanami/extensions/action.rb +8 -6
  14. data/lib/hanami/extensions/router/errors.rb +58 -0
  15. data/lib/hanami/extensions/view/context.rb +129 -60
  16. data/lib/hanami/extensions/view/part.rb +26 -0
  17. data/lib/hanami/extensions/view/scope.rb +26 -0
  18. data/lib/hanami/extensions/view/slice_configured_context.rb +0 -2
  19. data/lib/hanami/extensions/view/slice_configured_helpers.rb +44 -0
  20. data/lib/hanami/extensions/view/slice_configured_view.rb +106 -21
  21. data/lib/hanami/extensions/view/standard_helpers.rb +18 -0
  22. data/lib/hanami/extensions.rb +10 -3
  23. data/lib/hanami/helpers/assets_helper.rb +752 -0
  24. data/lib/hanami/helpers/form_helper/form_builder.rb +1391 -0
  25. data/lib/hanami/helpers/form_helper/values.rb +75 -0
  26. data/lib/hanami/helpers/form_helper.rb +213 -0
  27. data/lib/hanami/middleware/assets.rb +21 -0
  28. data/lib/hanami/middleware/public_errors_app.rb +75 -0
  29. data/lib/hanami/middleware/render_errors.rb +90 -0
  30. data/lib/hanami/providers/assets.rb +44 -0
  31. data/lib/hanami/rake_tasks.rb +19 -18
  32. data/lib/hanami/settings.rb +1 -1
  33. data/lib/hanami/slice.rb +48 -2
  34. data/lib/hanami/slice_configurable.rb +3 -2
  35. data/lib/hanami/version.rb +1 -1
  36. data/lib/hanami/web/rack_logger.rb +1 -1
  37. data/lib/hanami.rb +3 -3
  38. data/spec/integration/action/view_rendering/view_context_spec.rb +221 -0
  39. data/spec/integration/action/view_rendering_spec.rb +0 -18
  40. data/spec/integration/assets/assets_spec.rb +101 -0
  41. data/spec/integration/assets/serve_static_assets_spec.rb +152 -0
  42. data/spec/integration/logging/exception_logging_spec.rb +115 -0
  43. data/spec/integration/logging/notifications_spec.rb +68 -0
  44. data/spec/integration/logging/request_logging_spec.rb +128 -0
  45. data/spec/integration/rack_app/middleware_spec.rb +22 -22
  46. data/spec/integration/rack_app/rack_app_spec.rb +3 -220
  47. data/spec/integration/rake_tasks_spec.rb +107 -0
  48. data/spec/integration/view/config/default_context_spec.rb +149 -0
  49. data/spec/integration/view/{inflector_spec.rb → config/inflector_spec.rb} +1 -1
  50. data/spec/integration/view/config/part_class_spec.rb +147 -0
  51. data/spec/integration/view/config/part_namespace_spec.rb +103 -0
  52. data/spec/integration/view/config/paths_spec.rb +119 -0
  53. data/spec/integration/view/config/scope_class_spec.rb +147 -0
  54. data/spec/integration/view/config/scope_namespace_spec.rb +103 -0
  55. data/spec/integration/view/config/template_spec.rb +38 -0
  56. data/spec/integration/view/context/assets_spec.rb +3 -9
  57. data/spec/integration/view/context/request_spec.rb +3 -7
  58. data/spec/integration/view/helpers/form_helper_spec.rb +174 -0
  59. data/spec/integration/view/helpers/part_helpers_spec.rb +124 -0
  60. data/spec/integration/view/helpers/scope_helpers_spec.rb +84 -0
  61. data/spec/integration/view/helpers/user_defined_helpers/part_helpers_spec.rb +162 -0
  62. data/spec/integration/view/helpers/user_defined_helpers/scope_helpers_spec.rb +119 -0
  63. data/spec/integration/view/slice_configuration_spec.rb +9 -9
  64. data/spec/integration/web/render_detailed_errors_spec.rb +107 -0
  65. data/spec/integration/web/render_errors_spec.rb +242 -0
  66. data/spec/spec_helper.rb +1 -1
  67. data/spec/support/app_integration.rb +46 -2
  68. data/spec/support/matchers.rb +32 -0
  69. data/spec/unit/hanami/config/actions/content_security_policy_spec.rb +24 -36
  70. data/spec/unit/hanami/config/actions/csrf_protection_spec.rb +4 -3
  71. data/spec/unit/hanami/config/actions/default_values_spec.rb +3 -6
  72. data/spec/unit/hanami/config/render_detailed_errors_spec.rb +25 -0
  73. data/spec/unit/hanami/config/render_errors_spec.rb +25 -0
  74. data/spec/unit/hanami/config/views_spec.rb +0 -18
  75. data/spec/unit/hanami/env_spec.rb +11 -25
  76. data/spec/unit/hanami/extensions/view/context_spec.rb +59 -0
  77. data/spec/unit/hanami/helpers/assets_helper/asset_url_spec.rb +109 -0
  78. data/spec/unit/hanami/helpers/assets_helper/audio_tag_spec.rb +132 -0
  79. data/spec/unit/hanami/helpers/assets_helper/favicon_link_tag_spec.rb +91 -0
  80. data/spec/unit/hanami/helpers/assets_helper/image_tag_spec.rb +92 -0
  81. data/spec/unit/hanami/helpers/assets_helper/javascript_tag_spec.rb +143 -0
  82. data/spec/unit/hanami/helpers/assets_helper/stylesheet_link_tag_spec.rb +126 -0
  83. data/spec/unit/hanami/helpers/assets_helper/video_tag_spec.rb +132 -0
  84. data/spec/unit/hanami/helpers/form_helper_spec.rb +2826 -0
  85. data/spec/unit/hanami/router/errors/not_allowed_error_spec.rb +27 -0
  86. data/spec/unit/hanami/router/errors/not_found_error_spec.rb +22 -0
  87. data/spec/unit/hanami/slice_configurable_spec.rb +18 -0
  88. data/spec/unit/hanami/version_spec.rb +1 -1
  89. data/spec/unit/hanami/web/rack_logger_spec.rb +1 -1
  90. metadata +95 -35
  91. data/lib/hanami/assets/app_config.rb +0 -61
  92. data/lib/hanami/assets/config.rb +0 -53
  93. data/spec/integration/action/view_integration_spec.rb +0 -165
  94. data/spec/integration/view/part_namespace_spec.rb +0 -96
  95. data/spec/integration/view/path_spec.rb +0 -56
  96. data/spec/integration/view/template_spec.rb +0 -68
  97. data/spec/isolation/hanami/application/already_configured_spec.rb +0 -19
  98. data/spec/isolation/hanami/application/inherit_anonymous_class_spec.rb +0 -10
  99. data/spec/isolation/hanami/application/inherit_concrete_class_spec.rb +0 -14
  100. data/spec/isolation/hanami/application/not_configured_spec.rb +0 -9
  101. data/spec/isolation/hanami/application/routes/configured_spec.rb +0 -44
  102. data/spec/isolation/hanami/application/routes/not_configured_spec.rb +0 -16
  103. data/spec/isolation/hanami/boot/success_spec.rb +0 -50
@@ -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
@@ -1,68 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "hanami"
4
-
5
- RSpec.describe "App view / Template", :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
- subject(:template) { view_class.config.template }
24
-
25
- context "Ordinary app view" do
26
- before do
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
- let(:view_class) { TestApp::Views::Article::Index }
38
-
39
- it "configures the tempalte to match the class name" do
40
- expect(template).to eq "article/index"
41
- end
42
- end
43
-
44
- context "Slice view with namespace matching template inference base" do
45
- before do
46
- module TestApp
47
- module MyViews
48
- module Users
49
- class Show < TestApp::View
50
- end
51
- end
52
- end
53
- end
54
- end
55
-
56
- let(:app_hook) {
57
- proc do
58
- config.views.template_inference_base = "my_views"
59
- end
60
- }
61
-
62
- let(:view_class) { TestApp::MyViews::Users::Show }
63
-
64
- it "configures the tempalte to match the class name" do
65
- expect(template).to eq "users/show"
66
- end
67
- end
68
- end
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Bookshelf
4
- class App < Hanami::App
5
- end
6
- end
7
-
8
- RSpec.describe Hanami do
9
- describe ".application" do
10
- it "it raises error when already assigned" do
11
- expect do
12
- module Soundcard
13
- class App < Hanami::App
14
- end
15
- end
16
- end.to raise_error("Hanami.app already configured")
17
- end
18
- end
19
- end
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Hanami do
4
- describe ".application" do
5
- it "it doesn't assign when anonymous class inherits Hanami::Application" do
6
- Class.new(Hanami::Application)
7
- expect { Hanami.app }.to raise_error("Hanami.app not configured")
8
- end
9
- end
10
- end
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Bookshelf
4
- class App < Hanami::App
5
- end
6
- end
7
-
8
- RSpec.describe Hanami do
9
- describe ".application" do
10
- it "it assign when concrete class inherits Hanami::Application" do
11
- expect(Hanami.app).to eq(Bookshelf::Application)
12
- end
13
- end
14
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Hanami do
4
- describe ".application" do
5
- it "it raises error when not configured" do
6
- expect { Hanami.app }.to raise_error("Hanami.app not configured")
7
- end
8
- end
9
- end
@@ -1,44 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "hanami/action"
4
-
5
- module Bookshelf
6
- class App < Hanami::App
7
- end
8
- end
9
-
10
- module Web
11
- end
12
- Hanami.app.register_slice :web, namespace: Web
13
-
14
- Hanami.prepare
15
-
16
- module Web
17
- class Action < Hanami::Action
18
- end
19
-
20
- module Actions
21
- module Home
22
- class Index < Web::Action
23
- end
24
- end
25
- end
26
- end
27
-
28
- Hanami.app.routes do
29
- mount :web, at: "/" do
30
- root to: "home#index"
31
- end
32
- end
33
-
34
- RSpec.describe Hanami::Application do
35
- describe ".routes" do
36
- subject { Hanami.app.routes }
37
-
38
- it "returns configured routes" do
39
- expect(subject).to be_kind_of(Proc)
40
- # FIXME: make this expectation to pass
41
- # expect(subject.for(:web).url(:root)).to eq("/")
42
- end
43
- end
44
- end
@@ -1,16 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Bookshelf
4
- class App < Hanami::App
5
- end
6
- end
7
-
8
- RSpec.describe Hanami::Application do
9
- describe ".routes" do
10
- subject { Hanami.app.routes }
11
-
12
- it "raises error when not configured" do
13
- expect { subject }.to raise_error("Hanami.app.routes not configured")
14
- end
15
- end
16
- end
@@ -1,50 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "hanami/action"
4
- require "hanami/logger"
5
-
6
- module Bookshelf
7
- class App < Hanami::App
8
- end
9
- end
10
-
11
- module Web
12
- end
13
- slice = Hanami.app.register_slice :web, namespace: Web
14
-
15
- Hanami.prepare
16
-
17
- Hanami.app.routes do
18
- mount :web, at: "/" do
19
- root to: "home#index"
20
- end
21
- end
22
-
23
- module Web
24
- class Action < Hanami::Action
25
- end
26
-
27
- module Actions
28
- module Home
29
- class Index < Web::Action
30
- end
31
- end
32
- end
33
- end
34
-
35
- slice.register "actions.home.index" do
36
- Web::Actions::Home::Index.new
37
- end
38
-
39
- RSpec.describe Hanami do
40
- describe ".boot" do
41
- it "assigns Hanami.app, .root, and .logger" do
42
- pending "Failing due to dry-system changes"
43
-
44
- Hanami.boot
45
- expect(Hanami.app.ancestors).to include(Hanami::Application)
46
- expect(Hanami.app.root).to eq(Dir.pwd)
47
- expect(Hanami.logger).to be_kind_of(Dry::Logger::Dispatcher)
48
- end
49
- end
50
- end