We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Add a specific error when user is missing a config file?
As @DanielKuebi was setting up the JWQL package, he found that he didn't have the `config.json` file that is required to run the package.

I looked back into `utils.py`, and I'm thinking it might be wise to raise a specific error when a user doesn't have the `config.json` file, so it is clear when that is the problem. Maybe even the error message could encourage them to email `jwql@stsci.edu` to ask a team member for assistance? 

If anyone thinks this isn't a good idea for security reasons, please say so.

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `jwql/utils/utils.py`
Content:
```
1 """Various utility functions for the ``jwql`` project.
2 
3 Authors
4 -------
5 
6     - Matthew Bourque
7     - Lauren Chambers
8 
9 Use
10 ---
11 
12     This module can be imported as such:
13 
14     >>> import utils
15     settings = get_config()
16 
17 References
18 ----------
19 
20     Filename parser modified from Joe Hunkeler:
21     https://gist.github.com/jhunkeler/f08783ca2da7bfd1f8e9ee1d207da5ff
22  """
23 
24 import getpass
25 import json
26 import os
27 import re
28 
29 from jwql.utils import permissions
30 from jwql.utils.constants import FILE_SUFFIX_TYPES
31 
32 __location__ = os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file__)))
33 
34 
35 def ensure_dir_exists(fullpath):
36     """Creates dirs from ``fullpath`` if they do not already exist.
37     """
38     if not os.path.exists(fullpath):
39         os.makedirs(fullpath)
40         permissions.set_permissions(fullpath)
41 
42 
43 def filename_parser(filename):
44     """Return a dictionary that contains the properties of a given
45     JWST file (e.g. program ID, visit number, detector, etc.).
46 
47     Parameters
48     ----------
49     filename : str
50         Path or name of JWST file to parse
51 
52     Returns
53     -------
54     filename_dict : dict
55         Collection of file properties
56 
57     Raises
58     ------
59     ValueError
60         When the provided file does not follow naming conventions
61     """
62 
63     filename = os.path.basename(filename)
64     file_root_name = (len(filename.split('.')) < 2)
65 
66     # Stage 1 and 2 filenames, e.g. "jw80500012009_01101_00012_nrcalong_uncal.fits"
67     stage_1_and_2 = \
68         r"jw" \
69         r"(?P<program_id>\d{5})"\
70         r"(?P<observation>\d{3})"\
71         r"(?P<visit>\d{3})"\
72         r"_(?P<visit_group>\d{2})"\
73         r"(?P<parallel_seq_id>\d{1})"\
74         r"(?P<activity>\w{2})"\
75         r"_(?P<exposure_id>\d+)"\
76         r"_(?P<detector>((?!_)[\w])+)"
77 
78     # Stage 3 filenames with target ID, e.g. "jw80600-o009_t001_miri_f1130w_i2d.fits"
79     stage_3_target_id = \
80         r"jw" \
81         r"(?P<program_id>\d{5})"\
82         r"-(?P<ac_id>(o|c|a|r)\d{3,4})"\
83         r"_(?P<target_id>(t)\d{3})"\
84         r"_(?P<instrument>(nircam|niriss|nirspec|miri|fgs))"\
85         r"_(?P<optical_elements>((?!_)[\w-])+)"
86 
87     # Stage 3 filenames with source ID, e.g. "jw80600-o009_s00001_miri_f1130w_i2d.fits"
88     stage_3_source_id = \
89         r"jw" \
90         r"(?P<program_id>\d{5})"\
91         r"-(?P<ac_id>(o|c|a|r)\d{3,4})"\
92         r"_(?P<source_id>(s)\d{5})"\
93         r"_(?P<instrument>(nircam|niriss|nirspec|miri|fgs))"\
94         r"_(?P<optical_elements>((?!_)[\w-])+)"
95 
96     # Stage 3 filenames with target ID and epoch, e.g. "jw80600-o009_t001-epoch1_miri_f1130w_i2d.fits"
97     stage_3_target_id_epoch = \
98         r"jw" \
99         r"(?P<program_id>\d{5})"\
100         r"-(?P<ac_id>(o|c|a|r)\d{3,4})"\
101         r"_(?P<target_id>(t)\d{3})"\
102         r"-epoch(?P<epoch>\d{1})"\
103         r"_(?P<instrument>(nircam|niriss|nirspec|miri|fgs))"\
104         r"_(?P<optical_elements>((?!_)[\w-])+)"
105 
106     # Stage 3 filenames with source ID and epoch, e.g. "jw80600-o009_s00001-epoch1_miri_f1130w_i2d.fits"
107     stage_3_source_id_epoch = \
108         r"jw" \
109         r"(?P<program_id>\d{5})"\
110         r"-(?P<ac_id>(o|c|a|r)\d{3,4})"\
111         r"_(?P<source_id>(s)\d{5})"\
112         r"-epoch(?P<epoch>\d{1})"\
113         r"_(?P<instrument>(nircam|niriss|nirspec|miri|fgs))"\
114         r"_(?P<optical_elements>((?!_)[\w-])+)"
115 
116     # Time series filenames, e.g. "jw00733003001_02101_00002-seg001_nrs1_rate.fits"
117     time_series = \
118         r"jw" \
119         r"(?P<program_id>\d{5})"\
120         r"(?P<observation>\d{3})"\
121         r"(?P<visit>\d{3})"\
122         r"_(?P<visit_group>\d{2})"\
123         r"(?P<parallel_seq_id>\d{1})"\
124         r"(?P<activity>\w{2})"\
125         r"_(?P<exposure_id>\d+)"\
126         r"-seg(?P<segment>\d{3})"\
127         r"_(?P<detector>\w+)"
128 
129     # Build list of filename types
130     filename_types = [stage_1_and_2, stage_3_target_id, stage_3_source_id, stage_3_target_id_epoch, stage_3_source_id_epoch, time_series]
131 
132     # Try to parse the filename
133     for filename_type in filename_types:
134 
135         # If full filename, try using suffix
136         if not file_root_name:
137             filename_type += r"_(?P<suffix>{}).*".format('|'.join(FILE_SUFFIX_TYPES))
138 
139         elements = re.compile(filename_type)
140         jwst_file = elements.match(filename)
141         if jwst_file is not None:
142             break
143 
144     # Raise error if unable to parse the filename
145     try:
146         filename_dict = jwst_file.groupdict()
147     except AttributeError:
148         jdox_url = 'https://jwst-docs.stsci.edu/display/JDAT/File+Naming+Conventions+and+Data+Products'
149         raise ValueError('Provided file {} does not follow JWST naming conventions.  See {} for further information.'.format(filename, jdox_url))
150 
151     return filename_dict
152 
153 
154 def get_base_url():
155     """Return the beginning part of the URL to the ``jwql`` web app
156     based on which user is running the software.
157 
158     If the admin account is running the code, the ``base_url`` is
159     assumed to be the production URL.  If not, the ``base_url`` is
160     assumed to be local.
161 
162     Returns
163     -------
164     base_url : str
165         The beginning part of the URL to the ``jwql`` web app
166     """
167 
168     username = getpass.getuser()
169     if username == get_config()['admin_account']:
170         base_url = 'https://dljwql.stsci.edu'
171     else:
172         base_url = 'http://127.0.0.1:8000'
173 
174     return base_url
175 
176 
177 def get_config():
178     """Return a dictionary that holds the contents of the ``jwql``
179     config file.
180 
181     Returns
182     -------
183     settings : dict
184         A dictionary that holds the contents of the config file.
185     """
186     with open(os.path.join(__location__, 'config.json'), 'r') as config_file:
187         settings = json.load(config_file)
188 
189     return settings
190
```
--- 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/jwql/utils/utils.py b/jwql/utils/utils.py
--- a/jwql/utils/utils.py
+++ b/jwql/utils/utils.py
@@ -183,7 +183,16 @@
     settings : dict
         A dictionary that holds the contents of the config file.
     """
-    with open(os.path.join(__location__, 'config.json'), 'r') as config_file:
+    config_file_location = os.path.join(__location__, 'config.json')
+
+    if not os.path.isfile(config_file_location):
+        raise FileNotFoundError('The JWQL package requires a configuration file (config.json) '
+                                'to be placed within the jwql/utils directory. '
+                                'This file is missing. Please read the relevant wiki page '
+                                '(https://github.com/spacetelescope/jwql/wiki/'
+                                'Config-file) for more information.')
+
+    with open(config_file_location, 'r') as config_file:
         settings = json.load(config_file)
 
     return settings

{"golden_diff": "diff --git a/jwql/utils/utils.py b/jwql/utils/utils.py\n--- a/jwql/utils/utils.py\n+++ b/jwql/utils/utils.py\n@@ -183,7 +183,16 @@\n     settings : dict\n         A dictionary that holds the contents of the config file.\n     \"\"\"\n-    with open(os.path.join(__location__, 'config.json'), 'r') as config_file:\n+    config_file_location = os.path.join(__location__, 'config.json')\n+\n+    if not os.path.isfile(config_file_location):\n+        raise FileNotFoundError('The JWQL package requires a configuration file (config.json) '\n+                                'to be placed within the jwql/utils directory. '\n+                                'This file is missing. Please read the relevant wiki page '\n+                                '(https://github.com/spacetelescope/jwql/wiki/'\n+                                'Config-file) for more information.')\n+\n+    with open(config_file_location, 'r') as config_file:\n         settings = json.load(config_file)\n \n     return settings\n", "issue": "Add a specific error when user is missing a config file?\nAs @DanielKuebi was setting up the JWQL package, he found that he didn't have the `config.json` file that is required to run the package.\r\n\r\nI looked back into `utils.py`, and I'm thinking it might be wise to raise a specific error when a user doesn't have the `config.json` file, so it is clear when that is the problem. Maybe even the error message could encourage them to email `jwql@stsci.edu` to ask a team member for assistance? \r\n\r\nIf anyone thinks this isn't a good idea for security reasons, please say so.\n", "before_files": [{"content": "\"\"\"Various utility functions for the ``jwql`` project.\n\nAuthors\n-------\n\n    - Matthew Bourque\n    - Lauren Chambers\n\nUse\n---\n\n    This module can be imported as such:\n\n    >>> import utils\n    settings = get_config()\n\nReferences\n----------\n\n    Filename parser modified from Joe Hunkeler:\n    https://gist.github.com/jhunkeler/f08783ca2da7bfd1f8e9ee1d207da5ff\n \"\"\"\n\nimport getpass\nimport json\nimport os\nimport re\n\nfrom jwql.utils import permissions\nfrom jwql.utils.constants import FILE_SUFFIX_TYPES\n\n__location__ = os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file__)))\n\n\ndef ensure_dir_exists(fullpath):\n    \"\"\"Creates dirs from ``fullpath`` if they do not already exist.\n    \"\"\"\n    if not os.path.exists(fullpath):\n        os.makedirs(fullpath)\n        permissions.set_permissions(fullpath)\n\n\ndef filename_parser(filename):\n    \"\"\"Return a dictionary that contains the properties of a given\n    JWST file (e.g. program ID, visit number, detector, etc.).\n\n    Parameters\n    ----------\n    filename : str\n        Path or name of JWST file to parse\n\n    Returns\n    -------\n    filename_dict : dict\n        Collection of file properties\n\n    Raises\n    ------\n    ValueError\n        When the provided file does not follow naming conventions\n    \"\"\"\n\n    filename = os.path.basename(filename)\n    file_root_name = (len(filename.split('.')) < 2)\n\n    # Stage 1 and 2 filenames, e.g. \"jw80500012009_01101_00012_nrcalong_uncal.fits\"\n    stage_1_and_2 = \\\n        r\"jw\" \\\n        r\"(?P<program_id>\\d{5})\"\\\n        r\"(?P<observation>\\d{3})\"\\\n        r\"(?P<visit>\\d{3})\"\\\n        r\"_(?P<visit_group>\\d{2})\"\\\n        r\"(?P<parallel_seq_id>\\d{1})\"\\\n        r\"(?P<activity>\\w{2})\"\\\n        r\"_(?P<exposure_id>\\d+)\"\\\n        r\"_(?P<detector>((?!_)[\\w])+)\"\n\n    # Stage 3 filenames with target ID, e.g. \"jw80600-o009_t001_miri_f1130w_i2d.fits\"\n    stage_3_target_id = \\\n        r\"jw\" \\\n        r\"(?P<program_id>\\d{5})\"\\\n        r\"-(?P<ac_id>(o|c|a|r)\\d{3,4})\"\\\n        r\"_(?P<target_id>(t)\\d{3})\"\\\n        r\"_(?P<instrument>(nircam|niriss|nirspec|miri|fgs))\"\\\n        r\"_(?P<optical_elements>((?!_)[\\w-])+)\"\n\n    # Stage 3 filenames with source ID, e.g. \"jw80600-o009_s00001_miri_f1130w_i2d.fits\"\n    stage_3_source_id = \\\n        r\"jw\" \\\n        r\"(?P<program_id>\\d{5})\"\\\n        r\"-(?P<ac_id>(o|c|a|r)\\d{3,4})\"\\\n        r\"_(?P<source_id>(s)\\d{5})\"\\\n        r\"_(?P<instrument>(nircam|niriss|nirspec|miri|fgs))\"\\\n        r\"_(?P<optical_elements>((?!_)[\\w-])+)\"\n\n    # Stage 3 filenames with target ID and epoch, e.g. \"jw80600-o009_t001-epoch1_miri_f1130w_i2d.fits\"\n    stage_3_target_id_epoch = \\\n        r\"jw\" \\\n        r\"(?P<program_id>\\d{5})\"\\\n        r\"-(?P<ac_id>(o|c|a|r)\\d{3,4})\"\\\n        r\"_(?P<target_id>(t)\\d{3})\"\\\n        r\"-epoch(?P<epoch>\\d{1})\"\\\n        r\"_(?P<instrument>(nircam|niriss|nirspec|miri|fgs))\"\\\n        r\"_(?P<optical_elements>((?!_)[\\w-])+)\"\n\n    # Stage 3 filenames with source ID and epoch, e.g. \"jw80600-o009_s00001-epoch1_miri_f1130w_i2d.fits\"\n    stage_3_source_id_epoch = \\\n        r\"jw\" \\\n        r\"(?P<program_id>\\d{5})\"\\\n        r\"-(?P<ac_id>(o|c|a|r)\\d{3,4})\"\\\n        r\"_(?P<source_id>(s)\\d{5})\"\\\n        r\"-epoch(?P<epoch>\\d{1})\"\\\n        r\"_(?P<instrument>(nircam|niriss|nirspec|miri|fgs))\"\\\n        r\"_(?P<optical_elements>((?!_)[\\w-])+)\"\n\n    # Time series filenames, e.g. \"jw00733003001_02101_00002-seg001_nrs1_rate.fits\"\n    time_series = \\\n        r\"jw\" \\\n        r\"(?P<program_id>\\d{5})\"\\\n        r\"(?P<observation>\\d{3})\"\\\n        r\"(?P<visit>\\d{3})\"\\\n        r\"_(?P<visit_group>\\d{2})\"\\\n        r\"(?P<parallel_seq_id>\\d{1})\"\\\n        r\"(?P<activity>\\w{2})\"\\\n        r\"_(?P<exposure_id>\\d+)\"\\\n        r\"-seg(?P<segment>\\d{3})\"\\\n        r\"_(?P<detector>\\w+)\"\n\n    # Build list of filename types\n    filename_types = [stage_1_and_2, stage_3_target_id, stage_3_source_id, stage_3_target_id_epoch, stage_3_source_id_epoch, time_series]\n\n    # Try to parse the filename\n    for filename_type in filename_types:\n\n        # If full filename, try using suffix\n        if not file_root_name:\n            filename_type += r\"_(?P<suffix>{}).*\".format('|'.join(FILE_SUFFIX_TYPES))\n\n        elements = re.compile(filename_type)\n        jwst_file = elements.match(filename)\n        if jwst_file is not None:\n            break\n\n    # Raise error if unable to parse the filename\n    try:\n        filename_dict = jwst_file.groupdict()\n    except AttributeError:\n        jdox_url = 'https://jwst-docs.stsci.edu/display/JDAT/File+Naming+Conventions+and+Data+Products'\n        raise ValueError('Provided file {} does not follow JWST naming conventions.  See {} for further information.'.format(filename, jdox_url))\n\n    return filename_dict\n\n\ndef get_base_url():\n    \"\"\"Return the beginning part of the URL to the ``jwql`` web app\n    based on which user is running the software.\n\n    If the admin account is running the code, the ``base_url`` is\n    assumed to be the production URL.  If not, the ``base_url`` is\n    assumed to be local.\n\n    Returns\n    -------\n    base_url : str\n        The beginning part of the URL to the ``jwql`` web app\n    \"\"\"\n\n    username = getpass.getuser()\n    if username == get_config()['admin_account']:\n        base_url = 'https://dljwql.stsci.edu'\n    else:\n        base_url = 'http://127.0.0.1:8000'\n\n    return base_url\n\n\ndef get_config():\n    \"\"\"Return a dictionary that holds the contents of the ``jwql``\n    config file.\n\n    Returns\n    -------\n    settings : dict\n        A dictionary that holds the contents of the config file.\n    \"\"\"\n    with open(os.path.join(__location__, 'config.json'), 'r') as config_file:\n        settings = json.load(config_file)\n\n    return settings\n", "path": "jwql/utils/utils.py"}], "after_files": [{"content": "\"\"\"Various utility functions for the ``jwql`` project.\n\nAuthors\n-------\n\n    - Matthew Bourque\n    - Lauren Chambers\n\nUse\n---\n\n    This module can be imported as such:\n\n    >>> import utils\n    settings = get_config()\n\nReferences\n----------\n\n    Filename parser modified from Joe Hunkeler:\n    https://gist.github.com/jhunkeler/f08783ca2da7bfd1f8e9ee1d207da5ff\n \"\"\"\n\nimport getpass\nimport json\nimport os\nimport re\n\nfrom jwql.utils import permissions\nfrom jwql.utils.constants import FILE_SUFFIX_TYPES\n\n__location__ = os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file__)))\n\n\ndef ensure_dir_exists(fullpath):\n    \"\"\"Creates dirs from ``fullpath`` if they do not already exist.\n    \"\"\"\n    if not os.path.exists(fullpath):\n        os.makedirs(fullpath)\n        permissions.set_permissions(fullpath)\n\n\ndef filename_parser(filename):\n    \"\"\"Return a dictionary that contains the properties of a given\n    JWST file (e.g. program ID, visit number, detector, etc.).\n\n    Parameters\n    ----------\n    filename : str\n        Path or name of JWST file to parse\n\n    Returns\n    -------\n    filename_dict : dict\n        Collection of file properties\n\n    Raises\n    ------\n    ValueError\n        When the provided file does not follow naming conventions\n    \"\"\"\n\n    filename = os.path.basename(filename)\n    file_root_name = (len(filename.split('.')) < 2)\n\n    # Stage 1 and 2 filenames, e.g. \"jw80500012009_01101_00012_nrcalong_uncal.fits\"\n    stage_1_and_2 = \\\n        r\"jw\" \\\n        r\"(?P<program_id>\\d{5})\"\\\n        r\"(?P<observation>\\d{3})\"\\\n        r\"(?P<visit>\\d{3})\"\\\n        r\"_(?P<visit_group>\\d{2})\"\\\n        r\"(?P<parallel_seq_id>\\d{1})\"\\\n        r\"(?P<activity>\\w{2})\"\\\n        r\"_(?P<exposure_id>\\d+)\"\\\n        r\"_(?P<detector>((?!_)[\\w])+)\"\n\n    # Stage 3 filenames with target ID, e.g. \"jw80600-o009_t001_miri_f1130w_i2d.fits\"\n    stage_3_target_id = \\\n        r\"jw\" \\\n        r\"(?P<program_id>\\d{5})\"\\\n        r\"-(?P<ac_id>(o|c|a|r)\\d{3,4})\"\\\n        r\"_(?P<target_id>(t)\\d{3})\"\\\n        r\"_(?P<instrument>(nircam|niriss|nirspec|miri|fgs))\"\\\n        r\"_(?P<optical_elements>((?!_)[\\w-])+)\"\n\n    # Stage 3 filenames with source ID, e.g. \"jw80600-o009_s00001_miri_f1130w_i2d.fits\"\n    stage_3_source_id = \\\n        r\"jw\" \\\n        r\"(?P<program_id>\\d{5})\"\\\n        r\"-(?P<ac_id>(o|c|a|r)\\d{3,4})\"\\\n        r\"_(?P<source_id>(s)\\d{5})\"\\\n        r\"_(?P<instrument>(nircam|niriss|nirspec|miri|fgs))\"\\\n        r\"_(?P<optical_elements>((?!_)[\\w-])+)\"\n\n    # Stage 3 filenames with target ID and epoch, e.g. \"jw80600-o009_t001-epoch1_miri_f1130w_i2d.fits\"\n    stage_3_target_id_epoch = \\\n        r\"jw\" \\\n        r\"(?P<program_id>\\d{5})\"\\\n        r\"-(?P<ac_id>(o|c|a|r)\\d{3,4})\"\\\n        r\"_(?P<target_id>(t)\\d{3})\"\\\n        r\"-epoch(?P<epoch>\\d{1})\"\\\n        r\"_(?P<instrument>(nircam|niriss|nirspec|miri|fgs))\"\\\n        r\"_(?P<optical_elements>((?!_)[\\w-])+)\"\n\n    # Stage 3 filenames with source ID and epoch, e.g. \"jw80600-o009_s00001-epoch1_miri_f1130w_i2d.fits\"\n    stage_3_source_id_epoch = \\\n        r\"jw\" \\\n        r\"(?P<program_id>\\d{5})\"\\\n        r\"-(?P<ac_id>(o|c|a|r)\\d{3,4})\"\\\n        r\"_(?P<source_id>(s)\\d{5})\"\\\n        r\"-epoch(?P<epoch>\\d{1})\"\\\n        r\"_(?P<instrument>(nircam|niriss|nirspec|miri|fgs))\"\\\n        r\"_(?P<optical_elements>((?!_)[\\w-])+)\"\n\n    # Time series filenames, e.g. \"jw00733003001_02101_00002-seg001_nrs1_rate.fits\"\n    time_series = \\\n        r\"jw\" \\\n        r\"(?P<program_id>\\d{5})\"\\\n        r\"(?P<observation>\\d{3})\"\\\n        r\"(?P<visit>\\d{3})\"\\\n        r\"_(?P<visit_group>\\d{2})\"\\\n        r\"(?P<parallel_seq_id>\\d{1})\"\\\n        r\"(?P<activity>\\w{2})\"\\\n        r\"_(?P<exposure_id>\\d+)\"\\\n        r\"-seg(?P<segment>\\d{3})\"\\\n        r\"_(?P<detector>\\w+)\"\n\n    # Build list of filename types\n    filename_types = [stage_1_and_2, stage_3_target_id, stage_3_source_id, stage_3_target_id_epoch, stage_3_source_id_epoch, time_series]\n\n    # Try to parse the filename\n    for filename_type in filename_types:\n\n        # If full filename, try using suffix\n        if not file_root_name:\n            filename_type += r\"_(?P<suffix>{}).*\".format('|'.join(FILE_SUFFIX_TYPES))\n\n        elements = re.compile(filename_type)\n        jwst_file = elements.match(filename)\n        if jwst_file is not None:\n            break\n\n    # Raise error if unable to parse the filename\n    try:\n        filename_dict = jwst_file.groupdict()\n    except AttributeError:\n        jdox_url = 'https://jwst-docs.stsci.edu/display/JDAT/File+Naming+Conventions+and+Data+Products'\n        raise ValueError('Provided file {} does not follow JWST naming conventions.  See {} for further information.'.format(filename, jdox_url))\n\n    return filename_dict\n\n\ndef get_base_url():\n    \"\"\"Return the beginning part of the URL to the ``jwql`` web app\n    based on which user is running the software.\n\n    If the admin account is running the code, the ``base_url`` is\n    assumed to be the production URL.  If not, the ``base_url`` is\n    assumed to be local.\n\n    Returns\n    -------\n    base_url : str\n        The beginning part of the URL to the ``jwql`` web app\n    \"\"\"\n\n    username = getpass.getuser()\n    if username == get_config()['admin_account']:\n        base_url = 'https://dljwql.stsci.edu'\n    else:\n        base_url = 'http://127.0.0.1:8000'\n\n    return base_url\n\n\ndef get_config():\n    \"\"\"Return a dictionary that holds the contents of the ``jwql``\n    config file.\n\n    Returns\n    -------\n    settings : dict\n        A dictionary that holds the contents of the config file.\n    \"\"\"\n    config_file_location = os.path.join(__location__, 'config.json')\n\n    if not os.path.isfile(config_file_location):\n        raise FileNotFoundError('The JWQL package requires a configuration file (config.json) '\n                                'to be placed within the jwql/utils directory. '\n                                'This file is missing. Please read the relevant wiki page '\n                                '(https://github.com/spacetelescope/jwql/wiki/'\n                                'Config-file) for more information.')\n\n    with open(config_file_location, 'r') as config_file:\n        settings = json.load(config_file)\n\n    return settings\n", "path": "jwql/utils/utils.py"}]}