hstratus 0.1.0.0 → 0.1.1.0
raw patch · 8 files changed
+99/−7 lines, 8 filesdep ~hstratus-auth
Dependency ranges changed: hstratus-auth
Files
- ChangeLog.md +5/−0
- hstratus.cabal +5/−4
- src/Hstratus/Cli/Auth.hs +1/−1
- src/Hstratus/Cli/Common.hs +27/−0
- src/Hstratus/Cli/Drive.hs +2/−1
- src/Hstratus/Cli/Notes.hs +2/−1
- test/Hstratus/Cli/CommonSpec.hs +55/−0
- test/Spec.hs +2/−0
ChangeLog.md view
@@ -2,6 +2,11 @@ `hstratus` uses [PVP Versioning][1]. +## 0.1.1.0 -- 2026-07-30++* Add `Hstratus.Cli.Common` (parser for shared CLI options).+* Remove dependency on `hstratus-auth-cli` sublibrary.+ ## 0.1.0.0 -- 2026-07-28 * Initial version.
hstratus.cabal view
@@ -1,6 +1,6 @@ cabal-version: 3.0 name: hstratus-version: 0.1.0.0+version: 0.1.1.0 synopsis: Unified CLI for iCloud services description: An @hstratus@ executable that provides subcommands for iCloud authentication,@@ -33,6 +33,7 @@ exposed-modules: Hstratus.Cli Hstratus.Cli.Auth+ Hstratus.Cli.Common Hstratus.Cli.Drive Hstratus.Cli.Notes hs-source-dirs: src@@ -42,8 +43,7 @@ , containers >=0.6 && <0.8 , directory >=1.3 && <1.4 , filepath >=1.4 && <1.6- , hstratus-auth >=0.1 && <0.2- , hstratus-auth:hstratus-auth-cli >=0.1 && <0.2+ , hstratus-auth >=0.2 && <0.3 , hstratus-drive >=0.1 && <0.2 , hstratus-notes >=0.1 && <0.2 , http-client-tls >=0.3 && <0.4@@ -69,6 +69,7 @@ hs-source-dirs: test other-modules: Hstratus.Cli.AuthSpec+ Hstratus.Cli.CommonSpec Hstratus.Cli.DriveSpec Hstratus.Cli.NotesSpec default-language: Haskell2010@@ -80,7 +81,7 @@ , filepath >=1.4 && <1.6 , hspec >=2.1 && <3.0 , hstratus- , hstratus-auth:hstratus-auth-cli+ , hstratus-auth >=0.2 && <0.3 , hstratus-drive , hstratus-notes , optparse-applicative >=0.18 && <0.19
src/Hstratus/Cli/Auth.hs view
@@ -17,6 +17,7 @@ import Control.Exception (bracket_, catch, displayException) import Data.String (fromString)+import Hstratus.Cli.Common (commonOptsParser) import Network.HStratus.Http ( AuthError , login@@ -25,7 +26,6 @@ ) import Network.HStratus.Http.Cli ( CommonOpts (..)- , commonOptsParser , mkLoggerFor , resolveLogTarget )
+ src/Hstratus/Cli/Common.hs view
@@ -0,0 +1,27 @@+{- |+Module : Hstratus.Cli.Common+Copyright : (c) 2026 Tim Emiola+Maintainer : Tim Emiola <adetokunbo@emio.la>+SPDX-License-Identifier: BSD-3-Clause++Optparse-applicative parser for the options shared by all iCloud CLI subcommands.+-}+module Hstratus.Cli.Common+ ( commonOptsParser+ )+where++import Network.HStratus.Http.Cli (CommonOpts (..))+import Options.Applicative+++-- | Parser for 'CommonOpts'.+commonOptsParser :: Parser CommonOpts+commonOptsParser =+ CommonOpts+ <$> switch (long "china" <> help "Use mainland China endpoints")+ <*> switch (long "log" <> help "Append HTTP exchanges to the default log file")+ <*> optional+ (strOption (long "log-file" <> metavar "FILE" <> help "Append HTTP exchanges to FILE"))+ <*> switch (long "log-bodies" <> help "Include request bodies in the HTTP exchange log")+ <*> switch (long "redact" <> help "Redact sensitive headers (tokens, cookies) in the log")
src/Hstratus/Cli/Drive.hs view
@@ -43,6 +43,7 @@ import qualified Data.Text as Text import Data.Time (UTCTime) import Data.Time.Format (defaultTimeLocale, formatTime)+import Hstratus.Cli.Common (commonOptsParser) import Network.HStratus.Drive ( DriveApi , DriveError@@ -57,7 +58,7 @@ , mkDriveApi , selectFileNode )-import Network.HStratus.Http.Cli (CommonOpts (..), commonOptsParser, onServiceError, runWithApi)+import Network.HStratus.Http.Cli (CommonOpts (..), onServiceError, runWithApi) import Options.Applicative import System.Directory (createDirectoryIfMissing, getHomeDirectory) import System.Exit (die)
src/Hstratus/Cli/Notes.hs view
@@ -35,7 +35,8 @@ import Data.Text (Text) import qualified Data.Text as Text import qualified Data.Text.IO as TIO-import Network.HStratus.Http.Cli (CommonOpts (..), commonOptsParser, onServiceError, runWithApi)+import Hstratus.Cli.Common (commonOptsParser)+import Network.HStratus.Http.Cli (CommonOpts (..), onServiceError, runWithApi) import Network.HStratus.Notes import Network.HStratus.Notes.Markdown (noteToMarkdown) import Options.Applicative
+ test/Hstratus/Cli/CommonSpec.hs view
@@ -0,0 +1,55 @@+{-# LANGUAGE OverloadedStrings #-}++{- |+Module : Hstratus.Cli.CommonSpec+Copyright : (c) 2026 Tim Emiola+Maintainer : Tim Emiola <adetokunbo@emio.la>+SPDX-License-Identifier: BSD-3-Clause++Tests for the shared CLI options parser in 'Hstratus.Cli.Common'.+-}+module Hstratus.Cli.CommonSpec (spec) where++import Hstratus.Cli.Common (commonOptsParser)+import Network.HStratus.Http.Cli (CommonOpts (..))+import Options.Applicative (ParserResult (..), defaultPrefs, execParserPure, fullDesc, info, renderFailure)+import Test.Hspec+import Test.Hspec.Benri (endsRight)+++defaultOpts :: CommonOpts+defaultOpts = CommonOpts False False Nothing False False+++spec :: Spec+spec = describe "Hstratus.Cli.Common.commonOptsParser" $ do+ it "defaults all flags to False with no log file" $+ pure (parseOpts []) `endsRight` defaultOpts++ it "sets optChina when --china is given" $+ fmap optChina (parseOpts ["--china"]) `shouldBe` Right True++ it "sets optLog when --log is given" $+ fmap optLog (parseOpts ["--log"]) `shouldBe` Right True++ it "sets optLogFile when --log-file is given" $+ fmap optLogFile (parseOpts ["--log-file", "/tmp/test.log"])+ `shouldBe` Right (Just "/tmp/test.log")++ it "sets optLogBodies when --log-bodies is given" $+ fmap optLogBodies (parseOpts ["--log-bodies"]) `shouldBe` Right True++ it "sets optRedact when --redact is given" $+ fmap optRedact (parseOpts ["--redact"]) `shouldBe` Right True++ it "accepts multiple flags together" $+ pure (parseOpts ["--log", "--redact", "--china"])+ `endsRight` defaultOpts{optChina = True, optLog = True, optRedact = True}+++parseOpts :: [String] -> Either String CommonOpts+parseOpts args =+ case execParserPure defaultPrefs (info commonOptsParser fullDesc) args of+ Success opts -> Right opts+ Failure failure -> Left (fst (renderFailure failure "test"))+ CompletionInvoked _ -> Left "completion invoked"
test/Spec.hs view
@@ -1,6 +1,7 @@ module Main where import qualified Hstratus.Cli.AuthSpec as Auth+import qualified Hstratus.Cli.CommonSpec as Common import qualified Hstratus.Cli.DriveSpec as Drive import qualified Hstratus.Cli.NotesSpec as Notes import System.IO@@ -18,5 +19,6 @@ hSetBuffering stderr NoBuffering hspec $ do Auth.spec+ Common.spec Drive.spec Notes.spec