prompt: You will be provided with a partial code base and an issue statement explaining a problem to resolve.
  <issue>
  confusing error message with simple configs
  Using this config:
  
  ```
  config = Config(executors=[ThreadPoolExecutor()])
  ```
  
  parsl startup logs this message to the logger:
  
  ```
  $ ./c.py 
  2018-07-11 08:04:42 parsl.config:66 [DEBUG]  Checkpoint period only has an effect with checkpoint_mode='periodic'
  ```
  
  This appears to be in config creation, as it happens even without passing that config to create a DataFlowKernel.
  
  This might cause user confusion that something is broken/misconfigured.
  
  
  </issue>
  <code>
  [start of parsl/config.py]
  1 import logging
  2 
  3 from libsubmit.utils import RepresentationMixin
  4 from parsl.executors.threads import ThreadPoolExecutor
  5 from parsl.dataflow.error import ConfigurationError
  6 
  7 logger = logging.getLogger(__name__)
  8 
  9 
  10 class Config(RepresentationMixin):
  11     """
  12     Specification of Parsl configuration options.
  13 
  14     Parameters
  15     ----------
  16     executors : list of ParslExecutor, optional
  17         List of executor instances to use. Possible executors include :class:`~parsl.executors.threads.ThreadPoolExecutor`,
  18         :class:`~parsl.executors.ipp.IPyParallelExecutor`, or :class:`~parsl.executors.swift_t.TurbineExecutor`. Default
  19         is [:class:`~parsl.executors.threads.ThreadPoolExecutor()`].
  20     app_cache : bool, optional
  21         Enable app caching. Default is True.
  22     checkpoint_files : list of str, optional
  23         List of paths to checkpoint files. Default is None.
  24     checkpoint_mode : str, optional
  25         Checkpoint mode to use, can be 'dfk_exit', 'task_exit', or 'periodic'. If set to
  26         `None`, checkpointing will be disabled. Default is None.
  27     checkpoint_period : str, optional
  28         Time interval (in "HH:MM:SS") at which to checkpoint completed tasks. Only has an effect if
  29         `checkpoint_mode='periodic'`.
  30     data_management_max_threads : int, optional
  31         Maximum number of threads to allocate for the data manager to use for managing input and output transfers.
  32         Default is 10.
  33     lazy_errors : bool, optional
  34         If True, errors from task failures will not be raised until `future.result()` is called. Otherwise, they will
  35         be raised as soon as the task returns. Default is True.
  36     retries : int, optional
  37         Set the number of retries in case of failure. Default is 0.
  38     run_dir : str, optional
  39         Path to run directory. Default is 'runinfo'.
  40     strategy : str, optional
  41         Strategy to use for scaling resources according to workflow needs. Can be 'simple' or `None`. If `None`, dynamic
  42         scaling will be disabled. Default is 'simple'.
  43     usage_tracking : bool, optional
  44         Enable usage tracking. Default is True.
  45     """
  46     def __init__(self,
  47                  executors=None,
  48                  app_cache=True,
  49                  checkpoint_files=None,
  50                  checkpoint_mode=None,
  51                  checkpoint_period="00:30:00",
  52                  data_management_max_threads=10,
  53                  lazy_errors=True,
  54                  retries=0,
  55                  run_dir='runinfo',
  56                  strategy='simple',
  57                  db_logger_config=None,
  58                  usage_tracking=True):
  59         if executors is None:
  60             executors = [ThreadPoolExecutor()]
  61         self.executors = executors
  62         self.app_cache = app_cache
  63         self.checkpoint_files = checkpoint_files
  64         self.checkpoint_mode = checkpoint_mode
  65         if checkpoint_mode is not 'periodic' and checkpoint_period is not None:
  66             logger.debug("Checkpoint period only has an effect with checkpoint_mode='periodic'")
  67         self.checkpoint_period = checkpoint_period
  68         self.data_management_max_threads = data_management_max_threads
  69         self.lazy_errors = lazy_errors
  70         self.retries = retries
  71         self.run_dir = run_dir
  72         self.strategy = strategy
  73         self.usage_tracking = usage_tracking
  74         self.db_logger_config = db_logger_config
  75 
  76     @property
  77     def executors(self):
  78         return self._executors
  79 
  80     @executors.setter
  81     def executors(self, executors):
  82         labels = [e.label for e in executors]
  83         duplicates = [e for n, e in enumerate(labels) if e in labels[:n]]
  84         if len(duplicates) > 0:
  85             raise ConfigurationError('Executors must have unique labels ({})'.format(
  86                 ', '.join(['label={}'.format(repr(d)) for d in duplicates])))
  87         self._executors = executors
  88
  [end of parsl/config.py]
  </code>
  
  I need you to solve this issue by generating a single patch file that I can apply directly to this repository using git apply. Please respond with a single patch file in the following format.
  <patch>
  diff --git a/file.py b/file.py
  --- a/file.py
  +++ b/file.py
  @@ -1,27 +1,35 @@
   def euclidean(a, b):
  -    while b:
  -        a, b = b, a % b
  -    return a
  +    if b == 0:
  +        return a
  +    return euclidean(b, a % b)
   
   
   def bresenham(x0, y0, x1, y1):
       points = []
       dx = abs(x1 - x0)
       dy = abs(y1 - y0)
  -    sx = 1 if x0 < x1 else -1
  -    sy = 1 if y0 < y1 else -1
  -    err = dx - dy
  +    x, y = x0, y0
  +    sx = -1 if x0 > x1 else 1
  +    sy = -1 if y0 > y1 else 1
   
  -    while True:
  -        points.append((x0, y0))
  -        if x0 == x1 and y0 == y1:
  -            break
  -        e2 = 2 * err
  -        if e2 > -dy:
  -            err -= dy
  -            x0 += sx
  -        if e2 < dx:
  -            err += dx
  -            y0 += sy
  +    if dx > dy:
  +        err = dx / 2.0
  +        while x != x1:
  +            points.append((x, y))
  +            err -= dy
  +            if err < 0:
  +                y += sy
  +                err += dx
  +            x += sx
  +    else:
  +        err = dy / 2.0
  +        while y != y1:
  +            points.append((x, y))
  +            err -= dx
  +            if err < 0:
  +                x += sx
  +                err += dy
  +            y += sy
  +
  +    points.append((x, y))
       return points
  
  </patch>
golden_diff: diff --git a/parsl/config.py b/parsl/config.py
  --- a/parsl/config.py
  +++ b/parsl/config.py
  @@ -48,7 +48,7 @@
                    app_cache=True,
                    checkpoint_files=None,
                    checkpoint_mode=None,
  -                 checkpoint_period="00:30:00",
  +                 checkpoint_period=None,
                    data_management_max_threads=10,
                    lazy_errors=True,
                    retries=0,
  @@ -62,8 +62,17 @@
           self.app_cache = app_cache
           self.checkpoint_files = checkpoint_files
           self.checkpoint_mode = checkpoint_mode
  -        if checkpoint_mode is not 'periodic' and checkpoint_period is not None:
  -            logger.debug("Checkpoint period only has an effect with checkpoint_mode='periodic'")
  +        if checkpoint_period is not None:
  +            if checkpoint_mode is None:
  +                logger.debug('The requested `checkpoint_period={}` will have no effect because `checkpoint_mode=None`'.format(
  +                    checkpoint_period)
  +                )
  +            elif checkpoint_mode is not 'periodic':
  +                logger.debug("Requested checkpoint period of {} only has an effect with checkpoint_mode='periodic'".format(
  +                    checkpoint_period)
  +                )
  +        if checkpoint_mode is 'periodic' and checkpoint_period is None:
  +            checkpoint_period = "00:30:00"
           self.checkpoint_period = checkpoint_period
           self.data_management_max_threads = data_management_max_threads
           self.lazy_errors = lazy_errors
  
verification_info: {"golden_diff": "diff --git a/parsl/config.py b/parsl/config.py\n--- a/parsl/config.py\n+++ b/parsl/config.py\n@@ -48,7 +48,7 @@\n                  app_cache=True,\n                  checkpoint_files=None,\n                  checkpoint_mode=None,\n-                 checkpoint_period=\"00:30:00\",\n+                 checkpoint_period=None,\n                  data_management_max_threads=10,\n                  lazy_errors=True,\n                  retries=0,\n@@ -62,8 +62,17 @@\n         self.app_cache = app_cache\n         self.checkpoint_files = checkpoint_files\n         self.checkpoint_mode = checkpoint_mode\n-        if checkpoint_mode is not 'periodic' and checkpoint_period is not None:\n-            logger.debug(\"Checkpoint period only has an effect with checkpoint_mode='periodic'\")\n+        if checkpoint_period is not None:\n+            if checkpoint_mode is None:\n+                logger.debug('The requested `checkpoint_period={}` will have no effect because `checkpoint_mode=None`'.format(\n+                    checkpoint_period)\n+                )\n+            elif checkpoint_mode is not 'periodic':\n+                logger.debug(\"Requested checkpoint period of {} only has an effect with checkpoint_mode='periodic'\".format(\n+                    checkpoint_period)\n+                )\n+        if checkpoint_mode is 'periodic' and checkpoint_period is None:\n+            checkpoint_period = \"00:30:00\"\n         self.checkpoint_period = checkpoint_period\n         self.data_management_max_threads = data_management_max_threads\n         self.lazy_errors = lazy_errors\n", "issue": "confusing error message with simple configs\nUsing this config:\r\n\r\n```\r\nconfig = Config(executors=[ThreadPoolExecutor()])\r\n```\r\n\r\nparsl startup logs this message to the logger:\r\n\r\n```\r\n$ ./c.py \r\n2018-07-11 08:04:42 parsl.config:66 [DEBUG]  Checkpoint period only has an effect with checkpoint_mode='periodic'\r\n```\r\n\r\nThis appears to be in config creation, as it happens even without passing that config to create a DataFlowKernel.\r\n\r\nThis might cause user confusion that something is broken/misconfigured.\r\n\n", "before_files": [{"content": "import logging\n\nfrom libsubmit.utils import RepresentationMixin\nfrom parsl.executors.threads import ThreadPoolExecutor\nfrom parsl.dataflow.error import ConfigurationError\n\nlogger = logging.getLogger(__name__)\n\n\nclass Config(RepresentationMixin):\n    \"\"\"\n    Specification of Parsl configuration options.\n\n    Parameters\n    ----------\n    executors : list of ParslExecutor, optional\n        List of executor instances to use. Possible executors include :class:`~parsl.executors.threads.ThreadPoolExecutor`,\n        :class:`~parsl.executors.ipp.IPyParallelExecutor`, or :class:`~parsl.executors.swift_t.TurbineExecutor`. Default\n        is [:class:`~parsl.executors.threads.ThreadPoolExecutor()`].\n    app_cache : bool, optional\n        Enable app caching. Default is True.\n    checkpoint_files : list of str, optional\n        List of paths to checkpoint files. Default is None.\n    checkpoint_mode : str, optional\n        Checkpoint mode to use, can be 'dfk_exit', 'task_exit', or 'periodic'. If set to\n        `None`, checkpointing will be disabled. Default is None.\n    checkpoint_period : str, optional\n        Time interval (in \"HH:MM:SS\") at which to checkpoint completed tasks. Only has an effect if\n        `checkpoint_mode='periodic'`.\n    data_management_max_threads : int, optional\n        Maximum number of threads to allocate for the data manager to use for managing input and output transfers.\n        Default is 10.\n    lazy_errors : bool, optional\n        If True, errors from task failures will not be raised until `future.result()` is called. Otherwise, they will\n        be raised as soon as the task returns. Default is True.\n    retries : int, optional\n        Set the number of retries in case of failure. Default is 0.\n    run_dir : str, optional\n        Path to run directory. Default is 'runinfo'.\n    strategy : str, optional\n        Strategy to use for scaling resources according to workflow needs. Can be 'simple' or `None`. If `None`, dynamic\n        scaling will be disabled. Default is 'simple'.\n    usage_tracking : bool, optional\n        Enable usage tracking. Default is True.\n    \"\"\"\n    def __init__(self,\n                 executors=None,\n                 app_cache=True,\n                 checkpoint_files=None,\n                 checkpoint_mode=None,\n                 checkpoint_period=\"00:30:00\",\n                 data_management_max_threads=10,\n                 lazy_errors=True,\n                 retries=0,\n                 run_dir='runinfo',\n                 strategy='simple',\n                 db_logger_config=None,\n                 usage_tracking=True):\n        if executors is None:\n            executors = [ThreadPoolExecutor()]\n        self.executors = executors\n        self.app_cache = app_cache\n        self.checkpoint_files = checkpoint_files\n        self.checkpoint_mode = checkpoint_mode\n        if checkpoint_mode is not 'periodic' and checkpoint_period is not None:\n            logger.debug(\"Checkpoint period only has an effect with checkpoint_mode='periodic'\")\n        self.checkpoint_period = checkpoint_period\n        self.data_management_max_threads = data_management_max_threads\n        self.lazy_errors = lazy_errors\n        self.retries = retries\n        self.run_dir = run_dir\n        self.strategy = strategy\n        self.usage_tracking = usage_tracking\n        self.db_logger_config = db_logger_config\n\n    @property\n    def executors(self):\n        return self._executors\n\n    @executors.setter\n    def executors(self, executors):\n        labels = [e.label for e in executors]\n        duplicates = [e for n, e in enumerate(labels) if e in labels[:n]]\n        if len(duplicates) > 0:\n            raise ConfigurationError('Executors must have unique labels ({})'.format(\n                ', '.join(['label={}'.format(repr(d)) for d in duplicates])))\n        self._executors = executors\n", "path": "parsl/config.py"}]}