michaelengland/FlipTheSwitch

View on GitHub
lib/flip_the_switch/generator/settings.rb

Summary

Maintainability
A
2 hrs
Test Coverage
require 'flip_the_switch/generator/base'
require 'plist'

module FlipTheSwitch
  module Generator
    class Settings < Base
      def generate
        create_settings_bundle_if_not_exists
        read_settings
        delete_existing_settings_if_exist
        write_settings
      end

      private

      def create_settings_bundle_if_not_exists
        unless Dir.exists?(settings_bundle)
          Dir.mkdir(settings_bundle)
        end
      end

      def read_settings
        current_plist
      end

      def delete_existing_settings_if_exist
        delete_root_plist_if_exists
        delete_features_plist_if_exists
      end

      def write_settings
        write_root_plist
        write_features_plist
      end

      def delete_root_plist_if_exists
        delete_file(root_plist)
      end

      def delete_features_plist_if_exists
        delete_file(features_plist)
      end

      def write_root_plist
        ::Plist::Emit.save_plist(root, root_plist)
      end

      def write_features_plist
        ::Plist::Emit.save_plist(feature_properties, features_plist)
      end

      def delete_file(file)
        File.delete(file) if File.exists?(file)
      end

      def root
        current_plist.merge('PreferenceSpecifiers' => root_preferences)
      end

      def root_preferences
        existing_root_preferences.delete_if { |root_preference|
          root_preference['Title'] == 'Features'
        } + feature_root_preferences
      end

      def existing_root_preferences
        current_plist['PreferenceSpecifiers'] || []
      end

      def feature_root_preferences
        [
          {
            'Title' => 'Features',
            'Type' => 'PSGroupSpecifier'
          },
          {
            'File' => 'Features',
            'Title' => 'Features',
            'Type' => 'PSChildPaneSpecifier'
          }
        ]
      end

      def feature_properties
        {'PreferenceSpecifiers' => feature_toggles}
      end

      def feature_toggles
        features.map { |feature|
          {
            'Type' => 'PSToggleSwitchSpecifier',
            'Title' => feature_title(feature),
            'Key' => "FTS_FEATURE_#{feature.name}",
            'DefaultValue' => feature.enabled
          }
        }
      end

      def feature_title(feature)
          feature.name.gsub('_', ' ').capitalize
      end

      def current_plist
        @current_plist ||= if File.exists?(root_plist)
          ::Plist::parse_xml(root_plist)
        else
          {}
        end
      end

      def root_plist
        File.join(settings_bundle, 'Root.plist')
      end

      def features_plist
        File.join(settings_bundle, 'Features.plist')
      end

      def settings_bundle
        File.join(output, 'Settings.bundle')
      end
    end
  end
end