
Involves lots of mocking. Part of the issue is that there is no way (?) to know where repo.json is stored when blender isn't running the show.
103 lines
2.4 KiB
Python
Executable File
103 lines
2.4 KiB
Python
Executable File
#!/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()
|
|
|