runtilities 2.2.1.dev1__tar.gz → 2.3.0.dev1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/PKG-INFO +1 -1
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/running/runningahead.py +3 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/running/runsignup.py +47 -16
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/running/version.py +1 -1
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/runtilities.egg-info/PKG-INFO +1 -1
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/README.md +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/running/__init__.py +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/running/analyzeagegrade.py +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/running/athlinks.py +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/running/athlinksresults.py +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/running/comparegpx.py +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/running/competitor.py +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/running/competitor2csv.py +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/running/getweather.py +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/running/gpx2kml.py +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/running/parseralogxml.py +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/running/parseresults.py +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/running/parserun-bk3.py +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/running/parsetcx.py +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/running/ra2membersfile.py +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/running/racewx-render.py +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/running/racewx.py +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/running/renderclubagstats.py +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/running/runningaheadmembers.py +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/running/runningaheadparticipants.py +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/running/runningaheadresults.py +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/running/strava.py +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/running/textnormalize.py +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/running/ultrasignup.py +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/running/ultrasignupresults.py +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/running/xmldict.py +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/running/xmldict1.py +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/running/xmldict2.py +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/running/xmlreader.py +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/runtilities.egg-info/SOURCES.txt +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/runtilities.egg-info/dependency_links.txt +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/runtilities.egg-info/entry_points.txt +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/runtilities.egg-info/not-zip-safe +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/runtilities.egg-info/requires.txt +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/runtilities.egg-info/top_level.txt +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/setup.cfg +0 -0
- {runtilities-2.2.1.dev1 → runtilities-2.3.0.dev1}/setup.py +0 -0
|
@@ -46,6 +46,9 @@ from oauthlib.oauth2 import BackendApplicationClient
|
|
|
46
46
|
# home grown
|
|
47
47
|
# from running import *
|
|
48
48
|
from loutilities import apikey
|
|
49
|
+
import version
|
|
50
|
+
|
|
51
|
+
class parameterError(Exception): pass
|
|
49
52
|
|
|
50
53
|
# OAuth stuff
|
|
51
54
|
auth_url = 'https://www.runningahead.com/oauth2/authorize'
|
|
@@ -37,6 +37,7 @@ from tempfile import NamedTemporaryFile
|
|
|
37
37
|
# pypi
|
|
38
38
|
from flask import current_app
|
|
39
39
|
import requests
|
|
40
|
+
from universalclient import Client as UniversalClient
|
|
40
41
|
|
|
41
42
|
# github
|
|
42
43
|
|
|
@@ -49,21 +50,19 @@ from loutilities.csvwt import record2csv
|
|
|
49
50
|
from loutilities.nicknames import NameDenormalizer
|
|
50
51
|
names = NameDenormalizer()
|
|
51
52
|
|
|
53
|
+
# use api.runsignup.com per https://info.runsignup.com/2025/08/06/upgrading-our-api-infrastructure-for-ai-api-runsignup-com/
|
|
54
|
+
|
|
52
55
|
# login API (deprecated)
|
|
53
|
-
login_url = 'https://runsignup.com/rest/login'
|
|
54
|
-
logout_url = 'https://runsignup.com/rest/logout'
|
|
56
|
+
login_url = 'https://api.runsignup.com/rest/login'
|
|
57
|
+
logout_url = 'https://api.runsignup.com/rest/logout'
|
|
55
58
|
|
|
56
59
|
# methods
|
|
57
|
-
members_url = 'https://runsignup.com/rest/club/{club_id}/members'
|
|
58
|
-
getrace_url = 'https://runsignup.com/rest/race/{race_id}'
|
|
59
|
-
getracedivisions_url = 'https://runsignup.com/rest/race/{race_id}/divisions/divisions'
|
|
60
|
-
getresultsets_url = 'https://runsignup.com/rest/race/{race_id}/results/get-result-sets'
|
|
61
|
-
geteventresults_url = 'https://runsignup.com/rest/race/{race_id}/results/get-results'
|
|
62
|
-
|
|
63
|
-
# OAuth stuff - NOT USED
|
|
64
|
-
# request_token_url = 'https://runsignup.com/oauth/requestToken.php'
|
|
65
|
-
# verify_url = 'https://runsignup.com/OAuth/Verify'
|
|
66
|
-
# access_token_url = 'https://runsignup.com/oauth/accessToken.php'
|
|
60
|
+
members_url = 'https://api.runsignup.com/rest/club/{club_id}/members'
|
|
61
|
+
getrace_url = 'https://api.runsignup.com/rest/race/{race_id}'
|
|
62
|
+
getracedivisions_url = 'https://api.runsignup.com/rest/race/{race_id}/divisions/divisions'
|
|
63
|
+
getresultsets_url = 'https://api.runsignup.com/rest/race/{race_id}/results/get-result-sets'
|
|
64
|
+
geteventresults_url = 'https://api.runsignup.com/rest/race/{race_id}/results/get-results'
|
|
65
|
+
getraceparticipants_url = 'https://api.runsignup.com/rest/race/{race_id}/participants'
|
|
67
66
|
|
|
68
67
|
KMPERMILE = 1.609344
|
|
69
68
|
|
|
@@ -152,7 +151,7 @@ class RunSignUp():
|
|
|
152
151
|
# email / password supplied
|
|
153
152
|
else:
|
|
154
153
|
# login to runsignup - note temporary keys will expire 1 hour after last API call
|
|
155
|
-
# see https://runsignup.com/API/login/POST
|
|
154
|
+
# see https://api.runsignup.com/API/login/POST
|
|
156
155
|
r = requests.post(login_url, params={'format' : 'json'}, data={'email' : self.email, 'password' : self.password})
|
|
157
156
|
resp = r.json()
|
|
158
157
|
|
|
@@ -175,8 +174,8 @@ class RunSignUp():
|
|
|
175
174
|
requires credentials
|
|
176
175
|
|
|
177
176
|
:param club_id: numeric club id
|
|
178
|
-
:param kwargs: non-default arguments, per https://runsignup.com/API/club/:club_id/members/GET
|
|
179
|
-
:return: members list (format per https://runsignup.com/API/club/:club_id/members/GET)
|
|
177
|
+
:param kwargs: non-default arguments, per https://api.runsignup.com/API/club/:club_id/members/GET
|
|
178
|
+
:return: members list (format per https://api.runsignup.com/API/club/:club_id/members/GET)
|
|
180
179
|
'''
|
|
181
180
|
"""
|
|
182
181
|
return members accessible to this application
|
|
@@ -637,7 +636,7 @@ class ClubMembership():
|
|
|
637
636
|
holds attributes for club membership
|
|
638
637
|
'''
|
|
639
638
|
# set up transformation to flatten record into ClubMembership object with attributes named as Transform keys
|
|
640
|
-
# transform is from RunSignUp.members.get - see https://runsignup.com/API/club/:club_id/members/GET
|
|
639
|
+
# transform is from RunSignUp.members.get - see https://api.runsignup.com/API/club/:club_id/members/GET
|
|
641
640
|
xformmapping = {
|
|
642
641
|
'user_id': lambda mem: mem['user']['user_id'],
|
|
643
642
|
'membership_id': 'membership_id',
|
|
@@ -873,3 +872,35 @@ class ClubMemberships():
|
|
|
873
872
|
self.userid2mem[member]
|
|
874
873
|
for member in self.userid2mem
|
|
875
874
|
)
|
|
875
|
+
|
|
876
|
+
class RunSignupFluent(UniversalClient):
|
|
877
|
+
from rauth import OAuth2Service
|
|
878
|
+
|
|
879
|
+
'''
|
|
880
|
+
Fluent interface to RunSignUp API -- see https://universal-client.readthedocs.io
|
|
881
|
+
'''
|
|
882
|
+
def __init__(self, key=None, secret=None, debug=False):
|
|
883
|
+
'''
|
|
884
|
+
initialize RunSignUp Fluent client
|
|
885
|
+
|
|
886
|
+
:param key: api key for RunSignUp
|
|
887
|
+
:param secret: api secret for RunSignUp
|
|
888
|
+
:param debug: debug flag
|
|
889
|
+
'''
|
|
890
|
+
# rsuservice = Oauth2Service(
|
|
891
|
+
# name='runsignup',
|
|
892
|
+
# authorize_url='https://www.runsignup.com/oauth2/authorize',
|
|
893
|
+
# access_token_url='https://api.runsignup.com/oauth2/token',
|
|
894
|
+
# client_id=key,
|
|
895
|
+
# client_secret=secret,
|
|
896
|
+
# )
|
|
897
|
+
|
|
898
|
+
self._params = params = {'api_key' : key,
|
|
899
|
+
'api_secret' : secret,
|
|
900
|
+
'format' : 'json' }
|
|
901
|
+
|
|
902
|
+
super().__init__(
|
|
903
|
+
url='https://api.runsignup.com/rest',
|
|
904
|
+
params=params,
|
|
905
|
+
)
|
|
906
|
+
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
# this string is used for the version string in the documentation, as well as the egg
|
|
2
|
-
__version__ = '2.
|
|
2
|
+
__version__ = '2.3.0.dev1'
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|