A modern, async PHP framework detector.
Project description
PHP Framework Detector
Detect PHP frameworks in any project directory with a modern, async Python tool. Supports 17+ frameworks, structured logging, and a user-friendly CLI.
Features
- Async detection for high performance
- 17+ frameworks supported
- Structured logging (structlog)
- Type safety (Pydantic)
- Modern CLI (Rich)
- Configurable & extensible
Supported Frameworks
Laravel, Symfony, CodeIgniter, CakePHP, Yii, ThinkPHP, Slim, Fuel, Phalcon, Laminas, Zend Framework, Drupal, Drush, Fat-Free, PHPixie, PopPHP, FastRoute
Installation
# Recommended (uv)
uv add php-framework-detector
# Or pip
pip install php-framework-detector
Usage
CLI
php-framework-detector /path/to/php/project [--json] [--all] [--verbose]
php-framework-detector list-frameworks
php-framework-detector version
Docker
docker run --rm -it -v /path/to/php/project:/var/www/html ghcr.io/wangyihang/php-framework-detector:main detect /var/www/html
Python API
import asyncio
from php_framework_detector import FrameworkDetectorFactory, DetectionConfig
async def main():
config = DetectionConfig(timeout=30, max_file_size=1024*1024, verbose=True)
result = await FrameworkDetectorFactory.detect_all_frameworks_async("/path/to/php/project", config)
print(result)
asyncio.run(main())
Configuration Example
from php_framework_detector import DetectionConfig
config = DetectionConfig(
check_composer=True,
check_files=True,
check_dependencies=True,
max_file_size=1024*1024,
timeout=30,
verbose=False
)
Architecture
- FrameworkDetector: Base class for detectors
- FrameworkDetectorFactory: Detector management
- DetectionConfig: Config model
- DetectionResult: Structured results
- Custom Exceptions: Error handling
Detection strategies:
- File pattern matching
- Composer dependency analysis
- Content pattern matching
- Priority-based scoring
Add a New Framework
- Create a detector in
frameworks/:
from ..core.detector import FrameworkDetector
class MyFrameworkDetector(FrameworkDetector):
name = "myframework"
display_name = "My Framework"
def detect(self):
return self._check_path_patterns(["myframework.php"])
async def _detect_async_impl(self):
return 50 if await self._check_path_patterns_async(["myframework.php"]) else 0
- Register it in
frameworks/__init__.py:
from .myframework import MyFrameworkDetector
FrameworkDetectorFactory.register_detector(MyFrameworkDetector)
Development
git clone https://github.com/your-username/php-framework-detector.git
cd php-framework-detector
uv sync
uv sync --extra dev
pytest
black .
isort .
mypy .
ruff check .
Testing
pytest
pytest --cov=php_framework_detector
pytest --asyncio-mode=auto
Contributing
- Fork & branch
- Add features/tests
- Ensure all tests pass
- Submit a pull request
License
MIT License. See LICENSE.
Changelog
v0.2.0
- Refactored, async, structured logging, type safety, improved CLI, error handling, better detection
v0.1.0
- Initial release
Project details
Release history Release notifications | RSS feed
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 php_framework_detector-0.2.15.tar.gz.
File metadata
- Download URL: php_framework_detector-0.2.15.tar.gz
- Upload date:
- Size: 63.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.8.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9cb0676acaa49dee165f9c01b6b4496e46e666acca62c1cf7be36cfc7f09ce7e
|
|
| MD5 |
6abbe7b29a271fdb90f226d78838b7a4
|
|
| BLAKE2b-256 |
fabca68aa9b928280cff510723c48fcda300fdb6edd94f9f87dbbc87d27a94f2
|
File details
Details for the file php_framework_detector-0.2.15-py3-none-any.whl.
File metadata
- Download URL: php_framework_detector-0.2.15-py3-none-any.whl
- Upload date:
- Size: 36.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.8.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
82406fc1d6a2991cb70543fc9a82a9fec8fbd6dce06e51593adb2fe8b722c69f
|
|
| MD5 |
1c1cf4ac55c3fe159dc1aaf720324250
|
|
| BLAKE2b-256 |
cabd0101d82913df699000587a14eb23c44dbabe36c494509ed2b36b3c84328a
|