Add a formatter

This commit is contained in:
Gregor Niehl 2023-11-03 06:48:28 -05:00 committed by James Westman
parent 2faa9207de
commit 4fa64cdf33
12 changed files with 613 additions and 11 deletions

View file

@ -0,0 +1,71 @@
using Gtk 4.0;
using Adw 1;
template $MyTemplate: Label {
/**
* A list of strings.
*/
StringList {
// comment
strings [
"Hello",
C_("Greeting", "World"),
]
}
object: Button {
label: "Click me";
};
flags: a | b;
[child]
Label {
}
[child]
Label label2 {
}
// Single line comment.
/**
* Multiline comment.
*/
// Single line comment.
value: bind 1.0 as <double>;
as: 1;
signal => $on_signal() after;
}
Dialog {
[action response=ok]
$MyButton {
}
}
menu menu {
item ("test")
item {
label: "test";
}
item ("test")
}
Adw.MessageDialog {
responses [
save: "Save" suggested disabled,
]
}
Adw.Breakpoint {
condition ("width < 100")
setters {
label2.label: _("Hello, world!");
label2.visible: false;
label2.extra-menu: null;
}
}

1
tests/formatting/in1.blp Normal file
View file

@ -0,0 +1 @@
using Gtk 4.0;using Adw 1;Overlay{Label label{label:_("'Hello World!' \"\n\t\"");}[overlay]Button{notify::icon-name=>$on_icon_name_changed(label)swapped;styles["destructive"]}visible:bind $isVisible(label.visible,my-menu)as<bool>;width-request:bind label.width-request no-sync-create;}menu my-menu{item(_("Label"), "action-name", "icon-name")item{action:"win.format";}}

40
tests/formatting/in2.blp Normal file
View file

@ -0,0 +1,40 @@
using Gtk 4.0;
using Adw 1;
Overlay {
Label
label
{
label
:
_
(
"'Hello World!' \"\n\t\""
)
;
}
[
overlay
] Button
{ notify
:: icon-name
=> $ on_icon_name_changed ( label )
swapped ;
styles
[ "destructive" ]
}
visible
: bind $ isVisible ( label.visible ,
my-menu ) as
< bool > ; width-request : bind label . width-request no-sync-create ; }
menu my-menu
{ item ( _ ( "Label" ) , "action-name" , "icon-name" ) item { action : "win.format" ; } }

28
tests/formatting/out.blp Normal file
View file

@ -0,0 +1,28 @@
using Gtk 4.0;
using Adw 1;
Overlay {
Label label {
label: _("'Hello World!' \"\n\t\"");
}
[overlay]
Button {
notify::icon-name => $on_icon_name_changed(label) swapped;
styles [
"destructive"
]
}
visible: bind $isVisible(label.visible, my-menu) as <bool>;
width-request: bind label.width-request no-sync-create;
}
menu my-menu {
item (_("Label"), "action-name", "icon-name")
item {
action: "win.format";
}
}

View file

@ -0,0 +1,5 @@
using Gtk 4.0;
Label {
label: "\"'\'\t\n\\'";
}

View file

@ -0,0 +1,5 @@
using Gtk 4.0;
Label {
label: "\"'\'\t\n\\'";
}

48
tests/test_formatter.py Normal file
View file

@ -0,0 +1,48 @@
# test_formatter.py
#
# Copyright 2023 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
from pathlib import Path
from blueprintcompiler.formatter import Formatter
class TestFormatter(unittest.TestCase):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.maxDiff = None
def assert_format_test(self, input_file, expected_file):
print("assert_format_test({}, {})".format(input_file, expected_file))
with open((Path(__file__).parent / f"formatting/{input_file}").resolve()) as f:
input_data = f.read()
with open(
(Path(__file__).parent / f"formatting/{expected_file}").resolve()
) as f:
expected = f.read()
actual = Formatter.format(input_data)
self.assertEqual(actual, expected)
def test_formatter(self):
self.assert_format_test("in1.blp", "out.blp")
self.assert_format_test("in2.blp", "out.blp")
self.assert_format_test("correct1.blp", "correct1.blp")
self.assert_format_test("string_in.blp", "string_out.blp")