# Path: asana/resources/gen/events.py
# class _Events:
# 
#     def __init__(self, client=None):
#         self.client = client
# 
#     def get_events(self, params=None, **options):
#         """Get events on a resource
#         :param Object params: Parameters for the request
#             - resource {str}:  (required) A resource ID to subscribe to. The resource can be a task or project.
#             - sync {str}:  A sync token received from the last request, or none on first sync. Events will be returned from the point in time that the sync token was generated. *Note: On your first request, omit the sync token. The response will be the same as for an expired sync token, and will include a new valid sync token.If the sync token is too old (which may happen from time to time) the API will return a `412 Precondition Failed` error, and include a fresh sync token in the response.*
#         :param **options
#             - opt_fields {list[str]}:  Defines fields to return. Some requests return *compact* representations of objects in order to conserve resources and complete the request more efficiently. Other times requests return more information than you may need. This option allows you to list the exact set of fields that the API should be sure to return for the objects. The field names should be provided as paths, described below. The id of included objects will always be returned, regardless of the field options.
#             - opt_pretty {bool}:  Provides “pretty” output. Provides the response in a “pretty” format. In the case of JSON this means doing proper line breaking and indentation to make it readable. This will take extra time and increase the response size so it is advisable only to use this during debugging.
#         :return: Object
#         """
#         if params is None:
#             params = {}
#         path = "/events"
#         return self.client.get_collection(path, params, **options)
# 
# Path: asana/error.py
# class InvalidTokenError(AsanaError):
#     def __init__(self, response=None):
#         super(InvalidTokenError, self).__init__(
#             message='Sync token invalid or too old',
#             status=412,
#             response=response
#         )
#         self.sync = response is not None and response.json()['sync']
# 
# Path: asana/page_iterator.py
# class EventsPageIterator(PageIterator):
#     """Iterator that returns the next page of events, polls until a non-empty page is returned"""
# 
#     CONTINUATION_KEY = 'sync'
# 
#     def get_initial(self):
#         # If no sync token was provided, make a request to get one
#         if 'sync' not in self.query:
#             try:
#                 self.client.events.get(self.query, **self.options)
#             except InvalidTokenError as e:
#                 # InvalidTokenError is expected to be thrown since we didn't provide a sync token
#                 self.continuation = e.sync
#         else:
#             self.continuation = self.query['sync']
#         return self.get_next()
# 
#     def get_next(self):
#         self.query['sync'] = self.continuation
#         return self.client.events.get(self.query, **self.options)
# 
#     def __next__(self):
#         # Override __next__ to continue polling until a non-empty page of events is returned
#         while True:
#             results = super(EventsPageIterator, self).__next__()
#             if len(results) > 0:
#                 return results
#             else:
#                 time.sleep(self.options['poll_interval'])


from .gen.events import _Events
from ..error import InvalidTokenError
from ..page_iterator import EventsPageIterator


class Events(_Events):
    """Events resource"""

    def get(self, params, **options):
        """Dispatches a GET request to /events of the API to get a set of recent changes to a resource."""
        options = self.client._merge_options({ 'full_payload': True })
        return self.client.get('/events', params, **options)

    def get_next(self, query, **options):
        """Returns a tuple containing the next page of events and a sync token for the given query (and optional 'sync' token)"""

# Path: asana/resources/gen/events.py
# class _Events:
# 
#     def __init__(self, client=None):
#         self.client = client
# 
#     def get_events(self, params=None, **options):
#         """Get events on a resource
#         :param Object params: Parameters for the request
#             - resource {str}:  (required) A resource ID to subscribe to. The resource can be a task or project.
#             - sync {str}:  A sync token received from the last request, or none on first sync. Events will be returned from the point in time that the sync token was generated. *Note: On your first request, omit the sync token. The response will be the same as for an expired sync token, and will include a new valid sync token.If the sync token is too old (which may happen from time to time) the API will return a `412 Precondition Failed` error, and include a fresh sync token in the response.*
#         :param **options
#             - opt_fields {list[str]}:  Defines fields to return. Some requests return *compact* representations of objects in order to conserve resources and complete the request more efficiently. Other times requests return more information than you may need. This option allows you to list the exact set of fields that the API should be sure to return for the objects. The field names should be provided as paths, described below. The id of included objects will always be returned, regardless of the field options.
#             - opt_pretty {bool}:  Provides “pretty” output. Provides the response in a “pretty” format. In the case of JSON this means doing proper line breaking and indentation to make it readable. This will take extra time and increase the response size so it is advisable only to use this during debugging.
#         :return: Object
#         """
#         if params is None:
#             params = {}
#         path = "/events"
#         return self.client.get_collection(path, params, **options)
# 
# Path: asana/error.py
# class InvalidTokenError(AsanaError):
#     def __init__(self, response=None):
#         super(InvalidTokenError, self).__init__(
#             message='Sync token invalid or too old',
#             status=412,
#             response=response
#         )
#         self.sync = response is not None and response.json()['sync']
# 
# Path: asana/page_iterator.py
# class EventsPageIterator(PageIterator):
#     """Iterator that returns the next page of events, polls until a non-empty page is returned"""
# 
#     CONTINUATION_KEY = 'sync'
# 
#     def get_initial(self):
#         # If no sync token was provided, make a request to get one
#         if 'sync' not in self.query:
#             try:
#                 self.client.events.get(self.query, **self.options)
#             except InvalidTokenError as e:
#                 # InvalidTokenError is expected to be thrown since we didn't provide a sync token
#                 self.continuation = e.sync
#         else:
#             self.continuation = self.query['sync']
#         return self.get_next()
# 
#     def get_next(self):
#         self.query['sync'] = self.continuation
#         return self.client.events.get(self.query, **self.options)
# 
#     def __next__(self):
#         # Override __next__ to continue polling until a non-empty page of events is returned
#         while True:
#             results = super(EventsPageIterator, self).__next__()
#             if len(results) > 0:
#                 return results
#             else:
#                 time.sleep(self.options['poll_interval'])


# Path: asana/resources/events.py
from .gen.events import _Events
from ..error import InvalidTokenError
from ..page_iterator import EventsPageIterator



class Events(_Events):
    """Events resource"""

    def get(self, params, **options):
        """Dispatches a GET request to /events of the API to get a set of recent changes to a resource."""
        options = self.client._merge_options({ 'full_payload': True })
        return self.client.get('/events', params, **options)

    def get_next(self, query, **options):
        """Returns a tuple containing the next page of events and a sync token for the given query (and optional 'sync' token)"""

        iterator = EventsPageIterator(self.client, '/events', query, options)