graphplug 0.2.2__tar.gz → 0.2.4__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 (34) hide show
  1. {graphplug-0.2.2 → graphplug-0.2.4}/PKG-INFO +19 -14
  2. {graphplug-0.2.2 → graphplug-0.2.4}/README.md +12 -12
  3. {graphplug-0.2.2 → graphplug-0.2.4}/graphplug/__init__.py +1 -1
  4. {graphplug-0.2.2 → graphplug-0.2.4}/graphplug.egg-info/PKG-INFO +19 -14
  5. {graphplug-0.2.2 → graphplug-0.2.4}/graphplug.egg-info/requires.txt +1 -0
  6. {graphplug-0.2.2 → graphplug-0.2.4}/pyproject.toml +10 -1
  7. {graphplug-0.2.2 → graphplug-0.2.4}/LICENSE +0 -0
  8. {graphplug-0.2.2 → graphplug-0.2.4}/graphplug/_auth.py +0 -0
  9. {graphplug-0.2.2 → graphplug-0.2.4}/graphplug/_errors.py +0 -0
  10. {graphplug-0.2.2 → graphplug-0.2.4}/graphplug/_http.py +0 -0
  11. {graphplug-0.2.2 → graphplug-0.2.4}/graphplug/_log.py +0 -0
  12. {graphplug-0.2.2 → graphplug-0.2.4}/graphplug/_operations.py +0 -0
  13. {graphplug-0.2.2 → graphplug-0.2.4}/graphplug/_request.py +0 -0
  14. {graphplug-0.2.2 → graphplug-0.2.4}/graphplug/_resources/__init__.py +0 -0
  15. {graphplug-0.2.2 → graphplug-0.2.4}/graphplug/_resources/base.py +0 -0
  16. {graphplug-0.2.2 → graphplug-0.2.4}/graphplug/_resources/calendar.py +0 -0
  17. {graphplug-0.2.2 → graphplug-0.2.4}/graphplug/_resources/files.py +0 -0
  18. {graphplug-0.2.2 → graphplug-0.2.4}/graphplug/_resources/mail.py +0 -0
  19. {graphplug-0.2.2 → graphplug-0.2.4}/graphplug/_resources/teams.py +0 -0
  20. {graphplug-0.2.2 → graphplug-0.2.4}/graphplug/_resources/users.py +0 -0
  21. {graphplug-0.2.2 → graphplug-0.2.4}/graphplug/_scopes.py +0 -0
  22. {graphplug-0.2.2 → graphplug-0.2.4}/graphplug/py.typed +0 -0
  23. {graphplug-0.2.2 → graphplug-0.2.4}/graphplug.egg-info/SOURCES.txt +0 -0
  24. {graphplug-0.2.2 → graphplug-0.2.4}/graphplug.egg-info/dependency_links.txt +0 -0
  25. {graphplug-0.2.2 → graphplug-0.2.4}/graphplug.egg-info/top_level.txt +0 -0
  26. {graphplug-0.2.2 → graphplug-0.2.4}/setup.cfg +0 -0
  27. {graphplug-0.2.2 → graphplug-0.2.4}/tests/test_errors_and_logging.py +0 -0
  28. {graphplug-0.2.2 → graphplug-0.2.4}/tests/test_files_teams_users.py +0 -0
  29. {graphplug-0.2.2 → graphplug-0.2.4}/tests/test_operations.py +0 -0
  30. {graphplug-0.2.2 → graphplug-0.2.4}/tests/test_redirect_and_construction.py +0 -0
  31. {graphplug-0.2.2 → graphplug-0.2.4}/tests/test_requests.py +0 -0
  32. {graphplug-0.2.2 → graphplug-0.2.4}/tests/test_resources.py +0 -0
  33. {graphplug-0.2.2 → graphplug-0.2.4}/tests/test_signin.py +0 -0
  34. {graphplug-0.2.2 → graphplug-0.2.4}/tests/test_transport.py +0 -0
@@ -1,9 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: graphplug
3
- Version: 0.2.2
3
+ Version: 0.2.4
4
4
  Summary: Plug-and-play Graph API for Python: mail, calendar, files, teams, users and generic requests.
5
- Author-email: Vikram Balaji <vikram.x.balaji@gmail.com>
5
+ Author: Vikram Balaji
6
6
  License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/VikramBalaji1/graphPlug
8
+ Project-URL: Documentation, https://github.com/VikramBalaji1/graphPlug#readme
9
+ Project-URL: Issues, https://github.com/VikramBalaji1/graphPlug/issues
10
+ Project-URL: Changelog, https://github.com/VikramBalaji1/graphPlug/releases
7
11
  Keywords: microsoft-graph,entra-id,azure-ad,outlook,onedrive,teams,asyncio
8
12
  Classifier: Development Status :: 4 - Beta
9
13
  Classifier: Framework :: AsyncIO
@@ -25,6 +29,7 @@ License-File: LICENSE
25
29
  Requires-Dist: azure-identity>=1.19
26
30
  Requires-Dist: msgraph-core>=1.3
27
31
  Requires-Dist: msal>=1.31
32
+ Requires-Dist: httpx>=0.28
28
33
  Dynamic: license-file
29
34
 
30
35
  # graphplug
@@ -80,7 +85,7 @@ async def main():
80
85
 
81
86
  async with graph:
82
87
  await graph.mail.send(
83
- to="alice@contoso.com",
88
+ to="alice@example.com",
84
89
  subject="Quarterly report",
85
90
  body="<p>Attached.</p>", html=True,
86
91
  attachments=["report.pdf"],
@@ -255,8 +260,8 @@ Delegated access. Works on the signed-in person's mailbox.
255
260
 
256
261
  ```python
257
262
  await graph.mail.send(
258
- to=["alice@contoso.com", "bob@contoso.com"],
259
- cc="team@contoso.com",
263
+ to=["alice@example.com", "bob@example.com"],
264
+ cc="team@example.com",
260
265
  subject="Build finished",
261
266
  body="<b>All green.</b>", html=True,
262
267
  attachments=["results.csv"],
@@ -275,12 +280,12 @@ async for message in graph.mail.inbox(search="invoice"):
275
280
 
276
281
  # Reply and forward
277
282
  await graph.mail.reply(message_id, "Thanks, on it.", reply_all=True)
278
- await graph.mail.forward(message_id, to="carol@contoso.com", comment="FYI")
283
+ await graph.mail.forward(message_id, to="carol@example.com", comment="FYI")
279
284
 
280
285
  # Send many at once; each entry takes the same arguments as send()
281
286
  results = await graph.mail.send_many([
282
- {"to": "a@contoso.com", "subject": "Hi A", "body": "..."},
283
- {"to": "b@contoso.com", "subject": "Hi B", "body": "..."},
287
+ {"to": "a@example.com", "subject": "Hi A", "body": "..."},
288
+ {"to": "b@example.com", "subject": "Hi B", "body": "..."},
284
289
  ])
285
290
  failed = [r for r in results if r["status"] >= 400]
286
291
  ```
@@ -327,14 +332,14 @@ start = datetime(2026, 10, 1, 14, 0, tzinfo=timezone.utc)
327
332
  event = await graph.calendar.schedule(
328
333
  subject="Design review",
329
334
  start=start, end=start + timedelta(minutes=45),
330
- attendees=["alice@contoso.com", "bob@contoso.com"],
335
+ attendees=["alice@example.com", "bob@example.com"],
331
336
  online=True,
332
337
  reminder_minutes=10,
333
338
  )
334
339
  print(event["onlineMeeting"]["joinUrl"])
335
340
 
336
341
  # Let Graph pick a time that suits everyone
337
- suggestions = await graph.calendar.find_times(["alice@contoso.com", "bob@contoso.com"],
342
+ suggestions = await graph.calendar.find_times(["alice@example.com", "bob@example.com"],
338
343
  duration_minutes=30)
339
344
  best = suggestions[0]["meetingTimeSlot"]
340
345
 
@@ -455,7 +460,7 @@ print(me["displayName"], me["jobTitle"])
455
460
  async for person in graph.users.find("smith"):
456
461
  print(person["displayName"], person["mail"])
457
462
 
458
- alice = await graph.users.by_email("alice@contoso.com")
463
+ alice = await graph.users.by_email("alice@example.com")
459
464
  boss = await graph.users.manager(alice["id"])
460
465
 
461
466
  async for report in graph.users.reports():
@@ -580,7 +585,7 @@ gave**.
580
585
 
581
586
  | Request form | Example |
582
587
  |---|---|
583
- | A tuple | `("GET", "/users/alice@contoso.com")` |
588
+ | A tuple | `("GET", "/users/alice@example.com")` |
584
589
  | A dict | `{"method": "PATCH", "url": "/me/messages/ID", "body": {"isRead": True}, "headers": {"Content-Type": "application/json"}}` |
585
590
 
586
591
  Each result has `id`, `status`, `body` and sometimes `headers`. Failures are reported in place,
@@ -636,7 +641,7 @@ or sign-in.
636
641
  from graphplug import GraphError
637
642
 
638
643
  try:
639
- await graph.users.by_email("nobody@contoso.com")
644
+ await graph.users.by_email("nobody@example.com")
640
645
  except GraphError as e:
641
646
  if e.code == "itemNotFound":
642
647
  print("no such user")
@@ -702,7 +707,7 @@ logged.
702
707
  import asyncio
703
708
 
704
709
  async with GraphClient.from_env(max_concurrency=8) as graph:
705
- ids = ["alice@contoso.com", "bob@contoso.com", "carol@contoso.com"]
710
+ ids = ["alice@example.com", "bob@example.com", "carol@example.com"]
706
711
  people = await asyncio.gather(*(graph.users.get(i) for i in ids))
707
712
  ```
708
713
 
@@ -51,7 +51,7 @@ async def main():
51
51
 
52
52
  async with graph:
53
53
  await graph.mail.send(
54
- to="alice@contoso.com",
54
+ to="alice@example.com",
55
55
  subject="Quarterly report",
56
56
  body="<p>Attached.</p>", html=True,
57
57
  attachments=["report.pdf"],
@@ -226,8 +226,8 @@ Delegated access. Works on the signed-in person's mailbox.
226
226
 
227
227
  ```python
228
228
  await graph.mail.send(
229
- to=["alice@contoso.com", "bob@contoso.com"],
230
- cc="team@contoso.com",
229
+ to=["alice@example.com", "bob@example.com"],
230
+ cc="team@example.com",
231
231
  subject="Build finished",
232
232
  body="<b>All green.</b>", html=True,
233
233
  attachments=["results.csv"],
@@ -246,12 +246,12 @@ async for message in graph.mail.inbox(search="invoice"):
246
246
 
247
247
  # Reply and forward
248
248
  await graph.mail.reply(message_id, "Thanks, on it.", reply_all=True)
249
- await graph.mail.forward(message_id, to="carol@contoso.com", comment="FYI")
249
+ await graph.mail.forward(message_id, to="carol@example.com", comment="FYI")
250
250
 
251
251
  # Send many at once; each entry takes the same arguments as send()
252
252
  results = await graph.mail.send_many([
253
- {"to": "a@contoso.com", "subject": "Hi A", "body": "..."},
254
- {"to": "b@contoso.com", "subject": "Hi B", "body": "..."},
253
+ {"to": "a@example.com", "subject": "Hi A", "body": "..."},
254
+ {"to": "b@example.com", "subject": "Hi B", "body": "..."},
255
255
  ])
256
256
  failed = [r for r in results if r["status"] >= 400]
257
257
  ```
@@ -298,14 +298,14 @@ start = datetime(2026, 10, 1, 14, 0, tzinfo=timezone.utc)
298
298
  event = await graph.calendar.schedule(
299
299
  subject="Design review",
300
300
  start=start, end=start + timedelta(minutes=45),
301
- attendees=["alice@contoso.com", "bob@contoso.com"],
301
+ attendees=["alice@example.com", "bob@example.com"],
302
302
  online=True,
303
303
  reminder_minutes=10,
304
304
  )
305
305
  print(event["onlineMeeting"]["joinUrl"])
306
306
 
307
307
  # Let Graph pick a time that suits everyone
308
- suggestions = await graph.calendar.find_times(["alice@contoso.com", "bob@contoso.com"],
308
+ suggestions = await graph.calendar.find_times(["alice@example.com", "bob@example.com"],
309
309
  duration_minutes=30)
310
310
  best = suggestions[0]["meetingTimeSlot"]
311
311
 
@@ -426,7 +426,7 @@ print(me["displayName"], me["jobTitle"])
426
426
  async for person in graph.users.find("smith"):
427
427
  print(person["displayName"], person["mail"])
428
428
 
429
- alice = await graph.users.by_email("alice@contoso.com")
429
+ alice = await graph.users.by_email("alice@example.com")
430
430
  boss = await graph.users.manager(alice["id"])
431
431
 
432
432
  async for report in graph.users.reports():
@@ -551,7 +551,7 @@ gave**.
551
551
 
552
552
  | Request form | Example |
553
553
  |---|---|
554
- | A tuple | `("GET", "/users/alice@contoso.com")` |
554
+ | A tuple | `("GET", "/users/alice@example.com")` |
555
555
  | A dict | `{"method": "PATCH", "url": "/me/messages/ID", "body": {"isRead": True}, "headers": {"Content-Type": "application/json"}}` |
556
556
 
557
557
  Each result has `id`, `status`, `body` and sometimes `headers`. Failures are reported in place,
@@ -607,7 +607,7 @@ or sign-in.
607
607
  from graphplug import GraphError
608
608
 
609
609
  try:
610
- await graph.users.by_email("nobody@contoso.com")
610
+ await graph.users.by_email("nobody@example.com")
611
611
  except GraphError as e:
612
612
  if e.code == "itemNotFound":
613
613
  print("no such user")
@@ -673,7 +673,7 @@ logged.
673
673
  import asyncio
674
674
 
675
675
  async with GraphClient.from_env(max_concurrency=8) as graph:
676
- ids = ["alice@contoso.com", "bob@contoso.com", "carol@contoso.com"]
676
+ ids = ["alice@example.com", "bob@example.com", "carol@example.com"]
677
677
  people = await asyncio.gather(*(graph.users.get(i) for i in ids))
678
678
  ```
679
679
 
@@ -35,7 +35,7 @@ from ._scopes import Scopes
35
35
 
36
36
  __all__ = ["GraphClient", "GraphError", "PendingSignIn", "Scopes"]
37
37
 
38
- __version__ = "0.2.2"
38
+ __version__ = "0.2.4"
39
39
 
40
40
 
41
41
  class PendingSignIn:
@@ -1,9 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: graphplug
3
- Version: 0.2.2
3
+ Version: 0.2.4
4
4
  Summary: Plug-and-play Graph API for Python: mail, calendar, files, teams, users and generic requests.
5
- Author-email: Vikram Balaji <vikram.x.balaji@gmail.com>
5
+ Author: Vikram Balaji
6
6
  License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/VikramBalaji1/graphPlug
8
+ Project-URL: Documentation, https://github.com/VikramBalaji1/graphPlug#readme
9
+ Project-URL: Issues, https://github.com/VikramBalaji1/graphPlug/issues
10
+ Project-URL: Changelog, https://github.com/VikramBalaji1/graphPlug/releases
7
11
  Keywords: microsoft-graph,entra-id,azure-ad,outlook,onedrive,teams,asyncio
8
12
  Classifier: Development Status :: 4 - Beta
9
13
  Classifier: Framework :: AsyncIO
@@ -25,6 +29,7 @@ License-File: LICENSE
25
29
  Requires-Dist: azure-identity>=1.19
26
30
  Requires-Dist: msgraph-core>=1.3
27
31
  Requires-Dist: msal>=1.31
32
+ Requires-Dist: httpx>=0.28
28
33
  Dynamic: license-file
29
34
 
30
35
  # graphplug
@@ -80,7 +85,7 @@ async def main():
80
85
 
81
86
  async with graph:
82
87
  await graph.mail.send(
83
- to="alice@contoso.com",
88
+ to="alice@example.com",
84
89
  subject="Quarterly report",
85
90
  body="<p>Attached.</p>", html=True,
86
91
  attachments=["report.pdf"],
@@ -255,8 +260,8 @@ Delegated access. Works on the signed-in person's mailbox.
255
260
 
256
261
  ```python
257
262
  await graph.mail.send(
258
- to=["alice@contoso.com", "bob@contoso.com"],
259
- cc="team@contoso.com",
263
+ to=["alice@example.com", "bob@example.com"],
264
+ cc="team@example.com",
260
265
  subject="Build finished",
261
266
  body="<b>All green.</b>", html=True,
262
267
  attachments=["results.csv"],
@@ -275,12 +280,12 @@ async for message in graph.mail.inbox(search="invoice"):
275
280
 
276
281
  # Reply and forward
277
282
  await graph.mail.reply(message_id, "Thanks, on it.", reply_all=True)
278
- await graph.mail.forward(message_id, to="carol@contoso.com", comment="FYI")
283
+ await graph.mail.forward(message_id, to="carol@example.com", comment="FYI")
279
284
 
280
285
  # Send many at once; each entry takes the same arguments as send()
281
286
  results = await graph.mail.send_many([
282
- {"to": "a@contoso.com", "subject": "Hi A", "body": "..."},
283
- {"to": "b@contoso.com", "subject": "Hi B", "body": "..."},
287
+ {"to": "a@example.com", "subject": "Hi A", "body": "..."},
288
+ {"to": "b@example.com", "subject": "Hi B", "body": "..."},
284
289
  ])
285
290
  failed = [r for r in results if r["status"] >= 400]
286
291
  ```
@@ -327,14 +332,14 @@ start = datetime(2026, 10, 1, 14, 0, tzinfo=timezone.utc)
327
332
  event = await graph.calendar.schedule(
328
333
  subject="Design review",
329
334
  start=start, end=start + timedelta(minutes=45),
330
- attendees=["alice@contoso.com", "bob@contoso.com"],
335
+ attendees=["alice@example.com", "bob@example.com"],
331
336
  online=True,
332
337
  reminder_minutes=10,
333
338
  )
334
339
  print(event["onlineMeeting"]["joinUrl"])
335
340
 
336
341
  # Let Graph pick a time that suits everyone
337
- suggestions = await graph.calendar.find_times(["alice@contoso.com", "bob@contoso.com"],
342
+ suggestions = await graph.calendar.find_times(["alice@example.com", "bob@example.com"],
338
343
  duration_minutes=30)
339
344
  best = suggestions[0]["meetingTimeSlot"]
340
345
 
@@ -455,7 +460,7 @@ print(me["displayName"], me["jobTitle"])
455
460
  async for person in graph.users.find("smith"):
456
461
  print(person["displayName"], person["mail"])
457
462
 
458
- alice = await graph.users.by_email("alice@contoso.com")
463
+ alice = await graph.users.by_email("alice@example.com")
459
464
  boss = await graph.users.manager(alice["id"])
460
465
 
461
466
  async for report in graph.users.reports():
@@ -580,7 +585,7 @@ gave**.
580
585
 
581
586
  | Request form | Example |
582
587
  |---|---|
583
- | A tuple | `("GET", "/users/alice@contoso.com")` |
588
+ | A tuple | `("GET", "/users/alice@example.com")` |
584
589
  | A dict | `{"method": "PATCH", "url": "/me/messages/ID", "body": {"isRead": True}, "headers": {"Content-Type": "application/json"}}` |
585
590
 
586
591
  Each result has `id`, `status`, `body` and sometimes `headers`. Failures are reported in place,
@@ -636,7 +641,7 @@ or sign-in.
636
641
  from graphplug import GraphError
637
642
 
638
643
  try:
639
- await graph.users.by_email("nobody@contoso.com")
644
+ await graph.users.by_email("nobody@example.com")
640
645
  except GraphError as e:
641
646
  if e.code == "itemNotFound":
642
647
  print("no such user")
@@ -702,7 +707,7 @@ logged.
702
707
  import asyncio
703
708
 
704
709
  async with GraphClient.from_env(max_concurrency=8) as graph:
705
- ids = ["alice@contoso.com", "bob@contoso.com", "carol@contoso.com"]
710
+ ids = ["alice@example.com", "bob@example.com", "carol@example.com"]
706
711
  people = await asyncio.gather(*(graph.users.get(i) for i in ids))
707
712
  ```
708
713
 
@@ -1,3 +1,4 @@
1
1
  azure-identity>=1.19
2
2
  msgraph-core>=1.3
3
3
  msal>=1.31
4
+ httpx>=0.28
@@ -12,7 +12,7 @@ readme = "README.md"
12
12
  requires-python = ">=3.10"
13
13
  license = "MIT"
14
14
  license-files = ["LICENSE"]
15
- authors = [{ name = "Vikram Balaji", email = "vikram.x.balaji@gmail.com" }]
15
+ authors = [{ name = "Vikram Balaji"}]
16
16
  keywords = ["microsoft-graph", "entra-id", "azure-ad", "outlook", "onedrive", "teams", "asyncio"]
17
17
  classifiers = [
18
18
  "Development Status :: 4 - Beta",
@@ -36,13 +36,22 @@ classifiers = [
36
36
  # msgraph-core the supported middleware pipeline (retry, Retry-After, redirect, telemetry)
37
37
  # msal the PKCE code exchange; already required by azure-identity, named because
38
38
  # _auth.py imports it directly
39
+ # httpx the HTTP client under msgraph-core; named because _http.py and _errors.py
40
+ # import it directly
39
41
  # msgraph-sdk is deliberately NOT used: its dependency tree does not resolve in practice.
40
42
  dependencies = [
41
43
  "azure-identity>=1.19",
42
44
  "msgraph-core>=1.3",
43
45
  "msal>=1.31",
46
+ "httpx>=0.28",
44
47
  ]
45
48
 
49
+ [project.urls]
50
+ Homepage = "https://github.com/VikramBalaji1/graphPlug"
51
+ Documentation = "https://github.com/VikramBalaji1/graphPlug#readme"
52
+ Issues = "https://github.com/VikramBalaji1/graphPlug/issues"
53
+ Changelog = "https://github.com/VikramBalaji1/graphPlug/releases"
54
+
46
55
  [tool.setuptools.dynamic]
47
56
  version = { attr = "graphplug.__version__" }
48
57
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes