python-google-weather-api 0.0.3__tar.gz → 0.0.5__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.
- {python_google_weather_api-0.0.3/src/python_google_weather_api.egg-info → python_google_weather_api-0.0.5}/PKG-INFO +4 -8
- {python_google_weather_api-0.0.3 → python_google_weather_api-0.0.5}/README.md +1 -5
- python_google_weather_api-0.0.5/pyproject.toml +88 -0
- python_google_weather_api-0.0.5/setup.cfg +4 -0
- {python_google_weather_api-0.0.3 → python_google_weather_api-0.0.5}/src/google_weather_api/__init__.py +7 -8
- {python_google_weather_api-0.0.3 → python_google_weather_api-0.0.5}/src/google_weather_api/api.py +7 -10
- {python_google_weather_api-0.0.3 → python_google_weather_api-0.0.5}/src/google_weather_api/exceptions.py +4 -0
- {python_google_weather_api-0.0.3 → python_google_weather_api-0.0.5}/src/google_weather_api/model.py +20 -32
- {python_google_weather_api-0.0.3 → python_google_weather_api-0.0.5/src/python_google_weather_api.egg-info}/PKG-INFO +4 -8
- {python_google_weather_api-0.0.3 → python_google_weather_api-0.0.5}/src/python_google_weather_api.egg-info/SOURCES.txt +0 -1
- {python_google_weather_api-0.0.3 → python_google_weather_api-0.0.5}/src/python_google_weather_api.egg-info/requires.txt +2 -2
- python_google_weather_api-0.0.3/pyproject.toml +0 -83
- python_google_weather_api-0.0.3/setup.cfg +0 -16
- {python_google_weather_api-0.0.3 → python_google_weather_api-0.0.5}/LICENSE +0 -0
- {python_google_weather_api-0.0.3 → python_google_weather_api-0.0.5}/src/google_weather_api/py.typed +0 -0
- {python_google_weather_api-0.0.3 → python_google_weather_api-0.0.5}/src/python_google_weather_api.egg-info/dependency_links.txt +0 -0
- {python_google_weather_api-0.0.3 → python_google_weather_api-0.0.5}/src/python_google_weather_api.egg-info/top_level.txt +0 -0
- {python_google_weather_api-0.0.3 → python_google_weather_api-0.0.5}/tests/test_api.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-google-weather-api
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.5
|
|
4
4
|
Summary: A python client library for Google Weather API
|
|
5
5
|
Author-email: tronikos <tronikos@gmail.com>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -11,8 +11,8 @@ Description-Content-Type: text/markdown
|
|
|
11
11
|
License-File: LICENSE
|
|
12
12
|
Requires-Dist: aiohttp>=3.8
|
|
13
13
|
Requires-Dist: mashumaro
|
|
14
|
-
Provides-Extra:
|
|
15
|
-
Requires-Dist: pytest
|
|
14
|
+
Provides-Extra: test
|
|
15
|
+
Requires-Dist: pytest; extra == "test"
|
|
16
16
|
Dynamic: license-file
|
|
17
17
|
|
|
18
18
|
# python-google-weather-api
|
|
@@ -42,12 +42,8 @@ python -m pip install pre-commit
|
|
|
42
42
|
pre-commit install
|
|
43
43
|
pre-commit run --all-files
|
|
44
44
|
|
|
45
|
-
# Alternative: run formatter, lint, and type checking
|
|
46
|
-
python -m pip install isort black flake8 ruff mypy
|
|
47
|
-
isort . ; black . ; flake8 . ; ruff check . --fix ; mypy --install-types .
|
|
48
|
-
|
|
49
45
|
# Run tests
|
|
50
|
-
python -m pip install
|
|
46
|
+
python -m pip install -e ".[test]"
|
|
51
47
|
pytest
|
|
52
48
|
|
|
53
49
|
# Build package
|
|
@@ -25,12 +25,8 @@ python -m pip install pre-commit
|
|
|
25
25
|
pre-commit install
|
|
26
26
|
pre-commit run --all-files
|
|
27
27
|
|
|
28
|
-
# Alternative: run formatter, lint, and type checking
|
|
29
|
-
python -m pip install isort black flake8 ruff mypy
|
|
30
|
-
isort . ; black . ; flake8 . ; ruff check . --fix ; mypy --install-types .
|
|
31
|
-
|
|
32
28
|
# Run tests
|
|
33
|
-
python -m pip install
|
|
29
|
+
python -m pip install -e ".[test]"
|
|
34
30
|
pytest
|
|
35
31
|
|
|
36
32
|
# Build package
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "python-google-weather-api"
|
|
3
|
+
version = "0.0.5"
|
|
4
|
+
license = "Apache-2.0"
|
|
5
|
+
authors = [
|
|
6
|
+
{ name="tronikos", email="tronikos@gmail.com" },
|
|
7
|
+
]
|
|
8
|
+
description = "A python client library for Google Weather API"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.11"
|
|
11
|
+
dependencies = [
|
|
12
|
+
"aiohttp>=3.8",
|
|
13
|
+
"mashumaro",
|
|
14
|
+
]
|
|
15
|
+
|
|
16
|
+
[project.optional-dependencies]
|
|
17
|
+
test = [
|
|
18
|
+
"pytest",
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
[project.urls]
|
|
23
|
+
"Homepage" = "https://github.com/tronikos/python-google-weather-api"
|
|
24
|
+
"Bug Tracker" = "https://github.com/tronikos/python-google-weather-api/issues"
|
|
25
|
+
|
|
26
|
+
[build-system]
|
|
27
|
+
requires = ["setuptools"]
|
|
28
|
+
build-backend = "setuptools.build_meta"
|
|
29
|
+
|
|
30
|
+
[tool.ruff]
|
|
31
|
+
target-version = "py311"
|
|
32
|
+
line-length = 127
|
|
33
|
+
exclude = [
|
|
34
|
+
".git", ".mypy_cache", ".ruff_cache", ".venv", "__pypackages__",
|
|
35
|
+
"build", "dist", "venv", "*_pb2.py", "*_pb2_grpc.py", "*.pyi"
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
[tool.ruff.lint]
|
|
39
|
+
select = [
|
|
40
|
+
"A", # flake8-builtins
|
|
41
|
+
"ASYNC", # flake8-async
|
|
42
|
+
"B", # flake8-bugbear
|
|
43
|
+
"C", # flake8-mccabe
|
|
44
|
+
"C4", # flake8-comprehensions
|
|
45
|
+
"D", # pydocstyle
|
|
46
|
+
"E", # pycodestyle (error)
|
|
47
|
+
"F", # pyflakes
|
|
48
|
+
"G", # flake8-logging-format
|
|
49
|
+
"I", # isort
|
|
50
|
+
"PGH", # pygrep-hooks
|
|
51
|
+
"PL", # Pylint
|
|
52
|
+
"RET", # flake8-return
|
|
53
|
+
"RUF", # Ruff-specific rules
|
|
54
|
+
"S", # flake8-bandit (security)
|
|
55
|
+
"SIM", # flake8-simplify
|
|
56
|
+
"T20", # flake8-print
|
|
57
|
+
"TCH", # flake8-type-checking
|
|
58
|
+
"TRY", # tryceratops
|
|
59
|
+
"UP", # pyupgrade
|
|
60
|
+
"W", # pycodestyle (warning)
|
|
61
|
+
]
|
|
62
|
+
ignore = [
|
|
63
|
+
"S101", # Ignore assert
|
|
64
|
+
"D203", # 1 blank line required before class docstring
|
|
65
|
+
"D213", # Multi-line docstring summary should start at the second line
|
|
66
|
+
"PLR0913", # Too many arguments in function definition
|
|
67
|
+
"PLR1714", # Consider merging multiple comparisons
|
|
68
|
+
"PLR2004", # Magic value used in comparison
|
|
69
|
+
"TRY003", # Avoid specifying long messages outside the exception class
|
|
70
|
+
]
|
|
71
|
+
fixable = ["ALL"]
|
|
72
|
+
|
|
73
|
+
[tool.ruff.lint.mccabe]
|
|
74
|
+
max-complexity = 25
|
|
75
|
+
|
|
76
|
+
[tool.mypy]
|
|
77
|
+
python_version = "3.11"
|
|
78
|
+
exclude = [".venv", "venv", "build"]
|
|
79
|
+
pretty = true
|
|
80
|
+
strict = true
|
|
81
|
+
show_error_codes = true
|
|
82
|
+
warn_incomplete_stub = true
|
|
83
|
+
enable_error_code = ["ignore-without-code", "redundant-self", "truthy-iterable"]
|
|
84
|
+
|
|
85
|
+
[tool.codespell]
|
|
86
|
+
skip = "*.json,*.csv,*.lock,./.git/*,./.venv/*"
|
|
87
|
+
check-filenames = true
|
|
88
|
+
check-hidden = true
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from .api import GoogleWeatherApi
|
|
4
4
|
from .exceptions import (
|
|
5
|
+
GoogleWeatherApiAuthError,
|
|
5
6
|
GoogleWeatherApiConnectionError,
|
|
6
7
|
GoogleWeatherApiError,
|
|
7
8
|
GoogleWeatherApiResponseError,
|
|
@@ -35,22 +36,20 @@ from .model import (
|
|
|
35
36
|
)
|
|
36
37
|
|
|
37
38
|
__all__ = [
|
|
38
|
-
# API
|
|
39
|
-
"GoogleWeatherApi",
|
|
40
|
-
# Exceptions
|
|
41
|
-
"GoogleWeatherApiConnectionError",
|
|
42
|
-
"GoogleWeatherApiError",
|
|
43
|
-
"GoogleWeatherApiResponseError",
|
|
44
|
-
# Models
|
|
45
39
|
"AirPressure",
|
|
46
40
|
"CurrentConditionsHistory",
|
|
47
41
|
"CurrentConditionsResponse",
|
|
48
|
-
"Date",
|
|
49
42
|
"DailyForecastResponse",
|
|
43
|
+
"Date",
|
|
50
44
|
"DateTime",
|
|
51
45
|
"ForecastDay",
|
|
52
46
|
"ForecastDayPart",
|
|
53
47
|
"ForecastHour",
|
|
48
|
+
"GoogleWeatherApi",
|
|
49
|
+
"GoogleWeatherApiAuthError",
|
|
50
|
+
"GoogleWeatherApiConnectionError",
|
|
51
|
+
"GoogleWeatherApiError",
|
|
52
|
+
"GoogleWeatherApiResponseError",
|
|
54
53
|
"HourlyForecastResponse",
|
|
55
54
|
"IceThickness",
|
|
56
55
|
"Interval",
|
{python_google_weather_api-0.0.3 → python_google_weather_api-0.0.5}/src/google_weather_api/api.py
RENAMED
|
@@ -2,13 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
from http import HTTPStatus
|
|
6
5
|
import logging
|
|
6
|
+
from http import HTTPStatus
|
|
7
7
|
from typing import Any
|
|
8
8
|
|
|
9
9
|
import aiohttp
|
|
10
10
|
|
|
11
11
|
from .exceptions import (
|
|
12
|
+
GoogleWeatherApiAuthError,
|
|
12
13
|
GoogleWeatherApiConnectionError,
|
|
13
14
|
GoogleWeatherApiResponseError,
|
|
14
15
|
)
|
|
@@ -67,6 +68,8 @@ class GoogleWeatherApi:
|
|
|
67
68
|
res: dict[str, Any] = await resp.json()
|
|
68
69
|
_LOGGER.debug("Got %s for %s", resp.status, url)
|
|
69
70
|
if resp.status != HTTPStatus.OK:
|
|
71
|
+
if resp.status in (HTTPStatus.UNAUTHORIZED, HTTPStatus.FORBIDDEN):
|
|
72
|
+
raise GoogleWeatherApiAuthError(res["error"]["message"])
|
|
70
73
|
raise GoogleWeatherApiResponseError(res["error"]["message"])
|
|
71
74
|
return res
|
|
72
75
|
except TimeoutError as err:
|
|
@@ -74,9 +77,7 @@ class GoogleWeatherApi:
|
|
|
74
77
|
except aiohttp.ClientError as err:
|
|
75
78
|
raise GoogleWeatherApiConnectionError(err) from err
|
|
76
79
|
|
|
77
|
-
async def async_get_current_conditions(
|
|
78
|
-
self, latitude: float, longitude: float
|
|
79
|
-
) -> CurrentConditionsResponse:
|
|
80
|
+
async def async_get_current_conditions(self, latitude: float, longitude: float) -> CurrentConditionsResponse:
|
|
80
81
|
"""Fetch current weather conditions.
|
|
81
82
|
|
|
82
83
|
See https://developers.google.com/maps/documentation/weather/reference/rest/v1/currentConditions/lookup
|
|
@@ -90,9 +91,7 @@ class GoogleWeatherApi:
|
|
|
90
91
|
)
|
|
91
92
|
return CurrentConditionsResponse.from_dict(data)
|
|
92
93
|
|
|
93
|
-
async def async_get_hourly_forecast(
|
|
94
|
-
self, latitude: float, longitude: float, hours: int = 48
|
|
95
|
-
) -> HourlyForecastResponse:
|
|
94
|
+
async def async_get_hourly_forecast(self, latitude: float, longitude: float, hours: int = 48) -> HourlyForecastResponse:
|
|
96
95
|
"""Fetch hourly weather forecast.
|
|
97
96
|
|
|
98
97
|
See https://developers.google.com/maps/documentation/weather/reference/rest/v1/forecast.hours/lookup
|
|
@@ -108,9 +107,7 @@ class GoogleWeatherApi:
|
|
|
108
107
|
)
|
|
109
108
|
return HourlyForecastResponse.from_dict(data)
|
|
110
109
|
|
|
111
|
-
async def async_get_daily_forecast(
|
|
112
|
-
self, latitude: float, longitude: float, days: int = 10
|
|
113
|
-
) -> DailyForecastResponse:
|
|
110
|
+
async def async_get_daily_forecast(self, latitude: float, longitude: float, days: int = 10) -> DailyForecastResponse:
|
|
114
111
|
"""Fetch daily weather forecast.
|
|
115
112
|
|
|
116
113
|
See https://developers.google.com/maps/documentation/weather/reference/rest/v1/forecast.days/lookup
|
|
@@ -9,5 +9,9 @@ class GoogleWeatherApiConnectionError(GoogleWeatherApiError):
|
|
|
9
9
|
"""Exception connecting to the Google Weather API."""
|
|
10
10
|
|
|
11
11
|
|
|
12
|
+
class GoogleWeatherApiAuthError(GoogleWeatherApiError):
|
|
13
|
+
"""Exception raised for authentication errors in the Google Weather API."""
|
|
14
|
+
|
|
15
|
+
|
|
12
16
|
class GoogleWeatherApiResponseError(GoogleWeatherApiError):
|
|
13
17
|
"""Exception raised for errors in the Google Weather API response."""
|
{python_google_weather_api-0.0.3 → python_google_weather_api-0.0.5}/src/google_weather_api/model.py
RENAMED
|
@@ -119,6 +119,9 @@ class Precipitation(DataClassJSONMixin):
|
|
|
119
119
|
qpf: QuantitativePrecipitationForecast
|
|
120
120
|
"""The amount of precipitation (rain or snow), measured as liquid water."""
|
|
121
121
|
|
|
122
|
+
snow_qpf: QuantitativePrecipitationForecast | None = field(default=None, metadata={"alias": "snowQpf"})
|
|
123
|
+
"""The amount of snow accumulation, measured as liquid water equivalent."""
|
|
124
|
+
|
|
122
125
|
|
|
123
126
|
@dataclass
|
|
124
127
|
class WindSpeed(DataClassJSONMixin):
|
|
@@ -312,9 +315,7 @@ class CurrentConditionsResponse(DataClassJSONMixin):
|
|
|
312
315
|
temperature: Temperature
|
|
313
316
|
"""The current temperature."""
|
|
314
317
|
|
|
315
|
-
feels_like_temperature: Temperature = field(
|
|
316
|
-
metadata={"alias": "feelsLikeTemperature"}
|
|
317
|
-
)
|
|
318
|
+
feels_like_temperature: Temperature = field(metadata={"alias": "feelsLikeTemperature"})
|
|
318
319
|
"""The measure of how the temperature currently feels like."""
|
|
319
320
|
|
|
320
321
|
dew_point: Temperature = field(metadata={"alias": "dewPoint"})
|
|
@@ -338,9 +339,7 @@ class CurrentConditionsResponse(DataClassJSONMixin):
|
|
|
338
339
|
visibility: Visibility
|
|
339
340
|
"""The current visibility."""
|
|
340
341
|
|
|
341
|
-
current_conditions_history: CurrentConditionsHistory = field(
|
|
342
|
-
metadata={"alias": "currentConditionsHistory"}
|
|
343
|
-
)
|
|
342
|
+
current_conditions_history: CurrentConditionsHistory = field(metadata={"alias": "currentConditionsHistory"})
|
|
344
343
|
"""The changes in the current conditions over the last 24 hours."""
|
|
345
344
|
|
|
346
345
|
is_daytime: bool = field(metadata={"alias": "isDaytime"})
|
|
@@ -401,6 +400,9 @@ class ForecastDayPart(DataClassJSONMixin):
|
|
|
401
400
|
cloud_cover: int = field(metadata={"alias": "cloudCover"})
|
|
402
401
|
"""Average cloud cover percent."""
|
|
403
402
|
|
|
403
|
+
ice_thickness: IceThickness | None = field(default=None, metadata={"alias": "iceThickness"})
|
|
404
|
+
"""The forecasted ice thickness."""
|
|
405
|
+
|
|
404
406
|
|
|
405
407
|
@dataclass
|
|
406
408
|
class SunEvents(DataClassJSONMixin):
|
|
@@ -430,15 +432,15 @@ class MoonEvents(DataClassJSONMixin):
|
|
|
430
432
|
LAST_QUARTER = "LAST_QUARTER"
|
|
431
433
|
WANING_CRESCENT = "WANING_CRESCENT"
|
|
432
434
|
|
|
433
|
-
|
|
435
|
+
moon_phase: MoonPhase = field(metadata={"alias": "moonPhase"})
|
|
436
|
+
"""The moon phase (a.k.a. lunar phase)."""
|
|
437
|
+
|
|
438
|
+
moonrise_times: list[str] = field(default_factory=list, metadata={"alias": "moonriseTimes"})
|
|
434
439
|
"""The time(s) when the upper limb of the moon appears above the horizon."""
|
|
435
440
|
|
|
436
|
-
moonset_times: list[str] = field(metadata={"alias": "moonsetTimes"})
|
|
441
|
+
moonset_times: list[str] = field(default_factory=list, metadata={"alias": "moonsetTimes"})
|
|
437
442
|
"""The time(s) when the upper limb of the moon disappears below the horizon."""
|
|
438
443
|
|
|
439
|
-
moon_phase: MoonPhase = field(metadata={"alias": "moonPhase"})
|
|
440
|
-
"""The moon phase (a.k.a. lunar phase)."""
|
|
441
|
-
|
|
442
444
|
|
|
443
445
|
@dataclass
|
|
444
446
|
class ForecastDay(DataClassJSONMixin):
|
|
@@ -462,14 +464,10 @@ class ForecastDay(DataClassJSONMixin):
|
|
|
462
464
|
min_temperature: Temperature = field(metadata={"alias": "minTemperature"})
|
|
463
465
|
"""The minimum (low) temperature throughout the day."""
|
|
464
466
|
|
|
465
|
-
feels_like_max_temperature: Temperature = field(
|
|
466
|
-
metadata={"alias": "feelsLikeMaxTemperature"}
|
|
467
|
-
)
|
|
467
|
+
feels_like_max_temperature: Temperature = field(metadata={"alias": "feelsLikeMaxTemperature"})
|
|
468
468
|
"""The maximum (high) feels-like temperature throughout the day."""
|
|
469
469
|
|
|
470
|
-
feels_like_min_temperature: Temperature = field(
|
|
471
|
-
metadata={"alias": "feelsLikeMinTemperature"}
|
|
472
|
-
)
|
|
470
|
+
feels_like_min_temperature: Temperature = field(metadata={"alias": "feelsLikeMinTemperature"})
|
|
473
471
|
"""The minimum (low) feels-like temperature throughout the day."""
|
|
474
472
|
|
|
475
473
|
max_heat_index: Temperature = field(metadata={"alias": "maxHeatIndex"})
|
|
@@ -481,9 +479,7 @@ class ForecastDay(DataClassJSONMixin):
|
|
|
481
479
|
moon_events: MoonEvents = field(metadata={"alias": "moonEvents"})
|
|
482
480
|
"""The events related to the moon (e.g. moonrise, moonset)."""
|
|
483
481
|
|
|
484
|
-
ice_thickness: IceThickness | None = field(
|
|
485
|
-
default=None, metadata={"alias": "iceThickness"}
|
|
486
|
-
)
|
|
482
|
+
ice_thickness: IceThickness | None = field(default=None, metadata={"alias": "iceThickness"})
|
|
487
483
|
"""The accumulated amount of ice throughout the entire day."""
|
|
488
484
|
|
|
489
485
|
|
|
@@ -497,9 +493,7 @@ class DailyForecastResponse(DataClassJSONMixin):
|
|
|
497
493
|
time_zone: TimeZone = field(metadata={"alias": "timeZone"})
|
|
498
494
|
"""The time zone at the requested location."""
|
|
499
495
|
|
|
500
|
-
next_page_token: str | None = field(
|
|
501
|
-
default=None, metadata={"alias": "nextPageToken"}
|
|
502
|
-
)
|
|
496
|
+
next_page_token: str | None = field(default=None, metadata={"alias": "nextPageToken"})
|
|
503
497
|
"""The token to retrieve the next page."""
|
|
504
498
|
|
|
505
499
|
|
|
@@ -551,9 +545,7 @@ class ForecastHour(DataClassJSONMixin):
|
|
|
551
545
|
temperature: Temperature
|
|
552
546
|
"""The forecasted temperature."""
|
|
553
547
|
|
|
554
|
-
feels_like_temperature: Temperature = field(
|
|
555
|
-
metadata={"alias": "feelsLikeTemperature"}
|
|
556
|
-
)
|
|
548
|
+
feels_like_temperature: Temperature = field(metadata={"alias": "feelsLikeTemperature"})
|
|
557
549
|
"""The measure of how the temperature will feel like."""
|
|
558
550
|
|
|
559
551
|
dew_point: Temperature = field(metadata={"alias": "dewPoint"})
|
|
@@ -595,9 +587,7 @@ class ForecastHour(DataClassJSONMixin):
|
|
|
595
587
|
cloud_cover: int = field(metadata={"alias": "cloudCover"})
|
|
596
588
|
"""The forecasted percentage of the sky covered by clouds (0-100)."""
|
|
597
589
|
|
|
598
|
-
ice_thickness: IceThickness | None = field(
|
|
599
|
-
default=None, metadata={"alias": "iceThickness"}
|
|
600
|
-
)
|
|
590
|
+
ice_thickness: IceThickness | None = field(default=None, metadata={"alias": "iceThickness"})
|
|
601
591
|
"""The forecasted ice thickness."""
|
|
602
592
|
|
|
603
593
|
|
|
@@ -611,7 +601,5 @@ class HourlyForecastResponse(DataClassJSONMixin):
|
|
|
611
601
|
time_zone: TimeZone = field(metadata={"alias": "timeZone"})
|
|
612
602
|
"""The time zone at the requested location."""
|
|
613
603
|
|
|
614
|
-
next_page_token: str | None = field(
|
|
615
|
-
default=None, metadata={"alias": "nextPageToken"}
|
|
616
|
-
)
|
|
604
|
+
next_page_token: str | None = field(default=None, metadata={"alias": "nextPageToken"})
|
|
617
605
|
"""The token to retrieve the next page."""
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-google-weather-api
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.5
|
|
4
4
|
Summary: A python client library for Google Weather API
|
|
5
5
|
Author-email: tronikos <tronikos@gmail.com>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -11,8 +11,8 @@ Description-Content-Type: text/markdown
|
|
|
11
11
|
License-File: LICENSE
|
|
12
12
|
Requires-Dist: aiohttp>=3.8
|
|
13
13
|
Requires-Dist: mashumaro
|
|
14
|
-
Provides-Extra:
|
|
15
|
-
Requires-Dist: pytest
|
|
14
|
+
Provides-Extra: test
|
|
15
|
+
Requires-Dist: pytest; extra == "test"
|
|
16
16
|
Dynamic: license-file
|
|
17
17
|
|
|
18
18
|
# python-google-weather-api
|
|
@@ -42,12 +42,8 @@ python -m pip install pre-commit
|
|
|
42
42
|
pre-commit install
|
|
43
43
|
pre-commit run --all-files
|
|
44
44
|
|
|
45
|
-
# Alternative: run formatter, lint, and type checking
|
|
46
|
-
python -m pip install isort black flake8 ruff mypy
|
|
47
|
-
isort . ; black . ; flake8 . ; ruff check . --fix ; mypy --install-types .
|
|
48
|
-
|
|
49
45
|
# Run tests
|
|
50
|
-
python -m pip install
|
|
46
|
+
python -m pip install -e ".[test]"
|
|
51
47
|
pytest
|
|
52
48
|
|
|
53
49
|
# Build package
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
[project]
|
|
2
|
-
name = "python-google-weather-api"
|
|
3
|
-
version = "0.0.3"
|
|
4
|
-
license = "Apache-2.0"
|
|
5
|
-
authors = [
|
|
6
|
-
{ name="tronikos", email="tronikos@gmail.com" },
|
|
7
|
-
]
|
|
8
|
-
description = "A python client library for Google Weather API"
|
|
9
|
-
readme = "README.md"
|
|
10
|
-
requires-python = ">=3.11"
|
|
11
|
-
dependencies = [
|
|
12
|
-
"aiohttp>=3.8",
|
|
13
|
-
"mashumaro",
|
|
14
|
-
]
|
|
15
|
-
|
|
16
|
-
[project.urls]
|
|
17
|
-
"Homepage" = "https://github.com/tronikos/python-google-weather-api"
|
|
18
|
-
"Bug Tracker" = "https://github.com/tronikos/python-google-weather-api/issues"
|
|
19
|
-
|
|
20
|
-
[build-system]
|
|
21
|
-
requires = ["setuptools"]
|
|
22
|
-
build-backend = "setuptools.build_meta"
|
|
23
|
-
|
|
24
|
-
[tool.black]
|
|
25
|
-
extend-exclude = "_pb2.py|_pb2_grpc.py"
|
|
26
|
-
|
|
27
|
-
[tool.isort]
|
|
28
|
-
profile = "black"
|
|
29
|
-
force_sort_within_sections = true
|
|
30
|
-
combine_as_imports = true
|
|
31
|
-
extend_skip_glob = ["*_pb2.py", "*_pb2_grpc.py"]
|
|
32
|
-
|
|
33
|
-
[tool.ruff]
|
|
34
|
-
target-version = "py311"
|
|
35
|
-
exclude = ["*_pb2.py", "*_pb2_grpc.py", "*.pyi"]
|
|
36
|
-
line-length = 127
|
|
37
|
-
|
|
38
|
-
lint.select = [
|
|
39
|
-
"B007", # Loop control variable {name} not used within loop body
|
|
40
|
-
"B014", # Exception handler with duplicate exception
|
|
41
|
-
"C", # complexity
|
|
42
|
-
"D", # docstrings
|
|
43
|
-
"E", # pycodestyle
|
|
44
|
-
"F", # pyflakes/autoflake
|
|
45
|
-
"ICN001", # import concentions; {name} should be imported as {asname}
|
|
46
|
-
"PGH004", # Use specific rule codes when using noqa
|
|
47
|
-
"PLC0414", # Useless import alias. Import alias does not rename original package.
|
|
48
|
-
"SIM105", # Use contextlib.suppress({exception}) instead of try-except-pass
|
|
49
|
-
"SIM117", # Merge with-statements that use the same scope
|
|
50
|
-
"SIM118", # Use {key} in {dict} instead of {key} in {dict}.keys()
|
|
51
|
-
"SIM201", # Use {left} != {right} instead of not {left} == {right}
|
|
52
|
-
"SIM212", # Use {a} if {a} else {b} instead of {b} if not {a} else {a}
|
|
53
|
-
"SIM300", # Yoda conditions. Use 'age == 42' instead of '42 == age'.
|
|
54
|
-
"SIM401", # Use get from dict with default instead of an if block
|
|
55
|
-
"T20", # flake8-print
|
|
56
|
-
"TRY004", # Prefer TypeError exception for invalid type
|
|
57
|
-
"RUF006", # Store a reference to the return value of asyncio.create_task
|
|
58
|
-
"UP", # pyupgrade
|
|
59
|
-
"W", # pycodestyle
|
|
60
|
-
]
|
|
61
|
-
|
|
62
|
-
lint.ignore = [
|
|
63
|
-
"D203", # 1 blank line required before class docstring
|
|
64
|
-
"D213", # Multi-line docstring summary should start at the second line
|
|
65
|
-
# keep-runtime-annotations
|
|
66
|
-
'UP006', # Non PEP585 annotations
|
|
67
|
-
'UP007', # Non PEP604 annotations
|
|
68
|
-
]
|
|
69
|
-
|
|
70
|
-
[tool.ruff.lint.flake8-pytest-style]
|
|
71
|
-
fixture-parentheses = false
|
|
72
|
-
|
|
73
|
-
[tool.ruff.lint.per-file-ignores]
|
|
74
|
-
# Allow for main script to write to stdout
|
|
75
|
-
"__main__.py" = ["T201"]
|
|
76
|
-
|
|
77
|
-
[tool.ruff.lint.mccabe]
|
|
78
|
-
max-complexity = 25
|
|
79
|
-
|
|
80
|
-
[project.optional-dependencies]
|
|
81
|
-
dev = [
|
|
82
|
-
"pytest>=7",
|
|
83
|
-
]
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
[flake8]
|
|
2
|
-
exclude = .venv,.git,docs,venv,bin,lib,deps,build,*_pb2.py,*_pb2_grpc.py
|
|
3
|
-
max-complexity = 25
|
|
4
|
-
doctests = True
|
|
5
|
-
ignore =
|
|
6
|
-
E501,
|
|
7
|
-
W503,
|
|
8
|
-
E203,
|
|
9
|
-
D202,
|
|
10
|
-
W504
|
|
11
|
-
noqa-require-code = True
|
|
12
|
-
|
|
13
|
-
[egg_info]
|
|
14
|
-
tag_build =
|
|
15
|
-
tag_date = 0
|
|
16
|
-
|
|
File without changes
|
{python_google_weather_api-0.0.3 → python_google_weather_api-0.0.5}/src/google_weather_api/py.typed
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|