QutBioacoustics/baw-server

View on GitHub
app/modules/namey_wamey.rb

Summary

Maintainability
A
3 hrs
Test Coverage
# frozen_string_literal: true

class NameyWamey
  class << self
    # Suggest a file name based on audio recording, start and end offsets, extra options and extension.
    # @param [AudioRecording] audio_recording
    # @param [float] start_offset
    # @param [float] end_offset
    # @param [Hash,string] extra_options
    # @param [string] extension
    # @return [string] suggested file name
    def create_audio_recording_name(audio_recording, start_offset, end_offset, extra_options = '', extension = '')
      start_offset_float = start_offset.to_f
      end_offset_float = end_offset.to_f
      abs_start = audio_recording[:recorded_date].dup.advance(seconds: start_offset_float).strftime('%Y%m%d_%H%M%S')
      duration = end_offset_float - start_offset_float

      site = if audio_recording.is_a?(Hash)
               audio_recording[:site]
             else
               audio_recording.site
             end

      if site.is_a?(Hash)
        site_name = site[:name].gsub(' ', '_')
        site_id = site[:id].to_s
      else
        site_name = site.name.gsub(' ', '_')
        site_id = site.id.to_s
      end

      build_name([site_name, site_id, audio_recording[:id], abs_start, duration], extra_options, extension)
    end

    # Suggest a file name based on project, extra options and extension.
    # @param [Project] project
    # @param [Hash,string] extra_options
    # @param [string] extension
    # @return [string] suggested file name
    def create_project_name(project, extra_options = '', extension = '')
      if project.is_a?(Hash)
        id = project[:id]
        name = project[:name]
      else
        id = project.id
        name = project.name
      end

      build_name([name, id], extra_options, extension)
    end

    # Suggest a file name based on project, site, extra options and extension.
    # @param [Project] project
    # @param [Site] site
    # @param [Hash,string] extra_options
    # @param [string] extension
    # @return [string] suggested file name
    def create_site_name(project, site, extra_options = '', extension = '')
      if project.is_a?(Hash)
        project_id = project[:id]
        project_name = project[:name]
      else
        project_id = project.id
        project_name = project.name
      end

      if site.is_a?(Hash)
        site_id = site[:id]
        site_name = site[:name]
      else
        site_id = site.id
        site_name = site.name
      end

      build_name([project_name, project_id, site_name, site_id], extra_options, extension)
    end

    # Suggest a file name based on user, extra options and extension.
    # @param [User] user
    # @param [Hash,string] extra_options
    # @param [string] extension
    # @return [string] suggested file name
    def create_user_name(user, extra_options = '', extension = '')
      if user.is_a?(Hash)
        user_id = user[:id]
        user_name = user[:name]
      else
        user_id = user.id
        user_name = user.user_name
      end

      build_name([user_name, user_id], extra_options, extension)
    end

    def trim(string_value, chars_to_replace, char_to_insert)
      string_value.to_s.gsub(/^[#{chars_to_replace}]+|[#{chars_to_replace}]+$/, char_to_insert)
    end

    private

    def get_extra_options(extra_options)
      extra_options_formatted = ''
      case extra_options
      when Hash
        extra_options.each_pair do |_key, value|
          extra_options_formatted = value.to_s if extra_options_formatted.blank?
          extra_options_formatted = "#{extra_options_formatted}_#{value}" unless extra_options_formatted.blank?
        end
      when Array
        extra_options.each do |value|
          extra_options_formatted = value.to_s if extra_options_formatted.blank?
          extra_options_formatted = "#{extra_options_formatted}_#{value}" unless extra_options_formatted.blank?
        end
      else
        extra_options_formatted = extra_options
      end
      extra_options_formatted.empty? ? extra_options_formatted : "_#{extra_options_formatted}"
    end

    def build_name(standard, extra, extension)
      name = standard.join('_') + get_extra_options(extra)
      name_parameterize = name.parameterize(separator: '_')

      "#{name_parameterize}.#{extension.trim('.', '').parameterize(separator: '_')}"
    end
  end
end