peterbe: PS. (friendly reminder)

```
$ pip install -e ".[dev,test]"
$ therapist install
```

...and you won't have `black` errors in commits. 
diff --git a/main.py b/main.py
index e977978..c73f863 100644
--- a/main.py
+++ b/main.py
@@ -1,3 +1,4 @@
+from datetime import datetime
 from fnmatch import fnmatch
 from urllib.parse import urlencode
 
@@ -164,10 +165,21 @@ def run(verbose=False, dry_run=False):
     query_result = data["query_result"]
     data = query_result["data"]
     rows = data["rows"]
+
+    # Determine the date range of this dataset.
+    # We `pop()` the columns to eventually keep statuses only.
+    min_timestamp = min(row.pop("min_timestamp") for row in rows)
+    max_timestamp = max(row.pop("max_timestamp") for row in rows)
+    click.secho(
+        "📅 From {} to {}".format(
+            datetime.utcfromtimestamp(min_timestamp),
+            datetime.utcfromtimestamp(max_timestamp),
+        )
+    )
+
     bad_rows = []
     for row in rows:
         source = row.pop("source")
-
         if exclude_source(source):
             log(f"Skipping {source!r} because it's excluded")
             continue

Show date range
It would be useful to see the date range that we are processing. 

I'm having doubts because when running this script I don't see any `custom_1_error` status, whereas I see some in the events table [on Databricks](https://dbc-caf9527b-e073.cloud.databricks.com/#notebook/82773/command/82775)

![screenshot from 2019-03-05 11-46-12](https://user-images.githubusercontent.com/546692/53800133-50575880-3f3c-11e9-90ea-92a977478223.png)

diff --git a/test_main.py b/test_main.py
index 15e6406..c1e7902 100644
--- a/test_main.py
+++ b/test_main.py
@@ -22,6 +22,8 @@ def test_run_no_problems(capsys):
                 "rows": [
                     {
                         "source": "foo/bar",
+                        "min_timestamp": 1_551_657_600,
+                        "max_timestamp": 1_551_743_999,
                         "success": 123_456,
                         "up_to_date": 234_567,
                         "network_error": 1234,
@@ -31,6 +33,8 @@ def test_run_no_problems(capsys):
                     # This one should be ignored
                     {
                         "source": "trouble/maker",
+                        "min_timestamp": 1_551_657_600,
+                        "max_timestamp": 1_551_743_999,
                         "success": 100_000,
                         "up_to_date": 200_000,
                         "network_error": 75000,
@@ -51,6 +55,7 @@ def test_run_no_problems(capsys):
     error_rate_str = f"{error_rate:.2f}%"
     captured = capsys.readouterr()
     assert error_rate_str in captured.out
+    assert "From 2019-03-04 00:00:00 to 2019-03-04 23:59:59" in captured.out
 
 
 @responses.activate
@@ -62,6 +67,8 @@ def test_run_problems(capsys):
                 "rows": [
                     {
                         "source": "foo/bar",
+                        "min_timestamp": 1_551_657_600,
+                        "max_timestamp": 1_551_743_999,
                         "success": 123_456,
                         "up_to_date": 234_567,
                         "network_error": 12340,

pip install -e .[dev,test]
parse_log_pytest
pytest
pytest
3.7
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs @ file:///croot/attrs_1668696182826/work
black==23.3.0
bleach==6.0.0
cattrs==23.1.2
certifi @ file:///croot/certifi_1671487769961/work/certifi
cffi==1.15.1
charset-normalizer==3.4.1
click==8.1.8
colorama==0.4.6
cryptography==44.0.2
distlib==0.3.9
docutils==0.20.1
exceptiongroup==1.2.2
filelock==3.12.2
flake8==5.0.4
flit_core @ file:///opt/conda/conda-bld/flit-core_1644941570762/work/source/flit_core
idna==3.10
importlib-metadata==4.2.0
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
jaraco.classes==3.2.3
jeepney==0.9.0
keyring==23.9.3
markdown-it-py==2.2.0
mccabe==0.7.0
mdurl==0.1.2
more-itertools==9.1.0
mypy-extensions==1.0.0
packaging @ file:///croot/packaging_1671697413597/work
pathspec==0.11.2
pkginfo==1.10.0
platformdirs==2.6.2
pluggy @ file:///tmp/build/80754af9/pluggy_1648042572264/work
py @ file:///opt/conda/conda-bld/py_1644396412707/work
pycodestyle==2.9.1
pycparser==2.21
pyflakes==2.5.0
Pygments==2.17.2
pytest==7.4.4
pytest-env==1.0.1
python-decouple==3.8
PyYAML==6.0.1
readme-renderer==37.3
-e git+https://github.com/mozilla/remote-settings-uptake-health.git@361264fa0c67d2989e6d7da9797d7b6428cad722#egg=remote_settings_uptake_health
requests==2.31.0
requests-cache==1.1.1
requests-toolbelt==1.0.0
responses==0.23.3
rfc3986==2.0.0
rich==13.8.1
SecretStorage==3.3.3
sentry-sdk==2.24.1
six==1.17.0
therapist==2.2.0
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work
tox==3.28.0
twine==4.0.2
typed-ast==1.5.5
types-PyYAML==6.0.12.12
typing_extensions==4.7.1
url-normalize==1.4.3
urllib3==2.0.7
virtualenv==20.16.2
webencodings==0.5.1
zipp @ file:///croot/zipp_1672387121353/work

name: remote-settings-uptake-health
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=22.1.0=py37h06a4308_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2022.12.7=py37h06a4308_0
  - flit-core=3.6.0=pyhd3eb1b0_0
  - importlib_metadata=4.11.3=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=22.0=py37h06a4308_0
  - pip=22.3.1=py37h06a4308_0
  - pluggy=1.0.0=py37h06a4308_1
  - py=1.11.0=pyhd3eb1b0_0
  - python=3.7.16=h7a1cb2a_0
  - readline=8.2=h5eee18b_0
  - setuptools=65.6.3=py37h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py37h06a4308_0
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.11.0=py37h06a4308_0
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - black==23.3.0
      - bleach==6.0.0
      - cattrs==23.1.2
      - cffi==1.15.1
      - charset-normalizer==3.4.1
      - click==8.1.8
      - colorama==0.4.6
      - cryptography==44.0.2
      - distlib==0.3.9
      - docutils==0.20.1
      - exceptiongroup==1.2.2
      - filelock==3.12.2
      - flake8==5.0.4
      - idna==3.10
      - importlib-metadata==4.2.0
      - jaraco-classes==3.2.3
      - jeepney==0.9.0
      - keyring==23.9.3
      - markdown-it-py==2.2.0
      - mccabe==0.7.0
      - mdurl==0.1.2
      - more-itertools==9.1.0
      - mypy-extensions==1.0.0
      - pathspec==0.11.2
      - pkginfo==1.10.0
      - platformdirs==2.6.2
      - pycodestyle==2.9.1
      - pycparser==2.21
      - pyflakes==2.5.0
      - pygments==2.17.2
      - pytest==7.4.4
      - pytest-env==1.0.1
      - python-decouple==3.8
      - pyyaml==6.0.1
      - readme-renderer==37.3
      - requests==2.31.0
      - requests-cache==1.1.1
      - requests-toolbelt==1.0.0
      - responses==0.23.3
      - rfc3986==2.0.0
      - rich==13.8.1
      - secretstorage==3.3.3
      - sentry-sdk==2.24.1
      - six==1.17.0
      - therapist==2.2.0
      - tox==3.28.0
      - twine==4.0.2
      - typed-ast==1.5.5
      - types-pyyaml==6.0.12.12
      - typing-extensions==4.7.1
      - url-normalize==1.4.3
      - urllib3==2.0.7
      - virtualenv==20.16.2
      - webencodings==0.5.1
prefix: /opt/conda/envs/remote-settings-uptake-health

test_main.py::test_run_no_problems test_main.py::test_run_problems
test_main.py::test_downloader
main.py
main.py