hackerbase/doc/mbase.md

16 KiB

Members Base

These modules manage the member files in members directory.

Modules

Base Member Record

(import brmember)

This module encapsulates the data structure representing a single member record.

(make-brmember file-name file-path symlinks . args)
  • file-name - a symbol representing the primary filename
  • file-path - a string representing the path to the file
  • symlinks - a list of symbols representing symlinks
  • args - optional keyword arguments

Creates a new member record dictionary. The three mandatory arguments are stored under respective keys and any keyword arguments are stored as keys obtained by converting the keyword to symbol with values following the keyword.

The 'id key is filled with any four-digit file-name or symlink converted to a number. Preferably the four-digit symbol should be the file-name but it is not required.

(brmember? v)
  • v - any value

Returns #t if given value v is a brmember instance.

(brmember-file-name mr)
  • mr - a member record structure

Returns the file name of this member's file usually without full path.

(brmember-file-path mr)
  • mr - a member record structure

Returns the path used for accessing this member's file.

(brmember-input-file mr)
  • mr - a member record structure

Returns an open file port to given member record underlying file. This function should be used by the parser to get the member file contents.

(brmember-set mr . args)
  • mr - a member record structure
  • args - optional keyword arguments

Any keyword arguments are stored in the member record dictionary as keys obtained by converting the keyword to symbol with values following the keyword.

(brmember-add-highlight mr line message pass type)
  • mr - a member record structure
  • line - line number in the source file
  • message - a string with message for highlight
  • pass - parsing stage
  • type - symbol representing the highlight type

Adds a new highlight to member record to be used when displaying the source file listing.

Known types are:

  • 'error - to denote fatal problem in the source
  • 'warning - to signal known problem which does not make the record invalid
  • 'info - supplemental information

The structure is perfectly suited for print-source-listing function.

(brmember-sub-ref mr sec key [default])
  • mr - a member record structure
  • sec - section symbol
  • key - key symbol
  • default - optional default value

Retrieves given key from dictionary stored as section sec in given mr structure. If no default is provided and the key does not exist it raises an exception.

(brmember-sub-set mr sec key value)
  • mr - a member record structure
  • sec - section symbol
  • key - key symbol
  • value - value to set

Sets the value of given key in dictionary stored as section sec in given mr structure to the new value possibly overwriting previous one.

(brmember-sub-prepend mr sec key value)
  • mr - a member record structure
  • sec - section symbol
  • key - key symbol
  • value - value to prepend (cons) to the key current value

Prepends (cons) new the value to current value of given key in dictionary stored as section sec in given mr structure replacing the original value.

(brmember-sub-has-key? mr sec key)
  • mr - a member record structure
  • sec - section symbol
  • key - key symbol

Returns #t if given section sec contains the key.

(brmember-sub-ensure mr sec key value)
  • mr - a member record structure
  • sec - section symbol
  • key - key symbol
  • value - value to set

Sets the value of given key in dictionary stored as section sec in given mr structure to the new value if and only if it is not already present.

(brmember-source mr)
  • mr - a member record structure

Returns a list of strings representing the source file of this member record.

(brmember-info mr key [default])
  • mr - a member record structure
  • key - key (symbol) to retrieve
  • default - optional default value

Like dict-ref returns the value associated with key in section 'info. If default is provided, it is passed on to the underlying dict-ref.

(brmember-missing-keys mr)
  • mr - a member record structure

Returns a list of keys (symbols) from within the 'info section of given mr that have #f values (indicating they are missing mandatory fields in the source).

(brmember-has-highlights? mr)
  • mr - a member record structure

Returns #t if given mr has at least one source highlight.

(brmember-usable? mr)
  • mr - a member record structure

Returns #t if it is possible to work with this member - mainly that the 'info section contains the 'member key.

(brmember-has-problems? mr)
  • mr - a member record structure

Returns #t if there are any 'error type highlights in mr, or it is not brmember-usable? or the member-id is not 4-digit prime number.

(brmember-destroyed? mr)
  • mr - a member record structure

Returns #t if the member is not existing and already has existed in the past.

(brmember-suspended? mr)
  • mr - a member record structure

Returns #t if the current month falls within any of given member's suspended periods.

(brmember-active? mr)
  • mr - a member record structure

Returns #t if given member exists, is a member and is currently not suspended.

(brmember-student? mr)
  • mr - a member record structure

Returns #t if given member exists, is a member, is currently not suspended and current month falls within any member's suspended periods.

(brmember-existing? mr)
  • mr - a member record structure

Returns #t if given member exists - that is the current month is within any of the member (membership) periods.

(brmember-chair? mr)
  • mr - a member record structure

Returns #t if given mr is chair as of (*current-day*).

(brmember-council? mr)
  • mr - a member record structure

Returns #t if given mr is a member of council as of (*current-day*).

(brmember-revision? mr)
  • mr - a member record structure

Returns #t if given mr is a member of revision committee as of (*current-day*).

(brmember-grant? mr)
  • mr - a member record structure

Returns #t if given mr is a member of grant committee as of (*current-day*).

(brmember-flags mr)
  • mr - a member record structure

Returns a list of member flags which can be any of the following:

  • 'student
  • 'suspended
  • 'active
  • 'destroyed
  • 'existing
  • 'chair
  • 'council
  • 'revision
  • 'grant

The 'existing and 'destroyed are mutually exclusive. Also 'active and 'suspended are mutually exclusive.

(brmember-nick mr)
  • mr - a member record structure

Returns member's nick from its 'info section.

(brmember-id mr)
  • mr - a member record structure

Returns given member's id.

(brmember-suspended-months mr)
  • mr - a member record structure

Returns the number of months this member is suspended in (*current-month*). If the member is not suspended, returns 0.

((brmember-suspended-for at-least [less-than]) mr)
  • at-least - number of months
  • less-than - number of months
  • mr - member record structure

Curried predicate for checking whether given member mr is at least at-least months suspended. If less-than is provided then only those records which have been suspended less than this value are included.

(brmember<? a b)
  • a - a member record structure
  • b - a member record structure

Returns true if member a's nick comes before b's nick in the lexicographical order.

(brmember-add-payment mr pt)
  • mr - a member record structure
  • pt - bank transaction of the payment

Adds (prepends) given transaction pt to given member record mr's 'payments' key list.

(brmember-credit mr)
  • mr - a member record structure

Returns the total credit manually recorded in given member record. Takes into account (*current-month*) to allow showing current status at given date.

(brmember-payments mr)
  • mr - a member record structure

Returns the payments (bank transactions) list of given member record mr defaulting to an empty list.

(brmember-mailman mr)
  • mr - a member record structure

Returns a list of mailman mailing lists this member is member of.

(brmember-add-mailman mr ml)
  • mr - a member record structure
  • ml - mailinglist name

Adds given mailman mailinglist into the list of given members mailinglists.

Base Member Record Formatter

(import brmember-format)

Allows format-like formatting of brmember records.

(member-format fmt mr)
  • fmt - format string
  • mr - a member record structure

Fills the following template substitutions in the fmt string:

  • ~N - member's nick
  • ~I - member's id
  • ~S - number of months this member has been suspended
  • ~E - number of highlights in square brackets if there is at least one
  • ~~ - literal ~

Other parts of the string are retained.

Member Parser

This module exports only one function - the load-brmember-file which loads and parses given file as member file. The specification of this file format is in a separate document MEMBERS.md.

The module implements this specification as multi-pass parser with important definitions being at the top of the module.

mandatory-keys

A list of symbols containing keys which must be present in the file. If any of them is missing, it is added to the resulting structure with the #f value.

optional-keys

A list of symbols of keys which the parser recognizes and adds them to the resulting data structure.

ignored-keys

A list of symbols with keys that are parsed, and albeit not added to the result they do not generate warnings.

known-multikeys

A list of keys that can appear multiple times and in the 2nd pass they are collected as lists of values.

start-stop-markers-lookup

A list of start/stop specifications - each key is paired with given key and start/stop tag.

(load-brmember-file mr)
  • mr - (almost) empty member record structure

It must be possible to get the member file using brmember-input-file function. Loads the file as a list of lines, processes these lines with 1st and 2nd pass parsers, interprets the result using 3rd passes and finalizes the result in the 4th pass.

Members Base Directory

(import mbase-dir)

This module encapsulates the members base directory format as documented in MEMBERS.md document.

Each member file should have a 4-digit name identical to member id and optional symlinks with human-known names of the members. The module can correctly handle a situation where the 4-digit id is a symlink to arbitrarily named file.

In first pass it extracts all files and symlinks to them, binds them together and makes sure the 4-digit name is used as id and the regular file is read when loading its contents.

(load-mbase-dir dn)
  • dn - directory name (path)

Scans given directory and returns a dictionary of canonical names as keys and lists of alias symlinks as values.

(mbase-dir-load-member mdir fname symlinks)
  • mdir - members directory name (path)
  • fname - file name inside mdir (without path)
  • symlinks - a list of symlinks to fname

Creates an initial member record and uses load-member-file to load, parse and interpret its contents.

Members Base

(import mbase)

This module uses the members directory module to load and parse all members files and provides a simple interface for accessing the data.

(load-mbase dn [progress?])
  • dn - directory with member files
  • progress? - if #t, displays loading progress

Loads all member files and creates a members base data structure.

(mbase-members mb)
  • mb - members base structure

Returns the list of all member records loaded.

(find-member-by-predicate mb id)
  • mb - members base structure
  • id - member identifier (4-digit prime number)

Returns the member record associated with the provided id.

(find-member-by-id mb id)
  • mb - members base structure
  • id - member identifier (4-digit prime number)

Returns the member record associated with the provided id.

(find-member-by-nick mb nick)
  • mb - members base structure
  • nick - member nick

Returns the member record identified by its nick.

(find-members-by-predicate mb pred)
  • mb - members base structure
  • pred - predicate procedure

Returns a list of all member records matching the given predicate.

(find-members-by-nick mb nick)
  • mb - members base structure
  • nick - member nick

Returns the list of all member records with substring matching of nick. May return empty list, list with one member or multiple member records.

(list-mbase-ids mb)
  • mb - members base structure

Returns a list of all members' ids.

(list-mbase-nicks mb)
  • mb - members base structure

Returns a list of all member nicks.

(mbase-free-ids mb)
  • mb - members base structure

Returns a list of valid member ids which are not already used in given members base.

(mbase-gen-id mb)
  • mb - members base structure

Generates a random 4-digit prime number which is not yet used as a member id.

(mbase-update mb pred? proc)
  • mb - members base structure
  • pred? - member record predicate
  • proc - processing procedure

Updates given members base by applying proc to all member records matching pred?.

(mbase-info mb)
  • mb - members base structure

Returns a dictionary with basic information about given members base. The dictionary contains the following keys:

  • 'invalid - a list of all invalid member records
  • 'active - a list of all active member records
  • 'suspended - a list of all suspended member records
  • 'students - a list of all student member records
  • 'destroyed - a list of all destroyed member records
  • 'month - the current month for this info dictionary
  • 'total - a list of all member records contained

This procedure is used for further printing of information about given members base.

(mbase-stats mb)
  • mb - members base structure

Creates a list of lists of statistical information about given members base through time. The first row of the resulting list contains column headers and the rows are sorted chronologically by month.

(mbase-add-unpaired mb tr)
  • mb - mbase structure
  • tr - bank-transaction

Adds given transaction tr into unpaired transactions list of mb mbase.

(mbase-unpaired mb)
  • mb - mbase structure

Returns the list of unpaired transactions recorded.

(mbase-active-emails mb)
  • mb - mbase structure

Returns the list of emails of all active members.

(mbase-merge-mailman mb ml)
  • mb - mbase structure
  • ml - mailman mailinglist info

Based on mailman mailinglist emails - (cdr ml) at the moment - merges the listname - (car ml) at the moment - into respective members of givem mb structure.

The ml should be output of mailman-list-members.