code: def validate(self, result, spec):  # noqa Yes, it's too complex.
          
          if spec is None:
              # None matches anything.
              return
          if isinstance(spec, dict):
              if not isinstance(result, dict):
                  raise ValueError('Dictionary expected, but %r found.' % result)
              if spec:
                  spec_value = next(iter(spec.values()))  # Yay Python 3!
                  for value in result.values():
                      self.validate(value, spec_value)
                  spec_key = next(iter(spec.keys()))
                  for key in result:
                      self.validate(key, spec_key)
          if isinstance(spec, list):
              if not isinstance(result, list):
                  raise ValueError('List expected, but %r found.' % result)
              if spec:
                  for value in result:
                      self.validate(value, spec[0])
          if isinstance(spec, tuple):
              if not isinstance(result, tuple):
                  raise ValueError('Tuple expected, but %r found.' % result)
              if len(result) != len(spec):
                  raise ValueError('Expected %d elements in tuple %r.' %
                                   (len(spec), result))
              for s, value in zip(spec, result):
                  self.validate(value, s)
          if isinstance(spec, six.string_types):
              if not isinstance(result, six.string_types):
                  raise ValueError('String expected, but %r found.' % result)
          if isinstance(spec, int):
              if not isinstance(result, int):
                  raise ValueError('Integer expected, but %r found.' % result)
          if isinstance(spec, bool):
              if not isinstance(result, bool):
                  raise ValueError('Boolean expected, but %r found.' % result)
docs: Validate that the result has the correct structure.