We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Spider jackinthebox is broken
During the global build at 2021-06-23-14-42-18, spider **jackinthebox** failed with **0 features** and **1 errors**.

Here's [the log](https://data.alltheplaces.xyz/runs/2021-06-23-14-42-18/logs/jackinthebox.txt) and [the output](https://data.alltheplaces.xyz/runs/2021-06-23-14-42-18/output/jackinthebox.geojson) ([on a map](https://data.alltheplaces.xyz/map.html?show=https://data.alltheplaces.xyz/runs/2021-06-23-14-42-18/output/jackinthebox.geojson))

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `locations/spiders/jackinthebox.py`
Content:
```
1 import json
2 import re
3 import scrapy
4 from locations.items import GeojsonPointItem
5 
6 class JackInTheBoxSpider(scrapy.Spider):
7     name = "jackinthebox"
8     item_attributes = { 'brand': "Jack In The Box" }
9     allowed_domains = ["jackinthebox.com"]
10     start_urls = (
11         "https://www.jackinthebox.com/api/locations",
12     )
13     dayMap = {
14         'monday': 'Mo',
15         'tuesday': 'Tu',
16         'wednesday': 'We',
17         'thursday': 'Th',
18         'friday': 'Fr',
19         'saturday': 'Sa',
20         'sunday': 'Su'
21     }
22     def opening_hours(self, days_hours):
23         day_groups = []
24         this_day_group = None
25         for day_hours in days_hours:
26             day = day_hours[0]
27             hours = day_hours[1]
28             match = re.search(r'^(\d{1,2}):(\d{2})\w*(a|p)m-(\d{1,2}):(\d{2})\w*(a|p)m?$', hours)
29             (f_hr, f_min, f_ampm, t_hr, t_min, t_ampm) = match.groups()
30 
31             f_hr = int(f_hr)
32             if f_ampm == 'p':
33                 f_hr += 12
34             elif f_ampm == 'a' and f_hr == 12:
35                 f_hr = 0
36             t_hr = int(t_hr)
37             if t_ampm == 'p':
38                 t_hr += 12
39             elif t_ampm == 'a' and t_hr == 12:
40                 t_hr = 0
41 
42             hours = '{:02d}:{}-{:02d}:{}'.format(
43                 f_hr,
44                 f_min,
45                 t_hr,
46                 t_min,
47             )
48 
49             if not this_day_group:
50                 this_day_group = {
51                     'from_day': day,
52                     'to_day': day,
53                     'hours': hours
54                 }
55             elif this_day_group['hours'] != hours:
56                 day_groups.append(this_day_group)
57                 this_day_group = {
58                     'from_day': day,
59                     'to_day': day,
60                     'hours': hours
61                 }
62             elif this_day_group['hours'] == hours:
63                 this_day_group['to_day'] = day
64 
65         day_groups.append(this_day_group)
66 
67         opening_hours = ""
68         if len(day_groups) == 1 and day_groups[0]['hours'] in ('00:00-23:59', '00:00-00:00'):
69             opening_hours = '24/7'
70         else:
71             for day_group in day_groups:
72                 if day_group['from_day'] == day_group['to_day']:
73                     opening_hours += '{from_day} {hours}; '.format(**day_group)
74                 elif day_group['from_day'] == 'Su' and day_group['to_day'] == 'Sa':
75                     opening_hours += '{hours}; '.format(**day_group)
76                 else:
77                     opening_hours += '{from_day}-{to_day} {hours}; '.format(**day_group)
78             opening_hours = opening_hours[:-2]
79 
80         return opening_hours
81 
82     def parse(self, response):
83         stores = json.loads(response.body_as_unicode())
84         for store in stores:                                 
85             properties = {                                   
86                 'ref': store['id'],                          
87                 'addr_full': store['address'],
88                 'city': store['city'],                       
89                 'state': store['state'],                     
90                 'postcode': store['postal'],                    
91                 'lat': store['lat'],                         
92                 'lon': store['lng'],                         
93                 'phone': store['phone'],
94             }                                                
95             
96             if store['twentyfourhours']:
97                 properties['opening_hours'] = '24/7'
98             elif 'hours' in store:
99                 hours = store['hours']
100                 if not all(hours[d] == '' for d in hours):
101                     days_hours = []
102                     for day in ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday']:
103                         days_hours.append([
104                             self.dayMap[day],
105                             hours[day].lower().replace(' ', '')
106                         ])
107                     properties['opening_hours'] = self.opening_hours(days_hours)
108                                                                  
109             yield GeojsonPointItem(**properties)             
110 
111 
112
```
--- 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/locations/spiders/jackinthebox.py b/locations/spiders/jackinthebox.py
--- a/locations/spiders/jackinthebox.py
+++ b/locations/spiders/jackinthebox.py
@@ -11,13 +11,13 @@
         "https://www.jackinthebox.com/api/locations",
     )
     dayMap = {
-        'monday': 'Mo',
-        'tuesday': 'Tu',
-        'wednesday': 'We',
-        'thursday': 'Th',
-        'friday': 'Fr',
-        'saturday': 'Sa',
-        'sunday': 'Su'
+        'Monday': 'Mo',
+        'Tuesday': 'Tu',
+        'Wednesday': 'We',
+        'Thursday': 'Th',
+        'Friday': 'Fr',
+        'Saturday': 'Sa',
+        'Sunday': 'Su'
     }
     def opening_hours(self, days_hours):
         day_groups = []
@@ -25,6 +25,9 @@
         for day_hours in days_hours:
             day = day_hours[0]
             hours = day_hours[1]
+            if not hours:
+                continue
+
             match = re.search(r'^(\d{1,2}):(\d{2})\w*(a|p)m-(\d{1,2}):(\d{2})\w*(a|p)m?$', hours)
             (f_hr, f_min, f_ampm, t_hr, t_min, t_ampm) = match.groups()
 
@@ -62,7 +65,8 @@
             elif this_day_group['hours'] == hours:
                 this_day_group['to_day'] = day
 
-        day_groups.append(this_day_group)
+        if this_day_group:
+            day_groups.append(this_day_group)
 
         opening_hours = ""
         if len(day_groups) == 1 and day_groups[0]['hours'] in ('00:00-23:59', '00:00-00:00'):
@@ -80,31 +84,32 @@
         return opening_hours
 
     def parse(self, response):
-        stores = json.loads(response.body_as_unicode())
-        for store in stores:                                 
+        stores = json.loads(response.body_as_unicode())['Locations']
+        for store in stores:
+            address = store['Address']
             properties = {                                   
-                'ref': store['id'],                          
-                'addr_full': store['address'],
-                'city': store['city'],                       
-                'state': store['state'],                     
-                'postcode': store['postal'],                    
-                'lat': store['lat'],                         
-                'lon': store['lng'],                         
-                'phone': store['phone'],
+                'ref': store['LocationId'],
+                'addr_full': ", ".join([address['StreetLine1'], address['StreetLine2']]),
+                'city': address['City'],
+                'state': address['State'],
+                'postcode': address['Zipcode'],
+                'lat': store['Coordinates']['Lat'],
+                'lon': store['Coordinates']['Lon'],
+                'phone': store['OperationsData']['BusinessPhoneNumber'],
             }                                                
             
-            if store['twentyfourhours']:
+            hours = store['OperatingHours']
+            if all (hours['DineInAllDay'][day] == True for day in hours['DineInAllDay']):
                 properties['opening_hours'] = '24/7'
-            elif 'hours' in store:
-                hours = store['hours']
-                if not all(hours[d] == '' for d in hours):
-                    days_hours = []
-                    for day in ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday']:
-                        days_hours.append([
-                            self.dayMap[day],
-                            hours[day].lower().replace(' ', '')
-                        ])
-                    properties['opening_hours'] = self.opening_hours(days_hours)
+
+            else:
+                days_hours = []
+                for day in ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']:
+                    days_hours.append([
+                        self.dayMap[day],
+                        hours['DineIn'][day].lower().replace(' ', '')
+                    ])
+                properties['opening_hours'] = self.opening_hours(days_hours)
                                                                  
             yield GeojsonPointItem(**properties)

{"golden_diff": "diff --git a/locations/spiders/jackinthebox.py b/locations/spiders/jackinthebox.py\n--- a/locations/spiders/jackinthebox.py\n+++ b/locations/spiders/jackinthebox.py\n@@ -11,13 +11,13 @@\n         \"https://www.jackinthebox.com/api/locations\",\n     )\n     dayMap = {\n-        'monday': 'Mo',\n-        'tuesday': 'Tu',\n-        'wednesday': 'We',\n-        'thursday': 'Th',\n-        'friday': 'Fr',\n-        'saturday': 'Sa',\n-        'sunday': 'Su'\n+        'Monday': 'Mo',\n+        'Tuesday': 'Tu',\n+        'Wednesday': 'We',\n+        'Thursday': 'Th',\n+        'Friday': 'Fr',\n+        'Saturday': 'Sa',\n+        'Sunday': 'Su'\n     }\n     def opening_hours(self, days_hours):\n         day_groups = []\n@@ -25,6 +25,9 @@\n         for day_hours in days_hours:\n             day = day_hours[0]\n             hours = day_hours[1]\n+            if not hours:\n+                continue\n+\n             match = re.search(r'^(\\d{1,2}):(\\d{2})\\w*(a|p)m-(\\d{1,2}):(\\d{2})\\w*(a|p)m?$', hours)\n             (f_hr, f_min, f_ampm, t_hr, t_min, t_ampm) = match.groups()\n \n@@ -62,7 +65,8 @@\n             elif this_day_group['hours'] == hours:\n                 this_day_group['to_day'] = day\n \n-        day_groups.append(this_day_group)\n+        if this_day_group:\n+            day_groups.append(this_day_group)\n \n         opening_hours = \"\"\n         if len(day_groups) == 1 and day_groups[0]['hours'] in ('00:00-23:59', '00:00-00:00'):\n@@ -80,31 +84,32 @@\n         return opening_hours\n \n     def parse(self, response):\n-        stores = json.loads(response.body_as_unicode())\n-        for store in stores:                                 \n+        stores = json.loads(response.body_as_unicode())['Locations']\n+        for store in stores:\n+            address = store['Address']\n             properties = {                                   \n-                'ref': store['id'],                          \n-                'addr_full': store['address'],\n-                'city': store['city'],                       \n-                'state': store['state'],                     \n-                'postcode': store['postal'],                    \n-                'lat': store['lat'],                         \n-                'lon': store['lng'],                         \n-                'phone': store['phone'],\n+                'ref': store['LocationId'],\n+                'addr_full': \", \".join([address['StreetLine1'], address['StreetLine2']]),\n+                'city': address['City'],\n+                'state': address['State'],\n+                'postcode': address['Zipcode'],\n+                'lat': store['Coordinates']['Lat'],\n+                'lon': store['Coordinates']['Lon'],\n+                'phone': store['OperationsData']['BusinessPhoneNumber'],\n             }                                                \n             \n-            if store['twentyfourhours']:\n+            hours = store['OperatingHours']\n+            if all (hours['DineInAllDay'][day] == True for day in hours['DineInAllDay']):\n                 properties['opening_hours'] = '24/7'\n-            elif 'hours' in store:\n-                hours = store['hours']\n-                if not all(hours[d] == '' for d in hours):\n-                    days_hours = []\n-                    for day in ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday']:\n-                        days_hours.append([\n-                            self.dayMap[day],\n-                            hours[day].lower().replace(' ', '')\n-                        ])\n-                    properties['opening_hours'] = self.opening_hours(days_hours)\n+\n+            else:\n+                days_hours = []\n+                for day in ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']:\n+                    days_hours.append([\n+                        self.dayMap[day],\n+                        hours['DineIn'][day].lower().replace(' ', '')\n+                    ])\n+                properties['opening_hours'] = self.opening_hours(days_hours)\n                                                                  \n             yield GeojsonPointItem(**properties)\n", "issue": "Spider jackinthebox is broken\nDuring the global build at 2021-06-23-14-42-18, spider **jackinthebox** failed with **0 features** and **1 errors**.\n\nHere's [the log](https://data.alltheplaces.xyz/runs/2021-06-23-14-42-18/logs/jackinthebox.txt) and [the output](https://data.alltheplaces.xyz/runs/2021-06-23-14-42-18/output/jackinthebox.geojson) ([on a map](https://data.alltheplaces.xyz/map.html?show=https://data.alltheplaces.xyz/runs/2021-06-23-14-42-18/output/jackinthebox.geojson))\n", "before_files": [{"content": "import json\nimport re\nimport scrapy\nfrom locations.items import GeojsonPointItem\n\nclass JackInTheBoxSpider(scrapy.Spider):\n    name = \"jackinthebox\"\n    item_attributes = { 'brand': \"Jack In The Box\" }\n    allowed_domains = [\"jackinthebox.com\"]\n    start_urls = (\n        \"https://www.jackinthebox.com/api/locations\",\n    )\n    dayMap = {\n        'monday': 'Mo',\n        'tuesday': 'Tu',\n        'wednesday': 'We',\n        'thursday': 'Th',\n        'friday': 'Fr',\n        'saturday': 'Sa',\n        'sunday': 'Su'\n    }\n    def opening_hours(self, days_hours):\n        day_groups = []\n        this_day_group = None\n        for day_hours in days_hours:\n            day = day_hours[0]\n            hours = day_hours[1]\n            match = re.search(r'^(\\d{1,2}):(\\d{2})\\w*(a|p)m-(\\d{1,2}):(\\d{2})\\w*(a|p)m?$', hours)\n            (f_hr, f_min, f_ampm, t_hr, t_min, t_ampm) = match.groups()\n\n            f_hr = int(f_hr)\n            if f_ampm == 'p':\n                f_hr += 12\n            elif f_ampm == 'a' and f_hr == 12:\n                f_hr = 0\n            t_hr = int(t_hr)\n            if t_ampm == 'p':\n                t_hr += 12\n            elif t_ampm == 'a' and t_hr == 12:\n                t_hr = 0\n\n            hours = '{:02d}:{}-{:02d}:{}'.format(\n                f_hr,\n                f_min,\n                t_hr,\n                t_min,\n            )\n\n            if not this_day_group:\n                this_day_group = {\n                    'from_day': day,\n                    'to_day': day,\n                    'hours': hours\n                }\n            elif this_day_group['hours'] != hours:\n                day_groups.append(this_day_group)\n                this_day_group = {\n                    'from_day': day,\n                    'to_day': day,\n                    'hours': hours\n                }\n            elif this_day_group['hours'] == hours:\n                this_day_group['to_day'] = day\n\n        day_groups.append(this_day_group)\n\n        opening_hours = \"\"\n        if len(day_groups) == 1 and day_groups[0]['hours'] in ('00:00-23:59', '00:00-00:00'):\n            opening_hours = '24/7'\n        else:\n            for day_group in day_groups:\n                if day_group['from_day'] == day_group['to_day']:\n                    opening_hours += '{from_day} {hours}; '.format(**day_group)\n                elif day_group['from_day'] == 'Su' and day_group['to_day'] == 'Sa':\n                    opening_hours += '{hours}; '.format(**day_group)\n                else:\n                    opening_hours += '{from_day}-{to_day} {hours}; '.format(**day_group)\n            opening_hours = opening_hours[:-2]\n\n        return opening_hours\n\n    def parse(self, response):\n        stores = json.loads(response.body_as_unicode())\n        for store in stores:                                 \n            properties = {                                   \n                'ref': store['id'],                          \n                'addr_full': store['address'],\n                'city': store['city'],                       \n                'state': store['state'],                     \n                'postcode': store['postal'],                    \n                'lat': store['lat'],                         \n                'lon': store['lng'],                         \n                'phone': store['phone'],\n            }                                                \n            \n            if store['twentyfourhours']:\n                properties['opening_hours'] = '24/7'\n            elif 'hours' in store:\n                hours = store['hours']\n                if not all(hours[d] == '' for d in hours):\n                    days_hours = []\n                    for day in ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday']:\n                        days_hours.append([\n                            self.dayMap[day],\n                            hours[day].lower().replace(' ', '')\n                        ])\n                    properties['opening_hours'] = self.opening_hours(days_hours)\n                                                                 \n            yield GeojsonPointItem(**properties)             \n\n\n", "path": "locations/spiders/jackinthebox.py"}], "after_files": [{"content": "import json\nimport re\nimport scrapy\nfrom locations.items import GeojsonPointItem\n\nclass JackInTheBoxSpider(scrapy.Spider):\n    name = \"jackinthebox\"\n    item_attributes = { 'brand': \"Jack In The Box\" }\n    allowed_domains = [\"jackinthebox.com\"]\n    start_urls = (\n        \"https://www.jackinthebox.com/api/locations\",\n    )\n    dayMap = {\n        'Monday': 'Mo',\n        'Tuesday': 'Tu',\n        'Wednesday': 'We',\n        'Thursday': 'Th',\n        'Friday': 'Fr',\n        'Saturday': 'Sa',\n        'Sunday': 'Su'\n    }\n    def opening_hours(self, days_hours):\n        day_groups = []\n        this_day_group = None\n        for day_hours in days_hours:\n            day = day_hours[0]\n            hours = day_hours[1]\n            if not hours:\n                continue\n\n            match = re.search(r'^(\\d{1,2}):(\\d{2})\\w*(a|p)m-(\\d{1,2}):(\\d{2})\\w*(a|p)m?$', hours)\n            (f_hr, f_min, f_ampm, t_hr, t_min, t_ampm) = match.groups()\n\n            f_hr = int(f_hr)\n            if f_ampm == 'p':\n                f_hr += 12\n            elif f_ampm == 'a' and f_hr == 12:\n                f_hr = 0\n            t_hr = int(t_hr)\n            if t_ampm == 'p':\n                t_hr += 12\n            elif t_ampm == 'a' and t_hr == 12:\n                t_hr = 0\n\n            hours = '{:02d}:{}-{:02d}:{}'.format(\n                f_hr,\n                f_min,\n                t_hr,\n                t_min,\n            )\n\n            if not this_day_group:\n                this_day_group = {\n                    'from_day': day,\n                    'to_day': day,\n                    'hours': hours\n                }\n            elif this_day_group['hours'] != hours:\n                day_groups.append(this_day_group)\n                this_day_group = {\n                    'from_day': day,\n                    'to_day': day,\n                    'hours': hours\n                }\n            elif this_day_group['hours'] == hours:\n                this_day_group['to_day'] = day\n\n        if this_day_group:\n            day_groups.append(this_day_group)\n\n        opening_hours = \"\"\n        if len(day_groups) == 1 and day_groups[0]['hours'] in ('00:00-23:59', '00:00-00:00'):\n            opening_hours = '24/7'\n        else:\n            for day_group in day_groups:\n                if day_group['from_day'] == day_group['to_day']:\n                    opening_hours += '{from_day} {hours}; '.format(**day_group)\n                elif day_group['from_day'] == 'Su' and day_group['to_day'] == 'Sa':\n                    opening_hours += '{hours}; '.format(**day_group)\n                else:\n                    opening_hours += '{from_day}-{to_day} {hours}; '.format(**day_group)\n            opening_hours = opening_hours[:-2]\n\n        return opening_hours\n\n    def parse(self, response):\n        stores = json.loads(response.body_as_unicode())['Locations']\n        for store in stores:\n            address = store['Address']\n            properties = {                                   \n                'ref': store['LocationId'],\n                'addr_full': \", \".join([address['StreetLine1'], address['StreetLine2']]),\n                'city': address['City'],\n                'state': address['State'],\n                'postcode': address['Zipcode'],\n                'lat': store['Coordinates']['Lat'],\n                'lon': store['Coordinates']['Lon'],\n                'phone': store['OperationsData']['BusinessPhoneNumber'],\n            }                                                \n            \n            hours = store['OperatingHours']\n            if all (hours['DineInAllDay'][day] == True for day in hours['DineInAllDay']):\n                properties['opening_hours'] = '24/7'\n\n            else:\n                days_hours = []\n                for day in ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']:\n                    days_hours.append([\n                        self.dayMap[day],\n                        hours['DineIn'][day].lower().replace(' ', '')\n                    ])\n                properties['opening_hours'] = self.opening_hours(days_hours)\n                                                                 \n            yield GeojsonPointItem(**properties)             \n\n\n", "path": "locations/spiders/jackinthebox.py"}]}