Sha256: 8ca1e33b5ac2d0bbbffcef57eaac5ffbad0fe93d7ec3984b7a00fdc37c333e25

Contents?: true

Size: 1.76 KB

Versions: 131

Compression:

Stored size: 1.76 KB

Contents

# frozen_string_literal: true

require_dependency "renalware/snippets"

module Renalware
  module Snippets
    class DuplicateSnippetTitleGenerator
      MAX_ATTEMPTS = 100

      attr_reader :snippet, :title_suffix
      delegate :valid?, to: :snippet

      def initialize(snippet, title_suffix: "[CLONED]")
        @snippet = snippet
        @title_suffix = title_suffix
      end

      def call
        create_unique_title_for_cloned_snippet
      end

      private

      # The snippet may have been cloned before so the title e.g. "Some title [CLONED]" may have
      # been taken. In this case keep adding numbers on to the end e.g. "Some title [CLONED] (1)"
      # until we find a unique title.
      def create_unique_title_for_cloned_snippet
        original_title = snippet.title.dup
        while_conserving_original_title do
          (0..MAX_ATTEMPTS).each do |attempt|
            snippet.title = build_snippet_title(original_title, attempt)
            break if valid?
          end
          report_error unless valid?
        end
      end

      def while_conserving_original_title
        original_title = snippet.title
        yield
        new_title = snippet.title
        snippet.title = original_title
        new_title
      end

      def build_snippet_title(original_title, current_attempt_number = 0)
        title = "#{original_title} #{title_suffix}"
        title += " (#{current_attempt_number})" if current_attempt_number > 0
        title
      end

      class InvalidSnippetTitleError < ::StandardError
      end

      def report_error
        raise InvalidSnippetTitleError,
              "Tried #{MAX_ATTEMPTS} times to construct a new snippet title. Got to "\
              "'#{snippet.title}' but the title is still not unique."
      end
    end
  end
end

Version data entries

131 entries across 131 versions & 1 rubygems

Version Path
renalware-core-2.0.149 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.148 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.147 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.146 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.145 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.144 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.143 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.142 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.141 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.140 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.139 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.138 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.137 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.136 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.135 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.134 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.133 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.132 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.131 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.130 app/models/renalware/snippets/duplicate_snippet_title_generator.rb