Module: Familia::Base
- Defined in:
- lib/familia/base.rb,
lib/familia/features/expiration/extensions.rb
Overview
Add a default update_expiration method for all classes that include
Familia::Base. Since expiration is a core feature, we can confidently
call horreum_instance.update_expiration without defensive programming
even when expiration is not enabled for the horreum_instance class.
Defined Under Namespace
Modules: ClassMethods
Class Attribute Summary collapse
-
.dump_method ⇒ Object
Returns the value of attribute dump_method.
-
.feature_definitions ⇒ Object
readonly
Returns the value of attribute feature_definitions.
-
.features_available ⇒ Object
readonly
Returns the value of attribute features_available.
-
.load_method ⇒ Object
Returns the value of attribute load_method.
Class Method Summary collapse
- .add_feature(klass, feature_name, depends_on: [], field_group: nil) ⇒ Object
-
.find_feature(feature_name, starting_class = self) ⇒ Object
Find a feature by name, traversing the ancestry chain of classes that include Familia::Base.
Instance Method Summary collapse
-
#as_json(options = nil) ⇒ Hash, Object
Prepares the object for JSON serialization by converting it to a hash.
-
#expired?(_threshold = 0) ⇒ Boolean
Base implementation of expired? that returns false.
-
#expires? ⇒ Boolean
Base implementation of expires? that returns false.
- #generate_id ⇒ Object
-
#to_json(options = nil) ⇒ String
Converts the object to a JSON string using Familia's JsonSerializer.
-
#to_s ⇒ String
Returns a string representation of the object.
-
#ttl ⇒ Integer
Base implementation of ttl that returns -1 (no expiration set).
-
#update_expiration(expiration: nil) ⇒ nil
Base implementation of update_expiration that maintains API compatibility with the :expiration feature's implementation.
- #uuid ⇒ Object
Class Attribute Details
.dump_method ⇒ Object
Returns the value of attribute dump_method.
114 115 116 |
# File 'lib/familia/base.rb', line 114 def dump_method @dump_method end |
.feature_definitions ⇒ Object (readonly)
Returns the value of attribute feature_definitions.
113 114 115 |
# File 'lib/familia/base.rb', line 113 def feature_definitions @feature_definitions end |
.features_available ⇒ Object (readonly)
Returns the value of attribute features_available.
113 114 115 |
# File 'lib/familia/base.rb', line 113 def features_available @features_available end |
.load_method ⇒ Object
Returns the value of attribute load_method.
114 115 116 |
# File 'lib/familia/base.rb', line 114 def load_method @load_method end |
Class Method Details
.add_feature(klass, feature_name, depends_on: [], field_group: nil) ⇒ Object
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
# File 'lib/familia/base.rb', line 116 def add_feature(klass, feature_name, depends_on: [], field_group: nil) @features_available ||= {} Familia.trace :ADD_FEATURE, klass, feature_name if Familia.debug? # Create field definition object feature_def = FeatureDefinition.new( name: feature_name, depends_on: depends_on, field_group: field_group ) # Track field definitions after defining field methods @feature_definitions ||= {} @feature_definitions[feature_name] = feature_def features_available[feature_name] = klass end |
.find_feature(feature_name, starting_class = self) ⇒ Object
Find a feature by name, traversing the ancestry chain of classes that include Familia::Base
136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
# File 'lib/familia/base.rb', line 136 def find_feature(feature_name, starting_class = self) # Convert to symbol for consistent lookup feature_name = feature_name.to_sym # Walk up the ancestry chain, checking each class that includes Familia::Base starting_class.ancestors.each do |ancestor| next unless ancestor.respond_to?(:features_available) next unless ancestor.features_available return ancestor.features_available[feature_name] if ancestor.features_available.key?(feature_name) end nil end |
Instance Method Details
#as_json(options = nil) ⇒ Hash, Object
Prepares the object for JSON serialization by converting it to a hash. This method provides the data preparation step in the standard Ruby JSON pattern: to_json → as_json → JSON serialization.
Implementing classes can override this method to customize their JSON representation. For Horreum objects, this delegates to to_h which returns only the public fields. For DataType objects, this returns the raw value.
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
# File 'lib/familia/base.rb', line 79 def as_json( = nil) if respond_to?(:to_h) # Horreum objects - return their field hash to_h elsif respond_to?(:members) # DataType objects (List, Set, etc.) - return their members members elsif respond_to?(:value) # String-like objects or simple values value else # Fallback for objects that don't have standard value methods # This ensures we don't expose internal state accidentally { class: self.class.name, id: respond_to?(:identifier) ? identifier : object_id } end end |
#expired?(_threshold = 0) ⇒ Boolean
Base implementation of expired? that returns false
57 58 59 |
# File 'lib/familia/features/expiration/extensions.rb', line 57 def expired?(_threshold = 0) false end |
#expires? ⇒ Boolean
Base implementation of expires? that returns false
48 49 50 |
# File 'lib/familia/features/expiration/extensions.rb', line 48 def expires? false end |
#generate_id ⇒ Object
152 153 154 |
# File 'lib/familia/base.rb', line 152 def generate_id @identifier ||= Familia.generate_id end |
#to_json(options = nil) ⇒ String
Converts the object to a JSON string using Familia's JsonSerializer. This method completes the standard Ruby JSON pattern by calling as_json to prepare the data, then using JsonSerializer.dump for serialization.
This maintains security by ensuring all JSON serialization goes through Familia's controlled JsonSerializer (OJ in strict mode) rather than potentially unsafe serialization methods.
107 108 109 |
# File 'lib/familia/base.rb', line 107 def to_json( = nil) Familia::JsonSerializer.dump(as_json()) end |
#to_s ⇒ String
Returns a string representation of the object. Implementing classes are welcome to override this method to provide a more meaningful representation. Using this as a default via super is recommended.
64 65 66 |
# File 'lib/familia/base.rb', line 64 def to_s "#<#{self.class}:0x#{object_id.to_s(16)}>" end |
#ttl ⇒ Integer
Base implementation of ttl that returns -1 (no expiration set)
40 41 42 |
# File 'lib/familia/features/expiration/extensions.rb', line 40 def ttl -1 end |
#update_expiration(expiration: nil) ⇒ nil
This is a no-op implementation. Classes that need expiration functionality should include the :expiration feature.
Base implementation of update_expiration that maintains API compatibility with the :expiration feature's implementation.
This is a no-op implementation that gets overridden by the :expiration feature when it is enabled. This allows for calling this method on any horreum model regardless of the feature status. It accepts an optional expiration parameter to maintain interface compatibility with the overriding implementations.
28 29 30 31 32 33 34 |
# File 'lib/familia/features/expiration/extensions.rb', line 28 def update_expiration(expiration: nil) Familia.debug <<~LOG [update_expiration] Expiration feature not enabled for #{self.class}. Key: #{dbkey} Arg: #{expiration} (caller: #{caller(1..1)}) LOG nil end |
#uuid ⇒ Object
156 157 158 |
# File 'lib/familia/base.rb', line 156 def uuid @uuid ||= SecureRandom.uuid end |