docs: def from_fault_data(cls, edges, mesh_spacing):
          """
          Create and return a fault surface using fault source data.
  
          :param edges:
              A list of at least two horizontal edges of the surface
              as instances of :class:`openquake.hazardlib.geo.line.Line`. The
              list should be in top-to-bottom order (the shallowest edge first).
          :param mesh_spacing:
              Distance between two subsequent points in a mesh, in km.
          :returns:
              An instance of :class:`ComplexFaultSurface` created using
              that data.
          :raises ValueError:
              If requested mesh spacing is too big for the surface geometry
              (doesn't allow to put a single mesh cell along length and/or
              width).
  
          Uses :meth:`check_fault_data` for checking parameters.
          """
          cls.check_fault_data(edges, mesh_spacing)
          surface_nodes = [complex_fault_node(edges)]
          mean_length = numpy.mean([edge.get_length() for edge in edges])
          num_hor_points = int(round(mean_length / mesh_spacing)) + 1
          if num_hor_points <= 1:
              raise ValueError(
                  'mesh spacing %.1f km is too big for mean length %.1f km' %
                  (mesh_spacing, mean_length)
              )
          edges = [edge.resample_to_num_points(num_hor_points).points
                   for i, edge in enumerate(edges)]
  
          vert_edges = [Line(v_edge) for v_edge in zip(*edges)]
          mean_width = numpy.mean([v_edge.get_length() for v_edge in vert_edges])
          num_vert_points = int(round(mean_width / mesh_spacing)) + 1
          if num_vert_points <= 1:
              raise ValueError(
                  'mesh spacing %.1f km is too big for mean width %.1f km' %
                  (mesh_spacing, mean_width)
              )
  
          points = zip(*[v_edge.resample_to_num_points(num_vert_points).points
                         for v_edge in vert_edges])
          mesh = RectangularMesh.from_points_list(list(points))
          assert 1 not in mesh.shape
          self = cls(mesh)
          self.surface_nodes = surface_nodes
          return self