From the README:
  Grouch is a system for describing and enforcing a Python object schema.
  That is, it provides you with a language for describing the intended type
  signatures of your objects (collectively, the "object schema"), and tools
  to walk an object graph, checking that every value found matches your
  object schema.

From the PKG-INFO:
  An object schema describes every class in a collection of objects -- in
  particular, it specifies the type of every instance attribute of every
  class.  Grouch includes a type language for specifying attribute types, a
  tool to parse specially-formatted class docstrings and output a complete
  object schema, and another tool for walking a persistent object graph and
  ensuring that every scrap of data in it conforms to the object schema
  extracted from your class docstrings.  The API for defining, querying, and
  enforcing types is fairly complete and well-documented, so you can use
  Grouch's type system in other ways as well.
        
Author: Greg Ward <gward@mems-exchange.org>
WWW:    http://www.mems-exchange.org/software/grouch/

-- Johann Visagie <wjv@FreeBSD.org>
e' href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/'>freebsd-ports-gnome</a></td><td class='form'><form method='get'>
<input type='hidden' name='id' value='457ce4824be61506e411f72c2549b7034cc119b4'/><select name='h' onchange='this.form.submit();'>
<option value='cinnamon'>cinnamon</option>
<option value='cinnamon-2.8'>cinnamon-2.8</option>
<option value='dependabot/npm_and_yarn/devel/electron4/files/bl-1.2.3'>dependabot/npm_and_yarn/devel/electron4/files/bl-1.2.3</option>
<option value='dependabot/npm_and_yarn/devel/electron4/files/elliptic-6.5.3'>dependabot/npm_and_yarn/devel/electron4/files/elliptic-6.5.3</option>
<option value='dependabot/npm_and_yarn/devel/electron4/files/elliptic-6.5.4'>dependabot/npm_and_yarn/devel/electron4/files/elliptic-6.5.4</option>
<option value='dependabot/npm_and_yarn/devel/electron4/files/ini-1.3.7'>dependabot/npm_and_yarn/devel/electron4/files/ini-1.3.7</option>
<option value='dependabot/npm_and_yarn/devel/electron4/files/lodash-4.17.19'>dependabot/npm_and_yarn/devel/electron4/files/lodash-4.17.19</option>
<option value='dependabot/npm_and_yarn/devel/electron4/files/lodash.merge-4.6.2'>dependabot/npm_and_yarn/devel/electron4/files/lodash.merge-4.6.2</option>
<option value='dependabot/npm_and_yarn/devel/electron4/files/minimist-1.2.2'>dependabot/npm_and_yarn/devel/electron4/files/minimist-1.2.2</option>
<option value='dependabot/npm_and_yarn/devel/electron4/files/minimist-1.2.3'>dependabot/npm_and_yarn/devel/electron4/files/minimist-1.2.3</option>
<option value='dependabot/npm_and_yarn/devel/electron4/files/node-fetch-2.6.1'>dependabot/npm_and_yarn/devel/electron4/files/node-fetch-2.6.1</option>
<option value='dependabot/npm_and_yarn/devel/electron4/files/serve-10.1.2'>dependabot/npm_and_yarn/devel/electron4/files/serve-10.1.2</option>
<option value='dependabot/npm_and_yarn/devel/electron4/files/y18n-3.2.2'>dependabot/npm_and_yarn/devel/electron4/files/y18n-3.2.2</option>
<option value='dependabot/npm_and_yarn/devel/electron6/files/elliptic-6.5.3'>dependabot/npm_and_yarn/devel/electron6/files/elliptic-6.5.3</option>
<option value='dependabot/npm_and_yarn/devel/electron6/files/elliptic-6.5.4'>dependabot/npm_and_yarn/devel/electron6/files/elliptic-6.5.4</option>
<option value='dependabot/npm_and_yarn/devel/electron6/files/ini-1.3.8'>dependabot/npm_and_yarn/devel/electron6/files/ini-1.3.8</option>
<option value='dependabot/npm_and_yarn/devel/electron6/files/lodash-4.17.19'>dependabot/npm_and_yarn/devel/electron6/files/lodash-4.17.19</option>
<option value='dependabot/npm_and_yarn/devel/electron6/files/lodash.merge-4.6.2'>dependabot/npm_and_yarn/devel/electron6/files/lodash.merge-4.6.2</option>
<option value='dependabot/npm_and_yarn/devel/electron6/files/node-fetch-2.6.1'>dependabot/npm_and_yarn/devel/electron6/files/node-fetch-2.6.1</option>
<option value='dependabot/npm_and_yarn/devel/electron6/files/serve-10.1.2'>dependabot/npm_and_yarn/devel/electron6/files/serve-10.1.2</option>
<option value='gnome-3.22'>gnome-3.22</option>
<option value='gnome-3.24'>gnome-3.24</option>
<option value='gnome-3.26'>gnome-3.26</option>
<option value='gnome-3.28'>gnome-3.28</option>
<option value='gnome-3.32'>gnome-3.32</option>
<option value='gnome-3.36'>gnome-3.36</option>
<option value='gstreamer'>gstreamer</option>
<option value='gstreamer-1.16'>gstreamer-1.16</option>
<option value='gstreamer0.10-removal'>gstreamer0.10-removal</option>
<option value='main' selected='selected'>main</option>
<option value='master'>master</option>
<option value='mate-1.16'>mate-1.16</option>
<option value='mate-1.18'>mate-1.18</option>
<option value='mate-1.20'>mate-1.20</option>
<option value='mate-1.22'>mate-1.22</option>
</select> <input type='submit' value='switch'/></form></td></tr>
<tr><td class='sub'>FreeBSD GNOME current development ports (https://github.com/freebsd/freebsd-ports-gnome)</td><td class='sub right'></td></tr></table>
<table class='tabs'><tr><td>
<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/about/'>about</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/'>summary</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/refs/?id=457ce4824be61506e411f72c2549b7034cc119b4'>refs</a><a class='active' href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/log/devel/p5-Test-Reporter'>log</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/tree/devel/p5-Test-Reporter?id=457ce4824be61506e411f72c2549b7034cc119b4'>tree</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/devel/p5-Test-Reporter?id=457ce4824be61506e411f72c2549b7034cc119b4'>commit</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/diff/devel/p5-Test-Reporter?id=457ce4824be61506e411f72c2549b7034cc119b4'>diff</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/stats/devel/p5-Test-Reporter'>stats</a></td><td class='form'><form class='right' method='get' action='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/log/devel/p5-Test-Reporter'>
<input type='hidden' name='id' value='457ce4824be61506e411f72c2549b7034cc119b4'/><select name='qt'>
<option value='grep'>log msg</option>
<option value='author'>author</option>
<option value='committer'>committer</option>
<option value='range'>range</option>
</select>
<input class='txt' type='search' size='10' name='q' value=''/>
<input type='submit' value='search'/>
</form>
</td></tr></table>
<div class='path'>path: <a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/log/?id=457ce4824be61506e411f72c2549b7034cc119b4'>root</a>/<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/log/devel?id=457ce4824be61506e411f72c2549b7034cc119b4'>devel</a>/<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/log/devel/p5-Test-Reporter?id=457ce4824be61506e411f72c2549b7034cc119b4'>p5-Test-Reporter</a></div><div class='content'><table class='list nowrap'><tr class='nohover'><th></th><th class='left'>Commit message (<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/log/devel/p5-Test-Reporter?id=457ce4824be61506e411f72c2549b7034cc119b4&amp;showmsg=1'>Expand</a>)</th><th class='left'>Author</th><th class='left'>Age</th><th class='left'>Files</th><th class='left'>Lines</th></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/devel/p5-Test-Reporter?id=c4b07b4c0d5045eef2a1aa119e061ed86105be84'>- Update to 1.60</a></td><td>lth</td><td><span title='2013-11-12 16:03:56 +0800'>2013-11-12</span></td><td>3</td><td><span class='deletions'>-9</span>/<span class='insertions'>+7</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/devel/p5-Test-Reporter?id=3ff0383d3a2fb21cdb1e80822419f4aac7fd522f'>Add NO_STAGE all over the place in preparation for the staging support (cat: ...</a></td><td>bapt</td><td><span title='2013-09-21 01:13:42 +0800'>2013-09-21</span></td><td>1</td><td><span class='deletions'>-0</span>/<span class='insertions'>+1</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/devel/p5-Test-Reporter?id=e1d59bae7d278db3d48c3da263eeed5ffe98e3bf'>- Convert to new perl framework</a></td><td>az</td><td><span title='2013-08-07 21:20:32 +0800'>2013-08-07</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+2</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/devel/p5-Test-Reporter?id=99232a32c925735afa74d4a6bf944c795cf3731f'>Mark jobs unsafe</a></td><td>bapt</td><td><span title='2013-07-12 22:18:23 +0800'>2013-07-12</span></td><td>1</td><td><span class='deletions'>-0</span>/<span class='insertions'>+1</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/devel/p5-Test-Reporter?id=cbe2b5d079972c1370a998e571e948df62fe942b'>- update to 1.59</a></td><td>lth</td><td><span title='2013-07-12 19:22:20 +0800'>2013-07-12</span></td><td>2</td><td><span class='deletions'>-8</span>/<span class='insertions'>+3</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/devel/p5-Test-Reporter?id=811c4be9f0b92363ffcd033d9165287cd6bc9b63'>- Convert all remaining instances of BUILD_DEPENDS=${RUN_DEPENDS} or</a></td><td>swills</td><td><span title='2012-06-11 02:42:48 +0800'>2012-06-11</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+1</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/devel/p5-Test-Reporter?id=daa7cf318189c06170e2b75c4e60d3b3808dde75'>Update to 1.58</a></td><td>lth</td><td><span title='2011-07-24 20:55:13 +0800'>2011-07-24</span></td><td>3</td><td><span class='deletions'>-16</span>/<span class='insertions'>+5</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/devel/p5-Test-Reporter?id=1ce4a4b4b7aaee01c8d9365961d77fcf7012b588'>Update to 1.57</a></td><td>lth</td><td><span title='2011-02-14 21:51:38 +0800'>2011-02-14</span></td><td>2</td><td><span class='deletions'>-6</span>/<span class='insertions'>+3</span></td></tr>