Skip to main content

sherlock_io/patterns/
python.rs

1use regex::Regex;
2
3pub struct PythonPatterns {
4    external_patterns: Vec<Regex>,
5    cache_patterns: Vec<Regex>,
6    extensions: Vec<String>,
7}
8
9impl PythonPatterns {
10    pub fn new() -> Self {
11        let external_patterns = vec![
12            // Python bytecode
13            Regex::new(r"__pycache__").unwrap(),
14            Regex::new(r"\.pyc$").unwrap(),
15            Regex::new(r"\.pyo$").unwrap(),
16            Regex::new(r"\.pyd$").unwrap(),
17            
18            // Package installations
19            Regex::new(r"site-packages").unwrap(),
20            Regex::new(r"dist-packages").unwrap(),
21            Regex::new(r"\.egg-info").unwrap(),
22            Regex::new(r"\.dist-info").unwrap(),
23            Regex::new(r"\.whl$").unwrap(),
24            Regex::new(r"\.egg$").unwrap(),
25            
26            // Virtual environments
27            Regex::new(r"\.venv/").unwrap(),
28            Regex::new(r"venv/").unwrap(),
29            Regex::new(r"env/").unwrap(),
30            Regex::new(r"\.env/").unwrap(),
31            Regex::new(r"virtualenv/").unwrap(),
32            
33            // Conda environments
34            Regex::new(r"\.conda/").unwrap(),
35            Regex::new(r"conda-meta/").unwrap(),
36            Regex::new(r"envs/").unwrap(),
37            Regex::new(r"pkgs/").unwrap(),
38            
39            // Build directories
40            Regex::new(r"build/").unwrap(),
41            Regex::new(r"dist/").unwrap(),
42            Regex::new(r"\.build/").unwrap(),
43            Regex::new(r"\.dist/").unwrap(),
44        ];
45
46        let cache_patterns = vec![
47            // Testing caches
48            Regex::new(r"\.pytest_cache").unwrap(),
49            Regex::new(r"\.tox/").unwrap(),
50            Regex::new(r"\.nox/").unwrap(),
51            Regex::new(r"\.coverage").unwrap(),
52            Regex::new(r"htmlcov/").unwrap(),
53            Regex::new(r"\.coverage\..*").unwrap(),
54            
55            // Type checking caches
56            Regex::new(r"\.mypy_cache").unwrap(),
57            Regex::new(r"\.pytype/").unwrap(),
58            Regex::new(r"\.pyre/").unwrap(),
59            Regex::new(r"\.dmypy\.json").unwrap(),
60            
61            // Linting and formatting caches
62            Regex::new(r"\.ruff_cache").unwrap(),
63            Regex::new(r"\.black").unwrap(),
64            Regex::new(r"\.pylint\.d/").unwrap(),
65            Regex::new(r"\.flake8").unwrap(),
66            
67            // Jupyter notebook caches
68            Regex::new(r"\.ipynb_checkpoints").unwrap(),
69            Regex::new(r"\.jupyter/").unwrap(),
70            
71            // Documentation build caches
72            Regex::new(r"\.sphinx/").unwrap(),
73            Regex::new(r"docs/_build/").unwrap(),
74            Regex::new(r"docs/build/").unwrap(),
75            Regex::new(r"\.doctrees/").unwrap(),
76            
77            // Profiling and debugging
78            Regex::new(r"\.prof").unwrap(),
79            Regex::new(r"\.profile").unwrap(),
80            Regex::new(r"\.pstats").unwrap(),
81            
82            // Packaging caches
83            Regex::new(r"\.eggs/").unwrap(),
84            Regex::new(r"\.cache/").unwrap(),
85            Regex::new(r"\.pip/").unwrap(),
86            
87            // Development server caches
88            Regex::new(r"\.django_cache/").unwrap(),
89            Regex::new(r"\.flask_session/").unwrap(),
90            
91            // Machine learning caches
92            Regex::new(r"\.wandb/").unwrap(),
93            Regex::new(r"\.mlflow/").unwrap(),
94            Regex::new(r"\.tensorboard/").unwrap(),
95        ];
96
97        let extensions = vec![
98            // Python source files
99            "py".to_string(), "pyw".to_string(), "pyi".to_string(),
100            "pyx".to_string(), "pxd".to_string(), "pxi".to_string(),
101            
102            // Jupyter notebooks
103            "ipynb".to_string(),
104            
105            // Python templates
106            "pyt".to_string(), "pth".to_string(),
107            
108            // Web frameworks
109            "wsgi".to_string(), "asgi".to_string(),
110            
111            // Configuration files commonly used in Python projects
112            "cfg".to_string(), "ini".to_string(),
113        ];
114
115        Self {
116            external_patterns,
117            cache_patterns,
118            extensions,
119        }
120    }
121
122    pub fn get_external_patterns(&self) -> &[Regex] {
123        &self.external_patterns
124    }
125
126    pub fn get_cache_patterns(&self) -> &[Regex] {
127        &self.cache_patterns
128    }
129
130    pub fn get_extensions(&self) -> &[String] {
131        &self.extensions
132    }
133
134    pub fn get_script_names() -> Vec<&'static str> {
135        vec![
136            // Package management
137            "requirements.txt", "requirements-dev.txt", "requirements-test.txt",
138            "dev-requirements.txt", "test-requirements.txt",
139            "setup.py", "setup.cfg", "pyproject.toml", "poetry.lock",
140            "Pipfile", "Pipfile.lock", "pipenv.lock",
141            "environment.yml", "environment.yaml", "conda.yaml",
142            "conda-requirements.txt", "environment-dev.yml",
143            
144            // Modern Python packaging
145            "pyproject.toml", "setup.cfg", "MANIFEST.in",
146            "flit.ini", "pdm.lock", "poetry.toml",
147            
148            // Testing configuration
149            "tox.ini", "pytest.ini", "pytest.cfg",
150            "nose.cfg", "nose2.cfg", "unittest.cfg",
151            "conftest.py", "test_*.py", "*_test.py",
152            ".coveragerc", "coverage.ini",
153            
154            // Code quality and linting
155            "mypy.ini", ".mypy.ini", "mypy.cfg",
156            ".flake8", ".pylintrc", "pylint.cfg",
157            ".bandit", "bandit.yaml", "bandit.yml",
158            ".pre-commit-config.yaml", ".pre-commit-hooks.yaml",
159            "pycodestyle.cfg", "pep8.cfg",
160            "ruff.toml", ".ruff.toml",
161            
162            // Documentation
163            "conf.py", "make.bat", "Makefile",
164            "docs/conf.py", "doc/conf.py",
165            "sphinx.cfg", "readthedocs.yml", ".readthedocs.yml",
166            
167            // Web frameworks
168            "manage.py", "wsgi.py", "asgi.py",
169            "app.py", "main.py", "run.py",
170            "flask_app.py", "django_app.py",
171            "fastapi_app.py", "starlette_app.py",
172            "gunicorn.conf.py", "uwsgi.ini",
173            
174            // Data science and ML
175            "jupyter_notebook_config.py", "ipython_config.py",
176            "notebook.json", "lab.json",
177            "requirements-gpu.txt", "requirements-cpu.txt",
178            
179            // Deployment and containerization
180            "Dockerfile", "docker-compose.yml", "docker-compose.yaml",
181            "Procfile", "runtime.txt", "app.yaml",
182            "serverless.yml", "serverless.yaml",
183            
184            // CI/CD
185            ".github/workflows/python.yml", ".gitlab-ci.yml",
186            "azure-pipelines.yml", "Jenkinsfile",
187            "noxfile.py", "tasks.py",
188            
189            // Database
190            "alembic.ini", "migrations/", "models.py",
191            "database.py", "db.py", "schema.py",
192            
193            // Configuration
194            "config.py", "settings.py", "local_settings.py",
195            ".env", ".env.local", ".env.example",
196            "logging.conf", "logging.ini",
197        ]
198    }
199}