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