diff --git a/code-generation/language-python/pom.xml b/code-generation/language-python/pom.xml
index 3653c065d7e..ce444f27a37 100644
--- a/code-generation/language-python/pom.xml
+++ b/code-generation/language-python/pom.xml
@@ -33,8 +33,6 @@
Code generation template for generating Python code
-
- true
2024-02-16T14:53:02Z
diff --git a/code-generation/language-python/src/main/java/org/apache/plc4x/language/python/PythonLanguageTemplateHelper.java b/code-generation/language-python/src/main/java/org/apache/plc4x/language/python/PythonLanguageTemplateHelper.java
index 8c17d4e21c9..671de9eeca5 100644
--- a/code-generation/language-python/src/main/java/org/apache/plc4x/language/python/PythonLanguageTemplateHelper.java
+++ b/code-generation/language-python/src/main/java/org/apache/plc4x/language/python/PythonLanguageTemplateHelper.java
@@ -768,18 +768,10 @@ private String toTernaryTermExpression(Field field, TypeReference fieldType, Ter
Term b = ternaryTerm.getB();
Term c = ternaryTerm.getC();
String castExpressionForTypeReference = getCastExpressionForTypeReference(fieldType);
- String inlineIf = "utils.InlineIf(" + toExpression(field, new DefaultBooleanTypeReference(), a, parserArguments, serializerArguments, serialize, false) + ", " +
- "func() any {return " + castExpressionForTypeReference + "(" + toExpression(field, fieldType, b, parserArguments, serializerArguments, serialize, false) + ")}, " +
- "func() any {return " + castExpressionForTypeReference + "(" + toExpression(field, fieldType, c, parserArguments, serializerArguments, serialize, false) + ")})";
- if (fieldType != null) {
- if (fieldType instanceof ByteOrderTypeReference) {
- return tracer.dive("byteordertypereference") + "(" + inlineIf + ").(binary.ByteOrder)";
- }
- if (fieldType.isNonSimpleTypeReference()) {
- return tracer.dive("nonsimpletypereference") + castExpressionForTypeReference + "(" + inlineIf + ")";
- }
- return tracer + inlineIf + ".(" + castExpressionForTypeReference + ")";
- }
+ String inlineIf = toExpression(field, fieldType, b, parserArguments, serializerArguments, serialize, false) + " if " +
+ toExpression(field, new DefaultBooleanTypeReference(), a, parserArguments, serializerArguments, serialize, false) + " else " +
+ toExpression(field, fieldType, c, parserArguments, serializerArguments, serialize, false);
+
return tracer + inlineIf;
} else {
throw new FreemarkerException("Unsupported ternary operation type " + ternaryTerm.getOperation());
diff --git a/code-generation/language-python/src/main/resources/templates/python/complex-type-template.python.ftlh b/code-generation/language-python/src/main/resources/templates/python/complex-type-template.python.ftlh
index 2e64858ea17..624e1a75f52 100644
--- a/code-generation/language-python/src/main/resources/templates/python/complex-type-template.python.ftlh
+++ b/code-generation/language-python/src/main/resources/templates/python/complex-type-template.python.ftlh
@@ -275,13 +275,12 @@ class ${type.name}<#if type.isDiscriminatedParentTypeDefinition()>#if>(<#if ty
<#assign namedField = field.asNamedField().orElseThrow()>
# Optional Field (${optionalField.name}) (Can be skipped, if the value is null)
- if ${helper.toSerializationExpression(optionalField, helper.boolTypeReference, optionalField.conditionExpression.get(), parserArguments)}:
<#if optionalField.type.isEnumTypeReference()>
- write_buffer.${helper.getEnumDataWriterCall(optionalField.type, optionalField.name, "value")}(self.${helper.camelCaseToSnakeCase(optionalField.name)}, logical_name="${optionalField.name}")
+ write_buffer.${helper.getEnumDataWriterCall(optionalField.type, optionalField.name, "value")}(self.${helper.camelCaseToSnakeCase(optionalField.name)}, logical_name="${optionalField.name}")
<#elseif optionalField.type.isDataIoTypeReference()>
- write_buffer.${helper.getDataWriterCall(typedField.type, optionalField.name)}(self.${helper.camelCaseToSnakeCase(optionalField.name)}, logical_name="${optionalField.name}", <#list optionalField.type.asComplexTypeReference().orElseThrow().params.orElseThrow() as param>${helper.toParseExpression(optionalField, helper.anyTypeReference, param, parserArguments)}<#sep>, #sep>#list>)))
+ write_buffer.${helper.getDataWriterCall(typedField.type, optionalField.name)}(self.${helper.camelCaseToSnakeCase(optionalField.name)}, logical_name="${optionalField.name}", <#list optionalField.type.asComplexTypeReference().orElseThrow().params.orElseThrow() as param>${helper.toParseExpression(optionalField, helper.anyTypeReference, param, parserArguments)}<#sep>, #sep>#list>)))
<#else>
- write_buffer.${helper.getDataWriterCall(typedField.type, optionalField.name)}(self.${helper.camelCaseToSnakeCase(optionalField.name)}, logical_name="${optionalField.name}"<#if optionalField.conditionExpression.present>#if>)
+ write_buffer.${helper.getDataWriterCall(typedField.type, optionalField.name)}(self.${helper.camelCaseToSnakeCase(optionalField.name)}, logical_name="${optionalField.name}"<#if optionalField.conditionExpression.present>#if>)
#if>
<#break>
<#case "padding">
@@ -402,9 +401,9 @@ class ${type.name}<#if type.isDiscriminatedParentTypeDefinition()>#if>(<#if ty
length_in_bits += ${simpleTypeReference.sizeInBits}
#if>
<#elseif helper.isEnumField(field)>
- length_in_bits += ${helper.getEnumBaseTypeReference(discriminatorField.type).sizeInBits}
+ length_in_bits += ${helper.getEnumBaseTypeReference(discriminatorField.type).sizeInBits}
<#else>
- length_in_bits += self.${helper.camelCaseToSnakeCase(discriminatorField.name)}.length_in_bits()
+ length_in_bits += self.${helper.camelCaseToSnakeCase(discriminatorField.name)}.length_in_bits()
#if>
<#break>
<#case "enum">
@@ -437,21 +436,20 @@ class ${type.name}<#if type.isDiscriminatedParentTypeDefinition()>#if>(<#if ty
<#assign optionalField = field.asOptionalField().orElseThrow()>
# Optional Field (${optionalField.name})
- if ${helper.toSerializationExpression(optionalField, helper.boolTypeReference, optionalField.conditionExpression.get(), parserArguments)}:
<#if optionalField.type.isSimpleTypeReference()>
<#assign simpleTypeReference = optionalField.type.asSimpleTypeReference().orElseThrow()>
<#if simpleTypeReference.isVstringTypeReference()>
<#assign vstringTypeReference = simpleTypeReference.asVstringTypeReference().orElseThrow()>
- length_in_bits += ${helper.toSerializationExpression(optionalField, helper.intTypeReference, vstringTypeReference.getLengthExpression(), parserArguments)}
+ length_in_bits += ${helper.toSerializationExpression(optionalField, helper.intTypeReference, vstringTypeReference.getLengthExpression(), parserArguments)}
<#else>
- length_in_bits += ${simpleTypeReference.sizeInBits}
+ length_in_bits += ${simpleTypeReference.sizeInBits}
#if>
<#elseif helper.isEnumField(field)>
- length_in_bits += ${helper.getEnumBaseTypeReference(optionalField.type).sizeInBits}
+ length_in_bits += ${helper.getEnumBaseTypeReference(optionalField.type).sizeInBits}
<#elseif optionalField.type.isDataIoTypeReference()>
- length_in_bits += ${optionalField.type.asComplexTypeReference().orElseThrow().name}.length_in_bits(self.${helper.camelCaseToSnakeCase(optionalField.name)}<#if optionalField.type.asComplexTypeReference().orElseThrow().params?has_content>, <#list optionalField.type.asComplexTypeReference().orElseThrow().params.orElseThrow() as param>${helper.toParseExpression(optionalField, helper.anyTypeReference, param, parserArguments)}<#sep>, #sep>#list>#if>)
+ length_in_bits += ${optionalField.type.asComplexTypeReference().orElseThrow().name}.length_in_bits(self.${helper.camelCaseToSnakeCase(optionalField.name)}<#if optionalField.type.asComplexTypeReference().orElseThrow().params?has_content>, <#list optionalField.type.asComplexTypeReference().orElseThrow().params.orElseThrow() as param>${helper.toParseExpression(optionalField, helper.anyTypeReference, param, parserArguments)}<#sep>, #sep>#list>#if>)
<#else>
- length_in_bits += self.${helper.camelCaseToSnakeCase(optionalField.name)}.length_in_bits()
+ length_in_bits += self.${helper.camelCaseToSnakeCase(optionalField.name)}.length_in_bits()
#if>
<#break>
@@ -461,9 +459,8 @@ class ${type.name}<#if type.isDiscriminatedParentTypeDefinition()>#if>(<#if ty
# Padding Field (padding)
<#-- We're replacing the "lastItem" with 'false' here as the item itself can't know if it is the last -->
- int _timesPadding = int(${helper.toParseExpression(paddingField, helper.intTypeReference, paddingField.paddingCondition, parserArguments)})
- while _timesPadding-- > 0:
- length_in_bits += ${simpleTypeReference.sizeInBits}
+ _timesPadding: int = int(${helper.toSerializationExpression(paddingField, helper.intTypeReference, paddingField.paddingCondition, parserArguments)})
+ length_in_bits = ${simpleTypeReference.sizeInBits} * _timesPadding
<#break>
<#case "reserved">
@@ -623,7 +620,7 @@ class ${type.name}<#if type.isDiscriminatedParentTypeDefinition()>#if>(<#if ty
<#assign simpleTypeReference = typedField.type.asSimpleTypeReference().orElseThrow()>
${helper.camelCaseToSnakeCase(namedField.name)}: ${helper.getLanguageTypeNameForField(field)} = read_buffer.${helper.getDataReaderCall(discriminatorField.type)}(logical_name="${namedField.name}", bit_length=${simpleTypeReference.sizeInBits}${helper.getFieldOptions(typedField, parserArguments)}<#if hasParserArguments>, ${parsedList}#if>)
<#else>
- ${helper.camelCaseToSnakeCase(namedField.name)}: ${helper.getLanguageTypeNameForField(field)} = read_buffer.${helper.getDataReaderCall(discriminatorField.type)}(logical_name="${namedField.name}"${helper.getFieldOptions(typedField, parserArguments)}<#if hasParserArguments>, ${parsedList}#if>)
+ ${helper.camelCaseToSnakeCase(namedField.name)}: ${helper.getLanguageTypeNameForField(field)} = read_buffer.${helper.getDataReaderCall(discriminatorField.type)}logical_name="${namedField.name}"${helper.getFieldOptions(typedField, parserArguments)}<#if hasParserArguments>, ${parsedList}#if>)
#if>
@@ -633,7 +630,7 @@ class ${type.name}<#if type.isDiscriminatedParentTypeDefinition()>#if>(<#if ty
<#assign typedField = field.asTypedField().orElseThrow()>
<#assign namedField = field.asNamedField().orElseThrow()>
- ${helper.camelCaseToSnakeCase(namedField.name)} = read_buffer.${helper.getDataReaderCall(enumField.type)}(logical_name="${namedField.name}", readEnum(${enumField.type.asNonSimpleTypeReference().orElseThrow().typeDefinition.name}::firstEnumForField${enumField.fieldName?cap_first}, ${helper.getDataReaderCall(helper.getEnumFieldTypeReference(enumField.type, enumField.fieldName))}${helper.getFieldOptions(typedField, parserArguments)}<#if hasParserArguments>, ${parsedList}#if>)
+ ${helper.camelCaseToSnakeCase(namedField.name)} = read_buffer.${helper.getDataReaderCall(enumField.type)}logical_name="${namedField.name}"${helper.getFieldOptions(typedField, parserArguments)}<#if hasParserArguments>, ${parsedList}#if>)
<#break>
<#case "implicit">
<#assign implicitField = field.asImplicitField().orElseThrow()>
@@ -669,23 +666,28 @@ class ${type.name}<#if type.isDiscriminatedParentTypeDefinition()>#if>(<#if ty
<#assign optionalField = field.asOptionalField().orElseThrow()>
<#assign typedField = field.asTypedField().orElseThrow()>
<#assign namedField = field.asNamedField().orElseThrow()>
- ${helper.camelCaseToSnakeCase(namedField.name)}: ${helper.getLanguageTypeNameForTypeReference(optionalField.type, false)} = None
- if ${helper.toParseExpression(optionalField, helper.boolTypeReference, optionalField.conditionExpression.get(), parserArguments)}:
- ${helper.camelCaseToSnakeCase(namedField.name)} = read_buffer.${helper.getDataReaderCall(optionalField.type)}(logical_name="${namedField.name}"<#if optionalField.conditionExpression.present>#if>${helper.getFieldOptions(typedField, parserArguments)}<#if hasParserArguments>, ${parsedList}#if>)
+ ${helper.camelCaseToSnakeCase(namedField.name)}: ${helper.getLanguageTypeNameForTypeReference(optionalField.type, false)} = None
+ <#if optionalField.conditionExpression.present>
+ if ${helper.toSerializationExpression(optionalField, helper.boolTypeReference, optionalField.conditionExpression.get(), parserArguments)}:
+ ${helper.camelCaseToSnakeCase(namedField.name)} = <#if typedField.type.isEnumTypeReference()>read_buffer.${helper.getDataReaderCall(optionalField.type)}bit_length=${helper.getEnumBaseTypeReference(typedField.type).sizeInBits}, logical_name="${namedField.name}"${helper.getFieldOptions(typedField, parserArguments)}<#if hasParserArguments>, ${parsedList}#if>)<#else><#if optionalField.type.isComplexTypeReference()>read_buffer.${helper.getDataReaderCall(optionalField.type)}logical_name="${namedField.name}"${helper.getFieldOptions(typedField, parserArguments)}<#if hasParserArguments>, ${parsedList}#if>)<#else>read_buffer.${helper.getDataReaderCall(optionalField.type)}(logical_name="${namedField.name}"${helper.getFieldOptions(typedField, parserArguments)}<#if hasParserArguments>, ${parsedList}#if>) #if>#if>
+ #if>
<#break>
<#case "padding">
<#assign paddingField = field.asPaddingField().orElseThrow()>
<#assign typedField = field.asTypedField().orElseThrow()>
<#assign simpleTypeReference = paddingField.type.asSimpleTypeReference().orElseThrow()>
- read_buffer.${helper.getDataReaderCall(paddingField.type)}(int) (${helper.toParseExpression(paddingField, paddingField.type, paddingField.paddingCondition, parserArguments)})${helper.getFieldOptions(typedField, parserArguments)}<#if hasParserArguments>, ${parsedList}#if>)
+ for _ in range(${helper.toSerializationExpression(paddingField, paddingField.type, paddingField.paddingCondition, parserArguments)}):
+ read_buffer.${helper.getDataReaderCall(paddingField.type)}(${helper.getFieldOptions(typedField, parserArguments)}<#if hasParserArguments>, ${parsedList}#if>)
<#break>
<#case "reserved">
<#assign reservedField = field.asReservedField().orElseThrow()>
<#assign typedField = field.asTypedField().orElseThrow()>
- reserved_field_${reservedFieldIndex}: ${helper.getLanguageTypeNameForTypeReference(reservedField.type, false)}<#assign reservedFieldIndex=reservedFieldIndex+1> = read_buffer.${helper.getDataReaderCall(reservedField.type)}(logical_name="reserved"${helper.getReservedValue(reservedField)}${helper.getFieldOptions(typedField, parserArguments)}<#if hasParserArguments>, ${parsedList}#if>)
+ reserved_field_${reservedFieldIndex}: ${helper.getLanguageTypeNameForTypeReference(reservedField.type, false)}<#assign reservedFieldIndex=reservedFieldIndex+1> = read_buffer.${helper.getDataReaderCall(reservedField.type)}(logical_name="reserved"${helper.getFieldOptions(typedField, parserArguments)}<#if hasParserArguments>, ${parsedList}#if>)
+ if reserved_field_${reservedFieldIndex} != ${helper.getReservedValue(reservedField)}:
+ raise ParseValidationException("reserved_field_${reservedFieldIndex} != ${helper.getReservedValue(reservedField)}")
<#break>
<#case "simple">
<#assign simpleField = field.asSimpleField().orElseThrow()>
@@ -759,8 +761,9 @@ class ${type.name}<#if type.isDiscriminatedParentTypeDefinition()>#if>(<#if ty
<#break>
<#case "validation">
<#assign validationField = field.asValidationField().orElseThrow()>
+
# Validation
- if not ${helper.toParseExpression(validationField, helper.boolTypeReference, validationField.getValidationExpression(), null)}):
+ if not ${helper.toParseExpression(validationField, helper.boolTypeReference, validationField.getValidationExpression(), null)}:
<#assign errorType="ParseValidationException">
<#if !validationField.shouldFail()><#assign errorType="ParseAssertException">#if>
raise ${errorType}(${validationField.getDescription().orElse("\"Validation failed\"")})
diff --git a/code-generation/language-python/src/main/resources/templates/python/enum-template.python.ftlh b/code-generation/language-python/src/main/resources/templates/python/enum-template.python.ftlh
index a82bf2438af..f418d496834 100644
--- a/code-generation/language-python/src/main/resources/templates/python/enum-template.python.ftlh
+++ b/code-generation/language-python/src/main/resources/templates/python/enum-template.python.ftlh
@@ -83,7 +83,7 @@ class ${type.name}(AutoNumberEnum):
<#if helper.escapeValue(type.getConstantType(constantName), enumValue.getConstant(constantName).orElse(null)) == 'null'>
= None
<#elseif type.getConstantType(constantName).isEnumTypeReference()>
- = ${helper.getLanguageTypeNameForTypeReference(type.getConstantType(constantName), true)}.${helper.escapeValue(type.getConstantType(constantName), enumValue.getConstant(constantName).orElseThrow())}<#else>${helper.getLanguageTypeNameForTypeReference(type.getConstantType(constantName), true)}(${helper.escapeValue(type.getConstantType(constantName), enumValue.getConstant(constantName).orElseThrow())})#if><#else>${helper.getLanguageTypeNameForTypeReference(type.getConstantType(constantName), true)}(${helper.escapeValue(type.getConstantType(constantName), enumValue.getConstant(constantName).orElseThrow())})
+ ${helper.getLanguageTypeNameForTypeReference(type.getConstantType(constantName), true)}.${helper.escapeValue(type.getConstantType(constantName), enumValue.getConstant(constantName).orElseThrow())}<#else>${helper.getLanguageTypeNameForTypeReference(type.getConstantType(constantName), true)}(${helper.escapeValue(type.getConstantType(constantName), enumValue.getConstant(constantName).orElseThrow())})#if><#else>${helper.getLanguageTypeNameForTypeReference(type.getConstantType(constantName), true)}(${helper.escapeValue(type.getConstantType(constantName), enumValue.getConstant(constantName).orElseThrow())})
#if>
<#sep>, #sep>
#list>
diff --git a/code-generation/language-python/src/test/resources/integration-test/pom.xml b/code-generation/language-python/src/test/resources/integration-test/pom.xml
deleted file mode 100644
index 596cd238ebf..00000000000
--- a/code-generation/language-python/src/test/resources/integration-test/pom.xml
+++ /dev/null
@@ -1,119 +0,0 @@
-
-
-
- 4.0.0
-
-
- org.apache.plc4x
- plc4x-code-generation
- @project.version@
- ../../../..
-
-
- plc4py-python-mspec-test
-
- PLC4PY: Driver: Python Mspec Test
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-dependency-plugin
-
-
- org.apache.plc4x:plc4x-code-generation-language-python
- org.apache.plc4x:plc4x-code-generation-protocol-test
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-failsafe-plugin
-
-
-
- integration-test
- verify
-
-
-
-
-
-
-
-
-
-
-
-
-
- org.apache.plc4x
- plc4x-code-generation-language-python
- @project.version@
-
- provided
-
-
-
- org.apache.plc4x
- plc4x-code-generation-protocol-test
- @project.version@
-
-
-
- org.apache.plc4x
- plc4x-code-generation-protocol-test
- @project.version@
- tests
- test-jar
- test
-
-
-
-
-
-
diff --git a/code-generation/language-python/src/test/resources/integration-test/src/main/java/org/apache/plc4x/java/test/readwrite/utils/StaticHelper.java b/code-generation/language-python/src/test/resources/integration-test/src/main/java/org/apache/plc4x/java/test/readwrite/utils/StaticHelper.java
deleted file mode 100644
index cc1f621980f..00000000000
--- a/code-generation/language-python/src/test/resources/integration-test/src/main/java/org/apache/plc4x/java/test/readwrite/utils/StaticHelper.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.plc4x.java.test.readwrite.utils;
-
-import org.apache.plc4x.java.spi.generation.*;
-
-public class StaticHelper {
-
- public static boolean parseBit(ReadBuffer io) {
- throw new IllegalArgumentException("Hurz!");
- }
-
- public static void serializeBit(WriteBuffer io, boolean data) {
- }
-
- public static byte parseByte(ReadBuffer io) {
- throw new IllegalArgumentException("Hurz!");
- }
-
- public static void serializeByte(WriteBuffer io, byte data) {
- }
-
- public static byte parseInt8(ReadBuffer io) {
- throw new IllegalArgumentException("Hurz!");
- }
-
- public static void serializeInt8(WriteBuffer io, byte data) {
- }
-
- public static short parseUint8(ReadBuffer io) {
- throw new IllegalArgumentException("Hurz!");
- }
-
- public static void serializeUint8(WriteBuffer io, short data) {
- }
-
- public static float parseFloat(ReadBuffer io) {
- throw new IllegalArgumentException("Hurz!");
- }
-
- public static void serializeFloat(WriteBuffer io, float data) {
- }
-
- public static double parseDouble(ReadBuffer io) {
- throw new IllegalArgumentException("Hurz!");
- }
-
- public static void serializeDouble(WriteBuffer io, double data) {
- }
-
- public static String parseString(ReadBuffer io) {
- throw new IllegalArgumentException("Hurz!");
- }
-
- public static void serializeString(WriteBuffer io, String data) {
- }
-
- public static short readManualField(ReadBuffer io, short simpleField) {
- return 0;
- }
-
- public static void writeManualField(WriteBuffer io, short simpleFlied) {
-
- }
-
- public static short crcInt8(int num) {
- return (byte) num;
- }
-
- public static short crcUint8(int num) {
- return (short) num;
- }
-
-}
diff --git a/code-generation/language-python/src/test/resources/plc4py/plc4py/__init__.py b/code-generation/language-python/src/test/resources/plc4py/plc4py/__init__.py
new file mode 100644
index 00000000000..a67d5ea255b
--- /dev/null
+++ b/code-generation/language-python/src/test/resources/plc4py/plc4py/__init__.py
@@ -0,0 +1,16 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
diff --git a/code-generation/language-python/src/test/resources/plc4py/plc4py/protocols/__init__.py b/code-generation/language-python/src/test/resources/plc4py/plc4py/protocols/__init__.py
new file mode 100644
index 00000000000..a67d5ea255b
--- /dev/null
+++ b/code-generation/language-python/src/test/resources/plc4py/plc4py/protocols/__init__.py
@@ -0,0 +1,16 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
diff --git a/code-generation/language-python/src/test/resources/plc4py/plc4py/protocols/test/StaticHelper.py b/code-generation/language-python/src/test/resources/plc4py/plc4py/protocols/test/StaticHelper.py
new file mode 100644
index 00000000000..d0bf8a53c83
--- /dev/null
+++ b/code-generation/language-python/src/test/resources/plc4py/plc4py/protocols/test/StaticHelper.py
@@ -0,0 +1,29 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+from plc4py.spi.generation.ReadBuffer import ReadBuffer
+from plc4py.spi.generation.WriteBuffer import WriteBuffer
+
+
+def ParseBit(read_buffer: ReadBuffer) -> bool:
+ return False
+
+
+def ParseBit(write_buffer: WriteBuffer, data: bool):
+ pass
+
+
\ No newline at end of file
diff --git a/code-generation/language-python/src/test/resources/plc4py/plc4py/protocols/test/__init__.py b/code-generation/language-python/src/test/resources/plc4py/plc4py/protocols/test/__init__.py
new file mode 100644
index 00000000000..a67d5ea255b
--- /dev/null
+++ b/code-generation/language-python/src/test/resources/plc4py/plc4py/protocols/test/__init__.py
@@ -0,0 +1,16 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
diff --git a/code-generation/language-python/src/test/resources/plc4py/pom.xml b/code-generation/language-python/src/test/resources/plc4py/pom.xml
new file mode 100644
index 00000000000..059fea2df21
--- /dev/null
+++ b/code-generation/language-python/src/test/resources/plc4py/pom.xml
@@ -0,0 +1,305 @@
+
+
+
+ 4.0.0
+
+
+ org.apache.plc4x
+ plc4x-code-generation
+ @project.version@
+ ../../../..
+
+
+ plc4py-python-mspec-test
+
+ PLC4PY: Driver: Python Mspec Test
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-resources-plugin
+ 3.3.0
+
+
+ python-copy-setup
+ initialize
+
+ copy-resources
+
+
+ ./
+
+
+ .
+ ${project.basedir}/../../../../../plc4py/
+
+ setup.*
+
+ true
+
+
+ UTF-8
+
+
+
+ python-copy
+ initialize
+
+ copy-resources
+
+
+ ./plc4py
+
+
+ .
+ ${project.basedir}/../../../../../plc4py/plc4py
+ false
+
+
+ UTF-8
+
+
+
+
+
+ org.apache.plc4x.plugins
+ plc4x-maven-plugin
+ ${plc4x-code-generation.version}
+
+
+ generate-driver
+ generate-sources
+
+ generate-driver
+
+
+ test
+ python
+ read-write
+ ${project.basedir}/plc4py/protocols
+
+
+
+
+
+ org.apache.karaf.tooling
+ karaf-maven-plugin
+
+
+ generate-feature-xml
+ compile
+
+
+ features-generate-descriptor
+
+ verify
+
+
+ true
+ true
+
+
+
+ build-kar
+ package
+
+
+ kar
+
+
+
+
+
+ org.apache.felix
+ maven-bundle-plugin
+ true
+
+
+ ${project.groupId}.${project.artifactId}
+ org.apache.plc4x.java.osgi.DriverActivator
+ org.apache.plc4x.java.api.PlcDriver,org.apache.plc4x.protocol.test
+
+
+ *
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+
+
+ org.apache.plc4x:plc4x-code-generation-language-python
+ org.apache.plc4x:plc4x-code-generation-protocol-test
+
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+
+
+ python-venv
+ initialize
+
+ exec
+
+
+ ${python.exe.bin}
+
+ -m
+ venv
+ ./venv
+
+
+
+
+
+ python-upgrade-pip
+ initialize
+
+ exec
+
+
+ ${python.venv.bin}${python.exe.bin}
+
+ -m
+ pip
+ install
+ --upgrade
+ pip
+
+
+
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+
+
+ python-install
+ process-sources
+
+ exec
+
+
+ ${python.venv.bin}pip3
+
+ install
+ .
+
+
+
+
+
+ python-black
+ process-sources
+
+ exec
+
+
+ ${python.venv.bin}${python.exe.bin}
+
+ -m
+ black
+ .
+
+
+
+
+
+ python-test-compile
+ test-compile
+
+ exec
+
+
+ ${python.venv.bin}pip3
+
+ install
+ .[dev]
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-failsafe-plugin
+
+
+
+ integration-test
+ verify
+
+
+
+
+
+
+
+
+
+
+
+
+
+ org.apache.plc4x
+ plc4x-code-generation-language-python
+ @project.version@
+
+ provided
+
+
+
+ org.apache.plc4x
+ plc4x-code-generation-protocol-test
+ @project.version@
+
+
+
+ org.apache.plc4x
+ plc4x-code-generation-protocol-test
+ @project.version@
+ tests
+ test-jar
+ test
+
+
+
+
+
+