import os
from psutil import Process
from .bash import Bash
from .fish import Fish
from .generic import Generic
from .tcsh import Tcsh
from .zsh import Zsh

shells = {'bash': Bash,
          'fish': Fish,
          'zsh': Zsh,
          'csh': Tcsh,
          'tcsh': Tcsh}


def _get_shell():
    try:
        shell_name = Process(os.getpid()).parent().name()
    except TypeError:
        shell_name = Process(os.getpid()).parent.name
    return shells.get(shell_name, Generic)()


shell = _get_shell()

import os
from psutil import Process
from .bash import Bash
from .fish import Fish
from .generic import Generic
from .tcsh import Tcsh
from .zsh import Zsh

shells = {'bash': Bash,
          'fish': Fish,
          'zsh': Zsh,
          'csh': Tcsh,
          'tcsh': Tcsh}


def _get_shell():
    proc = Process(os.getpid())

    while (proc is not None):
        name = None
        try:
            name = proc.name()
        except TypeError:
            name = proc.name

        name = os.path.splitext(name)[0]

        if name in shells:
            return shells[name]()

        try:
            proc = proc.parent()
        except TypeError:
            proc = proc.parent

    return Generic()


shell = _get_shell()

Update _get_shell to work with Windows
Update _get_shell to work with Windows

- _get_shell assumed the parent process would always be the shell process, in Powershell the
  parent process is Python, with the grandparent being the shell
- Switched to walking the process tree so the same code path can be used in both places

  import os
  from psutil import Process
  from .bash import Bash
  from .fish import Fish
  from .generic import Generic
  from .tcsh import Tcsh
  from .zsh import Zsh
  
  shells = {'bash': Bash,
            'fish': Fish,
            'zsh': Zsh,
            'csh': Tcsh,
            'tcsh': Tcsh}
  
  
  def _get_shell():
+     proc = Process(os.getpid())
+ 
+     while (proc is not None):
+         name = None
-     try:
+         try:
-         shell_name = Process(os.getpid()).parent().name()
+             name = proc.name()
-     except TypeError:
+         except TypeError:
-         shell_name = Process(os.getpid()).parent.name
-     return shells.get(shell_name, Generic)()
+             name = proc.name
+ 
+         name = os.path.splitext(name)[0]
+ 
+         if name in shells:
+             return shells[name]()
+ 
+         try:
+             proc = proc.parent()
+         except TypeError:
+             proc = proc.parent
+ 
+     return Generic()
  
  
  shell = _get_shell()
  
Update _get_shell to work with Windows
## Code Before:
import os
from psutil import Process
from .bash import Bash
from .fish import Fish
from .generic import Generic
from .tcsh import Tcsh
from .zsh import Zsh

shells = {'bash': Bash,
          'fish': Fish,
          'zsh': Zsh,
          'csh': Tcsh,
          'tcsh': Tcsh}


def _get_shell():
    try:
        shell_name = Process(os.getpid()).parent().name()
    except TypeError:
        shell_name = Process(os.getpid()).parent.name
    return shells.get(shell_name, Generic)()


shell = _get_shell()

## Instruction:
Update _get_shell to work with Windows
## Code After:
import os
from psutil import Process
from .bash import Bash
from .fish import Fish
from .generic import Generic
from .tcsh import Tcsh
from .zsh import Zsh

shells = {'bash': Bash,
          'fish': Fish,
          'zsh': Zsh,
          'csh': Tcsh,
          'tcsh': Tcsh}


def _get_shell():
    proc = Process(os.getpid())

    while (proc is not None):
        name = None
        try:
            name = proc.name()
        except TypeError:
            name = proc.name

        name = os.path.splitext(name)[0]

        if name in shells:
            return shells[name]()

        try:
            proc = proc.parent()
        except TypeError:
            proc = proc.parent

    return Generic()


shell = _get_shell()
