class ForestLiana::SchemaFileUpdater

Constants

KEYS_ACTION
KEYS_ACTION_FIELD
KEYS_COLLECTION

TODO: Remove nameOld attribute once the lianas versions older than 2.0.0 are minority.

KEYS_COLLECTION_FIELD
KEYS_SEGMENT
KEYS_VALIDATION

Public Class Methods

new(filename, collections, meta) click to toggle source
# File lib/forest_liana/schema_file_updater.rb, line 70
def initialize filename, collections, meta
  @filename = filename
  @meta = meta

  # NOTICE: Remove unecessary keys
  @collections = collections.map do |collection|
    collection['fields'] = collection['fields'].map do |field|
      unless field['validations'].nil?
        field['validations'] = field['validations'].map { |validation| validation.slice(*KEYS_VALIDATION) }
      end

      field['type'] = 'String' unless field.has_key?('type')
      field['default_value'] = nil unless field.has_key?('default_value')
      field['enums'] = nil unless field.has_key?('enums')
      field['integration'] = nil unless field.has_key?('integration')
      field['is_filterable'] = false unless field.has_key?('is_filterable')
      field['is_read_only'] = true unless field.has_key?('is_read_only')
      field['is_required'] = false unless field.has_key?('is_required')
      field['is_sortable'] = false unless field.has_key?('is_sortable')
      field['is_virtual'] = false unless field.has_key?('is_virtual')
      field['reference'] = nil unless field.has_key?('reference')
      field['inverse_of'] = nil unless field.has_key?('inverse_of')
      field['relationships'] = nil unless field.has_key?('relationships')
      field['widget'] = nil unless field.has_key?('widget')
      field['validations'] = [] unless field.has_key?('validations')

      field.slice(*KEYS_COLLECTION_FIELD)
    end

    collection['actions'] = collection['actions'].map do |action|
      begin
        SmartActionFieldValidator.validate_smart_action_fields(action['fields'], action['name'], action['hooks']['change'])
      rescue ForestLiana::Errors::SmartActionInvalidFieldError => invalid_field_error
        FOREST_LOGGER.warn invalid_field_error.message
      rescue ForestLiana::Errors::SmartActionInvalidFieldHookError => invalid_hook_error
        FOREST_REPORTER.report invalid_hook_error
        FOREST_LOGGER.error invalid_hook_error.message
      end
      action['fields'] = action['fields'].map { |field| field.slice(*KEYS_ACTION_FIELD) }
      action.slice(*KEYS_ACTION)
    end

    collection['segments'] = collection['segments'].map do |segment|
      segment.slice(*KEYS_SEGMENT)
    end

    collection.slice(*KEYS_COLLECTION)
  end

  # NOTICE: Sort keys
  @collections = @collections.map do |collection|
    collection['fields'].sort do |field1, field2|
      [field1['field'], field1['type'].inspect] <=> [field2['field'], field2['type'].inspect]
    end

    collection['fields'] = collection['fields'].map do |field|
      unless field['validations'].nil?
        field['validations'] = field['validations'].map do |validation|
          validation.sort_by { |key, value| KEYS_VALIDATION.index key }.to_h
        end
      end
      field.sort_by { |key, value| KEYS_COLLECTION_FIELD.index key }.to_h
    end
    collection['actions'] = collection['actions'].map do |action|
      action.sort_by { |key, value| KEYS_ACTION.index key }.to_h
    end
    collection.sort_by { |key, value| KEYS_COLLECTION.index key }.to_h
  end

  @collections.sort! { |collection1, collection2| collection1['name'] <=> collection2['name'] }
end

Public Instance Methods

perform() click to toggle source
# File lib/forest_liana/schema_file_updater.rb, line 142
def perform
  File.open(@filename, 'w') do |file|
    # NOTICE: Escape '\' characters to ensure the generation of valid JSON files. It fixes
    #         potential issues if some fields have validations using complex regexp.
    file.puts pretty_print({
      collections: @collections,
      meta: @meta
    }).gsub(/[^\\](\\)[^\\"]/) { |x| x.gsub($1, "\\\\\\") }
  end
end