Commit 6cb1c4c5 authored by Andrew Gibiansky's avatar Andrew Gibiansky

Initial refactoring of startup and kernelspec installation

parent 2138b81e
...@@ -2,15 +2,11 @@ ...@@ -2,15 +2,11 @@
-- IPython language kernel that supports the @ipython console@ and @ipython -- IPython language kernel that supports the @ipython console@ and @ipython
-- notebook@ frontends. -- notebook@ frontends.
module IHaskell.IPython.Kernel ( module IHaskell.IPython.Kernel (
module IHaskell.IPython.Types, module X,
module IHaskell.IPython.Message.Writer,
module IHaskell.IPython.Message.Parser,
module IHaskell.IPython.Message.UUID,
module IHaskell.IPython.ZeroMQ,
) where ) where
import IHaskell.IPython.Types import IHaskell.IPython.Types as X
import IHaskell.IPython.Message.Writer import IHaskell.IPython.Message.Writer as X
import IHaskell.IPython.Message.Parser import IHaskell.IPython.Message.Parser as X
import IHaskell.IPython.Message.UUID import IHaskell.IPython.Message.UUID as X
import IHaskell.IPython.ZeroMQ import IHaskell.IPython.ZeroMQ as X
...@@ -8,6 +8,9 @@ module IHaskell.IPython.Types ( ...@@ -8,6 +8,9 @@ module IHaskell.IPython.Types (
Port(..), Port(..),
IP(..), IP(..),
-- * IPython kernelspecs
KernelSpec(..),
-- * IPython messaging protocol -- * IPython messaging protocol
Message(..), Message(..),
MessageHeader(..), MessageHeader(..),
...@@ -100,6 +103,22 @@ instance ToJSON Transport where ...@@ -100,6 +103,22 @@ instance ToJSON Transport where
toJSON TCP = String "tcp" toJSON TCP = String "tcp"
-------------------- IPython Kernelspec Types ----------------------
data KernelSpec = KernelSpec {
kernelDisplayName :: String, -- ^ Name shown to users to describe this kernel (e.g. "Haskell")
kernelLanguage :: String, -- ^ Name for the kernel; unique kernel identifier (e.g. "haskell")
kernelCommand :: [String] -- ^ Command to run to start the kernel. One of the strings may be
-- @"{connection_file}"@, which will be replaced by the path to a
-- kernel profile file (see @Profile@) when the command is run.
} deriving (Eq, Show)
instance ToJSON KernelSpec where
toJSON kernelspec = object
[ "argv" .= kernelCommand kernelspec
, "display_name" .= kernelDisplayName kernelspec
, "language" .= kernelLanguage kernelspec
]
-------------------- IPython Message Types ---------------------- -------------------- IPython Message Types ----------------------
-- | A message header with some metadata. -- | A message header with some metadata.
......
...@@ -24,7 +24,6 @@ data Args = Args IHaskellMode [Argument] ...@@ -24,7 +24,6 @@ data Args = Args IHaskellMode [Argument]
data Argument = ServeFrom String -- ^ Which directory to serve notebooks from. data Argument = ServeFrom String -- ^ Which directory to serve notebooks from.
| Extension String -- ^ An extension to load at startup. | Extension String -- ^ An extension to load at startup.
| ConfFile String -- ^ A file with commands to load at startup. | ConfFile String -- ^ A file with commands to load at startup.
| IPythonFrom String -- ^ Which executable to use for IPython.
| OverwriteFiles -- ^ Present when output should overwrite existing files. | OverwriteFiles -- ^ Present when output should overwrite existing files.
| ConvertFrom String | ConvertFrom String
| ConvertTo String | ConvertTo String
...@@ -51,6 +50,7 @@ data NotebookFormat = LhsMarkdown ...@@ -51,6 +50,7 @@ data NotebookFormat = LhsMarkdown
-- Which mode IHaskell is being invoked in. -- Which mode IHaskell is being invoked in.
-- `None` means no mode was specified. -- `None` means no mode was specified.
data IHaskellMode = ShowHelp String data IHaskellMode = ShowHelp String
| InstallKernelSpec
| Notebook | Notebook
| Console | Console
| ConvertLhs | ConvertLhs
...@@ -76,20 +76,18 @@ parseFlags flags = ...@@ -76,20 +76,18 @@ parseFlags flags =
modeFlags = concatMap modeNames allModes modeFlags = concatMap modeNames allModes
allModes :: [Mode Args] allModes :: [Mode Args]
allModes = [console, notebook, view, kernel, convert] allModes = [installKernelSpec, console, notebook, view, kernel, convert]
-- | Get help text for a given IHaskell ode. -- | Get help text for a given IHaskell ode.
help :: IHaskellMode -> String help :: IHaskellMode -> String
help mode = showText (Wrap 100) $ helpText [] HelpFormatAll $ chooseMode mode help mode = showText (Wrap 100) $ helpText [] HelpFormatAll $ chooseMode mode
where where
chooseMode Console = console chooseMode Console = console
chooseMode InstallKernelSpec = installKernelSpec
chooseMode Notebook = notebook chooseMode Notebook = notebook
chooseMode (Kernel _) = kernel chooseMode (Kernel _) = kernel
chooseMode ConvertLhs = convert chooseMode ConvertLhs = convert
ipythonFlag :: Flag Args
ipythonFlag = flagReq ["ipython", "i"] (store IPythonFrom) "<path>" "Executable for IPython."
ghcLibFlag :: Flag Args ghcLibFlag :: Flag Args
ghcLibFlag = flagReq ["ghclib", "l"] (store GhcLibDir) "<path>" "Library directory for GHC." ghcLibFlag = flagReq ["ghclib", "l"] (store GhcLibDir) "<path>" "Library directory for GHC."
...@@ -109,11 +107,13 @@ store constructor str (Args mode prev) = Right $ Args mode $ constructor str : p ...@@ -109,11 +107,13 @@ store constructor str (Args mode prev) = Right $ Args mode $ constructor str : p
notebook :: Mode Args notebook :: Mode Args
notebook = mode "notebook" (Args Notebook []) "Browser-based notebook interface." noArgs $ notebook = mode "notebook" (Args Notebook []) "Browser-based notebook interface." noArgs $
flagReq ["serve","s"] (store ServeFrom) "<dir>" "Directory to serve notebooks from.": flagReq ["serve","s"] (store ServeFrom) "<dir>" "Directory to serve notebooks from.":
ipythonFlag:
universalFlags universalFlags
console :: Mode Args console :: Mode Args
console = mode "console" (Args Console []) "Console-based interactive repl." noArgs $ ipythonFlag : universalFlags console = mode "console" (Args Console []) "Console-based interactive repl." noArgs universalFlags
installKernelSpec :: Mode Args
installKernelSpec = mode "install" (Args InstallKernelSpec []) "Install the Jupyter kernelspec." noArgs []
kernel :: Mode Args kernel :: Mode Args
kernel = mode "kernel" (Args (Kernel Nothing) []) "Invoke the IHaskell kernel." kernelArg [ghcLibFlag] kernel = mode "kernel" (Args (Kernel Nothing) []) "Invoke the IHaskell kernel." kernelArg [ghcLibFlag]
...@@ -186,7 +186,7 @@ view = ...@@ -186,7 +186,7 @@ view =
} }
where where
flags = [ipythonFlag, flagHelpSimple (add Help)] flags = [flagHelpSimple (add Help)]
formatArg = flagArg updateFmt "<format>" formatArg = flagArg updateFmt "<format>"
filenameArg = flagArg updateFile "<name>[.ipynb]" filenameArg = flagArg updateFile "<name>[.ipynb]"
updateFmt fmtStr (Args (View _ s) flags) = updateFmt fmtStr (Args (View _ s) flags) =
......
This diff is collapsed.
...@@ -29,6 +29,7 @@ module IHaskell.Types ( ...@@ -29,6 +29,7 @@ module IHaskell.Types (
IHaskellWidget(..), IHaskellWidget(..),
Widget(..), Widget(..),
CommInfo(..), CommInfo(..),
KernelSpec(..),
) where ) where
import ClassyPrelude import ClassyPrelude
......
...@@ -52,35 +52,21 @@ main = do ...@@ -52,35 +52,21 @@ main = do
Left errorMessage -> hPutStrLn stderr errorMessage Left errorMessage -> hPutStrLn stderr errorMessage
Right args -> ihaskell args Right args -> ihaskell args
chooseIPython [] = return DefaultIPython
chooseIPython (IPythonFrom path:_) = ExplicitIPython <$> subHome path
chooseIPython (_:xs) = chooseIPython xs
ihaskell :: Args -> IO () ihaskell :: Args -> IO ()
-- If no mode is specified, print help text.
ihaskell (Args (ShowHelp help) _) = putStrLn $ pack help ihaskell (Args (ShowHelp help) _) = putStrLn $ pack help
ihaskell (Args ConvertLhs args) = showingHelp ConvertLhs args $ convert args ihaskell (Args ConvertLhs args) = showingHelp ConvertLhs args $ convert args
ihaskell (Args InstallKernelSpec _) = withIPython $ return ()
ihaskell (Args Console flags) = showingHelp Console flags $ do ihaskell (Args Console flags) = showingHelp Console flags $ withIPython $ do
ipython <- chooseIPython flags
setupIPython ipython
flags <- addDefaultConfFile flags flags <- addDefaultConfFile flags
info <- initInfo IPythonConsole flags info <- initInfo IPythonConsole flags
runConsole ipython info runConsole info
ihaskell (Args mode@(View (Just fmt) (Just name)) args) = showingHelp mode args $ withIPython $
ihaskell (Args mode@(View (Just fmt) (Just name)) args) = showingHelp mode args $ do nbconvert fmt name
ipython <- chooseIPython args ihaskell (Args Notebook flags) = showingHelp Notebook flags $ withIPython $ do
nbconvert ipython fmt name let server =
case mapMaybe serveDir flags of
ihaskell (Args Notebook flags) = showingHelp Notebook flags $ do [] -> Nothing
ipython <- chooseIPython flags xs -> Just $ last xs
setupIPython ipython
let server = case mapMaybe serveDir flags of
[] -> Nothing
xs -> Just $ last xs
flags <- addDefaultConfFile flags flags <- addDefaultConfFile flags
...@@ -88,20 +74,19 @@ ihaskell (Args Notebook flags) = showingHelp Notebook flags $ do ...@@ -88,20 +74,19 @@ ihaskell (Args Notebook flags) = showingHelp Notebook flags $ do
curdir <- getCurrentDirectory curdir <- getCurrentDirectory
let info = undirInfo { initDir = curdir } let info = undirInfo { initDir = curdir }
runNotebook ipython info server runNotebook info (pack <$> server)
where where
serveDir (ServeFrom dir) = Just dir serveDir (ServeFrom dir) = Just dir
serveDir _ = Nothing serveDir _ = Nothing
ihaskell (Args (Kernel (Just filename)) flags) = do ihaskell (Args (Kernel (Just filename)) flags) = do
initInfo <- readInitInfo initInfo <- readInitInfo
runKernel libdir filename initInfo runKernel libdir filename initInfo
where where
libdir = case flags of libdir =
[] -> GHC.Paths.libdir case flags of
[GhcLibDir dir] -> dir [] -> GHC.Paths.libdir
[GhcLibDir dir] -> dir
-- | Add a conf file to the arguments if none exists. -- | Add a conf file to the arguments if none exists.
addDefaultConfFile :: [Argument] -> IO [Argument] addDefaultConfFile :: [Argument] -> IO [Argument]
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment