GnuCash  5.6-150-g038405b370+
deprecation.py
1 # deprecation.py - gnucash submodule with deprecation related content
2 #
3 # contains decorator methods dealing with deprecated methods and
4 # deprecation related convenience methods
5 #
6 # @brief gnucash submodule with deprecation related content
7 # @author Christoph Holtermann <mail@c-holtermann.net>
8 # @ingroup python_bindings
9 
10 from functools import wraps
11 import inspect
12 from warnings import warn_explicit, warn
13 
14 # General purpose deprecation decorator. Lifted from
15 # https://gist.github.com/kgriffs/8202106
16 
17 def deprecated(message):
18  '''
19  Flags a method as deprecated.
20  param message: Text emitted as part of warning. Include instructions to replace the deprecated function e.g. "use waldo_pepper() isnstead."
21  '''
22  def decorator(func):
23  @wraps(func)
24  def wrapper(*args, **kwargs):
25  warning_msg = 'Call to deprecated function {}. {}'.format(
26  func.__name__, message)
27  frame = inspect.current_frame().f_back
28 
29  warn_explicit(message,
30  category=DeprecationWarnig,
31  filename=inspect.getfile(frame.f_code),
32  lineno=frame.f_lineno)
33  return func(*args, **kwargs)
34  return wrapper
35  return decorator
36 
37 # use of is_new, force_new and ignore_lock is deprecated, use mode instead
38 # the following decorators enable backward compatibility for the deprecation period
39 def deprecated_args_session(ignore_lock_or_mode=None, is_new=None,
40  force_new=None, mode=None, ignore_lock=None):
41 
42  # check for usage of deprecated arguments (ignore_lock, is_new, force_new)
43  deprecated_args = (ignore_lock, is_new, force_new)
44  deprecated_keyword_use = deprecated_args.count(None) != len(deprecated_args)
45  if deprecated_keyword_use:
46  # deprecated arguments have been used by keyword or more than three args have been used which is only possible with the deprecated args
47  deprecation = True
48  else:
49  deprecation = False
50  # __init__ could have been called without keywords like __init__(book_uri, True) where True aims at ignore_lock
51  # which ist not distinguishable from __init__(book, SessionOpenMode.SESSION_NORMAL_OPEN)
52  # so if mode has not been set by keyword use the 3rd argument
53  if mode is None:
54  mode = ignore_lock_or_mode
55 
56  if deprecation:
57  # if any(item in ("is_new", "ignore_lock", "force_new") for item in kwargs):
58  warn(
59  "Use of ignore_lock, is_new or force_new arguments is deprecated. Use mode argument instead. Have a look at gnucash.SessionOpenMode.",
60  category=DeprecationWarning,
61  stacklevel=3
62  )
63 
64  # if not provided calculate mode from deprecated args
65  if mode is None:
66  from gnucash.gnucash_core import SessionOpenMode
67  ignore_lock = False if ignore_lock is None else ignore_lock
68  is_new = False if is_new is None else is_new
69  force_new = False if force_new is None else force_new
70  mode = SessionOpenMode((ignore_lock << 2) + (is_new << 1) + force_new)
71 
72  return mode
73 
74 def deprecated_args_session_init(original_function):
75  """decorator for Session.__init__() to provide backward compatibility for deprecated use of ignore_lock, is_new and force_new"""
76  @wraps(original_function)
77  def new_function(self, book_uri=None, ignore_lock_or_mode=None, is_new=None,
78  force_new=None, instance=None, mode=None, ignore_lock=None):
79 
80  mode = deprecated_args_session(ignore_lock_or_mode, is_new, force_new, mode, ignore_lock)
81  return(original_function(self, book_uri=book_uri, mode=mode, instance=instance))
82  return new_function
83 
84 def deprecated_args_session_begin(original_function):
85  """decorator for Session.begin() to provide backward compatibility for deprecated use of ignore_lock, is_new and force_new"""
86  @wraps(original_function)
87  def new_function(self, new_uri=None, ignore_lock_or_mode=None, is_new=None,
88  force_new=None, mode=None, ignore_lock=None):
89  mode = deprecated_args_session(ignore_lock_or_mode, is_new, force_new, mode, ignore_lock)
90  return(original_function(self, new_uri=new_uri, mode=mode))
91  return new_function