Text-based requirements management using version control.
Doorstop is a tool to manage the storage of textual requirements alongside source code in version control.
Each linkable item (requirement, test case, etc.) is stored as a YAML file in a designated directory. The items in each directory form a document. Document items can be linked to one another to form a tree hierarchy. Doorstop provides mechanisms for modifying this hierarchy, checking the tree for consistency, and publishing documents in several formats.
- Python 3.3+
- A version control system for requirements storage
Doorstop can be installed with pip:
$ pip install doorstop
Or directly from source:
$ git clone https://github.com/jacebrowning/doorstop.git $ cd doorstop $ python setup.py install
After installation, Doorstop is available on the command-line:
$ doorstop --help
And the package is available under the name ‘doorstop’:
$ python >>> import doorstop >>> doorstop.__version__
After configuring version control, a new parent document can be created:
$ doorstop new REQ ./reqs created document: REQ (@/reqs)
Items can be added to the document and edited:
$ doorstop add REQ added item: REQ001 (@/reqs/REQ001.yml) $ doorstop edit REQ1 opened item: REQ001 (@/reqs/REQ001.yml)
Additional documents can be created that link to other documents:
$ doorstop new TST ./reqs/tests --parent REQ created document: TST (@/reqs/tests)
Items can be added and linked to parent items:
$ doorstop add TST added item: TST001 (@/reqs/tests/TST001.yml) $ doorstop link TST1 REQ1 linked item: TST001 (@/reqs/tests/TST001.yml) -> REQ001 (@/reqs/REQ001.yml)
To check a document hierarchy for consistency, run the main command:
$ doorstop valid tree: REQ <- [ TST ]
A text report of a document can be displayed:
$ doorstop publish TST 1 TST001 Verify the foobar will foo and bar. Links: REQ001
Other formats are also supported:
$ doorstop publish TST --html <!DOCTYPE html> ... <body> <h1>1 (TST001)</h1> <p>Verify the foobar will foo and bar.</p> <p><em>Links: REQ001</em></p> </body> </html>
Or a file can be created using one of the supported extensions:
$ doorstop publish TST path/to/tst.md publishing TST to path/to/tst.md...
- Text: .txt
- Markdown: .md
- HTML: .html
Documents can be exported for editing or to exchange with other systems:
$ doorstop export TST TST001: active: true dervied: false level: 1 links: - REQ001 normative: true ref: '' text: | Verify the foobar will foo and bar.
Or a file can be created using one of the supported extensions:
$ doorstop export TST path/to/tst.csv exporting TST to path/to/tst.csv... exported: path/to/tst.csv
- YAML: .yml
- Comma-Separated Values: .csv
- Tab-Separated Values: .tsv
- Microsoft Office Excel: .xlsx
Items can be created/updated from the export formats:
$ doorstop import path/to/tst.csv TST
- GNU Make:
- virtualenv: https://pypi.python.org/pypi/virtualenv#installation
- Pandoc: http://johnmacfarlane.net/pandoc/installing.html
- Graphviz: http://www.graphviz.org/Download.php
Create a virtualenv:
Run the tests:
make test make tests # includes integration tests
Build the documentation:
Run static analysis:
make pep8 make pep257 make pylint make check # includes all checks
Prepare a release:
make dist # dry run make upload
- Added doorstop delete … to delete document directories.
- Added doorstop export … to export content for external tools.
- Fixed doorstop publish … handling of unknown formats.
- Added tree structure and traceability to index.html.
- Added clickable links using Item IDs in HTML header tags.
- Fixed bug publishing a document to a directory.
- Fixed bug publishing a document without an extension or type specified.
- Updated doorstop import … to import from document export formats.
- Updated doorstop edit … to support document export/import.
- Renamed doorstop new … to doorstop create ….
- Made ‘all’ a reserved word, which cannot be used as a prefix.
- Refactored Item levels into a Level class
- Refactored Item identifiers into an ID class
- Refactored Item text into a Text class (behaves like str)
- Methods no longer require nore accept ‘document’ and ‘tree’ arguments
- Renamed Item.find_rlinks() to Item.find_child_links()
- Changed ‘–no-rlink-check’ to ‘–no-child-check’
- Added Item.find_child_items() and Item.find_child_documents()
- Added aliases to Item: parent_links, child_links/items/documents
- Added ‘–with-child-links’ to ‘doorstop publish’ to publish child links
- Added ‘doorstop import’ CLI to import documents and items.
- Refactored Document prefixes in a Prefix class (also used in the ID class)
- Added ‘–no-level-check’ to disable document level validation
- Added ‘–reorder’ option to ‘doorstop’ to enable reording
- Converted Item.issues() to a property and added Item.get_issues()
- Added ‘–level’ option to ‘doorstop add’ to force an Item level
- Added warnings for duplicate Item levels in a Document
- Added warnings for skipped Item levels in a Document
- Renamed Item methods: add_link -> link, remove_link -> unlink, valid -> validate
- Renamed Document methods: add -> add_item, remove -> remove_item, valid -> validate
- Renamed Tree methods: new -> new_document, add -> add_item, remove -> remove_item, link -> link_items, unlink -> unlink_items, edit -> edit_item, valid -> validate
- Added doorstop.importer functions to add exiting Documents and Items
- Fixed storage of 2-part levels ending in a multiple of 10
- Fixed a case where Item.root was not set
- Fixed auto save/load decorator order
- Added Tree.delete() to delete all Documents and Items
- Added ‘doorstop publish all <directory>’ to publish Trees and index.html
- Added find_document and find_item convenience functions
- Added Document.delete() to delete a Document and its Items
- All Item text attributes are now be split by sentences and line-wrapped
- Added Tree.load() for cases when lazy loading is too slow
- Added caching to Tree.find_item() and Tree.find_document()
- Top-level Items are no longer required to have a level ending in zero
- Added Item/Document.extended to get a list of extended attribute names
- Documents can now have Item files in sub-folders
- Updated doorstop.core.report to support lists of Items
- Updated doorstop.core.report to support Items or Documents
- Removed the ‘iter_’ prefix from all generators
- Fixed CSS bullets indent
- Added caching of Items in the Document class
- Added Document.remove() to delete an item by its ID
- Item.find_rlinks() will now search the entire tree for links
- Added Item.find_rlinks() to return reverse links and child documents
- Changed the logging format
- Added a ‘–project’ argument to provide a path to the root of the project
- Fixed a mutable default argument bug in Item creation
- Added Tree/Document/Item.iter_issues() method to yield all issues
- Tree/Document/Item.check() now logs all issues rather than failing fast
- Renamed Tree/Document/Item.check() to valid()
- Added Document.sep to separate prefix and item numbers.
- Fixed missing package data.
- Added Item.active property to disable certain items.
- Added Item.dervied property to disable link checking on certain items.
- Switched to embedded CSS in generated HTML.
- Shorted default Item and Document string formatting.
- Added top-down link checking.
- Non-normative items with a zero-ended level are now headings.
- Added a CSS for generated HTML.
- The ‘publish’ command now accepts an output file path.
- Searching for ‘ref’ will now also find filenames.
- Item files can now contain arbitrary fields.
- Document prefixes can now contain numbers, dashes, and periods.
- Added a ‘normative’ attribute to the Item class.
- Always showing ‘ref’ in items.
- Reloading item attributes after a save.
- Inserting lines breaks after sentences in item ‘text’.
- Added basic report creation via ‘doorstop publish’.
- Added item link and reference validation.
- Added cached of loaded items.
- Added preliminary VCS support for Git and Veracity.
- Implemented ‘add’, ‘remove’, ‘link’, and ‘unlink’ commands.
- Added basic tree validation.
- Added the initial Document class.
- Items can now be ordered by ‘level’ in a Document.
- Initial tutorial created.
- Changed ‘doorstop init’ to ‘doorstop new’.
- Added the initial Item class.
- Added stubs for the Document class.
- Initial release of Doorstop.
Release history Release notifications
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
|Filename, size & hash SHA256 hash help||File type||Python version||Upload date|
|Doorstop-0.7-py3-none-any.whl (102.9 kB) Copy SHA256 hash SHA256||Wheel||3.3||Jul 8, 2014|
|Doorstop-0.7.tar.gz (87.3 kB) Copy SHA256 hash SHA256||Source||None||Jul 8, 2014|