# Path: log_calls/helpers.py
# def is_keyword_param(param):
#     """param is a parameter (a value) from the ordered dict
#         inspect.signature(f).parameters
#     for some function f.
#     Return bool: True iff
#         param is not None
#         and
#             if it's a keyword-only parameter (possibly with no default value!),
#             or
#             if it's a positional-or-keyword param with a default value
# 
#     Doctests:
#     >>> is_keyword_param(None) == False
#     True
# 
#     >>> import inspect
#     >>> get_fparams = lambda f: inspect.signature(f).parameters
#     >>> def f(): pass
#     >>> is_keyword_param(get_fparams(f).get('anything')) == False
#     True
#     >>> def f(*args): pass
#     >>> is_keyword_param(get_fparams(f)['args']) == False
#     True
# 
#     >>> def f(a, b, *filters, **kwargs): pass
#     >>> is_keyword_param(get_fparams(f)['a']) == is_keyword_param(get_fparams(f)['b']) == False
#     True
#     >>> is_keyword_param(get_fparams(f)['filters']) == is_keyword_param(get_fparams(f)['kwargs']) == False
#     True
# 
#     >>> def f(x, y, z, *, mandatory, user='Joe', **other_users): pass
#     >>> is_keyword_param(get_fparams(f)['mandatory']) == True
#     True
#     >>> is_keyword_param(get_fparams(f)['user']) == True
#     True
#     """
#     return not not param and (
#         param.kind == param.KEYWORD_ONLY
#         or
#         ((param.kind == param.POSITIONAL_OR_KEYWORD)
#          and param.default is not param.empty)
#     )
# 
# def is_quoted_str(s):
#     """
#     >>> is_quoted_str('')
#     False
#     >>> is_quoted_str('"')
#     False
#     >>> is_quoted_str('Hi')
#     False
#     >>> is_quoted_str('"Hi\\'')
#     False
#     >>> is_quoted_str('"Hi"')
#     True
#     >>> is_quoted_str("''")
#     True
#     >>> any( map(is_quoted_str, [0, tuple(), list()]))
#     False
#     """
#     QUOTES = {"'", '"'}
#     return isinstance(s, str) and len(s) >= 2 and s[0] == s[-1] and s[0] in QUOTES


from collections import OrderedDict, defaultdict
from .helpers import is_keyword_param, is_quoted_str
import pprint
import warnings     # v0.3.0b23
        if deco_classname in cls._classname2SettingsData_dict:
            return

        od = OrderedDict()
        pre_handlers = []
        post_handlers = []
        for setting in settings_iter:
            od[setting.name] = setting
            if setting.__class__.__dict__.get('pre_call_handler'):
                pre_handlers.append(setting.name)
            if setting.__class__.__dict__.get('post_call_handler'):
                post_handlers.append(setting.name)

        cls._classname2SettingsData_dict[deco_classname] = od
        # v0.3.0b23 Make this an OD too
        cls._classname2SettingsDataOrigDefaults_dict[deco_classname] = OrderedDict(
            [(name, od[name].default) for name in od]
        )
        cls._classname2handlers[deco_classname] = (
            tuple(pre_handlers), tuple(post_handlers))

        # <<<attributes>>> Set up descriptors -- OMIT .pseudo_setting !
        for name in od:
            if od[name].visible and not od[name].pseudo_setting:
                setattr(cls, name, cls.make_setting_descriptor(name))

    # v0.3.0b24
    @classmethod
    def get_factory_defaults_OD(cls, deco_classname) -> OrderedDict:
        # return cls._classname2SettingsDataOrigDefaults_dict[deco_classname]

# Path: log_calls/helpers.py
# def is_keyword_param(param):
#     """param is a parameter (a value) from the ordered dict
#         inspect.signature(f).parameters
#     for some function f.
#     Return bool: True iff
#         param is not None
#         and
#             if it's a keyword-only parameter (possibly with no default value!),
#             or
#             if it's a positional-or-keyword param with a default value
# 
#     Doctests:
#     >>> is_keyword_param(None) == False
#     True
# 
#     >>> import inspect
#     >>> get_fparams = lambda f: inspect.signature(f).parameters
#     >>> def f(): pass
#     >>> is_keyword_param(get_fparams(f).get('anything')) == False
#     True
#     >>> def f(*args): pass
#     >>> is_keyword_param(get_fparams(f)['args']) == False
#     True
# 
#     >>> def f(a, b, *filters, **kwargs): pass
#     >>> is_keyword_param(get_fparams(f)['a']) == is_keyword_param(get_fparams(f)['b']) == False
#     True
#     >>> is_keyword_param(get_fparams(f)['filters']) == is_keyword_param(get_fparams(f)['kwargs']) == False
#     True
# 
#     >>> def f(x, y, z, *, mandatory, user='Joe', **other_users): pass
#     >>> is_keyword_param(get_fparams(f)['mandatory']) == True
#     True
#     >>> is_keyword_param(get_fparams(f)['user']) == True
#     True
#     """
#     return not not param and (
#         param.kind == param.KEYWORD_ONLY
#         or
#         ((param.kind == param.POSITIONAL_OR_KEYWORD)
#          and param.default is not param.empty)
#     )
# 
# def is_quoted_str(s):
#     """
#     >>> is_quoted_str('')
#     False
#     >>> is_quoted_str('"')
#     False
#     >>> is_quoted_str('Hi')
#     False
#     >>> is_quoted_str('"Hi\\'')
#     False
#     >>> is_quoted_str('"Hi"')
#     True
#     >>> is_quoted_str("''")
#     True
#     >>> any( map(is_quoted_str, [0, tuple(), list()]))
#     False
#     """
#     QUOTES = {"'", '"'}
#     return isinstance(s, str) and len(s) >= 2 and s[0] == s[-1] and s[0] in QUOTES


# Path: log_calls/deco_settings.py
from collections import OrderedDict, defaultdict
from .helpers import is_keyword_param, is_quoted_str
import pprint
import warnings     # v0.3.0b23

        if deco_classname in cls._classname2SettingsData_dict:
            return

        od = OrderedDict()
        pre_handlers = []
        post_handlers = []
        for setting in settings_iter:
            od[setting.name] = setting
            if setting.__class__.__dict__.get('pre_call_handler'):
                pre_handlers.append(setting.name)
            if setting.__class__.__dict__.get('post_call_handler'):
                post_handlers.append(setting.name)

        cls._classname2SettingsData_dict[deco_classname] = od
        # v0.3.0b23 Make this an OD too
        cls._classname2SettingsDataOrigDefaults_dict[deco_classname] = OrderedDict(
            [(name, od[name].default) for name in od]
        )
        cls._classname2handlers[deco_classname] = (
            tuple(pre_handlers), tuple(post_handlers))

        # <<<attributes>>> Set up descriptors -- OMIT .pseudo_setting !
        for name in od:
            if od[name].visible and not od[name].pseudo_setting:
                setattr(cls, name, cls.make_setting_descriptor(name))

    # v0.3.0b24
    @classmethod
    def get_factory_defaults_OD(cls, deco_classname) -> OrderedDict:
        # return cls._classname2SettingsDataOrigDefaults_dict[deco_classname]

        class_settings = cls._classname2SettingsData_dict[deco_classname]