A small Jupyter notebook to analyse a Friendica milestone and the associated label in the addon repository for release note and CHANGELOG preparation.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

705 lines
287 KiB

1 year ago
  1. {
  2. "cells": [
  3. {
  4. "cell_type": "markdown",
  5. "metadata": {},
  6. "source": [
  7. "# CHANGELOG generation and Milestone analysis\n",
  8. "\n",
  9. "This script is here to make the process of generating and updating the `CHANGELOG` file of the [Friendica](https://friendi.ca) project more easy. The script will call the `github` API and collect all the nexxessary information from the Milestone and then sums them up in numbers and prefilled text blocks that can be used for the release notes and CHANGELOG file.\n",
  10. "\n",
  11. "## Usage\n",
  12. "\n",
  13. "1. Create an access token in your github account and save it in the file `token.txt` next to this jupyter notebook\n",
  14. "2. Change the `milestone` variable to the correct integer identification value from the github milestone page and let all cells of the jupyter notebook run.\n",
  15. "\n",
  16. "**Note** the script will not automatically generate the `CHANGELOG` section for the release. Instead it will summerize the work done during the milestone to make the manual work less cumbersome to create the section.\n",
  17. "\n",
  18. "## Author\n",
  19. "\n",
  20. "* Tobias Diekershoff <tobias.diekershoff@gmx.net>\n",
  21. "\n",
  22. "## License (MIT / Expat style)\n",
  23. "\n",
  24. "Copyright (c) 2019, Tobias Diekershoff\n",
  25. "\n",
  26. "Permission is hereby granted, free of charge, to any person obtaining a copy\n",
  27. "of this software and associated documentation files (the \"Software\"), to deal\n",
  28. "in the Software without restriction, including without limitation the rights\n",
  29. "to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n",
  30. "copies of the Software, and to permit persons to whom the Software is\n",
  31. "furnished to do so, subject to the following conditions:\n",
  32. "\n",
  33. "The above copyright notice and this permission notice shall be included in all\n",
  34. "copies or substantial portions of the Software.\n",
  35. "\n",
  36. "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n",
  37. "IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n",
  38. "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n",
  39. "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n",
  40. "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n",
  41. "OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n",
  42. "SOFTWARE."
  43. ]
  44. },
  45. {
  46. "cell_type": "code",
  47. "execution_count": 108,
  48. "metadata": {},
  49. "outputs": [],
  50. "source": [
  51. "from github import Github\n",
  52. "from matplotlib import pylab as plt\n",
  53. "import seaborn as sns\n",
  54. "sns.set_style(\"darkgrid\")\n",
  55. "pal = sns.color_palette(\"husl\", 16)\n",
  56. "from wordcloud import WordCloud"
  57. ]
  58. },
  59. {
  60. "cell_type": "code",
  61. "execution_count": 109,
  62. "metadata": {},
  63. "outputs": [],
  64. "source": [
  65. "# get github token from token.txt file\n",
  66. "with open('./token.txt','r') as file:\n",
  67. " ghtoken = file.readline().strip()\n",
  68. "# current milestone\n",
  69. "milestone = 18\n",
  70. "# types of issues\n",
  71. "bugfixes = []\n",
  72. "enhancements = []\n",
  73. "newfeatures = []\n",
  74. "addonstuff = []\n",
  75. "translation = []\n",
  76. "closedissues = []\n",
  77. "closedtitles = []\n",
  78. "prcount = 0\n",
  79. "issuecount = 0\n",
  80. "alllabels = {}\n",
  81. "allcontributors = {}\n",
  82. "titlewords = []"
  83. ]
  84. },
  85. {
  86. "cell_type": "code",
  87. "execution_count": 110,
  88. "metadata": {},
  89. "outputs": [],
  90. "source": [
  91. "# and login\n",
  92. "gh = Github(ghtoken)\n",
  93. "# open the friendica repository\n",
  94. "repo = gh.get_repo('friendica/friendica')\n",
  95. "ms = repo.get_milestone(milestone)\n",
  96. "addonlabel = ms.title"
  97. ]
  98. },
  99. {
  100. "cell_type": "markdown",
  101. "metadata": {},
  102. "source": [
  103. "## Friendica Core Repository\n",
  104. "\n",
  105. "### Some basic stats"
  106. ]
  107. },
  108. {
  109. "cell_type": "code",
  110. "execution_count": 111,
  111. "metadata": {},
  112. "outputs": [
  113. {
  114. "name": "stdout",
  115. "output_type": "stream",
  116. "text": [
  117. "Milestone State: open\n",
  118. "Open / Close Issue: 11/241\n"
  119. ]
  120. }
  121. ],
  122. "source": [
  123. "print('Milestone State: {}\\nOpen / Close Issue: {}/{}'.format(ms.state, ms.open_issues, ms.closed_issues))"
  124. ]
  125. },
  126. {
  127. "cell_type": "markdown",
  128. "metadata": {},
  129. "source": [
  130. "Now grap all issues of the milestone and sort them.\n",
  131. "\n",
  132. "* are they issues or pull requests\n",
  133. "* bug fixes, new features or enhancements\n",
  134. "\n",
  135. "also collect the issue numbers of the (real) issues that got closed."
  136. ]
  137. },
  138. {
  139. "cell_type": "code",
  140. "execution_count": 112,
  141. "metadata": {
  142. "scrolled": false
  143. },
  144. "outputs": [],
  145. "source": [
  146. "# get the \"issues\" from the milestone. Seperate pull requests from fixed issues and analyse them a bit.\n",
  147. "for issue in repo.get_issues(milestone=ms, state='all'):\n",
  148. " ititle = issue.title\n",
  149. " titlewords.append(ititle)\n",
  150. " iauthor = issue.user.login\n",
  151. " lnames = []\n",
  152. " itype = ''\n",
  153. " for label in issue.labels:\n",
  154. " lnames.append(label.name)\n",
  155. " try:\n",
  156. " pr_url = issue.pull_request.html_url\n",
  157. " # This issue is actually a pull request\n",
  158. " itype = 'PR'\n",
  159. " prcount += 1\n",
  160. " if ('Bug' in lnames):\n",
  161. " bugfixes.append(ititle+' [{}] by {}'.format(\", \".join(lnames), iauthor))\n",
  162. " if ('Addons' in lnames):\n",
  163. " addonstuff.append(ititle+' [{}] by {}'.format(\", \".join(lnames), iauthor))\n",
  164. " if ('Translation' in lnames):\n",
  165. " translation.append(ititle+' [{}] by {}'.format(\", \".join(lnames), iauthor))\n",
  166. " if ('New Feature' in lnames):\n",
  167. " newfeatures.append(ititle+' [{}] by {}'.format(\", \".join(lnames), iauthor))\n",
  168. " if ('Enhancement' in lnames):\n",
  169. " enhancements.append(ititle+' [{}] by {}'.format(\", \".join(lnames), iauthor))\n",
  170. " allcontributors[iauthor] = allcontributors.get(iauthor, 0) + 1\n",
  171. " for l in lnames:\n",
  172. " alllabels[l] = alllabels.get(l, 0) + 1\n",
  173. " except:\n",
  174. " # this issue is actually an issue\n",
  175. " itype = 'ISSUE'\n",
  176. " issuecount += 1\n",
  177. " if issue.state == 'closed':\n",
  178. " closedissues.append(int(issue.number))\n",
  179. " closedtitles.append(ititle)\n",
  180. "closedissues.sort()"
  181. ]
  182. },
  183. {
  184. "cell_type": "markdown",
  185. "metadata": {},
  186. "source": [
  187. "### Closed Issues\n",
  188. "\n",
  189. "First of all, number countings."
  190. ]
  191. },
  192. {
  193. "cell_type": "code",
  194. "execution_count": 113,
  195. "metadata": {
  196. "scrolled": false
  197. },
  198. "outputs": [
  199. {
  200. "name": "stdout",
  201. "output_type": "stream",
  202. "text": [
  203. "\n",
  204. "\n",
  205. "Total: Pull Requests / Issues: 190 / 62\n"
  206. ]
  207. }
  208. ],
  209. "source": [
  210. "print('\\n\\nTotal: Pull Requests / Issues: {} / {}'.format(prcount, issuecount))"
  211. ]
  212. },
  213. {
  214. "cell_type": "code",
  215. "execution_count": 114,
  216. "metadata": {},
  217. "outputs": [
  218. {
  219. "name": "stdout",
  220. "output_type": "stream",
  221. "text": [
  222. "[989, 1071, 1188, 1334, 2537, 3229, 3231, 3385, 4112, 4442, 4451, 5048, 5568, 5802, 6865, 7190, 7308, 7316, 7418, 7613, 7657, 7659, 7671, 7679, 7681, 7682, 7688, 7691, 7702, 7707, 7709, 7718, 7733, 7740, 7747, 7756, 7766, 7773, 7776, 7778, 7781, 7821, 7825, 7834, 7863, 7868, 7880, 7888, 7902, 7914, 7920, 7946, 7953]\n",
  223. "\n",
  224. "====================\n",
  225. "Issue Titles\n",
  226. "====================\n",
  227. "[frio] Self contact hovercard shouldn’t show follow and private message action buttons\n",
  228. "frio: visual glitch with 'active tab indicator' on .../contact/123456\n",
  229. "[API] Rewrite followers/ids and friends/ids to output expected data\n",
  230. "Resharing a Mastodon post truncates body, breaks share display\n",
  231. "[frio] Composer Modal jot new permission tab doesn't show connectors\n",
  232. "addon: js_upload sets wrong permission on uploaded images\n",
  233. "Upload of images broken when 'js_upload' is used\n",
  234. "federation with pixelfed - images missing on incoming posts\n",
  235. "Missing/Broken client API\n",
  236. "frio: Post display doesn't reload after (un)ignoring it\n",
  237. "Registration broken with policy approval\n",
  238. "Admin Summary - one line too much\n",
  239. "Compose page of frio theme on dev results in blank screen\n",
  240. "Personal notes are public when posted from non-Composer jot\n",
  241. "Home Notifications page is showing wrong notifications\n",
  242. "Resharing Mastodon post removes embedded video\n",
  243. "Reshare a Friendica post from Diaspora to Friendica removes title\n",
  244. "Log file without write access leads to white screen\n",
  245. "Inserting images broken\n",
  246. "[frio] Follow button affected by whether they follow me\n",
  247. "Search field doesn't show results and deleting a saved search doesn't work\n",
  248. "Browser language isn't used when user is not logged in\n",
  249. "Password reset doenst work\n",
  250. "[vier] Default theme settings page is blank\n",
  251. "Contact requests from Diaspora on News Page Accounts are wrong/misleading\n",
  252. "ActivityPub: using sharedInbox for private deliveries can leak privacy\n",
  253. "Enhancements for account registration (Captcha/HoneyPot/Comment field)\n",
  254. "[Frio] Better \"Insert Link\" button\n",
  255. "2019.09 PHP Notices\n",
  256. "Can't see restricted posts on remote profile if the remote profile is on the same instance\n",
  257. "Frio: Feature requests for the new composer page\n",
  258. "/contact/blocked needs to show public contact blocks as well\n",
  259. "Rework \"redir\" and calls to \"remote_user\"\n",
  260. "Delete notifications for deleted items\n",
  261. "Problem mit Foren auf der gleichen Instanz\n",
  262. "Investigate `/contact` pages slowness\n",
  263. "Setting permissions on posts needs more secure workflow\n",
  264. "Replace defaults() with ??\n",
  265. "Category labels in posts are not clickable\n",
  266. "nodeinfo: needs extension for protocol activitypub\n",
  267. "Adding Code-Coverage to the Friendica code-base\n",
  268. "Sort saved folders alphabetically\n",
  269. "Diaspora: Image URLs with double \"http://\" throw BBCode off\n",
  270. "Drop unsecure OPENSSL_PKCS1_PADDING from openssl_private_decrypt()\n",
  271. "Feature: remote_self for OStatus contacts\n",
  272. "Logging in o registering via previously unknown OpenID should give the option to associate it with existing account\n",
  273. "OpenID URIs should be verified before allowing a user to register them\n",
  274. "Users are allowed to re-use OpenID of other users\n",
  275. "Frio: Missing functionality\n",
  276. "Possibilities to interact with others are hidden\n",
  277. "contact request: bad usability\n",
  278. "Addons: Jappix-mini: Replace error link to Jappix website with something more useful\n",
  279. "forced track user\n"
  280. ]
  281. }
  282. ],
  283. "source": [
  284. "print(closedissues)\n",
  285. "\n",
  286. "print('\\n====================\\nIssue Titles\\n====================')\n",
  287. "for i in closedtitles:\n",
  288. " print(i)"
  289. ]
  290. },
  291. {
  292. "cell_type": "markdown",
  293. "metadata": {},
  294. "source": [
  295. "### Issues by Labels"
  296. ]
  297. },
  298. {
  299. "cell_type": "code",
  300. "execution_count": 115,
  301. "metadata": {
  302. "scrolled": false
  303. },
  304. "outputs": [
  305. {
  306. "name": "stdout",
  307. "output_type": "stream",
  308. "text": [
  309. "\n",
  310. "\n",
  311. " >> Pull Requests merged\n",
  312. "\n",
  313. "=========================\n",
  314. "Addons (2)\n",
  315. "=========================\n",
  316. "Add \"discourse\" as protocol [Addons, New Feature] by annando\n",
  317. "Added hooks for the email fetch process [Addons, Enhancement] by annando\n",
  318. "\n",
  319. "=========================\n",
  320. "Translation (4)\n",
  321. "=========================\n",
  322. "DE, ET, JA, NL and PL translation updates [Translation] by tobiasd\n",
  323. "Fix run_xgettext.sh FRIENDICA_VERSION [Bug, Translation] by nupplaphil\n",
  324. "regen messages.po after Hackathon 2019 [Berlin 2019, Translation] by tobiasd\n",
  325. "CS translation update THX Aditoo [Translation] by tobiasd\n",
  326. "\n",
  327. "=========================\n",
  328. "Enhancements (103)\n",
  329. "=========================\n",
  330. "Issue 7659: Udate the \"user-contact\" value with the \"contact\" values [Enhancement] by annando\n",
  331. "Github Action: Merge to develop [Enhancement] by nupplaphil\n",
  332. "API: Improved handling of quoted posts and attachments [Enhancement, Federation] by annando\n",
  333. "Update Install.md [Docs, Enhancement] by copiis\n",
  334. "Issue 7651: Added basic support for more complicated \"video\" elements [Enhancement] by annando\n",
  335. "APContact: Added follower count, following count and count of posts [Enhancement, Federation] by annando\n",
  336. "API: Account class improved [API, Enhancement] by annando\n",
  337. "Make 2Factor \"tel\" field instead \"number\" [Enhancement, UI, UI/Theme] by nupplaphil\n",
  338. "Issue 7691: We can now switch to BCC for ActivityPub [Enhancement, Performance, Privacy] by annando\n",
  339. "Do reshares as native as possible [Enhancement, Federation] by annando\n",
  340. "Mail contacts: Update public via user contact / display owner's posts [Enhancement, Federation] by annando\n",
  341. "[frio] Add numeric field_input [Enhancement, UI/Theme] by nupplaphil\n",
  342. "Make Two Factor Field numeric [Enhancement, UI] by nupplaphil\n",
  343. "Add data for shared posts from the original [Enhancement] by annando\n",
  344. "Changed the option to enable the smart threading with the option to disable this [Enhancement, UX] by annando\n",
  345. "Make quoted announces look better / more announce improvements [Enhancement, Federation, UI] by annando\n",
  346. "Only show the difference between posting and receive date on difference [Enhancement, UX] by annando\n",
  347. "[Frio] Optical indicator for connector accordion added [Enhancement, UI, UI/Theme] by annando\n",
  348. "Group selection: Respect \"pubmail\" and ignore atchived or blocked contacts [Enhancement, Privacy] by annando\n",
  349. "API: Improve attachment removal functionality for the status text [API, Enhancement] by annando\n",
  350. "Disable drone except \"develop\" branch [Enhancement] by nupplaphil\n",
  351. "[frio/plusminus] Made Connectors on new composer popup more visible [Enhancement, UI/Theme] by hoergen\n",
  352. "Show the received date along with the creation date of posts [Enhancement] by annando\n",
  353. "Generalize the Compose ACL to the whole site [Enhancement] by MrPetovan\n",
  354. "Only transfer posts via mail [Enhancement, Federation] by annando\n",
  355. "nodeinfo version 2 / basic nodeinfo data is always enabled [Enhancement, Federation] by annando\n",
  356. "Don't allow unencrypted IMAP, allow deleting mails [Enhancement, Federation] by annando\n",
  357. "Avoid contact update for non federated networks [Enhancement] by annando\n",
  358. "Only read undeleted mails / improved structure [Enhancement] by annando\n",
  359. "E-Mail import: The item is now provided to the hook [Enhancement, Federation] by annando\n",
  360. "Use the \"reply-to\" header of the original post when answering via mail [Enhancement, Federation] by annando\n",
  361. "Don't use the creation date when transmitting to Diaspora [Enhancement, Federation] by annando\n",
  362. "Improvement for PR 7854: Avoid leaking of BCC header data [Enhancement, Federation] by annando\n",
  363. "composer Update to version 1.9.1 [Enhancement, Installation] by casperrutten\n",
  364. "Fix mail delivery via AP when the contact is hidden [Enhancement, Federation] by annando\n",
  365. "Storing the mail header in the item [Enhancement, Federation] by annando\n",
  366. "Added hooks for the email fetch process [Addons, Enhancement] by annando\n",
  367. "Make the automatic title appending optional [Enhancement, Federation] by annando\n",
  368. "Show title for posts with attached pages [Enhancement, Federation] by annando\n",
  369. "Improve the look of fetched feeds and the BBCode processing of attachments [Enhancement, Federation] by annando\n",
  370. "AP: Remove the link description from the \"rich html\" and adds it to the attachment [Enhancement, Federation] by annando\n",
  371. "Don't guess the site info / restrict the description length [Enhancement, Federation] by annando\n",
  372. "AP: Read different content types for the source and the content [Enhancement, Federation] by annando\n",
  373. "ActivityPub: Use the contentMap to transmit additional content encodings [Enhancement, Federation] by annando\n",
  374. "Fix image links with descriptions in API and AP transmission [Enhancement, Federation] by annando\n",
  375. "Remove unnecessary code in \"include/enotify\" [Enhancement] by nupplaphil\n",
  376. "Pinning now works as expected [Enhancement] by annando\n",
  377. "Pass Router parameters to module content method [Enhancement] by MrPetovan\n",
  378. "Pass the parameters from the router to the modules [Enhancement] by annando\n",
  379. "a hidden field for the registration form [Berlin 2019, Enhancement] by tobiasd\n",
  380. "categories of postings linked [Berlin 2019, Enhancement] by tobiasd\n",
  381. "Diaspora: Use the standard function for adding a relationship [Berlin 2019, Enhancement, Federation] by annando\n",
  382. "Plusminus Scheme for Frio improved contacts and visibility [Berlin 2019, Enhancement, UI, UI/Theme] by hoergen\n",
  383. "added export and import of followed contacts to and from CSV files [Berlin 2019, Enhancement] by tobiasd\n",
  384. "Changed label for network sorting [Berlin 2019, Enhancement] by annando\n",
  385. "AP: Respect \"manually approve\" during contact request [Berlin 2019, Enhancement, Federation] by annando\n",
  386. "Rework photo functions [Enhancement] by MrPetovan\n",
  387. "Posted order is now arrival order [Berlin 2019, Enhancement, UX] by annando\n",
  388. "Added usort() to the saved folders widget [Enhancement] by AlfredSK\n",
  389. "[Drone.io] Add node info for better routing [Enhancement] by nupplaphil\n",
  390. "Move Core\\NotificationsManager to Model\\Notify [Enhancement] by nupplaphil\n",
  391. "Images: Show the description as title [Enhancement, UX] by annando\n",
  392. "Move Activity definitions to constants [Docs, Enhancement] by nupplaphil\n",
  393. "Changed OpenID registration [Bug, Enhancement, Federation] by annando\n",
  394. "Move include/text.php to class structure [Enhancement] by nupplaphil\n",
  395. "move mod/ignored to src/Module/Item/Ignored [Enhancement] by nupplaphil\n",
  396. "Move mod/receive to src/Module/Diaspora/Receive [Enhancement] by nupplaphil\n",
  397. "Reworked gcontact [Enhancement] by annando\n",
  398. "Some improvements for accessibility - I hope [Enhancement, UX] by annando\n",
  399. "Handling for HTTP Error code 417 [Enhancement] by annando\n",
  400. "Change Model type to `OrderedCollectionPage` [Enhancement, Federation] by kPherox\n",
  401. "[frio] Rework hovercard actions [Bug, Enhancement, UI/Theme, UX] by MrPetovan\n",
  402. "Clarify quotation style in doc/Developers-Intro [Docs, Enhancement] by MrPetovan\n",
  403. "Remove deprecated defaults() function [Enhancement] by MrPetovan\n",
  404. "Replace deprecated calls to defaults() by ?? and ?: in src/ [Enhancement] by MrPetovan\n",
  405. "Replace deprecated defaults() calls by ?? and ?: operators in src/Module/ [Enhancement] by MrPetovan\n",
  406. "Replace deprecated defaults() calls by a combination of ?? and ?: operators in mod/ [Enhancement] by MrPetovan\n",
  407. "Changed quotation (\" to ') [Enhancement] by annando\n",
  408. "Convert links with empty descriptions [Enhancement, UX] by annando\n",
  409. "Replace deprecated defaults() calls in include/api and boot [Enhancement] by MrPetovan\n",
  410. "Discriminate between links and non-links in [url] BBCode tag insertion [Enhancement, UX] by MrPetovan\n",
  411. "Move mod/manage to src/Module/Delegation [Enhancement] by MrPetovan\n",
  412. "move uexport module to src [Berlin 2019, Enhancement] by tobiasd\n",
  413. "Fix security vulnerabilities. [Enhancement, Security] by nathilia-peirce\n",
  414. "Move mod/delegate to src/Module/Settings/Delegation [Enhancement] by MrPetovan\n",
  415. "Move mod/search to src/Module/Search/Index [Enhancement] by MrPetovan\n",
  416. "Fix communication issues with systems that speak both AP and Diaspora [Enhancement, Federation] by annando\n",
  417. "Some added logging to the proxy functionality to better analyze problems [Enhancement] by annando\n",
  418. "Fix for multiline host-meta, reducement of requests, fix for wordpress [Enhancement] by annando\n",
  419. "Rework theme session variables [Enhancement] by MrPetovan\n",
  420. "add server side check about note to admin [Enhancement] by tobiasd\n",
  421. "Replace obsolete functionality in \"PortableContact\" [Enhancement] by annando\n",
  422. "modified Vagrant devel VM (PHP 7.3, proper composer) [Enhancement] by tobiasd\n",
  423. "New class \"GServer\" [Enhancement] by annando\n",
  424. "Move mod/acl to src/Module/Search/Acl [Enhancement] by MrPetovan\n",
  425. "Remove obsolete function to guess the base url of a contact [Enhancement] by annando\n",
  426. "add option 'require' for textarea form elements [Enhancement, UI] by tobiasd\n",
  427. "Enable the possibility to fetch a specific header variable [Enhancement] by annando\n",
  428. "Don't send blank pictures on error, fail instead. [Enhancement, UX] by annando\n",
  429. "Reworked the remote authentication [Bug, Enhancement] by annando\n",
  430. "Add router config [Enhancement] by nupplaphil\n",
  431. "Adding drone as CI [Enhancement] by nupplaphil\n",
  432. "Frio upgrade fontawesome [Enhancement, UI/Theme] by vinzv\n",
  433. "\n",
  434. "=========================\n",
  435. "Fixes (75)\n",
  436. "=========================\n",
  437. "Add type-hint to debug null value fatal error [Bug] by MrPetovan\n",
  438. "Fix wrong type-hints for table parameter in Database->selectToArray and DBA::selectToArray [Bug] by MrPetovan\n",
  439. "Add meaningful sorter to ACL autocomplete [Bug, UX] by MrPetovan\n",
  440. "Issue 7953: Don't show follow on the hovercard for the \"self\" contact [Bug] by annando\n",
  441. "Fix notice \"Undefined index: href\" [Bug] by annando\n",
  442. "Fixed warning [Bug] by annando\n",
  443. "Restore correct highlighted contact tabs [Bug, UI/Theme, UX] by MrPetovan\n",
  444. "Return early if user.uid isn't present in ACL::getFullSelectorHTML [Bug] by MrPetovan\n",
  445. "Escape potential URL-containing BBCodes before running autolinker [Bug, UX] by MrPetovan\n",
  446. " Add relationship filter to api_friends_ids and api_followers_ids [API, Bug] by MrPetovan\n",
  447. "Don't process empty hash tags in Model\\Item [Bug] by MrPetovan\n",
  448. "Log a message when data isn't the expected type in GContact::updateFromOutbox [Bug] by MrPetovan\n",
  449. "Fix phpunit exclude list [Bug, Performance] by nupplaphil\n",
  450. "Issue 7613: When an item is deleted, delete all notifications for it [Bug, UX] by annando\n",
  451. "Issue 7418: connections to forums should now work again [Bug, Federation] by annando\n",
  452. "Fix a notice [Bug] by annando\n",
  453. "Fix: Don't automatically mention a post creator on private posts [Bug, Privacy] by annando\n",
  454. "Fixes issue 7914: Reshares got crumbled [Bug, UX] by annando\n",
  455. "Allow contacts and groups with same ID in ACL selector [Bug, UX] by MrPetovan\n",
  456. "ACL: Contact list is now sorted, forums reappeared [Bug, UX] by annando\n",
  457. "Fix a notice about an undefined \"attach\" index [Bug] by annando\n",
  458. "Restore correct test for hidewall in ACL::getFullSelectorHTML [Bug] by MrPetovan\n",
  459. "Fix run_xgettext.sh FRIENDICA_VERSION [Bug, Translation] by nupplaphil\n",
  460. "Fix warnings about unexpected parameter array values type in ACL::getFullSelectorHTML [Bug] by MrPetovan\n",
  461. "Themes are now saved just once [Bug] by nupplaphil\n",
  462. "Restore post reload after (un)ignore [Bug, UX] by MrPetovan\n",
  463. "Various ACL/jot fixes [Bug, UI/Theme, UX] by MrPetovan\n",
  464. "Fix ACL-related warnings [Bug] by MrPetovan\n",
  465. "Attached photos from pixelfed are now added to the body again [Bug, Federation] by annando\n",
  466. "Fix a notice in gcontact.php [Bug] by annando\n",
  467. "Notice/warning in event fixed [Bug] by annando\n",
  468. "Fix some notices/warnings again [Bug] by annando\n",
  469. "Fix further notes and warnings [Bug] by annando\n",
  470. "Fix warnings [Bug] by annando\n",
  471. "Fix fatal errors, caused by an empty \"verb\" [Bug] by annando\n",
  472. "Update vagrant_provision.sh [Bug, Installation] by casperrutten\n",
  473. "Fix: Mentions in the HTML part of the \"contentMap\" now are links [Bug, Federation] by annando\n",
  474. "User account page flags is stored as 255 [Bug] by MrPetovan\n",
  475. "Fix a notice [Bug] by annando\n",
  476. "add missing template for userexport [Berlin 2019, Bug, UI/Theme] by tobiasd\n",
  477. "Add missing quotation [Berlin 2019, Bug] by tobiasd\n",
  478. "move link generation into the loop [Berlin 2019, Bug] by tobiasd\n",
  479. "Another duplicated \"use\" removed [Berlin 2019, Bug] by annando\n",
  480. "Removed duplicated \"use system\" [Berlin 2019, Bug] by annando\n",
  481. "Fix/FollowUp ACLFormatter [Bug] by nupplaphil\n",
  482. "Some more warnings removed [Bug] by annando\n",
  483. "Solve warning [Bug] by annando\n",
  484. "Fix several warnings and errors [Bug] by annando\n",
  485. "Fix 7778: Don't return empty string in permissions [Bug] by annando\n",
  486. "Fix wrong check for logfile in admin summary [Bug] by nupplaphil\n",
  487. "Revert \"Add not null/default value for ACL in fields\" [Bug] by nupplaphil\n",
  488. "Fix travis - Remove APCu setting for PHP 7.2/7.3 [Bug] by nupplaphil\n",
  489. "Check null for acl-fields [Bug] by nupplaphil\n",
  490. "Wrong condition for home notifications [Bug] by nupplaphil\n",
  491. "(hopefully) fix preview issue with tags on Mastodon [Bug] by annando\n",
  492. "Changed OpenID registration [Bug, Enhancement, Federation] by annando\n",
  493. "[composer] Downgrade dependencies [Bug] by nupplaphil\n",
  494. "Expect outbox->first to be a Link structure in Model\\GContact [Bug, Federation] by MrPetovan\n",
  495. "Add Fallback in case the logfile isn't accessible. [Bug] by nupplaphil\n",
  496. "Fix fatal error [Bug] by annando\n",
  497. "Fix: Friendica contacts had falsely been detected as ActivityPub [Bug, Federation] by annando\n",
  498. "Remove remaining Logger log level in explicit Logger::debug call [Bug] by MrPetovan\n",
  499. "[frio] Rework hovercard actions [Bug, Enhancement, UI/Theme, UX] by MrPetovan\n",
  500. "Prevent empty [url] label regular expression to break image insertion [Bug, UX] by MrPetovan\n",
  501. "Saved Search fixes [Bug] by MrPetovan\n",
  502. " Catch missing Certainty bundle exception when checking for exposed password [Bug, UX] by MrPetovan\n",
  503. "Strings.php: Spaces are transformed to Tabs [Bug] by annando\n",
  504. "Fix typo in Core\\Authentication [Bug] by MrPetovan\n",
  505. "Complete L10n::detectLanguage call parameters in Module\\Register [Bug] by MrPetovan\n",
  506. "Fix browser language detection [Bug, UX] by nupplaphil\n",
  507. "The getGUID function hadn't fetched the GUID from pictures with scale \"0\" [Bug] by annando\n",
  508. "[vier] Add necessary required_once statement in theme/vier/config.php [Bug] by MrPetovan\n",
  509. "Fix notice \"Undefined index: openRegistrations\" [Bug] by annando\n",
  510. "Critical Fix: Inbox needs to be accessed via POST [Bug] by annando\n",
  511. "Reworked the remote authentication [Bug, Enhancement] by annando\n",
  512. "\n",
  513. "=========================\n",
  514. "New Features (8)\n",
  515. "=========================\n",
  516. "[API] Provide post/contact search [API, New Feature] by MrPetovan\n",
  517. "Add POST follow request Mastodon API endpoint [API, New Feature] by MrPetovan\n",
  518. "API: Added endpoints /instance and /instance/peers [API, New Feature] by annando\n",
  519. "Add GET /api/v1/follow_requests Mastodon API endpoint [API, Docs, New Feature] by MrPetovan\n",
  520. "Discourse logo added [Federation, New Feature] by annando\n",
  521. "Add \"discourse\" as protocol [Addons, New Feature] by annando\n",
  522. "Pinning: Missing file added [New Feature] by annando\n",
  523. "We can now pin posts [Berlin 2019, New Feature] by annando\n"
  524. ]
  525. }
  526. ],
  527. "source": [
  528. "print('\\n\\n >> Pull Requests merged')\n",
  529. "print('\\n=========================\\nAddons ({})\\n========================='.format(len(addonstuff)))\n",
  530. "for i in addonstuff:\n",
  531. " print(i)\n",
  532. "print('\\n=========================\\nTranslation ({})\\n========================='.format(len(translation)))\n",
  533. "for i in translation:\n",
  534. " print(i)\n",
  535. "print('\\n=========================\\nEnhancements ({})\\n========================='.format(len(enhancements)))\n",
  536. "for i in enhancements:\n",
  537. " print(i)\n",
  538. "print('\\n=========================\\nFixes ({})\\n========================='.format(len(bugfixes)))\n",
  539. "for i in bugfixes:\n",
  540. " print(i)\n",
  541. "print('\\n=========================\\nNew Features ({})\\n========================='.format(len(newfeatures)))\n",
  542. "for i in newfeatures:\n",
  543. " print(i)"
  544. ]
  545. },
  546. {
  547. "cell_type": "markdown",
  548. "metadata": {},
  549. "source": [
  550. "## Addon Repository\n",
  551. "\n",
  552. "Here is a list of closed pull requests from the addon repository.\n",
  553. "\n",
  554. "Issues with addons are handled in the core repository, listed above in the *Addons* section of the report."
  555. ]
  556. },
  557. {
  558. "cell_type": "code",
  559. "execution_count": 116,
  560. "metadata": {},
  561. "outputs": [
  562. {
  563. "name": "stdout",
  564. "output_type": "stream",
  565. "text": [
  566. "DE and ET translation updates by tobiasd\n",
  567. "[various] Use correct object class for Oauth token by MrPetovan\n",
  568. "Issue 7916: Buffer is unsupported now by annando\n",
  569. "Bump symfony/cache from 3.4.8 to 3.4.36 in /advancedcontentfilter by dependabot[bot]\n",
  570. "[js_upload] Restore public image upload by MrPetovan\n",
  571. "[js_upload] Rewrite addon after ACL changes by MrPetovan\n",
  572. "Discourse Addon by annando\n",
  573. "CA translation pack by tobiasd\n",
  574. "[remote_permissions] Fix ACLFormatterTest by nupplaphil\n",
  575. "Added logging to twitter addon by annando\n",
  576. "Check null for acl-fields by nupplaphil\n",
  577. "CA translation updated THX obiolscat by tobiasd\n",
  578. "added editorconfig file by tobiasd\n",
  579. "[forumdirectory] Remove direct access to $_SESSION['theme'] by MrPetovan\n",
  580. "[xmpp] Rename /manage module to /delegation by MrPetovan\n",
  581. "[various] Replace deprecated defaults() calls by ?? operator by MrPetovan\n",
  582. "[retriever] First submission of retriever plugin by mexon\n",
  583. "[gnot] Make settings collapsible by tobiasd\n",
  584. "[mailstream] Support new img format with alt text by mexon\n",
  585. "[mailstream] Remove URL parameters when extracting image filenames by mexon\n",
  586. "[mailstream] Include BB code as plaintext by mexon\n",
  587. "[mailstream] Do not send \"announce\" messages by mexon\n",
  588. "[mailstream] Modernise logging in mailstream plugin by mexon\n"
  589. ]
  590. }
  591. ],
  592. "source": [
  593. "repo = gh.get_repo('friendica/friendica-addons')\n",
  594. "labels = []\n",
  595. "try:\n",
  596. " labels.append(repo.get_label(addonlabel))\n",
  597. " issues = repo.get_issues(labels=labels, state='closed')\n",
  598. " for i in issues:\n",
  599. " print(\"{} by {}\".format(i.title, i.user.login))\n",
  600. " titlewords.append(i.title)\n",
  601. " allcontributors[i.user.login] = allcontributors.get(i.user.login, 0) + 1\n",
  602. "except:\n",
  603. " print(\"No pull requests with the label {} found in the addon repository.\".format(addonlabel))"
  604. ]
  605. },
  606. {
  607. "cell_type": "markdown",
  608. "metadata": {},
  609. "source": [
  610. "## Graphs\n",
  611. "\n",
  612. "Lets make some bar charts for the number counts of the used labels and the contributors to the repository."
  613. ]
  614. },
  615. {
  616. "cell_type": "code",
  617. "execution_count": 119,
  618. "metadata": {
  619. "scrolled": false
  620. },
  621. "outputs": [
  622. {
  623. "data": {
  624. "image/png": "iVBORw0KGgoAAAANSUhEUgAAA3cAAAKnCAYAAAAlerSNAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzs3XmcV3Wh//E3DjMspZIpLuSS5OACIyjiGihqkoW4YHlTIXdxX3K5N3fNTM0ry3VD08DlmgrXJdNy40omiQvl+hO1XBJBvCjJPn5/fxiTIyDojI1+fD7/8THnnO85n/Od8fv4vjhbq0qlUgkAAACfa8u19AAAAABoOnEHAABQAHEHAABQAHEHAABQAHEHAABQAHEHAABQAHEHFGf48OHp0qVLxowZ86ms95577mnW9U6YMCFdunTJT37yk2Zd72fRNddcs0y/m8/qezJmzJh06dIl11xzTcO0Ll26ZMCAAZ/6tmfOnJlrr732U99Oc3ryySdz2GGHZfPNN0/Xrl2zww475MILL8ysWbMWWXb27Nm5+OKLs+OOO6auri4777xzrrvuuiztiU1vvPFGNt1000a/kw969913c+GFF6Zv376pq6tLv379cvnll2fu3LmfaJ+eeeaZbLTRRkv8HJg2bVpOO+209OnTJ127ds3WW2+dH/3oR3nllVc+0fYAPg5xB8BnTqdOnXLEEUfkm9/8ZksPpZENNtggRxxxRLp37/4v3/ZOO+2Um2666V++3U/q4Ycfzl577ZX//d//zTbbbJN99903HTp0yMiRIzNo0KBGcVVfX5+jjz46l156ab7+9a9n0KBBad26dc4666ycf/75S9zGu+++myOPPDJ///vfFzt/9uzZGTRoUEaOHJn27dtnr732yjrrrJOLLrooBx54YObMmfOx9mnatGk56qijsmDBgiXO33PPPXPjjTemc+fO2XfffdOtW7fccccdGThwYP7yl798rO0BfFytW3oAAPBhX/va13LkkUe29DAWscEGG2SDDTZokW1Pnz49q6yySots+5M488wzU6lUcsMNN6Suri5JUqlUctppp+VXv/pVrr/++uy3335JkjvvvDPjxo3L/vvvn5NOOilJcvTRR+fAAw/M1VdfnV133TVdunRptP7XXnstRx55ZJ566qkljuHKK6/Mk08+mR133DEXXXRRampqkiTXXXddzjrrrIwcOXKZ/86effbZHHHEER95BG748OF5/fXXc/LJJzfsW5LceuutOfHEE3PeeeflsssuW6btAXwSjtwBAM1q8uTJefHFF7P99ts3hF2StGrVKocffniS5H//938bpl933XVp3bp1Dj300IZp1dXVOeaYY1KpVHLzzTc3Wv8111yT/v3759lnn80WW2yxxHH8+te/TqtWrXLqqac2hF2S/OAHP8g666yTa6+9dolH4T7o/PPPz8CBAzNt2rRsuummS1zunnvuyUorrZTBgwc3mj5gwICstdZaGT9+fN57772lbg/gkxJ3wBfea6+9ltNPPz077LBDunXrlh49emT33XfPDTfcsNjl58yZk3PPPTdbbrllunfvnn333TcTJkxY7LK/+c1vstdee6VHjx7ZZJNNMnjw4Dz88MNLHdOCBQsyYsSI9O/fP927d0+vXr1ywAEH5A9/+MNSX/tR16udfPLJ6dKlS5555pmGaX/9619z9NFHZ7vttkvXrl3Tt2/fnHHGGZk2bdoir3/qqacarqGqq6vLgAEDcsMNNyz2uqh77rkn3//+99O9e/f06dMnl1566TJ/sV3cPuy7777p27dvpkyZkuOPPz6bb755Nt544+y9995LfP8/6NVXX02XLl1yySWX5Le//W1222231NXVpW/fvrn66quTJI8++mh+8IMfpHv37unbt2+GDx/e6Mv/4q65W5yFR6wWbmOzzTbLoYcemqeffnqRZcePH5/Bgwdnyy23TF1dXfr375/LL7888+bNa/ReJO8fPerSpUuGDx/e8PqXXnopP/rRj7LVVls1XNd2/vnnZ+bMmY22s/B3//bbb+f000/P1ltvnW7dumX33XfP3Xffvci45s2bl8svvzw777xzunXrli233DLHH3/8Ml079uUvfzk/+tGPssceeywyb2FkLbzubt68efnzn/+c9ddfPyuuuGKjZevq6tKuXbs88sgjjaaPGjUqnTp1yrXXXvuR1zu++uqrWWONNbLqqqs2mt6qVat06dIlM2bMyAsvvLDU/bnqqqvSrVu3jBkzJltuueVil6mvr88hhxySI444Isstt+jXq5qamsyfP3+ZYhLgk3JaJvCF9uqrr2bgwIGZPXt2dtxxx6y++up54403cvfdd+eMM85IfX199tlnn0avOe+88zJ//vx897vfzbvvvpu77ror++23Xy655JJsu+22DcsNHTo0l1xySTp16pTddtstrVq1alj2vPPO+8gvpWeffXb++7//O7169Urv3r0zc+bM3HnnnTnggANy9dVXZ/PNN2+W/X/rrbfywx/+MP/3f/+XnXbaKR07dsxzzz2XG264IRMmTMhtt92W6urqJMm4ceNyxBFHpLq6Ot/61rey0kor5cEHH8wZZ5yRp59+OmeffXbDem+66aaccsop+epXv5pddtkls2fPzmWXXZbll1++SeN9991384Mf/CDt2rXLrrvumjfffLPhfRk7dmzWW2+9pa7jt7/9bS655JL069cvPXv2zG233Zbzzjsvr732Wm688cb07t07//Zv/5a77rorI0aMyAorrLDIkZilOemkk3LrrbdmvfXWy1577ZXZs2c3hP7ll1/eEAgTJ07MoYcemq985SvZeeed06ZNmzz00EO56KKL8te//jXnnntuw/WHI0aMyMorr5y99torvXr1SpJMmjQpP/zhDzNnzpxst912WXPNNfPEE0/kqquuyv33358bbrghHTp0aDS2/fbbLzNmzMi3v/3tzJo1K7fffnuOPvroXHnlldlmm22SJPPnz89BBx2Uhx9+OHV1ddlnn30yffr0/OY3v8n48eMzevTo1NbWLnH/V1tttRx00EGLnfe73/0uSfKNb3wjyfv/uLJgwYKstdZaiyxbVVWV1VZbbZFr1c4888xstdVWqaqq+sjr2Gpqahoi+cMWxu/f/va3RU75/LArrrgiffr0+chlqqqqlvh38sILL+TFF1/MWmut1egIIkCzqwAUZtiwYZXa2trKLbfcstRlTz311EptbW3l97//faPpkyZNqtTW1la+//3vL7LezTbbrPLKK680TH/qqacqG2+8cWXbbbetLFiwoOH1Xbp0qeyzzz6VWbNmNSz71ltvVXbcccfKxhtvXJk+fXqlUqlUHn744UptbW3lnHPOqVQqlcrMmTMr66+/fmXvvfduNKY//elPldra2sqRRx75kfv04fV90EknnVSpra2tPP3005VKpVIZPXp0pba2tnLzzTc3Wu7MM8+s1NbWVu6///5KpVKpzJo1q7LFFltUttxyy0b7Xl9fXznyyCMrtbW1lQceeKBSqVQqb7/9dmXTTTet9O7du/L66683Gn9dXd0y/W4Wtw/77LNPpba2tjJkyJDKvHnzGqZfeumlldra2soFF1zwket85ZVXKrW1tZXa2trK7373u4bpDz74YMP0a6+9dpHlBw4c2DDtlltuqdTW1lauvvrqhmm1tbWVXXbZpeHnO++8s1JbW1s57rjjKvPnz2+Y/vLLL1d69epV+eY3v1mZO3dupVKpNLx3L7/8csNy8+bNqwwYMKCywQYbVGbOnLnE7SxYsKDyrW99q7LhhhtWxo0b12hfL7jggkptbW3l3//93xumLfzdDxw4sPLuu+82TL/tttsqtbW1lWOOOaZh2siRIyu1tbWV888/v9F6//SnP1U22mijyh577LG4t3ippk2bVtlqq60qtbW1lUmTJlUqlUrlscceq9TW1lZOPfXUxb5m4MCBldra2kbv5Qct7ney0L777lupra2tPPbYY42mv/nmm5UePXpUamtrK7feeuvH2oeFnwMf/Bv6KPX19ZXBgwdXamt
  625. "text/plain": [
  626. "<Figure size 1080x720 with 1 Axes>"
  627. ]
  628. },
  629. "metadata": {},
  630. "output_type": "display_data"
  631. },
  632. {
  633. "data": {
  634. "image/png": "iVBORw0KGgoAAAANSUhEUgAAA3cAAAK3CAYAAAAmrLYWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzs3XtgT/Xjx/HXzDaUSwq5x759Rmw25pZbru1LrvFtMRMlzW005EuhFEIXl5/09UVfNFKZcs91Ipa5E8LXvZgsGbua8/ujPp+vj21s9tHq3fPx397n8n6f8znns/P6nPf7HDfLsiwBAAAAAP7U8uV1AwAAAAAAuUe4AwAAAAADEO4AAAAAwACEOwAAAAAwAOEOAAAAAAxAuAMAAAAAAxDugHvg4MGDGjVqlIKCglSjRg3VrFlTwcHB+vjjj3X9+vXftS3Lly/XmTNnsjVv9+7d5ePjoytXrkiSlixZIh8fH3300Ucub1d6eroWLFigxMREl6/7zyS7+zgmJkY+Pj566623fp+G/Y6aNWumwMBAx9/38rgzQUpKiubMmePSdV66dEn9+vVTrVq15O/vr9GjR7t0/ffCtGnT5OPjo3Xr1kmSzp49Kx8fH/Xt2/ee1x0XF6fPP//8ntfjSt9884169uypwMBAVa9eXa1bt9a//vWvTP8nXb58WW+88YaaNWumGjVqqFOnTlq5cuUd6zh06JCqVavm+ExuFR8fr9GjR6thw4aqUaOG2rdvr8jISN24ceOutmnjxo3y8fHRoUOHMp1+8uRJDRkyRA0aNFD16tXVpEkTjR49WvHx8XdVH/BnQLgDXOjGjRuaMmWKnn76aUVFRcnb21tdu3ZV69atdf78eb3xxhvq2bOnkpOTf5f2TJo0SREREbp69Wq25u/YsaP69+8vLy+ve9wyKSIiQmPHjv3dw+6fVdmyZdW/f381atQor5uCPBYSEqIZM2a4dJ1vvfWW1q1bJ19fX4WGhv4pjrM6deqof//+qlSp0u9a76VLlxQUFKT169f/rvXmxhdffKFevXpp3759atmypZ599llJ0jvvvKMBAwbo5lceJyYmqlevXlq4cKFq1Kihbt266cqVKxo8eLAWLFiQZR0XL17UwIEDs/xOv3Tpkrp06aJFixapTJkyCg4OVpEiRfT6668rIiJCOX3t8vHjx/XPf/4zy+nHjh1T586dtWLFCvn7+6t79+6qWLGiFi1apC5duhDwYKz8ed0AwCQzZ87UjBkz5O/vr6lTp6pUqVKOaampqRoxYoSWLVum4cOH6/3337/n7bl06VKO5u/UqdM9aklGOW3bX125cuU0YMCAvG4G/gDuxblz8OBBubu761//+pc8PT1dvv57oW7duqpbt+7vXm9SUpKuXbv2u9d7t5KTkzVu3Djdf//9ioqKUvny5SVJaWlp6tu3rzZs2KC1a9eqVatWkqR58+Y5ep9069ZNktS3b18FBwdr8uTJ+vvf/64HH3zQqY7Dhw+rf//+t+0lMmnSJJ09e1bdu3fXyJEj5ebmJkmaOHGiZs+erUaNGmX7f9D27ds1ePBg/fzzz1nOM378eCUkJGjatGmObZOkGTNmaMqUKZoxY4ZeffXVbNUH/Jlw5w5wkRMnTmjGjBkqXry4Zs2a5RTsJMnT01Pjx49X2bJltXr1ah0/fjyPWgoAztLS0lSoUKE/TbBD9sXExOjy5cvq0qWLI9hJkoeHh/r06SNJ2rx5s6M8MjJSDz30kIKDgx1l999/v1566SUlJSVp2bJlTuufOHGiOnfurIsXL6pWrVqZtuH69etas2aNihUrpoiICEewk6Tw8HDdd9992eqGnZycrJEjR6pnz566ceOGqlWrlul8V69e1bZt21StWjWnYCdJL774ory8vJy2GTAJ4Q5wkaVLlyotLU3dunVTkSJFMp3Hw8NDr732msaNG6cHHnjAadrKlSsVHBwsf39/BQQEKDg4WCtWrMiwDh8fHw0fPly7du1S9+7dFRAQoNq1a2vQoEE6e/asY75mzZopKipKktShQwc1a9ZM0v/GqWzbtk1dunRR9erV9eSTT+ratWsZxtzZWZalGTNmqEmTJvLz81Pnzp21evVqp3luNyZs+PDhTuMifHx89O2330qSateure7duzvmTUhI0MSJE9WiRQtVr15djz/+uCIiInTixAmndd5uO65du6Zx48YpKChIvr6+ql+/vvr376+DBw9m+rlkth1ffPGFFi9erL///e/y9fVVUFCQvvjiC0nS+vXr1alTJ9WoUUNPPvmkPv744wzrOXfunEaPHq0WLVrI19dXAQEB6tSpkxYuXHjHNiQkJKhDhw6qUqWKPv300yz3b/fu3dWsWTOdP39eERERqlu3rqMbVUxMTIb1nj59Wi+//LIef/xxBQQEqHfv3jp+/Lhatmzp9BlkxcfHR0OGDNH27dvVuXNn+fn5qVmzZnrvvfeUkpKSYd727dtnWIcrx9PZ17Vq1So9//zz8vX1VdOmTR13D65evarJkyc7jqVGjRpp9OjRmd75unz5ssaOHatGjRrJ399foaGhOnLkiGMf2906zutmt44dtFu1apWCg4MVEBCgmjVrqkePHtq+fXuG+fbv368+ffqoYcOG8vX11ZNPPqnJkyc7ulXbx5SdO3dOCQkJju8C6deL5+nTp6tt27by9/dXnTp19Pzzz2vbtm3Z2oc3r9PHx8cx3RXnY2ZccZ7d7rO4WWpqqj788EO1bt3a8X0QERGR6V2m5cuXKzg4WLVr11ZAQICefvppRUZGOroMLlmyRM2bN3e0z8fHR0uWLHEsv2/fPvXt21d169aVr6+vWrdurZkzZyo1NdWpnpyeuzk5lm9Vrlw5vfzyy2rZsmWGafYwbx/7fPr0aV24cEG1atWSu7u707z2u6Q7duxwKp89e7Z8fX21ZMkS1a9fP9M2xMfHKzExUTabTQULFnSa5uXlpUceeUTff//9HYcQ/PTTT/rss8/UpEkTffnll7LZbJnOZ1mWhg4dqp49e2aY5u7uLnd397/8eG+Yi26ZgIt8/fXXknTHsSpNmzbNUPb2229rzpw5KlGihJ566ilJ0qZNm/Tyyy/ru+++09ChQ53mP3jwoEJDQ1WrVi09++yz2rdvn1atWqUDBw5o5cqV8vT0VGhoqKKionT48GE988wzqly5stM6hgwZosqVK6t79+66du2a7rvvvizbPHv2bCUkJKht27bKly+f1qxZo/DwcI0ZM8YxdiMn+vfvr6ioKJ07d069e/d2tO3nn3/Ws88+qxMnTsjf31/NmzfXmTNntHLlSm3atElz5sxRjRo17rgdvXv31ubNm9W0aVO1aNFCP/30k1auXKktW7ZoyZIlGfZFZubOnatTp06pTZs2qlevnqKiojRs2DAdPnxY8+fPV1BQkAIDA/Xll1/qjTfeUKlSpdSiRQtJv16Ed+7cWUlJSWrZsqVKly6tCxcuaM2aNRozZozS09MVEhKSab3Jycnq06ePDh06pFGjRqlLly63bee1a9fUtWtXFSxYUB06dHBs6/PPP6+oqCg9+uijkqRTp04pODhYly9fVosWLVSuXDlt3LhRXbt21Y0bN/Twww/fcZ9I0pEjR/TCCy8oICBA3bp10/bt2zVz5kzt2bNHc+fOVb58v/9vhm+++aZKliyp7t276+zZsypfvrwSEhLUtWtXff/996pfv75atWqls2fPavHixfr666+1aNEilSxZUtKvF87BwcE6ceKE6tatq+rVq2vbtm0KDQ1V0aJFc9U2e/evsmXLqmPHjnJzc9Pq1avVs2dPTZgwwRGAT5w4oZ49eypfvnwKCgpSkSJFtHv3bs2aNUv79+/Xf/7zHxUpUkT9+/fXf/7zH6WkpOjFF19U1apVJUljx47VokWLVKdOHTVu3FgJCQmO42Du3LlZdl+sWrVqhnXauep8vJ3cnGfZkZaWpt69e2v79u3y8/NTSEiILl26pFWrVmnLli2aP3++IyCsWLFCEREReuSRR9SxY0fly5dP69ev1+uvv66ff/5Z/fr1U9WqVRUaGqp
  635. "text/plain": [
  636. "<Figure size 1080x720 with 1 Axes>"
  637. ]
  638. },
  639. "metadata": {},
  640. "output_type": "display_data"
  641. },
  642. {
  643. "data": {
  644. "image/png": "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
  645. "text/plain": [
  646. "<Figure size 1080x720 with 1 Axes>"
  647. ]
  648. },
  649. "metadata": {},
  650. "output_type": "display_data"
  651. }
  652. ],
  653. "source": [
  654. "x = []\n",
  655. "y = []\n",
  656. "plt.figure(figsize=(15,10))\n",
  657. "for k in alllabels:\n",
  658. " x.append(k)\n",
  659. " y.append(alllabels[k])\n",
  660. "chart = sns.barplot(x,y,palette=pal)\n",
  661. "chart.set_xticklabels(chart.get_xticklabels(), rotation=80)\n",
  662. "chart.axes.set_title(\"Labels used in milestone {}\".format(ms.title),fontsize=20)\n",
  663. "chart.tick_params(labelsize=15)\n",
  664. "plt.show()\n",
  665. "x = []\n",
  666. "y = []\n",
  667. "plt.figure(figsize=(15,10))\n",
  668. "for k in allcontributors:\n",
  669. " x.append(k)\n",
  670. " y.append(allcontributors[k])\n",
  671. "chart = sns.barplot(x,y,palette=pal)\n",
  672. "chart.set_xticklabels(chart.get_xticklabels(), rotation=80)\n",
  673. "chart.axes.set_title(\"Contributors making pull requests for milestone {}\".format(ms.title),fontsize=20)\n",
  674. "chart.tick_params(labelsize=15)\n",
  675. "plt.show()\n",
  676. "wordcloud = WordCloud(max_font_size=40, background_color='white', relative_scaling=.5).generate(\" \".join(titlewords).strip('.,:;-_()[]{}').replace('issue',''))\n",
  677. "plt.figure(figsize=[15,10])\n",
  678. "plt.imshow(wordcloud)\n",
  679. "plt.axis(\"off\")\n",
  680. "plt.show()"
  681. ]
  682. }
  683. ],
  684. "metadata": {
  685. "kernelspec": {
  686. "display_name": "Python 3",
  687. "language": "python",
  688. "name": "python3"
  689. },
  690. "language_info": {
  691. "codemirror_mode": {
  692. "name": "ipython",
  693. "version": 3
  694. },
  695. "file_extension": ".py",
  696. "mimetype": "text/x-python",
  697. "name": "python",
  698. "nbconvert_exporter": "python",
  699. "pygments_lexer": "ipython3",
  700. "version": "3.5.3"
  701. }
  702. },
  703. "nbformat": 4,
  704. "nbformat_minor": 2
  705. }