hiptest/hiptest-publisher

View on GitHub
lib/hiptest-publisher/formatters/diff_displayer.rb

Summary

Maintainability
C
7 hrs
Test Coverage
A
100%
require 'i18n'

module Hiptest
  class DiffDisplayer
    def initialize(diff, cli_options, language_config, file_writer)
      @diff = diff
      @cli_options = cli_options
      @language_config = language_config
      @file_writer = file_writer
    end

    def display
      return export_as_json if @cli_options.actionwords_diff_json && @cli_options.output_directory
      return display_as_json if @cli_options.actionwords_diff_json
      return display_deleted if @cli_options.aw_deleted
      return display_created if @cli_options.aw_created
      return display_renamed if @cli_options.aw_renamed
      return display_signature_changed if @cli_options.aw_signature_changed
      return display_definition_changed if @cli_options.aw_definition_changed

      display_summary
    end

    def display_created
      return display_skeletons(@diff[:created])
    end

    def display_renamed
      return if @diff[:renamed].nil?

      output(@diff[:renamed].map {|renamed|
        "#{@language_config.name_action_word(renamed[:name])}\t#{@language_config.name_action_word(renamed[:new_name])}"
      })
    end

    def display_signature_changed
      display_skeletons(@diff[:signature_changed])
    end

    def display_definition_changed
      display_skeletons(@diff[:definition_changed])
    end

    def display_deleted
      return if @diff[:deleted].nil?

      output(@diff[:deleted].map {|deleted|
        @language_config.name_action_word(deleted[:name])
      })
    end

    def export_as_json
      @file_writer.write_to_file(
        "#{@cli_options.output_directory}/actionwords-diff.json",
        I18n.t('actionwords_diff.exporting_diff_title')) {
        JSON.pretty_generate(as_api)
      }
    end

    def display_as_json
      output(JSON.pretty_generate(as_api))
    end

    def as_api
      data = {}

      data[:deleted] = @diff[:deleted].map {|aw|
        {
          name: aw[:name],
          name_in_code: @language_config.name_action_word(aw[:name])
        }
      } unless @diff[:deleted].nil?

      data[:created] = @diff[:created].map {|aw|
        {
          name: aw[:name],
          skeleton: actionword_skeleton(aw)
        }
      } unless @diff[:created].nil?

      data[:renamed] = @diff[:renamed].map {|aw|
        {
          name: aw[:name],
          old_name: @language_config.name_action_word(aw[:name]),
          new_name: @language_config.name_action_word(aw[:new_name])
        }
      } unless @diff[:renamed].nil?

      data[:signature_changed] = @diff[:signature_changed].map {|aw|
        {
          name: aw[:name],
          skeleton: actionword_skeleton(aw)
        }
      } unless @diff[:signature_changed].nil?


      data[:definition_changed] = @diff[:definition_changed].map {|aw|
        {
          name: aw[:name],
          skeleton: actionword_skeleton(aw)
        }
      } unless @diff[:definition_changed].nil?

      return data
    end

    def display_summary
      command_line = @cli_options.command_line_used(exclude: [:actionwords_diff])

      unless @diff[:deleted].nil?
        puts I18n.t('actionwords_diff.summary.deleted', count: @diff[:deleted].length, command_line: command_line, list: displayable_list(@diff[:deleted]))
        puts ""
      end

      unless @diff[:created].nil?
        puts I18n.t('actionwords_diff.summary.created', count: @diff[:created].length, command_line: command_line, list: displayable_list(@diff[:created]))
        puts ""
      end

      unless @diff[:renamed].nil?
        puts I18n.t('actionwords_diff.summary.renamed', count: @diff[:renamed].length, command_line: command_line, list: displayable_list(@diff[:renamed]))
        puts ""
      end

      unless @diff[:signature_changed].nil?
        puts I18n.t('actionwords_diff.summary.signature_changed', count: @diff[:signature_changed].length, command_line: command_line, list: displayable_list(@diff[:signature_changed]))
        puts ""
      end

      unless @diff[:definition_changed].nil?
        puts I18n.t('actionwords_diff.summary.definition_changed', count: @diff[:definition_changed].length, command_line: command_line, list: displayable_list(@diff[:definition_changed]))
        puts ""
      end

      if @diff.empty?
        puts I18n.t('actionwords_diff.summary.empty')
        puts ""
      end
    end

    private

    def output(lines, add_empty_line: true)
      puts Array(lines).join("\n")
      puts "" if add_empty_line
    end

    def displayable_list(actionwords)
      actionwords.map {|c| "- #{c[:name]}"}.join("\n")
    end

    def actionword_skeleton(actionword)
      return if actionwords_group_config.nil?

      node_rendering_context = actionwords_group_config.build_node_rendering_context(actionword[:node])
      actionword[:node].render(node_rendering_context)
    end

    def display_skeletons(actionwords)
      return if actionwords.nil?

      actionwords.each do |actionword|
        output(actionword_skeleton(actionword))
      end
    end

    def actionwords_group_config
      @actionwords_group_config ||= @language_config.language_group_configs.select { |language_group_config|
        language_group_config[:group_name] == "actionwords"
      }.first
    end
  end
end