diff --git a/business_logic/blockly/build.py b/business_logic/blockly/build.py index caa53c6d..a3f16548 100644 --- a/business_logic/blockly/build.py +++ b/business_logic/blockly/build.py @@ -46,7 +46,7 @@ def visit(self, node, parent_xml): if cls == Model: break - method_name = 'visit_{}'.format(camel_case_to_snake_case(cls.__name__)) + method_name = f'visit_{camel_case_to_snake_case(cls.__name__)}' method = getattr(self, method_name, None) if not method: @@ -62,7 +62,7 @@ def visit(self, node, parent_xml): return node_xml if content_object.__class__ not in (VariableDefinition,): - logger.debug('Unsupported content_object: {}'.format(content_object.__class__)) + logger.debug(f'Unsupported content_object: {content_object.__class__}') def visit_constant(self, node, parent_xml): block_type = { @@ -91,8 +91,10 @@ def visit_reference_constant(self, node, parent_xml): children = self.get_children(node) if len(children) != 1: - raise BlocklyXmlBuilderException('Incorrect number of ReferenceConstant node children: {}'.format( - len(children))) + raise BlocklyXmlBuilderException( + f'Incorrect number of ReferenceConstant node children: {len(children)}' + ) + value_object_node = children[0] content_type = value_object_node.content_type @@ -100,7 +102,10 @@ def visit_reference_constant(self, node, parent_xml): block = etree.SubElement(parent_xml, 'block', type='business_logic_reference') type_field = etree.SubElement(block, 'field', name='TYPE') - type_field.text = '{}.{}'.format(content_type.app_label, content_type.model_class().__name__) + type_field.text = ( + f'{content_type.app_label}.{content_type.model_class().__name__}' + ) + value_field = etree.SubElement(block, 'field', name='VALUE') value_field.text = str(value_object_node.object_id) @@ -112,8 +117,8 @@ def _get_variable_block_type(self, node, action): assert action in ('get', 'set') if node.content_object.definition.name.find('.') != -1: - return 'business_logic_argument_field_{}'.format(action) - return 'variables_{}'.format(action) + return f'business_logic_argument_field_{action}' + return f'variables_{action}' def visit_variable(self, node, parent_xml): block_type = self._get_variable_block_type(node, 'get') @@ -148,7 +153,7 @@ def visit_binary_operator(self, node, parent_xml): if operator_value in table: break else: - raise BlocklyXmlBuilderException('Invalid Operator: {}'.format(operator_value)) + raise BlocklyXmlBuilderException(f'Invalid Operator: {operator_value}') block = etree.SubElement(parent_xml, 'block', type=block_type) field_element = etree.SubElement(block, 'field', name='OP') @@ -171,8 +176,7 @@ def visit_if_statement(self, node, parent_xml): mutation = etree.SubElement(block, 'mutation') if len(children) % 2: mutation.set('else', '1') - elifs = (len(children) - 2 - len(children) % 2) / 2 - if elifs: + if elifs := (len(children) - 2 - len(children) % 2) / 2: mutation.set('elseif', str(int(elifs))) for i, pair in enumerate(pairs(children)): @@ -183,10 +187,10 @@ def visit_if_statement(self, node, parent_xml): break if_condition = pair[0] - if_value = etree.SubElement(block, 'value', name='IF{}'.format(i)) + if_value = etree.SubElement(block, 'value', name=f'IF{i}') self.visit(if_condition, if_value) - statement = etree.SubElement(block, 'statement', name='DO{}'.format(i)) + statement = etree.SubElement(block, 'statement', name=f'DO{i}') self.visit(pair[1], statement) return block @@ -204,7 +208,7 @@ def visit_function(self, node, parent_xml): field_element.text = function_definition.title for i, child_node in enumerate(children): - value = etree.SubElement(block, 'value', name='ARG{}'.format(i)) + value = etree.SubElement(block, 'value', name=f'ARG{i}') self.visit(child_node, value) return block diff --git a/business_logic/blockly/create.py b/business_logic/blockly/create.py index eaceb65f..e5d15a91 100644 --- a/business_logic/blockly/create.py +++ b/business_logic/blockly/create.py @@ -78,11 +78,11 @@ def create_content_object(self, data): return node_kwargs = [x.name for x in Node._meta.get_fields()] - content_object_kwargs = dict(((k, v) for k, v in data.items() if k not in node_kwargs)) + content_object_kwargs = {k: v for k, v in data.items() if k not in node_kwargs} content_object = model_class.objects.create(**content_object_kwargs) data['object_id'] = content_object.id - for kwarg in content_object_kwargs.keys(): + for kwarg in content_object_kwargs: del data[kwarg] return data diff --git a/business_logic/blockly/parse.py b/business_logic/blockly/parse.py index 0c42976a..eee55af7 100644 --- a/business_logic/blockly/parse.py +++ b/business_logic/blockly/parse.py @@ -53,13 +53,13 @@ def transform_shadow(root): def visit(self, node): parent = node.getparent() - if parent is not None and parent.tag != 'next' and node.find('next') is not None: - # start of code block - data = self._process_next(node) - else: - data = self._call_method(node) - - return data + return ( + self._process_next(node) + if parent is not None + and parent.tag != 'next' + and node.find('next') is not None + else self._call_method(node) + ) def _process_next(self, node): children = [] @@ -74,7 +74,9 @@ def _process_next(self, node): if len(_children) != 1: raise BlocklyXmlParserException( - 'Incorrect number of children ({}) for BlocklyXmlParser._process_next()'.format(len(_children))) + f'Incorrect number of children ({len(_children)}) for BlocklyXmlParser._process_next()' + ) + _node = _children[0] children.append(_node) @@ -89,13 +91,11 @@ def _call_method(self, node): if node.tag in ('next', 'mutation'): return - method_name = 'visit_{}'.format(node.tag) - method = getattr(self, method_name, None) - - if method: + method_name = f'visit_{node.tag}' + if method := getattr(self, method_name, None): return method(node) - raise BlocklyXmlParserException('Unknown tag: {}'.format(node.tag)) + raise BlocklyXmlParserException(f'Unknown tag: {node.tag}') def _visit_children(self, node, data, children=None): if 'children' not in data: @@ -110,7 +110,9 @@ def _visit_single_child(self, node): if len(children) != 1: raise BlocklyXmlParserException( - 'Incorrect number of children ({}) for BlocklyXmlParser._visit_single_child()'.format(len(children))) + f'Incorrect number of children ({len(children)}) for BlocklyXmlParser._visit_single_child()' + ) + return self.visit(children[0]) @@ -161,7 +163,7 @@ def visit_xml(self, node): return self._visit_single_child(node) def visit_block(self, node): - method_name = 'visit_block_{}'.format(node.get('type')) + method_name = f"visit_block_{node.get('type')}" method = getattr(self, method_name) return method(node) @@ -193,7 +195,7 @@ def visit_block_controls_if(self, node): return self._visit_simple_container(node, IfStatement) def visit_field(self, node): - method_name = 'visit_field_{}'.format(node.get('name').lower()) + method_name = f"visit_field_{node.get('name').lower()}" method = getattr(self, method_name) return method(node) diff --git a/business_logic/config.py b/business_logic/config.py index 0549d930..456ffdd4 100644 --- a/business_logic/config.py +++ b/business_logic/config.py @@ -37,7 +37,7 @@ class ContextConfig(object): def __init__(self, **kwargs): for k in kwargs.keys(): if k not in self.defaults: - raise TypeError('Incorrect kwarg {}'.format(k)) + raise TypeError(f'Incorrect kwarg {k}') for k, v in self.defaults.items(): kwargs.setdefault(k, v) diff --git a/business_logic/migrations/0001_initial.py b/business_logic/migrations/0001_initial.py index 3a938bc9..1c293b40 100644 --- a/business_logic/migrations/0001_initial.py +++ b/business_logic/migrations/0001_initial.py @@ -7,6 +7,8 @@ import django.db.models.deletion + + class Migration(migrations.Migration): initial = True @@ -19,7 +21,15 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Assignment', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ( + 'id', + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), ], options={ 'verbose_name': 'Assignment', @@ -29,8 +39,19 @@ class Migration(migrations.Migration): migrations.CreateModel( name='BinaryOperator', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('operator', models.CharField(max_length=3, verbose_name='Operator')), + ( + 'id', + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), + ( + 'operator', + models.CharField(max_length=3, verbose_name='Operator'), + ), ], options={ 'verbose_name': 'Binary operator', @@ -40,7 +61,15 @@ class Migration(migrations.Migration): migrations.CreateModel( name='BooleanConstant', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ( + 'id', + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), ('value', models.BooleanField(verbose_name='Value')), ], options={ @@ -51,7 +80,15 @@ class Migration(migrations.Migration): migrations.CreateModel( name='BreakLoop', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ( + 'id', + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), ], options={ 'verbose_name': 'Break instruction', @@ -61,7 +98,15 @@ class Migration(migrations.Migration): migrations.CreateModel( name='DateConstant', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ( + 'id', + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), ('value', models.DateField(verbose_name='Value')), ], options={ @@ -72,7 +117,15 @@ class Migration(migrations.Migration): migrations.CreateModel( name='ExceptionLog', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ( + 'id', + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), ('module', models.CharField(max_length=255)), ('type', models.CharField(max_length=255)), ('message', models.CharField(max_length=512)), @@ -82,7 +135,15 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Execution', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ( + 'id', + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), ('start_time', models.DateTimeField(auto_now_add=True)), ('finish_time', models.DateTimeField(null=True)), ], @@ -93,28 +154,87 @@ class Migration(migrations.Migration): migrations.CreateModel( name='ExecutionArgument', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ( + 'id', + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), ('object_id', models.PositiveIntegerField()), - ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')), - ('execution', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='arguments', to='business_logic.Execution')), + ( + 'content_type', + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to='contenttypes.ContentType', + ), + ), + ( + 'execution', + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name='arguments', + to='business_logic.Execution', + ), + ), ], ), migrations.CreateModel( name='ExecutionEnvironment', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255, unique=True, verbose_name='Title')), - ('description', models.TextField(blank=True, null=True, verbose_name='Description')), + ( + 'id', + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), + ( + 'title', + models.CharField( + max_length=255, unique=True, verbose_name='Title' + ), + ), + ( + 'description', + models.TextField( + blank=True, null=True, verbose_name='Description' + ), + ), ('debug', models.BooleanField(default=False)), ('log', models.BooleanField(default=False)), ('cache', models.BooleanField(default=True)), - ('exception_handling_policy', models.CharField(choices=[(b'IGNORE', 'Ignore'), (b'INTERRUPT', 'Interrupt'), (b'RAISE', 'Raise')], default=b'INTERRUPT', max_length=15, verbose_name='Exception handling policy')), + ( + 'exception_handling_policy', + models.CharField( + choices=[ + (b'IGNORE', 'Ignore'), + (b'INTERRUPT', 'Interrupt'), + (b'RAISE', 'Raise'), + ], + default=b'INTERRUPT', + max_length=15, + verbose_name='Exception handling policy', + ), + ), ], ), migrations.CreateModel( name='ForeachStatement', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ( + 'id', + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), ], options={ 'verbose_name': 'Foreach statement', @@ -124,7 +244,15 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Function', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ( + 'id', + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), ], options={ 'verbose_name': 'Function', @@ -134,10 +262,29 @@ class Migration(migrations.Migration): migrations.CreateModel( name='FunctionArgument', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, max_length=255, null=True)), - ('description', models.TextField(blank=True, null=True, verbose_name='Description')), - ('order', models.PositiveIntegerField(db_index=True, default=0)), + ( + 'id', + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), + ( + 'name', + models.CharField(blank=True, max_length=255, null=True), + ), + ( + 'description', + models.TextField( + blank=True, null=True, verbose_name='Description' + ), + ), + ( + 'order', + models.PositiveIntegerField(db_index=True, default=0), + ), ], options={ 'ordering': ('order',), @@ -148,11 +295,29 @@ class Migration(migrations.Migration): migrations.CreateModel( name='FunctionArgumentChoice', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ( + 'id', + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), ('value', models.CharField(max_length=255)), ('title', models.CharField(max_length=255)), - ('order', models.PositiveIntegerField(db_index=True, default=0)), - ('argument', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='choices', to='business_logic.FunctionArgument')), + ( + 'order', + models.PositiveIntegerField(db_index=True, default=0), + ), + ( + 'argument', + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name='choices', + to='business_logic.FunctionArgument', + ), + ), ], options={ 'ordering': ('order',), @@ -163,11 +328,39 @@ class Migration(migrations.Migration): migrations.CreateModel( name='FunctionDefinition', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255, unique=True, verbose_name='Title')), - ('description', models.TextField(blank=True, null=True, verbose_name='Description')), - ('is_context_required', models.BooleanField(default=False, verbose_name='Is Context required')), - ('is_returns_value', models.BooleanField(default=True, verbose_name='Is returns value')), + ( + 'id', + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), + ( + 'title', + models.CharField( + max_length=255, unique=True, verbose_name='Title' + ), + ), + ( + 'description', + models.TextField( + blank=True, null=True, verbose_name='Description' + ), + ), + ( + 'is_context_required', + models.BooleanField( + default=False, verbose_name='Is Context required' + ), + ), + ( + 'is_returns_value', + models.BooleanField( + default=True, verbose_name='Is returns value' + ), + ), ], options={ 'abstract': False, @@ -176,8 +369,23 @@ class Migration(migrations.Migration): migrations.CreateModel( name='FunctionLibrary', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255, unique=True, verbose_name='Function library title')), + ( + 'id', + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), + ( + 'title', + models.CharField( + max_length=255, + unique=True, + verbose_name='Function library title', + ), + ), ], options={ 'verbose_name': 'Function library', @@ -187,7 +395,15 @@ class Migration(migrations.Migration): migrations.CreateModel( name='IfStatement', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ( + 'id', + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), ], options={ 'verbose_name': 'If statement', @@ -197,10 +413,28 @@ class Migration(migrations.Migration): migrations.CreateModel( name='LogEntry', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ( + 'id', + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), ('sib_order', models.PositiveIntegerField()), - ('previous_value', models.CharField(max_length=255, verbose_name='Previous value')), - ('current_value', models.CharField(max_length=255, verbose_name='Current value')), + ( + 'previous_value', + models.CharField( + max_length=255, verbose_name='Previous value' + ), + ), + ( + 'current_value', + models.CharField( + max_length=255, verbose_name='Current value' + ), + ), ], options={ 'abstract': False, @@ -209,14 +443,37 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Node', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ( + 'id', + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), ('lft', models.PositiveIntegerField(db_index=True)), ('rgt', models.PositiveIntegerField(db_index=True)), ('tree_id', models.PositiveIntegerField(db_index=True)), ('depth', models.PositiveIntegerField(db_index=True)), - ('comment', models.CharField(blank=True, max_length=255, null=True, verbose_name='Comment')), + ( + 'comment', + models.CharField( + blank=True, + max_length=255, + null=True, + verbose_name='Comment', + ), + ), ('object_id', models.PositiveIntegerField(null=True)), - ('content_type', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')), + ( + 'content_type', + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.CASCADE, + to='contenttypes.ContentType', + ), + ), ], options={ 'ordering': ['tree_id', 'lft'], @@ -227,7 +484,15 @@ class Migration(migrations.Migration): migrations.CreateModel( name='NumberConstant', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ( + 'id', + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), ('value', models.FloatField(verbose_name='Value')), ], options={ @@ -238,12 +503,36 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Program', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255, verbose_name='Title')), - ('code', models.SlugField(max_length=255, unique=True, verbose_name='Code')), + ( + 'id', + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), + ( + 'title', + models.CharField(max_length=255, verbose_name='Title'), + ), + ( + 'code', + models.SlugField( + max_length=255, unique=True, verbose_name='Code' + ), + ), ('creation_time', models.DateTimeField(auto_now_add=True)), ('modification_time', models.DateTimeField(auto_now=True)), - ('environment', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='business_logic.ExecutionEnvironment')), + ( + 'environment', + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to='business_logic.ExecutionEnvironment', + ), + ), ], options={ 'ordering': ('id',), @@ -254,9 +543,26 @@ class Migration(migrations.Migration): migrations.CreateModel( name='ProgramArgument', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.SlugField(max_length=255, verbose_name='Name')), - ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')), + ( + 'id', + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), + ( + 'name', + models.SlugField(max_length=255, verbose_name='Name'), + ), + ( + 'content_type', + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to='contenttypes.ContentType', + ), + ), ], options={ 'verbose_name': 'Program argument', @@ -266,10 +572,38 @@ class Migration(migrations.Migration): migrations.CreateModel( name='ProgramArgumentField', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', business_logic.fields.DeepAttributeField(max_length=255, verbose_name='Name')), - ('title', models.CharField(blank=True, max_length=255, null=True, verbose_name='Title')), - ('program_argument', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='fields', to='business_logic.ProgramArgument')), + ( + 'id', + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), + ( + 'name', + business_logic.fields.DeepAttributeField( + max_length=255, verbose_name='Name' + ), + ), + ( + 'title', + models.CharField( + blank=True, + max_length=255, + null=True, + verbose_name='Title', + ), + ), + ( + 'program_argument', + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name='fields', + to='business_logic.ProgramArgument', + ), + ), ], options={ 'ordering': ('name',), @@ -280,12 +614,42 @@ class Migration(migrations.Migration): migrations.CreateModel( name='ProgramInterface', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(db_index=True, max_length=255, verbose_name='Title')), - ('code', models.SlugField(blank=True, max_length=255, null=True, unique=True, verbose_name='Code')), + ( + 'id', + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), + ( + 'title', + models.CharField( + db_index=True, max_length=255, verbose_name='Title' + ), + ), + ( + 'code', + models.SlugField( + blank=True, + max_length=255, + null=True, + unique=True, + verbose_name='Code', + ), + ), ('creation_time', models.DateTimeField(auto_now_add=True)), ('modification_time', models.DateTimeField(auto_now=True)), - ('environment', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='business_logic.ExecutionEnvironment')), + ( + 'environment', + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to='business_logic.ExecutionEnvironment', + ), + ), ], options={ 'ordering': ('id',), @@ -296,15 +660,63 @@ class Migration(migrations.Migration): migrations.CreateModel( name='ProgramVersion', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(blank=True, max_length=255, null=True, verbose_name='Title')), - ('description', models.TextField(blank=True, null=True, verbose_name='Description')), - ('is_default', models.BooleanField(default=False, verbose_name='Is default')), + ( + 'id', + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), + ( + 'title', + models.CharField( + blank=True, + max_length=255, + null=True, + verbose_name='Title', + ), + ), + ( + 'description', + models.TextField( + blank=True, null=True, verbose_name='Description' + ), + ), + ( + 'is_default', + models.BooleanField( + default=False, verbose_name='Is default' + ), + ), ('creation_time', models.DateTimeField(auto_now_add=True)), ('modification_time', models.DateTimeField(auto_now=True)), - ('entry_point', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='business_logic.Node', verbose_name='Entry point')), - ('environment', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='business_logic.ExecutionEnvironment')), - ('program', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='versions', to='business_logic.Program')), + ( + 'entry_point', + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to='business_logic.Node', + verbose_name='Entry point', + ), + ), + ( + 'environment', + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to='business_logic.ExecutionEnvironment', + ), + ), + ( + 'program', + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name='versions', + to='business_logic.Program', + ), + ), ], options={ 'ordering': ('id',), @@ -315,7 +727,15 @@ class Migration(migrations.Migration): migrations.CreateModel( name='ReferenceConstant', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ( + 'id', + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), ], options={ 'verbose_name': 'Reference constant', @@ -325,11 +745,31 @@ class Migration(migrations.Migration): migrations.CreateModel( name='ReferenceDescriptor', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(blank=True, max_length=255, null=True)), + ( + 'id', + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), + ( + 'title', + models.CharField(blank=True, max_length=255, null=True), + ), ('search_fields', models.TextField(blank=True, null=True)), - ('name_field', models.SlugField(blank=True, max_length=255, null=True)), - ('content_type', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')), + ( + 'name_field', + models.SlugField(blank=True, max_length=255, null=True), + ), + ( + 'content_type', + models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + to='contenttypes.ContentType', + ), + ), ], options={ 'verbose_name': 'Reference descriptor', @@ -339,7 +779,15 @@ class Migration(migrations.Migration): migrations.CreateModel( name='StopInterpretation', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ( + 'id', + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), ], options={ 'verbose_name': 'Stop instruction', @@ -349,7 +797,15 @@ class Migration(migrations.Migration): migrations.CreateModel( name='StringConstant', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ( + 'id', + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), ('value', models.TextField(default=b'', verbose_name='Value')), ], options={ @@ -360,7 +816,15 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Table', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ( + 'id', + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), ], options={ 'verbose_name': 'Table', @@ -370,8 +834,19 @@ class Migration(migrations.Migration): migrations.CreateModel( name='UnaryOperator', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('operator', models.CharField(max_length=3, verbose_name='Operator')), + ( + 'id', + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), + ( + 'operator', + models.CharField(max_length=3, verbose_name='Operator'), + ), ], options={ 'verbose_name': 'Unary operator', @@ -381,7 +856,15 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Variable', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ( + 'id', + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), ], options={ 'verbose_name': 'Variable', @@ -391,7 +874,15 @@ class Migration(migrations.Migration): migrations.CreateModel( name='VariableDefinition', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ( + 'id', + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), ('name', models.TextField(verbose_name='Variable name')), ], options={ @@ -402,8 +893,21 @@ class Migration(migrations.Migration): migrations.CreateModel( name='PythonCodeFunctionDefinition', fields=[ - ('functiondefinition_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='business_logic.FunctionDefinition')), - ('code', models.TextField(max_length=255, verbose_name='Code')), + ( + 'functiondefinition_ptr', + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to='business_logic.FunctionDefinition', + ), + ), + ( + 'code', + models.TextField(max_length=255, verbose_name='Code'), + ), ], options={ 'verbose_name': 'Python code function definition', @@ -414,9 +918,31 @@ class Migration(migrations.Migration): migrations.CreateModel( name='PythonModuleFunctionDefinition', fields=[ - ('functiondefinition_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='business_logic.FunctionDefinition')), - ('module', models.CharField(default=b'__builtins__', max_length=255, verbose_name='Module name')), - ('function', models.CharField(max_length=255, verbose_name='Function name')), + ( + 'functiondefinition_ptr', + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to='business_logic.FunctionDefinition', + ), + ), + ( + 'module', + models.CharField( + default=b'__builtins__', + max_length=255, + verbose_name='Module name', + ), + ), + ( + 'function', + models.CharField( + max_length=255, verbose_name='Function name' + ), + ), ], options={ 'verbose_name': 'Python module function definition', @@ -427,89 +953,153 @@ class Migration(migrations.Migration): migrations.AddField( model_name='variable', name='definition', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='variables', to='business_logic.VariableDefinition'), + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name='variables', + to='business_logic.VariableDefinition', + ), ), migrations.AddField( model_name='programargumentfield', name='variable_definition', - field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='program_argument_field', to='business_logic.VariableDefinition'), + field=models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + related_name='program_argument_field', + to='business_logic.VariableDefinition', + ), ), migrations.AddField( model_name='programargument', name='program_interface', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='arguments', to='business_logic.ProgramInterface'), + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name='arguments', + to='business_logic.ProgramInterface', + ), ), migrations.AddField( model_name='programargument', name='variable_definition', - field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='program_argument', to='business_logic.VariableDefinition'), + field=models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + related_name='program_argument', + to='business_logic.VariableDefinition', + ), ), migrations.AddField( model_name='program', name='program_interface', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='business_logic.ProgramInterface'), + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to='business_logic.ProgramInterface', + ), ), migrations.AddField( model_name='logentry', name='node', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='business_logic.Node', verbose_name='Program node'), + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to='business_logic.Node', + verbose_name='Program node', + ), ), migrations.AddField( model_name='logentry', name='parent', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='business_logic.LogEntry'), + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name='children', + to='business_logic.LogEntry', + ), ), migrations.AddField( model_name='functionlibrary', name='functions', - field=models.ManyToManyField(related_name='libraries', to='business_logic.FunctionDefinition'), + field=models.ManyToManyField( + related_name='libraries', + to='business_logic.FunctionDefinition', + ), ), migrations.AddField( model_name='functiondefinition', name='polymorphic_ctype', - field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_business_logic.functiondefinition_set+', to='contenttypes.ContentType'), + field=models.ForeignKey( + editable=False, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name='polymorphic_business_logic.functiondefinition_set+', + to='contenttypes.ContentType', + ), ), migrations.AddField( model_name='functionargument', name='function', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='arguments', to='business_logic.FunctionDefinition'), + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name='arguments', + to='business_logic.FunctionDefinition', + ), ), migrations.AddField( model_name='function', name='definition', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='functions', to='business_logic.FunctionDefinition'), + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name='functions', + to='business_logic.FunctionDefinition', + ), ), migrations.AddField( model_name='executionenvironment', name='libraries', - field=models.ManyToManyField(blank=True, related_name='environments', to='business_logic.FunctionLibrary'), + field=models.ManyToManyField( + blank=True, + related_name='environments', + to='business_logic.FunctionLibrary', + ), ), migrations.AddField( model_name='executionargument', name='program_argument', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='business_logic.ProgramArgument'), + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to='business_logic.ProgramArgument', + ), ), migrations.AddField( model_name='execution', name='log', - field=models.OneToOneField(null=True, on_delete=django.db.models.deletion.SET_NULL, to='business_logic.LogEntry'), + field=models.OneToOneField( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to='business_logic.LogEntry', + ), ), migrations.AddField( model_name='execution', name='program_version', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='business_logic.ProgramVersion'), + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to='business_logic.ProgramVersion', + ), ), migrations.AddField( model_name='exceptionlog', name='log_entry', - field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='exception', to='business_logic.LogEntry'), + field=models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + related_name='exception', + to='business_logic.LogEntry', + ), ), migrations.AlterUniqueTogether( name='programargumentfield', - unique_together=set([('program_argument', 'name')]), + unique_together={('program_argument', 'name')}, ), migrations.AlterUniqueTogether( name='programargument', - unique_together=set([('program_interface', 'name')]), + unique_together={('program_interface', 'name')}, ), ] diff --git a/business_logic/models/context.py b/business_logic/models/context.py index cbe5fddc..89b1ae51 100644 --- a/business_logic/models/context.py +++ b/business_logic/models/context.py @@ -34,9 +34,7 @@ def __init__(self, **kwargs): signals.interpret_exception.connect(self.logger.interpret_exception, sender=self) def _frame(self): - if not self.frames: - return None - return self.frames[-1] + return self.frames[-1] if self.frames else None frame = property(_frame) @@ -62,10 +60,11 @@ def interpret_leave(self, **kwargs): pass def get_children(self, node): - if not self.config.cache: - return node.get_children().all() - - return super(Context, self).get_children(node) + return ( + super(Context, self).get_children(node) + if self.config.cache + else node.get_children().all() + ) def get_variable(self, variable_definition): """ diff --git a/business_logic/models/log.py b/business_logic/models/log.py index 98c55334..8817845f 100644 --- a/business_logic/models/log.py +++ b/business_logic/models/log.py @@ -66,7 +66,7 @@ def interpret_exception(self, node, exception, traceback, **kwargs): def prepare_value(self, value): value = six.text_type(value) if len(value) > LOG_ENTRY_VALUE_LENGTH: - value = value[:LOG_ENTRY_VALUE_LENGTH - 3] + '...' + value = f'{value[:LOG_ENTRY_VALUE_LENGTH - 3]}...' return value diff --git a/business_logic/models/node.py b/business_logic/models/node.py index 686f4a10..9e8f1ebc 100644 --- a/business_logic/models/node.py +++ b/business_logic/models/node.py @@ -43,7 +43,7 @@ class Meta: verbose_name_plural = _('Program nodes') def __str__(self): - return 'Node {}({}): {}'.format(self.id, self.content_type, self.content_object) + return f'Node {self.id}({self.content_type}): {self.content_object}' @staticmethod def ensure_content_object_saved(**kwargs): @@ -117,19 +117,24 @@ def visit(self, node): content_object_clone.save() node_kwargs = dict(content_object=content_object_clone) else: - node_kwargs = dict() + node_kwargs = {} if self.clone is None: clone = self.clone = Node.add_root(**node_kwargs) clone.rgt = node.rgt clone.lft = node.lft - clone.save() else: - node_kwargs.update( - dict([(field_name, getattr(node, field_name)) for field_name in ('rgt', 'lft', 'depth')])) - node_kwargs.update(dict(tree_id=self.clone.tree_id)) + node_kwargs |= dict( + [ + (field_name, getattr(node, field_name)) + for field_name in ('rgt', 'lft', 'depth') + ] + ) + + node_kwargs |= dict(tree_id=self.clone.tree_id) clone = Node.objects.create(**node_kwargs) - clone.save() + + clone.save() visitor = CloneVisitor() visitor.preorder(self) @@ -279,12 +284,16 @@ def _initialize(self, node): node._content_object_cache = content_object node._content_type_cache = content_type_by_id[node.content_type_id] - self._child_by_parent_id = {} - for parent in tree: - self._child_by_parent_id[parent.id] = [ - node for node in tree - if node.lft >= parent.lft and node.lft <= parent.rgt - 1 and node.depth == parent.depth + 1 + self._child_by_parent_id = { + parent.id: [ + node + for node in tree + if node.lft >= parent.lft + and node.lft <= parent.rgt - 1 + and node.depth == parent.depth + 1 ] + for parent in tree + } class NodeCacheHolder(object): diff --git a/business_logic/models/program.py b/business_logic/models/program.py index 561130c7..89b5b9b0 100644 --- a/business_logic/models/program.py +++ b/business_logic/models/program.py @@ -159,7 +159,7 @@ def __str__(self): return self.get_variable_name() def get_variable_name(self): - return '{}.{}'.format(self.program_argument.name, self.name) + return f'{self.program_argument.name}.{self.name}' def get_title(self): if self.title: @@ -214,7 +214,7 @@ class Meta: ordering = ('id',) def __str__(self): - return '{}: {}({})'.format(self.program_interface, self.title, self.code) + return f'{self.program_interface}: {self.title}({self.code})' @python_2_unicode_compatible diff --git a/business_logic/models/reference.py b/business_logic/models/reference.py index 6b46fe65..7150aed2 100644 --- a/business_logic/models/reference.py +++ b/business_logic/models/reference.py @@ -25,10 +25,7 @@ def __str__(self): return force_text(self.content_type) def get_search_fields(self): - if not self.search_fields: - return [] - - return re.split(r'[^\w_]+', self.search_fields) + return re.split(r'[^\w_]+', self.search_fields) if self.search_fields else [] class ReferenceConstant(NodeAccessor): diff --git a/business_logic/rest/serializers.py b/business_logic/rest/serializers.py index 28fb4bc3..a4eae57a 100644 --- a/business_logic/rest/serializers.py +++ b/business_logic/rest/serializers.py @@ -21,7 +21,7 @@ def get_model_name(content_type): - return '{}.{}'.format(content_type.app_label, content_type.model_class().__name__) + return f'{content_type.app_label}.{content_type.model_class().__name__}' def get_model_verbose_name(content_type): @@ -112,7 +112,9 @@ def run_validation(self, data=serializers.empty): BlocklyXmlParser().parse(data) except Exception as e: raise serializers.ValidationError( - ["Xml parse error - {}: {}".format(e.__class__.__name__, six.text_type(e))]) + [f"Xml parse error - {e.__class__.__name__}: {six.text_type(e)}"] + ) + value = self.to_internal_value(data) self.run_validators(value) @@ -188,8 +190,7 @@ class ReferenceSerializer(serializers.ModelSerializer): name = serializers.SerializerMethodField() def get_fields(self): - declared_fields = copy.deepcopy(self._declared_fields) - return declared_fields + return copy.deepcopy(self._declared_fields) def get_name(self, obj): reference_descriptor = self.context['view'].get_reference_descriptor() @@ -202,9 +203,7 @@ class Meta: model = ProgramArgumentField def to_representation(self, instance): - representation = {} - representation['name'] = instance.name - + representation = {'name': instance.name} argument = instance.program_argument model = argument.content_type.model_class() diff --git a/business_logic/rest/views.py b/business_logic/rest/views.py index c6d3cd61..3105ec82 100644 --- a/business_logic/rest/views.py +++ b/business_logic/rest/views.py @@ -29,7 +29,7 @@ def format_url(_url): - return 'business-logic:rest:{}'.format(_url) + return f'business-logic:rest:{_url}' @api_view(('GET',)) @@ -135,8 +135,9 @@ def filter_queryset(self, request, queryset, view): if not search_fields: raise exceptions.ValidationError( - 'ReferenceDescriptor for `{}` are not configured: incorrect `search_fields` field'.format( - view.get_reference_model_name())) + f'ReferenceDescriptor for `{view.get_reference_model_name()}` are not configured: incorrect `search_fields` field' + ) + orm_lookups = [self.construct_search(six.text_type(search_field)) for search_field in search_fields] diff --git a/docs/conf.py b/docs/conf.py index df10629d..9a284df9 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -31,11 +31,11 @@ init_py = open(os.path.join(parent_dir, 'business_logic/__init__.py')).read() # The full version, including alpha/beta/rc tags -release = re.search("__version__ = ['\"]([^'\"]+)['\"]", init_py).group(1) +release = re.search("__version__ = ['\"]([^'\"]+)['\"]", init_py)[1] # The short X.Y version version_parts = release.split('.') -version = '{}.{}'.format(version_parts[0], version_parts[1]) +version = f'{version_parts[0]}.{version_parts[1]}' # -- General configuration --------------------------------------------------- diff --git a/setup.py b/setup.py index 37cb3236..7154ef7f 100644 --- a/setup.py +++ b/setup.py @@ -26,7 +26,7 @@ def get_version(package): Return package version as listed in `__version__` in `init.py`. """ init_py = open(os.path.join(package, '__init__.py')).read() - return re.search("__version__ = ['\"]([^'\"]+)['\"]", init_py).group(1) + return re.search("__version__ = ['\"]([^'\"]+)['\"]", init_py)[1] version = get_version(PACKAGE) @@ -62,7 +62,7 @@ def abs_path(*parts): def clean(): - for d in ('dist', 'build', '{}.egg-info'.format(NAME.replace('-', '_'))): + for d in ('dist', 'build', f"{NAME.replace('-', '_')}.egg-info"): if os.path.exists(d): shutil.rmtree(d) @@ -80,11 +80,13 @@ def clean(): name=NAME, version=get_version(PACKAGE), description=DESCRIPTION, - long_description=codecs.open(abs_path('README.rst'), encoding='utf-8').read(), + long_description=codecs.open( + abs_path('README.rst'), encoding='utf-8' + ).read(), author=AUTHOR, author_email=AUTHOR_EMAIL, url=URL, - download_url='{}/archive/{}.tar.gz'.format(URL, version), + download_url=f'{URL}/archive/{version}.tar.gz', packages=get_packages(PACKAGE), package_data={ PACKAGE: [ @@ -124,7 +126,9 @@ def clean(): ], zip_safe=False, install_requires=[ - '{}; {}'.format(x.req, x.markers) if x.markers else str(x.req) - for x in parse_requirements(abs_path('requirements.txt'), session=False) + f'{x.req}; {x.markers}' if x.markers else str(x.req) + for x in parse_requirements( + abs_path('requirements.txt'), session=False + ) ], ) diff --git a/sites/dev/books/models.py b/sites/dev/books/models.py index f53ef9e5..7e19a58b 100644 --- a/sites/dev/books/models.py +++ b/sites/dev/books/models.py @@ -33,7 +33,7 @@ class Meta: ordering = ('id',) def __str__(self): - return u'%s %s' % (self.first_name, self.last_name) + return f'{self.first_name} {self.last_name}' def get_absolute_url(self): return reverse('author-detail', kwargs={'pk': self.pk}) diff --git a/sites/settings.py b/sites/settings.py index 78c583b1..dcf45cab 100644 --- a/sites/settings.py +++ b/sites/settings.py @@ -82,7 +82,4 @@ def __contains__(self, item): return True def __getitem__(self, item): - if django.VERSION[1] < 9: - # django < 1.9 - return "notmigrations" - return None + return "notmigrations" if django.VERSION[1] < 9 else None diff --git a/tests/blockly/test_build.py b/tests/blockly/test_build.py index c2c6dfdc..c2620f54 100644 --- a/tests/blockly/test_build.py +++ b/tests/blockly/test_build.py @@ -153,7 +153,7 @@ def test_block(self): def test_block_if_sequence(self): root = Node.add_root() - for i in range(2): + for _ in range(2): root, var_defs = create_if_statement(2, root=root) xml_str = BlocklyXmlBuilder().build(root) @@ -202,7 +202,7 @@ def _test_math_binary_operator(self, operator, block_type, operator_field_value) self.assertEqual('OP', field.get('name')) self.assertEqual(operator_field_value, field.text) for field_value, field_name in enumerate(('A', 'B'), 1): - value = xml.xpath('/xml/block/value[@name="{}"]'.format(field_name))[0] + value = xml.xpath(f'/xml/block/value[@name="{field_name}"]')[0] math_number = value.find('block') self.assertEqual('math_number', math_number.get('type')) field, = math_number.getchildren() @@ -226,7 +226,7 @@ def _test_logic_binary_operator(self, operator, block_type, operator_field_value self.assertEqual('OP', field.get('name')) self.assertEqual(operator_field_value, field.text) for field_value, field_name in ((True, 'A'), (False, 'B')): - value = xml.xpath('/xml/block/value[@name="{}"]'.format(field_name))[0] + value = xml.xpath(f'/xml/block/value[@name="{field_name}"]')[0] math_number = value.find('block') self.assertEqual('logic_boolean', math_number.get('type')) field, = math_number.getchildren() diff --git a/tests/common.py b/tests/common.py index 1fd5f5d3..dce726a6 100644 --- a/tests/common.py +++ b/tests/common.py @@ -52,14 +52,13 @@ def setUp(self): self.test_model = Model.objects.create() def create_argument_fields(self, argument): - fields = {} - for field in self.field_list: - fields[field] = ProgramArgumentField.objects.create( + return { + field: ProgramArgumentField.objects.create( name=field, program_argument=argument, ) - - return fields + for field in self.field_list + } def create_entry_point(self): return get_test_tree() diff --git a/tests/rest/common.py b/tests/rest/common.py index b5a975c7..d9c2ef4f 100644 --- a/tests/rest/common.py +++ b/tests/rest/common.py @@ -10,19 +10,34 @@ class JSONClient(Client): def post(self, path, data={}, content_type='application/json', follow=False, **extra): - ret = super(Client, self).post( - path, data=data, content_type=content_type, follow=follow, HTTP_X_REQUESTED_WITH='XMLHttpRequest', **extra) - return ret + return super(Client, self).post( + path, + data=data, + content_type=content_type, + follow=follow, + HTTP_X_REQUESTED_WITH='XMLHttpRequest', + **extra + ) def put(self, path, data={}, content_type='application/json', follow=False, **extra): - ret = super(Client, self).put( - path, data=data, content_type=content_type, follow=follow, HTTP_X_REQUESTED_WITH='XMLHttpRequest', **extra) - return ret + return super(Client, self).put( + path, + data=data, + content_type=content_type, + follow=follow, + HTTP_X_REQUESTED_WITH='XMLHttpRequest', + **extra + ) def delete(self, path, data={}, content_type='application/json', follow=False, **extra): - ret = super(Client, self).delete( - path, data=data, content_type=content_type, follow=follow, HTTP_X_REQUESTED_WITH='XMLHttpRequest', **extra) - return ret + return super(Client, self).delete( + path, + data=data, + content_type=content_type, + follow=follow, + HTTP_X_REQUESTED_WITH='XMLHttpRequest', + **extra + ) def response_json(response): diff --git a/tests/rest/test_program_interface.py b/tests/rest/test_program_interface.py index 34e4709d..e41d6990 100644 --- a/tests/rest/test_program_interface.py +++ b/tests/rest/test_program_interface.py @@ -30,7 +30,7 @@ def test_program_interface_view(self): self.assertEqual(Model._meta.verbose_name, content_type['verbose_name']) self.assertEqual(ContentType.objects.get_for_model(Model).id, content_type['id']) - fields = dict((x['name'], x) for x in argument['fields']) + fields = {x['name']: x for x in argument['fields']} expected = { 'int_value': diff --git a/tests/rest/test_reference.py b/tests/rest/test_reference.py index 5a591702..7befa564 100644 --- a/tests/rest/test_reference.py +++ b/tests/rest/test_reference.py @@ -47,10 +47,10 @@ def setUp(self): model = 'test_app.Model' self.url = reverse('business-logic:rest:reference-list', kwargs=dict(model=model)) - self.test_models = [] - - for i in range(11): - self.test_models.append(Model.objects.create(string_value='str_{}'.format(str(i) * 3))) + self.test_models = [ + Model.objects.create(string_value=f'str_{str(i) * 3}') + for i in range(11) + ] def test_reference_list(self): response = self.client.get(self.url) diff --git a/tests/test_frame.py b/tests/test_frame.py index fc1deb5c..0505a82e 100644 --- a/tests/test_frame.py +++ b/tests/test_frame.py @@ -44,26 +44,14 @@ def on_interpret_enter(**kwargs): node = kwargs['node'] if node == root: self.assertEqual(1, len(context.frames)) - elif node == node1: - self.assertEqual(2, len(context.frames)) - elif node == node2: - self.assertEqual(2, len(context.frames)) - elif node == node1_1: - self.assertEqual(2, len(context.frames)) - elif node == node2_1: + elif node in [node1, node2, node1_1, node2_1]: self.assertEqual(2, len(context.frames)) def on_interpret_leave(**kwargs): node = kwargs['node'] if node == root: self.assertEqual(1, len(context.frames)) - elif node == node1: - self.assertEqual(2, len(context.frames)) - elif node == node2: - self.assertEqual(2, len(context.frames)) - elif node == node1_1: - self.assertEqual(2, len(context.frames)) - elif node == node2_1: + elif node in [node1, node2, node1_1, node2_1]: self.assertEqual(2, len(context.frames)) signals.block_interpret_enter.connect(on_interpret_enter) diff --git a/tests/test_log.py b/tests/test_log.py index 1b0faa9b..44100094 100644 --- a/tests/test_log.py +++ b/tests/test_log.py @@ -110,7 +110,7 @@ def test_log_exception(self): self.assertIsInstance(exception_log, ExceptionLog) try: - 0.0 // 0.0 + 1.0 except Exception as e: exception = e diff --git a/tests/test_program.py b/tests/test_program.py index 77031f2a..aaff37c8 100644 --- a/tests/test_program.py +++ b/tests/test_program.py @@ -12,7 +12,10 @@ def test_program_argument_variable_definition(self): def test_program_argument_field_variable_definition(self): int_value_field = self.fields['int_value'] self.assertIsInstance(int_value_field.variable_definition, VariableDefinition) - self.assertEqual('{}.{}'.format(self.argument.name, 'int_value'), int_value_field.variable_definition.name) + self.assertEqual( + f'{self.argument.name}.int_value', + int_value_field.variable_definition.name, + ) def test_program_argument_field_title_declared(self): title = 'test' @@ -39,7 +42,7 @@ def test_save_program_argument_change_field_variable_definition(self): self.argument.save() variable_definition = VariableDefinition.objects.get(id=int_value_field.variable_definition_id) - self.assertEqual('{}.{}'.format(self.argument.name, 'int_value'), variable_definition.name) + self.assertEqual(f'{self.argument.name}.int_value', variable_definition.name) def test_program_argument_deletion_should_delete_variable_definition(self): variable_definition = self.argument.variable_definition diff --git a/tests/test_variable.py b/tests/test_variable.py index deb33262..357ad916 100644 --- a/tests/test_variable.py +++ b/tests/test_variable.py @@ -52,15 +52,16 @@ def test_get_variable_returns_recursive_attribute(self): def test_get_variable_returns_recursive_attribute_undefined(self): test_model_variable_definition = VariableDefinition.objects.create(name='test_model') - variable_definitions = {} - - for field in ( + variable_definitions = { + field: VariableDefinition.objects.create(name=field) + for field in ( 'test_model.int_value', 'test_model.not_exists', 'test_model.foreign_value.string_value', 'test_model.foreign_value.not_exists', - ): - variable_definitions[field] = VariableDefinition.objects.create(name=field) + ) + } + context = Context() diff --git a/tests/utils.py b/tests/utils.py index 55687da6..450e3a9e 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -76,10 +76,16 @@ def symmetric_tree(operator='+', value=1, count=2, operand_cls=NumberConstant, p obj_kwargs = dict(operator=operator) level_objects = [ - dict(data=dict(object_id=obj_cls.objects.create(**obj_kwargs).id, content_type_id=content_type_id)) - for x in range(pow(2, level)) + dict( + data=dict( + object_id=obj_cls.objects.create(**obj_kwargs).id, + content_type_id=content_type_id, + ) + ) + for _ in range(pow(2, level)) ] + if level == 1: top = level_objects else: @@ -131,11 +137,14 @@ def variable_assign_value(variable_name='A', variable_definition=None, value=Non def print_tree_details(nodes): # mptt/tests/doctests.py opts = nodes[0]._meta - print('\n'.join([ - '%s %s %s %s %s %s' % (n.pk, getattr(n, '%s_id' % opts.parent_attr) or '-', getattr(n, opts.tree_id_attr), - getattr(n, opts.level_attr), getattr(n, opts.left_attr), getattr(n, opts.right_attr)) - for n in nodes - ])) + print( + '\n'.join( + [ + f"{n.pk} {getattr(n, f'{opts.parent_attr}_id') or '-'} {getattr(n, opts.tree_id_attr)} {getattr(n, opts.level_attr)} {getattr(n, opts.left_attr)} {getattr(n, opts.right_attr)}" + for n in nodes + ] + ) + ) def create_if_statement(branches_count, use_binary_operator=False, root=None):