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&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>