diff --git a/.gitignore b/.gitignore index 75f1c0b..8b121a9 100644 --- a/.gitignore +++ b/.gitignore @@ -163,7 +163,6 @@ cython_debug/ # option (not recommended) you can uncomment the following to ignore the entire idea folder. #.idea/ -.pylint.sh .pylint.err .pylint.log .pylint.out diff --git a/.pylint.rc b/.pylint.rc new file mode 100644 index 0000000..39eb014 --- /dev/null +++ b/.pylint.rc @@ -0,0 +1,385 @@ +# is file was generated by edx-lint: https://github.com/edx/edx-lint +# +# If you want to change this file, you have two choices, depending on whether +# you want to make a local change that applies only to this repo, or whether +# you want to make a central change that applies to all repos using edx-lint. +# +# Note: If your pylintrc file is simply out-of-date relative to the latest +# pylintrc in edx-lint, ensure you have the latest edx-lint installed +# and then follow the steps for a "LOCAL CHANGE". +# +# LOCAL CHANGE: +# +# 1. Edit the local pylintrc_tweaks file to add changes just to this +# repo's file. +# +# 2. Run: +# +# $ edx_lint write pylintrc +# +# 3. This will modify the local file. Submit a pull request to get it +# checked in so that others will benefit. +# +# +# CENTRAL CHANGE: +# +# 1. Edit the pylintrc file in the edx-lint repo at +# https://github.com/edx/edx-lint/blob/master/edx_lint/files/pylintrc +# +# 2. install the updated version of edx-lint (in edx-lint): +# +# $ pip install . +# +# 3. Run (in edx-lint): +# +# $ edx_lint write pylintrc +# +# 4. Make a new version of edx_lint, submit and review a pull request with the +# pylintrc update, and after merging, update the edx-lint version and +# publish the new version. +# +# 5. In your local repo, install the newer version of edx-lint. +# +# 6. Run: +# +# $ edx_lint write pylintrc +# +# 7. This will modify the local file. Submit a pull request to get it +# checked in so that others will benefit. +# +# +# +# +# +# STAY AWAY FROM THIS FILE! +# +# +# +# +# +# SERIOUSLY. +# +# ------------------------------ +# Generated by edx-lint version: 5.2.3 +# ------------------------------ +[MASTER] +ignore = ,input +persistent = yes + +[MESSAGES CONTROL] +enable = + blacklisted-name, +# line-too-long, + + abstract-class-instantiated, + abstract-method, + access-member-before-definition, + anomalous-backslash-in-string, + anomalous-unicode-escape-in-string, + arguments-differ, + assert-on-tuple, + assigning-non-slot, + assignment-from-no-return, + assignment-from-none, + attribute-defined-outside-init, + bad-except-order, + bad-format-character, + bad-format-string-key, + bad-format-string, + bad-open-mode, + bad-reversed-sequence, + bad-staticmethod-argument, + bad-str-strip-call, + bad-super-call, + binary-op-exception, + boolean-datetime, + catching-non-exception, + cell-var-from-loop, + confusing-with-statement, + continue-in-finally, + dangerous-default-value, + duplicate-argument-name, + duplicate-bases, + duplicate-except, + duplicate-key, + expression-not-assigned, + format-combined-specification, + format-needs-mapping, + function-redefined, + global-variable-undefined, + import-error, + import-self, + inconsistent-mro, + inherit-non-class, + init-is-generator, + invalid-all-object, + invalid-format-index, + invalid-length-returned, + invalid-sequence-index, + invalid-slice-index, + invalid-slots-object, + invalid-slots, + invalid-unary-operand-type, + logging-too-few-args, + logging-too-many-args, + logging-unsupported-format, + lost-exception, + method-hidden, + misplaced-bare-raise, + misplaced-future, + missing-format-argument-key, + missing-format-attribute, + missing-format-string-key, + no-member, + no-method-argument, + no-name-in-module, + no-self-argument, + no-value-for-parameter, + non-iterator-returned, + nonexistent-operator, + not-a-mapping, + not-an-iterable, + not-callable, + not-context-manager, + not-in-loop, + pointless-statement, + pointless-string-statement, + raising-bad-type, + raising-non-exception, + redefined-builtin, + redefined-outer-name, + redundant-keyword-arg, + repeated-keyword, + return-arg-in-generator, + return-in-init, + return-outside-function, + signature-differs, + super-init-not-called, + syntax-error, + too-few-format-args, + too-many-format-args, + too-many-function-args, + truncated-format-string, + undefined-all-variable, + undefined-loop-variable, + undefined-variable, + unexpected-keyword-arg, + unexpected-special-method-signature, + unpacking-non-sequence, + unreachable, + unsubscriptable-object, + unsupported-binary-operation, + unsupported-membership-test, + unused-format-string-argument, + unused-format-string-key, + used-before-assignment, + using-constant-test, + yield-outside-function, + + astroid-error, + fatal, + method-check-failed, + parse-error, + raw-checker-failed, + + empty-docstring, + invalid-characters-in-docstring, +# missing-docstring, +# wrong-spelling-in-comment, +# wrong-spelling-in-docstring, + + unused-argument, + unused-import, + unused-variable, + + eval-used, + exec-used, + + bad-classmethod-argument, + bad-mcs-classmethod-argument, + bad-mcs-method-argument, + bare-except, + broad-except, + consider-iterating-dictionary, + consider-using-enumerate, + global-variable-not-assigned, + logging-format-interpolation, +# logging-not-lazy, + multiple-imports, + multiple-statements, + no-classmethod-decorator, + no-staticmethod-decorator, + protected-access, + redundant-unittest-assert, + reimported, + simplifiable-if-statement, + singleton-comparison, + superfluous-parens, + unidiomatic-typecheck, + unnecessary-lambda, + unnecessary-pass, + unnecessary-semicolon, + unneeded-not, + useless-else-on-loop, + + deprecated-method, + deprecated-module, + + too-many-boolean-expressions, + too-many-nested-blocks, + too-many-statements, + +# wildcard-import, +# wrong-import-order, +# wrong-import-position, + + missing-final-newline, + mixed-line-endings, + trailing-newlines, +# trailing-whitespace, + unexpected-line-ending-format, + + bad-inline-option, + bad-option-value, + deprecated-pragma, + unrecognized-inline-option, + useless-suppression, +disable = + global-at-module-level, + useless-return, + # + bad-indentation, + consider-using-f-string, + duplicate-code, + f-string-without-interpolation, + file-ignored, + fixme, + global-statement, + invalid-name, + locally-disabled, + no-else-return, +## no-self-use, + suppressed-message, + too-few-public-methods, + too-many-ancestors, + too-many-arguments, + too-many-branches, + too-many-instance-attributes, + too-many-lines, + too-many-locals, + too-many-public-methods, + too-many-return-statements, + ungrouped-imports, + unspecified-encoding, + unused-wildcard-import, + use-maxsplit-arg, + wrong-import-order, + wrong-import-position, + + logging-not-lazy, + line-too-long, + import-outside-toplevel, + logging-fstring-interpolation, +# new + missing-module-docstring, + missing-class-docstring, + missing-function-docstring, + use-dict-literal, + +[REPORTS] +output-format = text +##files-output = no +reports = no +score = no + +[BASIC] +##bad-functions = map,filter,apply,input +module-rgx = (([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ +const-rgx = (([A-Z_][A-Z0-9_]*)|(__.*__)|log|urlpatterns)$ +class-rgx = [A-Z_][a-zA-Z0-9]+$ +function-rgx = ([a-z_][a-z0-9_]{2,40}|test_[a-z0-9_]+)$ +method-rgx = ([a-z_][a-z0-9_]{2,40}|setUp|set[Uu]pClass|tearDown|tear[Dd]ownClass|assert[A-Z]\w*|maxDiff|test_[a-z0-9_]+)$ +attr-rgx = [a-z_][a-z0-9_]{2,30}$ +argument-rgx = [a-z_][a-z0-9_]{2,30}$ +variable-rgx = [a-z_][a-z0-9_]{2,30}$ +class-attribute-rgx = ([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ +inlinevar-rgx = [A-Za-z_][A-Za-z0-9_]*$ +good-names = f,i,j,k,db,ex,Run,_,__ +bad-names = foo,bar,baz,toto,tutu,tata +no-docstring-rgx = __.*__$|test_.+|setUp$|setUpClass$|tearDown$|tearDownClass$|Meta$ +docstring-min-length = 5 + +[FORMAT] +max-line-length = 120 +ignore-long-lines = ^\s*(# )?((?)|(\.\. \w+: .*))$ +single-line-if-stmt = no +##no-space-check = trailing-comma,dict-separator +max-module-lines = 1000 +indent-string = ' ' + +[MISCELLANEOUS] +notes = FIXME,XXX,TODO + +[SIMILARITIES] +min-similarity-lines = 4 +ignore-comments = yes +ignore-docstrings = yes +ignore-imports = no + +[TYPECHECK] +ignore-mixin-members = yes +ignored-classes = SQLObject +unsafe-load-any-extension = yes +generated-members = + REQUEST, + acl_users, + aq_parent, + objects, + DoesNotExist, + can_read, + can_write, + get_url, + size, + content, + status_code, + create, + build, + fields, + tag, + org, + course, + category, + name, + revision, + _meta, + +[VARIABLES] +init-import = no +dummy-variables-rgx = _|dummy|unused|.*_unused +additional-builtins = + +[CLASSES] +defining-attr-methods = __init__,__new__,setUp +valid-classmethod-first-arg = cls +valid-metaclass-classmethod-first-arg = mcs + +[DESIGN] +max-args = 5 +ignored-argument-names = _.* +max-locals = 15 +max-returns = 9 +max-branches = 12 +max-statements = 50 +max-parents = 7 +max-attributes = 7 +min-public-methods = 2 +max-public-methods = 20 + +[IMPORTS] +deprecated-modules = regsub,TERMIOS,Bastion,rexec +import-graph = +ext-import-graph = +int-import-graph = + +[EXCEPTIONS] +overgeneral-exceptions = BaseException diff --git a/.pylint.sh b/.pylint.sh new file mode 100644 index 0000000..0a0aafb --- /dev/null +++ b/.pylint.sh @@ -0,0 +1,22 @@ +#!/bin/sh + +EXE=/var/local/bin/pydev_pylint.bash +ROLE=logging + +$EXE --recursive y --verbose --py-version 3.11 \ + --output-format colorized --rcfile .pylint.rc \ + -E -f text *py [a-nr-z]*/*py > .pylint.err +retval=$? + +$EXE --recursive y --verbose --py-version 3.11 \ + --output-format colorized --rcfile .pylint.rc \ + *py [a-nr-z]*/*py > .pylint.out + +sed -e "/Module 'os' has no/d" \ + -e "/Undefined variable 'app'/d" \ + -e '/tests\//d' \ + -e "/Instance of 'Curl' has no /d" \ + -e "/No name 'path' in module 'os' /d" \ + -e "/ in module 'os'/d" \ + -e "/.bak\//d" \ + -i .pylint.err .pylint.out diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..a136a1f --- /dev/null +++ b/Makefile @@ -0,0 +1,19 @@ +PYTHON=python3 + +prepare:: + bash .pylint.sh + +check:: + PYTHONPATH=${PWD} pyanalyze \ + tox_wrapper/tox.py tox_wrapper/tests/tests_wrapper.py \ + > .pyanal.out 2>&1 + +install:: + $(PYTHON) setup.py install + +test;: + $(PYTHON) tox_wrapper/tests/tests_wrapper.py + +clean:: + rm -f *~ */*~ */*/*~ + rm -rf *.egg-info diff --git a/README.md b/README.md index 0ea7aa7..db6183b 100644 --- a/README.md +++ b/README.md @@ -10,28 +10,34 @@ by Ingvar. The basics of NGC groups are supported, as well as AV and toxencryptsave. There is no coverage of conferences as they are not used in ```toxygen``` and the list of still unwrapped calls as of Sept. 2022 can be found in -```tox.c-toxcore.missing```. The code still needs double-checking -that every call in ```tox.py``` has the right signature, but it runs +```tox.c-toxcore.missing```. The code is typed so that every call in +```tox*.py``` should have the right signature, and it runs ```toxygen``` with no apparent issues. It has been tested with UDP and TCP proxy (Tor). It has ***not*** been tested on Windows, and there may be some minor breakage, which should be -easy to fix. There is a good coverage integration testsuite in ```wrapper_tests```. +easy to fix. There is a good coverage integration testsuite in ```tox_wrapper/tests```. Change to that directory and run ```tests_wrapper.py --help```; the test suite gives a good set of examples of usage. ## Install -Put the parent of the wrapper directory on your PYTHONPATH and -touch a file called `__init__.py` in its parent directory. +Run ```python3 setup.py install``` or put the parent of the wrapper +directory on your PYTHONPATH and touch a file called `__init__.py` +in its parent directory. -Then you need a ```libs``` directory beside the `wrapper` directory +Then you need a ```libs``` directory beside the ```tox_wrapper``` directory and you need to link your ```libtoxcore.so``` and ```libtoxav.so``` and ```libtoxencryptsave.so``` into it. Link all 3 filenames to ```libtoxcore.so``` if you have only ```libtoxcore.so``` (which is usually the case if you built ```c-toxcore``` with ```cmake``` rather than ```autogen/configure```). If you want to be different, -the environment variable TOXCORE_LIBS overrides the location of ```libs```. +the environment variable TOXCORE_LIBS overrides the location of ```libs```; +look in the file ```tox_wrapper/libtox.py``` for the details. + +# Tests + +To test, run ```python3 tox_wrapper/tests/tests_wrapper.py --help``` As is, the code in ```tox.py``` is very verbose. Edit the file to change ``` @@ -44,7 +50,7 @@ def LOG_TRACE(a): pass # print('TRAC> '+a) to all ```pass #``` or use ```logging.logger``` to suite your tastes. ```logging.logger``` can be dangerous in callbacks in ```Qt``` applications, so we use simple print statements as default. The same applies to -```wrapper/tests_wrapper.py```. +```tox_wrapper/tests/tests_wrapper.py```. ## Prerequisites diff --git a/tox_wrapper/.#toxencryptsave.py b/tox_wrapper/.#toxencryptsave.py deleted file mode 120000 index c7d1b0b..0000000 --- a/tox_wrapper/.#toxencryptsave.py +++ /dev/null @@ -1 +0,0 @@ -root@devuan.29604:1700913818 \ No newline at end of file diff --git a/tox_wrapper/tests/.#support_onions.py b/tox_wrapper/tests/.#support_onions.py deleted file mode 120000 index c7d1b0b..0000000 --- a/tox_wrapper/tests/.#support_onions.py +++ /dev/null @@ -1 +0,0 @@ -root@devuan.29604:1700913818 \ No newline at end of file