jcl-parser 2.2.1__tar.gz → 2.2.2__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 (80) hide show
  1. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/PKG-INFO +1 -1
  2. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jcl_parser.egg-info/PKG-INFO +1 -1
  3. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/__init__.py +1 -1
  4. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/dataset_lifecycle.py +25 -4
  5. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/pyproject.toml +1 -1
  6. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/LICENSE +0 -0
  7. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/README.md +0 -0
  8. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jcl_parser.egg-info/SOURCES.txt +0 -0
  9. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jcl_parser.egg-info/dependency_links.txt +0 -0
  10. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jcl_parser.egg-info/entry_points.txt +0 -0
  11. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jcl_parser.egg-info/requires.txt +0 -0
  12. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jcl_parser.egg-info/top_level.txt +0 -0
  13. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/__main__.py +0 -0
  14. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/_include_origins.py +0 -0
  15. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/_job_builder.py +0 -0
  16. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/_model_factories.py +0 -0
  17. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/_post_parse.py +0 -0
  18. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/_source_scanner.py +0 -0
  19. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/_statement_parser.py +0 -0
  20. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/builtin_procs.py +0 -0
  21. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/checks.py +0 -0
  22. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/cli.py +0 -0
  23. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/condition_parser.py +0 -0
  24. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/continuation_handler.py +0 -0
  25. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/errors.py +0 -0
  26. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/explosion.py +0 -0
  27. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/include_loader.py +0 -0
  28. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/jcl_file_type.py +0 -0
  29. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/jes_statements.py +0 -0
  30. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/lineage.py +0 -0
  31. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/lint/__init__.py +0 -0
  32. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/lint/base.py +0 -0
  33. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/lint/config.py +0 -0
  34. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/lint/rules.py +0 -0
  35. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/lint/runner.py +0 -0
  36. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/lint/suppress.py +0 -0
  37. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/metrics.py +0 -0
  38. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/model.py +0 -0
  39. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/parameter_ast.py +0 -0
  40. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/parameter_validators.py +0 -0
  41. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/parser.py +0 -0
  42. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/plugins/__init__.py +0 -0
  43. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/plugins/base.py +0 -0
  44. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/proc_loader.py +0 -0
  45. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/profiling.py +0 -0
  46. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/program_profiles/__init__.py +0 -0
  47. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/program_profiles/_control.py +0 -0
  48. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/program_profiles/_invoked.py +0 -0
  49. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/program_profiles/adrdssu.py +0 -0
  50. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/program_profiles/base.py +0 -0
  51. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/program_profiles/binder.py +0 -0
  52. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/program_profiles/bpxbatch.py +0 -0
  53. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/program_profiles/compilers.py +0 -0
  54. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/program_profiles/db2_batch.py +0 -0
  55. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/program_profiles/dfsrrc00.py +0 -0
  56. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/program_profiles/dsnutilb.py +0 -0
  57. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/program_profiles/ftp.py +0 -0
  58. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/program_profiles/icetool.py +0 -0
  59. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/program_profiles/idcams.py +0 -0
  60. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/program_profiles/iebcompr.py +0 -0
  61. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/program_profiles/iebdg.py +0 -0
  62. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/program_profiles/iebgener.py +0 -0
  63. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/program_profiles/iebptpch.py +0 -0
  64. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/program_profiles/iebupdte.py +0 -0
  65. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/program_profiles/iefbr14.py +0 -0
  66. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/program_profiles/iehinitt.py +0 -0
  67. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/program_profiles/iehlist.py +0 -0
  68. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/program_profiles/iehprogm.py +0 -0
  69. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/program_profiles/ikjeft01.py +0 -0
  70. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/program_profiles/irxjcl.py +0 -0
  71. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/program_profiles/registry.py +0 -0
  72. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/program_profiles/sort.py +0 -0
  73. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/py.typed +0 -0
  74. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/rc_analysis.py +0 -0
  75. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/serialization.py +0 -0
  76. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/sql_detector.py +0 -0
  77. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/system_symbols.py +0 -0
  78. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/utils.py +0 -0
  79. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/jclparser/validators.py +0 -0
  80. {jcl_parser-2.2.1 → jcl_parser-2.2.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jcl-parser
3
- Version: 2.2.1
3
+ Version: 2.2.2
4
4
  Summary: Parse IBM JCL (Job Control Language) scripts into Python objects
5
5
  Author-email: Samuel Dion <sam94dion@gmail.com>
6
6
  License-Expression: AGPL-3.0-or-later
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jcl-parser
3
- Version: 2.2.1
3
+ Version: 2.2.2
4
4
  Summary: Parse IBM JCL (Job Control Language) scripts into Python objects
5
5
  Author-email: Samuel Dion <sam94dion@gmail.com>
6
6
  License-Expression: AGPL-3.0-or-later
@@ -20,7 +20,7 @@ application, for example::
20
20
  import logging as _logging
21
21
 
22
22
  # Package metadata
23
- __version__ = "2.2.1" # x-release-please-version
23
+ __version__ = "2.2.2" # x-release-please-version
24
24
  __author__ = "JCL Parser Team"
25
25
  __description__ = "Parse IBM JCL scripts into Python objects"
26
26
 
@@ -63,6 +63,11 @@ class DatasetEvent:
63
63
  disp_abnormal: Abnormal termination disposition (same set as normal),
64
64
  or ``""`` if omitted.
65
65
  line_number: Source line number of the DD statement.
66
+ concatenation_member: ``0`` for a named DD; for an unnamed
67
+ concatenation member, its position in the concatenation (the
68
+ named DD is member 1, so the first unnamed card is member 2).
69
+ ``dd_name`` is then the name of the DD the concatenation
70
+ belongs to.
66
71
  """
67
72
 
68
73
  step_name: str
@@ -72,6 +77,14 @@ class DatasetEvent:
72
77
  disp_normal: str = ""
73
78
  disp_abnormal: str = ""
74
79
  line_number: int = 0
80
+ concatenation_member: int = 0
81
+
82
+ @property
83
+ def dd_label(self) -> str:
84
+ """The DD as messages name it: ``IN``, or ``IN, concatenation member 2``."""
85
+ if self.concatenation_member:
86
+ return f"{self.dd_name}, concatenation member {self.concatenation_member}"
87
+ return self.dd_name
75
88
 
76
89
 
77
90
  # ---------------------------------------------------------------------------
@@ -206,7 +219,14 @@ def _step_events(
206
219
  """Record *step*'s events into *lifecycle*; ``None`` when it has none."""
207
220
  step_name = step.name or ""
208
221
  step_events: list[_Event] = []
222
+ # An unnamed DD card continues the concatenation of the named DD before
223
+ # it, so it is reported under that DD's name (as ``Step.steplib`` does).
224
+ owner, member = "", 0
209
225
  for dd in _dataset_dds(step):
226
+ if dd.name:
227
+ owner, member = dd.name, 0
228
+ elif owner:
229
+ member = member + 1 if member else 2
210
230
  if not dd.dataset_name:
211
231
  continue
212
232
  # A backward reference names the dataset of the DD it points at;
@@ -222,12 +242,13 @@ def _step_events(
222
242
 
223
243
  event = DatasetEvent(
224
244
  step_name=step.name or "(unnamed)",
225
- dd_name=dd.name or "",
245
+ dd_name=dd.name or owner,
226
246
  action=_action_from_disp(status),
227
247
  disp_status=status,
228
248
  disp_normal=normal,
229
249
  disp_abnormal=abnormal,
230
250
  line_number=dd.line_number,
251
+ concatenation_member=0 if dd.name else member,
231
252
  )
232
253
  events = lifecycle.setdefault(dsn_key, [])
233
254
  step_events.append((dsn_key, len(events), event))
@@ -460,7 +481,7 @@ class _LifecycleChecker:
460
481
  dsn,
461
482
  pos,
462
483
  f"Dataset '{dsn}' allocated with DISP=NEW,CATLG in step "
463
- f"'{evt.step_name}' (DD {evt.dd_name}) but was already "
484
+ f"'{evt.step_name}' (DD {evt.dd_label}) but was already "
464
485
  f"cataloged in step '{cataloged_by.step_name}' without "
465
486
  f"an intervening DELETE or UNCATLG",
466
487
  evt,
@@ -492,7 +513,7 @@ class _LifecycleChecker:
492
513
  dsn,
493
514
  pos,
494
515
  f"Dataset '{dsn}' opened in step '{evt.step_name}' "
495
- f"(DD {evt.dd_name}) after being uncataloged in step "
516
+ f"(DD {evt.dd_label}) after being uncataloged in step "
496
517
  f"'{uncataloged_by.step_name}'",
497
518
  evt,
498
519
  )
@@ -506,7 +527,7 @@ class _LifecycleChecker:
506
527
  dsn,
507
528
  pos,
508
529
  f"Dataset '{dsn}' opened {disp_label} in step "
509
- f"'{evt.step_name}' (DD {evt.dd_name}) before it "
530
+ f"'{evt.step_name}' (DD {evt.dd_label}) before it "
510
531
  f"is allocated in a later step — verify the dataset "
511
532
  f"exists in the catalog",
512
533
  evt,
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "jcl-parser"
7
- version = "2.2.1"
7
+ version = "2.2.2"
8
8
  description = "Parse IBM JCL (Job Control Language) scripts into Python objects"
9
9
  authors = [
10
10
  {name = "Samuel Dion", email = "sam94dion@gmail.com"}
File without changes
File without changes
File without changes
File without changes