docs: def resolve_url(self, resource_name):
          """Return a URL to a local copy of a resource, suitable for get_generator()
  
          For Package URLS, resolution involves generating a URL to a data file from the package URL and the
          value of a resource. The resource value, the url, can be one of:
  
          - An absolute URL, with a web scheme
          - A relative URL, relative to the package, with a file scheme.
  
          URLs with non-file schemes are returned. File scheme are assumed to be relative to the package,
          and are resolved according to the type of resource.
  
          """
  
          u = parse_app_url(resource_name)
  
          if u.scheme != 'file':
              t = u
  
          elif self.target_format == 'csv' and self.target_file != DEFAULT_METATAB_FILE:
              # Thre are two forms for CSV package URLS:
              # - A CSV package, which can only have absolute URLs
              # - A Filesystem package, which can have relative URLs.
  
              # The complication is that the filsystem package usually has a metadata file named
              # DEFAULT_METATAB_FILE, which can distinguish it from a CSV package, but it's also possible
              # to have a filesystem package with a non standard package name.
  
              # So, this clause can happed for two cases: A CSV package or a Filesystem package with a nonstandard
              # metadata file name.
  
              # For CSV packages, need to get the package and open it to get the resource URL, because
              # they are always absolute web URLs and may not be related to the location of the metadata.
  
              s = self.get_resource()
              rs = s.metadata_url.doc.resource(resource_name)
              if rs is not None:
                  t = parse_app_url(rs.url)
              else:
                  raise ResourceError("No resource for '{}' in '{}' ".format(resource_name, self))
  
          else:
              jt = self.join_target(resource_name)
  
              try:
                  rs = jt.get_resource()
              except DownloadError:
                  raise ResourceError(
                      "Failed to download resource for '{}' for '{}' in '{}'".format(jt, resource_name, self))
              t = rs.get_target()
  
          return t