Implement --output-only and --output-exclude
authorJoachim Breitner <mail@joachim-breitner.de>
Thu, 3 Jun 2010 09:35:42 +0000 (09:35 +0000)
committerJoachim Breitner <mail@joachim-breitner.de>
Thu, 3 Jun 2010 09:35:42 +0000 (09:35 +0000)
Thanks to Felipe Sateler for the suggestion.

doc/arbtt.xml
src/Stats.hs
src/stats-main.hs

index ec25009..3809d2d 100644 (file)
@@ -600,6 +600,26 @@ $ runhaskell Setup.hs install</screen>
               here. Default percentage: 1%.
             </para></listitem>
           </varlistentry>
+          <varlistentry>
+            <term><option>--output-exclude</option> <replaceable>TAG</replaceable></term>
+            <listitem><para>
+              Skip this tag or category when printing statistics. Only affects
+              the reports <option>--total-time</option> and
+              <option>--category</option>. To distinguish tags and categories,
+              the latter have to be entered followed by a colon. Can be given
+              more than once.
+            </para></listitem>
+          </varlistentry>
+          <varlistentry>
+            <term><option>--output-only</option> <replaceable>TAG</replaceable></term>
+            <listitem><para>
+              Prints statistics only for the specified tag or category. Only
+              affects the reports <option>--total-time</option> and
+              <option>--category</option>. To distinguish tags and categories,
+              the latter have to be entered followed by a colon. Can be given
+              more than once.
+            </para></listitem>
+          </varlistentry>
           <varlistentry>
             <term><option>--output-format</option> <replaceable>FORMAT</replaceable></term>
             <listitem><para>
@@ -1039,6 +1059,11 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
       <listitem>
         <para>Bugfix: Numbers in tag names are no longer replaced by an underscore.</para>
       </listitem>
+      <listitem>
+        <para>New paramters <option>--output-exclude</option> and
+        <option>--output-include</option> of <command>arbtt-stats</command>.
+        </para>
+      </listitem>
     </itemizedlist>
   </sect2>
 
index fe11008..8e78bdc 100644 (file)
@@ -31,6 +31,9 @@ data Filter = Exclude ActivityMatcher | Only ActivityMatcher | GeneralCond Strin
 data ActivityMatcher = MatchActivity Activity | MatchCategory Category
         deriving (Show, Eq)
 
+data ActivityFilter = ExcludeActivity ActivityMatcher | OnlyActivity ActivityMatcher
+        deriving (Show, Eq)
+
 -- Supported report output formats: text, comma-separated values and
 -- tab-separated values
 data ReportFormat = RFText | RFCSV | RFTSV
@@ -39,12 +42,14 @@ data ReportFormat = RFText | RFCSV | RFTSV
 data ReportOptions = ReportOptions
     { roMinPercentage :: Double
     , roReportFormat :: ReportFormat
+    , roActivityFilter :: [ActivityFilter]
     }
         deriving (Show, Eq)
 
 defaultReportOptions = ReportOptions
     { roMinPercentage = 1
     , roReportFormat = RFText
+    , roActivityFilter = []
     }
 
 -- Data format semantically representing the result of a report, including the
@@ -65,6 +70,11 @@ applyFilters filters = filterAndSeparate $ \tl ->
                 Only act     -> onlyTag act tl
                 GeneralCond s-> applyCond s tl) filters
 
+applyActivityFilter :: [ActivityFilter] -> Activity -> Bool
+applyActivityFilter fs act = all go fs
+    where go (ExcludeActivity matcher) = not (matchActivityMatcher matcher act)
+          go (OnlyActivity matcher)    =      matchActivityMatcher matcher act 
+
 filterAndSeparate :: (a -> Bool) -> [a] -> [[a]]
 filterAndSeparate pred = fst . go
   where go [] = ([],True)
@@ -153,8 +163,9 @@ reportToTable opts (Calculations {..}) r = case r of
 
         TotalTime -> ListOfTimePercValues "Total time per tag" $
                 mapMaybe (\(tag,time) ->
-                      let perc = realToFrac time/realToFrac totalTimeSel in
-                      if perc*100 >= roMinPercentage opts
+                      let perc = realToFrac time/realToFrac totalTimeSel
+                          pick = applyActivityFilter (roActivityFilter opts) tag
+                      in if pick && perc*100 >= roMinPercentage opts
                       then Just $ ( show tag
                                   , showTimeDiff time
                                   , perc)
@@ -172,8 +183,9 @@ reportToTable opts (Calculations {..}) r = case r of
                 in
 
                 mapMaybe (\(tag,time) ->
-                      let perc = realToFrac time/realToFrac totalTimeSel in
-                      if perc*100 >= roMinPercentage opts
+                      let perc = realToFrac time/realToFrac totalTimeSel
+                          pick = applyActivityFilter (roActivityFilter opts) tag
+                      in if pick && perc*100 >= roMinPercentage opts
                       then Just ( show tag
                                 , showTimeDiff time
                                 , perc)
index 7217d8c..0c69577 100644 (file)
@@ -81,6 +81,14 @@ options =
               (ReqArg (\arg opt -> let ro = (optReportOptions opt) { roMinPercentage = read arg}
                                    in  return opt { optReportOptions = ro }) "COND")
               "do not show tags with a percentage lower than PERC% (default: 1)"
+     , Option ""        ["output-exclude"]
+              (ReqArg (\arg opt -> let filters = ExcludeActivity (parseActivityMatcher arg) : roActivityFilter (optReportOptions opt)
+                                   in  return opt { optReportOptions = (optReportOptions opt) { roActivityFilter = filters }}) "TAG")
+              "remove these tags from the output"
+     , Option ""        ["output-only"]
+              (ReqArg (\arg opt -> let filters = OnlyActivity (parseActivityMatcher arg) : roActivityFilter (optReportOptions opt)
+                                   in  return opt { optReportOptions = (optReportOptions opt) { roActivityFilter = filters }}) "TAG")
+              "only include these tags in the output"
      , Option "i"       ["information"]
               (NoArg (\opt ->      let reports = GeneralInfos : optReports opt
                                    in  return opt { optReports = reports }))