pakyow-presenter 0.7.2 → 0.8rc1

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.
@@ -0,0 +1,187 @@
1
+ module Pakyow
2
+ module Presenter
3
+ class ViewCollection
4
+ include Enumerable
5
+
6
+ def initialize
7
+ @views = []
8
+ end
9
+
10
+ def each
11
+ @views.each { |v| yield(v) }
12
+ end
13
+
14
+ def attributes(*args)
15
+ collection = AttributesCollection.new
16
+ self.each{|v| collection << v.attributes}
17
+ return collection
18
+ end
19
+
20
+ alias :attrs :attributes
21
+
22
+ def remove
23
+ self.each {|e| e.remove}
24
+ end
25
+
26
+ alias :delete :remove
27
+
28
+ # SEE COMMENT IN VIEW
29
+ # def add_class(val)
30
+ # self.each {|e| e.add_class(val)}
31
+ # end
32
+
33
+ # SEE COMMENT IN VIEW
34
+ # def remove_class(val)
35
+ # self.each {|e| e.remove_class(val)}
36
+ # end
37
+
38
+ def clear
39
+ self.each {|e| e.clear}
40
+ end
41
+
42
+ def text
43
+ self.map { |v| v.text }
44
+ end
45
+
46
+ def content
47
+ self.map { |v| v.content }
48
+ end
49
+
50
+ alias :html :content
51
+
52
+ def content=(content)
53
+ self.each {|e| e.content = content}
54
+ end
55
+
56
+ alias :html= :content=
57
+
58
+ def to_html
59
+ self.map { |v| v.to_html }.join('')
60
+ end
61
+
62
+ alias :to_s :to_html
63
+
64
+ def append(content)
65
+ self.each {|e| e.append(content)}
66
+ end
67
+
68
+ alias :render :append
69
+
70
+ def <<(val)
71
+ if val.is_a? View
72
+ @views << val
73
+ end
74
+ end
75
+
76
+ def [](i)
77
+ @views[i]
78
+ end
79
+
80
+ def length
81
+ @views.length
82
+ end
83
+
84
+ def scope(name)
85
+ views = ViewCollection.new
86
+ self.each{|v|
87
+ next unless svs = v.scope(name)
88
+ svs.each{|sv| views << sv}
89
+ }
90
+
91
+ views
92
+ end
93
+
94
+ # call-seq:
95
+ # with {|view| block}
96
+ #
97
+ # Creates a context in which view manipulations can be performed.
98
+ #
99
+ # Unlike previous versions, the context can only be referenced by the
100
+ # block argument. No `context` method will be available.s
101
+ #
102
+ def with
103
+ yield(self)
104
+ end
105
+
106
+ # call-seq:
107
+ # for {|view, datum| block}
108
+ #
109
+ # Yields a view and its matching dataum. Datums are yielded until
110
+ # no more views or data is available. For the ViewCollection case, this
111
+ # means the block will be yielded self.length times.
112
+ #
113
+ # (this is basically Bret's `map` function)
114
+ #
115
+ def for(data, &block)
116
+ data = [data] unless data.instance_of?(Array)
117
+ self.each_with_index { |v,i|
118
+ break unless datum = data[i]
119
+ block.call(v, datum)
120
+ }
121
+ end
122
+
123
+ # call-seq:
124
+ # match(data) => ViewCollection
125
+ #
126
+ # Returns a ViewCollection object that has been manipulated to match the data.
127
+ # For the ViewCollection case, the returned ViewCollection collection will consist n copies
128
+ # of self[data index] || self[-1], where n = data.length.
129
+ #
130
+ def match(data)
131
+ data = [data] unless data.instance_of?(Array)
132
+
133
+ views = ViewCollection.new
134
+ data.each_with_index {|datum,i|
135
+ unless v = self[i]
136
+
137
+ # we're out of views, so use the last one
138
+ v = self[-1]
139
+ end
140
+
141
+ d_v = v.doc.dup
142
+ v.doc.before(d_v)
143
+
144
+ new_v = View.new(d_v)
145
+
146
+ # find binding subset (keeps us from refinding)
147
+ new_v.bindings = v.bindings
148
+
149
+ views << new_v
150
+ }
151
+
152
+ self.remove
153
+ views
154
+ end
155
+
156
+ # call-seq:
157
+ # repeat(data) {|view, datum| block}
158
+ #
159
+ # Matches self to data and yields a view/datum pair.
160
+ #
161
+ def repeat(data, &block)
162
+ self.match(data).for(data, &block)
163
+ end
164
+
165
+ # call-seq:
166
+ # bind(data)
167
+ #
168
+ # Binds data across existing scopes.
169
+ #
170
+ def bind(data, bindings = nil, &block)
171
+ self.for(data) {|view, datum|
172
+ view.bind(datum, bindings)
173
+ yield(view, datum) if block_given?
174
+ }
175
+ end
176
+
177
+ # call-seq:
178
+ # apply(data)
179
+ #
180
+ # Matches self to data then binds data to the view.
181
+ #
182
+ def apply(data, bindings = nil, &block)
183
+ self.match(data).bind(data, bindings, &block)
184
+ end
185
+ end
186
+ end
187
+ end
@@ -82,7 +82,7 @@ module Pakyow
82
82
  if route == '/'
83
83
  r_p = '/'
84
84
  else
85
- r_p = vpath.sub(absolute_path_prefix, '')
85
+ r_p = File.join(@view_dir, vpath.sub(absolute_path_prefix, ''))
86
86
  end
87
87
  @view_store[:abstract_paths][route] = {:real_path => r_p, :file_or_dir => :dir}
88
88
  # duplicate real path under routes permuted with leading/trailing slash
@@ -90,24 +90,24 @@ module Pakyow
90
90
  else
91
91
  # files here are direct overrides of the route's views
92
92
  parent,route = pakyow_path_to_route_and_parent(vpath, view_dir, :file)
93
+ route_with_leading_slash = "#{route}/#{File.basename(vpath)}"
94
+ route_without_leading_slash = route_with_leading_slash.sub('/','')
93
95
  view_key = File.basename(vpath,".*")
94
96
  unless @view_store[:view_dirs][route]
95
97
  @view_store[:view_dirs][route] = deep_hash_clone(@view_store[:view_dirs][parent])
96
98
  end
97
- @view_store[:view_dirs][route][:views][view_key] = vpath.sub(absolute_path_prefix, '')
99
+ @view_store[:view_dirs][route][:views][view_key] = route_without_leading_slash
98
100
  # see if view overrides the root view
99
101
  if File.basename(@view_store[:view_dirs][route][:root_view],".*") == view_key
100
- @view_store[:view_dirs][route][:root_view] = vpath.sub(absolute_path_prefix, '')
102
+ @view_store[:view_dirs][route][:root_view] = route_without_leading_slash
101
103
  end
102
104
  # set the abstract path for this file
103
105
  # duplicating real path under route without the leading slash
104
- r_p = vpath.sub(absolute_path_prefix, '')
106
+ r_p = File.join(@view_dir, vpath.sub(absolute_path_prefix, ''))
105
107
  if route == '/'
106
108
  @view_store[:abstract_paths]["/#{File.basename(vpath)}"] = {:real_path => r_p, :file_or_dir => :file}
107
109
  @view_store[:abstract_paths][File.basename(vpath)] = {:real_path => r_p, :file_or_dir => :file}
108
110
  else
109
- route_with_leading_slash = "#{route}/#{File.basename(vpath)}"
110
- route_without_leading_slash = route_with_leading_slash.sub('/','')
111
111
  @view_store[:abstract_paths][route_with_leading_slash] = {:real_path => r_p, :file_or_dir => :file}
112
112
  @view_store[:abstract_paths][route_without_leading_slash] = {:real_path => r_p, :file_or_dir => :file}
113
113
  end
@@ -169,6 +169,10 @@ module Pakyow
169
169
  def real_path(abstract_path)
170
170
  @view_store[:abstract_paths][abstract_path][:real_path] if @view_store[:abstract_paths][abstract_path]
171
171
  end
172
+
173
+ def root_path(abstract_path)
174
+ @view_store[:view_dirs][abstract_path][:root_view] if @view_store[:view_dirs][abstract_path]
175
+ end
172
176
 
173
177
  private
174
178
 
metadata CHANGED
@@ -1,127 +1,110 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: pakyow-presenter
3
- version: !ruby/object:Gem::Version
4
- hash: 7
5
- prerelease:
6
- segments:
7
- - 0
8
- - 7
9
- - 2
10
- version: 0.7.2
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.8rc1
5
+ prerelease: 3
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Bryan Powell
14
9
  - Bret Young
15
10
  autorequire:
16
11
  bindir: bin
17
12
  cert_chain: []
18
-
19
- date: 2012-02-29 00:00:00 Z
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
13
+ date: 2013-02-11 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
22
16
  name: pakyow-core
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
17
+ requirement: !ruby/object:Gem::Requirement
25
18
  none: false
26
- requirements:
27
- - - "="
28
- - !ruby/object:Gem::Version
29
- hash: 7
30
- segments:
31
- - 0
32
- - 7
33
- - 2
34
- version: 0.7.2
19
+ requirements:
20
+ - - '='
21
+ - !ruby/object:Gem::Version
22
+ version: 0.8rc1
35
23
  type: :runtime
36
- version_requirements: *id001
37
- - !ruby/object:Gem::Dependency
38
- name: nokogiri
39
24
  prerelease: false
40
- requirement: &id002 !ruby/object:Gem::Requirement
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - '='
29
+ - !ruby/object:Gem::Version
30
+ version: 0.8rc1
31
+ - !ruby/object:Gem::Dependency
32
+ name: nokogiri
33
+ requirement: !ruby/object:Gem::Requirement
41
34
  none: false
42
- requirements:
35
+ requirements:
43
36
  - - ~>
44
- - !ruby/object:Gem::Version
45
- hash: 5
46
- segments:
47
- - 1
48
- - 5
49
- version: "1.5"
37
+ - !ruby/object:Gem::Version
38
+ version: '1.5'
50
39
  type: :runtime
51
- version_requirements: *id002
52
- - !ruby/object:Gem::Dependency
53
- name: shoulda
54
40
  prerelease: false
55
- requirement: &id003 !ruby/object:Gem::Requirement
41
+ version_requirements: !ruby/object:Gem::Requirement
56
42
  none: false
57
- requirements:
43
+ requirements:
58
44
  - - ~>
59
- - !ruby/object:Gem::Version
60
- hash: 21
61
- segments:
62
- - 2
63
- - 11
64
- version: "2.11"
45
+ - !ruby/object:Gem::Version
46
+ version: '1.5'
47
+ - !ruby/object:Gem::Dependency
48
+ name: shoulda
49
+ requirement: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '2.11'
65
55
  type: :development
66
- version_requirements: *id003
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ~>
61
+ - !ruby/object:Gem::Version
62
+ version: '2.11'
67
63
  description: pakyow-presenter
68
64
  email: bryan@metabahn.com
69
65
  executables: []
70
-
71
66
  extensions: []
72
-
73
67
  extra_rdoc_files: []
74
-
75
- files:
68
+ files:
76
69
  - pakyow-presenter/CHANGES
77
70
  - pakyow-presenter/README
78
71
  - pakyow-presenter/MIT-LICENSE
79
72
  - pakyow-presenter/lib/pakyow-presenter.rb
73
+ - pakyow-presenter/lib/presenter/attributes.rb
80
74
  - pakyow-presenter/lib/presenter/base.rb
81
75
  - pakyow-presenter/lib/presenter/binder.rb
76
+ - pakyow-presenter/lib/presenter/bindings.rb
82
77
  - pakyow-presenter/lib/presenter/configuration/base.rb
83
78
  - pakyow-presenter/lib/presenter/configuration/presenter.rb
84
79
  - pakyow-presenter/lib/presenter/helpers.rb
85
80
  - pakyow-presenter/lib/presenter/lazy_view.rb
86
81
  - pakyow-presenter/lib/presenter/presenter.rb
87
82
  - pakyow-presenter/lib/presenter/view.rb
83
+ - pakyow-presenter/lib/presenter/view_collection.rb
88
84
  - pakyow-presenter/lib/presenter/view_context.rb
89
85
  - pakyow-presenter/lib/presenter/view_lookup_store.rb
90
- - pakyow-presenter/lib/presenter/views.rb
91
86
  homepage: http://pakyow.com
92
87
  licenses: []
93
-
94
88
  post_install_message:
95
89
  rdoc_options: []
96
-
97
- require_paths:
90
+ require_paths:
98
91
  - pakyow-presenter/lib
99
- required_ruby_version: !ruby/object:Gem::Requirement
92
+ required_ruby_version: !ruby/object:Gem::Requirement
100
93
  none: false
101
- requirements:
102
- - - ">="
103
- - !ruby/object:Gem::Version
104
- hash: 57
105
- segments:
106
- - 1
107
- - 8
108
- - 7
94
+ requirements:
95
+ - - ! '>='
96
+ - !ruby/object:Gem::Version
109
97
  version: 1.8.7
110
- required_rubygems_version: !ruby/object:Gem::Requirement
98
+ required_rubygems_version: !ruby/object:Gem::Requirement
111
99
  none: false
112
- requirements:
113
- - - ">="
114
- - !ruby/object:Gem::Version
115
- hash: 3
116
- segments:
117
- - 0
118
- version: "0"
100
+ requirements:
101
+ - - ! '>'
102
+ - !ruby/object:Gem::Version
103
+ version: 1.3.1
119
104
  requirements: []
120
-
121
105
  rubyforge_project: pakyow-presenter
122
- rubygems_version: 1.8.11
106
+ rubygems_version: 1.8.23
123
107
  signing_key:
124
108
  specification_version: 3
125
109
  summary: pakyow-presenter
126
110
  test_files: []
127
-
@@ -1,112 +0,0 @@
1
- module Pakyow
2
- module Presenter
3
- class Views
4
- include Enumerable
5
-
6
- def initialize
7
- @views = []
8
- end
9
-
10
- def each
11
- @views.each { |v| yield(v) }
12
- end
13
-
14
- def in_context(&block)
15
- ViewContext.new(self).instance_exec(self, &block)
16
- end
17
-
18
- def attributes(*args)
19
- self.each {|e| e.attributes(*args)}
20
- return self
21
- end
22
-
23
- def remove
24
- self.each {|e| e.remove}
25
- end
26
-
27
- alias :delete :remove
28
-
29
- def add_class(val)
30
- self.each {|e| e.add_class(val)}
31
- end
32
-
33
- def remove_class(val)
34
- self.each {|e| e.remove_class(val)}
35
- end
36
-
37
- def clear
38
- self.each {|e| e.clear}
39
- end
40
-
41
- def text
42
- self.map { |v| v.text }
43
- end
44
-
45
- def content
46
- self.map { |v| v.content }
47
- end
48
-
49
- alias :html :content
50
-
51
- def content=(content)
52
- self.each {|e| e.content = content}
53
- end
54
-
55
- alias :html= :content=
56
-
57
- def to_html
58
- self.map { |v| v.to_html }.join('')
59
- end
60
-
61
- alias :to_s :to_html
62
-
63
- def append(content)
64
- self.each {|e| e.append(content)}
65
- end
66
-
67
- alias :render :append
68
-
69
- def <<(val)
70
- if val.is_a? View
71
- @views << val
72
- end
73
- end
74
-
75
- def method_missing(method, *args)
76
- if method.to_s.include?('=')
77
- self.each {|e| e.send(method, *args)}
78
- else
79
- self.map {|e| e.send(method, *args)}
80
- end
81
- end
82
-
83
- def class(*args)
84
- method_missing(:class, *args)
85
- end
86
-
87
- def id
88
- method_missing(:id)
89
- end
90
-
91
- def repeat_for(objects, opts = {}, &block)
92
- first_found = self.first
93
-
94
- # Remove other matches
95
- self.drop(1).each {|found| found.remove}
96
-
97
- # Repeat for first match
98
- first_found.repeat_for(objects, opts, &block)
99
- end
100
-
101
- def bind(object, opts = {})
102
- self.each {|e| e.bind(object, opts)}
103
- end
104
-
105
- def find(element, &block)
106
- views = Views.new
107
- self.each {|e| e.find(element, &block).each { |v| views << v }}
108
- views
109
- end
110
- end
111
- end
112
- end