Compare commits

..

1 commit

Author SHA1 Message Date
Jordan Petridis
54164305a3
Port to libgirepository-2.0
pygobject 3.52 has switched [1] to using libgirepository-2.0 which
comes from glib itself now, rather than the 1.0 which came from
gobject-introspection.

This means that it fails to load the incompatible "GIRepository 2.0"
and thus must be ported to 3.0 (which is provided by
libgirepository-2.0).

This also means that we have to bump the minimum version of glib to
2.80

Migration guide is here [2]

[1]: https://gitlab.gnome.org/GNOME/pygobject/-/merge_requests/320
[2]: https://docs.gtk.org/girepository/migrating-gi.html
2024-11-17 12:13:03 +02:00
7 changed files with 20 additions and 145 deletions

View file

@ -24,21 +24,9 @@ from functools import cached_property
import gi # type: ignore
try:
gi.require_version("GIRepository", "3.0")
from gi.repository import GIRepository # type: ignore
_repo = GIRepository.Repository()
except ValueError:
# We can remove this once we can bump the minimum dependencies
# to glib 2.80 and pygobject 3.52
# dependency('glib-2.0', version: '>= 2.80.0')
# dependency('girepository-2.0', version: '>= 2.80.0')
gi.require_version("GIRepository", "2.0")
from gi.repository import GIRepository # type: ignore
_repo = GIRepository.Repository
from . import typelib, xml_reader
from .errors import CompileError, CompilerBugError
from .lsp_utils import CodeAction
@ -54,7 +42,8 @@ def add_typelib_search_path(path: str):
def get_namespace(namespace: str, version: str) -> "Namespace":
search_paths = [*_repo.get_search_path(), *_user_search_paths]
repo = GIRepository.Repository()
search_paths = [*repo.get_search_path(), *_user_search_paths]
filename = f"{namespace}-{version}.typelib"
@ -85,8 +74,9 @@ def get_available_namespaces() -> T.List[T.Tuple[str, str]]:
if len(_available_namespaces):
return _available_namespaces
repo = GIRepository.Repository()
search_paths: list[str] = [
*_repo.get_search_path(),
*repo.get_search_path(),
*_user_search_paths,
]

View file

@ -171,24 +171,6 @@ class LookupOp(InfixExpr):
did_you_mean=(self.property_name, self.lhs.type.properties.keys()),
)
@validate("property")
def property_deprecated(self):
if self.lhs.type is None or not (
isinstance(self.lhs.type, gir.Class)
or isinstance(self.lhs.type, gir.Interface)
):
return
if property := self.lhs.type.properties.get(self.property_name):
if property.deprecated:
hints = []
if property.deprecated_doc:
hints.append(property.deprecated_doc)
raise DeprecatedWarning(
f"{property.signature} is deprecated",
hints=hints,
)
class CastExpr(InfixExpr):
grammar = [

View file

@ -149,7 +149,7 @@ class LanguageServer:
def _send(self, data):
data["jsonrpc"] = "2.0"
line = json.dumps(data, separators=(",", ":"))
line = json.dumps(data, separators=(",", ":")) + "\r\n"
printerr("output: " + line)
sys.stdout.write(
f"Content-Length: {len(line.encode())}\r\nContent-Type: application/vscode-jsonrpc; charset=utf-8\r\n\r\n{line}"

View file

@ -7,6 +7,9 @@ datadir = join_paths(prefix, get_option('datadir'))
py = import('python').find_installation('python3')
dependency('glib-2.0', version: '>= 2.80.0')
dependency('girepository-2.0', version: '>= 2.80.0')
subdir('docs')
configure_file(

View file

@ -0,0 +1,9 @@
using Gtk 4.0;
Dialog {
use-header-bar: 1;
}
Window {
keys-changed => $on_window_keys_changed();
}

View file

@ -0,0 +1 @@
3,1,6,Gtk.Dialog is deprecated

View file

@ -1,110 +0,0 @@
# test_samples.py
#
# Copyright 2024 James Westman <james@jwestman.net>
#
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as
# published by the Free Software Foundation; either version 3 of the
# License, or (at your option) any later version.
#
# This file is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# SPDX-License-Identifier: LGPL-3.0-or-later
import unittest
import gi
gi.require_version("Gtk", "4.0")
from gi.repository import Gtk
from blueprintcompiler import parser, tokenizer
from blueprintcompiler.errors import DeprecatedWarning, PrintableError
# Testing deprecation warnings requires special handling because libraries can add deprecations with new versions,
# causing tests to break if we're not careful.
class TestDeprecations(unittest.TestCase):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.gtkVersion = f"{Gtk.get_major_version()}.{Gtk.get_minor_version()}.{Gtk.get_micro_version()}"
def assertDeprecation(self, blueprint: str, message: str):
try:
tokens = tokenizer.tokenize(blueprint)
_ast, errors, warnings = parser.parse(tokens)
self.assertIsNone(errors)
self.assertEqual(len(warnings), 1)
self.assertIsInstance(warnings[0], DeprecatedWarning)
self.assertEqual(warnings[0].message, message)
except PrintableError as e: # pragma: no cover
e.pretty_print("<deprecations test>", blueprint)
raise AssertionError()
def test_class_deprecation(self):
if Gtk.check_version(4, 10, 0) is not None:
self.skipTest(f"Gtk.Dialog is not deprecated in GTK {self.gtkVersion}")
blueprint = """
using Gtk 4.0;
Dialog {
use-header-bar: 1;
}
"""
message = "Gtk.Dialog is deprecated"
self.assertDeprecation(blueprint, message)
def test_property_deprecation(self):
self.skipTest(
"gobject-introspection does not currently write property deprecations to the typelib. See <https://gitlab.gnome.org/GNOME/gobject-introspection/-/merge_requests/410>."
)
if Gtk.check_version(4, 4, 0) is not None:
self.skipTest(
f"Gtk.DropTarget:drop is not deprecated in GTK {self.gtkVersion}"
)
blueprint = """
using Gtk 4.0;
$MyObject {
a: bind drop_target.drop;
}
DropTarget drop_target {
}
"""
message = "Gtk.DropTarget:drop is deprecated"
self.assertDeprecation(blueprint, message)
def test_signal_deprecation(self):
if Gtk.check_version(4, 10, 0) is not None:
self.skipTest(
f"Gtk.Window::keys-changed is not deprecated in GTK {self.gtkVersion}"
)
blueprint = """
using Gtk 4.0;
Window {
keys-changed => $handler();
}
"""
message = "signal Gtk.Window::keys-changed () is deprecated"
self.assertDeprecation(blueprint, message)