hledger-iadd 1.3.1 → 1.3.2
raw patch · 10 files changed
+70/−33 lines, 10 filesdep −text-formatdep ~basedep ~brickdep ~megaparsecPVP ok
version bump matches the API change (PVP)
Dependencies removed: text-format
Dependency ranges changed: base, brick, megaparsec
API changes (from Hackage documentation)
+ Brick.Widgets.Border.Utils: borderLeft :: Widget n -> Widget n
+ DateParser: instance Data.Semigroup.Semigroup a => Data.Semigroup.Semigroup (DateParser.IncompleteDate a)
Files
- ChangeLog.md +7/−0
- hledger-iadd.cabal +8/−10
- src/Brick/Widgets/Border/Utils.hs +22/−0
- src/Brick/Widgets/CommentDialog.hs +1/−1
- src/Brick/Widgets/HelpMessage.hs +1/−1
- src/ConfigParser.hs +1/−1
- src/DateParser.hs +9/−7
- src/View.hs +9/−7
- src/main/Main.hs +11/−5
- tests/ModelSpec.hs +1/−1
ChangeLog.md view
@@ -1,3 +1,10 @@+# 1.3.2++ - Highlight currently constructed transaction+ - Fix build with GHC 8.4+ - Support new dependencies+ - Drop dependency on text-format+ # 1.3.1 - Support brick <= 0.32
hledger-iadd.cabal view
@@ -1,5 +1,5 @@ name: hledger-iadd-version: 1.3.1+version: 1.3.2 synopsis: A terminal UI as drop-in replacement for hledger add description: This is a terminal UI as drop-in replacement for hledger add. .@@ -30,7 +30,7 @@ category: Finance, Console build-type: Simple cabal-version: >=1.10-tested-with: GHC==7.10.3, GHC==8.0+tested-with: GHC==8.0, GHC==8.2, GHC==8.4 extra-source-files: doc/screencast.gif@@ -54,11 +54,12 @@ , Brick.Widgets.BetterDialog , Brick.Widgets.WrappedText , Brick.Widgets.Edit.EmacsBindings+ , Brick.Widgets.Border.Utils , Text.Megaparsec.Compat default-language: Haskell2010- build-depends: base >= 4.8 && < 5+ build-depends: base >= 4.9 && < 5 , hledger-lib >= 1.0 && < 1.6- , brick >= 0.17 && < 0.33+ , brick >= 0.17 , vty >= 5.4 , text , microlens@@ -71,7 +72,6 @@ , containers , optparse-applicative , directory- , text-format , xdg-basedir , unordered-containers , free >= 4.12.4@@ -83,10 +83,10 @@ main-is: Main.hs other-modules: Paths_hledger_iadd default-language: Haskell2010- build-depends: base >= 4.8 && < 5+ build-depends: base >= 4.9 && < 5 , hledger-iadd , hledger-lib >= 1.0 && < 1.6- , brick >= 0.17 && < 0.33+ , brick >= 0.17 , vty >= 5.4 , text , microlens@@ -96,7 +96,6 @@ , vector , optparse-applicative , directory- , text-format , xdg-basedir , unordered-containers , free >= 4.12.4@@ -112,7 +111,7 @@ , AmountParserSpec , ModelSpec default-language: Haskell2010- build-depends: base >= 4.8 && < 5+ build-depends: base >= 4.9 && < 5 , hledger-iadd , hledger-lib >= 1.0 && < 1.6 , text@@ -121,7 +120,6 @@ , vector , hspec , QuickCheck- , text-format , free >= 4.12.4 , megaparsec >= 5.0 && <6.5 , text-zipper >= 0.10
+ src/Brick/Widgets/Border/Utils.hs view
@@ -0,0 +1,22 @@+-- | Extensions to "Brick.Widgets.Border"+module Brick.Widgets.Border.Utils (borderLeft) where++import Brick+import Brick.Widgets.Border+import Graphics.Vty++import Lens.Micro++-- | Draw a vertical border on the left side of a widget.+borderLeft :: Widget n -> Widget n+borderLeft wrapped = Widget (hSize wrapped) (vSize wrapped) $ do+ c <- getContext++ wrappedRes <- render $ hLimit (c^.availWidthL - 1)+ $ wrapped++ let withBorder = vBorder <+> (Widget Fixed Fixed $ return wrappedRes)+ width = wrappedRes^.imageL.to imageWidth + 1+ height = wrappedRes^.imageL.to imageHeight++ render $ hLimit width $ vLimit height $ withBorder
src/Brick/Widgets/CommentDialog.hs view
@@ -9,7 +9,7 @@ , handleCommentEvent ) where -import Data.Monoid+import Data.Semigroup ((<>)) import Brick import Brick.Widgets.Dialog
src/Brick/Widgets/HelpMessage.hs view
@@ -15,7 +15,7 @@ import Brick.Widgets.Border import Graphics.Vty import Data.Text (Text)-import Data.Monoid+import Data.Monoid ((<>)) import Data.List import Lens.Micro
src/ConfigParser.hs view
@@ -48,7 +48,7 @@ import Control.Applicative.Free import Control.Monad import Data.Functor.Identity-import Data.Monoid+import Data.Semigroup ((<>)) import Data.Text (Text) import qualified Data.Text as T import qualified Data.Text.IO as T
src/DateParser.hs view
@@ -21,16 +21,18 @@ import Control.Applicative hiding (many, some) import Data.Maybe import Data.Monoid+import qualified Data.Semigroup as Sem import Data.Text (Text) import qualified Data.Text as T-import Data.Text.Buildable (Buildable,build)-import Data.Text.Format hiding (build) import qualified Data.Text.Lazy as TL import Data.Text.Lazy.Builder (Builder, toLazyText)+import qualified Data.Text.Lazy.Builder as Build+import qualified Data.Text.Lazy.Builder.Int as Build import Data.Time hiding (parseTime) import Data.Time.Calendar.WeekDate import qualified Hledger.Data.Dates as HL import Text.Megaparsec.Compat+import Text.Printf (printf, PrintfArg) newtype DateFormat = DateFormat [DateSpec] deriving (Eq, Show)@@ -111,7 +113,7 @@ -- (y, m, d) newtype IncompleteDate a = IDate (a, a, a)- deriving (Monoid, Functor, Show)+ deriving (Sem.Semigroup, Monoid, Functor, Show) data Direction = Future | Past deriving (Eq,Show) -- find a date that matches the incomplete date and is as near as possible to@@ -205,7 +207,7 @@ printDate' :: [DateSpec] -> Day -> Builder printDate' [] _ = "" printDate' (DateYear:ds) day@(toGregorian -> (y,_,_)) =- build y <> printDate' ds day+ Build.decimal y <> printDate' ds day printDate' (DateYearShort:ds) day@(toGregorian -> (y,_,_)) | y > 2000 = twoDigits (y-2000) <> printDate' ds day | otherwise = twoDigits y <> printDate' ds day@@ -214,9 +216,9 @@ printDate' (DateDay:ds) day@(toGregorian -> (_,_,d)) = twoDigits d <> printDate' ds day printDate' (DateString s:ds) day =- build s <> printDate' ds day+ Build.fromText s <> printDate' ds day printDate' (DateOptional opt:ds) day = printDate' opt day <> printDate' ds day -twoDigits :: Buildable a => a -> Builder-twoDigits = left 2 '0'+twoDigits :: (Integral a, PrintfArg a) => a -> Builder+twoDigits = Build.fromString . printf "%02d"
src/View.hs view
@@ -11,7 +11,7 @@ import Brick import Brick.Widgets.List import Brick.Widgets.WrappedText-import Data.Monoid+import Data.Semigroup ((<>)) import Data.Text (Text) import qualified Data.Text as T import Data.Time hiding (parseTime)@@ -26,13 +26,11 @@ T.pack (formatTime defaultTimeLocale "%Y/%m/%d" date) <> viewComment comment viewState (AccountQuestion trans comment) = txt $- T.pack (HL.showTransactionUnelided trans)- <> viewComment comment+ showTransaction trans <> viewComment comment viewState (AmountQuestion acc trans comment) = txt $- T.pack (HL.showTransactionUnelided trans) <> " " <> acc- <> viewComment comment-viewState (FinalQuestion trans _) = str $- HL.showTransactionUnelided trans+ showTransaction trans <> "\n " <> acc <> viewComment comment+viewState (FinalQuestion trans _) = txt $+ showTransaction trans viewQuestion :: Step -> Widget n viewQuestion (DateQuestion _) = txt "Date"@@ -69,3 +67,7 @@ viewComment comment | T.null comment = "" | otherwise = T.unlines $ map (" ; " <>) $ T.lines comment+++showTransaction :: HL.Transaction -> Text+showTransaction = T.stripEnd . T.pack . HL.showTransactionUnelided
src/main/Main.hs view
@@ -9,10 +9,11 @@ import Brick ( Widget, App(..), AttrMap, BrickEvent(..), Next, EventM , (<=>), (<+>), txt, continue, halt, attrMap, on, fg- , defaultMain, showFirstCursor, padBottom, Padding(Max)+ , defaultMain, showFirstCursor, padBottom, Padding(Max,Pad)+ , vLimit, padTopBottom, vSize, Size(Fixed), padAll, padLeft ) import Brick.Widgets.BetterDialog (dialog)-import Brick.Widgets.Border (hBorder)+import Brick.Widgets.Border (hBorder, vBorder) import Brick.Widgets.Edit.EmacsBindings ( Editor, renderEditor, handleEditorEvent, getEditContents, editContentsL , editorText@@ -32,6 +33,7 @@ import Data.Functor.Identity (Identity(..), runIdentity) import Data.Maybe (fromMaybe, fromJust) import Data.Monoid ((<>), First(..), getFirst)+import qualified Data.Semigroup as Sem import Data.Text (Text) import qualified Data.Text as T import qualified Data.Text.IO as T@@ -55,6 +57,7 @@ import Brick.Widgets.CommentDialog import Brick.Widgets.HelpMessage+import Brick.Widgets.Border.Utils (borderLeft) import ConfigParser hiding (parseConfigFile) import DateParser import Model@@ -128,7 +131,8 @@ CommentDialog _ c -> [renderCommentWidget c, ui] NoDialog -> [ui] - where ui = viewState (asStep as)+ where ui = (txt "New Transaction:")+ <=> padAll 1 (borderLeft $ padLeft (Pad 1) $ viewState (asStep as)) <=> hBorder <=> (viewQuestion (asStep as) <+> viewSuggestion (asSuggestion as)@@ -355,8 +359,8 @@ , optMatchAlgo :: f MatchAlgo } -instance Monoid (CommonOptions Maybe) where- mappend opt1 opt2 =+instance Sem.Semigroup (CommonOptions Maybe) where+ (<>) opt1 opt2 = let opt1' = optNatTrans First opt1 opt2' = optNatTrans First opt2 in optNatTrans getFirst $ CommonOptions@@ -365,6 +369,8 @@ , optMatchAlgo = optMatchAlgo opt1' <> optMatchAlgo opt2' } +instance Monoid (CommonOptions Maybe) where+ mappend = (Sem.<>) mempty = CommonOptions Nothing Nothing Nothing optNatTrans :: (forall a. f a -> g a) -> CommonOptions f -> CommonOptions g
tests/ModelSpec.hs view
@@ -6,7 +6,7 @@ import Control.Monad import Data.List-import Data.Monoid+import Data.Semigroup ((<>)) import Data.Text (Text) import qualified Data.Text as T