wpipe 2.1.2__tar.gz → 2.1.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 (129) hide show
  1. {wpipe-2.1.2 → wpipe-2.1.4}/PKG-INFO +1 -1
  2. {wpipe-2.1.2 → wpipe-2.1.4}/pyproject.toml +1 -1
  3. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/pipe/pipe.py +31 -6
  4. {wpipe-2.1.2 → wpipe-2.1.4}/.gitignore +0 -0
  5. {wpipe-2.1.2 → wpipe-2.1.4}/LICENSE +0 -0
  6. {wpipe-2.1.2 → wpipe-2.1.4}/README.md +0 -0
  7. {wpipe-2.1.2 → wpipe-2.1.4}/examples/01_basic_pipeline/01_simple_function/README.md +0 -0
  8. {wpipe-2.1.2 → wpipe-2.1.4}/examples/01_basic_pipeline/01_simple_function/example.py +0 -0
  9. {wpipe-2.1.2 → wpipe-2.1.4}/examples/01_basic_pipeline/02_class_steps/README.md +0 -0
  10. {wpipe-2.1.2 → wpipe-2.1.4}/examples/01_basic_pipeline/02_class_steps/example.py +0 -0
  11. {wpipe-2.1.2 → wpipe-2.1.4}/examples/01_basic_pipeline/03_mixed_steps/README.md +0 -0
  12. {wpipe-2.1.2 → wpipe-2.1.4}/examples/01_basic_pipeline/03_mixed_steps/example.py +0 -0
  13. {wpipe-2.1.2 → wpipe-2.1.4}/examples/01_basic_pipeline/04_default_values/README.md +0 -0
  14. {wpipe-2.1.2 → wpipe-2.1.4}/examples/01_basic_pipeline/04_default_values/example.py +0 -0
  15. {wpipe-2.1.2 → wpipe-2.1.4}/examples/01_basic_pipeline/05_args_kwargs/README.md +0 -0
  16. {wpipe-2.1.2 → wpipe-2.1.4}/examples/01_basic_pipeline/05_args_kwargs/example.py +0 -0
  17. {wpipe-2.1.2 → wpipe-2.1.4}/examples/01_basic_pipeline/06_dict_processing/README.md +0 -0
  18. {wpipe-2.1.2 → wpipe-2.1.4}/examples/01_basic_pipeline/06_dict_processing/example.py +0 -0
  19. {wpipe-2.1.2 → wpipe-2.1.4}/examples/01_basic_pipeline/07_multiple_runs/README.md +0 -0
  20. {wpipe-2.1.2 → wpipe-2.1.4}/examples/01_basic_pipeline/07_multiple_runs/example.py +0 -0
  21. {wpipe-2.1.2 → wpipe-2.1.4}/examples/01_basic_pipeline/08_data_aggregation/README.md +0 -0
  22. {wpipe-2.1.2 → wpipe-2.1.4}/examples/01_basic_pipeline/08_data_aggregation/example.py +0 -0
  23. {wpipe-2.1.2 → wpipe-2.1.4}/examples/01_basic_pipeline/09_empty_data/README.md +0 -0
  24. {wpipe-2.1.2 → wpipe-2.1.4}/examples/01_basic_pipeline/09_empty_data/example.py +0 -0
  25. {wpipe-2.1.2 → wpipe-2.1.4}/examples/01_basic_pipeline/10_lambda_steps/README.md +0 -0
  26. {wpipe-2.1.2 → wpipe-2.1.4}/examples/01_basic_pipeline/10_lambda_steps/example.py +0 -0
  27. {wpipe-2.1.2 → wpipe-2.1.4}/examples/01_basic_pipeline/11_decorator_steps/README.md +0 -0
  28. {wpipe-2.1.2 → wpipe-2.1.4}/examples/01_basic_pipeline/11_decorator_steps/example.py +0 -0
  29. {wpipe-2.1.2 → wpipe-2.1.4}/examples/01_basic_pipeline/12_context_manager/README.md +0 -0
  30. {wpipe-2.1.2 → wpipe-2.1.4}/examples/01_basic_pipeline/12_context_manager/example.py +0 -0
  31. {wpipe-2.1.2 → wpipe-2.1.4}/examples/01_basic_pipeline/13_async_pipeline/README.md +0 -0
  32. {wpipe-2.1.2 → wpipe-2.1.4}/examples/01_basic_pipeline/13_async_pipeline/example.py +0 -0
  33. {wpipe-2.1.2 → wpipe-2.1.4}/examples/01_basic_pipeline/14_pipeline_chaining/README.md +0 -0
  34. {wpipe-2.1.2 → wpipe-2.1.4}/examples/01_basic_pipeline/14_pipeline_chaining/example.py +0 -0
  35. {wpipe-2.1.2 → wpipe-2.1.4}/examples/01_basic_pipeline/15_pipeline_clone/README.md +0 -0
  36. {wpipe-2.1.2 → wpipe-2.1.4}/examples/01_basic_pipeline/15_pipeline_clone/example.py +0 -0
  37. {wpipe-2.1.2 → wpipe-2.1.4}/examples/01_basic_pipeline/16_LogGestor/example.py +0 -0
  38. {wpipe-2.1.2 → wpipe-2.1.4}/examples/01_basic_pipeline/README.md +0 -0
  39. {wpipe-2.1.2 → wpipe-2.1.4}/examples/15_export/01_json/export_json.py +0 -0
  40. {wpipe-2.1.2 → wpipe-2.1.4}/examples/15_export/README.md +0 -0
  41. {wpipe-2.1.2 → wpipe-2.1.4}/test/__init__.py +0 -0
  42. {wpipe-2.1.2 → wpipe-2.1.4}/test/test_api_pipeline.py +0 -0
  43. {wpipe-2.1.2 → wpipe-2.1.4}/test/test_async.py +0 -0
  44. {wpipe-2.1.2 → wpipe-2.1.4}/test/test_basic_pipeline.py +0 -0
  45. {wpipe-2.1.2 → wpipe-2.1.4}/test/test_checkpoint.py +0 -0
  46. {wpipe-2.1.2 → wpipe-2.1.4}/test/test_core.py +0 -0
  47. {wpipe-2.1.2 → wpipe-2.1.4}/test/test_dashboard_and_monitor.py +0 -0
  48. {wpipe-2.1.2 → wpipe-2.1.4}/test/test_export.py +0 -0
  49. {wpipe-2.1.2 → wpipe-2.1.4}/test/test_misc.py +0 -0
  50. {wpipe-2.1.2 → wpipe-2.1.4}/test/test_nested_pipelines.py +0 -0
  51. {wpipe-2.1.2 → wpipe-2.1.4}/test/test_pipe.py +0 -0
  52. {wpipe-2.1.2 → wpipe-2.1.4}/test/test_pipe_async.py +0 -0
  53. {wpipe-2.1.2 → wpipe-2.1.4}/test/test_pipeline_config.py +0 -0
  54. {wpipe-2.1.2 → wpipe-2.1.4}/test/test_sqlite.py +0 -0
  55. {wpipe-2.1.2 → wpipe-2.1.4}/test/test_tracking.py +0 -0
  56. {wpipe-2.1.2 → wpipe-2.1.4}/test/test_util.py +0 -0
  57. {wpipe-2.1.2 → wpipe-2.1.4}/test/test_yaml_config.py +0 -0
  58. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/README.md +0 -0
  59. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/__init__.py +0 -0
  60. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/api_client/__init__.py +0 -0
  61. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/api_client/api_client.py +0 -0
  62. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/checkpoint/README.md +0 -0
  63. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/checkpoint/__init__.py +0 -0
  64. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/checkpoint/checkpoint.py +0 -0
  65. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/composition/README.md +0 -0
  66. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/composition/__init__.py +0 -0
  67. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/composition/pipeline_step.py +0 -0
  68. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/dashboard/__init__.py +0 -0
  69. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/dashboard/__main__.py +0 -0
  70. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/dashboard/main.py +0 -0
  71. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/dashboard/static/dashboard.js +0 -0
  72. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/dashboard/static/styles.css +0 -0
  73. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/dashboard/templates/base.html +0 -0
  74. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/dashboard/templates/tabs/alerts.html +0 -0
  75. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/dashboard/templates/tabs/analytics.html +0 -0
  76. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/dashboard/templates/tabs/data.html +0 -0
  77. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/dashboard/templates/tabs/events.html +0 -0
  78. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/dashboard/templates/tabs/graph.html +0 -0
  79. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/dashboard/templates/tabs/pipelines.html +0 -0
  80. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/dashboard/templates/tabs/states.html +0 -0
  81. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/dashboard/templates/tabs/timeline.html +0 -0
  82. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/decorators/README.md +0 -0
  83. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/decorators/__init__.py +0 -0
  84. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/decorators/step.py +0 -0
  85. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/exception/__init__.py +0 -0
  86. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/exception/api_error.py +0 -0
  87. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/export/README.md +0 -0
  88. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/export/__init__.py +0 -0
  89. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/export/exporter.py +0 -0
  90. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/log/__init__.py +0 -0
  91. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/log/log.py +0 -0
  92. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/parallel/README.md +0 -0
  93. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/parallel/__init__.py +0 -0
  94. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/parallel/executor.py +0 -0
  95. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/pipe/__init__.py +0 -0
  96. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/pipe/components/__init__.py +0 -0
  97. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/pipe/components/constants.py +0 -0
  98. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/pipe/components/logic_blocks.py +0 -0
  99. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/pipe/components/logic_blocks_async.py +0 -0
  100. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/pipe/components/metrics.py +0 -0
  101. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/pipe/components/progress.py +0 -0
  102. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/pipe/components/reporting.py +0 -0
  103. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/pipe/pipe_async.py +0 -0
  104. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/pipe/pipe_async_minimal.py +0 -0
  105. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/ram/__init__.py +0 -0
  106. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/ram/ram.py +0 -0
  107. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/resource_monitor/README.md +0 -0
  108. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/resource_monitor/__init__.py +0 -0
  109. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/resource_monitor/monitor.py +0 -0
  110. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/sqlite/Sqlite.py +0 -0
  111. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/sqlite/__init__.py +0 -0
  112. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/sqlite/tables_dto/__init__.py +0 -0
  113. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/sqlite/tables_dto/log_gestor_model.py +0 -0
  114. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/sqlite/tables_dto/records.py +0 -0
  115. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/sqlite/tables_dto/tracker_models.py +0 -0
  116. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/timeout/README.md +0 -0
  117. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/timeout/__init__.py +0 -0
  118. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/timeout/timeout.py +0 -0
  119. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/tracking/__init__.py +0 -0
  120. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/tracking/alerts.py +0 -0
  121. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/tracking/analysis.py +0 -0
  122. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/tracking/queries.py +0 -0
  123. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/tracking/tracker.py +0 -0
  124. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/type_hinting/README.md +0 -0
  125. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/type_hinting/__init__.py +0 -0
  126. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/type_hinting/validators.py +0 -0
  127. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/util/__init__.py +0 -0
  128. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/util/transform.py +0 -0
  129. {wpipe-2.1.2 → wpipe-2.1.4}/wpipe/util/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wpipe
3
- Version: 2.1.2
3
+ Version: 2.1.4
4
4
  Summary: Pipeline library with API integration for task orchestration and execution tracking
5
5
  Project-URL: Homepage, https://github.com/wisrovi/wpipe
6
6
  Project-URL: Documentation, https://wpipe.readthedocs.io/en/latest/
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "wpipe"
7
- version = "2.1.2"
7
+ version = "2.1.4"
8
8
  authors = [
9
9
  { name = "William Steve Rodriguez Villamizar", email = "wisrovi.rodriguez@gmail.com" }
10
10
  ]
@@ -698,15 +698,23 @@ class Pipeline(APIClient):
698
698
  raise
699
699
  except Exception as e: # pylint: disable=broad-exception-caught
700
700
  last_exception = e
701
- tb = traceback.extract_tb(e.__traceback__)
702
- last_trace = tb[-1] if tb else None
701
+ tb_list = traceback.extract_tb(e.__traceback__)
702
+
703
+ # Find the most relevant frame (user code instead of library code)
704
+ # We look for the last frame that doesn't contain 'site-packages' or 'wpipe'
705
+ relevant_frame = tb_list[-1]
706
+ for frame in reversed(tb_list):
707
+ if "site-packages" not in frame.filename and "wpipe/pipe" not in frame.filename:
708
+ relevant_frame = frame
709
+ break
710
+
703
711
  error_details = {
704
712
  "step_name": name,
705
713
  "error_message": str(e),
706
714
  "error_traceback": traceback.format_exc(),
707
- "file_path": last_trace.filename if last_trace else "unknown",
708
- "line_number": last_trace.lineno if last_trace else 0,
709
- "method": last_trace.name if last_trace else "unknown",
715
+ "file_path": relevant_frame.filename,
716
+ "line_number": relevant_frame.lineno,
717
+ "method": relevant_frame.name,
710
718
  "timestamp": datetime.now().isoformat(),
711
719
  "attempt": attempt + 1,
712
720
  }
@@ -794,6 +802,18 @@ class Pipeline(APIClient):
794
802
  try:
795
803
  current_group = f"group_{tracked_id or 'none'}"
796
804
  clean_self = self
805
+
806
+ # Check if data is picklable if using processes
807
+ if is_multiprocess:
808
+ import pickle
809
+ try:
810
+ pickle.dumps(loop_data)
811
+ except (pickle.PicklingError, TypeError, AttributeError) as e:
812
+ if self.verbose:
813
+ print(f"[WARNING] Data not picklable: {e}. Falling back to THREADS.")
814
+ is_multiprocess = False
815
+ ExecutorClass = ThreadPoolExecutor
816
+
797
817
  if is_multiprocess:
798
818
  import copy as cp # pylint: disable=import-outside-toplevel
799
819
  clean_self = cp.copy(self)
@@ -860,7 +880,12 @@ class Pipeline(APIClient):
860
880
  step_id = item[3]
861
881
  elif callable(item):
862
882
  func = item
863
- name = getattr(item, "NAME", getattr(item, "__name__", "task"))
883
+ # Look for step name in priorities: NAME attribute > __name__ > class name
884
+ name = getattr(item, "NAME", getattr(item, "__name__", item.__class__.__name__))
885
+ if name == "task" or name == "function":
886
+ # Fallback to a more descriptive name if possible
887
+ name = item.__class__.__name__
888
+
864
889
  version = getattr(item, "VERSION", "v1.0")
865
890
  step_meta = getattr(item, "_wpipe_metadata", {})
866
891
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes