pakyow-presenter 0.9.1 → 0.10.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 +94 -0
- data/pakyow-presenter/{MIT-LICENSE → LICENSE} +2 -2
- data/pakyow-presenter/README.md +36 -0
- data/pakyow-presenter/lib/pakyow-presenter.rb +1 -4
- data/pakyow-presenter/lib/presenter/attributes.rb +10 -1
- data/pakyow-presenter/lib/presenter/base.rb +2 -1
- data/pakyow-presenter/lib/presenter/binder.rb +20 -6
- data/pakyow-presenter/lib/presenter/binder_set.rb +21 -17
- data/pakyow-presenter/lib/presenter/config/presenter.rb +2 -2
- data/pakyow-presenter/lib/presenter/ext/app.rb +32 -1
- data/pakyow-presenter/lib/presenter/helpers.rb +6 -6
- data/pakyow-presenter/lib/presenter/page.rb +4 -4
- data/pakyow-presenter/lib/presenter/presenter.rb +32 -10
- data/pakyow-presenter/lib/presenter/string_doc.rb +78 -11
- data/pakyow-presenter/lib/presenter/string_doc_parser.rb +16 -7
- data/pakyow-presenter/lib/presenter/view.rb +55 -17
- data/pakyow-presenter/lib/presenter/view_collection.rb +74 -7
- data/pakyow-presenter/lib/presenter/view_composer.rb +52 -8
- data/pakyow-presenter/lib/presenter/view_context.rb +19 -1
- data/pakyow-presenter/lib/presenter/view_store.rb +202 -163
- data/pakyow-presenter/lib/presenter/view_store_loader.rb +43 -0
- data/pakyow-presenter/lib/presenter/view_version.rb +97 -0
- data/pakyow-presenter/lib/views/errors/404.html +5 -0
- data/pakyow-presenter/{README → lib/views/errors/500.html} +0 -0
- metadata +36 -21
- data/pakyow-presenter/CHANGES +0 -57
- data/pakyow-presenter/lib/presenter/nokogiri_doc.rb +0 -321
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pakyow-presenter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bryan Powell
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2015-10-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: pakyow-support
|
@@ -17,28 +17,28 @@ dependencies:
|
|
17
17
|
requirements:
|
18
18
|
- - '='
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version: 0.
|
20
|
+
version: 0.10.0
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
25
|
- - '='
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version: 0.
|
27
|
+
version: 0.10.0
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: pakyow-core
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
32
|
- - '='
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version: 0.
|
34
|
+
version: 0.10.0
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
39
|
- - '='
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version: 0.
|
41
|
+
version: 0.10.0
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: nokogiri
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
@@ -59,38 +59,51 @@ dependencies:
|
|
59
59
|
requirements:
|
60
60
|
- - "~>"
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version: '5.
|
62
|
+
version: '5.6'
|
63
63
|
type: :development
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
67
|
- - "~>"
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: '5.
|
69
|
+
version: '5.6'
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: rspec
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - "~>"
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '3.2'
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - "~>"
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '3.2'
|
70
84
|
- !ruby/object:Gem::Dependency
|
71
85
|
name: pry
|
72
86
|
requirement: !ruby/object:Gem::Requirement
|
73
87
|
requirements:
|
74
88
|
- - "~>"
|
75
89
|
- !ruby/object:Gem::Version
|
76
|
-
version: '0.
|
90
|
+
version: '0.10'
|
77
91
|
type: :development
|
78
92
|
prerelease: false
|
79
93
|
version_requirements: !ruby/object:Gem::Requirement
|
80
94
|
requirements:
|
81
95
|
- - "~>"
|
82
96
|
- !ruby/object:Gem::Version
|
83
|
-
version: '0.
|
84
|
-
description:
|
85
|
-
and data binding.
|
97
|
+
version: '0.10'
|
98
|
+
description: Views and presentation for Pakyow
|
86
99
|
email: bryan@metabahn.com
|
87
100
|
executables: []
|
88
101
|
extensions: []
|
89
102
|
extra_rdoc_files: []
|
90
103
|
files:
|
91
|
-
- pakyow-presenter/
|
92
|
-
- pakyow-presenter/
|
93
|
-
- pakyow-presenter/README
|
104
|
+
- pakyow-presenter/CHANGELOG.md
|
105
|
+
- pakyow-presenter/LICENSE
|
106
|
+
- pakyow-presenter/README.md
|
94
107
|
- pakyow-presenter/lib/pakyow-presenter.rb
|
95
108
|
- pakyow-presenter/lib/presenter/attributes.rb
|
96
109
|
- pakyow-presenter/lib/presenter/base.rb
|
@@ -103,7 +116,6 @@ files:
|
|
103
116
|
- pakyow-presenter/lib/presenter/exceptions.rb
|
104
117
|
- pakyow-presenter/lib/presenter/ext/app.rb
|
105
118
|
- pakyow-presenter/lib/presenter/helpers.rb
|
106
|
-
- pakyow-presenter/lib/presenter/nokogiri_doc.rb
|
107
119
|
- pakyow-presenter/lib/presenter/page.rb
|
108
120
|
- pakyow-presenter/lib/presenter/partial.rb
|
109
121
|
- pakyow-presenter/lib/presenter/presenter.rb
|
@@ -116,7 +128,11 @@ files:
|
|
116
128
|
- pakyow-presenter/lib/presenter/view_composer.rb
|
117
129
|
- pakyow-presenter/lib/presenter/view_context.rb
|
118
130
|
- pakyow-presenter/lib/presenter/view_store.rb
|
119
|
-
|
131
|
+
- pakyow-presenter/lib/presenter/view_store_loader.rb
|
132
|
+
- pakyow-presenter/lib/presenter/view_version.rb
|
133
|
+
- pakyow-presenter/lib/views/errors/404.html
|
134
|
+
- pakyow-presenter/lib/views/errors/500.html
|
135
|
+
homepage: http://pakyow.org
|
120
136
|
licenses:
|
121
137
|
- MIT
|
122
138
|
metadata: {}
|
@@ -135,10 +151,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
135
151
|
- !ruby/object:Gem::Version
|
136
152
|
version: '0'
|
137
153
|
requirements: []
|
138
|
-
rubyforge_project:
|
139
|
-
rubygems_version: 2.
|
154
|
+
rubyforge_project:
|
155
|
+
rubygems_version: 2.4.5
|
140
156
|
signing_key:
|
141
157
|
specification_version: 4
|
142
|
-
summary:
|
158
|
+
summary: Pakyow Presenter
|
143
159
|
test_files: []
|
144
|
-
has_rdoc:
|
data/pakyow-presenter/CHANGES
DELETED
@@ -1,57 +0,0 @@
|
|
1
|
-
= 0.9.1 / 2014-12-06
|
2
|
-
|
3
|
-
* Fixes bug where name attribute wasn't set on form fields when binding without a value
|
4
|
-
* Fixes bug causing all partials (not just available ones) to be defined as view parts
|
5
|
-
* Fixes bug causing form action binding to break
|
6
|
-
|
7
|
-
= 0.9.0 / 2014-11-09
|
8
|
-
|
9
|
-
* Introduces StringDoc, replacing Nokogiri for view rendering with a performant alternative
|
10
|
-
* Adds the ability to set an empty first option in bindings
|
11
|
-
* Remove the annoying "no content" for container log message
|
12
|
-
* Binding context must now be explicitly passed when binding
|
13
|
-
* Yield bindable value before bindable in view binding fns
|
14
|
-
* Fixes bug causing non-html view contents to be processed twice
|
15
|
-
* Removes support for Ruby versions < 2.0.0
|
16
|
-
|
17
|
-
= 0.8.0 / 2014-03-02
|
18
|
-
|
19
|
-
* Major rewrite, including new view syntax, composer, and transformation api
|
20
|
-
|
21
|
-
= 0.7.2 / 2012-02-29
|
22
|
-
|
23
|
-
* No changes -- bumped version to be consistent
|
24
|
-
|
25
|
-
= 0.7.1 / 2012-01-08
|
26
|
-
|
27
|
-
* View caching fixes
|
28
|
-
* Changed binder to allow definition for multiple endpoints
|
29
|
-
* Changed in_context to accept context as block argument
|
30
|
-
* Changed action binder to add leading slash if needed
|
31
|
-
* Change to allow a view's content to be set to nil
|
32
|
-
* Fixed Views#find method
|
33
|
-
|
34
|
-
= 0.7.0 / 2011-11-19
|
35
|
-
|
36
|
-
* Cleaned up core/presenter interface
|
37
|
-
* Optimized view caching
|
38
|
-
* Binding occurs on the label an object is being bound to, not the object type
|
39
|
-
* Root view override in index directories no longer specify a root view for siblings
|
40
|
-
* Fixed problem binding to a checkbox who’s value attribute is not set
|
41
|
-
|
42
|
-
= 0.6.3 / 2011-09-13
|
43
|
-
|
44
|
-
* Fixes binding to bindings defined by HTML 'name' attribute
|
45
|
-
|
46
|
-
= 0.6.2 / 2011-08-20
|
47
|
-
|
48
|
-
* Fixes issue binding object to root nodes
|
49
|
-
* JRuby Support
|
50
|
-
|
51
|
-
= 0.6.1 / 2011-08-20
|
52
|
-
|
53
|
-
* Fixes gemspec problem
|
54
|
-
|
55
|
-
= 0.6.0 / 2011-08-20
|
56
|
-
|
57
|
-
* Initial gem release of 0.6.0 codebase
|
@@ -1,321 +0,0 @@
|
|
1
|
-
module Pakyow
|
2
|
-
module Presenter
|
3
|
-
class NokogiriDoc
|
4
|
-
PARTIAL_REGEX = /<!--\s*@include\s*([a-zA-Z0-9\-_]*)\s*-->/
|
5
|
-
|
6
|
-
attr_accessor :doc, :scopes
|
7
|
-
|
8
|
-
def breadth_first(doc)
|
9
|
-
queue = [doc]
|
10
|
-
until queue.empty?
|
11
|
-
node = queue.shift
|
12
|
-
catch(:reject) {
|
13
|
-
yield node
|
14
|
-
queue.concat(node.children)
|
15
|
-
}
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def path_to(child)
|
20
|
-
path = []
|
21
|
-
|
22
|
-
return path if child == @doc
|
23
|
-
|
24
|
-
child.ancestors.each {|a|
|
25
|
-
# since ancestors goes all the way to doc root, stop when we get to the level of @doc
|
26
|
-
break if a.children.include?(@doc)
|
27
|
-
|
28
|
-
path.unshift(a.children.index(child))
|
29
|
-
child = a
|
30
|
-
}
|
31
|
-
|
32
|
-
return path
|
33
|
-
end
|
34
|
-
|
35
|
-
def path_within_path?(child_path, parent_path)
|
36
|
-
parent_path.each_with_index {|pp_step, i|
|
37
|
-
return false unless pp_step == child_path[i]
|
38
|
-
}
|
39
|
-
|
40
|
-
true
|
41
|
-
end
|
42
|
-
|
43
|
-
def doc_from_path(path)
|
44
|
-
o = @doc
|
45
|
-
|
46
|
-
# if path is empty we're at self
|
47
|
-
return o if path.empty?
|
48
|
-
|
49
|
-
path.each {|i|
|
50
|
-
if child = o.children[i]
|
51
|
-
o = child
|
52
|
-
else
|
53
|
-
break
|
54
|
-
end
|
55
|
-
}
|
56
|
-
|
57
|
-
return o
|
58
|
-
end
|
59
|
-
|
60
|
-
def view_from_path(path)
|
61
|
-
view = View.from_doc(doc_from_path(path))
|
62
|
-
view.related_views << self
|
63
|
-
|
64
|
-
# workaround for nokogiri in jruby (see https://github.com/sparklemotion/nokogiri/issues/1060)
|
65
|
-
view.doc.document.errors = []
|
66
|
-
|
67
|
-
return view
|
68
|
-
end
|
69
|
-
|
70
|
-
def to_html
|
71
|
-
@doc.to_html
|
72
|
-
end
|
73
|
-
|
74
|
-
alias :to_s :to_html
|
75
|
-
|
76
|
-
def title=(title)
|
77
|
-
return if @doc.nil?
|
78
|
-
|
79
|
-
if o = @doc.css('title').first
|
80
|
-
o.inner_html = Nokogiri::HTML::fragment(title.to_s)
|
81
|
-
elsif o = @doc.css('head').first
|
82
|
-
o.add_child(Nokogiri::HTML::fragment("<title>#{title}</title>"))
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
def title
|
87
|
-
return unless o = @doc.css('title').first
|
88
|
-
o.inner_text
|
89
|
-
end
|
90
|
-
|
91
|
-
def self.from_doc(doc)
|
92
|
-
instance = allocate
|
93
|
-
instance.doc = doc
|
94
|
-
return instance
|
95
|
-
end
|
96
|
-
|
97
|
-
def initialize(html)
|
98
|
-
if html.match(/<html.*>/)
|
99
|
-
@doc = Nokogiri::HTML::Document.parse(html)
|
100
|
-
else
|
101
|
-
@doc = Nokogiri::HTML.fragment(html)
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
def initialize_copy(original_doc)
|
106
|
-
super
|
107
|
-
|
108
|
-
# this solves a memory leak that I believe is being
|
109
|
-
# caused by Nokogiri; don't like this approach much
|
110
|
-
# since it negatively affects performance
|
111
|
-
#
|
112
|
-
# https://gist.github.com/bryanp/2048ae4a38f94c9d97ef
|
113
|
-
if original_doc.is_a?(Nokogiri::HTML::DocumentFragment)
|
114
|
-
@doc = Nokogiri::HTML.fragment(original_doc.doc.to_html)
|
115
|
-
else
|
116
|
-
@doc = original_doc.doc.dup
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
def soft_copy
|
121
|
-
dup
|
122
|
-
end
|
123
|
-
|
124
|
-
def set_attribute(name, value)
|
125
|
-
@doc[name.to_s] = value
|
126
|
-
end
|
127
|
-
|
128
|
-
def get_attribute(name)
|
129
|
-
@doc[name.to_s]
|
130
|
-
end
|
131
|
-
|
132
|
-
def remove_attribute(name)
|
133
|
-
@doc.remove_attribute(name.to_s)
|
134
|
-
end
|
135
|
-
|
136
|
-
def update_attribute(name, value)
|
137
|
-
if !@doc.is_a?(Nokogiri::XML::Element) && @doc.children.count == 1
|
138
|
-
@doc.children.first[name] = value
|
139
|
-
else
|
140
|
-
@doc.set_attribute(name, value)
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
def remove
|
145
|
-
if @doc.parent.nil?
|
146
|
-
# best we can do is to remove the children
|
147
|
-
@doc.children.remove
|
148
|
-
else
|
149
|
-
@doc.remove
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
def clear
|
154
|
-
return if @doc.blank?
|
155
|
-
@doc.inner_html = ''
|
156
|
-
end
|
157
|
-
|
158
|
-
def text
|
159
|
-
@doc.inner_text
|
160
|
-
end
|
161
|
-
|
162
|
-
def text=(text)
|
163
|
-
@doc.content = text.to_s
|
164
|
-
end
|
165
|
-
|
166
|
-
def html
|
167
|
-
@doc.inner_html
|
168
|
-
end
|
169
|
-
|
170
|
-
def html=(html)
|
171
|
-
@doc.inner_html = Nokogiri::HTML.fragment(html.to_s)
|
172
|
-
end
|
173
|
-
|
174
|
-
def append(appendable)
|
175
|
-
content = appendable.is_a?(NokogiriDoc) ? appendable.doc : appendable
|
176
|
-
@doc.add_child(content)
|
177
|
-
end
|
178
|
-
|
179
|
-
def prepend(prependable)
|
180
|
-
content = prependable.is_a?(NokogiriDoc) ? prependable.doc : prependable
|
181
|
-
if first_child = @doc.children.first
|
182
|
-
first_child.add_previous_sibling(content)
|
183
|
-
else
|
184
|
-
@doc = content
|
185
|
-
end
|
186
|
-
end
|
187
|
-
|
188
|
-
def after(insertable)
|
189
|
-
content = insertable.is_a?(NokogiriDoc) ? insertable.doc : insertable
|
190
|
-
@doc.after(content)
|
191
|
-
end
|
192
|
-
|
193
|
-
def before(insertable)
|
194
|
-
content = insertable.is_a?(NokogiriDoc) ? insertable.doc : insertable
|
195
|
-
@doc.before(content)
|
196
|
-
end
|
197
|
-
|
198
|
-
def replace(replacement)
|
199
|
-
content = replacement.is_a?(NokogiriDoc) ? replacement.doc : replacement
|
200
|
-
|
201
|
-
if @doc.parent.nil?
|
202
|
-
@doc.children.remove
|
203
|
-
@doc.inner_html = content
|
204
|
-
else
|
205
|
-
@doc.replace(content)
|
206
|
-
end
|
207
|
-
end
|
208
|
-
|
209
|
-
def scope(name)
|
210
|
-
scopes.select { |b| b[:scope] == name }
|
211
|
-
end
|
212
|
-
|
213
|
-
def prop(scope_name, prop_name)
|
214
|
-
return [] unless scope = scopes.select { |b| b[:scope] == scope_name }[0]
|
215
|
-
scope[:props].select { |b| b[:prop] == prop_name }
|
216
|
-
end
|
217
|
-
|
218
|
-
def container(name)
|
219
|
-
container = @containers[name.to_sym]
|
220
|
-
return container[:doc]
|
221
|
-
end
|
222
|
-
|
223
|
-
def scopes
|
224
|
-
find_scopes
|
225
|
-
end
|
226
|
-
|
227
|
-
def containers
|
228
|
-
find_containers
|
229
|
-
end
|
230
|
-
|
231
|
-
def partials
|
232
|
-
find_partials
|
233
|
-
end
|
234
|
-
|
235
|
-
def ==(o)
|
236
|
-
to_html == o.to_html
|
237
|
-
end
|
238
|
-
|
239
|
-
def tagname
|
240
|
-
@doc.name
|
241
|
-
end
|
242
|
-
|
243
|
-
def option(value: nil)
|
244
|
-
@doc.css('option[value="' + value.to_s + '"]').first
|
245
|
-
end
|
246
|
-
|
247
|
-
private
|
248
|
-
|
249
|
-
# returns an array of hashes that describe each scope
|
250
|
-
def find_scopes(doc = @doc, ignore_root = false)
|
251
|
-
scopes = []
|
252
|
-
breadth_first(doc) {|o|
|
253
|
-
next if o == doc && ignore_root
|
254
|
-
next if !scope = o[Config.presenter.scope_attribute]
|
255
|
-
|
256
|
-
scopes << {
|
257
|
-
:doc => NokogiriDoc.from_doc(o),
|
258
|
-
:scope => scope.to_sym,
|
259
|
-
:props => find_props(o)
|
260
|
-
}
|
261
|
-
|
262
|
-
if o == doc
|
263
|
-
# this is the root node, which we need as the first hash in the
|
264
|
-
# list of scopes, but we don't want to nest other scopes inside
|
265
|
-
# of it in this case
|
266
|
-
scopes.last[:nested] = []
|
267
|
-
else
|
268
|
-
scopes.last[:nested] = find_scopes(o, true)
|
269
|
-
# reject so children aren't traversed
|
270
|
-
throw :reject
|
271
|
-
end
|
272
|
-
}
|
273
|
-
|
274
|
-
return scopes
|
275
|
-
end
|
276
|
-
|
277
|
-
# returns an array of hashes, each with the container name and doc
|
278
|
-
def find_containers
|
279
|
-
containers = {}
|
280
|
-
|
281
|
-
@doc.traverse {|e|
|
282
|
-
next unless e.is_a?(Nokogiri::XML::Comment)
|
283
|
-
next unless match = e.text.strip.match(/@container( ([a-zA-Z0-9\-_]*))*/)
|
284
|
-
name = match[2] || :default
|
285
|
-
|
286
|
-
containers[name.to_sym] = { doc: NokogiriDoc.from_doc(e) }
|
287
|
-
}
|
288
|
-
|
289
|
-
return containers
|
290
|
-
end
|
291
|
-
|
292
|
-
def find_props(o)
|
293
|
-
props = []
|
294
|
-
breadth_first(o) {|so|
|
295
|
-
# don't go into deeper scopes
|
296
|
-
throw :reject if so != o && so[Config.presenter.scope_attribute]
|
297
|
-
|
298
|
-
next unless prop = so[Config.presenter.prop_attribute]
|
299
|
-
props << { :prop => prop.to_sym, :doc => NokogiriDoc.from_doc(so) }
|
300
|
-
}
|
301
|
-
|
302
|
-
return props
|
303
|
-
end
|
304
|
-
|
305
|
-
def find_partials
|
306
|
-
partials = {}
|
307
|
-
|
308
|
-
@doc.traverse { |e|
|
309
|
-
next unless e.is_a?(Nokogiri::XML::Comment)
|
310
|
-
next unless match = e.to_html.strip.match(PARTIAL_REGEX)
|
311
|
-
|
312
|
-
name = match[1]
|
313
|
-
partials[name.to_sym] = NokogiriDoc.from_doc(e)
|
314
|
-
}
|
315
|
-
|
316
|
-
return partials
|
317
|
-
end
|
318
|
-
|
319
|
-
end
|
320
|
-
end
|
321
|
-
end
|