Module: DecoratesBeforeRendering

Defined in:
lib/context_exposer/patch/decorates_before_rendering.rb

Defined Under Namespace

Classes: DecoratorError, FindModelError

Instance Method Summary collapse

Instance Method Details

#__attempt_to_decorate_(obj) ⇒ Object



93
94
95
96
97
98
99
100
# File 'lib/context_exposer/patch/decorates_before_rendering.rb', line 93

def __attempt_to_decorate_ obj
  return obj if obj.respond_to?(:decorate)
  if obj
    src = __src_for__(obj)
    decorator = __normalized_decorator_for__(src)
    __do_decoration_ decorator, obj
  end
end

#__attempt_to_decorate_list_(objs) ⇒ Object



87
88
89
90
91
# File 'lib/context_exposer/patch/decorates_before_rendering.rb', line 87

def __attempt_to_decorate_list_ objs
  [objs].flatten.compact.map do |obj|
    __attempt_to_decorate_(obj)      
  end    
end

#__auto_decorate_exposed_ones_Object

def render *args

__auto_decorate_exposed_ones_
super(*args)

end



14
15
16
17
18
19
20
# File 'lib/context_exposer/patch/decorates_before_rendering.rb', line 14

def __auto_decorate_exposed_ones_
  __decorate_ivars__
  __decorate_exposed_ones_
  __decorate_ctx_exposed_ones_    
rescue StandardError => e
  __handle_decorate_error_(e)
end

#__ctx_exposed_ones_Object



42
43
44
45
# File 'lib/context_exposer/patch/decorates_before_rendering.rb', line 42

def __ctx_exposed_ones_
  return [] unless _has_exposure_storage?
  @__ctx_exposed_ones_ ||= _cxt_exposed_keys
end

#__decorate_ctx_exposed_ones_Object



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/context_exposer/patch/decorates_before_rendering.rb', line 71

def __decorate_ctx_exposed_ones_
  __ctx_exposed_ones_.each do |name|
    ivar_name = "@#{name}"
    objs = ctx.send(name)

    decorated = case objs
    when Array
      __attempt_to_decorate_list_ objs        
    else
      __attempt_to_decorate_ objs
    end

    ctx.send(:instance_variable_set, ivar_name, decorated) # if decorated
  end
end

#__decorate_error!(decorator) ⇒ Object

Raises:



117
118
119
# File 'lib/context_exposer/patch/decorates_before_rendering.rb', line 117

def __decorate_error! decorator
  raise DecoratorError, "Decorator: #{decorator} must have a #decorate method"
end

#__decorate_exposed_ones_Object



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/context_exposer/patch/decorates_before_rendering.rb', line 55

def __decorate_exposed_ones_
  __exposed_ones_.each do |name|
    ivar_name = "@#{name}"
    objs = send(name)

    decorated = case objs
    when Array
      __attempt_to_decorate_list_ objs        
    else
      __attempt_to_decorate_ objs
    end

    send(:instance_variable_set, ivar_name, decorated)  # if decorated
  end
end

#__decorate_ivars__Object



159
160
161
162
163
164
165
# File 'lib/context_exposer/patch/decorates_before_rendering.rb', line 159

def __decorate_ivars__
  return unless __has_decorates?
  __validate_decorates_present_
  return if __decorates_blank?
  __decorates__ivars
  __decorates_collection_ivars__
end

#__decorates__ivarsObject



184
185
186
187
188
189
190
191
192
193
194
# File 'lib/context_exposer/patch/decorates_before_rendering.rb', line 184

def __decorates__ivars
  if !__decorates__.nil?
    __decorate_ivar_names__(__decorates__) do |ivar_name, ivar, options|
      decorator = options.key?(:with) ? options.fetch(:with) : __decorator_for__(ivar)
      if decorator
        decorated = __do_decoration_(decorator, ivar)
        instance_variable_set(ivar_name, decorated)
      end
    end
  end
end

#__decorates_blank?Boolean

Returns:

  • (Boolean)


171
172
173
# File 'lib/context_exposer/patch/decorates_before_rendering.rb', line 171

def __decorates_blank?
  __decorates__.blank? and __decorates_collection__.blank?
end

#__decorates_collection_ivars__Object



175
176
177
178
179
180
181
182
# File 'lib/context_exposer/patch/decorates_before_rendering.rb', line 175

def __decorates_collection_ivars__
  if !__decorates_collection__.nil?
    __decorate_ivar_names__(__decorates_collection__) do |ivar_name, ivar, options|
      decorated = options.fetch(:with).decorate_collection(ivar)
      instance_variable_set(ivar_name, decorated) if decorated
    end
  end
end

#__decorator_for__(obj) ⇒ Object



143
144
145
146
147
148
# File 'lib/context_exposer/patch/decorates_before_rendering.rb', line 143

def __decorator_for__(obj)
  return obj.decorator(self) if obj.respond_to? :decorator
    __decorator_name_for__(obj).constantize
rescue FindModelError => e
  nil
end

#__decorator_name_for__(obj) ⇒ Object



150
151
152
# File 'lib/context_exposer/patch/decorates_before_rendering.rb', line 150

def __decorator_name_for__(obj)
  "#{__model_name_for__(obj)}Decorator"
end

#__do_decoration_(decorator, obj) ⇒ Object



102
103
104
105
106
107
108
# File 'lib/context_exposer/patch/decorates_before_rendering.rb', line 102

def __do_decoration_ decorator, obj
  return obj if obj.respond_to?(:decorate)

  return if !decorator || !obj
  __validate_decorator!(decorator)
  decorator.decorate(obj)
end

#__exposed_ones_Object



29
30
31
32
# File 'lib/context_exposer/patch/decorates_before_rendering.rb', line 29

def __exposed_ones_
  return [] unless _has_exposures?
  @__exposed_ones_ ||= _exposure_keys
end

#__handle_decorate_error_(e) ⇒ Object



22
23
24
25
26
27
# File 'lib/context_exposer/patch/decorates_before_rendering.rb', line 22

def __handle_decorate_error_ e 
  # puts "Error: #{e}"
  if defined?(::Rails) && (Rails.respond_to? :logger)
    Rails.logger.warn 'decorates_before_render: auto_decorate error: #{e}'
  end
end

#__has_decorates?Boolean

Returns:

  • (Boolean)


167
168
169
# File 'lib/context_exposer/patch/decorates_before_rendering.rb', line 167

def __has_decorates?
  respond_to?(:__decorates__)
end

#__model_name_for__(obj) ⇒ Object

Raises:



154
155
156
157
# File 'lib/context_exposer/patch/decorates_before_rendering.rb', line 154

def __model_name_for__(obj)
  return obj.model_name if obj.respond_to?(:model_name)
  raise FindModelError, "#{obj} does not have an associated model"
end

#__normalized_decorator_for__(obj) ⇒ Object



130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/context_exposer/patch/decorates_before_rendering.rb', line 130

def __normalized_decorator_for__(obj)
  decorator = __decorator_for__(obj)

  case decorator
  when String
    decorator.constantize.new obj
  when Class
    decorator.new obj
  else
    decorator
  end
end

#__src_for__(obj) ⇒ Object



121
122
123
124
125
126
127
128
# File 'lib/context_exposer/patch/decorates_before_rendering.rb', line 121

def __src_for__ obj
  case obj
  when Class
    obj.class
  else 
    obj      
  end
end

#__validate_decorator!(decorator) ⇒ Object



111
112
113
114
115
# File 'lib/context_exposer/patch/decorates_before_rendering.rb', line 111

def __validate_decorator! decorator
  unless decorator.respond_to? :decorate
    raise DecoratorError, "Decorator: #{decorator} must have a #decorate method"
  end
end

#_cxt_exposed_keysObject



47
48
49
# File 'lib/context_exposer/patch/decorates_before_rendering.rb', line 47

def _cxt_exposed_keys
  self.class._exposure_storage.keys
end

#_exposure_keysObject



34
35
36
# File 'lib/context_exposer/patch/decorates_before_rendering.rb', line 34

def _exposure_keys
  self.class._exposures.keys
end

#_has_exposure_storage?Boolean

Returns:

  • (Boolean)


51
52
53
# File 'lib/context_exposer/patch/decorates_before_rendering.rb', line 51

def _has_exposure_storage?
  self.class.respond_to? :_exposure_storage
end

#_has_exposures?Boolean

Returns:

  • (Boolean)


38
39
40
# File 'lib/context_exposer/patch/decorates_before_rendering.rb', line 38

def _has_exposures?
  self.class.respond_to? :_exposures
end