Skip to content

Commit 928408a

Browse files
committed
squash: Ensure versioning is a non-breaking change to legacy
Version 1 should be a special case, where the ID is not suffixed with a version tag, and the unversioned class name continues to be available. This then means the introduction of versioning is a non-breaking change to people currently using the legacy library. Signed-off-by: David Feltell <[email protected]>
1 parent 6abf53e commit 928408a

File tree

3 files changed

+186
-106
lines changed

3 files changed

+186
-106
lines changed

examples/resources/working_with_trait_versions/openassetio_example/specifications/example.py

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,12 @@ def create(cls):
5959
data = TraitsData(cls.kTraitSet)
6060
return cls(data)
6161

62-
def deprectatedTrait(self):
62+
def addedTrait(self):
6363
"""
6464
Returns the view for the 'openassetio-example:example.Unchanged' trait wrapped around
6565
the data held in this instance.
6666
"""
67-
return traits.example.DeprecatedTrait_v1(self.traitsData())
67+
return traits.example.AddedTrait_v1(self.traitsData())
6868

6969
def updatedTrait(self):
7070
"""
@@ -74,10 +74,6 @@ def updatedTrait(self):
7474
return traits.example.UpdatedTrait_v2(self.traitsData())
7575

7676

77-
# Alias for latest version.
78-
ExampleSpecification = ExampleSpecification_v2
79-
80-
8177
class ExampleSpecification_v1:
8278
"""
8379
An example.
@@ -124,17 +120,20 @@ def create(cls):
124120
data = TraitsData(cls.kTraitSet)
125121
return cls(data)
126122

127-
128-
def deprectatedTrait(self):
123+
def addedTrait(self):
129124
"""
130125
Returns the view for the 'openassetio-example:example.Unchanged' trait wrapped around
131126
the data held in this instance.
132127
"""
133-
return traits.example.DeprecatedTrait_v1(self.traitsData())
128+
return traits.example.AddedTrait_v1(self.traitsData())
134129

135130
def updatedTrait(self):
136131
"""
137132
Returns the view for the 'openassetio-example:example.Updated' trait wrapped around
138133
the data held in this instance.
139134
"""
140-
return traits.example.UpdatedTrait_v1(self.traitsData())
135+
return traits.example.UpdatedTrait_v2(self.traitsData())
136+
137+
138+
# Alias for first version.
139+
ExampleSpecification = ExampleSpecification_v1

examples/resources/working_with_trait_versions/openassetio_example/traits/example.py

Lines changed: 61 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
21
"""
32
Trait definitions in the 'example' namespace.
43
54
Example namespace
65
"""
6+
import warnings
77

88
# WARNING: This file is auto-generated by openassetio-traitgen, do not edit.
99

@@ -17,7 +17,8 @@ class DeprecatedTrait_v1:
1717
An example.
1818
Usage: entity, locale, relationship
1919
"""
20-
kId = "openassetio-example:example.Deprecated.v001"
20+
21+
kId = "openassetio-example:example.Deprecated"
2122

2223
__deprecated__ = True # (Eventually use PEP 702)
2324

@@ -67,16 +68,23 @@ def imbueTo(cls, traitsData):
6768
traitsData.addTrait(cls.kId)
6869

6970

70-
# Alias for latest version.
71-
DeprecatedTrait = DeprecatedTrait_v1
72-
71+
# Alias for first version.
72+
class DeprecatedTrait(DeprecatedTrait_v1):
73+
def __init__(self, traitsData):
74+
super().__init__(traitsData)
75+
warnings.warn(
76+
"Use of unversioned trait view classes is deprecated",
77+
category=DeprecationWarning,
78+
stacklevel=2,
79+
)
7380

7481
class UpdatedTrait_v2:
7582
"""
7683
An example.
7784
Usage: entity, locale, relationship
7885
"""
79-
kId = "openassetio-example:example.Updated.v002"
86+
87+
kId = "openassetio-example:example.Updated.v2"
8088

8189
def __init__(self, traitsData):
8290
"""
@@ -123,7 +131,6 @@ def imbueTo(cls, traitsData):
123131
"""
124132
traitsData.addTrait(cls.kId)
125133

126-
127134
def setPropertyThatWasAdded(self, propertyThatWasAdded: float):
128135
"""
129136
Sets the propertyThatWasAdded property.
@@ -134,7 +141,7 @@ def setPropertyThatWasAdded(self, propertyThatWasAdded: float):
134141
raise TypeError("propertyThatWasAdded must be a 'float'.")
135142
self.__data.setTraitProperty(self.kId, "propertyThatWasAdded", propertyThatWasAdded)
136143

137-
def getPropertyThatWasAdded(self, defaultValue: float=None) -> Union[float, None]:
144+
def getPropertyThatWasAdded(self, defaultValue: float = None) -> Union[float, None]:
138145
"""
139146
Gets the value of the propertyThatWasAdded property or the supplied default.
140147
@@ -146,7 +153,9 @@ def getPropertyThatWasAdded(self, defaultValue: float=None) -> Union[float, None
146153

147154
if not isinstance(value, float):
148155
if defaultValue is None:
149-
raise TypeError(f"Invalid stored value type: '{type(value).__name__}' should be 'float'.")
156+
raise TypeError(
157+
f"Invalid stored value type: '{type(value).__name__}' should be 'float'."
158+
)
150159
return defaultValue
151160
return value
152161

@@ -160,7 +169,7 @@ def setPropertyThatWasRenamed(self, propertyThatWasRenamed: bool):
160169
raise TypeError("propertyThatWasRenamed must be a 'bool'.")
161170
self.__data.setTraitProperty(self.kId, "propertyThatWasRenamed", propertyThatWasRenamed)
162171

163-
def getPropertyThatWasRenamed(self, defaultValue: bool=None) -> Union[bool, None]:
172+
def getPropertyThatWasRenamed(self, defaultValue: bool = None) -> Union[bool, None]:
164173
"""
165174
Gets the value of the propertyThatWasRenamed property or the supplied default.
166175
@@ -172,7 +181,9 @@ def getPropertyThatWasRenamed(self, defaultValue: bool=None) -> Union[bool, None
172181

173182
if not isinstance(value, bool):
174183
if defaultValue is None:
175-
raise TypeError(f"Invalid stored value type: '{type(value).__name__}' should be 'bool'.")
184+
raise TypeError(
185+
f"Invalid stored value type: '{type(value).__name__}' should be 'bool'."
186+
)
176187
return defaultValue
177188
return value
178189

@@ -186,7 +197,7 @@ def setPropertyToKeep(self, propertyToKeep: str):
186197
raise TypeError("propertyToKeep must be a 'str'.")
187198
self.__data.setTraitProperty(self.kId, "propertyToKeep", propertyToKeep)
188199

189-
def getPropertyToKeep(self, defaultValue: str=None) -> Union[str, None]:
200+
def getPropertyToKeep(self, defaultValue: str = None) -> Union[str, None]:
190201
"""
191202
Gets the value of the propertyToKeep property or the supplied default.
192203
@@ -198,21 +209,20 @@ def getPropertyToKeep(self, defaultValue: str=None) -> Union[str, None]:
198209

199210
if not isinstance(value, str):
200211
if defaultValue is None:
201-
raise TypeError(f"Invalid stored value type: '{type(value).__name__}' should be 'str'.")
212+
raise TypeError(
213+
f"Invalid stored value type: '{type(value).__name__}' should be 'str'."
214+
)
202215
return defaultValue
203216
return value
204217

205218

206-
# Alias to latest version
207-
UpdatedTrait = UpdatedTrait_v2
208-
209-
210219
class UpdatedTrait_v1:
211220
"""
212221
An example.
213222
Usage: entity, locale, relationship
214223
"""
215-
kId = "openassetio-example:example.Updated.v001"
224+
225+
kId = "openassetio-example:example.Updated"
216226

217227
def __init__(self, traitsData):
218228
"""
@@ -259,7 +269,6 @@ def imbueTo(cls, traitsData):
259269
"""
260270
traitsData.addTrait(cls.kId)
261271

262-
263272
def setPropertyToKeep(self, propertyToKeep: str):
264273
"""
265274
Sets the propertyToKeep property.
@@ -270,7 +279,7 @@ def setPropertyToKeep(self, propertyToKeep: str):
270279
raise TypeError("propertyToKeep must be a 'str'.")
271280
self.__data.setTraitProperty(self.kId, "propertyToKeep", propertyToKeep)
272281

273-
def getPropertyToKeep(self, defaultValue: str=None) -> Union[str, None]:
282+
def getPropertyToKeep(self, defaultValue: str = None) -> Union[str, None]:
274283
"""
275284
Gets the value of the propertyToKeep property or the supplied default.
276285
@@ -282,7 +291,9 @@ def getPropertyToKeep(self, defaultValue: str=None) -> Union[str, None]:
282291

283292
if not isinstance(value, str):
284293
if defaultValue is None:
285-
raise TypeError(f"Invalid stored value type: '{type(value).__name__}' should be 'str'.")
294+
raise TypeError(
295+
f"Invalid stored value type: '{type(value).__name__}' should be 'str'."
296+
)
286297
return defaultValue
287298
return value
288299

@@ -296,7 +307,7 @@ def setPropertyToRemove(self, propertyToRemove: bool):
296307
raise TypeError("propertyToRemove must be a 'bool'.")
297308
self.__data.setTraitProperty(self.kId, "propertyToRemove", propertyToRemove)
298309

299-
def getPropertyToRemove(self, defaultValue: bool=None) -> Union[bool, None]:
310+
def getPropertyToRemove(self, defaultValue: bool = None) -> Union[bool, None]:
300311
"""
301312
Gets the value of the propertyToRemove property or the supplied default.
302313
@@ -308,7 +319,9 @@ def getPropertyToRemove(self, defaultValue: bool=None) -> Union[bool, None]:
308319

309320
if not isinstance(value, bool):
310321
if defaultValue is None:
311-
raise TypeError(f"Invalid stored value type: '{type(value).__name__}' should be 'bool'.")
322+
raise TypeError(
323+
f"Invalid stored value type: '{type(value).__name__}' should be 'bool'."
324+
)
312325
return defaultValue
313326
return value
314327

@@ -323,7 +336,7 @@ def setPropertyToRename(self, propertyToRename: bool):
323336
raise TypeError("propertyToRename must be a 'bool'.")
324337
self.__data.setTraitProperty(self.kId, "propertyToRename", propertyToRename)
325338

326-
def getPropertyToRename(self, defaultValue: bool=None) -> Union[bool, None]:
339+
def getPropertyToRename(self, defaultValue: bool = None) -> Union[bool, None]:
327340
"""
328341
Gets the value of the propertyToRename property or the supplied default.
329342
@@ -336,17 +349,30 @@ def getPropertyToRename(self, defaultValue: bool=None) -> Union[bool, None]:
336349

337350
if not isinstance(value, bool):
338351
if defaultValue is None:
339-
raise TypeError(f"Invalid stored value type: '{type(value).__name__}' should be 'bool'.")
352+
raise TypeError(
353+
f"Invalid stored value type: '{type(value).__name__}' should be 'bool'."
354+
)
340355
return defaultValue
341356
return value
342357

343358

359+
# Alias to first version
360+
class UpdatedTrait(UpdatedTrait_v1):
361+
def __init__(self, traitsData):
362+
super().__init__(traitsData)
363+
warnings.warn(
364+
"Use of unversioned trait view classes is deprecated",
365+
category=DeprecationWarning,
366+
stacklevel=2,
367+
)
368+
344369
class AddedTrait_v1:
345370
"""
346371
An example.
347372
Usage: entity, locale, relationship
348373
"""
349-
kId = "openassetio-example:example.Added.v001"
374+
375+
kId = "openassetio-example:example.Added"
350376

351377
def __init__(self, traitsData):
352378
"""
@@ -394,5 +420,12 @@ def imbueTo(cls, traitsData):
394420
traitsData.addTrait(cls.kId)
395421

396422

397-
# Alias to latest version
398-
AddedTrait = AddedTrait_v1
423+
# Alias to first version
424+
class AddedTrait(AddedTrait_v1):
425+
def __init__(self, traitsData):
426+
super().__init__(traitsData)
427+
warnings.warn(
428+
"Use of unversioned trait view classes is deprecated",
429+
category=DeprecationWarning,
430+
stacklevel=2,
431+
)

0 commit comments

Comments
 (0)