class_docstr: An object that can accumulate lines of Python source before execution.
  
  This object is designed to be fed python source line-by-line, using
  :meth:`push`. It will return on each push whether the currently pushed
  code could be executed already. In addition, it provides a method called
  :meth:`push_accepts_more` that can be used to query whether more input
  can be pushed into a single interactive block.
  
  This is a simple example of how an interactive terminal-based client can use
  this tool::
  
      isp = InputSplitter()
      while isp.push_accepts_more():
          indent = ' '*isp.indent_spaces
          prompt = '>>> ' + indent
          line = indent + raw_input(prompt)
          isp.push(line)
      print 'Input source was:\n', isp.source_reset(),
class_docstr_tok: ["An","object","that","can","accumulate","lines","of","Python","source","before","execution",".","This","object","is","designed","to","be","fed","python","source","line-by-line",",","using",":","meth",":","`","push","`",".","It","will","return","on","each","push","whether","the","currently","pushed","code","could","be","executed","already",".","In","addition",",","it","provides","a","method","called",":","meth",":","`","push_accepts_more","`","that","can","be","used","to","query","whether","more","input","can","be","pushed","into","a","single","interactive","block",".","This","is","a","simple","example","of","how","an","interactive","terminal-based","client","can","use","this","tool",":",":","isp","=","InputSplitter","(",")","while","isp.push_accepts_more","(",")",":","indent","=","'","'","*","isp.indent_spaces","prompt","=","'",">",">",">","'","+","indent","line","=","indent","+","raw_input","(","prompt",")","isp.push","(","line",")","print","'Input","source","was",":","\\n","'",",","isp.source_reset","(",")",","]
code: def get_indent_spaces(self) -> int:
      sourcefor, n = self._indent_spaces_cache
      if sourcefor == self.source:
          assert n is not None
          return n
  
      # self.source always has a trailing newline
      n = find_next_indent(self.source[:-1])
      self._indent_spaces_cache = (self.source, n)
      return n
  
imports: from warnings import warn
  import ast
  import codeop
  import io
  import re
  import sys
  import tokenize
  import warnings
  from typing import List, Tuple, Union, Optional
  from types import CodeType
  from IPython.core.inputtransformer import leading_indent, classic_prompt, ipy_prompt, cellmagic, assemble_logical_lines, help_end, escaped_commands, assign_from_magic, assign_from_system, assemble_python_lines
  from IPython.utils import tokenutil
  from IPython.core.inputtransformer import ESC_SHELL, ESC_SH_CAP, ESC_HELP, ESC_HELP2, ESC_MAGIC, ESC_MAGIC2, ESC_QUOTE, ESC_QUOTE2, ESC_PAREN, ESC_SEQUENCES
label_desc: Use image node_id 7 for calling the InputSplitter obj's underlying member method code with example usage: obj.get_indent_spaces() and returns: n, n