textparser 0.23.0__tar.gz → 0.26__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. textparser-0.26/.github/FUNDING.yml +1 -0
  2. textparser-0.26/.github/workflows/pythonpackage.yml +58 -0
  3. textparser-0.26/.gitignore +57 -0
  4. textparser-0.26/PKG-INFO +148 -0
  5. {textparser-0.23.0 → textparser-0.26}/README.rst +1 -16
  6. textparser-0.26/docs/Makefile +192 -0
  7. textparser-0.26/docs/conf.py +291 -0
  8. textparser-0.26/docs/index.rst +100 -0
  9. textparser-0.26/docs/make.bat +263 -0
  10. textparser-0.26/examples/benchmarks/json/data.json +8991 -0
  11. textparser-0.26/examples/benchmarks/json/errors.py +248 -0
  12. textparser-0.26/examples/benchmarks/json/parse_tree.py +359 -0
  13. textparser-0.26/examples/benchmarks/json/parsers/funcparserlib_json.py +106 -0
  14. textparser-0.26/examples/benchmarks/json/parsers/lark_json.py +78 -0
  15. textparser-0.26/examples/benchmarks/json/parsers/parsimonious_json.py +45 -0
  16. textparser-0.26/examples/benchmarks/json/parsers/parsita_json.py +68 -0
  17. textparser-0.26/examples/benchmarks/json/parsers/parsy_json.py +75 -0
  18. textparser-0.26/examples/benchmarks/json/parsers/pyleri_json.py +64 -0
  19. textparser-0.26/examples/benchmarks/json/parsers/pyparsing_json.py +63 -0
  20. textparser-0.26/examples/benchmarks/json/parsers/textparser_json.py +62 -0
  21. textparser-0.26/examples/benchmarks/json/parsers/textx_json.py +55 -0
  22. textparser-0.26/examples/benchmarks/json/speed.py +129 -0
  23. textparser-0.26/examples/hello_world.py +28 -0
  24. textparser-0.26/examples/json.py +99 -0
  25. textparser-0.26/examples/proto3.py +331 -0
  26. textparser-0.26/pyproject.toml +90 -0
  27. textparser-0.26/tests/__init__.py +0 -0
  28. {textparser-0.23.0 → textparser-0.26}/tests/test_textparser.py +263 -163
  29. textparser-0.23.0/textparser.py → textparser-0.26/textparser/__init__.py +215 -202
  30. textparser-0.26/textparser/version.py +24 -0
  31. textparser-0.26/textparser.egg-info/PKG-INFO +148 -0
  32. textparser-0.26/textparser.egg-info/SOURCES.txt +36 -0
  33. textparser-0.26/textparser.egg-info/requires.txt +15 -0
  34. textparser-0.23.0/MANIFEST.in +0 -3
  35. textparser-0.23.0/Makefile +0 -26
  36. textparser-0.23.0/PKG-INFO +0 -149
  37. textparser-0.23.0/setup.py +0 -29
  38. textparser-0.23.0/textparser.egg-info/PKG-INFO +0 -149
  39. textparser-0.23.0/textparser.egg-info/SOURCES.txt +0 -12
  40. {textparser-0.23.0 → textparser-0.26}/LICENSE +0 -0
  41. {textparser-0.23.0/tests → textparser-0.26/examples/benchmarks/json/parsers}/__init__.py +0 -0
  42. {textparser-0.23.0 → textparser-0.26}/setup.cfg +0 -0
  43. {textparser-0.23.0 → textparser-0.26}/textparser.egg-info/dependency_links.txt +0 -0
  44. {textparser-0.23.0 → textparser-0.26}/textparser.egg-info/top_level.txt +0 -0
@@ -0,0 +1 @@
1
+ github: eerimoq
@@ -0,0 +1,58 @@
1
+ name: Test
2
+
3
+ on: [push, pull_request]
4
+
5
+ jobs:
6
+ test:
7
+
8
+ runs-on: ubuntu-latest
9
+ strategy:
10
+ max-parallel: 4
11
+ matrix:
12
+ python-version: ['3.10', '3.14']
13
+
14
+ steps:
15
+ - uses: actions/checkout@v4
16
+ - name: Set up Python ${{ matrix.python-version }}
17
+ uses: actions/setup-python@v5
18
+ with:
19
+ python-version: ${{ matrix.python-version }}
20
+ - name: Install textparser development and testing dependencies
21
+ run: |
22
+ pip install --upgrade pip
23
+ pip install .
24
+ pip install .[test]
25
+ - name: Test
26
+ run: |
27
+ python -m unittest
28
+ - name: Static type checking (mypy)
29
+ run: |
30
+ python -m mypy --strict textparser tests
31
+ - name: Linting (ruff)
32
+ run: |
33
+ ruff check textparser tests
34
+
35
+ release:
36
+ needs: [test]
37
+ runs-on: ubuntu-latest
38
+ if: startsWith(github.ref, 'refs/tags')
39
+
40
+ steps:
41
+ - name: Checkout
42
+ uses: actions/checkout@v4
43
+ - name: Set up Python 3.14
44
+ uses: actions/setup-python@v5
45
+ with:
46
+ python-version: 3.14
47
+ - name: Install pypa/build
48
+ run: |
49
+ python -m pip install build --user
50
+ - name: Build a binary wheel and a source tarball
51
+ run: |
52
+ git clean -dfx
53
+ python -m build --sdist --wheel --outdir dist/ .
54
+ - name: Publish distribution 📦 to PyPI
55
+ uses: pypa/gh-action-pypi-publish@release/v1
56
+ with:
57
+ skip_existing: true
58
+ password: ${{ secrets.pypi_password }}
@@ -0,0 +1,57 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+
5
+ # C extensions
6
+ *.so
7
+
8
+ # Distribution / packaging
9
+ .Python
10
+ env/
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ *.egg-info/
23
+ .installed.cfg
24
+ *.egg
25
+
26
+ # PyInstaller
27
+ # Usually these files are written by a python script from a template
28
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
29
+ *.manifest
30
+ *.spec
31
+
32
+ # Installer logs
33
+ pip-log.txt
34
+ pip-delete-this-directory.txt
35
+
36
+ # Unit test / coverage reports
37
+ htmlcov/
38
+ .tox/
39
+ .coverage
40
+ .coverage.*
41
+ .cache
42
+ nosetests.xml
43
+ coverage.xml
44
+ *,cover
45
+
46
+ # Translations
47
+ *.mo
48
+ *.pot
49
+
50
+ # Django stuff:
51
+ *.log
52
+
53
+ # Sphinx documentation
54
+ docs/_build/
55
+
56
+ # PyBuilder
57
+ target/
@@ -0,0 +1,148 @@
1
+ Metadata-Version: 2.4
2
+ Name: textparser
3
+ Version: 0.26
4
+ Summary: A text parser library for python.
5
+ Author: Erik Moqvist
6
+ License-Expression: MIT
7
+ Project-URL: homepage, https://github.com/cantools/textparser
8
+ Project-URL: documentation, https://textparser.readthedocs.io/
9
+ Project-URL: repository, https://github.com/cantools/textparser
10
+ Keywords: parser,parsing
11
+ Requires-Python: >=3.10
12
+ Description-Content-Type: text/x-rst
13
+ License-File: LICENSE
14
+ Provides-Extra: examples
15
+ Requires-Dist: lark-parser; extra == "examples"
16
+ Requires-Dist: pyparsing; extra == "examples"
17
+ Requires-Dist: parsita; extra == "examples"
18
+ Requires-Dist: funcparserlib; extra == "examples"
19
+ Requires-Dist: parsy; extra == "examples"
20
+ Requires-Dist: parsimonious; extra == "examples"
21
+ Requires-Dist: textx; extra == "examples"
22
+ Provides-Extra: test
23
+ Requires-Dist: mypy>=2.1; extra == "test"
24
+ Requires-Dist: ruff>=0.15.16; extra == "test"
25
+ Requires-Dist: pytest>=9.0; extra == "test"
26
+ Requires-Dist: coverage>=7.14; extra == "test"
27
+ Dynamic: license-file
28
+
29
+ About
30
+ =====
31
+
32
+ A text parser written in the Python language.
33
+
34
+ The project has one goal, speed! See the benchmark below more details.
35
+
36
+ Project homepage: https://github.com/eerimoq/textparser
37
+
38
+ Documentation: http://textparser.readthedocs.org/en/latest
39
+
40
+ Credits
41
+ =======
42
+
43
+ - Thanks `PyParsing`_ for a user friendly interface. Many of
44
+ ``textparser``'s class names are taken from this project.
45
+
46
+ Installation
47
+ ============
48
+
49
+ .. code-block:: python
50
+
51
+ pip install textparser
52
+
53
+ Example usage
54
+ =============
55
+
56
+ The `Hello World`_ example parses the string ``Hello, World!`` and
57
+ outputs its parse tree ``['Hello', ',', 'World', '!']``.
58
+
59
+ The script:
60
+
61
+ .. code-block:: python
62
+
63
+ import textparser
64
+ from textparser import Sequence
65
+
66
+
67
+ class Parser(textparser.Parser):
68
+
69
+ def token_specs(self):
70
+ return [
71
+ ('SKIP', r'[ \r\n\t]+'),
72
+ ('WORD', r'\w+'),
73
+ ('EMARK', '!', r'!'),
74
+ ('COMMA', ',', r','),
75
+ ('MISMATCH', r'.')
76
+ ]
77
+
78
+ def grammar(self):
79
+ return Sequence('WORD', ',', 'WORD', '!')
80
+
81
+
82
+ tree = Parser().parse('Hello, World!')
83
+
84
+ print('Tree:', tree)
85
+
86
+ Script execution:
87
+
88
+ .. code-block:: text
89
+
90
+ $ env PYTHONPATH=. python3 examples/hello_world.py
91
+ Tree: ['Hello', ',', 'World', '!']
92
+
93
+ Benchmark
94
+ =========
95
+
96
+ A `benchmark`_ comparing the speed of 10 JSON parsers, parsing a `276
97
+ kb file`_.
98
+
99
+ .. code-block:: text
100
+
101
+ $ env PYTHONPATH=. python3 examples/benchmarks/json/speed.py
102
+
103
+ Parsed 'examples/benchmarks/json/data.json' 1 time(s) in:
104
+
105
+ PACKAGE SECONDS RATIO VERSION
106
+ textparser 0.10 100% 0.21.1
107
+ parsimonious 0.17 169% unknown
108
+ lark (LALR) 0.27 267% 0.7.0
109
+ funcparserlib 0.34 340% unknown
110
+ textx 0.54 546% 1.8.0
111
+ pyparsing 0.68 684% 2.4.0
112
+ pyleri 0.88 886% 1.2.2
113
+ parsy 0.92 925% 1.2.0
114
+ parsita 2.28 2286% unknown
115
+ lark (Earley) 2.34 2348% 0.7.0
116
+
117
+ *NOTE 1: The parsers are not necessarily optimized for
118
+ speed. Optimizing them will likely affect the measurements.*
119
+
120
+ *NOTE 2: The structure of the resulting parse trees varies and
121
+ additional processing may be required to make them fit the user
122
+ application.*
123
+
124
+ *NOTE 3: Only JSON parsers are compared. Parsing other languages may
125
+ give vastly different results.*
126
+
127
+ Contributing
128
+ ============
129
+
130
+ #. Fork the repository.
131
+
132
+ #. Implement the new feature or bug fix.
133
+
134
+ #. Implement test case(s) to ensure that future changes do not break
135
+ legacy.
136
+
137
+ #. Run the tests.
138
+
139
+ .. code-block:: text
140
+
141
+ python3 -m unittest
142
+
143
+ #. Create a pull request.
144
+
145
+ .. _PyParsing: https://github.com/pyparsing/pyparsing
146
+ .. _Hello World: https://github.com/eerimoq/textparser/blob/master/examples/hello_world.py
147
+ .. _benchmark: https://github.com/eerimoq/textparser/blob/master/examples/benchmarks/json/speed.py
148
+ .. _276 kb file: https://github.com/eerimoq/textparser/blob/master/examples/benchmarks/json/data.json
@@ -1,6 +1,3 @@
1
- |buildstatus|_
2
- |coverage|_
3
-
4
1
  About
5
2
  =====
6
3
 
@@ -104,12 +101,6 @@ Contributing
104
101
 
105
102
  #. Fork the repository.
106
103
 
107
- #. Install prerequisites.
108
-
109
- .. code-block:: text
110
-
111
- pip install -r requirements.txt
112
-
113
104
  #. Implement the new feature or bug fix.
114
105
 
115
106
  #. Implement test case(s) to ensure that future changes do not break
@@ -119,16 +110,10 @@ Contributing
119
110
 
120
111
  .. code-block:: text
121
112
 
122
- make test
113
+ python3 -m unittest
123
114
 
124
115
  #. Create a pull request.
125
116
 
126
- .. |buildstatus| image:: https://travis-ci.org/eerimoq/textparser.svg?branch=master
127
- .. _buildstatus: https://travis-ci.org/eerimoq/textparser
128
-
129
- .. |coverage| image:: https://coveralls.io/repos/github/eerimoq/textparser/badge.svg?branch=master
130
- .. _coverage: https://coveralls.io/github/eerimoq/textparser
131
-
132
117
  .. _PyParsing: https://github.com/pyparsing/pyparsing
133
118
  .. _Hello World: https://github.com/eerimoq/textparser/blob/master/examples/hello_world.py
134
119
  .. _benchmark: https://github.com/eerimoq/textparser/blob/master/examples/benchmarks/json/speed.py
@@ -0,0 +1,192 @@
1
+ # Makefile for Sphinx documentation
2
+ #
3
+
4
+ # You can set these variables from the command line.
5
+ SPHINXOPTS =
6
+ SPHINXBUILD = sphinx-build
7
+ PAPER =
8
+ BUILDDIR = _build
9
+
10
+ # User-friendly check for sphinx-build
11
+ ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
12
+ $(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
13
+ endif
14
+
15
+ # Internal variables.
16
+ PAPEROPT_a4 = -D latex_paper_size=a4
17
+ PAPEROPT_letter = -D latex_paper_size=letter
18
+ ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
19
+ # the i18n builder cannot share the environment and doctrees with the others
20
+ I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
21
+
22
+ .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest coverage gettext
23
+
24
+ help:
25
+ @echo "Please use \`make <target>' where <target> is one of"
26
+ @echo " html to make standalone HTML files"
27
+ @echo " dirhtml to make HTML files named index.html in directories"
28
+ @echo " singlehtml to make a single large HTML file"
29
+ @echo " pickle to make pickle files"
30
+ @echo " json to make JSON files"
31
+ @echo " htmlhelp to make HTML files and a HTML help project"
32
+ @echo " qthelp to make HTML files and a qthelp project"
33
+ @echo " applehelp to make an Apple Help Book"
34
+ @echo " devhelp to make HTML files and a Devhelp project"
35
+ @echo " epub to make an epub"
36
+ @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
37
+ @echo " latexpdf to make LaTeX files and run them through pdflatex"
38
+ @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
39
+ @echo " text to make text files"
40
+ @echo " man to make manual pages"
41
+ @echo " texinfo to make Texinfo files"
42
+ @echo " info to make Texinfo files and run them through makeinfo"
43
+ @echo " gettext to make PO message catalogs"
44
+ @echo " changes to make an overview of all changed/added/deprecated items"
45
+ @echo " xml to make Docutils-native XML files"
46
+ @echo " pseudoxml to make pseudoxml-XML files for display purposes"
47
+ @echo " linkcheck to check all external links for integrity"
48
+ @echo " doctest to run all doctests embedded in the documentation (if enabled)"
49
+ @echo " coverage to run coverage check of the documentation (if enabled)"
50
+
51
+ clean:
52
+ rm -rf $(BUILDDIR)/*
53
+
54
+ html:
55
+ $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
56
+ @echo
57
+ @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
58
+
59
+ dirhtml:
60
+ $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
61
+ @echo
62
+ @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
63
+
64
+ singlehtml:
65
+ $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
66
+ @echo
67
+ @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
68
+
69
+ pickle:
70
+ $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
71
+ @echo
72
+ @echo "Build finished; now you can process the pickle files."
73
+
74
+ json:
75
+ $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
76
+ @echo
77
+ @echo "Build finished; now you can process the JSON files."
78
+
79
+ htmlhelp:
80
+ $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
81
+ @echo
82
+ @echo "Build finished; now you can run HTML Help Workshop with the" \
83
+ ".hhp project file in $(BUILDDIR)/htmlhelp."
84
+
85
+ qthelp:
86
+ $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
87
+ @echo
88
+ @echo "Build finished; now you can run "qcollectiongenerator" with the" \
89
+ ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
90
+ @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/textparser.qhcp"
91
+ @echo "To view the help file:"
92
+ @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/textparser.qhc"
93
+
94
+ applehelp:
95
+ $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
96
+ @echo
97
+ @echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
98
+ @echo "N.B. You won't be able to view it unless you put it in" \
99
+ "~/Library/Documentation/Help or install it in your application" \
100
+ "bundle."
101
+
102
+ devhelp:
103
+ $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
104
+ @echo
105
+ @echo "Build finished."
106
+ @echo "To view the help file:"
107
+ @echo "# mkdir -p $$HOME/.local/share/devhelp/textparser"
108
+ @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/textparser"
109
+ @echo "# devhelp"
110
+
111
+ epub:
112
+ $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
113
+ @echo
114
+ @echo "Build finished. The epub file is in $(BUILDDIR)/epub."
115
+
116
+ latex:
117
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
118
+ @echo
119
+ @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
120
+ @echo "Run \`make' in that directory to run these through (pdf)latex" \
121
+ "(use \`make latexpdf' here to do that automatically)."
122
+
123
+ latexpdf:
124
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
125
+ @echo "Running LaTeX files through pdflatex..."
126
+ $(MAKE) -C $(BUILDDIR)/latex all-pdf
127
+ @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
128
+
129
+ latexpdfja:
130
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
131
+ @echo "Running LaTeX files through platex and dvipdfmx..."
132
+ $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
133
+ @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
134
+
135
+ text:
136
+ $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
137
+ @echo
138
+ @echo "Build finished. The text files are in $(BUILDDIR)/text."
139
+
140
+ man:
141
+ $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
142
+ @echo
143
+ @echo "Build finished. The manual pages are in $(BUILDDIR)/man."
144
+
145
+ texinfo:
146
+ $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
147
+ @echo
148
+ @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
149
+ @echo "Run \`make' in that directory to run these through makeinfo" \
150
+ "(use \`make info' here to do that automatically)."
151
+
152
+ info:
153
+ $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
154
+ @echo "Running Texinfo files through makeinfo..."
155
+ make -C $(BUILDDIR)/texinfo info
156
+ @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
157
+
158
+ gettext:
159
+ $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
160
+ @echo
161
+ @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
162
+
163
+ changes:
164
+ $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
165
+ @echo
166
+ @echo "The overview file is in $(BUILDDIR)/changes."
167
+
168
+ linkcheck:
169
+ $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
170
+ @echo
171
+ @echo "Link check complete; look for any errors in the above output " \
172
+ "or in $(BUILDDIR)/linkcheck/output.txt."
173
+
174
+ doctest:
175
+ $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
176
+ @echo "Testing of doctests in the sources finished, look at the " \
177
+ "results in $(BUILDDIR)/doctest/output.txt."
178
+
179
+ coverage:
180
+ $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
181
+ @echo "Testing of coverage in the sources finished, look at the " \
182
+ "results in $(BUILDDIR)/coverage/python.txt."
183
+
184
+ xml:
185
+ $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
186
+ @echo
187
+ @echo "Build finished. The XML files are in $(BUILDDIR)/xml."
188
+
189
+ pseudoxml:
190
+ $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
191
+ @echo
192
+ @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."