# Path: log_calls/helpers.py
# def get_explicit_kwargs_OD(f_params, bound_args, kwargs) -> OrderedDict:
#     """For some call to a function f, args *arg and **kwargs,
#     :param f_params:   inspect.signature(f).parameters
#     :param bound_args: inspect.signature(f).bind(*args, **kwargs)
# 
#     :return: OrderedDict of the (kwd, kwargs[kwd])
#              for keyword parameters kwd of f that ARE explicitly passed.
# 
#     Another ad-hoc little function, needed in 2 different places.
# 
#     TODO (doc)tests?
#     """
#     arguments = bound_args.arguments
#     return OrderedDict(
#         ((k, kwargs[k])
#          for k in f_params
#          if k in arguments and k in kwargs)
#     )
# 
# def get_defaulted_kwargs_OD(f_params, bound_args) -> OrderedDict:
#     """For some call to a function f, args *arg and **kwargs,
#     :param f_params:   inspect.signature(f).parameters
#     :param bound_args: inspect.signature(f).bind(*args, **kwargs)
# 
#     :return: OrderedDict of the (param.name, param.default)
#              for keyword parameters param of f that are NOT explicitly passed.
# 
#     An ad-hoc little function, but needed in 2 different places.
# 
#     TODO (doc)tests?
#     """
#     arguments = bound_args.arguments
#     empty = inspect._empty
#     return OrderedDict(
#         # ((param.name, param.default)
#         #  for param in f_params.values()
#         #  if param.name not in arguments
#         #     and param.default != empty)
#         ((key, f_params[key].default)
#         for key in f_params
#         if key not in arguments
#             and f_params[key].default != empty)
#     )


from functools import wraps
from .helpers import (get_explicit_kwargs_OD, get_defaulted_kwargs_OD)
import inspect
__author__ = "Brian O'Neill"  # BTO
__doc__ = """
Module version = '0.2.4'

Slightly ad-hoc decorator
    used_unused_keywords
for `__init__` function of `log_calls`. It's not *totally* ad-hoc:
`log_calls.__init__` only uses half the functionality of this decorator ;/

This decorator allows a function to determine which of its keyword arguments
were actually supplied by its caller, and which were not supplied and therefore
receive default values. It makes these two collections available as OrderedDicts.

# Path: log_calls/helpers.py
# def get_explicit_kwargs_OD(f_params, bound_args, kwargs) -> OrderedDict:
#     """For some call to a function f, args *arg and **kwargs,
#     :param f_params:   inspect.signature(f).parameters
#     :param bound_args: inspect.signature(f).bind(*args, **kwargs)
# 
#     :return: OrderedDict of the (kwd, kwargs[kwd])
#              for keyword parameters kwd of f that ARE explicitly passed.
# 
#     Another ad-hoc little function, needed in 2 different places.
# 
#     TODO (doc)tests?
#     """
#     arguments = bound_args.arguments
#     return OrderedDict(
#         ((k, kwargs[k])
#          for k in f_params
#          if k in arguments and k in kwargs)
#     )
# 
# def get_defaulted_kwargs_OD(f_params, bound_args) -> OrderedDict:
#     """For some call to a function f, args *arg and **kwargs,
#     :param f_params:   inspect.signature(f).parameters
#     :param bound_args: inspect.signature(f).bind(*args, **kwargs)
# 
#     :return: OrderedDict of the (param.name, param.default)
#              for keyword parameters param of f that are NOT explicitly passed.
# 
#     An ad-hoc little function, but needed in 2 different places.
# 
#     TODO (doc)tests?
#     """
#     arguments = bound_args.arguments
#     empty = inspect._empty
#     return OrderedDict(
#         # ((param.name, param.default)
#         #  for param in f_params.values()
#         #  if param.name not in arguments
#         #     and param.default != empty)
#         ((key, f_params[key].default)
#         for key in f_params
#         if key not in arguments
#             and f_params[key].default != empty)
#     )


# Path: log_calls/used_unused_kwds.py
from functools import wraps
from .helpers import (get_explicit_kwargs_OD, get_defaulted_kwargs_OD)
import inspect

__author__ = "Brian O'Neill"  # BTO
__doc__ = """
Module version = '0.2.4'

Slightly ad-hoc decorator
    used_unused_keywords
for `__init__` function of `log_calls`. It's not *totally* ad-hoc:
`log_calls.__init__` only uses half the functionality of this decorator ;/

This decorator allows a function to determine which of its keyword arguments
were actually supplied by its caller, and which were not supplied and therefore
receive default values. It makes these two collections available as OrderedDicts.

Given