We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
The example() decorator is improperly "fixing" the example text.
Version: 6.0.0

Code excerpt

``` python
@commands('abort')
@example(".abort")
```

Help output:

``` text
08:49  bgallew: .help abort
08:49  DevEgo: bgallew: Abort any/all pending power management commands.
08:49  DevEgo: bgallew: e.g. \.bort
```

If you update the prefix setting to be, say, '.|!', it's even more broken.

FTR, this affects Sopel's built-ins, too:

``` text
08:54  bgallew: .help help
08:54  DevEgo: bgallew: Shows a command's documentation, and possibly an example.
08:54  DevEgo: bgallew: e.g. \.elp tell
```


--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `sopel/loader.py`
Content:
```
1 # coding=utf-8
2 from __future__ import unicode_literals, absolute_import
3 
4 import imp
5 import os.path
6 import re
7 import sys
8 
9 from sopel.tools import itervalues, get_command_regexp
10 
11 if sys.version_info.major >= 3:
12     basestring = (str, bytes)
13 
14 
15 def get_module_description(path):
16     good_file = (os.path.isfile(path) and path.endswith('.py')
17                  and not path.startswith('_'))
18     good_dir = (os.path.isdir(path) and
19                 os.path.isfile(os.path.join(path, '__init__.py')))
20     if good_file:
21         name = os.path.basename(path)[:-3]
22         return (name, path, imp.PY_SOURCE)
23     elif good_dir:
24         name = os.path.basename(path)
25         return (name, path, imp.PKG_DIRECTORY)
26     else:
27         return None
28 
29 
30 def _update_modules_from_dir(modules, directory):
31     # Note that this modifies modules in place
32     for path in os.listdir(directory):
33         path = os.path.join(directory, path)
34         result = get_module_description(path)
35         if result:
36             modules[result[0]] = result[1:]
37 
38 
39 def enumerate_modules(config, show_all=False):
40     """Map the names of modules to the location of their file.
41 
42     Return a dict mapping the names of modules to a tuple of the module name,
43     the pathname and either `imp.PY_SOURCE` or `imp.PKG_DIRECTORY`. This
44     searches the regular modules directory and all directories specified in the
45     `core.extra` attribute of the `config` object. If two modules have the same
46     name, the last one to be found will be returned and the rest will be
47     ignored. Modules are found starting in the regular directory, followed by
48     `~/.sopel/modules`, and then through the extra directories in the order
49     that the are specified.
50 
51     If `show_all` is given as `True`, the `enable` and `exclude`
52     configuration options will be ignored, and all modules will be shown
53     (though duplicates will still be ignored as above).
54     """
55     modules = {}
56 
57     # First, add modules from the regular modules directory
58     main_dir = os.path.dirname(os.path.abspath(__file__))
59     modules_dir = os.path.join(main_dir, 'modules')
60     _update_modules_from_dir(modules, modules_dir)
61     for path in os.listdir(modules_dir):
62         break
63 
64     # Then, find PyPI installed modules
65     # TODO does this work with all possible install mechanisms?
66     try:
67         import sopel_modules
68     except:
69         pass
70     else:
71         for directory in sopel_modules.__path__:
72             _update_modules_from_dir(modules, directory)
73 
74     # Next, look in ~/.sopel/modules
75     home_modules_dir = os.path.join(config.homedir, 'modules')
76     if not os.path.isdir(home_modules_dir):
77         os.makedirs(home_modules_dir)
78     _update_modules_from_dir(modules, home_modules_dir)
79 
80     # Last, look at all the extra directories.
81     for directory in config.core.extra:
82         _update_modules_from_dir(modules, directory)
83 
84     # Coretasks is special. No custom user coretasks.
85     ct_path = os.path.join(main_dir, 'coretasks.py')
86     modules['coretasks'] = (ct_path, imp.PY_SOURCE)
87 
88     # If caller wants all of them, don't apply white and blacklists
89     if show_all:
90         return modules
91 
92     # Apply whitelist, if present
93     enable = config.core.enable
94     if enable:
95         enabled_modules = {'coretasks': modules['coretasks']}
96         for module in enable:
97             if module in modules:
98                 enabled_modules[module] = modules[module]
99         modules = enabled_modules
100 
101     # Apply blacklist, if present
102     exclude = config.core.exclude
103     for module in exclude:
104         if module in modules:
105             del modules[module]
106 
107     return modules
108 
109 
110 def compile_rule(nick, pattern):
111     pattern = pattern.replace('$nickname', nick)
112     pattern = pattern.replace('$nick', r'{}[,:]\s+'.format(nick))
113     flags = re.IGNORECASE
114     if '\n' in pattern:
115         flags |= re.VERBOSE
116     return re.compile(pattern, flags)
117 
118 
119 def trim_docstring(doc):
120     """Get the docstring as a series of lines that can be sent"""
121     if not doc:
122         return []
123     lines = doc.expandtabs().splitlines()
124     indent = sys.maxsize
125     for line in lines[1:]:
126         stripped = line.lstrip()
127         if stripped:
128             indent = min(indent, len(line) - len(stripped))
129     trimmed = [lines[0].strip()]
130     if indent < sys.maxsize:
131         for line in lines[1:]:
132             trimmed.append(line[:].rstrip())
133     while trimmed and not trimmed[-1]:
134         trimmed.pop()
135     while trimmed and not trimmed[0]:
136         trimmed.pop(0)
137     return trimmed
138 
139 
140 def clean_callable(func, config):
141     """Compiles the regexes, moves commands into func.rule, fixes up docs and
142     puts them in func._docs, and sets defaults"""
143     nick = config.core.nick
144     prefix = config.core.prefix
145     help_prefix = config.core.prefix
146     func._docs = {}
147     doc = trim_docstring(func.__doc__)
148     example = None
149 
150     func.unblockable = getattr(func, 'unblockable', True)
151     func.priority = getattr(func, 'priority', 'medium')
152     func.thread = getattr(func, 'thread', True)
153     func.rate = getattr(func, 'rate', 0)
154 
155     if not hasattr(func, 'event'):
156         func.event = ['PRIVMSG']
157     else:
158         if isinstance(func.event, basestring):
159             func.event = [func.event.upper()]
160         else:
161             func.event = [event.upper() for event in func.event]
162 
163     if hasattr(func, 'rule'):
164         if isinstance(func.rule, basestring):
165             func.rule = [func.rule]
166         func.rule = [compile_rule(nick, rule) for rule in func.rule]
167 
168     if hasattr(func, 'commands'):
169         func.rule = getattr(func, 'rule', [])
170         for command in func.commands:
171             regexp = get_command_regexp(prefix, command)
172             func.rule.append(regexp)
173         if hasattr(func, 'example'):
174             example = func.example[0]["example"]
175             example = example.replace('$nickname', nick)
176             if example[0] != help_prefix:
177                 example = help_prefix + example[len(help_prefix):]
178         if doc or example:
179             for command in func.commands:
180                 func._docs[command] = (doc, example)
181 
182 
183 def load_module(name, path, type_):
184     """Load a module, and sort out the callables and shutdowns"""
185     if type_ == imp.PY_SOURCE:
186         with open(path) as mod:
187             module = imp.load_module(name, mod, path, ('.py', 'U', type_))
188     elif type_ == imp.PKG_DIRECTORY:
189         module = imp.load_module(name, None, path, ('', '', type_))
190     else:
191         raise TypeError('Unsupported module type')
192     return module, os.path.getmtime(path)
193 
194 
195 def is_triggerable(obj):
196     return any(hasattr(obj, attr) for attr in ('rule', 'rule', 'intent',
197                                                'commands'))
198 
199 
200 def clean_module(module, config):
201     callables = []
202     shutdowns = []
203     jobs = []
204     for obj in itervalues(vars(module)):
205         if callable(obj):
206             if getattr(obj, '__name__', None) == 'shutdown':
207                 shutdowns.append(obj)
208             elif is_triggerable(obj):
209                 clean_callable(obj, config)
210                 callables.append(obj)
211             elif hasattr(obj, 'interval'):
212                 clean_callable(obj, config)
213                 jobs.append(obj)
214     return callables, jobs, shutdowns
215
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/sopel/loader.py b/sopel/loader.py
--- a/sopel/loader.py
+++ b/sopel/loader.py
@@ -142,7 +142,7 @@
     puts them in func._docs, and sets defaults"""
     nick = config.core.nick
     prefix = config.core.prefix
-    help_prefix = config.core.prefix
+    help_prefix = config.core.help_prefix
     func._docs = {}
     doc = trim_docstring(func.__doc__)
     example = None

{"golden_diff": "diff --git a/sopel/loader.py b/sopel/loader.py\n--- a/sopel/loader.py\n+++ b/sopel/loader.py\n@@ -142,7 +142,7 @@\n     puts them in func._docs, and sets defaults\"\"\"\n     nick = config.core.nick\n     prefix = config.core.prefix\n-    help_prefix = config.core.prefix\n+    help_prefix = config.core.help_prefix\n     func._docs = {}\n     doc = trim_docstring(func.__doc__)\n     example = None\n", "issue": "The example() decorator is improperly \"fixing\" the example text.\nVersion: 6.0.0\n\nCode excerpt\n\n``` python\n@commands('abort')\n@example(\".abort\")\n```\n\nHelp output:\n\n``` text\n08:49  bgallew: .help abort\n08:49  DevEgo: bgallew: Abort any/all pending power management commands.\n08:49  DevEgo: bgallew: e.g. \\.bort\n```\n\nIf you update the prefix setting to be, say, '.|!', it's even more broken.\n\nFTR, this affects Sopel's built-ins, too:\n\n``` text\n08:54  bgallew: .help help\n08:54  DevEgo: bgallew: Shows a command's documentation, and possibly an example.\n08:54  DevEgo: bgallew: e.g. \\.elp tell\n```\n\n", "before_files": [{"content": "# coding=utf-8\nfrom __future__ import unicode_literals, absolute_import\n\nimport imp\nimport os.path\nimport re\nimport sys\n\nfrom sopel.tools import itervalues, get_command_regexp\n\nif sys.version_info.major >= 3:\n    basestring = (str, bytes)\n\n\ndef get_module_description(path):\n    good_file = (os.path.isfile(path) and path.endswith('.py')\n                 and not path.startswith('_'))\n    good_dir = (os.path.isdir(path) and\n                os.path.isfile(os.path.join(path, '__init__.py')))\n    if good_file:\n        name = os.path.basename(path)[:-3]\n        return (name, path, imp.PY_SOURCE)\n    elif good_dir:\n        name = os.path.basename(path)\n        return (name, path, imp.PKG_DIRECTORY)\n    else:\n        return None\n\n\ndef _update_modules_from_dir(modules, directory):\n    # Note that this modifies modules in place\n    for path in os.listdir(directory):\n        path = os.path.join(directory, path)\n        result = get_module_description(path)\n        if result:\n            modules[result[0]] = result[1:]\n\n\ndef enumerate_modules(config, show_all=False):\n    \"\"\"Map the names of modules to the location of their file.\n\n    Return a dict mapping the names of modules to a tuple of the module name,\n    the pathname and either `imp.PY_SOURCE` or `imp.PKG_DIRECTORY`. This\n    searches the regular modules directory and all directories specified in the\n    `core.extra` attribute of the `config` object. If two modules have the same\n    name, the last one to be found will be returned and the rest will be\n    ignored. Modules are found starting in the regular directory, followed by\n    `~/.sopel/modules`, and then through the extra directories in the order\n    that the are specified.\n\n    If `show_all` is given as `True`, the `enable` and `exclude`\n    configuration options will be ignored, and all modules will be shown\n    (though duplicates will still be ignored as above).\n    \"\"\"\n    modules = {}\n\n    # First, add modules from the regular modules directory\n    main_dir = os.path.dirname(os.path.abspath(__file__))\n    modules_dir = os.path.join(main_dir, 'modules')\n    _update_modules_from_dir(modules, modules_dir)\n    for path in os.listdir(modules_dir):\n        break\n\n    # Then, find PyPI installed modules\n    # TODO does this work with all possible install mechanisms?\n    try:\n        import sopel_modules\n    except:\n        pass\n    else:\n        for directory in sopel_modules.__path__:\n            _update_modules_from_dir(modules, directory)\n\n    # Next, look in ~/.sopel/modules\n    home_modules_dir = os.path.join(config.homedir, 'modules')\n    if not os.path.isdir(home_modules_dir):\n        os.makedirs(home_modules_dir)\n    _update_modules_from_dir(modules, home_modules_dir)\n\n    # Last, look at all the extra directories.\n    for directory in config.core.extra:\n        _update_modules_from_dir(modules, directory)\n\n    # Coretasks is special. No custom user coretasks.\n    ct_path = os.path.join(main_dir, 'coretasks.py')\n    modules['coretasks'] = (ct_path, imp.PY_SOURCE)\n\n    # If caller wants all of them, don't apply white and blacklists\n    if show_all:\n        return modules\n\n    # Apply whitelist, if present\n    enable = config.core.enable\n    if enable:\n        enabled_modules = {'coretasks': modules['coretasks']}\n        for module in enable:\n            if module in modules:\n                enabled_modules[module] = modules[module]\n        modules = enabled_modules\n\n    # Apply blacklist, if present\n    exclude = config.core.exclude\n    for module in exclude:\n        if module in modules:\n            del modules[module]\n\n    return modules\n\n\ndef compile_rule(nick, pattern):\n    pattern = pattern.replace('$nickname', nick)\n    pattern = pattern.replace('$nick', r'{}[,:]\\s+'.format(nick))\n    flags = re.IGNORECASE\n    if '\\n' in pattern:\n        flags |= re.VERBOSE\n    return re.compile(pattern, flags)\n\n\ndef trim_docstring(doc):\n    \"\"\"Get the docstring as a series of lines that can be sent\"\"\"\n    if not doc:\n        return []\n    lines = doc.expandtabs().splitlines()\n    indent = sys.maxsize\n    for line in lines[1:]:\n        stripped = line.lstrip()\n        if stripped:\n            indent = min(indent, len(line) - len(stripped))\n    trimmed = [lines[0].strip()]\n    if indent < sys.maxsize:\n        for line in lines[1:]:\n            trimmed.append(line[:].rstrip())\n    while trimmed and not trimmed[-1]:\n        trimmed.pop()\n    while trimmed and not trimmed[0]:\n        trimmed.pop(0)\n    return trimmed\n\n\ndef clean_callable(func, config):\n    \"\"\"Compiles the regexes, moves commands into func.rule, fixes up docs and\n    puts them in func._docs, and sets defaults\"\"\"\n    nick = config.core.nick\n    prefix = config.core.prefix\n    help_prefix = config.core.prefix\n    func._docs = {}\n    doc = trim_docstring(func.__doc__)\n    example = None\n\n    func.unblockable = getattr(func, 'unblockable', True)\n    func.priority = getattr(func, 'priority', 'medium')\n    func.thread = getattr(func, 'thread', True)\n    func.rate = getattr(func, 'rate', 0)\n\n    if not hasattr(func, 'event'):\n        func.event = ['PRIVMSG']\n    else:\n        if isinstance(func.event, basestring):\n            func.event = [func.event.upper()]\n        else:\n            func.event = [event.upper() for event in func.event]\n\n    if hasattr(func, 'rule'):\n        if isinstance(func.rule, basestring):\n            func.rule = [func.rule]\n        func.rule = [compile_rule(nick, rule) for rule in func.rule]\n\n    if hasattr(func, 'commands'):\n        func.rule = getattr(func, 'rule', [])\n        for command in func.commands:\n            regexp = get_command_regexp(prefix, command)\n            func.rule.append(regexp)\n        if hasattr(func, 'example'):\n            example = func.example[0][\"example\"]\n            example = example.replace('$nickname', nick)\n            if example[0] != help_prefix:\n                example = help_prefix + example[len(help_prefix):]\n        if doc or example:\n            for command in func.commands:\n                func._docs[command] = (doc, example)\n\n\ndef load_module(name, path, type_):\n    \"\"\"Load a module, and sort out the callables and shutdowns\"\"\"\n    if type_ == imp.PY_SOURCE:\n        with open(path) as mod:\n            module = imp.load_module(name, mod, path, ('.py', 'U', type_))\n    elif type_ == imp.PKG_DIRECTORY:\n        module = imp.load_module(name, None, path, ('', '', type_))\n    else:\n        raise TypeError('Unsupported module type')\n    return module, os.path.getmtime(path)\n\n\ndef is_triggerable(obj):\n    return any(hasattr(obj, attr) for attr in ('rule', 'rule', 'intent',\n                                               'commands'))\n\n\ndef clean_module(module, config):\n    callables = []\n    shutdowns = []\n    jobs = []\n    for obj in itervalues(vars(module)):\n        if callable(obj):\n            if getattr(obj, '__name__', None) == 'shutdown':\n                shutdowns.append(obj)\n            elif is_triggerable(obj):\n                clean_callable(obj, config)\n                callables.append(obj)\n            elif hasattr(obj, 'interval'):\n                clean_callable(obj, config)\n                jobs.append(obj)\n    return callables, jobs, shutdowns\n", "path": "sopel/loader.py"}], "after_files": [{"content": "# coding=utf-8\nfrom __future__ import unicode_literals, absolute_import\n\nimport imp\nimport os.path\nimport re\nimport sys\n\nfrom sopel.tools import itervalues, get_command_regexp\n\nif sys.version_info.major >= 3:\n    basestring = (str, bytes)\n\n\ndef get_module_description(path):\n    good_file = (os.path.isfile(path) and path.endswith('.py')\n                 and not path.startswith('_'))\n    good_dir = (os.path.isdir(path) and\n                os.path.isfile(os.path.join(path, '__init__.py')))\n    if good_file:\n        name = os.path.basename(path)[:-3]\n        return (name, path, imp.PY_SOURCE)\n    elif good_dir:\n        name = os.path.basename(path)\n        return (name, path, imp.PKG_DIRECTORY)\n    else:\n        return None\n\n\ndef _update_modules_from_dir(modules, directory):\n    # Note that this modifies modules in place\n    for path in os.listdir(directory):\n        path = os.path.join(directory, path)\n        result = get_module_description(path)\n        if result:\n            modules[result[0]] = result[1:]\n\n\ndef enumerate_modules(config, show_all=False):\n    \"\"\"Map the names of modules to the location of their file.\n\n    Return a dict mapping the names of modules to a tuple of the module name,\n    the pathname and either `imp.PY_SOURCE` or `imp.PKG_DIRECTORY`. This\n    searches the regular modules directory and all directories specified in the\n    `core.extra` attribute of the `config` object. If two modules have the same\n    name, the last one to be found will be returned and the rest will be\n    ignored. Modules are found starting in the regular directory, followed by\n    `~/.sopel/modules`, and then through the extra directories in the order\n    that the are specified.\n\n    If `show_all` is given as `True`, the `enable` and `exclude`\n    configuration options will be ignored, and all modules will be shown\n    (though duplicates will still be ignored as above).\n    \"\"\"\n    modules = {}\n\n    # First, add modules from the regular modules directory\n    main_dir = os.path.dirname(os.path.abspath(__file__))\n    modules_dir = os.path.join(main_dir, 'modules')\n    _update_modules_from_dir(modules, modules_dir)\n    for path in os.listdir(modules_dir):\n        break\n\n    # Then, find PyPI installed modules\n    # TODO does this work with all possible install mechanisms?\n    try:\n        import sopel_modules\n    except:\n        pass\n    else:\n        for directory in sopel_modules.__path__:\n            _update_modules_from_dir(modules, directory)\n\n    # Next, look in ~/.sopel/modules\n    home_modules_dir = os.path.join(config.homedir, 'modules')\n    if not os.path.isdir(home_modules_dir):\n        os.makedirs(home_modules_dir)\n    _update_modules_from_dir(modules, home_modules_dir)\n\n    # Last, look at all the extra directories.\n    for directory in config.core.extra:\n        _update_modules_from_dir(modules, directory)\n\n    # Coretasks is special. No custom user coretasks.\n    ct_path = os.path.join(main_dir, 'coretasks.py')\n    modules['coretasks'] = (ct_path, imp.PY_SOURCE)\n\n    # If caller wants all of them, don't apply white and blacklists\n    if show_all:\n        return modules\n\n    # Apply whitelist, if present\n    enable = config.core.enable\n    if enable:\n        enabled_modules = {'coretasks': modules['coretasks']}\n        for module in enable:\n            if module in modules:\n                enabled_modules[module] = modules[module]\n        modules = enabled_modules\n\n    # Apply blacklist, if present\n    exclude = config.core.exclude\n    for module in exclude:\n        if module in modules:\n            del modules[module]\n\n    return modules\n\n\ndef compile_rule(nick, pattern):\n    pattern = pattern.replace('$nickname', nick)\n    pattern = pattern.replace('$nick', r'{}[,:]\\s+'.format(nick))\n    flags = re.IGNORECASE\n    if '\\n' in pattern:\n        flags |= re.VERBOSE\n    return re.compile(pattern, flags)\n\n\ndef trim_docstring(doc):\n    \"\"\"Get the docstring as a series of lines that can be sent\"\"\"\n    if not doc:\n        return []\n    lines = doc.expandtabs().splitlines()\n    indent = sys.maxsize\n    for line in lines[1:]:\n        stripped = line.lstrip()\n        if stripped:\n            indent = min(indent, len(line) - len(stripped))\n    trimmed = [lines[0].strip()]\n    if indent < sys.maxsize:\n        for line in lines[1:]:\n            trimmed.append(line[:].rstrip())\n    while trimmed and not trimmed[-1]:\n        trimmed.pop()\n    while trimmed and not trimmed[0]:\n        trimmed.pop(0)\n    return trimmed\n\n\ndef clean_callable(func, config):\n    \"\"\"Compiles the regexes, moves commands into func.rule, fixes up docs and\n    puts them in func._docs, and sets defaults\"\"\"\n    nick = config.core.nick\n    prefix = config.core.prefix\n    help_prefix = config.core.help_prefix\n    func._docs = {}\n    doc = trim_docstring(func.__doc__)\n    example = None\n\n    func.unblockable = getattr(func, 'unblockable', True)\n    func.priority = getattr(func, 'priority', 'medium')\n    func.thread = getattr(func, 'thread', True)\n    func.rate = getattr(func, 'rate', 0)\n\n    if not hasattr(func, 'event'):\n        func.event = ['PRIVMSG']\n    else:\n        if isinstance(func.event, basestring):\n            func.event = [func.event.upper()]\n        else:\n            func.event = [event.upper() for event in func.event]\n\n    if hasattr(func, 'rule'):\n        if isinstance(func.rule, basestring):\n            func.rule = [func.rule]\n        func.rule = [compile_rule(nick, rule) for rule in func.rule]\n\n    if hasattr(func, 'commands'):\n        func.rule = getattr(func, 'rule', [])\n        for command in func.commands:\n            regexp = get_command_regexp(prefix, command)\n            func.rule.append(regexp)\n        if hasattr(func, 'example'):\n            example = func.example[0][\"example\"]\n            example = example.replace('$nickname', nick)\n            if example[0] != help_prefix:\n                example = help_prefix + example[len(help_prefix):]\n        if doc or example:\n            for command in func.commands:\n                func._docs[command] = (doc, example)\n\n\ndef load_module(name, path, type_):\n    \"\"\"Load a module, and sort out the callables and shutdowns\"\"\"\n    if type_ == imp.PY_SOURCE:\n        with open(path) as mod:\n            module = imp.load_module(name, mod, path, ('.py', 'U', type_))\n    elif type_ == imp.PKG_DIRECTORY:\n        module = imp.load_module(name, None, path, ('', '', type_))\n    else:\n        raise TypeError('Unsupported module type')\n    return module, os.path.getmtime(path)\n\n\ndef is_triggerable(obj):\n    return any(hasattr(obj, attr) for attr in ('rule', 'rule', 'intent',\n                                               'commands'))\n\n\ndef clean_module(module, config):\n    callables = []\n    shutdowns = []\n    jobs = []\n    for obj in itervalues(vars(module)):\n        if callable(obj):\n            if getattr(obj, '__name__', None) == 'shutdown':\n                shutdowns.append(obj)\n            elif is_triggerable(obj):\n                clean_callable(obj, config)\n                callables.append(obj)\n            elif hasattr(obj, 'interval'):\n                clean_callable(obj, config)\n                jobs.append(obj)\n    return callables, jobs, shutdowns\n", "path": "sopel/loader.py"}]}