:py:mod:`airflow.providers.amazon.aws.sensors.s3`
=================================================

.. py:module:: airflow.providers.amazon.aws.sensors.s3


Module Contents
---------------

Classes
~~~~~~~

.. autoapisummary::

   airflow.providers.amazon.aws.sensors.s3.S3KeySensor
   airflow.providers.amazon.aws.sensors.s3.S3KeySizeSensor
   airflow.providers.amazon.aws.sensors.s3.S3KeysUnchangedSensor
   airflow.providers.amazon.aws.sensors.s3.S3PrefixSensor




.. py:class:: S3KeySensor(*, bucket_key, bucket_name = None, wildcard_match = False, check_fn = None, aws_conn_id = 'aws_default', verify = None, **kwargs)

   Bases: :py:obj:`airflow.sensors.base.BaseSensorOperator`

   Waits for one or multiple keys (a file-like instance on S3) to be present in a S3 bucket.
   S3 being a key/value it does not support folders. The path is just a key
   a resource.

   .. seealso::
       For more information on how to use this sensor, take a look at the guide:
       :ref:`howto/sensor:S3KeySensor`

   :param bucket_key: The key(s) being waited on. Supports full s3:// style url
       or relative path from root level. When it's specified as a full s3://
       url, please leave bucket_name as `None`
   :param bucket_name: Name of the S3 bucket. Only needed when ``bucket_key``
       is not provided as a full s3:// url. When specified, all the keys passed to ``bucket_key``
       refers to this bucket
   :param wildcard_match: whether the bucket_key should be interpreted as a
       Unix wildcard pattern
   :param check_fn: Function that receives the list of the S3 objects,
       and returns a boolean:
       - ``True``: the criteria is met
       - ``False``: the criteria isn't met
       **Example**: Wait for any S3 object size more than 1 megabyte  ::

           def check_fn(files: List) -> bool:
               return any(f.get('Size', 0) > 1048576 for f in files)
   :param aws_conn_id: a reference to the s3 connection
   :param verify: Whether or not to verify SSL certificates for S3 connection.
       By default SSL certificates are verified.
       You can provide the following values:

       - ``False``: do not validate SSL certificates. SSL will still be used
                (unless use_ssl is False), but SSL certificates will not be
                verified.
       - ``path/to/cert/bundle.pem``: A filename of the CA cert bundle to uses.
                You can specify this argument if you want to use a different
                CA cert bundle than the one used by botocore.

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['bucket_key', 'bucket_name']

      

   .. py:method:: poke(self, context)

      Function that the sensors defined while deriving this class should
      override.


   .. py:method:: get_hook(self)

      Create and return an S3Hook



.. py:class:: S3KeySizeSensor(*, check_fn = None, **kwargs)

   Bases: :py:obj:`S3KeySensor`

   This class is deprecated.
   Please use :class:`~airflow.providers.amazon.aws.sensors.s3.S3KeySensor`.

   .. py:method:: default_check_fn(data)
      :staticmethod:

      Default function for checking that S3 Objects have size more than 0

      :param data: List of the objects in S3 bucket.



.. py:class:: S3KeysUnchangedSensor(*, bucket_name, prefix, aws_conn_id = 'aws_default', verify = None, inactivity_period = 60 * 60, min_objects = 1, previous_objects = None, allow_delete = True, **kwargs)

   Bases: :py:obj:`airflow.sensors.base.BaseSensorOperator`

   Checks for changes in the number of objects at prefix in AWS S3
   bucket and returns True if the inactivity period has passed with no
   increase in the number of objects. Note, this sensor will not behave correctly
   in reschedule mode, as the state of the listed objects in the S3 bucket will
   be lost between rescheduled invocations.

   .. seealso::
       For more information on how to use this sensor, take a look at the guide:
       :ref:`howto/sensor:S3KeysUnchangedSensor`

   :param bucket_name: Name of the S3 bucket
   :param prefix: The prefix being waited on. Relative path from bucket root level.
   :param aws_conn_id: a reference to the s3 connection
   :param verify: Whether or not to verify SSL certificates for S3 connection.
       By default SSL certificates are verified.
       You can provide the following values:

       - ``False``: do not validate SSL certificates. SSL will still be used
                (unless use_ssl is False), but SSL certificates will not be
                verified.
       - ``path/to/cert/bundle.pem``: A filename of the CA cert bundle to uses.
                You can specify this argument if you want to use a different
                CA cert bundle than the one used by botocore.
   :param inactivity_period: The total seconds of inactivity to designate
       keys unchanged. Note, this mechanism is not real time and
       this operator may not return until a poke_interval after this period
       has passed with no additional objects sensed.
   :param min_objects: The minimum number of objects needed for keys unchanged
       sensor to be considered valid.
   :param previous_objects: The set of object ids found during the last poke.
   :param allow_delete: Should this sensor consider objects being deleted
       between pokes valid behavior. If true a warning message will be logged
       when this happens. If false an error will be raised.

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['bucket_name', 'prefix']

      

   .. py:method:: hook(self)

      Returns S3Hook.


   .. py:method:: is_keys_unchanged(self, current_objects)

      Checks whether new objects have been uploaded and the inactivity_period
      has passed and updates the state of the sensor accordingly.

      :param current_objects: set of object ids in bucket during last poke.


   .. py:method:: poke(self, context)

      Function that the sensors defined while deriving this class should
      override.



.. py:class:: S3PrefixSensor(*, prefix, delimiter = '/', **kwargs)

   Bases: :py:obj:`S3KeySensor`

   This class is deprecated.
   Please use :class:`~airflow.providers.amazon.aws.sensors.s3.S3KeySensor`.

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['prefix', 'bucket_name']

      


