devopsdriver 0.1.54__tar.gz → 0.1.55__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 (50) hide show
  1. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/PKG-INFO +3 -3
  2. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/README.md +1 -1
  3. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/devopsdriver/__init__.py +1 -1
  4. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/devopsdriver/dataobject.py +7 -3
  5. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/devopsdriver.egg-info/PKG-INFO +3 -3
  6. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/devopsdriver.egg-info/requires.txt +1 -1
  7. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/pyproject.toml +1 -1
  8. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/tests/test_dataobject.py +167 -0
  9. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/LICENSE +0 -0
  10. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/devopsdriver/azdo/__init__.py +0 -0
  11. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/devopsdriver/azdo/azureobject.py +0 -0
  12. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/devopsdriver/azdo/builds/__init__.py +0 -0
  13. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/devopsdriver/azdo/builds/build.py +0 -0
  14. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/devopsdriver/azdo/builds/client.py +0 -0
  15. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/devopsdriver/azdo/clients.py +0 -0
  16. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/devopsdriver/azdo/pipeline/__init__.py +0 -0
  17. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/devopsdriver/azdo/pipeline/client.py +0 -0
  18. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/devopsdriver/azdo/pipeline/log.py +0 -0
  19. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/devopsdriver/azdo/pipeline/pipeline.py +0 -0
  20. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/devopsdriver/azdo/pipeline/run.py +0 -0
  21. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/devopsdriver/azdo/timestamp.py +0 -0
  22. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/devopsdriver/azdo/workitem/__init__.py +0 -0
  23. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/devopsdriver/azdo/workitem/client.py +0 -0
  24. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/devopsdriver/azdo/workitem/wiql.py +0 -0
  25. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/devopsdriver/github/__init__.py +0 -0
  26. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/devopsdriver/github/client.py +0 -0
  27. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/devopsdriver/manage_settings.py +0 -0
  28. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/devopsdriver/sendmail.py +0 -0
  29. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/devopsdriver/settings.py +0 -0
  30. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/devopsdriver/template.py +0 -0
  31. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/devopsdriver/templates/manage_settings.txt.mako +0 -0
  32. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/devopsdriver.egg-info/SOURCES.txt +0 -0
  33. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/devopsdriver.egg-info/dependency_links.txt +0 -0
  34. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/devopsdriver.egg-info/entry_points.txt +0 -0
  35. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/devopsdriver.egg-info/top_level.txt +0 -0
  36. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/setup.cfg +0 -0
  37. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/tests/test_azure_azureobject.py +0 -0
  38. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/tests/test_azure_build.py +0 -0
  39. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/tests/test_azure_build_client.py +0 -0
  40. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/tests/test_azure_clients.py +0 -0
  41. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/tests/test_azure_pipeline.py +0 -0
  42. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/tests/test_azure_pipeline_client.py +0 -0
  43. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/tests/test_azure_pipeline_run.py +0 -0
  44. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/tests/test_azure_timestamp.py +0 -0
  45. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/tests/test_azure_workitem_client.py +0 -0
  46. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/tests/test_azure_workitem_wiql.py +0 -0
  47. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/tests/test_manage_settings.py +0 -0
  48. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/tests/test_sendmail.py +0 -0
  49. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/tests/test_settings.py +0 -0
  50. {devopsdriver-0.1.54 → devopsdriver-0.1.55}/tests/test_template.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devopsdriver
3
- Version: 0.1.54
3
+ Version: 0.1.55
4
4
  Summary: DevOps tools
5
5
  Author-email: Marc Page <marcallenpage@gmail.com>
6
6
  License: This is free and unencumbered software released into the public domain.
@@ -50,7 +50,7 @@ Requires-Dist: PyYAML==6.0.3
50
50
  Requires-Dist: keyring==25.7.0
51
51
  Requires-Dist: setuptools==82.0.1
52
52
  Requires-Dist: azure-devops==7.1.0b4
53
- Requires-Dist: Mako==1.3.11
53
+ Requires-Dist: Mako==1.3.12
54
54
  Requires-Dist: PyGithub==2.9.1
55
55
  Provides-Extra: dev
56
56
  Requires-Dist: black>=24.3.0; extra == "dev"
@@ -64,7 +64,7 @@ Dynamic: license-file
64
64
  # devops-driver
65
65
 
66
66
  ![status sheild](https://img.shields.io/static/v1?label=status&message=beta&color=blue&style=plastic)
67
- [![status sheild](https://img.shields.io/static/v1?label=released&message=v0.1.54&color=active&style=plastic)](https://pypi.org/project/devopsdriver/0.1.54/)
67
+ [![status sheild](https://img.shields.io/static/v1?label=released&message=v0.1.55&color=active&style=plastic)](https://pypi.org/project/devopsdriver/0.1.55/)
68
68
  [![GitHub](https://img.shields.io/github/license/marcpage/devops-driver?style=plastic)](https://github.com/marcpage/devops-driver?tab=Unlicense-1-ov-file#readme)
69
69
  [![GitHub contributors](https://img.shields.io/github/contributors/marcpage/devops-driver?style=flat)](https://github.com/marcpage/devops-driver/graphs/contributors)
70
70
  [![PR's Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat)](http://makeapullrequest.com)
@@ -1,7 +1,7 @@
1
1
  # devops-driver
2
2
 
3
3
  ![status sheild](https://img.shields.io/static/v1?label=status&message=beta&color=blue&style=plastic)
4
- [![status sheild](https://img.shields.io/static/v1?label=released&message=v0.1.54&color=active&style=plastic)](https://pypi.org/project/devopsdriver/0.1.54/)
4
+ [![status sheild](https://img.shields.io/static/v1?label=released&message=v0.1.55&color=active&style=plastic)](https://pypi.org/project/devopsdriver/0.1.55/)
5
5
  [![GitHub](https://img.shields.io/github/license/marcpage/devops-driver?style=plastic)](https://github.com/marcpage/devops-driver?tab=Unlicense-1-ov-file#readme)
6
6
  [![GitHub contributors](https://img.shields.io/github/contributors/marcpage/devops-driver?style=flat)](https://github.com/marcpage/devops-driver/graphs/contributors)
7
7
  [![PR's Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat)](http://makeapullrequest.com)
@@ -6,6 +6,6 @@ from .template import Template
6
6
  from .azdo.clients import Azure
7
7
  from .github.client import Github
8
8
 
9
- __version__ = "0.1.54"
9
+ __version__ = "0.1.55"
10
10
  __author__ = "Marc Page"
11
11
  __credits__ = ""
@@ -56,7 +56,7 @@ class DataObject: # pylint: disable=too-few-public-methods
56
56
  def __repr__(self) -> str:
57
57
  return dumps(self.data, indent=2)
58
58
 
59
- def lookup(self, path: str) -> Any:
59
+ def lookup(self, path: str, default: Any = None) -> Any:
60
60
  """
61
61
  Resolves a custom path expression against the underlying data.
62
62
 
@@ -77,8 +77,12 @@ class DataObject: # pylint: disable=too-few-public-methods
77
77
  tokens = self._tokenize(path)
78
78
  current = self.data
79
79
 
80
- for token in tokens:
81
- current = self._apply_token(current, token)
80
+ try:
81
+ for token in tokens:
82
+ current = self._apply_token(current, token)
83
+
84
+ except KeyError:
85
+ return default
82
86
 
83
87
  return current
84
88
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devopsdriver
3
- Version: 0.1.54
3
+ Version: 0.1.55
4
4
  Summary: DevOps tools
5
5
  Author-email: Marc Page <marcallenpage@gmail.com>
6
6
  License: This is free and unencumbered software released into the public domain.
@@ -50,7 +50,7 @@ Requires-Dist: PyYAML==6.0.3
50
50
  Requires-Dist: keyring==25.7.0
51
51
  Requires-Dist: setuptools==82.0.1
52
52
  Requires-Dist: azure-devops==7.1.0b4
53
- Requires-Dist: Mako==1.3.11
53
+ Requires-Dist: Mako==1.3.12
54
54
  Requires-Dist: PyGithub==2.9.1
55
55
  Provides-Extra: dev
56
56
  Requires-Dist: black>=24.3.0; extra == "dev"
@@ -64,7 +64,7 @@ Dynamic: license-file
64
64
  # devops-driver
65
65
 
66
66
  ![status sheild](https://img.shields.io/static/v1?label=status&message=beta&color=blue&style=plastic)
67
- [![status sheild](https://img.shields.io/static/v1?label=released&message=v0.1.54&color=active&style=plastic)](https://pypi.org/project/devopsdriver/0.1.54/)
67
+ [![status sheild](https://img.shields.io/static/v1?label=released&message=v0.1.55&color=active&style=plastic)](https://pypi.org/project/devopsdriver/0.1.55/)
68
68
  [![GitHub](https://img.shields.io/github/license/marcpage/devops-driver?style=plastic)](https://github.com/marcpage/devops-driver?tab=Unlicense-1-ov-file#readme)
69
69
  [![GitHub contributors](https://img.shields.io/github/contributors/marcpage/devops-driver?style=flat)](https://github.com/marcpage/devops-driver/graphs/contributors)
70
70
  [![PR's Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat)](http://makeapullrequest.com)
@@ -2,7 +2,7 @@ PyYAML==6.0.3
2
2
  keyring==25.7.0
3
3
  setuptools==82.0.1
4
4
  azure-devops==7.1.0b4
5
- Mako==1.3.11
5
+ Mako==1.3.12
6
6
  PyGithub==2.9.1
7
7
 
8
8
  [dev]
@@ -10,7 +10,7 @@ dependencies = [
10
10
  "keyring==25.7.0",
11
11
  "setuptools==82.0.1", # neded for azure-devops to use 7.1 API
12
12
  "azure-devops==7.1.0b4",
13
- "Mako==1.3.11",
13
+ "Mako==1.3.12",
14
14
  "PyGithub==2.9.1",
15
15
  ]
16
16
  keywords = [
@@ -248,6 +248,173 @@ def test_lookup() -> None:
248
248
  pass
249
249
 
250
250
 
251
+ def test_lookup_missing() -> None:
252
+ """Tests lookup when a key is missing"""
253
+ data = DataObject(
254
+ {
255
+ "url": "https://dev.azure.com/ni/94b22d7b-ad7b-4f5e-88f0-867910f91c94/_apis/"
256
+ + "wit/workItems/949367/revisions/54",
257
+ "fields": {
258
+ "System.AreaPath": "DevCentral\\Business Units\\ADG\\SharedRepo\\MMSsc",
259
+ "System.TeamProject": "DevCentral",
260
+ "System.IterationPath": "DevCentral\\zzzArchive\\Cycles\\Cycle 17\\i77 "
261
+ + "(ends 2020-02-28)",
262
+ "System.WorkItemType": "Research",
263
+ "System.State": "Closed",
264
+ "System.Reason": "Moved to state Closed",
265
+ "System.AssignedTo": {
266
+ "displayName": "Brown, Andy",
267
+ "url": "https://spsprodeus24.vssps.visualstudio.com/"
268
+ + "Afae0922c-6afd-42ea-b8cb-e21a431ec8dd/_apis/Identities/"
269
+ + "d91becd5-72ba-6967-a84a-6a6708550e20",
270
+ "_links": {
271
+ "avatar": {
272
+ "href": "https://dev.azure.com/ni/_apis/GraphProfile/MemberAvatars/"
273
+ + "aad.ZDIxNmMzY2EtMDdiMi03MmQ1LWFjMWQtNmJhMThhZDlhN2Zl"
274
+ }
275
+ },
276
+ "id": "d91becd5-72ba-6967-a84a-6a6708550e20",
277
+ "uniqueName": "andy.c.brown@emerson.com",
278
+ "imageUrl": "https://dev.azure.com/ni/_apis/GraphProfile/MemberAvatars/"
279
+ + "aad.ZDIxNmMzY2EtMDdiMi03MmQ1LWFjMWQtNmJhMThhZDlhN2Zl",
280
+ "descriptor": "aad.ZDIxNmMzY2EtMDdiMi03MmQ1LWFjMWQtNmJhMThhZDlhN2Zl",
281
+ },
282
+ "System.CreatedDate": "2019-12-10T20:33:08.743Z",
283
+ "System.CreatedBy": {
284
+ "displayName": "Tillerson, Michael",
285
+ "url": "https://spsprodeus24.vssps.visualstudio.com/"
286
+ + "Afae0922c-6afd-42ea-b8cb-e21a431ec8dd/_apis/Identities/"
287
+ + "dc42cd0e-ab09-4553-8516-9efe930b92a2",
288
+ "_links": {
289
+ "avatar": {
290
+ "href": "https://dev.azure.com/ni/_apis/GraphProfile/MemberAvatars/"
291
+ + "aad.YWZkMzg2MTItMTAwMy03YmM1LWI1ODQtMTY1YTcwMmM1MmE2"
292
+ }
293
+ },
294
+ "id": "dc42cd0e-ab09-4553-8516-9efe930b92a2",
295
+ "uniqueName": "michael.tillerson@emerson.com",
296
+ "imageUrl": "https://dev.azure.com/ni/_apis/GraphProfile/MemberAvatars/"
297
+ + "aad.YWZkMzg2MTItMTAwMy03YmM1LWI1ODQtMTY1YTcwMmM1MmE2",
298
+ "descriptor": "aad.YWZkMzg2MTItMTAwMy03YmM1LWI1ODQtMTY1YTcwMmM1MmE2",
299
+ },
300
+ "System.ChangedDate": "2026-05-07T16:20:55.96Z",
301
+ "System.ChangedBy": {
302
+ "displayName": "Tillerson, Michael",
303
+ "url": "https://spsprodeus24.vssps.visualstudio.com/"
304
+ + "Afae0922c-6afd-42ea-b8cb-e21a431ec8dd/_apis/Identities/"
305
+ + "dc42cd0e-ab09-4553-8516-9efe930b92a2",
306
+ "_links": {
307
+ "avatar": {
308
+ "href": "https://dev.azure.com/ni/_apis/GraphProfile/"
309
+ + "MemberAvatars/aad.YWZkMzg2MTItMTAwMy03YmM1LWI1ODQtMTY1YTcwMmM1MmE2"
310
+ }
311
+ },
312
+ "id": "dc42cd0e-ab09-4553-8516-9efe930b92a2",
313
+ "uniqueName": "michael.tillerson@emerson.com",
314
+ "imageUrl": "https://dev.azure.com/ni/_apis/GraphProfile/MemberAvatars/"
315
+ + "aad.YWZkMzg2MTItMTAwMy03YmM1LWI1ODQtMTY1YTcwMmM1MmE2",
316
+ "descriptor": "aad.YWZkMzg2MTItMTAwMy03YmM1LWI1ODQtMTY1YTcwMmM1MmE2",
317
+ },
318
+ "System.CommentCount": 7,
319
+ "System.Title": "PA: RFSA: Test Bench Architecture (time boxed)",
320
+ "System.BoardColumn": "Closed",
321
+ "System.BoardColumnDone": False,
322
+ "Microsoft.VSTS.Common.StateChangeDate": "2019-12-10T20:33:08.743Z",
323
+ "Microsoft.VSTS.Common.ClosedDate": "2020-02-14T18:17:33.233Z",
324
+ "Microsoft.VSTS.Common.ValueArea": "Business",
325
+ "Microsoft.VSTS.Common.ClosedBy": {
326
+ "displayName": "Brown, Andy",
327
+ "url": "https://spsprodeus24.vssps.visualstudio.com/"
328
+ + "Afae0922c-6afd-42ea-b8cb-e21a431ec8dd/_apis/Identities/"
329
+ + "d91becd5-72ba-6967-a84a-6a6708550e20",
330
+ "_links": {
331
+ "avatar": {
332
+ "href": "https://dev.azure.com/ni/_apis/GraphProfile/MemberAvatars/"
333
+ + "aad.ZDIxNmMzY2EtMDdiMi03MmQ1LWFjMWQtNmJhMThhZDlhN2Zl"
334
+ }
335
+ },
336
+ "id": "d91becd5-72ba-6967-a84a-6a6708550e20",
337
+ "uniqueName": "andy.c.brown@emerson.com",
338
+ "imageUrl": "https://dev.azure.com/ni/_apis/GraphProfile/MemberAvatars/"
339
+ + "aad.ZDIxNmMzY2EtMDdiMi03MmQ1LWFjMWQtNmJhMThhZDlhN2Zl",
340
+ "descriptor": "aad.ZDIxNmMzY2EtMDdiMi03MmQ1LWFjMWQtNmJhMThhZDlhN2Zl",
341
+ },
342
+ "Microsoft.VSTS.Common.ResolvedDate": "2020-02-06T03:21:28.327Z",
343
+ "Microsoft.VSTS.Common.ResolvedBy": {
344
+ "displayName": "Brown, Andy",
345
+ "url": "https://spsprodeus24.vssps.visualstudio.com/"
346
+ + "Afae0922c-6afd-42ea-b8cb-e21a431ec8dd/_apis/Identities/"
347
+ + "d91becd5-72ba-6967-a84a-6a6708550e20",
348
+ "_links": {
349
+ "avatar": {
350
+ "href": "https://dev.azure.com/ni/_apis/GraphProfile/MemberAvatars/"
351
+ + "aad.ZDIxNmMzY2EtMDdiMi03MmQ1LWFjMWQtNmJhMThhZDlhN2Zl"
352
+ }
353
+ },
354
+ "id": "d91becd5-72ba-6967-a84a-6a6708550e20",
355
+ "uniqueName": "andy.c.brown@emerson.com",
356
+ "imageUrl": "https://dev.azure.com/ni/_apis/GraphProfile/MemberAvatars/"
357
+ + "aad.ZDIxNmMzY2EtMDdiMi03MmQ1LWFjMWQtNmJhMThhZDlhN2Zl",
358
+ "descriptor": "aad.ZDIxNmMzY2EtMDdiMi03MmQ1LWFjMWQtNmJhMThhZDlhN2Zl",
359
+ },
360
+ "Microsoft.VSTS.Common.StackRank": 388652161.0,
361
+ "Microsoft.VSTS.Scheduling.StoryPoints": 5.0,
362
+ "Custom.PendingValidationBy": {
363
+ "displayName": "Brown, Andy",
364
+ "url": "https://spsprodeus24.vssps.visualstudio.com/"
365
+ + "Afae0922c-6afd-42ea-b8cb-e21a431ec8dd/_apis/Identities/"
366
+ + "d91becd5-72ba-6967-a84a-6a6708550e20",
367
+ "_links": {
368
+ "avatar": {
369
+ "href": "https://dev.azure.com/ni/_apis/GraphProfile/MemberAvatars/"
370
+ + "aad.ZDIxNmMzY2EtMDdiMi03MmQ1LWFjMWQtNmJhMThhZDlhN2Zl"
371
+ }
372
+ },
373
+ "id": "d91becd5-72ba-6967-a84a-6a6708550e20",
374
+ "uniqueName": "andy.c.brown@emerson.com",
375
+ "imageUrl": "https://dev.azure.com/ni/_apis/GraphProfile/MemberAvatars/"
376
+ + "aad.ZDIxNmMzY2EtMDdiMi03MmQ1LWFjMWQtNmJhMThhZDlhN2Zl",
377
+ "descriptor": "aad.ZDIxNmMzY2EtMDdiMi03MmQ1LWFjMWQtNmJhMThhZDlhN2Zl",
378
+ },
379
+ "Custom.PendingValidationDate": "2020-02-06T03:21:28.327Z",
380
+ "WEF_D8499809B15042DAABC202ECF51A67D8_Kanban.Column": "Closed",
381
+ "WEF_D8499809B15042DAABC202ECF51A67D8_Kanban.Column.Done": False,
382
+ "WEF_C7071942F5474A15BD600E74B97D7C7A_Kanban.Column": "Closed",
383
+ "WEF_C7071942F5474A15BD600E74B97D7C7A_Kanban.Column.Done": False,
384
+ "WEF_42B49516479B4AEEA0D80D89E8893C45_Kanban.Column": "Closed",
385
+ "WEF_42B49516479B4AEEA0D80D89E8893C45_Kanban.Column.Done": False,
386
+ "WEF_3E05701FE5EA4460876365252800813A_Kanban.Column": "Closed",
387
+ "WEF_3E05701FE5EA4460876365252800813A_Kanban.Column.Done": False,
388
+ "System.Description": "<div>As a developer, I need a testbench to measure and "
389
+ + "validate these features and assess performance</div>",
390
+ "Microsoft.VSTS.Common.AcceptanceCriteria": "<ul><li>Expect documentation "
391
+ + 'similar to <a href="https://dev.azure.com/ni/DevCentral/_wiki/wikis/'
392
+ + 'AppCentral.wiki/8216/EV-Battery-Test-System">this EV Battery Test System '
393
+ + "documentation</a></li><li>Purchase HW&nbsp;</li><ul><li>controller, chassis, "
394
+ + "modules, cables, host computer</li><li><br></li></ul><li>Able to deploy SW to "
395
+ + "DUT</li><li>Able to execute tests on DUT</li>"
396
+ + "<li>Able to record test results</li>"
397
+ + "<li><br></li><li>Eventually use DevOps Services</li>"
398
+ + "<ul><li>Deployment Framework</li>"
399
+ + "<li>Test Execution Framework</li>"
400
+ + "<li><span>Test Reporting Framework</span></li></ul></ul>",
401
+ },
402
+ "id": 949367,
403
+ "rev": 54,
404
+ }
405
+ )
406
+
407
+ assert (
408
+ data.lookup("/relations/(/attributes/name=Parent).first/url.split(/).last.int")
409
+ is None
410
+ ), [data.lookup("/relations/(/attributes/name=Parent).first/url.split(/).last.int")]
411
+ assert (
412
+ data.lookup("/relations/(/attributes/name=Child)/url.split(/).last.int", [])
413
+ == []
414
+ ), [data.lookup("/relations/(/attributes/name=Child)/url.split(/).last.int", [])]
415
+
416
+
251
417
  if __name__ == "__main__":
418
+ test_lookup_missing()
252
419
  test_lookup()
253
420
  test_dataobject_basic()
File without changes
File without changes