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.
Files changed (18) hide show
  1. {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
  2. {python_google_weather_api-0.0.3 → python_google_weather_api-0.0.5}/README.md +1 -5
  3. python_google_weather_api-0.0.5/pyproject.toml +88 -0
  4. python_google_weather_api-0.0.5/setup.cfg +4 -0
  5. {python_google_weather_api-0.0.3 → python_google_weather_api-0.0.5}/src/google_weather_api/__init__.py +7 -8
  6. {python_google_weather_api-0.0.3 → python_google_weather_api-0.0.5}/src/google_weather_api/api.py +7 -10
  7. {python_google_weather_api-0.0.3 → python_google_weather_api-0.0.5}/src/google_weather_api/exceptions.py +4 -0
  8. {python_google_weather_api-0.0.3 → python_google_weather_api-0.0.5}/src/google_weather_api/model.py +20 -32
  9. {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
  10. {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
  11. {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
  12. python_google_weather_api-0.0.3/pyproject.toml +0 -83
  13. python_google_weather_api-0.0.3/setup.cfg +0 -16
  14. {python_google_weather_api-0.0.3 → python_google_weather_api-0.0.5}/LICENSE +0 -0
  15. {python_google_weather_api-0.0.3 → python_google_weather_api-0.0.5}/src/google_weather_api/py.typed +0 -0
  16. {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
  17. {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
  18. {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
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: dev
15
- Requires-Dist: pytest>=7; extra == "dev"
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 pytest
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 pytest
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
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -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",
@@ -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."""
@@ -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
- moonrise_times: list[str] = field(metadata={"alias": "moonriseTimes"})
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
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: dev
15
- Requires-Dist: pytest>=7; extra == "dev"
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 pytest
46
+ python -m pip install -e ".[test]"
51
47
  pytest
52
48
 
53
49
  # Build package
@@ -1,7 +1,6 @@
1
1
  LICENSE
2
2
  README.md
3
3
  pyproject.toml
4
- setup.cfg
5
4
  src/google_weather_api/__init__.py
6
5
  src/google_weather_api/api.py
7
6
  src/google_weather_api/exceptions.py
@@ -1,5 +1,5 @@
1
1
  aiohttp>=3.8
2
2
  mashumaro
3
3
 
4
- [dev]
5
- pytest>=7
4
+ [test]
5
+ pytest
@@ -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
-