diff --git a/.github/CONTRIBUTORS-template.md b/.github/CONTRIBUTORS-template.md
new file mode 100644
index 00000000..d8ba28c6
--- /dev/null
+++ b/.github/CONTRIBUTORS-template.md
@@ -0,0 +1,56 @@
+# Contributors
+
+## Core Developers
+
+These contributors have commit flags for the repository, and are able to
+accept and merge pull requests.
+
+
+
+ Name |
+ Github |
+ Twitter |
+
+ {%- for contributor in core_contributors %}
+
+ {{ contributor.name }} |
+
+ {{ contributor.github_login }}
+ |
+ {{ contributor.twitter_username }} |
+
+ {%- endfor %}
+
+
+*Audrey is also the creator of Cookiecutter. Audrey and Daniel are on
+the Cookiecutter core team.*
+
+## Other Contributors
+
+Listed in alphabetical order.
+
+
+
+ Name |
+ Github |
+ Twitter |
+
+ {%- for contributor in other_contributors %}
+
+ {{ contributor.name }} |
+
+ {{ contributor.github_login }}
+ |
+ {{ contributor.twitter_username }} |
+
+ {%- endfor %}
+
+
+### Special Thanks
+
+The following haven't provided code directly, but have provided
+guidance and advice.
+
+- Jannis Leidel
+- Nate Aune
+- Barry Morrison
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index 8dbff6c2..45e67c69 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -2,8 +2,8 @@
[//]: # (Before you proceed:)
-[//]: # (1. Make sure to add yourself to `CONTRIBUTORS.rst` through this PR provided you're contributing here for the first time)
-[//]: # (2. Don't forget to update the `docs/` presuming others would benefit from a concise description of whatever that you're proposing)
+[//]: # (- Don't forget to update the `docs/` presuming others would benefit from a concise description of whatever that you're proposing)
+[//]: # (- If you're adding a new option, please make sure that tests/test_cookiecutter_generation.py is updated accordingly)
## Description
@@ -11,15 +11,11 @@
[//]: # (What's it you're proposing?)
-
-
## Rationale
[//]: # (Why does the project need that?)
-
-
## Use case(s) / visualization(s)
[//]: # ("Better to see something once than to hear about it a thousand times.")
diff --git a/.github/contributors.json b/.github/contributors.json
new file mode 100644
index 00000000..71488099
--- /dev/null
+++ b/.github/contributors.json
@@ -0,0 +1,1031 @@
+[
+ {
+ "name": "Daniel Roy Greenfeld",
+ "github_login": "pydanny",
+ "twitter_username": "pydanny",
+ "is_core": true
+ },
+ {
+ "name": "Audrey Roy Greenfeld",
+ "github_login": "audreyr",
+ "twitter_username": "audreyr",
+ "is_core": true
+ },
+ {
+ "name": "Fábio C. Barrionuevo da Luz",
+ "github_login": "luzfcb",
+ "twitter_username": "luzfcb",
+ "is_core": true
+ },
+ {
+ "name": "Saurabh Kumar",
+ "github_login": "theskumar",
+ "twitter_username": "_theskumar",
+ "is_core": true
+ },
+ {
+ "name": "Jannis Gebauer",
+ "github_login": "jayfk",
+ "twitter_username": "",
+ "is_core": true
+ },
+ {
+ "name": "Burhan Khalid",
+ "github_login": "burhan",
+ "twitter_username": "burhan",
+ "is_core": true
+ },
+ {
+ "name": "Shupeyko Nikita",
+ "github_login": "webyneter",
+ "twitter_username": "webyneter",
+ "is_core": true
+ },
+ {
+ "name": "Bruno Alla",
+ "github_login": "browniebroke",
+ "twitter_username": "_BrunoAlla",
+ "is_core": true
+ },
+ {
+ "name": "Wan Liuyang",
+ "github_login": "sfdye",
+ "twitter_username": "sfdye",
+ "is_core": true
+ },
+ {
+ "name": "18",
+ "github_login": "dezoito",
+ "twitter_username": ""
+ },
+ {
+ "name": "2O4",
+ "github_login": "2O4",
+ "twitter_username": ""
+ },
+ {
+ "name": "a7p",
+ "github_login": "a7p",
+ "twitter_username": ""
+ },
+ {
+ "name": "Aadith PM",
+ "github_login": "aadithpm",
+ "twitter_username": ""
+ },
+ {
+ "name": "Aaron Eikenberry",
+ "github_login": "aeikenberry",
+ "twitter_username": ""
+ },
+ {
+ "name": "Adam Bogdał",
+ "github_login": "bogdal",
+ "twitter_username": ""
+ },
+ {
+ "name": "Adam Dobrawy",
+ "github_login": "ad-m",
+ "twitter_username": ""
+ },
+ {
+ "name": "Adam Steele",
+ "github_login": "adammsteele",
+ "twitter_username": ""
+ },
+ {
+ "name": "Agam Dua",
+ "github_login": "",
+ "twitter_username": ""
+ },
+ {
+ "name": "Agustín Scaramuzza",
+ "github_login": "scaramagus",
+ "twitter_username": "scaramagus"
+ },
+ {
+ "name": "Alberto Sanchez",
+ "github_login": "alb3rto",
+ "twitter_username": ""
+ },
+ {
+ "name": "Alex Tsai",
+ "github_login": "caffodian",
+ "twitter_username": ""
+ },
+ {
+ "name": "Alvaro [Andor]",
+ "github_login": "andor-pierdelacabeza",
+ "twitter_username": ""
+ },
+ {
+ "name": "Amjith Ramanujam",
+ "github_login": "amjith",
+ "twitter_username": ""
+ },
+ {
+ "name": "Andreas Meistad",
+ "github_login": "ameistad",
+ "twitter_username": ""
+ },
+ {
+ "name": "Andres Gonzalez",
+ "github_login": "andresgz",
+ "twitter_username": ""
+ },
+ {
+ "name": "Andrew Mikhnevich",
+ "github_login": "zcho",
+ "twitter_username": ""
+ },
+ {
+ "name": "Andrew Chen Wang",
+ "github_login": "Andrew-Chen-Wang",
+ "twitter_username": ""
+ },
+ {
+ "name": "Andy Rose",
+ "github_login": "",
+ "twitter_username": ""
+ },
+ {
+ "name": "Anna Callahan",
+ "github_login": "jazztpt",
+ "twitter_username": ""
+ },
+ {
+ "name": "Anna Sidwell",
+ "github_login": "takkaria",
+ "twitter_username": ""
+ },
+ {
+ "name": "Antonia Blair",
+ "github_login": "antoniablair",
+ "twitter_username": "antoniablairart"
+ },
+ {
+ "name": "Anuj Bansal",
+ "github_login": "ahhda",
+ "twitter_username": ""
+ },
+ {
+ "name": "Arcuri Davide",
+ "github_login": "dadokkio",
+ "twitter_username": ""
+ },
+ {
+ "name": "Areski Belaid",
+ "github_login": "areski",
+ "twitter_username": ""
+ },
+ {
+ "name": "AsheKR",
+ "github_login": "ashekr",
+ "twitter_username": ""
+ },
+ {
+ "name": "Ashley Camba",
+ "github_login": "",
+ "twitter_username": ""
+ },
+ {
+ "name": "Barclay Gauld",
+ "github_login": "yunti",
+ "twitter_username": ""
+ },
+ {
+ "name": "Bartek",
+ "github_login": "btknu",
+ "twitter_username": ""
+ },
+ {
+ "name": "Ben Lopatin",
+ "github_login": "",
+ "twitter_username": ""
+ },
+ {
+ "name": "Ben Warren",
+ "github_login": "bwarren2",
+ "twitter_username": ""
+ },
+ {
+ "name": "Benjamin Abel",
+ "github_login": "",
+ "twitter_username": ""
+ },
+ {
+ "name": "Bert de Miranda",
+ "github_login": "bertdemiranda",
+ "twitter_username": ""
+ },
+ {
+ "name": "Bo Lopker",
+ "github_login": "blopker",
+ "twitter_username": ""
+ },
+ {
+ "name": "Bo Peng",
+ "github_login": "BoPeng",
+ "twitter_username": ""
+ },
+ {
+ "name": "Bouke Haarsma",
+ "github_login": "",
+ "twitter_username": ""
+ },
+ {
+ "name": "Brent Payne",
+ "github_login": "brentpayne",
+ "twitter_username": "brentpayne"
+ },
+ {
+ "name": "Bruce Olivier",
+ "github_login": "bolivierjr",
+ "twitter_username": ""
+ },
+ {
+ "name": "Caio Ariede",
+ "github_login": "caioariede",
+ "twitter_username": "caioariede"
+ },
+ {
+ "name": "Carl Johnson",
+ "github_login": "carlmjohnson",
+ "twitter_username": "carlmjohnson"
+ },
+ {
+ "name": "Catherine Devlin",
+ "github_login": "catherinedevlin",
+ "twitter_username": ""
+ },
+ {
+ "name": "Cédric Gaspoz",
+ "github_login": "cgaspoz",
+ "twitter_username": ""
+ },
+ {
+ "name": "Charlie Smith",
+ "github_login": "chuckus",
+ "twitter_username": ""
+ },
+ {
+ "name": "Chris Curvey",
+ "github_login": "ccurvey",
+ "twitter_username": ""
+ },
+ {
+ "name": "Chris Franklin",
+ "github_login": "",
+ "twitter_username": ""
+ },
+ {
+ "name": "Chris Franklin",
+ "github_login": "hairychris",
+ "twitter_username": ""
+ },
+ {
+ "name": "Chris Pappalardo",
+ "github_login": "ChrisPappalardo",
+ "twitter_username": ""
+ },
+ {
+ "name": "Christopher Clarke",
+ "github_login": "chrisdev",
+ "twitter_username": ""
+ },
+ {
+ "name": "Cole Mackenzie",
+ "github_login": "cmackenzie1",
+ "twitter_username": ""
+ },
+ {
+ "name": "Cole Maclean",
+ "github_login": "cole",
+ "twitter_username": "cole"
+ },
+ {
+ "name": "Collederas",
+ "github_login": "Collederas",
+ "twitter_username": ""
+ },
+ {
+ "name": "Craig Margieson",
+ "github_login": "cmargieson",
+ "twitter_username": ""
+ },
+ {
+ "name": "Cristian Vargas",
+ "github_login": "cdvv7788",
+ "twitter_username": ""
+ },
+ {
+ "name": "Cullen Rhodes",
+ "github_login": "c-rhodes",
+ "twitter_username": ""
+ },
+ {
+ "name": "Curtis St Pierre",
+ "github_login": "curtisstpierre",
+ "twitter_username": "cstpierre1388"
+ },
+ {
+ "name": "Dan Shultz",
+ "github_login": "shultz",
+ "twitter_username": ""
+ },
+ {
+ "name": "Dani Hodovic",
+ "github_login": "danihodovic",
+ "twitter_username": ""
+ },
+ {
+ "name": "Daniel Hepper",
+ "github_login": "dhepper",
+ "twitter_username": "danielhepper"
+ },
+ {
+ "name": "Daniel Hillier",
+ "github_login": "danifus",
+ "twitter_username": ""
+ },
+ {
+ "name": "Daniel Sears",
+ "github_login": "highpost",
+ "twitter_username": "highpost"
+ },
+ {
+ "name": "Daniele Tricoli",
+ "github_login": "eriol",
+ "twitter_username": ""
+ },
+ {
+ "name": "David Díaz",
+ "github_login": "ddiazpinto",
+ "twitter_username": "DavidDiazPinto"
+ },
+ {
+ "name": "Davit Tovmasyan",
+ "github_login": "davitovmasyan",
+ "twitter_username": ""
+ },
+ {
+ "name": "Davur Clementsen",
+ "github_login": "dsclementsen",
+ "twitter_username": "davur"
+ },
+ {
+ "name": "Delio Castillo",
+ "github_login": "jangeador",
+ "twitter_username": "jangeador"
+ },
+ {
+ "name": "Demetris Stavrou",
+ "github_login": "demestav",
+ "twitter_username": ""
+ },
+ {
+ "name": "Denis Bobrov",
+ "github_login": "delneg",
+ "twitter_username": ""
+ },
+ {
+ "name": "Denis Orehovsky",
+ "github_login": "apirobot",
+ "twitter_username": ""
+ },
+ {
+ "name": "Denis Savran",
+ "github_login": "blaxpy",
+ "twitter_username": ""
+ },
+ {
+ "name": "Diane Chen",
+ "github_login": "purplediane",
+ "twitter_username": "purplediane88"
+ },
+ {
+ "name": "Dónal Adams",
+ "github_login": "epileptic-fish",
+ "twitter_username": ""
+ },
+ {
+ "name": "Dong Huynh",
+ "github_login": "trungdong",
+ "twitter_username": ""
+ },
+ {
+ "name": "Duda Nogueira",
+ "github_login": "dudanogueira",
+ "twitter_username": "dudanogueira"
+ },
+ {
+ "name": "Emanuel Calso",
+ "github_login": "bloodpet",
+ "twitter_username": "bloodpet"
+ },
+ {
+ "name": "Eraldo Energy",
+ "github_login": "eraldo",
+ "twitter_username": ""
+ },
+ {
+ "name": "Eric Groom",
+ "github_login": "ericgroom",
+ "twitter_username": ""
+ },
+ {
+ "name": "Ernesto Cedeno",
+ "github_login": "codnee",
+ "twitter_username": ""
+ },
+ {
+ "name": "Eyad Al Sibai",
+ "github_login": "eyadsibai",
+ "twitter_username": ""
+ },
+ {
+ "name": "Felipe Arruda",
+ "github_login": "arruda",
+ "twitter_username": ""
+ },
+ {
+ "name": "Florian Idelberger",
+ "github_login": "step21",
+ "twitter_username": "windrush"
+ },
+ {
+ "name": "Gabriel Mejia",
+ "github_login": "elgartoinf",
+ "twitter_username": "elgartoinf"
+ },
+ {
+ "name": "Garry Cairns",
+ "github_login": "garry-cairns",
+ "twitter_username": ""
+ },
+ {
+ "name": "Garry Polley",
+ "github_login": "garrypolley",
+ "twitter_username": ""
+ },
+ {
+ "name": "Gilbishkosma",
+ "github_login": "Gilbishkosma",
+ "twitter_username": ""
+ },
+ {
+ "name": "Glenn Wiskur",
+ "github_login": "gwiskur",
+ "twitter_username": ""
+ },
+ {
+ "name": "Guilherme Guy",
+ "github_login": "guilherme1guy",
+ "twitter_username": ""
+ },
+ {
+ "name": "Hamish Durkin",
+ "github_login": "durkode",
+ "twitter_username": ""
+ },
+ {
+ "name": "Hana Quadara",
+ "github_login": "hanaquadara",
+ "twitter_username": ""
+ },
+ {
+ "name": "Hannah Lazarus",
+ "github_login": "hanhanhan",
+ "twitter_username": ""
+ },
+ {
+ "name": "Harry Moreno",
+ "github_login": "morenoh149",
+ "twitter_username": "morenoh149"
+ },
+ {
+ "name": "Harry Percival",
+ "github_login": "hjwp",
+ "twitter_username": ""
+ },
+ {
+ "name": "Hendrik Schneider",
+ "github_login": "hendrikschneider",
+ "twitter_username": ""
+ },
+ {
+ "name": "Henrique G. G. Pereira",
+ "github_login": "ikkebr",
+ "twitter_username": ""
+ },
+ {
+ "name": "Howie Zhao",
+ "github_login": "howiezhao",
+ "twitter_username": ""
+ },
+ {
+ "name": "Ian Lee",
+ "github_login": "IanLee1521",
+ "twitter_username": ""
+ },
+ {
+ "name": "Irfan Ahmad",
+ "github_login": "erfaan",
+ "twitter_username": "erfaan"
+ },
+ {
+ "name": "Isaac12x",
+ "github_login": "Isaac12x",
+ "twitter_username": ""
+ },
+ {
+ "name": "Ivan Khomutov",
+ "github_login": "ikhomutov",
+ "twitter_username": ""
+ },
+ {
+ "name": "James Williams",
+ "github_login": "jameswilliams1",
+ "twitter_username": ""
+ },
+ {
+ "name": "Jan Van Bruggen",
+ "github_login": "jvanbrug",
+ "twitter_username": ""
+ },
+ {
+ "name": "Jelmer Draaijer",
+ "github_login": "foarsitter",
+ "twitter_username": ""
+ },
+ {
+ "name": "Jerome Caisip",
+ "github_login": "jeromecaisip",
+ "twitter_username": ""
+ },
+ {
+ "name": "Jens Nilsson",
+ "github_login": "phiberjenz",
+ "twitter_username": ""
+ },
+ {
+ "name": "Jerome Leclanche",
+ "github_login": "jleclanche",
+ "twitter_username": "Adys"
+ },
+ {
+ "name": "Jimmy Gitonga",
+ "github_login": "Afrowave",
+ "twitter_username": "afrowave"
+ },
+ {
+ "name": "John Cass",
+ "github_login": "jcass77",
+ "twitter_username": "cass_john"
+ },
+ {
+ "name": "Jonathan Thompson",
+ "github_login": "nojanath",
+ "twitter_username": ""
+ },
+ {
+ "name": "Jules Cheron",
+ "github_login": "jules-ch",
+ "twitter_username": ""
+ },
+ {
+ "name": "Julien Almarcha",
+ "github_login": "sladinji",
+ "twitter_username": ""
+ },
+ {
+ "name": "Julio Castillo",
+ "github_login": "juliocc",
+ "twitter_username": ""
+ },
+ {
+ "name": "Kaido Kert",
+ "github_login": "kaidokert",
+ "twitter_username": ""
+ },
+ {
+ "name": "kappataumu",
+ "github_login": "kappataumu",
+ "twitter_username": "kappataumu"
+ },
+ {
+ "name": "Kaveh",
+ "github_login": "ka7eh",
+ "twitter_username": ""
+ },
+ {
+ "name": "Keith Bailey",
+ "github_login": "keithjeb",
+ "twitter_username": ""
+ },
+ {
+ "name": "Keith Webber",
+ "github_login": "townie",
+ "twitter_username": ""
+ },
+ {
+ "name": "Kevin A. Stone",
+ "github_login": "",
+ "twitter_username": ""
+ },
+ {
+ "name": "Kevin Ndung'u",
+ "github_login": "kevgathuku",
+ "twitter_username": ""
+ },
+ {
+ "name": "Keyvan Mosharraf",
+ "github_login": "keyvanm",
+ "twitter_username": ""
+ },
+ {
+ "name": "Krzysztof Szumny",
+ "github_login": "noisy",
+ "twitter_username": ""
+ },
+ {
+ "name": "Krzysztof Żuraw",
+ "github_login": "krzysztofzuraw",
+ "twitter_username": ""
+ },
+ {
+ "name": "Leo won",
+ "github_login": "leollon",
+ "twitter_username": ""
+ },
+ {
+ "name": "Leo Zhou",
+ "github_login": "glasslion",
+ "twitter_username": ""
+ },
+ {
+ "name": "Leon Kim",
+ "github_login": "PilhwanKim",
+ "twitter_username": ""
+ },
+ {
+ "name": "Leonardo Jimenez",
+ "github_login": "xpostudio4",
+ "twitter_username": ""
+ },
+ {
+ "name": "Lin Xianyi",
+ "github_login": "iynaix",
+ "twitter_username": ""
+ },
+ {
+ "name": "Luis Nell",
+ "github_login": "originell",
+ "twitter_username": ""
+ },
+ {
+ "name": "Lukas Klein",
+ "github_login": "",
+ "twitter_username": ""
+ },
+ {
+ "name": "Lyla Fischer",
+ "github_login": "",
+ "twitter_username": ""
+ },
+ {
+ "name": "Malik Sulaimanov",
+ "github_login": "flyudvik",
+ "twitter_username": "flyudvik"
+ },
+ {
+ "name": "Martin Blech",
+ "github_login": "",
+ "twitter_username": ""
+ },
+ {
+ "name": "Martin Saizar",
+ "github_login": "msaizar",
+ "twitter_username": ""
+ },
+ {
+ "name": "Mateusz Ostaszewski",
+ "github_login": "mostaszewski",
+ "twitter_username": ""
+ },
+ {
+ "name": "Mathijs Hoogland",
+ "github_login": "MathijsHoogland",
+ "twitter_username": ""
+ },
+ {
+ "name": "Matt Braymer-Hayes",
+ "github_login": "mattayes",
+ "twitter_username": "mattayes"
+ },
+ {
+ "name": "Matt Knapper",
+ "github_login": "mknapper1",
+ "twitter_username": ""
+ },
+ {
+ "name": "Matt Linares",
+ "github_login": "",
+ "twitter_username": ""
+ },
+ {
+ "name": "Matt Menzenski",
+ "github_login": "menzenski",
+ "twitter_username": ""
+ },
+ {
+ "name": "Matt Warren",
+ "github_login": "mfwarren",
+ "twitter_username": ""
+ },
+ {
+ "name": "Matthew Sisley",
+ "github_login": "mjsisley",
+ "twitter_username": ""
+ },
+ {
+ "name": "Matthias Sieber",
+ "github_login": "manonthemat",
+ "twitter_username": "MatzeOne"
+ },
+ {
+ "name": "Meghan Heintz",
+ "github_login": "dot2dotseurat",
+ "twitter_username": ""
+ },
+ {
+ "name": "Mesut Yılmaz",
+ "github_login": "myilmaz",
+ "twitter_username": ""
+ },
+ {
+ "name": "Michael Gecht",
+ "github_login": "mimischi",
+ "twitter_username": "_mischi"
+ },
+ {
+ "name": "Michael Samoylov",
+ "github_login": "msamoylov",
+ "twitter_username": ""
+ },
+ {
+ "name": "Min ho Kim",
+ "github_login": "minho42",
+ "twitter_username": ""
+ },
+ {
+ "name": "mozillazg",
+ "github_login": "mozillazg",
+ "twitter_username": ""
+ },
+ {
+ "name": "Nico Stefani",
+ "github_login": "nicolas471",
+ "twitter_username": "moby_dick91"
+ },
+ {
+ "name": "Oleg Russkin",
+ "github_login": "rolep",
+ "twitter_username": ""
+ },
+ {
+ "name": "Pablo",
+ "github_login": "oubiga",
+ "twitter_username": ""
+ },
+ {
+ "name": "Parbhat Puri",
+ "github_login": "parbhat",
+ "twitter_username": ""
+ },
+ {
+ "name": "Pawan Chaurasia",
+ "github_login": "rjsnh1522",
+ "twitter_username": ""
+ },
+ {
+ "name": "Peter Bittner",
+ "github_login": "bittner",
+ "twitter_username": ""
+ },
+ {
+ "name": "Peter Coles",
+ "github_login": "mrcoles",
+ "twitter_username": ""
+ },
+ {
+ "name": "Philipp Matthies",
+ "github_login": "canonnervio",
+ "twitter_username": ""
+ },
+ {
+ "name": "Pierre Chiquet",
+ "github_login": "pchiquet",
+ "twitter_username": ""
+ },
+ {
+ "name": "Raony Guimarães Corrêa",
+ "github_login": "raonyguimaraes",
+ "twitter_username": ""
+ },
+ {
+ "name": "Raphael Pierzina",
+ "github_login": "hackebrot",
+ "twitter_username": ""
+ },
+ {
+ "name": "Reggie Riser",
+ "github_login": "reggieriser",
+ "twitter_username": ""
+ },
+ {
+ "name": "René Muhl",
+ "github_login": "rm--",
+ "twitter_username": ""
+ },
+ {
+ "name": "Richard Hajdu",
+ "github_login": "Tusky",
+ "twitter_username": ""
+ },
+ {
+ "name": "Roman Afanaskin",
+ "github_login": "siauPatrick",
+ "twitter_username": ""
+ },
+ {
+ "name": "Roman Osipenko",
+ "github_login": "romanosipenko",
+ "twitter_username": ""
+ },
+ {
+ "name": "Russell Davies",
+ "github_login": "",
+ "twitter_username": ""
+ },
+ {
+ "name": "Sam Collins",
+ "github_login": "MightySCollins",
+ "twitter_username": ""
+ },
+ {
+ "name": "Sascha",
+ "github_login": "saschalalala",
+ "twitter_username": "saschalalala"
+ },
+ {
+ "name": "Sławek Ehlert",
+ "github_login": "slafs",
+ "twitter_username": ""
+ },
+ {
+ "name": "Sorasful",
+ "github_login": "sorasful",
+ "twitter_username": ""
+ },
+ {
+ "name": "Srinivas Nyayapati",
+ "github_login": "shireenrao",
+ "twitter_username": ""
+ },
+ {
+ "name": "stepmr",
+ "github_login": "stepmr",
+ "twitter_username": ""
+ },
+ {
+ "name": "Steve Steiner",
+ "github_login": "ssteinerX",
+ "twitter_username": ""
+ },
+ {
+ "name": "Sudarshan Wadkar",
+ "github_login": "wadkar",
+ "twitter_username": ""
+ },
+ {
+ "name": "Sule Marshall",
+ "github_login": "suledev",
+ "twitter_username": ""
+ },
+ {
+ "name": "Tano Abeleyra",
+ "github_login": "tanoabeleyra",
+ "twitter_username": ""
+ },
+ {
+ "name": "Taylor Baldwin",
+ "github_login": "",
+ "twitter_username": ""
+ },
+ {
+ "name": "Théo Segonds",
+ "github_login": "show0k",
+ "twitter_username": ""
+ },
+ {
+ "name": "Tim Claessens",
+ "github_login": "timclaessens",
+ "twitter_username": ""
+ },
+ {
+ "name": "Tim Freund",
+ "github_login": "timfreund",
+ "twitter_username": ""
+ },
+ {
+ "name": "Tom Atkins",
+ "github_login": "knitatoms",
+ "twitter_username": ""
+ },
+ {
+ "name": "Tom Offermann",
+ "github_login": "",
+ "twitter_username": ""
+ },
+ {
+ "name": "Travis McNeill",
+ "github_login": "Travistock",
+ "twitter_username": "tavistock_esq"
+ },
+ {
+ "name": "Tubo Shi",
+ "github_login": "Tubo",
+ "twitter_username": ""
+ },
+ {
+ "name": "Umair Ashraf",
+ "github_login": "umrashrf",
+ "twitter_username": "fabumair"
+ },
+ {
+ "name": "Vadim Iskuchekov",
+ "github_login": "Egregors",
+ "twitter_username": "egregors"
+ },
+ {
+ "name": "Vicente G. Reyes",
+ "github_login": "reyesvicente",
+ "twitter_username": "highcenburg"
+ },
+ {
+ "name": "Vitaly Babiy",
+ "github_login": "",
+ "twitter_username": ""
+ },
+ {
+ "name": "Vivian Guillen",
+ "github_login": "viviangb",
+ "twitter_username": ""
+ },
+ {
+ "name": "Vlad Doster",
+ "github_login": "vladdoster",
+ "twitter_username": ""
+ },
+ {
+ "name": "Will Farley",
+ "github_login": "goldhand",
+ "twitter_username": "g01dhand"
+ },
+ {
+ "name": "William Archinal",
+ "github_login": "archinal",
+ "twitter_username": ""
+ },
+ {
+ "name": "Xaver Y.R. Chen",
+ "github_login": "yrchen",
+ "twitter_username": "yrchen"
+ },
+ {
+ "name": "Yaroslav Halchenko",
+ "github_login": "",
+ "twitter_username": ""
+ },
+ {
+ "name": "Yuchen Xie",
+ "github_login": "mapx",
+ "twitter_username": ""
+ },
+ {
+ "name": "enchance",
+ "github_login": "enchance",
+ "twitter_username": ""
+ },
+ {
+ "name": "Jan Fabry",
+ "github_login": "janfabry",
+ "twitter_username": ""
+ },
+ {
+ "name": "Corey Garvey",
+ "github_login": "coreygarvey",
+ "twitter_username": ""
+ }
+]
\ No newline at end of file
diff --git a/.github/workflows/update-contributors.yml b/.github/workflows/update-contributors.yml
new file mode 100644
index 00000000..acae4729
--- /dev/null
+++ b/.github/workflows/update-contributors.yml
@@ -0,0 +1,30 @@
+name: Update Contributors
+
+on:
+ push:
+ branches:
+ - master
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v2
+
+ - name: Set up Python
+ uses: actions/setup-python@v2
+ with:
+ python-version: "3.8"
+ - name: Install dependencies
+ run: |
+ python -m pip install --upgrade pip
+ pip install -r requirements.txt
+ - name: Update list
+ run: python scripts/update_contributors.py
+
+ - name: Commit changes
+ uses: stefanzweifel/git-auto-commit-action@v4
+ with:
+ commit_message: Update Contributors
+ file_pattern: CONTRIBUTORS.md .github/contributors.json
diff --git a/.gitignore b/.gitignore
index efe33bef..386b2651 100644
--- a/.gitignore
+++ b/.gitignore
@@ -214,7 +214,6 @@ tags
[Ii]nclude
[Ll]ib
[Ll]ib64
-[Ss]cripts
pyvenv.cfg
pip-selfcheck.json
diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst
index 0a64e628..5d88bf5b 100644
--- a/CONTRIBUTING.rst
+++ b/CONTRIBUTING.rst
@@ -8,7 +8,6 @@ Getting your pull request merged in
#. Keep it small. The smaller the pull request the more likely I'll pull it in.
#. Pull requests that fix a current issue get priority for review.
-#. If you're not already in the `CONTRIBUTORS.rst` file, add yourself!
Testing
-------
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
new file mode 100644
index 00000000..0174628e
--- /dev/null
+++ b/CONTRIBUTORS.md
@@ -0,0 +1,1466 @@
+# Contributors
+
+## Core Developers
+
+These contributors have commit flags for the repository, and are able to
+accept and merge pull requests.
+
+
+
+ Name |
+ Github |
+ Twitter |
+
+
+ Daniel Roy Greenfeld |
+
+ pydanny
+ |
+ pydanny |
+
+
+ Audrey Roy Greenfeld |
+
+ audreyr
+ |
+ audreyr |
+
+
+ Fábio C. Barrionuevo da Luz |
+
+ luzfcb
+ |
+ luzfcb |
+
+
+ Saurabh Kumar |
+
+ theskumar
+ |
+ _theskumar |
+
+
+ Jannis Gebauer |
+
+ jayfk
+ |
+ |
+
+
+ Burhan Khalid |
+
+ burhan
+ |
+ burhan |
+
+
+ Shupeyko Nikita |
+
+ webyneter
+ |
+ webyneter |
+
+
+ Bruno Alla |
+
+ browniebroke
+ |
+ _BrunoAlla |
+
+
+ Wan Liuyang |
+
+ sfdye
+ |
+ sfdye |
+
+
+
+*Audrey is also the creator of Cookiecutter. Audrey and Daniel are on
+the Cookiecutter core team.*
+
+## Other Contributors
+
+Listed in alphabetical order.
+
+
+
+### Special Thanks
+
+The following haven't provided code directly, but have provided
+guidance and advice.
+
+- Jannis Leidel
+- Nate Aune
+- Barry Morrison
\ No newline at end of file
diff --git a/CONTRIBUTORS.rst b/CONTRIBUTORS.rst
deleted file mode 100644
index 3faa87d5..00000000
--- a/CONTRIBUTORS.rst
+++ /dev/null
@@ -1,427 +0,0 @@
-Contributors
-============
-
-Core Developers
----------------
-
-These contributors have commit flags for the repository,
-and are able to accept and merge pull requests.
-
-=========================== ================= ===========
-Name Github Twitter
-=========================== ================= ===========
-Daniel Roy Greenfeld `@pydanny`_ @pydanny
-Audrey Roy Greenfeld* `@audreyr`_ @audreyr
-Fábio C. Barrionuevo da Luz `@luzfcb`_ @luzfcb
-Saurabh Kumar `@theskumar`_ @_theskumar
-Jannis Gebauer `@jayfk`_
-Burhan Khalid `@burhan`_ @burhan
-Nikita Shupeyko `@webyneter`_ @webyneter
-Bruno Alla `@browniebroke`_ @_BrunoAlla
-Wan Liuyang `@sfdye`_ @sfdye
-=========================== ================= ===========
-
-*Audrey is also the creator of Cookiecutter. Audrey and
-Daniel are on the Cookiecutter core team.*
-
-.. _@pydanny: https://github.com/pydanny
-.. _@luzfcb: https://github.com/luzfcb
-.. _@theskumar: https://github.com/theskumar
-.. _@audreyr: https://github.com/audreyr
-.. _@jayfk: https://github.com/jayfk
-.. _@webyneter: https://github.com/webyneter
-.. _@browniebroke: https://github.com/browniebroke
-.. _@sfdye: https://github.com/sfdye
-
-Other Contributors
-------------------
-
-Listed in alphabetical order.
-
-========================== ============================ ==============
- Name Github Twitter
-========================== ============================ ==============
- 18 `@dezoito`_
- 2O4 `@2O4`_
- a7p `@a7p`_
- Aadith PM `@aadithpm`_
- Aaron Eikenberry `@aeikenberry`_
- Adam Bogdał `@bogdal`_
- Adam Dobrawy `@ad-m`_
- Adam Steele `@adammsteele`_
- Agam Dua
- Agustín Scaramuzza `@scaramagus`_ @scaramagus
- Alberto Sanchez `@alb3rto`_
- Alex Tsai `@caffodian`_
- Alvaro [Andor] `@andor-pierdelacabeza`_
- Amjith Ramanujam `@amjith`_
- Andreas Meistad `@ameistad`_
- Andres Gonzalez `@andresgz`_
- Andrew Mikhnevich `@zcho`_
- Andrew Chen Wang `@Andrew-Chen-Wang`_
- Andy Rose
- Anna Callahan `@jazztpt`_
- Anna Sidwell `@takkaria`_
- Antonia Blair `@antoniablair`_ @antoniablairart
- Anuj Bansal `@ahhda`_
- Arcuri Davide `@dadokkio`_
- Areski Belaid `@areski`_
- AsheKR `@ashekr`_
- Ashley Camba
- Barclay Gauld `@yunti`_
- Bartek `@btknu`_
- Ben Lopatin
- Ben Warren `@bwarren2`_
- Benjamin Abel
- Bert de Miranda `@bertdemiranda`_
- Bo Lopker `@blopker`_
- Bo Peng `@BoPeng`_
- Bouke Haarsma
- Brent Payne `@brentpayne`_ @brentpayne
- Bruce Olivier `@bolivierjr`_
- Burhan Khalid `@burhan`_ @burhan
- Caio Ariede `@caioariede`_ @caioariede
- Carl Johnson `@carlmjohnson`_ @carlmjohnson
- Catherine Devlin `@catherinedevlin`_
- Cédric Gaspoz `@cgaspoz`_
- Charlie Smith `@chuckus`_
- Chris Curvey `@ccurvey`_
- Chris Franklin
- Chris Franklin `@hairychris`_
- Chris Pappalardo `@ChrisPappalardo`_
- Christopher Clarke `@chrisdev`_
- Cole Mackenzie `@cmackenzie1`_
- Cole Maclean `@cole`_ @cole
- Collederas `@Collederas`_
- Corey Garvey `@coreygarvey`_
- Craig Margieson `@cmargieson`_
- Cristian Vargas `@cdvv7788`_
- Cullen Rhodes `@c-rhodes`_
- Curtis St Pierre `@curtisstpierre`_ @cstpierre1388
- Dan Shultz `@shultz`_
- Dani Hodovic `@danihodovic`_
- Daniel Hepper `@dhepper`_ @danielhepper
- Daniel Hillier `@danifus`_
- Daniel Sears `@highpost`_ @highpost
- Daniele Tricoli `@eriol`_
- David Díaz `@ddiazpinto`_ @DavidDiazPinto
- Davit Tovmasyan `@davitovmasyan`_
- Davur Clementsen `@dsclementsen`_ @davur
- Delio Castillo `@jangeador`_ @jangeador
- Demetris Stavrou `@demestav`_
- Denis Bobrov `@delneg`_
- Denis Orehovsky `@apirobot`_
- Denis Savran `@blaxpy`_
- Diane Chen `@purplediane`_ @purplediane88
- Dónal Adams `@epileptic-fish`_
- Dong Huynh `@trungdong`_
- Duda Nogueira `@dudanogueira`_ @dudanogueira
- Emanuel Calso `@bloodpet`_ @bloodpet
- Eraldo Energy `@eraldo`_
- Eric Groom `@ericgroom`_
- Ernesto Cedeno `@codnee`_
- Eyad Al Sibai `@eyadsibai`_
- Felipe Arruda `@arruda`_
- Florian Idelberger `@step21`_ @windrush
- Gabriel Mejia `@elgartoinf`_ @elgartoinf
- Garry Cairns `@garry-cairns`_
- Garry Polley `@garrypolley`_
- Gilbishkosma `@Gilbishkosma`_
- Glenn Wiskur `@gwiskur`_
- Guilherme Guy `@guilherme1guy`_
- Hamish Durkin `@durkode`_
- Hana Quadara `@hanaquadara`_
- Hannah Lazarus `@hanhanhan`_
- Harry Moreno `@morenoh149`_ @morenoh149
- Harry Percival `@hjwp`_
- Hendrik Schneider `@hendrikschneider`_
- Henrique G. G. Pereira `@ikkebr`_
- Howie Zhao `@howiezhao`_
- Ian Lee `@IanLee1521`_
- Irfan Ahmad `@erfaan`_ @erfaan
- Isaac12x `@Isaac12x`_
- Ivan Khomutov `@ikhomutov`_
- James Williams `@jameswilliams1`_
- Jan Fabry `@janfabry`_
- Jan Van Bruggen `@jvanbrug`_
- Jelmer Draaijer `@foarsitter`_
- Jerome Caisip `@jeromecaisip`_
- Jens Nilsson `@phiberjenz`_
- Jerome Leclanche `@jleclanche`_ @Adys
- Jimmy Gitonga `@afrowave`_ @afrowave
- John Cass `@jcass77`_ @cass_john
- Jonathan Thompson `@nojanath`_
- Jules Cheron `@jules-ch`_
- Julien Almarcha `@sladinji`_
- Julio Castillo `@juliocc`_
- Kaido Kert `@kaidokert`_
- kappataumu `@kappataumu`_ @kappataumu
- Kaveh `@ka7eh`_
- Keith Bailey `@keithjeb`_
- Keith Webber `@townie`_
- Kevin A. Stone
- Kevin Ndung'u `@kevgathuku`_
- Keyvan Mosharraf `@keyvanm`_
- Krzysztof Szumny `@noisy`_
- Krzysztof Żuraw `@krzysztofzuraw`_
- Leo won `@leollon`_
- Leo Zhou `@glasslion`_
- Leon Kim `@PilhwanKim`_
- Leonardo Jimenez `@xpostudio4`_
- Lin Xianyi `@iynaix`_
- Luis Nell `@originell`_
- Lukas Klein
- Lyla Fischer
- Malik Sulaimanov `@flyudvik`_ @flyudvik
- Martin Blech
- Martin Saizar `@msaizar`_
- Mateusz Ostaszewski `@mostaszewski`_
- Mathijs Hoogland `@MathijsHoogland`_
- Matt Braymer-Hayes `@mattayes`_ @mattayes
- Matt Knapper `@mknapper1`_
- Matt Linares
- Matt Menzenski `@menzenski`_
- Matt Warren `@mfwarren`_
- Matthew Sisley `@mjsisley`_
- Matthias Sieber `@manonthemat`_ @MatzeOne
- Meghan Heintz `@dot2dotseurat`_
- Mesut Yılmaz `@myilmaz`_
- Michael Gecht `@mimischi`_ @_mischi
- Michael Samoylov `@msamoylov`_
- Min ho Kim `@minho42`_
- mozillazg `@mozillazg`_
- Nico Stefani `@nicolas471`_ @moby_dick91
- Oleg Russkin `@rolep`_
- Pablo `@oubiga`_
- Parbhat Puri `@parbhat`_
- Pawan Chaurasia `@rjsnh1522`_
- Peter Bittner `@bittner`_
- Peter Coles `@mrcoles`_
- Philipp Matthies `@canonnervio`_
- Pierre Chiquet `@pchiquet`_
- Raony Guimarães Corrêa `@raonyguimaraes`_
- Raphael Pierzina `@hackebrot`_
- Reggie Riser `@reggieriser`_
- René Muhl `@rm--`_
- Richard Hajdu `@Tusky`_
- Roman Afanaskin `@siauPatrick`_
- Roman Osipenko `@romanosipenko`_
- Russell Davies
- Sam Collins `@MightySCollins`_
- Sascha `@saschalalala`_ @saschalalala
- Shupeyko Nikita `@webyneter`_
- Sławek Ehlert `@slafs`_
- Sorasful `@sorasful`_
- Srinivas Nyayapati `@shireenrao`_
- stepmr `@stepmr`_
- Steve Steiner `@ssteinerX`_
- Sudarshan Wadkar `@wadkar`_
- Sule Marshall `@suledev`_
- Tano Abeleyra `@tanoabeleyra`_
- Taylor Baldwin
- Théo Segonds `@show0k`_
- Tim Claessens `@timclaessens`_
- Tim Freund `@timfreund`_
- Tom Atkins `@knitatoms`_
- Tom Offermann
- Travis McNeill `@Travistock`_ @tavistock_esq
- Tubo Shi `@Tubo`_
- Umair Ashraf `@umrashrf`_ @fabumair
- Vadim Iskuchekov `@Egregors`_ @egregors
- Vicente G. Reyes `@reyesvicente`_ @highcenburg
- Vitaly Babiy
- Vivian Guillen `@viviangb`_
- Vlad Doster `@vladdoster`_
- Will Farley `@goldhand`_ @g01dhand
- William Archinal `@archinal`_
- Xaver Y.R. Chen `@yrchen`_ @yrchen
- Yaroslav Halchenko
- Yuchen Xie `@mapx`_
-========================== ============================ ==============
-
-.. _@aadithpm: https://github.com/aadithpm
-.. _@a7p: https://github.com/a7p
-.. _@2O4: https://github.com/2O4
-.. _@ad-m: https://github.com/ad-m
-.. _@adammsteele: https://github.com/adammsteele
-.. _@aeikenberry: https://github.com/aeikenberry
-.. _@afrowave: https://github.com/afrowave
-.. _@ahhda: https://github.com/ahhda
-.. _@alb3rto: https://github.com/alb3rto
-.. _@ameistad: https://github.com/ameistad
-.. _@amjith: https://github.com/amjith
-.. _@andor-pierdelacabeza: https://github.com/andor-pierdelacabeza
-.. _@andresgz: https://github.com/andresgz
-.. _@antoniablair: https://github.com/antoniablair
-.. _@Andrew-Chen-Wang: https://github.com/Andrew-Chen-Wang
-.. _@apirobot: https://github.com/apirobot
-.. _@archinal: https://github.com/archinal
-.. _@areski: https://github.com/areski
-.. _@arruda: https://github.com/arruda
-.. _@ashekr: https://github.com/ashekr
-.. _@bertdemiranda: https://github.com/bertdemiranda
-.. _@bittner: https://github.com/bittner
-.. _@blaxpy: https://github.com/blaxpy
-.. _@bloodpet: https://github.com/bloodpet
-.. _@blopker: https://github.com/blopker
-.. _@bogdal: https://github.com/bogdal
-.. _@bolivierjr: https://github.com/bolivierjr
-.. _@BoPeng: https://github.com/BoPeng
-.. _@brentpayne: https://github.com/brentpayne
-.. _@btknu: https://github.com/btknu
-.. _@burhan: https://github.com/burhan
-.. _@bwarren2: https://github.com/bwarren2
-.. _@c-rhodes: https://github.com/c-rhodes
-.. _@caffodian: https://github.com/caffodian
-.. _@canonnervio: https://github.com/canonnervio
-.. _@caioariede: https://github.com/caioariede
-.. _@carlmjohnson: https://github.com/carlmjohnson
-.. _@catherinedevlin: https://github.com/catherinedevlin
-.. _@ccurvey: https://github.com/ccurvey
-.. _@cdvv7788: https://github.com/cdvv7788
-.. _@cgaspoz: https://github.com/cgaspoz
-.. _@chrisdev: https://github.com/chrisdev
-.. _@ChrisPappalardo: https://github.com/ChrisPappalardo
-.. _@chuckus: https://github.com/chuckus
-.. _@cmackenzie1: https://github.com/cmackenzie1
-.. _@cmargieson: https://github.com/cmargieson
-.. _@codnee: https://github.com/codnee
-.. _@cole: https://github.com/cole
-.. _@Collederas: https://github.com/Collederas
-.. _@curtisstpierre: https://github.com/curtisstpierre
-.. _@dadokkio: https://github.com/dadokkio
-.. _@danihodovic: https://github.com/danihodovic
-.. _@danifus: https://github.com/danifus
-.. _@davitovmasyan: https://github.com/davitovmasyan
-.. _@ddiazpinto: https://github.com/ddiazpinto
-.. _@delneg: https://github.com/delneg
-.. _@demestav: https://github.com/demestav
-.. _@dezoito: https://github.com/dezoito
-.. _@dhepper: https://github.com/dhepper
-.. _@dot2dotseurat: https://github.com/dot2dotseurat
-.. _@dudanogueira: https://github.com/dudanogueira
-.. _@dsclementsen: https://github.com/dsclementsen
-.. _@guilherme1guy: https://github.com/guilherme1guy
-.. _@durkode: https://github.com/durkode
-.. _@Egregors: https://github.com/Egregors
-.. _@elgartoinf: https://gihub.com/elgartoinf
-.. _@epileptic-fish: https://gihub.com/epileptic-fish
-.. _@eraldo: https://github.com/eraldo
-.. _@erfaan: https://github.com/erfaan
-.. _@ericgroom: https://github.com/ericgroom
-.. _@eriol: https://github.com/eriol
-.. _@eyadsibai: https://github.com/eyadsibai
-.. _@flyudvik: https://github.com/flyudvik
-.. _@foarsitter: https://github.com/foarsitter
-.. _@garry-cairns: https://github.com/garry-cairns
-.. _@garrypolley: https://github.com/garrypolley
-.. _@Gilbishkosma: https://github.com/Gilbishkosma
-.. _@gwiskur: https://github.com/gwiskur
-.. _@glasslion: https://github.com/glasslion
-.. _@goldhand: https://github.com/goldhand
-.. _@hackebrot: https://github.com/hackebrot
-.. _@hairychris: https://github.com/hairychris
-.. _@hanaquadara: https://github.com/hanaquadara
-.. _@hanhanhan: https://github.com/hanhanhan
-.. _@hendrikschneider: https://github.com/hendrikschneider
-.. _@highpost: https://github.com/highpost
-.. _@hjwp: https://github.com/hjwp
-.. _@howiezhao: https://github.com/howiezhao
-.. _@IanLee1521: https://github.com/IanLee1521
-.. _@ikhomutov: https://github.com/ikhomutov
-.. _@jameswilliams1: https://github.com/jameswilliams1
-.. _@ikkebr: https://github.com/ikkebr
-.. _@Isaac12x: https://github.com/Isaac12x
-.. _@iynaix: https://github.com/iynaix
-.. _@janfabry: https://github.com/janfabry
-.. _@jangeador: https://github.com/jangeador
-.. _@jazztpt: https://github.com/jazztpt
-.. _@jcass77: https://github.com/jcass77
-.. _@jeromecaisip: https://github.com/jeromecaisip
-.. _@jleclanche: https://github.com/jleclanche
-.. _@jules-ch: https://github.com/jules-ch
-.. _@juliocc: https://github.com/juliocc
-.. _@jvanbrug: https://github.com/jvanbrug
-.. _@ka7eh: https://github.com/ka7eh
-.. _@kaidokert: https://github.com/kaidokert
-.. _@kappataumu: https://github.com/kappataumu
-.. _@keithjeb: https://github.com/keithjeb
-.. _@kevgathuku: https://github.com/kevgathuku
-.. _@keyvanm: https://github.com/keyvanm
-.. _@knitatoms: https://github.com/knitatoms
-.. _@krzysztofzuraw: https://github.com/krzysztofzuraw
-.. _@leollon: https://github.com/leollon
-.. _@MathijsHoogland: https://github.com/MathijsHoogland
-.. _@mapx: https://github.com/mapx
-.. _@manonthemat: https://github.com/manonthemat
-.. _@mattayes: https://github.com/mattayes
-.. _@menzenski: https://github.com/menzenski
-.. _@mfwarren: https://github.com/mfwarren
-.. _@MightySCollins: https://github.com/MightySCollins
-.. _@mimischi: https://github.com/mimischi
-.. _@minho42: https://github.com/minho42
-.. _@mjsisley: https://github.com/mjsisley
-.. _@mknapper1: https://github.com/mknapper1
-.. _@morenoh149: https://github.com/morenoh149
-.. _@mostaszewski: https://github.com/mostaszewski
-.. _@mozillazg: https://github.com/mozillazg
-.. _@mrcoles: https://github.com/mrcoles
-.. _@msaizar: https://github.com/msaizar
-.. _@msamoylov: https://github.com/msamoylov
-.. _@myilmaz: https://github.com/myilmaz
-.. _@nicolas471: https://github.com/nicolas471
-.. _@noisy: https://github.com/noisy
-.. _@nojanath: https://github.com/nojanath
-.. _@originell: https://github.com/originell
-.. _@oubiga: https://github.com/oubiga
-.. _@parbhat: https://github.com/parbhat
-.. _@rjsnh1522: https://github.com/rjsnh1522
-.. _@pchiquet: https://github.com/pchiquet
-.. _@phiberjenz: https://github.com/phiberjenz
-.. _@PilhwanKim: https://github.com/PilhwanKim
-.. _@purplediane: https://github.com/purplediane
-.. _@raonyguimaraes: https://github.com/raonyguimaraes
-.. _@reggieriser: https://github.com/reggieriser
-.. _@reyesvicente: https://github.com/reyesvicente
-.. _@rm--: https://github.com/rm--
-.. _@Tusky: https://github.com/Tusky
-.. _@rolep: https://github.com/rolep
-.. _@romanosipenko: https://github.com/romanosipenko
-.. _@saschalalala: https://github.com/saschalalala
-.. _@scaramagus: https://github.com/scaramagus
-.. _@shireenrao: https://github.com/shireenrao
-.. _@show0k: https://github.com/show0k
-.. _@shultz: https://github.com/shultz
-.. _@siauPatrick: https://github.com/siauPatrick
-.. _@sladinji: https://github.com/sladinji
-.. _@slafs: https://github.com/slafs
-.. _@sorasful: https://github.com/sorasful
-.. _@ssteinerX: https://github.com/ssteinerx
-.. _@step21: https://github.com/step21
-.. _@stepmr: https://github.com/stepmr
-.. _@suledev: https://github.com/suledev
-.. _@takkaria: https://github.com/takkaria
-.. _@tanoabeleyra: https://github.com/tanoabeleyra
-.. _@timclaessens: https://github.com/timclaessens
-.. _@timfreund: https://github.com/timfreund
-.. _@townie: https://github.com/townie
-.. _@Travistock: https://github.com/Tavistock
-.. _@trungdong: https://github.com/trungdong
-.. _@Tubo: https://github.com/tubo
-.. _@umrashrf: https://github.com/umrashrf
-.. _@viviangb: https://github.com/viviangb
-.. _@vladdoster: https://github.com/vladdoster
-.. _@wadkar: https://github.com/wadkar
-.. _@xpostudio4: https://github.com/xpostudio4
-.. _@yrchen: https://github.com/yrchen
-.. _@yunti: https://github.com/yunti
-.. _@zcho: https://github.com/zcho
-
-Special Thanks
-~~~~~~~~~~~~~~
-
-The following haven't provided code directly, but have provided guidance and advice.
-
-* Jannis Leidel
-* Nate Aune
-* Barry Morrison
diff --git a/requirements.txt b/requirements.txt
index 9661a823..96d5046e 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -16,3 +16,8 @@ pytest==6.0.1
pytest-cookies==0.5.1
pytest-instafail==0.4.2
pyyaml==5.3.1
+
+# Scripting
+# ------------------------------------------------------------------------------
+PyGithub
+jinja2
diff --git a/scripts/__init__.py b/scripts/__init__.py
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/scripts/__init__.py
@@ -0,0 +1 @@
+
diff --git a/scripts/update_contributors.py b/scripts/update_contributors.py
new file mode 100644
index 00000000..8423ccd6
--- /dev/null
+++ b/scripts/update_contributors.py
@@ -0,0 +1,104 @@
+import json
+from pathlib import Path
+from github import Github
+from github.NamedUser import NamedUser
+from jinja2 import Template
+
+CURRENT_FILE = Path(__file__)
+ROOT = CURRENT_FILE.parents[1]
+BOT_LOGINS = ["pyup-bot"]
+
+
+def main() -> None:
+ """
+ Script entry point.
+
+ 1. Fetch recent contribtors from the Github API
+ 2. Add missing ones to the JSON file
+ 3. Generate Markdown from JSON file
+ """
+ recent_authors = set(iter_recent_authors())
+
+ # Add missing users to the JSON file
+ contrib_file = ContributorsJSONFile()
+ for author in recent_authors:
+ print(f"Checking if {author.login} should be added")
+ if author.login not in contrib_file:
+ contrib_file.add_contributor(author)
+ print(f"Added {author.login} to contributors")
+ contrib_file.save()
+
+ # Generate MD file from JSON file
+ write_md_file(contrib_file.content)
+
+
+def iter_recent_authors():
+ """
+ Fetch users who opened recently merged pull requests.
+
+ Use Github API to fetch recent authors rather than
+ git CLI to work with Github usernames.
+ """
+ repo = Github(per_page=5).get_repo("pydanny/cookiecutter-django")
+ recent_pulls = repo.get_pulls(
+ state="closed", sort="updated", direction="desc"
+ ).get_page(0)
+ for pull in recent_pulls:
+ if (
+ pull.merged
+ and pull.user.type == "User"
+ and pull.user.login not in BOT_LOGINS
+ ):
+ yield pull.user
+
+
+class ContributorsJSONFile:
+ """Helper to interact with the JSON file."""
+
+ file_path = ROOT / ".github" / "contributors.json"
+ content = None
+
+ def __init__(self) -> None:
+ """Read initial content."""
+ self.content = json.loads(self.file_path.read_text())
+
+ def __contains__(self, github_login: str):
+ """Provide a nice API to do: `username in file`."""
+ return any(
+ # Github usernames are case insensitive
+ github_login.lower() == contrib["github_login"].lower()
+ for contrib in self.content
+ )
+
+ def add_contributor(self, user: NamedUser):
+ """Append the contributor data we care about at the end."""
+ contributor_data = {
+ "name": user.name or user.login,
+ "github_login": user.login,
+ "twitter_username": user.twitter_username or "",
+ }
+ self.content.append(contributor_data)
+
+ def save(self):
+ """Write the file to disk with indentation."""
+ text_content = json.dumps(self.content, indent=2, ensure_ascii=False)
+ self.file_path.write_text(text_content)
+
+
+def write_md_file(contributors):
+ """Generate markdown file from Jinja template."""
+ contributors_template = ROOT / ".github" / "CONTRIBUTORS-template.md"
+ template = Template(contributors_template.read_text(), autoescape=True)
+ core_contributors = [c for c in contributors if c.get("is_core", False)]
+ other_contributors = (c for c in contributors if not c.get("is_core", False))
+ other_contributors = sorted(other_contributors, key=lambda c: c["name"].lower())
+ content = template.render(
+ core_contributors=core_contributors, other_contributors=other_contributors
+ )
+
+ file_path = ROOT / "CONTRIBUTORS.md"
+ file_path.write_text(content)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/tox.ini b/tox.ini
index 242183c3..cecc7435 100644
--- a/tox.ini
+++ b/tox.ini
@@ -8,4 +8,4 @@ commands = pytest {posargs:./tests}
[testenv:black-template]
deps = black
-commands = black --check hooks tests setup.py docs
+commands = black --check hooks tests setup.py docs scripts