Skip to content

Commit 74189f8

Browse files
tpellissierclaude
andcommitted
Align relationship API with SDK redesign patterns
- Rename solution_unique_name parameter to solution (shorter, consistent) - Add keyword-only separator (*) for optional parameters - Update tests to use new parameter style Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 7643640 commit 74189f8

File tree

4 files changed

+32
-29
lines changed

4 files changed

+32
-29
lines changed

src/PowerPlatform/Dataverse/client.py

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -711,7 +711,8 @@ def create_one_to_many_relationship(
711711
self,
712712
lookup: LookupAttributeMetadata,
713713
relationship: OneToManyRelationshipMetadata,
714-
solution_unique_name: Optional[str] = None,
714+
*,
715+
solution: Optional[str] = None,
715716
) -> Dict[str, Any]:
716717
"""
717718
Create a one-to-many relationship between tables.
@@ -723,8 +724,8 @@ def create_one_to_many_relationship(
723724
:type lookup: ~PowerPlatform.Dataverse.models.metadata.LookupAttributeMetadata
724725
:param relationship: Metadata defining the relationship.
725726
:type relationship: ~PowerPlatform.Dataverse.models.metadata.OneToManyRelationshipMetadata
726-
:param solution_unique_name: Optional solution to add relationship to.
727-
:type solution_unique_name: :class:`str` or None
727+
:param solution: Optional solution unique name to add relationship to.
728+
:type solution: :class:`str` or None
728729
729730
:return: Dictionary with relationship_id, lookup_schema_name, and related metadata.
730731
:rtype: :class:`dict`
@@ -770,13 +771,14 @@ def create_one_to_many_relationship(
770771
return od._create_one_to_many_relationship(
771772
lookup,
772773
relationship,
773-
solution_unique_name,
774+
solution,
774775
)
775776

776777
def create_many_to_many_relationship(
777778
self,
778779
relationship: ManyToManyRelationshipMetadata,
779-
solution_unique_name: Optional[str] = None,
780+
*,
781+
solution: Optional[str] = None,
780782
) -> Dict[str, Any]:
781783
"""
782784
Create a many-to-many relationship between tables.
@@ -786,8 +788,8 @@ def create_many_to_many_relationship(
786788
787789
:param relationship: Metadata defining the many-to-many relationship.
788790
:type relationship: ~PowerPlatform.Dataverse.models.metadata.ManyToManyRelationshipMetadata
789-
:param solution_unique_name: Optional solution to add relationship to.
790-
:type solution_unique_name: :class:`str` or None
791+
:param solution: Optional solution unique name to add relationship to.
792+
:type solution: :class:`str` or None
791793
792794
:return: Dictionary with relationship_id, relationship_schema_name, and entity names.
793795
:rtype: :class:`dict`
@@ -814,7 +816,7 @@ def create_many_to_many_relationship(
814816
with self._scoped_odata() as od:
815817
return od._create_many_to_many_relationship(
816818
relationship,
817-
solution_unique_name,
819+
solution,
818820
)
819821

820822
def delete_relationship(self, relationship_id: str) -> None:
@@ -865,11 +867,12 @@ def create_lookup_field(
865867
referencing_table: str,
866868
lookup_field_name: str,
867869
referenced_table: str,
870+
*,
868871
display_name: Optional[str] = None,
869872
description: Optional[str] = None,
870873
required: bool = False,
871874
cascade_delete: str = "RemoveLink",
872-
solution_unique_name: Optional[str] = None,
875+
solution: Optional[str] = None,
873876
language_code: int = 1033,
874877
) -> Dict[str, Any]:
875878
"""
@@ -893,8 +896,8 @@ def create_lookup_field(
893896
:param cascade_delete: Delete behavior (``"RemoveLink"``, ``"Cascade"``, ``"Restrict"``).
894897
Defaults to ``"RemoveLink"``.
895898
:type cascade_delete: :class:`str`
896-
:param solution_unique_name: Optional solution to add the relationship to.
897-
:type solution_unique_name: :class:`str` or None
899+
:param solution: Optional solution unique name to add the relationship to.
900+
:type solution: :class:`str` or None
898901
:param language_code: Language code for labels. Defaults to 1033 (English).
899902
:type language_code: :class:`int`
900903
@@ -945,7 +948,7 @@ def create_lookup_field(
945948
cascade_configuration=CascadeConfiguration(delete=cascade_delete),
946949
)
947950

948-
return self.create_one_to_many_relationship(lookup, relationship, solution_unique_name)
951+
return self.create_one_to_many_relationship(lookup, relationship, solution=solution)
949952

950953

951954
__all__ = ["DataverseClient"]

src/PowerPlatform/Dataverse/data/_relationships.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ def _create_one_to_many_relationship(
2727
self,
2828
lookup,
2929
relationship,
30-
solution_unique_name: Optional[str] = None,
30+
solution: Optional[str] = None,
3131
) -> Dict[str, Any]:
3232
"""
3333
Create a one-to-many relationship with lookup attribute.
@@ -38,8 +38,8 @@ def _create_one_to_many_relationship(
3838
:type lookup: ~PowerPlatform.Dataverse.models.metadata.LookupAttributeMetadata
3939
:param relationship: Relationship metadata (OneToManyRelationshipMetadata instance).
4040
:type relationship: ~PowerPlatform.Dataverse.models.metadata.OneToManyRelationshipMetadata
41-
:param solution_unique_name: Optional solution to add the relationship to.
42-
:type solution_unique_name: ``str`` | ``None``
41+
:param solution: Optional solution unique name to add the relationship to.
42+
:type solution: ``str`` | ``None``
4343
4444
:return: Dictionary with relationship_id, attribute_id, and schema names.
4545
:rtype: ``dict[str, Any]``
@@ -53,8 +53,8 @@ def _create_one_to_many_relationship(
5353
payload["Lookup"] = lookup.to_dict()
5454

5555
headers = self._headers().copy()
56-
if solution_unique_name:
57-
headers["MSCRM.SolutionUniqueName"] = solution_unique_name
56+
if solution:
57+
headers["MSCRM.SolutionUniqueName"] = solution
5858

5959
r = self._request("post", url, headers=headers, json=payload)
6060

@@ -72,7 +72,7 @@ def _create_one_to_many_relationship(
7272
def _create_many_to_many_relationship(
7373
self,
7474
relationship,
75-
solution_unique_name: Optional[str] = None,
75+
solution: Optional[str] = None,
7676
) -> Dict[str, Any]:
7777
"""
7878
Create a many-to-many relationship.
@@ -81,8 +81,8 @@ def _create_many_to_many_relationship(
8181
8282
:param relationship: Relationship metadata (ManyToManyRelationshipMetadata instance).
8383
:type relationship: ~PowerPlatform.Dataverse.models.metadata.ManyToManyRelationshipMetadata
84-
:param solution_unique_name: Optional solution to add the relationship to.
85-
:type solution_unique_name: ``str`` | ``None``
84+
:param solution: Optional solution unique name to add the relationship to.
85+
:type solution: ``str`` | ``None``
8686
8787
:return: Dictionary with relationship_id and schema name.
8888
:rtype: ``dict[str, Any]``
@@ -94,8 +94,8 @@ def _create_many_to_many_relationship(
9494
payload = relationship.to_dict()
9595

9696
headers = self._headers().copy()
97-
if solution_unique_name:
98-
headers["MSCRM.SolutionUniqueName"] = solution_unique_name
97+
if solution:
98+
headers["MSCRM.SolutionUniqueName"] = solution
9999

100100
r = self._request("post", url, headers=headers, json=payload)
101101

tests/unit/data/test_relationships.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ def test_create_relationship_with_solution(self):
131131
}
132132
self.client._mock_request.return_value = mock_response
133133

134-
self.client._create_one_to_many_relationship(self.lookup, self.relationship, solution_unique_name="MySolution")
134+
self.client._create_one_to_many_relationship(self.lookup, self.relationship, solution="MySolution")
135135

136136
# Verify solution header
137137
call_args = self.client._mock_request.call_args

tests/unit/test_client.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ def test_basic_lookup_field_creation(self):
164164
call_args = self.client.create_one_to_many_relationship.call_args
165165
lookup = call_args[0][0]
166166
relationship = call_args[0][1]
167-
solution = call_args[0][2]
167+
solution = call_args.kwargs.get("solution")
168168

169169
# Verify lookup metadata
170170
self.assertEqual(lookup.schema_name, "new_AccountId")
@@ -175,7 +175,7 @@ def test_basic_lookup_field_creation(self):
175175
self.assertEqual(relationship.referencing_entity, "new_order")
176176
self.assertEqual(relationship.referenced_attribute, "accountid")
177177

178-
# Verify no solution
178+
# Verify no solution (keyword-only, defaults to None)
179179
self.assertIsNone(solution)
180180

181181
def test_lookup_with_display_name(self):
@@ -269,17 +269,17 @@ def test_cascade_delete_configuration(self):
269269
cascade_dict = relationship.cascade_configuration.to_dict()
270270
self.assertEqual(cascade_dict["Delete"], "Cascade")
271271

272-
def test_solution_unique_name_passed(self):
273-
"""Test that solution_unique_name is passed through."""
272+
def test_solution_passed(self):
273+
"""Test that solution is passed through."""
274274
self.client.create_lookup_field(
275275
referencing_table="new_order",
276276
lookup_field_name="new_AccountId",
277277
referenced_table="account",
278-
solution_unique_name="MySolution",
278+
solution="MySolution",
279279
)
280280

281281
call_args = self.client.create_one_to_many_relationship.call_args
282-
solution = call_args[0][2]
282+
solution = call_args.kwargs.get("solution")
283283

284284
self.assertEqual(solution, "MySolution")
285285

0 commit comments

Comments
 (0)