on master help sign in
Merge pull request #38 from obsidiansystems/cliapp

Decouple `Obelisk.CLI` from obelisk-command

commit8dca44efd8b8b5d638b178c1be4ced9b3e3fd16c authorLuigy Leon <luichi.19@gmail.com> dateWed 30 May 2018, 16:12 (8 years ago) parentd4785541db8055
19 files changed+73−45
default.nix+2 lib/README.md+3−1 lib/cliapp/obelisk-cliapp.cabal+32 lib/command/src/Obelisk/CLI.hs → lib/cliapp/src/Obelisk/CliApp.hs+5−5 lib/command/src/Obelisk/CLI/Demo.hs → lib/cliapp/src/Obelisk/CliApp/Demo.hs+2−2 lib/command/src/Obelisk/CLI/Logging.hs → lib/cliapp/src/Obelisk/CliApp/Logging.hs+3−3 lib/command/src/Obelisk/CLI/Process.hs → lib/cliapp/src/Obelisk/CliApp/Process.hs+3−3 lib/command/src/Obelisk/CLI/Spinner.hs → lib/cliapp/src/Obelisk/CliApp/Spinner.hs+4−4 lib/command/src/Obelisk/CLI/TerminalString.hs → lib/cliapp/src/Obelisk/CliApp/TerminalString.hs+1−1 lib/command/src/Obelisk/CLI/Types.hs → lib/cliapp/src/Obelisk/CliApp/Types.hs+2−2 lib/command/obelisk-command.cabal+1−8 lib/command/src/Obelisk/App.hs+1−1 lib/command/src/Obelisk/Command.hs+2−2 lib/command/src/Obelisk/Command/Deploy.hs+3−4 lib/command/src/Obelisk/Command/Nix.hs+1−1 lib/command/src/Obelisk/Command/Project.hs+1−1 lib/command/src/Obelisk/Command/Run.hs+2−2 lib/command/src/Obelisk/Command/Thunk.hs+3−3 lib/command/src/Obelisk/Command/Utils.hs+2−2
default.nix+2
@@ -93,6 +93,7 @@ let #TODO: Upstream
9393 addLibs = self: super: {
9494 obelisk-asset-manifest = self.callCabal2nix "obelisk-asset-manifest" (hackGet ./lib/asset + "/manifest") {};
9595 obelisk-asset-serve-snap = self.callCabal2nix "obelisk-asset-serve-snap" (hackGet ./lib/asset + "/serve-snap") {};
96+ obelisk-cliapp = self.callCabal2nix "obelisk-cliapp" (cleanSource ./lib/cliapp) {};
9697 obelisk-backend = self.callCabal2nix "obelisk-backend" (cleanSource ./lib/backend) {};
9798 obelisk-command = (self.callCabal2nix "obelisk-command" (cleanSource ./lib/command) {}).override { Cabal = super.Cabal_2_0_0_2; };
9899 obelisk-executable-config = executableConfig.haskellPackage self;
@@ -110,6 +111,7 @@ rec {
110111 inherit reflex-platform;
111112 inherit (reflex-platform) nixpkgs pinBuildInputs;
112113 path = reflex-platform.filterGit ./.;
114+ obelisk = ghcObelisk;
113115 command = ghcObelisk.obelisk-command;
114116 shell = pinBuildInputs "obelisk-shell" ([
115117 command
lib/README.md+3−1
@@ -1 +1,3 @@
1−Libraries provided by obelisk
1+# Obelisk libraries
2+
3+This directory contains libraries provided by obelisk. By convention they are prefixed with `obelisk-` and their module exports all lie within the `Obelisk` import namespace. For example, to include `cliapp` as a dependency you would add `obelisk-cliapp` to your cabal dependencies, and import `Obelisk.CliApp...` in the source files.
lib/cliapp/obelisk-cliapp.cabalnew file+32
@@ -0,0 +1,32 @@
1+name: obelisk-cliapp
2+version: 0.1
3+license: BSD3
4+build-type: Simple
5+cabal-version: >=1.2
6+
7+library
8+ hs-source-dirs: src
9+ build-depends:
10+ ansi-terminal
11+ , base
12+ , bytestring
13+ , exceptions
14+ , io-streams
15+ , logging-effect
16+ , monad-loops
17+ , mtl
18+ , process
19+ , terminal-size
20+ , text
21+ , time
22+ , transformers
23+ exposed-modules:
24+ Obelisk.CliApp
25+ Obelisk.CliApp.Demo
26+ other-modules:
27+ Obelisk.CliApp.Logging
28+ Obelisk.CliApp.Process
29+ Obelisk.CliApp.Spinner
30+ Obelisk.CliApp.TerminalString
31+ Obelisk.CliApp.Types
32+ ghc-options: -Wall -fobject-code
lib/command/src/Obelisk/CLI.hs → lib/cliapp/src/Obelisk/CliApp.hsrenamed+5−5
@@ -3,7 +3,7 @@
33-- See Demo.hs for an example
44--
55-- This package should eventually be made its own library.
6−module Obelisk.CLI
6+module Obelisk.CliApp
77 (
88 -- .Types
99 Cli
@@ -36,7 +36,7 @@ module Obelisk.CLI
3636
3737import Control.Monad.Log (Severity (..))
3838
39−import Obelisk.CLI.Logging
40−import Obelisk.CLI.Process
41−import Obelisk.CLI.Spinner
42−import Obelisk.CLI.Types
39+import Obelisk.CliApp.Logging
40+import Obelisk.CliApp.Process
41+import Obelisk.CliApp.Spinner
42+import Obelisk.CliApp.Types
lib/command/src/Obelisk/CLI/Demo.hs → lib/cliapp/src/Obelisk/CliApp/Demo.hsrenamed+2−2
@@ -1,6 +1,6 @@
11{-# LANGUAGE FlexibleContexts #-}
22{-# LANGUAGE OverloadedStrings #-}
3−module Obelisk.CLI.Demo where
3+module Obelisk.CliApp.Demo where
44
55import Control.Concurrent (threadDelay)
66import Control.Monad.IO.Class (liftIO)
@@ -11,7 +11,7 @@ import System.Process (proc)
1111
1212import Control.Monad.Catch (MonadMask)
1313
14−import Obelisk.CLI
14+import Obelisk.CliApp
1515
1616cliDemo
1717 :: (MonadIO m, MonadMask m, Cli m, HasCliConfig m)
lib/command/src/Obelisk/CLI/Logging.hs → lib/cliapp/src/Obelisk/CliApp/Logging.hsrenamed+3−3
@@ -7,7 +7,7 @@
77{-# LANGUAGE ScopedTypeVariables #-}
88-- | Provides a logging handler that facilitates safe ouputting to terminal using MVar based locking.
99-- | Spinner.hs and Process.hs work on this guarantee.
10−module Obelisk.CLI.Logging where
10+module Obelisk.CliApp.Logging where
1111
1212import Control.Concurrent (ThreadId, forkIO, killThread, threadDelay)
1313import Control.Concurrent.MVar (modifyMVar_, newMVar)
@@ -28,8 +28,8 @@ import System.Console.ANSI (Color (Red, White, Yellow), ColorIntensity (Vivid),
2828import System.Exit (ExitCode (..), exitWith)
2929import System.IO (BufferMode (NoBuffering), hFlush, hReady, hSetBuffering, stdin, stdout)
3030
31−import qualified Obelisk.CLI.TerminalString as TS
32−import Obelisk.CLI.Types
31+import qualified Obelisk.CliApp.TerminalString as TS
32+import Obelisk.CliApp.Types
3333
3434newCliConfig :: Severity -> Bool -> Bool -> IO CliConfig
3535newCliConfig sev noColor noSpinner = do
lib/command/src/Obelisk/CLI/Process.hs → lib/cliapp/src/Obelisk/CliApp/Process.hsrenamed+3−3
@@ -8,7 +8,7 @@
88
99-- | An extension of `System.Process` that integrates with logging (`Obelisk.CLI.Logging`)
1010-- and is thus spinner friendly.
11−module Obelisk.CLI.Process
11+module Obelisk.CliApp.Process
1212 ( readProcessAndLogStderr
1313 , callProcessAndLogOutput
1414 , createProcess
@@ -38,8 +38,8 @@ import System.Process (CreateProcess, ProcessHandle, StdStream (CreatePipe), cmd
3838import qualified System.Process as Process
3939
4040import Control.Monad.Log (Severity (..))
41−import Obelisk.CLI.Logging (failWith, putLog, putLogRaw)
42−import Obelisk.CLI.Types (Cli)
41+import Obelisk.CliApp.Logging (failWith, putLog, putLogRaw)
42+import Obelisk.CliApp.Types (Cli)
4343
4444-- | Like `System.Process.readProcess` but logs the stderr instead of letting the external process inherit it.
4545readProcessAndLogStderr
lib/command/src/Obelisk/CLI/Spinner.hs → lib/cliapp/src/Obelisk/CliApp/Spinner.hsrenamed+4−4
@@ -2,7 +2,7 @@
22{-# LANGUAGE MultiParamTypeClasses #-}
33{-# LANGUAGE OverloadedStrings #-}
44-- | Provides a simple CLI spinner that interoperates cleanly with the rest of the logging output.
5−module Obelisk.CLI.Spinner (withSpinner) where
5+module Obelisk.CliApp.Spinner (withSpinner) where
66
77import Control.Concurrent (killThread, threadDelay)
88import Control.Monad (forM_, (>=>))
@@ -15,9 +15,9 @@ import qualified Data.List as L
1515import Data.Text (Text)
1616import System.Console.ANSI (Color (Blue, Cyan, Green, Red))
1717
18−import Obelisk.CLI.Logging (allowUserToMakeLoggingVerbose, fork)
19−import Obelisk.CLI.TerminalString (TerminalString (..), enquiryCode)
20−import Obelisk.CLI.Types (Cli, CliConfig (..), HasCliConfig, Output (..), getCliConfig)
18+import Obelisk.CliApp.Logging (allowUserToMakeLoggingVerbose, fork)
19+import Obelisk.CliApp.TerminalString (TerminalString (..), enquiryCode)
20+import Obelisk.CliApp.Types (Cli, CliConfig (..), HasCliConfig, Output (..), getCliConfig)
2121
2222-- | Run an action with a CLI spinner.
2323withSpinner
lib/command/src/Obelisk/CLI/TerminalString.hs → lib/cliapp/src/Obelisk/CliApp/TerminalString.hsrenamed+1−1
@@ -2,7 +2,7 @@
22{-# LANGUAGE MultiParamTypeClasses #-}
33{-# LANGUAGE OverloadedStrings #-}
44-- | Types and functions dealing with strings to be printed on terminal.
5−module Obelisk.CLI.TerminalString
5+module Obelisk.CliApp.TerminalString
66 ( TerminalString(..)
77 , render
88 , putStrWithSGR
lib/command/src/Obelisk/CLI/Types.hs → lib/cliapp/src/Obelisk/CliApp/Types.hsrenamed+2−2
@@ -3,7 +3,7 @@
33{-# LANGUAGE FlexibleInstances #-}
44{-# LANGUAGE GeneralizedNewtypeDeriving #-}
55{-# LANGUAGE MultiParamTypeClasses #-}
6−module Obelisk.CLI.Types where
6+module Obelisk.CliApp.Types where
77
88import Control.Concurrent.MVar (MVar)
99import Control.Monad.Catch (MonadCatch, MonadMask, MonadThrow)
@@ -12,7 +12,7 @@ import Control.Monad.Reader (MonadIO, ReaderT (..), ask)
1212import Data.IORef (IORef)
1313import Data.Text (Text)
1414
15−import Obelisk.CLI.TerminalString (TerminalString)
15+import Obelisk.CliApp.TerminalString (TerminalString)
1616
1717data CliConfig = CliConfig
1818 { _cliConfig_logLevel :: IORef Severity -- We are capable of changing the log level at runtime
lib/command/obelisk-command.cabal+1−8
@@ -15,6 +15,7 @@ library
1515 , base16-bytestring
1616 , binary
1717 , bytestring
18+ , obelisk-cliapp
1819 , containers
1920 , data-default
2021 , directory
@@ -41,8 +42,6 @@ library
4142 , yaml
4243 exposed-modules:
4344 Obelisk.App
44− Obelisk.CLI
45− Obelisk.CLI.Demo
4645 Obelisk.Command
4746 Obelisk.Command.Deploy
4847 Obelisk.Command.Nix
@@ -50,12 +49,6 @@ library
5049 Obelisk.Command.Run
5150 Obelisk.Command.Thunk
5251 Obelisk.Command.Utils
53− other-modules:
54− Obelisk.CLI.Logging
55− Obelisk.CLI.Process
56− Obelisk.CLI.Spinner
57− Obelisk.CLI.TerminalString
58− Obelisk.CLI.Types
5952 -- -fobject-code is so that the StaticPointers extension can work in ghci
6053 ghc-options: -Wall -fobject-code
6154
lib/command/src/Obelisk/App.hs+1−1
@@ -11,7 +11,7 @@ import Control.Monad.Catch (MonadCatch, MonadMask, MonadThrow)
1111import Control.Monad.Reader (MonadIO, ReaderT (..), ask, runReaderT)
1212import Control.Monad.Trans.Class (lift)
1313
14−import Obelisk.CLI (Cli, CliConfig, CliT, HasCliConfig, getCliConfig, runCli)
14+import Obelisk.CliApp (Cli, CliConfig, CliT, HasCliConfig, getCliConfig, runCli)
1515
1616newtype Obelisk = Obelisk
1717 { _obelisk_cliConfig :: CliConfig
lib/command/src/Obelisk/Command.hs+2−2
@@ -28,8 +28,8 @@ import System.Posix.Process (executeFile)
2828import System.Process (callCommand)
2929
3030import Obelisk.App
31−import Obelisk.CLI (Severity (..), failWith, getLogLevel, newCliConfig, putLog)
32−import Obelisk.CLI.Demo (cliDemo)
31+import Obelisk.CliApp (Severity (..), failWith, getLogLevel, newCliConfig, putLog)
32+import Obelisk.CliApp.Demo (cliDemo)
3333import Obelisk.Command.Deploy
3434import Obelisk.Command.Project
3535import Obelisk.Command.Run
lib/command/src/Obelisk/Command/Deploy.hs+3−4
@@ -9,8 +9,8 @@ import Control.Monad
99import Control.Monad.Catch (finally)
1010import Control.Monad.IO.Class (liftIO)
1111import Data.Attoparsec.ByteString.Char8 as A
12−import qualified Data.ByteString.Char8 as BC8
1312import Data.Bits
13+import qualified Data.ByteString.Char8 as BC8
1414import Data.Default
1515import Data.Maybe
1616import Data.Monoid
@@ -18,13 +18,12 @@ import qualified Data.Text as T
1818import qualified Data.Text.IO as T
1919import System.Directory
2020import System.FilePath
21−import System.Posix.Files
2221import System.Posix.Env (getEnvironment)
22+import System.Posix.Files
2323import System.Process (delegate_ctlc, env, proc, readProcess)
2424
2525import Obelisk.App (MonadObelisk)
26−import Obelisk.CLI (Severity (..), callProcessAndLogOutput, failWith, withSpinner)
27−import Obelisk.CLI.Logging
26+import Obelisk.CliApp (Severity (..), callProcessAndLogOutput, failWith, putLog, withSpinner)
2827import Obelisk.Command.Nix
2928import Obelisk.Command.Project
3029import Obelisk.Command.Thunk
lib/command/src/Obelisk/Command/Nix.hs+1−1
@@ -16,7 +16,7 @@ import qualified Data.Text as T
1616import System.Process (proc)
1717
1818import Obelisk.App (MonadObelisk)
19−import Obelisk.CLI (Severity (..), readProcessAndLogStderr, withSpinner)
19+import Obelisk.CliApp (Severity (..), readProcessAndLogStderr, withSpinner)
2020
2121-- | Where to put nix-build output
2222data OutLink
lib/command/src/Obelisk/Command/Project.hs+1−1
@@ -33,7 +33,7 @@ import GitHub.Data.GitData (Branch)
3333import GitHub.Data.Name (Name)
3434
3535import Obelisk.App (MonadObelisk)
36−import Obelisk.CLI (Severity (..), callProcessAndLogOutput, createProcess_, failWith, putLog, withSpinner)
36+import Obelisk.CliApp (Severity (..), callProcessAndLogOutput, createProcess_, failWith, putLog, withSpinner)
3737import Obelisk.Command.Thunk
3838import Obelisk.Command.Utils (cp)
3939--TODO: Make this module resilient to random exceptions
lib/command/src/Obelisk/Command/Run.hs+2−2
@@ -27,8 +27,8 @@ import System.FilePath
2727import System.IO.Temp (withSystemTempDirectory)
2828
2929import Obelisk.App (MonadObelisk, ObeliskT)
30−import Obelisk.CLI (CliT (..), HasCliConfig, Severity (..), callCommand, failWith, getCliConfig, putLog,
31− runCli)
30+import Obelisk.CliApp (CliT (..), HasCliConfig, Severity (..), callCommand, failWith, getCliConfig, putLog,
31+ runCli)
3232import Obelisk.Command.Project (inProjectShell)
3333
3434-- NOTE: `run` is not polymorphic like the rest because we use StaticPtr to invoke it.
lib/command/src/Obelisk/Command/Thunk.hs+3−3
@@ -35,8 +35,8 @@ import Control.Monad.Catch (handle)
3535import Control.Monad.Except
3636import Data.Aeson ((.=))
3737import qualified Data.Aeson as Aeson
38−import qualified Data.Aeson.Types as Aeson
3938import Data.Aeson.Encode.Pretty
39+import qualified Data.Aeson.Types as Aeson
4040import qualified Data.ByteString.Lazy as LBS
4141import qualified Data.ByteString.Lazy.Char8 as LBSC
4242import Data.Default
@@ -72,8 +72,8 @@ import System.Posix (getSymbolicLinkStatus, modificationTime)
7272import System.Process (proc)
7373
7474import Obelisk.App (MonadObelisk)
75−import Obelisk.CLI (Severity (..), callProcessAndLogOutput, failWith, putLog, readProcessAndLogStderr,
76− withExitFailMessage, withSpinner)
75+import Obelisk.CliApp (Severity (..), callProcessAndLogOutput, failWith, putLog, readProcessAndLogStderr,
76+ withExitFailMessage, withSpinner)
7777import Obelisk.Command.Utils (checkGitCleanStatus, cp, git, procWithPackages)
7878
7979--TODO: Support symlinked thunk data
lib/command/src/Obelisk/Command/Utils.hs+2−2
@@ -2,13 +2,13 @@
22{-# LANGUAGE OverloadedStrings #-}
33module Obelisk.Command.Utils where
44
5+import qualified Data.List as L
56import Data.Semigroup ((<>))
67import qualified Data.Text as T
7−import qualified Data.List as L
88import qualified System.Process as P
99
1010import Obelisk.App (MonadObelisk)
11−import Obelisk.CLI (Severity (..), callProcessAndLogOutput, readProcessAndLogStderr)
11+import Obelisk.CliApp (Severity (..), callProcessAndLogOutput, readProcessAndLogStderr)
1212
1313-- Check whether the working directory is clean
1414checkGitCleanStatus :: MonadObelisk m => FilePath -> m Bool