support "every N day/week/month/quarter/years" reporting intervals
This commit is contained in:
		
							parent
							
								
									6de45f7d16
								
							
						
					
					
						commit
						e96dfc639e
					
				| @ -420,19 +420,35 @@ dateperiodexpr rdate = do | ||||
|   return (NoInterval, s) | ||||
| 
 | ||||
| periodexprinterval :: GenParser Char st Interval | ||||
| periodexprinterval =  | ||||
|     choice $ map try [ | ||||
|                 tryinterval "day" "daily" Daily, | ||||
|                 tryinterval "week" "weekly" Weekly, | ||||
|                 tryinterval "" "biweekly" Biweekly, | ||||
|                 tryinterval "month" "monthly" Monthly, | ||||
|                 tryinterval "" "bimonthly" Bimonthly, | ||||
|                 tryinterval "quarter" "quarterly" Quarterly, | ||||
|                 tryinterval "year" "yearly" Yearly | ||||
| periodexprinterval = choice' [ | ||||
|                        tryinterval "day"     "daily"     Days, | ||||
|                        tryinterval "week"    "weekly"    Weeks, | ||||
|                        tryinterval "month"   "monthly"   Months, | ||||
|                        tryinterval "quarter" "quarterly" Quarters, | ||||
|                        tryinterval "year"    "yearly"    Years, | ||||
|                        do string "biweekly" | ||||
|                           return $ Weeks 2, | ||||
|                        do string "bimonthly" | ||||
|                           return $ Months 2 | ||||
|                ] | ||||
|     where | ||||
|       tryinterval "" s2 v = try (string s2) >> return v | ||||
|       tryinterval s1 s2 v = choice [try (string $ "every "++s1), try (string s2)] >> return v | ||||
|       tryinterval :: String -> String -> (Int -> Interval) -> GenParser Char st Interval | ||||
|       tryinterval singular compact intcons = | ||||
|           choice' [ | ||||
|            do string compact | ||||
|               return $ intcons 1, | ||||
|            do string "every" | ||||
|               many spacenonewline | ||||
|               string singular | ||||
|               return $ intcons 1, | ||||
|            do string "every" | ||||
|               many spacenonewline | ||||
|               n <- fmap read $ many1 digit | ||||
|               many spacenonewline | ||||
|               string plural | ||||
|               return $ intcons n | ||||
|            ] | ||||
|           where plural = singular ++ "s" | ||||
| 
 | ||||
| periodexprdatespan :: Day -> GenParser Char st DateSpan | ||||
| periodexprdatespan rdate = choice $ map try [ | ||||
| @ -483,33 +499,33 @@ tests_Hledger_Data_Dates = TestList | ||||
|     let gives (interval, span) = (splitSpan interval span `is`) | ||||
|     (NoInterval,mkdatespan "2008/01/01" "2009/01/01") `gives` | ||||
|      [mkdatespan "2008/01/01" "2009/01/01"] | ||||
|     (Quarterly,mkdatespan "2008/01/01" "2009/01/01") `gives` | ||||
|     (Quarters 1,mkdatespan "2008/01/01" "2009/01/01") `gives` | ||||
|      [mkdatespan "2008/01/01" "2008/04/01" | ||||
|      ,mkdatespan "2008/04/01" "2008/07/01" | ||||
|      ,mkdatespan "2008/07/01" "2008/10/01" | ||||
|      ,mkdatespan "2008/10/01" "2009/01/01" | ||||
|      ] | ||||
|     (Quarterly,nulldatespan) `gives` | ||||
|     (Quarters 1,nulldatespan) `gives` | ||||
|      [nulldatespan] | ||||
|     (Daily,mkdatespan "2008/01/01" "2008/01/01") `gives` | ||||
|     (Days 1,mkdatespan "2008/01/01" "2008/01/01") `gives` | ||||
|      [mkdatespan "2008/01/01" "2008/01/01"] | ||||
|     (Quarterly,mkdatespan "2008/01/01" "2008/01/01") `gives` | ||||
|     (Quarters 1,mkdatespan "2008/01/01" "2008/01/01") `gives` | ||||
|      [mkdatespan "2008/01/01" "2008/01/01"] | ||||
|     (Monthly,mkdatespan "2008/01/01" "2008/04/01") `gives` | ||||
|     (Months 1,mkdatespan "2008/01/01" "2008/04/01") `gives` | ||||
|      [mkdatespan "2008/01/01" "2008/02/01" | ||||
|      ,mkdatespan "2008/02/01" "2008/03/01" | ||||
|      ,mkdatespan "2008/03/01" "2008/04/01" | ||||
|      ] | ||||
|     (Bimonthly,mkdatespan "2008/01/01" "2008/04/01") `gives` | ||||
|     (Months 2,mkdatespan "2008/01/01" "2008/04/01") `gives` | ||||
|      [mkdatespan "2008/01/01" "2008/03/01" | ||||
|      ,mkdatespan "2008/03/01" "2008/05/01" | ||||
|      ] | ||||
|     (Weekly,mkdatespan "2008/01/01" "2008/01/15") `gives` | ||||
|     (Weeks 1,mkdatespan "2008/01/01" "2008/01/15") `gives` | ||||
|      [mkdatespan "2007/12/31" "2008/01/07" | ||||
|      ,mkdatespan "2008/01/07" "2008/01/14" | ||||
|      ,mkdatespan "2008/01/14" "2008/01/21" | ||||
|      ] | ||||
|     (Biweekly,mkdatespan "2008/01/01" "2008/01/15") `gives` | ||||
|     (Weeks 2,mkdatespan "2008/01/01" "2008/01/15") `gives` | ||||
|      [mkdatespan "2007/12/31" "2008/01/14" | ||||
|      ,mkdatespan "2008/01/14" "2008/01/28" | ||||
|      ] | ||||
| @ -524,9 +540,9 @@ tests_Hledger_Data_Dates = TestList | ||||
|     let str `gives` result = show (parsewith (periodexpr todaysdate) str) `is` ("Right " ++ result) | ||||
|     "from aug to oct"           `gives` "(NoInterval,DateSpan (Just 2008-08-01) (Just 2008-10-01))" | ||||
|     "aug to oct"                `gives` "(NoInterval,DateSpan (Just 2008-08-01) (Just 2008-10-01))" | ||||
|     "every day from aug to oct" `gives` "(Daily,DateSpan (Just 2008-08-01) (Just 2008-10-01))" | ||||
|     "daily from aug"            `gives` "(Daily,DateSpan (Just 2008-08-01) Nothing)" | ||||
|     "every week to 2009"        `gives` "(Weekly,DateSpan Nothing (Just 2009-01-01))" | ||||
|     "every 3 days from aug to oct" `gives` "(Days 3,DateSpan (Just 2008-08-01) (Just 2008-10-01))" | ||||
|     "daily from aug"            `gives` "(Days 1,DateSpan (Just 2008-08-01) Nothing)" | ||||
|     "every week to 2009"        `gives` "(Weeks 1,DateSpan Nothing (Just 2009-01-01))" | ||||
| 
 | ||||
|   ,"fixSmartDateStr" ~: do | ||||
|     let gives = is . fixSmartDateStr (parsedate "2008/11/26") | ||||
|  | ||||
| @ -46,7 +46,8 @@ data WhichDate = ActualDate | EffectiveDate deriving (Eq,Show) | ||||
| 
 | ||||
| data DateSpan = DateSpan (Maybe Day) (Maybe Day) deriving (Eq,Show,Ord) | ||||
| 
 | ||||
| data Interval = NoInterval | Daily | Weekly | Biweekly | Monthly | Bimonthly | Quarterly | Yearly | ||||
| data Interval = NoInterval | ||||
|               | Days Int | Weeks Int | Months Int | Quarters Int | Years Int | ||||
|                 deriving (Eq,Show,Ord) | ||||
| 
 | ||||
| type AccountName = String | ||||
|  | ||||
| @ -28,7 +28,7 @@ showHistogram :: [Opt] -> FilterSpec -> Journal -> String | ||||
| showHistogram opts filterspec j = concatMap (printDayWith countBar) dayps | ||||
|     where | ||||
|       i = intervalFromOpts opts | ||||
|       interval | i == NoInterval = Daily | ||||
|       interval | i == NoInterval = Days 1 | ||||
|                | otherwise = i | ||||
|       fullspan = journalDateSpan j | ||||
|       days = filter (DateSpan Nothing Nothing /=) $ splitSpan interval fullspan | ||||
|  | ||||
| @ -198,11 +198,11 @@ intervalFromOpts opts = | ||||
|       ((p:_), _)            -> case parsePeriodExpr (parsedate "0001/01/01") p of | ||||
|                                 Right (i, _) -> i | ||||
|                                 Left e       -> parseerror e | ||||
|       (_, (DailyOpt:_))     -> Daily | ||||
|       (_, (WeeklyOpt:_))    -> Weekly | ||||
|       (_, (MonthlyOpt:_))   -> Monthly | ||||
|       (_, (QuarterlyOpt:_)) -> Quarterly | ||||
|       (_, (YearlyOpt:_))    -> Yearly | ||||
|       (_, (DailyOpt:_))     -> Days 1 | ||||
|       (_, (WeeklyOpt:_))    -> Weeks 1 | ||||
|       (_, (MonthlyOpt:_))   -> Months 1 | ||||
|       (_, (QuarterlyOpt:_)) -> Quarters 1 | ||||
|       (_, (YearlyOpt:_))    -> Years 1 | ||||
|       (_, _)                -> NoInterval | ||||
|     where | ||||
|       periodopts   = reverse $ optValuesForConstructor Period opts | ||||
| @ -308,14 +308,14 @@ tests_Hledger_Cli_Options = TestList | ||||
|   ,"intervalFromOpts" ~: do | ||||
|     let gives = is . intervalFromOpts | ||||
|     [] `gives` NoInterval | ||||
|     [DailyOpt] `gives` Daily | ||||
|     [WeeklyOpt] `gives` Weekly | ||||
|     [MonthlyOpt] `gives` Monthly | ||||
|     [QuarterlyOpt] `gives` Quarterly | ||||
|     [YearlyOpt] `gives` Yearly | ||||
|     [Period "weekly"] `gives` Weekly | ||||
|     [Period "monthly"] `gives` Monthly | ||||
|     [Period "quarterly"] `gives` Quarterly | ||||
|     [WeeklyOpt, Period "yearly"] `gives` Yearly | ||||
|     [DailyOpt] `gives` Days 1 | ||||
|     [WeeklyOpt] `gives` Weeks 1 | ||||
|     [MonthlyOpt] `gives` Months 1 | ||||
|     [QuarterlyOpt] `gives` Quarters 1 | ||||
|     [YearlyOpt] `gives` Years 1 | ||||
|     [Period "weekly"] `gives` Weeks 1 | ||||
|     [Period "monthly"] `gives` Months 1 | ||||
|     [Period "quarterly"] `gives` Quarters 1 | ||||
|     [WeeklyOpt, Period "yearly"] `gives` Years 1 | ||||
| 
 | ||||
|  ] | ||||
| @ -203,7 +203,7 @@ tests_Hledger_Cli_Register = TestList | ||||
|  [ | ||||
| 
 | ||||
|   "summarisePostingsByInterval" ~: do | ||||
|     summarisePostingsByInterval Quarterly Nothing False (DateSpan Nothing Nothing) [] ~?= [] | ||||
|     summarisePostingsByInterval (Quarters 1) Nothing False (DateSpan Nothing Nothing) [] ~?= [] | ||||
| 
 | ||||
|   -- ,"summarisePostingsInDateSpan" ~: do | ||||
|   --   let gives (b,e,depth,showempty,ps) = | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user