prompt: You will be provided with a partial code base and an issue statement explaining a problem to resolve.
  <issue>
  Document the CI
  DOCUMENT ALL THE THINGS
  
  
  </issue>
  <code>
  [start of sunpy/net/jsoc/attrs.py]
  1 from __future__ import absolute_import
  2 
  3 from sunpy.net.attr import AttrWalker, AttrAnd, AttrOr
  4 from sunpy.net.vso.attrs import _VSOSimpleAttr
  5 from sunpy.net.vso.attrs import Time, Wavelength
  6 
  7 
  8 __all__ = ['Series', 'Protocol', 'Notify', 'Compression', 'Segment']
  9 
  10 
  11 class Series(_VSOSimpleAttr):
  12     """
  13     The JSOC Series to Download.
  14 
  15     See `this<http://jsoc.stanford.edu/JsocSeries_DataProducts_map.html>_`
  16     for a list of series'.
  17     """
  18     pass
  19 
  20 
  21 class Segment(_VSOSimpleAttr):
  22     """
  23     Segments choose which files to download when there are more than
  24     one present for each record e.g. 'image'
  25     """
  26     pass
  27 
  28 
  29 class Protocol(_VSOSimpleAttr):
  30     """
  31     The type of download to request one of
  32     ("FITS", "JPEG", "MPG", "MP4", or "as-is").
  33     Only FITS is supported, the others will require extra keywords.
  34     """
  35     pass
  36 
  37 
  38 class Notify(_VSOSimpleAttr):
  39     """
  40     An email address to get a notification to when JSOC has staged your request
  41     """
  42 
  43     def __init__(self, value):
  44         super(Notify, self).__init__(value)
  45         if value.find('@') == -1:
  46             raise ValueError("Notify attribute must contain an '@' symbol "
  47                              "to be a valid email address")
  48         self.value = value
  49 
  50 
  51 class Compression(_VSOSimpleAttr):
  52     """
  53     Compression format for requested files.
  54 
  55     'rice' or None, download FITS files with RICE compression.
  56     """
  57     pass
  58 
  59 
  60 walker = AttrWalker()
  61 
  62 
  63 @walker.add_creator(AttrAnd, _VSOSimpleAttr, Time)
  64 def _create(wlk, query):
  65 
  66     map_ = {}
  67     wlk.apply(query, map_)
  68     return [map_]
  69 
  70 
  71 @walker.add_applier(AttrAnd)
  72 def _apply(wlk, query, imap):
  73 
  74     for iattr in query.attrs:
  75         wlk.apply(iattr, imap)
  76 
  77 
  78 @walker.add_applier(_VSOSimpleAttr)
  79 def _apply1(wlk, query, imap):
  80 
  81     imap[query.__class__.__name__.lower()] = query.value
  82 
  83 
  84 @walker.add_applier(Time)
  85 def _apply2(wlk, query, imap):
  86     imap['start_time'] = query.start
  87     imap['end_time'] = query.end
  88 
  89 
  90 @walker.add_applier(Wavelength)
  91 def _apply_wave(wlk, query, imap):
  92     if query.min != query.max:
  93         raise ValueError(
  94             "For JSOC queries Wavelength.min must equal Wavelength.max")
  95 
  96     imap[query.__class__.__name__.lower()] = query.min
  97 
  98 
  99 @walker.add_creator(AttrOr)
  100 def _create1(wlk, query):
  101 
  102     qblocks = []
  103     for iattr in query.attrs:
  104         qblocks.extend(wlk.create(iattr))
  105 
  106     return qblocks
  107
  [end of sunpy/net/jsoc/attrs.py]
  </code>
  
  I need you to solve this issue by generating a single patch file that I can apply directly to this repository using git apply. Please respond with a single patch file in the following format.
  <patch>
  diff --git a/file.py b/file.py
  --- a/file.py
  +++ b/file.py
  @@ -1,27 +1,35 @@
   def euclidean(a, b):
  -    while b:
  -        a, b = b, a % b
  -    return a
  +    if b == 0:
  +        return a
  +    return euclidean(b, a % b)
   
   
   def bresenham(x0, y0, x1, y1):
       points = []
       dx = abs(x1 - x0)
       dy = abs(y1 - y0)
  -    sx = 1 if x0 < x1 else -1
  -    sy = 1 if y0 < y1 else -1
  -    err = dx - dy
  +    x, y = x0, y0
  +    sx = -1 if x0 > x1 else 1
  +    sy = -1 if y0 > y1 else 1
   
  -    while True:
  -        points.append((x0, y0))
  -        if x0 == x1 and y0 == y1:
  -            break
  -        e2 = 2 * err
  -        if e2 > -dy:
  -            err -= dy
  -            x0 += sx
  -        if e2 < dx:
  -            err += dx
  -            y0 += sy
  +    if dx > dy:
  +        err = dx / 2.0
  +        while x != x1:
  +            points.append((x, y))
  +            err -= dy
  +            if err < 0:
  +                y += sy
  +                err += dx
  +            x += sx
  +    else:
  +        err = dy / 2.0
  +        while y != y1:
  +            points.append((x, y))
  +            err -= dx
  +            if err < 0:
  +                x += sx
  +                err += dy
  +            y += sy
  +
  +    points.append((x, y))
       return points
  
  </patch>
golden_diff: diff --git a/sunpy/net/jsoc/attrs.py b/sunpy/net/jsoc/attrs.py
  --- a/sunpy/net/jsoc/attrs.py
  +++ b/sunpy/net/jsoc/attrs.py
  @@ -12,8 +12,7 @@
       """
       The JSOC Series to Download.
   
  -    See `this<http://jsoc.stanford.edu/JsocSeries_DataProducts_map.html>_`
  -    for a list of series'.
  +    This is the list of `Series <http://jsoc.stanford.edu/JsocSeries_DataProducts_map.html>_`.
       """
       pass
  
verification_info: {"golden_diff": "diff --git a/sunpy/net/jsoc/attrs.py b/sunpy/net/jsoc/attrs.py\n--- a/sunpy/net/jsoc/attrs.py\n+++ b/sunpy/net/jsoc/attrs.py\n@@ -12,8 +12,7 @@\n     \"\"\"\n     The JSOC Series to Download.\n \n-    See `this<http://jsoc.stanford.edu/JsocSeries_DataProducts_map.html>_`\n-    for a list of series'.\n+    This is the list of `Series <http://jsoc.stanford.edu/JsocSeries_DataProducts_map.html>_`.\n     \"\"\"\n     pass\n", "issue": "Document the CI\nDOCUMENT ALL THE THINGS\n\n", "before_files": [{"content": "from __future__ import absolute_import\n\nfrom sunpy.net.attr import AttrWalker, AttrAnd, AttrOr\nfrom sunpy.net.vso.attrs import _VSOSimpleAttr\nfrom sunpy.net.vso.attrs import Time, Wavelength\n\n\n__all__ = ['Series', 'Protocol', 'Notify', 'Compression', 'Segment']\n\n\nclass Series(_VSOSimpleAttr):\n    \"\"\"\n    The JSOC Series to Download.\n\n    See `this<http://jsoc.stanford.edu/JsocSeries_DataProducts_map.html>_`\n    for a list of series'.\n    \"\"\"\n    pass\n\n\nclass Segment(_VSOSimpleAttr):\n    \"\"\"\n    Segments choose which files to download when there are more than\n    one present for each record e.g. 'image'\n    \"\"\"\n    pass\n\n\nclass Protocol(_VSOSimpleAttr):\n    \"\"\"\n    The type of download to request one of\n    (\"FITS\", \"JPEG\", \"MPG\", \"MP4\", or \"as-is\").\n    Only FITS is supported, the others will require extra keywords.\n    \"\"\"\n    pass\n\n\nclass Notify(_VSOSimpleAttr):\n    \"\"\"\n    An email address to get a notification to when JSOC has staged your request\n    \"\"\"\n\n    def __init__(self, value):\n        super(Notify, self).__init__(value)\n        if value.find('@') == -1:\n            raise ValueError(\"Notify attribute must contain an '@' symbol \"\n                             \"to be a valid email address\")\n        self.value = value\n\n\nclass Compression(_VSOSimpleAttr):\n    \"\"\"\n    Compression format for requested files.\n\n    'rice' or None, download FITS files with RICE compression.\n    \"\"\"\n    pass\n\n\nwalker = AttrWalker()\n\n\n@walker.add_creator(AttrAnd, _VSOSimpleAttr, Time)\ndef _create(wlk, query):\n\n    map_ = {}\n    wlk.apply(query, map_)\n    return [map_]\n\n\n@walker.add_applier(AttrAnd)\ndef _apply(wlk, query, imap):\n\n    for iattr in query.attrs:\n        wlk.apply(iattr, imap)\n\n\n@walker.add_applier(_VSOSimpleAttr)\ndef _apply1(wlk, query, imap):\n\n    imap[query.__class__.__name__.lower()] = query.value\n\n\n@walker.add_applier(Time)\ndef _apply2(wlk, query, imap):\n    imap['start_time'] = query.start\n    imap['end_time'] = query.end\n\n\n@walker.add_applier(Wavelength)\ndef _apply_wave(wlk, query, imap):\n    if query.min != query.max:\n        raise ValueError(\n            \"For JSOC queries Wavelength.min must equal Wavelength.max\")\n\n    imap[query.__class__.__name__.lower()] = query.min\n\n\n@walker.add_creator(AttrOr)\ndef _create1(wlk, query):\n\n    qblocks = []\n    for iattr in query.attrs:\n        qblocks.extend(wlk.create(iattr))\n\n    return qblocks\n", "path": "sunpy/net/jsoc/attrs.py"}]}