From b67a698c99adc6347ebc43d8e40d8f3ff3f6c665 Mon Sep 17 00:00:00 2001 From: "Allen D. Householder" Date: Thu, 18 Sep 2025 13:10:15 -0400 Subject: [PATCH 1/2] we don't need NS_PATTERN as a compiled regex, we can just use NS_PATTERN_STR everywhere to make life easier --- src/ssvc/namespaces.py | 25 +++++++++++++++++++++++-- src/ssvc/utils/field_specs.py | 4 ++-- src/ssvc/utils/patterns.py | 4 ---- src/test/test_namespaces.py | 10 +++++----- src/test/test_namespaces_pattern.py | 4 ++-- src/test/test_selections.py | 4 ++-- 6 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/ssvc/namespaces.py b/src/ssvc/namespaces.py index 01f1834e..22cc48e0 100644 --- a/src/ssvc/namespaces.py +++ b/src/ssvc/namespaces.py @@ -4,6 +4,7 @@ stakeholders or analytical category sources. This module defines the official namespaces for SSVC and provides a method to validate namespace values. """ + # Copyright (c) 2025 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. @@ -23,10 +24,30 @@ # subject to its own license. # DM24-0278 +import re from enum import StrEnum from ssvc.utils.defaults import MAX_NS_LENGTH, MIN_NS_LENGTH, X_PFX -from ssvc.utils.patterns import NS_PATTERN +from ssvc.utils.patterns import NS_PATTERN_STR + +# Copyright (c) 2025 Carnegie Mellon University. +# NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE +# ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. +# CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, +# EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT +# NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR +# MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE +# OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE +# ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM +# PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT. +# Licensed under a MIT (SEI)-style license, please see LICENSE or contact +# permission@sei.cmu.edu for full terms. +# [DISTRIBUTION STATEMENT A] This material has been approved for +# public release and unlimited distribution. Please see Copyright notice +# for non-US Government use and distribution. +# This Software includes and/or makes use of Third-Party Software each +# subject to its own license. +# DM24-0278 EXT_SEP = "/" FRAG_SEP = "#" @@ -86,7 +107,7 @@ def validate(cls, value: str) -> str: ValueError: if the value is not a valid namespace """ - valid = NS_PATTERN.match(value) + valid = re.match(NS_PATTERN_STR, value) if valid: # pattern matches, so we can proceed with further checks diff --git a/src/ssvc/utils/field_specs.py b/src/ssvc/utils/field_specs.py index 849c23fb..25295c78 100644 --- a/src/ssvc/utils/field_specs.py +++ b/src/ssvc/utils/field_specs.py @@ -27,7 +27,7 @@ from pydantic import Field from ssvc.utils.defaults import MAX_NS_LENGTH, MIN_NS_LENGTH -from ssvc.utils.patterns import NS_PATTERN, VERSION_PATTERN +from ssvc.utils.patterns import NS_PATTERN_STR, VERSION_PATTERN VersionString = Annotated[ str, @@ -50,7 +50,7 @@ "x_example.test#test//.example.test#private-extension", "ssvc/de-DE/.example.organization#reference-arch-1", ], - pattern=NS_PATTERN.pattern, + pattern=NS_PATTERN_STR, min_length=MIN_NS_LENGTH, max_length=MAX_NS_LENGTH, ), diff --git a/src/ssvc/utils/patterns.py b/src/ssvc/utils/patterns.py index f964e938..0580e608 100644 --- a/src/ssvc/utils/patterns.py +++ b/src/ssvc/utils/patterns.py @@ -22,8 +22,6 @@ # subject to its own license. # DM24-0278 -import re - # from https://semver.org/ VERSION_PATTERN = r"^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$" """A regular expression pattern for semantic versioning (semver).""" @@ -81,5 +79,3 @@ # --- Combine all parts into the full namespace pattern --- NS_PATTERN_STR = rf"^{namespace}$" - -NS_PATTERN = re.compile(NS_PATTERN_STR) diff --git a/src/test/test_namespaces.py b/src/test/test_namespaces.py index c7d5dca5..9a66e4b3 100644 --- a/src/test/test_namespaces.py +++ b/src/test/test_namespaces.py @@ -16,11 +16,11 @@ # This Software includes and/or makes use of Third-Party Software each # subject to its own license. # DM24-0278 - +import re import unittest from ssvc.namespaces import NameSpace, RESERVED_NS -from ssvc.utils.patterns import NS_PATTERN +from ssvc.utils.patterns import NS_PATTERN_STR class MyTestCase(unittest.TestCase): @@ -41,7 +41,7 @@ def test_ns_pattern(self): for ns in should_match: with self.subTest(ns=ns): - self.assertTrue(NS_PATTERN.match(ns), ns) + self.assertTrue(re.match(NS_PATTERN_STR, ns), ns) should_not_match = [ "", @@ -62,8 +62,8 @@ def test_ns_pattern(self): failures = [] for ns in should_not_match: with self.subTest(ns=ns): - # re.search() to catch if NS_PATTERN is not anchored at start - match = NS_PATTERN.search(ns) + # re.search() to catch if NS_PATTERN_STR is not anchored at start + match = re.search(NS_PATTERN_STR, ns) if match: failures.append( f"Unexpected match for '{ns}': {match.group(0)}" diff --git a/src/test/test_namespaces_pattern.py b/src/test/test_namespaces_pattern.py index 981893aa..d105f3fb 100644 --- a/src/test/test_namespaces_pattern.py +++ b/src/test/test_namespaces_pattern.py @@ -27,7 +27,7 @@ BASE_PATTERN, EXT_SEGMENT_PATTERN, LENGTH_CHECK_PATTERN, - NS_PATTERN, + NS_PATTERN_STR, ) logger = logging.getLogger(__name__) @@ -98,7 +98,7 @@ def setUp(self): def test_ns_pattern(self): self._test_successes_failures( - NS_PATTERN.pattern, self.expect_fail, self.expect_success + NS_PATTERN_STR, self.expect_fail, self.expect_success ) def test_base_pattern(self): diff --git a/src/test/test_selections.py b/src/test/test_selections.py index f734f242..bc6977d0 100644 --- a/src/test/test_selections.py +++ b/src/test/test_selections.py @@ -23,7 +23,7 @@ from ssvc import selection from ssvc.selection import MinimalDecisionPointValue, SelectionList -from ssvc.utils.patterns import NS_PATTERN, VERSION_PATTERN +from ssvc.utils.patterns import NS_PATTERN_STR, VERSION_PATTERN class MyTestCase(unittest.TestCase): @@ -61,7 +61,7 @@ def test_minimal_selection_init(self): self.assertIsInstance(self.s1.namespace, str) self.assertRegex( self.s1.namespace, - NS_PATTERN, + NS_PATTERN_STR, "Namespace does not match the required pattern", ) From b575db625a5bf97ec415e6b56614cce2f828bf39 Mon Sep 17 00:00:00 2001 From: "Allen D. Householder" Date: Thu, 18 Sep 2025 13:20:08 -0400 Subject: [PATCH 2/2] remove duplicate copyright --- src/ssvc/namespaces.py | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/src/ssvc/namespaces.py b/src/ssvc/namespaces.py index 22cc48e0..017f0aa1 100644 --- a/src/ssvc/namespaces.py +++ b/src/ssvc/namespaces.py @@ -4,7 +4,6 @@ stakeholders or analytical category sources. This module defines the official namespaces for SSVC and provides a method to validate namespace values. """ - # Copyright (c) 2025 Carnegie Mellon University. # NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE # ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. @@ -30,25 +29,6 @@ from ssvc.utils.defaults import MAX_NS_LENGTH, MIN_NS_LENGTH, X_PFX from ssvc.utils.patterns import NS_PATTERN_STR -# Copyright (c) 2025 Carnegie Mellon University. -# NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE -# ENGINEERING INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. -# CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, -# EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT -# NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR -# MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE -# OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE -# ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM -# PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT. -# Licensed under a MIT (SEI)-style license, please see LICENSE or contact -# permission@sei.cmu.edu for full terms. -# [DISTRIBUTION STATEMENT A] This material has been approved for -# public release and unlimited distribution. Please see Copyright notice -# for non-US Government use and distribution. -# This Software includes and/or makes use of Third-Party Software each -# subject to its own license. -# DM24-0278 - EXT_SEP = "/" FRAG_SEP = "#"