Compare commits

..

6 Commits

Author SHA1 Message Date
a41111b045 Fix some Python 3.8 related issues 2020-08-03 17:48:51 -04:00
85f822e1c4 Decode non-JSON HTTP responses when possible
This doesn't affect anything in nilmdb, but is needed by nilmrun.
2020-08-03 17:31:11 -04:00
0222dfebf0 Update git URL 2020-08-03 16:48:54 -04:00
70914690c1 Update README for Python 3.8 and newer 2020-08-03 16:36:10 -04:00
10400f2b07 rocket: suppress build warnings 2020-08-03 16:27:55 -04:00
56153ff7ad Update installation instructions 2019-08-30 17:14:50 -04:00
6 changed files with 36 additions and 13 deletions

View File

@@ -6,14 +6,13 @@ NilmDB requires Python 3.7 or newer.
## Prerequisites: ## Prerequisites:
# Runtime and build environments # Runtime and build environments
sudo apt install python3.7 python3.7-dev python3.7-venv python3-pip sudo apt install python3 python3-dev python3-venv python3-pip
# Optional: create a new Python virtual environment to isolate # Create a new Python virtual environment to isolate deps.
# dependencies. To leave the virtual environment, run "deactivate" python3 -m venv ../venv
python -m venv venv source ../venv/bin/activate # run "deactivate" to leave
source venv/bin/activate
# Install all Python dependencies from PyPI. # Install all Python dependencies
pip3 install -r requirements.txt pip3 install -r requirements.txt
## Test: ## Test:
@@ -22,6 +21,14 @@ NilmDB requires Python 3.7 or newer.
## Install: ## Install:
Install it into the virtual environment
python3 setup.py install
If you want to instead install it system-wide, you will also need to
install the requirements system-wide:
sudo pip3 install -r requirements.txt
sudo python3 setup.py install sudo python3 setup.py install
## Usage: ## Usage:

View File

@@ -109,7 +109,7 @@ class HTTPClient():
stream=False, headers=headers) stream=False, headers=headers)
if isjson: if isjson:
return json.loads(response.content) return json.loads(response.content)
return response.content return response.text
def get(self, url, params=None): def get(self, url, params=None):
"""Simple GET (parameters in URL)""" """Simple GET (parameters in URL)"""

View File

@@ -168,7 +168,7 @@ static int Rocket_init(Rocket *self, PyObject *args, PyObject *kwds)
if (!layout) if (!layout)
return -1; return -1;
if (path) { if (path) {
if (strlen(path) != pathlen) { if (strlen(path) != (size_t)pathlen) {
PyErr_SetString(PyExc_ValueError, "path must not " PyErr_SetString(PyExc_ValueError, "path must not "
"contain NUL characters"); "contain NUL characters");
return -1; return -1;
@@ -477,7 +477,7 @@ static PyObject *Rocket_append_binary(Rocket *self, PyObject *args)
} }
/* Write binary data */ /* Write binary data */
if (fwrite(data, self->binary_size, rows, self->file) != rows) { if (fwrite(data, self->binary_size, rows, self->file) != (size_t)rows) {
PyErr_SetFromErrno(PyExc_OSError); PyErr_SetFromErrno(PyExc_OSError);
return NULL; return NULL;
} }
@@ -628,7 +628,7 @@ static PyObject *Rocket_extract_binary(Rocket *self, PyObject *args)
/* Data in the file is already in the desired little-endian /* Data in the file is already in the desired little-endian
binary format, so just read it directly. */ binary format, so just read it directly. */
if (fread(str, self->binary_size, count, self->file) != count) { if (fread(str, self->binary_size, count, self->file) != (size_t)count) {
free(str); free(str);
PyErr_SetFromErrno(PyExc_OSError); PyErr_SetFromErrno(PyExc_OSError);
return NULL; return NULL;

View File

@@ -6,6 +6,7 @@ import sys
import json import json
import decorator import decorator
import functools import functools
import threading
import cherrypy import cherrypy
@@ -178,6 +179,19 @@ def cherrypy_patch_exit():
os._exit = real_exit os._exit = real_exit
bus.exit = functools.partial(patched_exit, bus.exit) bus.exit = functools.partial(patched_exit, bus.exit)
# A behavior change in Python 3.8 means that some thread exceptions,
# derived from SystemExit, now print tracebacks where they didn't
# used to: https://bugs.python.org/issue1230540
# Install a thread exception hook that ignores CherryPyExit;
# to make this match the behavior where we didn't set
# threading.excepthook, we also need to ignore SystemExit.
def hook(args):
if args.exc_type == CherryPyExit or args.exc_type == SystemExit:
return
sys.excepthook(args.exc_type, args.exc_value,
args.exc_traceback) # pragma: no cover
threading.excepthook = hook
# Start/stop CherryPy standalone server # Start/stop CherryPy standalone server
def cherrypy_start(blocking=False, event=False): def cherrypy_start(blocking=False, event=False):

View File

@@ -26,7 +26,9 @@ class Timestamper():
return b"" return b""
if line[0:1] == b'#': if line[0:1] == b'#':
continue continue
break # For some reason, coverage on python 3.8 reports that
# we never hit this break, even though we definitely do.
break # pragma: no cover
try: try:
return next(self.ts_iter) + line return next(self.ts_iter) + line
except StopIteration: except StopIteration:

View File

@@ -4,7 +4,7 @@
# git tag -a nilmdb-1.1 -m "Version 1.1" # git tag -a nilmdb-1.1 -m "Version 1.1"
# git push --tags # git push --tags
# Then just package it up: # Then just package it up:
# python setup.py sdist # python3 setup.py sdist
import sys import sys
import os import os
@@ -36,7 +36,7 @@ install_requires = open('requirements.txt').readlines()
setup(name='nilmdb', setup(name='nilmdb',
version = versioneer.get_version(), version = versioneer.get_version(),
cmdclass = versioneer.get_cmdclass(), cmdclass = versioneer.get_cmdclass(),
url = 'https://git.jim.sh/jim/lees/nilmdb.git', url = 'https://git.jim.sh/nilm/nilmdb.git',
author = 'Jim Paris', author = 'Jim Paris',
description = "NILM Database", description = "NILM Database",
long_description = "NILM Database", long_description = "NILM Database",