parsing: tighten up dates, error messages, tests
This commit is contained in:
parent
4f22fd657e
commit
b6a5a3398e
@ -259,20 +259,21 @@ ymd :: GenParser Char st SmartDate
|
||||
ymd = do
|
||||
y <- many1 digit
|
||||
datesepchar
|
||||
m <- many1 digit
|
||||
guard (read m <= 12)
|
||||
m <- try (count 2 digit) <|> count 1 digit
|
||||
guard (read m >= 1 && (read m <= 12))
|
||||
-- when (read m < 1 || (read m > 12)) $ fail "bad month number specified"
|
||||
datesepchar
|
||||
d <- many1 digit
|
||||
guard (read d <= 31)
|
||||
return (y,m,d)
|
||||
d <- try (count 2 digit) <|> count 1 digit
|
||||
when (read d < 1 || (read d > 31)) $ fail "bad day number specified"
|
||||
return $ (y,m,d)
|
||||
|
||||
ym :: GenParser Char st SmartDate
|
||||
ym = do
|
||||
y <- many1 digit
|
||||
guard (read y > 12)
|
||||
datesepchar
|
||||
m <- many1 digit
|
||||
guard (read m <= 12)
|
||||
m <- try (count 2 digit) <|> count 1 digit
|
||||
guard (read m >= 1 && (read m <= 12))
|
||||
return (y,m,"")
|
||||
|
||||
y :: GenParser Char st SmartDate
|
||||
@ -289,11 +290,11 @@ d = do
|
||||
|
||||
md :: GenParser Char st SmartDate
|
||||
md = do
|
||||
m <- many1 digit
|
||||
guard (read m <= 12)
|
||||
m <- try (count 2 digit) <|> count 1 digit
|
||||
guard (read m >= 1 && (read m <= 12))
|
||||
datesepchar
|
||||
d <- many1 digit
|
||||
guard (read d <= 31)
|
||||
d <- try (count 2 digit) <|> count 1 digit
|
||||
when (read d < 1 || (read d > 31)) $ fail "bad day number specified"
|
||||
return ("",m,d)
|
||||
|
||||
months = ["january","february","march","april","may","june",
|
||||
|
||||
@ -290,7 +290,7 @@ ledgerHistoricalPrice = do
|
||||
char 'P' <?> "historical price"
|
||||
many spacenonewline
|
||||
date <- ledgerdate
|
||||
many spacenonewline
|
||||
many1 spacenonewline
|
||||
symbol1 <- commoditysymbol
|
||||
many spacenonewline
|
||||
(Mixed [Amount c q _]) <- someamount
|
||||
@ -313,11 +313,10 @@ ledgerDefaultYear = do
|
||||
ledgerTransaction :: GenParser Char LedgerFileCtx LedgerTransaction
|
||||
ledgerTransaction = do
|
||||
date <- ledgerdate <?> "transaction"
|
||||
edate <- ledgereffectivedate
|
||||
many1 spacenonewline
|
||||
edate <- try (ledgereffectivedate <?> "effective date") <|> return Nothing
|
||||
status <- ledgerstatus
|
||||
code <- ledgercode
|
||||
description <- liftM rstrip (many1 (noneOf ";\n") <?> "description")
|
||||
description <- many1 spacenonewline >> liftM rstrip (many1 (noneOf ";\n") <?> "description")
|
||||
comment <- ledgercomment
|
||||
restofline
|
||||
postings <- ledgerpostings
|
||||
@ -326,22 +325,12 @@ ledgerTransaction = do
|
||||
Right t' -> return t'
|
||||
Left err -> fail err
|
||||
|
||||
ledgereffectivedate :: GenParser Char LedgerFileCtx (Maybe Day)
|
||||
ledgereffectivedate =
|
||||
try (do
|
||||
string "[="
|
||||
edate <- ledgerdate
|
||||
char ']'
|
||||
return $ Just edate)
|
||||
<|> return Nothing
|
||||
|
||||
ledgerdate :: GenParser Char LedgerFileCtx Day
|
||||
ledgerdate = try ledgerfulldate <|> ledgerpartialdate
|
||||
ledgerdate = (try ledgerfulldate <|> ledgerpartialdate) <?> "full or partial date"
|
||||
|
||||
ledgerfulldate :: GenParser Char LedgerFileCtx Day
|
||||
ledgerfulldate = do
|
||||
(y,m,d) <- ymd
|
||||
many spacenonewline
|
||||
return $ fromGregorian (read y) (read m) (read d)
|
||||
|
||||
-- | Match a partial M/D date in a ledger. Warning, this terminates the
|
||||
@ -349,7 +338,6 @@ ledgerfulldate = do
|
||||
ledgerpartialdate :: GenParser Char LedgerFileCtx Day
|
||||
ledgerpartialdate = do
|
||||
(_,m,d) <- md
|
||||
many spacenonewline
|
||||
y <- getYear
|
||||
when (y==Nothing) $ fail "partial date found, but no default year specified"
|
||||
return $ fromGregorian (fromJust y) (read m) (read d)
|
||||
@ -363,15 +351,21 @@ ledgerdatetime = do
|
||||
s <- optionMaybe $ do
|
||||
char ':'
|
||||
many1 digit
|
||||
many spacenonewline
|
||||
let tod = TimeOfDay (read h) (read m) (maybe 0 (fromIntegral.read) s)
|
||||
return $ LocalTime day tod
|
||||
|
||||
ledgereffectivedate :: GenParser Char LedgerFileCtx (Maybe Day)
|
||||
ledgereffectivedate = do
|
||||
string "[="
|
||||
edate <- ledgerdate
|
||||
char ']'
|
||||
return $ Just edate
|
||||
|
||||
ledgerstatus :: GenParser Char st Bool
|
||||
ledgerstatus = try (do { char '*' <?> "status"; many1 spacenonewline; return True } ) <|> return False
|
||||
ledgerstatus = try (do { many1 spacenonewline; char '*' <?> "status"; return True } ) <|> return False
|
||||
|
||||
ledgercode :: GenParser Char st String
|
||||
ledgercode = try (do { char '(' <?> "code"; code <- anyChar `manyTill` char ')'; many1 spacenonewline; return code } ) <|> return ""
|
||||
ledgercode = try (do { many1 spacenonewline; char '(' <?> "code"; code <- anyChar `manyTill` char ')'; return code } ) <|> return ""
|
||||
|
||||
-- Complicated to handle intermixed comment lines.. please make me better.
|
||||
ledgerpostings :: GenParser Char LedgerFileCtx [Posting]
|
||||
@ -560,6 +554,7 @@ timelogentry = do
|
||||
code <- oneOf "bhioO"
|
||||
many1 spacenonewline
|
||||
datetime <- ledgerdatetime
|
||||
many1 spacenonewline
|
||||
comment <- liftM2 (++) getParentAccount restofline
|
||||
return $ TimeLogEntry (read [code]) datetime comment
|
||||
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
# add should prompt again when it gets a bad date
|
||||
add
|
||||
<<<
|
||||
2009/1/32
|
||||
|
||||
13
tests/effective-day.test
Normal file
13
tests/effective-day.test
Normal file
@ -0,0 +1,13 @@
|
||||
#
|
||||
-f - print --effective
|
||||
<<<
|
||||
Y 2009
|
||||
|
||||
2009/1/1[=1/2] x
|
||||
a 1
|
||||
b
|
||||
>>>
|
||||
2009/01/02 x
|
||||
a 1
|
||||
b -1
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
a 1
|
||||
b
|
||||
>>>
|
||||
2010/01/01 x
|
||||
2010/01/01 x
|
||||
a 1
|
||||
b
|
||||
|
||||
|
||||
@ -4,5 +4,5 @@
|
||||
a 1
|
||||
b
|
||||
>>>
|
||||
2010/01/01 x a 1 1
|
||||
2010/01/01 x a 1 1
|
||||
b -1 0
|
||||
|
||||
10
tests/print-long-account.test
Normal file
10
tests/print-long-account.test
Normal file
@ -0,0 +1,10 @@
|
||||
-f - print
|
||||
<<<
|
||||
2009/1/1 x
|
||||
aaaaabbbbbcccccdddddeeeeefffffggggghhhhh 1
|
||||
b
|
||||
>>>
|
||||
2009/01/01 x
|
||||
aaaaabbbbbcccccdddddeeeeefffffggggghhhhh 1
|
||||
b -1
|
||||
|
||||
Loading…
Reference in New Issue
Block a user