view_models 2.0.1 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (157) hide show
  1. data/.bundle/config +2 -0
  2. data/.gitignore +8 -0
  3. data/.rspec +2 -0
  4. data/.rvmrc +1 -0
  5. data/.travis.yml +19 -0
  6. data/.yardoc/checksums +13 -0
  7. data/.yardoc/object_types +0 -0
  8. data/.yardoc/objects/root.dat +0 -0
  9. data/.yardoc/proxy_types +0 -0
  10. data/Appraisals +15 -0
  11. data/CHANGELOG +31 -0
  12. data/Gemfile +13 -0
  13. data/Gemfile.lock +174 -0
  14. data/MIT-LICENSE +20 -0
  15. data/README.textile +199 -0
  16. data/Rakefile +24 -0
  17. data/doc/ModulesInRenderHierarchy.html +186 -0
  18. data/doc/ModulesInRenderHierarchy/ClassMethods.html +188 -0
  19. data/doc/ViewModels.html +202 -0
  20. data/doc/ViewModels/Base.html +1342 -0
  21. data/doc/ViewModels/ContextExtractor.html +406 -0
  22. data/doc/ViewModels/Extensions.html +128 -0
  23. data/doc/ViewModels/Extensions/ModelReader.html +255 -0
  24. data/doc/ViewModels/Extensions/ModelReader/FilteredDelegationInstaller.html +908 -0
  25. data/doc/ViewModels/Extensions/ModelReader/Options.html +551 -0
  26. data/doc/ViewModels/Extensions/View.html +303 -0
  27. data/doc/ViewModels/Helpers.html +129 -0
  28. data/doc/ViewModels/Helpers/Mapping.html +562 -0
  29. data/doc/ViewModels/Helpers/Mapping/Collection.html +844 -0
  30. data/doc/ViewModels/Helpers/View.html +287 -0
  31. data/doc/ViewModels/PathStore.html +745 -0
  32. data/doc/ViewModels/RenderOptions.html +126 -0
  33. data/doc/ViewModels/RenderOptions/Base.html +1187 -0
  34. data/doc/ViewModels/RenderOptions/Partial.html +231 -0
  35. data/doc/ViewModels/RenderOptions/Template.html +231 -0
  36. data/doc/ViewModels/View.html +414 -0
  37. data/doc/ViewModelsGenerator.html +410 -0
  38. data/doc/_index.html +317 -0
  39. data/doc/class_list.html +53 -0
  40. data/doc/css/common.css +1 -0
  41. data/doc/css/full_list.css +57 -0
  42. data/doc/css/style.css +328 -0
  43. data/doc/file.README.html +113 -0
  44. data/doc/file_list.html +55 -0
  45. data/doc/frames.html +28 -0
  46. data/doc/index.html +113 -0
  47. data/doc/js/app.js +214 -0
  48. data/doc/js/full_list.js +173 -0
  49. data/doc/js/jquery.js +4 -0
  50. data/doc/method_list.html +628 -0
  51. data/doc/top-level-namespace.html +114 -0
  52. data/feature_support/testapp/app/controllers/heroes_controller.rb +6 -0
  53. data/feature_support/testapp/app/controllers/users_controller.rb +6 -0
  54. data/feature_support/testapp/app/helpers/application_helper.rb +8 -0
  55. data/feature_support/testapp/app/models/hero.rb +8 -0
  56. data/feature_support/testapp/app/models/user.rb +3 -0
  57. data/feature_support/testapp/app/view_models/hero.rb +8 -0
  58. data/feature_support/testapp/app/view_models/test.rb +8 -0
  59. data/feature_support/testapp/app/view_models/user.rb +14 -0
  60. data/feature_support/testapp/app/views/heroes/show.html.slim +6 -0
  61. data/feature_support/testapp/app/views/users/_box.html.slim +8 -0
  62. data/feature_support/testapp/app/views/users/show.html.slim +6 -0
  63. data/feature_support/testapp/config/application.rb +64 -0
  64. data/feature_support/testapp/config/cucumber.yml +8 -0
  65. data/feature_support/testapp/config/database.yml +28 -0
  66. data/feature_support/testapp/config/environments/cucumber.rb +11 -0
  67. data/feature_support/testapp/config/environments/test.rb +27 -0
  68. data/feature_support/testapp/config/routes.rb +4 -0
  69. data/feature_support/testapp/db/migrate/1_create_users.rb +13 -0
  70. data/feature_support/testapp/features/inheritance.feature +16 -0
  71. data/feature_support/testapp/features/step_definitions/testapp_steps.rb +16 -0
  72. data/feature_support/testapp/features/support/env.rb +13 -0
  73. data/feature_support/testapp/features/users.feature +15 -0
  74. data/feature_support/testapp/lib/tasks/cucumber.rake +31 -0
  75. data/feature_support/testapp/spec/factories/heroes.rb +7 -0
  76. data/feature_support/testapp/spec/factories/users.rb +7 -0
  77. data/features/rails_integration.feature +21 -0
  78. data/features/step_definitions/rails_steps.rb +112 -0
  79. data/features/support/env.rb +6 -0
  80. data/gemfiles/3.0.Gemfile +13 -0
  81. data/gemfiles/3.1.Gemfile +15 -0
  82. data/gemfiles/3.2.gemfile +15 -0
  83. data/lib/rails/generators/view_models/USAGE +6 -0
  84. data/lib/rails/generators/view_models/templates/views/_collection.html.erb +6 -0
  85. data/lib/{rails2/generators/view_models/templates/views/view_models/collection → rails/generators/view_models/templates/views}/_collection.html.haml +1 -2
  86. data/lib/rails/generators/view_models/templates/views/_collection.html.slim +6 -0
  87. data/lib/{rails2/generators/view_models/templates/views/_empty.html.haml → rails/generators/view_models/templates/views/_empty.html.erb} +0 -0
  88. data/lib/rails/generators/view_models/templates/views/_empty.html.haml +0 -0
  89. data/lib/rails/generators/view_models/templates/views/_empty.html.slim +0 -0
  90. data/lib/rails/generators/view_models/templates/views/_list.html.erb +6 -0
  91. data/lib/rails/generators/view_models/templates/views/_list.html.haml +4 -0
  92. data/lib/rails/generators/view_models/templates/views/_list.html.slim +5 -0
  93. data/lib/rails/generators/view_models/templates/views/_pagination.html.erb +18 -0
  94. data/lib/{rails2/generators/view_models/templates/views/view_models/collection → rails/generators/view_models/templates/views}/_pagination.html.haml +2 -2
  95. data/lib/rails/generators/view_models/templates/views/_pagination.html.slim +12 -0
  96. data/lib/rails/generators/view_models/templates/views/_table.html.erb +10 -0
  97. data/lib/{rails2/generators/view_models/templates/views/view_models/collection → rails/generators/view_models/templates/views}/_table.html.haml +0 -0
  98. data/lib/rails/generators/view_models/templates/views/_table.html.slim +5 -0
  99. data/lib/rails/generators/view_models/view_models_generator.rb +57 -0
  100. data/lib/view_models.rb +15 -5
  101. data/lib/{shared/lib/view_models → view_models}/base.rb +148 -37
  102. data/lib/{shared/lib/view_models → view_models}/context_extractor.rb +6 -2
  103. data/lib/{shared/lib/view_models → view_models}/extensions/model_reader.rb +27 -13
  104. data/lib/{rails2/lib → view_models}/extensions/view.rb +6 -1
  105. data/lib/view_models/helpers/collection.rb +113 -0
  106. data/lib/{shared/lib/view_models → view_models}/helpers/mapping.rb +12 -15
  107. data/lib/{rails2/lib → view_models}/helpers/view.rb +5 -1
  108. data/lib/{shared/lib/view_models → view_models}/path_store.rb +6 -1
  109. data/lib/{shared/lib/view_models → view_models}/render_options.rb +19 -4
  110. data/lib/view_models/version.rb +5 -0
  111. data/lib/{rails2/lib/view_models → view_models}/view.rb +7 -6
  112. data/spec/{rails2/lib → lib}/view_models/base_spec.rb +38 -5
  113. data/spec/{rails2/lib → lib/view_models}/extensions/model_reader_spec.rb +4 -4
  114. data/spec/{shared/lib → lib/view_models}/helpers/collection_spec.rb +21 -1
  115. data/spec/{shared/lib → lib/view_models}/helpers/mapping_spec.rb +6 -5
  116. data/spec/{rails2/lib → lib/view_models}/helpers/view_spec.rb +1 -1
  117. data/spec/lib/view_models/view_spec.rb +42 -0
  118. data/spec/spec_helper.rb +32 -0
  119. data/spec/spec_helper_extensions.rb +13 -0
  120. data/view_models.gemspec +36 -0
  121. metadata +411 -142
  122. data/lib/init.rb +0 -1
  123. data/lib/padrino/README.textile +0 -3
  124. data/lib/padrino/init.rb +0 -10
  125. data/lib/padrino/lib/helpers/collection.rb +0 -27
  126. data/lib/padrino/lib/padrino/view_models.rb +0 -19
  127. data/lib/padrino/lib/view_models/base.rb +0 -65
  128. data/lib/rails2/README.textile +0 -3
  129. data/lib/rails2/TODO.textile +0 -5
  130. data/lib/rails2/generators/view_models/USAGE +0 -6
  131. data/lib/rails2/generators/view_models/templates/README +0 -1
  132. data/lib/rails2/generators/view_models/templates/spec/view_model_spec.rb +0 -7
  133. data/lib/rails2/generators/view_models/templates/view_models/view_model.rb +0 -5
  134. data/lib/rails2/generators/view_models/templates/views/view_models/collection/_collection.html.erb +0 -1
  135. data/lib/rails2/generators/view_models/templates/views/view_models/collection/_collection.text.erb +0 -6
  136. data/lib/rails2/generators/view_models/templates/views/view_models/collection/_list.html.erb +0 -1
  137. data/lib/rails2/generators/view_models/templates/views/view_models/collection/_list.text.erb +0 -6
  138. data/lib/rails2/generators/view_models/templates/views/view_models/collection/_pagination.text.erb +0 -3
  139. data/lib/rails2/generators/view_models/templates/views/view_models/collection/_table.text.erb +0 -10
  140. data/lib/rails2/generators/view_models/view_models_generator.rb +0 -47
  141. data/lib/rails2/init.rb +0 -18
  142. data/lib/rails2/lib/experimental/README.textile +0 -32
  143. data/lib/rails2/lib/experimental/modules_in_render_hierarchy.rb +0 -21
  144. data/lib/rails2/lib/helpers/collection.rb +0 -27
  145. data/lib/rails2/lib/view_models.rb +0 -1
  146. data/lib/rails2/lib/view_models/base.rb +0 -99
  147. data/lib/shared/README.textile +0 -3
  148. data/lib/shared/init.rb +0 -11
  149. data/lib/shared/lib/view_models.rb +0 -4
  150. data/lib/shared/lib/view_models/extensions/active_record.rb +0 -27
  151. data/lib/shared/lib/view_models/helpers/collection.rb +0 -110
  152. data/spec/padrino/integration/integration_spec.rb +0 -287
  153. data/spec/padrino/lib/helpers/collection_spec.rb +0 -30
  154. data/spec/rails2/integration/integration_spec.rb +0 -279
  155. data/spec/rails2/lib/extensions/active_record_spec.rb +0 -31
  156. data/spec/rails2/lib/helpers/collection_spec.rb +0 -30
  157. data/spec/rails2/lib/view_models/view_spec.rb +0 -12
@@ -1,59 +1,115 @@
1
1
  # Base Module for ViewModels.
2
+ # @author Florian Hanke
3
+ # @author Kaspar Schiess
4
+ # @author Niko Dittmann
5
+ # @author Beat Richartz
6
+ # @version 3.0.0
7
+ # @since 1.0.0
2
8
  #
3
- module ViewModels
4
-
9
+ module ViewModels
10
+
5
11
  # Gets raised when render_as, render_the, or render_template cannot
6
12
  # find the named template, not even in the hierarchy.
7
13
  #
8
- class MissingTemplateError < StandardError; end
14
+ MissingTemplateError = Class.new(StandardError)
9
15
 
10
16
  # Base class from which all view_models inherit.
17
+ # @example Create Your first View Model
18
+ # class ViewModels::MyViewModel < ViewModels::Base
19
+ # # your code
20
+ # end
11
21
  #
12
22
  class Base
13
23
 
24
+ # Make the rails methods helper and helper_method available in view models
25
+ #
26
+ include AbstractController::Helpers
27
+
14
28
  # Create a view_model. To create a view_model, you need to have a model (to present) and a context.
15
29
  # The context is usually a view, a controller, or an app, but doesn't need to be.
16
30
  #
17
- # TODO Include this.
31
+ # The @context = @controller is really only needed because some Rails helpers access @controller directly.
32
+ # It's really bad.
33
+ # @param [ActiveRecord] model The model which the view model is based upon
34
+ # @param [ActionView, ActionController, Rails::Application] app_or_controller_or_view The context of the view model
35
+ # @example Initialize a view model without the mapping helper
36
+ # ViewModel::YourModel.new(@model, @context)
18
37
  #
19
38
  def initialize model, app_or_controller_or_view
20
- @model = model
21
- @context = ContextExtractor.new(app_or_controller_or_view).extract
39
+ @model = model
40
+ @context = @controller = ContextExtractor.new(app_or_controller_or_view).extract
22
41
  end
23
42
 
24
43
  class << self
25
44
 
26
- # Installs a path store, a specific store for
27
- # template inheritance, to remember specific
28
- # [path, name, format] tuples, pointing to a template path,
29
- # so the view models don't have to traverse the inheritance chain always.
45
+ # The path store accessor, storing the view paths for the view model
30
46
  #
31
47
  attr_accessor :path_store
48
+
49
+ # Installs a path store, a specific store for template inheritance, to remember specific
50
+ # [path, name, format] tuples, pointing to a template path
51
+ # so the view models don't have to always traverse the inheritance chain.
52
+ # @param [ViewModel] subclass The subclass of the view model
53
+ #
32
54
  def inherited subclass
33
55
  ViewModels::PathStore.install_in subclass
34
56
  super
35
57
  end
36
58
 
37
59
  # Delegates method calls to the context.
38
- #
39
- # Examples:
40
- # context_method :current_user
41
- # context_method :current_user, :current_profile # multiple methods to be delegated
42
- #
43
60
  # In the view_model:
44
61
  # self.current_user
45
62
  # will call
46
63
  # context.current_user
47
64
  #
65
+ # @param [Symbol] methods A list of symbols representing methods to be delegated
66
+ # @example delegate one method to the context
67
+ # context_method :current_user
68
+ # @example delegate multiple methods to the context
69
+ # context_method :current_user, :current_profile
70
+ #
48
71
  def context_method *methods
49
72
  delegate *methods << { :to => :context }
50
73
  end
51
74
 
75
+ # Alias the context_method to the rails-centric controller_method.
76
+ #
77
+ alias controller_method context_method
78
+
52
79
  # Installs the model_reader Method for filtered
53
80
  # model method delegation.
54
81
  #
55
82
  include Extensions::ModelReader
56
83
 
84
+ unless instance_methods.include?('old_add_template_helper')
85
+ alias old_add_template_helper add_template_helper
86
+
87
+ # Wrapper for add_template_helper in ActionController::Helpers, also
88
+ # includes given helper in the view_model
89
+ #
90
+ # @todo extract into module
91
+ # @param [Module] helper_module the helper to be added
92
+ #
93
+ def add_template_helper helper_module
94
+ include helper_module
95
+ old_add_template_helper helper_module
96
+ end
97
+ end
98
+
99
+ # Sets the view format and tries to render the given options.
100
+ # @param [ActionView] renderer The view renderer
101
+ # @param [Hash] options The options to pass to the view
102
+ # @option options [Hash] :locals The locals to pass to the view
103
+ # @note Also caches [path, name, format] => template path.
104
+ #
105
+ def render renderer, options
106
+ options.format! renderer
107
+ path_store.cached options do
108
+ options.file = template_path renderer, options
109
+ renderer.render_with options
110
+ end
111
+ end
112
+
57
113
  protected
58
114
 
59
115
  # Hierarchical rendering.
@@ -61,27 +117,31 @@ module ViewModels
61
117
 
62
118
  # Returns the next view model class in the render hierarchy.
63
119
  #
64
- # Note: Just returns the superclass.
120
+ # @note Just returns the superclass.
65
121
  #
66
- # TODO Think about raising the MissingTemplateError here.
122
+ # @todo Think about raising the MissingTemplateError here.
123
+ # @return The superclass of the view model, which ends with ViewModel::Base
67
124
  #
68
125
  def next_in_render_hierarchy
69
126
  superclass
70
127
  end
71
- # Just raises a fitting template error.
128
+
129
+ # Raises the fitting template error with the given message
130
+ # @param [String,Symbol] message The message with which the template error should be raised
131
+ # @raise [MissingTemplateError] A template error indicating that the template is missing
72
132
  #
73
133
  def raise_template_error_with message
74
134
  raise MissingTemplateError.new("No template #{message} found.")
75
135
  end
136
+
76
137
  # Check if the view lookup inheritance chain has ended.
77
- #
78
138
  # Raises a MissingTemplateError if yes.
139
+ # @return wether the current class is ViewModel::Base and therefore at the end of the inheritance chain
79
140
  #
80
141
  def inheritance_chain_ends?
81
142
  self == ViewModels::Base
82
143
  end
83
144
 
84
-
85
145
  # Template finding
86
146
  #
87
147
 
@@ -91,27 +151,36 @@ module ViewModels
91
151
  #
92
152
  # Raises a MissingTemplateError if none is found during
93
153
  # inheritance chain traversal.
154
+ # @param [ActionView] renderer The view renderer
155
+ # @param [Hash] options The options to pass to the template path
94
156
  #
95
- def template_path renderer, options
157
+ def template_path renderer, options
96
158
  raise_template_error_with options.error_message if inheritance_chain_ends?
97
159
 
98
160
  template_path_from(renderer, options) || self.next_in_render_hierarchy.template_path(renderer, options)
99
161
  end
100
-
101
- # ...
102
-
103
- # Return as render path either a stored path or a newly generated one.
162
+
163
+ # Accesses the view to find a suitable template path.
164
+ # @param [ActionView] renderer The view renderer
165
+ # @param [Hash] options The options to pass to the view
104
166
  #
105
- # If nothing or nil is passed, the store is ignored.
106
- #
107
- # TODO Think about using the built-in Padrino template store.
167
+ def template_path_from renderer, options
168
+ template = renderer.find_template tentative_template_path(options)
169
+
170
+ template && template.virtual_path.to_s
171
+ end
172
+
173
+ # @return render path either a stored path or a newly generated one.
174
+ # @note If nothing or nil is passed, the store is ignored.
175
+ # @param [Hash] options The view render options
108
176
  #
109
177
  def tentative_template_path options
110
178
  path_store[options.path_key] || generate_template_path_from(options)
111
179
  end
112
180
 
113
- # Returns the root of this view_models views with the template name appended.
114
- # e.g. 'view_models/some/specific/path/to/template'
181
+ # @return the root of this view_models views with the template name appended.
182
+ # @example Returning a specific path
183
+ # 'some/specific/path/to/template'
115
184
  #
116
185
  def generate_template_path_from options
117
186
  File.join generate_path_from(options), options.name
@@ -130,19 +199,47 @@ module ViewModels
130
199
  # If the class is named
131
200
  # ViewModels::Models::Book
132
201
  # this method will yield
133
- # view_models/models/book
202
+ # models/book
134
203
  #
135
204
  # Note: Remembers the result since it is dependent on the Class name only.
136
205
  #
137
206
  def view_model_path
138
- @view_model_path || @view_model_path = self.name.underscore
207
+ @view_model_path ||= self.name.gsub(/^ViewModels::|(\w+)(::)?/) { $1.underscore.pluralize + ($2 ? '/' : '').to_s if $1 }
139
208
  end
140
209
 
141
210
  end
142
-
211
+
143
212
  # Delegate context methods.
144
213
  #
145
- context_method :logger
214
+ context_method :logger, :form_authenticity_token, :protect_against_forgery?, :request_forgery_protection_token, :config, :cookies, :flash, :default_url_options
215
+
216
+ # id and param are simply delegated to the model.
217
+ #
218
+ # This makes it possible to use the view_model
219
+ # for e.g. url generation:
220
+ # * edit_user_path(view_model)
221
+ #
222
+ delegate :id, :to_param, :to => :model
223
+
224
+ # Delegate dom id to the action controller record identifier.
225
+ #
226
+ def dom_id *args
227
+ if args.present?
228
+ context.dom_id *args
229
+ else
230
+ ActionController::RecordIdentifier.dom_id model
231
+ end
232
+ end
233
+
234
+ # Make all the dynamically generated routes (restful routes etc.)
235
+ # available in the view_model
236
+ #
237
+ Rails.application.routes.install_helpers self if Rails.application
238
+
239
+ # include these helpers by default
240
+ #
241
+ helper Helpers::View
242
+ helper Helpers::Mapping
146
243
 
147
244
  # Renders the given partial in the view_model's view root in the format given.
148
245
  #
@@ -199,6 +296,22 @@ module ViewModels
199
296
  #
200
297
  attr_reader :model, :context
201
298
 
299
+ # CaptureHelper needs this.
300
+ #
301
+ attr_accessor :output_buffer
302
+
303
+ # alias the context as controller
304
+ #
305
+ alias controller context
306
+
307
+ # Returns a view instance for render_xxx.
308
+ #
309
+ # @todo Try getting a view instance from the controller.
310
+ #
311
+ def renderer
312
+ View.new context, self._helpers
313
+ end
314
+
202
315
  # Internal render method that uses the options to get a view instance
203
316
  # and then referring to its class for rendering.
204
317
  #
@@ -212,9 +325,7 @@ module ViewModels
212
325
 
213
326
  # Determines what format to use for rendering.
214
327
  #
215
- # Note: Uses the template format of the view model instance
216
- # if none is explicitly set in the options.
217
- # This propagates the format to further render_xxx calls.
328
+ # @note Uses the template format of the view model instance if none is explicitly set in the options. This propagates the format to further render_xxx calls.
218
329
  #
219
330
  def determine_and_set_format options
220
331
  options.format = @template_format = options.format || @template_format
@@ -4,17 +4,21 @@ module ViewModels
4
4
 
5
5
  # Extracts controllers for a living from unsuspecting views.
6
6
  #
7
- # Note: This is actually only needed in Rails. In Padrino, the context is always the app.
8
- #
9
7
  class ContextExtractor
10
8
 
9
+ # The context
10
+ #
11
11
  attr_reader :context
12
12
 
13
+ # Initialize the Context extractor
14
+ # @param [ActionController, ActionMailer, ActionView] context Some render context
15
+ #
13
16
  def initialize context
14
17
  @context = context
15
18
  end
16
19
 
17
20
  # Extracts a controller from the context.
21
+ # @return [ActionController] an instance of action controller
18
22
  #
19
23
  def extract
20
24
  context = self.context
@@ -2,15 +2,23 @@
2
2
  #
3
3
  #
4
4
  module ViewModels
5
+
6
+ # Extensions of the View Model Class
7
+ #
5
8
  module Extensions
9
+
10
+ # Model Reader extension. Allows to define model readers on view models, accessing attributes and methods
11
+ # on models
12
+ #
6
13
  module ModelReader
7
14
 
8
15
  # Define a reader for a model attribute. Acts as a filtered delegation to the model.
9
16
  #
10
17
  # You may specify a :filter_through option that is either a symbol or an array of symbols. The return value
11
- # from the model will be filtered through the functions (arity 1) and then passed back to the receiver.
18
+ # from the model will be filtered through the functions (arity 1) and then passed back to the receiver.
19
+ # @param [Symbol, Hash] attributes_and_options The attributes and options for the model reader
12
20
  #
13
- # Example:
21
+ # @example install different model readers
14
22
  #
15
23
  # model_reader :foobar # same as delegate :foobar, :to => :model
16
24
  # model_reader :foobar, :filter_through => :h # html escape foobar
@@ -32,6 +40,7 @@ module ViewModels
32
40
  end
33
41
 
34
42
  # Extract filter_through options from the options hash if there are any.
43
+ # @param [Hash] options the options to split
35
44
  #
36
45
  def split options
37
46
  @filters = if options.last.kind_of?(Hash)
@@ -42,6 +51,9 @@ module ViewModels
42
51
  @attributes = options
43
52
  end
44
53
 
54
+ # Render the options to an array
55
+ # @return [Array] The attributes and the filters in this order
56
+ #
45
57
  def to_a
46
58
  [attributes, filters]
47
59
  end
@@ -53,13 +65,19 @@ module ViewModels
53
65
  #
54
66
  class FilteredDelegationInstaller
55
67
 
68
+ # The attributes target, attributes, filters
69
+ #
56
70
  attr_reader :target, :attributes, :filters
57
71
 
72
+ # Initialize a new filtered delegation
73
+ # @param [ViewModel] target the target to install the filtered delegation in
74
+ # @param [ModelReader::Options] options The options for the filtered delegation
75
+ #
58
76
  def initialize target, options
59
77
  @target, @attributes, @filters = target, *options
60
78
  end
61
79
 
62
- # Install install
80
+ # Install a reader for each attribute
63
81
  #
64
82
  def install
65
83
  attributes.each { |attribute| install_reader(attribute) }
@@ -67,10 +85,8 @@ module ViewModels
67
85
 
68
86
  # Install a reader for the given name with the given filters.
69
87
  #
70
- # Example:
71
- # # Installs a reader for model.attribute
72
- # #
73
- # * install_reader :attribute
88
+ # @example Installs a reader for model.attribute
89
+ # install_reader :attribute
74
90
  #
75
91
  def install_reader attribute
76
92
  target.class_eval reader_definition_for(attribute)
@@ -79,7 +95,7 @@ module ViewModels
79
95
  # Defines a reader for the given model attribute and filtering
80
96
  # through the given filters.
81
97
  #
82
- # Note: The filters are applied from last to first element.
98
+ # @note The filters are applied from last to first element.
83
99
  #
84
100
  def reader_definition_for attribute
85
101
  "def #{attribute}; #{filtered_left_parentheses}model.#{attribute}#{right_parentheses}; end"
@@ -88,7 +104,7 @@ module ViewModels
88
104
  # Combines left parentheses and filters.
89
105
  #
90
106
  def filtered_left_parentheses
91
- filters.zip(left_parentheses).to_s
107
+ filters.zip(left_parentheses).join
92
108
  end
93
109
 
94
110
  # Generates the needed amount of parentheses to match the left parentheses.
@@ -99,10 +115,8 @@ module ViewModels
99
115
 
100
116
  # Generates an array of left parentheses with
101
117
  # length <amount of filters>
102
- # Example:
103
- # # 4 Filters
104
- # #
105
- # left_parentheses # => ['(', '(', '(', '(']
118
+ # @example for 4 Filters
119
+ # left_parentheses # => ['(', '(', '(', '(']
106
120
  #
107
121
  def left_parentheses
108
122
  ['('] * filters.size
@@ -5,15 +5,20 @@
5
5
  #
6
6
  module ViewModels
7
7
  module Extensions
8
+
9
+ # Extensions for the View instance
10
+ #
8
11
  module View
9
12
 
10
- #
13
+ # Renders the template with the given options
14
+ # @param [RenderOptions::Base] options The options to render with
11
15
  #
12
16
  def render_with options
13
17
  render options.to_render_options
14
18
  end
15
19
 
16
20
  # Finds the template in the view paths at the given path, with its format.
21
+ # @param [String] path the template path
17
22
  #
18
23
  def find_template path
19
24
  view_paths.find_template path, template_format rescue nil