Skip to content

Commit 3cef994

Browse files
committed
fix tests
1 parent aa716f4 commit 3cef994

File tree

2 files changed

+43
-37
lines changed

2 files changed

+43
-37
lines changed

examples/02_combining_metaclasses.ipynb

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2,58 +2,58 @@
22
"cells": [
33
{
44
"cell_type": "code",
5-
"execution_count": 2,
5+
"execution_count": 1,
66
"metadata": {},
77
"outputs": [
88
{
9-
"name": "stdout",
10-
"output_type": "stream",
11-
"text": [
12-
"value: 1.0\n"
9+
"ename": "TypeError",
10+
"evalue": "Cannot inherit from concrete (final) class 'Test'. Class '_InitableModule' attempts to inherit from it. strict classes are either abstract or final.",
11+
"output_type": "error",
12+
"traceback": [
13+
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
14+
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
15+
"Cell \u001b[0;32mIn[1], line 22\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[39mdef\u001b[39;00m\u001b[39m \u001b[39m\u001b[39m__init__\u001b[39m(\u001b[39mself\u001b[39m):\n\u001b[1;32m 19\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mx \u001b[39m=\u001b[39m \u001b[39m1.0\u001b[39m\n\u001b[0;32m---> 22\u001b[0m t \u001b[39m=\u001b[39m Test()\n\u001b[1;32m 23\u001b[0m \u001b[39mprint\u001b[39m(\u001b[39m\"\u001b[39m\u001b[39mvalue:\u001b[39m\u001b[39m\"\u001b[39m, t\u001b[39m.\u001b[39mx)\n\u001b[1;32m 26\u001b[0m \u001b[39mdef\u001b[39;00m\u001b[39m \u001b[39m\u001b[39mf\u001b[39m(x):\n",
16+
"File \u001b[0;32m~/Documents/ihoop/ihoop/strict.py:179\u001b[0m, in \u001b[0;36m_StrictMeta.__call__\u001b[0;34m(cls, *args, **kwargs)\u001b[0m\n\u001b[1;32m 173\u001b[0m abs_attrs \u001b[39m=\u001b[39m \u001b[39mlist\u001b[39m(\u001b[39mgetattr\u001b[39m(\u001b[39mcls\u001b[39m, \u001b[39m\"\u001b[39m\u001b[39m_strict_abstract_attributes_\u001b[39m\u001b[39m\"\u001b[39m, \u001b[39mset\u001b[39m()))\n\u001b[1;32m 174\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mTypeError\u001b[39;00m(\n\u001b[1;32m 175\u001b[0m \u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mCannot instantiate abstract class \u001b[39m\u001b[39m{\u001b[39;00m\u001b[39mcls\u001b[39m\u001b[39m.\u001b[39m\u001b[39m__name__\u001b[39m\u001b[39m}\u001b[39;00m\u001b[39m. \u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m 176\u001b[0m \u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mAbstract elements: methods=\u001b[39m\u001b[39m{\u001b[39;00mabs_methods\u001b[39m}\u001b[39;00m\u001b[39m, attributes=\u001b[39m\u001b[39m{\u001b[39;00mabs_attrs\u001b[39m}\u001b[39;00m\u001b[39m\"\u001b[39m\n\u001b[1;32m 177\u001b[0m )\n\u001b[0;32m--> 179\u001b[0m instance \u001b[39m=\u001b[39m \u001b[39msuper\u001b[39;49m()\u001b[39m.\u001b[39;49m\u001b[39m__call__\u001b[39;49m(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[1;32m 181\u001b[0m \u001b[39mobject\u001b[39m\u001b[39m.\u001b[39m\u001b[39m__setattr__\u001b[39m(instance, \u001b[39m\"\u001b[39m\u001b[39m_strict_initialized\u001b[39m\u001b[39m\"\u001b[39m, \u001b[39mTrue\u001b[39;00m)\n\u001b[1;32m 183\u001b[0m \u001b[39mreturn\u001b[39;00m instance\n",
17+
" \u001b[0;31m[... skipping hidden 1 frame]\u001b[0m\n",
18+
"File \u001b[0;32m~/miniforge3/envs/dev_thrml/lib/python3.10/site-packages/equinox/_module.py:793\u001b[0m, in \u001b[0;36m_make_initable_wrapper\u001b[0;34m(cls)\u001b[0m\n\u001b[1;32m 791\u001b[0m \u001b[39mdef\u001b[39;00m\u001b[39m \u001b[39m\u001b[39m_make_initable_wrapper\u001b[39m(\u001b[39mcls\u001b[39m: _ActualModuleMeta) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m _ActualModuleMeta:\n\u001b[1;32m 792\u001b[0m post_init \u001b[39m=\u001b[39m \u001b[39mgetattr\u001b[39m(\u001b[39mcls\u001b[39m, \u001b[39m\"\u001b[39m\u001b[39m__post_init__\u001b[39m\u001b[39m\"\u001b[39m, \u001b[39mNone\u001b[39;00m)\n\u001b[0;32m--> 793\u001b[0m \u001b[39mreturn\u001b[39;00m _make_initable(\u001b[39mcls\u001b[39;49m, \u001b[39mcls\u001b[39;49m\u001b[39m.\u001b[39;49m\u001b[39m__init__\u001b[39;49m, post_init, wraps\u001b[39m=\u001b[39;49m\u001b[39mFalse\u001b[39;49;00m)\n",
19+
"File \u001b[0;32m~/miniforge3/envs/dev_thrml/lib/python3.10/site-packages/equinox/_module.py:811\u001b[0m, in \u001b[0;36m_make_initable\u001b[0;34m(***failed resolving arguments***)\u001b[0m\n\u001b[1;32m 808\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m 809\u001b[0m field_names \u001b[39m=\u001b[39m {field\u001b[39m.\u001b[39mname \u001b[39mfor\u001b[39;00m field \u001b[39min\u001b[39;00m dataclasses\u001b[39m.\u001b[39mfields(\u001b[39mcls\u001b[39m)}\n\u001b[0;32m--> 811\u001b[0m \u001b[39mclass\u001b[39;00m\u001b[39m \u001b[39m\u001b[39m_InitableModule\u001b[39;00m(_Initable, \u001b[39mcls\u001b[39m):\n\u001b[1;32m 812\u001b[0m \u001b[39mpass\u001b[39;00m\n\u001b[1;32m 814\u001b[0m \u001b[39mdef\u001b[39;00m\u001b[39m \u001b[39m\u001b[39m__setattr__\u001b[39m(\u001b[39mself\u001b[39m, name, value):\n",
20+
"Cell \u001b[0;32mIn[1], line 8\u001b[0m, in \u001b[0;36m_StrictEqxMeta.__new__\u001b[0;34m(mcs, name, bases, namespace, **kwargs)\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[39mdef\u001b[39;00m\u001b[39m \u001b[39m\u001b[39m__new__\u001b[39m(mcs, name, bases, namespace, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[0;32m----> 8\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39msuper\u001b[39;49m()\u001b[39m.\u001b[39;49m\u001b[39m__new__\u001b[39;49m(mcs, name, bases, namespace, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n",
21+
"File \u001b[0;32m~/Documents/ihoop/ihoop/strict.py:121\u001b[0m, in \u001b[0;36m_StrictMeta.__new__\u001b[0;34m(mcs, name, bases, namespace, **kwargs)\u001b[0m\n\u001b[1;32m 119\u001b[0m \u001b[39m# Cannot inherit from a concrete strict class\u001b[39;00m\n\u001b[1;32m 120\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mgetattr\u001b[39m(base, \u001b[39m\"\u001b[39m\u001b[39m_strict_is_abstract_\u001b[39m\u001b[39m\"\u001b[39m, \u001b[39mTrue\u001b[39;00m):\n\u001b[0;32m--> 121\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mTypeError\u001b[39;00m(\n\u001b[1;32m 122\u001b[0m \u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mCannot inherit from concrete (final) class \u001b[39m\u001b[39m'\u001b[39m\u001b[39m{\u001b[39;00mbase\u001b[39m.\u001b[39m\u001b[39m__name__\u001b[39m\u001b[39m}\u001b[39;00m\u001b[39m'\u001b[39m\u001b[39m. \u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m 123\u001b[0m \u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mClass \u001b[39m\u001b[39m'\u001b[39m\u001b[39m{\u001b[39;00mname\u001b[39m}\u001b[39;00m\u001b[39m'\u001b[39m\u001b[39m attempts to inherit from it. \u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m 124\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mstrict classes are either abstract or final.\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m 125\u001b[0m )\n\u001b[1;32m 127\u001b[0m \u001b[39m# Cannot override a concrete method from an strict base\u001b[39;00m\n\u001b[1;32m 128\u001b[0m \u001b[39mfor\u001b[39;00m meth_name, meth_obj \u001b[39min\u001b[39;00m namespace\u001b[39m.\u001b[39mitems():\n\u001b[1;32m 129\u001b[0m \u001b[39m# Allow every class to override its own constructor\u001b[39;00m\n",
22+
"\u001b[0;31mTypeError\u001b[0m: Cannot inherit from concrete (final) class 'Test'. Class '_InitableModule' attempts to inherit from it. strict classes are either abstract or final."
1323
]
14-
},
15-
{
16-
"data": {
17-
"text/plain": [
18-
"Array(2., dtype=float32, weak_type=True)"
19-
]
20-
},
21-
"execution_count": 2,
22-
"metadata": {},
23-
"output_type": "execute_result"
2424
}
2525
],
2626
"source": [
27-
"import equinox as eqx\n",
28-
"import ihoop\n",
29-
"import jax\n",
30-
"\n",
27+
"# import equinox as eqx\n",
28+
"# import ihoop\n",
29+
"# import jax\n",
3130
"\n",
32-
"class _StrictEqxMeta(ihoop.strict._StrictMeta, eqx._module._module._ModuleMeta):\n",
33-
" def __new__(mcs, name, bases, namespace, **kwargs):\n",
34-
" return super().__new__(mcs, name, bases, namespace, **kwargs)\n",
31+
"# # works with https://github.com/patrick-kidger/equinox/pull/1028\n",
32+
"# class _StrictEqxMeta(ihoop.strict._StrictMeta, eqx._module._module._ModuleMeta):\n",
33+
"# def __new__(mcs, name, bases, namespace, **kwargs):\n",
34+
"# return super().__new__(mcs, name, bases, namespace, **kwargs)\n",
3535
"\n",
3636
"\n",
37-
"class StrictModule(eqx.Module, ihoop.Strict, metaclass=_StrictEqxMeta):\n",
38-
" pass\n",
37+
"# class StrictModule(eqx.Module, ihoop.Strict, metaclass=_StrictEqxMeta):\n",
38+
"# pass\n",
3939
"\n",
4040
"\n",
41-
"class Test(StrictModule):\n",
42-
" x: float\n",
41+
"# class Test(StrictModule):\n",
42+
"# x: float\n",
4343
"\n",
44-
" def __init__(self):\n",
45-
" self.x = 1.0\n",
44+
"# def __init__(self):\n",
45+
"# self.x = 1.0\n",
4646
"\n",
4747
"\n",
48-
"t = Test()\n",
49-
"print(\"value:\", t.x)\n",
48+
"# t = Test()\n",
49+
"# print(\"value:\", t.x)\n",
5050
"\n",
5151
"\n",
52-
"def f(x):\n",
53-
" return x.x**2\n",
52+
"# def f(x):\n",
53+
"# return x.x**2\n",
5454
"\n",
5555
"\n",
56-
"jax.grad(f)(t).x"
56+
"# jax.grad(f)(t).x"
5757
]
5858
},
5959
{
@@ -66,7 +66,7 @@
6666
],
6767
"metadata": {
6868
"kernelspec": {
69-
"display_name": "Python 3.10.14 ('dev_diffrax')",
69+
"display_name": "Python 3.10.16 ('dev_thrml')",
7070
"language": "python",
7171
"name": "python3"
7272
},
@@ -80,12 +80,12 @@
8080
"name": "python",
8181
"nbconvert_exporter": "python",
8282
"pygments_lexer": "ipython3",
83-
"version": "3.10.14"
83+
"version": "3.10.16"
8484
},
8585
"orig_nbformat": 4,
8686
"vscode": {
8787
"interpreter": {
88-
"hash": "01761703e8e304055600d311574f89f8a646f73edac04b8bff1580ad2d98581f"
88+
"hash": "591c6f2f872d065a4e9643c78186d30103ad07846137f2348d83da528974561e"
8989
}
9090
}
9191
},

tests/test_strict.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import unittest
2-
from ihoop import Strict, AbstractAttribute
2+
3+
from ihoop import AbstractAttribute, Strict
34

45

56
class TestStrict(unittest.TestCase):
@@ -29,6 +30,7 @@ def __init__(self, v: int):
2930

3031
def test_abstract_class_name_prefix_required(self):
3132
with self.assertRaises(TypeError):
33+
3234
class Bad(Strict):
3335
value: AbstractAttribute[int]
3436

@@ -37,6 +39,7 @@ class _AbstractBase(Strict):
3739
value: AbstractAttribute[int]
3840

3941
with self.assertRaises(TypeError):
42+
4043
class AbstractThing(_AbstractBase):
4144
value: int
4245

@@ -54,6 +57,7 @@ def __init__(self, v: int):
5457
self.value = v
5558

5659
with self.assertRaises(TypeError):
60+
5761
class SubFinal(Final):
5862
pass
5963

@@ -71,12 +75,14 @@ def __init__(self, v: int):
7175
self.value = v
7276

7377
with self.assertRaises(TypeError):
78+
7479
class BadOverride(Final):
7580
def concrete(self):
7681
return 2
7782

7883
def test_abstract_attribute_value_assignment_forbidden(self):
7984
with self.assertRaises(TypeError):
85+
8086
class AbstractBad(Strict):
8187
attr: AbstractAttribute[int] = 1
8288

0 commit comments

Comments
 (0)