phlexible 2.1.0 → 2.2.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 21073cfcdc42c7f7e5b45acded4e215b292dc6a4ba249680421e5773d1fb4f71
4
- data.tar.gz: ca39ee5c91a5cd5f6a69bde6a630078877485b0f68233c639c4fede9d1cca0a6
3
+ metadata.gz: 70c94bf6c1a9eb6c37f22444fb384f9083ade53cee6939d1d651dc5ac3d9d43e
4
+ data.tar.gz: 48740ed58950fe01c78f8fdc5cb8953839e416f8d4b0d50337fc8b063cc9fc77
5
5
  SHA512:
6
- metadata.gz: e3bc48aace4119e705d9125de82e854ce0bf1c3d1ad6e9a041381903d5e7bf5e2f8ce3be61eb81f0c9b7c252d5163f7566a8098132bffc866feccee7aecd2b66
7
- data.tar.gz: 1a0a10ace59181e18d07ef13321ce24d8991767df940f4bd1e16e6f93e357915df0a8ee2208895919f9ecc6de05759fba60b74f5ff4d3af8b16fd1c12232bcf8
6
+ metadata.gz: 8c31e7fd6181675ca02be9d25939adc858777224844c9cfaa0c767551ffad050cb1078d9f537a25887a3226b7b693901a62ec06faabf604a7c8d698ee5217e37
7
+ data.tar.gz: 1de0fab43ab9d7ec708b5b6388d1071cf1a9002a7d29967095f7e4fffa89d7cc07e6f47c9ebb24384c6baeed6bc9cbcb1393b07a28417232c334e54508e55364
data/Gemfile CHANGED
@@ -6,6 +6,7 @@ source 'https://rubygems.org'
6
6
  gemspec
7
7
 
8
8
  gem 'combustion'
9
+ gem 'debug'
9
10
  gem 'phlex-testing-nokogiri'
10
11
  gem 'rake', '~> 13.0'
11
12
  gem 'rubocop', '~> 1.55'
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- phlexible (2.1.0)
4
+ phlexible (2.2.0)
5
5
  phlex (>= 1.10.0, < 2.0.0)
6
6
  phlex-rails (>= 1.2.1, < 2.0.0)
7
7
 
@@ -50,6 +50,9 @@ GEM
50
50
  connection_pool (2.5.0)
51
51
  crass (1.0.6)
52
52
  date (3.4.1)
53
+ debug (1.10.0)
54
+ irb (~> 1.10)
55
+ reline (>= 0.3.8)
53
56
  drb (2.2.1)
54
57
  erubi (1.13.1)
55
58
  i18n (1.14.7)
@@ -155,6 +158,7 @@ PLATFORMS
155
158
 
156
159
  DEPENDENCIES
157
160
  combustion
161
+ debug
158
162
  phlex-testing-nokogiri
159
163
  phlexible!
160
164
  rake (~> 13.0)
data/README.md CHANGED
@@ -36,6 +36,32 @@ class UsersController
36
36
  end
37
37
  ```
38
38
 
39
+ #### `Callbacks`
40
+
41
+ While Phlex does have `before_template`, `after_template`, and `around_template` hooks, they must be defined as regular Ruby methods, meaning you have to always remember to call `super` when redefining any hook method.
42
+
43
+ This module provides a more Rails-like interface for defining callbacks in your Phlex views, using `ActiveSupport::Callbacks`. It implements the same `before_template`, `after_template`, and `around_template` hooks as callbacks.
44
+
45
+ ```ruby
46
+ class Views::Users::Index < Views::Base
47
+ include Phlexible::Callbacks
48
+
49
+ before_template :set_title
50
+
51
+ def view_template
52
+ h1 { @title }
53
+ end
54
+
55
+ private
56
+
57
+ def set_title
58
+ @title = 'Users'
59
+ end
60
+ end
61
+ ```
62
+
63
+ You can still use the regular `before_template`, `after_template`, and `around_template` hooks as well, but I recommend that if you include this module, that you use callbacks instead.
64
+
39
65
  #### `ControllerVariables`
40
66
 
41
67
  > Available in **>= 1.0.0**
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/callbacks'
4
+
5
+ module Phlexible
6
+ module Callbacks
7
+ extend ActiveSupport::Concern
8
+ include ActiveSupport::Callbacks
9
+
10
+ included do
11
+ define_callbacks :initialize, :template
12
+ end
13
+
14
+ class_methods do
15
+ def new(...)
16
+ obj = super
17
+ obj.run_callbacks :initialize, :after
18
+ obj
19
+ end
20
+
21
+ def after_initialize(*names, &block)
22
+ set_callback(:initialize, :after, *names, &block)
23
+ end
24
+
25
+ def around_template(*names, &block)
26
+ set_callback(:template, :around, *names, &block)
27
+ end
28
+
29
+ def before_template(*names, &block)
30
+ set_callback(:template, :before, *names, &block)
31
+ end
32
+
33
+ def after_template(*names, &block)
34
+ set_callback(:template, :after, *names, &block)
35
+ end
36
+ end
37
+
38
+ def around_template
39
+ run_callbacks :template do
40
+ super
41
+ end
42
+ end
43
+ end
44
+ end
@@ -26,6 +26,8 @@ module Phlexible
26
26
  def self.included(klass)
27
27
  klass.class_attribute :__controller_variables__, instance_predicate: false, default: Set.new
28
28
  klass.extend ClassMethods
29
+ klass.include Callbacks
30
+ klass.before_template :define_controller_variables
29
31
  end
30
32
 
31
33
  class UndefinedVariable < NameError
@@ -36,27 +38,27 @@ module Phlexible
36
38
  end
37
39
  end
38
40
 
39
- def before_template # rubocop:disable Metrics
40
- if respond_to?(:__controller_variables__)
41
- view_assigns = helpers.controller.view_assigns
42
- view = @view
43
-
44
- vars = (view&.__controller_variables__ || Set.new) + __controller_variables__
45
- vars.each do |k, v|
46
- allow_undefined = true
47
- if k.ends_with?('!')
48
- allow_undefined = false
49
- k = k.chop
50
- end
41
+ private
42
+
43
+ def define_controller_variables # rubocop:disable Metrics
44
+ return unless respond_to?(:__controller_variables__)
51
45
 
52
- raise ControllerVariables::UndefinedVariable, k if !allow_undefined && !view_assigns.key?(k)
46
+ view_assigns = helpers.controller.view_assigns
47
+ view = @view
53
48
 
54
- instance_variable_set(:"@#{v}", view_assigns[k])
55
- view&.instance_variable_set(:"@#{v}", view_assigns[k])
49
+ vars = (view&.__controller_variables__ || Set.new) + __controller_variables__
50
+ vars.each do |k, v|
51
+ allow_undefined = true
52
+ if k.ends_with?('!')
53
+ allow_undefined = false
54
+ k = k.chop
56
55
  end
57
- end
58
56
 
59
- super
57
+ raise ControllerVariables::UndefinedVariable, k if !allow_undefined && !view_assigns.key?(k)
58
+
59
+ instance_variable_set(:"@#{v}", view_assigns[k])
60
+ view&.instance_variable_set(:"@#{v}", view_assigns[k])
61
+ end
60
62
  end
61
63
 
62
64
  module ClassMethods
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Phlexible
4
- VERSION = '2.1.0'
4
+ VERSION = '2.2.0'
5
5
  end
data/lib/phlexible.rb CHANGED
@@ -6,5 +6,6 @@ require 'phlex'
6
6
  module Phlexible
7
7
  autoload :AliasView, 'phlexible/alias_view'
8
8
  autoload :PageTitle, 'phlexible/page_title'
9
+ autoload :Callbacks, 'phlexible/callbacks'
9
10
  autoload :Rails, 'phlexible/rails'
10
11
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: phlexible
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joel Moss
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2025-02-05 00:00:00.000000000 Z
10
+ date: 2025-02-11 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: phlex
@@ -79,6 +79,7 @@ files:
79
79
  - fixtures/rails_helper.rb
80
80
  - lib/phlexible.rb
81
81
  - lib/phlexible/alias_view.rb
82
+ - lib/phlexible/callbacks.rb
82
83
  - lib/phlexible/page_title.rb
83
84
  - lib/phlexible/rails.rb
84
85
  - lib/phlexible/rails/a_element.rb