Add Geo Lookup Support
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Aptitud para principiantes
- 35/100
Línea de trabajo
Comienza con el binding de WIT en stubs/wit_world/imports/geo.py y compara la API de Python solicitada con las referencias de Rust, Go y JS del issue. Usa la configuración de geolocalización de test.toml de Viceroy y las pruebas @on_viceroy para probar direcciones de loopback y configuradas. Se considera terminado cuando la API de búsqueda, la representación de la respuesta tipada, el comportamiento ante fallos y la cobertura de Viceroy coincidan con el diseño indicado.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Overview
Add support for Fastly's geographic and network intelligence API, which provides location and network information based on IP addresses.
WIT Interface
interface geo {
use types.{error, ip-address};
/// Returns JSON-encoded geographic data for an IP address
lookup: func(ip-addr: ip-address, max-len: u64) -> result<string, error>;
}
WIT bindings: stubs/wit_world/imports/geo.py
API Design
- Parse JSON response from WIT layer into a
Geodataclass with typed fields (city, country, coordinates, AS number, etc.) - Provide
lookup(ip)function acceptingstr,IPv4Address, orIPv6Address - Return
Nonefor failed lookups (e.g., private IPs without configuration) - Optional: convenience
lookup_client(request)helper
Cross-SDK Comparison:
-
Rust (
fastly::geo::geo_lookup): Returns strongly-typedGeostruct with enums forConnSpeed,ConnType,Continent,ProxyDescription,ProxyType. UsesOption<UtcOffset>fromtimecrate. All string/enum fields haveOther(String)variant for forward-compatibility. ReturnsOption<Geo>for missing data. -
Go (
geo.Lookup): Returns*Geostruct with all string fields (no enums). Returns pointer to empty struct when no data available. Uses rawintforUTCOffset(HHMM format like 200 or -500). -
JS (
getGeolocationForIpAddress): ReturnsGeolocationinterface with all fields asT | null. Uses strings for enums. Has bothutc_offset(number) andgmt_offset(string). Returnsnullfor no data.
Recommended Python approach:
- Use
@dataclasswith typed fields for known attributes - Include
_extra: dictfield (withrepr=False) to capture unknown JSON fields - Python
Enumtypes for categorical fields (e.g.,ConnType,Continent) using_missing_()to gracefully handle unknown values that might be added in future - Use
Optional[X](equivalent) for truly optional fields (region, utc_offset) - Return
Geo | Nonefromlookup()(align with Rust) - Consider
utc_offsetasOptional[datetime.timedelta]for Pythonic time handling - Match functionality from other SDKs for empty string values.
Forward Compatibility Pattern:
from dataclasses import dataclass, field
@dataclass
class Geo:
city: str
country_code: str
latitude: float
longitude: float
# ... other known fields
_extra: dict = field(default_factory=dict, repr=False)
@classmethod
def from_json(cls, data: dict):
known_fields = {'city', 'country_code', 'latitude', 'longitude', ...}
known = {k: v for k, v in data.items() if k in known_fields}
extra = {k: v for k, v in data.items() if k not in known_fields}
return cls(**known, _extra=extra)
def __getattr__(self, name):
if name in self._extra:
return self._extra[name]
raise AttributeError(f"no attribute '{name}'")
# Benefits: Type hints for known fields, future fields accessible via attributes
geo = Geo.from_json(json_data)
print(geo.city) # Type-checked by IDE
print(geo.timezone) # Works if Fastly adds this field later
Viceroy Testing
Viceroy supports geo lookups with configurable test data via test.toml:
[local_server.geolocation]
format = "inline-toml"
use_default_loopback = true # Returns default data for 127.0.0.1
[local_server.geolocation.addresses."203.0.113.42"]
city = "San Francisco"
country_code = "US"
latitude = 37.77869
# ... additional fields
Default loopback data is available without configuration. Tests can use @on_viceroy with inline TOML config or JSON file references.
Reference
- Lenguaje dominante
- Python
- Estrellas
- 5
- Forks
- 1
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de fastly/compute-sdk-python
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
fastly/compute-sdk-python#116 ·
-
Dificultad 4/5 3-5 días Aptitud para principiantes 35/100
fastly/compute-sdk-python#98 ·
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
fastly/compute-sdk-python#74 ·
-
Add HTTP Downstream Metadata API Abierto
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
fastly/compute-sdk-python#61 ·
-
fastly/compute-sdk-python#60 · 1 asignado ·
Todos los issues de fastly/compute-sdk-python
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
anthropics/skills#1811 · 1 comentario ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
speaches-ai/speaches#678 ·
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
datalayer/mcp-compose#42 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
conda-forge/spacy-feedstock#177 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
UKGovernmentBEIS/inspect_evals#2523 ·