hanami-view 2.0.0.alpha3 → 2.0.0.alpha7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b6b6dc01adb32ad3baabc7a15012119e8814de8ec999c4b5da2009204c3b047c
4
- data.tar.gz: 8ef681f6101b085dec6e03f6de0815dfa55d8cbd91e960bf0144e4a46da5cce9
3
+ metadata.gz: 5f1426ce046073c71aeffe9a171b0b0343704686bb92b75046526858ca82f9e8
4
+ data.tar.gz: 14a7f4078a42e3abd63e5411da1a2fa4b19fdfeaf405184c9c1f11bda7e78210
5
5
  SHA512:
6
- metadata.gz: b5704c147558d2a0e3e86d59f3b665ee65265a9398584b1d3478970551d9a022551ea04420444622c2c4967ab3406d29ea9dab7c13462207364ea985aa4af723
7
- data.tar.gz: 5909511de76e1daf91a375c5947103040c2ec40208ea52882771204249cc2d4aef23d2ceaa8dac24cc960dbba978f3e4c6c08fac52118673b9c22580571f10fb
6
+ metadata.gz: 1a0f2cca15e556ee2c93396f730c6b68d3a7799ec0c2cbebc574b5c73c0315d2192c89ad8d85ad1b273d03b80132b3acf2348befab3c7f22fff28b1ef7e82667
7
+ data.tar.gz: 5032a5b1c0891a369bf518cf12d0baad00dcfb688ac41625dd61818b635b8ef6dea498a574c9558249a0beb2cd905553b253bb5a0a8b82245030664d0f7bd629
data/CHANGELOG.md CHANGED
@@ -1,6 +1,30 @@
1
1
  # Hanami::View
2
2
  View layer for Hanami
3
3
 
4
+ ## v2.0.0.alpha7 - 2022-03-08
5
+
6
+ ### Added
7
+ - [Luca Guidi] Automatically inject the app's `settings` and `assets` components (if present) into instances of `Hanami::View::ApplicationContext`
8
+ - [Luca Guidi] Temporarily added to `Hanami::View::ApplicationContext` the `#content_for`, `#current_path` `#csrf_token` helpers, ported from the hanami-2-application-template. Some of those helpers will be moved to `hanami-helpers` gem in a later release.
9
+
10
+ ### Changed
11
+ - [Sean Collins] For views within an Hanami application, changed default location for templates from "web/templates" to "templates"
12
+ - [Luca Guidi] For views within an Hanami application, the default `part_namespace` is now `"view/parts"` (previously `"views/parts"`)
13
+
14
+ ## Fixed
15
+ - [Luca Guidi] Application-level configuration is now applied to `Hanami::View` subclasses, no matter how deep their inheritance chain (e.g. app base view -> slice base view -> slice view)
16
+
17
+ ## v2.0.0.alpha6 - 2022-02-10
18
+ ### Added
19
+ - [Luca Guidi] Official support for Ruby: MRI 3.0 and 3.1
20
+
21
+ ### Changed
22
+ - [Luca Guidi] Drop support for Ruby: MRI 2.3, 2.4, 2.5, 2.6, and 2.7.
23
+
24
+ ## v2.0.0.alpha5 - 2022-01-12
25
+ ### Added
26
+ - [Marc Busqué] Automatically provide access to Hanami application routes helper as `routes` in default application view context (`Hanami::View::ApplicationContext`)
27
+
4
28
  ## v2.0.0.alpha3 - 2021-11-09
5
29
  ### Added
6
30
  - [Pablo Vicente] Raise `LayoutNotFoundError` exception with friendlier, more specific error message when layouts cannot be found
data/README.md CHANGED
@@ -26,7 +26,7 @@ A view layer for [Hanami](http://hanamirb.org)
26
26
 
27
27
  ## Rubies
28
28
 
29
- __Hanami::view__ supports Ruby (MRI) 2.6+
29
+ __Hanami::view__ supports Ruby (MRI) 3.0+
30
30
 
31
31
  ## Installation
32
32
 
data/hanami-view.gemspec CHANGED
@@ -18,13 +18,14 @@ Gem::Specification.new do |spec|
18
18
  spec.bindir = 'bin'
19
19
  spec.executables = []
20
20
  spec.require_paths = ['lib']
21
+ spec.metadata["rubygems_mfa_required"] = "true"
21
22
 
22
23
  spec.metadata['allowed_push_host'] = 'https://rubygems.org'
23
24
  spec.metadata['changelog_uri'] = 'https://github.com/hanami/view/blob/main/CHANGELOG.md'
24
25
  spec.metadata['source_code_uri'] = 'https://github.com/hanami/view'
25
26
  spec.metadata['bug_tracker_uri'] = 'https://github.com/hanami/view/issues'
26
27
 
27
- spec.required_ruby_version = ">= 2.4.0"
28
+ spec.required_ruby_version = ">= 3.0"
28
29
 
29
30
  spec.add_runtime_dependency "concurrent-ruby", "~> 1.0"
30
31
  spec.add_runtime_dependency "dry-configurable", "~> 0.13", ">= 0.13.0"
@@ -8,7 +8,7 @@ module Hanami
8
8
  class ApplicationConfiguration
9
9
  include Dry::Configurable
10
10
 
11
- setting :parts_path, default: "views/parts"
11
+ setting :parts_path, default: "view/parts"
12
12
 
13
13
  def initialize(*)
14
14
  super
@@ -41,7 +41,7 @@ module Hanami
41
41
  attr_reader :base_config
42
42
 
43
43
  def configure_defaults
44
- self.paths = ["web/templates"]
44
+ self.paths = ["templates"]
45
45
  self.template_inference_base = "views"
46
46
  self.layout = "application"
47
47
  end
@@ -1,34 +1,97 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "hanami/view/errors"
4
+
3
5
  module Hanami
4
6
  class View
5
- module ApplicationContext
6
- def initialize(inflector: Hanami.application.inflector, **options)
7
- @inflector = inflector
8
- super
9
- end
7
+ class ApplicationContext < Module
8
+ attr_reader :provider
9
+ attr_reader :application
10
10
 
11
- def inflector
12
- @inflector
11
+ def initialize(provider)
12
+ @provider = provider
13
+ @application = provider.respond_to?(:application) ? provider.application : Hanami.application
13
14
  end
14
15
 
15
- def request
16
- _options.fetch(:request)
16
+ def included(context_class)
17
+ define_initialize
18
+ context_class.include(InstanceMethods)
17
19
  end
18
20
 
19
- def session
20
- request.session
21
- end
21
+ private
22
+
23
+ def define_initialize
24
+ inflector = application.inflector
25
+ settings = application[:settings] if application.key?(:settings)
26
+ routes = application[:routes_helper] if application.key?(:routes_helper)
27
+ assets = application[:assets] if application.key?(:assets)
22
28
 
23
- def flash
24
- response.flash
29
+ define_method :initialize do |**options|
30
+ @inflector = options[:inflector] || inflector
31
+ @settings = options[:settings] || settings
32
+ @routes = options[:routes] || routes
33
+ @assets = options[:assets] || assets
34
+ super(**options)
35
+ end
25
36
  end
26
37
 
27
- private
38
+ module InstanceMethods
39
+ attr_reader :inflector
40
+ attr_reader :routes
41
+ attr_reader :settings
42
+
43
+ def initialize(**args)
44
+ defaults = {content: {}}
45
+
46
+ super(**defaults.merge(args))
47
+ end
48
+
49
+ def content_for(key, value = nil, &block)
50
+ content = _options[:content]
51
+ output = nil
52
+
53
+ if block
54
+ content[key] = yield
55
+ elsif value
56
+ content[key] = value
57
+ else
58
+ output = content[key]
59
+ end
60
+
61
+ output
62
+ end
63
+
64
+ def current_path
65
+ request.fullpath
66
+ end
67
+
68
+ def csrf_token
69
+ request.session[Hanami::Action::CSRFProtection::CSRF_TOKEN]
70
+ end
71
+
72
+ def request
73
+ _options.fetch(:request)
74
+ end
75
+
76
+ def session
77
+ request.session
78
+ end
79
+
80
+ def flash
81
+ response.flash
82
+ end
83
+
84
+ def assets
85
+ @assets or
86
+ raise Hanami::View::MissingProviderError.new("hanami-assets")
87
+ end
88
+
89
+ private
28
90
 
29
- # TODO: create `Request#flash` so we no longer need the `response`
30
- def response
31
- _options.fetch(:response)
91
+ # TODO: create `Request#flash` so we no longer need the `response`
92
+ def response
93
+ _options.fetch(:response)
94
+ end
32
95
  end
33
96
  end
34
97
  end
@@ -23,8 +23,9 @@ module Hanami
23
23
  super
24
24
 
25
25
  # When inheriting within an Hanami app, add application context behavior
26
- if application_provider(subclass)
27
- subclass.include ApplicationContext
26
+ provider = application_provider(subclass)
27
+ if provider
28
+ subclass.include ApplicationContext.new(provider)
28
29
  end
29
30
  end
30
31
 
@@ -2,6 +2,11 @@
2
2
 
3
3
  module Hanami
4
4
  class View
5
+ # @since 2.0.0
6
+ # @api public
7
+ class Error < StandardError
8
+ end
9
+
5
10
  # Error raised when critical settings are not configured
6
11
  #
7
12
  # @api private
@@ -40,5 +45,13 @@ module Hanami
40
45
  super(msg)
41
46
  end
42
47
  end
48
+
49
+ # @since 2.0.0
50
+ # @api public
51
+ class MissingProviderError < Error
52
+ def initialize(provider)
53
+ super("#{provider.inspect} is missing")
54
+ end
55
+ end
43
56
  end
44
57
  end
@@ -3,6 +3,6 @@
3
3
  module Hanami
4
4
  class View
5
5
  # @api private
6
- VERSION = "2.0.0.alpha3"
6
+ VERSION = "2.0.0.alpha7"
7
7
  end
8
8
  end
data/lib/hanami/view.rb CHANGED
@@ -235,9 +235,10 @@ module Hanami
235
235
  def self.inherited(subclass)
236
236
  super
237
237
 
238
- # If inheriting directly from Hanami::View within an Hanami app, configure
239
- # the view for the application
240
- if subclass.superclass == View && (provider = application_provider(subclass))
238
+ # When inheriting within an Hanami app, and the application provider has
239
+ # changed from the superclass, (re-)configure the action for the provider,
240
+ # i.e. for the slice and/or the application itself
241
+ if (provider = application_provider(subclass)) && provider != application_provider(subclass.superclass)
241
242
  subclass.include ApplicationView.new(provider)
242
243
  end
243
244
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hanami-view
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.alpha3
4
+ version: 2.0.0.alpha7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Riley
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-11-09 00:00:00.000000000 Z
12
+ date: 2022-03-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: concurrent-ruby
@@ -184,6 +184,7 @@ homepage: https://dry-rb.org/gems/hanami-view
184
184
  licenses:
185
185
  - MIT
186
186
  metadata:
187
+ rubygems_mfa_required: 'true'
187
188
  allowed_push_host: https://rubygems.org
188
189
  changelog_uri: https://github.com/hanami/view/blob/main/CHANGELOG.md
189
190
  source_code_uri: https://github.com/hanami/view
@@ -196,14 +197,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
196
197
  requirements:
197
198
  - - ">="
198
199
  - !ruby/object:Gem::Version
199
- version: 2.4.0
200
+ version: '3.0'
200
201
  required_rubygems_version: !ruby/object:Gem::Requirement
201
202
  requirements:
202
203
  - - ">"
203
204
  - !ruby/object:Gem::Version
204
205
  version: 1.3.1
205
206
  requirements: []
206
- rubygems_version: 3.2.3
207
+ rubygems_version: 3.3.3
207
208
  signing_key:
208
209
  specification_version: 4
209
210
  summary: A complete, standalone view rendering system that gives you everything you