You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			52 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			52 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
"""Trait types for events."""
 | 
						|
from __future__ import annotations
 | 
						|
 | 
						|
import logging
 | 
						|
import typing as t
 | 
						|
 | 
						|
from traitlets import TraitError, TraitType
 | 
						|
 | 
						|
baseclass = TraitType
 | 
						|
if t.TYPE_CHECKING:
 | 
						|
    baseclass = TraitType[t.Any, t.Any]  # type:ignore[misc]
 | 
						|
 | 
						|
 | 
						|
class Handlers(baseclass):  # type:ignore[type-arg]
 | 
						|
    """A trait that takes a list of logging handlers and converts
 | 
						|
    it to a callable that returns that list (thus, making this
 | 
						|
    trait pickleable).
 | 
						|
    """
 | 
						|
 | 
						|
    info_text = "a list of logging handlers"
 | 
						|
 | 
						|
    def validate_elements(self, obj: t.Any, value: t.Any) -> None:
 | 
						|
        """Validate the elements of an object."""
 | 
						|
        if len(value) > 0:
 | 
						|
            # Check that all elements are logging handlers.
 | 
						|
            for el in value:
 | 
						|
                if isinstance(el, logging.Handler) is False:
 | 
						|
                    self.element_error(obj)
 | 
						|
 | 
						|
    def element_error(self, obj: t.Any) -> None:
 | 
						|
        """Raise an error for bad elements."""
 | 
						|
        msg = f"Elements in the '{self.name}' trait of an {obj.__class__.__name__} instance must be Python `logging` handler instances."
 | 
						|
        raise TraitError(msg)
 | 
						|
 | 
						|
    def validate(self, obj: t.Any, value: t.Any) -> t.Any:
 | 
						|
        """Validate an object."""
 | 
						|
        # If given a callable, call it and set the
 | 
						|
        # value of this trait to the returned list.
 | 
						|
        # Verify that the callable returns a list
 | 
						|
        # of logging handler instances.
 | 
						|
        if callable(value):
 | 
						|
            out = value()
 | 
						|
            self.validate_elements(obj, out)
 | 
						|
            return out
 | 
						|
        # If a list, check it's elements to verify
 | 
						|
        # that each element is a logging handler instance.
 | 
						|
        if isinstance(value, list):
 | 
						|
            self.validate_elements(obj, value)
 | 
						|
            return value
 | 
						|
        self.error(obj, value)
 | 
						|
        return None  # type:ignore[unreachable]
 |