Dashboard code for displaying PSM project status.
Like the PSM itself, the PSM Dashboard is open source software. The Dashboard displays PSM development status, showing which features have been completed, which are in progress, and which have yet to be started.
The code here combines information in the PSM Features - RTM Map spreadsheet, the PSM requirements, and the PSM issue tracker to produce JSON data that is then used to generate progress charts that show both high-level and detailed views of the PSM's feature progress.
The JS, CSS, and HTML files that generate the charts from the JSON data live in
the main psm repo, in the gh-pages branch, which is the source code for the
projectpsm.org website.
Run the refresh-dashboard script in this directory. It will tell
you about any config preparation you need to make. Once the
configuration is properly set up, refresh-dashboard will produce
features-info.json. You will see a lot of progress output along the
way. For reference, the script seems to usually take 2-3 minutes to
run, when your machine has a good Net connection.
(For details on Python module dependencies and using a virtual
environment see the comments at the top of the gather-info script.)
Once features-info.json is ready, copy the new version of it into the
dashboard directory in the gh-pages branch of the main psm repo,
replacing the previous version. Then follow the README.md in that branch to
view the site and make sure everything looks right. If it does, commit and
push the updated features-info.json to the origin gh-pages branch of
the main psm repo.
Now visit http://projectpsm.org/dashboard to check that the live site is refreshed. You may need to clear your browser's cache to see the updated version.
We're pretty loose here right now. A few things:
-
Use conventional indentation (spaces not tabs; 4 spaces per level for Python).
-
Feel free to use branches and PRs, but it's okay to push directly to master too.
-
refresh-dashboardScript to orchestrate everything: gather and combine the features/RTM mapping, the requirements, and the issue labels so as to producerefresh-dashboard.json. -
gather-infoThis is the main script thatrefresh-dashboarddrives. This script gathers information from various PSM project sources (high-level features list, requirements list, issue tracker) and turns it into JSON, which is then used as input to the dashboard display code. See the "Data format" section in this document for details about the JSON format. -
psm-reqs.pyA Python module for treating PSM reqs programmatically. -
format-reqsParse PSM reqs and print them out in various ways. (This is is meant mainly for other programs to use; seeshow-reqsfor example.) -
show-reqsA script to print out requirements in various formats. -
psm_reqs.elEmacs Lisp for working with PSM reqs. Load this file (i.e., withM-x load-file). Then do./show-reqs elisp > reqs.elat a command line. Now you can runM-x psm-load-reqin Emacs, pointing it at the 'reqs.el' file, to load all of the PSM reqs into Emacs. Bind the Emacs commandpsm-show-reqto whatever keybinding you want -- e.g.,(global-set-key "\C-cr" 'psm-show-req)-- and now whenever point (meaning your text cursor) is inside a req ID, you can doC-c rto see a popup description of that requirement. -
non-hidden-RTM-rows.orgAn initial export of PSM requirements to Org Mode format (done manually, I believe, not with psm_reqs.py). This export turned out to be missing some hidden rows; see the next entry about that. -
hidden-RTM-rows.orgThe remainder of the Org Mode export (see above). Here's how you know that this file and non-hidden-RTM-rows.org have different reqs:$ grep -E "^\* psm-" hidden-RTM-rows.org | cut -c 3- > hidden-reqs $ grep -E "^\* psm-" non-hidden-RTM-rows.org | cut -c 3- > non-hidden-reqs $ sort hidden-reqs > h.tmp; mv h.tmp hidden-reqs $ sort non-hidden-reqs > n.tmp; mv n.tmp non-hidden-reqs $ comm -1 -2 hidden-reqs non-hidden-reqs $ diff -u hidden-reqs non-hidden-reqs $ rm hidden-reqs non-hidden-reqs -
added-reqs.orgRequirements we created during the first issues/reqs sweep, which used only the non-hidden rows, as we didn't know about the hidden rows at the time. Therefore, some of the newly created reqs in added-reqs.orq are redundant with existing reqs; there is more detail about this in the file. Others are not redundant -- they represent genuinely new requirements that we came up with during our requirements sweep. All of the added reqs are, I believe, also present in non-hidden-RTM-rows.org, since the added reqs were created during the initial issues/reqs sweep.What we should do with redundant new reqs now:
Once we're sure we've identified every one of them, we should make sure none of them are attached to any issues, and then remove all the redundant reqs from any file that has them (RTM.xlsx in the PSM repository, added-reqs.org here, and *-RTM-rows.org here too just to be safe).
What we should do with non-redundant new reqs now:
They should stay, of course, but note that the removal of some of the redundant ones might lead to the downward renumbering of some non-redundant ones.
-
issues-2018-03-31.orgAn export of all issues and their labels, up to issue 740, plus some information about which issues should get which req-related labels.The information in this file was converted to JSON and fed to ots-tools/github-tools/gh-sak, to put req labels on our issues. Those JSON files are still around on the PSM repository's archival rtm-issue-linking branch, but we haven't preserved them here.
This is the JSON data input format that the dashboard expects:
"features": {
"psm-feature-000": {
"description": String,
"status": String ["Complete", "InProgress", "NotStarted", "Ongoing"],
"startDate": String[Date] or null,
"completedDate": String[Date] or null,
"requirements": [
"psm-FR-8.2",
"psm-FR-8.3",
...
]
},
"psm-feature-001": {
...
}
}
"requirements": {
"psm-FR-8.2": {
"description": String,
"status": String ["Complete", "InProgress", "NotStarted", "Ongoing"],
"startDate": String[Date] or null,
"completedDate": String[Date] or null,
"issues": [
123,
456,
789,
...
]
},
"psm-FR-8.3": {
...
},
...
}
"issues": {
"123": {
"title": String,
"description": String,
"url": String,
"status": String ["Complete", "InProgress", "NotStarted", "Ongoing"],
"startDate": String[Date] or null,
"completedDate": String[Date] or null,
},
"456": {
...
},
...
}
Fields without values (e.g. startDate, or completedDate) should be
null which is JSON's way of representing absence of a value:
{
"startDate": null
}
And dates should be represented as strings in ISO 8601 format (https://www.w3.org/TR/NOTE-datetime) which can readily be converted into JS Date objects if needed:
{
"startDate": "2018-06-11"
}
Minimum precision for dates should be the day (as above), but hours and minutes can also optionally be included:
{
"startDate": "2018-06-11T19:20+01:00"
}