class_docstr: Rule class to handle processing
docstr: Produce an md5 for the contents of this rule.
  
  This logic applies to expressions within the function only. It does not take
  into account: the function name, docstring, comments, or decorator arguments
docstr_tok: ["Produce","an","md5","for","the","contents","of","this","rule",".","This","logic","applies","to","expressions","within","the","function","only",".","It","does","not","take","into","account",":","the","function","name",",","docstring",",","comments",",","or","decorator","arguments"]
code: def checksum(self):
      """Produce an md5 for the contents of this rule.
  
      This logic applies to expressions within the function only. It does not take
      into account: the function name, docstring, comments, or decorator arguments
      """
      if not self._checksum:
          try:
              code = inspect.getsource(self.func)
              root = ast.parse(code)
              md5 = hashlib.md5()  # nosec
              for expression in root.body[0].body:
                  # This check is necessary to ensure changes to the docstring
                  # are allowed without altering the checksum
                  if not isinstance(expression, ast.Expr):
                      md5.update(ast.dump(expression).encode("utf-8"))
  
              self._checksum = md5.hexdigest()
          except (TypeError, IndentationError, IndexError):
              LOGGER.exception("Could not checksum rule function")
              self._checksum = self.CHECKSUM_UNKNOWN
  
      return self._checksum
  
imports: import ast
  from copy import deepcopy
  import hashlib
  import inspect
  import json
  from streamalert.shared.logger import get_logger
label_desc: Use image node_id 8 for calling the Rule obj's underlying member method code with example usage: obj.checksum() and returns: self