Class: Sail::Setting

Inherits:
ApplicationRecord show all
Defined in:
app/models/sail/setting.rb

Overview

Setting This is the model used for settings it contains all data definitions, validations, scopes and methods

Defined Under Namespace

Classes: UnexpectedCastType

Constant Summary collapse

FULL_RANGE =
(0...100).freeze
AVAILABLE_MODELS =
Dir[Rails.root.join("app", "models", "*.rb")]
.map { |dir| dir.split("/").last.camelize.gsub(".rb", "") }.freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#casterObject (readonly)

Returns the value of attribute caster.



18
19
20
# File 'app/models/sail/setting.rb', line 18

def caster
  @caster
end

Class Method Details

.database_to_fileObject



126
127
128
129
130
131
132
133
134
135
# File 'app/models/sail/setting.rb', line 126

def self.database_to_file
  attributes = {}

  Setting.all.find_each do |setting|
    setting_attrs = setting.attributes.except("id", "name", "created_at", "updated_at", "cast_type")
    attributes[setting.name] = setting_attrs.merge("cast_type" => setting.cast_type)
  end

  File.open(config_file_path, "w") { |f| f.write(attributes.to_yaml) }
end

.get(name) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'app/models/sail/setting.rb', line 60

def self.get(name)
  Sail.instrumenter.increment_usage_of(name)
  setting = Setting.for_value_by_name(name).first
  return if setting.nil?

  if setting.should_not_cache?
    setting.safe_cast
  else
    Rails.cache.fetch("setting_get_#{name}", expires_in: Sail.configuration.cache_life_span) do
      setting.safe_cast
    end
  end
end

.load_defaults(override = false) ⇒ Object



98
99
100
101
102
103
104
105
106
107
# File 'app/models/sail/setting.rb', line 98

def self.load_defaults(override = false)
  if File.exist?(config_file_path) &&
     ActiveRecord::Base.connection.table_exists?(table_name)

    destroy_all if override
    config = YAML.load_file(config_file_path)
    find_or_create_settings(config)
    destroy_missing_settings(config.keys)
  end
end

.reset(name) ⇒ Object



91
92
93
94
95
96
# File 'app/models/sail/setting.rb', line 91

def self.reset(name)
  if File.exist?(config_file_path)
    defaults = YAML.load_file(config_file_path)
    set(name, defaults[name]["value"])
  end
end

.set(name, value) ⇒ Object



74
75
76
77
78
79
80
# File 'app/models/sail/setting.rb', line 74

def self.set(name, value)
  setting = Setting.find_by(name: name)
  value_cast = setting.caster.from(value)
  success = setting.update(value: value_cast)
  Rails.cache.delete("setting_get_#{name}") if success
  [setting, success]
end

.switcher(positive:, negative:, throttled_by:) ⇒ Object

Raises:

  • (ActiveRecord::RecordNotFound)


82
83
84
85
86
87
88
89
# File 'app/models/sail/setting.rb', line 82

def self.switcher(positive:, negative:, throttled_by:)
  setting = select(:cast_type).find_by(name: throttled_by)
  raise ActiveRecord::RecordNotFound, "Can't find throttle setting" if setting.nil?

  raise UnexpectedCastType unless setting.throttle?

  get(throttled_by) ? get(positive) : get(negative)
end

Instance Method Details

#display_nameObject



140
141
142
# File 'app/models/sail/setting.rb', line 140

def display_name
  name.gsub(/[^a-zA-Z\d]/, " ").titleize
end

#relevancyObject



150
151
152
# File 'app/models/sail/setting.rb', line 150

def relevancy
  (Sail.instrumenter.relative_usage_of(name) / Sail::Setting.count).round(1)
end

#safe_castObject



158
159
160
# File 'app/models/sail/setting.rb', line 158

def safe_cast
  try(:caster).try(:to_value)
end

#should_not_cache?Boolean

Returns:

  • (Boolean)


154
155
156
# File 'app/models/sail/setting.rb', line 154

def should_not_cache?
  ab_test? || cron? || throttle?
end

#stale?Boolean

Returns:

  • (Boolean)


144
145
146
147
148
# File 'app/models/sail/setting.rb', line 144

def stale?
  return if Sail.configuration.days_until_stale.blank?

  updated_at < Sail.configuration.days_until_stale.days.ago
end