pakyow-presenter 0.8.rc4 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/pakyow-presenter/CHANGES +4 -0
- data/pakyow-presenter/lib/presenter/attributes.rb +31 -7
- data/pakyow-presenter/lib/presenter/base.rb +3 -0
- data/pakyow-presenter/lib/presenter/binder.rb +10 -6
- data/pakyow-presenter/lib/presenter/binder_set.rb +12 -5
- data/pakyow-presenter/lib/presenter/container.rb +6 -0
- data/pakyow-presenter/lib/presenter/doc_helpers.rb +7 -0
- data/pakyow-presenter/lib/presenter/exceptions.rb +4 -0
- data/pakyow-presenter/lib/presenter/helpers.rb +6 -4
- data/pakyow-presenter/lib/presenter/page.rb +44 -51
- data/pakyow-presenter/lib/presenter/partial.rb +1 -19
- data/pakyow-presenter/lib/presenter/presenter.rb +67 -51
- data/pakyow-presenter/lib/presenter/template.rb +11 -15
- data/pakyow-presenter/lib/presenter/title_helpers.rb +21 -0
- data/pakyow-presenter/lib/presenter/view.rb +280 -124
- data/pakyow-presenter/lib/presenter/view_collection.rb +108 -12
- data/pakyow-presenter/lib/presenter/view_composer.rb +194 -0
- data/pakyow-presenter/lib/presenter/view_store.rb +65 -18
- metadata +18 -15
@@ -3,6 +3,8 @@ module Pakyow
|
|
3
3
|
class ViewCollection
|
4
4
|
include Enumerable
|
5
5
|
|
6
|
+
attr_accessor :context, :composer
|
7
|
+
|
6
8
|
def initialize
|
7
9
|
@views = []
|
8
10
|
end
|
@@ -67,14 +69,27 @@ module Pakyow
|
|
67
69
|
|
68
70
|
alias :render :append
|
69
71
|
|
72
|
+
def prepend(content)
|
73
|
+
self.each {|e| e.prepend(content)}
|
74
|
+
end
|
75
|
+
|
70
76
|
def <<(val)
|
71
77
|
if val.is_a? View
|
72
78
|
@views << val
|
73
79
|
end
|
74
80
|
end
|
75
81
|
|
82
|
+
def concat(views)
|
83
|
+
@views.concat(views)
|
84
|
+
end
|
85
|
+
|
76
86
|
def [](i)
|
77
|
-
@views[i]
|
87
|
+
view = @views[i]
|
88
|
+
return if view.nil?
|
89
|
+
|
90
|
+
view.context = @context
|
91
|
+
view.composer = @composer
|
92
|
+
return view
|
78
93
|
end
|
79
94
|
|
80
95
|
def length
|
@@ -83,9 +98,15 @@ module Pakyow
|
|
83
98
|
|
84
99
|
def scope(name)
|
85
100
|
views = ViewCollection.new
|
101
|
+
views.context = @context
|
102
|
+
views.composer = @composer
|
86
103
|
self.each{|v|
|
87
104
|
next unless svs = v.scope(name)
|
88
|
-
svs.each{|sv|
|
105
|
+
svs.each{ |sv|
|
106
|
+
sv.context = @context
|
107
|
+
sv.composer = @composer
|
108
|
+
views << sv
|
109
|
+
}
|
89
110
|
}
|
90
111
|
|
91
112
|
views
|
@@ -93,9 +114,15 @@ module Pakyow
|
|
93
114
|
|
94
115
|
def prop(name)
|
95
116
|
views = ViewCollection.new
|
117
|
+
views.context = @context
|
118
|
+
views.composer = @composer
|
96
119
|
self.each{|v|
|
97
120
|
next unless svs = v.prop(name)
|
98
|
-
svs.each{|sv|
|
121
|
+
svs.each{ |sv|
|
122
|
+
sv.context = @context
|
123
|
+
sv.composer = @composer
|
124
|
+
views << sv
|
125
|
+
}
|
99
126
|
}
|
100
127
|
|
101
128
|
views
|
@@ -106,11 +133,13 @@ module Pakyow
|
|
106
133
|
#
|
107
134
|
# Creates a context in which view manipulations can be performed.
|
108
135
|
#
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
136
|
+
def with(&block)
|
137
|
+
if block.arity == 0
|
138
|
+
self.instance_exec(&block)
|
139
|
+
else
|
140
|
+
yield(self)
|
141
|
+
end
|
142
|
+
|
114
143
|
self
|
115
144
|
end
|
116
145
|
|
@@ -129,10 +158,35 @@ module Pakyow
|
|
129
158
|
|
130
159
|
self.each_with_index { |v,i|
|
131
160
|
break unless datum = data[i]
|
132
|
-
|
161
|
+
|
162
|
+
if block.arity == 1
|
163
|
+
v.instance_exec(data[i], &block)
|
164
|
+
else
|
165
|
+
block.call(v, data[i])
|
166
|
+
end
|
133
167
|
}
|
134
168
|
end
|
135
169
|
|
170
|
+
# call-seq:
|
171
|
+
# for_with_index {|view, datum, i| block}
|
172
|
+
#
|
173
|
+
# Yields a view, its matching datum, and index. Datums are yielded until
|
174
|
+
# no more views or data is available. For the ViewCollection case, this
|
175
|
+
# means the block will be yielded self.length times.
|
176
|
+
#
|
177
|
+
def for_with_index(data, &block)
|
178
|
+
i = 0
|
179
|
+
self.for(data) do |ctx, datum|
|
180
|
+
if block.arity == 2
|
181
|
+
ctx.instance_exec(datum, i, &block)
|
182
|
+
else
|
183
|
+
block.call(ctx, datum, i)
|
184
|
+
end
|
185
|
+
|
186
|
+
i += 1
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
136
190
|
# call-seq:
|
137
191
|
# match(data) => ViewCollection
|
138
192
|
#
|
@@ -145,6 +199,8 @@ module Pakyow
|
|
145
199
|
data = [data] if (!data.is_a?(Enumerable) || data.is_a?(Hash))
|
146
200
|
|
147
201
|
views = ViewCollection.new
|
202
|
+
views.context = @context
|
203
|
+
views.composer = @composer
|
148
204
|
data.each_with_index {|datum,i|
|
149
205
|
unless v = self[i]
|
150
206
|
|
@@ -154,18 +210,25 @@ module Pakyow
|
|
154
210
|
|
155
211
|
d_v = v.doc.dup
|
156
212
|
v.doc.before(d_v)
|
213
|
+
v.invalidate!(true)
|
157
214
|
|
158
215
|
new_v = View.from_doc(d_v)
|
159
216
|
|
160
217
|
# find binding subset (keeps us from refinding)
|
161
218
|
new_v.bindings = v.bindings.dup
|
162
219
|
new_v.scoped_as = v.scoped_as
|
220
|
+
new_v.context = @context
|
221
|
+
new_v.composer = @composer
|
163
222
|
|
164
223
|
views << new_v
|
165
224
|
}
|
166
225
|
|
167
226
|
# do not use self.remove since that refinds bindings
|
168
|
-
self.each {|v|
|
227
|
+
self.each {|v|
|
228
|
+
next if v.doc.parent.nil?
|
229
|
+
v.doc.remove
|
230
|
+
}
|
231
|
+
|
169
232
|
views
|
170
233
|
end
|
171
234
|
|
@@ -178,18 +241,51 @@ module Pakyow
|
|
178
241
|
self.match(data).for(data, &block)
|
179
242
|
end
|
180
243
|
|
244
|
+
# call-seq:
|
245
|
+
# repeat_with_index(data) {|view, datum, i| block}
|
246
|
+
#
|
247
|
+
# Matches self with data and yields a view/datum pair with index.
|
248
|
+
#
|
249
|
+
def repeat_with_index(data, &block)
|
250
|
+
self.match(data).for_with_index(data, &block)
|
251
|
+
end
|
252
|
+
|
181
253
|
# call-seq:
|
182
254
|
# bind(data)
|
183
255
|
#
|
184
256
|
# Binds data across existing scopes.
|
185
257
|
#
|
186
258
|
def bind(data, bindings = {}, &block)
|
187
|
-
self.for(data) {|view, datum
|
259
|
+
self.for(data) {|view, datum|
|
188
260
|
view.bind(datum, bindings)
|
189
|
-
|
261
|
+
next if block.nil?
|
262
|
+
|
263
|
+
if block.arity == 1
|
264
|
+
view.instance_exec(datum, &block)
|
265
|
+
else
|
266
|
+
block.call(view, datum)
|
267
|
+
end
|
190
268
|
}
|
191
269
|
end
|
192
270
|
|
271
|
+
# call-seq:
|
272
|
+
# bind_with_index(data)
|
273
|
+
#
|
274
|
+
# Binds data across existing scopes, yielding a view/datum pair with index.
|
275
|
+
#
|
276
|
+
def bind_with_index(data, bindings = {}, &block)
|
277
|
+
i = 0
|
278
|
+
self.bind(data) do |ctx, datum|
|
279
|
+
if block.arity == 2
|
280
|
+
ctx.instance_exec(datum, i, &block)
|
281
|
+
else
|
282
|
+
block.call(ctx, datum, i)
|
283
|
+
end
|
284
|
+
|
285
|
+
i += 1
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
193
289
|
# call-seq:
|
194
290
|
# apply(data)
|
195
291
|
#
|
@@ -0,0 +1,194 @@
|
|
1
|
+
module Pakyow
|
2
|
+
module Presenter
|
3
|
+
class ViewComposer
|
4
|
+
class << self
|
5
|
+
def from_path(store, path, opts = {}, &block)
|
6
|
+
ViewComposer.new(store, path, opts, &block)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
extend Forwardable
|
11
|
+
|
12
|
+
def_delegators :template, :title, :title=
|
13
|
+
def_delegators :parts, :scope, :prop
|
14
|
+
|
15
|
+
attr_accessor :context
|
16
|
+
attr_reader :store, :path, :page, :partials
|
17
|
+
|
18
|
+
def initialize(store, path = nil, opts = {}, &block)
|
19
|
+
@store = store
|
20
|
+
@path = path
|
21
|
+
|
22
|
+
self.page = opts.fetch(:page) {
|
23
|
+
path
|
24
|
+
}
|
25
|
+
|
26
|
+
self.template = opts.fetch(:template) {
|
27
|
+
(@page.is_a?(Page) && @page.info(:template)) || path
|
28
|
+
}
|
29
|
+
|
30
|
+
@partials = {}
|
31
|
+
|
32
|
+
begin
|
33
|
+
@partials = includes(opts.fetch(:includes))
|
34
|
+
rescue
|
35
|
+
@partials = store.partials(path) unless path.nil?
|
36
|
+
end
|
37
|
+
|
38
|
+
@partials.each do |name, partial|
|
39
|
+
partial.composer = self
|
40
|
+
end
|
41
|
+
|
42
|
+
instance_exec(&block) if block_given?
|
43
|
+
end
|
44
|
+
|
45
|
+
def initialize_copy(original)
|
46
|
+
super
|
47
|
+
|
48
|
+
%w[store path page template partials view].each do |ivar|
|
49
|
+
value = original.instance_variable_get("@#{ivar}")
|
50
|
+
|
51
|
+
if value.is_a?(Hash)
|
52
|
+
dup_value = {}
|
53
|
+
value.each_pair { |key, value| dup_value[key] = value.dup }
|
54
|
+
else
|
55
|
+
dup_value = value.dup
|
56
|
+
end
|
57
|
+
|
58
|
+
self.instance_variable_set("@#{ivar}", dup_value)
|
59
|
+
end
|
60
|
+
|
61
|
+
# update composer reference for partials
|
62
|
+
@partials.each do |name, partial|
|
63
|
+
partial.composer = self
|
64
|
+
end
|
65
|
+
|
66
|
+
# update composer reference for page
|
67
|
+
@page.composer = self
|
68
|
+
end
|
69
|
+
|
70
|
+
def precompose!
|
71
|
+
@view = build_view
|
72
|
+
clean!
|
73
|
+
end
|
74
|
+
|
75
|
+
def view
|
76
|
+
if dirty?
|
77
|
+
@view = build_view
|
78
|
+
clean!
|
79
|
+
end
|
80
|
+
|
81
|
+
return @view
|
82
|
+
end
|
83
|
+
alias_method :composed, :view
|
84
|
+
|
85
|
+
def template(template = nil)
|
86
|
+
if template.nil?
|
87
|
+
@template.context = context
|
88
|
+
return @template
|
89
|
+
end
|
90
|
+
|
91
|
+
self.template = template
|
92
|
+
return self
|
93
|
+
end
|
94
|
+
|
95
|
+
def template=(template)
|
96
|
+
unless template.is_a?(Template)
|
97
|
+
# get template by name
|
98
|
+
template = @store.template(template)
|
99
|
+
end
|
100
|
+
|
101
|
+
@template = template
|
102
|
+
dirty!
|
103
|
+
|
104
|
+
return self
|
105
|
+
end
|
106
|
+
|
107
|
+
def page=(page)
|
108
|
+
unless page.is_a?(Page)
|
109
|
+
# get page by name
|
110
|
+
page = @store.page(page)
|
111
|
+
end
|
112
|
+
|
113
|
+
page.composer = self
|
114
|
+
@page = page
|
115
|
+
dirty!
|
116
|
+
|
117
|
+
return self
|
118
|
+
end
|
119
|
+
|
120
|
+
def includes(partial_map)
|
121
|
+
dirty!
|
122
|
+
|
123
|
+
@partials.merge!(remap_partials(partial_map))
|
124
|
+
end
|
125
|
+
|
126
|
+
def partials=(partial_map)
|
127
|
+
dirty!
|
128
|
+
@partials.merge!(remap_partials(partial_map))
|
129
|
+
end
|
130
|
+
|
131
|
+
def partial(name)
|
132
|
+
partial = @partials[name]
|
133
|
+
partial.context = context
|
134
|
+
return partial
|
135
|
+
end
|
136
|
+
|
137
|
+
def container(name)
|
138
|
+
container = @page.container(name)
|
139
|
+
container.context = context
|
140
|
+
return container
|
141
|
+
end
|
142
|
+
|
143
|
+
def dirty?
|
144
|
+
@dirty
|
145
|
+
end
|
146
|
+
|
147
|
+
def dirty!
|
148
|
+
@dirty = true
|
149
|
+
end
|
150
|
+
|
151
|
+
def parts
|
152
|
+
parts = ViewCollection.new
|
153
|
+
parts.context = @context
|
154
|
+
parts.composer = self
|
155
|
+
parts << @template
|
156
|
+
@page.each_container do |name, container| parts << container end
|
157
|
+
partials.each_pair do |name, partial| parts << partial end
|
158
|
+
return parts
|
159
|
+
end
|
160
|
+
|
161
|
+
private
|
162
|
+
|
163
|
+
def clean!
|
164
|
+
@dirty = false
|
165
|
+
end
|
166
|
+
|
167
|
+
def build_view
|
168
|
+
raise MissingTemplate, "No template provided to view composer" if @template.nil?
|
169
|
+
raise MissingPage, "No page provided to view composer" if @page.nil?
|
170
|
+
|
171
|
+
view = @template.dup.build(@page).includes(@partials)
|
172
|
+
|
173
|
+
# set title
|
174
|
+
title = @page.info(:title)
|
175
|
+
view.title = title unless title.nil?
|
176
|
+
|
177
|
+
return view
|
178
|
+
end
|
179
|
+
|
180
|
+
def remap_partials(partials)
|
181
|
+
Hash[partials.map { |name, partial_or_path|
|
182
|
+
if partial_or_path.is_a?(Partial)
|
183
|
+
partial = partial_or_path
|
184
|
+
else
|
185
|
+
partial = Partial.load(@store.expand_partial_path(path))
|
186
|
+
end
|
187
|
+
|
188
|
+
[name, partial]
|
189
|
+
}]
|
190
|
+
end
|
191
|
+
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Pakyow
|
2
2
|
class ViewStore
|
3
|
-
attr_reader :name
|
3
|
+
attr_reader :name, :store_path, :templates
|
4
4
|
|
5
5
|
def initialize(store_path, name = :default)
|
6
6
|
@name = name
|
@@ -20,6 +20,8 @@ module Pakyow
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def template(name_or_path)
|
23
|
+
return name_or_path if name_or_path.is_a?(Template)
|
24
|
+
|
23
25
|
if name_or_path.is_a?(Symbol)
|
24
26
|
return template_with_name(name_or_path)
|
25
27
|
else
|
@@ -28,24 +30,62 @@ module Pakyow
|
|
28
30
|
end
|
29
31
|
|
30
32
|
def page(view_path)
|
33
|
+
return view_path if view_path.is_a?(Page)
|
34
|
+
|
35
|
+
raise ArgumentError, "Cannot build page for nil path" if view_path.nil?
|
31
36
|
return at_path(view_path, :page).dup
|
32
37
|
end
|
33
38
|
|
34
39
|
def view(view_path)
|
35
|
-
return at_path(view_path, :
|
40
|
+
return at_path(view_path, :composer).view.dup
|
41
|
+
end
|
42
|
+
|
43
|
+
def partials(view_path)
|
44
|
+
return at_path(view_path, :partials) || {}
|
36
45
|
end
|
37
46
|
|
38
47
|
def partial(view_path, name)
|
39
|
-
return
|
48
|
+
return partials(view_path)[name.to_sym]
|
49
|
+
end
|
50
|
+
|
51
|
+
def composer(view_path)
|
52
|
+
return at_path(view_path, :composer).dup
|
40
53
|
end
|
41
54
|
|
42
55
|
# iterations through known views, yielding each
|
43
56
|
def views
|
44
57
|
@path_info.each_pair do |path, info|
|
45
|
-
yield(info[:view
|
58
|
+
yield(info[:composer].view, path)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def infos
|
63
|
+
@path_info.each_pair do |path, info|
|
64
|
+
yield(info, path)
|
46
65
|
end
|
47
66
|
end
|
48
67
|
|
68
|
+
def expand_path(view_path)
|
69
|
+
File.join(@store_path, view_path)
|
70
|
+
end
|
71
|
+
|
72
|
+
# Builds the full path to a partial.
|
73
|
+
#
|
74
|
+
# expand_partial_path('path/to/partial')
|
75
|
+
# # => '{store_path}/path/to/_partial.html'
|
76
|
+
def expand_partial_path(path)
|
77
|
+
parts = path.split('/')
|
78
|
+
|
79
|
+
# add underscore
|
80
|
+
expanded_path = expand_path((parts[0..-2] << "_#{parts[-1]}").join('/'))
|
81
|
+
|
82
|
+
# attempt to find extension
|
83
|
+
matches = Dir.glob(expanded_path + '.*')
|
84
|
+
raise MissingPartial, "Could not find partial with any extension at #{expanded_path}" if matches.empty?
|
85
|
+
|
86
|
+
return expanded_path + File.extname(matches[0])
|
87
|
+
end
|
88
|
+
|
49
89
|
private
|
50
90
|
|
51
91
|
def at_path(view_path, obj = nil)
|
@@ -55,7 +95,7 @@ module Pakyow
|
|
55
95
|
if info.nil?
|
56
96
|
raise MissingView, "No view at path '#{view_path}'"
|
57
97
|
else
|
58
|
-
return obj ? info[obj.to_sym] : info
|
98
|
+
return (obj ? info[obj.to_sym] : info).dup
|
59
99
|
end
|
60
100
|
end
|
61
101
|
|
@@ -64,7 +104,7 @@ module Pakyow
|
|
64
104
|
raise MissingTemplate, "No template named '#{name}'"
|
65
105
|
end
|
66
106
|
|
67
|
-
return template
|
107
|
+
return template.dup
|
68
108
|
end
|
69
109
|
|
70
110
|
def load_templates
|
@@ -89,7 +129,10 @@ module Pakyow
|
|
89
129
|
def load_path_info
|
90
130
|
@path_info = {}
|
91
131
|
|
92
|
-
|
132
|
+
# for keeping up with pages for previous paths
|
133
|
+
pages = {}
|
134
|
+
|
135
|
+
Utils::Dir.walk_dir(@store_path) do |path|
|
93
136
|
# skip root
|
94
137
|
next if path == @store_path
|
95
138
|
|
@@ -110,26 +153,30 @@ module Pakyow
|
|
110
153
|
# page is used
|
111
154
|
if File.directory?(path)
|
112
155
|
# gets the path for the previous page
|
113
|
-
prev_path = normalized_path
|
114
|
-
page =
|
156
|
+
prev_path = normalized_path
|
157
|
+
until page = pages[prev_path]
|
158
|
+
prev_path = prev_path.split('/')[0..-2].join("/")
|
159
|
+
end
|
160
|
+
page = page
|
115
161
|
else
|
116
162
|
page = Page.load(path)
|
163
|
+
pages[normalized_path] = page
|
117
164
|
end
|
118
165
|
|
119
|
-
template = template_with_name(page.template)
|
166
|
+
template = template_with_name(page.info(:template))
|
120
167
|
|
121
|
-
#TODO more efficient way of doing this? lot
|
122
|
-
# of redundant calls here
|
168
|
+
#TODO more efficient way of doing this? lot of redundant calls here
|
123
169
|
partials = partials_at_path(path)
|
124
170
|
|
125
|
-
#
|
126
|
-
|
171
|
+
# compose template/page/partials
|
172
|
+
composer = ViewComposer.from_path(self, normalized_path, template: template, page: page, includes: partials)
|
173
|
+
composer.precompose!
|
127
174
|
|
128
175
|
info = {
|
129
|
-
view: view,
|
130
176
|
page: page,
|
131
177
|
template: template,
|
132
178
|
partials: partials,
|
179
|
+
composer: composer,
|
133
180
|
}
|
134
181
|
|
135
182
|
@path_info[normalized_path] = info
|
@@ -140,7 +187,7 @@ module Pakyow
|
|
140
187
|
relative_path = path.gsub(@store_path, '')
|
141
188
|
relative_path = relative_path.gsub(File.extname(relative_path), '')
|
142
189
|
relative_path = relative_path.gsub('index', '')
|
143
|
-
relative_path =
|
190
|
+
relative_path = Utils::String.normalize_path(relative_path)
|
144
191
|
|
145
192
|
return relative_path
|
146
193
|
end
|
@@ -149,7 +196,7 @@ module Pakyow
|
|
149
196
|
view_path = File.dirname(view_path) unless File.directory?(view_path)
|
150
197
|
|
151
198
|
partials = {}
|
152
|
-
|
199
|
+
Utils::Dir.walk_dir(@store_path) do |path|
|
153
200
|
# skip non-partials
|
154
201
|
next unless File.basename(path)[0,1] == '_'
|
155
202
|
|
@@ -157,7 +204,7 @@ module Pakyow
|
|
157
204
|
next if File.directory?(path)
|
158
205
|
|
159
206
|
# skip files not within `view_path`
|
160
|
-
next unless
|
207
|
+
next unless Utils::Dir.dir_within_dir?(File.dirname(path), view_path)
|
161
208
|
|
162
209
|
name = File.basename(path.split('/')[-1], '.*')[1..-1]
|
163
210
|
partials[name.to_sym] = path
|
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.8.
|
4
|
+
version: 0.8.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: 2014-03-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: pakyow-core
|
@@ -17,54 +17,54 @@ dependencies:
|
|
17
17
|
requirements:
|
18
18
|
- - '='
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version: 0.8.
|
20
|
+
version: 0.8.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.8.
|
27
|
+
version: 0.8.0
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: nokogiri
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
|
-
- - ~>
|
32
|
+
- - "~>"
|
33
33
|
- !ruby/object:Gem::Version
|
34
34
|
version: '1.6'
|
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
41
|
version: '1.6'
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: minitest
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
|
-
- - ~>
|
46
|
+
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
48
|
version: '5.0'
|
49
49
|
type: :development
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
|
-
- - ~>
|
53
|
+
- - "~>"
|
54
54
|
- !ruby/object:Gem::Version
|
55
55
|
version: '5.0'
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: pry
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
|
-
- - ~>
|
60
|
+
- - "~>"
|
61
61
|
- !ruby/object:Gem::Version
|
62
62
|
version: '0.9'
|
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
69
|
version: '0.9'
|
70
70
|
description: A library for building a frontend for Pakyow applications, including
|
@@ -75,14 +75,15 @@ extensions: []
|
|
75
75
|
extra_rdoc_files: []
|
76
76
|
files:
|
77
77
|
- pakyow-presenter/CHANGES
|
78
|
-
- pakyow-presenter/README
|
79
78
|
- pakyow-presenter/MIT-LICENSE
|
79
|
+
- pakyow-presenter/README
|
80
80
|
- pakyow-presenter/lib/pakyow-presenter.rb
|
81
81
|
- pakyow-presenter/lib/presenter/attributes.rb
|
82
82
|
- pakyow-presenter/lib/presenter/base.rb
|
83
83
|
- pakyow-presenter/lib/presenter/binder.rb
|
84
84
|
- pakyow-presenter/lib/presenter/binder_set.rb
|
85
85
|
- pakyow-presenter/lib/presenter/config/presenter.rb
|
86
|
+
- pakyow-presenter/lib/presenter/container.rb
|
86
87
|
- pakyow-presenter/lib/presenter/doc_helpers.rb
|
87
88
|
- pakyow-presenter/lib/presenter/exceptions.rb
|
88
89
|
- pakyow-presenter/lib/presenter/ext/app.rb
|
@@ -91,8 +92,10 @@ files:
|
|
91
92
|
- pakyow-presenter/lib/presenter/partial.rb
|
92
93
|
- pakyow-presenter/lib/presenter/presenter.rb
|
93
94
|
- pakyow-presenter/lib/presenter/template.rb
|
95
|
+
- pakyow-presenter/lib/presenter/title_helpers.rb
|
94
96
|
- pakyow-presenter/lib/presenter/view.rb
|
95
97
|
- pakyow-presenter/lib/presenter/view_collection.rb
|
98
|
+
- pakyow-presenter/lib/presenter/view_composer.rb
|
96
99
|
- pakyow-presenter/lib/presenter/view_store.rb
|
97
100
|
homepage: http://pakyow.com
|
98
101
|
licenses:
|
@@ -104,17 +107,17 @@ require_paths:
|
|
104
107
|
- pakyow-presenter/lib
|
105
108
|
required_ruby_version: !ruby/object:Gem::Requirement
|
106
109
|
requirements:
|
107
|
-
- -
|
110
|
+
- - ">="
|
108
111
|
- !ruby/object:Gem::Version
|
109
112
|
version: 1.9.3
|
110
113
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
111
114
|
requirements:
|
112
|
-
- -
|
115
|
+
- - ">="
|
113
116
|
- !ruby/object:Gem::Version
|
114
|
-
version:
|
117
|
+
version: '0'
|
115
118
|
requirements: []
|
116
119
|
rubyforge_project: pakyow-presenter
|
117
|
-
rubygems_version: 2.
|
120
|
+
rubygems_version: 2.2.0
|
118
121
|
signing_key:
|
119
122
|
specification_version: 4
|
120
123
|
summary: A library for building a frontend for Pakyow applications.
|