pyproject.toml 5.3 KB

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