|
4 | 4 | import string
|
5 | 5 | from pathlib import Path
|
6 | 6 |
|
| 7 | +from tomlkit import dumps, parse |
| 8 | + |
7 | 9 | try:
|
8 | 10 | # Inspired by
|
9 | 11 | # https://github.com/django/django/blob/master/django/utils/crypto.py
|
@@ -502,8 +504,130 @@ def main():
|
502 | 504 | if "{{ cookiecutter.use_async }}".lower() == "n":
|
503 | 505 | remove_async_files()
|
504 | 506 |
|
| 507 | + manipulate_pyproject() |
| 508 | + |
505 | 509 | print(SUCCESS + "Project initialized, keep up the good work!" + TERMINATOR)
|
506 | 510 |
|
507 | 511 |
|
| 512 | +def manipulate_pyproject(): |
| 513 | + |
| 514 | + path = Path("pyproject.toml") |
| 515 | + project = parse(path.read_text()) |
| 516 | + |
| 517 | + if "{{cookiecutter.frontend_pipeline}}" != "Gulp": |
| 518 | + del project["tool"]["pytest"]["ini_options"]["norecursedirs"] |
| 519 | + |
| 520 | + if "{{cookiecutter.use_drf}}" == "y": |
| 521 | + project["tool"]["mypy"]["plugins"].append("mypy_drf_plugin.main") |
| 522 | + else: |
| 523 | + remove_dependency(project, "djangorestframework") |
| 524 | + remove_dependency(project, "django-cors-headers") |
| 525 | + remove_dependency(project, "drf-spectacular") |
| 526 | + |
| 527 | + if "{{cookiecutter.use_drf}}" == "n": |
| 528 | + remove_dev_dependency(project, "djangorestframework-stubs") |
| 529 | + |
| 530 | + if "{{cookiecutter.use_docker}}" == "y": |
| 531 | + replace_dependency(project, "psycopg", "psycopg[c]") |
| 532 | + else: |
| 533 | + replace_dependency(project, "psycopg", "psycopg[binary]") |
| 534 | + |
| 535 | + if "{{cookiecutter.use_async}}" == "n" and "{{cookiecutter.use_async}}" == "n": |
| 536 | + remove_dev_dependency(project, "watchfiles") |
| 537 | + |
| 538 | + if "{{cookiecutter.frontend_pipeline}}" != "Django Compressor": |
| 539 | + remove_dependency(project, "rcssmin") |
| 540 | + remove_dependency(project, "django-compressor") |
| 541 | + |
| 542 | + if "{{cookiecutter.frontend_pipeline}}" != "Webpack": |
| 543 | + remove_dependency(project, "django-webpack-loader") |
| 544 | + |
| 545 | + if "{{cookiecutter.use_whitenoise}}" != "y": |
| 546 | + remove_dependency(project, "whitenoise") |
| 547 | + |
| 548 | + if "{{cookiecutter.use_whitenoise}}" != "n": |
| 549 | + remove_dependency(project, "Collectfasta") |
| 550 | + |
| 551 | + if "{{cookiecutter.use_sentry}}" != "y": |
| 552 | + remove_dependency(project, "sentry-sdk") |
| 553 | + |
| 554 | + if "{{cookiecutter.use_docker}}" != "n" or "{{cookiecutter.windows}}" != "y": |
| 555 | + remove_dependency(project, "hiredis") |
| 556 | + |
| 557 | + if "{{cookiecutter.use_celery}}" != "y": |
| 558 | + remove_dev_dependency(project, "celery") |
| 559 | + remove_dev_dependency(project, "django-celery-beat") |
| 560 | + |
| 561 | + if "{{cookiecutter.use_docker}}" != "y": |
| 562 | + remove_dev_dependency(project, "flower") |
| 563 | + |
| 564 | + if "{{cookiecutter.use_async}}" != "y": |
| 565 | + remove_dependency(project, "uvicorn[standard]") |
| 566 | + remove_dependency(project, "uvicorn-worker") |
| 567 | + |
| 568 | + if "{{cookiecutter.cloud_provider}}": |
| 569 | + cloud_providers = { |
| 570 | + "AWS": "s3", |
| 571 | + "GCP": "google", |
| 572 | + "Azure": "azure", |
| 573 | + } |
| 574 | + |
| 575 | + p = cloud_providers["{{cookiecutter.cloud_provider}}"] |
| 576 | + |
| 577 | + if p: |
| 578 | + replace_dependency(project, "django-storages", f"django-storages[{p}]") |
| 579 | + else: |
| 580 | + remove_dependency(project, "django-storages") |
| 581 | + |
| 582 | + if "{{cookiecutter.mail_service}}": |
| 583 | + mail_service_providers = { |
| 584 | + "Mailgun": "mailgun", |
| 585 | + "Amazon SES": "amazon-ses", |
| 586 | + "Mailjet": "mailjet", |
| 587 | + "Mandrill": "mandrill", |
| 588 | + "Postmark": "postmark", |
| 589 | + "Sendgrid": "sendgrid", |
| 590 | + "Brevo": "brevo", |
| 591 | + "SparkPost": "sparkpost", |
| 592 | + "Other SMTP": "", |
| 593 | + } |
| 594 | + |
| 595 | + p = mail_service_providers["{{cookiecutter.mail_service}}"] |
| 596 | + if p: |
| 597 | + replace_dependency(project, "django-anymail", f"django-anymail[{p}]") |
| 598 | + else: |
| 599 | + remove_dependency(project, "django-anymail") |
| 600 | + |
| 601 | + path.write_text(dumps(project)) |
| 602 | + |
| 603 | + |
| 604 | +def replace_dependency(p, dep, target): |
| 605 | + x = [] |
| 606 | + for i, d in enumerate(p["project"]["dependencies"]): |
| 607 | + if d.startswith(dep): |
| 608 | + x.append(d.replace(dep, target)) |
| 609 | + else: |
| 610 | + x.append(d) |
| 611 | + |
| 612 | + p["project"]["dependencies"] = x |
| 613 | + |
| 614 | + |
| 615 | +def remove_dependency(p, dep): |
| 616 | + dependencies = [] |
| 617 | + for i, d in enumerate(p["project"]["dependencies"]): |
| 618 | + if not d.startswith(dep): |
| 619 | + dependencies.append(d) |
| 620 | + p["project"]["dependencies"] = dependencies |
| 621 | + |
| 622 | + |
| 623 | +def remove_dev_dependency(p, dep): |
| 624 | + dependencies = [] |
| 625 | + for i, d in enumerate(p["dependency-groups"]["dev"]): |
| 626 | + if not d.startswith(dep): |
| 627 | + dependencies.append(d) |
| 628 | + |
| 629 | + p["dependency-groups"]["dev"] = dependencies |
| 630 | + |
| 631 | + |
508 | 632 | if __name__ == "__main__":
|
509 | 633 | main()
|
0 commit comments