udata-hydra 2.0.0.dev1953__tar.gz → 2.0.0.dev2045__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/PKG-INFO +1 -1
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/pyproject.toml +1 -2
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/analysis/csv.py +4 -5
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/analysis/resource.py +2 -3
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/app.py +2 -3
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/crawl.py +2 -3
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/README.md +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/__init__.py +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/analysis/__init__.py +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/analysis/errors.py +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/analysis/helpers.py +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/cli.py +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/config_default.toml +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/context.py +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/logger.py +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/migrations/__init__.py +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/migrations/csv/20221205_initial_up_rev1.sql +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/migrations/csv/20230130_drop_migrations.sql +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/migrations/csv/20230206_datetime_aware.sql +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/migrations/main/20221205_initial_up_rev1.sql +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/migrations/main/20221206_rev1_up_rev2.sql +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/migrations/main/20221206_rev2_up_rev3.sql +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/migrations/main/20221208_rev3_up_rev4.sql +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/migrations/main/20221208_rev4_up_rev5.sql +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/migrations/main/20230119_rev5_up_rev6.sql +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/migrations/main/20230121_rev6_up_rev7.sql +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/migrations/main/20230121_rev7_up_rev8.sql +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/migrations/main/20230130_drop_migrations.sql +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/migrations/main/20230206_datetime_aware.sql +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/migrations/main/20230515_rev8_up_rev9.sql +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/migrations/main/20230606_rev9_up_rev10.sql +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/migrations/main/20231102_drop_csv_analysis.sql +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/utils/__init__.py +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/utils/csv.py +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/utils/db.py +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/utils/file.py +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/utils/http.py +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/utils/json.py +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/utils/minio.py +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/utils/queue.py +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/utils/reader.py +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/utils/timer.py +0 -0
- {udata_hydra-2.0.0.dev1953 → udata_hydra-2.0.0.dev2045}/udata_hydra/worker.py +0 -0
|
@@ -9,7 +9,7 @@ readme = "README.md"
|
|
|
9
9
|
|
|
10
10
|
[tool.poetry]
|
|
11
11
|
name = "udata-hydra"
|
|
12
|
-
version = "2.0.0.
|
|
12
|
+
version = "2.0.0.dev2045"
|
|
13
13
|
description = "Async crawler and parsing service for data.gouv.fr"
|
|
14
14
|
authors = ["Opendata Team <opendatateam@data.gouv.fr>"]
|
|
15
15
|
license = "MIT"
|
|
@@ -59,7 +59,6 @@ module = [
|
|
|
59
59
|
"csv_detective.*",
|
|
60
60
|
"humanfriendly.*",
|
|
61
61
|
"minicli.*",
|
|
62
|
-
"pytz.*",
|
|
63
62
|
"sqlalchemy.*",
|
|
64
63
|
"str2bool.*",
|
|
65
64
|
"str2float.*",
|
|
@@ -4,10 +4,9 @@ import json
|
|
|
4
4
|
import logging
|
|
5
5
|
import os
|
|
6
6
|
import sys
|
|
7
|
-
from datetime import datetime
|
|
7
|
+
from datetime import datetime, timezone
|
|
8
8
|
from typing import Any, Union
|
|
9
9
|
|
|
10
|
-
import pytz
|
|
11
10
|
import sentry_sdk
|
|
12
11
|
from csv_detective.detection import engine_to_file
|
|
13
12
|
from csv_detective.explore_csv import routine as csv_detective_routine
|
|
@@ -132,7 +131,7 @@ async def analyse_csv(
|
|
|
132
131
|
|
|
133
132
|
try:
|
|
134
133
|
if check_id:
|
|
135
|
-
await update_check(check_id, {"parsing_started_at": datetime.now(
|
|
134
|
+
await update_check(check_id, {"parsing_started_at": datetime.now(timezone.utc)})
|
|
136
135
|
csv_inspection = await perform_csv_inspection(tmp_file.name)
|
|
137
136
|
timer.mark("csv-inspection")
|
|
138
137
|
await csv_to_db(tmp_file.name, csv_inspection, table_name, debug_insert=debug_insert)
|
|
@@ -142,7 +141,7 @@ async def analyse_csv(
|
|
|
142
141
|
check_id,
|
|
143
142
|
{
|
|
144
143
|
"parsing_table": table_name,
|
|
145
|
-
"parsing_finished_at": datetime.now(
|
|
144
|
+
"parsing_finished_at": datetime.now(timezone.utc),
|
|
146
145
|
},
|
|
147
146
|
)
|
|
148
147
|
await csv_to_db_index(table_name, csv_inspection, check)
|
|
@@ -287,7 +286,7 @@ async def handle_parse_exception(e: Exception, check_id: int, table_name: str) -
|
|
|
287
286
|
err = f"{e.step}:sentry:{event_id}" if config.SENTRY_DSN else f"{e.step}:{str(e.__cause__)}"
|
|
288
287
|
await update_check(
|
|
289
288
|
check_id,
|
|
290
|
-
{"parsing_error": err, "parsing_finished_at": datetime.now(
|
|
289
|
+
{"parsing_error": err, "parsing_finished_at": datetime.now(timezone.utc)},
|
|
291
290
|
)
|
|
292
291
|
log.error("Parsing error", exc_info=e)
|
|
293
292
|
else:
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import logging
|
|
3
3
|
import os
|
|
4
|
-
from datetime import datetime
|
|
4
|
+
from datetime import datetime, timezone
|
|
5
5
|
from enum import Enum
|
|
6
6
|
from typing import Tuple, Union
|
|
7
7
|
|
|
8
8
|
import magic
|
|
9
|
-
import pytz
|
|
10
9
|
from dateparser import parse as date_parser
|
|
11
10
|
|
|
12
11
|
from udata_hydra import config, context
|
|
@@ -151,7 +150,7 @@ async def detect_resource_change_from_checksum(
|
|
|
151
150
|
data = await connection.fetchrow(q, resource_id)
|
|
152
151
|
if data and data["checksum"] != new_checksum:
|
|
153
152
|
return Change.HAS_CHANGED, {
|
|
154
|
-
"analysis:last-modified-at": datetime.now(
|
|
153
|
+
"analysis:last-modified-at": datetime.now(timezone.utc).isoformat(),
|
|
155
154
|
"analysis:last-modified-detection": "computed-checksum",
|
|
156
155
|
}
|
|
157
156
|
return Change.NO_GUESS, None
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import os
|
|
3
|
-
from datetime import datetime, timedelta
|
|
3
|
+
from datetime import datetime, timedelta, timezone
|
|
4
4
|
|
|
5
|
-
import pytz
|
|
6
5
|
from aiohttp import web
|
|
7
6
|
from humanfriendly import parse_timespan
|
|
8
7
|
from marshmallow import Schema, ValidationError, fields
|
|
@@ -208,7 +207,7 @@ async def status_crawler(request: web.Request) -> web.Response:
|
|
|
208
207
|
stats_catalog = await request.app["pool"].fetchrow(q)
|
|
209
208
|
|
|
210
209
|
since = parse_timespan(config.SINCE)
|
|
211
|
-
since = datetime.now(
|
|
210
|
+
since = datetime.now(timezone.utc) - timedelta(seconds=since)
|
|
212
211
|
q = f"""
|
|
213
212
|
SELECT
|
|
214
213
|
SUM(CASE WHEN checks.created_at <= $1 THEN 1 ELSE 0 END) AS count_outdated
|
|
@@ -7,7 +7,6 @@ from typing import Tuple, Union
|
|
|
7
7
|
from urllib.parse import urlparse
|
|
8
8
|
|
|
9
9
|
import aiohttp
|
|
10
|
-
import pytz
|
|
11
10
|
from humanfriendly import parse_timespan
|
|
12
11
|
|
|
13
12
|
from udata_hydra import config, context
|
|
@@ -86,7 +85,7 @@ async def compute_check_has_changed(check_data, last_check) -> bool:
|
|
|
86
85
|
"check:available": is_valid_status(check_data.get("status")),
|
|
87
86
|
"check:status": check_data.get("status"),
|
|
88
87
|
"check:timeout": check_data["timeout"],
|
|
89
|
-
"check:date": datetime.now(
|
|
88
|
+
"check:date": datetime.now(timezone.utc).isoformat(),
|
|
90
89
|
"check:error": check_data.get("error"),
|
|
91
90
|
"check:headers:content-type": await get_content_type_from_header(
|
|
92
91
|
check_data.get("headers", {})
|
|
@@ -413,7 +412,7 @@ async def crawl_batch():
|
|
|
413
412
|
# if not enough for our batch size, handle outdated checks
|
|
414
413
|
if len(to_check) < config.BATCH_SIZE:
|
|
415
414
|
since = parse_timespan(config.SINCE) # in seconds
|
|
416
|
-
since = datetime.now(
|
|
415
|
+
since = datetime.now(timezone.utc) - timedelta(seconds=since)
|
|
417
416
|
limit = config.BATCH_SIZE - len(to_check)
|
|
418
417
|
q = f"""
|
|
419
418
|
SELECT * FROM (
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|