From: Henryk Plötz Date: Sat, 8 Sep 2018 19:32:08 +0000 (+0200) Subject: Fully solve dependencies, I think. Run isort, cleanup imports X-Git-Tag: v2.0.0~1^2~48 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bb8baeb43cdd4d31e394b0fbf5506fe3b4b7d6ec;p=thirdparty%2Fpython-fints.git Fully solve dependencies, I think. Run isort, cleanup imports --- diff --git a/fints/client.py b/fints/client.py index 501e602..9b41fca 100644 --- a/fints/client.py +++ b/fints/client.py @@ -1,46 +1,45 @@ import datetime import logging -import re -import bleach -from enum import Enum -from decimal import Decimal -from contextlib import contextmanager from collections import OrderedDict +from contextlib import contextmanager +from decimal import Decimal +from enum import Enum -from mt940.models import Balance +import bleach from sepaxml import SepaTransfer from .connection import FinTSHTTPSConnection from .dialog import FinTSDialog +from .exceptions import * from .formals import ( - KTI1, Account3, BankIdentifier, - SynchronisationMode, TwoStepParametersCommon, - TANMediaType2, TANMediaClass4, CUSTOMER_ID_ANONYMOUS, - DescriptionRequired, + CUSTOMER_ID_ANONYMOUS, KTI1, BankIdentifier, DescriptionRequired, + SynchronisationMode, TANMediaClass4, TANMediaType2, ) from .message import FinTSInstituteMessage -from .models import ( - SEPAAccount, TANChallenge, TANChallenge3, - TANChallenge4, TANChallenge5, TANChallenge6, -) +from .models import SEPAAccount +from .parser import FinTS3Serializer from .security import ( PinTanDummyEncryptionMechanism, PinTanOneStepAuthenticationMechanism, PinTanTwoStepAuthenticationMechanism, ) -from .segments.bank import HIBPA3, HIUPA4, HKKOM4 from .segments.accounts import HISPA1, HKSPA1 -from .segments.auth import HKTAB4, HKTAB5, HKTAN3, HKTAN5, HIPINS1 +from .segments.auth import HIPINS1, HKTAB4, HKTAB5, HKTAN3, HKTAN5 +from .segments.bank import HIBPA3, HIUPA4, HKKOM4 +from .segments.debit import ( + HKDBS1, HKDBS2, HKDMB1, HKDMC1, HKDME1, HKDME2, + HKDSC1, HKDSE1, HKDSE2, DebitResponseBase, +) from .segments.depot import HKWPD5, HKWPD6 -from .segments.dialog import HISYN4, HKSYN3, HIRMG2, HIRMS2 -from .segments.debit import HKDSE1, HKDSE2, HKDME1, HKDME2, HKDSC1, HKDMC1, HKDBS1, HKDBS2, HKDMB1, DebitResponseBase +from .segments.dialog import HIRMG2, HIRMS2, HISYN4, HKSYN3 +from .segments.journal import HKPRO3, HKPRO4 from .segments.saldo import HKSAL5, HKSAL6, HKSAL7 -from .segments.statement import HKKAZ5, HKKAZ6, HKKAZ7, DKKKU2 +from .segments.statement import DKKKU2, HKKAZ5, HKKAZ6, HKKAZ7 from .segments.transfer import HKCCM1, HKCCS1 -from .segments.journal import HKPRO3, HKPRO4 from .types import SegmentSequence -from .utils import MT535_Miniparser, Password, mt940_to_array, compress_datablob, decompress_datablob, SubclassesMixin -from .parser import FinTS3Serializer -from .exceptions import * +from .utils import ( + MT535_Miniparser, Password, SubclassesMixin, + compress_datablob, decompress_datablob, mt940_to_array, +) logger = logging.getLogger(__name__) @@ -1121,4 +1120,3 @@ class FinTS3PinTanClient(FinTS3Client): 'tan_mechanisms': self.get_tan_mechanisms(), } return retval - diff --git a/fints/connection.py b/fints/connection.py index 23349fa..8b624c2 100644 --- a/fints/connection.py +++ b/fints/connection.py @@ -1,13 +1,12 @@ import base64 -import logging import io +import logging import requests -from fints.parser import FinTS3Parser from fints.utils import Password -from .message import FinTSInstituteMessage, FinTSMessage from .exceptions import * +from .message import FinTSInstituteMessage, FinTSMessage logger = logging.getLogger(__name__) diff --git a/fints/dialog.py b/fints/dialog.py index 163d74b..4cc317d 100644 --- a/fints/dialog.py +++ b/fints/dialog.py @@ -1,19 +1,15 @@ +import io import logging import pickle -import io -from .formals import ( - BankIdentifier, Language2, SynchronisationMode, SystemIDStatus, CUSTOMER_ID_ANONYMOUS, -) -from .message import ( - FinTSCustomerMessage, FinTSMessage, MessageDirection, -) +from .connection import FinTSConnectionError +from .exceptions import * +from .formals import CUSTOMER_ID_ANONYMOUS, Language2, SystemIDStatus +from .message import FinTSCustomerMessage, MessageDirection from .segments.auth import HKIDN2, HKVVB3 from .segments.dialog import HKEND1 from .segments.message import HNHBK3, HNHBS1 from .utils import compress_datablob, decompress_datablob -from .connection import FinTSConnectionError -from .exceptions import * logger = logging.getLogger(__name__) diff --git a/fints/exceptions.py b/fints/exceptions.py index 3fb5e0a..c34c3ff 100644 --- a/fints/exceptions.py +++ b/fints/exceptions.py @@ -18,4 +18,3 @@ class FinTSDialogInitError(FinTSDialogError): class FinTSConnectionError(FinTSError): pass - diff --git a/fints/fields.py b/fints/fields.py index 295f4a7..4bf3c00 100644 --- a/fints/fields.py +++ b/fints/fields.py @@ -2,12 +2,9 @@ import datetime import re import warnings -from fints.types import ( - Field, TypedField, SegmentSequence -) +from fints.types import Container, SegmentSequence, TypedField from fints.utils import ( - DocTypeMixin, FieldRenderFormatStringMixin, - FixedLengthMixin, Password + DocTypeMixin, FieldRenderFormatStringMixin, FixedLengthMixin, Password, ) @@ -50,7 +47,7 @@ class GenericGroupField(DataElementGroupField): def _default_value(self): if self.type is None: - return fints.types.Container() + return Container() else: return self.type() diff --git a/fints/formals.py b/fints/formals.py index 2c0ade7..b13b5be 100644 --- a/fints/formals.py +++ b/fints/formals.py @@ -1,7 +1,7 @@ import re -from fints.types import * # The order is important! from fints.fields import * +from fints.types import * from fints.utils import RepresentableEnum, ShortReprMixin CUSTOMER_ID_ANONYMOUS = '9999999999' diff --git a/fints/message.py b/fints/message.py index 30d66d8..adced11 100644 --- a/fints/message.py +++ b/fints/message.py @@ -1,12 +1,8 @@ -import random from enum import Enum from .formals import SegmentSequence -from .segments._base import FinTS3Segment -from .segments.auth import HITANSBase -from .segments.bank import HIBPA3 -from .segments.dialog import HIRMG2, HIRMS2 -from .segments.message import HNHBK3, HNHBS1 +from .segments.base import FinTS3Segment +from .segments.dialog import HIRMS2 class MessageDirection(Enum): diff --git a/fints/parser.py b/fints/parser.py index 6a2a218..88eaef4 100644 --- a/fints/parser.py +++ b/fints/parser.py @@ -6,7 +6,12 @@ from enum import Enum from .formals import ( Container, DataElementGroupField, SegmentSequence, ValueList, ) -from .segments._base import FinTS3Segment +# Ensure that all segment types are loaded (otherwise the subclass find won't see them) +from .segments import ( # noqa + accounts, auth, bank, base, debit, depot, dialog, + journal, message, saldo, statement, transfer, +) +from .segments.base import FinTS3Segment # # FinTS 3.0 structure: diff --git a/fints/segments/_base.py b/fints/segments/_base.py deleted file mode 100644 index 7680f89..0000000 --- a/fints/segments/_base.py +++ /dev/null @@ -1,69 +0,0 @@ -import re - -from fints.fields import DataElementField, DataElementGroupField, IntCodeField -from fints.types import Container, ContainerMeta -from fints.formals import SegmentHeader, SecurityClass -from fints.utils import SubclassesMixin, classproperty - -TYPE_VERSION_RE = re.compile(r'^([A-Z]+)(\d+)$') - -class FinTS3SegmentMeta(ContainerMeta): - @staticmethod - def _check_fields_recursive(instance): - for name, field in instance._fields.items(): - if not isinstance(field, (DataElementField, DataElementGroupField)): - raise TypeError("{}={!r} is not DataElementField or DataElementGroupField".format(name, field)) - if isinstance(field, DataElementGroupField): - FinTS3SegmentMeta._check_fields_recursive(field.type) - - def __new__(cls, name, bases, classdict): - retval = super().__new__(cls, name, bases, classdict) - FinTS3SegmentMeta._check_fields_recursive(retval) - return retval - -class FinTS3Segment(Container, SubclassesMixin, metaclass=FinTS3SegmentMeta): - header = DataElementGroupField(type=SegmentHeader, _d="Segmentkopf") - - @classproperty - def TYPE(cls): - match = TYPE_VERSION_RE.match(cls.__name__) - if match: - return match.group(1) - - @classproperty - def VERSION(cls): - match = TYPE_VERSION_RE.match(cls.__name__) - if match: - return int( match.group(2) ) - - def __init__(self, *args, **kwargs): - if 'header' not in kwargs: - kwargs['header'] = SegmentHeader(self.TYPE, None, self.VERSION) - - args = (kwargs.pop('header'), ) + args - - return super().__init__(*args, **kwargs) - - @classmethod - def find_subclass(cls, segment): - h = SegmentHeader.naive_parse(segment[0]) - target_cls = None - - for possible_cls in cls._all_subclasses(): - if getattr(possible_cls, 'TYPE', None) == h.type and getattr(possible_cls, 'VERSION', None) == h.version: - target_cls = possible_cls - - if not target_cls: - target_cls = cls - - return target_cls - - -class ParameterSegment_22(FinTS3Segment): - max_number_tasks = DataElementField(type='num', max_length=3, _d="Maximale Anzahl Aufträge") - min_number_signatures = DataElementField(type='num', length=1, _d="Anzahl Signaturen mindestens") - -class ParameterSegment(FinTS3Segment): - max_number_tasks = DataElementField(type='num', max_length=3, _d="Maximale Anzahl Aufträge") - min_number_signatures = DataElementField(type='num', length=1, _d="Anzahl Signaturen mindestens") - security_class = IntCodeField(SecurityClass, length=1, _d="Sicherheitsklasse") diff --git a/fints/segments/accounts.py b/fints/segments/accounts.py index 677c73e..3a8cc8e 100644 --- a/fints/segments/accounts.py +++ b/fints/segments/accounts.py @@ -1,6 +1,7 @@ -from ._base import FinTS3Segment, ParameterSegment from ..fields import DataElementGroupField from ..formals import KTZ1, Account3, GetSEPAAccountParameter1 +from .base import FinTS3Segment, ParameterSegment + class HKSPA1(FinTS3Segment): """SEPA-Kontoverbindung anfordern, version 1 diff --git a/fints/segments/auth.py b/fints/segments/auth.py index 0613107..5ca7a8f 100644 --- a/fints/segments/auth.py +++ b/fints/segments/auth.py @@ -1,13 +1,14 @@ from fints.fields import CodeField, DataElementField, DataElementGroupField from fints.formals import ( - BankIdentifier, Language2, SynchronisationMode, SystemIDStatus, - TANMediaType2, TANMediaClass4, TANMedia5, TANMediaClass3, TANMedia4, TANUsageOption, - KTI1, ParameterChallengeClass, ResponseHHDUC, ChallengeValidUntil, - ParameterTwostepTAN1, ParameterTwostepTAN2, ParameterTwostepTAN3, ParameterTwostepTAN4, - ParameterTwostepTAN5, ParameterTwostepTAN6, ParameterPinTan, SupportedLanguages2, - SupportedHBCIVersions2 + KTI1, BankIdentifier, ChallengeValidUntil, Language2, + ParameterChallengeClass, ParameterPinTan, ParameterTwostepTAN1, + ParameterTwostepTAN2, ParameterTwostepTAN3, ParameterTwostepTAN4, + ParameterTwostepTAN5, ParameterTwostepTAN6, ResponseHHDUC, + SystemIDStatus, TANMedia4, TANMedia5, TANMediaClass3, + TANMediaClass4, TANMediaType2, TANUsageOption, ) -from ._base import FinTS3Segment, ParameterSegment + +from .base import FinTS3Segment, ParameterSegment class HKIDN2(FinTS3Segment): @@ -180,5 +181,3 @@ class HIPINS1(ParameterSegment): Source: FinTS Financial Transaction Services, Schnittstellenspezifikation, Sicherheitsverfahren PIN/TAN """ parameter = DataElementGroupField(type=ParameterPinTan, _d="Parameter PIN/TAN-spezifische Informationen") - - diff --git a/fints/segments/bank.py b/fints/segments/bank.py index 645b8f9..812ff3b 100644 --- a/fints/segments/bank.py +++ b/fints/segments/bank.py @@ -1,6 +1,12 @@ -from ._base import FinTS3Segment -from fints.fields import DataElementField, CodeField, DataElementGroupField -from fints.formals import UPDUsage, AccountInformation, AccountLimit, AllowedTransaction, BankIdentifier, Language2, CommunicationParameter2, SupportedLanguages2, SupportedHBCIVersions2 +from fints.fields import CodeField, DataElementField, DataElementGroupField +from fints.formals import ( + AccountInformation, AccountLimit, AllowedTransaction, + BankIdentifier, CommunicationParameter2, Language2, + SupportedHBCIVersions2, SupportedLanguages2, UPDUsage, +) + +from .base import FinTS3Segment + class HIBPA3(FinTS3Segment): """Bankparameter allgemein, version 3 diff --git a/fints/segments/debit.py b/fints/segments/debit.py index 33673de..9d64d8b 100644 --- a/fints/segments/debit.py +++ b/fints/segments/debit.py @@ -1,7 +1,14 @@ -from ._base import FinTS3Segment, ParameterSegment -from ..models import SEPAAccount -from ..fields import DataElementField, DataElementGroupField, CodeField -from ..formals import ScheduledCOR1DebitParameter1, ScheduledCOR1BatchDebitParameter1, KTI1, Amount1, ScheduledBatchDebitParameter1, ScheduledBatchDebitParameter2, ScheduledDebitParameter1, ScheduledDebitParameter2, SupportedSEPAPainMessages1, QueryScheduledDebitParameter1, QueryScheduledDebitParameter2, SEPACCode1, StatusSEPATask1, QueryScheduledBatchDebitParameter1 +from ..fields import CodeField, DataElementField, DataElementGroupField +from ..formals import ( + KTI1, Amount1, QueryScheduledBatchDebitParameter1, + QueryScheduledDebitParameter1, QueryScheduledDebitParameter2, + ScheduledBatchDebitParameter1, ScheduledBatchDebitParameter2, + ScheduledCOR1BatchDebitParameter1, ScheduledCOR1DebitParameter1, + ScheduledDebitParameter1, ScheduledDebitParameter2, SEPACCode1, + StatusSEPATask1, SupportedSEPAPainMessages1, +) +from .base import FinTS3Segment, ParameterSegment + class BatchDebitBase(FinTS3Segment): account = DataElementGroupField(type=KTI1, _d="Kontoverbindung international") @@ -233,6 +240,3 @@ class HIDMBS1(ParameterSegment): Source: FinTS Financial Transaction Services, Schnittstellenspezifikation, Messages -- Multibankfähige Geschäftsvorfälle """ parameter = DataElementGroupField(type=QueryScheduledBatchDebitParameter1, _d="Parameter Bestand terminierter SEPA-Sammellastschriften") - - - diff --git a/fints/segments/depot.py b/fints/segments/depot.py index 9bd781c..94bd4de 100644 --- a/fints/segments/depot.py +++ b/fints/segments/depot.py @@ -1,7 +1,7 @@ from fints.fields import DataElementField, DataElementGroupField from fints.formals import Account2, Account3 -from ._base import FinTS3Segment +from .base import FinTS3Segment class HKWPD5(FinTS3Segment): diff --git a/fints/segments/dialog.py b/fints/segments/dialog.py index 5773eee..0e34f3d 100644 --- a/fints/segments/dialog.py +++ b/fints/segments/dialog.py @@ -1,6 +1,6 @@ -from ._base import FinTS3Segment from ..fields import CodeField, DataElementField, DataElementGroupField -from ..formals import SynchronisationMode, Response +from ..formals import Response, SynchronisationMode +from .base import FinTS3Segment class HKSYN3(FinTS3Segment): @@ -29,4 +29,3 @@ class HIRMG2(FinTS3Segment): class HIRMS2(FinTS3Segment): "Rückmeldungen zu Segmenten" responses = DataElementGroupField(type=Response, min_count=1, max_count=99, _d="Rückmeldung") - diff --git a/fints/segments/journal.py b/fints/segments/journal.py index 25a9b77..83252de 100644 --- a/fints/segments/journal.py +++ b/fints/segments/journal.py @@ -1,9 +1,8 @@ from fints.fields import DataElementField, DataElementGroupField -from fints.formals import ( - ReferenceMessage, Response -) +from fints.formals import ReferenceMessage, Response + +from .base import FinTS3Segment, ParameterSegment, ParameterSegment_22 -from ._base import FinTS3Segment, ParameterSegment, ParameterSegment_22 class HKPRO3(FinTS3Segment): """Statusprotokoll anfordern, version 3 diff --git a/fints/segments/message.py b/fints/segments/message.py index 93d1f5b..fc7fc68 100644 --- a/fints/segments/message.py +++ b/fints/segments/message.py @@ -1,5 +1,3 @@ -import time - from fints.fields import ( CodeField, DataElementField, DataElementGroupField, SegmentSequenceField, ZeroPaddedNumericField, @@ -10,7 +8,8 @@ from fints.formals import ( SecurityDateTime, SecurityIdentificationDetails, SecurityProfile, SecurityRole, SignatureAlgorithm, UserDefinedSignature, ) -from ._base import FinTS3Segment + +from .base import FinTS3Segment class HNHBK3(FinTS3Segment): diff --git a/fints/segments/saldo.py b/fints/segments/saldo.py index 5f35a79..e94ccb5 100644 --- a/fints/segments/saldo.py +++ b/fints/segments/saldo.py @@ -3,7 +3,7 @@ from fints.formals import ( KTI1, Account2, Account3, Amount1, Balance1, Balance2, Timestamp1, ) -from ._base import FinTS3Segment +from .base import FinTS3Segment class HKSAL5(FinTS3Segment): diff --git a/fints/segments/statement.py b/fints/segments/statement.py index b3c6194..c479a04 100644 --- a/fints/segments/statement.py +++ b/fints/segments/statement.py @@ -1,10 +1,7 @@ from fints.fields import DataElementField, DataElementGroupField -from fints.formals import ( - KTI1, Account3, Account2, QueryCreditCardStatements2 -) - -from ._base import FinTS3Segment, ParameterSegment +from fints.formals import KTI1, Account2, Account3, QueryCreditCardStatements2 +from .base import FinTS3Segment, ParameterSegment class HKKAZ5(FinTS3Segment): diff --git a/fints/segments/transfer.py b/fints/segments/transfer.py index 515cf68..3bc6e3f 100644 --- a/fints/segments/transfer.py +++ b/fints/segments/transfer.py @@ -1,10 +1,7 @@ -from fints.fields import CodeField, DataElementField, DataElementGroupField -from fints.formals import ( - KTI1, Amount1, BatchTransferParameter1 -) +from fints.fields import DataElementField, DataElementGroupField +from fints.formals import KTI1, Amount1, BatchTransferParameter1 -from ._base import FinTS3Segment, ParameterSegment -from ..models import SEPAAccount +from .base import FinTS3Segment, ParameterSegment class HKCCS1(FinTS3Segment): diff --git a/fints/types.py b/fints/types.py index c623125..a49fb5b 100644 --- a/fints/types.py +++ b/fints/types.py @@ -1,8 +1,9 @@ -from contextlib import suppress from collections import Iterable, OrderedDict +from contextlib import suppress from .utils import SubclassesMixin + class Field: def __init__(self, length=None, min_length=None, max_length=None, count=None, min_count=None, max_count=None, required=True, _d=None): if length is not None and (min_length is not None or max_length is not None): diff --git a/fints/utils.py b/fints/utils.py index 4d6b35b..d408c07 100644 --- a/fints/utils.py +++ b/fints/utils.py @@ -1,7 +1,7 @@ -import inspect -import re import base64 +import inspect import json +import re import zlib from contextlib import contextmanager from datetime import datetime diff --git a/tests/conftest.py b/tests/conftest.py index 31457b4..c939e61 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -2,7 +2,6 @@ import glob import os.path import fints.parser -import pytest TEST_MESSAGES = { os.path.basename(f).rsplit('.')[0]: open(f, 'rb').read() for f in diff --git a/tests/test_formals.py b/tests/test_formals.py index 1914ec2..6292b54 100644 --- a/tests/test_formals.py +++ b/tests/test_formals.py @@ -1,6 +1,6 @@ import pytest from fints.formals import ( - AlphanumericField, Container, ContainerField, DataElementField, + Container, ContainerField, DataElementField, DataElementGroupField, DigitsField, Field, GenericGroupField, NumericField, SegmentHeader, SegmentSequence, ) diff --git a/tests/test_message_parser.py b/tests/test_message_parser.py index 89a5f6d..7cb9979 100644 --- a/tests/test_message_parser.py +++ b/tests/test_message_parser.py @@ -2,7 +2,7 @@ import pytest from conftest import TEST_MESSAGES from fints.formals import SegmentSequence from fints.parser import FinTS3Parser, FinTSParserError, FinTSParserWarning -from fints.segments import FinTS3Segment +from fints.segments.base import FinTS3Segment @pytest.mark.parametrize("input_name", TEST_MESSAGES.keys()) @@ -25,7 +25,7 @@ def test_parse_other(input_name): m.print_nested() def test_parse_counted(): - from fints.segments import FinTS3Segment + from fints.segments.base import FinTS3Segment from fints.formals import NumericField, Container, ContainerField class ITST1(FinTS3Segment): diff --git a/tests/test_message_serializer.py b/tests/test_message_serializer.py index 8283eba..e51c71f 100644 --- a/tests/test_message_serializer.py +++ b/tests/test_message_serializer.py @@ -2,7 +2,7 @@ import pytest from conftest import TEST_MESSAGES from fints.formals import NumericField from fints.parser import FinTS3Parser, FinTS3Serializer -from fints.segments import FinTS3Segment +from fints.segments.base import FinTS3Segment def test_serialize_1(): @@ -63,7 +63,7 @@ def test_escape(): def test_serialize_2(): from fints.formals import SegmentSequence import fints.formals, fints.segments - s = SegmentSequence([fints.segments.message.HNHBK3(header=fints.formals.SegmentHeader('HNHBK', 1, 3), message_size='000000000428', hbci_version=300, dialogue_id='430711670077=043999659571CN9D=', message_number=2, reference_message=fints.formals.ReferenceMessage(dialogue_id='430711670077=043999659571CN9D=', message_number=2)), fints.segments.message.HNVSK3(header=fints.formals.SegmentHeader('HNVSK', 998, 3), security_profile=fints.formals.SecurityProfile(security_method='PIN', security_method_version=1), security_function='998', security_role='1', security_identification_details=fints.formals.SecurityIdentificationDetails(identified_role='2', cid=None, identifier='oIm3BlHv6mQBAADYgbPpp+kWrAQA'), security_datetime=fints.formals.SecurityDateTime(date_time_type='1'), encryption_algorithm=fints.formals.EncryptionAlgorithm(usage_encryption='2', operation_mode='2', encryption_algorithm='13', algorithm_parameter_value=b'00000000', algorithm_parameter_name='5', algorithm_parameter_iv_name='1'), key_name=fints.formals.KeyName(bank_identifier=fints.formals.BankIdentifier(country_identifier='280', bank_code='15050500'), user_id='hermes', key_type='S', key_number=0, key_version=0), compression_function='0'), fints.segments.message.HNVSD1(header=fints.formals.SegmentHeader('HNVSD', 999, 1), data=SegmentSequence([fints.segments.message.HNSHK4(header=fints.formals.SegmentHeader('HNSHK', 2, 4), security_profile=fints.formals.SecurityProfile(security_method='PIN', security_method_version=1), security_function='999', security_reference='9166926', security_application_area='1', security_role='1', security_identification_details=fints.formals.SecurityIdentificationDetails(identified_role='2', cid=None, identifier='oIm3BlHv6mQBAADYgbPpp+kWrAQA'), security_reference_number=1, security_datetime=fints.formals.SecurityDateTime(date_time_type='1'), hash_algorithm=fints.formals.HashAlgorithm(usage_hash='1', hash_algorithm='999', algorithm_parameter_name='1'), signature_algorithm=fints.formals.SignatureAlgorithm(usage_signature='6', signature_algorithm='10', operation_mode='16'), key_name=fints.formals.KeyName(bank_identifier=fints.formals.BankIdentifier(country_identifier='280', bank_code='15050500'), user_id='hermes', key_type='S', key_number=0, key_version=0)), fints.segments.HIRMG2(header=fints.formals.SegmentHeader('HIRMG', 3, 2), responses=[fints.formals.Response(code='0010', reference_element=None, text='Nachricht entgegengenommen.'), fints.formals.Response(code='0100', reference_element=None, text='Dialog beendet.')]), fints.segments.message.HNSHA2(header=fints.formals.SegmentHeader('HNSHA', 4, 2), security_reference='9166926')])), fints.segments.message.HNHBS1(header=fints.formals.SegmentHeader('HNHBS', 5, 1), message_number=2)]) + s = SegmentSequence([fints.segments.message.HNHBK3(header=fints.formals.SegmentHeader('HNHBK', 1, 3), message_size='000000000428', hbci_version=300, dialogue_id='430711670077=043999659571CN9D=', message_number=2, reference_message=fints.formals.ReferenceMessage(dialogue_id='430711670077=043999659571CN9D=', message_number=2)), fints.segments.message.HNVSK3(header=fints.formals.SegmentHeader('HNVSK', 998, 3), security_profile=fints.formals.SecurityProfile(security_method='PIN', security_method_version=1), security_function='998', security_role='1', security_identification_details=fints.formals.SecurityIdentificationDetails(identified_role='2', cid=None, identifier='oIm3BlHv6mQBAADYgbPpp+kWrAQA'), security_datetime=fints.formals.SecurityDateTime(date_time_type='1'), encryption_algorithm=fints.formals.EncryptionAlgorithm(usage_encryption='2', operation_mode='2', encryption_algorithm='13', algorithm_parameter_value=b'00000000', algorithm_parameter_name='5', algorithm_parameter_iv_name='1'), key_name=fints.formals.KeyName(bank_identifier=fints.formals.BankIdentifier(country_identifier='280', bank_code='15050500'), user_id='hermes', key_type='S', key_number=0, key_version=0), compression_function='0'), fints.segments.message.HNVSD1(header=fints.formals.SegmentHeader('HNVSD', 999, 1), data=SegmentSequence([fints.segments.message.HNSHK4(header=fints.formals.SegmentHeader('HNSHK', 2, 4), security_profile=fints.formals.SecurityProfile(security_method='PIN', security_method_version=1), security_function='999', security_reference='9166926', security_application_area='1', security_role='1', security_identification_details=fints.formals.SecurityIdentificationDetails(identified_role='2', cid=None, identifier='oIm3BlHv6mQBAADYgbPpp+kWrAQA'), security_reference_number=1, security_datetime=fints.formals.SecurityDateTime(date_time_type='1'), hash_algorithm=fints.formals.HashAlgorithm(usage_hash='1', hash_algorithm='999', algorithm_parameter_name='1'), signature_algorithm=fints.formals.SignatureAlgorithm(usage_signature='6', signature_algorithm='10', operation_mode='16'), key_name=fints.formals.KeyName(bank_identifier=fints.formals.BankIdentifier(country_identifier='280', bank_code='15050500'), user_id='hermes', key_type='S', key_number=0, key_version=0)), fints.segments.dialog.HIRMG2(header=fints.formals.SegmentHeader('HIRMG', 3, 2), responses=[fints.formals.Response(code='0010', reference_element=None, text='Nachricht entgegengenommen.'), fints.formals.Response(code='0100', reference_element=None, text='Dialog beendet.')]), fints.segments.message.HNSHA2(header=fints.formals.SegmentHeader('HNSHA', 4, 2), security_reference='9166926')])), fints.segments.message.HNHBS1(header=fints.formals.SegmentHeader('HNHBS', 5, 1), message_number=2)]) assert FinTS3Serializer().serialize_message(s) == TEST_MESSAGES['basic_simple'] diff --git a/tests/test_models.py b/tests/test_models.py index 6520026..05e4d39 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -5,7 +5,7 @@ from fints.formals import ( AlphanumericField, DataElementField, GenericField, NumericField, SegmentHeader, SegmentSequence, ) -from fints.segments import FinTS3Segment +from fints.segments.base import FinTS3Segment from fints.segments.message import HNHBK3, HNHBS1 @@ -16,7 +16,7 @@ def test_metaclass_foo(): assert a._fields['header'] def test_fints3_only_de_and_deg(): - from fints.formals import Field, Container, DataElementGroupField, ContainerField + from fints.formals import Field, Container, DataElementGroupField with pytest.raises(TypeError, match="b=.* is not DataElementField or DataElementGroupField"): class Foo(FinTS3Segment): @@ -120,7 +120,7 @@ def test_find_subclass(): def test_nested_output_evalable(): import fints.segments, fints.formals - a = SegmentSequence([fints.segments.message.HNHBK3(header=fints.formals.SegmentHeader('HNHBK', 1, 3, None), message_size='000000000428', hbci_version=300, dialogue_id='430711670077=043999659571CN9D=', message_number=2, reference_message=fints.formals.ReferenceMessage(dialogue_id='430711670077=043999659571CN9D=', message_number=2)), fints.segments.message.HNVSK3(header=fints.formals.SegmentHeader('HNVSK', 998, 3, None), security_profile=fints.formals.SecurityProfile(security_method='PIN', security_method_version=1), security_function='998', security_role='1', security_identification_details=fints.formals.SecurityIdentificationDetails(identified_role='2', cid=None, identifier='oIm3BlHv6mQBAADYgbPpp+kWrAQA'), security_datetime=fints.formals.SecurityDateTime(date_time_type='1', date=None, time=None), encryption_algorithm=fints.formals.EncryptionAlgorithm(usage_encryption='2', operation_mode='2', encryption_algorithm='13', algorithm_parameter_value=b'00000000', algorithm_parameter_name='5', algorithm_parameter_iv_name='1', algorithm_parameter_iv_value=None), key_name=fints.formals.KeyName(bank_identifier=fints.formals.BankIdentifier(country_identifier='280', bank_code='15050500'), user_id='hermes', key_type='S', key_number=0, key_version=0), compression_function='0', certificate=fints.formals.Certificate(certificate_type=None, certificate_content=None)), fints.segments.message.HNVSD1(header=fints.formals.SegmentHeader('HNVSD', 999, 1, None), data=SegmentSequence([fints.segments.message.HNSHK4(header=fints.formals.SegmentHeader('HNSHK', 2, 4, None), security_profile=fints.formals.SecurityProfile(security_method='PIN', security_method_version=1), security_function='999', security_reference='9166926', security_application_area='1', security_role='1', security_identification_details=fints.formals.SecurityIdentificationDetails(identified_role='2', cid=None, identifier='oIm3BlHv6mQBAADYgbPpp+kWrAQA'), security_reference_number=1, security_datetime=fints.formals.SecurityDateTime(date_time_type='1', date=None, time=None), hash_algorithm=fints.formals.HashAlgorithm(usage_hash='1', hash_algorithm='999', algorithm_parameter_name='1', algorithm_parameter_value=None), signature_algorithm=fints.formals.SignatureAlgorithm(usage_signature='6', signature_algorithm='10', operation_mode='16'), key_name=fints.formals.KeyName(bank_identifier=fints.formals.BankIdentifier(country_identifier='280', bank_code='15050500'), user_id='hermes', key_type='S', key_number=0, key_version=0), certificate=fints.formals.Certificate(certificate_type=None, certificate_content=None)), fints.segments.FinTS3Segment(header=fints.formals.SegmentHeader('HIRMG', 3, 2, None), _additional_data=[['0010', None, 'Nachricht entgegengenommen.'], ['0100', None, 'Dialog beendet.']]), fints.segments.FinTS3Segment(header=fints.formals.SegmentHeader('HNSHA', 4, 2, None), _additional_data=['9166926'])])), fints.segments.message.HNHBS1(header=fints.formals.SegmentHeader('HNHBS', 5, 1, None), message_number=2)]) + a = SegmentSequence([fints.segments.message.HNHBK3(header=fints.formals.SegmentHeader('HNHBK', 1, 3, None), message_size='000000000428', hbci_version=300, dialogue_id='430711670077=043999659571CN9D=', message_number=2, reference_message=fints.formals.ReferenceMessage(dialogue_id='430711670077=043999659571CN9D=', message_number=2)), fints.segments.message.HNVSK3(header=fints.formals.SegmentHeader('HNVSK', 998, 3, None), security_profile=fints.formals.SecurityProfile(security_method='PIN', security_method_version=1), security_function='998', security_role='1', security_identification_details=fints.formals.SecurityIdentificationDetails(identified_role='2', cid=None, identifier='oIm3BlHv6mQBAADYgbPpp+kWrAQA'), security_datetime=fints.formals.SecurityDateTime(date_time_type='1', date=None, time=None), encryption_algorithm=fints.formals.EncryptionAlgorithm(usage_encryption='2', operation_mode='2', encryption_algorithm='13', algorithm_parameter_value=b'00000000', algorithm_parameter_name='5', algorithm_parameter_iv_name='1', algorithm_parameter_iv_value=None), key_name=fints.formals.KeyName(bank_identifier=fints.formals.BankIdentifier(country_identifier='280', bank_code='15050500'), user_id='hermes', key_type='S', key_number=0, key_version=0), compression_function='0', certificate=fints.formals.Certificate(certificate_type=None, certificate_content=None)), fints.segments.message.HNVSD1(header=fints.formals.SegmentHeader('HNVSD', 999, 1, None), data=SegmentSequence([fints.segments.message.HNSHK4(header=fints.formals.SegmentHeader('HNSHK', 2, 4, None), security_profile=fints.formals.SecurityProfile(security_method='PIN', security_method_version=1), security_function='999', security_reference='9166926', security_application_area='1', security_role='1', security_identification_details=fints.formals.SecurityIdentificationDetails(identified_role='2', cid=None, identifier='oIm3BlHv6mQBAADYgbPpp+kWrAQA'), security_reference_number=1, security_datetime=fints.formals.SecurityDateTime(date_time_type='1', date=None, time=None), hash_algorithm=fints.formals.HashAlgorithm(usage_hash='1', hash_algorithm='999', algorithm_parameter_name='1', algorithm_parameter_value=None), signature_algorithm=fints.formals.SignatureAlgorithm(usage_signature='6', signature_algorithm='10', operation_mode='16'), key_name=fints.formals.KeyName(bank_identifier=fints.formals.BankIdentifier(country_identifier='280', bank_code='15050500'), user_id='hermes', key_type='S', key_number=0, key_version=0), certificate=fints.formals.Certificate(certificate_type=None, certificate_content=None)), fints.segments.base.FinTS3Segment(header=fints.formals.SegmentHeader('HIRMG', 3, 2, None), _additional_data=[['0010', None, 'Nachricht entgegengenommen.'], ['0100', None, 'Dialog beendet.']]), fints.segments.base.FinTS3Segment(header=fints.formals.SegmentHeader('HNSHA', 4, 2, None), _additional_data=['9166926'])])), fints.segments.message.HNHBS1(header=fints.formals.SegmentHeader('HNHBS', 5, 1, None), message_number=2)]) output = StringIO() a.print_nested(stream=output)