🎉 Thanks for taking the time to contribute! 🎉
The following is a set of guidelines for contributing to Presidio.
This project has adopted the Contributor Covenant Code of Conduct. By participating, you are expected to uphold this code. Please report unacceptable behavior to presidio@dataprivacystack.org.
Presidio is a community project aimed at helping everyone handle their private data and make the world a safer place. Presidio is both a framework and a system. It's a framework in a sense that you could take code parts from it, extend, customize and plug somewhere. It's also a system you could take as a whole or in parts and deploy locally, on-prem on in the cloud. When contributing to presidio, it's important to keep this in mind, as some "framework" contributions might not be suitable for a deployment, or vice-versa.
By submitting a contribution, you represent that you have the legal right to contribute the code and that it may be distributed under the project's MIT license. Furthermore, you confirm that you have the right to submit this contribution and that it does not knowingly contain proprietary or confidential information/code.
Commit message should be clear, explaining the committed changes.
Update CHANGELOG.md:
Under Unreleased section, use the category which is most suitable for your change (changed/removed/deprecated). Document the change with simple readable text and push it as part of the commit. Next release, the change will be documented under the new version.
To get started, refer to the documentation for setting up a development environment.
For Python, Presidio leverages pytest and ruff. See this tutorial on more information on testing presidio modules.
PRs require >= 90% coverage on changed lines. A bot will comment on your PR with coverage details.
Adding a new recognizer is a great way to improve Presidio. A new capability to detect a new type of PII entity improves Presidio's coverage and makes private data less accessible.
Best practices for developing recognizers are described here. Please follow these guidelines when proposing new recognizers.
To contribute a new predefined recognizer to Presidio Analyzer:
-
Choose the correct folder:
- If your recognizer is specific to a country or region, add it under
presidio-analyzer/presidio_analyzer/predefined_recognizers/country_specific/<country>/. - For globally applicable recognizers, use
generic/. - For recognizers based on NLP engines, use
nlp_engine_recognizers/. - For standalone NER models, use
ner/. - For third-party integrations, use
third_party/.
- If your recognizer is specific to a country or region, add it under
-
Add your recognizer class in the appropriate folder.
- If your recognizer uses regex patterns:
- Make regex patterns as specific as possible to minimize false positives.
- Document the source or reference for any new regex logic (e.g., link to a standard, documentation, or example dataset) in the code as a comment.
- If your recognizer is country-specific (lives under
country_specific/<country>/):- Declare its country by setting the class-level
COUNTRY_CODE = "<iso-3166-1-alpha-2>"attribute (e.g.COUNTRY_CODE = "us"for US recognizers,"de"for Germany). This is what powersRecognizerRegistry.load_predefined_recognizers(countries=[...]). See Filtering recognizers by country for details. - The
COUNTRY_CODEvalue should match the directory's country: e.g. anything undercountry_specific/us/declares"us", anything undercountry_specific/de/declares"de". Use"uk"(not"gb") for the United Kingdom directory to stay consistent with the existing layout. - Generic / locale-agnostic recognizers (credit cards, emails, URLs, IBAN, dates, …) leave
COUNTRY_CODEunset; the default ofNonemeans the recognizer is always loaded regardless of any country filter.
- Declare its country by setting the class-level
- If your recognizer uses regex patterns:
-
Add your recognizer to the configuration:
- Add your recognizer to
presidio-analyzer/presidio_analyzer/conf/default_recognizers.yaml. - For country-specific recognizers, also declare
country_code: <iso>on the YAML entry to mirror the class-levelCOUNTRY_CODE. The loader cross-checks the two and refuses to load on mismatch, so the YAML stays a discoverable record of the country tag for no-code users. - For country-specific recognizers, set
enabled: falseby default in the YAML configuration.
- Add your recognizer to
-
Update imports: Add your recognizer to
presidio-analyzer/presidio_analyzer/predefined_recognizers/__init__.pyso it is available for import and backward compatibility. -
Update
__all__: Add your recognizer class name to the__all__list in the same__init__.pyfile. -
Testing:
- Ensure all existing tests pass.
- Add or update tests for your new recognizer.
-
Documentation:
- If your recognizer supports a new entity, consider updating the supported entities list.
- Follow the best practices for recognizer development and adding recognizers.
Please review the open issues on Github for known bugs and feature requests. We sometimes add 'good first issue' labels on those we believe are simpler, and 'advanced' labels on those which require more work or multiple changes across the solution.
We would love to see more samples demonstrating how to use Presidio in different scenarios. If you have a sample that you think would be useful for others, please consider contributing it. You can find the samples in the samples folder.
When contributing a sample, make sure it is self contained (e.g. external dependencies are documented), add it [to the index] (docs/samples/index.md), and to the mkdocs.yml file.
For any questions, please email presidio@dataprivacystack.org.