{"id":34086331,"url":"https://github.com/danielnachumdev/quickpub","last_synced_at":"2026-04-09T04:02:37.396Z","repository":{"id":229071580,"uuid":"775682985","full_name":"danielnachumdev/quickpub","owner":"danielnachumdev","description":"A local CI/CD simulation tool that runs quality checks, tests, and validations locally before publishing Python packages, ensuring higher build pass rates and faster feedback loops.","archived":false,"fork":false,"pushed_at":"2026-01-19T20:33:19.000Z","size":610,"stargazers_count":1,"open_issues_count":2,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-20T02:21:13.865Z","etag":null,"topics":["async","cd","ci","ci-cd","library","local","package","python","strategy-pattern"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/danielnachumdev.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-03-21T21:02:53.000Z","updated_at":"2026-01-19T20:33:23.000Z","dependencies_parsed_at":"2024-03-21T22:30:48.424Z","dependency_job_id":"e4efedac-6af5-4cf8-93a0-f050b02ba2b3","html_url":"https://github.com/danielnachumdev/quickpub","commit_stats":null,"previous_names":["danielnachumdev/quickpub"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/danielnachumdev/quickpub","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielnachumdev%2Fquickpub","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielnachumdev%2Fquickpub/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielnachumdev%2Fquickpub/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielnachumdev%2Fquickpub/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/danielnachumdev","download_url":"https://codeload.github.com/danielnachumdev/quickpub/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielnachumdev%2Fquickpub/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31584820,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-08T14:31:17.711Z","status":"online","status_checked_at":"2026-04-09T02:00:06.848Z","response_time":112,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["async","cd","ci","ci-cd","library","local","package","python","strategy-pattern"],"created_at":"2025-12-14T13:26:22.939Z","updated_at":"2026-04-09T04:02:37.391Z","avatar_url":"https://github.com/danielnachumdev.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# QuickPub v3.0.61\n\n[![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)\n[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)\n\n**QuickPub** is a **local CI/CD simulation tool** that brings the power of cloud-based continuous integration directly to your development environment. Instead of waiting for cloud CI/CD pipelines to catch issues, QuickPub runs all quality checks, tests, and validations locally - ensuring higher build pass rates and faster feedback loops.\n\n## 🎯 **Why QuickPub?**\n\n### **Local CI/CD Simulation**\n- **Pre-Push Validation**: Run all CI/CD checks locally before pushing to remote repositories\n- **Faster Feedback**: Catch issues immediately in your IDE without waiting for cloud builds\n- **Customizable Error Display**: Format and display errors exactly how you want them\n- **Higher Build Success Rate**: Ensure your code passes all checks before it reaches cloud pipelines\n- **Cost Effective**: Reduce cloud CI/CD costs by catching issues locally first\n\n### **Developer Experience**\n- **IDE Integration**: Run comprehensive checks directly from your development environment\n- **Real-time Validation**: Get instant feedback on code quality, tests, and package configuration\n- **Consistent Environment**: Use the same validation logic locally and in production\n- **Debugging Friendly**: Easier to debug and fix issues when they're caught locally\n\n## 🚀 Features\n\n### 🔧 **Build System**\n- **Setuptools Integration**: Automated build process with `pyproject.toml` generation\n- **Multiple Build Schemas**: Extensible build system supporting different packaging strategies\n- **Automatic File Generation**: Creates `setup.py`, `pyproject.toml`, and `MANIFEST.in` files\n\n### 🛡️ **Quality Assurance (Local CI/CD Simulation)**\n- **Multi-Environment Testing**: Test across multiple Python versions and environments locally\n- **Built-in QA Runners** (Same as cloud CI/CD):\n  - **MyPy**: Static type checking with configurable error thresholds\n  - **Pylint**: Code quality analysis with customizable scoring\n  - **Pytest**: Comprehensive testing framework with coverage reporting\n  - **Unittest**: Traditional unit testing with pass/fail metrics\n- **Configurable Bounds**: Set minimum/maximum acceptable scores for each QA tool\n- **Parallel Execution**: Run QA checks across multiple environments simultaneously\n- **Local Environment Validation**: Ensure your code works across all target Python versions\n\n### 🔒 **Constraint Enforcement**\n- **Version Validation**: Ensure new versions are higher than existing ones\n  - **Local Version Check**: Prevents overwriting existing local builds\n  - **PyPI Remote Check**: Validates against published versions on PyPI\n- **File Validation**: \n  - **README Enforcer**: Ensures README file exists and is valid\n  - **License Enforcer**: Validates license file presence and format\n  - **PyPI RC Enforcer**: Verifies PyPI configuration for uploads\n\n### 🚀 **Deployment \u0026 Upload**\n- **Multiple Upload Targets**:\n  - **PyPI Upload**: Direct upload to Python Package Index\n  - **GitHub Upload**: Automatic git commit and push with version tags\n- **Configurable Credentials**: Secure credential management for different platforms\n\n### 🐍 **Python Environment Management**\n- **Multi-Environment Support**: Test across different Python versions locally\n- **Conda Integration**: Full support for Conda environments\n- **System Python**: Use system Python interpreter\n- **Custom Executables**: Support for custom Python installations\n\n### 📦 **Package Configuration**\n- **Automatic Metadata**: Generate package metadata from project structure\n- **Dependency Management**: Handle complex dependency specifications\n- **Classifier Support**: Automatic PyPI classifier assignment\n- **Keywords \u0026 Descriptions**: Comprehensive package documentation\n\n## 📋 Requirements\n\n- **Python**: 3.8.0 or higher\n- **Tested Versions**: 3.8.0, 3.9.0, 3.10.13\n\n## 🛠️ Installation\n\n```bash\npip install quickpub\n```\n\n## 📖 Quick Start\n\n### **Local CI/CD Workflow**\n\n```python\nfrom quickpub import publish, MypyRunner, PylintRunner, UnittestRunner, CondaPythonProvider, \\\n    PypircUploadTarget, SetuptoolsBuildSchema, GithubUploadTarget, PypircEnforcer, ReadmeEnforcer, LicenseEnforcer, \\\n    PypiRemoteVersionEnforcer, LocalVersionEnforcer\n\ndef main() -\u003e None:\n    # Run local CI/CD simulation - all checks happen locally before any cloud deployment\n    publish(\n        name=\"my-awesome-package\",\n        version=\"1.0.0\",\n        author=\"Your Name\",\n        author_email=\"your.email@example.com\",\n        description=\"A fantastic Python package\",\n        homepage=\"https://github.com/yourusername/my-awesome-package\",\n        \n        # Local Quality Assurance (simulates cloud CI/CD)\n        global_quality_assurance_runners=[\n            MypyRunner(bound=\"\u003c=20\", configuration_path=\"./mypy.ini\"),\n            PylintRunner(bound=\"\u003e=0.8\", configuration_path=\"./.pylintrc\"),\n            UnittestRunner(bound=\"\u003e=0.95\"),\n        ],\n        \n        # Local Build \u0026 Upload (only if all checks pass)\n        build_schemas=[SetuptoolsBuildSchema()],\n        upload_targets=[PypircUploadTarget(), GithubUploadTarget()],\n        \n        # Local Environment Testing (multiple Python versions)\n        python_interpreter_provider=CondaPythonProvider([\"base\", \"39\", \"380\"]),\n        \n        # Local Validation (prevents common CI/CD failures)\n        enforcers=[\n            PypircEnforcer(), \n            ReadmeEnforcer(), \n            LicenseEnforcer(),\n            LocalVersionEnforcer(), \n            PypiRemoteVersionEnforcer()\n        ],\n        \n        # Package Configuration\n        dependencies=[\"requests\u003e=2.25.0\", \"numpy\u003e=1.20.0\"],\n        min_python=\"3.8.0\",\n        keywords=[\"automation\", \"publishing\", \"python\"],\n    )\n\nif __name__ == '__main__':\n    main()\n```\n\n## 🔧 Configuration Options\n\n### Quality Assurance Runners (Local CI/CD Simulation)\n\n#### MyPy Runner\n```python\nMypyRunner(\n    bound=\"\u003c=20\",                    # Maximum number of errors allowed\n    configuration_path=\"./mypy.ini\", # Custom mypy configuration\n    target=\"./src\"                   # Target directory to check\n)\n```\n\n#### Pylint Runner\n```python\nPylintRunner(\n    bound=\"\u003e=0.8\",                   # Minimum score required (0-10 scale)\n    configuration_path=\"./.pylintrc\", # Custom pylint configuration\n    target=\"./src\"                   # Target directory to analyze\n)\n```\n\n#### Pytest Runner\n```python\nPytestRunner(\n    bound=\"\u003e=0.9\",                   # Minimum test pass rate\n    target=\"./tests\",                # Test directory\n    no_tests_score=0.0               # Score when no tests are found\n)\n```\n\n#### Unittest Runner\n```python\nUnittestRunner(\n    bound=\"\u003e=0.95\",                  # Minimum test pass rate\n    target=\"./tests\",                # Test directory\n    no_tests_score=0.0               # Score when no tests are found\n)\n```\n\n### Python Environment Providers (Local Multi-Version Testing)\n\n#### Conda Provider\n```python\nCondaPythonProvider(\n    env_names=[\"base\", \"py39\", \"py38\"],  # List of conda environments to test locally\n    auto_install_dependencies=True,       # Auto-install required packages\n    exit_on_fail=True                     # Exit on first failure\n)\n```\n\n#### Default Provider\n```python\nDefaultPythonProvider()  # Uses system Python interpreter\n```\n\n### Upload Targets\n\n#### PyPI Upload\n```python\nPypircUploadTarget(\n    pypirc_file_path=\"./.pypirc\",  # Path to PyPI configuration\n    verbose=True                    # Enable verbose output\n)\n```\n\n#### GitHub Upload\n```python\nGithubUploadTarget(\n    verbose=True  # Enable verbose output\n)\n```\n\n### Constraint Enforcers\n\n#### Version Enforcers\n```python\n# Check against local builds\nLocalVersionEnforcer()\n\n# Check against PyPI published versions\nPypiRemoteVersionEnforcer()\n```\n\n#### File Enforcers\n```python\n# Ensure README exists\nReadmeEnforcer(readme_file_path=\"./README.md\")\n\n# Ensure LICENSE exists\nLicenseEnforcer(license_file_path=\"./LICENSE\")\n\n# Validate PyPI configuration\nPypircEnforcer(pypirc_file_path=\"./.pypirc\")\n```\n\n## 🏗️ Project Structure\n\nQuickPub automatically generates the following files:\n\n```\nyour-project/\n├── pyproject.toml          # Package configuration\n├── setup.py               # Setuptools configuration\n├── MANIFEST.in            # Package manifest\n├── your-package/          # Source code directory\n│   └── __init__.py\n├── tests/                 # Test directory\n├── README.md              # Project documentation\n├── LICENSE                # License file\n└── .pypirc               # PyPI credentials (optional)\n```\n\n## 🔍 Advanced Features\n\n### Custom Quality Assurance\n\nYou can create custom QA runners by extending the `QualityAssuranceRunner` class:\n\n```python\nfrom quickpub.strategies import QualityAssuranceRunner\n\nclass CustomQARunner(QualityAssuranceRunner):\n    def _build_command(self, target: str, use_system_interpreter: bool = False) -\u003e str:\n        return f\"custom-tool {target}\"\n    \n    def _install_dependencies(self, base: LayeredCommand) -\u003e None:\n        with base:\n            base(\"pip install custom-tool\")\n    \n    def _calculate_score(self, ret: int, command_output: List[str], *, verbose: bool = False) -\u003e float:\n        # Custom score calculation logic\n        return 0.95\n```\n\n### Progress Tracking (Customizable Error Display)\n\n```python\nfrom tqdm import tqdm\nimport json\n\ndef main() -\u003e None:\n    publish(\n        # ... other parameters ...\n        log=lambda obj: tqdm.write(json.dumps(obj, default=str)),  # Custom error formatting\n        pbar=tqdm(desc=\"Local CI/CD Progress\", leave=False),       # Custom progress display\n    )\n```\n\n### Demo Mode (Local CI/CD Testing)\n\nTest your configuration without making changes:\n\n```python\npublish(\n    # ... other parameters ...\n    demo=True,  # Run all local CI/CD checks without building or uploading\n)\n```\n\n## 🐛 Troubleshooting\n\n### Common Issues\n\n1. **QA Failures**: Check your bound configurations and ensure your code meets the quality thresholds\n2. **Version Conflicts**: Use `PypiRemoteVersionEnforcer` to avoid version conflicts\n3. **Environment Issues**: Verify your Python environments are properly configured\n4. **Upload Failures**: Ensure your PyPI credentials are correctly configured in `.pypirc`\n\n### Debug Mode\n\nEnable verbose output for detailed logging:\n\n```python\npublish(\n    # ... other parameters ...\n    log=print,  # Print all log messages with custom formatting\n)\n```\n\n## 🚀 **Local CI/CD Benefits**\n\n### **Before QuickPub (Traditional Workflow)**\n1. Write code\n2. Push to repository\n3. Wait for cloud CI/CD to run\n4. Fix issues if build fails\n5. Repeat steps 2-4 until success\n\n### **With QuickPub (Local CI/CD)**\n1. Write code\n2. Run QuickPub locally (simulates entire CI/CD pipeline)\n3. Fix issues immediately with better error visibility\n4. Push to repository with confidence\n5. Cloud CI/CD passes on first try! ✅\n\n### **Key Advantages**\n- **Faster Development**: No waiting for cloud builds\n- **Better Error Visibility**: Customize how errors are displayed\n- **Cost Savings**: Reduce cloud CI/CD usage\n- **Higher Success Rate**: Catch issues before they reach production\n- **IDE Integration**: Run checks directly from your development environment\n\n## 🤝 Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.\n\n## 📄 License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## 🙏 Acknowledgments\n\n- Built with ❤️ for the Python community\n- Inspired by the need for streamlined package publishing workflows\n- Thanks to all contributors and users who have helped improve QuickPub\n\n---\n\n**QuickPub** - Your local CI/CD companion for Python package publishing! 🚀","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanielnachumdev%2Fquickpub","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdanielnachumdev%2Fquickpub","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanielnachumdev%2Fquickpub/lists"}