docs: def construct_gene_object(ensembl, transcript_id):
      """ creates an Transcript object for a gene from ensembl databases
      
      Args:
          ensembl: EnsemblRequest object to request data from ensembl
          transcript_id: string for an Ensembl transcript ID
      
      Returns:
          a Transcript object, containing transcript coordinates and gene and
          transcript sequence.
      
      Raises:
          ValueError if CDS from genomic sequence given gene coordinates and CDS
          retrieved from Ensembl do not match.
      """
      
      # get the sequence for the identified transcript
      (chrom, start, end, strand, genomic_sequence) = ensembl.get_genomic_seq_for_transcript(transcript_id, expand=10)
      cds_sequence = ensembl.get_cds_seq_for_transcript(transcript_id)
      
      # get the locations of the exons and cds from ensembl
      cds_ranges = ensembl.get_cds_ranges_for_transcript(transcript_id)
      exon_ranges = ensembl.get_exon_ranges_for_transcript(transcript_id)
      
      # start a Transcript object with the locations and sequence
      transcript = Transcript(transcript_id, chrom, start, end, strand)
      transcript.set_exons(exon_ranges, cds_ranges)
      transcript.set_cds(cds_ranges)
      
      transcript.add_cds_sequence(cds_sequence)
      transcript.add_genomic_sequence(genomic_sequence, offset=10)
      
      return transcript