Last active
August 29, 2015 13:57
-
-
Save jacebrowning/9754157 to your computer and use it in GitHub Desktop.
iPython Notebook portion of GRDevDay presentation on Doorstop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "metadata": { | |
| "name": "", | |
| "signature": "sha256:ec9792295d515a0c75fe14b1a7b72f536dad998a3da1f0a00bfddee68c54e762" | |
| }, | |
| "nbformat": 3, | |
| "nbformat_minor": 0, | |
| "worksheets": [ | |
| { | |
| "cells": [ | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Doorstop: Requirements Management Using Python and Version Control" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Installation" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "!pip uninstall doorstop --yes\n", | |
| "!pip install doorstop==0.8.1" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "import doorstop" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 1 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Functions" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "tree = doorstop.build()\n", | |
| "\n", | |
| "print(tree)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "SYS <- [ HLR <- [ HLT, LLR <- [ LLT ] ] ]\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 2 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "document = doorstop.find_document('sys')\n", | |
| "\n", | |
| "print(document)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "SYS\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 3 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "item = doorstop.find_item('sys1')\n", | |
| "\n", | |
| "print(item)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "SYS001\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 4 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Exceptions" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "doorstop.find_item('fake99') # raises exception" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "ename": "DoorstopError", | |
| "evalue": "no item with UID: fake99", | |
| "output_type": "pyerr", | |
| "traceback": [ | |
| "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mDoorstopError\u001b[0m Traceback (most recent call last)", | |
| "\u001b[0;32m<ipython-input-5-2395171557ca>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mdoorstop\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfind_item\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'fake99'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# raises exception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", | |
| "\u001b[0;32m/Users/Browning/Drive/Profession/BarCamp/Doorstop/doorstop/core/builder.py\u001b[0m in \u001b[0;36mfind_item\u001b[0;34m(uid)\u001b[0m\n\u001b[1;32m 84\u001b[0m \u001b[0;34m\"\"\"Find an item without an explicitly building a tree.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 85\u001b[0m \u001b[0mtree\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_get_tree\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 86\u001b[0;31m \u001b[0mitem\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtree\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfind_item\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0muid\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 87\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mitem\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 88\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", | |
| "\u001b[0;32m/Users/Browning/Drive/Profession/BarCamp/Doorstop/doorstop/core/tree.py\u001b[0m in \u001b[0;36mfind_item\u001b[0;34m(self, value, _kind)\u001b[0m\n\u001b[1;32m 412\u001b[0m \u001b[0mlog\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"cached unknown: {}\"\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0muid\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 413\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 414\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mDoorstopError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mUID\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mUNKNOWN_MESSAGE\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0m_kind\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0muid\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 415\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 416\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mget_issues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdocument_hook\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mitem_hook\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
| "\u001b[0;31mDoorstopError\u001b[0m: no item with UID: fake99" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 5 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Classes" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Items" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "item = doorstop.find_item('hlr003')\n", | |
| "\n", | |
| "print(repr(item))" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "Item('/Users/Browning/Drive/Programs/Desktop/DoorstopDemo/reqs/hlr/HLR003.yml')\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 6 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "with open(item.path) as infile:\n", | |
| " print(infile.read())" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "active: true\n", | |
| "derived: false\n", | |
| "level: 1.2\n", | |
| "links:\n", | |
| "- SYS002: d880b59c0bc5a060d41922110b833f3f\n", | |
| "- SYS008: 6a2015090c976f3aebaa431a7fdeda60\n", | |
| "- SYS028: 5530ac30d996ebc2841d663698f0756a\n", | |
| "normative: true\n", | |
| "ref: test_tutorial.py\n", | |
| "reviewed: 6fc06b5807481efef80ab361d1f196f1\n", | |
| "text: |\n", | |
| " Foo SHALL bar.\n", | |
| "\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 7 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Properties" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "print(\"path:\", item.path)\n", | |
| "print(\"relpath:\", item.relpath)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "path: /Users/Browning/Drive/Programs/Desktop/DoorstopDemo/reqs/hlr/HLR003.yml\n", | |
| "relpath: @/reqs/hlr/HLR003.yml\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 8 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "print(\"id:\", item.uid)\n", | |
| "print(\"prefix:\", item.prefix)\n", | |
| "print(\"number:\", item.number)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "id: HLR003\n", | |
| "prefix: HLR\n", | |
| "number: 3\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 9 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "item.level = \"1.2\"\n", | |
| "\n", | |
| "print(\"level:\", item.level)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "level: 1.2\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 10 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "item.active = True\n", | |
| "item.derived = False\n", | |
| "\n", | |
| "print(\"active:\", item.active)\n", | |
| "print(\"derived:\", item.derived)\n", | |
| "print(\"normative:\", item.normative)\n", | |
| "print(\"heading:\", item.heading)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "active: True\n", | |
| "derived: False\n", | |
| "normative: True\n", | |
| "heading: False\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 11 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "item.text = \"Foo SHALL bar.\"\n", | |
| "\n", | |
| "print(\"text:\", item.text)\n" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "text: Foo SHALL bar.\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 12 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "item.ref = \"test_tutorial.py\"\n", | |
| "\n", | |
| "print(\"ref:\", item.ref)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "ref: test_tutorial.py\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 13 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "for identifier in item.links:\n", | |
| " print(\"id:\", identifier)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "id: SYS002\n", | |
| "id: SYS008\n", | |
| "id: SYS028\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 14 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Actions" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "item.link('SYS999')\n", | |
| "\n", | |
| "for identifier in item.links:\n", | |
| " print(\"id:\", identifier)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "id: SYS002\n", | |
| "id: SYS008\n", | |
| "id: SYS028\n", | |
| "id: SYS999\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 15 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "item.unlink('SYS999')\n", | |
| "\n", | |
| "for identifier in item.links:\n", | |
| " print(\"id:\", identifier)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "id: SYS002\n", | |
| "id: SYS008\n", | |
| "id: SYS028\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 16 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "item.ref = \"Represents an item file with linkable text.\"\n", | |
| "\n", | |
| "path, line = item.find_ref()\n", | |
| "\n", | |
| "print(\"path:\", path)\n", | |
| "print(\"line:\", line)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "path: demo/core/item.py\n", | |
| "line: 16\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 17 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "item.ref = \"test_tutorial.py\"\n", | |
| "\n", | |
| "path, line = item.find_ref()\n", | |
| "\n", | |
| "print(\"path:\", path)\n", | |
| "print(\"line:\", line)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "path: demo/cli/test/test_tutorial.py\n", | |
| "line: None\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 18 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "document = tree.find_document(item.prefix)\n", | |
| "\n", | |
| "identifiers = item.find_child_links() # reverse links\n", | |
| "\n", | |
| "for identifier in identifiers:\n", | |
| " print(\"id:\", identifier)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "id: LLR007\n", | |
| "id: LLR031\n", | |
| "id: LLR036\n", | |
| "id: HLT031\n", | |
| "id: HLT172\n", | |
| "id: HLT142\n", | |
| "id: HLT196\n", | |
| "id: HLT107\n", | |
| "id: HLT057\n", | |
| "id: HLT103\n", | |
| "id: LLR119\n", | |
| "id: LLR156\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 19 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "item.text = \"Another change.\"\n", | |
| "item.reviewed" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "pyout", | |
| "prompt_number": 20, | |
| "text": [ | |
| "False" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 20 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "item.review()\n", | |
| "item.reviewed" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "pyout", | |
| "prompt_number": 21, | |
| "text": [ | |
| "True" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 21 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "item.link('SYS042')\n", | |
| "item.cleared" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "pyout", | |
| "prompt_number": 22, | |
| "text": [ | |
| "False" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 22 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "item.clear()\n", | |
| "item.cleared" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "pyout", | |
| "prompt_number": 23, | |
| "text": [ | |
| "True" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 23 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Documents" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "document = doorstop.find_document('hlt')\n", | |
| "\n", | |
| "print(repr(document))" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "Document('/Users/Browning/Drive/Programs/Desktop/DoorstopDemo/demo/cli/test/docs')\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 24 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "with open(document.config) as infile:\n", | |
| " print(infile.read())" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "settings:\n", | |
| " digits: 3\n", | |
| " parent: HLR\n", | |
| " prefix: HLT\n", | |
| " sep: ''\n", | |
| "\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 25 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Properties" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "print(\"path:\", document.path)\n", | |
| "print(\"relpath:\", document.relpath)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "path: /Users/Browning/Drive/Programs/Desktop/DoorstopDemo/demo/cli/test/docs\n", | |
| "relpath: @/demo/cli/test/docs\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 26 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "print(\"prefix:\", document.prefix)\n", | |
| "print(\"sep:\", document.sep)\n", | |
| "print(\"digits:\", document.digits)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "prefix: HLT\n", | |
| "sep: \n", | |
| "digits: 3\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 27 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "print(\"parent:\", document.parent)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "parent: HLR\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 28 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "count = 0\n", | |
| "\n", | |
| "for item in document:\n", | |
| " print(item)\n", | |
| " \n", | |
| " count += 1\n", | |
| " if count > 10:\n", | |
| " print('...')\n", | |
| " break" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "HLT001\n", | |
| "HLT002\n", | |
| "HLT003\n", | |
| "HLT004\n", | |
| "HLT005\n", | |
| "HLT006\n", | |
| "HLT007\n", | |
| "HLT008\n", | |
| "HLT009\n", | |
| "HLT010\n", | |
| "HLT011\n", | |
| "...\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 29 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Actions" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "item = document.add_item()\n", | |
| "\n", | |
| "print(item)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "HLT201\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 30 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "document.find_item(item.uid)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "pyout", | |
| "prompt_number": 31, | |
| "text": [ | |
| "Item('/Users/Browning/Drive/Programs/Desktop/DoorstopDemo/demo/cli/test/docs/HLT201.yml')" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 31 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "document.remove_item(item.uid)\n" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "pyout", | |
| "prompt_number": 32, | |
| "text": [ | |
| "Item('/Users/Browning/Drive/Programs/Desktop/DoorstopDemo/demo/cli/test/docs/HLT201.yml')" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 32 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "document.find_item(item.uid) # raises exception" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "ename": "DoorstopError", | |
| "evalue": "no matching UID: HLT201", | |
| "output_type": "pyerr", | |
| "traceback": [ | |
| "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mDoorstopError\u001b[0m Traceback (most recent call last)", | |
| "\u001b[0;32m<ipython-input-33-3d1767e1ed93>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mdocument\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfind_item\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0muid\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# raises exception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", | |
| "\u001b[0;32m/Users/Browning/Drive/Profession/BarCamp/Doorstop/doorstop/core/document.py\u001b[0m in \u001b[0;36mfind_item\u001b[0;34m(self, value, _kind)\u001b[0m\n\u001b[1;32m 576\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mitem\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 577\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 578\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mDoorstopError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"no matching{} UID: {}\"\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_kind\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0muid\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 579\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 580\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mget_issues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mitem_hook\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
| "\u001b[0;31mDoorstopError\u001b[0m: no matching UID: HLT201" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 33 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Trees" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "tree = doorstop.build()\n", | |
| "\n", | |
| "print(repr(tree))" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "<Tree SYS <- [ HLR <- [ HLT, LLR <- [ LLT ] ] ]>\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 34 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Properites" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "print(\"vcs:\", tree.vcs)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "vcs: <doorstop.core.vcs.git.WorkingCopy object at 0x107f0e400>\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 35 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Actions" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "import os\n", | |
| "\n", | |
| "path = os.path.join(tree.root, 'a', 'temporaty', 'directory')\n", | |
| "document = tree.create_document(path, 'TMP', parent='SYS')\n", | |
| "\n", | |
| "print(document.relpath)\n", | |
| "\n", | |
| "document.delete()" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "@/a/temporaty/directory\n" | |
| ] | |
| }, | |
| { | |
| "metadata": {}, | |
| "output_type": "pyout", | |
| "prompt_number": 36, | |
| "text": [ | |
| "Document('/Users/Browning/Drive/Programs/Desktop/DoorstopDemo/a/temporaty/directory')" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 36 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "item = tree.add_item('sys')\n", | |
| "\n", | |
| "print(item.relpath)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "@/reqs/sys/SYS051.yml\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 37 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "tree.remove_item(item.uid)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "pyout", | |
| "prompt_number": 38, | |
| "text": [ | |
| "Item('/Users/Browning/Drive/Programs/Desktop/DoorstopDemo/reqs/sys/SYS051.yml')" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 38 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "tree.link_items('llt42', 'hlr2')" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "pyout", | |
| "prompt_number": 39, | |
| "text": [ | |
| "(Item('/Users/Browning/Drive/Programs/Desktop/DoorstopDemo/demo/core/test/docs/LLT042.yml'),\n", | |
| " Item('/Users/Browning/Drive/Programs/Desktop/DoorstopDemo/reqs/hlr/HLR002.yml'))" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 39 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "tree.unlink_items('llt42', 'hlr2')" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "metadata": {}, | |
| "output_type": "pyout", | |
| "prompt_number": 40, | |
| "text": [ | |
| "(Item('/Users/Browning/Drive/Programs/Desktop/DoorstopDemo/demo/core/test/docs/LLT042.yml'),\n", | |
| " Item('/Users/Browning/Drive/Programs/Desktop/DoorstopDemo/reqs/hlr/HLR002.yml'))" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 40 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Validation" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "tree = doorstop.build()\n", | |
| "\n", | |
| "for issue in tree.issues:\n", | |
| " print(issue)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "HLR: HLR003: unreviewed changes\n", | |
| "HLT: HLT031: suspect link: HLR003\n", | |
| "HLT: HLT172: suspect link: HLR003\n", | |
| "HLT: HLT142: suspect link: HLR003\n", | |
| "HLT: HLT196: suspect link: HLR003\n", | |
| "HLT: HLT107: suspect link: HLR003\n", | |
| "HLT: HLT057: suspect link: HLR003\n", | |
| "HLT: HLT103: suspect link: HLR003\n", | |
| "LLR: LLR007: suspect link: HLR003\n", | |
| "LLR: LLR031: suspect link: HLR003\n", | |
| "LLR: LLR036: suspect link: HLR003\n", | |
| "LLR: LLR119: suspect link: HLR003\n", | |
| "LLR: LLR156: suspect link: HLR003\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 41 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "item = tree.find_item('hlr2')\n", | |
| "item.links = []\n", | |
| "\n", | |
| "item = tree.find_item('llr2')\n", | |
| "item.link('fake99')\n", | |
| "\n", | |
| "for issue in tree.issues:\n", | |
| " print(issue)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "HLR: HLR002: no links to parent document: SYS\n", | |
| "HLR: HLR002: unreviewed changes\n", | |
| "HLR: HLR003: unreviewed changes\n", | |
| "HLT: HLT031: suspect link: HLR003\n", | |
| "HLT: HLT172: suspect link: HLR003\n", | |
| "HLT: HLT142: suspect link: HLR003\n", | |
| "HLT: HLT196: suspect link: HLR003\n", | |
| "HLT: HLT107: suspect link: HLR003\n", | |
| "HLT: HLT057: suspect link: HLR003\n", | |
| "HLT: HLT103: suspect link: HLR003\n", | |
| "LLR: LLR002: parent is 'HLR', but linked to: fake99\n", | |
| "LLR: LLR002: linked to unknown item: fake99\n", | |
| "LLR: LLR002: unreviewed changes\n", | |
| "LLR: LLR007: suspect link: HLR003\n", | |
| "LLR: LLR031: suspect link: HLR003\n", | |
| "LLR: LLR036: suspect link: HLR003\n", | |
| "LLR: LLR119: suspect link: HLR003\n", | |
| "LLR: LLR156: suspect link: HLR003\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 42 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "from doorstop.common import DoorstopWarning, DoorstopInfo\n", | |
| "\n", | |
| "def document_hook(document, tree):\n", | |
| " if len(document.items) <= 50:\n", | |
| " yield DoorstopInfo(\"50 or fewer items\")\n", | |
| "\n", | |
| "def item_hook(item, document, tree):\n", | |
| " if 'mater tales' in item.text:\n", | |
| " yield DoorstopWarning(\"'mater tales' in text\")\n", | |
| "\n", | |
| "for issue in tree.get_issues(document_hook=document_hook, item_hook=item_hook):\n", | |
| " print(issue)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "SYS: 50 or fewer items\n", | |
| "HLR: HLR002: no links to parent document: SYS" | |
| ] | |
| }, | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "\n", | |
| "HLR: HLR002: unreviewed changes" | |
| ] | |
| }, | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "\n", | |
| "HLR: HLR003: unreviewed changes" | |
| ] | |
| }, | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "\n", | |
| "HLR: HLR023: 'mater tales' in text" | |
| ] | |
| }, | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "\n", | |
| "HLT: HLT031: suspect link: HLR003" | |
| ] | |
| }, | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "\n", | |
| "HLT: HLT172: suspect link: HLR003" | |
| ] | |
| }, | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "\n", | |
| "HLT: HLT142: suspect link: HLR003" | |
| ] | |
| }, | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "\n", | |
| "HLT: HLT196: suspect link: HLR003" | |
| ] | |
| }, | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "\n", | |
| "HLT: HLT107: suspect link: HLR003" | |
| ] | |
| }, | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "\n", | |
| "HLT: HLT057: suspect link: HLR003" | |
| ] | |
| }, | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "\n", | |
| "HLT: HLT103: suspect link: HLR003" | |
| ] | |
| }, | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "\n", | |
| "LLR: LLR002: parent is 'HLR', but linked to: fake99" | |
| ] | |
| }, | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "\n", | |
| "LLR: LLR002: linked to unknown item: fake99\n", | |
| "LLR: LLR002: unreviewed changes" | |
| ] | |
| }, | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "\n", | |
| "LLR: LLR007: suspect link: HLR003" | |
| ] | |
| }, | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "\n", | |
| "LLR: LLR031: suspect link: HLR003" | |
| ] | |
| }, | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "\n", | |
| "LLR: LLR036: suspect link: HLR003" | |
| ] | |
| }, | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "\n", | |
| "LLR: LLR119: suspect link: HLR003" | |
| ] | |
| }, | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "\n", | |
| "LLR: LLR156: suspect link: HLR003" | |
| ] | |
| }, | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 43 | |
| } | |
| ], | |
| "metadata": {} | |
| } | |
| ] | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment