Let --exclude and --include take category parameters as well.
authorJoachim Breitner <mail@joachim-breitner.de>
Sun, 9 May 2010 18:42:40 +0000 (18:42 +0000)
committerJoachim Breitner <mail@joachim-breitner.de>
Sun, 9 May 2010 18:42:40 +0000 (18:42 +0000)
doc/arbtt.xml
src/Stats.hs
src/stats-main.hs

index 06a7526..d370193 100644 (file)
@@ -564,13 +564,15 @@ $ runhaskell Setup.hs install</screen>
             <term><option>-x</option> <replaceable>TAG</replaceable></term>
             <term><option>--exclude</option> <replaceable>TAG</replaceable></term>
             <listitem><simpara>Ignore any data samples that have
-            been assigned this tag. Can be given more than once.</simpara></listitem>
+            been assigned this tag or category. To distinguish tags and categories, the latter have to be
+            entered followed by a colon. Can be given more than once.</simpara></listitem>
           </varlistentry>
           <varlistentry>
             <term><option>-o</option> <replaceable>TAG</replaceable></term>
             <term><option>--only</option> <replaceable>TAB</replaceable></term>
             <listitem><simpara>Ignore any data samples that have
-            not been assigned this tag. Can be given more than once.</simpara></listitem>
+            not been assigned this tag. To distinguish tags and categories, the latter have to be
+            entered followed by a colon. Can be given more than once.</simpara></listitem>
           </varlistentry>
           <varlistentry>
             <term><option>--also-inactive</option></term>
@@ -1028,6 +1030,12 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
         <para>New report “intervals”, available using <command>arbtt-stats</command> <option>--intervals</option>.
         </para>
       </listitem>
+      <listitem>
+        <para>The paramters <option>--exclude</option> and
+        <option>--include</option> of <command>arbtt-stats</command> can match
+        categories as well as tags.
+        </para>
+      </listitem>
     </itemizedlist>
   </sect2>
 
index 248f710..fe11008 100644 (file)
@@ -8,7 +8,7 @@ import Data.Ord
 import Text.Printf
 import qualified Data.Map as M
 import qualified Data.Set as S
-import Data.MyText (Text,unpack)
+import Data.MyText (Text,pack,unpack)
 import Data.Function (on)
 import System.Locale (defaultTimeLocale)
 
@@ -25,7 +25,10 @@ data Report = GeneralInfos
     | IntervalTag Activity
         deriving (Show, Eq)
 
-data Filter = Exclude Activity | Only Activity | GeneralCond String
+data Filter = Exclude ActivityMatcher | Only ActivityMatcher | GeneralCond String
+        deriving (Show, Eq)
+
+data ActivityMatcher = MatchActivity Activity | MatchCategory Category
         deriving (Show, Eq)
 
 -- Supported report output formats: text, comma-separated values and
@@ -70,9 +73,17 @@ filterAndSeparate pred = fst . go
                     (((r:rs), False), True)  -> ((x:r):rs, False)
                     ((rs,     _)    , False) -> (rs,       True)
                                 
-excludeTag act = notElem act . snd . tlData
-onlyTag act = elem act . snd . tlData
-defaultFilter = Exclude inactiveActivity
+excludeTag matcher = not . any (matchActivityMatcher matcher) . snd . tlData
+onlyTag matcher = any (matchActivityMatcher matcher) . snd . tlData
+defaultFilter = Exclude (MatchActivity inactiveActivity)
+
+matchActivityMatcher :: ActivityMatcher -> Activity -> Bool
+matchActivityMatcher (MatchActivity act1) act2 = act1 == act2
+matchActivityMatcher (MatchCategory cat) act2 = Just cat == activityCategory act2
+
+parseActivityMatcher :: String -> ActivityMatcher 
+parseActivityMatcher str | last str == ':' = MatchCategory (pack (init str))
+                         | otherwise       = MatchActivity (read str)
 
 -- | to be used lazily, to re-use computation when generating more than one
 -- report at a time
index cd13335..7217d8c 100644 (file)
@@ -63,13 +63,13 @@ options =
               (ReqArg (\arg opt -> return opt { optCategorizeFile = arg }) "FILE")
                "use this file instead of ~/.arbtt/categorize.cfg"
      , Option "x"       ["exclude"]
-              (ReqArg (\arg opt -> let filters = Exclude (read arg) : optFilters opt
+              (ReqArg (\arg opt -> let filters = Exclude (parseActivityMatcher arg) : optFilters opt
                                    in  return opt { optFilters = filters }) "TAG")
-              "ignore samples containing this tag"
+              "ignore samples containing this tag or category"
      , Option "o"       ["only"]
-              (ReqArg (\arg opt -> let filters = Only (read arg) : optFilters opt
+              (ReqArg (\arg opt -> let filters = Only (parseActivityMatcher arg) : optFilters opt
                                    in  return opt { optFilters = filters }) "TAG")
-              "only consider samples containing this tag"
+              "only consider samples containing this tag or category"
      , Option ""        ["also-inactive"]
               (NoArg (\opt ->      return opt { optAlsoInactive = True }))
               "include samples with the tag \"inactive\""