A simple package to get the absolute path of your Python project root
Project description
project_root_finder
project_root_finder is a simple Python package that provides a variable root which represents the absolute path to the root of the project in which it is installed.
Installation
You can install the package using pip:
pip install project_root_finder
Setup
If you have any of these files at the root of your project:
.git(Git repository)pyproject.toml(Python project config)requirements.txt(Python package setup)Pipfile(Pipenv configuration)
You don't need to do anything.
If you don't have these, add a file named .project-root-hook to the root of your project. This file can be empty, but its presence will allow the package to identify the project root.
Usage Examples
The project_root_finder package provides a simple way to get the absolute path to your project's root directory. This is useful for file operations that need to be relative to your project root, regardless of where the script is executed from.
Basic Usage
import project_root_finder
from pathlib import Path
# Access the project root path (returns a Path object)
project_root = project_root_finder.root
# Use it for file operations with pathlib
config_path = project_root / "config" / "settings.yaml"
data_path = project_root / "data" / "samples.csv"
# Or convert to string for other operations
log_path = str(project_root / "logs" / "application.log")
How It Works
The package determines the project root by:
- Starting from the location of its own
__init__.pyfile - Searching upward through parent directories for common project marker files:
.git(Git repository)pyproject.toml(Python project config)requirements.txt(Python package setup)Pipfile(Pipenv configuration)
- If a marker is found, that directory is used as the project root
- If no markers are found in any parent directories, it falls back to the parent directory of the module
Custom Project Root Marker
The project_root_finder package also supports a custom project root marker file named .project-root-hook. If this file is present in any parent directory of the starting path, it will take precedence over other markers (e.g., .git, pyproject.toml, etc.) when determining the project root.
This feature is useful for projects that do not use standard markers or require a specific marker to define the root directory.
Running Tests
This package includes a comprehensive test suite to ensure it works correctly across different scenarios.
Prerequisites
Make sure you have the development dependencies installed:
pip install pytest
# Or if using pipenv
pipenv install --dev
Running the Tests
To run the test suite:
pytest
Or for more verbose output:
pytest -v
What the Tests Cover
The test suite verifies that project_root_finder:
This test suite comprehensively verifies the behaviour of _get_project_root, ensuring it correctly identifies the project root directory under a variety of conditions.
The tests cover the following scenarios:
| Test Name | Purpose | What it Verifies |
|---|---|---|
test_finds_project_root_hook |
Priority on .project-root-hook |
Ensures the function correctly identifies the root when .project-root-hook is present, even from nested folders. |
test_fallback_to_git |
Fallback to .git marker |
Ensures that if .project-root-hook is missing, the function falls back correctly to detecting a .git directory. |
test_fallback_to_pipfile |
Fallback to Pipfile marker |
Checks fallback behaviour when a Pipfile exists instead of .project-root-hook. |
test_fallback_to_pyproject_toml |
Fallback to pyproject.toml |
Verifies that pyproject.toml is correctly recognised as a valid project root marker if no hook is present. |
test_no_marker_returns_none |
No markers at all | Confirms that the function returns None gracefully if no valid markers are found. |
test_custom_start_path_at_root |
Start directly at root | Ensures that starting the search from the root itself works correctly and immediately finds the root. |
test_multiple_markers_prefers_project_hook |
Priority over fallback markers | Verifies that .project-root-hook is prioritised over any fallback markers like .git, even if both are present. |
test_fallback_order_is_respected |
Correct fallback order | Ensures that when multiple fallback markers exist, the function still correctly identifies the root without confusion. |
test_deeply_nested_still_finds_root |
Deep directory traversal | Checks that even when called from a very deeply nested directory (10 levels down), the root is still correctly found by traversing upwards. |
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file project_root_finder-1.8.tar.gz.
File metadata
- Download URL: project_root_finder-1.8.tar.gz
- Upload date:
- Size: 4.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.9.21
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ebb49f52949da90dee6dadbf4d1adde22fe0bf75eb66e4747c4b7af7f65594a5
|
|
| MD5 |
11208371cd024f5455d3edc39b8ef80b
|
|
| BLAKE2b-256 |
ba39d425588ac946fd669c4e25727e61b1297718e8f673133b7124a2dc7b4bcc
|
File details
Details for the file project_root_finder-1.8-py3-none-any.whl.
File metadata
- Download URL: project_root_finder-1.8-py3-none-any.whl
- Upload date:
- Size: 4.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.9.21
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f29bea9f57cdbf7ea4074d08d19441bd2abaf745a9929485302d424a8f4eccb2
|
|
| MD5 |
4c85c2e62ef5f8c95aec4d90f9124ca7
|
|
| BLAKE2b-256 |
2ec0151f42243356aa68b36f9ec2e54c3df0556f21dc2ae0bd6df33e3039bbfe
|