pakyow-presenter 1.0.0.rc5 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -108
- data/lib/pakyow/application/actions/presenter/auto_render.rb +17 -0
- data/lib/pakyow/application/behavior/presenter/error_rendering.rb +127 -0
- data/lib/pakyow/application/behavior/presenter/exposures.rb +31 -0
- data/lib/pakyow/application/behavior/presenter/implicit_rendering.rb +23 -0
- data/lib/pakyow/application/behavior/presenter/initializing.rb +69 -0
- data/lib/pakyow/application/behavior/presenter/modes.rb +120 -0
- data/lib/pakyow/application/behavior/presenter/versions.rb +73 -0
- data/lib/pakyow/application/behavior/presenter/watching.rb +23 -0
- data/lib/pakyow/{presenter/behavior/config.rb → application/config/presenter.rb} +3 -3
- data/lib/pakyow/application/helpers/presenter/rendering.rb +20 -0
- data/lib/pakyow/plugin/helpers/presenter/rendering.rb +34 -0
- data/lib/pakyow/presenter/errors.rb +1 -3
- data/lib/pakyow/presenter/framework.rb +18 -18
- data/lib/pakyow/presenter.rb +1 -1
- metadata +23 -24
- data/lib/pakyow/actions/presenter/auto_render.rb +0 -15
- data/lib/pakyow/plugin/helpers/rendering.rb +0 -32
- data/lib/pakyow/presenter/behavior/error_rendering.rb +0 -125
- data/lib/pakyow/presenter/behavior/exposures.rb +0 -29
- data/lib/pakyow/presenter/behavior/implicit_rendering.rb +0 -21
- data/lib/pakyow/presenter/behavior/initializing.rb +0 -67
- data/lib/pakyow/presenter/behavior/modes.rb +0 -118
- data/lib/pakyow/presenter/behavior/versions.rb +0 -71
- data/lib/pakyow/presenter/behavior/watching.rb +0 -21
- data/lib/pakyow/presenter/helpers/rendering.rb +0 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 684f68ffcb0cc1beb6e24ffd407b5dcd71238cd08342ebcab0aed8f53329e28a
|
4
|
+
data.tar.gz: 582b3a284d885de7587b72dbffe85f8d5c8a6119d7b6ab56c0b96f8422d47249
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 116abaea114cf8c7779de420e803ce9fd72f62ccbdd7060425a28cf18093e031780bca8f7cc23812fcca1c02a2aebded8e3d3d3b919b71051d4a9e4ebef785e8
|
7
|
+
data.tar.gz: 8b450ea512a99c840560da6565501f9999334ca82d2391a6b75ec1cb16d30305cc248da55515aced259069c713a6c64af244c4a1d85c61893f5123c2358b9a39
|
data/CHANGELOG.md
CHANGED
@@ -1,110 +1,5 @@
|
|
1
|
-
#
|
1
|
+
# UNRELEASED
|
2
2
|
|
3
|
-
|
4
|
-
* Reprocesses view contents with html processor
|
5
|
-
* Fixes a bug causing partials not to be duped
|
6
|
-
* Automatically defines bindings as restful
|
7
|
-
* Introduces binding parts
|
8
|
-
* Fixes a bug removing a node from StringDoc
|
9
|
-
* Renames `app.all_views_visible` config option to `presenter.require_route`
|
10
|
-
* Fixes some bugs caused by not properly duping view objects
|
11
|
-
* Replaces Nokogiri with Oga
|
12
|
-
* Moves everything into the Pakyow namespace
|
13
|
-
* Adds support for versioned props
|
14
|
-
* Prioritize root view paths over child paths
|
15
|
-
* ViewVersion state is now properly updated when matching
|
3
|
+
# 1.0
|
16
4
|
|
17
|
-
|
18
|
-
|
19
|
-
* Adds precomposition to composer
|
20
|
-
* Fixes binding action for nested resources
|
21
|
-
* Fixes variable name in remap_partials
|
22
|
-
* Setup form on `_root` rather than `action` prop
|
23
|
-
* Handles view paths that don't define an `index` view
|
24
|
-
* Adds `ViewCollection#scoped_as` convenience method
|
25
|
-
* Renames default template to `default` (instead of `pakyow`)
|
26
|
-
* Adds convenience method to check for view existence
|
27
|
-
* Support binding hashes with `String` keys
|
28
|
-
* Fixes a bug when a node is inserted after another node that also has a sibling
|
29
|
-
* Fixes binding to props nested in partial
|
30
|
-
* Now allows views for a view store to be fragmented across multiple directories
|
31
|
-
* Adds versioned scopes with auto empty handling
|
32
|
-
* Now sets scope name explicitly for `ViewCollection` built from a `View`
|
33
|
-
* Adds a helper method for checking if a attribute exists
|
34
|
-
* Adds support for components and channels (realtime ftw)
|
35
|
-
* Adds id of object to scoped node during binding
|
36
|
-
* Fixes a bug with view contexts in presenter helpers
|
37
|
-
* Ported all tests to rspec
|
38
|
-
* Fixes a bug finding scopes in a nested partial
|
39
|
-
* Fixes a bug where unused partials still being included as parts in the composer
|
40
|
-
* Fixes a `StringDoc` bug when structure is empty
|
41
|
-
* Fixes bug preventing passed binding functions from being used when no binding sets are registered for scope
|
42
|
-
* Fixes namespace collisions
|
43
|
-
* Fixes error when matching data empty collection
|
44
|
-
* Renames `inner_html` to `html`
|
45
|
-
* Now only reloads a view store if the contents have changed
|
46
|
-
* Yields `prop` node rather than full `scope` in bindings
|
47
|
-
* Handles `AttributesCollection#<<` for all use cases
|
48
|
-
* Adds `to_html` method on composer
|
49
|
-
* No longer complains about a view store missing a template directory
|
50
|
-
* Now finds view info for a path that doesn't contain a page
|
51
|
-
* Allows root nodes to be appendable in string doc
|
52
|
-
* Removes nokogiri doc
|
53
|
-
|
54
|
-
# 0.9.1 / 2014-12-06
|
55
|
-
|
56
|
-
* Fixes bug where name attribute wasn't set on form fields when binding without a value
|
57
|
-
* Fixes bug causing all partials (not just available ones) to be defined as view parts
|
58
|
-
* Fixes bug causing form action binding to break
|
59
|
-
|
60
|
-
# 0.9.0 / 2014-11-09
|
61
|
-
|
62
|
-
* Introduces StringDoc, replacing Nokogiri for view rendering with a performant alternative
|
63
|
-
* Adds the ability to set an empty first option in bindings
|
64
|
-
* Remove the annoying "no content" for container log message
|
65
|
-
* Binding context must now be explicitly passed when binding
|
66
|
-
* Yield bindable value before bindable in view binding fns
|
67
|
-
* Fixes bug causing non-html view contents to be processed twice
|
68
|
-
* Removes support for Ruby versions < 2.0.0
|
69
|
-
|
70
|
-
# 0.8.0 / 2014-03-02
|
71
|
-
|
72
|
-
* Major rewrite, including new view syntax, composer, and transformation api
|
73
|
-
|
74
|
-
# 0.7.2 / 2012-02-29
|
75
|
-
|
76
|
-
* No changes -- bumped version to be consistent
|
77
|
-
|
78
|
-
# 0.7.1 / 2012-01-08
|
79
|
-
|
80
|
-
* View caching fixes
|
81
|
-
* Changed binder to allow definition for multiple endpoints
|
82
|
-
* Changed in_context to accept context as block argument
|
83
|
-
* Changed action binder to add leading slash if needed
|
84
|
-
* Change to allow a view's content to be set to nil
|
85
|
-
* Fixed Views#find method
|
86
|
-
|
87
|
-
# 0.7.0 / 2011-11-19
|
88
|
-
|
89
|
-
* Cleaned up core/presenter interface
|
90
|
-
* Optimized view caching
|
91
|
-
* Binding occurs on the label an object is being bound to, not the object type
|
92
|
-
* Root view override in index directories no longer specify a root view for siblings
|
93
|
-
* Fixed problem binding to a checkbox who’s value attribute is not set
|
94
|
-
|
95
|
-
# 0.6.3 / 2011-09-13
|
96
|
-
|
97
|
-
* Fixes binding to bindings defined by HTML 'name' attribute
|
98
|
-
|
99
|
-
# 0.6.2 / 2011-08-20
|
100
|
-
|
101
|
-
* Fixes issue binding object to root nodes
|
102
|
-
* JRuby Support
|
103
|
-
|
104
|
-
# 0.6.1 / 2011-08-20
|
105
|
-
|
106
|
-
* Fixes gemspec problem
|
107
|
-
|
108
|
-
# 0.6.0 / 2011-08-20
|
109
|
-
|
110
|
-
* Initial gem release of 0.6.0 codebase
|
5
|
+
* Hello, Web
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Pakyow
|
4
|
+
class Application
|
5
|
+
module Actions
|
6
|
+
module Presenter
|
7
|
+
# Renders a view in the case a controller wasn't called.
|
8
|
+
#
|
9
|
+
class AutoRender
|
10
|
+
def call(connection)
|
11
|
+
connection.app.isolated(:Renderer).render_implicitly(connection)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cgi"
|
4
|
+
|
5
|
+
require "redcarpet"
|
6
|
+
|
7
|
+
require "pakyow/support/bindable"
|
8
|
+
require "pakyow/support/extension"
|
9
|
+
|
10
|
+
require "pakyow/error"
|
11
|
+
|
12
|
+
module Pakyow
|
13
|
+
class Application
|
14
|
+
module Behavior
|
15
|
+
module Presenter
|
16
|
+
module ErrorRendering
|
17
|
+
extend Support::Extension
|
18
|
+
|
19
|
+
# @api private
|
20
|
+
def self.render_error(error, context)
|
21
|
+
context.respond_to :html do
|
22
|
+
if Pakyow.env?(:production)
|
23
|
+
context.render "/500"
|
24
|
+
else
|
25
|
+
unless error.is_a?(Pakyow::Error)
|
26
|
+
error = Pakyow::Error.build(error)
|
27
|
+
end
|
28
|
+
|
29
|
+
error.extend Support::Bindable
|
30
|
+
context.expose :pw_error, error
|
31
|
+
context.render "/development/500"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
apply_extension do
|
37
|
+
handle 404 do
|
38
|
+
respond_to :html do
|
39
|
+
render "/404"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
handle 500 do |error|
|
44
|
+
ErrorRendering.render_error(error, self)
|
45
|
+
end
|
46
|
+
|
47
|
+
handle Pakyow::Presenter::UnknownPage, as: 404 do |error|
|
48
|
+
if Pakyow.env?(:production)
|
49
|
+
trigger 404
|
50
|
+
else
|
51
|
+
ErrorRendering.render_error(error, self)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
handle Pakyow::Presenter::ImplicitRenderingError, as: 404 do |error|
|
56
|
+
if Pakyow.env?(:production)
|
57
|
+
trigger 404
|
58
|
+
else
|
59
|
+
ErrorRendering.render_error(error, self)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
binder :pw_error do
|
64
|
+
def message
|
65
|
+
html_safe(markdown.render(format(object.message)))
|
66
|
+
end
|
67
|
+
|
68
|
+
def contextual_message
|
69
|
+
if object.respond_to?(:contextual_message)
|
70
|
+
html_safe(markdown.render(format(object.contextual_message)))
|
71
|
+
else
|
72
|
+
nil
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def details
|
77
|
+
html_safe(markdown.render(format(object.details)))
|
78
|
+
end
|
79
|
+
|
80
|
+
def backtrace
|
81
|
+
html_safe(object.condensed_backtrace.to_a.map { |line|
|
82
|
+
CGI.escape_html(line)
|
83
|
+
}.join("<br>"))
|
84
|
+
end
|
85
|
+
|
86
|
+
def link
|
87
|
+
part :href do
|
88
|
+
object.url
|
89
|
+
end
|
90
|
+
|
91
|
+
part :content do
|
92
|
+
object.url
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
private
|
97
|
+
|
98
|
+
def markdown
|
99
|
+
@markdown ||= Redcarpet::Markdown.new(
|
100
|
+
Redcarpet::Render::HTML.new({})
|
101
|
+
)
|
102
|
+
end
|
103
|
+
|
104
|
+
def format(string)
|
105
|
+
string = string.dup
|
106
|
+
|
107
|
+
# Replace `foo' with `foo` to render as inline code.
|
108
|
+
#
|
109
|
+
string.dup.scan(/`([^']*)'/).each do |match|
|
110
|
+
string.gsub!("`#{match[0]}'", "`#{match[0]}`")
|
111
|
+
end
|
112
|
+
|
113
|
+
# Format object references as inline code.
|
114
|
+
#
|
115
|
+
string.dup.scan(/#<(.*)>/).each do |match|
|
116
|
+
string.gsub!("#<#{match[0]}>", "`#<#{match[0]}>`")
|
117
|
+
end
|
118
|
+
|
119
|
+
string
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "pakyow/support/extension"
|
4
|
+
|
5
|
+
module Pakyow
|
6
|
+
class Application
|
7
|
+
module Behavior
|
8
|
+
module Presenter
|
9
|
+
module Exposures
|
10
|
+
extend Support::Extension
|
11
|
+
|
12
|
+
apply_extension do
|
13
|
+
unless ancestors.include?(Plugin)
|
14
|
+
# Copy exposures from the plugin renderer.
|
15
|
+
#
|
16
|
+
after "load.plugins" do
|
17
|
+
plugs.each do |plug|
|
18
|
+
plug.isolated(:Renderer).__expose_fns.each do |fn|
|
19
|
+
isolated(:Renderer).send(:expose) do |connection|
|
20
|
+
fn.call(connection, plug)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "pakyow/support/extension"
|
4
|
+
|
5
|
+
module Pakyow
|
6
|
+
class Application
|
7
|
+
module Behavior
|
8
|
+
module Presenter
|
9
|
+
# Performs a render if a controller is called but doesn't explicitly render.
|
10
|
+
#
|
11
|
+
module ImplicitRendering
|
12
|
+
extend Support::Extension
|
13
|
+
|
14
|
+
apply_extension do
|
15
|
+
after :dispatch, :implicit_render do
|
16
|
+
connection.app.isolated(:Renderer).render_implicitly(connection)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "pakyow/support/extension"
|
4
|
+
|
5
|
+
require "pakyow/plugin"
|
6
|
+
|
7
|
+
module Pakyow
|
8
|
+
class Application
|
9
|
+
module Behavior
|
10
|
+
module Presenter
|
11
|
+
module Initializing
|
12
|
+
extend Support::Extension
|
13
|
+
|
14
|
+
apply_extension do
|
15
|
+
unless ancestors.include?(Plugin)
|
16
|
+
after "initialize", "initialize.presenter", priority: :high do
|
17
|
+
state(:templates) << Pakyow::Presenter::Templates.new(
|
18
|
+
:default,
|
19
|
+
config.presenter.path,
|
20
|
+
processor: Pakyow::Presenter::ProcessorCaller.new(
|
21
|
+
state(:processor).map { |processor|
|
22
|
+
processor.new(self)
|
23
|
+
}
|
24
|
+
)
|
25
|
+
)
|
26
|
+
|
27
|
+
state(:templates) << Pakyow::Presenter::Templates.new(:errors, File.join(File.expand_path("../../../../", __FILE__), "views", "errors"))
|
28
|
+
end
|
29
|
+
|
30
|
+
after "load.plugins" do
|
31
|
+
# Load plugin frontend after the app so that app has priority.
|
32
|
+
#
|
33
|
+
@plugs.each(&:load_frontend)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# Build presenter classes for compound components.
|
38
|
+
#
|
39
|
+
after "initialize", priority: :high do
|
40
|
+
state(:templates).each do |templates|
|
41
|
+
templates.each do |template|
|
42
|
+
template.object.each_significant_node(:component, descend: true) do |node|
|
43
|
+
if node.label(:components).count > 1
|
44
|
+
component_classes = node.label(:components).each_with_object([]) { |component_label, arr|
|
45
|
+
component_class = state(:component).find { |component|
|
46
|
+
component.__object_name.name == component_label[:name]
|
47
|
+
}
|
48
|
+
|
49
|
+
if component_class
|
50
|
+
arr << component_class
|
51
|
+
end
|
52
|
+
}
|
53
|
+
|
54
|
+
if component_classes.count > 1
|
55
|
+
state(:presenter) << Pakyow::Presenter::Renderer::Behavior::RenderComponents.find_or_build_compound_presenter(
|
56
|
+
self, component_classes
|
57
|
+
)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "pakyow/support/extension"
|
4
|
+
|
5
|
+
module Pakyow
|
6
|
+
class Application
|
7
|
+
module Behavior
|
8
|
+
module Presenter
|
9
|
+
module Modes
|
10
|
+
# @api private
|
11
|
+
class ModeCallContext
|
12
|
+
def initialize(connection)
|
13
|
+
@connection = connection
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
extend Support::Extension
|
18
|
+
|
19
|
+
attr_accessor :__ui_modes
|
20
|
+
|
21
|
+
def mode(name, &block)
|
22
|
+
@__ui_modes[name.to_sym] = wrap_mode_block(block)
|
23
|
+
end
|
24
|
+
|
25
|
+
private def wrap_mode_block(block)
|
26
|
+
if is_a?(Plugin)
|
27
|
+
wrap_mode_block_for_plug(self, block)
|
28
|
+
else
|
29
|
+
Proc.new do |connection|
|
30
|
+
isolated(:ModeCallContext).new(connection).instance_eval(&block)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
private def wrap_mode_block_for_plug(plug, block)
|
36
|
+
Proc.new do |connection|
|
37
|
+
plug.helper_caller(:passive, connection, plug).instance_eval(&block)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
prepend_methods do
|
42
|
+
def initialize(*)
|
43
|
+
@__ui_modes = Hash[
|
44
|
+
self.class.__ui_modes.map { |name, block|
|
45
|
+
[name, wrap_mode_block(block)]
|
46
|
+
}
|
47
|
+
]
|
48
|
+
|
49
|
+
super
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
apply_extension do
|
54
|
+
class_state :__ui_modes, default: {}, inheritable: true
|
55
|
+
|
56
|
+
after "load" do
|
57
|
+
([:html] + state(:processor).map(&:extensions).flatten).uniq.each do |extension|
|
58
|
+
config.process.watched_paths << File.join(config.presenter.path, "**/*.#{extension}")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
isolate ModeCallContext
|
63
|
+
|
64
|
+
on "load" do
|
65
|
+
self.class.include_helpers :passive, isolated(:ModeCallContext)
|
66
|
+
end
|
67
|
+
|
68
|
+
if ancestors.include?(Plugin)
|
69
|
+
# Copy ui modes from other plugins to this plugin.
|
70
|
+
#
|
71
|
+
after "load" do
|
72
|
+
parent.plugs.each do |plug|
|
73
|
+
plug.__ui_modes.each do |mode, block|
|
74
|
+
unless @__ui_modes.key?(mode)
|
75
|
+
plug_namespace = plug.class.__object_name.namespace.parts.last
|
76
|
+
|
77
|
+
full_mode = if plug_namespace == :default
|
78
|
+
:"@#{plug.class.plugin_name}.#{mode}"
|
79
|
+
else
|
80
|
+
:"@#{plug.class.plugin_name}(#{plug_namespace}).#{mode}"
|
81
|
+
end
|
82
|
+
|
83
|
+
@__ui_modes[full_mode] = block
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
else
|
89
|
+
# Copy ui modes from plugins to the app.
|
90
|
+
#
|
91
|
+
after "load.plugins" do
|
92
|
+
plugs.each do |plug|
|
93
|
+
plug.__ui_modes.each do |mode, block|
|
94
|
+
unless @__ui_modes.key?(mode)
|
95
|
+
plug_namespace = plug.class.__object_name.namespace.parts.last
|
96
|
+
|
97
|
+
full_mode = if plug_namespace == :default
|
98
|
+
:"@#{plug.class.plugin_name}.#{mode}"
|
99
|
+
else
|
100
|
+
:"@#{plug.class.plugin_name}(#{plug_namespace}).#{mode}"
|
101
|
+
end
|
102
|
+
|
103
|
+
@__ui_modes[full_mode] = block
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
class_methods do
|
112
|
+
def mode(name, &block)
|
113
|
+
@__ui_modes[name.to_sym] = block
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "pakyow/support/extension"
|
4
|
+
|
5
|
+
module Pakyow
|
6
|
+
class Application
|
7
|
+
module Behavior
|
8
|
+
module Presenter
|
9
|
+
module Versions
|
10
|
+
extend Support::Extension
|
11
|
+
|
12
|
+
apply_extension do
|
13
|
+
if ancestors.include?(Plugin)
|
14
|
+
# Copy global versioning logic from other plugins to this plugin.
|
15
|
+
#
|
16
|
+
after "load" do
|
17
|
+
presenters = [isolated(:Presenter)].concat(state(:presenter))
|
18
|
+
|
19
|
+
parent.plugs.each do |plug|
|
20
|
+
plug.isolated(:Presenter).__versioning_logic.each_pair do |version, logic_arr|
|
21
|
+
logic_arr.each do |logic|
|
22
|
+
presenters.each do |presenter|
|
23
|
+
unless presenter.__versioning_logic.include?(version)
|
24
|
+
plug_namespace = plug.class.__object_name.namespace.parts.last
|
25
|
+
|
26
|
+
prefix = if plug_namespace == :default
|
27
|
+
plug.class.plugin_name
|
28
|
+
else
|
29
|
+
"#{plug.class.plugin_name}(#{plug_namespace})"
|
30
|
+
end
|
31
|
+
|
32
|
+
presenter.version :"@#{prefix}.#{version}" do |object|
|
33
|
+
instance_exec(object, plug, &logic[:block])
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
else
|
42
|
+
# Copy global versioning logic from plugin presenters.
|
43
|
+
#
|
44
|
+
after "load.plugins" do
|
45
|
+
presenters = [isolated(:Presenter)].concat(state(:presenter))
|
46
|
+
|
47
|
+
plugs.each do |plug|
|
48
|
+
plug.isolated(:Presenter).__versioning_logic.each_pair do |version, logic_arr|
|
49
|
+
logic_arr.each do |logic|
|
50
|
+
presenters.each do |presenter|
|
51
|
+
plug_namespace = plug.class.__object_name.namespace.parts.last
|
52
|
+
|
53
|
+
prefix = if plug_namespace == :default
|
54
|
+
plug.class.plugin_name
|
55
|
+
else
|
56
|
+
"#{plug.class.plugin_name}(#{plug_namespace})"
|
57
|
+
end
|
58
|
+
|
59
|
+
presenter.version :"@#{prefix}.#{version}" do |object|
|
60
|
+
instance_exec(object, plug, &logic[:block])
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "pakyow/support/extension"
|
4
|
+
|
5
|
+
module Pakyow
|
6
|
+
class Application
|
7
|
+
module Behavior
|
8
|
+
module Presenter
|
9
|
+
module Watching
|
10
|
+
extend Support::Extension
|
11
|
+
|
12
|
+
apply_extension do
|
13
|
+
after "load" do
|
14
|
+
([:html] + state(:processor).map(&:extensions).flatten).uniq.each do |extension|
|
15
|
+
config.process.watched_paths << File.join(config.presenter.path, "**/*.#{extension}")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Pakyow
|
4
|
+
class Application
|
5
|
+
module Helpers
|
6
|
+
module Presenter
|
7
|
+
module Rendering
|
8
|
+
def render(view_path = nil, as: nil, modes: [:default])
|
9
|
+
@connection.app.isolated(:Renderer).render(
|
10
|
+
@connection,
|
11
|
+
view_path: view_path,
|
12
|
+
presenter_path: as,
|
13
|
+
modes: modes
|
14
|
+
)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "pakyow/support/extension"
|
4
|
+
|
5
|
+
module Pakyow
|
6
|
+
class Plugin
|
7
|
+
module Helpers
|
8
|
+
module Presenter
|
9
|
+
module Rendering
|
10
|
+
extend Support::Extension
|
11
|
+
|
12
|
+
prepend_methods do
|
13
|
+
def render(view_path = nil, as: nil, modes: [:default])
|
14
|
+
super(File.join(@connection.app.class.mount_path, view_path), as: as, modes: modes)
|
15
|
+
rescue Pakyow::Presenter::UnknownPage
|
16
|
+
# Try rendering the view from the app.
|
17
|
+
#
|
18
|
+
connection = @connection.app.parent.isolated(:Connection).from_connection(
|
19
|
+
@connection, :@app => @connection.app.parent
|
20
|
+
)
|
21
|
+
|
22
|
+
connection.app.isolated(:Renderer).render(
|
23
|
+
connection,
|
24
|
+
view_path: view_path,
|
25
|
+
presenter_path: as,
|
26
|
+
modes: modes
|
27
|
+
)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|