import os
import asyncio

from waterbutler.core.streams import BaseStream


class FileStreamReader(BaseStream):

    def __init__(self, file_pointer):
        super().__init__()
        self.file_gen = None
        self.file_pointer = file_pointer
        self.read_size = None
        self.content_type = 'application/octet-stream'

    @property
    def size(self):
        cursor = self.file_pointer.tell()
        self.file_pointer.seek(0, os.SEEK_END)
        ret = self.file_pointer.tell()
        self.file_pointer.seek(cursor)
        return ret

    def close(self):
        self.file_pointer.close()
        self.feed_eof()

    def read_as_gen(self):
        self.file_pointer.seek(0)
        while True:
            data = self.file_pointer.read(self.read_size)
            if not data:
                break
            yield data

    async def _read(self, size):
        self.file_gen = self.file_gen or self.read_as_gen()
        # add sleep of 0 so read will yield and continue in next io loop iteration
        await asyncio.sleep(0)
        self.read_size = size
        try:
            return next(self.file_gen)
        except StopIteration:
            self.feed_eof()
            return b''

import os

from waterbutler.core.streams import BaseStream


class FileStreamReader(BaseStream):

    def __init__(self, file_pointer):
        super().__init__()
        self.file_gen = None
        self.file_pointer = file_pointer
        self.read_size = None
        self.content_type = 'application/octet-stream'

    @property
    def size(self):
        cursor = self.file_pointer.tell()
        self.file_pointer.seek(0, os.SEEK_END)
        ret = self.file_pointer.tell()
        self.file_pointer.seek(cursor)
        return ret

    def close(self):
        self.file_pointer.close()
        self.feed_eof()

    def read_as_gen(self):
        self.file_pointer.seek(0)
        while True:
            chunk = self.file_pointer.read(self.read_size)
            if not chunk:
                self.feed_eof()
                chunk = b''
            yield chunk

    async def _read(self, size):
        self.file_gen = self.file_gen or self.read_as_gen()
        self.read_size = size
        return next(self.file_gen)

Update FileStreamReader for new python 3.5 async
Update FileStreamReader for new python 3.5 async

  import os
- import asyncio
  
  from waterbutler.core.streams import BaseStream
  
  
  class FileStreamReader(BaseStream):
  
      def __init__(self, file_pointer):
          super().__init__()
          self.file_gen = None
          self.file_pointer = file_pointer
          self.read_size = None
          self.content_type = 'application/octet-stream'
  
      @property
      def size(self):
          cursor = self.file_pointer.tell()
          self.file_pointer.seek(0, os.SEEK_END)
          ret = self.file_pointer.tell()
          self.file_pointer.seek(cursor)
          return ret
  
      def close(self):
          self.file_pointer.close()
          self.feed_eof()
  
      def read_as_gen(self):
          self.file_pointer.seek(0)
          while True:
-             data = self.file_pointer.read(self.read_size)
+             chunk = self.file_pointer.read(self.read_size)
-             if not data:
+             if not chunk:
-                 break
+                 self.feed_eof()
+                 chunk = b''
-             yield data
+             yield chunk
  
      async def _read(self, size):
          self.file_gen = self.file_gen or self.read_as_gen()
-         # add sleep of 0 so read will yield and continue in next io loop iteration
-         await asyncio.sleep(0)
          self.read_size = size
-         try:
-             return next(self.file_gen)
+         return next(self.file_gen)
-         except StopIteration:
-             self.feed_eof()
-             return b''
  
Update FileStreamReader for new python 3.5 async
## Code Before:
import os
import asyncio

from waterbutler.core.streams import BaseStream


class FileStreamReader(BaseStream):

    def __init__(self, file_pointer):
        super().__init__()
        self.file_gen = None
        self.file_pointer = file_pointer
        self.read_size = None
        self.content_type = 'application/octet-stream'

    @property
    def size(self):
        cursor = self.file_pointer.tell()
        self.file_pointer.seek(0, os.SEEK_END)
        ret = self.file_pointer.tell()
        self.file_pointer.seek(cursor)
        return ret

    def close(self):
        self.file_pointer.close()
        self.feed_eof()

    def read_as_gen(self):
        self.file_pointer.seek(0)
        while True:
            data = self.file_pointer.read(self.read_size)
            if not data:
                break
            yield data

    async def _read(self, size):
        self.file_gen = self.file_gen or self.read_as_gen()
        # add sleep of 0 so read will yield and continue in next io loop iteration
        await asyncio.sleep(0)
        self.read_size = size
        try:
            return next(self.file_gen)
        except StopIteration:
            self.feed_eof()
            return b''

## Instruction:
Update FileStreamReader for new python 3.5 async
## Code After:
import os

from waterbutler.core.streams import BaseStream


class FileStreamReader(BaseStream):

    def __init__(self, file_pointer):
        super().__init__()
        self.file_gen = None
        self.file_pointer = file_pointer
        self.read_size = None
        self.content_type = 'application/octet-stream'

    @property
    def size(self):
        cursor = self.file_pointer.tell()
        self.file_pointer.seek(0, os.SEEK_END)
        ret = self.file_pointer.tell()
        self.file_pointer.seek(cursor)
        return ret

    def close(self):
        self.file_pointer.close()
        self.feed_eof()

    def read_as_gen(self):
        self.file_pointer.seek(0)
        while True:
            chunk = self.file_pointer.read(self.read_size)
            if not chunk:
                self.feed_eof()
                chunk = b''
            yield chunk

    async def _read(self, size):
        self.file_gen = self.file_gen or self.read_as_gen()
        self.read_size = size
        return next(self.file_gen)
