# Preparers

## restless.preparers

class `restless.preparers.``FieldsPreparer`(fields)

  A more complex preparation object, this will return a given set of fields.

  This takes a `fields` parameter, which should be a dictionary of keys (fieldnames to expose to the user) & values (a dotted lookup path to the desired attribute/key on the object).

  Example:

      preparer = FieldsPreparer(fields={
          # ``user`` is the key the client will see.
          # ``author.pk`` is the dotted path lookup ``FieldsPreparer``
          # will traverse on the data to return a value.
          'user': 'author.pk',
      })

  `lookup_data`(lookup, data)

    Given a lookup string, attempts to descend through nested data looking for the value.

    Can work with either dictionary-alikes or objects (or any combination of those).

    Lookups should be a string. If it is a dotted path, it will be split on `.` & it will traverse through to find the final value. If not, it will simply attempt to find either a key or attribute of that name & return it.

    Example:

        >>> data = {
        ...     'type': 'message',
        ...     'greeting': {
        ...         'en': 'hello',
        ...         'fr': 'bonjour',
        ...         'es': 'hola',
        ...     },
        ...     'person': Person(
        ...         name='daniel'
        ...     )
        ... }
        >>> lookup_data('type', data)
        'message'
        >>> lookup_data('greeting.en', data)
        'hello'
        >>> lookup_data('person.name', data)
        'daniel'

  `prepare`(data)

    Handles transforming the provided data into the fielded data that should be exposed to the end user.

    Uses the `lookup_data` method to traverse dotted paths.

    Returns a dictionary of data as the response.

class `restless.preparers.``Preparer`

  A plain preparation object which just passes through data.

  It also is relevant as the protocol subclasses should implement to work with Restless.

  `prepare`(data)

    Handles actually transforming the data.

    By default, this does nothing & simply returns the data passed to it.