lib/eco/api/organization/presets_factory.rb in eco-helpers-3.0.4 vs lib/eco/api/organization/presets_factory.rb in eco-helpers-3.0.5
- old
+ new
@@ -1,15 +1,13 @@
module Eco
module API
module Organization
-
class PresetsFactory
ABILITIES = File.join(__dir__, 'presets_values.json')
INTEGRITY = File.join(__dir__, 'presets_integrity.json')
class << self
-
def all_abilities(hash = {})
Hash[abilities.each_with_object(nil).to_a].merge(hash)
end
def abilities_model
@@ -21,104 +19,112 @@
end
def abilities
@abilities ||= abilities_model.keys
end
-
end
def initialize(enviro: nil, policy_groups: nil)
- fatal("Expecting Environment object. Given: #{enviro}") if enviro && !enviro.is_a?(Eco::API::Common::Session::Environment)
+ msg = "Expecting Environment object. Given: #{enviro.class}"
+ fatal(msg) if enviro && !enviro.is_a?(Eco::API::Common::Session::Environment)
+
@enviro = enviro
@policy_groups = policy_groups
end
# @return [Array<String>] all the abilities
def keys
self.class.abilities
end
def valid?(preset)
- validate(perset).length == 0
+ validate(preset).empty?
end
def validate(preset)
[].tap do |errors|
- if err = preset_errors(preset)
+ if (err = preset_errors(preset))
errors << "{ '#{key}' preset -> #{err}}"
end
- if err = preset_integrity(preset)
+
+ if (err = preset_integrity(preset))
errors << "{ '#{key}' preset -> #{err}}"
end
end
end
private
def compile(*presets)
- presets.compact.reduce({}) do |p1, p2|
- merge(p1, p2)
+ presets.compact.reduce({}) do |p_1, p_2|
+ merge(p_1, p_2)
end
end
- def merge(preset1, preset2)
- keys = preset1.keys | preset2.keys
+ def merge(preset_1, preset_2)
+ keys = preset_1.keys | preset_2.keys
abilities_model.each_with_object({}) do |(key, values), result|
next unless keys.include?(key)
+
idx = [
- values.index(preset1[key]),
- values.index(preset2[key])
+ values.index(preset_1[key]),
+ values.index(preset_2[key])
].compact.max
+
result[key] = idx && values[idx]
end
end
def preset_errors(preset)
- return "No preset given" if !preset
+ return "No preset given" unless preset
+
errors = preset.map do |k, v|
value_exists?(k, v) ? nil : "#{k}:#{v}"
end.compact
- return " Unknown: {#{errors.join(", ")}}" if errors.length > 0
- nil
+
+ " Unknown: {#{errors.join(", ")}}" if errors.length.positive?
end
- def preset_integrity(preset)
+ def preset_integrity(preset) # rubocop:disable Metrics/AbcSize
preset.each_with_object([]) do |(ability, value), errors|
- next unless checks = integrity_model[ability]
+ next unless (checks = integrity_model[ability])
suberrors = []
checks.each do |check|
next unless check["value"] == value
+
check["conditions"].each do |cond, targets|
case cond
when "at_least"
targets.each do |other, minimum|
- unless (ability_value_idx(other, minimum) <= ability_value_idx(other, preset[other]))
- suberrors << "'#{other}' should be at least '#{minimum}'"
- end
+ min_idx = ability_value_idx(other, minimum)
+ oth_idx = ability_value_idx(other, preset[other])
+ next if min_idx <= oth_idx
+
+ suberrors << "'#{other}' should be at least '#{minimum}'"
end
when "one_of"
unless targets.any? {|other, expected| preset[other] == expected}
suberrors << targets.each_with_object([]) do |(other, expected), out|
out << "'#{other}': '#{expected}'"
- end.join(", ").yield_self do |msg|
+ end.join(", ").then do |msg|
"there should be at least one of: {#{msg}}"
end
end
else
warn("Unsuported integrity condition statement '#{cond}' in '#{ability}' with level '#{value}'")
end
end
end
- if suberrors.length > 0
+ unless suberrors.empty?
errors << "Incorrect value '#{value}' for '#{ability}' - reasons: {#{suberrors.join(", ")}}"
end
- end.yield_self do |errors|
- " Integrity errors: { #{errors.join(", ")} }" if errors.length > 0
+ end.then do |errors|
+ " Integrity errors: { #{errors.join(", ")} }" unless errors.empty?
end
end
def integrity_model
self.class.integrity_model
@@ -127,12 +133,12 @@
def value_exists?(ability, value)
abilities_model_inverted.dig(ability, value)
end
def abilities_model_inverted
- @abilities_model_inverted ||= abilities_model.each_with_object({}) do |(key, values), out|
- out[key] = values.each_with_object({}) {|v, h| h[v] = true }
+ @abilities_model_inverted ||= abilities_model.transform_values do |values|
+ values.each_with_object({}) {|v, h| h[v] = true }
end
end
def ability_value_idx(ability, value)
abilities_model[ability].index(value) || -1
@@ -151,20 +157,20 @@
end
@policy_groups
end
def fatal(msg)
- raise msg if !@enviro
+ raise msg unless @enviro
+
@enviro.logger.fatal(msg)
raise msg
end
def warn(msg)
- raise msg if !@enviro
+ raise msg unless @enviro
+
@enviro.logger.warn(msg)
end
-
end
-
end
end
end