Sha256: 6c3dbed2a99be1eb8a586b7b76e17a3fd590fae69682f73ee7bf0328d2f57431

Contents?: true

Size: 1.73 KB

Versions: 28

Compression:

Stored size: 1.73 KB

Contents

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

28 entries across 28 versions & 1 rubygems

Version Path
renalware-core-2.0.8 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.7 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.5 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.4 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.3 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.2 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.1 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.0 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.0.pre.rc13 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.0.pre.rc11 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.0.pre.rc10 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.0.pre.rc9 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.0.pre.rc8 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.0.pre.rc7 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.0.pre.rc6 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.0.pre.rc5 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.0.pre.rc4 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.0.pre.rc3 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.0.pre.rc1 app/models/renalware/snippets/duplicate_snippet_title_generator.rb
renalware-core-2.0.0.pre.beta12 app/models/renalware/snippets/duplicate_snippet_title_generator.rb