<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://grasswiki.osgeo.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Gulshan</id>
	<title>GRASS-Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://grasswiki.osgeo.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Gulshan"/>
	<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/wiki/Special:Contributions/Gulshan"/>
	<updated>2026-05-13T05:55:37Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2026_Support_writing_tests_with_pytest&amp;diff=28861</id>
		<title>GRASS GSoC 2026 Support writing tests with pytest</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2026_Support_writing_tests_with_pytest&amp;diff=28861"/>
		<updated>2026-05-05T03:28:32Z</updated>

		<summary type="html">&lt;p&gt;Gulshan: mentor name change&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Student Name''' || Gulshan Kumar&lt;br /&gt;
|-&lt;br /&gt;
| '''Organization''' || [https://numfocus.org/ NumFOCUS]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mentor Name''' || Vaclav Petras, Corey White&lt;br /&gt;
|-&lt;br /&gt;
| '''GitHub Fork''' || [https://github.com/gulshan-123/grass View Repo]&lt;br /&gt;
|-&lt;br /&gt;
| '''LinkedIn Profile''' || [https://www.linkedin.com/in/gul-shan123 View LinkedIn]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Abstract =&lt;br /&gt;
The current test framework in GRASS, gunittest, was designed before GitHub era. Based on Python unittest, it has several distinct types of assertion methods and requires tests to be executed from within a GRASS shell session. This has steep learning curve and is far from modern testing methods which uses Pytest.&lt;br /&gt;
&lt;br /&gt;
This project aims to modify the GRASS test by shifting the testing framework to pytest. Pytest uses simple and plain assert statements, fixtures, and is more readable. The project will involve designing a new API for several grass related assertions, implementing fixtures to handle GRASS sessions and temporary mapsets outside of the GRASS shell, integrating sample datasets, and iterative refactoring (utilizing tools like Bowler) to migrate existing tests. Thus, this will result in a more Pythonic, accessible, and maintainable testing environment for GRASS contributors.&lt;br /&gt;
&lt;br /&gt;
= Project Scope =&lt;br /&gt;
# API Design: Designing how GRASS specific assertions (like rasterExists) will look in pytest. We will draw inspiration from NumPy/GDAL own migration history.&lt;br /&gt;
# Session &amp;amp; Mapset Fixtures: Designing pytest fixtures to handle GRASS session setup and teardown. This also include running pytest outside of a GRASS session.&lt;br /&gt;
# Isolation: Tests must be isolated to ensure there is no side effects between them. We will decide on per file/per function isolation.&lt;br /&gt;
# Sample Dataset Integration: Addressing the dependency on the NC SPM sample dataset from grass.gunittest to the pytest framework.&lt;br /&gt;
# Iterative Refactoring Strategy: Defining the location for the new tests (tests or testsuite directories) and utilizing AST-based refactoring tools like Bowler (combined with AI agents) to automate the migration of existing tests.&lt;br /&gt;
# Contributor Documentation: Creating a user friendly testing guide for future contributors to encourage rapid adoption of the new pytest framework.&lt;br /&gt;
&lt;br /&gt;
= Timeline =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Period !! Timeline  !! Tasks   !! Status &lt;br /&gt;
|-&lt;br /&gt;
| Community Bonding Period &lt;br /&gt;
||&lt;br /&gt;
May 1 - May 24, 2026&lt;br /&gt;
|| &lt;br /&gt;
# Finalize the API design for the new assertion functions alongside mentors.&lt;br /&gt;
# Research NumPy and GDAL transition to pytest for more insights.&lt;br /&gt;
# Engage with the community to establish conventions for the new tests structure.&lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;13&amp;quot; | Official Coding Period &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 1''' (May 25 - May 31) || &lt;br /&gt;
# Implement fixtures to allow pytest execution outside the GRASS shell in conftest.py.&lt;br /&gt;
# Fix grass.script.setup.init behavior.&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 2''' (June 1 - June 7) ||&lt;br /&gt;
# Implement function/module scoped fixtures for temporary mapset creation and teardown. Ensure environment isolation.&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 3''' (June 8 - June 14) ||&lt;br /&gt;
# Begin translating basic gunittest assertions to pytest equivalents.&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 4''' (June 15 - June 21) ||&lt;br /&gt;
# Implement complex geospatial comparison functions (e.g., vector/raster fitting).&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 5''' (June 22 - June 28) ||&lt;br /&gt;
# Work on integrating the NC SPM sample dataset into the new pytest architecture.&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 6''' (June 29 - July 5) ||&lt;br /&gt;
# Finalize dataset integration.&lt;br /&gt;
# Write unit tests for the new pytest fixtures and utilities to ensure framework stability.&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#ffdead;&amp;quot; | '''Midterm Evaluation''' (July 6 - July 10) ||&lt;br /&gt;
# Submit MidTerm evaluation.&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 7''' (July 6 - July 12) ||&lt;br /&gt;
# Develop automation scripts using Bowler (and AI assistance) for iterative refactoring of existing test suites.&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 8''' (July 13 - July 19) ||&lt;br /&gt;
# Begin migrating test files from unittest to pytest.&lt;br /&gt;
# Decide on unittest class structures vs. pure functions based on mentor feedback.&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 9''' (July 20 - July 26) ||&lt;br /&gt;
# Continue iterative migration, focusing on tests that failed or interacted poorly with grass --exec.&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 10''' (July 27 - August 2) ||&lt;br /&gt;
# Draft the User Guide for contributors on how to write tests using the new pytest framework.&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 11''' (August 3 - August 9) ||&lt;br /&gt;
# Address edge cases, fix failing tests resulting from the migration, and ensure CI pipelines are green.&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 12''' (August 10 - August 16) ||&lt;br /&gt;
# Buffer week. Code cleanup, finalizing PRs, and reviewing documentation.&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Final Week&lt;br /&gt;
| August 17 - August 24&lt;br /&gt;
|&lt;br /&gt;
# Submit Report, Project, Blog and Documentation&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Reports =&lt;br /&gt;
== Community Bonding Period ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Log of Pull Requests =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PR !! PR Title&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/7071 #7071] || g.parser: Missing support G_OPT_F FORMAT in python %option&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/7051 #7051] || t.vect.list: Added support for JSON, YAML and CSV&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/7004 #7004] || grass.jupyter: use json output format in timeseriesmap&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/6971 #6971] || db.columns: added format list and format=csV&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/6933 #6933] || db.columns: added support for -e to print more column information&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/6867 #6867] || v.info: Add format csv with c flag and sync with v.db.connect&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/6823 #6823] || v.info: Sync -c flag with format=JSON output with v.db.connect&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/6801 #6801] || v.db.connect: Ends with error if both -p and -c flags are present&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/6728 #6728] || db.select: Adding JSON and CSV support&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/6703 #6703] || doc: Enable MathJax rendering for equations in MkDocs documentation&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Gulshan</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_Ideas_2026&amp;diff=28860</id>
		<title>GRASS GSoC Ideas 2026</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_Ideas_2026&amp;diff=28860"/>
		<updated>2026-05-05T03:27:52Z</updated>

		<summary type="html">&lt;p&gt;Gulshan: Add Gulshan's GSoC wiki page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== About ==&lt;br /&gt;
Important: While we are still an OSGeo project, we changed our fiscal sponsor to [https://numfocus.org/ NumFOCUS].&lt;br /&gt;
&lt;br /&gt;
''As a result, GRASS participates in GSoC under the [https://numfocus.org/ NumFOCUS] umbrella organization.''&lt;br /&gt;
&lt;br /&gt;
Read more about our governance [https://grass.osgeo.org/about/governance/ on GRASS website].&lt;br /&gt;
&lt;br /&gt;
* [https://numfocus.org/programs/google-summer-code The NumFOCUS GSoC main page]&lt;br /&gt;
* [https://github.com/numfocus/gsoc/blob/master/CONTRIBUTING-contributors.md NumFOCUS guidelines for contributors].&lt;br /&gt;
* [https://summerofcode.withgoogle.com/ Official GSoC page at Google]&lt;br /&gt;
&lt;br /&gt;
== Accepted ideas ==&lt;br /&gt;
=== Idea title ===&lt;br /&gt;
* Student:&lt;br /&gt;
* Mentors:&lt;br /&gt;
* [[GRASS_GSoC_2025_Add_JSON_output_to_different_tools_in_C|Example of Wiki page]]&lt;br /&gt;
&lt;br /&gt;
=== Support writing tests with pytest ===&lt;br /&gt;
* Student: Gulshan Kumar&lt;br /&gt;
* Mentors: Vaclav Petras, Corey White&lt;br /&gt;
* [[GRASS_GSoC_2026_Support_writing_tests_with_pytest|Project Wiki Page]]&lt;br /&gt;
&lt;br /&gt;
== AI Tool Usage Policy ==&lt;br /&gt;
We acknowledge that applicants may use AI tools (like ChatGPT, Copilot, etc.) to assist with proposal writing and coding. However:&lt;br /&gt;
&lt;br /&gt;
* Your proposal should reflect your own understanding and voice. AI-generated &amp;quot;slop&amp;quot; (overly generic or regurgitated content) is easy to spot and will hurt your application.&lt;br /&gt;
* We evaluate applications primarily on GitHub contributions and communication with the GRASS community, not just proposal polish.&lt;br /&gt;
* Show us you understand the project through high-quality pull requests on GitHub.&lt;br /&gt;
* Disclose AI usage: If you use AI tools in your proposal or code contributions, please disclose the extent to which you used them (e.g., for brainstorming, proofreading, code suggestions, etc.).&lt;br /&gt;
&lt;br /&gt;
== Ideas ==&lt;br /&gt;
If you are a student you can suggest a new idea or pick up an existing one. In any case write about it to [https://discourse.osgeo.org/c/grass/developer/61 OSGeo Discourse forum for GRASS developers], [https://github.com/OSGeo/grass/discussions GitHub Discussions], or [https://gitter.im/grassgis/community Gitter].&lt;br /&gt;
&lt;br /&gt;
You are invited as well to have a close look at ideas from previous years ([https://trac.osgeo.org/grass/wiki/GSoC/2014 2014], [https://trac.osgeo.org/grass/wiki/GSoC/2015 2015], [https://trac.osgeo.org/grass/wiki/GSoC/2016 2016],&lt;br /&gt;
[https://trac.osgeo.org/grass/wiki/GSoC/2017 2017],&lt;br /&gt;
[https://trac.osgeo.org/grass/wiki/GSoC/2018 2018],&lt;br /&gt;
[https://trac.osgeo.org/grass/wiki/GSoC/2019 2019],&lt;br /&gt;
[https://trac.osgeo.org/grass/wiki/GSoC/2020 2020],&lt;br /&gt;
[https://trac.osgeo.org/grass/wiki/GSoC/2021 2021],&lt;br /&gt;
[https://trac.osgeo.org/grass/wiki/GSoC/2022 2022],&lt;br /&gt;
[https://trac.osgeo.org/grass/wiki/GSoC/2023 2023])&lt;br /&gt;
which have not yet been implemented.&lt;br /&gt;
You can also look at accepted GRASS GSoC [https://trac.osgeo.org/grass/wiki/GSoC projects from previous years] for an idea of scope.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Parallelization of existing tools ===&lt;br /&gt;
&lt;br /&gt;
There are several tools that would benefit from parallelization with OpenMP, e.g. r.texture, r.fill.stats, r/v.surf.idw, r.viewshed, v.to.rast, r.grow.distance, v.surf.bspline, r.proj, ...&lt;br /&gt;
For overview of current state, see [[Raster_Parallelization_with_OpenMP]].&lt;br /&gt;
&lt;br /&gt;
* Requirements: familiarity with C, OpenMP&lt;br /&gt;
* Mentor: Huidae Cho&lt;br /&gt;
* Co-mentor: Vaclav Petras, Anna Petrasova&lt;br /&gt;
* Project length: Large (350 hours)&lt;br /&gt;
* Rating: difficult&lt;br /&gt;
* Expected Outcomes: parallelized 2-5 tools, depending on complexity&lt;br /&gt;
* Test of skills (one or more):&lt;br /&gt;
** Address https://github.com/OSGeo/grass/issues/5776 (carefully read the existing conversation in the issue and linked PR)&lt;br /&gt;
** Pick a tool and develop prototype implementation of the parallelization.&lt;br /&gt;
&lt;br /&gt;
=== Improve GRASS user experience in Jupyter Notebook ===&lt;br /&gt;
[[File:Jupyter_interactive_viewshed.png|500px|thumb|right|InteractiveMap in grass.jupyter library]]&lt;br /&gt;
Python package [https://grass.osgeo.org/grass-stable/manuals/libpython/grass.jupyter.html grass.jupyter] was developed during [https://trac.osgeo.org/grass/wiki/GSoC/2021/JupyterAndGRASS GSoC 2021] to simplify running GRASS from Jupyter Notebooks and displaying data. This project could focus on adding features such as better symbology handling and adding legend to InteractiveMap and better integration with matplotlib.&lt;br /&gt;
&lt;br /&gt;
* Requirements: Python&lt;br /&gt;
* Mentor: Anna Petrasova&lt;br /&gt;
* Co-mentor: Vaclav Petras, Helena Mitasova, Corey White&lt;br /&gt;
* Project length: Large (350 hours)&lt;br /&gt;
* Rating: easy to medium&lt;br /&gt;
* Expected Outcomes: improved user experience when using GRASS through notebooks&lt;br /&gt;
* Test of skills: write a test for [https://github.com/OSGeo/grass/tree/main/python/grass/jupyter grass.jupyter library] using python unittest or pytest, more info [https://grass.osgeo.org/grass-devel/manuals/libpython/gunittest_testing.html here] or rewrite some of the functions in grass.jupyter library using the new [https://grass.osgeo.org/grass-devel/manuals/python_intro.html#running-tools Tools API].&lt;br /&gt;
&lt;br /&gt;
=== Add JSON output to different tools ===&lt;br /&gt;
There are several tools in GRASS that would benefit from a JSON-formatted output.&lt;br /&gt;
Besides adding the JSON output, the work would also include adding tests and basic documentation.&lt;br /&gt;
* Requirements: C, Python&lt;br /&gt;
* Mentor: Vaclav Petras&lt;br /&gt;
* Co-mentor: Anna Petrasova, Corey White&lt;br /&gt;
* Project length: Large (350 hours)&lt;br /&gt;
* Rating: easy to medium&lt;br /&gt;
* Expected Outcomes: 10-20 tools (depending on project length and complexity of the tool) tools with well tested JSON output&lt;br /&gt;
* Note: A lot of work on JSON was already done, but there is more! Some of the remaining tools require more design. There are also Python tools (not just C which was the focus previously) and then also the grass-addons repo. Some tools also don't have any machine readable output right now and should. Also current tools which use other tools should use the new JSON as opposed to what they are using now. Preparing a well-reasoned list of tasks is a part of the application.&lt;br /&gt;
* Test of skills (pick one or more): &lt;br /&gt;
** https://github.com/OSGeo/grass/issues/6968&lt;br /&gt;
** https://github.com/OSGeo/grass/issues/6969&lt;br /&gt;
** https://github.com/OSGeo/grass/issues/6970&lt;br /&gt;
&lt;br /&gt;
=== Support writing tests with pytest ===&lt;br /&gt;
&lt;br /&gt;
* The current testing framework, ''[https://grass.osgeo.org/grass-stable/manuals/libpython/gunittest.html grass.gunittest]'', was written before migration to Git/GitHub and when long free runs in 3rd party services were unthinkable. Additionally, some no longer relevant goals were prioritized, such as independence on the current code, detailed custom HTML reports, success tracking over time, and high specialization towards GRASS-specifics.&lt;br /&gt;
* ''grass.gunittest'' is based on Python ''unittest'' package and many projects since then migrated to //pytest//, e.g., GDAL and Numpy. While ''unittest'' is inspired by Java's JUnit, ''pytest'' is designed to support writing small, readable tests, and uses plain `assert` statements instead of many different assert methods.&lt;br /&gt;
* Using ''pytest'' should lead to tests which feel more like Python scripts and to minimum of testing-specific code.&lt;br /&gt;
* An example issue of ''grass.gunittest'' is that it doesn't work well with tests of the main GRASS executable (prominence of `grass ... --exec` is yet another new thing which changed since ''grass.gunittest'' was designed).&lt;br /&gt;
* Two main things needed:&lt;br /&gt;
** Create general comparison functions from the ''grass.gunittest'' assert methods so that they can be used with pytest.&lt;br /&gt;
** Current grass.script.setup.init function and grass.script.core.create_location function don't work well in the context of a pytest test function. More  &lt;br /&gt;
* Additional things needed:&lt;br /&gt;
** Fixture for pytest to set up and tear down a GRASS session in a temporary mapset.&lt;br /&gt;
&lt;br /&gt;
* Requirements: Python&lt;br /&gt;
* Project length: Large (350 hours)&lt;br /&gt;
* Mentor: Vaclav Petras&lt;br /&gt;
* Co-mentor: Stefan Blumentrath&lt;br /&gt;
* Proposed by: Vaclav Petras&lt;br /&gt;
* Rating: easy to medium&lt;br /&gt;
* Expected Outcomes: Convenient way of writing tests with pytest&lt;br /&gt;
* Test of skills: Fix failing tests and/or write new tests (more is better). Alternatively, addressing a smaller problem in the testing framework is a good task, too.&lt;br /&gt;
&lt;br /&gt;
=== Fix known code defects ===&lt;br /&gt;
&lt;br /&gt;
* Fix code defects (security or code quality) such as those reported by Coverity Scan.&lt;br /&gt;
* Mentors: Vaclav Petras&lt;br /&gt;
* Co-mentors: Nicklas Larsson&lt;br /&gt;
* Proposed by: Vaclav Petras&lt;br /&gt;
* Project length: Large (350 hours)&lt;br /&gt;
* Rating: medium&lt;br /&gt;
* Requirements:&lt;br /&gt;
** Language: C&lt;br /&gt;
** Proposal: Define milestones which will be used during the evaluation.&lt;br /&gt;
* Expected outcomes:&lt;br /&gt;
** Reduction of issues by 70-100%.&lt;br /&gt;
** New tests for changed code if missing.&lt;br /&gt;
* Test and training tasks (complete more than one): Fix e.g., [https://gcc.gnu.org/onlinedocs/gcc/Static-Analyzer-Options.html GCC Static Analysis], [https://clang.llvm.org/docs/ClangStaticAnalyzer.html Clang Static Analyzer] or [https://cppcheck.sourceforge.io Cppcheck] issues.&lt;br /&gt;
&lt;br /&gt;
=== Subcommand CLI for GRASS ===&lt;br /&gt;
&lt;br /&gt;
* Make running of GRASS tools in command line as easy as possible.&lt;br /&gt;
** `grass run r.slope.aspect elevation=elevation.tiff slope=slope.tiff aspect=aspect.tiff`&lt;br /&gt;
* Project length: Large (350 hours)&lt;br /&gt;
* Rating: medium&lt;br /&gt;
* Requirements:&lt;br /&gt;
** Language: Python&lt;br /&gt;
** Proposal: Student needs to show sufficient understanding of data and project handling in GRASS. Furthermore, the proposal needs to present, at least, concrete formulation of ideas, identification of missing and existing parts, and new subcommands.&lt;br /&gt;
* Mentors: Vaclav Petras&lt;br /&gt;
* Co-mentors: Stefan Blumentrath, Corey White&lt;br /&gt;
* Proposed by: Vaclav Petras&lt;br /&gt;
* Expected outcomes:&lt;br /&gt;
** A subcommand which runs a GRASS tool on GeoTiff and GeoPackage in one step.&lt;br /&gt;
** A complete parity with the existing CLI.&lt;br /&gt;
** An underlying Python API which will be used to implement the CLI.&lt;br /&gt;
* Test and training tasks (complete one or more): Add a subcommand, sub-subcommand, or an option to the experimental interface (with tests).&lt;br /&gt;
** Add `--region` to set a temporary computational region for the execution, e.g. `--region=&amp;quot;raster=raster_name&amp;quot;`.&lt;br /&gt;
** Add `--import-raster=some/file.tiff` which imports (r.import) a raster file (same for vector and similarly for export).&lt;br /&gt;
** Add `--link-raster=some/file.tiff` which links (r.external) a raster file (same for vector and similarly for r.external.out).&lt;br /&gt;
&lt;br /&gt;
Current state:&lt;br /&gt;
&lt;br /&gt;
 # Reveals the existing subcommands&lt;br /&gt;
 PYTHONPATH=$(grass --config python-path) python -m grass.app --help&lt;br /&gt;
 # Allows running subset of commands&lt;br /&gt;
 grass run --help&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== STAC (SpatioTemporal Asset Catalog) Integration ===&lt;br /&gt;
&lt;br /&gt;
Create new import and export capabilities for GRASS which allow users to easily ingest data from STAC catalogs and export locations and mapsets as STAC specs for data discovery within STAC browsers. &lt;br /&gt;
&lt;br /&gt;
* Requirements: familiar with python, STAC specs&lt;br /&gt;
* Mentor: Corey White&lt;br /&gt;
* Co-mentor: Vaclav Petras, Anna Petrasova&lt;br /&gt;
* Project length: Large (350 hours)&lt;br /&gt;
* Rating: medium&lt;br /&gt;
* Expected Outcomes: completion of t.in.stac and t.out.stac&lt;br /&gt;
* Test of skills:&lt;br /&gt;
** suggest or implement solution for implementing t.out.stac using the prototype STAC spec https://github.com/tomorrownow/grass-stac-extension &lt;br /&gt;
** suggest/implement solution for completing https://github.com/OSGeo/grass-addons/pull/802&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== GUI: Add space-time datasets support in Data Catalog ===&lt;br /&gt;
[[File:GUI_data_tab.png|400px|thumb|right|Data catalog]]&lt;br /&gt;
Currently GRASS Data Catalog shows only raster and vector maps. The goal of this project is to add support for space-time datasets. It is mainly space-time raster datasets. In the next phase of the project support for other types of space-time datasets (vector and 3D raster) could be added. Besides displaying space-time datasets in the layer tree, it is also about adding the equivalent functionality currently available for raster and vector layers from the context menu. &lt;br /&gt;
&lt;br /&gt;
* Requirements: familiar with Python&lt;br /&gt;
* Project length: Large (350 hours)&lt;br /&gt;
* Mentor: Martin Landa&lt;br /&gt;
* Co-mentor: Anna Petrasova&lt;br /&gt;
* Proposed by: Martin Landa&lt;br /&gt;
* Rating: medium&lt;br /&gt;
* Expected Outcomes:  175 hours basic support for space-time raster datasets; 350 extended support also for other space-time datasets types (vector, 3D raster)&lt;br /&gt;
* Test of skills:&lt;br /&gt;
** suggest/implement solution for completing https://github.com/OSGeo/grass/issues/2599&lt;br /&gt;
&lt;br /&gt;
=== Searchable metadata in Space Time Datasets ===&lt;br /&gt;
The temporal framework in GRASS was initially developed almost 15 years ago. Spatio-temporal data has become more widely available since then and new standards emerged like e.g. ''[https://docs.ogc.org/cs/25-004/25-004.html STAC]'' with ''[https://github.com/stac-extensions/stac-extensions.github.io extensions]'', or the ''[https://cfconventions.org/ CF-conventions]''. The aim of this project is to extend the metadata model in the temporal framework to improve discoverability of map datasets registered in TGIS and to allow users to embed extended metadata with the registered maps in a Space Time Dataset in a searchable way. Ideally, the new model is able to account for the standards mentioned above.&lt;br /&gt;
 &lt;br /&gt;
See also: https://github.com/OSGeo/grass/issues/1938&lt;br /&gt;
&lt;br /&gt;
* Requirements: Python, SQL, JSON&lt;br /&gt;
* Project length: Large (350 hours)&lt;br /&gt;
* Mentor: Stefan Blumentrath&lt;br /&gt;
* Co-mentor: ???&lt;br /&gt;
* Proposed by: Stefan Blumentrath&lt;br /&gt;
* Rating: medium&lt;br /&gt;
* Expected Outcomes:&lt;br /&gt;
** an updated TGIS database model (version 4) that:&lt;br /&gt;
*** is oriented on relevant metadata standards (STAC, CF-Convention, ...)&lt;br /&gt;
*** allows to use metadata in temporal_where to select relevant elements of Space time datasets&lt;br /&gt;
** updated tool to create space time datasets (t.create) in the TGIS database with extended metadata&lt;br /&gt;
** updated tool to register map datasets (t.register) in the TGIS database with extended metadata&lt;br /&gt;
** Conversion tool for database Upgrades (v3 to v4)&lt;br /&gt;
** a new tool to update / modify metadata in the TGIS database&lt;br /&gt;
** Storage of timeseries metadata for both C-based and temporal Tools&lt;br /&gt;
&lt;br /&gt;
* Test of skills (e.g.):&lt;br /&gt;
** address one or more sub-tasks from https://github.com/OSGeo/grass/issues/3427 (add append-mode to selected new tool(s))&lt;br /&gt;
** suggest/implement solution for https://github.com/OSGeo/grass/issues/3394 (more complex task)&lt;br /&gt;
** suggest/implement solution for https://github.com/OSGeo/grass/issues/7041&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Add {your research idea} to GRASS ===&lt;br /&gt;
&lt;br /&gt;
* In general, you can propose any topic, but you can specifically propose integrating your research or research idea into GRASS.&lt;br /&gt;
* Requirements:&lt;br /&gt;
** Language:&lt;br /&gt;
*** Depends on the project, often Python, sometimes C.&lt;br /&gt;
*** Adding your latest ecological analysis &lt;br /&gt;
** Proposal:&lt;br /&gt;
*** Discuss relevance to GRASS.&lt;br /&gt;
*** Describe technical steps needed for integration.&lt;br /&gt;
*** Describe whether it is an addition of a tool (module) or a change in one of the libraries. If it is a tool, specify if it should be included in the core grass repository or in grass-addons repository and why.&lt;br /&gt;
*** Specify what research was done and what needs to be accomplished in order to have usable product at the end of summer.&lt;br /&gt;
*** Specify who will provide the research expertise.&lt;br /&gt;
* Project length: Large (350 hours)&lt;br /&gt;
* Rating: from low to hard&lt;br /&gt;
* Mentors:&lt;br /&gt;
** GRASS project will provide technical mentors, but it is up to the applicant to ensure the research part is mentored well. An exception may be granted to applicants which can demonstrate that the research is finished or that they have enough expertise themselves.&lt;br /&gt;
** Possible technical mentors: Vaclav Petras, Anna Petrasova&lt;br /&gt;
** Research mentors: Bring in an expert from your field, e.g., your academic advisor or project principal investigator (if needed).&lt;br /&gt;
* Proposed by: Vaclav Petras&lt;br /&gt;
* Expected outcome: Working feature which is integrated and merged at the end of the project.&lt;br /&gt;
* Test and training tasks:&lt;br /&gt;
** Create a test in Python for an existing tool in the grass-addons repository or in the core grass repository.&lt;br /&gt;
&lt;br /&gt;
=== Title of idea ===&lt;br /&gt;
&lt;br /&gt;
Description here&lt;br /&gt;
&lt;br /&gt;
* Requirements:&lt;br /&gt;
* Project length: (175 or 350 hours) &lt;br /&gt;
* Mentor: &lt;br /&gt;
* Proposed by: &lt;br /&gt;
* Rating: &lt;br /&gt;
* Expected Outcomes:  &lt;br /&gt;
* Test of skills: &lt;br /&gt;
* Other:&lt;br /&gt;
&lt;br /&gt;
== Tips for students ==&lt;br /&gt;
* Follow official [https://github.com/numfocus/gsoc/blob/master/CONTRIBUTING-contributors.md NumFOCUS guidelines].&lt;br /&gt;
* Include &amp;quot;GRASS&amp;quot; in the title of our idea to easily distinguish ideas and projects inside NumFOCUS.&lt;br /&gt;
* If you have your own ideas we encourage you to propose them. Explain them on the [https://discourse.osgeo.org/c/grass/developer/61 on our Discourse].&lt;br /&gt;
* Follow some good practices in your ideas and proposals:&lt;br /&gt;
** Stress why the project would be useful.&lt;br /&gt;
** Show that you know how you will proceed. That is, make sure that you can demonstrate that the proposal is feasible in the given time frame.&lt;br /&gt;
** Be specific in the implementation (or at least as specific as you can).&lt;br /&gt;
** Explain what the final product will look like and how it will work. You can add drawings or mock-ups.&lt;br /&gt;
** Explain how the idea relates to existing GRASS functions, features, and needs.&lt;br /&gt;
** Do not include steps such as &amp;quot;install GRASS&amp;quot;, &amp;quot;compile GRASS libraries (on my machine)&amp;quot;, &amp;quot;read about the API&amp;quot;. You should do this before applying to GSoC.&lt;br /&gt;
* Compile GRASS from source and prepare environment for development:&lt;br /&gt;
** Read [https://github.com/OSGeo/grass/blob/main/CONTRIBUTING.md CONTRIBUTING file].&lt;br /&gt;
* Prove your worth by being active on the [https://discourse.osgeo.org/c/grass/developer/61 GRASS Discourse] or other channels ([https://github.com/OSGeo/grass/discussions GitHub Discussions], fix some [https://github.com/OSGeo/grass/issues bugs], and/or implement some (smaller) features, or write some (simpler) GRASS module, and post it to mailing list. There's no better way to demonstrate your willingness and abilities. Do this before start you apply to GSoC. &lt;br /&gt;
* Also note that fixing existing bugs and/or implementing enhancements will be a part of student evaluation.&lt;br /&gt;
&lt;br /&gt;
{{GSoC}}&lt;/div&gt;</summary>
		<author><name>Gulshan</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2026_Support_writing_tests_with_pytest&amp;diff=28859</id>
		<title>GRASS GSoC 2026 Support writing tests with pytest</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2026_Support_writing_tests_with_pytest&amp;diff=28859"/>
		<updated>2026-05-05T03:22:35Z</updated>

		<summary type="html">&lt;p&gt;Gulshan: Created page with &amp;quot;{| class=&amp;quot;wikitable&amp;quot; | '''Student Name''' || Gulshan Kumar |- | '''Organization''' || [https://numfocus.org/ NumFOCUS] |- | '''Mentor Name''' || Vaclav Petras, Stefan Blumentrath |- | '''GitHub Fork''' || [https://github.com/gulshan-123/grass View Repo] |- | '''LinkedIn Profile''' || [https://www.linkedin.com/in/gul-shan123 View LinkedIn] |}  = Abstract = The current test framework in GRASS, gunittest, was designed before GitHub era. Based on Python unittest, it has seve...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Student Name''' || Gulshan Kumar&lt;br /&gt;
|-&lt;br /&gt;
| '''Organization''' || [https://numfocus.org/ NumFOCUS]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mentor Name''' || Vaclav Petras, Stefan Blumentrath&lt;br /&gt;
|-&lt;br /&gt;
| '''GitHub Fork''' || [https://github.com/gulshan-123/grass View Repo]&lt;br /&gt;
|-&lt;br /&gt;
| '''LinkedIn Profile''' || [https://www.linkedin.com/in/gul-shan123 View LinkedIn]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Abstract =&lt;br /&gt;
The current test framework in GRASS, gunittest, was designed before GitHub era. Based on Python unittest, it has several distinct types of assertion methods and requires tests to be executed from within a GRASS shell session. This has steep learning curve and is far from modern testing methods which uses Pytest.&lt;br /&gt;
&lt;br /&gt;
This project aims to modify the GRASS test by shifting the testing framework to pytest. Pytest uses simple and plain assert statements, fixtures, and is more readable. The project will involve designing a new API for several grass related assertions, implementing fixtures to handle GRASS sessions and temporary mapsets outside of the GRASS shell, integrating sample datasets, and iterative refactoring (utilizing tools like Bowler) to migrate existing tests. Thus, this will result in a more Pythonic, accessible, and maintainable testing environment for GRASS contributors.&lt;br /&gt;
&lt;br /&gt;
= Project Scope =&lt;br /&gt;
# API Design: Designing how GRASS specific assertions (like rasterExists) will look in pytest. We will draw inspiration from NumPy/GDAL own migration history.&lt;br /&gt;
# Session &amp;amp; Mapset Fixtures: Designing pytest fixtures to handle GRASS session setup and teardown. This also include running pytest outside of a GRASS session.&lt;br /&gt;
# Isolation: Tests must be isolated to ensure there is no side effects between them. We will decide on per file/per function isolation.&lt;br /&gt;
# Sample Dataset Integration: Addressing the dependency on the NC SPM sample dataset from grass.gunittest to the pytest framework.&lt;br /&gt;
# Iterative Refactoring Strategy: Defining the location for the new tests (tests or testsuite directories) and utilizing AST-based refactoring tools like Bowler (combined with AI agents) to automate the migration of existing tests.&lt;br /&gt;
# Contributor Documentation: Creating a user friendly testing guide for future contributors to encourage rapid adoption of the new pytest framework.&lt;br /&gt;
&lt;br /&gt;
= Timeline =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Period !! Timeline  !! Tasks   !! Status &lt;br /&gt;
|-&lt;br /&gt;
| Community Bonding Period &lt;br /&gt;
||&lt;br /&gt;
May 1 - May 24, 2026&lt;br /&gt;
|| &lt;br /&gt;
# Finalize the API design for the new assertion functions alongside mentors.&lt;br /&gt;
# Research NumPy and GDAL transition to pytest for more insights.&lt;br /&gt;
# Engage with the community to establish conventions for the new tests structure.&lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;13&amp;quot; | Official Coding Period &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 1''' (May 25 - May 31) || &lt;br /&gt;
# Implement fixtures to allow pytest execution outside the GRASS shell in conftest.py.&lt;br /&gt;
# Fix grass.script.setup.init behavior.&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 2''' (June 1 - June 7) ||&lt;br /&gt;
# Implement function/module scoped fixtures for temporary mapset creation and teardown. Ensure environment isolation.&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 3''' (June 8 - June 14) ||&lt;br /&gt;
# Begin translating basic gunittest assertions to pytest equivalents.&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 4''' (June 15 - June 21) ||&lt;br /&gt;
# Implement complex geospatial comparison functions (e.g., vector/raster fitting).&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 5''' (June 22 - June 28) ||&lt;br /&gt;
# Work on integrating the NC SPM sample dataset into the new pytest architecture.&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 6''' (June 29 - July 5) ||&lt;br /&gt;
# Finalize dataset integration.&lt;br /&gt;
# Write unit tests for the new pytest fixtures and utilities to ensure framework stability.&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#ffdead;&amp;quot; | '''Midterm Evaluation''' (July 6 - July 10) ||&lt;br /&gt;
# Submit MidTerm evaluation.&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 7''' (July 6 - July 12) ||&lt;br /&gt;
# Develop automation scripts using Bowler (and AI assistance) for iterative refactoring of existing test suites.&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 8''' (July 13 - July 19) ||&lt;br /&gt;
# Begin migrating test files from unittest to pytest.&lt;br /&gt;
# Decide on unittest class structures vs. pure functions based on mentor feedback.&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 9''' (July 20 - July 26) ||&lt;br /&gt;
# Continue iterative migration, focusing on tests that failed or interacted poorly with grass --exec.&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 10''' (July 27 - August 2) ||&lt;br /&gt;
# Draft the User Guide for contributors on how to write tests using the new pytest framework.&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 11''' (August 3 - August 9) ||&lt;br /&gt;
# Address edge cases, fix failing tests resulting from the migration, and ensure CI pipelines are green.&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 12''' (August 10 - August 16) ||&lt;br /&gt;
# Buffer week. Code cleanup, finalizing PRs, and reviewing documentation.&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Final Week&lt;br /&gt;
| August 17 - August 24&lt;br /&gt;
|&lt;br /&gt;
# Submit Report, Project, Blog and Documentation&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Reports =&lt;br /&gt;
== Community Bonding Period ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Log of Pull Requests =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PR !! PR Title&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/7071 #7071] || g.parser: Missing support G_OPT_F FORMAT in python %option&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/7051 #7051] || t.vect.list: Added support for JSON, YAML and CSV&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/7004 #7004] || grass.jupyter: use json output format in timeseriesmap&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/6971 #6971] || db.columns: added format list and format=csV&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/6933 #6933] || db.columns: added support for -e to print more column information&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/6867 #6867] || v.info: Add format csv with c flag and sync with v.db.connect&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/6823 #6823] || v.info: Sync -c flag with format=JSON output with v.db.connect&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/6801 #6801] || v.db.connect: Ends with error if both -p and -c flags are present&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/6728 #6728] || db.select: Adding JSON and CSV support&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/6703 #6703] || doc: Enable MathJax rendering for equations in MkDocs documentation&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Gulshan</name></author>
	</entry>
</feed>