From 6b93c235805143883b36962db5562e64297914eb Mon Sep 17 00:00:00 2001 From: rocky Date: Wed, 30 Nov 2022 07:30:22 -0500 Subject: [PATCH 1/3] move builtins by module out of __init__ --- mathics/builtin/__init__.py | 30 ++++++++++++++---------------- mathics/core/pymathics.py | 2 +- mathics/doc/common_doc.py | 2 +- mathics/docpipeline.py | 3 ++- mathics/session.py | 2 ++ 5 files changed, 20 insertions(+), 19 deletions(-) diff --git a/mathics/builtin/__init__.py b/mathics/builtin/__init__.py index e809af4b2..d3060c093 100755 --- a/mathics/builtin/__init__.py +++ b/mathics/builtin/__init__.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """ -Mathics Builtin Functions and Variables. +Mathics Builtin Functions and Variables. Mathics has over a thousand Built-in functions and variables, all of which are defined here. @@ -47,6 +47,14 @@ ] +mathics_to_sympy = {} # here we have: name -> sympy object +sympy_to_mathics = {} +builtins_list = [] + +builtins_precedence = {} + +system_builtins = {} + def add_builtins(new_builtins): for var_name, builtin in new_builtins: name = builtin.get_name() @@ -63,7 +71,7 @@ def add_builtins(new_builtins): builtins_precedence[name] = builtin.precedence if isinstance(builtin, PatternObject): pattern_objects[name] = builtin.__class__ - _builtins.update(dict(new_builtins)) + system_builtins.update(dict(new_builtins)) def builtins_dict(): @@ -76,8 +84,8 @@ def builtins_dict(): def contribute(definitions): # let MakeBoxes contribute first - _builtins["System`MakeBoxes"].contribute(definitions) - for name, item in _builtins.items(): + system_builtins["System`MakeBoxes"].contribute(definitions) + for name, item in system_builtins.items(): if name != "System`MakeBoxes": item.contribute(definitions) @@ -176,7 +184,6 @@ def name_is_builtin_symbol(module, name: str) -> Optional[type]: modules = [] import_builtins(module_names) -_builtins_list = [] builtins_by_module = {} disable_file_module_names = ( @@ -232,19 +239,10 @@ def name_is_builtin_symbol(module, name: str) -> Optional[type]: # This set the default context for symbols in mathics.builtins if not type(instance).context: type(instance).context = "System`" - _builtins_list.append((instance.get_name(), instance)) + builtins_list.append((instance.get_name(), instance)) builtins_by_module[module.__name__].append(instance) -mathics_to_sympy = {} # here we have: name -> sympy object -sympy_to_mathics = {} - -builtins_precedence = {} - -new_builtins = _builtins_list - -# FIXME: some magic is going on here.. -_builtins = {} - +new_builtins = builtins_list add_builtins(new_builtins) display_operators_set = set() diff --git a/mathics/core/pymathics.py b/mathics/core/pymathics.py index 354404b10..28b6a7dfc 100644 --- a/mathics/core/pymathics.py +++ b/mathics/core/pymathics.py @@ -7,6 +7,7 @@ import sys +from mathics.builtin.system_init import builtins_by_module from mathics.core.evaluation import Evaluation # This dict probably does not belong here. @@ -22,7 +23,6 @@ def __init__(self, module): # Why do we need this? def eval_clear_pymathics_modules(): global pymathics - from mathics.builtin import builtins_by_module for key in list(builtins_by_module.keys()): if not key.startswith("mathics."): diff --git a/mathics/doc/common_doc.py b/mathics/doc/common_doc.py index 442c61320..623d79578 100644 --- a/mathics/doc/common_doc.py +++ b/mathics/doc/common_doc.py @@ -830,7 +830,7 @@ def __init__(self, want_sorting=False): ( "Reference of Built-in Symbols", builtin.modules, - builtin.builtins_by_module, + builtin.system_init.builtins_by_module, True, ) ]: # nopep8 diff --git a/mathics/docpipeline.py b/mathics/docpipeline.py index 01fa2667c..df3fe029f 100644 --- a/mathics/docpipeline.py +++ b/mathics/docpipeline.py @@ -24,13 +24,14 @@ from mathics.core.definitions import Definitions from mathics.core.evaluation import Evaluation, Output from mathics.core.parser import MathicsSingleLineFeeder -from mathics.builtin import builtins_dict +from mathics.builtin.system_init import builtins_dict, initialize_system from mathics import version_string from mathics import settings from mathics.doc.common_doc import MathicsMainDocumentation from mathics.timing import show_lru_cache_statistics +initialize_system() builtins = builtins_dict() diff --git a/mathics/session.py b/mathics/session.py index 88a4957b6..35962c026 100644 --- a/mathics/session.py +++ b/mathics/session.py @@ -12,6 +12,7 @@ import os.path as osp from typing import Optional +from mathics.builtin.system_init import initialize_system from mathics.core.definitions import autoload_files from mathics.core.parser import parse, MathicsSingleLineFeeder from mathics.core.definitions import Definitions @@ -63,6 +64,7 @@ def __init__( form="InputForm", character_encoding=Optional[str], ): + initialize_system() if character_encoding is not None: mathics.settings.SYSTEM_CHARACTER_ENCODING = character_encoding self.form = form From 3251989944a91b6f46459c9a188e15601b81d29a Mon Sep 17 00:00:00 2001 From: rocky Date: Wed, 30 Nov 2022 17:18:08 -0500 Subject: [PATCH 2/3] Move mathics.core.builtin code into system_init... Although we now require a frontend to *explicitly* call ``initialize_system()`` and this may seem more akward, it is helpful and important for a couple of reasons. First, it provides better modularization and reduces circular imports: ``mathics.builtin`` is a close to top-level import and, in contrast to ``mathics.builtin.system_init`` there are a lot of modules underneath ``mathics.builtin``. (There are none under ``mathics.builtin.system_init``). As a result we can have more ``import mathics.builtin.system_init`` from a module where we can't do the same for ``import mathics.builtin``. Second, by placing initialization of structures which do not change outside of development we are in a better position to have write and admninstrative tool to load all of this and dump it to as a system image, which can be read in rather than built it up from scratch as happens now. This new function ``initialize_system`` might have a parameter to read the image file rather than do the work it does now. In its current form though ``initialize_system()`` does as not encapsulate system loading as much as it could. --- .../symbolic_logic/gries_schneider/test_gs.py | 2 + mathics/builtin/__init__.py | 18 +-- mathics/builtin/system_init.py | 111 ++++++++++++++++++ mathics/format/mathml.py | 2 +- mathics/main.py | 2 + 5 files changed, 117 insertions(+), 18 deletions(-) create mode 100644 mathics/builtin/system_init.py diff --git a/examples/symbolic_logic/gries_schneider/test_gs.py b/examples/symbolic_logic/gries_schneider/test_gs.py index 7212ec8ee..44cc4ede6 100644 --- a/examples/symbolic_logic/gries_schneider/test_gs.py +++ b/examples/symbolic_logic/gries_schneider/test_gs.py @@ -2,10 +2,12 @@ # -*- coding: utf-8 -*- +from mathics.builtin.system_init import initialize_system from mathics.core.definitions import Definitions from mathics.core.evaluation import Evaluation from mathics.core.parser import MathicsSingleLineFeeder, parse +initialize_system() definitions = Definitions(add_builtin=True) for i in range(0, 4): diff --git a/mathics/builtin/__init__.py b/mathics/builtin/__init__.py index d3060c093..2bca659b0 100755 --- a/mathics/builtin/__init__.py +++ b/mathics/builtin/__init__.py @@ -37,7 +37,6 @@ ) from mathics.core.pattern import pattern_objects from mathics.settings import ENABLE_FILES_MODULE -from mathics.version import __version__ # noqa used in loading to check consistency. # Get a list of files in this directory. We'll exclude from the start # files with leading characters we don't want like __init__ with its leading underscore. @@ -55,6 +54,7 @@ system_builtins = {} + def add_builtins(new_builtins): for var_name, builtin in new_builtins: name = builtin.get_name() @@ -74,14 +74,6 @@ def add_builtins(new_builtins): system_builtins.update(dict(new_builtins)) -def builtins_dict(): - return { - builtin.get_name(): builtin - for modname, builtins in builtins_by_module.items() - for builtin in builtins - } - - def contribute(definitions): # let MakeBoxes contribute first system_builtins["System`MakeBoxes"].contribute(definitions) @@ -244,11 +236,3 @@ def name_is_builtin_symbol(module, name: str) -> Optional[type]: new_builtins = builtins_list add_builtins(new_builtins) - -display_operators_set = set() -for modname, builtins in builtins_by_module.items(): - for builtin in builtins: - # name = builtin.get_name() - operator = builtin.get_operator_display() - if operator is not None: - display_operators_set.add(operator) diff --git a/mathics/builtin/system_init.py b/mathics/builtin/system_init.py new file mode 100644 index 000000000..33079ee87 --- /dev/null +++ b/mathics/builtin/system_init.py @@ -0,0 +1,111 @@ +""" +One-time initialization of Mathics module loading, and creation of built-in functions. +""" + +import glob +import os.path as osp + +from mathics.builtin.base import ( + Builtin, + Operator, + PatternObject, + SympyObject, + mathics_to_python, +) + +from mathics.core.pattern import pattern_objects + +builtins_precedence = {} +mathics_to_sympy = {} # here we have: name -> sympy object +sympy_to_mathics = {} + +# builtins_by_module maps a full module name, e.g. "mathics.builtin.evaluation" to a +# list of Builtin classes. +builtins_by_module = {} +builtins_list = [] + +# Get a list of files in this directory. We'll exclude from the start +# files with leading characters we don't want like __init__ with its leading underscore. +__py_files__ = [ + osp.basename(f[0:-3]) + for f in glob.glob(osp.join(osp.dirname(__file__), "[a-z]*.py")) +] + +builtins_precedence = {} + +system_builtins = {} + + +def add_builtins(new_builtins): + for var_name, builtin in new_builtins: + name = builtin.get_name() + if hasattr(builtin, "python_equivalent"): + # print("XXX0", builtin.python_equivalent) + mathics_to_python[name] = builtin.python_equivalent + + if isinstance(builtin, SympyObject): + mathics_to_sympy[name] = builtin + for sympy_name in builtin.get_sympy_names(): + # print("XXX1", sympy_name) + sympy_to_mathics[sympy_name] = builtin + if isinstance(builtin, Operator): + builtins_precedence[name] = builtin.precedence + if isinstance(builtin, PatternObject): + pattern_objects[name] = builtin.__class__ + system_builtins.update(dict(new_builtins)) + + +def builtins_dict(): + return { + builtin.get_name(): builtin + for modname, builtins in builtins_by_module.items() + for builtin in builtins + } + + +def create_builtins_by_module(): + from mathics.builtin import modules, name_is_builtin_symbol, sanity_check + + for module in modules: + builtins_by_module[module.__name__] = [] + module_vars = dir(module) + + for name in module_vars: + builtin_class = name_is_builtin_symbol(module, name) + if builtin_class is not None: + instance = builtin_class(expression=False) + + if isinstance(instance, Builtin): + # This set the default context for symbols in mathics.builtins + if not type(instance).context: + type(instance).context = "System`" + assert sanity_check( + builtin_class, module + ), f"In {module.__name__} Builtin <<{builtin_class.__name__}>> did not pass the sanity check." + + builtins_list.append((instance.get_name(), instance)) + builtins_by_module[module.__name__].append(instance) + + +display_operators_set = set() + +# TODO: after doing more, e.g. moving Builtin class processing, +# consider adding an administrative routine to write definitions in +# Python Pickle format (or something suitable. Then we can add a flag +# here to read this in which might be faster. +# +def initialize_system(): + """ + One-time Builtin initialization. + Not much here but more may be added. + """ + create_builtins_by_module() + from mathics.builtin import __py_files__ as old_py_files + + assert __py_files__ == old_py_files + for modname, builtins in builtins_by_module.items(): + for builtin in builtins: + # name = builtin.get_name() + operator = builtin.get_operator_display() + if operator is not None: + display_operators_set.add(operator) diff --git a/mathics/format/mathml.py b/mathics/format/mathml.py index e0281e8ec..8bcd8afc3 100644 --- a/mathics/format/mathml.py +++ b/mathics/format/mathml.py @@ -21,6 +21,7 @@ ) from mathics.builtin.box.graphics import GraphicsBox from mathics.builtin.box.graphics3d import Graphics3DBox +from mathics.builtin.system_init import display_operators_set as operators from mathics.core.atoms import String @@ -62,7 +63,6 @@ def encode_mathml(text: str) -> str: def string(self, **options) -> str: - from mathics.builtin import display_operators_set as operators text = self.value diff --git a/mathics/main.py b/mathics/main.py index 3b90a24f6..e49f66e75 100755 --- a/mathics/main.py +++ b/mathics/main.py @@ -14,6 +14,7 @@ from mathics import settings from mathics import version_string, license_string, __version__ from mathics.builtin.trace import TraceBuiltins, traced_do_replace +from mathics.builtin.system_init import initialize_system from mathics.core.atoms import String from mathics.core.definitions import autoload_files, Definitions, Symbol from mathics.core.evaluation import Evaluation, Output @@ -369,6 +370,7 @@ def dump_tracing_stats(): if args.show_statistics: atexit.register(show_lru_cache_statistics) + initialize_system() definitions = Definitions(add_builtin=True, extension_modules=extension_modules) definitions.set_line_no(0) From e1e0c449aee86aed323819ae87e61e5333c2f273 Mon Sep 17 00:00:00 2001 From: rocky Date: Wed, 7 Dec 2022 17:23:50 -0500 Subject: [PATCH 3/3] builtin.system_init -> core.system_init Move system initialization module out of mathics.builtin. (Similar to PR #639) This also removes the need for Python to "partially initialize" mathics.builtin since it doesn't import one of its children Merge mess --- .../symbolic_logic/gries_schneider/test_gs.py | 2 +- mathics/builtin/__init__.py | 80 +------------ mathics/core/definitions.py | 3 +- mathics/core/pymathics.py | 3 +- mathics/{builtin => core}/system_init.py | 105 +++++++++++++++--- mathics/doc/common_doc.py | 5 +- mathics/docpipeline.py | 2 +- mathics/format/mathml.py | 2 +- mathics/main.py | 2 +- mathics/session.py | 2 +- .../test_duplicate_builtins.py | 3 +- 11 files changed, 108 insertions(+), 101 deletions(-) rename mathics/{builtin => core}/system_init.py (51%) diff --git a/examples/symbolic_logic/gries_schneider/test_gs.py b/examples/symbolic_logic/gries_schneider/test_gs.py index 44cc4ede6..9bd5b765a 100644 --- a/examples/symbolic_logic/gries_schneider/test_gs.py +++ b/examples/symbolic_logic/gries_schneider/test_gs.py @@ -2,10 +2,10 @@ # -*- coding: utf-8 -*- -from mathics.builtin.system_init import initialize_system from mathics.core.definitions import Definitions from mathics.core.evaluation import Evaluation from mathics.core.parser import MathicsSingleLineFeeder, parse +from mathics.core.system_init import initialize_system initialize_system() definitions = Definitions(add_builtin=True) diff --git a/mathics/builtin/__init__.py b/mathics/builtin/__init__.py index 2bca659b0..5cc72381d 100755 --- a/mathics/builtin/__init__.py +++ b/mathics/builtin/__init__.py @@ -20,13 +20,10 @@ among other things. """ -import glob import importlib -import inspect -import os.path as osp import pkgutil import re -from typing import List, Optional +from typing import List from mathics.builtin.base import ( Builtin, @@ -36,15 +33,10 @@ mathics_to_python, ) from mathics.core.pattern import pattern_objects +from mathics.core.system_init import get_builtin_pyfiles, name_is_builtin_symbol from mathics.settings import ENABLE_FILES_MODULE -# Get a list of files in this directory. We'll exclude from the start -# files with leading characters we don't want like __init__ with its leading underscore. -__py_files__ = [ - osp.basename(f[0:-3]) - for f in glob.glob(osp.join(osp.dirname(__file__), "[a-z]*.py")) -] - +__py_files__ = get_builtin_pyfiles() mathics_to_sympy = {} # here we have: name -> sympy object sympy_to_mathics = {} @@ -74,26 +66,6 @@ def add_builtins(new_builtins): system_builtins.update(dict(new_builtins)) -def contribute(definitions): - # let MakeBoxes contribute first - system_builtins["System`MakeBoxes"].contribute(definitions) - for name, item in system_builtins.items(): - if name != "System`MakeBoxes": - item.contribute(definitions) - - from mathics.core.definitions import Definition - from mathics.core.expression import ensure_context - from mathics.core.parser import all_operator_names - - # All builtins are loaded. Create dummy builtin definitions for - # any remaining operators that don't have them. This allows - # operators like \[Cup] to behave correctly. - for operator in all_operator_names: - if not definitions.have_definition(ensure_context(operator)): - op = ensure_context(operator) - definitions.builtin[op] = Definition(name=op) - - def import_builtins(module_names: List[str], submodule_name=None) -> None: """ Imports the list of Mathics Built-in modules so that inside @@ -125,48 +97,6 @@ def import_module(module_name: str, import_name: str): import_module(module_name, import_name) -def name_is_builtin_symbol(module, name: str) -> Optional[type]: - """ - Checks if ``name`` should be added to definitions, and return - its associated Builtin class. - - Return ``None`` if the name should not get added to definitions. - """ - if name.startswith("_"): - return None - - module_object = getattr(module, name) - - # Look only at Class objects. - if not inspect.isclass(module_object): - return None - - # FIXME: tests involving module_object.__module__ are fragile and - # Python implementation specific. Figure out how to do this - # via the inspect module which is not implementation specific. - - # Skip those builtins defined in or imported from another module. - if module_object.__module__ != module.__name__: - return None - - # Skip objects in module mathics.builtin.base. - if module_object.__module__ == "mathics.builtin.base": - return None - - # Skip those builtins that are not submodules of mathics.builtin. - if not module_object.__module__.startswith("mathics.builtin."): - return None - - # If it is not a subclass of Builtin, skip it. - if not issubclass(module_object, Builtin): - return None - - # Skip Builtin classes that were explicitly marked for skipping. - if module_object in getattr(module, "DOES_NOT_ADD_BUILTIN_DEFINITION", []): - return None - return module_object - - # FIXME: redo using importlib since that is probably less fragile. exclude_files = {"codetables", "base"} module_names = [ @@ -231,8 +161,8 @@ def name_is_builtin_symbol(module, name: str) -> Optional[type]: # This set the default context for symbols in mathics.builtins if not type(instance).context: type(instance).context = "System`" + builtins_list.append((instance.get_name(), instance)) builtins_by_module[module.__name__].append(instance) -new_builtins = builtins_list -add_builtins(new_builtins) +add_builtins(builtins_list) diff --git a/mathics/core/definitions.py b/mathics/core/definitions.py index 731222ea3..6fc56571e 100644 --- a/mathics/core/definitions.py +++ b/mathics/core/definitions.py @@ -21,6 +21,7 @@ Symbol, strip_context, ) +from mathics.core.system_init import contribute from mathics.core.systemsymbols import SymbolGet from mathics_scanner.tokeniser import full_names_pattern @@ -130,7 +131,7 @@ def __init__( self.timing_trace_evaluation = False if add_builtin: - from mathics.builtin import modules, contribute + from mathics.builtin import modules from mathics.settings import ROOT_DIR loaded = False diff --git a/mathics/core/pymathics.py b/mathics/core/pymathics.py index 28b6a7dfc..481a48f91 100644 --- a/mathics/core/pymathics.py +++ b/mathics/core/pymathics.py @@ -7,8 +7,8 @@ import sys -from mathics.builtin.system_init import builtins_by_module from mathics.core.evaluation import Evaluation +from mathics.core.system_init import builtins_by_module, name_is_builtin_symbol # This dict probably does not belong here. pymathics = {} @@ -61,7 +61,6 @@ def load_pymathics_module(definitions, module): """ from mathics.builtin import ( builtins_by_module, - name_is_builtin_symbol, Builtin, ) diff --git a/mathics/builtin/system_init.py b/mathics/core/system_init.py similarity index 51% rename from mathics/builtin/system_init.py rename to mathics/core/system_init.py index 33079ee87..2e507001f 100644 --- a/mathics/builtin/system_init.py +++ b/mathics/core/system_init.py @@ -3,15 +3,9 @@ """ import glob +import inspect import os.path as osp - -from mathics.builtin.base import ( - Builtin, - Operator, - PatternObject, - SympyObject, - mathics_to_python, -) +from typing import Optional from mathics.core.pattern import pattern_objects @@ -37,6 +31,13 @@ def add_builtins(new_builtins): + from mathics.builtin.base import ( + Operator, + PatternObject, + SympyObject, + mathics_to_python, + ) + for var_name, builtin in new_builtins: name = builtin.get_name() if hasattr(builtin, "python_equivalent"): @@ -63,8 +64,29 @@ def builtins_dict(): } +def contribute(definitions): + # let MakeBoxes contribute first + system_builtins["System`MakeBoxes"].contribute(definitions) + for name, item in system_builtins.items(): + if name != "System`MakeBoxes": + item.contribute(definitions) + + from mathics.core.definitions import Definition + from mathics.core.expression import ensure_context + from mathics.core.parser import all_operator_names + + # All builtins are loaded. Create dummy builtin definitions for + # any remaining operators that don't have them. This allows + # operators like \[Cup] to behave correctly. + for operator in all_operator_names: + if not definitions.have_definition(ensure_context(operator)): + op = ensure_context(operator) + definitions.builtin[op] = Definition(name=op) + + def create_builtins_by_module(): - from mathics.builtin import modules, name_is_builtin_symbol, sanity_check + from mathics.builtin import modules + from mathics.builtin.base import Builtin for module in modules: builtins_by_module[module.__name__] = [] @@ -79,12 +101,22 @@ def create_builtins_by_module(): # This set the default context for symbols in mathics.builtins if not type(instance).context: type(instance).context = "System`" - assert sanity_check( - builtin_class, module - ), f"In {module.__name__} Builtin <<{builtin_class.__name__}>> did not pass the sanity check." - builtins_list.append((instance.get_name(), instance)) builtins_by_module[module.__name__].append(instance) + add_builtins(builtins_list) + + +def get_builtin_pyfiles() -> tuple: + """ + Return a list of files in this directory. We'll exclude from the start + files with leading characters we don't want like __init__ with its leading underscore. + """ + return tuple( + osp.basename(f[0:-3]) + for f in glob.glob( + osp.join(osp.dirname(__file__), "..", "builtin", "[a-z]*.py") + ) + ) display_operators_set = set() @@ -100,12 +132,53 @@ def initialize_system(): Not much here but more may be added. """ create_builtins_by_module() - from mathics.builtin import __py_files__ as old_py_files - - assert __py_files__ == old_py_files for modname, builtins in builtins_by_module.items(): for builtin in builtins: # name = builtin.get_name() operator = builtin.get_operator_display() if operator is not None: display_operators_set.add(operator) + + +def name_is_builtin_symbol(module, name: str) -> Optional[type]: + """ + Checks if ``name`` should be added to definitions, and return + its associated Builtin class. + + Return ``None`` if the name should not get added to definitions. + """ + from mathics.builtin.base import Builtin + + if name.startswith("_"): + return None + + module_object = getattr(module, name) + + # Look only at Class objects. + if not inspect.isclass(module_object): + return None + + # FIXME: tests involving module_object.__module__ are fragile and + # Python implementation specific. Figure out how to do this + # via the inspect module which is not implementation specific. + + # Skip those builtins defined in or imported from another module. + if module_object.__module__ != module.__name__: + return None + + # Skip objects in module mathics.builtin.base. + if module_object.__module__ == "mathics.builtin.base": + return None + + # Skip those builtins that are not submodules of mathics.builtin. + if not module_object.__module__.startswith("mathics.builtin."): + return None + + # If it is not a subclass of Builtin, skip it. + if not issubclass(module_object, Builtin): + return None + + # Skip Builtin classes that were explicitly marked for skipping. + if module_object in getattr(module, "DOES_NOT_ADD_BUILTIN_DEFINITION", []): + return None + return module_object diff --git a/mathics/doc/common_doc.py b/mathics/doc/common_doc.py index 623d79578..b5e0e2a41 100644 --- a/mathics/doc/common_doc.py +++ b/mathics/doc/common_doc.py @@ -34,11 +34,14 @@ from types import ModuleType from typing import Callable +import mathics.core as core from mathics import builtin from mathics import settings from mathics.builtin.base import check_requires_list from mathics.core.evaluation import Message, Print from mathics.core.util import IS_PYPY +from mathics.core.system_init import name_is_builtin_symbol + from mathics.doc.utils import slugify # These regular expressions pull out information from docstring or text in a file. @@ -830,7 +833,7 @@ def __init__(self, want_sorting=False): ( "Reference of Built-in Symbols", builtin.modules, - builtin.system_init.builtins_by_module, + core.system_init.builtins_by_module, True, ) ]: # nopep8 diff --git a/mathics/docpipeline.py b/mathics/docpipeline.py index df3fe029f..346f46f73 100644 --- a/mathics/docpipeline.py +++ b/mathics/docpipeline.py @@ -24,7 +24,7 @@ from mathics.core.definitions import Definitions from mathics.core.evaluation import Evaluation, Output from mathics.core.parser import MathicsSingleLineFeeder -from mathics.builtin.system_init import builtins_dict, initialize_system +from mathics.core.system_init import builtins_dict, initialize_system from mathics import version_string from mathics import settings diff --git a/mathics/format/mathml.py b/mathics/format/mathml.py index 8bcd8afc3..fcafe2dc7 100644 --- a/mathics/format/mathml.py +++ b/mathics/format/mathml.py @@ -21,7 +21,6 @@ ) from mathics.builtin.box.graphics import GraphicsBox from mathics.builtin.box.graphics3d import Graphics3DBox -from mathics.builtin.system_init import display_operators_set as operators from mathics.core.atoms import String @@ -33,6 +32,7 @@ ) from mathics.core.parser import is_symbol_name from mathics.core.symbols import SymbolTrue +from mathics.core.system_init import display_operators_set as operators def encode_mathml(text: str) -> str: diff --git a/mathics/main.py b/mathics/main.py index e49f66e75..e5b6668e6 100755 --- a/mathics/main.py +++ b/mathics/main.py @@ -14,7 +14,6 @@ from mathics import settings from mathics import version_string, license_string, __version__ from mathics.builtin.trace import TraceBuiltins, traced_do_replace -from mathics.builtin.system_init import initialize_system from mathics.core.atoms import String from mathics.core.definitions import autoload_files, Definitions, Symbol from mathics.core.evaluation import Evaluation, Output @@ -24,6 +23,7 @@ from mathics.core.rules import BuiltinRule from mathics.core.symbols import strip_context, SymbolNull from mathics.core.streams import stream_manager +from mathics.core.system_init import initialize_system from mathics.timing import show_lru_cache_statistics diff --git a/mathics/session.py b/mathics/session.py index 35962c026..ca8c2e845 100644 --- a/mathics/session.py +++ b/mathics/session.py @@ -12,11 +12,11 @@ import os.path as osp from typing import Optional -from mathics.builtin.system_init import initialize_system from mathics.core.definitions import autoload_files from mathics.core.parser import parse, MathicsSingleLineFeeder from mathics.core.definitions import Definitions from mathics.core.evaluation import Evaluation +from mathics.core.system_init import initialize_system import mathics.settings diff --git a/test/consistency-and-style/test_duplicate_builtins.py b/test/consistency-and-style/test_duplicate_builtins.py index 56a597c7c..de6faff9a 100644 --- a/test/consistency-and-style/test_duplicate_builtins.py +++ b/test/consistency-and-style/test_duplicate_builtins.py @@ -6,8 +6,9 @@ """ import pytest import os -from mathics.builtin import name_is_builtin_symbol, modules +from mathics.builtin import modules from mathics.builtin.base import Builtin +from mathics.core.system_init import name_is_builtin_symbol @pytest.mark.skipif(