Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
summary_polyline = Attribute(str, (SUMMARY, DETAILED)) #: Google polyline encoding for summary shape
class Split(BaseEntity):
"""
A split -- may be metric or standard units (which has no bearing
on the units used in this object, just the binning of values).
"""
distance = Attribute(float, units=uh.meters) #: Distance for this split
elapsed_time = TimeIntervalAttribute() #: :class:`datetime.timedelta` of elapsed time for split
elevation_difference = Attribute(float, units=uh.meters) #: Elevation difference for split
moving_time = TimeIntervalAttribute() #: :class:`datetime.timedelta` of moving time for split
average_heartrate = Attribute(float) #: Average HR for split
split = Attribute(int) #: Which split number
pace_zone = Attribute(int) #: (undocumented)
average_speed = Attribute(float, units=uh.meters_per_second)
def __repr__(self):
return ''.format(self.split, self.distance, self.elapsed_time)
class SegmentExplorerResult(LoadableEntity):
"""
Represents a segment result from the segment explorer feature.
(These are not full segment objects, but the segment object can be fetched
via the 'segment' property of this object.)
"""
_segment = None
id = Attribute(int) #: ID of the segment.
name = Attribute(six.text_type) #: Name of the segment
climb_category = Attribute(int) #: Climb category for the segment (0 is higher)
average_speed = Attribute(float, (SUMMARY, DETAILED,), units=uh.meters_per_second) #: Average speed for lap
max_speed = Attribute(float, (SUMMARY, DETAILED,), units=uh.meters_per_second) #: Max speed for lap
average_cadence = Attribute(float, (SUMMARY, DETAILED,)) #: Average cadence for lap
average_watts = Attribute(float, (SUMMARY, DETAILED,)) #: Average watts for lap
average_heartrate = Attribute(float, (SUMMARY, DETAILED,)) #: Average heartrate for lap
max_heartrate = Attribute(float, (SUMMARY, DETAILED,)) #: Max heartrate for lap
lap_index = Attribute(int, (SUMMARY, DETAILED)) #: Index of lap
device_watts = Attribute(bool, (SUMMARY, DETAILED)) # true if the watts are from a power meter, false if estimated
pace_zone = Attribute(int, (SUMMARY, DETAILED)) #: (undocumented)
split = Attribute(int, (SUMMARY, DETAILED)) #: Split number
class Map(IdentifiableEntity):
id = Attribute(six.text_type, (SUMMARY, DETAILED)) #: Alpha-numeric identifier
polyline = Attribute(str, (SUMMARY, DETAILED)) #: Google polyline encoding
summary_polyline = Attribute(str, (SUMMARY, DETAILED)) #: Google polyline encoding for summary shape
class Split(BaseEntity):
"""
A split -- may be metric or standard units (which has no bearing
on the units used in this object, just the binning of values).
"""
distance = Attribute(float, units=uh.meters) #: Distance for this split
elapsed_time = TimeIntervalAttribute() #: :class:`datetime.timedelta` of elapsed time for split
elevation_difference = Attribute(float, units=uh.meters) #: Elevation difference for split
moving_time = TimeIntervalAttribute() #: :class:`datetime.timedelta` of moving time for split
average_heartrate = Attribute(float) #: Average HR for split
split = Attribute(int) #: Which split number
pace_zone = Attribute(int) #: (undocumented)
average_speed = Attribute(float, units=uh.meters_per_second)
elapsed_time = TimeIntervalAttribute((SUMMARY, DETAILED))
start_date = TimestampAttribute((SUMMARY, DETAILED))
start_date_local = TimestampAttribute((SUMMARY, DETAILED))
is_kom = Attribute(bool, (SUMMARY, DETAILED))
class Segment(LoadableEntity):
"""
Represents a single Strava segment.
"""
_leaderboard = None
name = Attribute(six.text_type, (SUMMARY, DETAILED)) #: Name of the segment.
activity_type = Attribute(six.text_type, (SUMMARY, DETAILED)) #: Activity type of segment ('Ride' or 'Run')
distance = Attribute(float, (SUMMARY, DETAILED), units=uh.meters) #: Distance of segment
average_grade = Attribute(float, (SUMMARY, DETAILED)) #: Average grade (%) for segment
maximum_grade = Attribute(float, (SUMMARY, DETAILED)) #: Maximum grade (%) for segment
elevation_high = Attribute(float, (SUMMARY, DETAILED), units=uh.meters) #: The highest point of the segment.
elevation_low = Attribute(float, (SUMMARY, DETAILED), units=uh.meters) #: The lowest point of the segment.
start_latlng = LocationAttribute((SUMMARY, DETAILED)) #: The start lat/lon (:class:`tuple`)
end_latlng = LocationAttribute((SUMMARY, DETAILED)) #: The end lat/lon (:class:`tuple`)
start_latitude = Attribute(float, (SUMMARY, DETAILED)) #: The start latitude (:class:`float`)
end_latitude = Attribute(float, (SUMMARY, DETAILED)) #: The end latitude (:class:`float`)
start_longitude = Attribute(float, (SUMMARY, DETAILED)) #: The start longitude (:class:`float`)
end_longitude = Attribute(float, (SUMMARY, DETAILED)) #: The end longitude (:class:`float`)
climb_category = Attribute(int, (SUMMARY, DETAILED)) # 0-5, lower is harder
city = Attribute(six.text_type, (SUMMARY, DETAILED)) #: The city this segment is in.
state = Attribute(six.text_type, (SUMMARY, DETAILED)) #: The state this segment is in.
country = Attribute(six.text_type, (SUMMARY, DETAILED)) #: The country this segment is in.
private = Attribute(bool, (SUMMARY, DETAILED)) #: Whether this is a private segment.
starred = Attribute(bool, (SUMMARY, DETAILED)) #: Whether this segment is starred by authenticated athlete
idval = self.id
return '<{clz} {type} {idfield}={id}>'.format(clz=self.__class__.__name__,
type=photo_type,
idfield=idfield,
id=idval)
class ActivityKudos(LoadableEntity):
"""
Activity kudos are a subset of athlete properties.
"""
firstname = Attribute(six.text_type, (SUMMARY, DETAILED)) #: Athlete's first name.
lastname = Attribute(six.text_type, (SUMMARY, DETAILED)) #: Athlete's last name.
profile_medium = Attribute(six.text_type, (SUMMARY, DETAILED)) #: URL to a 62x62 pixel profile picture
profile = Attribute(six.text_type, (SUMMARY, DETAILED)) #: URL to a 124x124 pixel profile picture
city = Attribute(six.text_type, (SUMMARY, DETAILED)) #: Athlete's home city
state = Attribute(six.text_type, (SUMMARY, DETAILED)) #: Athlete's home state
country = Attribute(six.text_type, (SUMMARY, DETAILED)) #: Athlete's home country
sex = Attribute(six.text_type, (SUMMARY, DETAILED)) #: Athlete's sex ('M', 'F' or null)
friend = Attribute(six.text_type, (SUMMARY, DETAILED)) #: 'pending', 'accepted', 'blocked' or 'null' the authenticated athlete's following status of this athlete
follower = Attribute(six.text_type, (SUMMARY, DETAILED)) #: 'pending', 'accepted', 'blocked' or 'null' this athlete's following status of the authenticated athlete
premium = Attribute(bool, (SUMMARY, DETAILED)) #: Whether athlete is a premium member (true/false)
created_at = TimestampAttribute((SUMMARY, DETAILED)) #: :class:`datetime.datetime` when athlete record was created.
updated_at = TimestampAttribute((SUMMARY, DETAILED)) #: :class:`datetime.datetime` when athlete record was last updated.
approve_followers = Attribute(bool, (SUMMARY, DETAILED)) #: Whether athlete has elected to approve followers
class ActivityLap(LoadableEntity):
class SegmentEfforAchievement(BaseEntity):
"""
An undocumented structure being returned for segment efforts.
"""
rank = Attribute(int) #: Rank in segment (either overall leaderboard, or pr rank)
type = Attribute(six.text_type) #: The type of achievement -- e.g. 'year_pr' or 'overall'
type_id = Attribute(int) #: Numeric ID for type of achievement? (6 = year_pr, 2 = overall ??? other?)
class BaseEffort(LoadableEntity):
"""
Base class for a best effort or segment effort.
"""
name = Attribute(six.text_type, (SUMMARY, DETAILED)) #: The name of the segment
segment = EntityAttribute(Segment, (SUMMARY, DETAILED)) #: The associated :class:`stravalib.model.Segment` for this effort
activity = EntityAttribute("Activity", (SUMMARY, DETAILED)) #: The associated :class:`stravalib.model.Activity`
athlete = EntityAttribute(Athlete, (SUMMARY, DETAILED)) #: The associated :class:`stravalib.model.Athlete`
kom_rank = Attribute(int, (SUMMARY, DETAILED)) #: 1-10 segment KOM ranking for athlete at time of upload
pr_rank = Attribute(int, (SUMMARY, DETAILED)) #: 1-3 personal record ranking for athlete at time of upload
moving_time = TimeIntervalAttribute((SUMMARY, DETAILED)) #: :class:`datetime.timedelta`
elapsed_time = TimeIntervalAttribute((SUMMARY, DETAILED)) #: :class:`datetime.timedelta`
start_date = TimestampAttribute((SUMMARY, DETAILED)) #: :class:`datetime.datetime` when effort was started in GMT
start_date_local = TimestampAttribute((SUMMARY, DETAILED), tzinfo=None) #: :class:`datetime.datetime` when effort was started in activity timezone for this effort
distance = Attribute(int, (SUMMARY, DETAILED), units=uh.meters) #: The distance for this effort.
average_watts = Attribute(float, (SUMMARY, DETAILED)) #: Average power during effort
device_watts = Attribute(bool, (SUMMARY, DETAILED)) #: True if the watts are from a power meter, false if estimated
average_heartrate = Attribute(float, (SUMMARY, DETAILED)) #: Average HR during effort
max_heartrate = Attribute(float, (SUMMARY, DETAILED)) #: Max HR during effort
average_cadence = Attribute(float, (SUMMARY, DETAILED)) #: Average cadence during effort
start_index = Attribute(int, (SUMMARY, DETAILED)) #: The activity stream index of the start of this effort
offer_in_app_payment = Attribute(bool, (DETAILED,)) #: (undocumented, detailed-only)
global_privacy = Attribute(bool, (DETAILED,)) #: (undocumented, detailed-only) Whether athlete has global privacy enabled.
receive_newsletter = Attribute(bool, (DETAILED,)) #: (undocumented, detailed-only) Whether athlete has elected to receive newsletter
email_kom_lost = Attribute(bool, (DETAILED,)) #: (undocumented, detailed-only) Whether athlete has elected to receive emails when KOMs are lost.
dateofbirth = DateAttribute((DETAILED,)) #: (undocumented, detailed-only) Athlete's date of birth
facebook_sharing_enabled = Attribute(bool, (DETAILED,)) #: (undocumented, detailed-only) Whether Athlete has enabled sharing on Facebook
ftp = Attribute(six.text_type, (DETAILED,)) #: (undocumented, detailed-only)
profile_original = Attribute(six.text_type, (DETAILED,)) #: (undocumented, detailed-only)
premium_expiration_date = Attribute(int, (DETAILED,)) #: (undocumented, detailed-only) When does premium membership expire (:class:`int` unix epoch)
email_send_follower_notices = Attribute(bool, (DETAILED,)) #: (undocumented, detailed-only)
plan = Attribute(six.text_type, (DETAILED,)) #: (undocumented, detailed-only)
agreed_to_terms = Attribute(six.text_type, (DETAILED,)) #: (undocumented, detailed-only) Whether athlete has agreed to terms
follower_request_count = Attribute(int, (DETAILED,)) #: (undocumented, detailed-only) How many people have requested to follow this athlete
email_facebook_twitter_friend_joins = Attribute(bool, (DETAILED,)) #: (undocumented, detailed-only) Whether athlete has elected to receve emails when a twitter or facebook friend joins Strava
receive_kudos_emails = Attribute(bool, (DETAILED,)) #: (undocumented, detailed-only) Whether athlete has elected to receive emails on kudos
receive_follower_feed_emails = Attribute(bool, (DETAILED,)) #: (undocumented, detailed-only) Whether athlete has elected to receive emails on new followers
receive_comment_emails = Attribute(bool, (DETAILED,)) #: (undocumented, detailed-only) Whether athlete has elected to receive emails on activity comments
sample_race_distance = Attribute(int, (DETAILED,)) # (undocumented, detailed-only)
sample_race_time = Attribute(int, (DETAILED,)) # (undocumented, detailed-only)
membership = Attribute(six.text_type, (SUMMARY, DETAILED)) #: (undocumented, club members only) String indicating the membership type of club
admin = Attribute(bool, (SUMMARY, DETAILED)) #: (undocumented, club members only) Flag indicating whether member is an admin of club
owner = Attribute(bool, (SUMMARY, DETAILED)) #: (undocumented, club members only) Flag indicating whether member is owner of club
subscription_permissions = Attribute(list) #: (undocumented) Unsure what this holds exactly!
_friends = None
_followers = None
_stats = None
_is_authenticated = None
if not isinstance(v, timedelta):
v = timedelta(seconds=v)
return v
def marshal(self, v):
"""
Serialize time zone name.
:param v: The timezone.
:type v: tzdata
:return: The name of the time zone.
"""
return str(v) if v else None
class ChoicesAttribute(Attribute):
"""
Attribute where there are several choices the attribute may take.
Allows conversion from the API value to a more helpful python value.
"""
def __init__(self, *args, **kwargs):
self.choices = kwargs.pop("choices", {})
super(ChoicesAttribute, self).__init__(*args, **kwargs)
def marshal(self, v):
"""
Turn this value into API format.
Do a reverse dictionary lookup on choices to find the original value. If
there are no keys or too many keys for now we raise a NotImplementedError
as marshal is not used anywhere currently. In the future we will want to
start_date_local = TimestampAttribute((SUMMARY, DETAILED), tzinfo=None) #: :class:`datetime.datetime` when this effort was started in activity timezone
rank = Attribute(int) #: The rank on the leaderboard.
def __repr__(self):
return ''.format(self.rank, self.athlete_name)
class SegmentLeaderboard(Sequence, BoundEntity):
"""
The ranked leaderboard for a segment.
This class is effectively a collection of :class:`stravalib.model.SegmentLeaderboardEntry` objects.
"""
entry_count = Attribute(int)
effort_count = Attribute(int)
kom_type = Attribute(six.text_type)
entries = EntityCollection(SegmentLeaderboardEntry)
def __iter__(self):
return iter(self.entries)
def __len__(self):
return len(self.entries)
def __contains__(self, k):
return k in self.entries
def __getitem__(self, k):
return self.entries[k]
state = Attribute(six.text_type, (SUMMARY, DETAILED)) #: Athlete's home state
country = Attribute(six.text_type, (SUMMARY, DETAILED)) #: Athlete's home country
sex = Attribute(six.text_type, (SUMMARY, DETAILED)) #: Athlete's sex ('M', 'F' or null)
friend = Attribute(six.text_type, (SUMMARY, DETAILED)) #: 'pending', 'accepted', 'blocked' or 'null' the authenticated athlete's following status of this athlete
follower = Attribute(six.text_type, (SUMMARY, DETAILED)) #: 'pending', 'accepted', 'blocked' or 'null' this athlete's following status of the authenticated athlete
premium = Attribute(bool, (SUMMARY, DETAILED)) #: Whether athlete is a premium member (true/false). Deprecated use summit.
summit = Attribute(bool, (SUMMARY, DETAILED)) #: Whether the athlete has any Summit subscription.
created_at = TimestampAttribute((SUMMARY, DETAILED)) #: :class:`datetime.datetime` when athlete record was created.
updated_at = TimestampAttribute((SUMMARY, DETAILED)) #: :class:`datetime.datetime` when athlete record was last updated.
approve_followers = Attribute(bool, (SUMMARY, DETAILED)) #: Whether athlete has elected to approve followers
badge_type_id = Attribute(int, (SUMMARY, DETAILED)) #: (undocumented)
follower_count = Attribute(int, (DETAILED,)) #: (detailed-only) How many people are following this athlete
friend_count = Attribute(int, (DETAILED,)) #: (detailed-only) How many people is this athlete following
mutual_friend_count = Attribute(int, (DETAILED,)) #: (detailed-only) How many people are both following and being followed by this athlete
athlete_type = ChoicesAttribute(six.text_type, (DETAILED,), choices={0: "cyclist", 1: "runner"}) #: athlete's default sport: 0 is cyclist, 1 is runner
date_preference = Attribute(six.text_type, (DETAILED,)) #: (detailed-only) Athlete's preferred date representation (e.g. "%m/%d/%Y")
measurement_preference = Attribute(six.text_type, (DETAILED,)) #: (detailed-only) How athlete prefers to see measurements (i.e. "feet" (or what "meters"?))
email = Attribute(six.text_type, (DETAILED,)) #: (detailed-only) Athlete's email address
clubs = EntityCollection(Club, (DETAILED,)) #: (detailed-only) Which clubs athlete belongs to. (:class:`list` of :class:`stravalib.model.Club`)
bikes = EntityCollection(Bike, (DETAILED,)) #: (detailed-only) Which bikes this athlete owns. (:class:`list` of :class:`stravalib.model.Bike`)
shoes = EntityCollection(Shoe, (DETAILED,)) #: (detailed-only) Which shoes this athlete owns. (:class:`list` of :class:`stravalib.model.Shoe`)
super_user = Attribute(bool, (SUMMARY, DETAILED)) #: (undocumented) Whether athlete is a super user (not
email_language = Attribute(six.text_type, (SUMMARY, DETAILED)) #: The user's preferred lang/locale (e.g. en-US)
# A bunch of undocumented detailed-resolution attribs
class Subscription(LoadableEntity):
"""
Represents a Webhook Event Subscription.
http://strava.github.io/api/partner/v3/events/
"""
OBJECT_TYPE_ACTIVITY = 'activity'
ASPECT_TYPE_CREATE = 'create'
VERIFY_TOKEN_DEFAULT = 'STRAVA'
application_id = Attribute(int)
object_type = Attribute(six.text_type)
aspect_type = Attribute(six.text_type)
callback_url = Attribute(six.text_type)
created_at = TimestampAttribute()
updated_at = TimestampAttribute()
class SubscriptionCallback(LoadableEntity):
"""
Represents a Webhook Event Subscription Callback.
"""
hub_mode = Attribute(six.text_type)
hub_verify_token = Attribute(six.text_type)
hub_challenge = Attribute(six.text_type)
def validate(self, verify_token=Subscription.VERIFY_TOKEN_DEFAULT):
assert self.hub_verify_token == verify_token