Skip to content

URN

This part of the project documentation focuses on an information-oriented approach. Use it as a reference for the technical implementation of the pact_methodology project code.

A class representing a generic URN (RFC8141).

This class encapsulates the functionality to create, validate, and represent a URN. It ensures that the URN conforms to the RFC8141 standard.

Examples:

>>> urn = URN("urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6")
>>> str(urn)
'urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6'
>>> repr(urn)
"URN(value='urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6')"
>>> hash(urn) == hash("urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6")
True
>>> urn == URN("urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6")
True
>>> urn == "urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6"
False
Source code in pact_methodology/urn.py
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
class URN:
    """
    A class representing a generic URN (RFC8141).

    This class encapsulates the functionality to create, validate, and represent a URN.
    It ensures that the URN conforms to the RFC8141 standard.

    Examples:
        >>> urn = URN("urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6")
        >>> str(urn)
        'urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6'
        >>> repr(urn)
        "URN(value='urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6')"
        >>> hash(urn) == hash("urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6")
        True
        >>> urn == URN("urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6")
        True
        >>> urn == "urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6"
        False
    """

    def __init__(self, value: str):
        """
        Initialize a URN instance.

        Args:
            value (str): The URN string to be validated and stored.

        Raises:
            ValueError: If the provided value is not a valid URN according to RFC8141.

        Examples:
            >>> URN("urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6")
            URN(value='urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6')
            >>> URN("invalid-urn")
            Traceback (most recent call last):
                ...
            ValueError: Value must be a valid URN
        """
        try:
            URN8141.from_string(value)
        except InvalidURNFormatError:
            raise ValueError("Value must be a valid URN")
        self.value = value

    def __str__(self) -> str:
        """
        Return the string representation of the URN.

        Returns:
            str: The URN value.

        Examples:
            >>> urn = URN("urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6")
            >>> str(urn)
            'urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6'
        """
        return self.value

    def __repr__(self) -> str:
        """
        Return the representation of the URN instance.

        Returns:
            str: A string representation of the URN instance.

        Examples:
            >>> urn = URN("urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6")
            >>> repr(urn)
            "URN(value='urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6')"
        """
        return f"URN(value='{self.value}')"

    def __hash__(self) -> int:
        """
        Return the hash of the URN value.

        Returns:
            int: The hash value of the URN.

        Examples:
            >>> urn = URN("urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6")
            >>> hash(urn) == hash("urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6")
            True
        """
        return hash(self.value)

    def __eq__(self, other: Any) -> bool:
        """
        Check if this URN is equal to another object.

        Args:
            other (Any): The object to compare with.

        Returns:
            bool: True if the objects are equal, False otherwise.

        Examples:
            >>> urn1 = URN("urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6")
            >>> urn2 = URN("urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6")
            >>> urn1 == urn2
            True
            >>> urn1 == "urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6"
            False
        """
        if not isinstance(other, URN):
            return False
        return self.value == other.value

__eq__(other)

Check if this URN is equal to another object.

Parameters:

Name Type Description Default
other Any

The object to compare with.

required

Returns:

Name Type Description
bool bool

True if the objects are equal, False otherwise.

Examples:

>>> urn1 = URN("urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6")
>>> urn2 = URN("urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6")
>>> urn1 == urn2
True
>>> urn1 == "urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6"
False
Source code in pact_methodology/urn.py
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
def __eq__(self, other: Any) -> bool:
    """
    Check if this URN is equal to another object.

    Args:
        other (Any): The object to compare with.

    Returns:
        bool: True if the objects are equal, False otherwise.

    Examples:
        >>> urn1 = URN("urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6")
        >>> urn2 = URN("urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6")
        >>> urn1 == urn2
        True
        >>> urn1 == "urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6"
        False
    """
    if not isinstance(other, URN):
        return False
    return self.value == other.value

__hash__()

Return the hash of the URN value.

Returns:

Name Type Description
int int

The hash value of the URN.

Examples:

>>> urn = URN("urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6")
>>> hash(urn) == hash("urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6")
True
Source code in pact_methodology/urn.py
81
82
83
84
85
86
87
88
89
90
91
92
93
def __hash__(self) -> int:
    """
    Return the hash of the URN value.

    Returns:
        int: The hash value of the URN.

    Examples:
        >>> urn = URN("urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6")
        >>> hash(urn) == hash("urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6")
        True
    """
    return hash(self.value)

__init__(value)

Initialize a URN instance.

Parameters:

Name Type Description Default
value str

The URN string to be validated and stored.

required

Raises:

Type Description
ValueError

If the provided value is not a valid URN according to RFC8141.

Examples:

>>> URN("urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6")
URN(value='urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6')
>>> URN("invalid-urn")
Traceback (most recent call last):
    ...
ValueError: Value must be a valid URN
Source code in pact_methodology/urn.py
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
def __init__(self, value: str):
    """
    Initialize a URN instance.

    Args:
        value (str): The URN string to be validated and stored.

    Raises:
        ValueError: If the provided value is not a valid URN according to RFC8141.

    Examples:
        >>> URN("urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6")
        URN(value='urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6')
        >>> URN("invalid-urn")
        Traceback (most recent call last):
            ...
        ValueError: Value must be a valid URN
    """
    try:
        URN8141.from_string(value)
    except InvalidURNFormatError:
        raise ValueError("Value must be a valid URN")
    self.value = value

__repr__()

Return the representation of the URN instance.

Returns:

Name Type Description
str str

A string representation of the URN instance.

Examples:

>>> urn = URN("urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6")
>>> repr(urn)
"URN(value='urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6')"
Source code in pact_methodology/urn.py
67
68
69
70
71
72
73
74
75
76
77
78
79
def __repr__(self) -> str:
    """
    Return the representation of the URN instance.

    Returns:
        str: A string representation of the URN instance.

    Examples:
        >>> urn = URN("urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6")
        >>> repr(urn)
        "URN(value='urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6')"
    """
    return f"URN(value='{self.value}')"

__str__()

Return the string representation of the URN.

Returns:

Name Type Description
str str

The URN value.

Examples:

>>> urn = URN("urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6")
>>> str(urn)
'urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6'
Source code in pact_methodology/urn.py
53
54
55
56
57
58
59
60
61
62
63
64
65
def __str__(self) -> str:
    """
    Return the string representation of the URN.

    Returns:
        str: The URN value.

    Examples:
        >>> urn = URN("urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6")
        >>> str(urn)
        'urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6'
    """
    return self.value

Bases: URN

A class representing a Company ID URN, extending the generic URN class.

This class encapsulates the functionality to create, validate, and represent a Company ID URN. It ensures that the URN conforms to specific Company ID formats.

Examples:

>>> company_id = CompanyId("urn:pathfinder:company:customcode:buyer-assigned:acme-corp")
>>> str(company_id)
'urn:pathfinder:company:customcode:buyer-assigned:acme-corp'
>>> repr(company_id)
"CompanyId(value='urn:pathfinder:company:customcode:buyer-assigned:acme-corp')"
>>> hash(company_id) == hash("urn:pathfinder:company:customcode:buyer-assigned:acme-corp")
True
>>> company_id == CompanyId("urn:pathfinder:company:customcode:buyer-assigned:acme-corp")
True
>>> company_id == "urn:pathfinder:company:customcode:buyer-assigned:acme-corp"
False
Source code in pact_methodology/urn.py
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
class CompanyId(URN):
    """
    A class representing a Company ID URN, extending the generic URN class.

    This class encapsulates the functionality to create, validate, and represent a Company ID URN.
    It ensures that the URN conforms to specific Company ID formats.

    Examples:
        >>> company_id = CompanyId("urn:pathfinder:company:customcode:buyer-assigned:acme-corp")
        >>> str(company_id)
        'urn:pathfinder:company:customcode:buyer-assigned:acme-corp'
        >>> repr(company_id)
        "CompanyId(value='urn:pathfinder:company:customcode:buyer-assigned:acme-corp')"
        >>> hash(company_id) == hash("urn:pathfinder:company:customcode:buyer-assigned:acme-corp")
        True
        >>> company_id == CompanyId("urn:pathfinder:company:customcode:buyer-assigned:acme-corp")
        True
        >>> company_id == "urn:pathfinder:company:customcode:buyer-assigned:acme-corp"
        False
    """

    BUYER_ASSIGNED_PATTERN: re.Pattern = re.compile(
        r"^urn:pathfinder:company:customcode:buyer-assigned:[a-zA-Z0-9-]+$"
    )
    VENDOR_ASSIGNED_PATTERN: re.Pattern = re.compile(
        r"^urn:pathfinder:company:customcode:vendor-assigned:[a-zA-Z0-9-]+$"
    )

    def __init__(self, value: str):
        """
        Initialize a CompanyId instance.

        Args:
            value (str): The Company ID string to be validated and stored.

        Raises:
            ValueError: If the provided value is not a valid URN or does not conform to the Company ID format.

        Examples:
            >>> CompanyId("urn:pathfinder:company:customcode:buyer-assigned:acme-corp")
            CompanyId(value='urn:pathfinder:company:customcode:buyer-assigned:acme-corp')
            >>> CompanyId("invalid-urn")
            Traceback (most recent call last):
                ...
            ValueError: Value must be a valid URN
            >>> CompanyId("urn:pathfinder:company:customcode:invalid-type:12345")
            Traceback (most recent call last):
                ...
            ValueError: CompanyId does not conform to the required format
        """
        super().__init__(value)
        self._validate_company_id()

    def _validate_company_id(self) -> None:
        """
        Validate the Company ID format beyond the URN standard.

        Raises:
            ValueError: If the URN does not match the required Company ID format.
        """
        if not (
            self.BUYER_ASSIGNED_PATTERN.match(self.value)
            or self.VENDOR_ASSIGNED_PATTERN.match(self.value)
        ):
            raise ValueError("CompanyId does not conform to the required format")

    def __str__(self) -> str:
        """
        Return the string representation of the CompanyId.

        Returns:
            str: The CompanyId value.

        Examples:
            >>> company_id = CompanyId("urn:pathfinder:company:customcode:buyer-assigned:acme-corp")
            >>> str(company_id)
            'urn:pathfinder:company:customcode:buyer-assigned:acme-corp'
        """
        return self.value

    def __repr__(self) -> str:
        """
        Return the representation of the CompanyId instance.

        Returns:
            str: A string representation of the CompanyId instance.

        Examples:
            >>> company_id = CompanyId("urn:pathfinder:company:customcode:buyer-assigned:acme-corp")
            >>> repr(company_id)
            "CompanyId(value='urn:pathfinder:company:customcode:buyer-assigned:acme-corp')"
        """
        return f"CompanyId(value='{self.value}')"

    def __hash__(self) -> int:
        """
        Return the hash of the CompanyId value.

        Returns:
            int: The hash value of the CompanyId.

        Examples:
            >>> company_id = CompanyId("urn:pathfinder:company:customcode:buyer-assigned:acme-corp")
            >>> hash(company_id) == hash("urn:pathfinder:company:customcode:buyer-assigned:acme-corp")
            True
        """
        return hash(self.value)

    def __eq__(self, other: Any) -> bool:
        """
        Check if this CompanyId is equal to another object.

        Args:
            other (Any): The object to compare with.

        Returns:
            bool: True if the objects are equal, False otherwise.

        Examples:
            >>> company_id1 = CompanyId("urn:pathfinder:company:customcode:buyer-assigned:acme-corp")
            >>> company_id2 = CompanyId("urn:pathfinder:company:customcode:buyer-assigned:acme-corp")
            >>> company_id1 == company_id2
            True
            >>> company_id1 == "urn:pathfinder:company:customcode:buyer-assigned:acme-corp"
            False
        """
        if not isinstance(other, CompanyId):
            return False
        return self.value == other.value

__eq__(other)

Check if this CompanyId is equal to another object.

Parameters:

Name Type Description Default
other Any

The object to compare with.

required

Returns:

Name Type Description
bool bool

True if the objects are equal, False otherwise.

Examples:

>>> company_id1 = CompanyId("urn:pathfinder:company:customcode:buyer-assigned:acme-corp")
>>> company_id2 = CompanyId("urn:pathfinder:company:customcode:buyer-assigned:acme-corp")
>>> company_id1 == company_id2
True
>>> company_id1 == "urn:pathfinder:company:customcode:buyer-assigned:acme-corp"
False
Source code in pact_methodology/urn.py
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
def __eq__(self, other: Any) -> bool:
    """
    Check if this CompanyId is equal to another object.

    Args:
        other (Any): The object to compare with.

    Returns:
        bool: True if the objects are equal, False otherwise.

    Examples:
        >>> company_id1 = CompanyId("urn:pathfinder:company:customcode:buyer-assigned:acme-corp")
        >>> company_id2 = CompanyId("urn:pathfinder:company:customcode:buyer-assigned:acme-corp")
        >>> company_id1 == company_id2
        True
        >>> company_id1 == "urn:pathfinder:company:customcode:buyer-assigned:acme-corp"
        False
    """
    if not isinstance(other, CompanyId):
        return False
    return self.value == other.value

__hash__()

Return the hash of the CompanyId value.

Returns:

Name Type Description
int int

The hash value of the CompanyId.

Examples:

>>> company_id = CompanyId("urn:pathfinder:company:customcode:buyer-assigned:acme-corp")
>>> hash(company_id) == hash("urn:pathfinder:company:customcode:buyer-assigned:acme-corp")
True
Source code in pact_methodology/urn.py
212
213
214
215
216
217
218
219
220
221
222
223
224
def __hash__(self) -> int:
    """
    Return the hash of the CompanyId value.

    Returns:
        int: The hash value of the CompanyId.

    Examples:
        >>> company_id = CompanyId("urn:pathfinder:company:customcode:buyer-assigned:acme-corp")
        >>> hash(company_id) == hash("urn:pathfinder:company:customcode:buyer-assigned:acme-corp")
        True
    """
    return hash(self.value)

__init__(value)

Initialize a CompanyId instance.

Parameters:

Name Type Description Default
value str

The Company ID string to be validated and stored.

required

Raises:

Type Description
ValueError

If the provided value is not a valid URN or does not conform to the Company ID format.

Examples:

>>> CompanyId("urn:pathfinder:company:customcode:buyer-assigned:acme-corp")
CompanyId(value='urn:pathfinder:company:customcode:buyer-assigned:acme-corp')
>>> CompanyId("invalid-urn")
Traceback (most recent call last):
    ...
ValueError: Value must be a valid URN
>>> CompanyId("urn:pathfinder:company:customcode:invalid-type:12345")
Traceback (most recent call last):
    ...
ValueError: CompanyId does not conform to the required format
Source code in pact_methodology/urn.py
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
def __init__(self, value: str):
    """
    Initialize a CompanyId instance.

    Args:
        value (str): The Company ID string to be validated and stored.

    Raises:
        ValueError: If the provided value is not a valid URN or does not conform to the Company ID format.

    Examples:
        >>> CompanyId("urn:pathfinder:company:customcode:buyer-assigned:acme-corp")
        CompanyId(value='urn:pathfinder:company:customcode:buyer-assigned:acme-corp')
        >>> CompanyId("invalid-urn")
        Traceback (most recent call last):
            ...
        ValueError: Value must be a valid URN
        >>> CompanyId("urn:pathfinder:company:customcode:invalid-type:12345")
        Traceback (most recent call last):
            ...
        ValueError: CompanyId does not conform to the required format
    """
    super().__init__(value)
    self._validate_company_id()

__repr__()

Return the representation of the CompanyId instance.

Returns:

Name Type Description
str str

A string representation of the CompanyId instance.

Examples:

>>> company_id = CompanyId("urn:pathfinder:company:customcode:buyer-assigned:acme-corp")
>>> repr(company_id)
"CompanyId(value='urn:pathfinder:company:customcode:buyer-assigned:acme-corp')"
Source code in pact_methodology/urn.py
198
199
200
201
202
203
204
205
206
207
208
209
210
def __repr__(self) -> str:
    """
    Return the representation of the CompanyId instance.

    Returns:
        str: A string representation of the CompanyId instance.

    Examples:
        >>> company_id = CompanyId("urn:pathfinder:company:customcode:buyer-assigned:acme-corp")
        >>> repr(company_id)
        "CompanyId(value='urn:pathfinder:company:customcode:buyer-assigned:acme-corp')"
    """
    return f"CompanyId(value='{self.value}')"

__str__()

Return the string representation of the CompanyId.

Returns:

Name Type Description
str str

The CompanyId value.

Examples:

>>> company_id = CompanyId("urn:pathfinder:company:customcode:buyer-assigned:acme-corp")
>>> str(company_id)
'urn:pathfinder:company:customcode:buyer-assigned:acme-corp'
Source code in pact_methodology/urn.py
184
185
186
187
188
189
190
191
192
193
194
195
196
def __str__(self) -> str:
    """
    Return the string representation of the CompanyId.

    Returns:
        str: The CompanyId value.

    Examples:
        >>> company_id = CompanyId("urn:pathfinder:company:customcode:buyer-assigned:acme-corp")
        >>> str(company_id)
        'urn:pathfinder:company:customcode:buyer-assigned:acme-corp'
    """
    return self.value

Bases: URN

A class representing a ProductId URN, extending the generic URN class.

This class encapsulates the functionality to create, validate, and represent a ProductId URN. It ensures that the URN conforms to specific ProductId formats.

Examples:

>>> product_id = ProductId("urn:pathfinder:product:customcode:buyer-assigned:ABC-123")
>>> str(product_id)
'urn:pathfinder:product:customcode:buyer-assigned:ABC-123'
>>> repr(product_id)
"ProductId(value='urn:pathfinder:product:customcode:buyer-assigned:ABC-123')"
>>> hash(product_id) == hash("urn:pathfinder:product:customcode:buyer-assigned:ABC-123")
True
>>> product_id == ProductId("urn:pathfinder:product:customcode:buyer-assigned:ABC-123")
True
>>> product_id == "urn:pathfinder:product:customcode:buyer-assigned:ABC-123"
False
Source code in pact_methodology/urn.py
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
class ProductId(URN):
    """
    A class representing a ProductId URN, extending the generic URN class.

    This class encapsulates the functionality to create, validate, and represent a ProductId URN.
    It ensures that the URN conforms to specific ProductId formats.

    Examples:
        >>> product_id = ProductId("urn:pathfinder:product:customcode:buyer-assigned:ABC-123")
        >>> str(product_id)
        'urn:pathfinder:product:customcode:buyer-assigned:ABC-123'
        >>> repr(product_id)
        "ProductId(value='urn:pathfinder:product:customcode:buyer-assigned:ABC-123')"
        >>> hash(product_id) == hash("urn:pathfinder:product:customcode:buyer-assigned:ABC-123")
        True
        >>> product_id == ProductId("urn:pathfinder:product:customcode:buyer-assigned:ABC-123")
        True
        >>> product_id == "urn:pathfinder:product:customcode:buyer-assigned:ABC-123"
        False
    """

    BUYER_ASSIGNED_PATTERN: re.Pattern = re.compile(
        r"^urn:pathfinder:product:customcode:buyer-assigned:[a-zA-Z0-9-]+$"
    )
    VENDOR_ASSIGNED_PATTERN: re.Pattern = re.compile(
        r"^urn:pathfinder:product:customcode:vendor-assigned:[a-zA-Z0-9-]+$"
    )
    CAS_PATTERN: re.Pattern = re.compile(r"^urn:pathfinder:product:id:cas:\b\d{2,7}-\d{2}-\d\b$")
    IUPAC_INCHI_PATTERN: re.Pattern = re.compile(r"^urn:pathfinder:product:id:iupac-inchi:.*$")

    def __init__(self, value: str):
        """
        Initialize a ProductId instance.

        Args:
            value (str): The ProductId string to be validated and stored.

        Raises:
            ValueError: If the provided value is not a valid URN or does not conform to the ProductId format.

        Examples:
            >>> ProductId("urn:pathfinder:product:customcode:buyer-assigned:ABC-123")
            ProductId(value='urn:pathfinder:product:customcode:buyer-assigned:ABC-123')
            >>> ProductId("invalid-urn")
            Traceback (most recent call last):
                ...
            ValueError: Value must be a valid URN
            >>> ProductId("urn:pathfinder:product:customcode:invalid:ABC-123")
            Traceback (most recent call last):
                ...
            ValueError: ProductId does not conform to the required format
        """
        super().__init__(value)
        self._validate()

    def _validate(self) -> None:
        """
        Validate the ProductId format.

        Raises:
            ValueError: If the ProductId does not conform to any of the required formats.
        """
        if not any(
            [
                self.BUYER_ASSIGNED_PATTERN.match(self.value),
                self.VENDOR_ASSIGNED_PATTERN.match(self.value),
                self._validate_cas_number(self.value),
                self.IUPAC_INCHI_PATTERN.match(self.value),
            ]
        ):
            raise ValueError("ProductId does not conform to the required format")

    def _validate_cas_number(self, value: str) -> bool:
        """
        Validate the CAS number format.

        Args:
            value (str): The URN string to validate.

        Returns:
            bool: True if the CAS number is valid, False otherwise.
        """
        if self.CAS_PATTERN.match(value):
            try:
                cas_value = value.rsplit(":", 1)[-1]
                casregnum.CAS(cas_value)
                return True
            except ValueError:
                return False
        return False

    def __str__(self) -> str:
        """
        Return the string representation of the ProductId.

        Returns:
            str: The ProductId value.

        Examples:
            >>> product_id = ProductId("urn:pathfinder:product:customcode:buyer-assigned:ABC-123")
            >>> str(product_id)
            'urn:pathfinder:product:customcode:buyer-assigned:ABC-123'
        """
        return self.value

    def __repr__(self) -> str:
        """
        Return the representation of the ProductId instance.

        Returns:
            str: A string representation of the ProductId instance.

        Examples:
            >>> product_id = ProductId("urn:pathfinder:product:customcode:buyer-assigned:ABC-123")
            >>> repr(product_id)
            "ProductId(value='urn:pathfinder:product:customcode:buyer-assigned:ABC-123')"
        """
        return f"ProductId(value='{self.value}')"

    def __hash__(self) -> int:
        """
        Return the hash of the ProductId value.

        Returns:
            int: The hash value of the ProductId.

        Examples:
            >>> product_id = ProductId("urn:pathfinder:product:customcode:buyer-assigned:ABC-123")
            >>> hash(product_id) == hash("urn:pathfinder:product:customcode:buyer-assigned:ABC-123")
            True
        """
        return hash(self.value)

    def __eq__(self, other: Any) -> bool:
        """
        Check if this ProductId is equal to another object.

        Args:
            other (Any): The object to compare with.

        Returns:
            bool: True if the objects are equal, False otherwise.

        Examples:
            >>> product_id1 = ProductId("urn:pathfinder:product:customcode:buyer-assigned:ABC-123")
            >>> product_id2 = ProductId("urn:pathfinder:product:customcode:buyer-assigned:ABC-123")
            >>> product_id1 == product_id2
            True
            >>> product_id1 == "urn:pathfinder:product:customcode:buyer-assigned:ABC-123"
            False
        """
        if not isinstance(other, ProductId):
            return False
        return self.value == other.value

__eq__(other)

Check if this ProductId is equal to another object.

Parameters:

Name Type Description Default
other Any

The object to compare with.

required

Returns:

Name Type Description
bool bool

True if the objects are equal, False otherwise.

Examples:

>>> product_id1 = ProductId("urn:pathfinder:product:customcode:buyer-assigned:ABC-123")
>>> product_id2 = ProductId("urn:pathfinder:product:customcode:buyer-assigned:ABC-123")
>>> product_id1 == product_id2
True
>>> product_id1 == "urn:pathfinder:product:customcode:buyer-assigned:ABC-123"
False
Source code in pact_methodology/urn.py
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
def __eq__(self, other: Any) -> bool:
    """
    Check if this ProductId is equal to another object.

    Args:
        other (Any): The object to compare with.

    Returns:
        bool: True if the objects are equal, False otherwise.

    Examples:
        >>> product_id1 = ProductId("urn:pathfinder:product:customcode:buyer-assigned:ABC-123")
        >>> product_id2 = ProductId("urn:pathfinder:product:customcode:buyer-assigned:ABC-123")
        >>> product_id1 == product_id2
        True
        >>> product_id1 == "urn:pathfinder:product:customcode:buyer-assigned:ABC-123"
        False
    """
    if not isinstance(other, ProductId):
        return False
    return self.value == other.value

__hash__()

Return the hash of the ProductId value.

Returns:

Name Type Description
int int

The hash value of the ProductId.

Examples:

>>> product_id = ProductId("urn:pathfinder:product:customcode:buyer-assigned:ABC-123")
>>> hash(product_id) == hash("urn:pathfinder:product:customcode:buyer-assigned:ABC-123")
True
Source code in pact_methodology/urn.py
368
369
370
371
372
373
374
375
376
377
378
379
380
def __hash__(self) -> int:
    """
    Return the hash of the ProductId value.

    Returns:
        int: The hash value of the ProductId.

    Examples:
        >>> product_id = ProductId("urn:pathfinder:product:customcode:buyer-assigned:ABC-123")
        >>> hash(product_id) == hash("urn:pathfinder:product:customcode:buyer-assigned:ABC-123")
        True
    """
    return hash(self.value)

__init__(value)

Initialize a ProductId instance.

Parameters:

Name Type Description Default
value str

The ProductId string to be validated and stored.

required

Raises:

Type Description
ValueError

If the provided value is not a valid URN or does not conform to the ProductId format.

Examples:

>>> ProductId("urn:pathfinder:product:customcode:buyer-assigned:ABC-123")
ProductId(value='urn:pathfinder:product:customcode:buyer-assigned:ABC-123')
>>> ProductId("invalid-urn")
Traceback (most recent call last):
    ...
ValueError: Value must be a valid URN
>>> ProductId("urn:pathfinder:product:customcode:invalid:ABC-123")
Traceback (most recent call last):
    ...
ValueError: ProductId does not conform to the required format
Source code in pact_methodology/urn.py
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
def __init__(self, value: str):
    """
    Initialize a ProductId instance.

    Args:
        value (str): The ProductId string to be validated and stored.

    Raises:
        ValueError: If the provided value is not a valid URN or does not conform to the ProductId format.

    Examples:
        >>> ProductId("urn:pathfinder:product:customcode:buyer-assigned:ABC-123")
        ProductId(value='urn:pathfinder:product:customcode:buyer-assigned:ABC-123')
        >>> ProductId("invalid-urn")
        Traceback (most recent call last):
            ...
        ValueError: Value must be a valid URN
        >>> ProductId("urn:pathfinder:product:customcode:invalid:ABC-123")
        Traceback (most recent call last):
            ...
        ValueError: ProductId does not conform to the required format
    """
    super().__init__(value)
    self._validate()

__repr__()

Return the representation of the ProductId instance.

Returns:

Name Type Description
str str

A string representation of the ProductId instance.

Examples:

>>> product_id = ProductId("urn:pathfinder:product:customcode:buyer-assigned:ABC-123")
>>> repr(product_id)
"ProductId(value='urn:pathfinder:product:customcode:buyer-assigned:ABC-123')"
Source code in pact_methodology/urn.py
354
355
356
357
358
359
360
361
362
363
364
365
366
def __repr__(self) -> str:
    """
    Return the representation of the ProductId instance.

    Returns:
        str: A string representation of the ProductId instance.

    Examples:
        >>> product_id = ProductId("urn:pathfinder:product:customcode:buyer-assigned:ABC-123")
        >>> repr(product_id)
        "ProductId(value='urn:pathfinder:product:customcode:buyer-assigned:ABC-123')"
    """
    return f"ProductId(value='{self.value}')"

__str__()

Return the string representation of the ProductId.

Returns:

Name Type Description
str str

The ProductId value.

Examples:

>>> product_id = ProductId("urn:pathfinder:product:customcode:buyer-assigned:ABC-123")
>>> str(product_id)
'urn:pathfinder:product:customcode:buyer-assigned:ABC-123'
Source code in pact_methodology/urn.py
340
341
342
343
344
345
346
347
348
349
350
351
352
def __str__(self) -> str:
    """
    Return the string representation of the ProductId.

    Returns:
        str: The ProductId value.

    Examples:
        >>> product_id = ProductId("urn:pathfinder:product:customcode:buyer-assigned:ABC-123")
        >>> str(product_id)
        'urn:pathfinder:product:customcode:buyer-assigned:ABC-123'
    """
    return self.value