diff --git a/gixy/cli/argparser.py b/gixy/cli/argparser.py index 16a476a..12ef89e 100644 --- a/gixy/cli/argparser.py +++ b/gixy/cli/argparser.py @@ -1,7 +1,7 @@ # flake8: noqa from configargparse import * -from six.moves import StringIO +from io import StringIO from gixy.core.plugins_manager import PluginsManager @@ -119,7 +119,8 @@ class ArgsParser(ArgumentParser): config_file_keys = self.get_possible_config_keys(action) if config_file_keys and not action.is_positional_arg and \ already_on_command_line(existing_command_line_args, - action.option_strings): + action.option_strings, + self.prefix_chars): value = getattr(parsed_namespace, action.dest, None) if value is not None: if type(value) is bool: diff --git a/gixy/core/regexp.py b/gixy/core/regexp.py index 7a96187..ab180ea 100644 --- a/gixy/core/regexp.py +++ b/gixy/core/regexp.py @@ -1,4 +1,3 @@ -import six import logging import re import random @@ -13,7 +12,7 @@ LOG = logging.getLogger(__name__) def _build_reverse_list(original): result = [] for c in range(1, 126): - c = six.unichr(c) + c = chr(c) if c not in original: result.append(c) return frozenset(result) @@ -35,7 +34,7 @@ CATEGORIES = { '0123456789_')), sre_parse.CATEGORY_LINEBREAK: frozenset('\n'), sre_parse.CATEGORY_NOT_LINEBREAK: _build_reverse_list(frozenset('\n')), - 'ANY': [six.unichr(x) for x in range(1, 127) if x != 10] + 'ANY': [chr(x) for x in range(1, 127) if x != 10] } CATEGORIES_NAMES = { @@ -94,10 +93,10 @@ def _gen_combinator(variants, _merge=True): producted = itertools.product(*res) if _merge: # TODO(buglloc): ??! - return list(six.moves.map(_merge_variants, producted)) + return list(map(_merge_variants, producted)) return producted elif _merge: - return list(six.moves.map(_merge_variants, [res])) + return list(map(_merge_variants, [res])) return res @@ -178,7 +177,7 @@ class LiteralToken(Token): type = sre_parse.LITERAL def _parse(self): - self.char = six.unichr(self.token[1]) + self.char = chr(self.token[1]) def can_contain(self, char, skip_literal=True): if skip_literal: @@ -199,7 +198,7 @@ class NotLiteralToken(Token): type = sre_parse.NOT_LITERAL def _parse(self): - self.char = six.unichr(self.token[1]) + self.char = chr(self.token[1]) self.gen_char_list = list(_build_reverse_list(frozenset(self.char))) def can_contain(self, char, skip_literal=True): @@ -225,8 +224,8 @@ class RangeToken(Token): def _parse(self): self.left_code = self.token[1][0] self.right_code = self.token[1][1] - self.left = six.unichr(self.left_code) - self.right = six.unichr(self.right_code) + self.left = chr(self.left_code) + self.right = chr(self.right_code) def can_contain(self, char, skip_literal=True): return self.left <= char <= self.right @@ -238,7 +237,7 @@ class RangeToken(Token): if self.can_contain(context.char): return context.char - return six.unichr(random.randint(self.token[1][0], self.token[1][1])) + return chr(random.randint(self.token[1][0], self.token[1][1])) def __str__(self): return '{left}-{right}'.format(left=self.left, right=self.right) @@ -657,7 +656,7 @@ class InToken(Token): elif isinstance(child, LiteralToken): blacklisted.add(child.char) elif isinstance(child, RangeToken): - blacklisted.update(six.unichr(c) for c in six.moves.range(child.left_code, child.right_code + 1)) + blacklisted.update(chr(c) for c in range(child.left_code, child.right_code + 1)) elif isinstance(child, CategoryToken): blacklisted.update(child.char_list) else: diff --git a/gixy/core/sre_parse/sre_parse.py b/gixy/core/sre_parse/sre_parse.py index df69044..dedd5fe 100644 --- a/gixy/core/sre_parse/sre_parse.py +++ b/gixy/core/sre_parse/sre_parse.py @@ -10,11 +10,9 @@ # See the sre.py file for information on usage and redistribution. # -from __future__ import print_function - """Internal support module for sre""" -from sre_constants import * +from .sre_constants import * SPECIAL_CHARS = ".\\[{()*+?^$|" REPEAT_CHARS = "*+?{" diff --git a/gixy/formatters/_jinja.py b/gixy/formatters/_jinja.py index d93b853..e4f2be6 100644 --- a/gixy/formatters/_jinja.py +++ b/gixy/formatters/_jinja.py @@ -1,4 +1,3 @@ -from __future__ import absolute_import from jinja2 import Environment, PackageLoader from gixy.utils.text import to_text diff --git a/gixy/formatters/base.py b/gixy/formatters/base.py index e441407..578c65c 100644 --- a/gixy/formatters/base.py +++ b/gixy/formatters/base.py @@ -1,5 +1,3 @@ -from __future__ import absolute_import - import gixy from gixy.directives import block @@ -74,10 +72,10 @@ class BaseFormatter(object): for leap in tree.children: if leap not in points: continue - printable = type(leap) not in self.skip_parents + printable = all(not isinstance(leap, p) for p in self.skip_parents) # Special hack for includes # TODO(buglloc): fix me - have_parentheses = type(leap) != block.IncludeBlock + have_parentheses = not isinstance(leap, block.IncludeBlock) if printable: if leap.is_block: diff --git a/gixy/formatters/console.py b/gixy/formatters/console.py index b99d28b..1c168d9 100644 --- a/gixy/formatters/console.py +++ b/gixy/formatters/console.py @@ -1,5 +1,3 @@ -from __future__ import absolute_import - from gixy.formatters.base import BaseFormatter from gixy.formatters._jinja import load_template diff --git a/gixy/formatters/json.py b/gixy/formatters/json.py index cf5c29f..9ec9b08 100644 --- a/gixy/formatters/json.py +++ b/gixy/formatters/json.py @@ -1,5 +1,3 @@ -from __future__ import absolute_import - import json from gixy.formatters.base import BaseFormatter diff --git a/gixy/formatters/text.py b/gixy/formatters/text.py index 4d9938f..89b8f79 100644 --- a/gixy/formatters/text.py +++ b/gixy/formatters/text.py @@ -1,5 +1,3 @@ -from __future__ import absolute_import - from gixy.formatters.base import BaseFormatter from gixy.formatters._jinja import load_template diff --git a/gixy/parser/raw_parser.py b/gixy/parser/raw_parser.py index 6a30b7f..a839b72 100644 --- a/gixy/parser/raw_parser.py +++ b/gixy/parser/raw_parser.py @@ -1,10 +1,10 @@ import logging import codecs -import six +import re from cached_property import cached_property from pyparsing import ( - Literal, Suppress, White, Word, alphanums, Forward, Group, Optional, Combine, + Literal, Suppress, Word, alphanums, Forward, Group, Optional, Combine, Keyword, OneOrMore, ZeroOrMore, Regex, QuotedString, nestedExpr, ParseResults) LOG = logging.getLogger(__name__) @@ -17,7 +17,7 @@ class NginxQuotedString(QuotedString): # '^https?:\/\/yandex\.ru\/\00\'\"' -> ^https?:\/\/yandex\.ru\/\00'" # TODO(buglloc): research and find another special characters! - self.escCharReplacePattern = '\\\\(\'|")' + self.unquote_scan_re = re.compile("(\\\\t|\\\\r|\\\\n)|(\\\\\"|\\\\')|(\\n|.)") class RawParser(object): @@ -29,7 +29,7 @@ class RawParser(object): """ Returns the parsed tree. """ - if isinstance(data, six.binary_type): + if isinstance(data, bytes): if data[:3] == codecs.BOM_UTF8: encoding = 'utf-8-sig' else: @@ -49,7 +49,6 @@ class RawParser(object): left_bracket = Suppress("{") right_bracket = Suppress("}") semicolon = Suppress(";") - space = White().suppress() keyword = Word(alphanums + ".+-_/") path = Word(alphanums + ".-_/") variable = Word("$_-" + alphanums) @@ -71,23 +70,22 @@ class RawParser(object): # so we capture all content between parentheses and then parse it :( # TODO(buglloc): may be use something better? condition_body = ( - (if_modifier + Optional(space) + value) | - (variable + Optional(space + if_modifier + Optional(space) + value)) + (if_modifier + value) | + (variable + Optional(if_modifier + value)) ) condition = Regex(r'\((?:[^()\n\r\\]|(?:\(.*\))|(?:\\.))+?\)')\ - .setParseAction(lambda s, l, t: condition_body.parseString(t[0][1:-1])) + .setParseAction(lambda s, loc, toks: condition_body.parseString(toks[0][1:-1])) # rules include = ( Keyword("include") + - space + value + semicolon )("include") directive = ( keyword + - ZeroOrMore(space + value) + + ZeroOrMore(value) + semicolon )("directive") @@ -103,7 +101,7 @@ class RawParser(object): hash_value = Group( value + - ZeroOrMore(space + value) + + ZeroOrMore(value) + semicolon )("hash_value") @@ -136,8 +134,7 @@ class RawParser(object): location_block << ( Keyword("location") + Group( - Optional(space + location_modifier) + - Optional(space) + value) + + Optional(location_modifier) + value) + Suppress(Optional(comment)) + Group( left_bracket + @@ -147,7 +144,7 @@ class RawParser(object): hash_block << ( keyword + - Group(OneOrMore(space + value)) + + Group(OneOrMore(value)) + Group( left_bracket + Optional(OneOrMore(hash_value)) + @@ -156,7 +153,7 @@ class RawParser(object): generic_block << ( keyword + - Group(ZeroOrMore(space + value)) + + Group(ZeroOrMore(value)) + Suppress(Optional(comment)) + Group( left_bracket + @@ -166,7 +163,7 @@ class RawParser(object): unparsed_block << ( keyword + - Group(ZeroOrMore(space + value)) + + Group(ZeroOrMore(value)) + nestedExpr(opener="{", closer="}") )("unparsed_block") diff --git a/gixy/utils/text.py b/gixy/utils/text.py index 2ed7d66..8b4ba87 100644 --- a/gixy/utils/text.py +++ b/gixy/utils/text.py @@ -1,12 +1,8 @@ -from __future__ import absolute_import -from six import PY3, text_type, binary_type - - def to_bytes(obj, encoding='latin1', errors='strict', nonstring='replace'): - if isinstance(obj, binary_type): + if isinstance(obj, bytes): return obj - if isinstance(obj, text_type): + if isinstance(obj, str): try: # Try this first as it's the fastest return obj.encode(encoding, errors) @@ -36,10 +32,10 @@ def to_bytes(obj, encoding='latin1', errors='strict', nonstring='replace'): def to_text(obj, encoding='latin1', errors='strict', nonstring='replace'): - if isinstance(obj, text_type): + if isinstance(obj, str): return obj - if isinstance(obj, binary_type): + if isinstance(obj, bytes): try: return obj.decode(encoding, errors) except UnicodeEncodeError: @@ -66,7 +62,4 @@ def to_text(obj, encoding='latin1', errors='strict', nonstring='replace'): return to_text(value, encoding, errors) -if PY3: - to_native = to_text -else: - to_native = to_bytes +to_native = to_text diff --git a/requirements.dev.txt b/requirements.dev.txt index ea9085e..ab12d66 100644 --- a/requirements.dev.txt +++ b/requirements.dev.txt @@ -1,5 +1,5 @@ -nose>=1.3.7 -mock>=2.0.0 -coverage>=4.3 -flake8>=3.2 -tox>=2.7.0 \ No newline at end of file +pynose>=1.5.4 +mock>=5.2.0 +coverage>=7.7.0 +flake8>=7.1.2 +tox>=4.24.2 diff --git a/requirements.txt b/requirements.txt index 6178d0d..0575ff8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,4 @@ -pyparsing>=1.5.5,<3 -cached-property>=1.2.0 -argparse>=1.4.0 -six>=1.1.0 -Jinja2>=2.8 -ConfigArgParse>=0.11.0 \ No newline at end of file +pyparsing>=3.2.1 +cached-property>=2.0.1 +Jinja2>=3.1.5 +ConfigArgParse>=1.7 diff --git a/rpm/gixy.spec b/rpm/gixy.spec index cd8ec00..9635b51 100644 --- a/rpm/gixy.spec +++ b/rpm/gixy.spec @@ -14,11 +14,14 @@ BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildArch: noarch -BuildRequires: python-devel python-setuptools +BuildRequires: python-devel +BuildRequires: python-setuptools -Requires: python-setuptools python-six >= 1.1.0 python-jinja >= 2.8 -Requires: python2-cached_property >= 1.2.0 python2-configargparse >= 0.11.0 -Requires: python-argparse >= 1.4.0 pyparsing >= 1.5.5 python-markupsafe +Requires: python-setuptools +Requires: python-jinja >= 3.1.5 +Requires: python-cached_property >= 2.0.1 +Requires: python2-configargparse >= 1.7 +Requires: pyparsing >= 3.2.1 Provides: %{name} = %{verion}-%{release} diff --git a/setup.py b/setup.py index e0e0b64..b21964f 100644 --- a/setup.py +++ b/setup.py @@ -16,13 +16,12 @@ setup( author='Yandex IS Team', author_email='buglloc@yandex.ru', url='https://github.com/yandex/gixy', + python_requires='>=3.9', install_requires=[ - 'pyparsing>=1.5.5,<3', - 'cached-property>=1.2.0', - 'argparse>=1.4.0;python_version<"3.2"', - 'six>=1.1.0', - 'Jinja2>=2.8', - 'ConfigArgParse>=0.11.0' + 'pyparsing>=3.2.1', + 'cached-property>=2.0.1', + 'Jinja2>=3.1.5', + 'ConfigArgParse>=1.7' ], entry_points={ 'console_scripts': ['gixy=gixy.cli.main:main'], @@ -36,7 +35,13 @@ setup( 'Intended Audience :: Developers', 'Topic :: Security', 'Topic :: Software Development :: Quality Assurance', - 'Topic :: Software Development :: Testing' + 'Topic :: Software Development :: Testing', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3 :: 3.9', + 'Programming Language :: Python :: 3 :: 3.10', + 'Programming Language :: Python :: 3 :: 3.11', + 'Programming Language :: Python :: 3 :: 3.12', + 'Programming Language :: Python :: 3 :: 3.13', ], include_package_data=True ) diff --git a/tests/core/test_context.py b/tests/core/test_context.py index a095c83..fecc102 100644 --- a/tests/core/test_context.py +++ b/tests/core/test_context.py @@ -1,12 +1,12 @@ -from nose.tools import with_setup, assert_equals, assert_not_equals, assert_true -from gixy.core.context import get_context, pop_context, push_context, purge_context, CONTEXTS, Context +from nose.tools import with_setup, assert_equal, assert_not_equal, assert_true +from gixy.core.context import get_context, pop_context, push_context, purge_context, CONTEXTS from gixy.directives.block import Root from gixy.core.variable import Variable from gixy.core.regexp import Regexp def setup(): - assert_equals(len(CONTEXTS), 0) + assert_equal(len(CONTEXTS), 0) def tear_down(): @@ -17,39 +17,39 @@ def tear_down(): def test_push_pop_context(): root_a = Root() push_context(root_a) - assert_equals(len(CONTEXTS), 1) + assert_equal(len(CONTEXTS), 1) root_b = Root() push_context(root_b) - assert_equals(len(CONTEXTS), 2) + assert_equal(len(CONTEXTS), 2) poped = pop_context() - assert_equals(len(CONTEXTS), 1) - assert_equals(poped.block, root_b) + assert_equal(len(CONTEXTS), 1) + assert_equal(poped.block, root_b) poped = pop_context() - assert_equals(len(CONTEXTS), 0) - assert_equals(poped.block, root_a) + assert_equal(len(CONTEXTS), 0) + assert_equal(poped.block, root_a) @with_setup(setup, tear_down) def test_push_get_purge_context(): root = Root() push_context(root) - assert_equals(len(CONTEXTS), 1) - assert_equals(get_context().block, root) + assert_equal(len(CONTEXTS), 1) + assert_equal(get_context().block, root) root = Root() push_context(root) - assert_equals(len(CONTEXTS), 2) - assert_equals(get_context().block, root) + assert_equal(len(CONTEXTS), 2) + assert_equal(get_context().block, root) purge_context() - assert_equals(len(CONTEXTS), 0) + assert_equal(len(CONTEXTS), 0) @with_setup(setup, tear_down) def test_add_variables(): context = push_context(Root()) - assert_equals(len(context.variables['index']), 0) - assert_equals(len(context.variables['name']), 0) + assert_equal(len(context.variables['index']), 0) + assert_equal(len(context.variables['name']), 0) one_str_var = Variable('1') context.add_var('1', one_str_var) @@ -58,32 +58,32 @@ def test_add_variables(): some_var = Variable('some') context.add_var('some', some_var) - assert_equals(len(context.variables['index']), 1) - assert_equals(context.variables['index'][1], one_int_var) - assert_equals(len(context.variables['name']), 1) - assert_equals(context.variables['name']['some'], some_var) + assert_equal(len(context.variables['index']), 1) + assert_equal(context.variables['index'][1], one_int_var) + assert_equal(len(context.variables['name']), 1) + assert_equal(context.variables['name']['some'], some_var) context.clear_index_vars() - assert_equals(len(context.variables['index']), 0) - assert_equals(len(context.variables['name']), 1) - assert_equals(context.variables['name']['some'], some_var) + assert_equal(len(context.variables['index']), 0) + assert_equal(len(context.variables['name']), 1) + assert_equal(context.variables['name']['some'], some_var) @with_setup(setup, tear_down) def test_get_variables(): context = push_context(Root()) - assert_equals(len(context.variables['index']), 0) - assert_equals(len(context.variables['name']), 0) + assert_equal(len(context.variables['index']), 0) + assert_equal(len(context.variables['name']), 0) one_var = Variable(1) context.add_var(1, one_var) some_var = Variable('some') context.add_var('some', some_var) - assert_equals(context.get_var(1), one_var) - assert_equals(context.get_var('some'), some_var) + assert_equal(context.get_var(1), one_var) + assert_equal(context.get_var('some'), some_var) # Checks not existed variables, for now context may return None - assert_equals(context.get_var(0), None) - assert_equals(context.get_var('not_existed'), None) + assert_equal(context.get_var(0), None) + assert_equal(context.get_var('not_existed'), None) # Checks builtins variables assert_true(context.get_var('uri')) assert_true(context.get_var('document_uri')) @@ -94,41 +94,41 @@ def test_get_variables(): @with_setup(setup, tear_down) def test_context_depend_variables(): push_context(Root()) - assert_equals(len(get_context().variables['index']), 0) - assert_equals(len(get_context().variables['name']), 0) + assert_equal(len(get_context().variables['index']), 0) + assert_equal(len(get_context().variables['name']), 0) get_context().add_var(1, Variable(1, value='one')) get_context().add_var('some', Variable('some', value='some')) - assert_equals(get_context().get_var(1).value, 'one') - assert_equals(get_context().get_var('some').value, 'some') + assert_equal(get_context().get_var(1).value, 'one') + assert_equal(get_context().get_var('some').value, 'some') # Checks top context variables are still exists push_context(Root()) - assert_equals(get_context().get_var(1).value, 'one') - assert_equals(get_context().get_var('some').value, 'some') + assert_equal(get_context().get_var(1).value, 'one') + assert_equal(get_context().get_var('some').value, 'some') # Checks variable overriding get_context().add_var('some', Variable('some', value='some_new')) get_context().add_var('foo', Variable('foo', value='foo')) - assert_not_equals(get_context().get_var('some').value, 'some') - assert_equals(get_context().get_var('some').value, 'some_new') - assert_equals(get_context().get_var('foo').value, 'foo') - assert_equals(get_context().get_var(1).value, 'one') + assert_not_equal(get_context().get_var('some').value, 'some') + assert_equal(get_context().get_var('some').value, 'some_new') + assert_equal(get_context().get_var('foo').value, 'foo') + assert_equal(get_context().get_var(1).value, 'one') # Checks variables after restore previous context pop_context() - assert_not_equals(get_context().get_var('some').value, 'some_new') - assert_equals(get_context().get_var('some').value, 'some') - assert_equals(get_context().get_var('foo'), None) - assert_equals(get_context().get_var(1).value, 'one') + assert_not_equal(get_context().get_var('some').value, 'some_new') + assert_equal(get_context().get_var('some').value, 'some') + assert_equal(get_context().get_var('foo'), None) + assert_equal(get_context().get_var(1).value, 'one') @with_setup(setup, tear_down) def test_push_failed_with_regexp_py35_gixy_10(): push_context(Root()) - assert_equals(len(get_context().variables['index']), 0) - assert_equals(len(get_context().variables['name']), 0) + assert_equal(len(get_context().variables['index']), 0) + assert_equal(len(get_context().variables['name']), 0) regexp = Regexp('^/some/(.*?)') for name, group in regexp.groups.items(): diff --git a/tests/core/test_regexp.py b/tests/core/test_regexp.py index 348b386..ffc1979 100644 --- a/tests/core/test_regexp.py +++ b/tests/core/test_regexp.py @@ -1,4 +1,4 @@ -from nose.tools import assert_true, assert_false, assert_equals +from nose.tools import assert_true, assert_false, assert_equal from gixy.core.regexp import Regexp ''' @@ -88,7 +88,7 @@ def test_to_string(): (r'foo', 'foo'), (r'(1)(2)(?:3)', '(1)(2)(?:3)'), (r'(1)((2)|(?:3))', '(1)((?:(2)|(?:3)))'), - (r'\w|1|3-5|[a-z]', '(?:[\w]|1|3\\-5|[a-z])'), + (r'\w|1|3-5|[a-z]', '(?:[\\w]|1|3\\-5|[a-z])'), (r'(1|(?:3)|([4-6]))', '((?:1|(?:3)|([4-6])))'), (r'(1|(?:3)|(?P[4-6]))', '((?:1|(?:3)|([4-6])))'), (r'^sss', '^sss'), @@ -258,26 +258,26 @@ def test_generate(): def test_strict_generate(): reg = Regexp('^foo|bar', strict=True) - assert_equals(sorted(reg.generate('|', anchored=True)), sorted(['^foo', '^bar'])) + assert_equal(sorted(reg.generate('|', anchored=True)), sorted(['^foo', '^bar'])) def test_gen_anchor(): reg = Regexp('^some$') val = next(reg.generate('', anchored=False)) - assert_equals(val, 'some') + assert_equal(val, 'some') reg = Regexp('^some$') val = next(reg.generate('', anchored=True)) - assert_equals(val, '^some$') + assert_equal(val, '^some$') reg = Regexp('^some$', strict=True) val = next(reg.generate('', anchored=False)) - assert_equals(val, 'some') + assert_equal(val, 'some') reg = Regexp('^some$', strict=True) val = next(reg.generate('', anchored=True)) - assert_equals(val, '^some$') + assert_equal(val, '^some$') def test_group_can_contains(): @@ -345,12 +345,12 @@ def check_negative_startswith(regexp, char, strict): def check_groups_names(regexp, groups): reg = Regexp(regexp) - assert_equals(set(reg.groups.keys()), set(groups)) + assert_equal(set(reg.groups.keys()), set(groups)) def check_to_string(regexp, string): reg = Regexp(regexp) - assert_equals(str(reg), string) + assert_equal(str(reg), string) def check_positive_must_contain(regexp, char): @@ -399,4 +399,4 @@ def check_negative_must_startswith(regexp, char, strict): def check_generate(regexp, values): reg = Regexp(regexp) - assert_equals(sorted(reg.generate('|', anchored=True)), sorted(values)) + assert_equal(sorted(reg.generate('|', anchored=True)), sorted(values)) diff --git a/tests/core/test_variable.py b/tests/core/test_variable.py index 25c813c..ef44ba0 100644 --- a/tests/core/test_variable.py +++ b/tests/core/test_variable.py @@ -1,9 +1,10 @@ -from nose.tools import assert_true, assert_false, assert_equals, with_setup +from nose.tools import assert_true, assert_false, assert_equal, with_setup from gixy.core.context import get_context, push_context, purge_context from gixy.directives.block import Root from gixy.core.regexp import Regexp from gixy.core.variable import Variable + def setup(): push_context(Root()) @@ -17,7 +18,7 @@ def test_literal(): var = Variable(name='simple', value='$uri', have_script=False) assert_false(var.depends) assert_false(var.regexp) - assert_equals(var.value, '$uri') + assert_equal(var.value, '$uri') assert_false(var.can_startswith('$')) assert_false(var.can_contain('i')) diff --git a/tests/directives/test_block.py b/tests/directives/test_block.py index f8832f9..828ad25 100644 --- a/tests/directives/test_block.py +++ b/tests/directives/test_block.py @@ -1,7 +1,8 @@ -from nose.tools import assert_equals, assert_true, assert_false +from nose.tools import assert_equal, assert_true, assert_false from tests.asserts import assert_is_instance, assert_is_none, assert_is_not_none from gixy.parser.nginx_parser import NginxParser -from gixy.directives.block import * +from gixy.directives.block import Block, HttpBlock, ServerBlock, LocationBlock, IfBlock, MapBlock, GeoBlock + # TODO(buglloc): what about include block? @@ -51,7 +52,7 @@ server { assert_is_instance(directive, ServerBlock) assert_true(directive.is_block) assert_true(directive.self_context) - assert_equals([d.args[0] for d in directive.get_names()], ['_', 'cool.io']) + assert_equal([d.args[0] for d in directive.get_names()], ['_', 'cool.io']) assert_false(directive.provide_variables) @@ -67,7 +68,7 @@ location / { assert_true(directive.self_context) assert_true(directive.provide_variables) assert_is_none(directive.modifier) - assert_equals(directive.path, '/') + assert_equal(directive.path, '/') assert_false(directive.is_internal) @@ -91,8 +92,8 @@ location = / { directive = _get_parsed(config) assert_is_instance(directive, LocationBlock) - assert_equals(directive.modifier, '=') - assert_equals(directive.path, '/') + assert_equal(directive.modifier, '=') + assert_equal(directive.path, '/') def test_if(): @@ -106,7 +107,7 @@ if ($some) { assert_true(directive.is_block) assert_false(directive.self_context) assert_false(directive.provide_variables) - assert_equals(directive.variable, '$some') + assert_equal(directive.variable, '$some') assert_is_none(directive.operand) assert_is_none(directive.value) @@ -119,8 +120,8 @@ if (-f /some) { directive = _get_parsed(config) assert_is_instance(directive, IfBlock) - assert_equals(directive.operand, '-f') - assert_equals(directive.value, '/some') + assert_equal(directive.operand, '-f') + assert_equal(directive.value, '/some') assert_is_none(directive.variable) @@ -132,9 +133,9 @@ if ($http_some = '/some') { directive = _get_parsed(config) assert_is_instance(directive, IfBlock) - assert_equals(directive.variable, '$http_some') - assert_equals(directive.operand, '=') - assert_equals(directive.value, '/some') + assert_equal(directive.variable, '$http_some') + assert_equal(directive.operand, '=') + assert_equal(directive.value, '/some') def test_block_some_flat(): @@ -152,7 +153,7 @@ def test_block_some_flat(): for d in ['default_type', 'sendfile', 'keepalive_timeout']: c = directive.some(d, flat=True) assert_is_not_none(c) - assert_equals(c.name, d) + assert_equal(c.name, d) def test_block_some_not_flat(): @@ -183,9 +184,9 @@ def test_block_find_flat(): directive = _get_parsed(config) finds = directive.find('directive', flat=True) - assert_equals(len(finds), 2) - assert_equals([x.name for x in finds], ['directive', 'directive']) - assert_equals([x.args[0] for x in finds], ['1', '2']) + assert_equal(len(finds), 2) + assert_equal([x.name for x in finds], ['directive', 'directive']) + assert_equal([x.args[0] for x in finds], ['1', '2']) def test_block_find_not_flat(): @@ -200,9 +201,9 @@ def test_block_find_not_flat(): directive = _get_parsed(config) finds = directive.find('directive', flat=False) - assert_equals(len(finds), 1) - assert_equals([x.name for x in finds], ['directive']) - assert_equals([x.args[0] for x in finds], ['1']) + assert_equal(len(finds), 1) + assert_equal([x.name for x in finds], ['directive']) + assert_equal([x.args[0] for x in finds], ['1']) def test_block_map(): @@ -218,7 +219,7 @@ map $some_var $some_other_var { assert_true(directive.is_block) assert_false(directive.self_context) assert_true(directive.provide_variables) - assert_equals(directive.variable, 'some_other_var') + assert_equal(directive.variable, 'some_other_var') def test_block_geo_two_vars(): @@ -234,7 +235,7 @@ geo $some_var $some_other_var { assert_true(directive.is_block) assert_false(directive.self_context) assert_true(directive.provide_variables) - assert_equals(directive.variable, 'some_other_var') + assert_equal(directive.variable, 'some_other_var') def test_block_geo_one_var(): @@ -250,4 +251,4 @@ geo $some_var { assert_true(directive.is_block) assert_false(directive.self_context) assert_true(directive.provide_variables) - assert_equals(directive.variable, 'some_var') + assert_equal(directive.variable, 'some_var') diff --git a/tests/directives/test_directive.py b/tests/directives/test_directive.py index 4f62a17..6f96ae9 100644 --- a/tests/directives/test_directive.py +++ b/tests/directives/test_directive.py @@ -1,7 +1,7 @@ -from nose.tools import assert_equals, assert_false, assert_true +from nose.tools import assert_equal, assert_false, assert_true from tests.asserts import assert_is_instance from gixy.parser.nginx_parser import NginxParser -from gixy.directives.directive import * +from gixy.directives.directive import Directive, AddHeaderDirective, SetDirective, RewriteDirective, RootDirective def _get_parsed(config): @@ -14,9 +14,9 @@ def test_directive(): directive = _get_parsed(config) assert_is_instance(directive, Directive) - assert_equals(directive.name, 'some') - assert_equals(directive.args, ['foo', 'bar']) - assert_equals(str(directive), 'some foo bar;') + assert_equal(directive.name, 'some') + assert_equal(directive.args, ['foo', 'bar']) + assert_equal(str(directive), 'some foo bar;') def test_add_header(): @@ -24,12 +24,12 @@ def test_add_header(): directive = _get_parsed(config) assert_is_instance(directive, AddHeaderDirective) - assert_equals(directive.name, 'add_header') - assert_equals(directive.args, ['X-Foo', 'bar']) - assert_equals(directive.header, 'x-foo') - assert_equals(directive.value, 'bar') + assert_equal(directive.name, 'add_header') + assert_equal(directive.args, ['X-Foo', 'bar']) + assert_equal(directive.header, 'x-foo') + assert_equal(directive.value, 'bar') assert_false(directive.always) - assert_equals(str(directive), 'add_header X-Foo bar;') + assert_equal(str(directive), 'add_header X-Foo bar;') def test_add_header_always(): @@ -37,12 +37,12 @@ def test_add_header_always(): directive = _get_parsed(config) assert_is_instance(directive, AddHeaderDirective) - assert_equals(directive.name, 'add_header') - assert_equals(directive.args, ['X-Foo', 'bar', 'always']) - assert_equals(directive.header, 'x-foo') - assert_equals(directive.value, 'bar') + assert_equal(directive.name, 'add_header') + assert_equal(directive.args, ['X-Foo', 'bar', 'always']) + assert_equal(directive.header, 'x-foo') + assert_equal(directive.value, 'bar') assert_true(directive.always) - assert_equals(str(directive), 'add_header X-Foo bar always;') + assert_equal(str(directive), 'add_header X-Foo bar always;') def test_set(): @@ -50,11 +50,11 @@ def test_set(): directive = _get_parsed(config) assert_is_instance(directive, SetDirective) - assert_equals(directive.name, 'set') - assert_equals(directive.args, ['$foo', 'bar']) - assert_equals(directive.variable, 'foo') - assert_equals(directive.value, 'bar') - assert_equals(str(directive), 'set $foo bar;') + assert_equal(directive.name, 'set') + assert_equal(directive.args, ['$foo', 'bar']) + assert_equal(directive.variable, 'foo') + assert_equal(directive.value, 'bar') + assert_equal(str(directive), 'set $foo bar;') assert_true(directive.provide_variables) @@ -63,14 +63,14 @@ def test_rewrite(): directive = _get_parsed(config) assert_is_instance(directive, RewriteDirective) - assert_equals(directive.name, 'rewrite') - assert_equals(directive.args, ['^', 'http://some']) - assert_equals(str(directive), 'rewrite ^ http://some;') + assert_equal(directive.name, 'rewrite') + assert_equal(directive.args, ['^', 'http://some']) + assert_equal(str(directive), 'rewrite ^ http://some;') assert_true(directive.provide_variables) - assert_equals(directive.pattern, '^') - assert_equals(directive.replace, 'http://some') - assert_equals(directive.flag, None) + assert_equal(directive.pattern, '^') + assert_equal(directive.replace, 'http://some') + assert_equal(directive.flag, None) def test_rewrite_flags(): @@ -78,14 +78,14 @@ def test_rewrite_flags(): directive = _get_parsed(config) assert_is_instance(directive, RewriteDirective) - assert_equals(directive.name, 'rewrite') - assert_equals(directive.args, ['^/(.*)$', 'http://some/$1', 'redirect']) - assert_equals(str(directive), 'rewrite ^/(.*)$ http://some/$1 redirect;') + assert_equal(directive.name, 'rewrite') + assert_equal(directive.args, ['^/(.*)$', 'http://some/$1', 'redirect']) + assert_equal(str(directive), 'rewrite ^/(.*)$ http://some/$1 redirect;') assert_true(directive.provide_variables) - assert_equals(directive.pattern, '^/(.*)$') - assert_equals(directive.replace, 'http://some/$1') - assert_equals(directive.flag, 'redirect') + assert_equal(directive.pattern, '^/(.*)$') + assert_equal(directive.replace, 'http://some/$1') + assert_equal(directive.flag, 'redirect') def test_root(): @@ -93,9 +93,9 @@ def test_root(): directive = _get_parsed(config) assert_is_instance(directive, RootDirective) - assert_equals(directive.name, 'root') - assert_equals(directive.args, ['/var/www/html']) - assert_equals(str(directive), 'root /var/www/html;') + assert_equal(directive.name, 'root') + assert_equal(directive.args, ['/var/www/html']) + assert_equal(str(directive), 'root /var/www/html;') assert_true(directive.provide_variables) - assert_equals(directive.path, '/var/www/html') + assert_equal(directive.path, '/var/www/html') diff --git a/tests/parser/test_nginx_parser.py b/tests/parser/test_nginx_parser.py index 0f42e56..697a099 100644 --- a/tests/parser/test_nginx_parser.py +++ b/tests/parser/test_nginx_parser.py @@ -1,8 +1,8 @@ from nose.tools import assert_equal from tests.asserts import assert_is_instance from gixy.parser.nginx_parser import NginxParser -from gixy.directives.directive import * -from gixy.directives.block import * +from gixy.directives.directive import Directive, SetDirective, RewriteDirective +from gixy.directives.block import Block, Root, HttpBlock, ServerBlock, LocationBlock, IfBlock, IncludeBlock def _parse(config): diff --git a/tests/parser/test_raw_parser.py b/tests/parser/test_raw_parser.py index 7fa4b01..44b8e77 100644 --- a/tests/parser/test_raw_parser.py +++ b/tests/parser/test_raw_parser.py @@ -1,5 +1,5 @@ -from nose.tools import assert_equals -from gixy.parser.raw_parser import * +from nose.tools import assert_equal +from gixy.parser.raw_parser import RawParser def test_directive(): @@ -11,8 +11,8 @@ set $foo "bar"; set $foo 'bar'; proxy_pass http://unix:/run/sock.socket; rewrite ^/([a-zA-Z0-9]+)$ /$1/${arg_v}.pb break; - server_name some.tld ~^(www\.)?podberi.(?:ru|com|ua)$ - ~^(www\.)?guru.yandex.ru$; + server_name some.tld ~^(www\\.)?podberi.(?:ru|com|ua)$ + ~^(www\\.)?guru.yandex.ru$; ''' expected = [ @@ -23,7 +23,7 @@ rewrite ^/([a-zA-Z0-9]+)$ /$1/${arg_v}.pb break; ['set', '$foo', 'bar'], ['proxy_pass', 'http://unix:/run/sock.socket'], ['rewrite', '^/([a-zA-Z0-9]+)$', '/$1/${arg_v}.pb', 'break'], - ['server_name', 'some.tld', '~^(www\.)?podberi.(?:ru|com|ua)$', '~^(www\.)?guru.yandex.ru$'] + ['server_name', 'some.tld', '~^(www\\.)?podberi.(?:ru|com|ua)$', '~^(www\\.)?guru.yandex.ru$'] ] assert_config(config, expected) @@ -63,7 +63,7 @@ location ~* ^/baz$ { location ^~ ^/bazz { } # Whitespace may be omitted:(( -location ~\.(js|css)$ { +location ~\\.(js|css)$ { } ''' @@ -73,7 +73,7 @@ location ~\.(js|css)$ { ['location', ['~*', '^/baz$'], []], ['location', ['^~', '^/bazz'], []], ['Whitespace may be omitted:(('], - ['location', ['~', '\.(js|css)$'], []]] + ['location', ['~', '\\.(js|css)$'], []]] assert_config(config, expected) @@ -222,14 +222,14 @@ if (!-e "/var/data/$dataset") { return 503; } -if ($https_or_slb = (by_\(sl\)b|https)) { +if ($https_or_slb = (by_\\(sl\\)b|https)) { } -if ($host ~* (lori|rage2)\.yandex\.(ru|ua|com|com\.tr)) { +if ($host ~* (lori|rage2)\\.yandex\\.(ru|ua|com|com\\.tr)) { set $x_frame_options ALLOW; } -if ($request_filename ~* ^.*?/(\d+_)([^/]+)$) { +if ($request_filename ~* ^.*?/(\\d+_)([^/]+)$) { } if ($http_user_agent ~* "^WordPress.*; verifying pingback") { @@ -258,12 +258,12 @@ if ($foo = "BAR") { rewrite ^(.*)$ /bar; } ['if', ['!-e', '/var/data/$dataset'], [ ['return', '503'] ]], - ['if', ['$https_or_slb', '=', '(by_\(sl\)b|https)'], [ + ['if', ['$https_or_slb', '=', '(by_\\(sl\\)b|https)'], [ ]], - ['if', ['$host', '~*', '(lori|rage2)\.yandex\.(ru|ua|com|com\.tr)'], [ + ['if', ['$host', '~*', '(lori|rage2)\\.yandex\\.(ru|ua|com|com\\.tr)'], [ ['set', '$x_frame_options', 'ALLOW'] ]], - ['if', ['$request_filename', '~*', '^.*?/(\d+_)([^/]+)$'], [ + ['if', ['$request_filename', '~*', '^.*?/(\\d+_)([^/]+)$'], [ ]], ['if', ['$http_user_agent', '~*', '^WordPress.*; verifying pingback'], [ ]], @@ -360,14 +360,14 @@ server { def test_issue_8(): config = ''' # http://nginx.org/ru/docs/http/ngx_http_upstream_module.html -if ($http_referer ~* (\.(ru|ua|by|kz)/(pages/music|partners/|page-no-rights\.xml)) ) { +if ($http_referer ~* (\\.(ru|ua|by|kz)/(pages/music|partners/|page-no-rights\\.xml)) ) { set $temp A; } ''' expected = [ ['http://nginx.org/ru/docs/http/ngx_http_upstream_module.html'], - ['if', ['$http_referer', '~*', '(\.(ru|ua|by|kz)/(pages/music|partners/|page-no-rights\.xml))'], [ + ['if', ['$http_referer', '~*', '(\\.(ru|ua|by|kz)/(pages/music|partners/|page-no-rights\\.xml))'], [ ['set', '$temp', 'A'] ]] ] @@ -415,9 +415,9 @@ location = /lua { ['content_by_lua_block', [], [ 'local', 'res', '=', 'ngx.location.capture(', '"/some_other_location"', ')', 'if', 'res', 'then', - 'ngx.say(', '"status: "', ',', 'res.status)', - 'ngx.say(', '"body:"', ')', - 'ngx.print(res.body)', + 'ngx.say(', '"status: "', ',', 'res.status)', + 'ngx.say(', '"body:"', ')', + 'ngx.print(res.body)', 'end']] ]] ] @@ -442,7 +442,7 @@ location = /foo { ['location', ['=', '/foo'], [ ['rewrite_by_lua_block', [], [ 'res', '=', 'ngx.location.capture(', '"/memc"', ',', - ['args', '=', ['cmd', '=', '"incr"', ',', 'key', '=', 'ngx.var.uri']], + ['args', '=', ['cmd', '=', '"incr"', ',', 'key', '=', 'ngx.var.uri']], ')']], ['proxy_pass', 'http://blah.blah.com'] ]] @@ -481,15 +481,15 @@ def test_comments(): # Some comment add_header X-Some-Comment some; -# +# # Comment with padding -# +# add_header X-Padding-Comment padding; # add_header X-Blank-Comment blank; -if (1) # Comment +if (1) # Comment { add_header X-Inline blank; } @@ -556,9 +556,9 @@ add_header X-Test "Windows-1251"; ''' actual = RawParser().parse(config) - assert_equals(len(actual.asList()), 2) + assert_equal(len(actual.asList()), 2) def assert_config(config, expected): actual = RawParser().parse(config) - assert_equals(actual.asList(), expected) + assert_equal(actual.asList(), expected) diff --git a/tests/plugins/test_simply.py b/tests/plugins/test_simply.py index 1a33c63..2d1156f 100644 --- a/tests/plugins/test_simply.py +++ b/tests/plugins/test_simply.py @@ -1,13 +1,13 @@ -from nose.tools import assert_equals, assert_true +from nose.tools import assert_equal, assert_true from tests.asserts import assert_in import os from os import path import json -from ..utils import * from gixy.core.manager import Manager as Gixy from gixy.core.plugins_manager import PluginsManager from gixy.core.config import Config +from gixy.formatters.base import BaseFormatter def setup_module(): @@ -57,7 +57,8 @@ def test_from_config(): assert_true(plugin in tested_plugins, 'Plugin {name!r} should have at least one simple test config'.format(name=plugin)) assert_true(plugin in tested_fp_plugins, - 'Plugin {name!r} should have at least one simple test config with false positive'.format(name=plugin)) + 'Plugin {name!r} should have at least one simple test config with false positive' + .format(name=plugin)) def parse_plugin_options(config_path): @@ -86,15 +87,15 @@ def check_configuration(plugin, config_path, test_config): formatter.feed(config_path, yoda) _, results = formatter.reports.popitem() - assert_equals(len(results), 1, 'Should have one report') + assert_equal(len(results), 1, 'Should have one report') result = results[0] if 'severity' in test_config: if not hasattr(test_config['severity'], '__iter__'): - assert_equals(result['severity'], test_config['severity']) + assert_equal(result['severity'], test_config['severity']) else: assert_in(result['severity'], test_config['severity']) - assert_equals(result['plugin'], plugin) + assert_equal(result['plugin'], plugin) assert_true(result['summary']) assert_true(result['description']) assert_true(result['config']) @@ -105,5 +106,5 @@ def check_configuration(plugin, config_path, test_config): def check_configuration_fp(plugin, config_path, test_config): with yoda_provider(plugin) as yoda: yoda.audit(config_path, open(config_path, mode='r')) - assert_equals(len([x for x in yoda.results]), 0, - 'False positive configuration must not trigger any plugins') + assert_equal(len([x for x in yoda.results]), 0, + 'False positive configuration must not trigger any plugins') diff --git a/tests/utils.py b/tests/utils.py index f8d5ca6..7684d52 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -54,7 +54,7 @@ class Matcher(object): """ Try to match a single stored value (dv) with a supplied value (v). """ - if type(v) != type(dv): + if type(v) is not type(dv): result = False elif type(dv) is not str or k not in self._partial_matches: result = (v == dv) diff --git a/tox.ini b/tox.ini index c981f56..079f3c1 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py26, py27, py34, py35, py36, py37, flake8 +envlist = py39, py310, py311, py312, py313, flake8 skip_missing_interpreters = True [testenv] @@ -12,8 +12,7 @@ commands = nosetests -v deps = flake8 basepython = python3 -commands = - flake8 setup.py gixy +commands = flake8 [flake8] max_line_length = 120