data-validation-engine 0.8.3__tar.gz → 0.8.5__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 (106) hide show
  1. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/PKG-INFO +1 -1
  2. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/pyproject.toml +3 -3
  3. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/implementations/duckdb/duckdb_helpers.py +24 -19
  4. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/implementations/spark/spark_helpers.py +25 -23
  5. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/metadata_parser/utilities.py +20 -0
  6. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/pipeline/pipeline.py +5 -1
  7. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/reporting/excel_report.py +0 -11
  8. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/LICENSE +0 -0
  9. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/README.md +0 -0
  10. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/__init__.py +0 -0
  11. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/common/__init__.py +0 -0
  12. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/common/error_utils.py +0 -0
  13. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/__init__.py +0 -0
  14. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/__init__.py +0 -0
  15. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/base/__init__.py +0 -0
  16. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/base/auditing.py +0 -0
  17. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/base/backend.py +0 -0
  18. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/base/contract.py +0 -0
  19. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/base/core.py +0 -0
  20. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/base/reader.py +0 -0
  21. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/base/reference_data.py +0 -0
  22. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/base/rules.py +0 -0
  23. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/base/utilities.py +0 -0
  24. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/exceptions.py +0 -0
  25. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/implementations/__init__.py +0 -0
  26. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/implementations/duckdb/__init__.py +0 -0
  27. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/implementations/duckdb/auditing.py +0 -0
  28. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/implementations/duckdb/contract.py +0 -0
  29. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/implementations/duckdb/readers/__init__.py +0 -0
  30. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/implementations/duckdb/readers/csv.py +0 -0
  31. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/implementations/duckdb/readers/json.py +0 -0
  32. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/implementations/duckdb/readers/xml.py +0 -0
  33. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/implementations/duckdb/reference_data.py +0 -0
  34. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/implementations/duckdb/rules.py +0 -0
  35. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/implementations/duckdb/types.py +0 -0
  36. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/implementations/duckdb/utilities.py +0 -0
  37. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/implementations/spark/__init__.py +0 -0
  38. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/implementations/spark/auditing.py +0 -0
  39. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/implementations/spark/backend.py +0 -0
  40. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/implementations/spark/contract.py +0 -0
  41. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/implementations/spark/readers/__init__.py +0 -0
  42. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/implementations/spark/readers/csv.py +0 -0
  43. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/implementations/spark/readers/json.py +0 -0
  44. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/implementations/spark/readers/xml.py +0 -0
  45. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/implementations/spark/reference_data.py +0 -0
  46. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/implementations/spark/rules.py +0 -0
  47. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/implementations/spark/types.py +0 -0
  48. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/implementations/spark/utilities.py +0 -0
  49. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/metadata/__init__.py +0 -0
  50. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/metadata/contract.py +0 -0
  51. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/metadata/reporting.py +0 -0
  52. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/metadata/rules.py +0 -0
  53. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/readers/__init__.py +0 -0
  54. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/readers/csv.py +0 -0
  55. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/readers/utilities.py +0 -0
  56. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/readers/xml.py +0 -0
  57. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/readers/xml_linting.py +0 -0
  58. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/types.py +0 -0
  59. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/backends/utilities.py +0 -0
  60. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/configuration/__init__.py +0 -0
  61. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/configuration/base.py +0 -0
  62. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/configuration/v1/__init__.py +0 -0
  63. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/configuration/v1/filters.py +0 -0
  64. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/configuration/v1/rule_stores/__init__.py +0 -0
  65. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/configuration/v1/rule_stores/models.py +0 -0
  66. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/configuration/v1/steps.py +0 -0
  67. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/constants.py +0 -0
  68. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/engine.py +0 -0
  69. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/exceptions.py +0 -0
  70. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/functions/__init__.py +0 -0
  71. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/functions/implementations.py +0 -0
  72. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/loggers.py +0 -0
  73. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/message.py +0 -0
  74. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/models.py +0 -0
  75. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/templating.py +0 -0
  76. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/type_hints.py +0 -0
  77. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/core_engine/validation.py +0 -0
  78. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/metadata_parser/__init__.py +0 -0
  79. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/metadata_parser/domain_types.py +0 -0
  80. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/metadata_parser/exc.py +0 -0
  81. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/metadata_parser/function_library.py +0 -0
  82. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/metadata_parser/function_wrapper.py +0 -0
  83. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/metadata_parser/model_generator.py +0 -0
  84. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/metadata_parser/models.py +0 -0
  85. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/parser/__init__.py +0 -0
  86. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/parser/exceptions.py +0 -0
  87. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/parser/file_handling/__init__.py +0 -0
  88. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/parser/file_handling/helpers.py +0 -0
  89. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/parser/file_handling/implementations/__init__.py +0 -0
  90. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/parser/file_handling/implementations/base.py +0 -0
  91. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/parser/file_handling/implementations/dbfs.py +0 -0
  92. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/parser/file_handling/implementations/file.py +0 -0
  93. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/parser/file_handling/implementations/s3.py +0 -0
  94. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/parser/file_handling/log_handler.py +0 -0
  95. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/parser/file_handling/service.py +0 -0
  96. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/parser/file_handling/utilities.py +0 -0
  97. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/parser/type_hints.py +0 -0
  98. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/parser/utilities.py +0 -0
  99. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/pipeline/__init__.py +0 -0
  100. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/pipeline/duckdb_pipeline.py +0 -0
  101. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/pipeline/foundry_ddb_pipeline.py +0 -0
  102. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/pipeline/spark_pipeline.py +0 -0
  103. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/pipeline/utils.py +0 -0
  104. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/reporting/__init__.py +0 -0
  105. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/reporting/constants.py +0 -0
  106. {data_validation_engine-0.8.3 → data_validation_engine-0.8.5}/src/dve/reporting/error_report.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: data-validation-engine
3
- Version: 0.8.3
3
+ Version: 0.8.5
4
4
  Summary: `nhs data validation engine` is a framework used to validate data
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -25,7 +25,7 @@ Issues = "https://github.com/NHSDigital/data-validation-engine/issues"
25
25
  Changelog = "https://github.com/NHSDigital/data-validation-engine/blob/main/CHANGELOG.md"
26
26
 
27
27
  [tool.poetry]
28
- version = "0.8.3"
28
+ version = "0.8.5"
29
29
  packages = [
30
30
  { include = "dve", from = "src" },
31
31
  ]
@@ -69,7 +69,7 @@ optional = true
69
69
  behave = "1.3.3"
70
70
  coverage = "7.11.0"
71
71
  moto = {extras = ["s3"], version = "4.2.14"}
72
- cryptography = "48.0.1" # dependency of `moto`
72
+ cryptography = "50.0.0" # dependency of `moto`
73
73
  requests = "2.33.0" # dependency of `moto`
74
74
  Werkzeug = "3.1.6"
75
75
  pytest = "9.0.3"
@@ -106,7 +106,7 @@ click = "8.2.1"
106
106
  mkdocs = "1.6.1"
107
107
  mkdocstrings = { version = "1.0.3", extras = ["python"] }
108
108
  griffelib = "2.0.1"
109
- pymdown-extensions = "10.21.3"
109
+ pymdown-extensions = "11.0.1"
110
110
  zensical = "0.0.46"
111
111
 
112
112
  [tool.ruff]
@@ -24,6 +24,7 @@ from dve.core_engine.backends.base.utilities import _get_non_heterogenous_type
24
24
  from dve.core_engine.backends.utilities import DEFAULT_ISO_FORMATS, datetime_format_to_regex
25
25
  from dve.core_engine.constants import RECORD_INDEX_COLUMN_NAME
26
26
  from dve.core_engine.type_hints import URI, EntityName
27
+ from dve.metadata_parser.utilities import resilient_get
27
28
  from dve.parser.file_handling.service import LocalFilesystemImplementation, _get_implementation
28
29
 
29
30
 
@@ -451,23 +452,27 @@ def get_duckdb_cast_statement_from_annotation(
451
452
  raise ValueError(f"dict must be `typing.TypedDict` subclass, got {type_annotation!r}")
452
453
 
453
454
  for type_ in type_annotation.mro():
454
- _date_format: str = getattr( # type: ignore
455
- type_, "DATE_FORMAT", DEFAULT_ISO_FORMATS.get(type_, DEFAULT_ISO_FORMATS.get(datetime))
456
- )
457
- dt_cast_statement = rf"CASE WHEN REGEXP_FULL_MATCH(TRIM({quoted_name}), '{datetime_format_to_regex(_date_format)}') THEN TRY_STRPTIME(TRIM({quoted_name}), '{_date_format}') ELSE NULL END" # pylint: disable=C0301
458
-
459
- # datetime is subclass of date, so needs to be handled first
460
- if issubclass(type_, datetime):
461
- stmt = rf"TRY_CAST({dt_cast_statement} as TIMESTAMP)"
462
- return stmt
463
- if issubclass(type_, date):
464
- stmt = rf"TRY_CAST({dt_cast_statement} as DATE)"
465
- return stmt
466
- if issubclass(type_, time):
467
- stmt = rf"TRY_CAST({dt_cast_statement} as TIME)"
468
- return stmt
469
- duck_type = get_duckdb_type_from_annotation(type_)
470
- if duck_type:
471
- stmt = f"TRIM({quoted_name})"
472
- return _cast_as_ddb_type(stmt, type_) if parent_element else stmt
455
+ if issubclass(type_, (date, time)):
456
+ _date_format: str = resilient_get(
457
+ type_, "DATE_FORMAT", "TIME_FORMAT"
458
+ ) or DEFAULT_ISO_FORMATS.get(
459
+ type_, DEFAULT_ISO_FORMATS.get(datetime)
460
+ ) # type: ignore
461
+ dt_cast_statement = rf"CASE WHEN REGEXP_FULL_MATCH(TRIM({quoted_name}), '{datetime_format_to_regex(_date_format)}') THEN TRY_STRPTIME(TRIM({quoted_name}), '{_date_format}') ELSE NULL END" # pylint: disable=C0301
462
+
463
+ # datetime is subclass of date, so needs to be handled first
464
+ if issubclass(type_, datetime):
465
+ stmt = rf"TRY_CAST({dt_cast_statement} as TIMESTAMP)"
466
+ return stmt
467
+ if issubclass(type_, date):
468
+ stmt = rf"TRY_CAST({dt_cast_statement} as DATE)"
469
+ return stmt
470
+ if issubclass(type_, time):
471
+ stmt = rf"TRY_CAST({dt_cast_statement} as TIME)"
472
+ return stmt
473
+ else:
474
+ duck_type = get_duckdb_type_from_annotation(type_)
475
+ if duck_type:
476
+ stmt = f"TRIM({quoted_name})"
477
+ return _cast_as_ddb_type(stmt, type_) if parent_element else stmt
473
478
  raise ValueError(f"No equivalent DuckDB type for {type_annotation!r}")
@@ -593,29 +593,31 @@ def get_spark_cast_statement_from_annotation(
593
593
  raise ValueError(f"dict must be `typing.TypedDict` subclass, got {type_annotation!r}")
594
594
 
595
595
  for type_ in type_annotation.mro():
596
- _date_format: str = getattr( # type: ignore
597
- type_,
598
- "DATE_FORMAT",
599
- DEFAULT_ISO_FORMATS.get(type_, DEFAULT_ISO_FORMATS.get(dt.datetime)),
600
- )
601
-
602
- # pylint: disable=C0301
603
- dt_cast_statement = f"CASE WHEN REGEXP(TRIM({quoted_name}), '{datetime_format_to_regex(_date_format)}') THEN TRY_TO_TIMESTAMP(TRIM({quoted_name}), \"{python_to_java_datetime_format(_date_format)}\") ELSE NULL END" # pylint: disable=C0301
604
- # datetime is subclass of date, so needs to be handled first
605
- if issubclass(type_, dt.datetime):
606
- return (
607
- _cast_as_spark_type(dt_cast_statement, type_)
608
- if parent_element
609
- else dt_cast_statement
610
- )
611
596
  if issubclass(type_, dt.date):
612
- return (
613
- _cast_as_spark_type(dt_cast_statement, type_)
614
- if parent_element
615
- else dt_cast_statement
597
+ _date_format: str = getattr( # type: ignore
598
+ type_,
599
+ "DATE_FORMAT",
600
+ DEFAULT_ISO_FORMATS.get(type_, DEFAULT_ISO_FORMATS.get(dt.datetime)),
616
601
  )
617
- spark_type = get_type_from_annotation(type_)
618
- if spark_type:
619
- stmt = f"TRIM({quoted_name})"
620
- return _cast_as_spark_type(stmt, type_) if parent_element else stmt
602
+
603
+ # pylint: disable=C0301
604
+ dt_cast_statement = f"CASE WHEN REGEXP(TRIM({quoted_name}), '{datetime_format_to_regex(_date_format)}') THEN TRY_TO_TIMESTAMP(TRIM({quoted_name}), \"{python_to_java_datetime_format(_date_format)}\") ELSE NULL END" # pylint: disable=C0301
605
+ # datetime is subclass of date, so needs to be handled first
606
+ if issubclass(type_, dt.datetime):
607
+ return (
608
+ _cast_as_spark_type(dt_cast_statement, type_)
609
+ if parent_element
610
+ else dt_cast_statement
611
+ )
612
+ if issubclass(type_, dt.date):
613
+ return (
614
+ _cast_as_spark_type(dt_cast_statement, type_)
615
+ if parent_element
616
+ else dt_cast_statement
617
+ )
618
+ else:
619
+ spark_type = get_type_from_annotation(type_)
620
+ if spark_type:
621
+ stmt = f"TRIM({quoted_name})"
622
+ return _cast_as_spark_type(stmt, type_) if parent_element else stmt
621
623
  raise ValueError(f"No equivalent Spark type for {type_annotation!r}")
@@ -52,3 +52,23 @@ def chain_get(
52
52
  return result
53
53
 
54
54
  raise exc.TypeNotFoundError(f"Callable or type ({item!r}) not found")
55
+
56
+
57
+ def resilient_get(item: object, *attribute_names: str) -> Any:
58
+ """Given a number of attribute names, try to get attribute value
59
+ sequentially. Returns the first value found, and if no attributes found
60
+ returns None.
61
+
62
+ Args:
63
+ item (object): The object to obtain attributes from (where possible)
64
+ attribute_names (str): The attribute names to search for
65
+
66
+ Returns:
67
+ Any: The first found attribute, otherwise None
68
+ """
69
+ for attr in attribute_names:
70
+ try:
71
+ return getattr(item, attr)
72
+ except AttributeError:
73
+ continue
74
+ return None
@@ -852,7 +852,11 @@ class BaseDVEPipeline:
852
852
  summary_items = er.SummaryItems(
853
853
  submission_status=submission_status,
854
854
  summary_dict=summary_dict,
855
- row_headings=[e.reporting_name for e in ErrorReportCategories],
855
+ row_headings=[
856
+ e.reporting_name
857
+ for e in ErrorReportCategories
858
+ if e != ErrorReportCategories.RECORD_REJECTION
859
+ ],
856
860
  )
857
861
 
858
862
  workbook = er.ExcelFormat(
@@ -153,17 +153,6 @@ class SummaryItems:
153
153
  ), # pylint: disable=C0301
154
154
  ]
155
155
  )
156
- if status not in (
157
- ErrorReportStatus.PROCESSING_FAILED,
158
- ErrorReportStatus.FILE_REJECTION,
159
- ):
160
- summary.append(
161
- [
162
- "",
163
- "Total Number of Records Rejected",
164
- self.submission_status.number_of_records_rejected,
165
- ]
166
- )
167
156
  summary.append(["", ""])
168
157
 
169
158