Skip to content

Commit db4ca2e

Browse files
Rakshith Bhyravabhotlaswathipil
andauthored
Send method changes (Azure#16318)
* commit -1 * async * lint * Update sdk/eventgrid/azure-eventgrid/azure/eventgrid/_helpers.py * Update sdk/eventgrid/azure-eventgrid/azure/eventgrid/_helpers.py * fix test * Update sdk/eventgrid/azure-eventgrid/tests/test_eg_publisher_client_async.py Co-authored-by: swathipil <76007337+swathipil@users.noreply.github.com> Co-authored-by: swathipil <76007337+swathipil@users.noreply.github.com>
1 parent 1b10b4e commit db4ca2e

17 files changed

+85
-83
lines changed

sdk/eventgrid/azure-eventgrid/CHANGELOG.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
- `decode_cloud_event` is renamed to `deserialize_cloud_events`.
99
- `decode_eventgrid_event` is renamed to `deserialize_eventgrid_events`.
1010
- The system events now exist in the `azure.eventgrid.systemevents` namespace instead of `azure.eventgrid.models` namespace.
11-
- The `send` method in the `EventGridPubliserClient` is now replaced by the `send_events`.
1211
- `topic_hostname` is renamed to `endpoint` in the `EventGridPublisherClient`.
1312
- `data` is now a required param for `CloudEvent`.
1413
- `azure.eventgrid.generate_shared_access_signature` method is now renamed to `generate_sas`.

sdk/eventgrid/azure-eventgrid/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ event = EventGridEvent(
9696
credential = AzureKeyCredential(key)
9797
client = EventGridPublisherClient(endpoint, credential)
9898

99-
client.send_events(event)
99+
client.send(event)
100100
```
101101

102102
### Send a Cloud Event
@@ -120,7 +120,7 @@ event = CloudEvent(
120120
credential = AzureKeyCredential(key)
121121
client = EventGridPublisherClient(endpoint, credential)
122122

123-
client.send_events(event)
123+
client.send(event)
124124
```
125125

126126
### Consume an Event Grid Event

sdk/eventgrid/azure-eventgrid/azure/eventgrid/_helpers.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,14 @@ def _is_cloud_event(event):
9393
except TypeError:
9494
return False
9595

96+
def _is_eventgrid_event(event):
97+
# type: (Any) -> bool
98+
required = ('subject', 'event_type', 'data', 'data_version', 'id', 'event_time')
99+
try:
100+
return all([prop in event for prop in required])
101+
except TypeError:
102+
return False
103+
96104
def _eventgrid_data_typecheck(event):
97105
try:
98106
data = event.get('data')

sdk/eventgrid/azure-eventgrid/azure/eventgrid/_publisher_client.py

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,13 @@
2727
_get_endpoint_only_fqdn,
2828
_get_authentication_policy,
2929
_is_cloud_event,
30+
_is_eventgrid_event,
3031
_eventgrid_data_typecheck
3132
)
3233
from ._generated._event_grid_publisher_client import EventGridPublisherClient as EventGridPublisherClientImpl
3334
from ._policies import CloudEventDistributedTracingPolicy
3435
from ._version import VERSION
35-
from ._generated.models import CloudEvent as InternalCloudEvent, EventGridEvent as InternalEventGridEvent
36+
from ._generated.models import CloudEvent as InternalCloudEvent
3637

3738
if TYPE_CHECKING:
3839
# pylint: disable=unused-import,ungrouped-imports
@@ -98,11 +99,14 @@ def _policies(credential, **kwargs):
9899
return policies
99100

100101
@distributed_trace
101-
def send_events(self, events, **kwargs):
102+
def send(self, events, **kwargs):
102103
# type: (SendType, Any) -> None
103104
"""Sends event data to topic hostname specified during client initialization.
105+
Multiple events can be published at once by seding a list of events. It is very
106+
inefficient to loop the send method for each event instead of just using a list
107+
and we highly recommend against it.
104108
105-
:param events: A list or an instance of CloudEvent/EventGridEvent/CustomEvent to be sent.
109+
:param events: A list of CloudEvent/EventGridEvent/CustomEvent to be sent.
106110
:type events: SendType
107111
:keyword str content_type: The type of content to be used to send the events.
108112
Has default value "application/json; charset=utf-8" for EventGridEvents,
@@ -113,27 +117,24 @@ def send_events(self, events, **kwargs):
113117
if not isinstance(events, list):
114118
events = cast(ListEventType, [events])
115119

116-
if all(isinstance(e, CloudEvent) for e in events) or all(_is_cloud_event(e) for e in events):
120+
if isinstance(events[0], CloudEvent) or _is_cloud_event(events[0]):
117121
try:
118122
events = [cast(CloudEvent, e)._to_generated(**kwargs) for e in events] # pylint: disable=protected-access
119123
except AttributeError:
120124
pass # means it's a dictionary
121125
kwargs.setdefault("content_type", "application/cloudevents-batch+json; charset=utf-8")
122-
self._client.publish_cloud_event_events(
126+
return self._client.publish_cloud_event_events(
123127
self._endpoint,
124128
cast(List[InternalCloudEvent], events),
125129
**kwargs
126130
)
127-
elif all(isinstance(e, EventGridEvent) for e in events) or all(isinstance(e, dict) for e in events):
128-
kwargs.setdefault("content_type", "application/json; charset=utf-8")
131+
kwargs.setdefault("content_type", "application/json; charset=utf-8")
132+
if isinstance(events[0], EventGridEvent) or _is_eventgrid_event(events[0]):
129133
for event in events:
130134
_eventgrid_data_typecheck(event)
131-
self._client.publish_events(self._endpoint, cast(List[InternalEventGridEvent], events), **kwargs)
132-
elif all(isinstance(e, CustomEvent) for e in events):
133-
serialized_events = [dict(e) for e in events] # type: ignore
134-
self._client.publish_custom_event_events(self._endpoint, cast(List, serialized_events), **kwargs)
135-
else:
136-
raise ValueError("Event schema is not correct.")
135+
elif isinstance(events[0], CustomEvent):
136+
events = [dict(e) for e in events] # type: ignore
137+
return self._client.publish_custom_event_events(self._endpoint, cast(List, events), **kwargs)
137138

138139
def close(self):
139140
# type: () -> None

sdk/eventgrid/azure-eventgrid/azure/eventgrid/aio/_publisher_client_async.py

Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,11 @@
2828
_get_endpoint_only_fqdn,
2929
_get_authentication_policy,
3030
_is_cloud_event,
31+
_is_eventgrid_event,
3132
_eventgrid_data_typecheck
3233
)
3334
from .._generated.aio import EventGridPublisherClient as EventGridPublisherClientAsync
34-
from .._generated.models import CloudEvent as InternalCloudEvent, EventGridEvent as InternalEventGridEvent
35+
from .._generated.models import CloudEvent as InternalCloudEvent
3536
from .._version import VERSION
3637

3738
SendType = Union[
@@ -98,13 +99,16 @@ def _policies(
9899
return policies
99100

100101
@distributed_trace_async
101-
async def send_events(
102+
async def send(
102103
self,
103104
events: SendType,
104105
**kwargs: Any) -> None:
105106
"""Sends event data to topic hostname specified during client initialization.
107+
Multiple events can be published at once by seding a list of events. It is very
108+
inefficient to loop the send method for each event instead of just using a list
109+
and we highly recommend against it.
106110
107-
:param events: A list or an instance of CloudEvent/EventGridEvent/CustomEvent to be sent.
111+
:param events: A list of CloudEvent/EventGridEvent/CustomEvent to be sent.
108112
:type events: SendType
109113
:keyword str content_type: The type of content to be used to send the events.
110114
Has default value "application/json; charset=utf-8" for EventGridEvents,
@@ -115,37 +119,24 @@ async def send_events(
115119
if not isinstance(events, list):
116120
events = cast(ListEventType, [events])
117121

118-
if all(isinstance(e, CloudEvent) for e in events) or all(_is_cloud_event(e) for e in events):
122+
if isinstance(events[0], CloudEvent) or _is_cloud_event(events[0]):
119123
try:
120-
events = [
121-
cast(CloudEvent, e)._to_generated(**kwargs) for e in events # pylint: disable=protected-access
122-
]
124+
events = [cast(CloudEvent, e)._to_generated(**kwargs) for e in events] # pylint: disable=protected-access
123125
except AttributeError:
124126
pass # means it's a dictionary
125127
kwargs.setdefault("content_type", "application/cloudevents-batch+json; charset=utf-8")
126-
await self._client.publish_cloud_event_events(
128+
return await self._client.publish_cloud_event_events(
127129
self._endpoint,
128130
cast(List[InternalCloudEvent], events),
129131
**kwargs
130132
)
131-
elif all(isinstance(e, EventGridEvent) for e in events) or all(isinstance(e, dict) for e in events):
132-
kwargs.setdefault("content_type", "application/json; charset=utf-8")
133+
kwargs.setdefault("content_type", "application/json; charset=utf-8")
134+
if isinstance(events[0], EventGridEvent) or _is_eventgrid_event(events[0]):
133135
for event in events:
134136
_eventgrid_data_typecheck(event)
135-
await self._client.publish_events(
136-
self._endpoint,
137-
cast(List[InternalEventGridEvent], events),
138-
**kwargs
139-
)
140-
elif all(isinstance(e, CustomEvent) for e in events):
141-
serialized_events = [dict(e) for e in events] # type: ignore
142-
await self._client.publish_custom_event_events(
143-
self._endpoint,
144-
cast(List, serialized_events),
145-
**kwargs
146-
)
147-
else:
148-
raise ValueError("Event schema is not correct.")
137+
elif isinstance(events[0], CustomEvent):
138+
events = [dict(e) for e in events] # type: ignore
139+
return await self._client.publish_custom_event_events(self._endpoint, cast(List, events), **kwargs)
149140

150141
async def __aenter__(self) -> "EventGridPublisherClient":
151142
await self._client.__aenter__()

sdk/eventgrid/azure-eventgrid/migration_guide.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ The `publish_events` API is replaced with `send` in v2.0. Additionally, `send` A
7979

8080
| In v1.3 | Equivalent in v2.0 | Sample |
8181
|---|---|---|
82-
|`EventGridClient(credentials).publish_events(topic_hostname, events)`|`EventGridPublisherClient(endpoint, credential).send_events(events)`|[Sample for client construction](https://github.com/Azure/azure-sdk-for-python/blob/master/sdk/eventgrid/azure-eventgrid/samples/champion_scenarios/cs5_publish_events_using_cloud_events_1.0_schema.py)|
82+
|`EventGridClient(credentials).publish_events(topic_hostname, events)`|`EventGridPublisherClient(endpoint, credential).send(events)`|[Sample for client construction](https://github.com/Azure/azure-sdk-for-python/blob/master/sdk/eventgrid/azure-eventgrid/samples/champion_scenarios/cs5_publish_events_using_cloud_events_1.0_schema.py)|
8383

8484
### Consuming Events
8585

sdk/eventgrid/azure-eventgrid/samples/champion_scenarios/cs1_publish_custom_events_to_a_topic.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
credential = AzureKeyCredential(topic_key)
2525
client = EventGridPublisherClient(endpoint, credential)
2626

27-
client.send_events([
27+
client.send([
2828
EventGridEvent(
2929
event_type="Contoso.Items.ItemReceived",
3030
data={

sdk/eventgrid/azure-eventgrid/samples/champion_scenarios/cs1b_publish_custom_events_to_a_topic_with_signature.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
credential = AzureSasCredential(signature)
2828
client = EventGridPublisherClient(endpoint, credential)
2929

30-
client.send_events([
30+
client.send([
3131
EventGridEvent(
3232
event_type="Contoso.Items.ItemReceived",
3333
data={

sdk/eventgrid/azure-eventgrid/samples/champion_scenarios/cs2_publish_custom_events_to_a_domain_topic.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
credential = AzureKeyCredential(domain_key)
2525
client = EventGridPublisherClient(domain_hostname, credential)
2626

27-
client.send_events([
27+
client.send([
2828
EventGridEvent(
2929
topic="MyCustomDomainTopic1",
3030
event_type="Contoso.Items.ItemReceived",

sdk/eventgrid/azure-eventgrid/samples/champion_scenarios/cs5_publish_events_using_cloud_events_1.0_schema.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
credential = AzureKeyCredential(topic_key)
2525
client = EventGridPublisherClient(endpoint, credential)
2626

27-
client.send_events([
27+
client.send([
2828
CloudEvent(
2929
type="Contoso.Items.ItemReceived",
3030
source="/contoso/items",

0 commit comments

Comments
 (0)