From 23f5af62c2141cce271df6e935a4d38521979465 Mon Sep 17 00:00:00 2001 From: Tom Mitchell Date: Wed, 5 Aug 2026 11:01:02 -0400 Subject: [PATCH 01/11] Constrain `packaging` version to `<26.1` Create a short term fix to keep using `NegativeInfinity`. #449 --- CHANGELOG.md | 13 +++++++++++++ setup.py | 4 +++- 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..7708862 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,13 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +### Changed + +- Constrain `packaging` version to `<26.1` to keep using `NegativeInfinity`. + [449](https://github.com/SynBioDex/pySBOL2/issues/449) diff --git a/setup.py b/setup.py index 4a9faa0..b901b09 100644 --- a/setup.py +++ b/setup.py @@ -36,7 +36,9 @@ 'lxml', 'requests', 'urllib3', - 'packaging>=20.0' + # As of August 2026 the code is incompatible with packaging >= 26.1 + # https://github.com/SynBioDex/pySBOL2/issues/450 + 'packaging<26.1' ], package_data={'sbol2': ['libSBOLj.jar']}, tests_require=[ From e184eb988c912337ab1673c9dde7658aaf2159a8 Mon Sep 17 00:00:00 2001 From: Tom Mitchell Date: Wed, 5 Aug 2026 11:29:32 -0400 Subject: [PATCH 02/11] Update GitHub workflow action versions Update from v2 to v7 for checkout and setup-python. #449 --- .github/workflows/python-package.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index ef5d65d..efeb905 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -27,11 +27,13 @@ jobs: - os: windows-latest python-version: 3.x steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v7 + # https://github.com/actions/checkout with: submodules: 'recursive' - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 + # https://github.com/actions/setup-python + uses: actions/setup-python@v7 with: python-version: ${{ matrix.python-version }} - name: Install dependencies From d4d1f9843c8f11d102ae27135047b8b48e15aac9 Mon Sep 17 00:00:00 2001 From: Tom Mitchell Date: Wed, 5 Aug 2026 11:35:46 -0400 Subject: [PATCH 03/11] Skip more tests if SynBioHub password is not available #449 --- test/test_partshop.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/test/test_partshop.py b/test/test_partshop.py index f56e231..d849c1c 100644 --- a/test/test_partshop.py +++ b/test/test_partshop.py @@ -23,6 +23,8 @@ class TestPartShop(unittest.TestCase): + + @unittest.skipIf(password is None, "No SynBioHub password supplied") def test_pull_00(self): # Based on tutorial: https://pysbol2.readthedocs.io/en/latest/repositories.html doc = sbol.Document() @@ -33,6 +35,7 @@ def test_pull_00(self): # print(obj) self.assertEqual(3, len(doc)) + @unittest.skipIf(password is None, "No SynBioHub password supplied") def test_pull_01(self): # Based on tutorial: https://pysbol2.readthedocs.io/en/latest/repositories.html doc = sbol.Document() @@ -45,6 +48,7 @@ def test_pull_01(self): # print(obj) self.assertEqual(7, len(doc)) + @unittest.skipIf(password is None, "No SynBioHub password supplied") def test_pull_02(self): # I don't know what this adds over test_pull_01 # This is a replacement for a previous test whose part was no @@ -73,7 +77,7 @@ def test_login_bad(self): self.assertEqual(sbol_error.error_code(), sbol.SBOLErrorCode.SBOL_ERROR_BAD_HTTP_REQUEST) - @unittest.skipIf(password is None, "No password supplied") + @unittest.skipIf(password is None, "No SynBioHub password supplied") def test_submit_00(self): RESOURCE = 'https://synbiohub.utah.edu' doc = sbol.Document() @@ -148,7 +152,7 @@ def test_spoof(self): part_shop.spoof(spoofed_url) self.assertEqual(part_shop.getSpoofedURL(), spoofed_url) - @unittest.skipIf(password is None, "No password supplied") + @unittest.skipIf(password is None, "No SynBioHub password supplied") def test_submit(self): # This test is derived from an etl-to-synbiohub_pipeline test # case that was failing. @@ -217,7 +221,7 @@ def test_uri2url_spoofed(self): else: self.fail('Expected SBOLError') - @unittest.skipIf(password is None, "No password supplied") + @unittest.skipIf(password is None, "No SynBioHub password supplied") def test_attach_file(self): sbol2.Config.setOption('sbol_typed_uris', False) doc = sbol2.Document() @@ -267,6 +271,7 @@ def test_attach_file(self): e = cm.exception self.assertEqual(e.error_code(), sbol2.SBOLErrorCode.SBOL_ERROR_NOT_FOUND) + @unittest.skipIf(password is None, "No SynBioHub password supplied") def test_search_general(self): sbh = sbol2.PartShop(TEST_RESOURCE_MAIN) # sbh.login(username, password) @@ -277,6 +282,7 @@ def test_search_general(self): self.assertTrue(all([isinstance(x, sbol2.Identified) for x in results])) + @unittest.skipIf(password is None, "No SynBioHub password supplied") def test_search_general_offset_limit(self): # Test a general search using offset and limit # This comes from a documentation example that was failing @@ -294,6 +300,7 @@ def test_search_general_offset_limit(self): self.assertTrue(all([isinstance(x, sbol2.Identified) for x in results])) + @unittest.skipIf(password is None, "No SynBioHub password supplied") def test_search_exact(self): igem = sbol.PartShop(TEST_RESOURCE_MAIN) limit = 10 @@ -314,6 +321,7 @@ def test_search_exact(self): for cd in doc.componentDefinitions: self.assertIn(sbol2.SO_PROMOTER, cd.roles) + @unittest.skipIf(password is None, "No SynBioHub password supplied") def test_pull_doc_version(self): # After a pull the document version was erroneously set to None (#281) doc = sbol.Document() @@ -325,6 +333,7 @@ def test_pull_doc_version(self): self.assertIsNotNone(doc.version) self.assertEqual(old_version, doc.version) + @unittest.skipIf(password is None, "No SynBioHub password supplied") def test_search_count(self): part_shop = sbol2.PartShop('https://synbiohub.org/public/igem') # searchCount did not exist, see #322 From 9638a362c0c13a72d6efc433fcd2732cc5c59176 Mon Sep 17 00:00:00 2001 From: Tom Mitchell Date: Wed, 5 Aug 2026 11:44:10 -0400 Subject: [PATCH 04/11] Update more partshop unit tests #449 --- test/test_partshop.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/test_partshop.py b/test/test_partshop.py index d849c1c..92d9cb3 100644 --- a/test/test_partshop.py +++ b/test/test_partshop.py @@ -1,6 +1,8 @@ import os import unittest import json +from http import HTTPStatus + import requests import sbol2 as sbol @@ -66,7 +68,8 @@ def test_login(self): # depending on what site you're accessing igem = sbol.PartShop(TEST_RESOURCE_MAIN) response = igem.login('johndoe@example.org', 'test') - self.assertEqual(response.status_code, 200) + # As of August 2026 we get Forbidden as a response. + self.assertIn(response.status_code, [HTTPStatus.OK, HTTPStatus.FORBIDDEN]) def test_login_bad(self): igem = sbol.PartShop(TEST_RESOURCE_MAIN) @@ -90,6 +93,7 @@ def test_submit_00(self): response = ps.submit(doc, overwrite=1) self.assertEqual(response.status_code, 200) + @unittest.skip("SynBioHub no longer allows this kind of anonymous access") def test_sparqlQuery_00(self): ps = sbol.PartShop(TEST_RESOURCE_MAIN) response = ps.login('johndoe', 'test') From 6d45c4dacfbaa34f5da82c6cca11a49835bf9754 Mon Sep 17 00:00:00 2001 From: Tom Mitchell Date: Wed, 5 Aug 2026 11:48:00 -0400 Subject: [PATCH 05/11] Reduce the number of builds during testing #449 --- .github/workflows/python-package.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index efeb905..19efdc2 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -19,13 +19,14 @@ jobs: matrix: # Default builds are on Ubuntu os: [ubuntu-latest] - python-version: ['3.9', '3.10', '3.11', '3.12', '3.13', 'pypy-3.10'] - include: - # Also test on macOS and Windows using latest Python 3 - - os: macos-latest - python-version: 3.x - - os: windows-latest - python-version: 3.x +# python-version: ['3.9', '3.10', '3.11', '3.12', '3.13', 'pypy-3.10'] + python-version: ['3.14'] +# include: +# # Also test on macOS and Windows using latest Python 3 +# - os: macos-latest +# python-version: 3.x +# - os: windows-latest +# python-version: 3.x steps: - uses: actions/checkout@v7 # https://github.com/actions/checkout From 4982cf475ba1a42ea299cdafc194768682095cde Mon Sep 17 00:00:00 2001 From: Tom Mitchell Date: Wed, 5 Aug 2026 11:48:45 -0400 Subject: [PATCH 06/11] Skip test_login for partshop SynBioHub has changed, this will need an update later. #449 --- test/test_partshop.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/test_partshop.py b/test/test_partshop.py index 92d9cb3..a75b5d0 100644 --- a/test/test_partshop.py +++ b/test/test_partshop.py @@ -63,13 +63,14 @@ def test_pull_02(self): # print(obj) self.assertEqual(1, len(doc)) + @unittest.skip("SynBioHub no longer allows this kind of anonymous access") def test_login(self): # NOTE: Add /login because login pages may be different # depending on what site you're accessing igem = sbol.PartShop(TEST_RESOURCE_MAIN) response = igem.login('johndoe@example.org', 'test') # As of August 2026 we get Forbidden as a response. - self.assertIn(response.status_code, [HTTPStatus.OK, HTTPStatus.FORBIDDEN]) + self.assertEqual(response.status_code, 200) def test_login_bad(self): igem = sbol.PartShop(TEST_RESOURCE_MAIN) From 3b5dd15ec9f77a9943e36a7c7f23ed18ef8f9c2b Mon Sep 17 00:00:00 2001 From: Tom Mitchell Date: Wed, 5 Aug 2026 11:56:52 -0400 Subject: [PATCH 07/11] Skip more SynBioHub-related tests #449 --- test/test_searchquery.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/test/test_searchquery.py b/test/test_searchquery.py index 61c09b5..1378732 100644 --- a/test/test_searchquery.py +++ b/test/test_searchquery.py @@ -1,3 +1,4 @@ +import os import unittest import sbol2 @@ -5,6 +6,15 @@ GSOC_SBH_URL = 'https://synbiohub.org' +if 'SBH_USER' in os.environ: + username = os.environ['SBH_USER'] +else: + username = None +if 'SBH_PASSWORD' in os.environ: + password = os.environ['SBH_PASSWORD'] +else: + password = None + class TestSearchQuery(unittest.TestCase): @@ -14,6 +24,7 @@ def test_search_query1(self): self.assertIn(sbol2.SBOL_TYPES, query.properties) self.assertEqual(sbol2.BIOPAX_DNA, query[sbol2.SBOL_TYPES]) + @unittest.skipIf(password is None, "No SynBioHub password supplied") def test_gsoc_example_1_title(self): # See issue #240 collection = 'https://synbiohub.org/public/igem/igem_collection/1' @@ -34,6 +45,7 @@ def test_gsoc_example_1_title(self): names = [r.name == title for r in response] self.assertTrue(all(names)) + @unittest.skipIf(password is None, "No SynBioHub password supplied") def test_gsoc_example_1_display_id(self): # See issue #240 collection = 'https://synbiohub.org/public/igem/igem_collection/1' @@ -76,6 +88,7 @@ def do_gsoc_search(self, collection, term): results.extend(self.gsoc_search_display_id(part_shop, collection, term)) return results + @unittest.skipIf(password is None, "No SynBioHub password supplied") def test_gsoc_example_2(self): # Looking for: https://synbiohub.org/public/igem/BBa_R0010/1 # and/or https://synbiohub.org/public/igem/BBa_C0012/1 @@ -93,6 +106,7 @@ def test_gsoc_example_2(self): self.assertNotIn('https://synbiohub.org/public/igem/BBa_S03334/1', identities) self.assertNotIn('https://synbiohub.org/public/igem/BBa_K1444015/1', identities) + @unittest.skipIf(password is None, "No SynBioHub password supplied") def test_gsoc_example_3(self): # Looking for: https://synbiohub.org/public/igem/BBa_R0010/1 # Collection: https://synbiohub.org/public/igem/igem_collection/1 @@ -107,6 +121,7 @@ def test_gsoc_example_3(self): self.assertNotIn('https://synbiohub.org/public/igem/BBa_S03334/1', identities) self.assertNotIn('https://synbiohub.org/public/igem/BBa_K1444015/1', identities) + @unittest.skipIf(password is None, "No SynBioHub password supplied") def test_gsoc_example_4(self): # Looking for: https://synbiohub.org/public/igem/BBa_B0034/1 # Collection: https://synbiohub.org/public/igem/igem_collection/1 @@ -119,6 +134,7 @@ def test_gsoc_example_4(self): self.assertIn('https://synbiohub.org/public/igem/BBa_B0034/1', identities) self.assertNotIn('https://synbiohub.org/public/igem/BBa_I13617/1', identities) + @unittest.skipIf(password is None, "No SynBioHub password supplied") def test_gsoc_example_5(self): # Looking for: https://synbiohub.org/public/bsu/BO_28874/1 # Collection: https://synbiohub.org/public/bsu/bsu_collection/1 @@ -132,6 +148,7 @@ def test_gsoc_example_5(self): self.assertIn('https://synbiohub.org/public/bsu/BO_28874/1', identities) self.assertNotIn('https://synbiohub.org/public/bsu/BO_26604/1', identities) + @unittest.skipIf(password is None, "No SynBioHub password supplied") def test_gsoc_count_5(self): part_shop = sbol2.PartShop(GSOC_SBH_URL) query = sbol2.SearchQuery() From a753c636286270506ba5744e404e7627a99d9b6a Mon Sep 17 00:00:00 2001 From: Tom Mitchell Date: Wed, 5 Aug 2026 12:00:46 -0400 Subject: [PATCH 08/11] Skip another SynBioHub-related test #449 --- test/test_tutorial.py | 1 + 1 file changed, 1 insertion(+) diff --git a/test/test_tutorial.py b/test/test_tutorial.py index dae7f0b..f865a96 100644 --- a/test/test_tutorial.py +++ b/test/test_tutorial.py @@ -119,6 +119,7 @@ def create_new_device(self, doc: sbol2.Document): my_device.compile() self.assertEqual(expected_sequence, my_device.sequence.elements) + @unittest.skip("SynBioHub no longer allows anonymous access") def test_tutorial(self): doc = self.init_tutorial() self.get_device_from_xml(doc) From 733e9a492563b2275af96f3487856a2567a7330a Mon Sep 17 00:00:00 2001 From: Tom Mitchell Date: Wed, 5 Aug 2026 12:11:27 -0400 Subject: [PATCH 09/11] Update Python version limits Require >=3.11 and update Python version build list. #449 --- .github/workflows/python-package.yml | 15 +++++++-------- setup.py | 2 +- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 19efdc2..d1beb78 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -19,14 +19,13 @@ jobs: matrix: # Default builds are on Ubuntu os: [ubuntu-latest] -# python-version: ['3.9', '3.10', '3.11', '3.12', '3.13', 'pypy-3.10'] - python-version: ['3.14'] -# include: -# # Also test on macOS and Windows using latest Python 3 -# - os: macos-latest -# python-version: 3.x -# - os: windows-latest -# python-version: 3.x + python-version: ['3.11', '3.12', '3.13', '3.14', 'pypy-3.11'] + include: + # Also test on macOS and Windows using latest Python 3 + - os: macos-latest + python-version: 3.x + - os: windows-latest + python-version: 3.x steps: - uses: actions/checkout@v7 # https://github.com/actions/checkout diff --git a/setup.py b/setup.py index b901b09..057b8dd 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup(name='sbol2', version='1.5', description='Pure Python implementation of SBOL 2 standard', - python_requires='>=3.7', + python_requires='>=3.11', url='https://github.com/SynBioDex/pySBOL2', author='Bryan Bartley', author_email='editors@sbolstandard.org', From 7d0a409c516d20164c1f6580ad3aa6230bc58eb8 Mon Sep 17 00:00:00 2001 From: Tom Mitchell Date: Wed, 5 Aug 2026 12:33:41 -0400 Subject: [PATCH 10/11] Annotate skipped SynBioHub tests for later work #449 --- test/test_partshop.py | 12 ++++++++++-- test/test_searchquery.py | 7 +++++++ test/test_tutorial.py | 1 + 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/test/test_partshop.py b/test/test_partshop.py index a75b5d0..119f6a3 100644 --- a/test/test_partshop.py +++ b/test/test_partshop.py @@ -1,7 +1,6 @@ import os import unittest import json -from http import HTTPStatus import requests @@ -26,6 +25,7 @@ class TestPartShop(unittest.TestCase): + # https://github.com/SynBioDex/pySBOL2/issues/451 @unittest.skipIf(password is None, "No SynBioHub password supplied") def test_pull_00(self): # Based on tutorial: https://pysbol2.readthedocs.io/en/latest/repositories.html @@ -37,6 +37,7 @@ def test_pull_00(self): # print(obj) self.assertEqual(3, len(doc)) + # https://github.com/SynBioDex/pySBOL2/issues/451 @unittest.skipIf(password is None, "No SynBioHub password supplied") def test_pull_01(self): # Based on tutorial: https://pysbol2.readthedocs.io/en/latest/repositories.html @@ -50,6 +51,7 @@ def test_pull_01(self): # print(obj) self.assertEqual(7, len(doc)) + # https://github.com/SynBioDex/pySBOL2/issues/451 @unittest.skipIf(password is None, "No SynBioHub password supplied") def test_pull_02(self): # I don't know what this adds over test_pull_01 @@ -63,13 +65,13 @@ def test_pull_02(self): # print(obj) self.assertEqual(1, len(doc)) + # https://github.com/SynBioDex/pySBOL2/issues/451 @unittest.skip("SynBioHub no longer allows this kind of anonymous access") def test_login(self): # NOTE: Add /login because login pages may be different # depending on what site you're accessing igem = sbol.PartShop(TEST_RESOURCE_MAIN) response = igem.login('johndoe@example.org', 'test') - # As of August 2026 we get Forbidden as a response. self.assertEqual(response.status_code, 200) def test_login_bad(self): @@ -94,6 +96,7 @@ def test_submit_00(self): response = ps.submit(doc, overwrite=1) self.assertEqual(response.status_code, 200) + # https://github.com/SynBioDex/pySBOL2/issues/451 @unittest.skip("SynBioHub no longer allows this kind of anonymous access") def test_sparqlQuery_00(self): ps = sbol.PartShop(TEST_RESOURCE_MAIN) @@ -276,6 +279,7 @@ def test_attach_file(self): e = cm.exception self.assertEqual(e.error_code(), sbol2.SBOLErrorCode.SBOL_ERROR_NOT_FOUND) + # https://github.com/SynBioDex/pySBOL2/issues/451 @unittest.skipIf(password is None, "No SynBioHub password supplied") def test_search_general(self): sbh = sbol2.PartShop(TEST_RESOURCE_MAIN) @@ -287,6 +291,7 @@ def test_search_general(self): self.assertTrue(all([isinstance(x, sbol2.Identified) for x in results])) + # https://github.com/SynBioDex/pySBOL2/issues/451 @unittest.skipIf(password is None, "No SynBioHub password supplied") def test_search_general_offset_limit(self): # Test a general search using offset and limit @@ -305,6 +310,7 @@ def test_search_general_offset_limit(self): self.assertTrue(all([isinstance(x, sbol2.Identified) for x in results])) + # https://github.com/SynBioDex/pySBOL2/issues/451 @unittest.skipIf(password is None, "No SynBioHub password supplied") def test_search_exact(self): igem = sbol.PartShop(TEST_RESOURCE_MAIN) @@ -326,6 +332,7 @@ def test_search_exact(self): for cd in doc.componentDefinitions: self.assertIn(sbol2.SO_PROMOTER, cd.roles) + # https://github.com/SynBioDex/pySBOL2/issues/451 @unittest.skipIf(password is None, "No SynBioHub password supplied") def test_pull_doc_version(self): # After a pull the document version was erroneously set to None (#281) @@ -338,6 +345,7 @@ def test_pull_doc_version(self): self.assertIsNotNone(doc.version) self.assertEqual(old_version, doc.version) + # https://github.com/SynBioDex/pySBOL2/issues/451 @unittest.skipIf(password is None, "No SynBioHub password supplied") def test_search_count(self): part_shop = sbol2.PartShop('https://synbiohub.org/public/igem') diff --git a/test/test_searchquery.py b/test/test_searchquery.py index 1378732..77e1ef6 100644 --- a/test/test_searchquery.py +++ b/test/test_searchquery.py @@ -24,6 +24,7 @@ def test_search_query1(self): self.assertIn(sbol2.SBOL_TYPES, query.properties) self.assertEqual(sbol2.BIOPAX_DNA, query[sbol2.SBOL_TYPES]) + # https://github.com/SynBioDex/pySBOL2/issues/451 @unittest.skipIf(password is None, "No SynBioHub password supplied") def test_gsoc_example_1_title(self): # See issue #240 @@ -45,6 +46,7 @@ def test_gsoc_example_1_title(self): names = [r.name == title for r in response] self.assertTrue(all(names)) + # https://github.com/SynBioDex/pySBOL2/issues/451 @unittest.skipIf(password is None, "No SynBioHub password supplied") def test_gsoc_example_1_display_id(self): # See issue #240 @@ -88,6 +90,7 @@ def do_gsoc_search(self, collection, term): results.extend(self.gsoc_search_display_id(part_shop, collection, term)) return results + # https://github.com/SynBioDex/pySBOL2/issues/451 @unittest.skipIf(password is None, "No SynBioHub password supplied") def test_gsoc_example_2(self): # Looking for: https://synbiohub.org/public/igem/BBa_R0010/1 @@ -106,6 +109,7 @@ def test_gsoc_example_2(self): self.assertNotIn('https://synbiohub.org/public/igem/BBa_S03334/1', identities) self.assertNotIn('https://synbiohub.org/public/igem/BBa_K1444015/1', identities) + # https://github.com/SynBioDex/pySBOL2/issues/451 @unittest.skipIf(password is None, "No SynBioHub password supplied") def test_gsoc_example_3(self): # Looking for: https://synbiohub.org/public/igem/BBa_R0010/1 @@ -121,6 +125,7 @@ def test_gsoc_example_3(self): self.assertNotIn('https://synbiohub.org/public/igem/BBa_S03334/1', identities) self.assertNotIn('https://synbiohub.org/public/igem/BBa_K1444015/1', identities) + # https://github.com/SynBioDex/pySBOL2/issues/451 @unittest.skipIf(password is None, "No SynBioHub password supplied") def test_gsoc_example_4(self): # Looking for: https://synbiohub.org/public/igem/BBa_B0034/1 @@ -134,6 +139,7 @@ def test_gsoc_example_4(self): self.assertIn('https://synbiohub.org/public/igem/BBa_B0034/1', identities) self.assertNotIn('https://synbiohub.org/public/igem/BBa_I13617/1', identities) + # https://github.com/SynBioDex/pySBOL2/issues/451 @unittest.skipIf(password is None, "No SynBioHub password supplied") def test_gsoc_example_5(self): # Looking for: https://synbiohub.org/public/bsu/BO_28874/1 @@ -148,6 +154,7 @@ def test_gsoc_example_5(self): self.assertIn('https://synbiohub.org/public/bsu/BO_28874/1', identities) self.assertNotIn('https://synbiohub.org/public/bsu/BO_26604/1', identities) + # https://github.com/SynBioDex/pySBOL2/issues/451 @unittest.skipIf(password is None, "No SynBioHub password supplied") def test_gsoc_count_5(self): part_shop = sbol2.PartShop(GSOC_SBH_URL) diff --git a/test/test_tutorial.py b/test/test_tutorial.py index f865a96..20ca767 100644 --- a/test/test_tutorial.py +++ b/test/test_tutorial.py @@ -119,6 +119,7 @@ def create_new_device(self, doc: sbol2.Document): my_device.compile() self.assertEqual(expected_sequence, my_device.sequence.elements) + # https://github.com/SynBioDex/pySBOL2/issues/451 @unittest.skip("SynBioHub no longer allows anonymous access") def test_tutorial(self): doc = self.init_tutorial() From 2731bb01cd465808b9c08c08017af27673f67980 Mon Sep 17 00:00:00 2001 From: Tom Mitchell Date: Wed, 5 Aug 2026 12:44:56 -0400 Subject: [PATCH 11/11] Update changelog #449 --- CHANGELOG.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7708862..c44e13e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,5 +9,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Temporarily skip SynBioHub unit tests to fix failing builds. + [449](https://github.com/SynBioDex/pySBOL2/issues/449), + [451](https://github.com/SynBioDex/pySBOL2/issues/451) - Constrain `packaging` version to `<26.1` to keep using `NegativeInfinity`. - [449](https://github.com/SynBioDex/pySBOL2/issues/449) + [449](https://github.com/SynBioDex/pySBOL2/issues/449), + [450](https://github.com/SynBioDex/pySBOL2/issues/450) + +## [1.4.1] - 2022-04-14 + +- Changes were not recorded. + +## [1.4.1] - 2022-02-04 + +- Changes were not recorded.