1
1
# -*- coding: utf-8 -*-
2
-
2
+ import json
3
3
import logging
4
4
import os
5
5
import os .path
14
14
import urllib
15
15
try :
16
16
from urllib .request import urlopen
17
+ from urllib .parse import urlparse
17
18
except ImportError :
18
19
from urllib import urlopen
20
+ from urlparse import urlparse
19
21
20
22
from .handler import logger , _check_log_handler
21
23
@@ -42,36 +44,38 @@ def _get_pandoc_urls(version="latest"):
42
44
:return: str version: actual pandoc version. (e.g. "latest" will be resolved to the actual one)
43
45
"""
44
46
# url to pandoc download page
45
- url = "https://github.com/jgm/pandoc/releases/" + \
46
- ("tag /" if version != "latest" else "" ) + version
47
+ url = "https://api. github.com/repos /jgm/pandoc/releases/" + \
48
+ ("tags /" if version != "latest" else "" ) + version
47
49
# try to open the url
48
50
try :
49
51
response = urlopen (url )
50
- version_url_frags = response .url .split ("/" )
51
- version = version_url_frags [- 1 ]
52
52
except urllib .error .HTTPError as e :
53
53
raise RuntimeError ("Invalid pandoc version {}." .format (version ))
54
- return
55
- # read the HTML content
56
- response = urlopen (f"https://github.com/jgm/pandoc/releases/expanded_assets/{ version } " )
57
- content = response .read ()
54
+ # read json response
55
+ data = json .loads (response .read ())
58
56
# regex for the binaries
59
57
uname = platform .uname ()[4 ]
60
- processor_architecture = "arm" if uname .startswith ("arm" ) or uname .startswith ("aarch" ) else "amd"
61
- regex = re .compile (fr"/jgm/pandoc/releases/download/.*(?:{ processor_architecture } |x86|mac).*\.(?:msi|deb|pkg)" )
62
- # a list of urls to the binaries
63
- pandoc_urls_list = regex .findall (content .decode ("utf-8" ))
58
+ processor_architecture = (
59
+ "arm" if uname .startswith ("arm" ) or uname .startswith ("aarch" ) else "amd"
60
+ )
61
+ regex = re .compile (
62
+ rf"/jgm/pandoc/releases/download/.*(?:{ processor_architecture } |x86|mac)"
63
+ r".*\.(?:msi|deb|pkg)"
64
+ )
64
65
# actual pandoc version
65
- version = pandoc_urls_list [ 0 ]. split ( '/' )[ 5 ]
66
+ version = data [ "tag_name" ]
66
67
# dict that lookup the platform from binary extension
67
68
ext2platform = {
68
69
'msi' : 'win32' ,
69
70
'deb' : 'linux' ,
70
71
'pkg' : 'darwin'
71
- }
72
- # parse pandoc_urls from list to dict
73
- # py26 don't like dict comprehension. Use this one instead when py26 support is dropped
74
- pandoc_urls = {ext2platform [url_frag [- 3 :]]: (f"https://github.com{ url_frag } " ) for url_frag in pandoc_urls_list }
72
+ }
73
+ # collect pandoc urls from json content
74
+ pandoc_urls = dict ()
75
+ for asset in data ["assets" ]:
76
+ download_url = asset ["browser_download_url" ]
77
+ if regex .match (urlparse (download_url ).path ):
78
+ pandoc_urls [ext2platform .get (asset ["name" ][- 3 :])] = download_url
75
79
return pandoc_urls , version
76
80
77
81
0 commit comments