tags: don't allow aliases inside *_(cosplay) tags.
Don't treat *_(cosplay) tags as being invisibly aliased when a character tag is aliased. For example, if toosaka_rin is aliased to tohsaka_rin, and toosaka_rin_(cosplay) is later added to a post, don't magically translate the tag to tohsaka_rin_(cosplay). Instead, treat it as an error to create a *_(cosplay) tag for an aliased character tag. This removes some of the complexity and magic behavior surrounding *_(cosplay) tags.
This commit is contained in:
@@ -42,7 +42,6 @@ class PostEdit
|
|||||||
def tag_names
|
def tag_names
|
||||||
tag_names = current_tag_names + effective_added_tag_names - user_removed_tag_names
|
tag_names = current_tag_names + effective_added_tag_names - user_removed_tag_names
|
||||||
tag_names = post.add_automatic_tags(tag_names)
|
tag_names = post.add_automatic_tags(tag_names)
|
||||||
tag_names = ::Tag.convert_cosplay_tags(tag_names)
|
|
||||||
tag_names += ::Tag.automatic_tags_for(tag_names)
|
tag_names += ::Tag.automatic_tags_for(tag_names)
|
||||||
tag_names += TagImplication.tags_implied_by(tag_names).map(&:name)
|
tag_names += TagImplication.tags_implied_by(tag_names).map(&:name)
|
||||||
tag_names.uniq.sort
|
tag_names.uniq.sort
|
||||||
|
|||||||
@@ -46,12 +46,13 @@ class TagNameValidator < ActiveModel::EachValidator
|
|||||||
when "new", "search", "and", "or", "not"
|
when "new", "search", "and", "or", "not"
|
||||||
record.errors.add(attribute, "'#{value}' is a reserved name and cannot be used")
|
record.errors.add(attribute, "'#{value}' is a reserved name and cannot be used")
|
||||||
when /\A(.+)_\(cosplay\)\z/i
|
when /\A(.+)_\(cosplay\)\z/i
|
||||||
# XXX don't allow aliases here?
|
tag_name = $1;
|
||||||
tag_name = TagAlias.to_aliased([$1]).first
|
char_tag = Tag.find_by_name(tag_name)
|
||||||
tag = Tag.find_by_name(tag_name)
|
|
||||||
|
|
||||||
if tag.present? && !tag.empty? && !tag.character?
|
if char_tag.present? && char_tag.antecedent_alias.present?
|
||||||
record.errors.add(attribute, "#{tag_name} must be a character tag")
|
record.errors.add(attribute, "'#{value}' is not allowed because '#{tag_name}' is aliased to '#{char_tag.antecedent_alias.consequent_name}'")
|
||||||
|
elsif char_tag.present? && !char_tag.empty? && !char_tag.character?
|
||||||
|
record.errors.add(attribute, "'#{value}' is not allowed because '#{tag_name}' is not a character tag")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -362,7 +362,7 @@ class Tag < ApplicationRecord
|
|||||||
|
|
||||||
def self.automatic_tags_for(names)
|
def self.automatic_tags_for(names)
|
||||||
tags = []
|
tags = []
|
||||||
tags += names.grep(/\A(.+)_\(cosplay\)\z/i) { TagAlias.to_aliased([$1]).first }
|
tags += names.grep(/\A(.+)_\(cosplay\)\z/i) { $1 }
|
||||||
tags << "cosplay" if names.any?(/_\(cosplay\)\z/i)
|
tags << "cosplay" if names.any?(/_\(cosplay\)\z/i)
|
||||||
tags << "school_uniform" if names.any?(/_school_uniform\z/i)
|
tags << "school_uniform" if names.any?(/_school_uniform\z/i)
|
||||||
tags << "meme" if names.any?(/_\(meme\)\z/i)
|
tags << "meme" if names.any?(/_\(meme\)\z/i)
|
||||||
@@ -370,13 +370,6 @@ class Tag < ApplicationRecord
|
|||||||
end
|
end
|
||||||
|
|
||||||
concerning :CosplayTagMethods do
|
concerning :CosplayTagMethods do
|
||||||
class_methods do
|
|
||||||
def convert_cosplay_tags(tags)
|
|
||||||
cosplay_tags, other_tags = tags.partition {|tag| tag.match(/\A(.+)_\(cosplay\)\Z/) }
|
|
||||||
cosplay_tags.grep(/\A(.+)_\(cosplay\)\Z/) { "#{TagAlias.to_aliased([$1]).first}_(cosplay)" } + other_tags
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def create_character_tag_for_cosplay_tag
|
def create_character_tag_for_cosplay_tag
|
||||||
character_name = name.delete_suffix("_(cosplay)")
|
character_name = name.delete_suffix("_(cosplay)")
|
||||||
Tag.find_or_create_by_name("char:#{character_name}")
|
Tag.find_or_create_by_name("char:#{character_name}")
|
||||||
|
|||||||
@@ -392,7 +392,6 @@ class BulkUpdateRequestTest < ActiveSupport::TestCase
|
|||||||
should "move the *_(cosplay) tag as well" do
|
should "move the *_(cosplay) tag as well" do
|
||||||
@post = create(:post, tag_string: "toosaka_rin_(cosplay)")
|
@post = create(:post, tag_string: "toosaka_rin_(cosplay)")
|
||||||
@wiki = create(:wiki_page, title: "toosaka_rin_(cosplay)")
|
@wiki = create(:wiki_page, title: "toosaka_rin_(cosplay)")
|
||||||
@ta = create(:tag_alias, antecedent_name: "toosaka_rin", consequent_name: "tohsaka_rin")
|
|
||||||
|
|
||||||
create_bur!("rename toosaka_rin -> tohsaka_rin", @admin)
|
create_bur!("rename toosaka_rin -> tohsaka_rin", @admin)
|
||||||
|
|
||||||
@@ -401,6 +400,18 @@ class BulkUpdateRequestTest < ActiveSupport::TestCase
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "when aliasing a character tag with a *_(cosplay) tag" do
|
||||||
|
should "move the *_(cosplay) tag as well" do
|
||||||
|
@post = create(:post, tag_string: "toosaka_rin_(cosplay)")
|
||||||
|
@wiki = create(:wiki_page, title: "toosaka_rin_(cosplay)")
|
||||||
|
|
||||||
|
create_bur!("alias toosaka_rin -> tohsaka_rin", @admin)
|
||||||
|
|
||||||
|
assert_equal("cosplay tohsaka_rin tohsaka_rin_(cosplay)", @post.reload.tag_string)
|
||||||
|
assert_equal("tohsaka_rin_(cosplay)", @wiki.reload.title)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
context "when renaming an artist tag with a *_(style) tag" do
|
context "when renaming an artist tag with a *_(style) tag" do
|
||||||
should "move the *_(style) tag as well" do
|
should "move the *_(style) tag as well" do
|
||||||
create(:tag, name: "tanaka_takayuki", category: Tag.categories.artist)
|
create(:tag, name: "tanaka_takayuki", category: Tag.categories.artist)
|
||||||
|
|||||||
@@ -577,7 +577,11 @@ class PostTest < ActiveSupport::TestCase
|
|||||||
@post.add_tag("jim_(cosplay)")
|
@post.add_tag("jim_(cosplay)")
|
||||||
@post.save
|
@post.save
|
||||||
|
|
||||||
assert(@post.has_tag?("james"), "expected 'jim' to be aliased to 'james'")
|
assert_equal(false, @post.has_tag?("jim_(cosplay)"))
|
||||||
|
assert_equal(false, @post.has_tag?("james_(cosplay)"))
|
||||||
|
assert_equal(false, @post.has_tag?("jim"))
|
||||||
|
assert_equal(false, @post.has_tag?("james"))
|
||||||
|
assert_match(/'jim_\(cosplay\)' is not allowed because 'jim' is aliased to 'james'/, @post.warnings.full_messages.join)
|
||||||
end
|
end
|
||||||
|
|
||||||
should "apply implications after the character tag is added" do
|
should "apply implications after the character tag is added" do
|
||||||
@@ -1213,6 +1217,7 @@ class PostTest < ActiveSupport::TestCase
|
|||||||
refute(@post.has_tag?("little_red_riding_hood"))
|
refute(@post.has_tag?("little_red_riding_hood"))
|
||||||
refute(@post.has_tag?("cosplay"))
|
refute(@post.has_tag?("cosplay"))
|
||||||
assert(@post.warnings[:base].grep(/Couldn't add tag/).present?)
|
assert(@post.warnings[:base].grep(/Couldn't add tag/).present?)
|
||||||
|
assert_match(/'little_red_riding_hood_\(cosplay\)' is not allowed because 'little_red_riding_hood' is not a character tag/, @post.warnings.full_messages.join)
|
||||||
end
|
end
|
||||||
|
|
||||||
should "allow creating a _(cosplay) tag for an empty general tag" do
|
should "allow creating a _(cosplay) tag for an empty general tag" do
|
||||||
|
|||||||
@@ -195,11 +195,13 @@ class TagTest < ActiveSupport::TestCase
|
|||||||
setup do
|
setup do
|
||||||
create(:tag, name: "bkub", category: Tag.categories.artist)
|
create(:tag, name: "bkub", category: Tag.categories.artist)
|
||||||
create(:tag, name: "fumimi", category: Tag.categories.character)
|
create(:tag, name: "fumimi", category: Tag.categories.character)
|
||||||
|
create(:tag_alias, antecedent_name: "orin", consequent_name: "kaenbyou_rin")
|
||||||
end
|
end
|
||||||
|
|
||||||
should allow_value("fumimi_(cosplay)").for(:name)
|
should allow_value("fumimi_(cosplay)").for(:name)
|
||||||
should allow_value("new_tag_(cosplay)").for(:name)
|
should allow_value("new_tag_(cosplay)").for(:name)
|
||||||
should_not allow_value("bkub_(cosplay)").for(:name)
|
should_not allow_value("bkub_(cosplay)").for(:name)
|
||||||
|
should_not allow_value("orin_(cosplay)").for(:name)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user