class Sideroo::Base

Public Class Methods

all() click to toggle source
# File lib/sideroo/types/base.rb, line 70
def all
  where({})
end
count() click to toggle source
# File lib/sideroo/types/base.rb, line 74
def count
  all.count
end
data_type(*args) click to toggle source

USAGE DEFINTIONS

# File lib/sideroo/types/base.rb, line 12
def data_type(*args)
  @data_type = args.first if args.count > 0
  @data_type
end
description(*args) click to toggle source
# File lib/sideroo/types/base.rb, line 44
def description(*args)
  @description = args.first if args.count > 0
  @description
end
dimensions()
Alias for: key_attributes
example(*args) click to toggle source

Provide example to test against key_pattern and key_regex. Strongly recommended. Please watch out for edge cases.

# File lib/sideroo/types/base.rb, line 36
def example(*args)
  if args.count > 0
    @example = args.first
    validate_example_and_regex!
  end
  @example
end
flush() click to toggle source
# File lib/sideroo/types/base.rb, line 78
def flush
  all.each(&:del)
end
key_attributes() click to toggle source
# File lib/sideroo/types/base.rb, line 49
def key_attributes
  regex = /\{([^\{\}]+)\}/
  key_pattern.scan(regex).map(&:first)
end
Also aliased as: dimensions
key_pattern(*args) click to toggle source
# File lib/sideroo/types/base.rb, line 17
def key_pattern(*args)
  if args.count > 0
    declare_key_pattern(args.first)
  end

  @key_pattern
end
key_regex(*args) click to toggle source
# File lib/sideroo/types/base.rb, line 25
def key_regex(*args)
  if args.count > 0
    custom_key_regex_should_be_defined_before_example!
    @key_regex = args.first
  end
  @key_regex || default_key_regex
end
new(arg = {}) click to toggle source
# File lib/sideroo/types/base.rb, line 162
def initialize(arg = {})
  case arg
  when ::String
    raw_key = arg
    key_regex = self.class.key_regex

    message = "Expected pattern #{key_pattern}, got #{arg}"
    raise(ArgumentError, message) if raw_key !~ key_regex

    values = raw_key.scan(key_regex).first
    self.class.dimensions.zip(values).each do |dimension, value|
      send("#{dimension}=", value)
    end
  when ::Hash
    attr_map = arg
    attr_map.each do |dimension, value|
      send("#{dimension}=", value)
    end
  else
    message = "Hash or String expected. #{arg.class} given."
    raise ArgumentError, message
  end
end
redis_client(*args) click to toggle source
# File lib/sideroo/types/base.rb, line 56
def redis_client(*args)
  @redis_client = args.first if args.count > 0
  @redis_client || Sideroo.redis_client
end
redis_methods(method_names) click to toggle source
# File lib/sideroo/types/base.rb, line 4
def redis_methods(method_names)
  method_names.each do |method_name|
    define_redis_method(method_name)
  end
end
where(attr_map) click to toggle source

SEARCH

# File lib/sideroo/types/base.rb, line 63
def where(attr_map)
  Sideroo::Enumerator.new(
    type_klass: self,
    filters: attr_map,
  )
end

Private Class Methods

custom_key_regex_should_be_defined_before_example!() click to toggle source
# File lib/sideroo/types/base.rb, line 116
def custom_key_regex_should_be_defined_before_example!
  return if example.nil?
  message = 'Custom key regex should be defined before example'
  raise Sideroo::OutOfOrderConfig, message
end
declare_key_pattern(pattern) click to toggle source
# File lib/sideroo/types/base.rb, line 84
def declare_key_pattern(pattern)
  raise Sideroo::PatternAlreadyDeclared unless key_pattern.nil?
  @key_pattern = pattern
  define_dimensions_as_attr_accessors
end
default_key_regex() click to toggle source
# File lib/sideroo/types/base.rb, line 104
def default_key_regex
  regex_str = key_pattern

  key_attributes.each do |attr|
    term = "{#{attr}}"
    value = '(.+)'
    regex_str = regex_str.gsub(term, value)
  end

  Regexp.new("^#{regex_str}$")
end
define_dimensions_as_attr_accessors() click to toggle source
# File lib/sideroo/types/base.rb, line 90
def define_dimensions_as_attr_accessors
  dimensions.each do |dimension|
    attr_accessor dimension
  end
end
define_redis_method(method_name) click to toggle source
# File lib/sideroo/types/base.rb, line 96
def define_redis_method(method_name)
  define_method method_name do |*args|
    redis_args = [key].concat(args)
    # forward key and args to corresponding redis method
    redis_client.send(method_name, *redis_args)
  end
end
validate_example_and_regex!() click to toggle source

Validate if the provided example matches key regex

# File lib/sideroo/types/base.rb, line 124
def validate_example_and_regex!
  return if example.nil?
  example_valid = example =~ key_regex

  unless example_valid
    message = "Example does not match key regex: #{key_regex}"
    raise Sideroo::InvalidExample, message
  end

  values = example.scan(key_regex).first

  if values.count != dimensions.count
    message = "Expected #{dimensions.count} dimensions, got #{values.count}"
    raise Sideroo::InvalidKeyRegex, message
  end
end

Public Instance Methods

key() click to toggle source
# File lib/sideroo/types/base.rb, line 186
def key
  k = key_pattern

  self.class.dimensions.each do |dimension|
    term = "{#{dimension}}"
    value = send(dimension)
    k = k.gsub(term, value.to_s)
  end

  k
end
redis_client() click to toggle source
# File lib/sideroo/types/base.rb, line 202
def redis_client
  @redis_client || self.class.redis_client
end
redis_client=(client) click to toggle source
# File lib/sideroo/types/base.rb, line 198
def redis_client=(client)
  @redis_client = client
end

Private Instance Methods

key_pattern() click to toggle source
# File lib/sideroo/types/base.rb, line 208
def key_pattern
  self.class.key_pattern
end
validate_attrs!(attr_map) click to toggle source
# File lib/sideroo/types/base.rb, line 212
def validate_attrs!(attr_map)
  provided_attrs = attr_map.keys.map(&:to_s)
  key_attributes = self.class.key_attributes(key_pattern)

  missing_attrs = key_attributes - provided_attrs
  unexpected_attrs = provided_attrs - key_attributes

  if missing_attrs.any?
    msg = "Missing attributes: #{missing_attrs.join(', ')}"
    raise MissingKeys, msg
  end

  if unexpected_attrs.any?
    msg = "Unexpected attributes: #{unexpected_attrs.join(', ')}"
    raise UnexpectedKeys, msg
  end
end