s+: reformat and add --show-user-agent
This commit is contained in:
parent
a456a59951
commit
8a59994894
|
@ -508,7 +508,8 @@ class PlusCodeQuery(NamedTuple):
|
||||||
return Result[Latlong](
|
return Result[Latlong](
|
||||||
EMPTY_LATLONG,
|
EMPTY_LATLONG,
|
||||||
error=IncompletePlusCodeError(
|
error=IncompletePlusCodeError(
|
||||||
"PlusCodeQuery.to_lat_long_coord: " "Plus Code is not full-length (e.g., 6PH58QMF+FX)"
|
"PlusCodeQuery.to_lat_long_coord: "
|
||||||
|
"Plus Code is not full-length (e.g., 6PH58QMF+FX)"
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -692,14 +693,16 @@ def generate_fingerprinted_user_agent() -> Result[str]:
|
||||||
system_info: str = _try(platform)
|
system_info: str = _try(platform)
|
||||||
hostname = _try(gethostname)
|
hostname = _try(gethostname)
|
||||||
mac_address = _try(
|
mac_address = _try(
|
||||||
lambda: ":".join([f"{(getnode() >> elements) & 0xFF:02x}" for elements in range(0, 2 * 6, 2)][::-1])
|
lambda: ":".join(
|
||||||
|
[f"{(getnode() >> elements) & 0xFF:02x}" for elements in range(0, 2 * 6, 2)][::-1]
|
||||||
|
)
|
||||||
)
|
)
|
||||||
unique_info = f"{version}-{system_info}-{hostname}-{mac_address}"
|
unique_info = f"{version}-{system_info}-{hostname}-{mac_address}"
|
||||||
|
|
||||||
if unique_info == "unknown-unknown-unknown-unknown":
|
if unique_info == "unknown-unknown-unknown-unknown":
|
||||||
return Result[str](f"surplus/{version} (generic-user)")
|
return Result[str](f"surplus/{version} (generic-user)")
|
||||||
|
|
||||||
fingerprint: str = shake_256(unique_info.encode()).hexdigest(5)
|
fingerprint: str = shake_256(unique_info.encode()).hexdigest(6)
|
||||||
return Result[str](f"surplus/{version} ({fingerprint})")
|
return Result[str](f"surplus/{version} ({fingerprint})")
|
||||||
|
|
||||||
|
|
||||||
|
@ -780,7 +783,9 @@ class SurplusDefaultGeocoding:
|
||||||
msg = f"No suitable location could be geolocated from '{place}'"
|
msg = f"No suitable location could be geolocated from '{place}'"
|
||||||
raise NoSuitableLocationError(msg)
|
raise NoSuitableLocationError(msg)
|
||||||
|
|
||||||
bounding_box: tuple[float, float, float, float] | None = location.raw.get("boundingbox", None)
|
bounding_box: tuple[float, float, float, float] | None = location.raw.get(
|
||||||
|
"boundingbox", None
|
||||||
|
)
|
||||||
|
|
||||||
if location.raw.get("boundingbox", None) is not None:
|
if location.raw.get("boundingbox", None) is not None:
|
||||||
_bounding_box = [float(c) for c in location.raw.get("boundingbox", [])]
|
_bounding_box = [float(c) for c in location.raw.get("boundingbox", [])]
|
||||||
|
@ -860,6 +865,8 @@ class Behaviour(NamedTuple):
|
||||||
what type to convert query to
|
what type to convert query to
|
||||||
using_termux_location: bool = False
|
using_termux_location: bool = False
|
||||||
treats query as a termux-location output json string, and parses it accordingly
|
treats query as a termux-location output json string, and parses it accordingly
|
||||||
|
show_user_agent: bool = False
|
||||||
|
whether to print the fingerprinted user agent and exit
|
||||||
"""
|
"""
|
||||||
|
|
||||||
query: str | list[str] = ""
|
query: str | list[str] = ""
|
||||||
|
@ -871,6 +878,7 @@ class Behaviour(NamedTuple):
|
||||||
version_header: bool = False
|
version_header: bool = False
|
||||||
convert_to_type: ConversionResultTypeEnum = ConversionResultTypeEnum.SHAREABLE_TEXT
|
convert_to_type: ConversionResultTypeEnum = ConversionResultTypeEnum.SHAREABLE_TEXT
|
||||||
using_termux_location: bool = False
|
using_termux_location: bool = False
|
||||||
|
show_user_agent: bool = False
|
||||||
|
|
||||||
|
|
||||||
# functions
|
# functions
|
||||||
|
@ -937,7 +945,9 @@ def parse_query(behaviour: Behaviour) -> Result[Query]:
|
||||||
if (portion_locality == "") and (not validator.is_full(portion_plus_code)):
|
if (portion_locality == "") and (not validator.is_full(portion_plus_code)):
|
||||||
return Result[Query](
|
return Result[Query](
|
||||||
LatlongQuery(EMPTY_LATLONG),
|
LatlongQuery(EMPTY_LATLONG),
|
||||||
error=IncompletePlusCodeError("_match_plus_code: Plus Code is not full-length (e.g., 6PH58QMF+FX)"),
|
error=IncompletePlusCodeError(
|
||||||
|
"_match_plus_code: Plus Code is not full-length (e.g., 6PH58QMF+FX)"
|
||||||
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
if behaviour.debug:
|
if behaviour.debug:
|
||||||
|
@ -1033,7 +1043,9 @@ def parse_query(behaviour: Behaviour) -> Result[Query]:
|
||||||
except KeyError:
|
except KeyError:
|
||||||
return Result[Query](
|
return Result[Query](
|
||||||
LatlongQuery(EMPTY_LATLONG),
|
LatlongQuery(EMPTY_LATLONG),
|
||||||
error=ValueError("could not get 'latitude' or 'longitude' keys from termux-location json"),
|
error=ValueError(
|
||||||
|
"could not get 'latitude' or 'longitude' keys from termux-location json"
|
||||||
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
except Exception as exc: # noqa: BLE001
|
except Exception as exc: # noqa: BLE001
|
||||||
|
@ -1145,7 +1157,10 @@ def handle_args() -> Behaviour:
|
||||||
"--convert-to",
|
"--convert-to",
|
||||||
type=str,
|
type=str,
|
||||||
choices=[str(v.value) for v in ConversionResultTypeEnum],
|
choices=[str(v.value) for v in ConversionResultTypeEnum],
|
||||||
help=("converts query a specific output type, defaults to " f"'{Behaviour([]).convert_to_type.value}'"),
|
help=(
|
||||||
|
"converts query a specific output type, defaults to "
|
||||||
|
f"'{Behaviour([]).convert_to_type.value}'"
|
||||||
|
),
|
||||||
default=Behaviour([]).convert_to_type.value,
|
default=Behaviour([]).convert_to_type.value,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
@ -1156,6 +1171,12 @@ def handle_args() -> Behaviour:
|
||||||
help="user agent string to use for geocoding service, defaults to fingerprinted user agent string",
|
help="user agent string to use for geocoding service, defaults to fingerprinted user agent string",
|
||||||
default=default_fingerprint,
|
default=default_fingerprint,
|
||||||
)
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"--show-user-agent",
|
||||||
|
action="store_true",
|
||||||
|
default=False,
|
||||||
|
help="prints fingerprinted user agent string and exits",
|
||||||
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"-t",
|
"-t",
|
||||||
"--using-termux-location",
|
"--using-termux-location",
|
||||||
|
@ -1183,6 +1204,7 @@ def handle_args() -> Behaviour:
|
||||||
version_header=args.version,
|
version_header=args.version,
|
||||||
convert_to_type=ConversionResultTypeEnum(args.convert_to),
|
convert_to_type=ConversionResultTypeEnum(args.convert_to),
|
||||||
using_termux_location=args.using_termux_location,
|
using_termux_location=args.using_termux_location,
|
||||||
|
show_user_agent=args.show_user_agent,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1355,7 +1377,8 @@ def _generate_text(
|
||||||
|
|
||||||
if n_used_special and debug:
|
if n_used_special and debug:
|
||||||
print(
|
print(
|
||||||
"debug: _generate_text: " f"using special key arrangements for '{iso3166_2}' (Singapore)",
|
"debug: _generate_text: "
|
||||||
|
f"using special key arrangements for '{iso3166_2}' (Singapore)",
|
||||||
file=behaviour.stderr,
|
file=behaviour.stderr,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -1366,14 +1389,18 @@ def _generate_text(
|
||||||
|
|
||||||
seen_names: list[str] = [
|
seen_names: list[str] = [
|
||||||
detail
|
detail
|
||||||
for detail in _unique([str(location.get(location_key, "")) for location_key in st_names])
|
for detail in _unique(
|
||||||
|
[str(location.get(location_key, "")) for location_key in st_names]
|
||||||
|
)
|
||||||
if detail != ""
|
if detail != ""
|
||||||
]
|
]
|
||||||
|
|
||||||
if debug:
|
if debug:
|
||||||
print(f"debug: _generate_text: {seen_names=}", file=behaviour.stderr)
|
print(f"debug: _generate_text: {seen_names=}", file=behaviour.stderr)
|
||||||
|
|
||||||
general_global_info: list[str] = [str(location.get(detail, "")) for detail in st_line6_keys]
|
general_global_info: list[str] = [
|
||||||
|
str(location.get(detail, "")) for detail in st_line6_keys
|
||||||
|
]
|
||||||
|
|
||||||
for (
|
for (
|
||||||
line_number,
|
line_number,
|
||||||
|
@ -1511,7 +1538,9 @@ def surplus(query: Query | str, behaviour: Behaviour) -> Result[str]:
|
||||||
|
|
||||||
# perform operation
|
# perform operation
|
||||||
try:
|
try:
|
||||||
pluscode: str = _encode(lat=latlong_query.get().latitude, lon=latlong_query.get().longitude)
|
pluscode: str = _encode(
|
||||||
|
lat=latlong_query.get().latitude, lon=latlong_query.get().longitude
|
||||||
|
)
|
||||||
|
|
||||||
except Exception as exc: # noqa: BLE001
|
except Exception as exc: # noqa: BLE001
|
||||||
return Result[str]("", error=exc)
|
return Result[str]("", error=exc)
|
||||||
|
@ -1600,8 +1629,16 @@ def surplus(query: Query | str, behaviour: Behaviour) -> Result[str]:
|
||||||
check1 = (
|
check1 = (
|
||||||
# The center point of the feature is within 0.4 degrees latitude and 0.4
|
# The center point of the feature is within 0.4 degrees latitude and 0.4
|
||||||
# degrees longitude
|
# degrees longitude
|
||||||
((query_latlong.latitude - 0.4) <= locality_latlong.latitude <= (query_latlong.latitude + 0.4)),
|
(
|
||||||
((query_latlong.longitude - 0.4) <= locality_latlong.longitude <= (query_latlong.longitude + 0.4)),
|
(query_latlong.latitude - 0.4)
|
||||||
|
<= locality_latlong.latitude
|
||||||
|
<= (query_latlong.latitude + 0.4)
|
||||||
|
),
|
||||||
|
(
|
||||||
|
(query_latlong.longitude - 0.4)
|
||||||
|
<= locality_latlong.longitude
|
||||||
|
<= (query_latlong.longitude + 0.4)
|
||||||
|
),
|
||||||
# The bounding box of the feature is less than 0.8 degrees high and wide.
|
# The bounding box of the feature is less than 0.8 degrees high and wide.
|
||||||
abs(locality_latlong.bounding_box[0] - locality_latlong.bounding_box[1]) < 0.8, # noqa: PLR2004
|
abs(locality_latlong.bounding_box[0] - locality_latlong.bounding_box[1]) < 0.8, # noqa: PLR2004
|
||||||
abs(locality_latlong.bounding_box[2] - locality_latlong.bounding_box[3]) < 0.8, # noqa: PLR2004
|
abs(locality_latlong.bounding_box[2] - locality_latlong.bounding_box[3]) < 0.8, # noqa: PLR2004
|
||||||
|
@ -1610,8 +1647,16 @@ def surplus(query: Query | str, behaviour: Behaviour) -> Result[str]:
|
||||||
check2 = (
|
check2 = (
|
||||||
# The center point of the feature is within 0.4 degrees latitude and 0.4
|
# The center point of the feature is within 0.4 degrees latitude and 0.4
|
||||||
# degrees longitude"
|
# degrees longitude"
|
||||||
((query_latlong.latitude - 8) <= locality_latlong.latitude <= (query_latlong.latitude + 8)),
|
(
|
||||||
((query_latlong.longitude - 8) <= locality_latlong.longitude <= (query_latlong.longitude + 8)),
|
(query_latlong.latitude - 8)
|
||||||
|
<= locality_latlong.latitude
|
||||||
|
<= (query_latlong.latitude + 8)
|
||||||
|
),
|
||||||
|
(
|
||||||
|
(query_latlong.longitude - 8)
|
||||||
|
<= locality_latlong.longitude
|
||||||
|
<= (query_latlong.longitude + 8)
|
||||||
|
),
|
||||||
# The bounding box of the feature is less than 0.8 degrees high and wide.
|
# The bounding box of the feature is less than 0.8 degrees high and wide.
|
||||||
abs(locality_latlong.bounding_box[0] - locality_latlong.bounding_box[1]) < 16, # noqa: PLR2004
|
abs(locality_latlong.bounding_box[0] - locality_latlong.bounding_box[1]) < 16, # noqa: PLR2004
|
||||||
abs(locality_latlong.bounding_box[2] - locality_latlong.bounding_box[3]) < 16, # noqa: PLR2004
|
abs(locality_latlong.bounding_box[2] - locality_latlong.bounding_box[3]) < 16, # noqa: PLR2004
|
||||||
|
@ -1648,7 +1693,9 @@ def surplus(query: Query | str, behaviour: Behaviour) -> Result[str]:
|
||||||
return Result[str](str(latlong_result.get()))
|
return Result[str](str(latlong_result.get()))
|
||||||
|
|
||||||
case _:
|
case _:
|
||||||
return Result[str]("", error=f"unknown conversion result type '{behaviour.convert_to_type}'")
|
return Result[str](
|
||||||
|
"", error=f"unknown conversion result type '{behaviour.convert_to_type}'"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
# command-line entry
|
# command-line entry
|
||||||
|
@ -1664,7 +1711,10 @@ def cli() -> int:
|
||||||
f"surplus version {'.'.join([str(v) for v in VERSION])}{VERSION_SUFFIX}"
|
f"surplus version {'.'.join([str(v) for v in VERSION])}{VERSION_SUFFIX}"
|
||||||
+ (", debug mode" if behaviour.debug else "")
|
+ (", debug mode" if behaviour.debug else "")
|
||||||
+ (
|
+ (
|
||||||
(f" ({BUILD_COMMIT[:10]}@{BUILD_BRANCH}, " f'{BUILD_DATETIME.strftime("%a %d %b %Y %H:%M:%S %z")})')
|
(
|
||||||
|
f" ({BUILD_COMMIT[:10]}@{BUILD_BRANCH}, "
|
||||||
|
f'{BUILD_DATETIME.strftime("%a %d %b %Y %H:%M:%S %z")})'
|
||||||
|
)
|
||||||
if behaviour.debug or behaviour.version_header
|
if behaviour.debug or behaviour.version_header
|
||||||
else ""
|
else ""
|
||||||
),
|
),
|
||||||
|
@ -1674,6 +1724,13 @@ def cli() -> int:
|
||||||
if behaviour.version_header:
|
if behaviour.version_header:
|
||||||
sysexit(0)
|
sysexit(0)
|
||||||
|
|
||||||
|
if behaviour.show_user_agent:
|
||||||
|
print(
|
||||||
|
generate_fingerprinted_user_agent().get(),
|
||||||
|
file=behaviour.stdout,
|
||||||
|
)
|
||||||
|
sysexit(0)
|
||||||
|
|
||||||
# parse query and handle result
|
# parse query and handle result
|
||||||
query = parse_query(behaviour=behaviour)
|
query = parse_query(behaviour=behaviour)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue