pyproject.toml 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. [build-system]
  2. requires = ["setuptools>=77.0", "wheel"]
  3. build-backend = "setuptools.build_meta"
  4. [project]
  5. name = "cloudbridge"
  6. description = "A simple layer of abstraction over multiple cloud providers."
  7. readme = "README.rst"
  8. license = "MIT"
  9. license-files = ["LICENSE"]
  10. requires-python = ">=3.13"
  11. authors = [
  12. { name = "Galaxy and GVL Projects", email = "help@genome.edu.au" },
  13. ]
  14. keywords = ["cloud", "aws", "azure", "gcp", "openstack", "iaas"]
  15. classifiers = [
  16. "Development Status :: 5 - Production/Stable",
  17. "Environment :: Console",
  18. "Intended Audience :: Developers",
  19. "Intended Audience :: System Administrators",
  20. "Operating System :: OS Independent",
  21. "Programming Language :: Python",
  22. "Programming Language :: Python :: 3",
  23. "Programming Language :: Python :: 3.13",
  24. "Programming Language :: Python :: Implementation :: CPython",
  25. "Topic :: Software Development :: Libraries :: Python Modules",
  26. ]
  27. dependencies = [
  28. "tenacity>=6.0",
  29. "pyeventsystem<2",
  30. ]
  31. dynamic = ["version"]
  32. [project.urls]
  33. Homepage = "http://cloudbridge.cloudve.org/"
  34. Source = "https://github.com/CloudVE/cloudbridge"
  35. Issues = "https://github.com/CloudVE/cloudbridge/issues"
  36. [project.optional-dependencies]
  37. aws = [
  38. "boto3>=1.9.86,<2.0.0",
  39. ]
  40. # Install azure>=3.0.0 package to find which of the azure libraries listed
  41. # below are compatible with each other. List individual libraries instead
  42. # of using the azure umbrella package to speed up installation.
  43. # Minimums match SDK generation tested against the model-class
  44. # serialization fixes in cloudbridge/providers/azure/. Older SDKs may
  45. # work but are not covered by integration tests.
  46. azure = [
  47. "azure-identity>=1.20.0,<2.0.0",
  48. "azure-common>=1.1.28,<2.0.0",
  49. "azure-core>=1.30.0,<2.0.0",
  50. "azure-mgmt-devtestlabs>=9.0.0,<10.0.0",
  51. "azure-mgmt-resource>=23.0.0,<26.0.0",
  52. "azure-mgmt-subscription>=3.0.0,<4.0.0",
  53. "azure-mgmt-compute>=34.0.0,<39.0.0",
  54. "azure-mgmt-dns>=9.0.0,<10.0.0",
  55. "azure-mgmt-network>=28.0.0,<31.0.0",
  56. "azure-mgmt-storage>=22.0.0,<25.0.0",
  57. "azure-storage-blob>=12.20.0,<13.0.0",
  58. "azure-data-tables>=12.4.0,<13.0.0",
  59. "paramiko<6.0.0",
  60. ]
  61. gcp = [
  62. "google-api-python-client>=2.0,<3.0.0",
  63. ]
  64. # Minimums match SDK generation tested against the OpenStack
  65. # provider fixes in cloudbridge/providers/openstack/. The previous
  66. # floors were circa-2018 and exposed Nova/Neutron APIs (e.g. the
  67. # add_floating_ip_to_server action) that are gone from any modern
  68. # OpenStack deployment.
  69. openstack = [
  70. "openstacksdk>=3.0.0,<5.0.0",
  71. "python-novaclient>=17.0.0,<20.0",
  72. "python-swiftclient>=4.0.0,<5.0",
  73. "python-neutronclient>=11.0.0,<13.0",
  74. "python-keystoneclient>=4.0.0,<7.0",
  75. ]
  76. full = [
  77. "cloudbridge[aws,azure,gcp,openstack]",
  78. ]
  79. # httpretty is required with/for moto 1.0.0 or AWS tests fail
  80. dev = [
  81. "cloudbridge[full]",
  82. "tox>=4.0.0",
  83. "pytest",
  84. "moto[ec2,s3]>=5.0.0",
  85. "packaging",
  86. "sphinx>=1.3.1",
  87. "pydevd",
  88. "flake8>=3.3.0",
  89. "flake8-import-order>=0.12",
  90. "mypy>=2.1,<3",
  91. ]
  92. [tool.setuptools.dynamic]
  93. version = { attr = "cloudbridge.__version__" }
  94. [tool.setuptools.packages.find]
  95. include = ["cloudbridge*"]
  96. exclude = ["tests*"]
  97. [tool.setuptools.package-data]
  98. # Ship the PEP 561 marker so downstream consumers pick up our type hints.
  99. cloudbridge = ["py.typed"]
  100. [tool.coverage.run]
  101. branch = true
  102. source = ["cloudbridge"]
  103. omit = [
  104. "cloudbridge/interfaces/*",
  105. "cloudbridge/__init__.py",
  106. ]
  107. parallel = true
  108. [tool.mypy]
  109. # CloudBridge is typed gradually. The public API (the interface layer and the
  110. # factory) is held to a strict baseline so downstream users get a fully-typed
  111. # API; the base implementations and providers (which wrap untyped cloud SDKs)
  112. # are temporarily exempted below and ratcheted to strict module-by-module.
  113. python_version = "3.13"
  114. files = ["cloudbridge"]
  115. ignore_missing_imports = true # untyped cloud SDKs (boto3, azure-*, ...) -> Any
  116. namespace_packages = true
  117. warn_unused_configs = true
  118. # Full strict baseline (applies to every module NOT exempted below), with two
  119. # documented exceptions that don't fit this codebase:
  120. strict = true
  121. # interfaces/__init__.py re-exports the public names without an __all__; keep
  122. # implicit re-export so `from cloudbridge.interfaces import CloudProvider`
  123. # keeps working for factory.py and downstream consumers.
  124. implicit_reexport = true
  125. # Cross-class property setters (@LabeledCloudResource.label.setter) are untyped;
  126. # don't fail the build on them.
  127. disallow_untyped_decorators = false
  128. # Providers (all typed) wrap untyped cloud SDKs, so they get a pragmatic tier:
  129. # complete annotations are required (disallow_untyped_defs etc. from the strict
  130. # baseline), but warn_return_any and disallow_untyped_calls are off -- every
  131. # getter reads an attribute off an Any-typed SDK object, and forcing those
  132. # through cast()/ignore adds noise without value.
  133. [[tool.mypy.overrides]]
  134. module = ["cloudbridge.providers.*"]
  135. warn_return_any = false
  136. disallow_untyped_calls = false
  137. # base/ is held to the FULL strict bar (it orchestrates through the typed
  138. # interface layer and never touches the cloud SDKs directly), so it falls under
  139. # the global strict baseline with no override.