diff --git a/app/services/project_identifiers/classic_identifier_suggestion_generator.rb b/app/services/project_identifiers/classic_identifier_suggestion_generator.rb index ca74eea1687..13ddc5e7103 100644 --- a/app/services/project_identifiers/classic_identifier_suggestion_generator.rb +++ b/app/services/project_identifiers/classic_identifier_suggestion_generator.rb @@ -67,8 +67,12 @@ module ProjectIdentifiers private + BLANK_SLUG_SUBSTITUTIONS = { "." => "dot", "!" => "bang" }.freeze + def slugify(name) - name.to_url.first(Projects::Identifier::CLASSIC_IDENTIFIER_MAX_LENGTH).presence + slug = name.to_url.first(Projects::Identifier::CLASSIC_IDENTIFIER_MAX_LENGTH).presence + slug ||= BLANK_SLUG_SUBSTITUTIONS[name] + slug if slug && Projects::Identifier::CLASSIC_IDENTIFIER_FORMAT.match?(slug) end def fallback_base diff --git a/spec/services/project_identifiers/classic_identifier_suggestion_generator_spec.rb b/spec/services/project_identifiers/classic_identifier_suggestion_generator_spec.rb index c1d10096c18..44105a356d6 100644 --- a/spec/services/project_identifiers/classic_identifier_suggestion_generator_spec.rb +++ b/spec/services/project_identifiers/classic_identifier_suggestion_generator_spec.rb @@ -63,6 +63,14 @@ RSpec.describe ProjectIdentifiers::ClassicIdentifierSuggestionGenerator do it "falls back to a randomised project-XXXXXX identifier" do expect(described_class.new.suggest_identifier("!!!")).to match(/\Aproject-[a-z0-9]{5}\z/) end + + it "maps '.' to 'dot'" do + expect(described_class.new.suggest_identifier(".")).to eq("dot") + end + + it "maps '!' to 'bang'" do + expect(described_class.new.suggest_identifier("!")).to eq("bang") + end end context "when the name is all-numeric" do