uipath-core 0.3.0__tar.gz → 0.3.1__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 (65) hide show
  1. {uipath_core-0.3.0 → uipath_core-0.3.1}/PKG-INFO +1 -1
  2. {uipath_core-0.3.0 → uipath_core-0.3.1}/pyproject.toml +1 -1
  3. {uipath_core-0.3.0 → uipath_core-0.3.1}/src/uipath/core/guardrails/guardrails.py +34 -2
  4. uipath_core-0.3.1/tests/guardrails/test_guardrails_models.py +53 -0
  5. {uipath_core-0.3.0 → uipath_core-0.3.1}/uv.lock +1 -1
  6. {uipath_core-0.3.0 → uipath_core-0.3.1}/.cursorrules +0 -0
  7. {uipath_core-0.3.0 → uipath_core-0.3.1}/.editorconfig +0 -0
  8. {uipath_core-0.3.0 → uipath_core-0.3.1}/.gitattributes +0 -0
  9. {uipath_core-0.3.0 → uipath_core-0.3.1}/.github/workflows/cd.yml +0 -0
  10. {uipath_core-0.3.0 → uipath_core-0.3.1}/.github/workflows/ci.yml +0 -0
  11. {uipath_core-0.3.0 → uipath_core-0.3.1}/.github/workflows/commitlint.yml +0 -0
  12. {uipath_core-0.3.0 → uipath_core-0.3.1}/.github/workflows/lint.yml +0 -0
  13. {uipath_core-0.3.0 → uipath_core-0.3.1}/.github/workflows/publish-dev.yml +0 -0
  14. {uipath_core-0.3.0 → uipath_core-0.3.1}/.github/workflows/test.yml +0 -0
  15. {uipath_core-0.3.0 → uipath_core-0.3.1}/.gitignore +0 -0
  16. {uipath_core-0.3.0 → uipath_core-0.3.1}/.pre-commit-config.yaml +0 -0
  17. {uipath_core-0.3.0 → uipath_core-0.3.1}/.python-version +0 -0
  18. {uipath_core-0.3.0 → uipath_core-0.3.1}/.vscode/extensions.json +0 -0
  19. {uipath_core-0.3.0 → uipath_core-0.3.1}/.vscode/launch.json +0 -0
  20. {uipath_core-0.3.0 → uipath_core-0.3.1}/.vscode/settings.json +0 -0
  21. {uipath_core-0.3.0 → uipath_core-0.3.1}/CONTRIBUTING.md +0 -0
  22. {uipath_core-0.3.0 → uipath_core-0.3.1}/LICENSE +0 -0
  23. {uipath_core-0.3.0 → uipath_core-0.3.1}/README.md +0 -0
  24. {uipath_core-0.3.0 → uipath_core-0.3.1}/justfile +0 -0
  25. {uipath_core-0.3.0 → uipath_core-0.3.1}/src/uipath/core/__init__.py +0 -0
  26. {uipath_core-0.3.0 → uipath_core-0.3.1}/src/uipath/core/chat/__init__.py +0 -0
  27. {uipath_core-0.3.0 → uipath_core-0.3.1}/src/uipath/core/chat/async_stream.py +0 -0
  28. {uipath_core-0.3.0 → uipath_core-0.3.1}/src/uipath/core/chat/citation.py +0 -0
  29. {uipath_core-0.3.0 → uipath_core-0.3.1}/src/uipath/core/chat/content.py +0 -0
  30. {uipath_core-0.3.0 → uipath_core-0.3.1}/src/uipath/core/chat/conversation.py +0 -0
  31. {uipath_core-0.3.0 → uipath_core-0.3.1}/src/uipath/core/chat/error.py +0 -0
  32. {uipath_core-0.3.0 → uipath_core-0.3.1}/src/uipath/core/chat/event.py +0 -0
  33. {uipath_core-0.3.0 → uipath_core-0.3.1}/src/uipath/core/chat/exchange.py +0 -0
  34. {uipath_core-0.3.0 → uipath_core-0.3.1}/src/uipath/core/chat/interrupt.py +0 -0
  35. {uipath_core-0.3.0 → uipath_core-0.3.1}/src/uipath/core/chat/message.py +0 -0
  36. {uipath_core-0.3.0 → uipath_core-0.3.1}/src/uipath/core/chat/meta.py +0 -0
  37. {uipath_core-0.3.0 → uipath_core-0.3.1}/src/uipath/core/chat/tool.py +0 -0
  38. {uipath_core-0.3.0 → uipath_core-0.3.1}/src/uipath/core/errors/__init__.py +0 -0
  39. {uipath_core-0.3.0 → uipath_core-0.3.1}/src/uipath/core/errors/errors.py +0 -0
  40. {uipath_core-0.3.0 → uipath_core-0.3.1}/src/uipath/core/guardrails/__init__.py +0 -0
  41. {uipath_core-0.3.0 → uipath_core-0.3.1}/src/uipath/core/guardrails/_deterministic_guardrails_service.py +0 -0
  42. {uipath_core-0.3.0 → uipath_core-0.3.1}/src/uipath/core/guardrails/_evaluators.py +0 -0
  43. {uipath_core-0.3.0 → uipath_core-0.3.1}/src/uipath/core/py.typed +0 -0
  44. {uipath_core-0.3.0 → uipath_core-0.3.1}/src/uipath/core/serialization/__init__.py +0 -0
  45. {uipath_core-0.3.0 → uipath_core-0.3.1}/src/uipath/core/serialization/json.py +0 -0
  46. {uipath_core-0.3.0 → uipath_core-0.3.1}/src/uipath/core/tracing/__init__.py +0 -0
  47. {uipath_core-0.3.0 → uipath_core-0.3.1}/src/uipath/core/tracing/_utils.py +0 -0
  48. {uipath_core-0.3.0 → uipath_core-0.3.1}/src/uipath/core/tracing/decorators.py +0 -0
  49. {uipath_core-0.3.0 → uipath_core-0.3.1}/src/uipath/core/tracing/exporters.py +0 -0
  50. {uipath_core-0.3.0 → uipath_core-0.3.1}/src/uipath/core/tracing/processors.py +0 -0
  51. {uipath_core-0.3.0 → uipath_core-0.3.1}/src/uipath/core/tracing/span_utils.py +0 -0
  52. {uipath_core-0.3.0 → uipath_core-0.3.1}/src/uipath/core/tracing/trace_manager.py +0 -0
  53. {uipath_core-0.3.0 → uipath_core-0.3.1}/src/uipath/core/tracing/types.py +0 -0
  54. {uipath_core-0.3.0 → uipath_core-0.3.1}/tests/__init__.py +0 -0
  55. {uipath_core-0.3.0 → uipath_core-0.3.1}/tests/conftest.py +0 -0
  56. {uipath_core-0.3.0 → uipath_core-0.3.1}/tests/guardrails/test_deterministic_guardrails_service.py +0 -0
  57. {uipath_core-0.3.0 → uipath_core-0.3.1}/tests/serialization/test_json.py +0 -0
  58. {uipath_core-0.3.0 → uipath_core-0.3.1}/tests/tracing/test_external_integration.py +0 -0
  59. {uipath_core-0.3.0 → uipath_core-0.3.1}/tests/tracing/test_serialization.py +0 -0
  60. {uipath_core-0.3.0 → uipath_core-0.3.1}/tests/tracing/test_span_filtering.py +0 -0
  61. {uipath_core-0.3.0 → uipath_core-0.3.1}/tests/tracing/test_span_nesting.py +0 -0
  62. {uipath_core-0.3.0 → uipath_core-0.3.1}/tests/tracing/test_span_registry.py +0 -0
  63. {uipath_core-0.3.0 → uipath_core-0.3.1}/tests/tracing/test_trace_manager.py +0 -0
  64. {uipath_core-0.3.0 → uipath_core-0.3.1}/tests/tracing/test_traced.py +0 -0
  65. {uipath_core-0.3.0 → uipath_core-0.3.1}/tests/tracing/test_tracing_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: uipath-core
3
- Version: 0.3.0
3
+ Version: 0.3.1
4
4
  Summary: UiPath Core abstractions
5
5
  Project-URL: Homepage, https://uipath.com
6
6
  Project-URL: Repository, https://github.com/UiPath/uipath-core-python
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "uipath-core"
3
- version = "0.3.0"
3
+ version = "0.3.1"
4
4
  description = "UiPath Core abstractions"
5
5
  readme = { file = "README.md", content-type = "text/markdown" }
6
6
  requires-python = ">=3.11"
@@ -1,9 +1,18 @@
1
1
  """Guardrails models for UiPath Platform."""
2
2
 
3
3
  from enum import Enum
4
- from typing import Annotated, Callable, Literal
4
+ from typing import Annotated, Any, Callable, Literal
5
5
 
6
- from pydantic import BaseModel, ConfigDict, Field
6
+ from pydantic import BaseModel, ConfigDict, Field, field_validator
7
+
8
+
9
+ def _decapitalize_first_letter(s: str) -> str:
10
+ """Convert first letter to lowercase (e.g., 'SimpleText' -> 'simpleText')."""
11
+ if not s or len(s) == 0:
12
+ return s
13
+ if len(s) == 1:
14
+ return s.lower()
15
+ return s[0].lower() + s[1:]
7
16
 
8
17
 
9
18
  class GuardrailValidationResultType(str, Enum):
@@ -56,6 +65,12 @@ class FieldReference(BaseModel):
56
65
 
57
66
  model_config = ConfigDict(populate_by_name=True, extra="allow")
58
67
 
68
+ @field_validator("source", mode="before")
69
+ @classmethod
70
+ def normalize_type(cls, v: Any) -> Any:
71
+ """Normalize type by decapitalizing first letter."""
72
+ return _decapitalize_first_letter(v) if isinstance(v, str) else v
73
+
59
74
 
60
75
  class SelectorType(str, Enum):
61
76
  """Selector type enumeration."""
@@ -72,6 +87,17 @@ class AllFieldsSelector(BaseModel):
72
87
 
73
88
  model_config = ConfigDict(populate_by_name=True, extra="allow")
74
89
 
90
+ @field_validator("sources", mode="before")
91
+ @classmethod
92
+ def normalize_sources(cls, v: Any) -> Any:
93
+ """Normalize sources by decapitalizing first letter of each item."""
94
+ if isinstance(v, list):
95
+ return [
96
+ _decapitalize_first_letter(item) if isinstance(item, str) else item
97
+ for item in v
98
+ ]
99
+ return v
100
+
75
101
 
76
102
  class SpecificFieldsSelector(BaseModel):
77
103
  """Specific fields selector."""
@@ -128,6 +154,12 @@ class UniversalRule(BaseModel):
128
154
 
129
155
  model_config = ConfigDict(populate_by_name=True, extra="allow")
130
156
 
157
+ @field_validator("apply_to", mode="before")
158
+ @classmethod
159
+ def normalize_type(cls, v: Any) -> Any:
160
+ """Normalize type by decapitalizing first letter."""
161
+ return _decapitalize_first_letter(v) if isinstance(v, str) else v
162
+
131
163
 
132
164
  class NumberRule(BaseModel):
133
165
  """Number rule model."""
@@ -0,0 +1,53 @@
1
+ """Tests for guardrails models normalization validators."""
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ from uipath.core.guardrails import (
6
+ AllFieldsSelector,
7
+ FieldReference,
8
+ FieldSource,
9
+ )
10
+
11
+ if TYPE_CHECKING:
12
+ pass
13
+
14
+
15
+ class TestGuardrailsModelsNormalization:
16
+ """Test guardrails models field normalization."""
17
+
18
+ def test_field_reference_normalizes_capitalized_source(
19
+ self,
20
+ ) -> None:
21
+ """Test that FieldReference normalizes capitalized source values to lowercase."""
22
+ # Create FieldReference with capitalized "Input" - should normalize to FieldSource.INPUT
23
+ field_ref = FieldReference(path="testField", source="Input") # type: ignore[arg-type]
24
+ assert field_ref.source == FieldSource.INPUT
25
+
26
+ # Create FieldReference with capitalized "Output" - should normalize to FieldSource.OUTPUT
27
+ field_ref = FieldReference(path="testField", source="Output") # type: ignore[arg-type]
28
+ assert field_ref.source == FieldSource.OUTPUT
29
+
30
+ # Create FieldReference with lowercase "input" - should work as-is
31
+ field_ref = FieldReference(path="testField", source="input") # type: ignore[arg-type]
32
+ assert field_ref.source == FieldSource.INPUT
33
+
34
+ def test_all_fields_selector_normalizes_capitalized_sources(
35
+ self,
36
+ ) -> None:
37
+ """Test that AllFieldsSelector normalizes capitalized source values in the list."""
38
+ # Create AllFieldsSelector with capitalized "Input" and "Output" - should normalize
39
+ selector = AllFieldsSelector(
40
+ selector_type="all",
41
+ sources=["Input", "Output"], # type: ignore[list-item]
42
+ )
43
+ assert FieldSource.INPUT in selector.sources
44
+ assert FieldSource.OUTPUT in selector.sources
45
+ assert len(selector.sources) == 2
46
+
47
+ # Create AllFieldsSelector with mixed case - should normalize all
48
+ selector = AllFieldsSelector(
49
+ selector_type="all",
50
+ sources=["Input", "output"], # type: ignore[list-item]
51
+ )
52
+ assert FieldSource.INPUT in selector.sources
53
+ assert FieldSource.OUTPUT in selector.sources
@@ -991,7 +991,7 @@ wheels = [
991
991
 
992
992
  [[package]]
993
993
  name = "uipath-core"
994
- version = "0.3.0"
994
+ version = "0.3.1"
995
995
  source = { editable = "." }
996
996
  dependencies = [
997
997
  { name = "opentelemetry-instrumentation" },
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