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 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>, ))) + 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>, ))) <#else> - write_buffer.${helper.getDataWriterCall(typedField.type, optionalField.name)}(self.${helper.camelCaseToSnakeCase(optionalField.name)}, logical_name="${optionalField.name}"<#if optionalField.conditionExpression.present>) + write_buffer.${helper.getDataWriterCall(typedField.type, optionalField.name)}(self.${helper.camelCaseToSnakeCase(optionalField.name)}, logical_name="${optionalField.name}"<#if optionalField.conditionExpression.present>) <#break> <#case "padding"> @@ -402,9 +401,9 @@ class ${type.name}<#if type.isDiscriminatedParentTypeDefinition()>(<#if ty length_in_bits += ${simpleTypeReference.sizeInBits} <#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() <#break> <#case "enum"> @@ -437,21 +436,20 @@ class ${type.name}<#if type.isDiscriminatedParentTypeDefinition()>(<#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} <#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>, ) + 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>, ) <#else> - length_in_bits += self.${helper.camelCaseToSnakeCase(optionalField.name)}.length_in_bits() + length_in_bits += self.${helper.camelCaseToSnakeCase(optionalField.name)}.length_in_bits() <#break> @@ -461,9 +459,8 @@ class ${type.name}<#if type.isDiscriminatedParentTypeDefinition()>(<#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 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}) <#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}) + ${helper.camelCaseToSnakeCase(namedField.name)}: ${helper.getLanguageTypeNameForField(field)} = read_buffer.${helper.getDataReaderCall(discriminatorField.type)}logical_name="${namedField.name}"${helper.getFieldOptions(typedField, parserArguments)}<#if hasParserArguments>, ${parsedList}) @@ -633,7 +630,7 @@ class ${type.name}<#if type.isDiscriminatedParentTypeDefinition()>(<#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}) + ${helper.camelCaseToSnakeCase(namedField.name)} = read_buffer.${helper.getDataReaderCall(enumField.type)}logical_name="${namedField.name}"${helper.getFieldOptions(typedField, parserArguments)}<#if hasParserArguments>, ${parsedList}) <#break> <#case "implicit"> <#assign implicitField = field.asImplicitField().orElseThrow()> @@ -669,23 +666,28 @@ class ${type.name}<#if type.isDiscriminatedParentTypeDefinition()>(<#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>${helper.getFieldOptions(typedField, parserArguments)}<#if hasParserArguments>, ${parsedList}) + ${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})<#else><#if optionalField.type.isComplexTypeReference()>read_buffer.${helper.getDataReaderCall(optionalField.type)}logical_name="${namedField.name}"${helper.getFieldOptions(typedField, parserArguments)}<#if hasParserArguments>, ${parsedList})<#else>read_buffer.${helper.getDataReaderCall(optionalField.type)}(logical_name="${namedField.name}"${helper.getFieldOptions(typedField, parserArguments)}<#if hasParserArguments>, ${parsedList}) + <#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}) + for _ in range(${helper.toSerializationExpression(paddingField, paddingField.type, paddingField.paddingCondition, parserArguments)}): + read_buffer.${helper.getDataReaderCall(paddingField.type)}(${helper.getFieldOptions(typedField, parserArguments)}<#if hasParserArguments>, ${parsedList}) <#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}) + 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 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 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"> 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())})<#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())})<#else>${helper.getLanguageTypeNameForTypeReference(type.getConstantType(constantName), true)}(${helper.escapeValue(type.getConstantType(constantName), enumValue.getConstant(constantName).orElseThrow())}) <#sep>, 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 + + + + + +