Module: Tramway::Decorators::ClassHelper

Included in:
ApplicationHelper
Defined in:
lib/tramway/decorators/class_helper.rb

Overview

Provides method to determine decorators classes

Class Method Summary collapse

Class Method Details

.build_klass_name(base_class_name, namespace) ⇒ Object



44
45
46
47
48
49
50
51
52
# File 'lib/tramway/decorators/class_helper.rb', line 44

def build_klass_name(base_class_name, namespace)
  klass_name = namespace.present? ? "#{namespace.to_s.camelize}::#{base_class_name}" : base_class_name

  unless klass_name.safe_constantize
    raise NameError, "You should define #{klass_name} decorator class in app/decorators/ folder."
  end

  klass_name
end

.class_name_for_error(object_or_array, namespace) ⇒ Object



54
55
56
57
58
59
60
# File 'lib/tramway/decorators/class_helper.rb', line 54

def class_name_for_error(object_or_array, namespace)
  object = object_or_array.respond_to?(:first) ? object_or_array.first : object_or_array

  base_class_name = "#{object.class.name}Decorator"

  namespace.present? ? "#{namespace}::#{base_class_name}" : base_class_name
end

.decorator_class(object_or_array, decorator = nil, namespace = nil) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
# File 'lib/tramway/decorators/class_helper.rb', line 9

def decorator_class(object_or_array, decorator = nil, namespace = nil)
  raise_error_if_object_empty object_or_array, decorator

  return decorator if decorator.present?

  begin
    class_name = decorator_class_name(object_or_array, namespace)
    class_name.constantize
  rescue NameError
    raise NameError, "You should define #{class_name_for_error(object_or_array, namespace)} decorator class."
  end
end

.decorator_class_name(object_or_array_or_class, namespace) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/tramway/decorators/class_helper.rb', line 22

def decorator_class_name(object_or_array_or_class, namespace)
  if Tramway::Decorators::CollectionDecorators.collection?(object_or_array_or_class)
    object_or_array_or_class.first.class
  elsif object_or_array_or_class.is_a?(Class)
    object_or_array_or_class
  else
    object_or_array_or_class.class
  end => klass

  base_class_name = Tramway::Decorators::NameBuilder.default_decorator_class_name(klass)

  build_klass_name(base_class_name, namespace)
end

.raise_error_if_object_empty(object_or_array, decorator) ⇒ Object

Raises:

  • (ArgumentError)


36
37
38
39
40
41
42
# File 'lib/tramway/decorators/class_helper.rb', line 36

def raise_error_if_object_empty(object_or_array, decorator)
  return unless object_or_array.blank? && decorator.nil?

  text = 'You should pass object or array that is not empty OR provide a decorator class as a second argument'

  raise ArgumentError, text
end