feat: use mustache instead of tangular

This commit is contained in:
Karl-Philipp Wulfert
2019-03-20 15:46:59 +01:00
parent 9847fc809c
commit 95f7521dbd
11 changed files with 450 additions and 745 deletions

View File

@@ -10,3 +10,4 @@
!package-lock.json
!README.md
!src
!templates

671
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -24,35 +24,25 @@
"dependencies": {
"@openstapps/gitlab-api": "0.5.1",
"@openstapps/logger": "0.0.5",
"@slack/client": "4.9.0",
"@types/del": "3.0.1",
"@slack/client": "4.12.0",
"@types/glob": "7.1.1",
"@types/inquirer": "0.0.43",
"@types/node": "10.12.27",
"@types/pad": "1.0.2",
"@types/request": "2.48.1",
"@types/semver": "5.5.0",
"@types/mustache": "0.8.32",
"@types/node": "10.12.30",
"async-pool-native": "0.1.0",
"commander": "2.19.0",
"del": "3.0.0",
"glob": "7.1.3",
"inquirer": "6.2.2",
"moment": "2.24.0",
"pad": "2.2.2",
"request": "2.88.0",
"semver": "5.6.0",
"tangular": "2.0.1",
"toposort": "2.0.2"
"mustache": "3.0.1"
},
"devDependencies": {
"@openstapps/configuration": "0.6.0",
"@openstapps/configuration": "0.7.0",
"conventional-changelog-cli": "2.0.12",
"prepend-file-cli": "1.0.6",
"rimraf": "2.6.3",
"ts-node": "8.0.2",
"tslint": "5.13.0",
"ts-node": "8.0.3",
"tslint": "5.14.0",
"typedoc": "0.14.2",
"typescript": "3.3.3333"
"typescript": "3.3.4000"
},
"main": "lib/common.js",
"typings": "lib/common.d.ts",

132
reports/2019-03-27.md Normal file
View File

@@ -0,0 +1,132 @@
# Meeting 2019-03-27
## <img src="https://secure.gravatar.com/avatar/e7fffaba0ad02819f47c790d73c77ae0?s=80&d=identicon" height="30"/> Rainer Killinger
### open: 4, closed: 3
quota closed: 42%
| __title__ | __status__ | __project__ | __weeks__ |
| --- | --- | --- | --- |
| __[Insert sample data from the StappsCore into the backend](https://gitlab.com/openstapps/minimal-connector/issues/4)__<br />__Labels:__ meeting | | [openstapps&#x2F;minimal-connector](https://gitlab.com/openstapps/minimal-connector) | 0 |
| __[Simplify translation implementation](https://gitlab.com/openstapps/core/issues/43)__<br />__Labels:__ feature, meeting | | [openstapps&#x2F;core](https://gitlab.com/openstapps/core) | 0 |
| __[Update transport security in nginx configuration](https://gitlab.com/openstapps/proxy/issues/1)__<br />__Labels:__ meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>](https://gitlab.com/openstapps/proxy/merge_requests/3) | [openstapps&#x2F;proxy](https://gitlab.com/openstapps/proxy) | 3 |
| __[Add notion of study modules](https://gitlab.com/openstapps/core/issues/20)__<br />__Labels:__ feature, meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>](https://gitlab.com/openstapps/core/merge_requests/10) | [openstapps&#x2F;core](https://gitlab.com/openstapps/core) | 11 |
| __[Manual docker image publishing fails](https://gitlab.com/openstapps/backend/issues/28)__<br />__Labels:__ __bug__, meeting | | [openstapps&#x2F;backend](https://gitlab.com/openstapps/backend) | 1 |
| __[Fix folder permissions for elasticsearch volume](https://gitlab.com/openstapps/minimal-deployment/issues/5)__<br />__Labels:__ meeting | | [openstapps&#x2F;minimal-deployment](https://gitlab.com/openstapps/minimal-deployment) | 0 |
| __[Test docker image building](https://gitlab.com/openstapps/proxy/issues/7)__<br />__Labels:__ meeting, testing | | [openstapps&#x2F;proxy](https://gitlab.com/openstapps/proxy) | 1 |
## <img src="https://secure.gravatar.com/avatar/160dcb84d23a960d774959186a440882?s=80&d=identicon" height="30"/> Jovan Krunić
### open: 33, closed: 1
quota closed: 2%
| __title__ | __status__ | __project__ | __weeks__ |
| --- | --- | --- | --- |
| __[Improve image docs and standardize usage](https://gitlab.com/openstapps/core/issues/44)__<br />__Labels:__ __bug__, meeting | | [openstapps&#x2F;core](https://gitlab.com/openstapps/core) | 0 |
| __[Include sample JSON files within the published package](https://gitlab.com/openstapps/core/issues/46)__<br />__Labels:__ feature, meeting | | [openstapps&#x2F;core](https://gitlab.com/openstapps/core) | 0 |
| __[Use review apps from gitlab to provide demo](https://gitlab.com/openstapps/app/issues/42)__<br />__Labels:__ feature, meeting | | [openstapps&#x2F;app](https://gitlab.com/openstapps/app) | 0 |
| __[Make sure appearance is compatible with (new) devices with cutouts](https://gitlab.com/openstapps/app/issues/40)__<br />__Labels:__ improvement, meeting | | [openstapps&#x2F;app](https://gitlab.com/openstapps/app) | 3 |
| __[Inconsistency in definitions of things without references](https://gitlab.com/openstapps/core/issues/41)__<br />__Labels:__ feature, meeting | | [openstapps&#x2F;core](https://gitlab.com/openstapps/core) | 3 |
| __[Show dishes for multiple days](https://gitlab.com/openstapps/app/issues/39)__<br />__Labels:__ feature, meeting | | [openstapps&#x2F;app](https://gitlab.com/openstapps/app) | 3 |
| __[Use fake backend - backendless development](https://gitlab.com/openstapps/app/issues/37)__<br />__Labels:__ improvement, meeting | | [openstapps&#x2F;app](https://gitlab.com/openstapps/app) | 3 |
| __[add a main page for the group (whole project)](https://gitlab.com/openstapps/openstapps.gitlab.io/issues/1)__<br />__Labels:__ documentation, meeting, organization | | [openstapps&#x2F;openstapps.gitlab.io](https://gitlab.com/openstapps/openstapps.gitlab.io) | 6 |
| __[upgrade to Ionic 4.0 (stable)](https://gitlab.com/openstapps/app/issues/35)__<br />__Labels:__ improvement, meeting | | [openstapps&#x2F;app](https://gitlab.com/openstapps/app) | 6 |
| __[Develop a prototype for authentication](https://gitlab.com/openstapps/backend/issues/8)__<br />__Labels:__ feature, meeting | | [openstapps&#x2F;backend](https://gitlab.com/openstapps/backend) | 8 |
| __[Add examples for routes](https://gitlab.com/openstapps/core/issues/17)__<br />__Labels:__ feature, meeting | | [openstapps&#x2F;core](https://gitlab.com/openstapps/core) | 13 |
| __[(TODO: complete) school module: evaluate and create a prototype of a generic app](https://gitlab.com/openstapps/app/issues/29)__<br />__Labels:__ meeting | | [openstapps&#x2F;app](https://gitlab.com/openstapps/app) | 13 |
| __[List of most recent searches](https://gitlab.com/openstapps/app/issues/28)__<br />__Labels:__ meeting | | [openstapps&#x2F;app](https://gitlab.com/openstapps/app) | 13 |
| __[Sorting by categories should be default for certain views](https://gitlab.com/openstapps/app/issues/25)__<br />__Labels:__ meeting | | [openstapps&#x2F;app](https://gitlab.com/openstapps/app) | 13 |
| __[Evaluate solutions for adding monitoring (automatic error reports)](https://gitlab.com/openstapps/app/issues/24)__<br />__Labels:__ meeting | | [openstapps&#x2F;app](https://gitlab.com/openstapps/app) | 13 |
| __[Todos module - predefined and user-defined tasks](https://gitlab.com/openstapps/app/issues/23)__<br />__Labels:__ meeting | | [openstapps&#x2F;app](https://gitlab.com/openstapps/app) | 13 |
| __[Add deep-linking support](https://gitlab.com/openstapps/app/issues/22)__<br />__Labels:__ meeting | | [openstapps&#x2F;app](https://gitlab.com/openstapps/app) | 13 |
| __[Show menus of (student) canteens for multiple days](https://gitlab.com/openstapps/app/issues/19)__<br />__Labels:__ meeting | | [openstapps&#x2F;app](https://gitlab.com/openstapps/app) | 13 |
| __[Limit loaded places by the current zoom level](https://gitlab.com/openstapps/app/issues/18)__<br />__Labels:__ meeting | | [openstapps&#x2F;app](https://gitlab.com/openstapps/app) | 13 |
| __[Appointment system module - queue number and estimated waiting time](https://gitlab.com/openstapps/app/issues/17)__<br />__Labels:__ meeting | | [openstapps&#x2F;app](https://gitlab.com/openstapps/app) | 13 |
| __[&quot;About&quot; module - app information and policies](https://gitlab.com/openstapps/app/issues/16)__<br />__Labels:__ meeting | | [openstapps&#x2F;app](https://gitlab.com/openstapps/app) | 13 |
| __[Catalog tree module - catalog of university events](https://gitlab.com/openstapps/app/issues/15)__<br />__Labels:__ meeting | | [openstapps&#x2F;app](https://gitlab.com/openstapps/app) | 13 |
| __[Styles and images](https://gitlab.com/openstapps/app/issues/14)__<br />__Labels:__ meeting | | [openstapps&#x2F;app](https://gitlab.com/openstapps/app) | 13 |
| __[Home module - home page with widgets](https://gitlab.com/openstapps/app/issues/13)__<br />__Labels:__ meeting | | [openstapps&#x2F;app](https://gitlab.com/openstapps/app) | 13 |
| __[Map module: show places and position](https://gitlab.com/openstapps/app/issues/12)__<br />__Labels:__ meeting | | [openstapps&#x2F;app](https://gitlab.com/openstapps/app) | 13 |
| __[Export persons into the phone&#39;s contact list](https://gitlab.com/openstapps/app/issues/11)__<br />__Labels:__ meeting | | [openstapps&#x2F;app](https://gitlab.com/openstapps/app) | 13 |
| __[Favorites module - save frequently used data as favorites](https://gitlab.com/openstapps/app/issues/10)__<br />__Labels:__ meeting | | [openstapps&#x2F;app](https://gitlab.com/openstapps/app) | 13 |
| __[Events (timetable) module - schedule and calendar](https://gitlab.com/openstapps/app/issues/8)__<br />__Labels:__ meeting | | [openstapps&#x2F;app](https://gitlab.com/openstapps/app) | 13 |
| __[First start module: initial information and settings](https://gitlab.com/openstapps/app/issues/6)__<br />__Labels:__ meeting | | [openstapps&#x2F;app](https://gitlab.com/openstapps/app) | 14 |
| __[Use skeleton screens](https://gitlab.com/openstapps/app/issues/4)__<br />__Labels:__ meeting | | [openstapps&#x2F;app](https://gitlab.com/openstapps/app) | 14 |
| __[Data synchronization and consistency](https://gitlab.com/openstapps/app/issues/2)__<br />__Labels:__ meeting | | [openstapps&#x2F;app](https://gitlab.com/openstapps/app) | 14 |
| __[Data module - data handling and presentation](https://gitlab.com/openstapps/app/issues/1)__<br />__Labels:__ meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>](https://gitlab.com/openstapps/app/merge_requests/2) | [openstapps&#x2F;app](https://gitlab.com/openstapps/app) | 14 |
| __[Add an npm initializer package](https://gitlab.com/openstapps/projectmanagement/issues/2)__<br />__Labels:__ meeting | | [openstapps&#x2F;projectmanagement](https://gitlab.com/openstapps/projectmanagement) | 15 |
| __[Backend should &quot;wait&quot; for the database container to be ready](https://gitlab.com/openstapps/minimal-deployment/issues/1)__<br />__Labels:__ meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" /> | [openstapps&#x2F;minimal-deployment](https://gitlab.com/openstapps/minimal-deployment) | 6 |
## <img src="https://secure.gravatar.com/avatar/cc0abc686533bdcd56ef8766e06850f5?s=80&d=identicon" height="30"/> Karl-Philipp Wulfert
### open: 9, closed: 0
quota closed: 0%
| __title__ | __status__ | __project__ | __weeks__ |
| --- | --- | --- | --- |
| __[Add systemd service file and error handler](https://gitlab.com/openstapps/proxy/issues/5)__<br />__Labels:__ feature, meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>](https://gitlab.com/openstapps/proxy/merge_requests/2) | [openstapps&#x2F;proxy](https://gitlab.com/openstapps/proxy) | 3 |
| __[Add issue templates](https://gitlab.com/openstapps/minimal-deployment/issues/3)__<br />__Labels:__ meeting | | [openstapps&#x2F;minimal-deployment](https://gitlab.com/openstapps/minimal-deployment) | 3 |
| __[Remove links to old GitLab instance](https://gitlab.com/openstapps/proxy/issues/3)__<br />__Labels:__ meeting | | [openstapps&#x2F;proxy](https://gitlab.com/openstapps/proxy) | 3 |
| __[Throws error in &#x60;production&#x60; environment: &quot;... doesn&#39;t set an transport agent ...&quot;](https://gitlab.com/openstapps/logger/issues/4)__<br />__Labels:__ meeting | | [openstapps&#x2F;logger](https://gitlab.com/openstapps/logger) | 7 |
| __[Support adding links to external services of a university&#x2F;school](https://gitlab.com/openstapps/app/issues/21)__<br />__Labels:__ meeting | | [openstapps&#x2F;app](https://gitlab.com/openstapps/app) | 13 |
| __[Include place when exporting events into the native calendar](https://gitlab.com/openstapps/app/issues/20)__<br />__Labels:__ meeting | | [openstapps&#x2F;app](https://gitlab.com/openstapps/app) | 13 |
| __[Evaluate use of clickable alphabet for lists](https://gitlab.com/openstapps/app/issues/7)__<br />__Labels:__ meeting | | [openstapps&#x2F;app](https://gitlab.com/openstapps/app) | 13 |
| __[&#x60;circular-json&#x60; is deprecated](https://gitlab.com/openstapps/logger/issues/2)__<br />__Labels:__ meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>](https://gitlab.com/openstapps/logger/merge_requests/2) | [openstapps&#x2F;logger](https://gitlab.com/openstapps/logger) | 15 |
| __[Test coverage levels are too low](https://gitlab.com/openstapps/logger/issues/1)__<br />__Labels:__ meeting | | [openstapps&#x2F;logger](https://gitlab.com/openstapps/logger) | 15 |
## <img src="https://secure.gravatar.com/avatar/98886e4ad71cd95906c95946629890b2?s=80&d=identicon" height="30"/> Michel Jonathan Schmitz
### open: 7, closed: 0
quota closed: 0%
| __title__ | __status__ | __project__ | __weeks__ |
| --- | --- | --- | --- |
| __[Provide context based search](https://gitlab.com/openstapps/core/issues/45)__<br />__Labels:__ feature, meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>](https://gitlab.com/openstapps/core/merge_requests/34) | [openstapps&#x2F;core](https://gitlab.com/openstapps/core) | 0 |
| __[minimal connector and app should be part of the minimal deployment](https://gitlab.com/openstapps/minimal-deployment/issues/2)__<br />__Labels:__ meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>](https://gitlab.com/openstapps/minimal-deployment/merge_requests/2) | [openstapps&#x2F;minimal-deployment](https://gitlab.com/openstapps/minimal-deployment) | 3 |
| __[Easy access for connector developers](https://gitlab.com/openstapps/minimal-connector/issues/3)__<br />__Labels:__ meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>](https://gitlab.com/openstapps/minimal-connector/merge_requests/3) | [openstapps&#x2F;minimal-connector](https://gitlab.com/openstapps/minimal-connector) | 5 |
| __[Provide context based search](https://gitlab.com/openstapps/backend/issues/11)__<br />__Labels:__ feature, meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>](https://gitlab.com/openstapps/backend/merge_requests/12) | [openstapps&#x2F;backend](https://gitlab.com/openstapps/backend) | 8 |
| __[Do not exclude externals from reflection](https://gitlab.com/openstapps/core-tools/issues/7)__<br />__Labels:__ meeting | | [openstapps&#x2F;core-tools](https://gitlab.com/openstapps/core-tools) | 9 |
| __[UML generation for data models](https://gitlab.com/openstapps/core-tools/issues/3)__<br />__Labels:__ Doing, meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>](https://gitlab.com/openstapps/core-tools/merge_requests/2) | [openstapps&#x2F;core-tools](https://gitlab.com/openstapps/core-tools) | 10 |
| __[Unclear documentation](https://gitlab.com/openstapps/projectmanagement/issues/6)__<br />__Labels:__ meeting | | [openstapps&#x2F;projectmanagement](https://gitlab.com/openstapps/projectmanagement) | 15 |
## <img src="https://assets.gitlab-static.net/uploads/-/system/user/avatar/3203752/avatar.png" height="30"/> Sebastian Lange
### open: 5, closed: 2
quota closed: 28%
| __title__ | __status__ | __project__ | __weeks__ |
| --- | --- | --- | --- |
| __[Follow-up from &quot;Resolve &quot;Config module - Provider for app configuration&quot;&quot;](https://gitlab.com/openstapps/app/issues/41)__<br />__Labels:__ meeting | | [openstapps&#x2F;app](https://gitlab.com/openstapps/app) | 0 |
| __[Config module - Provider for app configuration](https://gitlab.com/openstapps/app/issues/34)__<br />__Labels:__ feature, meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>](https://gitlab.com/openstapps/app/merge_requests/5) | [openstapps&#x2F;app](https://gitlab.com/openstapps/app) | 7 |
| __[Initialize settings with from backend served app configuration](https://gitlab.com/openstapps/app/issues/30)__<br />__Labels:__ feature, meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>](https://gitlab.com/openstapps/app/merge_requests/7) | [openstapps&#x2F;app](https://gitlab.com/openstapps/app) | 13 |
| __[Use i18n](https://gitlab.com/openstapps/app/issues/5)__<br />__Labels:__ meeting | | [openstapps&#x2F;app](https://gitlab.com/openstapps/app) | 14 |
| __[Menu module - main and context menu](https://gitlab.com/openstapps/app/issues/3)__<br />__Labels:__ meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>](https://gitlab.com/openstapps/app/merge_requests/9) | [openstapps&#x2F;app](https://gitlab.com/openstapps/app) | 14 |
| __[Update core dependency to v0.12.0](https://gitlab.com/openstapps/backend/issues/30)__<br />__Labels:__ feature, meeting | | [openstapps&#x2F;backend](https://gitlab.com/openstapps/backend) | 0 |
| __[Remodeling of Buckets in SCFacets](https://gitlab.com/openstapps/core/issues/42)__<br />__Labels:__ feature, meeting | | [openstapps&#x2F;core](https://gitlab.com/openstapps/core) | 1 |
## <img src="https://secure.gravatar.com/avatar/5bd48fb0ae000b24b1d1455d9c160364?s=80&d=identicon" height="30"/> Wieland Schöbl
### open: 17, closed: 1
quota closed: 5%
| __title__ | __status__ | __project__ | __weeks__ |
| --- | --- | --- | --- |
| __[SCIndexResponse: additionalProperty &quot;uid&quot; exists in instance when not allowed](https://gitlab.com/openstapps/backend/issues/32)__<br />__Labels:__ __bug__, meeting | | [openstapps&#x2F;backend](https://gitlab.com/openstapps/backend) | 0 |
| __[There are still occcurences of &#x60;isProductiveEnvironment&#x60;](https://gitlab.com/openstapps/backend/issues/29)__<br />__Labels:__ __bug__, meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>](https://gitlab.com/openstapps/backend/merge_requests/11) | [openstapps&#x2F;backend](https://gitlab.com/openstapps/backend) | 0 |
| __[Refactoring of search (query building)](https://gitlab.com/openstapps/backend/issues/13)__<br />__Labels:__ __bug__, meeting | | [openstapps&#x2F;backend](https://gitlab.com/openstapps/backend) | 8 |
| __[Backend should throw an Error if someone tries to close an empty bulk process](https://gitlab.com/openstapps/backend/issues/7)__<br />__Labels:__ __bug__, meeting | | [openstapps&#x2F;backend](https://gitlab.com/openstapps/backend) | 8 |
| __[Implement unit tests](https://gitlab.com/openstapps/backend/issues/31)__<br />__Labels:__ feature, meeting | | [openstapps&#x2F;backend](https://gitlab.com/openstapps/backend) | 0 |
| __[Add better documentation](https://gitlab.com/openstapps/backend/issues/26)__<br />__Labels:__ feature, meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>](https://gitlab.com/openstapps/backend/merge_requests/7) | [openstapps&#x2F;backend](https://gitlab.com/openstapps/backend) | 2 |
| __[Automatically check database version](https://gitlab.com/openstapps/backend/issues/24)__<br />__Labels:__ feature, meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>](https://gitlab.com/openstapps/backend/merge_requests/6) | [openstapps&#x2F;backend](https://gitlab.com/openstapps/backend) | 3 |
| __[Publish documentation to gitlab pages](https://gitlab.com/openstapps/backend/issues/22)__<br />__Labels:__ feature, meeting | | [openstapps&#x2F;backend](https://gitlab.com/openstapps/backend) | 3 |
| __[backend version should be provided by the requested path instead of the &#x60;X-StApps-Version&#x60; header](https://gitlab.com/openstapps/proxy/issues/2)__<br />__Labels:__ meeting | | [openstapps&#x2F;proxy](https://gitlab.com/openstapps/proxy) | 3 |
| __[Dynamic Data should be accesible by the search route as well](https://gitlab.com/openstapps/backend/issues/17)__<br />__Labels:__ feature, meeting | | [openstapps&#x2F;backend](https://gitlab.com/openstapps/backend) | 8 |
| __[Link documentation for routes in the README.ms](https://gitlab.com/openstapps/backend/issues/10)__<br />__Labels:__ feature, meeting | | [openstapps&#x2F;backend](https://gitlab.com/openstapps/backend) | 8 |
| __[Develop a monitoring solution for backend load](https://gitlab.com/openstapps/backend/issues/9)__<br />__Labels:__ feature, meeting | | [openstapps&#x2F;backend](https://gitlab.com/openstapps/backend) | 8 |
| __[Aggregations for the first letters of search results](https://gitlab.com/openstapps/backend/issues/6)__<br />__Labels:__ feature, meeting | | [openstapps&#x2F;backend](https://gitlab.com/openstapps/backend) | 8 |
| __[Boosting of academic terms should be done dynamically](https://gitlab.com/openstapps/backend/issues/4)__<br />__Labels:__ feature, meeting | | [openstapps&#x2F;backend](https://gitlab.com/openstapps/backend) | 8 |
| __[Develop a new plugin structure that registers plugins via HTTP](https://gitlab.com/openstapps/backend/issues/2)__<br />__Labels:__ feature, meeting | | [openstapps&#x2F;backend](https://gitlab.com/openstapps/backend) | 9 |
| __[Elasticsearch Mapping files should be generated from the StAppsCore schema](https://gitlab.com/openstapps/core-tools/issues/6)__<br />__Labels:__ meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>](https://gitlab.com/openstapps/core-tools/merge_requests/8) | [openstapps&#x2F;core-tools](https://gitlab.com/openstapps/core-tools) | 9 |
| __[Add model for routes that register backend plugins](https://gitlab.com/openstapps/core/issues/15)__<br />__Labels:__ feature, meeting | | [openstapps&#x2F;core](https://gitlab.com/openstapps/core) | 14 |
| __[Closing a bulk fails for SCThingTypes that contain a space character](https://gitlab.com/openstapps/backend/issues/25)__<br />__Labels:__ __bug__, meeting | | [openstapps&#x2F;backend](https://gitlab.com/openstapps/backend) | 3 |

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2018 StApps
* Copyright (C) 2018, 2019 StApps
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation, version 3.
@@ -20,9 +20,11 @@ import {readFile, unlink, writeFile} from 'fs';
import * as glob from 'glob';
import {promisify} from 'util';
/**
* Instantiated logger
*/
export const readFilePromisified = promisify(readFile);
export const globPromisified = promisify(glob);
export const writeFilePromisified = promisify(writeFile);
export const unlinkPromisified = promisify(unlink);
export const logger = new Logger();
/**
@@ -65,20 +67,3 @@ export async function getSubGroups(api: Api, groups: number[]): Promise<Group[]>
export function flatten2dArray<T>(arr: T[][]): T[] {
return ([] as T[]).concat(...arr);
}
/**
* Promisified version of readFile
*/
export const readFilePromisified = promisify(readFile);
/**
* Promisified version of glob
*/
export const globPromisified = promisify(glob);
/**
* Promisified version of writeFile
*/
export const writeFilePromisified = promisify(writeFile);
/**
* Promisified version of unlink
*/
export const unlinkPromisified = promisify(unlink);

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2018 StApps
* Copyright (C) 2018, 2019 StApps
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation, version 3.
@@ -15,15 +15,61 @@
import {Api} from '@openstapps/gitlab-api';
import {Issue, IssueState, MembershipScope, MergeRequestState, Project, User} from '@openstapps/gitlab-api/lib/types';
import {asyncPool} from 'async-pool-native/dist/async-pool';
import {readFileSync, writeFile} from 'fs';
import * as moment from 'moment';
import {join} from 'path';
import {render} from 'mustache';
import {join, resolve} from 'path';
import {cwd} from 'process';
import {promisify} from 'util';
import {flatten2dArray, getProjects, getSubGroups, logger} from '../common';
import {flatten2dArray, getProjects, logger, readFilePromisified, writeFilePromisified} from '../common';
import {BOLD_LABELS, GROUPS, LABEL_WEIGHTS} from '../configuration';
const asyncWriteFile = promisify(writeFile);
/**
* A structure for template compilation
*/
export interface StructureForTemplate {
issuesByAssignee: AssigneeWithIssues[];
meetingDay: string;
}
/**
* A map
*/
export interface IssuesGroupedByAssigneeId {
[assigneeId: number]: AssigneeWithIssues;
}
/**
* An assignee with assigned issues
*/
export interface AssigneeWithIssues {
assignee: User;
issueCounts: {
closed: number;
opened: number;
};
issues: IssueWithMeta[];
quota: number;
}
/**
* Issue with meta information
*/
export interface IssueWithMeta extends Issue {
$branchExists: boolean;
$labels: string;
$mergeRequestUrl: string;
$project: string;
$weeksOpen: number;
}
/**
* Merge request data
*/
export interface MergeRequestsForProjects {
[projectId: string]: Array<{
issue_iid: number;
web_url: string;
}>;
}
/**
* Check if issue state is opened or closed
@@ -41,8 +87,7 @@ export function issueStateIsOpenedOrClosed(state: IssueState): state is IssueSta
* @param projectId Project ID to get data about merge requests for
* @param issueIid Issue IID in certain project (relative ID, and not issue's GitLab API ID)
*/
export function getMergeRequestUrls(projectMergeRequests: MergeRequestData,
export function getMergeRequestUrls(projectMergeRequests: MergeRequestsForProjects,
projectId: number,
issueIid: number): string[] {
if (typeof projectMergeRequests[projectId] === 'undefined' || projectMergeRequests[projectId].length === 0) {
@@ -56,72 +101,15 @@ export function getMergeRequestUrls(projectMergeRequests: MergeRequestData,
});
}
/**
* An assignee with his/her issues
*/
export interface AssigneeWithIssues {
assignee: User;
issueCounts: {
closed: number;
opened: number;
};
issues: Issue[];
quota: number;
}
export interface MergeRequestData {
[k: string]: Array<{
issue_iid: number;
web_url: string;
}>;
}
/**
* Tangular compiled template
*/
export type TangularCompiled = (model?: any, $?: any) => string;
/**
* Convert an issue to a markdown table row
*
* @param issue Issue to convert
* @param projectBranches Map of branches for project IDs
* @param projectMergeRequests Map of merge requests for project IDs
* @param template Template to render this issue with
*/
function issueToString(issue: any,
projectBranches: any,
projectMergeRequests: any,
template: any): string {
issue._labels = issue.labels.map((label: string) => {
// print specific labels bold
if (BOLD_LABELS.indexOf(label) >= 0) {
label = '__' + label + '__';
}
return label;
}).join(', ');
/* tslint:disable: max-line-length */
return template({
branchExists: typeof projectBranches[issue.project_id] !== 'undefined' && projectBranches[issue.project_id].indexOf(issue.iid) >= 0,
issue: issue,
// take the first URL from the merge request urls array (usually if there are URLs, then there is that only one)
mergeRequestUrl: getMergeRequestUrls(projectMergeRequests, issue.project_id, issue.iid)[0],
project: issue.web_url.replace('https://gitlab.com/', '').split('/issues/')[0],
weeksOpen: moment().diff(moment(issue.created_at), 'weeks'),
});
/* tslint:enable */
}
/**
* Get issues from all groups with a specific milestone
*
* @param api GitLab API to make requests with
* @param label Label to filter by
* @param groups List of groups to get issues for
*/
export async function getIssues(api: Api, label: string): Promise<Issue[]> {
const issueResults = await asyncPool(2, GROUPS, (groupId) => {
export async function getIssues(api: Api, label: string, groups: number[]): Promise<Issue[]> {
const issueResults = await asyncPool(2, groups, (groupId) => {
return api.getIssues({
groupId: groupId,
});
@@ -142,7 +130,7 @@ export async function getIssues(api: Api, label: string): Promise<Issue[]> {
* @param api GitLab API To make requests with
* @param projects List of projects
*/
export async function getIdsOfIssuesWithBranchesForProjects(
export async function getIssueBranches(
api: Api,
projects: Project[]): Promise<{ [k: string]: number[] }> {
const projectBranches: { [k: string]: number[] } = {};
@@ -164,14 +152,28 @@ export async function getIdsOfIssuesWithBranchesForProjects(
}
/**
* Group a list of issues by their assignees
* Get issues grouped by assignees
*
* @param issues List of issues to group
* @param api GitLab API to make requests with
* @param label Label to generate report for
*/
export function groupIssuesByAssignee(issues: Issue[]): { [k: number]: AssigneeWithIssues } {
const issuesByAssignee: {
[k: number]: AssigneeWithIssues;
} = {};
export async function getIssuesGroupedByAssignees(api: Api, label: string): Promise<AssigneeWithIssues[]> {
const issuesByAssignee: IssuesGroupedByAssigneeId = {};
const groups = flatten2dArray(await asyncPool(2, GROUPS, async (groupId) => {
return (await api.getSubGroupsForGroup(groupId)).map((group) => {
return group.id;
});
}));
groups.push.apply(groups, GROUPS);
const [issues, projects] = await Promise.all([
getIssues(api, label, groups),
getProjects(api, groups),
]);
const issueBranches = await getIssueBranches(api, projects);
const mergeRequests = await getMergeRequests(api, projects);
issues.forEach((issue) => {
if (issue.assignee === null) {
@@ -195,12 +197,33 @@ export function groupIssuesByAssignee(issues: Issue[]): { [k: number]: AssigneeW
issue.state = IssueState.OPENED;
}
const issueWithMeta: IssueWithMeta = {
...issue,
...{
$branchExists: typeof issueBranches[issue.project_id] !== 'undefined'
&& issueBranches[issue.project_id].indexOf(issue.iid) >= 0,
$issue: issue,
$labels: issue.labels.map((issueLabel: string) => {
// print specific labels bold
if (BOLD_LABELS.indexOf(issueLabel) >= 0) {
issueLabel = '__' + issueLabel + '__';
}
return issueLabel;
}).join(', '),
$mergeRequestUrl: getMergeRequestUrls(mergeRequests, issue.project_id, issue.iid)[0],
$project: issue.web_url.replace('https://gitlab.com/', '').split('/issues/')[0],
$weeksOpen: moment().diff(moment(issue.created_at), 'weeks'),
},
};
if (issueStateIsOpenedOrClosed(issue.state)) {
issuesByAssignee[issue.assignee.id].issueCounts[issue.state]++;
issuesByAssignee[issue.assignee.id].issues.push(issue);
issuesByAssignee[issue.assignee.id].issues.push(issueWithMeta);
}
});
// calculate quota
Object.keys(issuesByAssignee).forEach((_assigneeId) => {
const assigneeId = parseInt(_assigneeId, 10);
@@ -211,25 +234,37 @@ export function groupIssuesByAssignee(issues: Issue[]): { [k: number]: AssigneeW
);
});
return issuesByAssignee;
}
// sort issues by weight of labels and status
Object.keys(issuesByAssignee).forEach((_assigneeId) => {
const assigneeId = parseInt(_assigneeId, 10);
/**
* Compile templates
*/
export function compileTemplates(): { [k: string]: TangularCompiled } {
const tangular: { compile: (template: string) => TangularCompiled } = require('tangular');
issuesByAssignee[assigneeId].issues.sort((a, b) => {
let weightA = 0;
let weightB = 0;
const templates = {
assigneeFooter: tangular.compile(readFileSync('templates/md/assigneeFooter.md').toString()),
assigneeHeader: tangular.compile(readFileSync('templates/md/assigneeHeader.md').toString()),
header: tangular.compile(readFileSync('templates/md/header.md').toString()),
issue: tangular.compile(readFileSync('templates/md/issue.md').toString()),
};
Object.keys(LABEL_WEIGHTS).forEach((issueLabel) => {
if (a.labels.indexOf(issueLabel) >= 0) {
weightA += LABEL_WEIGHTS[issueLabel];
}
logger.log('Compiled templates.');
if (b.labels.indexOf(issueLabel) >= 0) {
weightB += LABEL_WEIGHTS[issueLabel];
}
});
return templates;
if (a.state === IssueState.CLOSED) {
weightA -= 10;
}
if (b.state === IssueState.CLOSED) {
weightB -= 10;
}
return weightB - weightA;
});
});
return Object.values(issuesByAssignee);
}
/**
@@ -261,9 +296,9 @@ export function getNextMeetingDay() {
* @param api GitLab API to make requests with
* @param projects List of projects
*/
export async function getMergeRequestsForProjects(api: Api,
projects: Project[]): Promise<MergeRequestData> {
const projectMergeRequests: MergeRequestData = {};
export async function getMergeRequests(api: Api,
projects: Project[]): Promise<MergeRequestsForProjects> {
const projectMergeRequests: MergeRequestsForProjects = {};
// iterate over projects
await asyncPool(2, projects, async (project) => {
@@ -292,72 +327,41 @@ export async function getMergeRequestsForProjects(api: Api,
return projectMergeRequests;
}
export async function generateReport(api: Api, label: string): Promise<string> {
const templates = compileTemplates();
/**
* Generate a report
*
* @param api GitLab API to make requests with
* @param label Label to generate report for
* @param template Template to generate report with
*/
export async function generateReport(api: Api, label: string, template: string): Promise<string> {
const issuesGroupedByAssignee = await getIssuesGroupedByAssignees(api, label);
const groupIds: number[] = [];
groupIds.push.apply(groupIds, GROUPS);
groupIds.push.apply(groupIds, (await getSubGroups(api, GROUPS)).map((group) => group.id));
const structureForTemplate: StructureForTemplate = {
issuesByAssignee: issuesGroupedByAssignee,
meetingDay: getNextMeetingDay(),
};
logger.log(`Getting data for ${groupIds.length} group(s).`);
const projects = await getProjects(api, groupIds);
const issues = await getIssues(api, label);
const issuesGroupedByAssignee = groupIssuesByAssignee(issues);
const issueBranches = await getIdsOfIssuesWithBranchesForProjects(api, projects);
const mergeRequests = await getMergeRequestsForProjects(api, projects);
let markdown = templates.header();
Object.keys(issuesGroupedByAssignee).forEach((_assigneeId) => {
const assigneeId = parseInt(_assigneeId, 10);
markdown += templates.assigneeHeader(issuesGroupedByAssignee[assigneeId]);
issuesGroupedByAssignee[assigneeId].issues.sort((a, b) => {
let weightA = 0;
let weightB = 0;
Object.keys(LABEL_WEIGHTS).forEach((issueLabel) => {
if (a.labels.indexOf(issueLabel) >= 0) {
weightA += LABEL_WEIGHTS[issueLabel];
}
if (b.labels.indexOf(issueLabel) >= 0) {
weightB += LABEL_WEIGHTS[issueLabel];
}
});
if (a.state === IssueState.CLOSED) {
weightA -= 10;
}
if (b.state === IssueState.CLOSED) {
weightB -= 10;
}
return weightB - weightA;
}).forEach((issue) => {
markdown += issueToString(
issue,
issueBranches,
mergeRequests,
templates.issue,
);
});
markdown += templates.assigneeFooter(issuesGroupedByAssignee[assigneeId]);
});
return markdown;
return render(
template,
structureForTemplate,
);
}
/**
* Generate a markdown report
*
* @param api GitLab API to make requests with
* @param label Label to generate report for
*/
export async function report(api: Api, label: string) {
const meetingDay = getNextMeetingDay();
const markdown = generateReport(api, label);
const markdown = await generateReport(
api,
label,
(await readFilePromisified(resolve(__dirname, '..', '..', 'templates', 'report.md.mustache'))).toString(),
);
let filename = join(cwd(), 'reports', meetingDay + '.md');
@@ -365,7 +369,7 @@ export async function report(api: Api, label: string) {
filename = join(cwd(), 'reports', `${label}.md`);
}
await asyncWriteFile(filename, markdown);
await writeFilePromisified(filename, markdown);
logger.ok(`Wrote file '${filename}'.`);
}

View File

@@ -1,2 +0,0 @@

View File

@@ -1,8 +0,0 @@
## <img src="{{ assignee.avatar_url }}" height="30" /> {{ assignee.name }}
### open: {{ issueCounts.opened }}, closed: {{ issueCounts.closed }}
quota closed: {{ quota }}%
| __title__ | __status__ | __project__ | __weeks__ |
| --- | --- | --- | --- |

View File

@@ -1 +0,0 @@
# Meeting {{ meetingDay }}

View File

@@ -1 +0,0 @@
| __[{{ if issue.state !== 'closed' }} {{ issue.title }} {{ else }} ~~{{ issue.title }}~~ {{ fi }}]({{ issue.web_url }})__<br />__Labels:__ {{ issue._labels }} | {{ if branchExists }} <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" /> {{ fi}} {{ if mergeRequestUrl !== undefined }} <a href="{{ mergeRequestUrl }}"> <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/> </a> {{ fi }} | [{{ project }}](https://gitlab.com/{{ project }}) | {{ weeksOpen }} |

View File

@@ -0,0 +1,14 @@
# Meeting {{meetingDay}}
{{#issuesByAssignee}}
## {{#assignee.avatar_url}}<img src="{{&assignee.avatar_url}}" height="30"/> {{/assignee.avatar_url}}{{assignee.name}}
### open: {{issueCounts.opened}}, closed: {{issueCounts.closed}}
quota closed: {{quota}}%
| __title__ | __status__ | __project__ | __weeks__ |
| --- | --- | --- | --- |
{{#issues}}| __[{{title}}]({{&web_url}})__<br />__Labels:__ {{$labels}} | {{#$branchExists}}<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />{{/$branchExists}}{{#$mergeRequestUrl}}[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>]({{&$mergeRequestUrl}}){{/$mergeRequestUrl}} | [{{$project}}](https://gitlab.com/{{&$project}}) | {{$weeksOpen}} |
{{/issues}}
{{/issuesByAssignee}}