Skip to content

Instantly share code, notes, and snippets.

@nirlanka
Created July 5, 2019 13:14
Show Gist options
  • Save nirlanka/e8474245c465ab147dc4a217243e52d9 to your computer and use it in GitHub Desktop.
Save nirlanka/e8474245c465ab147dc4a217243e52d9 to your computer and use it in GitHub Desktop.
Extract package details from .NET or NodeJS projects
## 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