From e9bec87d1aa4b2cb2b95585e2eb094e153578623 Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Thu, 21 Apr 2022 16:15:44 +0100 Subject: [PATCH] [configTools] Make Option eq=False so cmp/hash by id --- Lib/fontTools/misc/configTools.py | 3 ++- Tests/misc/configTools_test.py | 27 ++++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/Lib/fontTools/misc/configTools.py b/Lib/fontTools/misc/configTools.py index 4a4531028..dd6c814de 100644 --- a/Lib/fontTools/misc/configTools.py +++ b/Lib/fontTools/misc/configTools.py @@ -86,7 +86,8 @@ class ConfigUnknownOptionError(ConfigError): super().__init__(f"Config option {name} is unknown") -@dataclass(frozen=True) +# eq=False because Options are unique, not fungible objects +@dataclass(frozen=True, eq=False) class Option: name: str """Unique name identifying the option (e.g. package.module:MY_OPTION).""" diff --git a/Tests/misc/configTools_test.py b/Tests/misc/configTools_test.py index bb03f2377..844688618 100644 --- a/Tests/misc/configTools_test.py +++ b/Tests/misc/configTools_test.py @@ -1,6 +1,12 @@ +import dataclasses import pytest -from fontTools.misc.configTools import AbstractConfig, Options, ConfigUnknownOptionError +from fontTools.misc.configTools import ( + AbstractConfig, + Option, + Options, + ConfigUnknownOptionError, +) def test_can_create_custom_config_system(): @@ -32,3 +38,22 @@ def test_can_create_custom_config_system(): # Test that it raises on unknown option with pytest.raises(ConfigUnknownOptionError): cfg.get("test:unknown") + + +def test_options_are_unique(): + class MyConfig(AbstractConfig): + options = Options() + + opt1 = MyConfig.register_option("test:OPT_1", "", "foo", str, any) + cfg = MyConfig({opt1: "bar"}) + assert cfg[opt1] == "bar" + + opt2 = Option("test:OPT_1", "", "foo", str, any) + + assert dataclasses.asdict(opt1) == dataclasses.asdict(opt2) + assert opt1 != opt2 + + with pytest.raises(ConfigUnknownOptionError): + cfg.get(opt2) + with pytest.raises(ConfigUnknownOptionError): + cfg.set(opt2, "bar")