fix: Clean up TeX syntax and add tests

1. Swap `\` for `\\` for TeX block comments to avoid issues with parsing
2. Add tests for TeX, Julia, AutoHotKey, Org mode, and Handlebars
3. Ensure tests can be run with 1 line command
4. Change logic in test framework so that tests run off of local version
   of `syntax.json` rather than remote version
5. Add details for running tests + adding tests for your syntax PR to
   readme
6. Add .gitignore file for python (to avoid compiles form tests winding
   up in commits)
This commit is contained in:
Quinn Winters 2021-12-13 19:10:28 +01:00
parent 283da1a7cc
commit 4dca8a215f
7 changed files with 326 additions and 13 deletions

142
.gitignore vendored Normal file
View File

@ -0,0 +1,142 @@
### https://raw.github.com/github/gitignore/218a941be92679ce67d0484547e3e142b2f5f6f0/Python.gitignore
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
.pybuilder/
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# .python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# pytype static type analyzer
.pytype/
# Cython debug symbols
cython_debug/

View File

@ -102,7 +102,7 @@ There are additional inputs if you want to be able to assign issues to projects.
* Vue * Vue
* YAML * YAML
New languages can easily be added to the `syntax.json` file used by the action to identify TODO comments. When adding languages, follow the structure of existing entries, and use the language name defined by GitHub in [`languages.yml`](https://raw.githubusercontent.com/github/linguist/master/lib/linguist/languages.yml). PRs adding new languages are welcome and appreciated. New languages can easily be added to the `syntax.json` file used by the action to identify TODO comments. When adding languages, follow the structure of existing entries, and use the language name defined by GitHub in [`languages.yml`](https://raw.githubusercontent.com/github/linguist/master/lib/linguist/languages.yml). PRs adding new languages are welcome and appreciated. Please add a test for your language in order for your PR to be accepted.
## TODO Options ## TODO Options
@ -173,6 +173,14 @@ Issues are created whenever the action runs and finds a newly added TODO in the
If you do encounter any problems, please file an issue or submit a PR. Everyone is welcome and encouraged to contribute. If you do encounter any problems, please file an issue or submit a PR. Everyone is welcome and encouraged to contribute.
## Running tests locally
To run the tests locally, simply run the following in the main repo:
```shell
python -m unittest
```
## Thanks ## Thanks
The action was developed for the GitHub Hackathon. Whilst every effort is made to ensure it works, it comes with no guarantee. The action was developed for the GitHub Hackathon. Whilst every effort is made to ensure it works, it comes with no guarantee.

View File

@ -408,8 +408,8 @@
{ {
"type": "block", "type": "block",
"pattern": { "pattern": {
"start": "\\begin{comment}", "start": "\\\\begin{comment}",
"end": "\\end{comment}" "end": "\\\\end{comment}"
} }
} }
] ]

0
tests/__init__.py Normal file
View File

View File

@ -106,4 +106,65 @@ index 6397789..494d42f 100644
+++ b/src/tests/example_file.sql +++ b/src/tests/example_file.sql
@@ -1,2 +0,0 @@ @@ -1,2 +0,0 @@
--- TODO Select all: --- TODO Select all:
-SELECT * FROM Products; -SELECT * FROM Products;
diff --git a/tests/example_file.tex b/src/tests/example_file.tex
new file mode 100644
index 0000000..7cccc5b
--- /dev/null
+++ b/src/tests/example_file.tex
@@ -0,0 +1,2 @@
-% TODO Add in preamble details
-\begin{document}
- \begin{comment}
- TODO This document needs content
- label: urgent
- \end{comment}
-\end{document}
diff --git a/tests/example_file.jl b/src/tests/example_file.jl
new file mode 100644
index 0000000..7cccc5b
--- /dev/null
+++ b/src/tests/example_file.jl
@@ -0,0 +1,2 @@
- # TODO: Hopefully this comment turns into an issue
- print("Hello World")
- #= TODO: Multiline comments
- also need to be turned into task, and hopefully
- kept together as one.
- =#
diff --git a/tests/example_file.ahk b/src/tests/example_file.ahk
new file mode 100644
index 0000000..7cccc5b
--- /dev/null
+++ b/src/tests/example_file.ahk
@@ -0,0 +1,2 @@
- ; TODO: Find a better way to manage hotkeys
- ; Maybe just switch to vim??
- #h::
- RegRead, HiddenFiles_Status, HKEY_CURRENT_USER, Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced, Hidden
diff --git a/tests/example_file.hbs b/src/tests/example_file.hbs
new file mode 100644
index 0000000..7cccc5b
--- /dev/null
+++ b/src/tests/example_file.hbs
@@ -0,0 +1,2 @@
- <!-- TODO: Hopefully this comment turns into a todo issue -->
- {{!
- TODO: Make a handlebar templtate
- This is really just a test, but hopefully this works~!
- }}
diff --git a/tests/example_file.org b/src/tests/example_file.org
new file mode 100644
index 0000000..7cccc5b
--- /dev/null
+++ b/src/tests/example_file.org
@@ -0,0 +1,2 @@
- # TODO: Hopefully this comment turns into a todo issue
- #+begin_src python
- print("Hello World")
- #+end_src
- + #+begin_comment
- TODO: Multiline comments
- also need to be turned into todos, and hopefully
- kept together as one todo
- #+end_comment

View File

@ -112,4 +112,67 @@ index 0000000..7cccc5b
+++ b/src/tests/example_file.sql +++ b/src/tests/example_file.sql
@@ -0,0 +1,2 @@ @@ -0,0 +1,2 @@
+-- TODO Select all: +-- TODO Select all:
+SELECT * FROM Products; +SELECT * FROM Products;
diff --git a/tests/example_file.tex b/src/tests/example_file.tex
new file mode 100644
index 0000000..7cccc5b
--- /dev/null
+++ b/src/tests/example_file.tex
@@ -0,0 +1,2 @@
+% TODO Add in preamble details
+\begin{document}
+ \begin{comment}
+ TODO This document needs content
+ label: urgent
+ \end{comment}
+\end{document}
diff --git a/tests/example_file.jl b/src/tests/example_file.jl
new file mode 100644
index 0000000..7cccc5b
--- /dev/null
+++ b/src/tests/example_file.jl
@@ -0,0 +1,2 @@
+ # TODO: Hopefully this comment turns into an issue
+ print("Hello World")
+ #= TODO: Multiline comments
+ also need to be turned into task, and hopefully
+ kept together as one.
+ =#
diff --git a/tests/example_file.ahk b/src/tests/example_file.ahk
new file mode 100644
index 0000000..7cccc5b
--- /dev/null
+++ b/src/tests/example_file.ahk
@@ -0,0 +1,2 @@
+ ; TODO: Find a better way to manage hotkeys
+ ; Maybe just switch to vim??
+ #h::
+ RegRead, HiddenFiles_Status, HKEY_CURRENT_USER, Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced, Hidden
diff --git a/tests/example_file.hbs b/src/tests/example_file.hbs
new file mode 100644
index 0000000..7cccc5b
--- /dev/null
+++ b/src/tests/example_file.hbs
@@ -0,0 +1,2 @@
+ <!-- TODO: Hopefully this comment turns into a todo issue -->
+ {{!
+ TODO: Make a handlebar templtate
+ This is really just a test, but hopefully this works~!
+ }}
diff --git a/tests/example_file.org b/src/tests/example_file.org
new file mode 100644
index 0000000..7cccc5b
--- /dev/null
+++ b/src/tests/example_file.org
@@ -0,0 +1,2 @@
+ # TODO: Hopefully this comment turns into a todo issue
+ #+begin_src python
+ print("Hello World")
+ #+end_src
+ #+begin_comment
+ TODO: Multiline comments
+ also need to be turned into todos, and hopefully
+ kept together as one todo
+ #+end_comment

View File

@ -1,5 +1,6 @@
import os import os
import unittest import unittest
import json
from main import TodoParser from main import TodoParser
@ -15,7 +16,10 @@ class NewIssueTests(unittest.TestCase):
# Check for newly added TODOs across the files specified. # Check for newly added TODOs across the files specified.
def setUp(self): def setUp(self):
diff_file = open('tests/test_new.diff', 'r') diff_file = open('tests/test_new.diff', 'r')
self.raw_issues = TodoParser().parse(diff_file) parser = TodoParser()
with open('syntax.json', 'r') as syntax_json:
parser.syntax_dict = json.load(syntax_json)
self.raw_issues = parser.parse(diff_file)
def test_python_issues(self): def test_python_issues(self):
self.assertEqual(count_issues_for_file_type(self.raw_issues, 'python'), 2) self.assertEqual(count_issues_for_file_type(self.raw_issues, 'python'), 2)
@ -38,15 +42,29 @@ class NewIssueTests(unittest.TestCase):
def test_sql_issues(self): def test_sql_issues(self):
self.assertEqual(count_issues_for_file_type(self.raw_issues, 'sql'), 1) self.assertEqual(count_issues_for_file_type(self.raw_issues, 'sql'), 1)
# TODO: Update tests def test_tex_issues(self):
# Need tests for Julia, AutoHotKey, Handlebars, Org and TeX, as these markers are not currently covered. self.assertEqual(count_issues_for_file_type(self.raw_issues, 'tex'), 2)
def test_julia_issues(self):
self.assertEqual(count_issues_for_file_type(self.raw_issues, 'julia'), 2)
def test_autohotkey_issues(self):
self.assertEqual(count_issues_for_file_type(self.raw_issues, 'autohotkey'), 1)
def test_handlebars_issues(self):
self.assertEqual(count_issues_for_file_type(self.raw_issues, 'handlebars'), 2)
def test_org_issues(self):
self.assertEqual(count_issues_for_file_type(self.raw_issues, 'text'), 2)
class ClosedIssueTests(unittest.TestCase): class ClosedIssueTests(unittest.TestCase):
# Check for removed TODOs across the files specified. # Check for removed TODOs across the files specified.
def setUp(self): def setUp(self):
diff_file = open('tests/test_closed.diff', 'r') diff_file = open('tests/test_closed.diff', 'r')
self.raw_issues = TodoParser().parse(diff_file) parser = TodoParser()
with open('syntax.json', 'r') as syntax_json:
parser.syntax_dict = json.load(syntax_json)
self.raw_issues = parser.parse(diff_file)
def test_python_issues(self): def test_python_issues(self):
self.assertEqual(count_issues_for_file_type(self.raw_issues, 'python'), 2) self.assertEqual(count_issues_for_file_type(self.raw_issues, 'python'), 2)
@ -69,13 +87,31 @@ class ClosedIssueTests(unittest.TestCase):
def test_sql_issues(self): def test_sql_issues(self):
self.assertEqual(count_issues_for_file_type(self.raw_issues, 'sql'), 1) self.assertEqual(count_issues_for_file_type(self.raw_issues, 'sql'), 1)
def test_tex_issues(self):
self.assertEqual(count_issues_for_file_type(self.raw_issues, 'tex'), 2)
def test_julia_issues(self):
self.assertEqual(count_issues_for_file_type(self.raw_issues, 'julia'), 2)
def test_autohotkey_issues(self):
self.assertEqual(count_issues_for_file_type(self.raw_issues, 'autohotkey'), 1)
def test_handlebars_issues(self):
self.assertEqual(count_issues_for_file_type(self.raw_issues, 'handlebars'), 2)
def test_org_issues(self):
self.assertEqual(count_issues_for_file_type(self.raw_issues, 'text'), 2)
class IgnorePatternTests(unittest.TestCase): class IgnorePatternTests(unittest.TestCase):
def test_single_ignore(self): def test_single_ignore(self):
os.environ['INPUT_IGNORE'] = '.*\\.java' os.environ['INPUT_IGNORE'] = '.*\\.java'
diff_file = open('tests/test_new.diff', 'r') parser = TodoParser()
self.raw_issues = TodoParser().parse(diff_file) with open('syntax.json', 'r') as syntax_json:
parser.syntax_dict = json.load(syntax_json)
diff_file = open('tests/test_closed.diff', 'r')
self.raw_issues = parser.parse(diff_file)
self.assertEqual(count_issues_for_file_type(self.raw_issues, 'python'), 2) self.assertEqual(count_issues_for_file_type(self.raw_issues, 'python'), 2)
self.assertEqual(count_issues_for_file_type(self.raw_issues, 'yaml'), 2) self.assertEqual(count_issues_for_file_type(self.raw_issues, 'yaml'), 2)
self.assertEqual(count_issues_for_file_type(self.raw_issues, 'php'), 4) self.assertEqual(count_issues_for_file_type(self.raw_issues, 'php'), 4)
@ -85,8 +121,11 @@ class IgnorePatternTests(unittest.TestCase):
def test_multiple_ignores(self): def test_multiple_ignores(self):
os.environ['INPUT_IGNORE'] = '.*\\.java, tests/example-file\\.php' os.environ['INPUT_IGNORE'] = '.*\\.java, tests/example-file\\.php'
diff_file = open('tests/test_new.diff', 'r') parser = TodoParser()
self.raw_issues = TodoParser().parse(diff_file) with open('syntax.json', 'r') as syntax_json:
parser.syntax_dict = json.load(syntax_json)
diff_file = open('tests/test_closed.diff', 'r')
self.raw_issues = parser.parse(diff_file)
self.assertEqual(count_issues_for_file_type(self.raw_issues, 'python'), 2) self.assertEqual(count_issues_for_file_type(self.raw_issues, 'python'), 2)
self.assertEqual(count_issues_for_file_type(self.raw_issues, 'yaml'), 2) self.assertEqual(count_issues_for_file_type(self.raw_issues, 'yaml'), 2)
self.assertEqual(count_issues_for_file_type(self.raw_issues, 'php'), 0) self.assertEqual(count_issues_for_file_type(self.raw_issues, 'php'), 0)