Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

deprecate some settings module settings and save_graph_xml function params #1138

Merged
merged 6 commits into from
Mar 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# Changelog

## 1.9.2 (TBD)

- deprecate settings module's default_accept_language, default_referer, default_user_agent, memory, nominatim_endpoint, overpass_endpoint, and timeout settings (#1138)
- deprecate settings module's osm_xml_node_attrs, osm_xml_node_tags, osm_xml_way_attrs, and osm_xml_way_tags settings (#1138)
- deprecate save_graph_xml function's node_tags, node_attrs, edge_tags, edge_attrs, edge_tag_aggs, merge_edges, oneway, api_version, and precision parameters (#1138)

## 1.9.1 (2024-02-01)

- fix deprecation warning in simplification.simplify_graph function (#1126)
Expand Down
49 changes: 45 additions & 4 deletions osmnx/_downloader.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from hashlib import sha1
from pathlib import Path
from urllib.parse import urlparse
from warnings import warn

import requests
from requests.exceptions import JSONDecodeError
Expand Down Expand Up @@ -150,12 +151,42 @@ def _get_http_headers(user_agent=None, referer=None, accept_language=None):
-------
headers : dict
"""
if settings.default_accept_language is None:
default_accept_language = settings.http_accept_language
else:
default_accept_language = settings.default_accept_language
msg = (
"`settings.default_accept_language` is deprecated and will be removed "
"in the v2.0.0 release: use `settings.http_accept_language` instead"
)
warn(msg, FutureWarning, stacklevel=2)

if settings.default_referer is None:
default_referer = settings.http_referer
else:
default_referer = settings.default_referer
msg = (
"`settings.default_referer` is deprecated and will be removed in the "
"v2.0.0 release: use `settings.http_referer` instead"
)
warn(msg, FutureWarning, stacklevel=2)

if settings.default_user_agent is None:
default_user_agent = settings.http_user_agent
else:
default_user_agent = settings.default_user_agent
msg = (
"`settings.default_user_agent` is deprecated and will be removed in "
"the v2.0.0 release: use `settings.http_user_agent` instead"
)
warn(msg, FutureWarning, stacklevel=2)

if user_agent is None:
user_agent = settings.default_user_agent
user_agent = default_user_agent
if referer is None:
referer = settings.default_referer
referer = default_referer
if accept_language is None:
accept_language = settings.default_accept_language
accept_language = default_accept_language

headers = requests.utils.default_headers()
headers.update(
Expand Down Expand Up @@ -185,6 +216,16 @@ def _resolve_host_via_doh(hostname):
ip_address : string
resolved IP address of host, or hostname itself if resolution failed
"""
if settings.timeout is None:
timeout = settings.requests_timeout
else:
timeout = settings.timeout
msg = (
"`settings.timeout` is deprecated and will be removed in the v2.0.0 "
"release: use `settings.requests_timeout` instead"
)
warn(msg, FutureWarning, stacklevel=2)

if settings.doh_url_template is None:
# if user has set the url template to None, return hostname itself
utils.log("User set `doh_url_template=None`, requesting host by name", level=lg.WARNING)
Expand All @@ -193,7 +234,7 @@ def _resolve_host_via_doh(hostname):
err_msg = f"Failed to resolve {hostname!r} IP via DoH, requesting host by name"
try:
url = settings.doh_url_template.format(hostname=hostname)
response = requests.get(url, timeout=settings.timeout)
response = requests.get(url, timeout=timeout)
data = response.json()

# if we cannot reach DoH server or resolve host, return hostname itself
Expand Down
27 changes: 24 additions & 3 deletions osmnx/_nominatim.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import logging as lg
import time
from collections import OrderedDict
from warnings import warn

import requests

Expand Down Expand Up @@ -84,12 +85,32 @@ def _nominatim_request(params, request_type="search", pause=1, error_pause=60):
-------
response_json : dict
"""
if settings.timeout is None:
timeout = settings.requests_timeout
else:
timeout = settings.timeout
msg = (
"`settings.timeout` is deprecated and will be removed in the v2.0.0 "
"release: use `settings.requests_timeout` instead"
)
warn(msg, FutureWarning, stacklevel=2)

if settings.nominatim_endpoint is None:
nominatim_endpoint = settings.nominatim_url
else:
nominatim_endpoint = settings.nominatim_endpoint
msg = (
"`settings.nominatim_endpoint` is deprecated and will be removed in the "
"v2.0.0 release: use `settings.nominatim_url` instead"
)
warn(msg, FutureWarning, stacklevel=2)

if request_type not in {"search", "reverse", "lookup"}: # pragma: no cover
msg = 'Nominatim request_type must be "search", "reverse", or "lookup"'
raise ValueError(msg)

# prepare Nominatim API URL and see if request already exists in cache
url = settings.nominatim_endpoint.rstrip("/") + "/" + request_type
url = nominatim_endpoint.rstrip("/") + "/" + request_type
params["key"] = settings.nominatim_key
prepared_url = requests.Request("GET", url, params=params).prepare().url
cached_response_json = _downloader._retrieve_from_cache(prepared_url)
Expand All @@ -102,11 +123,11 @@ def _nominatim_request(params, request_type="search", pause=1, error_pause=60):
time.sleep(pause)

# transmit the HTTP GET request
utils.log(f"Get {prepared_url} with timeout={settings.timeout}")
utils.log(f"Get {prepared_url} with timeout={timeout}")
response = requests.get(
url,
params=params,
timeout=settings.timeout,
timeout=timeout,
headers=_downloader._get_http_headers(),
**settings.requests_kwargs,
)
Expand Down
69 changes: 60 additions & 9 deletions osmnx/_overpass.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import datetime as dt
import logging as lg
import time
from warnings import warn

import numpy as np
import requests
Expand Down Expand Up @@ -122,6 +123,16 @@ def _get_overpass_pause(base_endpoint, recursive_delay=5, default_duration=60):
-------
pause : int
"""
if settings.timeout is None:
timeout = settings.requests_timeout
else:
timeout = settings.timeout
msg = (
"`settings.timeout` is deprecated and will be removed in the "
"v2.0.0 release: use `settings.requests_timeout` instead"
)
warn(msg, FutureWarning, stacklevel=2)

if not settings.overpass_rate_limit:
# if overpass rate limiting is False, then there is zero pause
return 0
Expand All @@ -131,7 +142,7 @@ def _get_overpass_pause(base_endpoint, recursive_delay=5, default_duration=60):
response = requests.get(
url,
headers=_downloader._get_http_headers(),
timeout=settings.timeout,
timeout=timeout,
**settings.requests_kwargs,
)
status = response.text.split("\n")[4]
Expand Down Expand Up @@ -183,8 +194,28 @@ def _make_overpass_settings():
-------
string
"""
maxsize = "" if settings.memory is None else f"[maxsize:{settings.memory}]"
return settings.overpass_settings.format(timeout=settings.timeout, maxsize=maxsize)
if settings.timeout is None:
timeout = settings.requests_timeout
else:
timeout = settings.timeout
msg = (
"`settings.timeout` is deprecated and will be removed in the "
"v2.0.0 release: use `settings.requests_timeout` instead"
)
warn(msg, FutureWarning, stacklevel=2)

if settings.memory is None:
memory = settings.overpass_memory
else:
memory = settings.memory
msg = (
"`settings.memory` is deprecated and will be removed in the "
" v2.0.0 release: use `settings.overpass_memory` instead"
)
warn(msg, FutureWarning, stacklevel=2)

maxsize = "" if memory is None else f"[maxsize:{memory}]"
return settings.overpass_settings.format(timeout=timeout, maxsize=maxsize)


def _make_overpass_polygon_coord_strs(polygon):
Expand Down Expand Up @@ -371,36 +402,56 @@ def _overpass_request(data, pause=None, error_pause=60):
-------
response_json : dict
"""
if settings.timeout is None:
timeout = settings.requests_timeout
else:
timeout = settings.timeout
msg = (
"`settings.timeout` is deprecated and will be removed in the "
"v2.0.0 release: use `settings.requests_timeout` instead"
)
warn(msg, FutureWarning, stacklevel=2)

if settings.overpass_endpoint is None:
overpass_endpoint = settings.overpass_url
else:
overpass_endpoint = settings.overpass_endpoint
msg = (
"`settings.overpass_endpoint` is deprecated and will be removed in the "
"v2.0.0 release: use `settings.overpass_url` instead"
)
warn(msg, FutureWarning, stacklevel=2)

# resolve url to same IP even if there is server round-robin redirecting
_downloader._config_dns(settings.overpass_endpoint)
_downloader._config_dns(overpass_endpoint)

# prepare the Overpass API URL and see if request already exists in cache
url = settings.overpass_endpoint.rstrip("/") + "/interpreter"
url = overpass_endpoint.rstrip("/") + "/interpreter"
prepared_url = requests.Request("GET", url, params=data).prepare().url
cached_response_json = _downloader._retrieve_from_cache(prepared_url)
if cached_response_json is not None:
return cached_response_json

# pause then request this URL
if pause is None:
this_pause = _get_overpass_pause(settings.overpass_endpoint)
this_pause = _get_overpass_pause(overpass_endpoint)
domain = _downloader._hostname_from_url(url)
utils.log(f"Pausing {this_pause} second(s) before making HTTP POST request to {domain!r}")
time.sleep(this_pause)

# transmit the HTTP POST request
utils.log(f"Post {prepared_url} with timeout={settings.timeout}")
utils.log(f"Post {prepared_url} with timeout={timeout}")
response = requests.post(
url,
data=data,
timeout=settings.timeout,
timeout=timeout,
headers=_downloader._get_http_headers(),
**settings.requests_kwargs,
)

# handle 429 and 504 errors by pausing then recursively re-trying request
if response.status_code in {429, 504}: # pragma: no cover
this_pause = error_pause + _get_overpass_pause(settings.overpass_endpoint)
this_pause = error_pause + _get_overpass_pause(overpass_endpoint)
msg = (
f"{domain!r} responded {response.status_code} {response.reason}: "
f"we'll retry in {this_pause} secs"
Expand Down
2 changes: 1 addition & 1 deletion osmnx/_version.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
"""OSMnx package version information."""

__version__ = "1.9.1"
__version__ = "1.9.2-dev"
14 changes: 12 additions & 2 deletions osmnx/elevation.py
Original file line number Diff line number Diff line change
Expand Up @@ -293,6 +293,16 @@ def _elevation_request(url, pause):
-------
response_json : dict
"""
if settings.timeout is None:
timeout = settings.requests_timeout
else:
timeout = settings.timeout
msg = (
"`settings.timeout` is deprecated and will be removed in the v2.0.0 "
"release: use `settings.requests_timeout` instead"
)
warn(msg, FutureWarning, stacklevel=2)

# check if request already exists in cache
cached_response_json = _downloader._retrieve_from_cache(url)
if cached_response_json is not None:
Expand All @@ -304,10 +314,10 @@ def _elevation_request(url, pause):
time.sleep(pause)

# transmit the HTTP GET request
utils.log(f"Get {url} with timeout={settings.timeout}")
utils.log(f"Get {url} with timeout={timeout}")
response = requests.get(
url,
timeout=settings.timeout,
timeout=timeout,
headers=_downloader._get_http_headers(),
**settings.requests_kwargs,
)
Expand Down
Loading
Loading