Module: Familia::Utils
- Included in:
- Familia
- Defined in:
- lib/familia/utils.rb
Instance Method Summary collapse
-
#debug? ⇒ Boolean
Checks if debug mode is enabled.
-
#distinguisher(value_to_distinguish, strict_values: true) ⇒ String?
This method determines the appropriate transformation to apply based on the class of the input argument.
-
#generate_id(length: 32, encoding: 36) ⇒ String
Generates a unique ID using SHA256 and base-36 encoding.
- #generate_sha_hash(*elements) ⇒ Object
-
#join(*val) ⇒ String
Joins array elements with Familia delimiter.
-
#qstamp(quantum = 10.minutes, pattern: nil, time: nil) ⇒ Integer, String
A quantized timestamp.
-
#rediskey(*val) ⇒ String
Creates a Redis key from given values.
-
#redisuri(uri) ⇒ URI::Redis
Converts a generic URI to a Redis URI.
-
#split(val) ⇒ Array
Splits a string using Familia delimiter.
Instance Method Details
#debug? ⇒ Boolean
Checks if debug mode is enabled
e.g. Familia.debug = true
15 16 17 |
# File 'lib/familia/utils.rb', line 15 def debug? @debug == true end |
#distinguisher(value_to_distinguish, strict_values: true) ⇒ String?
This method determines the appropriate transformation to apply based on the class of the input argument.
The method uses a case statement to handle different classes:
-
For ‘Symbol`, `String`, `Integer`, and `Float` classes, it traces the operation and converts the value to a string.
-
For ‘Familia::Horreum` class, it traces the operation and returns the identifier of the value.
-
For ‘TrueClass`, `FalseClass`, and `NilClass`, it traces the operation and converts the value to a string (“true”, “false”, or “”).
-
For any other class, it traces the operation and returns nil.
Alternative names for ‘value_to_distinguish` could be `input_value`, `value`, or `object`.
151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 |
# File 'lib/familia/utils.rb', line 151 def distinguisher(value_to_distinguish, strict_values: true) case value_to_distinguish when ::Symbol, ::String, ::Integer, ::Float Familia.trace :TOREDIS_DISTINGUISHER, redis, "string", caller(1..1) if Familia.debug? # Symbols and numerics are naturally serializable to strings # so it's a relatively low risk operation. value_to_distinguish.to_s when ::TrueClass, ::FalseClass, ::NilClass Familia.trace :TOREDIS_DISTINGUISHER, redis, "true/false/nil", caller(1..1) if Familia.debug? # TrueClass, FalseClass, and NilClass are considered high risk because their # original types cannot be reliably determined from their serialized string # representations. This can lead to unexpected behavior during deserialization. # For instance, a TrueClass value serialized as "true" might be deserialized as # a String, causing application errors. Even more problematic, a NilClass value # serialized as an empty string makes it impossible to distinguish between a # nil value and an empty string upon deserialization. Such scenarios can result # in subtle, hard-to-diagnose bugs. To mitigate these risks, we raise an # exception when encountering these types unless the strict_values option is # explicitly set to false. # raise Familia::HighRiskFactor, value_to_distinguish if strict_values value_to_distinguish.to_s #=> "true", "false", "" when Familia::Base, Class Familia.trace :TOREDIS_DISTINGUISHER, redis, "base", caller(1..1) if Familia.debug? # When called with a class we simply transform it to its name. For # instances of Familia class, we store the identifier. if value_to_distinguish.is_a?(Class) value_to_distinguish.name else value_to_distinguish.identifier end else Familia.trace :TOREDIS_DISTINGUISHER, redis, "else1 #{strict_values}", caller(1..1) if Familia.debug? if value_to_distinguish.class.ancestors.member?(Familia::Base) Familia.trace :TOREDIS_DISTINGUISHER, redis, "isabase", caller(1..1) if Familia.debug? value_to_distinguish.identifier else Familia.trace :TOREDIS_DISTINGUISHER, redis, "else2 #{strict_values}", caller(1..1) if Familia.debug? raise Familia::HighRiskFactor, value_to_distinguish if strict_values nil end end end |
#generate_id(length: 32, encoding: 36) ⇒ String
Generates a unique ID using SHA256 and base-36 encoding
40 41 42 43 44 45 |
# File 'lib/familia/utils.rb', line 40 def generate_id(length: 32, encoding: 36) raise ArgumentError, "Encoding must be between 2 and 36" unless (1..36).include?(encoding) input = SecureRandom.hex(length) Digest::SHA256.hexdigest(input).to_i(16).to_s(encoding) end |
#generate_sha_hash(*elements) ⇒ Object
123 124 125 126 |
# File 'lib/familia/utils.rb', line 123 def generate_sha_hash(*elements) concatenated_string = Familia.join(*elements) DIGEST_CLASS.hexdigest(concatenated_string) end |
#join(*val) ⇒ String
Joins array elements with Familia delimiter
50 51 52 |
# File 'lib/familia/utils.rb', line 50 def join(*val) val.compact.join(Familia.delim) end |
#qstamp(quantum = 10.minutes, pattern: nil, time: nil) ⇒ Integer, String
A quantized timestamp
110 111 112 113 114 115 116 117 118 119 120 121 |
# File 'lib/familia/utils.rb', line 110 def qstamp(quantum = 10.minutes, pattern: nil, time: nil) time ||= Familia.now time = time.to_f if time.is_a?(Time) rounded = time - (time % quantum) if pattern Time.at(rounded).utc.strftime(pattern) else Time.at(rounded).utc.to_i end end |
#rediskey(*val) ⇒ String
Creates a Redis key from given values
64 65 66 |
# File 'lib/familia/utils.rb', line 64 def rediskey(*val) join(*val) end |
#redisuri(uri) ⇒ URI::Redis
Converts a generic URI to a Redis URI
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
# File 'lib/familia/utils.rb', line 71 def redisuri(uri) uri ||= Familia.uri generic_uri = URI.parse(uri.to_s) # Create a new URI::Redis object URI::Redis.build( scheme: generic_uri.scheme, userinfo: generic_uri.userinfo, host: generic_uri.host, port: generic_uri.port, path: generic_uri.path, # the db is stored in the path query: generic_uri.query, fragment: generic_uri.fragment ) end |