geo-activity-playground 1.1.0__py3-none-any.whl → 1.3.0__py3-none-any.whl

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.
Files changed (44) hide show
  1. geo_activity_playground/alembic/versions/85fe0348e8a2_add_time_series_uuid_field.py +28 -0
  2. geo_activity_playground/alembic/versions/f2f50843be2d_make_all_fields_in_activity_nullable.py +34 -0
  3. geo_activity_playground/core/coordinates.py +12 -1
  4. geo_activity_playground/core/copernicus_dem.py +95 -0
  5. geo_activity_playground/core/datamodel.py +78 -22
  6. geo_activity_playground/core/enrichment.py +226 -164
  7. geo_activity_playground/core/paths.py +8 -0
  8. geo_activity_playground/core/test_pandas_timezone.py +36 -0
  9. geo_activity_playground/core/test_time_zone_from_location.py +7 -0
  10. geo_activity_playground/core/test_time_zone_import.py +93 -0
  11. geo_activity_playground/core/test_timezone_sqlalchemy.py +44 -0
  12. geo_activity_playground/core/tiles.py +4 -1
  13. geo_activity_playground/core/time_conversion.py +42 -14
  14. geo_activity_playground/explorer/tile_visits.py +7 -4
  15. geo_activity_playground/importers/activity_parsers.py +21 -22
  16. geo_activity_playground/importers/directory.py +62 -108
  17. geo_activity_playground/importers/strava_api.py +53 -36
  18. geo_activity_playground/importers/strava_checkout.py +30 -56
  19. geo_activity_playground/webui/app.py +40 -2
  20. geo_activity_playground/webui/blueprints/activity_blueprint.py +13 -11
  21. geo_activity_playground/webui/blueprints/entry_views.py +1 -1
  22. geo_activity_playground/webui/blueprints/explorer_blueprint.py +1 -7
  23. geo_activity_playground/webui/blueprints/heatmap_blueprint.py +2 -2
  24. geo_activity_playground/webui/blueprints/photo_blueprint.py +65 -56
  25. geo_activity_playground/webui/blueprints/settings_blueprint.py +20 -14
  26. geo_activity_playground/webui/blueprints/summary_blueprint.py +6 -6
  27. geo_activity_playground/webui/blueprints/time_zone_fixer_blueprint.py +69 -0
  28. geo_activity_playground/webui/blueprints/upload_blueprint.py +3 -16
  29. geo_activity_playground/webui/columns.py +9 -1
  30. geo_activity_playground/webui/templates/activity/show.html.j2 +3 -1
  31. geo_activity_playground/webui/templates/equipment/index.html.j2 +3 -3
  32. geo_activity_playground/webui/templates/hall_of_fame/index.html.j2 +2 -3
  33. geo_activity_playground/webui/templates/home.html.j2 +4 -10
  34. geo_activity_playground/webui/templates/page.html.j2 +2 -0
  35. geo_activity_playground/webui/templates/photo/new.html.j2 +1 -1
  36. geo_activity_playground/webui/templates/settings/index.html.j2 +9 -0
  37. geo_activity_playground/webui/templates/settings/tile-source.html.j2 +33 -0
  38. geo_activity_playground/webui/templates/time_zone_fixer/index.html.j2 +31 -0
  39. {geo_activity_playground-1.1.0.dist-info → geo_activity_playground-1.3.0.dist-info}/METADATA +7 -3
  40. {geo_activity_playground-1.1.0.dist-info → geo_activity_playground-1.3.0.dist-info}/RECORD +43 -34
  41. geo_activity_playground/core/test_time_conversion.py +0 -37
  42. {geo_activity_playground-1.1.0.dist-info → geo_activity_playground-1.3.0.dist-info}/LICENSE +0 -0
  43. {geo_activity_playground-1.1.0.dist-info → geo_activity_playground-1.3.0.dist-info}/WHEEL +0 -0
  44. {geo_activity_playground-1.1.0.dist-info → geo_activity_playground-1.3.0.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,69 @@
1
+ import logging
2
+
3
+ import sqlalchemy
4
+ from flask import Blueprint
5
+ from flask import redirect
6
+ from flask import render_template
7
+ from flask import Response
8
+ from flask import url_for
9
+
10
+ from ...core.config import Config
11
+ from ...core.datamodel import Activity
12
+ from ...core.datamodel import DB
13
+ from ...core.enrichment import enrichment_set_timezone
14
+ from ...core.enrichment import update_and_commit
15
+ from ...explorer.tile_visits import TileVisitAccessor
16
+ from ..authenticator import Authenticator
17
+ from ..authenticator import needs_authentication
18
+
19
+ logger = logging.getLogger(__name__)
20
+
21
+
22
+ def make_time_zone_fixer_blueprint(
23
+ authenticator: Authenticator, config: Config, tile_visit_accessor: TileVisitAccessor
24
+ ) -> Blueprint:
25
+
26
+ blueprint = Blueprint("time_zone_fixer", __name__, template_folder="templates")
27
+
28
+ @blueprint.route("/")
29
+ def index() -> str:
30
+ return render_template("time_zone_fixer/index.html.j2")
31
+
32
+ @blueprint.route("/local-to-utc")
33
+ @needs_authentication(authenticator)
34
+ def local_to_utc():
35
+ convert(True)
36
+ return redirect(url_for("index"))
37
+
38
+ @blueprint.route("/utc-to-utc")
39
+ @needs_authentication(authenticator)
40
+ def utc_to_utc():
41
+ convert(False)
42
+ return redirect(url_for("index"))
43
+
44
+ def convert(from_iana: bool) -> None:
45
+ for activity in DB.session.scalars(sqlalchemy.select(Activity)).all():
46
+ if activity.start is None:
47
+ continue
48
+
49
+ logger.info(f"Changing time zone for {activity.name} …")
50
+
51
+ time_series = activity.raw_time_series
52
+ enrichment_set_timezone(activity, time_series, config)
53
+ if time_series["time"].dt.tz is None:
54
+ time_series["time"] = time_series["time"].dt.tz_localize(
55
+ activity.iana_timezone if from_iana else "UTC"
56
+ )
57
+ time_series["time"] = time_series["time"].dt.tz_convert("UTC")
58
+ update_and_commit(activity, time_series, config)
59
+
60
+ @blueprint.route("/truncate-activities")
61
+ @needs_authentication(authenticator)
62
+ def truncate_activities():
63
+ DB.session.query(Activity).delete()
64
+ DB.session.commit()
65
+ tile_visit_accessor.reset()
66
+ tile_visit_accessor.save()
67
+ return redirect(url_for("upload.reload"))
68
+
69
+ return blueprint
@@ -13,13 +13,9 @@ from ...core.activities import ActivityRepository
13
13
  from ...core.config import Config
14
14
  from ...core.datamodel import Activity
15
15
  from ...core.datamodel import DB
16
- from ...core.datamodel import Kind
17
- from ...core.enrichment import populate_database_from_extracted
18
- from ...core.tasks import work_tracker_path
19
16
  from ...explorer.tile_visits import compute_tile_evolution
20
17
  from ...explorer.tile_visits import compute_tile_visits_new
21
18
  from ...explorer.tile_visits import TileVisitAccessor
22
- from ...importers.directory import get_file_hash
23
19
  from ...importers.directory import import_from_directory
24
20
  from ...importers.strava_api import import_from_strava_api
25
21
  from ...importers.strava_checkout import import_from_strava_checkout
@@ -122,22 +118,13 @@ def scan_for_activities(
122
118
  skip_strava: bool = False,
123
119
  ) -> None:
124
120
  if pathlib.Path("Activities").exists():
125
- import_from_directory(config.metadata_extraction_regexes, config)
121
+ import_from_directory(repository, tile_visit_accessor, config)
126
122
  if pathlib.Path("Strava Export").exists():
127
- import_from_strava_checkout()
123
+ import_from_strava_checkout(config)
128
124
  if config.strava_client_code and not skip_strava:
129
- import_from_strava_api(config)
130
-
131
- populate_database_from_extracted(config)
125
+ import_from_strava_api(config, repository, tile_visit_accessor)
132
126
 
133
127
  if len(repository) > 0:
134
- kinds = DB.session.scalars(sqlalchemy.select(Kind)).all()
135
- if all(kind.consider_for_achievements == False for kind in kinds):
136
- for kind in kinds:
137
- kind.consider_for_achievements = True
138
- DB.session.commit()
139
- tile_visit_accessor.reset()
140
- work_tracker_path("tile-state").unlink(missing_ok=True)
141
128
  compute_tile_visits_new(repository, tile_visit_accessor)
142
129
  compute_tile_evolution(tile_visit_accessor.tile_state, config)
143
130
  tile_visit_accessor.save()
@@ -60,6 +60,7 @@ column_speed = ColumnDescription(
60
60
  unit="km/h",
61
61
  format=".1f",
62
62
  )
63
+
63
64
  column_elevation = ColumnDescription(
64
65
  name="elevation",
65
66
  display_name="Elevation",
@@ -67,4 +68,11 @@ column_elevation = ColumnDescription(
67
68
  format=".0f",
68
69
  )
69
70
 
70
- TIME_SERIES_COLUMNS = [column_speed, column_elevation]
71
+ column_copernicus_elevation = ColumnDescription(
72
+ name="copernicus_elevation",
73
+ display_name="Elevation (Copernicus DEM)",
74
+ unit="m",
75
+ format=".0f",
76
+ )
77
+
78
+ TIME_SERIES_COLUMNS = [column_speed, column_elevation, column_copernicus_elevation]
@@ -44,7 +44,7 @@
44
44
  (60/activity.average_speed_elapsed_kmh)|round(1) }} min/km</dd>
45
45
  <dt>Start time</dt>
46
46
  <dd><a href="{{ url_for('activity.day', year=date.year, month=date.month, day=date.day) }}">{{ date }}</a>
47
- {{ time }}
47
+ {{ time }} {{ activity.iana_timezone }}
48
48
  </dd>
49
49
  {% endif %}
50
50
 
@@ -79,6 +79,8 @@
79
79
  <dd>{{ activity.upstream_id }}</dd>
80
80
  <dt>Source path</dt>
81
81
  <dd><a href="{{ url_for('.download_original', id=activity.id) }}">{{ activity.path }}</a></dd>
82
+ <dt>Time series path</dt>
83
+ <dd>{{ activity.time_series_path }}</dd>
82
84
  </dl>
83
85
 
84
86
  <a href="{{ url_for('.edit', id=activity['id']) }}" class="btn btn-secondary btn-small">Edit</a>
@@ -49,13 +49,13 @@
49
49
  <h3>{{ equipment }}</h3>
50
50
  <div class="row mb-3">
51
51
  <div class="col-md-4">
52
- {{ vega_direct(data.total_distances_plot_id, data.total_distances_plot) }}
52
+ {{ vega_direct(data.total_distances_plot) }}
53
53
  </div>
54
54
  <div class="col-md-4">
55
- {{ vega_direct(data.yearly_distance_plot_id, data.yearly_distance_plot) }}
55
+ {{ vega_direct(data.yearly_distance_plot) }}
56
56
  </div>
57
57
  <div class="col-md-4">
58
- {{ vega_direct(data.usages_plot_id, data.usages_plot) }}
58
+ {{ vega_direct(data.usages_plot) }}
59
59
  </div>
60
60
  </div>
61
61
  {% endfor %}
@@ -44,9 +44,8 @@
44
44
  {% endfor %}
45
45
  </ul>
46
46
  </p>
47
- <p class="card-text"><small class="text-body-secondary"></small>{{ activity.kind }} with {{
48
- (activity.distance_km)|round(1) }} km / {{activity.elevation_gain|round|int}} m in {{
49
- activity.elapsed_time|td }} on {{ activity.start|dt }}</small></p>
47
+ <p class="card-text"><small class="text-body-secondary"></small>{{ activity.emoji_string }} on {{
48
+ activity.start_local_tz|dt }} {{ activity.iana_timezone }}</small></p>
50
49
  </div>
51
50
  </div>
52
51
  </div>
@@ -46,17 +46,11 @@
46
46
  <h5 class="card-title">{{ elem.activity.name }}</h5>
47
47
  </a>
48
48
  <p class="card-text">
49
- {{ elem.activity.kind.name }} with
50
- 📏 {{ (elem.activity.distance_km)|round(1) }} km
51
- {% if elem.activity.elapsed_time %}
52
- ⏱️ {{ elem.activity.elapsed_time|td }}
53
- {% endif %}
54
- {% if elem.activity.elevation_gain %}
55
- ⛰️ {{ (elem.activity.elevation_gain)|round|int }} m
56
- {% endif %}
49
+ {{ elem.activity.emoji_string }}
57
50
  </p>
58
- {% if elem.activity.start %}
59
- <p class="card-text"><small class="text-body-secondary">{{ elem.activity.start|dt }}</small></p>
51
+ {% if elem.activity.start_local_tz %}
52
+ <p class="card-text"><small class="text-body-secondary">{{ elem.activity.start_local_tz|dt }} {{
53
+ elem.activity.iana_timezone }}</small></p>
60
54
  {% endif %}
61
55
  </div>
62
56
  </div>
@@ -151,6 +151,8 @@
151
151
  </li>
152
152
  <li><a class="dropdown-item" href="{{ url_for('settings.index') }}">Settings</a></li>
153
153
  <li><a class="dropdown-item" href="{{ url_for('export.index') }}">Data Export</a></li>
154
+ <li><a class="dropdown-item" href="{{ url_for('time_zone_fixer.index') }}">Time Zone
155
+ Fixer</a></li>
154
156
  </ul>
155
157
  </li>
156
158
 
@@ -6,7 +6,7 @@
6
6
  <form method="POST" enctype="multipart/form-data">
7
7
  <div class="mb-3">
8
8
  <label for="file" class="form-label">Photo file</label>
9
- <input type="file" name="file" id="file" class="form-control">
9
+ <input type="file" name="file" id="file" class="form-control" multiple>
10
10
  </div>
11
11
  <button type="submit" class="btn btn-primary">Upload</button>
12
12
  </form>
@@ -56,6 +56,15 @@
56
56
  </div>
57
57
  </div>
58
58
  </div>
59
+ <div class="col">
60
+ <div class="card">
61
+ <div class="card-body">
62
+ <h5 class="card-title">Map tile source</h5>
63
+ <p class="card-text">Change the source of the map tiles.</p>
64
+ <a href="{{ url_for('.tile_source') }}" class="btn btn-primary">Change tile source</a>
65
+ </div>
66
+ </div>
67
+ </div>
59
68
  <div class="col">
60
69
  <div class="card">
61
70
  <div class="card-body">
@@ -0,0 +1,33 @@
1
+ {% extends "page.html.j2" %}
2
+
3
+ {% block container %}
4
+
5
+ <h1 class="mb-3">Tile Source</h1>
6
+
7
+ <p>You can change the tile source to be whatever you like. Be aware that different sources have different licensing
8
+ constraints. It is on you to make sure that you are allowed to use the tiles from the source that you enter. See <a
9
+ href="https://wiki.openstreetmap.org/wiki/Raster_tile_providers" target="_blank">this list of raster tile
10
+ providers</a> for inspiration.</p>
11
+
12
+
13
+ <form action="" method="POST" class="mb-3">
14
+ <div class="mb-3">
15
+ <label for="map_tile_url" class="form-label">Map tile URL</label>
16
+ <input type="text" class="form-control" id="map_tile_url" name="map_tile_url" value="{{ map_tile_url }}" />
17
+ </div>
18
+ <div class="mb-3">
19
+ <label for="map_tile_attribution" class="form-label">Map tile attribution</label>
20
+ <input type="text" class="form-control" id="map_tile_attribution" name="map_tile_attribution"
21
+ value="{{ map_tile_attribution|e }}" />
22
+ </div>
23
+
24
+ <button type="submit" class="btn btn-primary">Save</button>
25
+ </form>
26
+
27
+ <h2>Test image</h2>
28
+
29
+ <p>This is a tile using your current tile source:</p>
30
+
31
+ <p><img src="{{ test_url }}"></p>
32
+
33
+ {% endblock %}
@@ -0,0 +1,31 @@
1
+ {% extends "page.html.j2" %}
2
+
3
+ {% block container %}
4
+
5
+ <h1 class="mb-3">Time Zone Fixer</h1>
6
+
7
+ <p>Prior to version 1.3.0, activity times were interpreted in the local time zone. If your software recorded in UTC, it
8
+ was assumed that this was your local time zone. This assumption was often wrong. With version 1.3.0, this got fixed.
9
+ Activities will be imported using UTC or specified time zone. They will then be localized into the time zone of the
10
+ activity position.</p>
11
+
12
+ <p>Use this tool to fix activities which were imported with an older version.</p>
13
+
14
+ <p>Your activities are shown in the local time zone of the activity but no time zone is shown. </p>
15
+ <p><a class="btn btn-small btn-danger" href="{{ url_for('.local_to_utc') }}"
16
+ onclick="if(!confirm('Are you sure to run this?')){ event.preventDefault() }">Interpret times as local time
17
+ zone</a></p>
18
+
19
+ <p>Your activities seem to be UTC and don't confirm to the local time zone. You have the impression that all the times
20
+ are off.</p>
21
+ <p><a class="btn btn-small btn-danger" href="{{ url_for('.utc_to_utc') }}"
22
+ onclick="if(!confirm('Are you sure to run this?')){ event.preventDefault() }">Interpret times as UTC</a></p>
23
+
24
+ <p>Everything seems broken. You want to reload all your activities. Be aware that with Strava API that can take ages due
25
+ to the rate limiting. Also be aware that this will delete all changes that you did after importing the activity
26
+ (changing the name, equipment, adding tags, trimming the activity). </p>
27
+ <p><a class="btn btn-small btn-danger" href="{{ url_for('.truncate_activities') }}"
28
+ onclick="if(!confirm('Are you sure to run this?')){ event.preventDefault() }">Throw all activities away and
29
+ rescan</a></p>
30
+
31
+ {% endblock %}
@@ -1,14 +1,13 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: geo-activity-playground
3
- Version: 1.1.0
3
+ Version: 1.3.0
4
4
  Summary: Analysis of geo data activities like rides, runs or hikes.
5
5
  License: MIT
6
6
  Author: Martin Ueding
7
7
  Author-email: mu@martin-ueding.de
8
- Requires-Python: >=3.10,<3.14
8
+ Requires-Python: >=3.11,<3.14
9
9
  Classifier: License :: OSI Approved :: MIT License
10
10
  Classifier: Programming Language :: Python :: 3
11
- Classifier: Programming Language :: Python :: 3.10
12
11
  Classifier: Programming Language :: Python :: 3.11
13
12
  Classifier: Programming Language :: Python :: 3.12
14
13
  Classifier: Programming Language :: Python :: 3.13
@@ -16,6 +15,7 @@ Requires-Dist: Pillow (>=11.0.0,<12.0.0)
16
15
  Requires-Dist: alembic (>=1.15.2,<2.0.0)
17
16
  Requires-Dist: altair (>=5.5.0,<6.0.0)
18
17
  Requires-Dist: appdirs (>=1.4.4,<2.0.0)
18
+ Requires-Dist: boto3 (>=1.38.45,<2.0.0)
19
19
  Requires-Dist: charset-normalizer (>=3.3.2,<4.0.0)
20
20
  Requires-Dist: coloredlogs (>=15.0.1,<16.0.0)
21
21
  Requires-Dist: exifread (>=3.2.0,<4.0.0)
@@ -24,15 +24,19 @@ Requires-Dist: flask (>=3.0.0,<4.0.0)
24
24
  Requires-Dist: flask-alembic (>=3.1.1,<4.0.0)
25
25
  Requires-Dist: flask-sqlalchemy (>=3.1.1,<4.0.0)
26
26
  Requires-Dist: geojson (>=3.0.1,<4.0.0)
27
+ Requires-Dist: geotiff (>=0.2.10,<0.3.0)
27
28
  Requires-Dist: gpxpy (>=1.5.0,<2.0.0)
29
+ Requires-Dist: imagecodecs (>=2025.3.30,<2026.0.0)
28
30
  Requires-Dist: jinja2 (>=3.1.2,<4.0.0)
29
31
  Requires-Dist: matplotlib (>=3.10.1,<4.0.0)
32
+ Requires-Dist: numcodecs (<0.15.0)
30
33
  Requires-Dist: numpy (>=2.2.3,<3.0.0)
31
34
  Requires-Dist: openpyxl (>=3.1.5,<4.0.0)
32
35
  Requires-Dist: pandas (>=2.2.3,<3.0.0)
33
36
  Requires-Dist: pyarrow (>=19.0.1,<20.0.0)
34
37
  Requires-Dist: python-dateutil (>=2.8.2,<3.0.0)
35
38
  Requires-Dist: requests (>=2.28.1,<3.0.0)
39
+ Requires-Dist: scipy (>=1.16.0,<2.0.0)
36
40
  Requires-Dist: shapely (>=2.0.5,<3.0.0)
37
41
  Requires-Dist: sqlalchemy (>=2.0.40,<3.0.0)
38
42
  Requires-Dist: stravalib (>=2.0,<3.0)
@@ -7,25 +7,28 @@ geo_activity_playground/alembic/versions/0f02b92c4f94_add_tag_color.py,sha256=gW
7
7
  geo_activity_playground/alembic/versions/38882503dc7c_add_tags_to_activities.py,sha256=HmvYgHlVodHB7xyigg7zHkFXSi1znWqKfOHcd6y9sZE,3157
8
8
  geo_activity_playground/alembic/versions/451e7836b53d_add_square_planner_bookmark.py,sha256=WrmlDllnJECg6cSOeS05wYCa977_SXbJUV5khDSzntw,1082
9
9
  geo_activity_playground/alembic/versions/63d3b7f6f93c_initial_version.py,sha256=YTnnENkQ8WqLz7PFof7tUWNkWcoHGkAfAM52x1N9umo,3029
10
+ geo_activity_playground/alembic/versions/85fe0348e8a2_add_time_series_uuid_field.py,sha256=BLvofqUnySKGnUisiZxxcDISEMo6GIo9djLaXCnmKPg,861
10
11
  geo_activity_playground/alembic/versions/93cc82ad1b60_add_parametricplotspec.py,sha256=P9nG348kz6Wi2lD8lJ_f-0juBtlJb1tqBWYqP2XMQPE,1365
11
12
  geo_activity_playground/alembic/versions/ab83b9d23127_add_upstream_id.py,sha256=Wz02lBP2r7-09DjuQP8u8i7ypQ2SZU5RUc422-_ZBDk,851
12
13
  geo_activity_playground/alembic/versions/b03491c593f6_add_crop_indices.py,sha256=1pt7aes0PWJXZ98HxqeDK-ehaU9KLApjCmZYoqCa8V0,975
13
14
  geo_activity_playground/alembic/versions/da2cba03b71d_add_photos.py,sha256=_DvUge61HsoF9LppXuavIzjAhoe1kp-dnaynxtd9h30,1394
14
15
  geo_activity_playground/alembic/versions/dc8073871da7_add_plotspec_group_by.py,sha256=AekV_JiJM5Q2RNf57XjnJpknAQZQ1cGBvKjj7Jtn304,845
15
16
  geo_activity_playground/alembic/versions/e02e27876deb_add_square_planner_bookmark_name.py,sha256=Y0OMxp5z_-CQ83rww6GEBFRawXu0J0pLrLArgSjJ7wQ,866
17
+ geo_activity_playground/alembic/versions/f2f50843be2d_make_all_fields_in_activity_nullable.py,sha256=b0GnskwsjyyftveEDD8Kaff8Vk1gZjikZPrkAW9AbHY,1321
16
18
  geo_activity_playground/alembic/versions/script.py.mako,sha256=3qBrHBf7F7ChKDUIdiNItiSXrDpgQdM7sR0YKzpaC50,689
17
19
  geo_activity_playground/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
20
  geo_activity_playground/core/activities.py,sha256=apP_-Rg1ub3lh7RARMGXf2BOmJTiahxqpX_soEnYF3E,4681
19
21
  geo_activity_playground/core/config.py,sha256=mmdMQ5iCLNGnAlriT1ETEVS-gM6Aq_9sg22QECHj4n8,5358
20
- geo_activity_playground/core/coordinates.py,sha256=tDfr9mlXhK6E_MMIJ0vYWVCoH0Lq8uyuaqUgaa8i0jg,966
21
- geo_activity_playground/core/datamodel.py,sha256=FDeoejm2OOzh2ZYjIXV24fI29V6m91LGxvBoGUFLY6g,13901
22
- geo_activity_playground/core/enrichment.py,sha256=Tju9sKI-V40CmsS9RiNeGz-Zhp_hx1xjlaWzJMrasXI,7640
22
+ geo_activity_playground/core/coordinates.py,sha256=rW_OmMRpTUyIsQwrT6mgT9Y6uPGuwqTo5XDDMS7mGuo,1140
23
+ geo_activity_playground/core/copernicus_dem.py,sha256=U6pvUAymLCX4CpbQKvUoXRj8LYdlaQTKtEVlrlHH3kw,2934
24
+ geo_activity_playground/core/datamodel.py,sha256=3LdTm7lqykeLM6KYviW9WamgnS61nGNl-NHSEQdwTXY,15765
25
+ geo_activity_playground/core/enrichment.py,sha256=gb8amLAjpcEYTeseQl6U6kOy8o1p63pzvoOf2f7iryY,8597
23
26
  geo_activity_playground/core/export.py,sha256=ayOmhWL72263oP9NLIZRYCg_Db0GLUFhgNIL_MCrV-E,4435
24
27
  geo_activity_playground/core/heart_rate.py,sha256=-S3WAhS7AOywrw_Lk5jfuo_fu6zvZQ1VtjwEKSycWpU,1542
25
28
  geo_activity_playground/core/meta_search.py,sha256=nyvCuR7v0pd6KjA8W5Kr71bBafRdE_ol7uSFRJs4eAM,6662
26
29
  geo_activity_playground/core/missing_values.py,sha256=HjonaLV0PFMICnuMrbdUNnK9uy_8PBh_RxI5GuEMQK0,250
27
30
  geo_activity_playground/core/parametric_plot.py,sha256=8CKB8dey7EmZtQnl6IOgBhpxkw0UCpQPWeiBw5PqW8k,5737
28
- geo_activity_playground/core/paths.py,sha256=GGNpqhQL7etn8-NV6hVGLT7yBZYq7AwXnWfX3l_Cj48,2670
31
+ geo_activity_playground/core/paths.py,sha256=qQ4ujaIHmsxTGEWzf-76XS8FclEI2RC5COTUeuLEbDI,2938
29
32
  geo_activity_playground/core/privacy_zones.py,sha256=4TumHsVUN1uW6RG3ArqTXDykPVipF98DCxVBe7YNdO8,512
30
33
  geo_activity_playground/core/raster_map.py,sha256=Cq8dNLdxVQg3Agzn2bmXVu0-8kZf56QrSe-LKNn3jaU,7994
31
34
  geo_activity_playground/core/similarity.py,sha256=L2de3DPRdDeDY5AxZwLDcH7FjHWRWklr41VNU06q9kQ,3117
@@ -34,49 +37,53 @@ geo_activity_playground/core/tasks.py,sha256=-_9cxekoHSWzCW4XblNeqrwi2tTqr5AE7_-
34
37
  geo_activity_playground/core/test_datamodel.py,sha256=-VrGHgx5Z3MSQPqHGmmm7atRJYbg5y_ukvRHKxk22PI,569
35
38
  geo_activity_playground/core/test_meta_search.py,sha256=zhuD343Xce-4Fkznw81DHQ7pK5eyX5UbcyCHuYRKsr8,3091
36
39
  geo_activity_playground/core/test_missing_values.py,sha256=7yvg6dUu7p8PR_rxUxgFaJCrGzfYUcF8Zf6y7bCEYKw,356
40
+ geo_activity_playground/core/test_pandas_timezone.py,sha256=-MDiLoLG5tDMqkI0iKno24kFn9X3tslh9ZpoDYLWNJU,771
37
41
  geo_activity_playground/core/test_summary_stats.py,sha256=qH_45mPRFD2H-Rr0Ku-RYc67vhC7qKxbPr7J2F36uV8,3081
38
42
  geo_activity_playground/core/test_tiles.py,sha256=zce1FxNfsSpOQt66jMehdQRVoNdl-oiFydx6iVBHZXM,764
39
- geo_activity_playground/core/test_time_conversion.py,sha256=Sh6nZA3uCTOdZTZa3yOijtR0m74QtZu2mcWXsDNnyQI,984
40
- geo_activity_playground/core/tiles.py,sha256=lV6X1Uc9XQecu2LALIvxpnMcLsVtWx7JczJ5a_S1eZE,2139
41
- geo_activity_playground/core/time_conversion.py,sha256=x5mXG6Y4GtdX7CBmwucGNSWBp9JQJDbZ7u0JkdUY1Vs,379
43
+ geo_activity_playground/core/test_time_zone_from_location.py,sha256=PKxDysm8D0FJjyuc4Kzrv65UxzP-ogUtFHQZ7mGKZQw,229
44
+ geo_activity_playground/core/test_time_zone_import.py,sha256=1CAJyGTHYPoxabBNVRfLhaRNbvvWcAYjJyDR-qvbRjg,3349
45
+ geo_activity_playground/core/test_timezone_sqlalchemy.py,sha256=OXjdowGXM-DsM4-Mpab8c3j3AtdW_yXp2NgI-B_cbvA,1172
46
+ geo_activity_playground/core/tiles.py,sha256=LBn2V6WAvMxZeXSIQ8ruZL71iyvOXoFZMz7PZgNUf7M,2189
47
+ geo_activity_playground/core/time_conversion.py,sha256=F-vQ-MdbTOqPTAELplDjT5m7kdaf1RsqBXELfsR5eOU,1329
42
48
  geo_activity_playground/explorer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
49
  geo_activity_playground/explorer/grid_file.py,sha256=YNL_c4O1-kxaajATJwj4ZLywCL5Hpj9qy2h-F7rk8Yg,3260
44
- geo_activity_playground/explorer/tile_visits.py,sha256=ESHI67xV53gmhMXAFzoPR0Uz7lc8T2gViyvjckrBo90,13907
50
+ geo_activity_playground/explorer/tile_visits.py,sha256=WK_H5fdy3S69BT4zZGP0R92qq5MlNRJMp25BrMj6O2Q,13884
45
51
  geo_activity_playground/explorer/video.py,sha256=7j6Qv3HG6On7Tn7xh7Olwrx_fbQnfzS7CeRg3TEApHg,4397
46
52
  geo_activity_playground/heatmap_video.py,sha256=I8i1uVvbbPUXVtvLAROaLy58nQoUPnuMCZkERWNkQjg,3318
47
53
  geo_activity_playground/importers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
- geo_activity_playground/importers/activity_parsers.py,sha256=yD7L5eDOpiLWf6RHSQf4-Nk2S3vgfVHngc9ZlFSrioM,11090
54
+ geo_activity_playground/importers/activity_parsers.py,sha256=HVkW4Ql5vVRPlrhHgJEWeCEc1yTEWQTgJ6rkKOPWAfQ,10955
49
55
  geo_activity_playground/importers/csv_parser.py,sha256=O1pP5GLhWhnWcy2Lsrr9g17Zspuibpt-GtZ3ZS5eZF4,2143
50
- geo_activity_playground/importers/directory.py,sha256=eTLfcMdc5mt9iDBinuaXjRIA688i6QZQjXNNhm1PKz4,5282
51
- geo_activity_playground/importers/strava_api.py,sha256=J0-VXNrLq22fhTcWkQPE5AVrzy5aegC7SBi-UXFtAy4,7576
52
- geo_activity_playground/importers/strava_checkout.py,sha256=NwcOje0XxkccXRY5-3CJorYLFuniaFm8VHg4nHwkji4,10045
56
+ geo_activity_playground/importers/directory.py,sha256=kkutzFliffBjxj1GJrqhMp2cLeiAK6ZGE9Gi6Ptl-NY,3255
57
+ geo_activity_playground/importers/strava_api.py,sha256=LG8M8NRSv3kK3npf9gSY20YcqzJ0xiQoVEv0oeDXbNY,8309
58
+ geo_activity_playground/importers/strava_checkout.py,sha256=eDzjK0r3rMICSMBtfSlSwwkRxRthWjRUA5zAnblhmNQ,8910
53
59
  geo_activity_playground/importers/test_csv_parser.py,sha256=nOTVTdlzIY0TDcbWp7xNyNaIO6Mkeu55hVziVl22QE4,1092
54
60
  geo_activity_playground/importers/test_directory.py,sha256=_fn_-y98ZyElbG0BRxAmGFdtGobUShPU86SdEOpuv-A,691
55
61
  geo_activity_playground/importers/test_strava_api.py,sha256=7b8bl5Rh2BctCmvTPEhCadxtUOq3mfzuadD6F5XxRio,398
56
62
  geo_activity_playground/webui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
- geo_activity_playground/webui/app.py,sha256=BXSAvvYEs4TRbQBgA_Y8iEI0Mwv3YkZScTcHIGZVYa4,8539
63
+ geo_activity_playground/webui/app.py,sha256=gvvzPpYTlC5KhMOdpvDtiH2jPyvsLMM9Wf4yWkCoyzc,10020
58
64
  geo_activity_playground/webui/authenticator.py,sha256=dhREYOu_TCD_nzFNuSlHIbf5K6TmwKdXtr1wxD8fBcc,1491
59
65
  geo_activity_playground/webui/blueprints/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
- geo_activity_playground/webui/blueprints/activity_blueprint.py,sha256=F_m1jkg9dnQg7f6QfBrBHllFfw6TUuzc4UPMbWsIbI0,26732
66
+ geo_activity_playground/webui/blueprints/activity_blueprint.py,sha256=kfI7GrQUm36GuSNWv8vYQEmT7bshDFrLkWchqesa_9k,26793
61
67
  geo_activity_playground/webui/blueprints/auth_blueprint.py,sha256=iCm3hZphQKR9qFgytOrfnSmr-Og1gHuQ1Djiv2o_bkE,1031
62
68
  geo_activity_playground/webui/blueprints/bubble_chart_blueprint.py,sha256=8R1rUVoyofGhUgesPunys1HoLPYinvhA46BBnMvEn9Q,2880
63
69
  geo_activity_playground/webui/blueprints/calendar_blueprint.py,sha256=SmOu5AfNNoWcJJNduEfPtaPRvr4EZLYAeIDLUK9P1LY,2939
64
70
  geo_activity_playground/webui/blueprints/eddington_blueprints.py,sha256=Ya5GJxfVESwmRlgMTYe9g75g8JHHTAAvYFmSD-3Uz4Q,8987
65
- geo_activity_playground/webui/blueprints/entry_views.py,sha256=5DZOl8t3QouMdr837o3Hj1YH4hyuP_v7l5tvE_MLPl0,2927
71
+ geo_activity_playground/webui/blueprints/entry_views.py,sha256=SDCzpUSb1FAb84tM0SnmrZQvtaTlO-Rqdj94hyIMDSc,2936
66
72
  geo_activity_playground/webui/blueprints/equipment_blueprint.py,sha256=8L_7NZGErvu4jyigi2gg7HN_gegZRdsSFahUH7Dz6Lw,5727
67
- geo_activity_playground/webui/blueprints/explorer_blueprint.py,sha256=vOzDI2lq-eBeBRz9vHMl-LENyeHkHBS68q-6AuBcC_Q,23182
73
+ geo_activity_playground/webui/blueprints/explorer_blueprint.py,sha256=wlInaRbh1Wp-Va9mqcaHsVelBUQsqHusoTvkiynoU2E,22985
68
74
  geo_activity_playground/webui/blueprints/export_blueprint.py,sha256=C9yFH5gEJs2YtWE-EhcGDEyGwwaLgC1umybgIRi6duE,1036
69
75
  geo_activity_playground/webui/blueprints/hall_of_fame_blueprint.py,sha256=zNYKw7ps9Yx9995Zsj4psAlOLnt4tFi2Hwp74-kjmzw,2806
70
- geo_activity_playground/webui/blueprints/heatmap_blueprint.py,sha256=iHI5YJYhX7ZOlzTgzl2efIRDzt3UMYCx7X4-LVd0MWk,8702
71
- geo_activity_playground/webui/blueprints/photo_blueprint.py,sha256=sYGp2XVGodkAifGHbEqpIY-7bBH5R7G7Dwg4HqgxMSY,7269
76
+ geo_activity_playground/webui/blueprints/heatmap_blueprint.py,sha256=qPwvcZLZgAH1g8FQAzjIc5LxKp2bkc7YbZwkjxVJVWc,8730
77
+ geo_activity_playground/webui/blueprints/photo_blueprint.py,sha256=ZBh7Gt5vEzeW8JDK3t-3RcLTT40mbOqRkttkicgcIRM,7885
72
78
  geo_activity_playground/webui/blueprints/plot_builder_blueprint.py,sha256=nGtYblRTJ0rasJvl_L35cs1Iry4LONPy_9TY4ytXB-Q,3838
73
79
  geo_activity_playground/webui/blueprints/search_blueprint.py,sha256=Sv_KL1Cdai26y51qVfI-5jZLhtElREsEar1dbR_VAC4,2275
74
- geo_activity_playground/webui/blueprints/settings_blueprint.py,sha256=FLKQ0JTThUlsCBR2TqRvdDGIJpPDycy47iiQof9gbHA,20077
80
+ geo_activity_playground/webui/blueprints/settings_blueprint.py,sha256=cwes3QmRrC_HMP1g-Yc-x2BJycF4jF3StJl75v9acWo,20377
75
81
  geo_activity_playground/webui/blueprints/square_planner_blueprint.py,sha256=xVaxJxmt8Dysl3UL9f2y__LVLtTH2Np1Ust4OSXKRAk,4746
76
- geo_activity_playground/webui/blueprints/summary_blueprint.py,sha256=AlRnsPUamoqsQ5JD5PpmSsJdhxDgrJOq5O11MQM3gME,6680
82
+ geo_activity_playground/webui/blueprints/summary_blueprint.py,sha256=ZF9Mocewddpn09pElSqrVS6jkqajhEJMn-7KbIvZodY,6751
77
83
  geo_activity_playground/webui/blueprints/tile_blueprint.py,sha256=YzZf9OrNdjhc1_j4MtO1DMcw1uCv29ueNsYd-mWqgbg,837
78
- geo_activity_playground/webui/blueprints/upload_blueprint.py,sha256=3nJGGNYjB22aFXDlgCFMK8t0RRkqQi_Pr33H3DtVP5M,5177
79
- geo_activity_playground/webui/columns.py,sha256=o5gJbMbB5gYlxWP1wktle5Ve_jjymslaJpIyCiKWBKY,1331
84
+ geo_activity_playground/webui/blueprints/time_zone_fixer_blueprint.py,sha256=PEHsk3kRHx2EvQ-6VPD4xeOmXGjh64GMAagFkQ0wbeg,2301
85
+ geo_activity_playground/webui/blueprints/upload_blueprint.py,sha256=K7bWCN9kotklbkrjPR-IV08p9O2aekzG_vuksduSJB4,4609
86
+ geo_activity_playground/webui/columns.py,sha256=FP0YfX-WFQk1JEXhrywv3NUEVq-x7Hv0or35X3Ltf9c,1525
80
87
  geo_activity_playground/webui/flasher.py,sha256=Covc1D9cO_jjokRWnvyiXCc2tfp3aZ8XkNqFdA1AXtk,500
81
88
  geo_activity_playground/webui/plot_util.py,sha256=5Uesjj-xcMskQX2z9viDZYHSxLGrH2a5dHA1ogsJW9U,261
82
89
  geo_activity_playground/webui/search_util.py,sha256=gH2cOM1FTAozZUlSQ4C1dR1xlV-8e82pD1PPi_pPBNY,2647
@@ -119,7 +126,7 @@ geo_activity_playground/webui/templates/activity/day.html.j2,sha256=CHEvxlZralCm
119
126
  geo_activity_playground/webui/templates/activity/edit.html.j2,sha256=r979JPqaZi_2ymTykxpkjdpw0D2tsB9VJaf7OaGPaME,1961
120
127
  geo_activity_playground/webui/templates/activity/lines.html.j2,sha256=_ZDg1ruW-9UMJfOudy1-uY_-IcSSaagq7tPCih5Bb8g,1079
121
128
  geo_activity_playground/webui/templates/activity/name.html.j2,sha256=RYbNGzPexa4gRUWRjw-C9nWvp5lI7agAZZCS3Du7nAs,2661
122
- geo_activity_playground/webui/templates/activity/show.html.j2,sha256=8dcEUYtjJPlInB1G3c3qJAGtpknDkd7YLufTvOT6mcY,10793
129
+ geo_activity_playground/webui/templates/activity/show.html.j2,sha256=e-jMjZ4fBwK4-u0qZmbiN76ZqrptD4xrGYhxwaUQsEE,10913
123
130
  geo_activity_playground/webui/templates/activity/trim.html.j2,sha256=3oAXQab6QqWjGBC9KCvWNOVn8uRmxoDLj3hx_O63TXc,1836
124
131
  geo_activity_playground/webui/templates/auth/index.html.j2,sha256=wzA0uxpiT1ktDadgnjvFXc9iUGMFm9GhjDkavl3S1h4,646
125
132
  geo_activity_playground/webui/templates/bubble_chart/index.html.j2,sha256=yd7lWjtxxVmJZqCiXb0Y1gMEOQ7LQYJXEdpE7JB1OZY,1616
@@ -128,15 +135,15 @@ geo_activity_playground/webui/templates/calendar/month.html.j2,sha256=IEhGqknL69
128
135
  geo_activity_playground/webui/templates/eddington/distance.html.j2,sha256=9cLlIrImgMYYE9AKjhqHMpjpTem8sMEnVHt78krWf7w,3508
129
136
  geo_activity_playground/webui/templates/eddington/elevation_gain.html.j2,sha256=h2mI1Uc1-P7rN_SeCVP_uadpQqX09ZpBG3Z6N8QWNLw,4723
130
137
  geo_activity_playground/webui/templates/elevation_eddington/index.html.j2,sha256=WjquRFWaMzIZrvByhRIuhJbSCUW2HTfMck6THQHZI-I,4743
131
- geo_activity_playground/webui/templates/equipment/index.html.j2,sha256=eI17zEHn4uliJ-JlxWZQEYgpgwAbSy0Ke2IC1zxYBDU,1823
138
+ geo_activity_playground/webui/templates/equipment/index.html.j2,sha256=6pzSCJACMXA1fKgsO_KrCTvpumAKlelzj5f9dReey14,1742
132
139
  geo_activity_playground/webui/templates/explorer/server-side.html.j2,sha256=ynejXeUjb-ZwkvPtbD20R8R1KLUIFsyM5VJgwW7vzM8,3133
133
140
  geo_activity_playground/webui/templates/export/index.html.j2,sha256=vxqpAm9KnT405Qz7q0_td-HZ4mCjcPR4Lp6EnIEWisg,1652
134
- geo_activity_playground/webui/templates/hall_of_fame/index.html.j2,sha256=H81vfgtqvQw-8cxCkixlQwb8gDUx-Y5gpzuyKiN3hew,1900
141
+ geo_activity_playground/webui/templates/hall_of_fame/index.html.j2,sha256=P15fVPjXf0Wf6K_hd_lCMuw6-Q8_qfNqsBOWNpMfoXw,1804
135
142
  geo_activity_playground/webui/templates/heatmap/index.html.j2,sha256=uM-l4gmDKw6307ZH_zb8zroMTKBuOkrR0Bu4fTEJE0s,1231
136
- geo_activity_playground/webui/templates/home.html.j2,sha256=RDTcBi3KEniHB54MW3k5zkjrt1Hh0DkQREMBYBHunQM,2572
137
- geo_activity_playground/webui/templates/page.html.j2,sha256=sN1OmuN4c4g6M4h_hZ8UMX4wsWZq7_r0M8fgzpxyKss,12016
143
+ geo_activity_playground/webui/templates/home.html.j2,sha256=L6U44p05IagWERPxJ99cUMZzZCyhmA5IV7PL-QaO_mg,2258
144
+ geo_activity_playground/webui/templates/page.html.j2,sha256=X3dXpmcV4486St3BLHIBbhZYcb6X_dYBOBSZi_M3Aio,12188
138
145
  geo_activity_playground/webui/templates/photo/map.html.j2,sha256=MWhqt5Q8ExiRhgxndcEnwngOj1qw0E0u4hKuiuY24Gg,1437
139
- geo_activity_playground/webui/templates/photo/new.html.j2,sha256=GGLejO4ap6ZMe54jZP39ktSLkdw5j67bf5PTlHEK7qc,383
146
+ geo_activity_playground/webui/templates/photo/new.html.j2,sha256=0BO4ZJgJQM1Hlp9SHylEOfthpQlywDc-xFs8K_Spptc,392
140
147
  geo_activity_playground/webui/templates/plot-macros.html.j2,sha256=lzsu8c8fcsVjgpdcmpwCa1e6EPALZtCS9RbvQ-DAtAs,2861
141
148
  geo_activity_playground/webui/templates/plot_builder/edit.html.j2,sha256=S_ReKqpSmtf4wPvkRjdNz8WXUBfSIXQ3aJnLMIkLJaY,2519
142
149
  geo_activity_playground/webui/templates/plot_builder/import-spec.html.j2,sha256=jCumhh-xdxKhVEZtkWHFMWPMiE5wdBZVpQVcrbnXr2c,668
@@ -146,7 +153,7 @@ geo_activity_playground/webui/templates/search_form.html.j2,sha256=BBxT2aAUlOZ41
146
153
  geo_activity_playground/webui/templates/settings/admin-password.html.j2,sha256=VYwddpObD1RpeTH5Dm4y7VtmT7kwURDCIjxyzJeq08c,495
147
154
  geo_activity_playground/webui/templates/settings/color-schemes.html.j2,sha256=iR91Wxd2_TMuIo9dBDZBrWSUGHNwTwzC6O8oNH-XBt4,1653
148
155
  geo_activity_playground/webui/templates/settings/heart-rate.html.j2,sha256=UPT3MegRgSeff36lhCo0l3ZwhqNSIg5gM6h2s32GkCY,4255
149
- geo_activity_playground/webui/templates/settings/index.html.j2,sha256=sphzznODrgb9I3SdYoV8zsmnh2FHxzt5NhhrVPPO9wY,5062
156
+ geo_activity_playground/webui/templates/settings/index.html.j2,sha256=mapSC1TTS_cFg7K0eNuTbENTMg2EFb1atPdIj14xU_c,5468
150
157
  geo_activity_playground/webui/templates/settings/manage-equipments.html.j2,sha256=vPGGlwyG_xMZc4a6JdajwWMJBfN1lBNBtDSt6QPJBiY,1585
151
158
  geo_activity_playground/webui/templates/settings/manage-kinds.html.j2,sha256=382VW-cEe0iPJ8TNL2jrcRtVYb_RFdzDyeC1ncpWZ9M,1616
152
159
  geo_activity_playground/webui/templates/settings/metadata-extraction.html.j2,sha256=0g9RlHFKipN45RaH_FANWnY1lfXUkKjtc_9B-vJ19LQ,2298
@@ -157,13 +164,15 @@ geo_activity_playground/webui/templates/settings/strava.html.j2,sha256=GCE5gskQ6
157
164
  geo_activity_playground/webui/templates/settings/tags-edit.html.j2,sha256=Lna2QBacuMwaFODGCVulOpHSHHjqCdhNJg2c6i-ogY0,586
158
165
  geo_activity_playground/webui/templates/settings/tags-list.html.j2,sha256=6giFWtVCTLXLC_Ojh56XhB_1Rouit9YzIs_YHIiayLg,369
159
166
  geo_activity_playground/webui/templates/settings/tags-new.html.j2,sha256=xi6KbwydDVrUJM4_ty4KbMa74k3QaoyZhZAn2paERnM,358
167
+ geo_activity_playground/webui/templates/settings/tile-source.html.j2,sha256=C9kRBBuorjZ8Ctx8_0Hft7EHLBQHbypFFLq4eQX6GVI,1228
160
168
  geo_activity_playground/webui/templates/square_planner/index.html.j2,sha256=-OnY2nQCgZCslOzf28ogZwFykwF8tZm7PgFwOE3eBDk,8176
161
169
  geo_activity_playground/webui/templates/summary/index.html.j2,sha256=VuSed6GU-FzjPC1aCYuEuK5B8Rw2D8NcseNLTFIGxkA,1441
162
170
  geo_activity_playground/webui/templates/summary/vega-chart.html.j2,sha256=mw8HtigeSnShTFZNG56UGUqHLJe70kvFR3o0TT71dBI,94
171
+ geo_activity_playground/webui/templates/time_zone_fixer/index.html.j2,sha256=s9r6BJMXmd7kLSyjkvH4xLi6e01S5bpGRcMgMMJyCAE,1760
163
172
  geo_activity_playground/webui/templates/upload/index.html.j2,sha256=I1Ix8tDS3YBdi-HdaNfjkzYXVVCjfUTe5PFTnap1ydc,775
164
173
  geo_activity_playground/webui/templates/upload/reload.html.j2,sha256=YZWX5eDeNyqKJdQAywDBcU8DZBm22rRBbZqFjrFrCvQ,556
165
- geo_activity_playground-1.1.0.dist-info/LICENSE,sha256=4RpAwKO8bPkfXH2lnpeUW0eLkNWglyG4lbrLDU_MOwY,1070
166
- geo_activity_playground-1.1.0.dist-info/METADATA,sha256=YVWhoJ4nIcQUL1CoSAWqIb8P4UGmVMWSIX0E1_Q99Xs,1890
167
- geo_activity_playground-1.1.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
168
- geo_activity_playground-1.1.0.dist-info/entry_points.txt,sha256=pbNlLI6IIZIp7nPYCfAtiSiz2oxJSCl7DODD6SPkLKk,81
169
- geo_activity_playground-1.1.0.dist-info/RECORD,,
174
+ geo_activity_playground-1.3.0.dist-info/LICENSE,sha256=4RpAwKO8bPkfXH2lnpeUW0eLkNWglyG4lbrLDU_MOwY,1070
175
+ geo_activity_playground-1.3.0.dist-info/METADATA,sha256=CWWk8dBKRARHREz5Ux11u0U_qtrwqIRHJC-toP7hsLM,2045
176
+ geo_activity_playground-1.3.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
177
+ geo_activity_playground-1.3.0.dist-info/entry_points.txt,sha256=pbNlLI6IIZIp7nPYCfAtiSiz2oxJSCl7DODD6SPkLKk,81
178
+ geo_activity_playground-1.3.0.dist-info/RECORD,,
@@ -1,37 +0,0 @@
1
- import datetime
2
-
3
- import numpy as np
4
- import pandas as pd
5
-
6
- from .time_conversion import convert_to_datetime_ns
7
-
8
- target = np.datetime64(datetime.datetime(2000, 1, 2, 3, 4, 5))
9
-
10
-
11
- def test_convert_to_datetime_ns() -> None:
12
- dt_local = datetime.datetime(2000, 1, 2, 3, 4, 5)
13
- dt_tz = datetime.datetime(
14
- 2000, 1, 2, 3, 4, 5, tzinfo=datetime.timezone(datetime.timedelta(hours=3))
15
- )
16
- dt_utc = datetime.datetime(2000, 1, 2, 3, 4, 5, tzinfo=datetime.timezone.utc)
17
-
18
- inputs = [
19
- dt_local,
20
- dt_tz,
21
- dt_utc,
22
- pd.Timestamp(dt_local),
23
- pd.Timestamp(dt_tz),
24
- pd.Timestamp(dt_utc),
25
- ]
26
-
27
- for d in inputs:
28
- actual = convert_to_datetime_ns(d)
29
- # assert pd.api.types.is_dtype_equal(actual.dtype, "datetime64[ns]")
30
- assert actual == target
31
-
32
- actual = convert_to_datetime_ns(pd.Series([d]))
33
- assert actual.iloc[0] == target
34
-
35
-
36
- def test_NaT() -> None:
37
- assert pd.isna(convert_to_datetime_ns(pd.NaT))