pakyow-presenter 1.0.0.rc2 → 1.0.0.rc3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/lib/pakyow/{presenter/actions → actions/presenter}/auto_render.rb +2 -2
  3. data/lib/pakyow/plugin/helpers/rendering.rb +15 -2
  4. data/lib/pakyow/presenter.rb +1 -1
  5. data/lib/pakyow/presenter/attributes.rb +8 -0
  6. data/lib/pakyow/presenter/attributes/attribute.rb +0 -1
  7. data/lib/pakyow/presenter/attributes/boolean.rb +0 -1
  8. data/lib/pakyow/presenter/behavior/error_rendering.rb +1 -0
  9. data/lib/pakyow/presenter/behavior/initializing.rb +1 -1
  10. data/lib/pakyow/presenter/behavior/modes.rb +1 -0
  11. data/lib/pakyow/presenter/binder.rb +2 -0
  12. data/lib/pakyow/presenter/binding_parts.rb +1 -0
  13. data/lib/pakyow/presenter/component.rb +1 -4
  14. data/lib/pakyow/presenter/composers/component.rb +1 -0
  15. data/lib/pakyow/presenter/composers/view.rb +1 -0
  16. data/lib/pakyow/presenter/errors.rb +2 -2
  17. data/lib/pakyow/presenter/framework.rb +22 -25
  18. data/lib/pakyow/presenter/presenter.rb +5 -0
  19. data/lib/pakyow/presenter/presenters/endpoint.rb +3 -3
  20. data/lib/pakyow/presenter/presenters/form.rb +5 -5
  21. data/lib/pakyow/presenter/processor.rb +42 -38
  22. data/lib/pakyow/presenter/renderer.rb +6 -1
  23. data/lib/pakyow/presenter/renderer/behavior/cleanup_prototype_nodes.rb +23 -0
  24. data/lib/pakyow/presenter/renderer/behavior/cleanup_unbound_bindings.rb +37 -0
  25. data/lib/pakyow/presenter/renderer/behavior/create_template_nodes.rb +29 -0
  26. data/lib/pakyow/presenter/renderer/behavior/insert_prototype_bar.rb +103 -0
  27. data/lib/pakyow/presenter/renderer/behavior/install_authenticity.rb +44 -0
  28. data/lib/pakyow/presenter/renderer/behavior/place_in_mode.rb +58 -0
  29. data/lib/pakyow/presenter/renderer/behavior/render_components.rb +281 -0
  30. data/lib/pakyow/presenter/renderer/behavior/set_page_title.rb +37 -0
  31. data/lib/pakyow/presenter/renderer/behavior/setup_endpoints.rb +64 -0
  32. data/lib/pakyow/presenter/renderer/behavior/setup_forms.rb +176 -0
  33. data/lib/pakyow/presenter/significant_nodes.rb +2 -2
  34. data/lib/pakyow/presenter/templates.rb +24 -15
  35. data/lib/pakyow/presenter/versioned_view.rb +1 -0
  36. data/lib/pakyow/presenter/view.rb +11 -9
  37. data/lib/pakyow/presenter/views/form.rb +39 -35
  38. data/lib/pakyow/presenter/views/layout.rb +20 -18
  39. data/lib/pakyow/presenter/views/page.rb +47 -45
  40. data/lib/pakyow/presenter/views/partial.rb +17 -15
  41. data/lib/string_doc.rb +3 -1
  42. data/lib/string_doc/attributes.rb +1 -0
  43. data/lib/string_doc/meta_attributes.rb +1 -0
  44. data/lib/string_doc/meta_node.rb +1 -0
  45. data/lib/string_doc/node.rb +1 -0
  46. metadata +19 -20
  47. data/lib/pakyow/presenter/presentable_error.rb +0 -19
  48. data/lib/pakyow/presenter/rendering/actions/cleanup_prototype_nodes.rb +0 -21
  49. data/lib/pakyow/presenter/rendering/actions/cleanup_unbound_bindings.rb +0 -35
  50. data/lib/pakyow/presenter/rendering/actions/create_template_nodes.rb +0 -27
  51. data/lib/pakyow/presenter/rendering/actions/insert_prototype_bar.rb +0 -101
  52. data/lib/pakyow/presenter/rendering/actions/install_authenticity.rb +0 -42
  53. data/lib/pakyow/presenter/rendering/actions/place_in_mode.rb +0 -56
  54. data/lib/pakyow/presenter/rendering/actions/render_components.rb +0 -279
  55. data/lib/pakyow/presenter/rendering/actions/set_page_title.rb +0 -35
  56. data/lib/pakyow/presenter/rendering/actions/setup_endpoints.rb +0 -62
  57. data/lib/pakyow/presenter/rendering/actions/setup_forms.rb +0 -174
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b391d208e0ea90895a7b1ffc21a12669d1d69cbc49094a188cd4f8394c277520
4
- data.tar.gz: 6117f575c858ebcacc6ca6c75dc861abf05063f1fc08adc7ab010b8f974cd5df
3
+ metadata.gz: 2edbafe8464ab22539cb0006e33b7e621f469aea71f65f936f53ad7043e098b8
4
+ data.tar.gz: e4bbf5824d079520da80228a16a450d5e8b8591f604771d37f11ac85274a9401
5
5
  SHA512:
6
- metadata.gz: 26371318843936b528aea061116151e032de10387e92e5cb3c93d0565a497478409afb98a5965eaf91722820afd20ab13ba030e21a2a1f6f7ae0cc110c2531f9
7
- data.tar.gz: f8366c589e71899bd7b1234adc7888205108321a5acf16708be42442972d769ef76aa96422f49208b8c0366dabb81086b610d88127cc5eb40a6fa39d58a463cd
6
+ metadata.gz: d3009754a80da03f010543e5dbea35e747fd09d0ede2bdfac525ed321418938853d64941c1b88442d65d5aeacdc9c67195e9e4b5377e3b0e0e4c9c181dd102d2
7
+ data.tar.gz: 0f8d79a0256297763b366307d97ca1b0aa57a6995c86bffec0c00d3ae14829ebb69c38310cba26562118d5687b593175ac36170b926a9f2299d04d8eb67cf9a3
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Pakyow
4
- module Presenter
5
- module Actions
4
+ module Actions
5
+ module Presenter
6
6
  # Renders a view in the case a controller wasn't called.
7
7
  #
8
8
  class AutoRender
@@ -9,8 +9,21 @@ module Pakyow
9
9
  extend Support::Extension
10
10
 
11
11
  prepend_methods do
12
- def render(path = @connection.get(:__endpoint_path) || @connection.path, *args)
13
- super(File.join(@connection.app.class.mount_path, path), *args)
12
+ def render(view_path = nil, as: nil, modes: [:default])
13
+ super(File.join(@connection.app.class.mount_path, view_path), as: as, modes: modes)
14
+ rescue Presenter::UnknownPage
15
+ # Try rendering the view from the app.
16
+ #
17
+ connection = @connection.app.parent.isolated(:Connection).from_connection(
18
+ @connection, :@app => @connection.app.parent
19
+ )
20
+
21
+ connection.app.isolated(:Renderer).render(
22
+ connection,
23
+ view_path: view_path,
24
+ presenter_path: as,
25
+ modes: modes
26
+ )
14
27
  end
15
28
  end
16
29
  end
@@ -30,4 +30,4 @@ require "pakyow/presenter/presenters/form"
30
30
 
31
31
  require "pakyow/presenter/errors"
32
32
 
33
- require "pakyow/presenter/actions/auto_render"
33
+ require "pakyow/actions/presenter/auto_render"
@@ -42,15 +42,23 @@ module Pakyow
42
42
  end
43
43
 
44
44
  # Object for hash attributes
45
+ #
45
46
  ATTRIBUTE_TYPE_HASH = Attributes::Hash
47
+
46
48
  # Object for set attributes
49
+ #
47
50
  ATTRIBUTE_TYPE_SET = Attributes::Set
51
+
48
52
  # Object for boolean attributes
53
+ #
49
54
  ATTRIBUTE_TYPE_BOOLEAN = Attributes::Boolean
55
+
50
56
  # Default attribute object
57
+ #
51
58
  ATTRIBUTE_TYPE_DEFAULT = Attributes::String
52
59
 
53
60
  # Maps non-default attributes to their type
61
+ #
54
62
  ATTRIBUTE_TYPES = {
55
63
  class: ATTRIBUTE_TYPE_SET,
56
64
  style: ATTRIBUTE_TYPE_HASH,
@@ -3,7 +3,6 @@
3
3
  module Pakyow
4
4
  module Presenter
5
5
  class Attributes
6
- # @api private
7
6
  class Attribute
8
7
  def initialize(value)
9
8
  @value = value
@@ -16,7 +16,6 @@ module Pakyow
16
16
  # To support this, +Attributes+ manages setting / removing the value on the
17
17
  # underlying object; all we do is behave like a String.
18
18
  #
19
- # @api private
20
19
  class Boolean < String
21
20
  end
22
21
  end
@@ -15,6 +15,7 @@ module Pakyow
15
15
  module ErrorRendering
16
16
  extend Support::Extension
17
17
 
18
+ # @api private
18
19
  def self.render_error(error, context)
19
20
  context.respond_to :html do
20
21
  if Pakyow.env?(:production)
@@ -51,7 +51,7 @@ module Pakyow
51
51
  }
52
52
 
53
53
  if component_classes.count > 1
54
- state(:presenter) << Actions::RenderComponents.find_or_build_compound_presenter(
54
+ state(:presenter) << Renderer::Behavior::RenderComponents.find_or_build_compound_presenter(
55
55
  self, component_classes
56
56
  )
57
57
  end
@@ -6,6 +6,7 @@ module Pakyow
6
6
  module Presenter
7
7
  module Behavior
8
8
  module Modes
9
+ # @api private
9
10
  class ModeCallContext
10
11
  def initialize(connection)
11
12
  @connection = connection
@@ -41,6 +41,7 @@ module Pakyow
41
41
 
42
42
  # Returns the value for a key (including parts).
43
43
  #
44
+ # @api private
44
45
  def __value(key)
45
46
  if @memoized.include?(key)
46
47
  @memoized[key]
@@ -67,6 +68,7 @@ module Pakyow
67
68
 
68
69
  # Returns only the content value for a key.
69
70
  #
71
+ # @api private
70
72
  def __content(key, view)
71
73
  return_value = __value(key)
72
74
  if return_value.is_a?(BindingParts)
@@ -2,6 +2,7 @@
2
2
 
3
3
  module Pakyow
4
4
  module Presenter
5
+ # @api private
5
6
  class BindingParts
6
7
  def initialize
7
8
  @parts = {}
@@ -7,7 +7,7 @@ require "pakyow/support/makeable/object_maker"
7
7
 
8
8
  module Pakyow
9
9
  module Presenter
10
- # Reusable functionality for a component of your presentation.
10
+ # Reusable functionality for a view component.
11
11
  #
12
12
  class Component
13
13
  extend Support::Makeable
@@ -18,7 +18,6 @@ module Pakyow
18
18
  include Support::Hookable
19
19
  events :render
20
20
 
21
- # @api private
22
21
  attr_reader :connection
23
22
 
24
23
  def initialize(connection:, config: {})
@@ -29,8 +28,6 @@ module Pakyow
29
28
  # intentionally empty
30
29
  end
31
30
 
32
- private
33
-
34
31
  class << self
35
32
  def presenter(&block)
36
33
  @__presenter_class = Class.new(@__presenter_class) do
@@ -12,6 +12,7 @@ require "pakyow/presenter/composers/view"
12
12
  module Pakyow
13
13
  module Presenter
14
14
  module Composers
15
+ # @api private
15
16
  class Component < View
16
17
  using Support::DeepDup
17
18
 
@@ -11,6 +11,7 @@ require "pakyow/presenter/errors"
11
11
  module Pakyow
12
12
  module Presenter
13
13
  module Composers
14
+ # @api private
14
15
  class View
15
16
  extend Support::ClassState
16
17
  class_state :__cache, default: {}
@@ -19,7 +19,7 @@ module Pakyow
19
19
  <<~MESSAGE
20
20
  Pakyow couldn't render a view for `#{String.normalize_path(@context)}`. Try creating a view template for this path:
21
21
 
22
- frontend/pages#{template_path}.html
22
+ frontend/pages#{view_path}.html
23
23
 
24
24
  * [Learn about view templates &rarr;](https://pakyow.com/docs/frontend/composition/)
25
25
  MESSAGE
@@ -27,7 +27,7 @@ module Pakyow
27
27
 
28
28
  private
29
29
 
30
- def template_path
30
+ def view_path
31
31
  if @context.to_s.empty? || @context.to_s == "/"
32
32
  "/index"
33
33
  else
@@ -19,17 +19,16 @@ require "pakyow/presenter/helpers/rendering"
19
19
  require "pakyow/presenter/renderable"
20
20
 
21
21
  require "pakyow/presenter/renderer"
22
-
23
- require "pakyow/presenter/rendering/actions/cleanup_prototype_nodes"
24
- require "pakyow/presenter/rendering/actions/cleanup_unbound_bindings"
25
- require "pakyow/presenter/rendering/actions/create_template_nodes"
26
- require "pakyow/presenter/rendering/actions/insert_prototype_bar"
27
- require "pakyow/presenter/rendering/actions/install_authenticity"
28
- require "pakyow/presenter/rendering/actions/place_in_mode"
29
- require "pakyow/presenter/rendering/actions/render_components"
30
- require "pakyow/presenter/rendering/actions/set_page_title"
31
- require "pakyow/presenter/rendering/actions/setup_endpoints"
32
- require "pakyow/presenter/rendering/actions/setup_forms"
22
+ require "pakyow/presenter/renderer/behavior/cleanup_prototype_nodes"
23
+ require "pakyow/presenter/renderer/behavior/cleanup_unbound_bindings"
24
+ require "pakyow/presenter/renderer/behavior/create_template_nodes"
25
+ require "pakyow/presenter/renderer/behavior/insert_prototype_bar"
26
+ require "pakyow/presenter/renderer/behavior/install_authenticity"
27
+ require "pakyow/presenter/renderer/behavior/place_in_mode"
28
+ require "pakyow/presenter/renderer/behavior/render_components"
29
+ require "pakyow/presenter/renderer/behavior/set_page_title"
30
+ require "pakyow/presenter/renderer/behavior/setup_endpoints"
31
+ require "pakyow/presenter/renderer/behavior/setup_forms"
33
32
 
34
33
  module Pakyow
35
34
  module Presenter
@@ -38,8 +37,6 @@ module Pakyow
38
37
  using Support::Refinements::String::Normalization
39
38
 
40
39
  def boot
41
- require "pakyow/presenter/presentable_error"
42
-
43
40
  object.class_eval do
44
41
  isolate Binder
45
42
  isolate Presenter
@@ -52,20 +49,20 @@ module Pakyow
52
49
  end
53
50
 
54
51
  isolate Renderer do
55
- include Actions::CleanupPrototypeNodes
56
- include Actions::CleanupUnboundBindings
57
- include Actions::InsertPrototypeBar
58
- include Actions::InstallAuthenticity
59
- include Actions::PlaceInMode
60
- include Actions::CreateTemplateNodes
61
- include Actions::SetupEndpoints
62
- include Actions::SetupForms
63
- include Actions::SetPageTitle
52
+ include Renderer::Behavior::CleanupPrototypeNodes
53
+ include Renderer::Behavior::CleanupUnboundBindings
54
+ include Renderer::Behavior::InsertPrototypeBar
55
+ include Renderer::Behavior::InstallAuthenticity
56
+ include Renderer::Behavior::PlaceInMode
57
+ include Renderer::Behavior::CreateTemplateNodes
58
+ include Renderer::Behavior::SetupEndpoints
59
+ include Renderer::Behavior::SetupForms
60
+ include Renderer::Behavior::SetPageTitle
64
61
  end
65
62
 
66
63
  after "load" do
67
64
  isolated(:Renderer) do
68
- include Actions::RenderComponents
65
+ include Renderer::Behavior::RenderComponents
69
66
  end
70
67
  end
71
68
 
@@ -96,7 +93,7 @@ module Pakyow
96
93
  include Behavior::ImplicitRendering
97
94
 
98
95
  action :verify_form_metadata do
99
- if metadata = params[:_form]
96
+ if metadata = params[:"pw-form"]
100
97
  connection.set(
101
98
  :__form,
102
99
  JSON.parse(
@@ -104,7 +101,7 @@ module Pakyow
104
101
  ).indifferentize
105
102
  )
106
103
 
107
- params.delete(:_form)
104
+ params.delete(:"pw-form")
108
105
  end
109
106
  end
110
107
  end
@@ -48,6 +48,7 @@ module Pakyow
48
48
 
49
49
  # The app object.
50
50
  #
51
+ # @api private
51
52
  attr_reader :app
52
53
 
53
54
  def initialize(view, app:, presentables: {})
@@ -76,6 +77,7 @@ module Pakyow
76
77
  # Returns an array of presenters, one for each view binding.
77
78
  #
78
79
  # @see View#find_all
80
+ # @api private
79
81
  def find_all(*names)
80
82
  @view.find_all(*names).map { |view|
81
83
  presenter_for(view)
@@ -94,6 +96,7 @@ module Pakyow
94
96
 
95
97
  # Returns all forms.
96
98
  #
99
+ # @api private
97
100
  def forms
98
101
  @view.forms.map { |form|
99
102
  presenter_for(form)
@@ -112,6 +115,7 @@ module Pakyow
112
115
 
113
116
  # Returns all components.
114
117
  #
118
+ # @api private
115
119
  def components(renderable: false)
116
120
  @view.components(renderable: renderable).map { |component|
117
121
  presenter_for(component)
@@ -583,6 +587,7 @@ module Pakyow
583
587
 
584
588
  attr_reader :path
585
589
 
590
+ # @api private
586
591
  def make(path, **kwargs, &block)
587
592
  path = String.normalize_path(path)
588
593
  super(path, path: path, **kwargs, &block)
@@ -76,9 +76,9 @@ module Pakyow
76
76
  if endpoint_action_presenter.attributes.has?(:href)
77
77
  endpoint_path = __endpoint[:path].to_s
78
78
  if endpoint_path == endpoint_action_presenter.attributes[:href]
79
- attributes[:class].add(:current)
79
+ attributes[:class].add(:"ui-current")
80
80
  elsif endpoint_path.start_with?(endpoint_action_presenter.attributes[:href])
81
- attributes[:class].add(:active)
81
+ attributes[:class].add(:"ui-active")
82
82
  end
83
83
  end
84
84
  when "form"
@@ -99,7 +99,7 @@ module Pakyow
99
99
  View.new(
100
100
  <<~HTML
101
101
  <form action="#{path}" method="post" data-ui="confirmable">
102
- <input type="hidden" name="_method" value="delete">
102
+ <input type="hidden" name="pw-http-method" value="delete">
103
103
  #{view.object.render}
104
104
  </form>
105
105
  HTML
@@ -70,7 +70,7 @@ module Pakyow
70
70
  end
71
71
 
72
72
  # Sets the form method. Automatically handles method overrides by prepending a hidden field
73
- # named `_method` when +method+ is not get or post, setting the form method to +post+.
73
+ # named `pw-http-method` when +method+ is not get or post, setting the form method to +post+.
74
74
  #
75
75
  def method=(method)
76
76
  method = method.to_s.downcase
@@ -212,7 +212,7 @@ module Pakyow
212
212
  def use_binding_nodes
213
213
  view.object.set_label(:bound, true)
214
214
  view.object.children.each_significant_node(:binding, descend: true) do |object|
215
- if Pakyow::Presenter::Form::FIELD_TAGS.include?(object.tagname)
215
+ if Pakyow::Presenter::Views::Form::FIELD_TAGS.include?(object.tagname)
216
216
  object.set_label(:bound, true)
217
217
  end
218
218
  end
@@ -269,7 +269,7 @@ module Pakyow
269
269
  end
270
270
 
271
271
  def method_override_input
272
- html_safe("<input type=\"hidden\" name=\"_method\">")
272
+ html_safe("<input type=\"hidden\" name=\"pw-http-method\">")
273
273
  end
274
274
 
275
275
  def find_or_create_method_override_input
@@ -337,7 +337,7 @@ module Pakyow
337
337
  values = Array.ensure(values).compact
338
338
 
339
339
  if values.any?
340
- field_view = Pakyow::Presenter::Form.from_object(field_presenter.view.object)
340
+ field_view = Pakyow::Presenter::Views::Form.from_object(field_presenter.view.object)
341
341
  field_template = field_view.dup
342
342
  insertable_field = field_view
343
343
  current_field = field_view
@@ -361,7 +361,7 @@ module Pakyow
361
361
  values = Array.ensure(original_values).compact
362
362
 
363
363
  if values.any?
364
- field_view = Pakyow::Presenter::Form.from_object(field_presenter.view.object)
364
+ field_view = Pakyow::Presenter::Views::Form.from_object(field_presenter.view.object)
365
365
  template = field_view.dup
366
366
  insertable = field_view
367
367
  current = field_view
@@ -4,44 +4,6 @@ require "pakyow/support/class_state"
4
4
 
5
5
  module Pakyow
6
6
  module Presenter
7
- class ProcessorCaller
8
- def initialize(instances)
9
- @processors = normalize(instances)
10
- end
11
-
12
- def process(content, extension)
13
- processors_for_extension(extension).each do |processor|
14
- content = processor.call(content)
15
- end
16
-
17
- unless extension == :html
18
- processors_for_extension(:html).each do |processor|
19
- content = processor.call(content)
20
- end
21
- end
22
-
23
- content
24
- end
25
-
26
- def process?(extension)
27
- @processors.key?(extension.tr(".", "").to_sym)
28
- end
29
-
30
- protected
31
-
32
- def processors_for_extension(extension)
33
- @processors[extension] || []
34
- end
35
-
36
- def normalize(instances)
37
- instances.each_with_object({}) { |instance, processors|
38
- instance.class.extensions.each do |extension|
39
- (processors[extension] ||= []) << instance
40
- end
41
- }
42
- end
43
- end
44
-
45
7
  class Processor
46
8
  extend Support::ClassState
47
9
  class_state :name
@@ -59,6 +21,7 @@ module Pakyow
59
21
  end
60
22
 
61
23
  class << self
24
+ # @api private
62
25
  def make(name, *extensions, **kwargs, &block)
63
26
  # Name is expected to also be an extension.
64
27
  #
@@ -81,5 +44,46 @@ module Pakyow
81
44
  end
82
45
  end
83
46
  end
47
+
48
+ # @api private
49
+ class ProcessorCaller
50
+ def initialize(instances)
51
+ @processors = normalize(instances)
52
+ end
53
+
54
+ def process(content, extension)
55
+ content = content.to_s
56
+
57
+ processors_for_extension(extension).each do |processor|
58
+ content = processor.call(content)
59
+ end
60
+
61
+ unless extension == :html
62
+ processors_for_extension(:html).each do |processor|
63
+ content = processor.call(content)
64
+ end
65
+ end
66
+
67
+ content
68
+ end
69
+
70
+ def process?(extension)
71
+ @processors.key?(extension.tr(".", "").to_sym)
72
+ end
73
+
74
+ private
75
+
76
+ def processors_for_extension(extension)
77
+ @processors[extension] || []
78
+ end
79
+
80
+ def normalize(instances)
81
+ instances.each_with_object({}) { |instance, processors|
82
+ instance.class.extensions.each do |extension|
83
+ (processors[extension] ||= []) << instance
84
+ end
85
+ }
86
+ end
87
+ end
84
88
  end
85
89
  end