We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
get_fieldmaps not compatible with multiple 'intendedfor'
currently `if path.endswith(metadata["IntendedFor"]):` assumes string, but current specs allow list as well

get_fieldmaps not compatible with multiple 'intendedfor'
currently `if path.endswith(metadata["IntendedFor"]):` assumes string, but current specs allow list as well


--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `bids/grabbids/bids_layout.py`
Content:
```
1 import os
2 import re
3 import json
4 
5 from itertools import combinations
6 from os.path import dirname
7 from os.path import realpath
8 from os.path import join as pathjoin
9 from os.path import split as pathsplit
10 
11 from grabbit import Layout
12 
13 __all__ = ['BIDSLayout']
14 
15 
16 class BIDSLayout(Layout):
17     def __init__(self, path, config=None):
18         if config is None:
19             root = dirname(realpath(__file__))
20             config = pathjoin(root, 'config', 'bids.json')
21         super(BIDSLayout, self).__init__(path, config, dynamic_getters=True)
22 
23     def get_metadata(self, path):
24         sidecarJSON = path.replace(".nii.gz", ".json").replace(".nii", ".json")
25         path_components = pathsplit(sidecarJSON)
26         filename_components = path_components[-1].split("_")
27         ses = None
28         suffix = filename_components[-1]
29 
30         sub = filename_components[0]
31         keyword_components = filename_components[1:-1]
32         if filename_components[1][:3] == "ses":
33             ses = filename_components[1]
34             keyword_components = filename_components[2:-1]
35 
36         potentialJSONs = []
37         for prefixes, midlayer, conditional in (  # Levels
38                 (tuple(), tuple(), True),        # top
39                 ((sub,), tuple(), True),         # subject
40                 ((sub, ), (pathsplit(path_components[-2])[-1],), True),
41                 ((sub, ses), tuple(), ses),  # session
42                 ((sub, ses), (pathsplit(path_components[-2])[-1],), ses)
43         ):
44             if not conditional:
45                 continue
46             for k in range(len(keyword_components) + 1):
47                 for components in combinations(keyword_components, k):
48                     potentialJSONs.append(
49                         pathjoin(
50                             self.root,
51                             *(prefixes + midlayer +
52                               ("_".join(prefixes + components + (suffix,)),))))
53 
54         merged_param_dict = {}
55         for json_file_path in potentialJSONs:
56             if os.path.exists(json_file_path):
57                 param_dict = json.load(open(json_file_path, "r"))
58                 merged_param_dict.update(param_dict)
59 
60         return merged_param_dict
61 
62     def get_fieldmap(self, path):
63         sub = os.path.split(path)[1].split("_")[0].split("sub-")[1]
64         fieldmap_set = {}
65         for file in self.get(subject=sub,
66                              type='(phase1|phase2|phasediff|epi|fieldmap)',
67                              extensions=['nii.gz', 'nii']):
68             metadata = self.get_metadata(file.filename)
69             if metadata and "IntendedFor" in metadata.keys():
70                 if path.endswith(metadata["IntendedFor"]):
71                     if file.type == "phasediff":
72                         fieldmap_set = {"phasediff": file.filename,
73                                         "magnitude1": file.filename.replace(
74                                             "phasediff", "magnitude1"),
75                                         "magnitude2": file.filename.replace(
76                                             "phasediff", "magnitude2"),
77                                         "type": "phasediff"}
78                         break
79                     elif file.type == "phase1":
80                         fieldmap_set["phase1"] = file.filename
81                         fieldmap_set["magnitude1"] = \
82                             file.filename.replace("phase1", "magnitude1")
83                         fieldmap_set["type"] = "phase"
84                     elif file.type == "phase2":
85                         fieldmap_set["phase2"] = file.filename
86                         fieldmap_set["magnitude2"] = \
87                             file.filename.replace("phase2", "magnitude2")
88                         fieldmap_set["type"] = "phase"
89                     elif file.type == "epi":
90                         if "epi" not in fieldmap_set.keys():
91                             fieldmap_set["epi"] = []
92                         fieldmap_set["epi"].append(file.filename)
93                         fieldmap_set["type"] = "epi"
94                     elif file.type == "fieldmap":
95                         fieldmap_set["fieldmap"] = file.filename
96                         fieldmap_set["magnitude"] = \
97                             file.filename.replace("fieldmap", "magnitude")
98                         fieldmap_set["type"] = "fieldmap"
99         return fieldmap_set
100 
101     def find_match(self, target, source=None):
102 
103         # Try to take the easy way out
104         if source is not None:
105             _target = source.split('.')[0] + '.' + target
106             if os.path.exists(_target):
107                 return target
108 
109         if target in list(self.entities.keys()):
110             candidates = list(self.entities[target].files.keys())
111         else:
112             candidates = []
113 
114             for root, directories, filenames in os.walk(self.root):
115                 for f in filenames:
116                     if re.search(target + '$', f):
117                         if os.path.sep == "\\":
118                             f = f.replace("\\", "\\\\")
119                         candidates.append(f)
120 
121         if source is None:
122             return candidates
123 
124         # Walk up the file hierarchy from source, find first match
125         if not os.path.exists(source):
126             raise OSError("The file '%s' doesn't exist." % source)
127         elif not source.startswith(self.root):
128             raise ValueError("The file '%s' is not contained "
129                              "within the current project "
130                              "directory (%s)." % (source, self.root))
131         rel = os.path.relpath(dirname(source), self.root)
132         sep = os.path.sep
133         chunks = rel.split(sep)
134         n_chunks = len(chunks)
135         for i in range(n_chunks, -1, -1):
136             path = pathjoin(self.root, *chunks[:i])
137             patt = path + '\%s[^\%s]+$' % (sep, sep)
138             if sep == "\\":
139                 patt = path + '\\[^\\]+$'
140                 patt = patt.replace("\\", "\\\\")
141             matches = [x for x in candidates if re.search(patt, x)]
142             if matches:
143                 if len(matches) == 1:
144                     return matches[0]
145                 else:
146                     raise ValueError("Ambiguous target: more than one "
147                                      "candidate file found in "
148                                      "directory '%s'." % path)
149         return None
150
```
--- 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/bids/grabbids/bids_layout.py b/bids/grabbids/bids_layout.py
--- a/bids/grabbids/bids_layout.py
+++ b/bids/grabbids/bids_layout.py
@@ -67,7 +67,11 @@
                              extensions=['nii.gz', 'nii']):
             metadata = self.get_metadata(file.filename)
             if metadata and "IntendedFor" in metadata.keys():
-                if path.endswith(metadata["IntendedFor"]):
+                if isinstance(metadata["IntendedFor"], list):
+                    intended_for = metadata["IntendedFor"]
+                else:
+                    intended_for = [metadata["IntendedFor"]]
+                if any([path.endswith(suffix) for suffix in intended_for]):
                     if file.type == "phasediff":
                         fieldmap_set = {"phasediff": file.filename,
                                         "magnitude1": file.filename.replace(

{"golden_diff": "diff --git a/bids/grabbids/bids_layout.py b/bids/grabbids/bids_layout.py\n--- a/bids/grabbids/bids_layout.py\n+++ b/bids/grabbids/bids_layout.py\n@@ -67,7 +67,11 @@\n                              extensions=['nii.gz', 'nii']):\n             metadata = self.get_metadata(file.filename)\n             if metadata and \"IntendedFor\" in metadata.keys():\n-                if path.endswith(metadata[\"IntendedFor\"]):\n+                if isinstance(metadata[\"IntendedFor\"], list):\n+                    intended_for = metadata[\"IntendedFor\"]\n+                else:\n+                    intended_for = [metadata[\"IntendedFor\"]]\n+                if any([path.endswith(suffix) for suffix in intended_for]):\n                     if file.type == \"phasediff\":\n                         fieldmap_set = {\"phasediff\": file.filename,\n                                         \"magnitude1\": file.filename.replace(\n", "issue": "get_fieldmaps not compatible with multiple 'intendedfor'\ncurrently `if path.endswith(metadata[\"IntendedFor\"]):` assumes string, but current specs allow list as well\n\nget_fieldmaps not compatible with multiple 'intendedfor'\ncurrently `if path.endswith(metadata[\"IntendedFor\"]):` assumes string, but current specs allow list as well\n\n", "before_files": [{"content": "import os\nimport re\nimport json\n\nfrom itertools import combinations\nfrom os.path import dirname\nfrom os.path import realpath\nfrom os.path import join as pathjoin\nfrom os.path import split as pathsplit\n\nfrom grabbit import Layout\n\n__all__ = ['BIDSLayout']\n\n\nclass BIDSLayout(Layout):\n    def __init__(self, path, config=None):\n        if config is None:\n            root = dirname(realpath(__file__))\n            config = pathjoin(root, 'config', 'bids.json')\n        super(BIDSLayout, self).__init__(path, config, dynamic_getters=True)\n\n    def get_metadata(self, path):\n        sidecarJSON = path.replace(\".nii.gz\", \".json\").replace(\".nii\", \".json\")\n        path_components = pathsplit(sidecarJSON)\n        filename_components = path_components[-1].split(\"_\")\n        ses = None\n        suffix = filename_components[-1]\n\n        sub = filename_components[0]\n        keyword_components = filename_components[1:-1]\n        if filename_components[1][:3] == \"ses\":\n            ses = filename_components[1]\n            keyword_components = filename_components[2:-1]\n\n        potentialJSONs = []\n        for prefixes, midlayer, conditional in (  # Levels\n                (tuple(), tuple(), True),        # top\n                ((sub,), tuple(), True),         # subject\n                ((sub, ), (pathsplit(path_components[-2])[-1],), True),\n                ((sub, ses), tuple(), ses),  # session\n                ((sub, ses), (pathsplit(path_components[-2])[-1],), ses)\n        ):\n            if not conditional:\n                continue\n            for k in range(len(keyword_components) + 1):\n                for components in combinations(keyword_components, k):\n                    potentialJSONs.append(\n                        pathjoin(\n                            self.root,\n                            *(prefixes + midlayer +\n                              (\"_\".join(prefixes + components + (suffix,)),))))\n\n        merged_param_dict = {}\n        for json_file_path in potentialJSONs:\n            if os.path.exists(json_file_path):\n                param_dict = json.load(open(json_file_path, \"r\"))\n                merged_param_dict.update(param_dict)\n\n        return merged_param_dict\n\n    def get_fieldmap(self, path):\n        sub = os.path.split(path)[1].split(\"_\")[0].split(\"sub-\")[1]\n        fieldmap_set = {}\n        for file in self.get(subject=sub,\n                             type='(phase1|phase2|phasediff|epi|fieldmap)',\n                             extensions=['nii.gz', 'nii']):\n            metadata = self.get_metadata(file.filename)\n            if metadata and \"IntendedFor\" in metadata.keys():\n                if path.endswith(metadata[\"IntendedFor\"]):\n                    if file.type == \"phasediff\":\n                        fieldmap_set = {\"phasediff\": file.filename,\n                                        \"magnitude1\": file.filename.replace(\n                                            \"phasediff\", \"magnitude1\"),\n                                        \"magnitude2\": file.filename.replace(\n                                            \"phasediff\", \"magnitude2\"),\n                                        \"type\": \"phasediff\"}\n                        break\n                    elif file.type == \"phase1\":\n                        fieldmap_set[\"phase1\"] = file.filename\n                        fieldmap_set[\"magnitude1\"] = \\\n                            file.filename.replace(\"phase1\", \"magnitude1\")\n                        fieldmap_set[\"type\"] = \"phase\"\n                    elif file.type == \"phase2\":\n                        fieldmap_set[\"phase2\"] = file.filename\n                        fieldmap_set[\"magnitude2\"] = \\\n                            file.filename.replace(\"phase2\", \"magnitude2\")\n                        fieldmap_set[\"type\"] = \"phase\"\n                    elif file.type == \"epi\":\n                        if \"epi\" not in fieldmap_set.keys():\n                            fieldmap_set[\"epi\"] = []\n                        fieldmap_set[\"epi\"].append(file.filename)\n                        fieldmap_set[\"type\"] = \"epi\"\n                    elif file.type == \"fieldmap\":\n                        fieldmap_set[\"fieldmap\"] = file.filename\n                        fieldmap_set[\"magnitude\"] = \\\n                            file.filename.replace(\"fieldmap\", \"magnitude\")\n                        fieldmap_set[\"type\"] = \"fieldmap\"\n        return fieldmap_set\n\n    def find_match(self, target, source=None):\n\n        # Try to take the easy way out\n        if source is not None:\n            _target = source.split('.')[0] + '.' + target\n            if os.path.exists(_target):\n                return target\n\n        if target in list(self.entities.keys()):\n            candidates = list(self.entities[target].files.keys())\n        else:\n            candidates = []\n\n            for root, directories, filenames in os.walk(self.root):\n                for f in filenames:\n                    if re.search(target + '$', f):\n                        if os.path.sep == \"\\\\\":\n                            f = f.replace(\"\\\\\", \"\\\\\\\\\")\n                        candidates.append(f)\n\n        if source is None:\n            return candidates\n\n        # Walk up the file hierarchy from source, find first match\n        if not os.path.exists(source):\n            raise OSError(\"The file '%s' doesn't exist.\" % source)\n        elif not source.startswith(self.root):\n            raise ValueError(\"The file '%s' is not contained \"\n                             \"within the current project \"\n                             \"directory (%s).\" % (source, self.root))\n        rel = os.path.relpath(dirname(source), self.root)\n        sep = os.path.sep\n        chunks = rel.split(sep)\n        n_chunks = len(chunks)\n        for i in range(n_chunks, -1, -1):\n            path = pathjoin(self.root, *chunks[:i])\n            patt = path + '\\%s[^\\%s]+$' % (sep, sep)\n            if sep == \"\\\\\":\n                patt = path + '\\\\[^\\\\]+$'\n                patt = patt.replace(\"\\\\\", \"\\\\\\\\\")\n            matches = [x for x in candidates if re.search(patt, x)]\n            if matches:\n                if len(matches) == 1:\n                    return matches[0]\n                else:\n                    raise ValueError(\"Ambiguous target: more than one \"\n                                     \"candidate file found in \"\n                                     \"directory '%s'.\" % path)\n        return None\n", "path": "bids/grabbids/bids_layout.py"}], "after_files": [{"content": "import os\nimport re\nimport json\n\nfrom itertools import combinations\nfrom os.path import dirname\nfrom os.path import realpath\nfrom os.path import join as pathjoin\nfrom os.path import split as pathsplit\n\nfrom grabbit import Layout\n\n__all__ = ['BIDSLayout']\n\n\nclass BIDSLayout(Layout):\n    def __init__(self, path, config=None):\n        if config is None:\n            root = dirname(realpath(__file__))\n            config = pathjoin(root, 'config', 'bids.json')\n        super(BIDSLayout, self).__init__(path, config, dynamic_getters=True)\n\n    def get_metadata(self, path):\n        sidecarJSON = path.replace(\".nii.gz\", \".json\").replace(\".nii\", \".json\")\n        path_components = pathsplit(sidecarJSON)\n        filename_components = path_components[-1].split(\"_\")\n        ses = None\n        suffix = filename_components[-1]\n\n        sub = filename_components[0]\n        keyword_components = filename_components[1:-1]\n        if filename_components[1][:3] == \"ses\":\n            ses = filename_components[1]\n            keyword_components = filename_components[2:-1]\n\n        potentialJSONs = []\n        for prefixes, midlayer, conditional in (  # Levels\n                (tuple(), tuple(), True),        # top\n                ((sub,), tuple(), True),         # subject\n                ((sub, ), (pathsplit(path_components[-2])[-1],), True),\n                ((sub, ses), tuple(), ses),  # session\n                ((sub, ses), (pathsplit(path_components[-2])[-1],), ses)\n        ):\n            if not conditional:\n                continue\n            for k in range(len(keyword_components) + 1):\n                for components in combinations(keyword_components, k):\n                    potentialJSONs.append(\n                        pathjoin(\n                            self.root,\n                            *(prefixes + midlayer +\n                              (\"_\".join(prefixes + components + (suffix,)),))))\n\n        merged_param_dict = {}\n        for json_file_path in potentialJSONs:\n            if os.path.exists(json_file_path):\n                param_dict = json.load(open(json_file_path, \"r\"))\n                merged_param_dict.update(param_dict)\n\n        return merged_param_dict\n\n    def get_fieldmap(self, path):\n        sub = os.path.split(path)[1].split(\"_\")[0].split(\"sub-\")[1]\n        fieldmap_set = {}\n        for file in self.get(subject=sub,\n                             type='(phase1|phase2|phasediff|epi|fieldmap)',\n                             extensions=['nii.gz', 'nii']):\n            metadata = self.get_metadata(file.filename)\n            if metadata and \"IntendedFor\" in metadata.keys():\n                if isinstance(metadata[\"IntendedFor\"], list):\n                    intended_for = metadata[\"IntendedFor\"]\n                else:\n                    intended_for = [metadata[\"IntendedFor\"]]\n                if any([path.endswith(suffix) for suffix in intended_for]):\n                    if file.type == \"phasediff\":\n                        fieldmap_set = {\"phasediff\": file.filename,\n                                        \"magnitude1\": file.filename.replace(\n                                            \"phasediff\", \"magnitude1\"),\n                                        \"magnitude2\": file.filename.replace(\n                                            \"phasediff\", \"magnitude2\"),\n                                        \"type\": \"phasediff\"}\n                        break\n                    elif file.type == \"phase1\":\n                        fieldmap_set[\"phase1\"] = file.filename\n                        fieldmap_set[\"magnitude1\"] = \\\n                            file.filename.replace(\"phase1\", \"magnitude1\")\n                        fieldmap_set[\"type\"] = \"phase\"\n                    elif file.type == \"phase2\":\n                        fieldmap_set[\"phase2\"] = file.filename\n                        fieldmap_set[\"magnitude2\"] = \\\n                            file.filename.replace(\"phase2\", \"magnitude2\")\n                        fieldmap_set[\"type\"] = \"phase\"\n                    elif file.type == \"epi\":\n                        if \"epi\" not in fieldmap_set.keys():\n                            fieldmap_set[\"epi\"] = []\n                        fieldmap_set[\"epi\"].append(file.filename)\n                        fieldmap_set[\"type\"] = \"epi\"\n                    elif file.type == \"fieldmap\":\n                        fieldmap_set[\"fieldmap\"] = file.filename\n                        fieldmap_set[\"magnitude\"] = \\\n                            file.filename.replace(\"fieldmap\", \"magnitude\")\n                        fieldmap_set[\"type\"] = \"fieldmap\"\n        return fieldmap_set\n\n    def find_match(self, target, source=None):\n\n        # Try to take the easy way out\n        if source is not None:\n            _target = source.split('.')[0] + '.' + target\n            if os.path.exists(_target):\n                return target\n\n        if target in list(self.entities.keys()):\n            candidates = list(self.entities[target].files.keys())\n        else:\n            candidates = []\n\n            for root, directories, filenames in os.walk(self.root):\n                for f in filenames:\n                    if re.search(target + '$', f):\n                        if os.path.sep == \"\\\\\":\n                            f = f.replace(\"\\\\\", \"\\\\\\\\\")\n                        candidates.append(f)\n\n        if source is None:\n            return candidates\n\n        # Walk up the file hierarchy from source, find first match\n        if not os.path.exists(source):\n            raise OSError(\"The file '%s' doesn't exist.\" % source)\n        elif not source.startswith(self.root):\n            raise ValueError(\"The file '%s' is not contained \"\n                             \"within the current project \"\n                             \"directory (%s).\" % (source, self.root))\n        rel = os.path.relpath(dirname(source), self.root)\n        sep = os.path.sep\n        chunks = rel.split(sep)\n        n_chunks = len(chunks)\n        for i in range(n_chunks, -1, -1):\n            path = pathjoin(self.root, *chunks[:i])\n            patt = path + '\\%s[^\\%s]+$' % (sep, sep)\n            if sep == \"\\\\\":\n                patt = path + '\\\\[^\\\\]+$'\n                patt = patt.replace(\"\\\\\", \"\\\\\\\\\")\n            matches = [x for x in candidates if re.search(patt, x)]\n            if matches:\n                if len(matches) == 1:\n                    return matches[0]\n                else:\n                    raise ValueError(\"Ambiguous target: more than one \"\n                                     \"candidate file found in \"\n                                     \"directory '%s'.\" % path)\n        return None\n", "path": "bids/grabbids/bids_layout.py"}]}