code: def getInfo(self, ctext: str) -> CrackInfo:
      analysis = self.cache.get_or_update(
          ctext,
          "cipheycore::simple_analysis",
          lambda: cipheycore.analyse_string(ctext),
      )
  
      return CrackInfo(
          success_likelihood=cipheycore.caesar_detect(
              analysis, self.expected
          ),
          # TODO: actually calculate runtimes
          success_runtime=1e-5,
          failure_runtime=1e-5,
      )
  
file_path: Ciphey/ciphey/basemods/Crackers/caesar.py
imports: from distutils import util
  from typing import Dict, List, Optional, Union
  import cipheycore
  import logging
  from rich.logging import RichHandler
  from ciphey.common import fix_case
  from ciphey.iface import Config, Cracker, CrackInfo, CrackResult, ParamSpec, registry
label_desc: Use image node_id 1 for calling the Caesar obj's underlying member method code with example usage: obj.getInfo(ctext) and returns: CrackInfo