Created
July 5, 2019 13:14
-
-
Save nirlanka/e8474245c465ab147dc4a217243e52d9 to your computer and use it in GitHub Desktop.
Extract package details from .NET or NodeJS projects
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
## Usage: | |
## python(3) .\extract-packages.py filename.ext::filename2.ext | |
import sys | |
import subprocess | |
import json | |
import requests | |
def log(txt, line_end='\n'): | |
outfile = open('extract-packages.log.txt', 'a') | |
print(txt, end=line_end) | |
outfile.write(txt) | |
outfile.write('\n') | |
outfile.close() | |
def handle_dot_json(): | |
HEADERS = { 'x-requested-with': 'XMLHttpRequest', 'x-spiferack': '1' } | |
dependencies_dict = {} | |
markdown = "" | |
for filename in filenames: | |
json_obj = json.load(open(filename,'r')) | |
_deps = json_obj['dependencies'] | |
_devDeps = json_obj['devDependencies'] | |
deps = {**_deps, **_devDeps} | |
for key in deps.keys(): | |
if key in dependencies_dict: | |
dependencies_dict[key]['versions'].append(deps[key]) | |
else: | |
dependencies_dict[key] = { 'versions': [ deps[key] ] } | |
for key in sorted(dependencies_dict.keys()): | |
dep = dependencies_dict[key] | |
encoded_dep_name = key.replace("@", "%40").replace("/", "%2F") | |
url = "https://www.npmjs.com/search?q="+encoded_dep_name | |
log('URL: '+url, line_end=' ') | |
log('[Loading...', line_end=' ') | |
_res = requests.get(url=url, headers=HEADERS) | |
log('DONE]') | |
res = _res.json() | |
proj_url = '' | |
if 'objects' in res: | |
if len(res['objects']) > 0: | |
proj_url = res['objects'][0]['package']['links'].get('homepage', res['objects'][0]['package']['links']['npm']) | |
else: | |
proj_url = 'https://www.npmjs.com/package/'+key | |
else: | |
proj_url = 'https://www.npmjs.com/package/'+res['packageUrl'].replace('/package/', '') | |
if 'DefinitelyTyped' in proj_url: | |
proj_url = 'https://www.npmjs.com/package/'+key | |
markdown += '- **{0}**\n'.format(key) | |
markdown += ' - Homepage: <{0}>\n'.format(proj_url) | |
markdown += ' - Versions: {0}\n'.format(', '.join(dep['versions']).replace('~','').replace('^','')) | |
return markdown | |
def handle_dot_config(): | |
dependencies_dict = {} | |
markdown = "" | |
for filename in filenames: | |
with open(filename) as f: | |
lines = list(f) | |
for l in lines: | |
if "<package id" in l and ('"Microsoft.' not in l and '"System.' not in l): | |
parts = l.split('"') | |
if parts[1] in dependencies_dict: | |
dependencies_dict[parts[1]]['versions'].append(parts[3]) | |
else: | |
dependencies_dict[parts[1]] = { 'versions': [ parts[3] ] } | |
for key in sorted(dependencies_dict.keys()): | |
dep = dependencies_dict[key] | |
url = "https://api.nuget.org/v3/registration3/"+key.lower()+"/index.json" | |
log('URL: '+url, line_end=' ') | |
log('[Loading...', line_end=' ') | |
_res = requests.get(url=url) | |
log('DONE]') | |
res = _res.json() | |
proj_url = res['items'][-1]['items'][-1]['catalogEntry']['projectUrl'] | |
markdown += "- **"+key+"**"+'\n' | |
markdown += " - Homepage: <"+proj_url+">\n" | |
markdown += " - Version: "+', '.join(dep['versions']).replace('~','').replace('^','')+'\n' | |
_args = sys.argv | |
args = ' '.join(_args) | |
log(args) | |
try: | |
_filenames = args.replace('\\', '/').split('.py ')[-1] | |
log(_filenames) | |
filenames = _filenames.split('::') | |
ext = filenames[0].split('.')[-1] | |
log('EXTENSION: .'+ext+'\n') | |
markdown = '' | |
if ext == 'config': | |
markdown = handle_dot_config() | |
elif ext == 'json': | |
markdown = handle_dot_json() | |
log('RESULTS: ') | |
log(markdown) | |
except: | |
log('\n'.join(sys.exc_info())) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment