python: hide native module behind python front-end API

Encapsulate the rust code behind a public API (in __init__.py for now)
This commit is contained in:
Simon Hausmann 2023-12-21 11:37:53 +01:00 committed by Simon Hausmann
parent 07c168bbf9
commit d1529af3cc
7 changed files with 35 additions and 23 deletions

1
api/python/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
slint/*.so

View file

@ -2,7 +2,7 @@
# SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-1.1 OR LicenseRef-Slint-commercial # SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-1.1 OR LicenseRef-Slint-commercial
[package] [package]
name = "pyslint" name = "slint-python"
version.workspace = true version.workspace = true
authors.workspace = true authors.workspace = true
edition.workspace = true edition.workspace = true
@ -14,7 +14,6 @@ publish = false
rust-version.workspace = true rust-version.workspace = true
[lib] [lib]
name = "slint"
path = "lib.rs" path = "lib.rs"
crate-type = ["cdylib"] crate-type = ["cdylib"]
@ -26,3 +25,6 @@ pyo3 = { version = "0.20.0", features = ["extension-module", "indexmap", "chrono
indexmap = { version = "2.1.0" } indexmap = { version = "2.1.0" }
chrono = "0.4" chrono = "0.4"
spin_on = "0.1" spin_on = "0.1"
[package.metadata.maturin]
python-source = "slint"

View file

@ -6,7 +6,7 @@ requires = ["maturin>=1,<2"]
build-backend = "maturin" build-backend = "maturin"
[project] [project]
name = "pyslint" name = "slint"
version = "1.4.0" version = "1.4.0"
classifiers = [ classifiers = [
"Development Status :: 3 - Alpha", "Development Status :: 3 - Alpha",

View file

@ -0,0 +1,10 @@
# Copyright © SixtyFPS GmbH <info@slint.dev>
# SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-1.1 OR LicenseRef-Slint-commercial
from . import slint as native
def load_file(path):
compiler = native.ComponentCompiler()
compdef = compiler.build_from_path(path)
instance = compdef.create()
return instance

View file

@ -2,11 +2,11 @@
# SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-1.1 OR LicenseRef-Slint-commercial # SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-1.1 OR LicenseRef-Slint-commercial
import pytest import pytest
import slint from slint import slint as native
from slint import ValueType; from slint.slint import ValueType;
def test_basic_compiler(): def test_basic_compiler():
compiler = slint.ComponentCompiler() compiler = native.ComponentCompiler()
assert compiler.include_paths == [] assert compiler.include_paths == []
compiler.include_paths = ["testing"] compiler.include_paths = ["testing"]
@ -54,7 +54,7 @@ def test_basic_compiler():
assert instance != None assert instance != None
def test_compiler_build_from_path(): def test_compiler_build_from_path():
compiler = slint.ComponentCompiler() compiler = native.ComponentCompiler()
assert len(compiler.diagnostics) == 0 assert len(compiler.diagnostics) == 0
@ -62,5 +62,5 @@ def test_compiler_build_from_path():
diags = compiler.diagnostics diags = compiler.diagnostics
assert len(diags) == 1 assert len(diags) == 1
assert diags[0].level == slint.DiagnosticLevel.Error assert diags[0].level == native.DiagnosticLevel.Error
assert diags[0].message.startswith("Could not load Nonexistent.slint:") assert diags[0].message.startswith("Could not load Nonexistent.slint:")

View file

@ -2,11 +2,11 @@
# SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-1.1 OR LicenseRef-Slint-commercial # SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-1.1 OR LicenseRef-Slint-commercial
import pytest import pytest
import slint from slint import slint as native
from slint import ValueType; from slint.slint import ValueType;
def test_property_access(): def test_property_access():
compiler = slint.ComponentCompiler() compiler = native.ComponentCompiler()
compdef = compiler.build_from_source(""" compdef = compiler.build_from_source("""
export global TestGlobal { export global TestGlobal {
@ -69,7 +69,7 @@ def test_property_access():
assert instance.get_global_property("TestGlobal", "theglobalprop") == "Ok" assert instance.get_global_property("TestGlobal", "theglobalprop") == "Ok"
def test_callbacks(): def test_callbacks():
compiler = slint.ComponentCompiler() compiler = native.ComponentCompiler()
compdef = compiler.build_from_source(""" compdef = compiler.build_from_source("""
export global TestGlobal { export global TestGlobal {
@ -113,8 +113,7 @@ def test_callbacks():
if __name__ == "__main__": if __name__ == "__main__":
compiler = slint.ComponentCompiler() import slint
compdef = compiler.build_from_path("../../examples/printerdemo/ui/printerdemo.slint") instance = slint.load_file("../../examples/printerdemo/ui/printerdemo.slint")
instance = compdef.create()
instance.set_global_callback("PrinterQueue", "start-job", lambda title: print(f"new print job {title}")) instance.set_global_callback("PrinterQueue", "start-job", lambda title: print(f"new print job {title}"))
instance.run() instance.run()

View file

@ -2,8 +2,8 @@
# SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-1.1 OR LicenseRef-Slint-commercial # SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-1.1 OR LicenseRef-Slint-commercial
import pytest import pytest
import slint from slint import slint as native
from slint import ValueType from slint.slint import ValueType;
from datetime import timedelta from datetime import timedelta
def test_timer(): def test_timer():
@ -13,14 +13,14 @@ def test_timer():
global counter global counter
counter = counter + 1 counter = counter + 1
if counter >= 2: if counter >= 2:
slint.quit_event_loop() native.quit_event_loop()
test_timer = slint.Timer() test_timer = native.Timer()
test_timer.start(slint.TimerMode.Repeated, timedelta(milliseconds=100), quit_after_two_invocations) test_timer.start(native.TimerMode.Repeated, timedelta(milliseconds=100), quit_after_two_invocations)
slint.run_event_loop() native.run_event_loop()
test_timer.stop() test_timer.stop()
assert(counter == 2) assert(counter == 2)
def test_single_shot(): def test_single_shot():
slint.Timer.single_shot(timedelta(milliseconds=100), slint.quit_event_loop) native.Timer.single_shot(timedelta(milliseconds=100), native.quit_event_loop)
slint.run_event_loop() native.run_event_loop()