Module: Ecoportal::API::Common::Content::ClassHelpers
- Includes:
- Common::BaseClass
- Included in:
- DoubleModel
- Defined in:
- lib/ecoportal/api/common/content/class_helpers.rb
Constant Summary collapse
- NOT_USED =
"no_used!"
Instance Method Summary collapse
-
#inheritable_attrs(*attrs) ⇒ Object
Builds the attr_reader and attr_writer of
attrsand registers the associated instance variable as inheritable. -
#inheritable_class_vars(*vars) ⇒ Object
Keeps track on class instance variables that should be inherited by child classes.
-
#inherited(subclass) ⇒ Object
This callback method is called whenever a subclass of the current class is created.
-
#instance_variable_name(name) ⇒ Object
Helper to create an instance variable
name. -
#new_class(name, inherits:) {|child_class| ... } ⇒ Class
If the class for
nameexists, it returns it. -
#resolve_class(klass, exception: true) ⇒ Class
Class resolver.
-
#to_constant(key) ⇒ String
Helper to normalize
keyinto a correctrubyconstant name. -
#to_time(value, exception: true) ⇒ Object
Helper to parse a value into a
Timeobject. -
#used_param?(val) ⇒ Boolean
Helper to determine if a paramter has been used.
Instance Method Details
#inheritable_attrs(*attrs) ⇒ Object
Builds the attr_reader and attr_writer of attrs and registers the associated instance variable as inheritable.
119 120 121 122 123 124 125 126 |
# File 'lib/ecoportal/api/common/content/class_helpers.rb', line 119 def inheritable_attrs(*attrs) attrs.each do |attr| class_eval %( class << self; attr_accessor :#{attr} end ) end inheritable_class_vars(*attrs) end |
#inheritable_class_vars(*vars) ⇒ Object
- subclasses will inherit the value as is at that moment
- any change afterwards will be only on the specific class (in line with class instance variables)
- adapted from https://stackoverflow.com/a/10729812/4352306
Keeps track on class instance variables that should be inherited by child classes. TODO: this separates the logic of the method to the instance var. Think if would be possible to join them somehow.
113 114 115 116 |
# File 'lib/ecoportal/api/common/content/class_helpers.rb', line 113 def inheritable_class_vars(*vars) @inheritable_class_vars ||= [:inheritable_class_vars] @inheritable_class_vars += vars end |
#inherited(subclass) ⇒ Object
- values of the instance variables are copied as they are (no dups or clones)
- the above means: avoid methods that change the state of the mutable object on it
- mutating methods would reflect the changes on other classes as well
- therefore,
freezewill be called on the values that are inherited.
This callback method is called whenever a subclass of the current class is created.
134 135 136 137 138 139 140 |
# File 'lib/ecoportal/api/common/content/class_helpers.rb', line 134 def inherited(subclass) inheritable_class_vars.each do |var| instance_var = instance_variable_name(var) value = instance_variable_get(instance_var) subclass.instance_variable_set(instance_var, value.freeze) end end |
#instance_variable_name(name) ⇒ Object
Helper to create an instance variable name
46 47 48 49 50 |
# File 'lib/ecoportal/api/common/content/class_helpers.rb', line 46 def instance_variable_name(name) str = name.to_s str = "@#{str}" unless str.start_with?("@") str end |
#new_class(name, inherits:) {|child_class| ... } ⇒ Class
If the class for name exists, it returns it. Otherwise it generates it.
58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
# File 'lib/ecoportal/api/common/content/class_helpers.rb', line 58 def new_class(name, inherits:) name = name.to_sym.freeze class_name = to_constant(name) full_class_name = "#{inherits}::#{class_name}" unless target_class = resolve_class(full_class_name, exception: false) target_class = Class.new(inherits) self.const_set class_name, target_class end target_class.tap do |klass| yield(klass) if block_given? end end |
#resolve_class(klass, exception: true) ⇒ Class
it caches the resolved klasses
Class resolver
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# File 'lib/ecoportal/api/common/content/class_helpers.rb', line 15 def resolve_class(klass, exception: true) @resolved ||= {} @resolved[klass] ||= case klass when Class klass when String begin Kernel.const_get(klass) rescue NameError => e raise if exception end when Symbol resolve_class(self.send(klass)) else raise "Unknown class: #{klass}" if exception end end |
#to_constant(key) ⇒ String
Helper to normalize key into a correct ruby constant name
37 38 39 40 41 |
# File 'lib/ecoportal/api/common/content/class_helpers.rb', line 37 def to_constant(key) str_name = key.to_s.strip.split(/[\-\_ ]/i).compact.map do |str| str.slice(0).upcase + str.slice(1..-1).downcase end.join("") end |
#to_time(value, exception: true) ⇒ Object
Helper to parse a value into a Time object.
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
# File 'lib/ecoportal/api/common/content/class_helpers.rb', line 78 def to_time(value, exception: true) case value when NilClass value when String begin Time.parse(value) rescue ArgumentArgument => e raise if exception nil end when Date Time.parse(value.to_s) when Time value else to_time(value.to_s) if value.respond_to?(:to_s) end end |
#used_param?(val) ⇒ Boolean
to effectivelly use this helper, you should initialize your target
paramters with the constant NOT_USED
Helper to determine if a paramter has been used
103 104 105 |
# File 'lib/ecoportal/api/common/content/class_helpers.rb', line 103 def used_param?(val) val != NOT_USED end |