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



133
134
135
136
137
138
139
140
141
142
# File 'app/models/sail/setting.rb', line 133

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
73
74
75
76
77
78
79
# File 'app/models/sail/setting.rb', line 60

def self.get(name)
  Sail.instrumenter.increment_usage_of(name)

  cached_setting = Rails.cache.read("setting_get_#{name}")
  return cached_setting unless cached_setting.nil?

  setting = Setting.for_value_by_name(name).first
  return if setting.nil?

  setting_value = setting.safe_cast

  unless setting.should_not_cache?
    Rails.cache.write(
      "setting_get_#{name}", setting_value,
      expires_in: Sail.configuration.cache_life_span
    )
  end

  setting_value
end

.load_defaults(override = false) ⇒ Object



105
106
107
108
109
110
111
112
113
114
# File 'app/models/sail/setting.rb', line 105

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



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

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



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

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)


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

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



147
148
149
# File 'app/models/sail/setting.rb', line 147

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

#relevancyObject



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

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

#safe_castObject



165
166
167
# File 'app/models/sail/setting.rb', line 165

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

#should_not_cache?Boolean

Returns:

  • (Boolean)


161
162
163
# File 'app/models/sail/setting.rb', line 161

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

#stale?Boolean

Returns:

  • (Boolean)


151
152
153
154
155
# File 'app/models/sail/setting.rb', line 151

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

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