@@ -292,6 +292,19 @@ def is_valid(cls, url: str, is_explicit: Optional[bool] = None) -> bool:
292
292
293
293
>>> GitURL.is_valid(url='notaurl')
294
294
False
295
+
296
+ **Unambiguous VCS detection**
297
+
298
+ Sometimes you may want to match a VCS exclusively, without any change for, e.g.
299
+ in order to outright detect the VCS system being used.
300
+
301
+ >>> GitURL.is_valid(
302
+ ... url='git@github.com:vcs-python/libvcs.git', is_explicit=True
303
+ ... )
304
+ False
305
+
306
+ In this case, check :meth:`GitPipURL.is_valid` or :meth:`GitURL.is_valid`'s
307
+ examples.
295
308
"""
296
309
if is_explicit is not None :
297
310
return any (
@@ -411,6 +424,44 @@ def to_url(self) -> str:
411
424
412
425
return url
413
426
427
+ @classmethod
428
+ def is_valid (cls , url : str , is_explicit : Optional [bool ] = None ) -> bool :
429
+ """Whether URL is compatible with Pip Git's VCS URL pattern or not.
430
+
431
+ Examples
432
+ --------
433
+
434
+ Will not match normal ``git(1)`` URLs, use :meth:`GitURL.is_valid` for that.
435
+
436
+ >>> GitPipURL.is_valid(url='https://github.com/vcs-python/libvcs.git')
437
+ False
438
+
439
+ >>> GitPipURL.is_valid(url='git@github.com:vcs-python/libvcs.git')
440
+ False
441
+
442
+ Pip-style URLs:
443
+
444
+ >>> GitPipURL.is_valid(url='git+https://github.com/vcs-python/libvcs.git')
445
+ True
446
+
447
+ >>> GitPipURL.is_valid(url='git+ssh://git@github.com:vcs-python/libvcs.git')
448
+ True
449
+
450
+ >>> GitPipURL.is_valid(url='notaurl')
451
+ False
452
+
453
+ **Explicit VCS detection**
454
+
455
+ Pip-style URLs are prefixed with the VCS name in front, so its matchers can
456
+ unambigously narrow the type of VCS:
457
+
458
+ >>> GitPipURL.is_valid(
459
+ ... url='git+ssh://git@github.com:vcs-python/libvcs.git', is_explicit=True
460
+ ... )
461
+ True
462
+ """
463
+ return super ().is_valid (url = url , is_explicit = is_explicit )
464
+
414
465
415
466
@dataclasses .dataclass (repr = False )
416
467
class GitURL (GitPipURL , GitBaseURL , URLProtocol , SkipDefaultFieldsReprMixin ):
0 commit comments