Skip to content

Commit b91525b

Browse files
committed
Add singleton support & tests
1 parent 8a1e764 commit b91525b

File tree

5 files changed

+26
-4
lines changed

5 files changed

+26
-4
lines changed

β€Žsrc/godot/classes.pxd.j2β€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,6 @@ cdef class {{ cls.cy_type }}({{ cls.inherits.cy_type if cls.inherits else "" }})
9999

100100

101101
cdef object _load_class(str name)
102-
cdef object _load_singleton(str name)
102+
cpdef object _load_singleton(str name)
103103
cdef void _cleanup_loaded_classes_and_singletons()
104104
cdef object _object_call(gd_object_t obj, str meth, list args)

β€Žsrc/godot/classes.pyx.j2β€Ž

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ cdef void _cleanup_loaded_classes_and_singletons():
102102
_loaded_classes.clear()
103103

104104

105-
cdef object _load_singleton(str name):
105+
cpdef object _load_singleton(str name):
106106
try:
107107
return _loaded_singletons[name]
108108
except KeyError:
@@ -113,6 +113,10 @@ cdef object _load_singleton(str name):
113113
cdef gd_string_name_t gdname = gdapi.gd_string_name_from_unchecked_pystr(name)
114114
cdef gd_object_t gdobj = gdptrs.gdptr_global_get_singleton(&gdname)
115115
gdapi.gd_string_name_del(&gdname)
116+
117+
if gdobj == NULL:
118+
raise RuntimeError(f"Singleton `{name}` doesn't exist in Godot !")
119+
116120
cdef object singleton = cls._from_ptr(<size_t>gdobj)
117121

118122
_loaded_singletons[name] = singleton

β€Žsrc/godot/meson.buildβ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ subdir('hazmat')
1111
##############################################################################
1212

1313

14-
foreach src: ['__init__.py', '__init__.pyi', 'py.typed']
14+
foreach src: ['__init__.py', 'singletons.py', '__init__.pyi', 'py.typed']
1515
install_data(
1616
src,
1717
install_dir: join_paths(python_site_packages_install_path, 'godot'),

β€Žsrc/godot/singletons.pyβ€Ž

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from .classes import _load_singleton
2+
3+
4+
def __getattr__(name: str):
5+
try:
6+
return _load_singleton(name)
7+
except RuntimeError:
8+
raise AttributeError
Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,11 @@
1-
# TODO
1+
from clodotest import assert_isinstance
2+
import godot
3+
4+
5+
def test_access():
6+
from godot.classes import OS as _OS
7+
from godot.singletons import OS
8+
9+
assert_isinstance(OS, _OS)
10+
assert_isinstance(OS.delta_smoothing, bool)
11+
assert_isinstance(OS.get_config_dir(), godot.GDString)

0 commit comments

Comments
Β (0)