mangleframes 0.3.0__tar.gz → 0.3.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 (84) hide show
  1. {mangleframes-0.3.0 → mangleframes-0.3.2}/PKG-INFO +1 -1
  2. {mangleframes-0.3.0 → mangleframes-0.3.2}/pyproject.toml +1 -1
  3. {mangleframes-0.3.0 → mangleframes-0.3.2}/python/mangleframes/__init__.py +1 -1
  4. {mangleframes-0.3.0 → mangleframes-0.3.2}/spark-connect/Cargo.toml +1 -1
  5. mangleframes-0.3.2/spark-connect/src/lib.rs +67 -0
  6. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/frontend/package-lock.json +2065 -27
  7. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/frontend/package.json +16 -7
  8. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/frontend/src/components/analysis/Reconciliation.tsx +35 -7
  9. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/frontend/src/components/data/DataGrid.tsx +52 -9
  10. mangleframes-0.3.2/viewer/frontend/src/components/erd/ERDBuilder.tsx +20 -0
  11. mangleframes-0.3.2/viewer/frontend/src/components/erd/ERDCanvas.tsx +257 -0
  12. mangleframes-0.3.2/viewer/frontend/src/components/erd/ERDConfigModal.tsx +86 -0
  13. mangleframes-0.3.2/viewer/frontend/src/components/erd/ERDTableList.tsx +46 -0
  14. mangleframes-0.3.2/viewer/frontend/src/components/erd/ERDToolbar.tsx +87 -0
  15. mangleframes-0.3.2/viewer/frontend/src/components/erd/ERDValidationPanel.tsx +57 -0
  16. mangleframes-0.3.2/viewer/frontend/src/components/erd/TableNode.tsx +56 -0
  17. mangleframes-0.3.2/viewer/frontend/src/components/erd/__tests__/ERDDragDrop.test.tsx +309 -0
  18. mangleframes-0.3.2/viewer/frontend/src/components/erd/index.ts +7 -0
  19. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/frontend/src/components/layout/MainContent.tsx +4 -1
  20. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/frontend/src/components/layout/TabBar.tsx +1 -0
  21. mangleframes-0.3.2/viewer/frontend/src/lib/api.ts +178 -0
  22. mangleframes-0.3.2/viewer/frontend/src/lib/erdValidation.ts +209 -0
  23. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/frontend/src/stores/dataStore.ts +15 -2
  24. mangleframes-0.3.2/viewer/frontend/src/stores/erdStore.ts +162 -0
  25. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/frontend/src/stores/uiStore.ts +1 -1
  26. mangleframes-0.3.2/viewer/frontend/src/test/setup.ts +26 -0
  27. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/frontend/vite.config.ts +7 -0
  28. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/src/dashboard.rs +48 -11
  29. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/src/reconcile_handlers.rs +95 -17
  30. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/src/sql_builder.rs +172 -4
  31. mangleframes-0.3.0/spark-connect/src/lib.rs +0 -15
  32. {mangleframes-0.3.0 → mangleframes-0.3.2}/Cargo.lock +0 -0
  33. {mangleframes-0.3.0 → mangleframes-0.3.2}/Cargo.toml +0 -0
  34. {mangleframes-0.3.0 → mangleframes-0.3.2}/python/mangleframes/alerts.py +0 -0
  35. {mangleframes-0.3.0 → mangleframes-0.3.2}/python/mangleframes/launcher.py +0 -0
  36. {mangleframes-0.3.0 → mangleframes-0.3.2}/python/mangleframes/session.py +0 -0
  37. {mangleframes-0.3.0 → mangleframes-0.3.2}/spark-connect/build.rs +0 -0
  38. {mangleframes-0.3.0 → mangleframes-0.3.2}/spark-connect/proto/spark/connect/base.proto +0 -0
  39. {mangleframes-0.3.0 → mangleframes-0.3.2}/spark-connect/proto/spark/connect/catalog.proto +0 -0
  40. {mangleframes-0.3.0 → mangleframes-0.3.2}/spark-connect/proto/spark/connect/commands.proto +0 -0
  41. {mangleframes-0.3.0 → mangleframes-0.3.2}/spark-connect/proto/spark/connect/common.proto +0 -0
  42. {mangleframes-0.3.0 → mangleframes-0.3.2}/spark-connect/proto/spark/connect/expressions.proto +0 -0
  43. {mangleframes-0.3.0 → mangleframes-0.3.2}/spark-connect/proto/spark/connect/ml.proto +0 -0
  44. {mangleframes-0.3.0 → mangleframes-0.3.2}/spark-connect/proto/spark/connect/ml_common.proto +0 -0
  45. {mangleframes-0.3.0 → mangleframes-0.3.2}/spark-connect/proto/spark/connect/relations.proto +0 -0
  46. {mangleframes-0.3.0 → mangleframes-0.3.2}/spark-connect/proto/spark/connect/types.proto +0 -0
  47. {mangleframes-0.3.0 → mangleframes-0.3.2}/spark-connect/src/client.rs +0 -0
  48. {mangleframes-0.3.0 → mangleframes-0.3.2}/spark-connect/src/error.rs +0 -0
  49. {mangleframes-0.3.0 → mangleframes-0.3.2}/spark-connect/src/proto/spark.connect.rs +0 -0
  50. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/Cargo.toml +0 -0
  51. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/frontend/index.html +0 -0
  52. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/frontend/postcss.config.js +0 -0
  53. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/frontend/src/App.tsx +0 -0
  54. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/frontend/src/components/analysis/JoinAnalyzer.tsx +0 -0
  55. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/frontend/src/components/analysis/SQLEditor.tsx +0 -0
  56. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/frontend/src/components/data/ColumnDropdown.tsx +0 -0
  57. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/frontend/src/components/data/ColumnStats.tsx +0 -0
  58. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/frontend/src/components/data/SchemaView.tsx +0 -0
  59. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/frontend/src/components/layout/ContextPanel.tsx +0 -0
  60. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/frontend/src/components/layout/Layout.tsx +0 -0
  61. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/frontend/src/components/layout/Sidebar.tsx +0 -0
  62. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/frontend/src/components/layout/StatusBar.tsx +0 -0
  63. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/frontend/src/components/layout/TopBar.tsx +0 -0
  64. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/frontend/src/components/quality/AlertBuilder.tsx +0 -0
  65. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/frontend/src/components/quality/QualityDashboard.tsx +0 -0
  66. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/frontend/src/index.css +0 -0
  67. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/frontend/src/main.tsx +0 -0
  68. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/frontend/tailwind.config.js +0 -0
  69. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/frontend/tsconfig.json +0 -0
  70. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/frontend/tsconfig.node.json +0 -0
  71. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/src/alert_handlers.rs +0 -0
  72. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/src/arrow_reader.rs +0 -0
  73. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/src/export.rs +0 -0
  74. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/src/handlers.rs +0 -0
  75. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/src/history_analysis.rs +0 -0
  76. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/src/history_handlers.rs +0 -0
  77. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/src/join_handlers.rs +0 -0
  78. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/src/main.rs +0 -0
  79. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/src/perf.rs +0 -0
  80. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/src/spark_client.rs +0 -0
  81. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/src/stats.rs +0 -0
  82. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/src/test_helpers.rs +0 -0
  83. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/src/web_server.rs +0 -0
  84. {mangleframes-0.3.0 → mangleframes-0.3.2}/viewer/src/websocket.rs +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mangleframes
3
- Version: 0.3.0
3
+ Version: 0.3.2
4
4
  Classifier: Programming Language :: Python :: 3
5
5
  Classifier: Programming Language :: Rust
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "mangleframes"
7
- version = "0.3.0"
7
+ version = "0.3.2"
8
8
  description = "PySpark DataFrame viewer with modern web UI"
9
9
  requires-python = ">=3.12"
10
10
  license = { text = "MIT" }
@@ -32,7 +32,7 @@ from .session import SparkSession, get_proxy_port, get_spark_session
32
32
  if TYPE_CHECKING:
33
33
  from pyspark.sql import DataFrame
34
34
 
35
- __version__ = "0.3.0"
35
+ __version__ = "0.3.2"
36
36
 
37
37
  # Import alert classes for convenience (optional dependency)
38
38
  try:
@@ -6,7 +6,7 @@ description = "Rust client for Apache Spark Connect gRPC protocol"
6
6
 
7
7
  [dependencies]
8
8
  tonic = { version = "0.12", features = ["tls", "tls-roots", "gzip"] }
9
- prost = "0.13"
9
+ prost = { version = "0.13", features = ["no-recursion-limit"] }
10
10
  prost-types = "0.13"
11
11
  tokio = { version = "1", features = ["rt-multi-thread", "macros"] }
12
12
  arrow = { version = "54", features = ["ipc"] }
@@ -0,0 +1,67 @@
1
+ //! Spark Connect Rust client for Apache Spark gRPC protocol.
2
+ //!
3
+ //! This crate provides a Rust client for connecting to Spark clusters via the
4
+ //! Spark Connect gRPC protocol, with specific support for Databricks.
5
+
6
+ pub mod client;
7
+ pub mod error;
8
+
9
+ #[allow(clippy::all)]
10
+ mod proto {
11
+ include!("proto/spark.connect.rs");
12
+ }
13
+
14
+ pub use client::{ColumnSchema, SparkConnectClient};
15
+ pub use error::SparkConnectError;
16
+
17
+ #[cfg(test)]
18
+ mod tests {
19
+ use super::proto::{relation, Limit, Relation};
20
+ use prost::Message;
21
+
22
+ /// Build a deeply nested Relation with `depth` levels of Limit operations.
23
+ fn build_nested_relation(depth: usize) -> Relation {
24
+ let mut current = Relation {
25
+ common: None,
26
+ rel_type: None,
27
+ };
28
+
29
+ for i in 0..depth {
30
+ current = Relation {
31
+ common: None,
32
+ rel_type: Some(relation::RelType::Limit(Box::new(Limit {
33
+ input: Some(Box::new(current)),
34
+ limit: i as i32,
35
+ }))),
36
+ };
37
+ }
38
+
39
+ current
40
+ }
41
+
42
+ /// Verifies the no-recursion-limit feature works by encoding/decoding
43
+ /// a deeply nested protobuf message (150+ levels exceeds old 100 limit).
44
+ #[test]
45
+ fn test_deeply_nested_relation_decodes() {
46
+ let depth = 150;
47
+ let relation = build_nested_relation(depth);
48
+
49
+ let encoded = relation.encode_to_vec();
50
+ let decoded = Relation::decode(encoded.as_slice())
51
+ .expect("should decode deeply nested relation without recursion limit");
52
+
53
+ // Verify the structure by walking down to confirm depth
54
+ let mut count = 0;
55
+ let mut current = &decoded;
56
+ while let Some(relation::RelType::Limit(limit)) = &current.rel_type {
57
+ count += 1;
58
+ if let Some(input) = &limit.input {
59
+ current = input;
60
+ } else {
61
+ break;
62
+ }
63
+ }
64
+
65
+ assert_eq!(count, depth, "decoded relation should have correct nesting depth");
66
+ }
67
+ }