__________
CHOTTO
User Mms
__________
Table of Contents
_________________
1. Naming & Afew
2. Prerequisites
3. Configuration
4. Config
5. Rule sets
Chotto is an initial tagging script for Notmuch
-
-
Chotto is written in Ruby and had a (quite) nice DSL for configuration.
1 Naming & Afew
===============
Notmuch ecosystem already has a great script for initial tagging -
afew. However it is written in Python and therefore it's always a
gamble if it will consider the user worthy or running.
Chotto, `a few' in Japanese. Because afew refused to work on my
system. And because I love Ruby!
2 Prerequisites
===============
Chotto expects:
- ruby 3x
- notmuch
- notmuch ruby bindings.
While the first 2 are obvious, getting ruby bindings to work may be an
adventure on its own.
*FreeBSD* provides a ready package `ruby-notmuch'.
*MacOS* requires compiling from source, which will be problematic due
to linking difficulties. It's not an OS designed for technical folks.
Some *Linux* distros provide the bindings in their package managers,
but otherwise compiling should be easy.
If you use *Windows*, you have my sympathy.
3 Configuration
===============
Chotto expects the configuration file to be present in
`~/.config/chotto/config.rb'
The user needs to add (at least) two blocks to the file: config & rule
sets
4 Config
========
Presently, the only option Config expects is the absolute path to the
Notmuch database:
Chotto.configure do config.database_path = `/home//mail' end
Please, adjust the path to the valid location
5 Rule sets
===========
The actual magic happens in `Rule Sets' which are sets of filters &
tag modifications. A very simple rule set can look like:
,----
| Chotto.rule_set "notes" do
| messages.filter(from: "").each do |msg|
| msg.tags << "note"
| msg.save!
| end
| end
`----
Let's break it down.
First, we define a named `rule_set'. The name can be a string or a
hash and is currently not used anywhere. It makes it easier to
manager bigger rule sets.
Then we search for messages. In this case, we want all messages sent
from `' .
After, we loop over each found message.
msg.tags returns a mutable array, and we can mutate is as such.
Lastly, we save! the message in the database.
Filter language
----------------------------------------------------------------------
We can quite easily filter messages based. Chotto accepts filters as:
- Strings (from(`Subject:Hired!')). The string will not be modified.
- Hash with string values (from(subject: `Hired')). The key of each
hash element is a modified header value - it's down cased, and `-'
becomes `_', therefore:
- `X-Spam-Id' becomes `x_spam_id'
- `X-Thread-Id' becomes `x_thread_id'
The values on the other hand can be:
- String. Kind of obvious.
- Array. Arrays here are treated as the current conjunctions. The
default conjunction here is `OR', so `k: [1,2]' will become `key:1
OR key:2'
User can add multiple elements to the hash, and they will be join in
the current conjunction mode. By default the mode is `AND',
therefore:
{key: 'val1', key2: 'val2'} are treated as `key:val1 AND key2:val2'.
`filter' returns self, therefore we can combine multiple filters
`filter(key1: 'val').filter(key2: 'val2')'. Filters will be joined
in the current conjunction mode.
Conjunction mode can be changed using the `or' and `and' methods:
filter(key1: `val1').or.filter(key2: `val2').
The language is simple, but gives huge chances to go wrong. You can
test what is produced by calling `#to_query_string' on messages
instance.