Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/consistency-checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ jobs:
sudo apt update -qq && sudo apt install llvm-dev remake
python -m pip install --upgrade pip
# We can comment out after next Mathics-Scanner release
python -m pip install -e git+https://github.com/Mathics3/mathics-scanner#egg=Mathics-Scanner[full]
python -m pip install -e "Mathics-Scanner[full] @ git+https://github.com/Mathics3/mathics-scanner"
pip install -e .

- name: Install Mathics with minimum dependencies
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/macos.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ jobs:
run: |
# We can comment out after next Mathics-Scanner release
# python -m pip install Mathics-Scanner[full]
python -m pip install -e git+https://github.com/Mathics3/mathics-scanner#egg=Mathics-Scanner[full]
python -m pip install -e "Mathics-Scanner[full] @ git+https://github.com/Mathics3/mathics-scanner"
pip install -e .
remake -x develop-full
- name: Test Mathics3
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/packages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ jobs:
run: |
python -m pip install --upgrade pip
# We can comment out after next Mathics-Scanner release
python -m pip install -e git+https://github.com/Mathics3/mathics-scanner#egg=Mathics-Scanner[full]
python -m pip install -e "Mathics-Scanner[full] @ git+https://github.com/Mathics3/mathics-scanner"
- name: Run Mathics3 Combinatorica tests
run: |
git submodule init
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/plot-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ jobs:
run: |
python -m pip install --upgrade pip
# We can comment out after next Mathics-Scanner release
python -m pip install -e git+https://github.com/Mathics3/mathics-scanner#egg=Mathics-Scanner[full]
python -m pip install -e "Mathics-Scanner[full] @ git+https://github.com/Mathics3/mathics-scanner"
git clone --depth 1 https://github.com/Mathics3/mathics-scanner.git
cd mathics-scanner/
pip install -e .
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/ubuntu-bench.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
python -m pip install --upgrade pip
python -m pip install pytest-benchmark
# We can comment out after next Mathics-Scanner release
python -m pip install -e git+https://github.com/Mathics3/mathics-scanner#egg=Mathics-Scanner[full]
python -m pip install -e "Mathics-Scanner[full] @ git+https://github.com/Mathics3/mathics-scanner"
# python -m pip install Mathics-Scanner[full]
pip install -e .
remake -x develop
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/ubuntu-cython.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ jobs:
sudo apt-get update -qq && sudo apt-get install -qq liblapack-dev llvm-dev tesseract-ocr
python -m pip install --upgrade pip
# We can comment out after next Mathics-Scanner release
python -m pip install -e git+https://github.com/Mathics3/mathics-scanner#egg=Mathics-Scanner[full]
python -m pip install -e "Mathics-Scanner[full] @ git+https://github.com/Mathics3/mathics-scanner"
pip install -e .
cd ..

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ jobs:
- name: Install Mathics3 with Python dependencies
run: |
# We can comment out after next Mathics-Scanner release
python -m pip install -e git+https://github.com/Mathics3/mathics-scanner#egg=Mathics-Scanner[full]
python -m pip install -e "Mathics-Scanner[full] @ git+https://github.com/Mathics3/mathics-scanner"
pip install -e .

# python -m pip install Mathics-Scanner[full]
Expand Down
8 changes: 4 additions & 4 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,13 @@ MATHICS3_MODULE_OPTION ?= --load-module pymathics.graph,pymathics.natlang
test \
texdoc

SANDBOX ?=
MATHICS3_SANDBOX ?=
ifeq ($(OS),Windows_NT)
SANDBOX = t
MATHICS3_SANDBOX = t
else
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Darwin)
SANDBOX = t
MATHICS3_SANDBOX = t
endif
endif

Expand Down Expand Up @@ -155,7 +155,7 @@ doctest-data: mathics/builtin/*.py mathics/doc/documentation/*.mdoc mathics/doc/

#: Run tests that appear in docstring in the code. Use environment variable "DOCTEST_OPTIONS" for doctest options
doctest:
MATHICS_CHARACTER_ENCODING="ASCII" SANDBOX=$(SANDBOX) $(PYTHON) mathics/docpipeline.py $(DOCTEST_OPTIONS)
MATHICS_CHARACTER_ENCODING="ASCII" MATHICS3_SANDBOX=$(MATHICS3_SANDBOX) $(PYTHON) mathics/docpipeline.py $(DOCTEST_OPTIONS)

#: Run tests that appear in docstring in the code, stopping on the first error.
doctest-x:
Expand Down
5 changes: 4 additions & 1 deletion mathics/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -357,7 +357,10 @@ def interactive_eval_loop(shell, full_form: bool, strict_wl_output: bool):

show_echo(source_code, evaluation)
if len(source_code) and source_code[0] == "!":
subprocess.run(source_code[1:], shell=True)
if not settings.ENABLE_SYSTEM_COMMANDS:
evaluation.message("Run", "dis")
else:
subprocess.run(source_code[1:], shell=True)
shell.definitions.increment_line_no(1)
continue
if query is None:
Expand Down
2 changes: 1 addition & 1 deletion mathics/builtin/box/compilation.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class CompiledCodeBox(BoxExpression):

def init(self, *args, **kwargs):
self._elements = args
self.box_options = kwargs
self.box_attributes = kwargs

def boxes_to_text(self, elements=None, **options):
if elements is None:
Expand Down
75 changes: 45 additions & 30 deletions mathics/builtin/box/layout.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ class FormBox(BoxExpression):
summary_text = "wrap boxes with an association to a particular form"

def init(self, *elems, **kwargs):
self.box_options = kwargs
self.box_attributes = kwargs
self.form = elems[1]
self.boxes = elems[0]
assert isinstance(self.boxes, BoxElementMixin), f"{type(self.boxes)}"
Expand All @@ -136,7 +136,7 @@ def elements(self):
self.boxes,
self.form,
),
self.box_options,
self.box_attributes,
)
return self._elements

Expand Down Expand Up @@ -178,7 +178,7 @@ def elements(self):
self.num,
self.den,
),
self.box_options,
self.box_attributes,
)
return self._elements

Expand All @@ -193,7 +193,7 @@ def eval(self, num, den, evaluation: Evaluation, options: dict):
def init(self, num, den, **options):
self.num = num
self.den = den
self.box_options = options
self.box_attributes = options


class GridBox(BoxExpression):
Expand Down Expand Up @@ -228,19 +228,21 @@ class GridBox(BoxExpression):
@property
def elements(self):
if self._elements is None:
self._elements = elements_to_expressions(self, self.items, self.box_options)
self._elements = elements_to_expressions(
self, self.items, self.box_attributes
)
return self._elements

def init(self, *elems, **kwargs):
self.box_options = kwargs
self.box_attributes = kwargs
self.items = elems
self._elements = elems

def get_array(self, elements, evaluation):
if not elements:
raise BoxConstructError

options = self.box_options
options = self.box_attributes

expr = elements[0]
if not expr.has_form("List", None):
Expand Down Expand Up @@ -293,13 +295,13 @@ class InterpretationBox(BoxExpression):

def __repr__(self):
result = "InterpretationBox\n " + repr(self.boxes)
result += f"\n {self.box_options}"
result += f"\n {self.box_attributes}"
return result

def init(self, *expr, **options):
self.boxes = expr[0]
self.expr = expr[1]
self.box_options = options
self.box_attributes = options

@property
def elements(self):
Expand All @@ -310,7 +312,7 @@ def elements(self):
self.boxes,
self.expr,
),
self.box_options,
self.box_attributes,
)
return self._elements

Expand Down Expand Up @@ -365,13 +367,13 @@ class PaneBox(BoxExpression):
def elements(self):
if self._elements is None:
self._elements = elements_to_expressions(
self, (self.boxes,), self.box_options
self, (self.boxes,), self.box_attributes
)
return self._elements

def init(self, expr, **options):
self.boxes = expr
self.box_options = options
self.box_attributes = options

def eval_panebox1(self, expr, evaluation, options):
"PaneBox[expr_String, OptionsPattern[]]"
Expand Down Expand Up @@ -409,6 +411,16 @@ class RowBox(BoxExpression):
def __repr__(self):
return f"RowBox[{self.elements[0].__repr__()}]"

def __init__(self, *args, **kwargs):
# indent level nesting level used in rendering MathML boxes
self.indent_level: int = 0

# Consider adding.
# self.width: int = 0

# Pass all arguments to the parent class.
super().__init__(*args, **kwargs)

@property
def elements(self):
if self._elements is None:
Expand All @@ -433,7 +445,10 @@ def eval_list(self, boxes, evaluation):

def init(self, *items, **kwargs):
# TODO: check that each element is an string or a BoxElementMixin
self.box_options = {}
self.box_attributes = {}
if len(items) == 0:
self.items = tuple()
return
if isinstance(items[0], Expression):
if len(items) != 1:
raise Exception(
Expand Down Expand Up @@ -506,13 +521,13 @@ def elements(self):
if self._elements is None:
index = self.index
if index is None:
# self.box_options
# self.box_attributes
self._elements = elements_to_expressions(
self, (self.radicand,), self.box_options
self, (self.radicand,), self.box_attributes
)
else:
self._elements = elements_to_expressions(
self, (self.radicand, index), self.box_options
self, (self.radicand, index), self.box_attributes
)
return self._elements

Expand All @@ -532,7 +547,7 @@ def eval(self, radicand, evaluation: Evaluation, options: dict):
def init(self, radicand, index=None, **options):
self.radicand = radicand
self.index = index
self.box_options = options
self.box_attributes = options


class StyleBox(BoxExpression):
Expand Down Expand Up @@ -564,11 +579,11 @@ def elements(self):
boxes = self.boxes
if style:
self._elements = elements_to_expressions(
self, (boxes, style), self.box_options
self, (boxes, style), self.box_attributes
)
else:
self._elements = elements_to_expressions(
self, (boxes,), self.box_options
self, (boxes,), self.box_attributes
)
return self._elements

Expand All @@ -593,10 +608,10 @@ def get_string_value(self) -> str:
def init(self, boxes, style=None, **options):
# This implementation supersedes Expression.process_style_box
if isinstance(boxes, StyleBox):
options.update(boxes.box_options)
options.update(boxes.box_attributes)
boxes = boxes.boxes
self.style = style
self.box_options = options
self.box_attributes = options
assert options is not None
self.boxes = boxes
assert isinstance(
Expand Down Expand Up @@ -632,7 +647,7 @@ class SubscriptBox(BoxExpression):
def elements(self):
if self._elements is None:
self._elements = elements_to_expressions(
self, (self.base, self.subindex), self.box_options
self, (self.base, self.subindex), self.box_attributes
)
return self._elements

Expand All @@ -645,7 +660,7 @@ def eval(self, a, b, evaluation: Evaluation, options: dict):
return SubscriptBox(a_box, b_box, **options)

def init(self, a, b, **options):
self.box_options = options.copy()
self.box_attributes = options.copy()
if not (isinstance(a, BoxElementMixin) and isinstance(b, BoxElementMixin)):
raise Exception((a, b), "are not boxes")
self.base = a
Expand All @@ -671,15 +686,15 @@ class SubsuperscriptBox(BoxExpression):
@property
def elements(self):
if self._elements is None:
# self.box_options
# self.box_attributes
self._elements = elements_to_expressions(
(
self,
self.base,
self.subindex,
self.superindex,
),
self.box_options,
self.box_attributes,
)
return self._elements

Expand All @@ -693,7 +708,7 @@ def eval(self, a, b, c, evaluation: Evaluation, options: dict):
return SubsuperscriptBox(a_box, b_box, c_box, **options)

def init(self, a, b, c, **options):
self.box_options = options.copy()
self.box_attributes = options.copy()
if not all(isinstance(x, BoxElementMixin) for x in (a, b, c)):
raise Exception((a, b, c), "are not boxes")
self.base = a
Expand Down Expand Up @@ -726,7 +741,7 @@ def elements(self):
self.base,
self.superindex,
),
self.box_options,
self.box_attributes,
)
return self._elements

Expand All @@ -739,7 +754,7 @@ def eval(self, a, b, evaluation: Evaluation, options: dict):
return SuperscriptBox(a_box, b_box, **options)

def init(self, a, b, **options):
self.box_options = options.copy()
self.box_attributes = options.copy()
if not all(isinstance(x, BoxElementMixin) for x in (a, b)):
raise Exception((a, b), "are not boxes")
self.base = a
Expand All @@ -763,7 +778,7 @@ class TagBox(BoxExpression):
summary_text = "box tag with a head"

def init(self, *elems, **kwargs):
self.box_options = kwargs
self.box_attributes = kwargs
self.form = elems[1]
self.boxes = elems[0]
assert isinstance(self.boxes, BoxElementMixin), f"{type(self.boxes)}"
Expand All @@ -777,7 +792,7 @@ def elements(self):
self.boxes,
self.form,
),
self.box_options,
self.box_attributes,
)
return self._elements

Expand Down
11 changes: 8 additions & 3 deletions mathics/builtin/forms/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,16 @@ def __new__(cls, *args, **kwargs):
name = cls.__name__

if hasattr(cls, "in_printforms") and cls.in_printforms:
definitions.PrintForms.add(Symbol(name))
definitions.PRINT_FORMS.add(Symbol(name))
if hasattr(cls, "in_outputforms") and cls.in_outputforms:
if name in definitions.OutputForms:
if name in definitions.OUTPUT_FORMS:
raise RuntimeError(f"{name} already added to $OutputsForms")
definitions.OutputForms.add(Symbol(name))
definitions.OUTPUT_FORMS.add(Symbol(name))
if hasattr(cls, "in_boxforms") and cls.in_boxforms:
if name in definitions.BOX_FORMS:
raise RuntimeError(f"{name} already added to $BoxForms")
definitions.BOX_FORMS.add(Symbol(name))

form_symbol_to_class[Symbol(name)] = cls
return instance

Expand Down
Loading