diff --git a/changelog b/changelog index 07b96d3354..5b7d2ff965 100644 --- a/changelog +++ b/changelog @@ -1,3 +1,6 @@ + 49) Move 'colored' utility from psyclone.psyir.nodes.node to + psyclone.utils. + 48) PR #34584 for #3583. Fixes PSyclone losing the tag from a symbol when using SymbolTable.swap. diff --git a/src/psyclone/psyir/nodes/__init__.py b/src/psyclone/psyir/nodes/__init__.py index ce7cadf47e..ea06c9cbdb 100644 --- a/src/psyclone/psyir/nodes/__init__.py +++ b/src/psyclone/psyir/nodes/__init__.py @@ -22,7 +22,7 @@ from psyclone.psyir.nodes.codeblock import ( CodeBlock, Fparser2CodeBlock, TreeSitterCodeBlock) from psyclone.psyir.nodes.container import Container -from psyclone.psyir.nodes.node import colored, Node +from psyclone.psyir.nodes.node import Node from psyclone.psyir.nodes.scoping_node import ScopingNode from psyclone.psyir.nodes.schedule import Schedule from psyclone.psyir.nodes.return_stmt import Return @@ -82,7 +82,6 @@ # The entities in the __all__ list are made available to import directly from # this package e.g. 'from psyclone.psyir.nodes import Literal' __all__ = [ - 'colored', 'ArrayConstructor', 'ArrayMember', 'ArrayReference', diff --git a/src/psyclone/psyir/nodes/node.py b/src/psyclone/psyir/nodes/node.py index a279282780..366a58e636 100644 --- a/src/psyclone/psyir/nodes/node.py +++ b/src/psyclone/psyir/nodes/node.py @@ -17,33 +17,11 @@ from psyclone.core import VariablesAccessMap from psyclone.errors import GenerationError, InternalError +from psyclone.utils import colored if TYPE_CHECKING: from psyclone.psyir.symbols import Symbol -# We use the termcolor module (if available) to enable us to produce -# coloured, textual representations of Invoke schedules. If it's not -# available then we don't use colour. -try: - # pylint disable=import-outside-toplevel - from termcolor import colored -except ImportError: - # We don't have the termcolor package available (e.g. installing from) - # Spack) so provide alternative routine - def colored(text, _): - ''' - Returns the supplied text argument unchanged. This is a swap-in - replacement for when termcolor.colored is not available. - - :param str text: text to return. - :param _: fake argument, only required to match interface - provided by termcolor.colored. - - :returns: the supplied text, unchanged. - :rtype: str - ''' - return text - class ChildrenList(list): ''' @@ -1866,7 +1844,5 @@ def get_last_descendant_node(self) -> "Node": # For automatic documentation generation -# TODO #913 the 'colored' routine shouldn't be in this module. -__all__ = ["colored", - "ChildrenList", +__all__ = ["ChildrenList", "Node"] diff --git a/src/psyclone/tests/domain/common/algorithm/alg_psyir_test.py b/src/psyclone/tests/domain/common/algorithm/alg_psyir_test.py index 0ac1a3e1ca..eea01b6399 100644 --- a/src/psyclone/tests/domain/common/algorithm/alg_psyir_test.py +++ b/src/psyclone/tests/domain/common/algorithm/alg_psyir_test.py @@ -19,9 +19,9 @@ from psyclone.errors import InternalError, GenerationError from psyclone.psyir.frontend.fortran import FortranReader from psyclone.psyir.nodes import Reference, Node, Container -from psyclone.psyir.nodes.node import colored from psyclone.psyir.symbols import RoutineSymbol, DataTypeSymbol, \ StructureType, Symbol, ScalarType +from psyclone.utils import colored def create_alg_psyir(code): diff --git a/src/psyclone/tests/domain/common/psylayer/global_reduction_test.py b/src/psyclone/tests/domain/common/psylayer/global_reduction_test.py index 8a85e669eb..b7412f52c4 100644 --- a/src/psyclone/tests/domain/common/psylayer/global_reduction_test.py +++ b/src/psyclone/tests/domain/common/psylayer/global_reduction_test.py @@ -13,9 +13,9 @@ from psyclone.errors import GenerationError, InternalError from psyclone.domain.common.psylayer import GlobalReduction from psyclone.psyir.nodes import Literal -from psyclone.psyir.nodes.node import colored from psyclone.psyir.symbols import ScalarType from psyclone.tests.utilities import get_invoke +from psyclone.utils import colored def test_globalreduction_node_str_and_dag_name(): diff --git a/src/psyclone/tests/domain/lfric/lfric_invoke_schedule_test.py b/src/psyclone/tests/domain/lfric/lfric_invoke_schedule_test.py index f475a24482..c12c3d3ced 100644 --- a/src/psyclone/tests/domain/lfric/lfric_invoke_schedule_test.py +++ b/src/psyclone/tests/domain/lfric/lfric_invoke_schedule_test.py @@ -10,9 +10,10 @@ import os from psyclone.domain.lfric import LFRicInvokeSchedule from psyclone.parse.algorithm import parse -from psyclone.psyir.nodes import Container, colored +from psyclone.psyir.nodes import Container from psyclone.psyir.symbols import RoutineSymbol from psyclone.psyGen import PSyFactory +from psyclone.utils import colored BASE_PATH = os.path.join( diff --git a/src/psyclone/tests/domain/lfric/transformations/lfric_extract_test.py b/src/psyclone/tests/domain/lfric/transformations/lfric_extract_test.py index df4fbcc53f..71d24fe291 100644 --- a/src/psyclone/tests/domain/lfric/transformations/lfric_extract_test.py +++ b/src/psyclone/tests/domain/lfric/transformations/lfric_extract_test.py @@ -14,12 +14,13 @@ from psyclone.domain.lfric.transformations import LFRicExtractTrans from psyclone.domain.lfric import LFRicConstants -from psyclone.psyir.nodes import colored, ExtractNode, Loop +from psyclone.psyir.nodes import ExtractNode, Loop from psyclone.psyir.transformations import PSyDataTrans, TransformationError from psyclone.tests.lfric_build import LFRicBuild from psyclone.tests.utilities import get_invoke from psyclone.transformations import (LFRicColourTrans, LFRicOMPParallelLoopTrans) +from psyclone.utils import colored # API names LFRIC_API = "lfric" diff --git a/src/psyclone/tests/domain/lfric/transformations/lfric_transformations_test.py b/src/psyclone/tests/domain/lfric/transformations/lfric_transformations_test.py index f18b88fef6..180260bdae 100644 --- a/src/psyclone/tests/domain/lfric/transformations/lfric_transformations_test.py +++ b/src/psyclone/tests/domain/lfric/transformations/lfric_transformations_test.py @@ -25,7 +25,7 @@ from psyclone.psyGen import InvokeSchedule, BuiltIn from psyclone.psyir.backend.visitor import VisitorError from psyclone.psyir.nodes import ( - colored, Loop, Schedule, Literal, Directive, OMPDoDirective, + Loop, Schedule, Literal, Directive, OMPDoDirective, ACCEnterDataDirective, Assignment, Reference) from psyclone.psyir.symbols import AutomaticInterface, ScalarType, ArrayType from psyclone.psyir.transformations import ( @@ -38,6 +38,7 @@ LFRicColourTrans, LFRicOMPLoopTrans, LFRicOMPParallelLoopTrans, LFRicAsyncHaloExchangeTrans, LFRicKernelConstTrans, ACCParallelTrans, ACCEnterDataTrans) +from psyclone.utils import colored # The version of the API that the tests in this file # exercise. diff --git a/src/psyclone/tests/lfric_test.py b/src/psyclone/tests/lfric_test.py index 23b52b3440..eb4fb7b94a 100644 --- a/src/psyclone/tests/lfric_test.py +++ b/src/psyclone/tests/lfric_test.py @@ -30,13 +30,14 @@ from psyclone.parse.algorithm import Arg, parse from psyclone.parse.utils import ParseError from psyclone.psyGen import PSyFactory, InvokeSchedule, HaloExchange, BuiltIn -from psyclone.psyir.nodes import (colored, BinaryOperation, UnaryOperation, +from psyclone.psyir.nodes import (BinaryOperation, UnaryOperation, Reference, Routine, Container, Schedule) from psyclone.psyir.symbols import (ArrayType, ScalarType, DataTypeSymbol, UnsupportedFortranType) from psyclone.psyir.backend.visitor import VisitorError from psyclone.tests.lfric_build import LFRicBuild from psyclone.tests.utilities import get_invoke +from psyclone.utils import colored # constants diff --git a/src/psyclone/tests/psyGen_test.py b/src/psyclone/tests/psyGen_test.py index 6ef2a76426..678b8bbe0b 100644 --- a/src/psyclone/tests/psyGen_test.py +++ b/src/psyclone/tests/psyGen_test.py @@ -36,7 +36,7 @@ InvokeSchedule) from psyclone.psyir.nodes import (Assignment, BinaryOperation, Container, Literal, Loop, Node, KernelSchedule, Call, - colored, Reference, Schedule) + Reference, Schedule) from psyclone.psyir.symbols import (DataSymbol, RoutineSymbol, ScalarType, ImportInterface, ContainerSymbol, UnresolvedType, SymbolTable) @@ -46,6 +46,7 @@ from psyclone.tests.utilities import get_invoke from psyclone.transformations import (LFRicColourTrans, Transformation) +from psyclone.utils import colored BASE_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), diff --git a/src/psyclone/tests/psyir/nodes/array_constructor_test.py b/src/psyclone/tests/psyir/nodes/array_constructor_test.py index 9965c866c0..49efca7bff 100644 --- a/src/psyclone/tests/psyir/nodes/array_constructor_test.py +++ b/src/psyclone/tests/psyir/nodes/array_constructor_test.py @@ -14,7 +14,7 @@ Reference, IfBlock) from psyclone.core import AccessType, Signature from psyclone.psyir.symbols import ScalarType, DataSymbol -from psyclone.psyir.nodes.node import colored +from psyclone.utils import colored def test_array_construction_valid(): diff --git a/src/psyclone/tests/psyir/nodes/array_reference_test.py b/src/psyclone/tests/psyir/nodes/array_reference_test.py index b092db46da..d5d8c5fcd0 100644 --- a/src/psyclone/tests/psyir/nodes/array_reference_test.py +++ b/src/psyclone/tests/psyir/nodes/array_reference_test.py @@ -10,7 +10,6 @@ import pytest from psyclone.errors import GenerationError, InternalError from psyclone.psyir.backend.fortran import FortranWriter -from psyclone.psyir.nodes.node import colored from psyclone.psyir.nodes import ( Reference, ArrayReference, Assignment, Literal, BinaryOperation, Range, KernelSchedule, IntrinsicCall) @@ -18,6 +17,7 @@ ArrayType, DataSymbol, DataTypeSymbol, ScalarType, Symbol, UnsupportedFortranType, StructureType, UnresolvedType) from psyclone.tests.utilities import check_links +from psyclone.utils import colored def test_array_node_str(): diff --git a/src/psyclone/tests/psyir/nodes/assignment_test.py b/src/psyclone/tests/psyir/nodes/assignment_test.py index 39686f22e7..29b202d317 100644 --- a/src/psyclone/tests/psyir/nodes/assignment_test.py +++ b/src/psyclone/tests/psyir/nodes/assignment_test.py @@ -14,10 +14,10 @@ from psyclone.psyir.nodes import ( Assignment, Reference, Literal, ArrayReference, Range, StructureReference, ArrayOfStructuresReference, IntrinsicCall) -from psyclone.psyir.nodes.node import colored from psyclone.psyir.symbols import ( DataSymbol, ScalarType, Symbol, ArrayType, StructureType, DataTypeSymbol) from psyclone.tests.utilities import check_links +from psyclone.utils import colored def test_assignment_node_str(): diff --git a/src/psyclone/tests/psyir/nodes/call_test.py b/src/psyclone/tests/psyir/nodes/call_test.py index ed3db3fec9..7915680e59 100644 --- a/src/psyclone/tests/psyir/nodes/call_test.py +++ b/src/psyclone/tests/psyir/nodes/call_test.py @@ -15,10 +15,10 @@ from psyclone.psyir.nodes import ( ArrayReference, BinaryOperation, Call, Literal, Node, Reference, Routine, Schedule, CallMatchingArgumentsNotFound) -from psyclone.psyir.nodes.node import colored from psyclone.psyir.symbols import ( ArrayType, ScalarType, ContainerSymbol, DataSymbol, DataTypeSymbol, NoType, RoutineSymbol, SymbolError, UnresolvedInterface, UnresolvedType) +from psyclone.utils import colored class SpecialCall(Call): diff --git a/src/psyclone/tests/psyir/nodes/codeblock_test.py b/src/psyclone/tests/psyir/nodes/codeblock_test.py index 689d373070..47b0d80f6a 100644 --- a/src/psyclone/tests/psyir/nodes/codeblock_test.py +++ b/src/psyclone/tests/psyir/nodes/codeblock_test.py @@ -19,9 +19,9 @@ from psyclone.psyir.nodes.codeblock import ( CodeBlock, Fparser2CodeBlock, TreeSitterCodeBlock ) -from psyclone.psyir.nodes.node import colored from psyclone.errors import GenerationError, InternalError from psyclone.tests.utilities import min_version_3_10 +from psyclone.utils import colored # TODO #3416: Skip treesitter tests below 3.10 as they're unsupported by diff --git a/src/psyclone/tests/psyir/nodes/complex_literal_test.py b/src/psyclone/tests/psyir/nodes/complex_literal_test.py index d2230b9e6e..c53a62302c 100644 --- a/src/psyclone/tests/psyir/nodes/complex_literal_test.py +++ b/src/psyclone/tests/psyir/nodes/complex_literal_test.py @@ -10,11 +10,11 @@ import pytest from psyclone.errors import GenerationError -from psyclone.psyir.nodes.node import colored from psyclone.psyir.nodes import ( Literal, ComplexLiteral, Assignment, BinaryOperation, Reference) from psyclone.psyir.symbols import ScalarType, DataSymbol, SymbolTable from psyclone.core import Signature, AccessType +from psyclone.utils import colored def test_complex_literal_create(): diff --git a/src/psyclone/tests/psyir/nodes/container_test.py b/src/psyclone/tests/psyir/nodes/container_test.py index f2f902e849..cffe8aa09b 100644 --- a/src/psyclone/tests/psyir/nodes/container_test.py +++ b/src/psyclone/tests/psyir/nodes/container_test.py @@ -10,10 +10,11 @@ import pytest from psyclone.errors import GenerationError from psyclone.psyir.backend.fortran import FortranWriter -from psyclone.psyir.nodes import (Call, colored, Container, FileContainer, +from psyclone.psyir.nodes import (Call, Container, FileContainer, KernelSchedule, Return, Routine) from psyclone.psyir.symbols import DataSymbol, ScalarType, SymbolTable from psyclone.tests.utilities import check_links +from psyclone.utils import colored def test_container_init(): diff --git a/src/psyclone/tests/psyir/nodes/file_container_test.py b/src/psyclone/tests/psyir/nodes/file_container_test.py index 727d6cd4fa..1a26686099 100644 --- a/src/psyclone/tests/psyir/nodes/file_container_test.py +++ b/src/psyclone/tests/psyir/nodes/file_container_test.py @@ -12,8 +12,8 @@ from psyclone.psyir.nodes import Routine, FileContainer, Container from psyclone.psyir.symbols import SymbolTable, DataSymbol, ScalarType from psyclone.psyir.backend.fortran import FortranWriter -from psyclone.psyir.nodes.node import colored from psyclone.tests.utilities import get_invoke +from psyclone.utils import colored def test_file_container_init(): diff --git a/src/psyclone/tests/psyir/nodes/if_block_test.py b/src/psyclone/tests/psyir/nodes/if_block_test.py index d4affa9135..54c50cb8c6 100644 --- a/src/psyclone/tests/psyir/nodes/if_block_test.py +++ b/src/psyclone/tests/psyir/nodes/if_block_test.py @@ -14,7 +14,7 @@ from psyclone.errors import InternalError, GenerationError from psyclone.psyir.backend.fortran import FortranWriter from psyclone.tests.utilities import check_links -from psyclone.psyir.nodes.node import colored +from psyclone.utils import colored def test_ifblock_invalid_annotation(): diff --git a/src/psyclone/tests/psyir/nodes/literal_test.py b/src/psyclone/tests/psyir/nodes/literal_test.py index e73b82a2ff..ff3ae52f38 100644 --- a/src/psyclone/tests/psyir/nodes/literal_test.py +++ b/src/psyclone/tests/psyir/nodes/literal_test.py @@ -13,7 +13,7 @@ from psyclone.psyir.symbols import ( ArrayType, DataSymbol, ScalarType, SymbolTable) from psyclone.errors import GenerationError -from psyclone.psyir.nodes.node import colored +from psyclone.utils import colored def test_literal_init(): diff --git a/src/psyclone/tests/psyir/nodes/node_test.py b/src/psyclone/tests/psyir/nodes/node_test.py index 1020069afa..2369c485a6 100644 --- a/src/psyclone/tests/psyir/nodes/node_test.py +++ b/src/psyclone/tests/psyir/nodes/node_test.py @@ -7,8 +7,6 @@ ''' Performs py.test tests on the Node PSyIR node. ''' -import builtins -import runpy import sys import os import re @@ -27,7 +25,7 @@ from psyclone.psyir.symbols import DataSymbol, SymbolError, \ ScalarType, SymbolTable, ArrayType, RoutineSymbol, NoType from psyclone.tests.utilities import get_invoke -from psyclone.psyir.nodes.node import colored +from psyclone.utils import colored BASE_PATH = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname( os.path.abspath(__file__)))), "test_files", "lfric") @@ -97,24 +95,6 @@ def dummy(_1, _2): "package." in str(err.value)) -def test_node_colored_fallback_without_termcolor(monkeypatch): - '''Exercise the fallback implementation of ``colored`` when termcolor - cannot be imported. - - ''' - original_import = builtins.__import__ - - def fake_import(name, *args, **kwargs): - '''Raise ImportError only for termcolor.''' - if name == "termcolor": - raise ImportError("termcolor unavailable") - return original_import(name, *args, **kwargs) - - monkeypatch.setattr(builtins, "__import__", fake_import) - module_globals = runpy.run_path(node.__file__) - assert module_globals["colored"]("text", "green") == "text" - - def test_node_str(monkeypatch): ''' Tests for the Node.node_str method. ''' tnode = Node() diff --git a/src/psyclone/tests/psyir/nodes/omp_clause_test.py b/src/psyclone/tests/psyir/nodes/omp_clause_test.py index 9389b46f8c..2e82b204d9 100644 --- a/src/psyclone/tests/psyir/nodes/omp_clause_test.py +++ b/src/psyclone/tests/psyir/nodes/omp_clause_test.py @@ -8,7 +8,6 @@ ''' Performs py.test tests on the OpenMP PSyIR Clause nodes. ''' import pytest -from psyclone.psyir.nodes.node import colored from psyclone.psyir.nodes.omp_clauses import ( OMPGrainsizeClause, OMPNowaitClause, OMPNogroupClause, OMPNumTasksClause, OMPSharedClause, OMPDependClause, OMPPrivateClause, OMPFirstprivateClause, @@ -16,6 +15,7 @@ from psyclone.psyir.nodes.literal import Literal from psyclone.psyir.nodes.reference import Reference from psyclone.psyir.symbols import DataSymbol, ScalarType +from psyclone.utils import colored def test_nowait_clause(): diff --git a/src/psyclone/tests/psyir/nodes/operation_test.py b/src/psyclone/tests/psyir/nodes/operation_test.py index 11de2b7fba..abc0a17801 100644 --- a/src/psyclone/tests/psyir/nodes/operation_test.py +++ b/src/psyclone/tests/psyir/nodes/operation_test.py @@ -15,12 +15,13 @@ from psyclone.errors import GenerationError, InternalError from psyclone.psyir.backend.fortran import FortranWriter from psyclone.psyir.nodes import ( - ArrayReference, BinaryOperation, colored, IntrinsicCall, + ArrayReference, BinaryOperation, IntrinsicCall, Literal, Range, Reference, Return, StructureReference, UnaryOperation) from psyclone.psyir.symbols import ( ArrayType, DataSymbol, UnresolvedType, ScalarType, Symbol, StructureType, UnsupportedFortranType) from psyclone.tests.utilities import check_links +from psyclone.utils import colored # Test BinaryOperation class diff --git a/src/psyclone/tests/psyir/nodes/reference_test.py b/src/psyclone/tests/psyir/nodes/reference_test.py index 66686466d1..a9cd3221b9 100644 --- a/src/psyclone/tests/psyir/nodes/reference_test.py +++ b/src/psyclone/tests/psyir/nodes/reference_test.py @@ -12,13 +12,14 @@ from psyclone.psyGen import GenerationError from psyclone.psyir.nodes import ( - ArrayReference, Assignment, CodeBlock, colored, + ArrayReference, Assignment, CodeBlock, KernelSchedule, Literal, Reference, Loop) from psyclone.psyir.nodes.array_mixin import ArrayMixin from psyclone.psyir.symbols import (ArrayType, ContainerSymbol, DataSymbol, UnresolvedType, ImportInterface, ScalarType, Symbol, SymbolTable) from psyclone.psyir.transformations import ProfileTrans +from psyclone.utils import colored def test_reference_bad_init(): diff --git a/src/psyclone/tests/psyir/nodes/return_stmt_test.py b/src/psyclone/tests/psyir/nodes/return_stmt_test.py index ec72176c9c..00ae976f74 100644 --- a/src/psyclone/tests/psyir/nodes/return_stmt_test.py +++ b/src/psyclone/tests/psyir/nodes/return_stmt_test.py @@ -10,7 +10,7 @@ import pytest from psyclone.psyir.nodes import Return from psyclone.errors import GenerationError -from psyclone.psyir.nodes.node import colored +from psyclone.utils import colored def test_return_node_str(): diff --git a/src/psyclone/tests/psyir/nodes/schedule_test.py b/src/psyclone/tests/psyir/nodes/schedule_test.py index 74fbef07e0..95c56084c5 100644 --- a/src/psyclone/tests/psyir/nodes/schedule_test.py +++ b/src/psyclone/tests/psyir/nodes/schedule_test.py @@ -10,11 +10,11 @@ import os import pytest from psyclone.psyir.nodes import Schedule, Assignment, Range, Statement -from psyclone.psyir.nodes.node import colored from psyclone.psyir.symbols import SymbolTable from psyclone.psyGen import PSyFactory from psyclone.parse.algorithm import parse from psyclone.errors import GenerationError +from psyclone.utils import colored BASE_PATH = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname( diff --git a/src/psyclone/tests/psyir/nodes/structure_member_test.py b/src/psyclone/tests/psyir/nodes/structure_member_test.py index cfc8f80673..d78e30b06e 100644 --- a/src/psyclone/tests/psyir/nodes/structure_member_test.py +++ b/src/psyclone/tests/psyir/nodes/structure_member_test.py @@ -11,7 +11,7 @@ from psyclone.psyir import nodes from psyclone.psyir import symbols from psyclone.errors import GenerationError, InternalError -from psyclone.psyir.nodes.node import colored +from psyclone.utils import colored def create_structure_symbol(table): diff --git a/src/psyclone/tests/psyir/nodes/while_loop_test.py b/src/psyclone/tests/psyir/nodes/while_loop_test.py index 61d85c4151..20b661bb06 100644 --- a/src/psyclone/tests/psyir/nodes/while_loop_test.py +++ b/src/psyclone/tests/psyir/nodes/while_loop_test.py @@ -12,9 +12,9 @@ from psyclone.psyir.backend.fortran import FortranWriter from psyclone.psyir.nodes import Assignment, BinaryOperation, Literal, \ Reference, Return, Schedule, WhileLoop -from psyclone.psyir.nodes.node import colored from psyclone.psyir.symbols import DataSymbol, ScalarType from psyclone.tests.utilities import check_links +from psyclone.utils import colored def test_whileloop_invalid_annotation(): diff --git a/src/psyclone/tests/psyir/transformations/profile_test.py b/src/psyclone/tests/psyir/transformations/profile_test.py index 17ab00e96f..6d27480e97 100644 --- a/src/psyclone/tests/psyir/transformations/profile_test.py +++ b/src/psyclone/tests/psyir/transformations/profile_test.py @@ -16,7 +16,7 @@ from psyclone.gocean1p0 import GOInvokeSchedule from psyclone.profiler import Profiler from psyclone.psyir.nodes import ( - colored, ProfileNode, Loop, Literal, Assignment, Return, Reference, + ProfileNode, Loop, Literal, Assignment, Return, Reference, OMPDoDirective, KernelSchedule, Routine, Schedule) from psyclone.psyir.symbols import ( SymbolTable, DataSymbol, ScalarType) @@ -26,6 +26,7 @@ from psyclone.tests.utilities import get_invoke from psyclone.transformations import ( GOceanOMPLoopTrans, LFRicOMPLoopTrans) +from psyclone.utils import colored # ----------------------------------------------------------------------------- diff --git a/src/psyclone/tests/psyir/transformations/read_only_verify_trans_test.py b/src/psyclone/tests/psyir/transformations/read_only_verify_trans_test.py index 53ce5a2e02..22145d91e7 100644 --- a/src/psyclone/tests/psyir/transformations/read_only_verify_trans_test.py +++ b/src/psyclone/tests/psyir/transformations/read_only_verify_trans_test.py @@ -11,11 +11,12 @@ import pytest from psyclone.errors import InternalError -from psyclone.psyir.nodes import colored, Node, ReadOnlyVerifyNode, Schedule +from psyclone.psyir.nodes import Node, ReadOnlyVerifyNode, Schedule from psyclone.psyir.transformations import (ReadOnlyVerifyTrans, TransformationError) from psyclone.tests.utilities import get_invoke from psyclone.transformations import OMPParallelLoopTrans +from psyclone.utils import colored # --------------------------------------------------------------------------- # # ================== ReadOnly Transformation tests ========================== # diff --git a/src/psyclone/tests/psyir/transformations/value_range_check_trans_test.py b/src/psyclone/tests/psyir/transformations/value_range_check_trans_test.py index 3b0b0853c3..14a6d8c6ed 100644 --- a/src/psyclone/tests/psyir/transformations/value_range_check_trans_test.py +++ b/src/psyclone/tests/psyir/transformations/value_range_check_trans_test.py @@ -12,11 +12,12 @@ from psyclone.errors import InternalError -from psyclone.psyir.nodes import colored, Node, ValueRangeCheckNode, Schedule +from psyclone.psyir.nodes import Node, ValueRangeCheckNode, Schedule from psyclone.psyir.transformations import (ValueRangeCheckTrans, TransformationError) from psyclone.tests.utilities import get_invoke from psyclone.transformations import OMPParallelLoopTrans +from psyclone.utils import colored # --------------------------------------------------------------------------- diff --git a/src/psyclone/tests/utils_test.py b/src/psyclone/tests/utils_test.py index 0e81572233..51788abfaf 100644 --- a/src/psyclone/tests/utils_test.py +++ b/src/psyclone/tests/utils_test.py @@ -7,11 +7,14 @@ '''This module implements tests for the generic utility functions.''' +import builtins import pytest +import runpy import sys from typing import Union +from psyclone import utils from psyclone.errors import InternalError from psyclone.transformations import Transformation from psyclone.utils import ( @@ -499,3 +502,21 @@ def test_parse_kwargs_errors_wrong_type(kwargs): assert (f"Invalid syntax for keyword arguments '{kwargs}'. It was parsed " f"as 'set', not as a dictionary." == str(err.value)) + + +def test_colored_fallback_without_termcolor(monkeypatch): + '''Exercise the fallback implementation of ``colored`` when termcolor + cannot be imported. + + ''' + original_import = builtins.__import__ + + def fake_import(name, *args, **kwargs): + '''Raise ImportError only for termcolor.''' + if name == "termcolor": + raise ImportError("termcolor unavailable") + return original_import(name, *args, **kwargs) + + monkeypatch.setattr(builtins, "__import__", fake_import) + module_globals = runpy.run_path(utils.__file__) + assert module_globals["colored"]("text", "green") == "text" diff --git a/src/psyclone/utils.py b/src/psyclone/utils.py index 5441c9cfa6..90aea5264d 100644 --- a/src/psyclone/utils.py +++ b/src/psyclone/utils.py @@ -19,6 +19,28 @@ if TYPE_CHECKING: from psyclone.psyGen import Transformation +# We use the termcolor module (if available) to enable us to produce +# coloured, textual representations of PSyIR schedules. If it's not +# available then we don't use colour. +try: + # pylint disable=import-outside-toplevel + from termcolor import colored +except ImportError: + # We don't have the termcolor package available (e.g. installing from + # Spack) so provide alternative routine + def colored(text: str, _: str) -> str: + ''' + Returns the supplied text argument unchanged. This is a swap-in + replacement for when termcolor.colored is not available. + + :param text: text to return. + :param _: fake argument, only required to match interface + provided by termcolor.colored. + + :returns: the supplied text, unchanged. + ''' + return text + def within_virtual_env(): '''