diff --git a/pypistats/templates/faqs.html b/pypistats/templates/faqs.html new file mode 100644 index 0000000..3784174 --- /dev/null +++ b/pypistats/templates/faqs.html @@ -0,0 +1,37 @@ +{% extends "layout.html" %} +{% block title %}PyPI Download Stats{% endblock %} +{% block body %} +

FAQs

+
+

+ What is the source of the download data? +

+

+ PyPI provides download records as a publicly available dataset on Google's BigQuery. You can access the data with a Google Cloud account here. +

+

+ When is the website data updated? +

+

+ The data update begins at 01:00:00 UTC and should take less than 10 minutes. +

+

+ Why are there so many more downloads after July 26, 2018? +

+

+ PyPI download records are generated by a service known as linehaul. The previous iteration of the service had an issue which caused it to restart regularly due to running out of memory, resulting in a large quantity of dropped download records. On July 26, a newer version of the service was deployed, which is much more robust and reliable. +

+

+ Why are the cumulative download counts different from the sum of the downloads from the overall chart? +

+

+ The cumulative download counts consider only the download records which are not from a known set of PyPI mirror applications, namely bandersnatch, z3c.pypimirror, Artifactory, and devpi. In other words, the cumulative download counts take the sum of the downloads from the Without_mirrors dataset from the chart. +

+

+ Why disregard mirrors from aggregated data? +

+

+ The intent of disregarding mirrors is to provide metrics that reflect end-user download aggregation. +

+ +{% endblock %} diff --git a/pypistats/templates/layout.html b/pypistats/templates/layout.html index 8af7310..7e1488f 100644 --- a/pypistats/templates/layout.html +++ b/pypistats/templates/layout.html @@ -65,6 +65,8 @@
About
+ FAQs +

diff --git a/pypistats/views/general.py b/pypistats/views/general.py index 65b1684..3cbf5d6 100644 --- a/pypistats/views/general.py +++ b/pypistats/views/general.py @@ -80,6 +80,12 @@ def about(): return render_template("about.html", user=g.user) +@blueprint.route("/faqs") +def faqs(): + """Render the FAQs page.""" + return render_template("faqs.html", user=g.user) + + @blueprint.route("/packages/") def package(package): """Render the package page."""