This file is indexed.

/usr/lib/python3/dist-packages/geopy/geocoders/dot_us.py is in python3-geopy 0.95.1-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import getpass
from urllib.parse import urlencode
from urllib.request import urlopen
from geopy.geocoders.base import Geocoder
from geopy import util
import csv

class GeocoderDotUS(Geocoder):
    def __init__(self, username=None, password=None, format_string='%s'):
        if username and (password is None):
            password = getpass.getpass(
                "geocoder.us password for %r: " % username
            )
        
        self.format_string = format_string
        self.username = username
        self.__password = password
    
    def get_url(self):
        username = self.username
        password = self.__password
        if username and password:
            auth = '%s@%s:' % (username, password)
            resource = 'member/service/namedcsv'
        else:
            auth = ''
            resource = 'service/namedcsv'
        
        return 'http://%sgeocoder.us/%s' % (auth, resource)
    
    def geocode(self, query, exactly_one=True):
        if isinstance(query, str):
            query = query.encode('utf-8')
        query_str = self.format_string % query
        
        page = urlopen("%s?%s" % (
            self.get_url(),
            urlencode({'address':query_str})
        ))
        
        reader = csv.reader(page)
        
        places = [r for r in reader]
        
        # GeoNames only returns the closest match, no matter what.
        #
        #if exactly_one and len(places) != 1:
        #    raise ValueError("Didn't find exactly one placemark! " \
        #                     "(Found %d.)" % len(places))
        #
        #if exactly_one:
        #    return self._parse_result(places[0])
        #else:
        #    return [self._parse_result(place) for place in places]
        
        return self._parse_result(places[0])
    
    @staticmethod
    def _parse_result(result):
        # turn x=y pairs ("lat=47.6", "long=-117.426") into dict key/value pairs:
        place = dict(
            [x for x in [x.split('=', 1) for x in result] if len(x)>1])
        
        address = [
            place.get('number', None),
            place.get('prefix', None),
            place.get('street', None),
            place.get('type', None),
            place.get('suffix', None)
        ]
        city = place.get('city', None)
        state = place.get('state', None)
        zip_code = place.get('zip', None)
        
        name = util.join_filter(", ", [
            util.join_filter(" ", address),
            city,
            util.join_filter(" ", [state, zip_code])
        ])
        
        latitude = place.get('lat', None)
        longitude = place.get('long', None)
        if latitude and longitude:
            latlon = float(latitude), float(longitude)
        else:
            return None
        
        # TODO use Point/Location object API in 0.95
        #if latitude and longitude:
        #    point = Point(latitude, longitude)
        #else:
        #    point = None
        #return Location(name, point, dict(result))
        return name, latlon