old_contents: from invoke import task
  
  import code
  
  @task
  def shell():
      """
      Open a Python shell, bootstrapping the connection to MongoDB
      """
      code.interact()
  
new_contents: import code
  import os
  
  from invoke import task
  
  # Portions of this code taken from django.core.management.commands.shell
  # License is as follows:
  #
  # Copyright (c) Django Software Foundation and individual contributors.
  # All rights reserved.
  # 
  # Redistribution and use in source and binary forms, with or without modification,
  # are permitted provided that the following conditions are met:
  # 
  #     1. Redistributions of source code must retain the above copyright notice,
  #        this list of conditions and the following disclaimer.
  # 
  #     2. Redistributions in binary form must reproduce the above copyright
  #        notice, this list of conditions and the following disclaimer in the
  #        documentation and/or other materials provided with the distribution.
  # 
  #     3. Neither the name of Django nor the names of its contributors may be used
  #        to endorse or promote products derived from this software without
  #        specific prior written permission.
  # 
  # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
  # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
  # ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  
  @task
  def shell(no_startup=False):
      """
      Open a Python shell, bootstrapping the connection to MongoDB
      """
      # Set up a dictionary to serve as the environment for the shell, so
      # that tab completion works on objects that are imported at runtime.
      imported_objects = {}
  
      try:  # Try activating rlcompleter, because it's handy.
          import readline
      except ImportError:
          pass
      else:
          # We don't have to wrap the following import in a 'try', because
          # we already know 'readline' was imported successfully.
          import rlcompleter
          readline.set_completer(rlcompleter.Completer(imported_objects).complete)
          readline.parse_and_bind("tab:complete")
  
      # We want to honor both $PYTHONSTARTUP and .pythonrc.py, so follow system
      # conventions and get $PYTHONSTARTUP first then .pythonrc.py.
      if not no_startup:
          for pythonrc in (os.environ.get("PYTHONSTARTUP"), '~/.pythonrc.py'):
              if not pythonrc:
                  continue
              pythonrc = os.path.expanduser(pythonrc)
              if not os.path.isfile(pythonrc):
                  continue
              try:
                  with open(pythonrc) as handle:
                      exec(compile(handle.read(), pythonrc, 'exec'), imported_objects)
              except NameError:
                  pass
  
      code.interact(local=imported_objects)
  
subject: Enable history, autocomplete in shell task