# Structure of the code
See how the [[#src/]] and [[#tests/]] directories are structured.
## Directory structure
### src/
The `src/` directory contains the code that **implements** the Tasks plugin.
- [main.ts](https://github.com/obsidian-tasks-group/obsidian-tasks/blob/main/src/main.ts)
- The `TasksPlugin` class.
- [Api/](https://github.com/obsidian-tasks-group/obsidian-tasks/tree/main/src/Api):
- The [Tasks API](https://publish.obsidian.md/tasks/Advanced/Tasks+Api)
- [Commands/](https://github.com/obsidian-tasks-group/obsidian-tasks/tree/main/src/Commands)
- Obsidian commands implemented by Tasks.
- [Config/](https://github.com/obsidian-tasks-group/obsidian-tasks/tree/main/src/Config)
- Storage and UI for [user settings](https://publish.obsidian.md/tasks/Getting+Started/Settings).
- [Themes/](https://github.com/obsidian-tasks-group/obsidian-tasks/tree/main/src/Config/Themes):
- The [Supported CSS Snippets and Themes](https://publish.obsidian.md/tasks/Reference/Status+Collections/About+Status+Collections).
- See [[How do I add one-click support for new themes or snippets for custom statuses]].
- [Layout/](https://github.com/obsidian-tasks-group/obsidian-tasks/tree/main/src/Layout)
- Related to the types of data that can be [shown and hidden](https://publish.obsidian.md/tasks/Queries/Layout) in searches.
- Heavily used by:
- `src/TaskSerializer/`
- `src/Renderer`
- [Obsidian/](https://github.com/obsidian-tasks-group/obsidian-tasks/tree/main/src/Obsidian)
- Code which is heavily dependent on Obsidian types such as `App`, `Modal`, `Plugin`, `MarkdownPostProcessorContext`.
- Has virtually no test coverage, unfortunately, as much of the Obsidian API code requires a graphical environment and is not available outside a vault.
- However, we are very gradually increasing coverage by mocking little bits of Obsidian in [tests/\__mocks\__/obsidian.ts](https://github.com/obsidian-tasks-group/obsidian-tasks/blob/main/tests/__mocks__/obsidian.ts).
- [Query/](https://github.com/obsidian-tasks-group/obsidian-tasks/tree/main/src/Query)
- Code for parsing queries.
- The main class is [Query](https://github.com/obsidian-tasks-group/obsidian-tasks/blob/main/src/Query/Query.ts).
- [Explain/](https://github.com/obsidian-tasks-group/obsidian-tasks/tree/main/src/Query/Explain)
- Implementation of the [explain](https://publish.obsidian.md/tasks/Queries/Explaining+Queries) instruction.
- [Filter/](https://github.com/obsidian-tasks-group/obsidian-tasks/tree/main/src/Query/Filter)
- Contains abstract base class [Field](https://github.com/obsidian-tasks-group/obsidian-tasks/blob/main/src/Query/Filter/Field.ts)
- There is one derived `Field` class for each of the task properties that can be searched/filtered, sorted and grouped.
- Example: [PriorityField.ts](https://github.com/obsidian-tasks-group/obsidian-tasks/blob/main/src/Query/Filter/PriorityField.ts).
- [Group/](https://github.com/obsidian-tasks-group/obsidian-tasks/tree/main/src/Query/Group)
- Implementation of the grouping mechanism.
- [TaskGroups](https://github.com/obsidian-tasks-group/obsidian-tasks/blob/main/src/Query/Group/TaskGroups.ts) is the starting point for grouping tasks.
- [Matchers/](https://github.com/obsidian-tasks-group/obsidian-tasks/tree/main/src/Query/Matchers)
- Abstraction for the different types of [text filters](https://publish.obsidian.md/tasks/Queries/Filters#Text%20filters):
- Substring search
- Regular expression search
- [Presets](https://github.com/obsidian-tasks-group/obsidian-tasks/tree/main/src/Query/Presets)
- Implementation details of the [presets](https://publish.obsidian.md/tasks/Queries/Presets) facility, for declaring re-usable, named instruction blocks.
- See also these in `src/Config/`:
- [PresetsSettingsUI.ts](https://github.com/obsidian-tasks-group/obsidian-tasks/blob/main/src/Config/PresetsSettingsUI.ts)
- [PresetsSettingsUI.scss](https://github.com/obsidian-tasks-group/obsidian-tasks/blob/main/src/Config/PresetsSettingsUI.scss)
- [Sort/](https://github.com/obsidian-tasks-group/obsidian-tasks/tree/main/src/Query/Sort)
- Implementation of the sorting mechanism.
- [Sort.ts](https://github.com/obsidian-tasks-group/obsidian-tasks/blob/main/src/Query/Sort/Sort.ts) is the starting point for sorting tasks.
- [Renderer/](https://github.com/obsidian-tasks-group/obsidian-tasks/tree/main/src/Renderer)
- Convert Query results and Task objects to HTML.
- [Scripting/](https://github.com/obsidian-tasks-group/obsidian-tasks/tree/main/src/Scripting)
- Implementation of [Scripting](https://publish.obsidian.md/tasks/Scripting/About+Scripting) and [Placeholder](https://publish.obsidian.md/tasks/Scripting/Placeholders)code.
- This is where the custom filters, sorters and groups are implemented.
- [Statuses/](https://github.com/obsidian-tasks-group/obsidian-tasks/tree/main/src/Statuses)
- Core and Custom [Statuses](https://publish.obsidian.md/tasks/Getting+Started/Statuses).
- [Suggestor/](https://github.com/obsidian-tasks-group/obsidian-tasks/tree/main/src/Suggestor)
- Implementation of [Auto-Suggest](https://publish.obsidian.md/tasks/Editing/Auto-Suggest).
- [Task/](https://github.com/obsidian-tasks-group/obsidian-tasks/tree/main/src/Task)
- [Task](https://github.com/obsidian-tasks-group/obsidian-tasks/blob/main/src/Task/Task.ts) class and related code.
- [TaskSerializer/](https://github.com/obsidian-tasks-group/obsidian-tasks/tree/main/src/TaskSerializer)
- Reading and writing of Task objects in supported [Task formats](https://publish.obsidian.md/tasks/Reference/Task+Formats/About+Task+Formats).
- [lib/](https://github.com/obsidian-tasks-group/obsidian-tasks/tree/main/src/lib)
- Assorted helper code.
- [ui/](https://github.com/obsidian-tasks-group/obsidian-tasks/tree/main/src/ui)
- The ['Create or edit Task' Modal](https://publish.obsidian.md/tasks/Editing/Create+or+edit+Task).
- [EditInstructions/](https://github.com/obsidian-tasks-group/obsidian-tasks/tree/main/src/ui/EditInstructions)
- [TaskEditingInstruction](https://github.com/obsidian-tasks-group/obsidian-tasks/blob/main/src/ui/EditInstructions/TaskEditingInstruction.ts) is an abstraction for making a single edit to a task.
- [Menus/](https://github.com/obsidian-tasks-group/obsidian-tasks/tree/main/src/ui/Menus)
- Various context menus.
- [TaskEditingMenu](https://github.com/obsidian-tasks-group/obsidian-tasks/blob/main/src/ui/Menus/TaskEditingMenu.ts) is an abstraction for context menus on a Task instance, based upon `TaskEditingInstruction`.
### tests/
The `tests/` directory contains the code that **tests** the Tasks plugin, using mechanisms described in [[About Testing]]
Most sub-directories here have the same structure and purpose as their counterparts described above in [[#src/]].
The remainder are:
- [\_\_mocks\_\_/obsidian.ts](https://github.com/obsidian-tasks-group/obsidian-tasks/blob/main/tests/__mocks__/obsidian.ts)
- Mock implementations of a few types and functions from the Obsidian API.
- [\_\_test_data\_\_/MockDataForTogglingTasks/](https://github.com/obsidian-tasks-group/obsidian-tasks/tree/main/tests/__test_data__/MockDataForTogglingTasks)
- Some data used by [File.test.ts](https://github.com/obsidian-tasks-group/obsidian-tasks/blob/main/tests/Obsidian/File.test.ts).
- [global-setup.js](https://github.com/obsidian-tasks-group/obsidian-tasks/blob/main/tests/global-setup.js)
- Enforce all tests to run in UTC time.
- [CustomMatchers/](https://github.com/obsidian-tasks-group/obsidian-tasks/tree/main/tests/CustomMatchers)
- Jest custom matchers for Tasks classes.
- [Obsidian/\_\_test_data\_\_/](https://github.com/obsidian-tasks-group/obsidian-tasks/tree/main/tests/Obsidian/__test_data__)
- JSON files saved from the Obsidian cache, to enable testing against some of the Obsidian API.
- See [[Using Obsidian API in tests]].
- [TestingTools/](https://github.com/obsidian-tasks-group/obsidian-tasks/tree/main/tests/TestingTools)
- Many helper functions to streamling testing.