123 lines
3.8 KiB
Python
123 lines
3.8 KiB
Python
import argparse
|
|
import contextlib
|
|
import os
|
|
import sys
|
|
import tempfile
|
|
from typing import Callable, Generator
|
|
|
|
from timezonefinder import (
|
|
TimezoneFinderL,
|
|
timezone_at,
|
|
certain_timezone_at,
|
|
timezone_at_land,
|
|
)
|
|
|
|
|
|
@contextlib.contextmanager
|
|
def redirect_stdout_to_temp_file() -> Generator[str, None, None]:
|
|
"""
|
|
Context manager that redirects stdout to a temporary file for the duration of the context.
|
|
The temporary file is created but not deleted when the context exits.
|
|
Returns the path to the temporary file.
|
|
"""
|
|
# Save the original stdout
|
|
original_stdout = sys.stdout
|
|
|
|
# Create a temporary file that will NOT be automatically deleted
|
|
temp_fd, temp_path = tempfile.mkstemp(text=True)
|
|
temp_file = os.fdopen(temp_fd, "w")
|
|
|
|
try:
|
|
# Redirect stdout to the temporary file
|
|
sys.stdout = temp_file
|
|
yield temp_path
|
|
finally:
|
|
# Restore the original stdout and close the file
|
|
sys.stdout = original_stdout
|
|
temp_file.close()
|
|
|
|
|
|
def get_timezone_function(function_id: int) -> Callable:
|
|
"""
|
|
Get the appropriate timezone function based on the function ID.
|
|
Uses global functions when available, otherwise creates instances as needed.
|
|
"""
|
|
# Use global functions for TimezoneFinder methods
|
|
if function_id == 0:
|
|
return timezone_at
|
|
elif function_id == 1:
|
|
return certain_timezone_at
|
|
elif function_id == 5:
|
|
return timezone_at_land
|
|
|
|
# For TimezoneFinderL methods, still create an instance
|
|
tf_instance = TimezoneFinderL()
|
|
functions = {
|
|
3: tf_instance.timezone_at,
|
|
4: tf_instance.timezone_at_land,
|
|
}
|
|
return functions[function_id]
|
|
|
|
|
|
def main() -> None:
|
|
parser = argparse.ArgumentParser(description="parse TimezoneFinder parameters")
|
|
parser.add_argument("lng", type=float, help="longitude to be queried")
|
|
parser.add_argument("lat", type=float, help="latitude to be queried")
|
|
parser.add_argument("-v", action="store_true", help="verbosity flag")
|
|
parser.add_argument(
|
|
"-f",
|
|
"--function",
|
|
type=int,
|
|
choices=[0, 1, 3, 4, 5],
|
|
default=0,
|
|
help="function to be called:"
|
|
"0: TimezoneFinder.timezone_at(), "
|
|
"1: TimezoneFinder.certain_timezone_at(), "
|
|
"2: removed, "
|
|
"3: TimezoneFinderL.timezone_at(), "
|
|
"4: TimezoneFinderL.timezone_at_land(), "
|
|
"5: TimezoneFinder.timezone_at_land(), ",
|
|
)
|
|
parsed_args = parser.parse_args() # takes input from sys.argv
|
|
timezone_function = get_timezone_function(parsed_args.function)
|
|
|
|
verbose_mode = parsed_args.v
|
|
|
|
# Always redirect stdout to a temp file
|
|
with redirect_stdout_to_temp_file() as temp_file_path:
|
|
print("\n" + "=" * 60)
|
|
print("TIMEZONEFINDER LOOKUP DETAILS")
|
|
print("-" * 60)
|
|
print(f"Coordinates: {parsed_args.lat:.6f}°, {parsed_args.lng:.6f}° (lat, lng)")
|
|
print(
|
|
f"Function {timezone_function.__name__} (function ID: {parsed_args.function})"
|
|
)
|
|
|
|
# Execute the timezone function
|
|
tz = timezone_function(lng=parsed_args.lng, lat=parsed_args.lat)
|
|
|
|
if tz:
|
|
print(f"Result: Found timezone '{tz}'")
|
|
else:
|
|
print("Result: No timezone found at this location")
|
|
print("=" * 60)
|
|
|
|
if verbose_mode:
|
|
# In verbose mode, print the contents of the temp file
|
|
try:
|
|
with open(temp_file_path) as f:
|
|
captured_output = f.read().strip()
|
|
if captured_output:
|
|
print(captured_output)
|
|
except Exception as e:
|
|
print(f"Warning: Could not read captured output: {e}")
|
|
else:
|
|
# In non-verbose mode, just print the result
|
|
print(tz if tz else "")
|
|
|
|
# Always clean up the temp file
|
|
try:
|
|
os.remove(temp_file_path)
|
|
except Exception:
|
|
pass
|