pakyow-presenter 0.10.2 → 0.11.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 +4 -4
- data/pakyow-presenter/CHANGELOG.md +16 -0
- data/pakyow-presenter/lib/pakyow-presenter.rb +1 -11
- data/pakyow-presenter/lib/pakyow/presenter.rb +8 -0
- data/pakyow-presenter/lib/{presenter → pakyow/presenter}/attributes.rb +21 -14
- data/pakyow-presenter/lib/pakyow/presenter/base.rb +38 -0
- data/pakyow-presenter/lib/{presenter → pakyow/presenter}/binder.rb +19 -6
- data/pakyow-presenter/lib/{presenter → pakyow/presenter}/binder_set.rb +18 -21
- data/pakyow-presenter/lib/{presenter → pakyow/presenter}/binding_eval.rb +14 -0
- data/pakyow-presenter/lib/{presenter → pakyow/presenter}/config/presenter.rb +12 -6
- data/pakyow-presenter/lib/{presenter → pakyow/presenter}/container.rb +0 -0
- data/pakyow-presenter/lib/{presenter → pakyow/presenter}/doc_helpers.rb +0 -0
- data/pakyow-presenter/lib/{presenter → pakyow/presenter}/exceptions.rb +0 -0
- data/pakyow-presenter/lib/pakyow/presenter/ext/app.rb +33 -0
- data/pakyow-presenter/lib/pakyow/presenter/ext/call_context.rb +28 -0
- data/pakyow-presenter/lib/pakyow/presenter/helpers.rb +46 -0
- data/pakyow-presenter/lib/{presenter → pakyow/presenter}/page.rb +0 -0
- data/pakyow-presenter/lib/{presenter → pakyow/presenter}/partial.rb +0 -0
- data/pakyow-presenter/lib/{presenter → pakyow/presenter}/presenter.rb +14 -9
- data/pakyow-presenter/lib/{presenter → pakyow/presenter}/string_doc.rb +35 -9
- data/pakyow-presenter/lib/{presenter → pakyow/presenter}/string_doc_parser.rb +41 -30
- data/pakyow-presenter/lib/{presenter → pakyow/presenter}/string_doc_renderer.rb +0 -0
- data/pakyow-presenter/lib/{presenter → pakyow/presenter}/template.rb +0 -0
- data/pakyow-presenter/lib/{presenter → pakyow/presenter}/view.rb +79 -36
- data/pakyow-presenter/lib/{presenter → pakyow/presenter}/view_collection.rb +10 -4
- data/pakyow-presenter/lib/{presenter → pakyow/presenter}/view_composer.rb +43 -3
- data/pakyow-presenter/lib/{presenter → pakyow/presenter}/view_context.rb +12 -8
- data/pakyow-presenter/lib/{presenter → pakyow/presenter}/view_store.rb +3 -1
- data/pakyow-presenter/lib/{presenter → pakyow/presenter}/view_store_loader.rb +0 -0
- data/pakyow-presenter/lib/{presenter → pakyow/presenter}/view_version.rb +19 -3
- data/pakyow-presenter/lib/pakyow/views/errors/404.erb +26 -0
- data/pakyow-presenter/lib/pakyow/views/errors/500.erb +23 -0
- metadata +39 -38
- data/pakyow-presenter/lib/presenter/base.rb +0 -27
- data/pakyow-presenter/lib/presenter/ext/app.rb +0 -63
- data/pakyow-presenter/lib/presenter/helpers.rb +0 -40
- data/pakyow-presenter/lib/views/errors/404.html +0 -5
- data/pakyow-presenter/lib/views/errors/500.html +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f22ae8bbc000b21b49861cdd2319f2aed3ee137f
|
4
|
+
data.tar.gz: 1f565dcb4c706fd63d5082d841dc1c849461b7b1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4a24146da5ccf0c9b59e7053556f81bb11537983c0ec0b9d18ed46ec72b88756e9464621fcbf32462a40de5f850849574d60f65945930b76a8cd8c87ca58701e
|
7
|
+
data.tar.gz: 0012d2741b5d85896d5532db529a8876574a3d5b4ae0ad05265f3f94dd47223609ee61c3153e3372c8367cb2ae96f3cfeb172824b50fc2a54df6e2f457b391c7
|
@@ -1,3 +1,19 @@
|
|
1
|
+
# 0.11.0
|
2
|
+
|
3
|
+
* Fixes several bugs related to nested partials
|
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
|
16
|
+
|
1
17
|
# 0.10.0 / 2015-10-19
|
2
18
|
|
3
19
|
* Adds precomposition to composer
|
@@ -1,11 +1 @@
|
|
1
|
-
|
2
|
-
$LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
|
3
|
-
|
4
|
-
# Gems
|
5
|
-
require 'nokogiri'
|
6
|
-
|
7
|
-
require 'presenter/base'
|
8
|
-
require 'presenter/presenter'
|
9
|
-
require 'presenter/config/presenter'
|
10
|
-
require 'presenter/helpers'
|
11
|
-
require 'presenter/ext/app'
|
1
|
+
require 'pakyow/presenter'
|
@@ -1,12 +1,6 @@
|
|
1
1
|
module Pakyow
|
2
2
|
module Presenter
|
3
3
|
class Attribute
|
4
|
-
@@types = {
|
5
|
-
:hash => [:style],
|
6
|
-
:bool => [:selected, :checked, :disabled, :readonly, :multiple],
|
7
|
-
:mult => [:class]
|
8
|
-
}
|
9
|
-
|
10
4
|
def initialize(name, raw_value, control, doc)
|
11
5
|
@type = type_of_attribute(name)
|
12
6
|
@name = name
|
@@ -77,6 +71,14 @@ module Pakyow
|
|
77
71
|
self.class.ancestors
|
78
72
|
end
|
79
73
|
|
74
|
+
def types
|
75
|
+
@types ||= {
|
76
|
+
:hash => [:style],
|
77
|
+
:bool => [:selected, :checked, :disabled, :readonly, :multiple],
|
78
|
+
:mult => [:class]
|
79
|
+
}
|
80
|
+
end
|
81
|
+
|
80
82
|
private
|
81
83
|
|
82
84
|
def update_value
|
@@ -92,9 +94,9 @@ module Pakyow
|
|
92
94
|
def type_of_attribute(attribute)
|
93
95
|
attribute = attribute.to_sym
|
94
96
|
|
95
|
-
return :bool
|
96
|
-
return :mult if
|
97
|
-
return :hash
|
97
|
+
return :bool if types[:bool].include?(attribute)
|
98
|
+
return :mult if types[:mult].include?(attribute)
|
99
|
+
return :hash if types[:hash].include?(attribute)
|
98
100
|
return :single
|
99
101
|
end
|
100
102
|
|
@@ -155,6 +157,10 @@ module Pakyow
|
|
155
157
|
method_missing(:id, *args)
|
156
158
|
end
|
157
159
|
|
160
|
+
def method(*args)
|
161
|
+
method_missing(:method, *args)
|
162
|
+
end
|
163
|
+
|
158
164
|
def update_value_for_attribute(attribute, value)
|
159
165
|
@doc.update_attribute(attribute, value)
|
160
166
|
end
|
@@ -163,6 +169,10 @@ module Pakyow
|
|
163
169
|
@doc.remove_attribute(attribute)
|
164
170
|
end
|
165
171
|
|
172
|
+
def include?(attribute)
|
173
|
+
@doc.has_attribute?(attribute)
|
174
|
+
end
|
175
|
+
|
166
176
|
protected
|
167
177
|
|
168
178
|
def set_attribute(attribute, value)
|
@@ -170,11 +180,8 @@ module Pakyow
|
|
170
180
|
end
|
171
181
|
|
172
182
|
def get_attribute(attribute)
|
173
|
-
|
174
|
-
|
175
|
-
end
|
176
|
-
|
177
|
-
return a
|
183
|
+
@attributes[attribute] ||
|
184
|
+
Attribute.new(attribute, @doc.get_attribute(attribute), self, @doc)
|
178
185
|
end
|
179
186
|
end
|
180
187
|
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
require 'pakyow/presenter/view_store'
|
4
|
+
require 'pakyow/presenter/view'
|
5
|
+
require 'pakyow/presenter/template'
|
6
|
+
require 'pakyow/presenter/page'
|
7
|
+
require 'pakyow/presenter/container'
|
8
|
+
require 'pakyow/presenter/partial'
|
9
|
+
require 'pakyow/presenter/view_collection'
|
10
|
+
require 'pakyow/presenter/binder'
|
11
|
+
require 'pakyow/presenter/binder_set'
|
12
|
+
require 'pakyow/presenter/attributes'
|
13
|
+
require 'pakyow/presenter/exceptions'
|
14
|
+
require 'pakyow/presenter/view_composer'
|
15
|
+
require 'pakyow/presenter/string_doc'
|
16
|
+
require 'pakyow/presenter/string_doc_parser'
|
17
|
+
require 'pakyow/presenter/string_doc_renderer'
|
18
|
+
require 'pakyow/presenter/binding_eval'
|
19
|
+
require 'pakyow/presenter/doc_helpers'
|
20
|
+
require 'pakyow/presenter/view_version'
|
21
|
+
require 'pakyow/presenter/view_context'
|
22
|
+
require 'pakyow/presenter/view_store_loader'
|
23
|
+
|
24
|
+
module Pakyow
|
25
|
+
module Presenter
|
26
|
+
Pakyow::App.after :load do
|
27
|
+
routes :__presenter do
|
28
|
+
handler 404 do
|
29
|
+
presenter_handle_error(404)
|
30
|
+
end
|
31
|
+
|
32
|
+
handler 500 do
|
33
|
+
presenter_handle_error(500)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -59,16 +59,29 @@ module Pakyow
|
|
59
59
|
|
60
60
|
if binding_fn
|
61
61
|
binding_eval = BindingEval.new(prop, bindable, context)
|
62
|
-
binding_eval.
|
63
|
-
|
64
|
-
if
|
65
|
-
|
66
|
-
|
67
|
-
|
62
|
+
result = binding_eval.eval(&binding_fn)
|
63
|
+
|
64
|
+
if result.nil?
|
65
|
+
value = value_from_data(prop, bindable)
|
66
|
+
|
67
|
+
fn = bindings[prop]
|
68
|
+
result = fn.call(value, bindable, context) if fn
|
68
69
|
end
|
70
|
+
result
|
71
|
+
else # default value
|
72
|
+
value_from_data(prop, bindable)
|
69
73
|
end
|
70
74
|
end
|
71
75
|
|
76
|
+
def value_from_data(prop, bindable)
|
77
|
+
if bindable.is_a?(Hash)
|
78
|
+
bindable.fetch(prop) { bindable[prop.to_s] }
|
79
|
+
elsif bindable.class.method_defined?(prop)
|
80
|
+
bindable.send(prop)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
|
72
85
|
# Returns true if a binding is defined for the scope->prop.
|
73
86
|
#
|
74
87
|
def has_scoped_prop?(scope, prop, bindings)
|
@@ -68,28 +68,25 @@ module Pakyow
|
|
68
68
|
|
69
69
|
def restful(route_group)
|
70
70
|
binding :_root do
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
else
|
85
|
-
action = :create
|
86
|
-
end
|
87
|
-
|
88
|
-
view.attrs.action = routes.path(action, route_params)
|
89
|
-
view.attrs.method = 'post'
|
71
|
+
part :view do |view|
|
72
|
+
routes = Router.instance.group(route_group)
|
73
|
+
action = view.attrs.action.value
|
74
|
+
next if (action && !action.empty?)
|
75
|
+
|
76
|
+
route_params = params.dup
|
77
|
+
if view.doc.tagname == 'form'
|
78
|
+
if id = bindable[:id]
|
79
|
+
view.prepend(View.new('<input type="hidden" name="_method" value="patch">'))
|
80
|
+
route_params[:"#{route_group}_id"] = id
|
81
|
+
action = :update
|
82
|
+
else
|
83
|
+
action = :create
|
90
84
|
end
|
91
|
-
|
92
|
-
|
85
|
+
|
86
|
+
view.attrs.action = routes.path(action, route_params)
|
87
|
+
view.attrs.method = 'post'
|
88
|
+
end
|
89
|
+
end
|
93
90
|
end
|
94
91
|
end
|
95
92
|
end
|
@@ -6,6 +6,7 @@ module Pakyow
|
|
6
6
|
attr_reader :context, :bindable
|
7
7
|
|
8
8
|
def initialize(prop, bindable, context)
|
9
|
+
@parts = {}
|
9
10
|
@prop = prop
|
10
11
|
@bindable = bindable
|
11
12
|
@context = context
|
@@ -18,6 +19,19 @@ module Pakyow
|
|
18
19
|
bindable.send(@prop)
|
19
20
|
end
|
20
21
|
end
|
22
|
+
|
23
|
+
def eval(&block)
|
24
|
+
ret = instance_exec(value, bindable, context, &block)
|
25
|
+
if ret.respond_to?(:to_hash)
|
26
|
+
@parts.merge!(ret.to_hash)
|
27
|
+
end
|
28
|
+
@parts.empty? ? ret : @parts
|
29
|
+
end
|
30
|
+
|
31
|
+
def part(name, &block)
|
32
|
+
@parts[name.to_sym] = block
|
33
|
+
nil # Return nil so #part return value is ignored
|
34
|
+
end
|
21
35
|
end
|
22
36
|
end
|
23
37
|
end
|
@@ -1,7 +1,6 @@
|
|
1
|
-
Pakyow::Config.register
|
2
|
-
|
1
|
+
Pakyow::Config.register :presenter do |config|
|
3
2
|
# registered view stores
|
4
|
-
config.opt :view_stores,
|
3
|
+
config.opt :view_stores, -> {
|
5
4
|
@stores ||= {
|
6
5
|
default: File.join(Pakyow::Config.app.root, 'app', 'views')
|
7
6
|
}
|
@@ -11,7 +10,7 @@ Pakyow::Config.register(:presenter) { |config|
|
|
11
10
|
config.opt :default_views, { default: :default }
|
12
11
|
|
13
12
|
# a convenience option to lookup the default_view for a view store by name
|
14
|
-
config.opt :default_view,
|
13
|
+
config.opt :default_view, -> (store_name) {
|
15
14
|
views = Pakyow::Config.presenter.default_views
|
16
15
|
views.fetch(store_name) { views[:default] }
|
17
16
|
}
|
@@ -20,7 +19,7 @@ Pakyow::Config.register(:presenter) { |config|
|
|
20
19
|
config.opt :template_dirs, { default: '_templates' }
|
21
20
|
|
22
21
|
# a convenience option to lookup the template_dir for a view store by name
|
23
|
-
config.opt :template_dir,
|
22
|
+
config.opt :template_dir, -> (store_name) {
|
24
23
|
dirs = Pakyow::Config.presenter.template_dirs
|
25
24
|
dirs.fetch(store_name) { dirs[:default] }
|
26
25
|
}
|
@@ -31,6 +30,13 @@ Pakyow::Config.register(:presenter) { |config|
|
|
31
30
|
# the attribute expected for prop definitions
|
32
31
|
config.opt :prop_attribute, 'data-prop'
|
33
32
|
|
33
|
+
# if true, views are visible without a route defined
|
34
|
+
config.opt :require_route, true
|
35
|
+
|
34
36
|
# the document class used to parse and render views
|
35
37
|
config.opt :view_doc_class, Pakyow::Presenter::StringDoc
|
36
|
-
|
38
|
+
end.env :development do |opts|
|
39
|
+
opts.require_route = false
|
40
|
+
end.env :production do |opts|
|
41
|
+
opts.require_route = true
|
42
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Pakyow
|
2
|
+
class App
|
3
|
+
class << self
|
4
|
+
RESOURCE_ACTIONS[:presenter] = Proc.new { |app, set_name, _, _|
|
5
|
+
app.bindings { scope(set_name) { restful(set_name) } }
|
6
|
+
}
|
7
|
+
|
8
|
+
def bindings(set_name = :main, &block)
|
9
|
+
if set_name && block
|
10
|
+
bindings[set_name] = block
|
11
|
+
else
|
12
|
+
@bindings ||= {}
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def processor(*args, &block)
|
17
|
+
args.each {|format|
|
18
|
+
processors[format] = block
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
def processors
|
23
|
+
@processors ||= {}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Convenience method for defining bindings on an app instance.
|
28
|
+
#
|
29
|
+
def bindings(set_name = :main, &block)
|
30
|
+
self.class.bindings(set_name, &block)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'erb'
|
2
|
+
|
3
|
+
module Pakyow
|
4
|
+
class CallContext
|
5
|
+
protected
|
6
|
+
|
7
|
+
def presenter_handle_error(code)
|
8
|
+
return if !config.app.errors_in_browser || req.format != :html
|
9
|
+
response.body = [content_for_code(code)]
|
10
|
+
end
|
11
|
+
|
12
|
+
def content_for_code(code)
|
13
|
+
content = ERB.new(File.read(path_for_code(code))).result(binding)
|
14
|
+
page = Presenter::Page.new(:presenter, content, '/')
|
15
|
+
composer = presenter.compose_at('/', page: page)
|
16
|
+
composer.to_html
|
17
|
+
end
|
18
|
+
|
19
|
+
def path_for_code(code)
|
20
|
+
File.join(
|
21
|
+
File.expand_path('../../../', __FILE__),
|
22
|
+
'views',
|
23
|
+
'errors',
|
24
|
+
code.to_s + '.erb'
|
25
|
+
)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
3
|
+
module Pakyow
|
4
|
+
module Helpers
|
5
|
+
module Context
|
6
|
+
extend Forwardable
|
7
|
+
|
8
|
+
def_delegators :@presenter, :store, :store=, :content, :view=,
|
9
|
+
:template=, :page=, :path, :path=, :compose, :composer, :precompose!
|
10
|
+
|
11
|
+
def view
|
12
|
+
Presenter::ViewContext.new(presenter.view, self)
|
13
|
+
end
|
14
|
+
|
15
|
+
def partial(*args)
|
16
|
+
Presenter::ViewContext.new(presenter.partial(*args), self)
|
17
|
+
end
|
18
|
+
|
19
|
+
def template
|
20
|
+
Presenter::ViewContext.new(presenter.template, self)
|
21
|
+
end
|
22
|
+
|
23
|
+
def page
|
24
|
+
Presenter::ViewContext.new(presenter.page, self)
|
25
|
+
end
|
26
|
+
|
27
|
+
def container(*args)
|
28
|
+
Presenter::ViewContext.new(presenter.container(*args), self)
|
29
|
+
end
|
30
|
+
|
31
|
+
def bindings(name)
|
32
|
+
presenter.bindings(name).bindings
|
33
|
+
end
|
34
|
+
|
35
|
+
def presenter
|
36
|
+
@presenter
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
module App
|
41
|
+
def presenter
|
42
|
+
@presenter
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|