class FlipTheSwitch::Reader::Features
Constants
- DESCRIPTION_KEY
- ENABLED_KEY
- INHERITS_KEY
Attributes
environment[R]
input[R]
Public Class Methods
new(input, environment)
click to toggle source
# File lib/flip_the_switch/reader/features.rb, line 7 def initialize(input, environment) @input = input @environment = environment end
Public Instance Methods
features()
click to toggle source
# File lib/flip_the_switch/reader/features.rb, line 12 def features raise Error::InvalidFile.new(input_file) unless valid_file? raise Error::InvalidEnvironment.new(environment) unless environments_by_name.has_key?(environment) inherited_environment(environment).features end
Private Instance Methods
environments_by_name()
click to toggle source
# File lib/flip_the_switch/reader/features.rb, line 82 def environments_by_name parse.inject({}) { |hash, env| hash[env.name] = env hash } end
expected_schema()
click to toggle source
# File lib/flip_the_switch/reader/features.rb, line 131 def expected_schema { type: :object, additionalProperties: { type: :object, additionalProperties: { properties: { enabled: { type: :boolean }, description: { type: :string }, additionalProperties: { properties: { enabled: { type: :boolean }, description: { type: :string }, required: [ :enabled ] } } }, required: [ :enabled ] } } } end
inherited_environment(env_name)
click to toggle source
# File lib/flip_the_switch/reader/features.rb, line 25 def inherited_environment(env_name) inherited_env = environments_by_name[env_name] if inherited_env.has_parent? merge_environments(inherited_env, inherited_environment(inherited_env.parent_name)) else inherited_env end end
input_file()
click to toggle source
# File lib/flip_the_switch/reader/features.rb, line 121 def input_file File.read(input) rescue SystemCallError => e raise Error::UnreadableFile.new(e) end
json()
click to toggle source
# File lib/flip_the_switch/reader/features.rb, line 117 def json JSON.parse(input_file) end
merge_environments(overriding_env, parent_env)
click to toggle source
# File lib/flip_the_switch/reader/features.rb, line 34 def merge_environments(overriding_env, parent_env) Environment.new( overriding_env.name, merge_features(parent_env.features, overriding_env.features), overriding_env.parent_name ) end
merge_feature(parent_feature, child_feature)
click to toggle source
# File lib/flip_the_switch/reader/features.rb, line 53 def merge_feature(parent_feature, child_feature) Feature.new(parent_feature.name, (child_feature.enabled != nil) ? child_feature.enabled : parent_feature.enabled, child_feature.description ? child_feature.description : parent_feature.description, sub_features(child_feature, parent_feature), child_feature.parent_name ) end
merge_features(parent_features, overriding_features)
click to toggle source
# File lib/flip_the_switch/reader/features.rb, line 42 def merge_features(parent_features, overriding_features) parent_features.inject([]) { |merged_features, parent_feature| overriding_feature = overriding_features.detect { |feature| feature.name == parent_feature.name } if overriding_feature merged_features.push(merge_feature(parent_feature, overriding_feature)) else merged_features.push(parent_feature) end } end
merge_sub_features(parent_feature_sub_features, child_feature_sub_features)
click to toggle source
# File lib/flip_the_switch/reader/features.rb, line 70 def merge_sub_features(parent_feature_sub_features, child_feature_sub_features) child_feature_sub_features.inject([]) { |merged_sub_features, child_sub_feature| merged_sub_features.push(merge_feature(related_parents_sub_feature(parent_feature_sub_features, child_sub_feature.name), child_sub_feature)) } end
parse()
click to toggle source
# File lib/flip_the_switch/reader/features.rb, line 89 def parse @parse ||= json.map { |env_name, env_info| parse_environment(env_name, env_info) } end
parse_environment(name, info)
click to toggle source
# File lib/flip_the_switch/reader/features.rb, line 95 def parse_environment(name, info) Environment.new(name, parse_environment_features(info), info[INHERITS_KEY]) end
parse_environment_features(info)
click to toggle source
# File lib/flip_the_switch/reader/features.rb, line 99 def parse_environment_features(info) info.select { |key, _| key != INHERITS_KEY }.map { |feature_name, feature_info| parse_feature(feature_name, feature_info, nil) } end
parse_feature(name, info, parent_name)
click to toggle source
# File lib/flip_the_switch/reader/features.rb, line 107 def parse_feature(name, info, parent_name) Feature.new(name, info.fetch(ENABLED_KEY), info[DESCRIPTION_KEY], parse_sub_features(info, name), parent_name) end
parse_sub_features(info, parent_name)
click to toggle source
# File lib/flip_the_switch/reader/features.rb, line 111 def parse_sub_features(info, parent_name) info.select { |key, _| ![ENABLED_KEY, DESCRIPTION_KEY].include?(key) }.map { |sub_name, sub_info| parse_feature(sub_name, sub_info, parent_name) } end
sub_features(child_feature, parent_feature)
click to toggle source
# File lib/flip_the_switch/reader/features.rb, line 62 def sub_features(child_feature, parent_feature) if !child_feature.sub_features.empty? merge_sub_features(parent_feature.sub_features, child_feature.sub_features) else parent_feature.sub_features end end
valid_file?()
click to toggle source
# File lib/flip_the_switch/reader/features.rb, line 127 def valid_file? JSON::Validator.validate(expected_schema, input_file) end