#!/usr/bin/env python3 # HACK: seems 'requests' module bundled with blender isn't bundled with 'idna' module. So force system python for now import sys sys.path.insert(0, '/usr/lib/python3.6/site-packages') import requests import json import os import pathlib import ast import argparse import zipfile import logging log = logging.getLogger(__name__) REQUIRED_KEYS = set(['name', 'blender', 'version']) SCHEMA_VERSION = 1 class BadAddon(Exception): pass # TODO add repolist class def load_repo(url): """ Searches local repo.json for repository with a matching 'url' and returns it """ pass #TODO def write_repo(repo): """ Writes repo to local repolist json """ pass #TODO def fetch_repo(url: str) -> dict: """ Requests repo.json from URL and embeds etag/last-modification headers""" local_copy = load_repo(url) headers = {} if 'etag' in local_copy: headers['If-None-Match'] = local_copy['etag'] if 'last-modified' in local_copy: headers['If-Modified-Since'] = local_copy['last-modified'] resp = requests.get(url, headers=headers) repo = json.loads(resp.json()) repo['etag'] = resp.headers.get('etag') repo['last-modified'] = resp.headers.get('last-modified') write_repo(repo) def refresh(url): # we have to explicitly close the end of the pipe we are NOT using, # otherwise no exception will be generated when the other process closes its end. pipe[0].close() local_repo_path = pathlib.Path(__file__).parent / 'packages' local_repo_path.mkdir(exist_ok=True) try: fetch_repojson(url) pipe[1].send(re.status_code) finally: pipe[1].close() # class Package: # def __init__(self): # self.bl_info = None # self.url = None # self.type = None # # class Repository: # def __init__(self, name): # self.name = name # self.packages = None # # def json(self): # return json.dumps(self.__dict__) def main(): pass # print(args) if __name__ == '__main__': parser = argparse.ArgumentParser(description='Search, install, and manage packages for Blender') subparsers = parser.add_subparsers() make = subparsers.add_parser('make') make.add_argument('path') make.set_defaults(func=lambda args: make_repo(pathlib.Path(args.path))) args = parser.parse_args() args.func(args) main()