Add Geo Lookup Support
Nobody has claimed this yet.
Assessment
- Difficulty
- 5/5
- Estimated time
- Over a week
- Newbie friendliness
- 35/100
Research direction
Start with the WIT binding at stubs/wit_world/imports/geo.py and compare the requested Python API with the Rust, Go, and JS references in the issue. Use Viceroy's test.toml geolocation configuration and @on_viceroy tests to exercise loopback and configured addresses. Done means the lookup API, typed response representation, failure behavior, and Viceroy coverage match the stated design.
Written by the indexing model from the issue text.
Description
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
- Dominant language
- Python
- Stars
- 5
- Forks
- 1
- PR merge metrics
- No merged PRs in 30d
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from fastly/compute-sdk-python
-
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
fastly/compute-sdk-python#116 ·
-
Difficulty 4/5 3-5 days Newbie friendliness 35/100
fastly/compute-sdk-python#98 ·
-
Difficulty 5/5 Over a week Newbie friendliness 35/100
fastly/compute-sdk-python#74 ·
-
Difficulty 5/5 Over a week Newbie friendliness 35/100
fastly/compute-sdk-python#61 ·
-
fastly/compute-sdk-python#60 · 1 assignee ·
All issues in fastly/compute-sdk-python
Similar issues
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 90/100
learningequality/ricecooker#747 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
BSData/horus-heresy-3rd-edition#3171 ·
-
enhancement
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
run-llama/llama_index#23199 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
KhronosGroup/glTF-Blender-IO#2769 ·