This repository has been archived on 2023-02-07. You can view files and clone it, but cannot push or open issues or pull requests.
Files
blender-package-manager-addon/blenderpack.py
gandalf3 1cefb4eab6 First test for conditional requests
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.
2017-07-05 02:45:30 -07:00

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()