azure-functions 1.25.0b3.dev1__tar.gz → 1.25.0b3.dev3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. {azure_functions-1.25.0b3.dev1/azure_functions.egg-info → azure_functions-1.25.0b3.dev3}/PKG-INFO +1 -1
  2. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/__init__.py +1 -1
  3. azure_functions-1.25.0b3.dev3/azure/functions/decorators/durable_functions.py +45 -0
  4. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/decorators/function_app.py +4 -3
  5. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/durable_functions.py +23 -17
  6. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3/azure_functions.egg-info}/PKG-INFO +1 -1
  7. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/test_durable_functions.py +38 -38
  8. azure_functions-1.25.0b3.dev1/azure/functions/decorators/durable_functions.py +0 -59
  9. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/LICENSE +0 -0
  10. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/MANIFEST.in +0 -0
  11. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/README.md +0 -0
  12. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/__init__.py +0 -0
  13. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/_abc.py +0 -0
  14. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/_cosmosdb.py +0 -0
  15. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/_durable_functions.py +0 -0
  16. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/_eventgrid.py +0 -0
  17. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/_eventhub.py +0 -0
  18. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/_http.py +0 -0
  19. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/_http_asgi.py +0 -0
  20. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/_http_wsgi.py +0 -0
  21. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/_jsonutils.py +0 -0
  22. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/_kafka.py +0 -0
  23. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/_mysql.py +0 -0
  24. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/_queue.py +0 -0
  25. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/_servicebus.py +0 -0
  26. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/_sql.py +0 -0
  27. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/_thirdparty/__init__.py +0 -0
  28. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/_thirdparty/typing_inspect.py +0 -0
  29. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/_utils.py +0 -0
  30. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/blob.py +0 -0
  31. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/cosmosdb.py +0 -0
  32. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/decorators/__init__.py +0 -0
  33. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/decorators/blob.py +0 -0
  34. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/decorators/constants.py +0 -0
  35. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/decorators/core.py +0 -0
  36. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/decorators/cosmosdb.py +0 -0
  37. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/decorators/dapr.py +0 -0
  38. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/decorators/eventgrid.py +0 -0
  39. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/decorators/eventhub.py +0 -0
  40. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/decorators/function_name.py +0 -0
  41. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/decorators/generic.py +0 -0
  42. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/decorators/http.py +0 -0
  43. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/decorators/kafka.py +0 -0
  44. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/decorators/mcp.py +0 -0
  45. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/decorators/mysql.py +0 -0
  46. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/decorators/openai.py +0 -0
  47. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/decorators/queue.py +0 -0
  48. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/decorators/retry_policy.py +0 -0
  49. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/decorators/servicebus.py +0 -0
  50. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/decorators/sql.py +0 -0
  51. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/decorators/table.py +0 -0
  52. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/decorators/timer.py +0 -0
  53. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/decorators/utils.py +0 -0
  54. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/decorators/warmup.py +0 -0
  55. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/eventgrid.py +0 -0
  56. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/eventhub.py +0 -0
  57. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/extension/__init__.py +0 -0
  58. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/extension/app_extension_base.py +0 -0
  59. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/extension/app_extension_hooks.py +0 -0
  60. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/extension/extension_hook_meta.py +0 -0
  61. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/extension/extension_meta.py +0 -0
  62. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/extension/extension_scope.py +0 -0
  63. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/extension/func_extension_base.py +0 -0
  64. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/extension/func_extension_hooks.py +0 -0
  65. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/extension/function_extension_exception.py +0 -0
  66. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/http.py +0 -0
  67. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/kafka.py +0 -0
  68. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/mcp.py +0 -0
  69. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/meta.py +0 -0
  70. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/mysql.py +0 -0
  71. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/py.typed +0 -0
  72. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/queue.py +0 -0
  73. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/servicebus.py +0 -0
  74. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/sql.py +0 -0
  75. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/timer.py +0 -0
  76. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure/functions/warmup.py +0 -0
  77. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure_functions.egg-info/SOURCES.txt +0 -0
  78. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure_functions.egg-info/dependency_links.txt +0 -0
  79. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure_functions.egg-info/requires.txt +0 -0
  80. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/azure_functions.egg-info/top_level.txt +0 -0
  81. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/pyproject.toml +0 -0
  82. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/setup.cfg +0 -0
  83. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/__init__.py +0 -0
  84. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/decorators/test_blob.py +0 -0
  85. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/decorators/test_core.py +0 -0
  86. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/decorators/test_cosmosdb.py +0 -0
  87. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/decorators/test_dapr.py +0 -0
  88. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/decorators/test_decorators.py +0 -0
  89. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/decorators/test_eventgrid.py +0 -0
  90. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/decorators/test_eventhub.py +0 -0
  91. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/decorators/test_function_app.py +0 -0
  92. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/decorators/test_function_name.py +0 -0
  93. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/decorators/test_generic.py +0 -0
  94. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/decorators/test_http.py +0 -0
  95. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/decorators/test_kafka.py +0 -0
  96. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/decorators/test_mcp.py +0 -0
  97. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/decorators/test_mysql.py +0 -0
  98. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/decorators/test_openai.py +0 -0
  99. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/decorators/test_queue.py +0 -0
  100. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/decorators/test_retry_policy.py +0 -0
  101. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/decorators/test_servicebus.py +0 -0
  102. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/decorators/test_sql.py +0 -0
  103. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/decorators/test_table.py +0 -0
  104. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/decorators/test_timer.py +0 -0
  105. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/decorators/test_utils.py +0 -0
  106. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/decorators/test_warmup.py +0 -0
  107. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/test_blob.py +0 -0
  108. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/test_code_quality.py +0 -0
  109. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/test_cosmosdb.py +0 -0
  110. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/test_eventgrid.py +0 -0
  111. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/test_eventhub.py +0 -0
  112. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/test_extension.py +0 -0
  113. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/test_http.py +0 -0
  114. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/test_http_asgi.py +0 -0
  115. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/test_http_wsgi.py +0 -0
  116. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/test_kafka.py +0 -0
  117. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/test_mcp.py +0 -0
  118. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/test_meta.py +0 -0
  119. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/test_mysql.py +0 -0
  120. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/test_queue.py +0 -0
  121. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/test_servicebus.py +0 -0
  122. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/test_sql.py +0 -0
  123. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/test_timer.py +0 -0
  124. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/test_warmup.py +0 -0
  125. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/utils/__init__.py +0 -0
  126. {azure_functions-1.25.0b3.dev1 → azure_functions-1.25.0b3.dev3}/tests/utils/testutils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: azure-functions
3
- Version: 1.25.0b3.dev1
3
+ Version: 1.25.0b3.dev3
4
4
  Summary: Python library for Azure Functions.
5
5
  Author-email: "Azure Functions team at Microsoft Corp." <azurefunctions@microsoft.com>
6
6
  License: MIT License
@@ -110,4 +110,4 @@ __all__ = (
110
110
  'McpPropertyType'
111
111
  )
112
112
 
113
- __version__ = '1.25.0b3dev1'
113
+ __version__ = '1.25.0b3.dev3'
@@ -0,0 +1,45 @@
1
+ # Copyright (c) Microsoft Corporation. All rights reserved.
2
+ # Licensed under the MIT License.
3
+ import logging
4
+
5
+ _logger = logging.getLogger('azure.functions.DurableFunctions')
6
+
7
+ df = None
8
+
9
+
10
+ def get_durable_package():
11
+ """Determines which Durable SDK is being used.
12
+
13
+ If the `azure-functions-durable` package is installed, we
14
+ log a warning that this legacy package
15
+ is deprecated.
16
+
17
+ If both the legacy and current packages are installed,
18
+ we log a warning and prefer the current package.
19
+
20
+ If neither package is installed, we return None.
21
+ """
22
+ _logger.info("Attempting to import Durable Functions package.")
23
+ global df
24
+ if df:
25
+ _logger.info("Durable Functions package already loaded. DF: %s", df)
26
+ return df
27
+
28
+ # Check for azure-functions-durable package
29
+ try:
30
+ import azure.durable_functions as durable_functions # noqa
31
+ _logger.info("`azure.durable_functions` package found.")
32
+ except ImportError:
33
+ _logger.info("`azure.durable_functions` package not found.")
34
+ return None
35
+
36
+ # Check version of azure-functions-durable package
37
+ try:
38
+ if hasattr(durable_functions, 'version') and durable_functions.version.startswith("2."):
39
+ _logger.info("Using `azure.durable_functions` v2.x package.")
40
+ except Exception:
41
+ _logger.info("Using `azure.durable_functions` v1.x package.")
42
+
43
+ df = durable_functions
44
+
45
+ return df
@@ -58,7 +58,8 @@ from .._http_wsgi import WsgiMiddleware, Context
58
58
  from azure.functions.decorators.mysql import MySqlInput, MySqlOutput, \
59
59
  MySqlTrigger
60
60
 
61
- _logger = logging.getLogger('azure.functions.AsgiMiddleware')
61
+ _logger = logging.getLogger('azure.functions.DurableFunctions')
62
+
62
63
 
63
64
  class Function(object):
64
65
  """
@@ -357,8 +358,8 @@ class DecoratorApi(ABC):
357
358
  else:
358
359
  error_message = \
359
360
  "Attempted to use a Durable Functions decorator, " \
360
- "but the `durabletask-azurefunctions` SDK package could not be " \
361
- "found. Please install `durabletask-azurefunctions` to use " \
361
+ "but the `azure-functions-durable` SDK package could not be " \
362
+ "found. Please install `azure-functions-durable` to use " \
362
363
  "Durable Functions."
363
364
  raise Exception(error_message)
364
365
 
@@ -9,14 +9,15 @@ from azure.functions.decorators.durable_functions import get_durable_package
9
9
  from . import meta
10
10
 
11
11
  import logging
12
- _logger = logging.getLogger('azure.functions.AsgiMiddleware')
12
+ _logger = logging.getLogger('azure.functions.DurableFunctions')
13
+
13
14
 
14
15
  # ---------------- Legacy Durable Functions Converters ---------------- #
15
16
  # Legacy Durable Function Orchestration Trigger
16
17
  class LegacyOrchestrationTriggerConverter(meta.InConverter,
17
- meta.OutConverter,
18
- binding=None,
19
- trigger=True):
18
+ meta.OutConverter,
19
+ binding=None,
20
+ trigger=True):
20
21
  @classmethod
21
22
  def check_input_type_annotation(cls, pytype):
22
23
  return issubclass(pytype, _durable_functions.OrchestrationContext)
@@ -45,9 +46,9 @@ class LegacyOrchestrationTriggerConverter(meta.InConverter,
45
46
 
46
47
  # Legacy Durable Function Entity Trigger
47
48
  class LegacyEnitityTriggerConverter(meta.InConverter,
48
- meta.OutConverter,
49
- binding=None,
50
- trigger=True):
49
+ meta.OutConverter,
50
+ binding=None,
51
+ trigger=True):
51
52
  @classmethod
52
53
  def check_input_type_annotation(cls, pytype):
53
54
  return issubclass(pytype, _durable_functions.EntityContext)
@@ -76,9 +77,9 @@ class LegacyEnitityTriggerConverter(meta.InConverter,
76
77
 
77
78
  # Legacy Durable Function Activity Trigger
78
79
  class LegacyActivityTriggerConverter(meta.InConverter,
79
- meta.OutConverter,
80
- binding=None,
81
- trigger=True):
80
+ meta.OutConverter,
81
+ binding=None,
82
+ trigger=True):
82
83
  @classmethod
83
84
  def check_input_type_annotation(cls, pytype):
84
85
  # Activity Trigger's arguments should accept any types
@@ -133,8 +134,8 @@ class LegacyActivityTriggerConverter(meta.InConverter,
133
134
 
134
135
  # Legacy Durable Functions Durable Client Bindings
135
136
  class LegacyDurableClientConverter(meta.InConverter,
136
- meta.OutConverter,
137
- binding=None):
137
+ meta.OutConverter,
138
+ binding=None):
138
139
  @classmethod
139
140
  def has_implicit_output(cls) -> bool:
140
141
  return False
@@ -331,7 +332,7 @@ class DurableClientConverter(meta.InConverter,
331
332
 
332
333
  @classmethod
333
334
  def check_input_type_annotation(cls, pytype: type) -> bool:
334
- import durabletask.azurefunctions as adf
335
+ import azure.durable_functions as adf
335
336
  return issubclass(pytype, (str, bytes, adf.DurableFunctionsClient))
336
337
 
337
338
  @classmethod
@@ -363,11 +364,15 @@ class DurableClientConverter(meta.InConverter,
363
364
 
364
365
  @classmethod
365
366
  def decode(cls, data: meta.Datum, *, trigger_metadata) -> typing.Any:
366
- from durabletask.azurefunctions.client import DurableFunctionsClient
367
- return DurableFunctionsClient(data.value)
367
+ import azure.durable_functions as adf
368
+ return adf.DurableFunctionsClient(data.value)
368
369
 
369
370
 
370
371
  def register_durable_converters():
372
+ """
373
+ Registers the appropriate Durable Functions converters based on the
374
+ installed Durable Functions package.
375
+ """
371
376
  _logger.info("Registering Durable Functions converters based on ")
372
377
  pkg = get_durable_package()
373
378
  if pkg is None:
@@ -382,17 +387,18 @@ def register_durable_converters():
382
387
  meta._ConverterMeta._bindings.pop("activityTrigger", None)
383
388
  meta._ConverterMeta._bindings.pop("durableClient", None)
384
389
 
385
- if pkg.__name__ == "azure.durable_functions":
390
+ if not hasattr(pkg, 'version'):
386
391
  _logger.info("Registering Legacy Durable Functions converters.")
387
392
  meta._ConverterMeta._bindings["orchestrationTrigger"] = LegacyOrchestrationTriggerConverter
388
393
  meta._ConverterMeta._bindings["entityTrigger"] = LegacyEnitityTriggerConverter
389
394
  meta._ConverterMeta._bindings["activityTrigger"] = LegacyActivityTriggerConverter
390
395
  meta._ConverterMeta._bindings["durableClient"] = LegacyDurableClientConverter
391
- else:
396
+ elif hasattr(pkg, 'version') and pkg.version.startswith("2."):
392
397
  _logger.info("Registering Durable Task Durable Functions converters.")
393
398
  meta._ConverterMeta._bindings["orchestrationTrigger"] = OrchestrationTriggerConverter
394
399
  meta._ConverterMeta._bindings["entityTrigger"] = EnitityTriggerConverter
395
400
  meta._ConverterMeta._bindings["activityTrigger"] = ActivityTriggerConverter
396
401
  meta._ConverterMeta._bindings["durableClient"] = DurableClientConverter
402
+
397
403
  _logger.info("Durable Functions converters registered.")
398
404
  _logger.info("Current bindings after registration: %s", meta._ConverterMeta._bindings)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: azure-functions
3
- Version: 1.25.0b3.dev1
3
+ Version: 1.25.0b3.dev3
4
4
  Summary: Python library for Azure Functions.
5
5
  Author-email: "Azure Functions team at Microsoft Corp." <azurefunctions@microsoft.com>
6
6
  License: MIT License
@@ -5,10 +5,10 @@ import unittest
5
5
  import json
6
6
 
7
7
  from azure.functions.durable_functions import (
8
- OrchestrationTriggerConverter,
9
- EnitityTriggerConverter,
10
- ActivityTriggerConverter,
11
- DurableClientConverter
8
+ LegacyOrchestrationTriggerConverter,
9
+ LegacyEnitityTriggerConverter,
10
+ LegacyActivityTriggerConverter,
11
+ LegacyDurableClientConverter
12
12
  )
13
13
  from azure.functions._durable_functions import (
14
14
  OrchestrationContext,
@@ -17,7 +17,7 @@ from azure.functions._durable_functions import (
17
17
  from azure.functions.meta import Datum
18
18
 
19
19
  CONTEXT_CLASSES = [OrchestrationContext, EntityContext]
20
- CONVERTERS = [OrchestrationTriggerConverter, EnitityTriggerConverter]
20
+ CONVERTERS = [LegacyOrchestrationTriggerConverter, LegacyEnitityTriggerConverter]
21
21
 
22
22
 
23
23
  class TestDurableFunctions(unittest.TestCase):
@@ -127,7 +127,7 @@ class TestDurableFunctions(unittest.TestCase):
127
127
  ]
128
128
 
129
129
  for datum in data:
130
- decoded = ActivityTriggerConverter.decode(
130
+ decoded = LegacyActivityTriggerConverter.decode(
131
131
  data=datum['input'],
132
132
  trigger_metadata=None)
133
133
  self.assertEqual(decoded, datum['expected_value'])
@@ -160,7 +160,7 @@ class TestDurableFunctions(unittest.TestCase):
160
160
  ]
161
161
 
162
162
  for datum in data:
163
- encoded = ActivityTriggerConverter.encode(
163
+ encoded = LegacyActivityTriggerConverter.encode(
164
164
  obj=datum['output'],
165
165
  expected_type=type(datum['output']))
166
166
  self.assertEqual(encoded, datum['expected_value'])
@@ -173,7 +173,7 @@ class TestDurableFunctions(unittest.TestCase):
173
173
  data = NonEncodable()
174
174
 
175
175
  try:
176
- ActivityTriggerConverter.encode(data, expected_type=None)
176
+ LegacyActivityTriggerConverter.encode(data, expected_type=None)
177
177
  except ValueError as e:
178
178
  self.assertIsNotNone(e.__cause__)
179
179
  self.assertIsInstance(e.__cause__, TypeError)
@@ -217,7 +217,7 @@ class TestDurableFunctions(unittest.TestCase):
217
217
  ]
218
218
 
219
219
  for datum in data:
220
- decoded = ActivityTriggerConverter.decode(
220
+ decoded = LegacyActivityTriggerConverter.decode(
221
221
  data=datum['input'],
222
222
  trigger_metadata=None)
223
223
  self.assertEqual(decoded, datum['expected_value'])
@@ -226,7 +226,7 @@ class TestDurableFunctions(unittest.TestCase):
226
226
  data = Datum('{"value": "bar"}', 'json')
227
227
 
228
228
  try:
229
- ActivityTriggerConverter.decode(
229
+ LegacyActivityTriggerConverter.decode(
230
230
  data=data,
231
231
  trigger_metadata=None)
232
232
  except ValueError as e:
@@ -235,17 +235,17 @@ class TestDurableFunctions(unittest.TestCase):
235
235
 
236
236
  def test_activity_trigger_has_implicit_return(self):
237
237
  self.assertTrue(
238
- ActivityTriggerConverter.has_implicit_output()
238
+ LegacyActivityTriggerConverter.has_implicit_output()
239
239
  )
240
240
 
241
241
  def test_durable_client_no_implicit_return(self):
242
242
  self.assertFalse(
243
- DurableClientConverter.has_implicit_output()
243
+ LegacyDurableClientConverter.has_implicit_output()
244
244
  )
245
245
 
246
246
  def test_enitity_trigger_check_output_type_annotation(self):
247
247
  self.assertTrue(
248
- EnitityTriggerConverter.check_output_type_annotation(pytype=None)
248
+ LegacyEnitityTriggerConverter.check_output_type_annotation(pytype=None)
249
249
  )
250
250
 
251
251
  def test_activity_trigger_converter_decode_no_implementation_exception(
@@ -254,7 +254,7 @@ class TestDurableFunctions(unittest.TestCase):
254
254
  datum = Datum(value=b"dummy", type="bytes")
255
255
  # when
256
256
  try:
257
- ActivityTriggerConverter.decode(data=datum, trigger_metadata=None)
257
+ LegacyActivityTriggerConverter.decode(data=datum, trigger_metadata=None)
258
258
  except NotImplementedError:
259
259
  is_exception_raised = True
260
260
 
@@ -265,82 +265,82 @@ class TestDurableFunctions(unittest.TestCase):
265
265
 
266
266
  data = '{"dummy_key": "dummy_value"}'
267
267
 
268
- result = EnitityTriggerConverter.encode(
268
+ result = LegacyEnitityTriggerConverter.encode(
269
269
  obj=data, expected_type=None)
270
270
 
271
271
  self.assertEqual(result.type, "json")
272
272
  self.assertEqual(result.python_value, {'dummy_key': 'dummy_value'})
273
273
 
274
274
  def test_durable_client_converter_has_trigger_support(self):
275
- self.assertFalse(DurableClientConverter.has_trigger_support())
275
+ self.assertFalse(LegacyDurableClientConverter.has_trigger_support())
276
276
 
277
277
  def test_durable_client_converter_check_input_type_annotation(self):
278
- self.assertTrue(DurableClientConverter.check_input_type_annotation(str))
279
- self.assertTrue(DurableClientConverter.check_input_type_annotation(bytes))
280
- self.assertFalse(DurableClientConverter.check_input_type_annotation(int))
278
+ self.assertTrue(LegacyDurableClientConverter.check_input_type_annotation(str))
279
+ self.assertTrue(LegacyDurableClientConverter.check_input_type_annotation(bytes))
280
+ self.assertFalse(LegacyDurableClientConverter.check_input_type_annotation(int))
281
281
 
282
282
  def test_durable_client_converter_check_output_type_annotation(self):
283
- self.assertTrue(DurableClientConverter.check_output_type_annotation(str))
284
- self.assertTrue(DurableClientConverter.check_output_type_annotation(bytes))
285
- self.assertTrue(DurableClientConverter.check_output_type_annotation(bytearray))
286
- self.assertFalse(DurableClientConverter.check_output_type_annotation(int))
283
+ self.assertTrue(LegacyDurableClientConverter.check_output_type_annotation(str))
284
+ self.assertTrue(LegacyDurableClientConverter.check_output_type_annotation(bytes))
285
+ self.assertTrue(LegacyDurableClientConverter.check_output_type_annotation(bytearray))
286
+ self.assertFalse(LegacyDurableClientConverter.check_output_type_annotation(int))
287
287
 
288
288
  def test_durable_client_converter_encode(self):
289
- datum = DurableClientConverter.encode(obj="hello", expected_type=str)
289
+ datum = LegacyDurableClientConverter.encode(obj="hello", expected_type=str)
290
290
  self.assertEqual(datum.type, "string")
291
291
  self.assertEqual(datum.value, "hello")
292
292
 
293
- datum = DurableClientConverter.encode(obj=b"data", expected_type=bytes)
293
+ datum = LegacyDurableClientConverter.encode(obj=b"data", expected_type=bytes)
294
294
  self.assertEqual(datum.type, "bytes")
295
295
  self.assertEqual(datum.value, b"data")
296
296
 
297
- datum = DurableClientConverter.encode(obj=None, expected_type=None)
297
+ datum = LegacyDurableClientConverter.encode(obj=None, expected_type=None)
298
298
  self.assertIsNone(datum.type)
299
299
  self.assertIsNone(datum.value)
300
300
 
301
- datum = DurableClientConverter.encode(obj={"a": 1}, expected_type=dict)
301
+ datum = LegacyDurableClientConverter.encode(obj={"a": 1}, expected_type=dict)
302
302
  self.assertEqual(datum.type, "dict")
303
303
  self.assertEqual(datum.value, {"a": 1})
304
304
 
305
- datum = DurableClientConverter.encode(obj=[1, 2], expected_type=list)
305
+ datum = LegacyDurableClientConverter.encode(obj=[1, 2], expected_type=list)
306
306
  self.assertEqual(datum.type, "list")
307
307
  self.assertEqual(datum.value, [1, 2])
308
308
 
309
- datum = DurableClientConverter.encode(obj=42, expected_type=int)
309
+ datum = LegacyDurableClientConverter.encode(obj=42, expected_type=int)
310
310
  self.assertEqual(datum.type, "int")
311
311
  self.assertEqual(datum.value, 42)
312
312
 
313
- datum = DurableClientConverter.encode(obj=3.14, expected_type=float)
313
+ datum = LegacyDurableClientConverter.encode(obj=3.14, expected_type=float)
314
314
  self.assertEqual(datum.type, "double")
315
315
  self.assertEqual(datum.value, 3.14)
316
316
 
317
- datum = DurableClientConverter.encode(obj=True, expected_type=bool)
317
+ datum = LegacyDurableClientConverter.encode(obj=True, expected_type=bool)
318
318
  self.assertEqual(datum.type, "bool")
319
319
  self.assertTrue(datum.value)
320
320
 
321
321
  with self.assertRaises(NotImplementedError):
322
- DurableClientConverter.encode(obj=set([1, 2]), expected_type=set)
322
+ LegacyDurableClientConverter.encode(obj=set([1, 2]), expected_type=set)
323
323
 
324
324
  def test_durable_client_converter_decode(self):
325
325
  data = Datum(type="string", value="abc")
326
- result = DurableClientConverter.decode(data=data, trigger_metadata=None)
326
+ result = LegacyDurableClientConverter.decode(data=data, trigger_metadata=None)
327
327
  self.assertEqual(result, "abc")
328
328
 
329
329
  data = Datum(type="bytes", value=b"123")
330
- result = DurableClientConverter.decode(data=data, trigger_metadata=None)
330
+ result = LegacyDurableClientConverter.decode(data=data, trigger_metadata=None)
331
331
  self.assertEqual(result, b"123")
332
332
 
333
333
  data = Datum(type="json", value={"key": "val"})
334
- result = DurableClientConverter.decode(data=data, trigger_metadata=None)
334
+ result = LegacyDurableClientConverter.decode(data=data, trigger_metadata=None)
335
335
  self.assertEqual(result, {"key": "val"})
336
336
 
337
337
  data = Datum(type=None, value=None)
338
- result = DurableClientConverter.decode(data=data, trigger_metadata=None)
338
+ result = LegacyDurableClientConverter.decode(data=data, trigger_metadata=None)
339
339
  self.assertIsNone(result)
340
340
 
341
- result = DurableClientConverter.decode(data=None, trigger_metadata=None)
341
+ result = LegacyDurableClientConverter.decode(data=None, trigger_metadata=None)
342
342
  self.assertIsNone(result)
343
343
 
344
344
  data = Datum(type="weird", value="???")
345
345
  with self.assertRaises(ValueError):
346
- DurableClientConverter.decode(data=data, trigger_metadata=None)
346
+ LegacyDurableClientConverter.decode(data=data, trigger_metadata=None)
@@ -1,59 +0,0 @@
1
- # Copyright (c) Microsoft Corporation. All rights reserved.
2
- # Licensed under the MIT License.
3
- import logging
4
-
5
- _logger = logging.getLogger('azure.functions.AsgiMiddleware')
6
-
7
- df = None
8
-
9
-
10
- def get_durable_package():
11
- """Determines which Durable SDK is being used.
12
-
13
- If the `azure-functions-durable` package is installed, we
14
- log a warning that this legacy package
15
- is deprecated.
16
-
17
- If both the legacy and current packages are installed,
18
- we log a warning and prefer the current package.
19
-
20
- If neither package is installed, we return None.
21
- """
22
- _logger.info("Attempting to import Durable Functions package.")
23
- using_legacy = False
24
- using_durable_task = False
25
- global df
26
- if df:
27
- _logger.info("Durable Functions package already loaded. DF: %s", df)
28
- return df
29
-
30
- try:
31
- import azure.durable_functions as durable_functions
32
- using_legacy = True
33
- _logger.warning("`durabletask-azurefunctions` is available now! " \
34
- "See <AKA.MS LINK HERE> for more details.")
35
- except ImportError:
36
- _logger.info("`azure-functions-durable` package not found.")
37
- pass
38
- try:
39
- import durabletask.azurefunctions as durable_functions
40
- using_durable_task = True
41
- except ImportError:
42
- _logger.info("`durabletask-azurefunctions` package not found.")
43
- pass
44
-
45
- if using_durable_task and using_legacy:
46
- # Both packages are installed; prefer `durabletask-azurefunctions`.
47
- _logger.warning("Both `azure-functions-durable` and " \
48
- "`durabletask-azurefunctions` packages are installed. " \
49
- "This may lead to unexpected behavior. Please resolve this " \
50
- "conflict by removing one of these packages from the Python " \
51
- "environment. Decorators from `durabletask-azurefunctions` will " \
52
- "be used.")
53
-
54
- if not using_durable_task and not using_legacy:
55
- return None
56
-
57
- df = durable_functions
58
-
59
- return durable_functions