Coverage for netbox/utils.py: 85%

22 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-10 18:35 +0000

1from netbox.registry import registry 

2from utilities.choices import Choice 

3 

4__all__ = ( 

5 'get_data_backend_choices', 

6 'register_data_backend', 

7 'register_model_feature', 

8 'register_request_processor', 

9) 

10 

11 

12def get_data_backend_choices(): 

13 return [ 

14 (None, '---------'), 

15 *[ 

16 Choice(name, cls.label) for name, cls in registry['data_backends'].items() 

17 ] 

18 ] 

19 

20 

21def register_data_backend(): 

22 """ 

23 Decorator for registering a DataBackend class. 

24 """ 

25 def _wrapper(cls): 

26 registry['data_backends'][cls.name] = cls 

27 return cls 

28 

29 return _wrapper 

30 

31 

32def register_model_feature(name, func=None): 

33 """ 

34 Register a model feature with its qualifying function. 

35 

36 The qualifying function must accept a single `model` argument. It will be called to determine whether the given 

37 model supports the corresponding feature. 

38 

39 This function can be used directly: 

40 

41 register_model_feature('my_feature', my_func) 

42 

43 Or as a decorator: 

44 

45 @register_model_feature('my_feature') 

46 def my_func(model): 

47 ... 

48 """ 

49 def decorator(f): 

50 registry['model_features'][name] = f 

51 return f 

52 

53 if name in registry['model_features']: 53 ↛ 54line 53 didn't jump to line 54 because the condition on line 53 was never true

54 raise ValueError(f"A model feature named {name} is already registered.") 

55 

56 if func is None: 56 ↛ 57line 56 didn't jump to line 57 because the condition on line 56 was never true

57 return decorator 

58 return decorator(func) 

59 

60 

61def register_request_processor(func): 

62 """ 

63 Decorator for registering a request processor. 

64 """ 

65 registry['request_processors'].append(func) 

66 

67 return func