From dc290470d76b5b69049c468d5cd3cc12a061a973 Mon Sep 17 00:00:00 2001 From: Vladimir Roncevic Date: Tue, 9 Jun 2026 17:47:31 +0200 Subject: [PATCH 01/10] [codecipher] Refactor based on SOLID principles --- .../workflows/codecipher_python3_build.yml | 2 - .pylintrc | 20 +++ .vscode/settings.json | 21 ++- Dockerfile | 116 +++++++------- codecipher/__init__.py | 11 ++ codecipher/a1z52n62/__init__.py | 52 +++---- codecipher/a1z52n62/a1z52n62.py | 146 ++++++++++++++++++ codecipher/a1z52n62/a1z52n62_config.py | 53 +++++++ codecipher/a1z52n62/character_validator.py | 71 +++++++++ codecipher/a1z52n62/data_validator.py | 66 ++++++++ codecipher/a1z52n62/decoder.py | 116 ++++++++++++++ codecipher/a1z52n62/encoder.py | 119 ++++++++++++++ codecipher/a1z52n62/ia1z52n62.py | 97 ++++++++++++ codecipher/a1z52n62/icharacter_validator.py | 57 +++++++ codecipher/a1z52n62/idata_validator.py | 57 +++++++ .../a1z52n62/{decode.py => idecoder.py} | 47 ++---- .../a1z52n62/{encode.py => iencoder.py} | 47 ++---- codecipher/atbs/__init__.py | 2 +- codecipher/atbs/decode.py | 2 +- codecipher/atbs/encode.py | 2 +- codecipher/atbs/lookup_table.py | 2 +- codecipher/b64/__init__.py | 2 +- codecipher/b64/decode.py | 2 +- codecipher/b64/encode.py | 2 +- codecipher/caesar/__init__.py | 2 +- codecipher/caesar/decode.py | 2 +- codecipher/caesar/encode.py | 2 +- codecipher/vernam/__init__.py | 2 +- codecipher/vernam/decode.py | 2 +- codecipher/vernam/encode.py | 2 +- codecipher/vigenere/__init__.py | 2 +- codecipher/vigenere/decode.py | 2 +- codecipher/vigenere/encode.py | 2 +- codecipher/vigenere/key_generator.py | 2 +- codecipher/vigenere/lookup_table.py | 2 +- .../html/_modules/codecipher/a1z52n62.html | 8 +- .../_modules/codecipher/a1z52n62/decode.html | 16 +- .../_modules/codecipher/a1z52n62/encode.html | 16 +- docs/build/html/_modules/codecipher/atbs.html | 2 +- .../html/_modules/codecipher/atbs/decode.html | 2 +- .../html/_modules/codecipher/atbs/encode.html | 2 +- docs/build/html/_modules/codecipher/b64.html | 2 +- .../html/_modules/codecipher/b64/decode.html | 2 +- .../html/_modules/codecipher/b64/encode.html | 2 +- .../html/_modules/codecipher/caesar.html | 2 +- .../_modules/codecipher/caesar/decode.html | 2 +- .../_modules/codecipher/caesar/encode.html | 2 +- .../html/_modules/codecipher/vernam.html | 2 +- .../_modules/codecipher/vernam/decode.html | 2 +- .../_modules/codecipher/vernam/encode.html | 2 +- .../html/_modules/codecipher/vigenere.html | 2 +- .../_modules/codecipher/vigenere/decode.html | 2 +- .../_modules/codecipher/vigenere/encode.html | 2 +- .../codecipher/vigenere/key_generator.html | 2 +- .../codecipher/vigenere/lookup_table.html | 2 +- .../html/codecipher.a1z52n62.decode.html | 28 ++-- .../html/codecipher.a1z52n62.encode.html | 28 ++-- docs/build/html/codecipher.a1z52n62.html | 18 +-- docs/build/html/codecipher.html | 4 +- docs/build/html/genindex.html | 16 +- docs/build/html/searchindex.js | 2 +- docs/source/conf.py | 2 +- setup.py | 4 +- tests/a1z52n62_test.py | 2 +- tests/atbs_test.py | 2 +- tests/ats_coverage.py | 2 +- tests/b64_test.py | 2 +- tests/caesar_test.py | 2 +- tests/codecipher_coverage.json | 2 +- tests/htmlcov/class_index.html | 4 +- tests/htmlcov/function_index.html | 12 +- .../z_094bd7de807a5f14___init___py.html | 2 +- .../htmlcov/z_094bd7de807a5f14_decode_py.html | 2 +- .../htmlcov/z_094bd7de807a5f14_encode_py.html | 2 +- .../z_75799433d8182c47___init___py.html | 2 +- .../htmlcov/z_75799433d8182c47_decode_py.html | 2 +- .../htmlcov/z_75799433d8182c47_encode_py.html | 2 +- .../z_75799433d8182c47_key_generator_py.html | 2 +- .../z_75799433d8182c47_lookup_table_py.html | 2 +- .../z_8f54ab6b5b508ca0___init___py.html | 2 +- .../htmlcov/z_8f54ab6b5b508ca0_decode_py.html | 2 +- .../htmlcov/z_8f54ab6b5b508ca0_encode_py.html | 2 +- .../z_96938f9400a5cdf6___init___py.html | 8 +- .../htmlcov/z_96938f9400a5cdf6_decode_py.html | 8 +- .../htmlcov/z_96938f9400a5cdf6_encode_py.html | 8 +- .../z_9927f90504198b80___init___py.html | 2 +- .../htmlcov/z_9927f90504198b80_decode_py.html | 2 +- .../htmlcov/z_9927f90504198b80_encode_py.html | 2 +- .../z_9927f90504198b80_lookup_table_py.html | 2 +- .../z_aba196749d301797___init___py.html | 2 +- .../htmlcov/z_aba196749d301797_decode_py.html | 2 +- .../htmlcov/z_aba196749d301797_encode_py.html | 2 +- tests/vernam_test.py | 2 +- tests/vigenere_test.py | 2 +- 94 files changed, 1086 insertions(+), 316 deletions(-) create mode 100644 .pylintrc create mode 100644 codecipher/a1z52n62/a1z52n62.py create mode 100644 codecipher/a1z52n62/a1z52n62_config.py create mode 100644 codecipher/a1z52n62/character_validator.py create mode 100644 codecipher/a1z52n62/data_validator.py create mode 100644 codecipher/a1z52n62/decoder.py create mode 100644 codecipher/a1z52n62/encoder.py create mode 100644 codecipher/a1z52n62/ia1z52n62.py create mode 100644 codecipher/a1z52n62/icharacter_validator.py create mode 100644 codecipher/a1z52n62/idata_validator.py rename codecipher/a1z52n62/{decode.py => idecoder.py} (62%) rename codecipher/a1z52n62/{encode.py => iencoder.py} (62%) diff --git a/.github/workflows/codecipher_python3_build.yml b/.github/workflows/codecipher_python3_build.yml index 58e29ec..17afe0a 100644 --- a/.github/workflows/codecipher_python3_build.yml +++ b/.github/workflows/codecipher_python3_build.yml @@ -6,7 +6,6 @@ on: - 'codecipher/**' - 'MANIFEST.in' - 'pyproject.toml' - - 'setup.cfg' - 'setup.py' pull_request: branches: [ main ] @@ -14,7 +13,6 @@ on: - 'codecipher/**' - 'MANIFEST.in' - 'pyproject.toml' - - 'setup.cfg' - 'setup.py' jobs: deploy: diff --git a/.pylintrc b/.pylintrc new file mode 100644 index 0000000..9cd6700 --- /dev/null +++ b/.pylintrc @@ -0,0 +1,20 @@ +[MASTER] +# Optimization level. 0 is the highest, 2 is the lowest. +jobs=0 + +[MESSAGES CONTROL] +# Disable unnecessary-pass +# Centralized place for ignore / warning management. +disable=unnecessary-pass,line-too-long,too-many-arguments,too-few-public-methods,too-many-function-args + +[DESIGN] +# Maximum number of arguments for function / method defining. +max-args=10 +max-locals=25 +max-returns=10 +max-branches=15 +max-statements=60 +max-parents=10 +max-attributes=12 +max-public-methods=25 +max-positional-arguments=10 \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 4ab28f7..b06ae13 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,9 +1,14 @@ { - "files.exclude": { - "*.pyc": true, - "**/*.pyc": true, - "__pycache__": true, - "**/__pycache__": true - }, - "cmake.configureOnOpen": false -} + "files.exclude": { + "**/*.pyc": true, + "**/__pycache__": true + }, + + "pylint.args": [ + "--rcfile=${workspaceFolder}/.pylintrc" + ], + + "pylint.importStrategy": "useBundled", + "pylint.cwd": "${workspaceFolder}", + "flake8.enabled": false +} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 7ae54a4..30ff6d9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,58 +1,58 @@ -# Copyright 2021 - 2024 Vladimir Roncevic -# -# Licensed 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 debian:12 -RUN apt-get update -RUN DEBIAN_FRONTEND=noninteractive \ - apt-get install -yq --no-install-recommends \ - vim \ - nano \ - tree \ - htop \ - wget \ - curl \ - unzip \ - ca-certificates \ - openssl \ - python3 \ - python3-dev \ - libyaml-dev - -RUN wget https://bootstrap.pypa.io/get-pip.py -RUN python3 get-pip.py -RUN python3 -m pip install --upgrade setuptools -RUN python3 -m pip install --upgrade pip -RUN python3 -m pip install --upgrade build -RUN rm -f get-pip.py -RUN mkdir /codecipher/ -COPY codecipher /codecipher/ -COPY pyproject.toml / -COPY MANIFEST.in / -COPY setup.py / -COPY README.md / -COPY LICENSE / -COPY requirements.txt / -RUN pip3 install -r requirements.txt -RUN rm -f requirements.txt -RUN python3 -m build --no-isolation --wheel -RUN pip install /dist/codecipher-*.whl -RUN rm -rf /codecipher* -RUN rm -rf dist/ -RUN rm -rf tests/ -RUN rm -f pyproject.toml -RUN rm -f MANIFEST.in -RUN rm -f setup.py -RUN rm -f README.md -RUN rm -f LICENSE +# Copyright 2021 - 2026 Vladimir Roncevic +# +# Licensed 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 debian:12 +RUN apt-get update +RUN DEBIAN_FRONTEND=noninteractive \ + apt-get install -yq --no-install-recommends \ + vim \ + nano \ + tree \ + htop \ + wget \ + curl \ + unzip \ + ca-certificates \ + openssl \ + python3 \ + python3-dev \ + libyaml-dev + +RUN wget https://bootstrap.pypa.io/get-pip.py +RUN python3 get-pip.py +RUN python3 -m pip install --upgrade setuptools +RUN python3 -m pip install --upgrade pip +RUN python3 -m pip install --upgrade build +RUN rm -f get-pip.py +RUN mkdir /codecipher/ +COPY codecipher /codecipher/ +COPY pyproject.toml / +COPY MANIFEST.in / +COPY setup.py / +COPY README.md / +COPY LICENSE / +COPY requirements.txt / +RUN pip3 install -r requirements.txt +RUN rm -f requirements.txt +RUN python3 -m build --no-isolation --wheel +RUN pip install /dist/codecipher-*.whl +RUN rm -rf /codecipher* +RUN rm -rf dist/ +RUN rm -rf tests/ +RUN rm -f pyproject.toml +RUN rm -f MANIFEST.in +RUN rm -f setup.py +RUN rm -f README.md +RUN rm -f LICENSE diff --git a/codecipher/__init__.py b/codecipher/__init__.py index 3292b26..2e07062 100644 --- a/codecipher/__init__.py +++ b/codecipher/__init__.py @@ -16,3 +16,14 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . ''' + +from typing import List + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' diff --git a/codecipher/a1z52n62/__init__.py b/codecipher/a1z52n62/__init__.py index 79b46cf..49687da 100644 --- a/codecipher/a1z52n62/__init__.py +++ b/codecipher/a1z52n62/__init__.py @@ -16,47 +16,35 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines class A1z52N62 with attribute(s) and method(s). - Creates container class with aggregate backend API. + Initialization for a1z52n62 package. ''' -import sys from typing import List - -try: - from codecipher.a1z52n62.encode import A1z52N62Encode - from codecipher.a1z52n62.decode import A1z52N62Decode -except ImportError as ats_error_message: # pragma: no cover - # Force exit python ####################################################### - sys.exit(f'\n{__file__}\n{ats_error_message}\n') # pragma: no cover +from .a1z52n62 import A1z52N62 +from .ia1z52n62 import IA1z52N62 +from .iencoder import IA1z52N62Encoder +from .idecoder import IA1z52N62Decoder +from .encoder import A1z52N62Encoder +from .decoder import A1z52N62Decoder +from .a1z52n62_config import ( + A1z52N62Config +) __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' -__version__: str = '1.5.0' +__version__: str = '1.5.1' __maintainer__: str = 'Vladimir Roncevic' __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' - -class A1z52N62(A1z52N62Encode, A1z52N62Decode): - ''' - Defines class A1z52N62 with attribute(s) and method(s). - Creates container class with aggregate backend API. - - It defines: - - :attributes: - | None. - :methods: - | __init__ - Initials A1z52N62 constructor. - ''' - - def __init__(self) -> None: - ''' - Initials A1z52N62 constructor. - - :exceptions: None - ''' - super().__init__() +__all__: List[str] = [ + 'IA1z52N62', + 'IA1z52N62Encoder', + 'IA1z52N62Decoder', + 'A1z52N62Encoder', + 'A1z52N62Decoder', + 'A1z52N62', + 'A1z52N62Config' +] diff --git a/codecipher/a1z52n62/a1z52n62.py b/codecipher/a1z52n62/a1z52n62.py new file mode 100644 index 0000000..c755acb --- /dev/null +++ b/codecipher/a1z52n62/a1z52n62.py @@ -0,0 +1,146 @@ +# -*- coding: UTF-8 -*- + +''' +Module + a1z52n62.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines class A1z52N62 with attribute(s) and method(s). + Creates container class with aggregate backend API. +''' + +from typing import List, Optional +from .ia1z52n62 import IA1z52N62 +from .iencoder import IA1z52N62Encoder +from .encoder import A1z52N62Encoder +from .idecoder import IA1z52N62Decoder +from .decoder import A1z52N62Decoder +from .a1z52n62_config import A1z52N62Config +from .icharacter_validator import ICharacterValidator +from .character_validator import CharacterValidator +from .idata_validator import IDataValidator +from .data_validator import DataValidator + + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class A1z52N62(IA1z52N62): + ''' + Defines class A1z52N62 with attribute(s) and method(s). + Creates container class with aggregate backend API. + + It defines: + + :attributes: + | __config - Configuration for algorithm. + | __char_validator - Validator for characters. + | __data_validator - Validator for data. + | __encoder - Encoder for algorithm. + | __decoder - Decoder for algorithm. + :methods: + | __init__ - Initials A1z52N62 constructor. + | encode - Encoding data to A1z52N62 format. + | encode_data - Property method for getting encode data. + | decode - Decoding data from A1z52N62 format. + | decode_data - Property method for getting decode data. + ''' + + def __init__( + self, + config: Optional[A1z52N62Config] = None, + char_validator: Optional[ICharacterValidator] = None, + data_validator: Optional[IDataValidator] = None, + encoder: Optional[IA1z52N62Encoder] = None, + decoder: Optional[IA1z52N62Decoder] = None, + ) -> None: + ''' + Initials A1z52N62 constructor. + + :param config: Configuration for algorithm | None + :type config: + :param char_validator: Validator for characters | None + :type char_validator: + :param data_validator: Validator for data | None + :type data_validator: + :param encoder: Encoder for algorithm | None + :type encoder: + :param decoder: Decoder for algorithm | None + :type decoder: + :exceptions: None + ''' + # Dependecy injection for config, encode, decode or use default + self.__config = config or A1z52N62Config() + self.__char_validator: ICharacterValidator = char_validator or CharacterValidator() + self.__data_validator: IDataValidator = data_validator or DataValidator(self.__char_validator) + self.__encoder: IA1z52N62Encoder = encoder or A1z52N62Encoder(_config=self.__config) + self.__decoder: IA1z52N62Decoder = decoder or A1z52N62Decoder(_config=self.__config) + + def encode(self, data: Optional[str]) -> bool: + ''' + Encoding data to A1z52N62 format. + + :param data: Data which should be encoded | None + :type data: + :return: True (if success) | False (if fail) + :rtype: + :exceptions: None + ''' + if not bool(data) or not self.__data_validator.is_valid(data): + return False + return self.__encoder.encode(data) + + @property + def encode_data(self) -> Optional[str]: + ''' + Property method for getting encode data. + + :return: Encoded data + :rtype: + :exceptions: None + ''' + return self.__encoder.encode_data + + def decode(self, data: Optional[str]) -> bool: + ''' + Decoding data from A1z52N62 format. + + :param data: Data which should be decoded | None + :type data: + :return: True (if success) | False (if fail) + :rtype: + :exceptions: None + ''' + if not bool(data) or not self.__decoder.decode(data): + return False + + return self.__data_validator.is_valid(self.decode_data) + + @property + def decode_data(self) -> Optional[str]: + ''' + Property method for getting decode data. + + :return: Decoded data + :rtype: + :exceptions: None + ''' + return self.__decoder.decode_data diff --git a/codecipher/a1z52n62/a1z52n62_config.py b/codecipher/a1z52n62/a1z52n62_config.py new file mode 100644 index 0000000..4faca77 --- /dev/null +++ b/codecipher/a1z52n62/a1z52n62_config.py @@ -0,0 +1,53 @@ +# -*- coding: UTF-8 -*- + +''' +Module + a1z52n62_config.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines constants for A1z52N62 encoding and decoding. +''' + +from typing import List +from dataclasses import dataclass + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +@dataclass(frozen=True) +class A1z52N62Config: + ''' + Configuration container for A1z52N62 algorithm. + + :attributes: + | upper_case_offset - Offset for uppercase letters (default 64). + | lower_case_offset - Offset for lowercase letters (default 96). + | lower_case_base - Base index for lowercase letters (default 27). + | numeric_base - Base index for numeric characters (default 53). + | alphabet_size - Size of alphabet (default 26). + | code_splitter - Code splitter (default ' - '). + ''' + upper_case_offset: int = 64 + lower_case_offset: int = 96 + lower_case_base: int = 27 + numeric_base: int = 53 + alphabet_size: int = 26 + code_splitter: str = ' - ' diff --git a/codecipher/a1z52n62/character_validator.py b/codecipher/a1z52n62/character_validator.py new file mode 100644 index 0000000..c79644a --- /dev/null +++ b/codecipher/a1z52n62/character_validator.py @@ -0,0 +1,71 @@ +# -*- coding: UTF-8 -*- + +''' +Module + character_validator.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines class CharacterValidator for strict A1z52N62 character validation. +''' + +from typing import List, Optional, Set +from string import ascii_lowercase, ascii_uppercase, digits +from .icharacter_validator import ICharacterValidator + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class CharacterValidator(ICharacterValidator): + ''' + Defines class CharacterValidator with attribute(s) and method(s). + Creates character validator class with backend API. + + It defines: + + :attributes: + | __allowed_chars - Strict ASCII alphanumeric character set. + :methods: + | __init__ - Initializes CharacterValidator constructor. + | is_valid_char - Validates if a single character belongs to A1z52N62. + ''' + + def __init__(self) -> None: + ''' + Initializes CharacterValidator constructor. + + :exceptions: None + ''' + self.__allowed_chars: Set[str] = set(ascii_lowercase + ascii_uppercase + digits) + + def is_valid_char(self, char: Optional[str]) -> bool: + ''' + Validating if a character belongs strictly to ASCII alphanumeric set. + + :param char: Single character to validate | None + :type char: + :return: True (if valid) | False (if invalid) + :rtype: + :exceptions: None + ''' + if not bool(char) or len(char) != 1: + return False + + return char in self.__allowed_chars diff --git a/codecipher/a1z52n62/data_validator.py b/codecipher/a1z52n62/data_validator.py new file mode 100644 index 0000000..d0c01ed --- /dev/null +++ b/codecipher/a1z52n62/data_validator.py @@ -0,0 +1,66 @@ +# -*- coding: UTF-8 -*- + +''' +Module + idata_validator.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines interface IDataValidator for DataValidator class. +''' + +from typing import List, Optional +from .idata_validator import IDataValidator +from .icharacter_validator import ICharacterValidator +from .character_validator import CharacterValidator + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class DataValidator(IDataValidator): + ''' + Defines class DataValidator with attribute(s) and method(s). + ''' + + def __init__(self, char_validator: Optional[ICharacterValidator] = None) -> None: + ''' + Initials DataValidator constructor. + + :exceptions: None + ''' + self.__char_validator: ICharacterValidator = char_validator or CharacterValidator() + + def is_valid(self, data: Optional[str]) -> bool: + ''' + Validates if data is in A1z52N62 format. + + :param data: Data which should be validated | None + :type data: + :return: True (if valid) | False (if invalid) + :rtype: + :exceptions: None + ''' + if not bool(data): + return False + + for element in data: + if not self.__char_validator.is_valid_char(element): + return False + return True diff --git a/codecipher/a1z52n62/decoder.py b/codecipher/a1z52n62/decoder.py new file mode 100644 index 0000000..35bc517 --- /dev/null +++ b/codecipher/a1z52n62/decoder.py @@ -0,0 +1,116 @@ +# -*- coding: UTF-8 -*- + +''' +Module + decoder.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines class A1z52N62Decoder with attribute(s) and method(s). + Creates decode class with backend API. +''' + +from dataclasses import dataclass, field +from typing import List, Optional +from .idecoder import IA1z52N62Decoder +from .a1z52n62_config import A1z52N62Config + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +@dataclass +class A1z52N62Decoder(IA1z52N62Decoder): + ''' + Defines class A1z52N62Decoder with attribute(s) and method(s). + Creates decode class with backend API. + + It defines: + + :attributes: + | _config - Configuration for offsets and bases. + | _decode_data - Data decode container. + :methods: + | decode_data - Property methods for decode data. + | decode - Decode data from A1z52N62 format. + ''' + + _config: A1z52N62Config = field(default_factory=A1z52N62Config) + _decode_data: Optional[str] = field(default=None, init=False) + + @property + def decode_data(self) -> Optional[str]: + ''' + Property method for getting decode data. + + :return: Decode data in str format | None + :rtype: + :exceptions: None + ''' + return self._decode_data + + @decode_data.setter + def decode_data(self, decode_data: Optional[str]) -> None: + ''' + Property method for setting decode data. + + :param decode_data: Decoded data | None + :type decode_data: + :return: None + :exceptions: None + ''' + if bool(decode_data): + self._decode_data = decode_data + + def decode(self, data: Optional[str]) -> bool: + ''' + Decoding data from A1z52N62 format. + + :param data: Data which should be decoded | None + :type data: + :return: True (if success) | False (if fail) + :rtype: + :exceptions: None + ''' + status: bool = False + + if not bool(data): + return status + + decode_list: List[str] = [] + for element in data.split(self._config.code_splitter): + if element.isnumeric(): + val = int(element) + if val < self._config.numeric_base: + if val <= self._config.alphabet_size: + decode_list.append( + chr(val + self._config.upper_case_offset) + ) + else: + decode_list.append( + chr(val + self._config.lower_case_offset - self._config.lower_case_base) + ) + else: + decode_list.append(str(val - self._config.numeric_base)) + else: + decode_list.append(element) + self._decode_data = ''.join(decode_list) + status = True + + return status diff --git a/codecipher/a1z52n62/encoder.py b/codecipher/a1z52n62/encoder.py new file mode 100644 index 0000000..27711b7 --- /dev/null +++ b/codecipher/a1z52n62/encoder.py @@ -0,0 +1,119 @@ +# -*- coding: UTF-8 -*- + +''' +Module + encoder.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines class A1z52N62Encoder with attribute(s) and method(s). + Creates encode class with backend API. +''' + +from dataclasses import dataclass, field +from typing import List, Optional +from .iencoder import IA1z52N62Encoder +from .a1z52n62_config import A1z52N62Config + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +@dataclass +class A1z52N62Encoder(IA1z52N62Encoder): + ''' + Defines class A1z52N62Encoder with attribute(s) and method(s). + Creates encode class with backend API. + + It defines: + + :attributes: + | _config - Configuration for offsets and bases. + | _encode_data - Data encode container. + :methods: + | encode_data - Property methods for encode data. + | encode - Encode data to A1z52N62 format. + ''' + + _config: A1z52N62Config = field(default_factory=A1z52N62Config) + _encode_data: Optional[str] = field(default=None, init=False) + + @property + def encode_data(self) -> Optional[str]: + ''' + Property method for getting encode data. + + :return: Encoded data + :rtype: + :exceptions: None + ''' + return self._encode_data + + @encode_data.setter + def encode_data(self, encode_data: Optional[str]) -> None: + ''' + Property method for setting encode data. + + :param encode_data: Encode data | None + :type encode_data: + :return: None + :exceptions: None + ''' + if bool(encode_data): + self._encode_data = encode_data + + def encode(self, data: Optional[str]) -> bool: + ''' + Encoding data to A1z52N62 format. + + :param data: Data which should be encoded | None + :type data: + :return: True (if success) | False (if fail) + :rtype: + :exceptions: None + ''' + status: bool = False + + if not bool(data): + return status + + encode_list: List[str] = [] + for element in data: + if element.isalpha(): + if element.isupper(): + encode_list.append( + str(ord(element) - self._config.upper_case_offset) + ) + else: + encode_list.append( + str( + ord(element) - self._config.lower_case_offset + self._config.lower_case_base + ) + ) + else: + if element.isnumeric(): + encode_list.append( + str(int(element) + self._config.numeric_base) + ) + else: + encode_list.append(element) + self._encode_data = self._config.code_splitter.join(encode_list) + status = True + + return status diff --git a/codecipher/a1z52n62/ia1z52n62.py b/codecipher/a1z52n62/ia1z52n62.py new file mode 100644 index 0000000..42af5d8 --- /dev/null +++ b/codecipher/a1z52n62/ia1z52n62.py @@ -0,0 +1,97 @@ +# -*- coding: UTF-8 -*- + +''' +Module + ia1z52n62.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines interface IA1z52N62 for A1z52N62 class. +''' + +from abc import ABC, abstractmethod +from typing import List, Optional + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class IA1z52N62(ABC): + ''' + Defines interface IA1z52N62 with methods. + + It defines: + + :attributes: None + :methods: + | encode - Encoding data to A1z52N62 format. + | encode_data - Property method for getting encode data. + | decode - Decoding data from A1z52N62 format. + | decode_data - Property method for getting decode data. + ''' + + @abstractmethod + def encode(self, data: Optional[str]) -> bool: + ''' + Encoding data to A1z52N62 format. + + :param data: Data which should be encoded | None + :type data: + :return: True (if success) | False (if fail) + :rtype: + :exceptions: None + ''' + raise NotImplementedError('Method encode must be implemented.') + + @property + @abstractmethod + def encode_data(self) -> Optional[str]: + ''' + Property method for getting encode data. + + :return: Encoded data + :rtype: + :exceptions: None + ''' + raise NotImplementedError('Method encode_data must be implemented.') + + @abstractmethod + def decode(self, data: Optional[str]) -> bool: + ''' + Decoding data from A1z52N62 format. + + :param data: Data which should be decoded | None + :type data: + :return: True (if success) | False (if fail) + :rtype: + :exceptions: None + ''' + raise NotImplementedError('Method decode must be implemented.') + + @property + @abstractmethod + def decode_data(self) -> Optional[str]: + ''' + Property method for getting decode data. + + :return: Decoded data + :rtype: + :exceptions: None + ''' + raise NotImplementedError('Method decode_data must be implemented.') diff --git a/codecipher/a1z52n62/icharacter_validator.py b/codecipher/a1z52n62/icharacter_validator.py new file mode 100644 index 0000000..5dac2de --- /dev/null +++ b/codecipher/a1z52n62/icharacter_validator.py @@ -0,0 +1,57 @@ +# -*- coding: UTF-8 -*- + +''' +Module + icharacter_validator.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines interface ICharacterValidator for CharacterValidator class. +''' + +from abc import ABC, abstractmethod +from typing import Optional, List + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class ICharacterValidator(ABC): + ''' + Defines interface ICharacterValidator with methods. + + It defines: + + :attributes: None + :methods: + | is_valid_char - Validates if a single character belongs to A1z52N62. + ''' + + @abstractmethod + def is_valid_char(self, char: Optional[str]) -> bool: + ''' + Validates if a character is a valid A1z52N62 alphabet constituent. + + :param char: Single character to validate | None + :type char: + :return: True (if valid) | False (if invalid) + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError("Subclasses must implement is_valid_char method") diff --git a/codecipher/a1z52n62/idata_validator.py b/codecipher/a1z52n62/idata_validator.py new file mode 100644 index 0000000..70cce81 --- /dev/null +++ b/codecipher/a1z52n62/idata_validator.py @@ -0,0 +1,57 @@ +# -*- coding: UTF-8 -*- + +''' +Module + idata_validator.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines interface IDataValidator for DataValidator class. +''' + +from abc import ABC, abstractmethod +from typing import List, Optional + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class IDataValidator(ABC): + ''' + Defines interface IDataValidator with methods. + + It defines: + + :attributes: None + :methods: + | is_valid - Validates if data is in A1z52N62 format. + ''' + + @abstractmethod + def is_valid(self, data: Optional[str]) -> bool: + ''' + Validates if data is in A1z52N62 format. + + :param data: Data which should be validated | None + :type data: + :return: True (if valid) | False (if invalid) + :rtype: + :exceptions: None + ''' + raise NotImplementedError('Method is_valid must be implemented.') diff --git a/codecipher/a1z52n62/decode.py b/codecipher/a1z52n62/idecoder.py similarity index 62% rename from codecipher/a1z52n62/decode.py rename to codecipher/a1z52n62/idecoder.py index 33b24b6..c2f7664 100644 --- a/codecipher/a1z52n62/decode.py +++ b/codecipher/a1z52n62/idecoder.py @@ -2,7 +2,7 @@ ''' Module - decode.py + idecoder.py Copyright Copyright (C) 2021 - 2026 Vladimir Roncevic codecipher is free software: you can redistribute it and/or modify it @@ -16,41 +16,35 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines class A1z52N62Decode with attribute(s) and method(s). - Creates decode class with backend API. + Defines interface IA1z52N62Decoder for A1z52N62Decoder class. ''' -from dataclasses import dataclass, field +from abc import ABC, abstractmethod from typing import List, Optional __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' -__version__: str = '1.5.0' +__version__: str = '1.5.1' __maintainer__: str = 'Vladimir Roncevic' __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' -@dataclass -class A1z52N62Decode: +class IA1z52N62Decoder(ABC): ''' - Defines class A1z52N62Decode with attribute(s) and method(s). - Creates decode class with backend API. + Defines interface IA1z52N62Decoder with property and method. It defines: - :attributes: - | _decode_data - Data decode container. :methods: | decode_data - Property methods for decode data. | decode - Decode data from A1z52N62 format. ''' - _decode_data: Optional[str] = field(default=None) - @property + @abstractmethod def decode_data(self) -> Optional[str]: ''' Property method for getting decode data. @@ -59,9 +53,10 @@ def decode_data(self) -> Optional[str]: :rtype: :exceptions: None ''' - return self._decode_data + raise NotImplementedError('Method decode_data must be implemented.') @decode_data.setter + @abstractmethod def decode_data(self, decode_data: Optional[str]) -> None: ''' Property method for setting decode data. @@ -71,29 +66,17 @@ def decode_data(self, decode_data: Optional[str]) -> None: :return: None :exceptions: None ''' - if bool(decode_data): - self._decode_data = decode_data + raise NotImplementedError('Method decode_data must be implemented.') - def decode(self, data: Optional[str]) -> None: + @abstractmethod + def decode(self, data: Optional[str]) -> bool: ''' Decoding data from A1z52N62 format. :param data: Data which should be decoded | None :type data: - :return: None + :return: True (if success) | False (if fail) + :rtype: :exceptions: None ''' - if bool(data): - decode_list: List[str] = [] - for element in data.split(' - '): - if element.isnumeric(): - if int(element) <= 52: - if int(element) <= 26: - decode_list.append(chr(int(element) + 64)) - else: - decode_list.append(chr(int(element) + 96 - 27)) - else: - decode_list.append(str(int(element) - 53)) - else: - decode_list.append(element) - self._decode_data = ''.join(decode_list) + raise NotImplementedError('Method decode must be implemented.') diff --git a/codecipher/a1z52n62/encode.py b/codecipher/a1z52n62/iencoder.py similarity index 62% rename from codecipher/a1z52n62/encode.py rename to codecipher/a1z52n62/iencoder.py index 0b854ac..6290ee1 100644 --- a/codecipher/a1z52n62/encode.py +++ b/codecipher/a1z52n62/iencoder.py @@ -2,7 +2,7 @@ ''' Module - encode.py + iencoder.py Copyright Copyright (C) 2021 - 2026 Vladimir Roncevic codecipher is free software: you can redistribute it and/or modify it @@ -16,41 +16,35 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines class A1z52N62Encode with attribute(s) and method(s). - Creates encode class with backend API. + Defines interface IA1z52N62Encoder for A1z52N62Encoder class. ''' -from dataclasses import dataclass, field +from abc import ABC, abstractmethod from typing import List, Optional __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' -__version__: str = '1.5.0' +__version__: str = '1.5.1' __maintainer__: str = 'Vladimir Roncevic' __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' -@dataclass -class A1z52N62Encode: +class IA1z52N62Encoder(ABC): ''' - Defines class A1z52N62Encode with attribute(s) and method(s). - Creates encode class with backend API. + Defines interface IA1z52N62Encoder with property and method. It defines: - :attributes: - | _encode_data - Data encode container. :methods: | encode_data - Property methods for encode data. | encode - Encode data to A1z52N62 format. ''' - _encode_data: Optional[str] = field(default=None) - @property + @abstractmethod def encode_data(self) -> Optional[str]: ''' Property method for getting encode data. @@ -59,9 +53,10 @@ def encode_data(self) -> Optional[str]: :rtype: :exceptions: None ''' - return self._encode_data + raise NotImplementedError('Method encode_data must be implemented.') @encode_data.setter + @abstractmethod def encode_data(self, encode_data: Optional[str]) -> None: ''' Property method for setting encode data. @@ -71,29 +66,17 @@ def encode_data(self, encode_data: Optional[str]) -> None: :return: None :exceptions: None ''' - if bool(encode_data): - self._encode_data = encode_data + raise NotImplementedError('Method encode_data must be implemented.') - def encode(self, data: Optional[str]) -> None: + @abstractmethod + def encode(self, data: Optional[str]) -> bool: ''' Encoding data to A1z52N62 format. :param data: Data which should be encoded | None :type data: - :return: None + :return: True (if success) | False (if fail) + :rtype: :exceptions: None ''' - if bool(data): - encode_list: List[str] = [] - for element in data: - if element.isalpha(): - if element.isupper(): - encode_list.append(str(ord(element) - 64)) - else: - encode_list.append(str(ord(element) - 96 + 27)) - else: - if element.isnumeric(): - encode_list.append(str(int(element) + 53)) - else: - encode_list.append(element) - self._encode_data = ' - '.join(encode_list) + raise NotImplementedError('Method encode must be implemented.') diff --git a/codecipher/atbs/__init__.py b/codecipher/atbs/__init__.py index cfc3382..d679959 100644 --- a/codecipher/atbs/__init__.py +++ b/codecipher/atbs/__init__.py @@ -34,7 +34,7 @@ __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' -__version__: str = '1.5.0' +__version__: str = '1.5.1' __maintainer__: str = 'Vladimir Roncevic' __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' diff --git a/codecipher/atbs/decode.py b/codecipher/atbs/decode.py index 813adbf..d04ca9d 100644 --- a/codecipher/atbs/decode.py +++ b/codecipher/atbs/decode.py @@ -34,7 +34,7 @@ __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' -__version__: str = '1.5.0' +__version__: str = '1.5.1' __maintainer__: str = 'Vladimir Roncevic' __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' diff --git a/codecipher/atbs/encode.py b/codecipher/atbs/encode.py index d35d989..f602a00 100644 --- a/codecipher/atbs/encode.py +++ b/codecipher/atbs/encode.py @@ -34,7 +34,7 @@ __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' -__version__: str = '1.5.0' +__version__: str = '1.5.1' __maintainer__: str = 'Vladimir Roncevic' __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' diff --git a/codecipher/atbs/lookup_table.py b/codecipher/atbs/lookup_table.py index 17f8f5e..ecee9e3 100644 --- a/codecipher/atbs/lookup_table.py +++ b/codecipher/atbs/lookup_table.py @@ -25,7 +25,7 @@ __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' -__version__: str = '1.5.0' +__version__: str = '1.5.1' __maintainer__: str = 'Vladimir Roncevic' __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' diff --git a/codecipher/b64/__init__.py b/codecipher/b64/__init__.py index 303c96e..347bb3a 100644 --- a/codecipher/b64/__init__.py +++ b/codecipher/b64/__init__.py @@ -34,7 +34,7 @@ __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' -__version__: str = '1.5.0' +__version__: str = '1.5.1' __maintainer__: str = 'Vladimir Roncevic' __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' diff --git a/codecipher/b64/decode.py b/codecipher/b64/decode.py index f272424..ffb8fe7 100644 --- a/codecipher/b64/decode.py +++ b/codecipher/b64/decode.py @@ -28,7 +28,7 @@ __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' -__version__: str = '1.5.0' +__version__: str = '1.5.1' __maintainer__: str = 'Vladimir Roncevic' __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' diff --git a/codecipher/b64/encode.py b/codecipher/b64/encode.py index cdb7e42..2a8623a 100644 --- a/codecipher/b64/encode.py +++ b/codecipher/b64/encode.py @@ -28,7 +28,7 @@ __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' -__version__: str = '1.5.0' +__version__: str = '1.5.1' __maintainer__: str = 'Vladimir Roncevic' __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' diff --git a/codecipher/caesar/__init__.py b/codecipher/caesar/__init__.py index eaec418..b0ac948 100644 --- a/codecipher/caesar/__init__.py +++ b/codecipher/caesar/__init__.py @@ -34,7 +34,7 @@ __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' -__version__: str = '1.5.0' +__version__: str = '1.5.1' __maintainer__: str = 'Vladimir Roncevic' __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' diff --git a/codecipher/caesar/decode.py b/codecipher/caesar/decode.py index 65bd07a..218e79c 100644 --- a/codecipher/caesar/decode.py +++ b/codecipher/caesar/decode.py @@ -27,7 +27,7 @@ __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' -__version__: str = '1.5.0' +__version__: str = '1.5.1' __maintainer__: str = 'Vladimir Roncevic' __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' diff --git a/codecipher/caesar/encode.py b/codecipher/caesar/encode.py index ed6b2c5..d66359a 100644 --- a/codecipher/caesar/encode.py +++ b/codecipher/caesar/encode.py @@ -27,7 +27,7 @@ __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' -__version__: str = '1.5.0' +__version__: str = '1.5.1' __maintainer__: str = 'Vladimir Roncevic' __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' diff --git a/codecipher/vernam/__init__.py b/codecipher/vernam/__init__.py index da48a55..7479058 100644 --- a/codecipher/vernam/__init__.py +++ b/codecipher/vernam/__init__.py @@ -34,7 +34,7 @@ __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' -__version__: str = '1.5.0' +__version__: str = '1.5.1' __maintainer__: str = 'Vladimir Roncevic' __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' diff --git a/codecipher/vernam/decode.py b/codecipher/vernam/decode.py index a97eb1f..fa55787 100644 --- a/codecipher/vernam/decode.py +++ b/codecipher/vernam/decode.py @@ -27,7 +27,7 @@ __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' -__version__: str = '1.5.0' +__version__: str = '1.5.1' __maintainer__: str = 'Vladimir Roncevic' __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' diff --git a/codecipher/vernam/encode.py b/codecipher/vernam/encode.py index f69b023..6ba9746 100644 --- a/codecipher/vernam/encode.py +++ b/codecipher/vernam/encode.py @@ -27,7 +27,7 @@ __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' -__version__: str = '1.5.0' +__version__: str = '1.5.1' __maintainer__: str = 'Vladimir Roncevic' __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' diff --git a/codecipher/vigenere/__init__.py b/codecipher/vigenere/__init__.py index 4081792..aacbfa0 100644 --- a/codecipher/vigenere/__init__.py +++ b/codecipher/vigenere/__init__.py @@ -35,7 +35,7 @@ __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' -__version__: str = '1.5.0' +__version__: str = '1.5.1' __maintainer__: str = 'Vladimir Roncevic' __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' diff --git a/codecipher/vigenere/decode.py b/codecipher/vigenere/decode.py index d569da4..92b37ed 100644 --- a/codecipher/vigenere/decode.py +++ b/codecipher/vigenere/decode.py @@ -34,7 +34,7 @@ __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' -__version__: str = '1.5.0' +__version__: str = '1.5.1' __maintainer__: str = 'Vladimir Roncevic' __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' diff --git a/codecipher/vigenere/encode.py b/codecipher/vigenere/encode.py index e5c96dd..02c8ead 100644 --- a/codecipher/vigenere/encode.py +++ b/codecipher/vigenere/encode.py @@ -34,7 +34,7 @@ __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' -__version__: str = '1.5.0' +__version__: str = '1.5.1' __maintainer__: str = 'Vladimir Roncevic' __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' diff --git a/codecipher/vigenere/key_generator.py b/codecipher/vigenere/key_generator.py index 2f7aae7..feb4e99 100644 --- a/codecipher/vigenere/key_generator.py +++ b/codecipher/vigenere/key_generator.py @@ -27,7 +27,7 @@ __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' -__version__: str = '1.5.0' +__version__: str = '1.5.1' __maintainer__: str = 'Vladimir Roncevic' __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' diff --git a/codecipher/vigenere/lookup_table.py b/codecipher/vigenere/lookup_table.py index 2686853..a7ea08b 100644 --- a/codecipher/vigenere/lookup_table.py +++ b/codecipher/vigenere/lookup_table.py @@ -26,7 +26,7 @@ __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' -__version__: str = '1.5.0' +__version__: str = '1.5.1' __maintainer__: str = 'Vladimir Roncevic' __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' diff --git a/docs/build/html/_modules/codecipher/a1z52n62.html b/docs/build/html/_modules/codecipher/a1z52n62.html index b411ab6..64abe5f 100644 --- a/docs/build/html/_modules/codecipher/a1z52n62.html +++ b/docs/build/html/_modules/codecipher/a1z52n62.html @@ -62,8 +62,8 @@

Source code for codecipher.a1z52n62

 from typing import List
 
 try:
-    from codecipher.a1z52n62.encode import A1z52N62Encode
-    from codecipher.a1z52n62.decode import A1z52N62Decode
+    from codecipher.a1z52n62.encode import A1z52N62Encoder
+    from codecipher.a1z52n62.decode import A1z52N62Decoder
 except ImportError as ats_error_message:  # pragma: no cover
     # Force exit python #######################################################
     sys.exit(f'\n{__file__}\n{ats_error_message}\n')  # pragma: no cover
@@ -72,7 +72,7 @@ 

Source code for codecipher.a1z52n62

 __copyright__: str = '(C) 2026, https://electux.github.io/codecipher'
 __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation']
 __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE'
-__version__: str = '1.5.0'
+__version__: str = '1.5.1'
 __maintainer__: str = 'Vladimir Roncevic'
 __email__: str = 'elektron.ronca@gmail.com'
 __status__: str = 'Updated'
@@ -80,7 +80,7 @@ 

Source code for codecipher.a1z52n62

 
 
[docs] -class A1z52N62(A1z52N62Encode, A1z52N62Decode): +class A1z52N62(A1z52N62Encoder, A1z52N62Decoder): ''' Defines class A1z52N62 with attribute(s) and method(s). Creates container class with aggregate backend API. diff --git a/docs/build/html/_modules/codecipher/a1z52n62/decode.html b/docs/build/html/_modules/codecipher/a1z52n62/decode.html index 68fa9f8..c81f19f 100644 --- a/docs/build/html/_modules/codecipher/a1z52n62/decode.html +++ b/docs/build/html/_modules/codecipher/a1z52n62/decode.html @@ -55,7 +55,7 @@

Source code for codecipher.a1z52n62.decode

     You should have received a copy of the GNU General Public License along
     with this program. If not, see <http://www.gnu.org/licenses/>.
 Info
-    Defines class A1z52N62Decode with attribute(s) and method(s).
+    Defines class A1z52N62Decoder with attribute(s) and method(s).
     Creates decode class with backend API.
 '''
 
@@ -66,18 +66,18 @@ 

Source code for codecipher.a1z52n62.decode

 __copyright__: str = '(C) 2026, https://electux.github.io/codecipher'
 __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation']
 __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE'
-__version__: str = '1.5.0'
+__version__: str = '1.5.1'
 __maintainer__: str = 'Vladimir Roncevic'
 __email__: str = 'elektron.ronca@gmail.com'
 __status__: str = 'Updated'
 
 
-
-[docs] +
+[docs] @dataclass -class A1z52N62Decode: +class A1z52N62Decoder: ''' - Defines class A1z52N62Decode with attribute(s) and method(s). + Defines class A1z52N62Decoder with attribute(s) and method(s). Creates decode class with backend API. It defines: @@ -115,8 +115,8 @@

Source code for codecipher.a1z52n62.decode

         if bool(decode_data):
             self._decode_data = decode_data
 
-
-[docs] +
+[docs] def decode(self, data: Optional[str]) -> None: ''' Decoding data from A1z52N62 format. diff --git a/docs/build/html/_modules/codecipher/a1z52n62/encode.html b/docs/build/html/_modules/codecipher/a1z52n62/encode.html index 7819f18..978357c 100644 --- a/docs/build/html/_modules/codecipher/a1z52n62/encode.html +++ b/docs/build/html/_modules/codecipher/a1z52n62/encode.html @@ -55,7 +55,7 @@

Source code for codecipher.a1z52n62.encode

     You should have received a copy of the GNU General Public License along
     with this program. If not, see <http://www.gnu.org/licenses/>.
 Info
-    Defines class A1z52N62Encode with attribute(s) and method(s).
+    Defines class A1z52N62Encoder with attribute(s) and method(s).
     Creates encode class with backend API.
 '''
 
@@ -66,18 +66,18 @@ 

Source code for codecipher.a1z52n62.encode

 __copyright__: str = '(C) 2026, https://electux.github.io/codecipher'
 __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation']
 __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE'
-__version__: str = '1.5.0'
+__version__: str = '1.5.1'
 __maintainer__: str = 'Vladimir Roncevic'
 __email__: str = 'elektron.ronca@gmail.com'
 __status__: str = 'Updated'
 
 
-
-[docs] +
+[docs] @dataclass -class A1z52N62Encode: +class A1z52N62Encoder: ''' - Defines class A1z52N62Encode with attribute(s) and method(s). + Defines class A1z52N62Encoder with attribute(s) and method(s). Creates encode class with backend API. It defines: @@ -115,8 +115,8 @@

Source code for codecipher.a1z52n62.encode

         if bool(encode_data):
             self._encode_data = encode_data
 
-
-[docs] +
+[docs] def encode(self, data: Optional[str]) -> None: ''' Encoding data to A1z52N62 format. diff --git a/docs/build/html/_modules/codecipher/atbs.html b/docs/build/html/_modules/codecipher/atbs.html index 1b39c68..f98ccad 100644 --- a/docs/build/html/_modules/codecipher/atbs.html +++ b/docs/build/html/_modules/codecipher/atbs.html @@ -72,7 +72,7 @@

Source code for codecipher.atbs

 __copyright__: str = '(C) 2026, https://electux.github.io/codecipher'
 __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation']
 __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE'
-__version__: str = '1.5.0'
+__version__: str = '1.5.1'
 __maintainer__: str = 'Vladimir Roncevic'
 __email__: str = 'elektron.ronca@gmail.com'
 __status__: str = 'Updated'
diff --git a/docs/build/html/_modules/codecipher/atbs/decode.html b/docs/build/html/_modules/codecipher/atbs/decode.html
index 29466af..68db314 100644
--- a/docs/build/html/_modules/codecipher/atbs/decode.html
+++ b/docs/build/html/_modules/codecipher/atbs/decode.html
@@ -73,7 +73,7 @@ 

Source code for codecipher.atbs.decode

 __copyright__: str = '(C) 2026, https://electux.github.io/codecipher'
 __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation']
 __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE'
-__version__: str = '1.5.0'
+__version__: str = '1.5.1'
 __maintainer__: str = 'Vladimir Roncevic'
 __email__: str = 'elektron.ronca@gmail.com'
 __status__: str = 'Updated'
diff --git a/docs/build/html/_modules/codecipher/atbs/encode.html b/docs/build/html/_modules/codecipher/atbs/encode.html
index 322fb64..0f15683 100644
--- a/docs/build/html/_modules/codecipher/atbs/encode.html
+++ b/docs/build/html/_modules/codecipher/atbs/encode.html
@@ -73,7 +73,7 @@ 

Source code for codecipher.atbs.encode

 __copyright__: str = '(C) 2026, https://electux.github.io/codecipher'
 __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation']
 __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE'
-__version__: str = '1.5.0'
+__version__: str = '1.5.1'
 __maintainer__: str = 'Vladimir Roncevic'
 __email__: str = 'elektron.ronca@gmail.com'
 __status__: str = 'Updated'
diff --git a/docs/build/html/_modules/codecipher/b64.html b/docs/build/html/_modules/codecipher/b64.html
index 4f8239d..5742d2d 100644
--- a/docs/build/html/_modules/codecipher/b64.html
+++ b/docs/build/html/_modules/codecipher/b64.html
@@ -72,7 +72,7 @@ 

Source code for codecipher.b64

 __copyright__: str = '(C) 2026, https://electux.github.io/codecipher'
 __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation']
 __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE'
-__version__: str = '1.5.0'
+__version__: str = '1.5.1'
 __maintainer__: str = 'Vladimir Roncevic'
 __email__: str = 'elektron.ronca@gmail.com'
 __status__: str = 'Updated'
diff --git a/docs/build/html/_modules/codecipher/b64/decode.html b/docs/build/html/_modules/codecipher/b64/decode.html
index 92407a8..ce5c928 100644
--- a/docs/build/html/_modules/codecipher/b64/decode.html
+++ b/docs/build/html/_modules/codecipher/b64/decode.html
@@ -67,7 +67,7 @@ 

Source code for codecipher.b64.decode

 __copyright__: str = '(C) 2026, https://electux.github.io/codecipher'
 __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation']
 __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE'
-__version__: str = '1.5.0'
+__version__: str = '1.5.1'
 __maintainer__: str = 'Vladimir Roncevic'
 __email__: str = 'elektron.ronca@gmail.com'
 __status__: str = 'Updated'
diff --git a/docs/build/html/_modules/codecipher/b64/encode.html b/docs/build/html/_modules/codecipher/b64/encode.html
index 3328478..25e4748 100644
--- a/docs/build/html/_modules/codecipher/b64/encode.html
+++ b/docs/build/html/_modules/codecipher/b64/encode.html
@@ -67,7 +67,7 @@ 

Source code for codecipher.b64.encode

 __copyright__: str = '(C) 2026, https://electux.github.io/codecipher'
 __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation']
 __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE'
-__version__: str = '1.5.0'
+__version__: str = '1.5.1'
 __maintainer__: str = 'Vladimir Roncevic'
 __email__: str = 'elektron.ronca@gmail.com'
 __status__: str = 'Updated'
diff --git a/docs/build/html/_modules/codecipher/caesar.html b/docs/build/html/_modules/codecipher/caesar.html
index ba58a08..3187b92 100644
--- a/docs/build/html/_modules/codecipher/caesar.html
+++ b/docs/build/html/_modules/codecipher/caesar.html
@@ -72,7 +72,7 @@ 

Source code for codecipher.caesar

 __copyright__: str = '(C) 2026, https://electux.github.io/codecipher'
 __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation']
 __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE'
-__version__: str = '1.5.0'
+__version__: str = '1.5.1'
 __maintainer__: str = 'Vladimir Roncevic'
 __email__: str = 'elektron.ronca@gmail.com'
 __status__: str = 'Updated'
diff --git a/docs/build/html/_modules/codecipher/caesar/decode.html b/docs/build/html/_modules/codecipher/caesar/decode.html
index 8e77f48..457c3d2 100644
--- a/docs/build/html/_modules/codecipher/caesar/decode.html
+++ b/docs/build/html/_modules/codecipher/caesar/decode.html
@@ -66,7 +66,7 @@ 

Source code for codecipher.caesar.decode

 __copyright__: str = '(C) 2026, https://electux.github.io/codecipher'
 __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation']
 __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE'
-__version__: str = '1.5.0'
+__version__: str = '1.5.1'
 __maintainer__: str = 'Vladimir Roncevic'
 __email__: str = 'elektron.ronca@gmail.com'
 __status__: str = 'Updated'
diff --git a/docs/build/html/_modules/codecipher/caesar/encode.html b/docs/build/html/_modules/codecipher/caesar/encode.html
index 2227226..4b1910f 100644
--- a/docs/build/html/_modules/codecipher/caesar/encode.html
+++ b/docs/build/html/_modules/codecipher/caesar/encode.html
@@ -66,7 +66,7 @@ 

Source code for codecipher.caesar.encode

 __copyright__: str = '(C) 2026, https://electux.github.io/codecipher'
 __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation']
 __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE'
-__version__: str = '1.5.0'
+__version__: str = '1.5.1'
 __maintainer__: str = 'Vladimir Roncevic'
 __email__: str = 'elektron.ronca@gmail.com'
 __status__: str = 'Updated'
diff --git a/docs/build/html/_modules/codecipher/vernam.html b/docs/build/html/_modules/codecipher/vernam.html
index 4cccc1c..df43eab 100644
--- a/docs/build/html/_modules/codecipher/vernam.html
+++ b/docs/build/html/_modules/codecipher/vernam.html
@@ -72,7 +72,7 @@ 

Source code for codecipher.vernam

 __copyright__: str = '(C) 2026, https://electux.github.io/codecipher'
 __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation']
 __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE'
-__version__: str = '1.5.0'
+__version__: str = '1.5.1'
 __maintainer__: str = 'Vladimir Roncevic'
 __email__: str = 'elektron.ronca@gmail.com'
 __status__: str = 'Updated'
diff --git a/docs/build/html/_modules/codecipher/vernam/decode.html b/docs/build/html/_modules/codecipher/vernam/decode.html
index 652dc1f..42de08c 100644
--- a/docs/build/html/_modules/codecipher/vernam/decode.html
+++ b/docs/build/html/_modules/codecipher/vernam/decode.html
@@ -66,7 +66,7 @@ 

Source code for codecipher.vernam.decode

 __copyright__: str = '(C) 2026, https://electux.github.io/codecipher'
 __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation']
 __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE'
-__version__: str = '1.5.0'
+__version__: str = '1.5.1'
 __maintainer__: str = 'Vladimir Roncevic'
 __email__: str = 'elektron.ronca@gmail.com'
 __status__: str = 'Updated'
diff --git a/docs/build/html/_modules/codecipher/vernam/encode.html b/docs/build/html/_modules/codecipher/vernam/encode.html
index 094f7e6..d68ead4 100644
--- a/docs/build/html/_modules/codecipher/vernam/encode.html
+++ b/docs/build/html/_modules/codecipher/vernam/encode.html
@@ -66,7 +66,7 @@ 

Source code for codecipher.vernam.encode

 __copyright__: str = '(C) 2026, https://electux.github.io/codecipher'
 __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation']
 __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE'
-__version__: str = '1.5.0'
+__version__: str = '1.5.1'
 __maintainer__: str = 'Vladimir Roncevic'
 __email__: str = 'elektron.ronca@gmail.com'
 __status__: str = 'Updated'
diff --git a/docs/build/html/_modules/codecipher/vigenere.html b/docs/build/html/_modules/codecipher/vigenere.html
index 5851579..514b41d 100644
--- a/docs/build/html/_modules/codecipher/vigenere.html
+++ b/docs/build/html/_modules/codecipher/vigenere.html
@@ -73,7 +73,7 @@ 

Source code for codecipher.vigenere

 __copyright__: str = '(C) 2026, https://electux.github.io/codecipher'
 __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation']
 __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE'
-__version__: str = '1.5.0'
+__version__: str = '1.5.1'
 __maintainer__: str = 'Vladimir Roncevic'
 __email__: str = 'elektron.ronca@gmail.com'
 __status__: str = 'Updated'
diff --git a/docs/build/html/_modules/codecipher/vigenere/decode.html b/docs/build/html/_modules/codecipher/vigenere/decode.html
index 6d4153d..1e81988 100644
--- a/docs/build/html/_modules/codecipher/vigenere/decode.html
+++ b/docs/build/html/_modules/codecipher/vigenere/decode.html
@@ -73,7 +73,7 @@ 

Source code for codecipher.vigenere.decode

 __copyright__: str = '(C) 2026, https://electux.github.io/codecipher'
 __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation']
 __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE'
-__version__: str = '1.5.0'
+__version__: str = '1.5.1'
 __maintainer__: str = 'Vladimir Roncevic'
 __email__: str = 'elektron.ronca@gmail.com'
 __status__: str = 'Updated'
diff --git a/docs/build/html/_modules/codecipher/vigenere/encode.html b/docs/build/html/_modules/codecipher/vigenere/encode.html
index 6fdd978..d15efbe 100644
--- a/docs/build/html/_modules/codecipher/vigenere/encode.html
+++ b/docs/build/html/_modules/codecipher/vigenere/encode.html
@@ -73,7 +73,7 @@ 

Source code for codecipher.vigenere.encode

 __copyright__: str = '(C) 2026, https://electux.github.io/codecipher'
 __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation']
 __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE'
-__version__: str = '1.5.0'
+__version__: str = '1.5.1'
 __maintainer__: str = 'Vladimir Roncevic'
 __email__: str = 'elektron.ronca@gmail.com'
 __status__: str = 'Updated'
diff --git a/docs/build/html/_modules/codecipher/vigenere/key_generator.html b/docs/build/html/_modules/codecipher/vigenere/key_generator.html
index 17c1079..8fa2ae3 100644
--- a/docs/build/html/_modules/codecipher/vigenere/key_generator.html
+++ b/docs/build/html/_modules/codecipher/vigenere/key_generator.html
@@ -66,7 +66,7 @@ 

Source code for codecipher.vigenere.key_generator

__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' -__version__: str = '1.5.0' +__version__: str = '1.5.1' __maintainer__: str = 'Vladimir Roncevic' __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' diff --git a/docs/build/html/_modules/codecipher/vigenere/lookup_table.html b/docs/build/html/_modules/codecipher/vigenere/lookup_table.html index 4599cc8..63c57da 100644 --- a/docs/build/html/_modules/codecipher/vigenere/lookup_table.html +++ b/docs/build/html/_modules/codecipher/vigenere/lookup_table.html @@ -65,7 +65,7 @@

Source code for codecipher.vigenere.lookup_table

__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' -__version__: str = '1.5.0' +__version__: str = '1.5.1' __maintainer__: str = 'Vladimir Roncevic' __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' diff --git a/docs/build/html/codecipher.a1z52n62.decode.html b/docs/build/html/codecipher.a1z52n62.decode.html index cd9b3c1..36b5d05 100644 --- a/docs/build/html/codecipher.a1z52n62.decode.html +++ b/docs/build/html/codecipher.a1z52n62.decode.html @@ -63,15 +63,15 @@

Navigation

You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.

-
Info

Defines class A1z52N62Decode with attribute(s) and method(s). +

Info

Defines class A1z52N62Decoder with attribute(s) and method(s). Creates decode class with backend API.

-
-class codecipher.a1z52n62.decode.A1z52N62Decode(_decode_data: str | None = None)[source]
+
+class codecipher.a1z52n62.decode.A1z52N62Decoder(_decode_data: str | None = None)[source]

Bases: object

-

Defines class A1z52N62Decode with attribute(s) and method(s). +

Defines class A1z52N62Decoder with attribute(s) and method(s). Creates decode class with backend API.

It defines:

@@ -90,13 +90,13 @@

Navigation

-
-_decode_data: str | None = None
+
+_decode_data: str | None = None
-
-decode(data: str | None) None[source]
+
+decode(data: str | None) None[source]

Decoding data from A1z52N62 format.

Parameters:
@@ -112,8 +112,8 @@

Navigation

-
-property decode_data: str | None
+
+property decode_data: str | None

Property method for getting decode data.

Returns:
@@ -143,10 +143,10 @@

Navigation

Table of Contents

-
Info

Defines class A1z52N62Encode with attribute(s) and method(s). +

Info

Defines class A1z52N62Encoder with attribute(s) and method(s). Creates encode class with backend API.

-
-class codecipher.a1z52n62.encode.A1z52N62Encode(_encode_data: str | None = None)[source]
+
+class codecipher.a1z52n62.encode.A1z52N62Encoder(_encode_data: str | None = None)[source]

Bases: object

-

Defines class A1z52N62Encode with attribute(s) and method(s). +

Defines class A1z52N62Encoder with attribute(s) and method(s). Creates encode class with backend API.

It defines:

@@ -90,13 +90,13 @@

Navigation

-
-_encode_data: str | None = None
+
+_encode_data: str | None = None
-
-encode(data: str | None) None[source]
+
+encode(data: str | None) None[source]

Encoding data to A1z52N62 format.

Parameters:
@@ -112,8 +112,8 @@

Navigation

-
-property encode_data: str | None
+
+property encode_data: str | None

Property method for getting encode data.

Returns:
@@ -143,10 +143,10 @@

Navigation

Table of Contents

  • codecipher.a1z52n62.encode module
      -
    • A1z52N62Encode diff --git a/docs/build/html/codecipher.a1z52n62.html b/docs/build/html/codecipher.a1z52n62.html index 0e12011..9c9c85f 100644 --- a/docs/build/html/codecipher.a1z52n62.html +++ b/docs/build/html/codecipher.a1z52n62.html @@ -52,19 +52,19 @@

      Submodules
      • codecipher.a1z52n62.decode module
          -
        • A1z52N62Decode
        • codecipher.a1z52n62.encode module
            -
          • A1z52N62Encode @@ -96,7 +96,7 @@

            Submodules
            class codecipher.a1z52n62.A1z52N62[source]
            -

            Bases: A1z52N62Encode, A1z52N62Decode

            +

            Bases: A1z52N62Encoder, A1z52N62Decoder

            Defines class A1z52N62 with attribute(s) and method(s). Creates container class with aggregate backend API.

            It defines:

            diff --git a/docs/build/html/codecipher.html b/docs/build/html/codecipher.html index feab975..4d450cf 100644 --- a/docs/build/html/codecipher.html +++ b/docs/build/html/codecipher.html @@ -53,11 +53,11 @@

            Subpackagescodecipher.a1z52n62 package
            • Submodules diff --git a/docs/build/html/genindex.html b/docs/build/html/genindex.html index 5628287..7b0dbe9 100644 --- a/docs/build/html/genindex.html +++ b/docs/build/html/genindex.html @@ -59,7 +59,7 @@

              _

              • _data_len (codecipher.vigenere.key_generator.KeyGenerator attribute)
              • -
              • _decode_data (codecipher.a1z52n62.decode.A1z52N62Decode attribute) +
              • _decode_data (codecipher.a1z52n62.decode.A1z52N62Decoder attribute)
              • -
              • _encode_data (codecipher.a1z52n62.encode.A1z52N62Encode attribute) +
              • _encode_data (codecipher.a1z52n62.encode.A1z52N62Encoder attribute)
                • (codecipher.atbs.encode.AlephTawBetShinEncode attribute) @@ -103,9 +103,9 @@

                  A

                  • A1z52N62 (class in codecipher.a1z52n62)
                  • -
                  • A1z52N62Decode (class in codecipher.a1z52n62.decode) +
                  • A1z52N62Decoder (class in codecipher.a1z52n62.decode)
                  • -
                  • A1z52N62Encode (class in codecipher.a1z52n62.encode) +
                  • A1z52N62Encoder (class in codecipher.a1z52n62.encode)
                  • AlephTawBetShin (class in codecipher.atbs)
                  • @@ -309,7 +309,7 @@

                    D

                      -
                    • decode_data (codecipher.a1z52n62.decode.A1z52N62Decode property) +
                    • decode_data (codecipher.a1z52n62.decode.A1z52N62Decoder property)
                      • (codecipher.atbs.decode.AlephTawBetShinDecode property) @@ -345,7 +345,7 @@

                        D

                        E

                        - + @@ -114,7 +114,7 @@

                        - + diff --git a/tests/htmlcov/function_index.html b/tests/htmlcov/function_index.html index 26712d8..c26ef60 100644 --- a/tests/htmlcov/function_index.html +++ b/tests/htmlcov/function_index.html @@ -98,7 +98,7 @@

                        - + @@ -106,7 +106,7 @@

                        - + @@ -114,7 +114,7 @@

                        - + @@ -130,7 +130,7 @@

                        - + @@ -138,7 +138,7 @@

                        - + @@ -146,7 +146,7 @@

                        - + diff --git a/tests/htmlcov/z_094bd7de807a5f14___init___py.html b/tests/htmlcov/z_094bd7de807a5f14___init___py.html index 7a18cfa..b2a3bd7 100644 --- a/tests/htmlcov/z_094bd7de807a5f14___init___py.html +++ b/tests/htmlcov/z_094bd7de807a5f14___init___py.html @@ -116,7 +116,7 @@

                        34__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' 

                        35__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] 

                        36__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' 

                        -

                        37__version__: str = '1.5.0' 

                        +

                        37__version__: str = '1.5.1' 

                        38__maintainer__: str = 'Vladimir Roncevic' 

                        39__email__: str = 'elektron.ronca@gmail.com' 

                        40__status__: str = 'Updated' 

                        diff --git a/tests/htmlcov/z_094bd7de807a5f14_decode_py.html b/tests/htmlcov/z_094bd7de807a5f14_decode_py.html index 646bb6d..6ae2763 100644 --- a/tests/htmlcov/z_094bd7de807a5f14_decode_py.html +++ b/tests/htmlcov/z_094bd7de807a5f14_decode_py.html @@ -109,7 +109,7 @@

                        27__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' 

                        28__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] 

                        29__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' 

                        -

                        30__version__: str = '1.5.0' 

                        +

                        30__version__: str = '1.5.1' 

                        31__maintainer__: str = 'Vladimir Roncevic' 

                        32__email__: str = 'elektron.ronca@gmail.com' 

                        33__status__: str = 'Updated' 

                        diff --git a/tests/htmlcov/z_094bd7de807a5f14_encode_py.html b/tests/htmlcov/z_094bd7de807a5f14_encode_py.html index 4b25d3f..d68155b 100644 --- a/tests/htmlcov/z_094bd7de807a5f14_encode_py.html +++ b/tests/htmlcov/z_094bd7de807a5f14_encode_py.html @@ -109,7 +109,7 @@

                        27__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' 

                        28__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] 

                        29__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' 

                        -

                        30__version__: str = '1.5.0' 

                        +

                        30__version__: str = '1.5.1' 

                        31__maintainer__: str = 'Vladimir Roncevic' 

                        32__email__: str = 'elektron.ronca@gmail.com' 

                        33__status__: str = 'Updated' 

                        diff --git a/tests/htmlcov/z_75799433d8182c47___init___py.html b/tests/htmlcov/z_75799433d8182c47___init___py.html index 189a570..ee7e56c 100644 --- a/tests/htmlcov/z_75799433d8182c47___init___py.html +++ b/tests/htmlcov/z_75799433d8182c47___init___py.html @@ -117,7 +117,7 @@

                        35__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' 

                        36__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] 

                        37__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' 

                        -

                        38__version__: str = '1.5.0' 

                        +

                        38__version__: str = '1.5.1' 

                        39__maintainer__: str = 'Vladimir Roncevic' 

                        40__email__: str = 'elektron.ronca@gmail.com' 

                        41__status__: str = 'Updated' 

                        diff --git a/tests/htmlcov/z_75799433d8182c47_decode_py.html b/tests/htmlcov/z_75799433d8182c47_decode_py.html index 915e787..47420b8 100644 --- a/tests/htmlcov/z_75799433d8182c47_decode_py.html +++ b/tests/htmlcov/z_75799433d8182c47_decode_py.html @@ -116,7 +116,7 @@

                        34__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' 

                        35__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] 

                        36__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' 

                        -

                        37__version__: str = '1.5.0' 

                        +

                        37__version__: str = '1.5.1' 

                        38__maintainer__: str = 'Vladimir Roncevic' 

                        39__email__: str = 'elektron.ronca@gmail.com' 

                        40__status__: str = 'Updated' 

                        diff --git a/tests/htmlcov/z_75799433d8182c47_encode_py.html b/tests/htmlcov/z_75799433d8182c47_encode_py.html index 0ee7a4b..c3f4bbe 100644 --- a/tests/htmlcov/z_75799433d8182c47_encode_py.html +++ b/tests/htmlcov/z_75799433d8182c47_encode_py.html @@ -116,7 +116,7 @@

                        34__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' 

                        35__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] 

                        36__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' 

                        -

                        37__version__: str = '1.5.0' 

                        +

                        37__version__: str = '1.5.1' 

                        38__maintainer__: str = 'Vladimir Roncevic' 

                        39__email__: str = 'elektron.ronca@gmail.com' 

                        40__status__: str = 'Updated' 

                        diff --git a/tests/htmlcov/z_75799433d8182c47_key_generator_py.html b/tests/htmlcov/z_75799433d8182c47_key_generator_py.html index a080413..fd1f006 100644 --- a/tests/htmlcov/z_75799433d8182c47_key_generator_py.html +++ b/tests/htmlcov/z_75799433d8182c47_key_generator_py.html @@ -109,7 +109,7 @@

                        27__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' 

                        28__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] 

                        29__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' 

                        -

                        30__version__: str = '1.5.0' 

                        +

                        30__version__: str = '1.5.1' 

                        31__maintainer__: str = 'Vladimir Roncevic' 

                        32__email__: str = 'elektron.ronca@gmail.com' 

                        33__status__: str = 'Updated' 

                        diff --git a/tests/htmlcov/z_75799433d8182c47_lookup_table_py.html b/tests/htmlcov/z_75799433d8182c47_lookup_table_py.html index b14fd4a..31c68d2 100644 --- a/tests/htmlcov/z_75799433d8182c47_lookup_table_py.html +++ b/tests/htmlcov/z_75799433d8182c47_lookup_table_py.html @@ -108,7 +108,7 @@

                        26__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' 

                        27__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] 

                        28__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' 

                        -

                        29__version__: str = '1.5.0' 

                        +

                        29__version__: str = '1.5.1' 

                        30__maintainer__: str = 'Vladimir Roncevic' 

                        31__email__: str = 'elektron.ronca@gmail.com' 

                        32__status__: str = 'Updated' 

                        diff --git a/tests/htmlcov/z_8f54ab6b5b508ca0___init___py.html b/tests/htmlcov/z_8f54ab6b5b508ca0___init___py.html index fa0ba5e..86396ec 100644 --- a/tests/htmlcov/z_8f54ab6b5b508ca0___init___py.html +++ b/tests/htmlcov/z_8f54ab6b5b508ca0___init___py.html @@ -116,7 +116,7 @@

                        34__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' 

                        35__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] 

                        36__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' 

                        -

                        37__version__: str = '1.5.0' 

                        +

                        37__version__: str = '1.5.1' 

                        38__maintainer__: str = 'Vladimir Roncevic' 

                        39__email__: str = 'elektron.ronca@gmail.com' 

                        40__status__: str = 'Updated' 

                        diff --git a/tests/htmlcov/z_8f54ab6b5b508ca0_decode_py.html b/tests/htmlcov/z_8f54ab6b5b508ca0_decode_py.html index 7298df7..77cd588 100644 --- a/tests/htmlcov/z_8f54ab6b5b508ca0_decode_py.html +++ b/tests/htmlcov/z_8f54ab6b5b508ca0_decode_py.html @@ -110,7 +110,7 @@

                        28__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' 

                        29__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] 

                        30__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' 

                        -

                        31__version__: str = '1.5.0' 

                        +

                        31__version__: str = '1.5.1' 

                        32__maintainer__: str = 'Vladimir Roncevic' 

                        33__email__: str = 'elektron.ronca@gmail.com' 

                        34__status__: str = 'Updated' 

                        diff --git a/tests/htmlcov/z_8f54ab6b5b508ca0_encode_py.html b/tests/htmlcov/z_8f54ab6b5b508ca0_encode_py.html index cd04b77..2491587 100644 --- a/tests/htmlcov/z_8f54ab6b5b508ca0_encode_py.html +++ b/tests/htmlcov/z_8f54ab6b5b508ca0_encode_py.html @@ -110,7 +110,7 @@

                        28__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' 

                        29__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] 

                        30__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' 

                        -

                        31__version__: str = '1.5.0' 

                        +

                        31__version__: str = '1.5.1' 

                        32__maintainer__: str = 'Vladimir Roncevic' 

                        33__email__: str = 'elektron.ronca@gmail.com' 

                        34__status__: str = 'Updated' 

                        diff --git a/tests/htmlcov/z_96938f9400a5cdf6___init___py.html b/tests/htmlcov/z_96938f9400a5cdf6___init___py.html index b1031c0..5e30c70 100644 --- a/tests/htmlcov/z_96938f9400a5cdf6___init___py.html +++ b/tests/htmlcov/z_96938f9400a5cdf6___init___py.html @@ -106,8 +106,8 @@

                        24from typing import List 

                        25 

                        26try: 

                        -

                        27 from codecipher.a1z52n62.encode import A1z52N62Encode 

                        -

                        28 from codecipher.a1z52n62.decode import A1z52N62Decode 

                        +

                        27 from codecipher.a1z52n62.encode import A1z52N62Encoder 

                        +

                        28 from codecipher.a1z52n62.decode import A1z52N62Decoder 

                        29except ImportError as ats_error_message: # pragma: no cover 

                        30 # Force exit python ####################################################### 

                        31 sys.exit(f'\n{__file__}\n{ats_error_message}\n') # pragma: no cover 

                        @@ -116,13 +116,13 @@

                        34__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' 

                        35__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] 

                        36__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' 

                        -

                        37__version__: str = '1.5.0' 

                        +

                        37__version__: str = '1.5.1' 

                        38__maintainer__: str = 'Vladimir Roncevic' 

                        39__email__: str = 'elektron.ronca@gmail.com' 

                        40__status__: str = 'Updated' 

                        41 

                        42 

                        -

                        43class A1z52N62(A1z52N62Encode, A1z52N62Decode): 

                        +

                        43class A1z52N62(A1z52N62Encoder, A1z52N62Decoder): 

                        44 ''' 

                        45 Defines class A1z52N62 with attribute(s) and method(s). 

                        46 Creates container class with aggregate backend API. 

                        diff --git a/tests/htmlcov/z_96938f9400a5cdf6_decode_py.html b/tests/htmlcov/z_96938f9400a5cdf6_decode_py.html index e399a66..5adbff2 100644 --- a/tests/htmlcov/z_96938f9400a5cdf6_decode_py.html +++ b/tests/htmlcov/z_96938f9400a5cdf6_decode_py.html @@ -98,7 +98,7 @@

                        16 You should have received a copy of the GNU General Public License along 

                        17 with this program. If not, see <http://www.gnu.org/licenses/>. 

                        18Info 

                        -

                        19 Defines class A1z52N62Decode with attribute(s) and method(s). 

                        +

                        19 Defines class A1z52N62Decoder with attribute(s) and method(s). 

                        20 Creates decode class with backend API. 

                        21''' 

                        22 

                        @@ -109,16 +109,16 @@

                        27__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' 

                        28__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] 

                        29__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' 

                        -

                        30__version__: str = '1.5.0' 

                        +

                        30__version__: str = '1.5.1' 

                        31__maintainer__: str = 'Vladimir Roncevic' 

                        32__email__: str = 'elektron.ronca@gmail.com' 

                        33__status__: str = 'Updated' 

                        34 

                        35 

                        36@dataclass 

                        -

                        37class A1z52N62Decode: 

                        +

                        37class A1z52N62Decoder: 

                        38 ''' 

                        -

                        39 Defines class A1z52N62Decode with attribute(s) and method(s). 

                        +

                        39 Defines class A1z52N62Decoder with attribute(s) and method(s). 

                        40 Creates decode class with backend API. 

                        41 

                        42 It defines: 

                        diff --git a/tests/htmlcov/z_96938f9400a5cdf6_encode_py.html b/tests/htmlcov/z_96938f9400a5cdf6_encode_py.html index 5f43e68..a906c68 100644 --- a/tests/htmlcov/z_96938f9400a5cdf6_encode_py.html +++ b/tests/htmlcov/z_96938f9400a5cdf6_encode_py.html @@ -98,7 +98,7 @@

                        16 You should have received a copy of the GNU General Public License along 

                        17 with this program. If not, see <http://www.gnu.org/licenses/>. 

                        18Info 

                        -

                        19 Defines class A1z52N62Encode with attribute(s) and method(s). 

                        +

                        19 Defines class A1z52N62Encoder with attribute(s) and method(s). 

                        20 Creates encode class with backend API. 

                        21''' 

                        22 

                        @@ -109,16 +109,16 @@

                        27__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' 

                        28__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] 

                        29__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' 

                        -

                        30__version__: str = '1.5.0' 

                        +

                        30__version__: str = '1.5.1' 

                        31__maintainer__: str = 'Vladimir Roncevic' 

                        32__email__: str = 'elektron.ronca@gmail.com' 

                        33__status__: str = 'Updated' 

                        34 

                        35 

                        36@dataclass 

                        -

                        37class A1z52N62Encode: 

                        +

                        37class A1z52N62Encoder: 

                        38 ''' 

                        -

                        39 Defines class A1z52N62Encode with attribute(s) and method(s). 

                        +

                        39 Defines class A1z52N62Encoder with attribute(s) and method(s). 

                        40 Creates encode class with backend API. 

                        41 

                        42 It defines: 

                        diff --git a/tests/htmlcov/z_9927f90504198b80___init___py.html b/tests/htmlcov/z_9927f90504198b80___init___py.html index 23e99c6..caf1f02 100644 --- a/tests/htmlcov/z_9927f90504198b80___init___py.html +++ b/tests/htmlcov/z_9927f90504198b80___init___py.html @@ -116,7 +116,7 @@

                        34__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' 

                        35__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] 

                        36__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' 

                        -

                        37__version__: str = '1.5.0' 

                        +

                        37__version__: str = '1.5.1' 

                        38__maintainer__: str = 'Vladimir Roncevic' 

                        39__email__: str = 'elektron.ronca@gmail.com' 

                        40__status__: str = 'Updated' 

                        diff --git a/tests/htmlcov/z_9927f90504198b80_decode_py.html b/tests/htmlcov/z_9927f90504198b80_decode_py.html index 27efef7..34eb426 100644 --- a/tests/htmlcov/z_9927f90504198b80_decode_py.html +++ b/tests/htmlcov/z_9927f90504198b80_decode_py.html @@ -116,7 +116,7 @@

                        34__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' 

                        35__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] 

                        36__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' 

                        -

                        37__version__: str = '1.5.0' 

                        +

                        37__version__: str = '1.5.1' 

                        38__maintainer__: str = 'Vladimir Roncevic' 

                        39__email__: str = 'elektron.ronca@gmail.com' 

                        40__status__: str = 'Updated' 

                        diff --git a/tests/htmlcov/z_9927f90504198b80_encode_py.html b/tests/htmlcov/z_9927f90504198b80_encode_py.html index 30502e4..0eb457d 100644 --- a/tests/htmlcov/z_9927f90504198b80_encode_py.html +++ b/tests/htmlcov/z_9927f90504198b80_encode_py.html @@ -116,7 +116,7 @@

                        34__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' 

                        35__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] 

                        36__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' 

                        -

                        37__version__: str = '1.5.0' 

                        +

                        37__version__: str = '1.5.1' 

                        38__maintainer__: str = 'Vladimir Roncevic' 

                        39__email__: str = 'elektron.ronca@gmail.com' 

                        40__status__: str = 'Updated' 

                        diff --git a/tests/htmlcov/z_9927f90504198b80_lookup_table_py.html b/tests/htmlcov/z_9927f90504198b80_lookup_table_py.html index aeee22d..e1d14fd 100644 --- a/tests/htmlcov/z_9927f90504198b80_lookup_table_py.html +++ b/tests/htmlcov/z_9927f90504198b80_lookup_table_py.html @@ -107,7 +107,7 @@

                        25__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' 

                        26__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] 

                        27__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' 

                        -

                        28__version__: str = '1.5.0' 

                        +

                        28__version__: str = '1.5.1' 

                        29__maintainer__: str = 'Vladimir Roncevic' 

                        30__email__: str = 'elektron.ronca@gmail.com' 

                        31__status__: str = 'Updated' 

                        diff --git a/tests/htmlcov/z_aba196749d301797___init___py.html b/tests/htmlcov/z_aba196749d301797___init___py.html index cc31f49..98c1d87 100644 --- a/tests/htmlcov/z_aba196749d301797___init___py.html +++ b/tests/htmlcov/z_aba196749d301797___init___py.html @@ -116,7 +116,7 @@

                        34__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' 

                        35__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] 

                        36__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' 

                        -

                        37__version__: str = '1.5.0' 

                        +

                        37__version__: str = '1.5.1' 

                        38__maintainer__: str = 'Vladimir Roncevic' 

                        39__email__: str = 'elektron.ronca@gmail.com' 

                        40__status__: str = 'Updated' 

                        diff --git a/tests/htmlcov/z_aba196749d301797_decode_py.html b/tests/htmlcov/z_aba196749d301797_decode_py.html index 532d543..36d126a 100644 --- a/tests/htmlcov/z_aba196749d301797_decode_py.html +++ b/tests/htmlcov/z_aba196749d301797_decode_py.html @@ -109,7 +109,7 @@

                        27__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' 

                        28__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] 

                        29__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' 

                        -

                        30__version__: str = '1.5.0' 

                        +

                        30__version__: str = '1.5.1' 

                        31__maintainer__: str = 'Vladimir Roncevic' 

                        32__email__: str = 'elektron.ronca@gmail.com' 

                        33__status__: str = 'Updated' 

                        diff --git a/tests/htmlcov/z_aba196749d301797_encode_py.html b/tests/htmlcov/z_aba196749d301797_encode_py.html index 3df5cc6..3c2e1e9 100644 --- a/tests/htmlcov/z_aba196749d301797_encode_py.html +++ b/tests/htmlcov/z_aba196749d301797_encode_py.html @@ -109,7 +109,7 @@

                        27__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' 

                        28__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] 

                        29__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' 

                        -

                        30__version__: str = '1.5.0' 

                        +

                        30__version__: str = '1.5.1' 

                        31__maintainer__: str = 'Vladimir Roncevic' 

                        32__email__: str = 'elektron.ronca@gmail.com' 

                        33__status__: str = 'Updated' 

                        diff --git a/tests/vernam_test.py b/tests/vernam_test.py index 5a2283e..f34bc80 100644 --- a/tests/vernam_test.py +++ b/tests/vernam_test.py @@ -36,7 +36,7 @@ __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__: str = 'https://github.com/electux/codecipher/blob/dev/LICENSE' -__version__: str = '1.5.0' +__version__: str = '1.5.1' __maintainer__: str = 'Vladimir Roncevic' __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' diff --git a/tests/vigenere_test.py b/tests/vigenere_test.py index b827428..c5f4ebc 100644 --- a/tests/vigenere_test.py +++ b/tests/vigenere_test.py @@ -36,7 +36,7 @@ __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__: str = 'https://github.com/electux/codecipher/blob/dev/LICENSE' -__version__: str = '1.5.0' +__version__: str = '1.5.1' __maintainer__: str = 'Vladimir Roncevic' __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' From b969e60eaf3e755ca6b4b0850c39ba148ae41d30 Mon Sep 17 00:00:00 2001 From: Vladimir Roncevic Date: Tue, 9 Jun 2026 19:25:50 +0200 Subject: [PATCH 02/10] [codecipher] Refactor based on SOLID principles --- README.md | 6 +- codecipher/a1z52n62/__init__.py | 18 ++- codecipher/a1z52n62/a1z52n62.py | 33 ++-- codecipher/a1z52n62/data_validator.py | 15 +- codecipher/a1z52n62/icharacter_validator.py | 4 +- codecipher/a1z52n62/idata_validator.py | 4 +- codecipher/a1z52n62/ivalidation_engine.py | 71 ++++++++ codecipher/a1z52n62/validation_engine.py | 89 ++++++++++ codecipher/atbs/__init__.py | 58 ++++--- codecipher/atbs/atbs.py | 118 ++++++++++++++ codecipher/atbs/character_validator.py | 58 +++++++ codecipher/atbs/data_validator.py | 77 +++++++++ codecipher/atbs/{decode.py => decoder.py} | 42 ++--- codecipher/atbs/{encode.py => encoder.py} | 42 ++--- codecipher/atbs/iatbs.py | 85 ++++++++++ codecipher/atbs/icharacter_validator.py | 57 +++++++ codecipher/atbs/idata_validator.py | 57 +++++++ codecipher/atbs/idecoder.py | 70 ++++++++ codecipher/atbs/iencoder.py | 70 ++++++++ codecipher/atbs/ivalidation_engine.py | 71 ++++++++ codecipher/atbs/lookup_table.py | 2 +- codecipher/atbs/validation_engine.py | 89 ++++++++++ codecipher/b64/__init__.py | 55 +++---- codecipher/b64/b64.py | 121 ++++++++++++++ codecipher/b64/{decode.py => b64decoder.py} | 37 +++-- codecipher/b64/{encode.py => b64encoder.py} | 37 +++-- codecipher/b64/character_validator.py | 68 ++++++++ codecipher/b64/data_validator.py | 77 +++++++++ codecipher/b64/ib64.py | 95 +++++++++++ codecipher/b64/ib64decoder.py | 70 ++++++++ codecipher/b64/ib64encoder.py | 70 ++++++++ codecipher/b64/icharacter_validator.py | 57 +++++++ codecipher/b64/idata_validator.py | 57 +++++++ codecipher/b64/ivalidation_engine.py | 71 ++++++++ codecipher/b64/validation_engine.py | 89 ++++++++++ codecipher/caesar/__init__.py | 43 ++--- codecipher/caesar/caesar.py | 116 +++++++++++++ codecipher/caesar/{decode.py => decoder.py} | 28 +++- codecipher/caesar/{encode.py => encoder.py} | 28 +++- codecipher/caesar/icaesar.py | 93 +++++++++++ codecipher/caesar/icaesar_decoder.py | 64 ++++++++ codecipher/caesar/icaesar_encoder.py | 64 ++++++++ docs/build/html/_modules/codecipher/atbs.html | 18 +-- .../html/_modules/codecipher/atbs/decode.html | 18 +-- .../html/_modules/codecipher/atbs/encode.html | 18 +-- .../html/_modules/codecipher/b64/decode.html | 8 +- .../html/_modules/codecipher/b64/encode.html | 4 +- docs/build/html/codecipher.atbs.decode.html | 32 ++-- docs/build/html/codecipher.atbs.encode.html | 32 ++-- docs/build/html/codecipher.atbs.html | 30 ++-- .../html/codecipher.atbs.lookup_table.html | 2 +- docs/build/html/codecipher.b64.decode.html | 8 +- docs/build/html/codecipher.b64.encode.html | 4 +- docs/build/html/codecipher.html | 6 +- docs/build/html/genindex.html | 18 +-- docs/build/html/searchindex.js | 2 +- tests/a1z52n62_test.py | 134 ++++++++++++--- tests/atbs_test.py | 152 ++++++++++++++---- tests/b64_test.py | 113 ++++++++++++- tests/caesar_test.py | 131 +++++++++++++-- tests/codecipher_coverage.json | 2 +- tests/htmlcov/class_index.html | 6 +- tests/htmlcov/function_index.html | 14 +- .../htmlcov/z_8f54ab6b5b508ca0_decode_py.html | 8 +- .../htmlcov/z_8f54ab6b5b508ca0_encode_py.html | 4 +- .../z_9927f90504198b80___init___py.html | 14 +- .../htmlcov/z_9927f90504198b80_decode_py.html | 10 +- .../htmlcov/z_9927f90504198b80_encode_py.html | 10 +- .../z_9927f90504198b80_lookup_table_py.html | 2 +- 69 files changed, 2867 insertions(+), 409 deletions(-) create mode 100644 codecipher/a1z52n62/ivalidation_engine.py create mode 100644 codecipher/a1z52n62/validation_engine.py create mode 100644 codecipher/atbs/atbs.py create mode 100644 codecipher/atbs/character_validator.py create mode 100644 codecipher/atbs/data_validator.py rename codecipher/atbs/{decode.py => decoder.py} (72%) rename codecipher/atbs/{encode.py => encoder.py} (72%) create mode 100644 codecipher/atbs/iatbs.py create mode 100644 codecipher/atbs/icharacter_validator.py create mode 100644 codecipher/atbs/idata_validator.py create mode 100644 codecipher/atbs/idecoder.py create mode 100644 codecipher/atbs/iencoder.py create mode 100644 codecipher/atbs/ivalidation_engine.py create mode 100644 codecipher/atbs/validation_engine.py create mode 100644 codecipher/b64/b64.py rename codecipher/b64/{decode.py => b64decoder.py} (71%) rename codecipher/b64/{encode.py => b64encoder.py} (71%) create mode 100644 codecipher/b64/character_validator.py create mode 100644 codecipher/b64/data_validator.py create mode 100644 codecipher/b64/ib64.py create mode 100644 codecipher/b64/ib64decoder.py create mode 100644 codecipher/b64/ib64encoder.py create mode 100644 codecipher/b64/icharacter_validator.py create mode 100644 codecipher/b64/idata_validator.py create mode 100644 codecipher/b64/ivalidation_engine.py create mode 100644 codecipher/b64/validation_engine.py create mode 100644 codecipher/caesar/caesar.py rename codecipher/caesar/{decode.py => decoder.py} (87%) rename codecipher/caesar/{encode.py => encoder.py} (87%) create mode 100644 codecipher/caesar/icaesar.py create mode 100644 codecipher/caesar/icaesar_decoder.py create mode 100644 codecipher/caesar/icaesar_encoder.py diff --git a/README.md b/README.md index b88a544..5158ef5 100644 --- a/README.md +++ b/README.md @@ -105,7 +105,7 @@ You can use Dockerfile to create image/container. ```python from codecipher.a1z52n62 import A1z52N62 -from codecipher.atbs import AlephTawBetShin +from codecipher.atbs import ATBS from codecipher.b64 import B64 from codecipher.caesar import Caesar from codecipher.vigenere import Vigenere @@ -124,8 +124,8 @@ cipher.decode(cipher.encode_data) print(cipher.decode_data) print(50*'=') -print("AlephTawBetShin cipher") -cipher = AlephTawBetShin() +print("ATBS cipher") +cipher = ATBS() data = "More Human Than Human01 Is Our Motto" # encoding data cipher.encode(data) diff --git a/codecipher/a1z52n62/__init__.py b/codecipher/a1z52n62/__init__.py index 49687da..15ca667 100644 --- a/codecipher/a1z52n62/__init__.py +++ b/codecipher/a1z52n62/__init__.py @@ -26,9 +26,13 @@ from .idecoder import IA1z52N62Decoder from .encoder import A1z52N62Encoder from .decoder import A1z52N62Decoder -from .a1z52n62_config import ( - A1z52N62Config -) +from .a1z52n62_config import A1z52N62Config +from .ivalidation_engine import IValidationEngine +from .validation_engine import ValidationEngine +from .idata_validator import IDataValidator +from .data_validator import DataValidator +from .icharacter_validator import ICharacterValidator +from .character_validator import CharacterValidator __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -46,5 +50,11 @@ 'A1z52N62Encoder', 'A1z52N62Decoder', 'A1z52N62', - 'A1z52N62Config' + 'A1z52N62Config', + 'IValidationEngine', + 'ValidationEngine', + 'IDataValidator', + 'DataValidator', + 'ICharacterValidator', + 'CharacterValidator' ] diff --git a/codecipher/a1z52n62/a1z52n62.py b/codecipher/a1z52n62/a1z52n62.py index c755acb..b394bc9 100644 --- a/codecipher/a1z52n62/a1z52n62.py +++ b/codecipher/a1z52n62/a1z52n62.py @@ -27,10 +27,10 @@ from .idecoder import IA1z52N62Decoder from .decoder import A1z52N62Decoder from .a1z52n62_config import A1z52N62Config -from .icharacter_validator import ICharacterValidator -from .character_validator import CharacterValidator -from .idata_validator import IDataValidator +from .ivalidation_engine import IValidationEngine +from .validation_engine import ValidationEngine from .data_validator import DataValidator +from .character_validator import CharacterValidator __author__: str = 'Vladimir Roncevic' @@ -52,12 +52,11 @@ class A1z52N62(IA1z52N62): :attributes: | __config - Configuration for algorithm. - | __char_validator - Validator for characters. - | __data_validator - Validator for data. + | __validation_engine - Engine for data validation. | __encoder - Encoder for algorithm. | __decoder - Decoder for algorithm. :methods: - | __init__ - Initials A1z52N62 constructor. + | __init__ - Initializes A1z52N62 constructor. | encode - Encoding data to A1z52N62 format. | encode_data - Property method for getting encode data. | decode - Decoding data from A1z52N62 format. @@ -67,30 +66,28 @@ class A1z52N62(IA1z52N62): def __init__( self, config: Optional[A1z52N62Config] = None, - char_validator: Optional[ICharacterValidator] = None, - data_validator: Optional[IDataValidator] = None, + validation_engine: Optional[IValidationEngine] = None, encoder: Optional[IA1z52N62Encoder] = None, decoder: Optional[IA1z52N62Decoder] = None, ) -> None: ''' - Initials A1z52N62 constructor. + Initializes A1z52N62 constructor. :param config: Configuration for algorithm | None :type config: - :param char_validator: Validator for characters | None - :type char_validator: - :param data_validator: Validator for data | None - :type data_validator: + :param validation_engine: Engine for data validation | None + :type validation_engine: :param encoder: Encoder for algorithm | None :type encoder: :param decoder: Decoder for algorithm | None :type decoder: :exceptions: None ''' - # Dependecy injection for config, encode, decode or use default self.__config = config or A1z52N62Config() - self.__char_validator: ICharacterValidator = char_validator or CharacterValidator() - self.__data_validator: IDataValidator = data_validator or DataValidator(self.__char_validator) + + self.__validation_engine: IValidationEngine = validation_engine or ValidationEngine( + [DataValidator(CharacterValidator())] + ) self.__encoder: IA1z52N62Encoder = encoder or A1z52N62Encoder(_config=self.__config) self.__decoder: IA1z52N62Decoder = decoder or A1z52N62Decoder(_config=self.__config) @@ -104,7 +101,7 @@ def encode(self, data: Optional[str]) -> bool: :rtype: :exceptions: None ''' - if not bool(data) or not self.__data_validator.is_valid(data): + if not bool(data) or not self.__validation_engine.is_valid(data): return False return self.__encoder.encode(data) @@ -132,7 +129,7 @@ def decode(self, data: Optional[str]) -> bool: if not bool(data) or not self.__decoder.decode(data): return False - return self.__data_validator.is_valid(self.decode_data) + return self.__validation_engine.is_valid(self.decode_data) @property def decode_data(self) -> Optional[str]: diff --git a/codecipher/a1z52n62/data_validator.py b/codecipher/a1z52n62/data_validator.py index d0c01ed..3a5dab0 100644 --- a/codecipher/a1z52n62/data_validator.py +++ b/codecipher/a1z52n62/data_validator.py @@ -37,19 +37,30 @@ class DataValidator(IDataValidator): ''' Defines class DataValidator with attribute(s) and method(s). + Creates data validator class with backend API. + + It defines: + + :attributes: + | __char_validator - Validator for individual characters. + :methods: + | __init__ - Initializes DataValidator constructor. + | is_valid - Validates if data is in A1z52N62 format. ''' def __init__(self, char_validator: Optional[ICharacterValidator] = None) -> None: ''' - Initials DataValidator constructor. + Initializes DataValidator constructor. + :param char_validator: Character validator instance | None + :type char_validator: :exceptions: None ''' self.__char_validator: ICharacterValidator = char_validator or CharacterValidator() def is_valid(self, data: Optional[str]) -> bool: ''' - Validates if data is in A1z52N62 format. + Validating if data is in A1z52N62 format. :param data: Data which should be validated | None :type data: diff --git a/codecipher/a1z52n62/icharacter_validator.py b/codecipher/a1z52n62/icharacter_validator.py index 5dac2de..6b1fa4b 100644 --- a/codecipher/a1z52n62/icharacter_validator.py +++ b/codecipher/a1z52n62/icharacter_validator.py @@ -40,13 +40,13 @@ class ICharacterValidator(ABC): :attributes: None :methods: - | is_valid_char - Validates if a single character belongs to A1z52N62. + | is_valid_char - Validates if a character is a valid constituent. ''' @abstractmethod def is_valid_char(self, char: Optional[str]) -> bool: ''' - Validates if a character is a valid A1z52N62 alphabet constituent. + Validating if a character is a valid A1z52N62 alphabet constituent. :param char: Single character to validate | None :type char: diff --git a/codecipher/a1z52n62/idata_validator.py b/codecipher/a1z52n62/idata_validator.py index 70cce81..92c5f6b 100644 --- a/codecipher/a1z52n62/idata_validator.py +++ b/codecipher/a1z52n62/idata_validator.py @@ -40,13 +40,13 @@ class IDataValidator(ABC): :attributes: None :methods: - | is_valid - Validates if data is in A1z52N62 format. + | is_valid - Validates data using specific validation logic. ''' @abstractmethod def is_valid(self, data: Optional[str]) -> bool: ''' - Validates if data is in A1z52N62 format. + Validating data using specific validation logic. :param data: Data which should be validated | None :type data: diff --git a/codecipher/a1z52n62/ivalidation_engine.py b/codecipher/a1z52n62/ivalidation_engine.py new file mode 100644 index 0000000..8672cc6 --- /dev/null +++ b/codecipher/a1z52n62/ivalidation_engine.py @@ -0,0 +1,71 @@ +# -*- coding: UTF-8 -*- + +''' +Module + ivalidation_engine.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines interface IValidationEngine for ValidationEngine class. +''' + +from abc import ABC, abstractmethod +from typing import List, Optional +from .idata_validator import IDataValidator + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class IValidationEngine(ABC): + ''' + Defines interface IValidationEngine with methods. + + It defines: + + :attributes: None + :methods: + | add_validator - Adds a new validator to the engine. + | is_valid - Validates data using all registered validators. + ''' + + @abstractmethod + def add_validator(self, validator: IDataValidator) -> None: + ''' + Adding a new validator to the engine. + + :param validator: Validator instance to add. + :type validator: + :return: None + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Method add_validator must be implemented.') + + @abstractmethod + def is_valid(self, data: Optional[str]) -> bool: + ''' + Validating data using all registered validators. + + :param data: Data which should be validated | None + :type data: + :return: True (if all valid) | False (if any invalid) + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Method is_valid must be implemented.') diff --git a/codecipher/a1z52n62/validation_engine.py b/codecipher/a1z52n62/validation_engine.py new file mode 100644 index 0000000..c37fa6c --- /dev/null +++ b/codecipher/a1z52n62/validation_engine.py @@ -0,0 +1,89 @@ +# -*- coding: UTF-8 -*- + +''' +Module + validation_engine.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines class ValidationEngine for managing multiple validators. +''' + +from typing import List, Optional +from .ivalidation_engine import IValidationEngine +from .idata_validator import IDataValidator + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class ValidationEngine(IValidationEngine): + ''' + Defines class ValidationEngine with attribute(s) and method(s). + Creates validation engine class with backend API. + + It defines: + + :attributes: + | __validators - List of registered data validators. + :methods: + | __init__ - Initializes ValidationEngine constructor. + | add_validator - Adds a new validator to the engine. + | is_valid - Validates data using all registered validators. + ''' + + def __init__(self, validators: Optional[List[IDataValidator]] = None) -> None: + ''' + Initializes ValidationEngine constructor. + + :param validators: Initial list of validators | None + :type validators: + :exceptions: None + ''' + self.__validators: List[IDataValidator] = validators or [] + + def add_validator(self, validator: IDataValidator) -> None: + ''' + Adding a new validator to the engine. + + :param validator: Validator instance to add. + :type validator: + :return: None + :exceptions: None + ''' + if validator not in self.__validators: + self.__validators.append(validator) + + def is_valid(self, data: Optional[str]) -> bool: + ''' + Validating data using all registered validators. + + :param data: Data which should be validated | None + :type data: + :return: True (if all valid) | False (if any invalid) + :rtype: + :exceptions: None + ''' + if not bool(data): + return False + + for validator in self.__validators: + if not validator.is_valid(data): + return False + return True diff --git a/codecipher/atbs/__init__.py b/codecipher/atbs/__init__.py index d679959..1ce4dfe 100644 --- a/codecipher/atbs/__init__.py +++ b/codecipher/atbs/__init__.py @@ -16,19 +16,22 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines class AlephTawBetShin with attribute(s) and method(s). - Creates container class with aggregate backend API. + Initialization for atbs package. ''' -import sys from typing import List - -try: - from codecipher.atbs.encode import AlephTawBetShinEncode - from codecipher.atbs.decode import AlephTawBetShinDecode -except ImportError as ats_error_message: # pragma: no cover - # Force exit python ####################################################### - sys.exit(f'\n{__file__}\n{ats_error_message}\n') # pragma: no cover +from .iatbs import IATBS +from .iencoder import IATBSEncoder +from .idecoder import IATBSDecoder +from .encoder import ATBSEncoder +from .decoder import ATBSDecoder +from .atbs import ATBS +from .ivalidation_engine import IValidationEngine +from .validation_engine import ValidationEngine +from .idata_validator import IDataValidator +from .data_validator import DataValidator +from .icharacter_validator import ICharacterValidator +from .character_validator import CharacterValidator __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -39,24 +42,17 @@ __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' - -class AlephTawBetShin(AlephTawBetShinEncode, AlephTawBetShinDecode): - ''' - Defines class AlephTawBetShin with attribute(s) and method(s). - Creates container class with aggregate backend API. - - It defines: - - :attributes: - | None. - :methods: - | __init__ - Initials AlephTawBetShin constructor. - ''' - - def __init__(self) -> None: - ''' - Initials AlephTawBetShin constructor. - - :exceptions: None - ''' - super().__init__() +__all__: List[str] = [ + 'IATBS', + 'IATBSEncoder', + 'IATBSDecoder', + 'ATBSEncoder', + 'ATBSDecoder', + 'ATBS', + 'IValidationEngine', + 'ValidationEngine', + 'IDataValidator', + 'DataValidator', + 'ICharacterValidator', + 'CharacterValidator' +] diff --git a/codecipher/atbs/atbs.py b/codecipher/atbs/atbs.py new file mode 100644 index 0000000..56c2eaa --- /dev/null +++ b/codecipher/atbs/atbs.py @@ -0,0 +1,118 @@ +# -*- coding: UTF-8 -*- + +''' +Module + aleph_taw_bet_shin.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines class AlephTawBetShin with attribute(s) and method(s). + Creates container class with aggregate backend API. +''' + +from typing import Optional, List +from .iatbs import IATBS +from .iencoder import IATBSEncoder +from .encoder import ATBSEncoder +from .idecoder import IATBSDecoder +from .decoder import ATBSDecoder +from .ivalidation_engine import IValidationEngine +from .validation_engine import ValidationEngine +from .data_validator import DataValidator +from .character_validator import CharacterValidator + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class ATBS(IATBS): + ''' + Defines class ATBS with attribute(s) and method(s). + Creates container class with aggregate backend API. + + It defines: + + :attributes: + | __config - Configuration for algorithm. + | __validation_engine - Engine for data validation. + | __encoder - Encoder for algorithm. + | __decoder - Decoder for algorithm. + :methods: + | __init__ - Initializes ATBS constructor. + | encode - Encoding data to ATBS format. + | encode_data - Property method for getting encode data. + | decode - Decoding data from ATBS format. + | decode_data - Property method for getting decode data. + ''' + + def __init__( + self, + validation_engine: Optional[IValidationEngine] = None, + encoder: Optional[IATBSEncoder] = None, + decoder: Optional[IATBSDecoder] = None, + ) -> None: + ''' + Initializes ATBS constructor. + + :param config: Configuration for algorithm | None + :type config: + :param validation_engine: Engine for data validation | None + :type validation_engine: + :param encoder: Encoder for algorithm | None + :type encoder: + :param decoder: Decoder for algorithm | None + :type decoder: + :exceptions: None + ''' + self.__validation_engine: IValidationEngine = validation_engine or ValidationEngine( + [DataValidator(CharacterValidator())] + ) + self.__encoder: IATBSEncoder = encoder or ATBSEncoder() + self.__decoder: IATBSDecoder = decoder or ATBSDecoder() + + def encode(self, data: Optional[str]) -> bool: + ''' + Encoding data to ATBS format. + ''' + if not bool(data) or not self.__validation_engine.is_valid(data): + return False + return self.__encoder.encode(data) + + @property + def encode_data(self) -> Optional[str]: + ''' + Property method for getting encode data. + ''' + return self.__encoder.encode_data + + def decode(self, data: Optional[str]) -> bool: + ''' + Decoding data from ATBS format. + ''' + if not bool(data) or not self.__decoder.decode(data): + return False + + return self.__validation_engine.is_valid(self.decode_data) + + @property + def decode_data(self) -> Optional[str]: + ''' + Property method for getting decode data. + ''' + return self.__decoder.decode_data diff --git a/codecipher/atbs/character_validator.py b/codecipher/atbs/character_validator.py new file mode 100644 index 0000000..903e2b6 --- /dev/null +++ b/codecipher/atbs/character_validator.py @@ -0,0 +1,58 @@ +# -*- coding: UTF-8 -*- + +''' +Module + character_validator.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines class CharacterValidator for ATBS. +''' + +from typing import Optional, Set +from codecipher.atbs.lookup_table import LOOKUP_TABLE +from .icharacter_validator import ICharacterValidator + +class CharacterValidator(ICharacterValidator): + ''' + Defines class CharacterValidator with attribute(s) and method(s). + Creates character validator class for ATBS. + + It defines: + + :attributes: + | __allowed_chars - Characters supported by ATBS lookup table. + :methods: + | __init__ - Initializes CharacterValidator constructor. + | is_valid_char - Validates if a single character belongs to ATBS. + ''' + + def __init__(self) -> None: + ''' + Initializes CharacterValidator constructor. + ''' + self.__allowed_chars: Set[str] = set(LOOKUP_TABLE.keys()) + + def is_valid_char(self, char: Optional[str]) -> bool: + ''' + Validating if a character belongs strictly to ATBS set. + + :param char: Single character to validate | None + :type char: + :return: True (if valid) | False (if invalid) + :rtype: + ''' + if not bool(char) or len(char) != 1: + return False + + return char in self.__allowed_chars diff --git a/codecipher/atbs/data_validator.py b/codecipher/atbs/data_validator.py new file mode 100644 index 0000000..c49924f --- /dev/null +++ b/codecipher/atbs/data_validator.py @@ -0,0 +1,77 @@ +# -*- coding: UTF-8 -*- + +''' +Module + data_validator.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines class DataValidator for ATBS. +''' + +from typing import List, Optional +from .idata_validator import IDataValidator +from .icharacter_validator import ICharacterValidator +from .character_validator import CharacterValidator + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class DataValidator(IDataValidator): + ''' + Defines class DataValidator with attribute(s) and method(s). + Creates data validator class for ATBS. + + It defines: + + :attributes: + | __char_validator - Validator for individual characters. + :methods: + | __init__ - Initializes DataValidator constructor. + | is_valid - Validates if data is in ATBS format. + ''' + + def __init__(self, char_validator: Optional[ICharacterValidator] = None) -> None: + ''' + Initializes DataValidator constructor. + + :param char_validator: Character validator instance | None + :type char_validator: + :exceptions: None + ''' + self.__char_validator: ICharacterValidator = char_validator or CharacterValidator() + + def is_valid(self, data: Optional[str]) -> bool: + ''' + Validating if data is in ATBS format. + + :param data: Data which should be validated | None + :type data: + :return: True (if valid) | False (if invalid) + :rtype: + :exceptions: None + ''' + if not bool(data): + return False + + for element in data: + if not self.__char_validator.is_valid_char(element): + return False + return True diff --git a/codecipher/atbs/decode.py b/codecipher/atbs/decoder.py similarity index 72% rename from codecipher/atbs/decode.py rename to codecipher/atbs/decoder.py index d04ca9d..4fec3af 100644 --- a/codecipher/atbs/decode.py +++ b/codecipher/atbs/decoder.py @@ -16,19 +16,13 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines class AlephTawBetShinDecode with attribute(s) and method(s). + Defines class ATBSDecoder with attribute(s) and method(s). Creates decode class with backend API. ''' -import sys -from dataclasses import dataclass, field from typing import List, Optional - -try: - from codecipher.atbs.lookup_table import LOOKUP_TABLE -except ImportError as ats_error_message: # pragma: no cover - # Force exit python ####################################################### - sys.exit(f'\n{__file__}\n{ats_error_message}\n') # pragma: no cover +from .idecoder import IATBSDecoder +from .lookup_table import LOOKUP_TABLE __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -40,22 +34,28 @@ __status__: str = 'Updated' -@dataclass -class AlephTawBetShinDecode: +class ATBSDecoder(IATBSDecoder): ''' - Defines class AlephTawBetShinDecode with attribute(s) and method(s). + Defines class ATBSDecoder with attribute(s) and method(s). Creates decode class with backend API. It defines: :attributes: - | _decode_data - Data decode container. + | __decode_data - Data decode container. :methods: + | __init__ - Initializes ATBSDecoder constructor. | decode_data - Property methods for decode data. - | decode - Decode data from AlephTawBetShin format. + | decode - Decode data from ATBS format. ''' - _decode_data: Optional[str] = field(default=None) + def __init__(self) -> None: + ''' + Initializes ATBSDecoder constructor. + + :exceptions: None + ''' + self.__decode_data: Optional[str] = None @property def decode_data(self) -> Optional[str]: @@ -66,7 +66,7 @@ def decode_data(self) -> Optional[str]: :rtype: :exceptions: None ''' - return self._decode_data + return self.__decode_data @decode_data.setter def decode_data(self, decode_data: Optional[str]) -> None: @@ -79,11 +79,11 @@ def decode_data(self, decode_data: Optional[str]) -> None: :exceptions: None ''' if bool(decode_data): - self._decode_data = decode_data + self.__decode_data = decode_data - def decode(self, data: Optional[str]) -> None: + def decode(self, data: Optional[str]) -> bool: ''' - Decoding data from AlephTawBetShin format. + Decoding data from ATBS format. :param data: Data which should be decoded | None :type data: @@ -94,4 +94,6 @@ def decode(self, data: Optional[str]) -> None: decode_list: List[str] = [] for element in data: decode_list.append(LOOKUP_TABLE[element]) - self._decode_data = ''.join(decode_list) + self.__decode_data = ''.join(decode_list) + return True + return False diff --git a/codecipher/atbs/encode.py b/codecipher/atbs/encoder.py similarity index 72% rename from codecipher/atbs/encode.py rename to codecipher/atbs/encoder.py index f602a00..670bdcb 100644 --- a/codecipher/atbs/encode.py +++ b/codecipher/atbs/encoder.py @@ -16,19 +16,13 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines class AlephTawBetShinEncode with attribute(s) and method(s). + Defines class ATBSEncoder with attribute(s) and method(s). Creates encode class with backend API. ''' -import sys -from dataclasses import dataclass, field from typing import List, Optional - -try: - from codecipher.atbs.lookup_table import LOOKUP_TABLE -except ImportError as ats_error_message: # pragma: no cover - # Force exit python ####################################################### - sys.exit(f'\n{__file__}\n{ats_error_message}\n') # pragma: no cover +from .iencoder import IATBSEncoder +from .lookup_table import LOOKUP_TABLE __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -40,22 +34,28 @@ __status__: str = 'Updated' -@dataclass -class AlephTawBetShinEncode: +class ATBSEncoder(IATBSEncoder): ''' - Defines class AlephTawBetShinEncode with attribute(s) and method(s). + Defines class ATBSEncoder with attribute(s) and method(s). Creates encode class with backend API. It defines: :attributes: - | _encode_data - Data encode container. + | __encode_data - Data encode container. :methods: + | __init__ - Initializes ATBSEncoder constructor. | encode_data - Property methods for encode data. - | encode - Encode data to AlephTawBetShin format. + | encode - Encode data to ATBS format. ''' - _encode_data: Optional[str] = field(default=None) + def __init__(self) -> None: + ''' + Initializes ATBSEncoder constructor. + + :exceptions: None + ''' + self.__encode_data: Optional[str] = None @property def encode_data(self) -> Optional[str]: @@ -66,7 +66,7 @@ def encode_data(self) -> Optional[str]: :rtype: :exceptions: None ''' - return self._encode_data + return self.__encode_data @encode_data.setter def encode_data(self, encode_data: Optional[str]) -> None: @@ -79,11 +79,11 @@ def encode_data(self, encode_data: Optional[str]) -> None: :exceptions: None ''' if bool(encode_data): - self._encode_data = encode_data + self.__encode_data = encode_data - def encode(self, data: Optional[str]) -> None: + def encode(self, data: Optional[str]) -> bool: ''' - Encoding data to AlephTawBetShin format. + Encoding data to ATBS format. :param data: Data which should be encoded | None :type data: @@ -94,4 +94,6 @@ def encode(self, data: Optional[str]) -> None: encode_list: List[str] = [] for element in data: encode_list.append(LOOKUP_TABLE[element]) - self._encode_data = ''.join(encode_list) + self.__encode_data = ''.join(encode_list) + return True + return False diff --git a/codecipher/atbs/iatbs.py b/codecipher/atbs/iatbs.py new file mode 100644 index 0000000..57b5298 --- /dev/null +++ b/codecipher/atbs/iatbs.py @@ -0,0 +1,85 @@ +# -*- coding: UTF-8 -*- + +''' +Module + iatbs.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines interface IATBS for ATBS class. +''' + +from abc import ABC, abstractmethod +from typing import Optional + +class IATBS(ABC): + ''' + Defines interface IATBS with methods. + + It defines: + + :attributes: None + :methods: + | encode - Encoding data to ATBS format. + | encode_data - Property method for getting encode data. + | decode - Decoding data from ATBS format. + | decode_data - Property method for getting decode data. + ''' + + @abstractmethod + def encode(self, data: Optional[str]) -> bool: + ''' + Encoding data to ATBS format. + + :param data: Data which should be encoded | None + :type data: + :return: True (if success) | False (if fail) + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Method encode must be implemented.') + + @property + @abstractmethod + def encode_data(self) -> Optional[str]: + ''' + Property method for getting encode data. + + :return: Encoded data + :rtype: + ''' + raise NotImplementedError('Property encode_data must be implemented.') + + @abstractmethod + def decode(self, data: Optional[str]) -> bool: + ''' + Decoding data from ATBS format. + + :param data: Data which should be decoded | None + :type data: + :return: True (if success) | False (if fail) + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Method decode must be implemented.') + + @property + @abstractmethod + def decode_data(self) -> Optional[str]: + ''' + Property method for getting decode data. + + :return: Decoded data + :rtype: + ''' + raise NotImplementedError('Property decode_data must be implemented.') diff --git a/codecipher/atbs/icharacter_validator.py b/codecipher/atbs/icharacter_validator.py new file mode 100644 index 0000000..1fff0ed --- /dev/null +++ b/codecipher/atbs/icharacter_validator.py @@ -0,0 +1,57 @@ +# -*- coding: UTF-8 -*- + +''' +Module + icharacter_validator.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines interface ICharacterValidator for CharacterValidator class. +''' + +from abc import ABC, abstractmethod +from typing import Optional, List + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class ICharacterValidator(ABC): + ''' + Defines interface ICharacterValidator with methods. + + It defines: + + :attributes: None + :methods: + | is_valid_char - Validates if a character is a valid constituent. + ''' + + @abstractmethod + def is_valid_char(self, char: Optional[str]) -> bool: + ''' + Validating if a character is a valid ATBS alphabet constituent. + + :param char: Single character to validate | None + :type char: + :return: True (if valid) | False (if invalid) + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError("Subclasses must implement is_valid_char method") diff --git a/codecipher/atbs/idata_validator.py b/codecipher/atbs/idata_validator.py new file mode 100644 index 0000000..f269dfb --- /dev/null +++ b/codecipher/atbs/idata_validator.py @@ -0,0 +1,57 @@ +# -*- coding: UTF-8 -*- + +''' +Module + idata_validator.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines interface IDataValidator for DataValidator class. +''' + +from abc import ABC, abstractmethod +from typing import List, Optional + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class IDataValidator(ABC): + ''' + Defines interface IDataValidator with methods. + + It defines: + + :attributes: None + :methods: + | is_valid - Validates data using specific validation logic. + ''' + + @abstractmethod + def is_valid(self, data: Optional[str]) -> bool: + ''' + Validating data using specific validation logic. + + :param data: Data which should be validated | None + :type data: + :return: True (if valid) | False (if invalid) + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Method is_valid must be implemented.') diff --git a/codecipher/atbs/idecoder.py b/codecipher/atbs/idecoder.py new file mode 100644 index 0000000..fef29d1 --- /dev/null +++ b/codecipher/atbs/idecoder.py @@ -0,0 +1,70 @@ +# -*- coding: UTF-8 -*- + +''' +Module + idecoder.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines interface IATBSDecoder for ATBSDecode class. +''' + +from abc import ABC, abstractmethod +from typing import Optional, List + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class IATBSDecoder(ABC): + ''' + Defines interface IATBSDecoder with methods. + + It defines: + + :attributes: None + :methods: + | decode_data - Property method for getting decode data. + | decode - Decoding data from ATBS format. + ''' + + @property + @abstractmethod + def decode_data(self) -> Optional[str]: + ''' + Property method for getting decode data. + + :return: Decoded data | None + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Property decode_data must be implemented.') + + @abstractmethod + def decode(self, data: Optional[str]) -> bool: + ''' + Decoding data from ATBS format. + + :param data: Data which should be decoded | None + :type data: + :return: True (if success) | False (if fail) + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Method decode must be implemented.') diff --git a/codecipher/atbs/iencoder.py b/codecipher/atbs/iencoder.py new file mode 100644 index 0000000..3cc8793 --- /dev/null +++ b/codecipher/atbs/iencoder.py @@ -0,0 +1,70 @@ +# -*- coding: UTF-8 -*- + +''' +Module + iencoder.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines interface IATBSEncoder for ATBSEncode class. +''' + +from abc import ABC, abstractmethod +from typing import Optional, List + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class IATBSEncoder(ABC): + ''' + Defines interface IATBSEncoder with methods. + + It defines: + + :attributes: None + :methods: + | encode_data - Property method for getting encode data. + | encode - Encoding data to ATBS format. + ''' + + @property + @abstractmethod + def encode_data(self) -> Optional[str]: + ''' + Property method for getting encode data. + + :return: Encoded data | None + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Property encode_data must be implemented.') + + @abstractmethod + def encode(self, data: Optional[str]) -> bool: + ''' + Encoding data to ATBS format. + + :param data: Data which should be encoded | None + :type data: + :return: True (if success) | False (if fail) + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Method encode must be implemented.') diff --git a/codecipher/atbs/ivalidation_engine.py b/codecipher/atbs/ivalidation_engine.py new file mode 100644 index 0000000..8672cc6 --- /dev/null +++ b/codecipher/atbs/ivalidation_engine.py @@ -0,0 +1,71 @@ +# -*- coding: UTF-8 -*- + +''' +Module + ivalidation_engine.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines interface IValidationEngine for ValidationEngine class. +''' + +from abc import ABC, abstractmethod +from typing import List, Optional +from .idata_validator import IDataValidator + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class IValidationEngine(ABC): + ''' + Defines interface IValidationEngine with methods. + + It defines: + + :attributes: None + :methods: + | add_validator - Adds a new validator to the engine. + | is_valid - Validates data using all registered validators. + ''' + + @abstractmethod + def add_validator(self, validator: IDataValidator) -> None: + ''' + Adding a new validator to the engine. + + :param validator: Validator instance to add. + :type validator: + :return: None + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Method add_validator must be implemented.') + + @abstractmethod + def is_valid(self, data: Optional[str]) -> bool: + ''' + Validating data using all registered validators. + + :param data: Data which should be validated | None + :type data: + :return: True (if all valid) | False (if any invalid) + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Method is_valid must be implemented.') diff --git a/codecipher/atbs/lookup_table.py b/codecipher/atbs/lookup_table.py index ecee9e3..71920db 100644 --- a/codecipher/atbs/lookup_table.py +++ b/codecipher/atbs/lookup_table.py @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines dict LOOKUP_TABLE for AlephTawBetShin format. + Defines dict LOOKUP_TABLE for ATBS format. ''' from typing import List, Dict diff --git a/codecipher/atbs/validation_engine.py b/codecipher/atbs/validation_engine.py new file mode 100644 index 0000000..c37fa6c --- /dev/null +++ b/codecipher/atbs/validation_engine.py @@ -0,0 +1,89 @@ +# -*- coding: UTF-8 -*- + +''' +Module + validation_engine.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines class ValidationEngine for managing multiple validators. +''' + +from typing import List, Optional +from .ivalidation_engine import IValidationEngine +from .idata_validator import IDataValidator + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class ValidationEngine(IValidationEngine): + ''' + Defines class ValidationEngine with attribute(s) and method(s). + Creates validation engine class with backend API. + + It defines: + + :attributes: + | __validators - List of registered data validators. + :methods: + | __init__ - Initializes ValidationEngine constructor. + | add_validator - Adds a new validator to the engine. + | is_valid - Validates data using all registered validators. + ''' + + def __init__(self, validators: Optional[List[IDataValidator]] = None) -> None: + ''' + Initializes ValidationEngine constructor. + + :param validators: Initial list of validators | None + :type validators: + :exceptions: None + ''' + self.__validators: List[IDataValidator] = validators or [] + + def add_validator(self, validator: IDataValidator) -> None: + ''' + Adding a new validator to the engine. + + :param validator: Validator instance to add. + :type validator: + :return: None + :exceptions: None + ''' + if validator not in self.__validators: + self.__validators.append(validator) + + def is_valid(self, data: Optional[str]) -> bool: + ''' + Validating data using all registered validators. + + :param data: Data which should be validated | None + :type data: + :return: True (if all valid) | False (if any invalid) + :rtype: + :exceptions: None + ''' + if not bool(data): + return False + + for validator in self.__validators: + if not validator.is_valid(data): + return False + return True diff --git a/codecipher/b64/__init__.py b/codecipher/b64/__init__.py index 347bb3a..7bf0684 100644 --- a/codecipher/b64/__init__.py +++ b/codecipher/b64/__init__.py @@ -20,15 +20,19 @@ Creates container class with aggregate backend API. ''' -import sys from typing import List - -try: - from codecipher.b64.encode import B64Encode - from codecipher.b64.decode import B64Decode -except ImportError as ats_error_message: # pragma: no cover - # Force exit python ####################################################### - sys.exit(f'\n{__file__}\n{ats_error_message}\n') # pragma: no cover +from .b64 import B64 +from .ib64 import IB64 +from .b64encoder import B64Encoder +from .b64decoder import B64Decoder +from .ib64encoder import IB64Encoder +from .ib64decoder import IB64Decoder +from .validation_engine import ValidationEngine +from .ivalidation_engine import IValidationEngine +from .data_validator import DataValidator +from .idata_validator import IDataValidator +from .character_validator import CharacterValidator +from .icharacter_validator import ICharacterValidator __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -39,24 +43,17 @@ __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' - -class B64(B64Encode, B64Decode): - ''' - Defines class B64 with attribute(s) and method(s). - Creates container class with aggregate backend API. - - It defines: - - :attributes: - | None. - :methods: - | __init__ - Initials B64 constructor. - ''' - - def __init__(self) -> None: - ''' - Initials B64 constructor. - - :exceptions: None - ''' - super().__init__() +__all__: List[str] = [ + 'IB64', + 'IB64Encoder', + 'IB64Decoder', + 'B64Encoder', + 'B64Decoder', + 'B64', + 'IValidationEngine', + 'ValidationEngine', + 'IDataValidator', + 'DataValidator', + 'ICharacterValidator', + 'CharacterValidator' +] diff --git a/codecipher/b64/b64.py b/codecipher/b64/b64.py new file mode 100644 index 0000000..5a85d8d --- /dev/null +++ b/codecipher/b64/b64.py @@ -0,0 +1,121 @@ +# -*- coding: UTF-8 -*- + +''' +Module + b64.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines class B64 with attribute(s) and method(s). + Creates container class with aggregate backend API. +''' + +from typing import List, Optional +from .ib64 import IB64 +from .ib64encoder import IB64Encoder +from .ib64decoder import IB64Decoder +from .b64encoder import B64Encoder +from .b64decoder import B64Decoder +from .ivalidation_engine import IValidationEngine +from .validation_engine import ValidationEngine +from .data_validator import DataValidator + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class B64(IB64): + ''' + Defines class B64 with attribute(s) and method(s). + Creates container class with aggregate backend API. + + It defines: + + :attributes: + | __validation_engine - Engine for data validation. + | __encoder - Encoder for algorithm. + | __decoder - Decoder for algorithm. + :methods: + | __init__ - Initializes B64 constructor. + | encode - Encoding data to B64 format. + | encode_data - Property method for getting encode data. + | decode - Decoding data from B64 format. + | decode_data - Property method for getting decode data. + ''' + + def __init__( + self, + validation_engine: Optional[IValidationEngine] = None, + encoder: Optional[IB64Encoder] = None, + decoder: Optional[IB64Decoder] = None, + ) -> None: + ''' + Initializes B64 constructor. + + :param validation_engine: Engine for data validation | None + :type validation_engine: + :param encoder: Encoder for algorithm | None + :type encoder: + :param decoder: Decoder for algorithm | None + :type decoder: + :exceptions: None + ''' + self.__validation_engine: IValidationEngine = validation_engine or ValidationEngine( + [DataValidator()] + ) + self.__encoder: IB64Encoder = encoder or B64Encoder() + self.__decoder: IB64Decoder = decoder or B64Decoder() + + def encode(self, data: Optional[str]) -> bool: + ''' + Encoding data to B64 format. + + :param data: Data which should be encoded | None + :type data: + :return: True (if success) | False (if fail) + :rtype: + :exceptions: None + ''' + # For encoding, we don't strictly need to validate the input characters + # as b64encode can handle any byte string. + if not bool(data): + return False + return self.__encoder.encode(data) + + @property + def encode_data(self) -> Optional[str]: + ''' + Property method for getting encode data. + ''' + return self.__encoder.encode_data + + def decode(self, data: Optional[str]) -> bool: + ''' + Decoding data from B64 format. + ''' + if not bool(data) or not self.__validation_engine.is_valid(data): + return False + return self.__decoder.decode(data) + + @property + def decode_data(self) -> Optional[str]: + ''' + Property method for getting decode data. + ''' + return self.__decoder.decode_data diff --git a/codecipher/b64/decode.py b/codecipher/b64/b64decoder.py similarity index 71% rename from codecipher/b64/decode.py rename to codecipher/b64/b64decoder.py index ffb8fe7..75167a0 100644 --- a/codecipher/b64/decode.py +++ b/codecipher/b64/b64decoder.py @@ -2,7 +2,7 @@ ''' Module - decode.py + b64decoder.py Copyright Copyright (C) 2021 - 2026 Vladimir Roncevic codecipher is free software: you can redistribute it and/or modify it @@ -16,13 +16,13 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines class AlephTawBetShinDecode with attribute(s) and method(s). + Defines class ATBSDecode with attribute(s) and method(s). Creates decode class with backend API. ''' -from dataclasses import dataclass, field from base64 import b64decode from typing import List, Optional +from .ib64decoder import IB64Decoder __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -34,22 +34,26 @@ __status__: str = 'Updated' -@dataclass -class B64Decode: +class B64Decoder(IB64Decoder): ''' - Defines class AlephTawBetShinDecode with attribute(s) and method(s). + Defines class B64Decoder with attribute(s) and method(s). Creates decode class with backend API. It defines: :attributes: - | _decode_data - Data decode container. + | __decode_data - Data decode container. :methods: + | __init__ - Initializes B64Decoder constructor. | decode_data - Property methods for decode data. - | decode - Decode data from AlephTawBetShin format. + | decode - Decode data from B64 format. ''' - _decode_data: Optional[str] = field(default=None) + def __init__(self) -> None: + ''' + Initializes B64Decoder constructor. + ''' + self.__decode_data: Optional[str] = None @property def decode_data(self) -> Optional[str]: @@ -60,7 +64,7 @@ def decode_data(self) -> Optional[str]: :rtype: :exceptions: None ''' - return self._decode_data + return self.__decode_data @decode_data.setter def decode_data(self, decode_data: Optional[str]) -> None: @@ -73,16 +77,19 @@ def decode_data(self, decode_data: Optional[str]) -> None: :exceptions: None ''' if bool(decode_data): - self._decode_data = decode_data + self.__decode_data = decode_data - def decode(self, data: Optional[str]) -> None: + def decode(self, data: Optional[str]) -> bool: ''' - Decoding data from AlephTawBetShin format. + Decoding data from B64 format. :param data: Data which should be decoded | None :type data: - :return: None + :return: True (if success) | False (if fail) + :rtype: :exceptions: None ''' if bool(data): - self._decode_data = b64decode(data).decode() + self.__decode_data = b64decode(data).decode() + return True + return False diff --git a/codecipher/b64/encode.py b/codecipher/b64/b64encoder.py similarity index 71% rename from codecipher/b64/encode.py rename to codecipher/b64/b64encoder.py index 2a8623a..a68936c 100644 --- a/codecipher/b64/encode.py +++ b/codecipher/b64/b64encoder.py @@ -2,7 +2,7 @@ ''' Module - encode.py + b64encoder.py Copyright Copyright (C) 2021 - 2026 Vladimir Roncevic codecipher is free software: you can redistribute it and/or modify it @@ -16,13 +16,13 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines class B64Encode with attribute(s) and method(s). + Defines class B64Encoder with attribute(s) and method(s). Creates encode class with backend API. ''' -from dataclasses import dataclass, field from base64 import b64encode from typing import List, Optional +from .ib64encoder import IB64Encoder __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -34,22 +34,26 @@ __status__: str = 'Updated' -@dataclass -class B64Encode: +class B64Encoder(IB64Encoder): ''' - Defines class B64Encode with attribute(s) and method(s). + Defines class B64Encoder with attribute(s) and method(s). Creates encode class with backend API. It defines: :attributes: - | _encode_data - Data encode container. + | __encode_data - Data encode container. :methods: + | __init__ - Initializes B64Encoder constructor. | encode_data - Property methods for encode data. - | encode - Encode data to AlephTawBetShin format. + | encode - Encode data to B64 format. ''' - _encode_data: Optional[str] = field(default=None) + def __init__(self) -> None: + ''' + Initializes B64Encoder constructor. + ''' + self.__encode_data: Optional[str] = None @property def encode_data(self) -> Optional[str]: @@ -60,7 +64,7 @@ def encode_data(self) -> Optional[str]: :rtype: :exceptions: None ''' - return self._encode_data + return self.__encode_data @encode_data.setter def encode_data(self, encode_data: Optional[str]) -> None: @@ -73,16 +77,19 @@ def encode_data(self, encode_data: Optional[str]) -> None: :exceptions: None ''' if bool(encode_data): - self._encode_data = encode_data + self.__encode_data = encode_data - def encode(self, data: Optional[str]) -> None: + def encode(self, data: Optional[str]) -> bool: ''' - Encoding data to AlephTawBetShin format. + Encoding data to B64 format. :param data: Data which should be encoded | None :type data: - :return: None + :return: True (if success) | False (if fail) + :rtype: :exceptions: None ''' if bool(data): - self._encode_data = (b64encode(data.encode())).decode() + self.__encode_data = (b64encode(data.encode())).decode() + return True + return False diff --git a/codecipher/b64/character_validator.py b/codecipher/b64/character_validator.py new file mode 100644 index 0000000..4d92ea4 --- /dev/null +++ b/codecipher/b64/character_validator.py @@ -0,0 +1,68 @@ +# -*- coding: UTF-8 -*- + +''' +Module + character_validator.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines class CharacterValidator for B64. +''' + +from typing import Optional, Set, List +from string import ascii_uppercase, ascii_lowercase, digits +from .icharacter_validator import ICharacterValidator + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class CharacterValidator(ICharacterValidator): + ''' + Defines class CharacterValidator with attribute(s) and method(s). + Creates character validator class for B64. + + It defines: + + :attributes: + | __allowed_chars - Characters supported by B64 alphabet. + :methods: + | __init__ - Initializes CharacterValidator constructor. + | is_valid_char - Validates if a single character belongs to B64. + ''' + + def __init__(self) -> None: + ''' + Initializes CharacterValidator constructor. + ''' + self.__allowed_chars: Set[str] = set(ascii_uppercase + ascii_lowercase + digits + '+/=' ) + + def is_valid_char(self, char: Optional[str]) -> bool: + ''' + Validating if a character belongs strictly to B64 set. + + :param char: Single character to validate | None + :type char: + :return: True (if valid) | False (if invalid) + :rtype: + ''' + if not bool(char) or len(char) != 1: + return False + + return char in self.__allowed_chars diff --git a/codecipher/b64/data_validator.py b/codecipher/b64/data_validator.py new file mode 100644 index 0000000..784f9de --- /dev/null +++ b/codecipher/b64/data_validator.py @@ -0,0 +1,77 @@ +# -*- coding: UTF-8 -*- + +''' +Module + data_validator.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines class DataValidator for B64. +''' + +from typing import List, Optional +from .idata_validator import IDataValidator +from .icharacter_validator import ICharacterValidator +from .character_validator import CharacterValidator + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class DataValidator(IDataValidator): + ''' + Defines class DataValidator with attribute(s) and method(s). + Creates data validator class for B64. + + It defines: + + :attributes: + | __char_validator - Validator for individual characters. + :methods: + | __init__ - Initializes DataValidator constructor. + | is_valid - Validates if data is in B64 format. + ''' + + def __init__(self, char_validator: Optional[ICharacterValidator] = None) -> None: + ''' + Initializes DataValidator constructor. + + :param char_validator: Character validator instance | None + :type char_validator: + :exceptions: None + ''' + self.__char_validator: ICharacterValidator = char_validator or CharacterValidator() + + def is_valid(self, data: Optional[str]) -> bool: + ''' + Validating if data is in B64 format. + + :param data: Data which should be validated | None + :type data: + :return: True (if valid) | False (if invalid) + :rtype: + :exceptions: None + ''' + if not bool(data): + return False + + for element in data: + if not self.__char_validator.is_valid_char(element): + return False + return True diff --git a/codecipher/b64/ib64.py b/codecipher/b64/ib64.py new file mode 100644 index 0000000..f60ffa6 --- /dev/null +++ b/codecipher/b64/ib64.py @@ -0,0 +1,95 @@ +# -*- coding: UTF-8 -*- + +''' +Module + ib64.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines interface IB64 for B64 class. +''' + +from abc import ABC, abstractmethod +from typing import Optional, List + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class IB64(ABC): + ''' + Defines interface IB64 with methods. + + It defines: + + :attributes: None + :methods: + | encode - Encoding data to B64 format. + | encode_data - Property method for getting encode data. + | decode - Decoding data from B64 format. + | decode_data - Property method for getting decode data. + ''' + + @abstractmethod + def encode(self, data: Optional[str]) -> bool: + ''' + Encoding data to B64 format. + + :param data: Data which should be encoded | None + :type data: + :return: True (if success) | False (if fail) + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Method encode must be implemented.') + + @property + @abstractmethod + def encode_data(self) -> Optional[str]: + ''' + Property method for getting encode data. + + :return: Encoded data + :rtype: + ''' + raise NotImplementedError('Property encode_data must be implemented.') + + @abstractmethod + def decode(self, data: Optional[str]) -> bool: + ''' + Decoding data from B64 format. + + :param data: Data which should be decoded | None + :type data: + :return: True (if success) | False (if fail) + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Method decode must be implemented.') + + @property + @abstractmethod + def decode_data(self) -> Optional[str]: + ''' + Property method for getting decode data. + + :return: Decoded data + :rtype: + ''' + raise NotImplementedError('Property decode_data must be implemented.') diff --git a/codecipher/b64/ib64decoder.py b/codecipher/b64/ib64decoder.py new file mode 100644 index 0000000..1339d70 --- /dev/null +++ b/codecipher/b64/ib64decoder.py @@ -0,0 +1,70 @@ +# -*- coding: UTF-8 -*- + +''' +Module + ib64decoder.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines interface IB64Decoder for B64Decoder class. +''' + +from abc import ABC, abstractmethod +from typing import Optional, List + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class IB64Decoder(ABC): + ''' + Defines interface IB64Decoder with methods. + + It defines: + + :attributes: None + :methods: + | decode_data - Property method for getting decode data. + | decode - Decoding data from B64 format. + ''' + + @property + @abstractmethod + def decode_data(self) -> Optional[str]: + ''' + Property method for getting decode data. + + :return: Decoded data | None + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Property decode_data must be implemented.') + + @abstractmethod + def decode(self, data: Optional[str]) -> bool: + ''' + Decoding data from B64 format. + + :param data: Data which should be decoded | None + :type data: + :return: True (if success) | False (if fail) + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Method decode must be implemented.') diff --git a/codecipher/b64/ib64encoder.py b/codecipher/b64/ib64encoder.py new file mode 100644 index 0000000..efe0aa7 --- /dev/null +++ b/codecipher/b64/ib64encoder.py @@ -0,0 +1,70 @@ +# -*- coding: UTF-8 -*- + +''' +Module + ib64encoder.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines interface IB64Encoder for B64Encoder class. +''' + +from abc import ABC, abstractmethod +from typing import Optional, List + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class IB64Encoder(ABC): + ''' + Defines interface IB64Encoder with methods. + + It defines: + + :attributes: None + :methods: + | encode_data - Property method for getting encode data. + | encode - Encoding data to B64 format. + ''' + + @property + @abstractmethod + def encode_data(self) -> Optional[str]: + ''' + Property method for getting encode data. + + :return: Encoded data | None + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Property encode_data must be implemented.') + + @abstractmethod + def encode(self, data: Optional[str]) -> bool: + ''' + Encoding data to B64 format. + + :param data: Data which should be encoded | None + :type data: + :return: True (if success) | False (if fail) + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Method encode must be implemented.') diff --git a/codecipher/b64/icharacter_validator.py b/codecipher/b64/icharacter_validator.py new file mode 100644 index 0000000..bbbde19 --- /dev/null +++ b/codecipher/b64/icharacter_validator.py @@ -0,0 +1,57 @@ +# -*- coding: UTF-8 -*- + +''' +Module + icharacter_validator.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines interface ICharacterValidator for CharacterValidator class. +''' + +from abc import ABC, abstractmethod +from typing import Optional, List + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class ICharacterValidator(ABC): + ''' + Defines interface ICharacterValidator with methods. + + It defines: + + :attributes: None + :methods: + | is_valid_char - Validates if a character is a valid constituent. + ''' + + @abstractmethod + def is_valid_char(self, char: Optional[str]) -> bool: + ''' + Validating if a character is a valid B64 alphabet constituent. + + :param char: Single character to validate | None + :type char: + :return: True (if valid) | False (if invalid) + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError("Subclasses must implement is_valid_char method") diff --git a/codecipher/b64/idata_validator.py b/codecipher/b64/idata_validator.py new file mode 100644 index 0000000..578c49d --- /dev/null +++ b/codecipher/b64/idata_validator.py @@ -0,0 +1,57 @@ +# -*- coding: UTF-8 -*- + +''' +Module + idata_validator.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines interface IDataValidator for DataValidator class. +''' + +from abc import ABC, abstractmethod +from typing import List, Optional + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class IDataValidator(ABC): + ''' + Defines interface IDataValidator with methods. + + It defines: + + :attributes: None + :methods: + | is_valid - Validates data using specific validation logic. + ''' + + @abstractmethod + def is_valid(self, data: Optional[str]) -> bool: + ''' + Validating data using specific validation logic. + + :param data: Data which should be validated | None + :type data: + :return: True (if valid) | False (if invalid) + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Method is_valid must be implemented.') \ No newline at end of file diff --git a/codecipher/b64/ivalidation_engine.py b/codecipher/b64/ivalidation_engine.py new file mode 100644 index 0000000..8672cc6 --- /dev/null +++ b/codecipher/b64/ivalidation_engine.py @@ -0,0 +1,71 @@ +# -*- coding: UTF-8 -*- + +''' +Module + ivalidation_engine.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines interface IValidationEngine for ValidationEngine class. +''' + +from abc import ABC, abstractmethod +from typing import List, Optional +from .idata_validator import IDataValidator + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class IValidationEngine(ABC): + ''' + Defines interface IValidationEngine with methods. + + It defines: + + :attributes: None + :methods: + | add_validator - Adds a new validator to the engine. + | is_valid - Validates data using all registered validators. + ''' + + @abstractmethod + def add_validator(self, validator: IDataValidator) -> None: + ''' + Adding a new validator to the engine. + + :param validator: Validator instance to add. + :type validator: + :return: None + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Method add_validator must be implemented.') + + @abstractmethod + def is_valid(self, data: Optional[str]) -> bool: + ''' + Validating data using all registered validators. + + :param data: Data which should be validated | None + :type data: + :return: True (if all valid) | False (if any invalid) + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Method is_valid must be implemented.') diff --git a/codecipher/b64/validation_engine.py b/codecipher/b64/validation_engine.py new file mode 100644 index 0000000..c37fa6c --- /dev/null +++ b/codecipher/b64/validation_engine.py @@ -0,0 +1,89 @@ +# -*- coding: UTF-8 -*- + +''' +Module + validation_engine.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines class ValidationEngine for managing multiple validators. +''' + +from typing import List, Optional +from .ivalidation_engine import IValidationEngine +from .idata_validator import IDataValidator + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class ValidationEngine(IValidationEngine): + ''' + Defines class ValidationEngine with attribute(s) and method(s). + Creates validation engine class with backend API. + + It defines: + + :attributes: + | __validators - List of registered data validators. + :methods: + | __init__ - Initializes ValidationEngine constructor. + | add_validator - Adds a new validator to the engine. + | is_valid - Validates data using all registered validators. + ''' + + def __init__(self, validators: Optional[List[IDataValidator]] = None) -> None: + ''' + Initializes ValidationEngine constructor. + + :param validators: Initial list of validators | None + :type validators: + :exceptions: None + ''' + self.__validators: List[IDataValidator] = validators or [] + + def add_validator(self, validator: IDataValidator) -> None: + ''' + Adding a new validator to the engine. + + :param validator: Validator instance to add. + :type validator: + :return: None + :exceptions: None + ''' + if validator not in self.__validators: + self.__validators.append(validator) + + def is_valid(self, data: Optional[str]) -> bool: + ''' + Validating data using all registered validators. + + :param data: Data which should be validated | None + :type data: + :return: True (if all valid) | False (if any invalid) + :rtype: + :exceptions: None + ''' + if not bool(data): + return False + + for validator in self.__validators: + if not validator.is_valid(data): + return False + return True diff --git a/codecipher/caesar/__init__.py b/codecipher/caesar/__init__.py index b0ac948..0652d68 100644 --- a/codecipher/caesar/__init__.py +++ b/codecipher/caesar/__init__.py @@ -20,15 +20,13 @@ Creates container class with aggregate backend API. ''' -import sys from typing import List - -try: - from codecipher.caesar.encode import CaesarEncode - from codecipher.caesar.decode import CaesarDecode -except ImportError as ats_error_message: # pragma: no cover - # Force exit python ####################################################### - sys.exit(f'\n{__file__}\n{ats_error_message}\n') # pragma: no cover +from .caesar import Caesar +from .icaesar import ICaesar +from .icaesar_encoder import ICaesarEncoder +from .icaesar_decoder import ICaesarDecoder +from .encoder import CaesarEncoder +from .decoder import CaesarDecoder __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -39,24 +37,11 @@ __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' - -class Caesar(CaesarEncode, CaesarDecode): - ''' - Defines class Caesar with attribute(s) and method(s). - Creates container class with aggregate backend API. - - It defines: - - :attributes: - | None. - :methods: - | __init__ - Initials Caesar constructor. - ''' - - def __init__(self) -> None: - ''' - Initials Caesar constructor. - - :exceptions: None - ''' - super().__init__() +__all__: List[str] = [ + 'Caesar', + 'ICaesar', + 'ICaesarEncoder', + 'ICaesarDecoder', + 'CaesarEncoder', + 'CaesarDecoder' +] diff --git a/codecipher/caesar/caesar.py b/codecipher/caesar/caesar.py new file mode 100644 index 0000000..fa67806 --- /dev/null +++ b/codecipher/caesar/caesar.py @@ -0,0 +1,116 @@ +# -*- coding: UTF-8 -*- + +''' +Module + caesar.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines class Caesar with attribute(s) and method(s). + Creates container class with aggregate backend API. +''' + +from typing import Optional +from .icaesar_encoder import ICaesarEncoder +from .icaesar import ICaesar +from .icaesar_decoder import ICaesarDecoder +from .encoder import CaesarEncoder +from .decoder import CaesarDecoder + +class Caesar(ICaesar): + ''' + Defines class Caesar with attribute(s) and method(s). + Creates container class with aggregate backend API. + + It defines: + :attributes: + | __encoder - Encoder for Caesar algorithm. + | __decoder - Decoder for Caesar algorithm. + :methods: + | __init__ - Initializes Caesar constructor. + | encode - Encoding data to Caesar format. + | encode_data - Property method for getting encode data. + | decode - Decoding data from Caesar format. + | decode_data - Property method for getting decode data. + ''' + + def __init__( + self, + encoder: Optional[ICaesarEncoder] = None, + decoder: Optional[ICaesarDecoder] = None, + ) -> None: + ''' + Initializes Caesar constructor. + + :param encoder: Encoder for algorithm | None + :type encoder: + :param decoder: Decoder for algorithm | None + :type decoder: + :exceptions: None + ''' + self.__encoder: ICaesarEncoder = encoder or CaesarEncoder() + self.__decoder: ICaesarDecoder = decoder or CaesarDecoder() + + def encode(self, data: Optional[str], shift_counter: Optional[int]) -> bool: + ''' + Encoding data to Caesar format. + + :param data: Data which should be encoded | None + :type data: + :param shift_counter: Shift value | None + :type shift_counter: + :return: True (if success) | False (if fail) + :rtype: + :exceptions: None + ''' + if not bool(data) or shift_counter is None: + return False + return self.__encoder.encode(data, shift_counter) + + @property + def encode_data(self) -> Optional[str]: + ''' + Property method for getting encode data. + + :return: Encoded data | None + :rtype: + :exceptions: None + ''' + return self.__encoder.encode_data + + def decode(self, data: Optional[str], shift_counter: Optional[int]) -> bool: + ''' + Decoding data from Caesar format. + + :param data: Data which should be decoded | None + :type data: + :param shift_counter: Shift value | None + :type shift_counter: + :return: True (if success) | False (if fail) + :rtype: + :exceptions: None + ''' + if not bool(data) or shift_counter is None: + return False + return self.__decoder.decode(data, shift_counter) + + @property + def decode_data(self) -> Optional[str]: + ''' + Property method for getting decode data. + + :return: Decoded data | None + :rtype: + :exceptions: None + ''' + return self.__decoder.decode_data diff --git a/codecipher/caesar/decode.py b/codecipher/caesar/decoder.py similarity index 87% rename from codecipher/caesar/decode.py rename to codecipher/caesar/decoder.py index 218e79c..ec9fe9d 100644 --- a/codecipher/caesar/decode.py +++ b/codecipher/caesar/decoder.py @@ -2,7 +2,7 @@ ''' Module - decode.py + decoder.py Copyright Copyright (C) 2021 - 2026 Vladimir Roncevic codecipher is free software: you can redistribute it and/or modify it @@ -16,12 +16,13 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines class CaesarDecode with attribute(s) and method(s). + Defines class CaesarDecoder with attribute(s) and method(s). Creates decode class with backend API. ''' from dataclasses import dataclass, field from typing import List, Optional +from .icaesar_decoder import ICaesarDecoder __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -34,9 +35,9 @@ @dataclass -class CaesarDecode: +class CaesarDecoder(ICaesarDecoder): ''' - Defines class CaesarDecode with attribute(s) and method(s). + Defines class CaesarDecoder with attribute(s) and method(s). Creates decode class with backend API. It defines: @@ -76,7 +77,7 @@ def decode_data(self, decode_data: Optional[str]) -> None: def decode( self, data: Optional[str], shift_counter: Optional[int] - ) -> None: + ) -> bool: ''' Decoding data from Caesar format. @@ -84,19 +85,24 @@ def decode( :type data: :param shift_counter: Defining the shift count | None :type shift_counter: - :return: None + :return: True (if success) | False (if fail) + :rtype: :exceptions: None ''' - if bool(data) and bool(shift_counter): + if bool(data) and shift_counter is not None: decode_list: List[str] = [] + for element in data: - if element.isspace() or element.isnumeric(): + + if not (('a' <= element <= 'z') or ('A' <= element <= 'Z')): decode_list.append(element) continue + element_index: Optional[int] = None new_index: Optional[int] = None new_unicode: Optional[int] = None new_character: Optional[str] = None + if element.isupper(): element_index = ord(element) - ord('A') new_index = (element_index - shift_counter) % 26 @@ -105,6 +111,12 @@ def decode( element_index = ord(element) - ord('a') new_index = (element_index - shift_counter) % 26 new_unicode = new_index + ord('a') + new_character = chr(new_unicode) decode_list.append(new_character) + self._decode_data = ''.join(decode_list) + + return True + + return False diff --git a/codecipher/caesar/encode.py b/codecipher/caesar/encoder.py similarity index 87% rename from codecipher/caesar/encode.py rename to codecipher/caesar/encoder.py index d66359a..10a6525 100644 --- a/codecipher/caesar/encode.py +++ b/codecipher/caesar/encoder.py @@ -2,7 +2,7 @@ ''' Module - encode.py + encoder.py Copyright Copyright (C) 2021 - 2026 Vladimir Roncevic codecipher is free software: you can redistribute it and/or modify it @@ -16,12 +16,13 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines class CaesarEncode with attribute(s) and method(s). + Defines class CaesarEncoder with attribute(s) and method(s). Creates encode class with backend API. ''' from dataclasses import dataclass, field from typing import List, Optional +from .icaesar_encoder import ICaesarEncoder __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -34,9 +35,9 @@ @dataclass -class CaesarEncode: +class CaesarEncoder(ICaesarEncoder): ''' - Defines class CaesarEncode with attribute(s) and method(s). + Defines class CaesarEncoder with attribute(s) and method(s). Creates encode class with backend API. It defines: @@ -76,7 +77,7 @@ def encode_data(self, encode_data: Optional[str]) -> None: def encode( self, data: Optional[str], shift_counter: Optional[int] - ) -> None: + ) -> bool: ''' Encoding data to Caesar format. @@ -84,19 +85,24 @@ def encode( :type data: :param shift_counter: Defining the shift count | None :type shift_counter: - :return: None + :return: True (if success) | False (if fail) + :rtype: :exceptions: None ''' - if bool(data) and bool(shift_counter): + if bool(data) and shift_counter is not None: encode_list: List[str] = [] + for element in data: - if element.isspace() or element.isnumeric(): + + if not (('a' <= element <= 'z') or ('A' <= element <= 'Z')): encode_list.append(element) continue + element_index: Optional[int] = None new_index: Optional[int] = None new_unicode: Optional[int] = None new_character: Optional[str] = None + if element.isupper(): element_index = ord(element) - ord('A') new_index = (element_index + shift_counter) % 26 @@ -105,6 +111,12 @@ def encode( element_index = ord(element) - ord('a') new_index = (element_index + shift_counter) % 26 new_unicode = new_index + ord('a') + new_character = chr(new_unicode) encode_list.append(new_character) + self._encode_data = ''.join(encode_list) + + return True + + return False diff --git a/codecipher/caesar/icaesar.py b/codecipher/caesar/icaesar.py new file mode 100644 index 0000000..34a5a75 --- /dev/null +++ b/codecipher/caesar/icaesar.py @@ -0,0 +1,93 @@ +# -*- coding: UTF-8 -*- + +''' +Module + icaesar.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines interface ICaesar with attribute(s) and method(s). + Interface for Caesar cipher. +''' + +from abc import ABC, abstractmethod +from typing import Optional + +class ICaesar(ABC): + ''' + Defines interface ICaesar with attribute(s) and method(s). + Interface for Caesar cipher. + + It defines: + :attributes: + | None. + :methods: + | encode - Encode data using Caesar cipher. + | encode_data - Property method for getting encode data. + | decode - Decode data from Caesar format. + | decode_data - Property method for getting decode data. + ''' + + @abstractmethod + def encode(self, data: Optional[str], shift_counter: Optional[int]) -> bool: + ''' + Encode data using Caesar cipher. + + :param data: Data which should be encoded | None + :type data: + :param shift_counter: Shift value | None + :type shift_counter: + :return: True (if success) | False (if fail) + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Method encode() is not implemented') + + @property + @abstractmethod + def encode_data(self) -> Optional[str]: + ''' + Property method for getting encode data. + + :return: Encoded data | None + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Method encode_data() is not implemented') + + @abstractmethod + def decode(self, data: Optional[str], shift_counter: Optional[int]) -> bool: + ''' + Decode data from Caesar format. + + :param data: Data which should be decoded | None + :type data: + :param shift_counter: Shift value | None + :type shift_counter: + :return: True (if success) | False (if fail) + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Method decode() is not implemented') + + @property + @abstractmethod + def decode_data(self) -> Optional[str]: + ''' + Property method for getting decode data. + + :return: Decoded data | None + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Method decode_data() is not implemented') diff --git a/codecipher/caesar/icaesar_decoder.py b/codecipher/caesar/icaesar_decoder.py new file mode 100644 index 0000000..55a2acd --- /dev/null +++ b/codecipher/caesar/icaesar_decoder.py @@ -0,0 +1,64 @@ +# -*- coding: UTF-8 -*- + +''' +Module + icaesar_decoder.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines interface ICaesarDecoder with attribute(s) and method(s). + Interface for Caesar Decoder. +''' + +from abc import ABC, abstractmethod +from typing import Optional + +class ICaesarDecoder(ABC): + ''' + Defines interface ICaesarDecoder with attribute(s) and method(s). + Interface for Caesar Decoder. + + It defines: + :attributes: + | None. + :methods: + | decode_data - Property method for getting decoded data. + | decode - Decode data using Caesar cipher. + ''' + + @property + @abstractmethod + def decode_data(self) -> Optional[str]: + ''' + Property method for getting decoded data. + + :return: Decoded data | None + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Method decode_data() is not implemented') + + @abstractmethod + def decode(self, data: Optional[str], shift_counter: Optional[int]) -> bool: + ''' + Decode data using Caesar cipher. + + :param data: Data which should be decoded | None + :type data: + :param shift_counter: Defining the shift count | None + :type shift_counter: + :return: True (if success) | False (if fail) + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Method decode() is not implemented') diff --git a/codecipher/caesar/icaesar_encoder.py b/codecipher/caesar/icaesar_encoder.py new file mode 100644 index 0000000..d4fafe5 --- /dev/null +++ b/codecipher/caesar/icaesar_encoder.py @@ -0,0 +1,64 @@ +# -*- coding: UTF-8 -*- + +''' +Module + icaesar_encoder.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines interface ICaesarEncoder with attribute(s) and method(s). + Interface for Caesar Encoder. +''' + +from abc import ABC, abstractmethod +from typing import Optional + +class ICaesarEncoder(ABC): + ''' + Defines interface ICaesarEncoder with attribute(s) and method(s). + Interface for Caesar Encoder. + + It defines: + :attributes: + | None. + :methods: + | encode_data - Property method for getting encoded data. + | encode - Encode data using Caesar cipher. + ''' + + @property + @abstractmethod + def encode_data(self) -> Optional[str]: + ''' + Property method for getting encoded data. + + :return: Encoded data | None + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Method encode_data() is not implemented') + + @abstractmethod + def encode(self, data: Optional[str], shift_counter: Optional[int]) -> bool: + ''' + Encode data using Caesar cipher. + + :param data: Data which should be encoded | None + :type data: + :param shift_counter: Defining the shift count | None + :type shift_counter: + :return: True (if success) | False (if fail) + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Method encode() is not implemented') diff --git a/docs/build/html/_modules/codecipher/atbs.html b/docs/build/html/_modules/codecipher/atbs.html index f98ccad..e857b31 100644 --- a/docs/build/html/_modules/codecipher/atbs.html +++ b/docs/build/html/_modules/codecipher/atbs.html @@ -54,7 +54,7 @@

                        Source code for codecipher.atbs

                             You should have received a copy of the GNU General Public License along
                             with this program. If not, see <http://www.gnu.org/licenses/>.
                         Info
                        -    Defines class AlephTawBetShin with attribute(s) and method(s).
                        +    Defines class ATBS with attribute(s) and method(s).
                             Creates container class with aggregate backend API.
                         '''
                         
                        @@ -62,8 +62,8 @@ 

                        Source code for codecipher.atbs

                         from typing import List
                         
                         try:
                        -    from codecipher.atbs.encode import AlephTawBetShinEncode
                        -    from codecipher.atbs.decode import AlephTawBetShinDecode
                        +    from codecipher.atbs.encode import ATBSEncode
                        +    from codecipher.atbs.decode import ATBSDecode
                         except ImportError as ats_error_message:  # pragma: no cover
                             # Force exit python #######################################################
                             sys.exit(f'\n{__file__}\n{ats_error_message}\n')  # pragma: no cover
                        @@ -78,11 +78,11 @@ 

                        Source code for codecipher.atbs

                         __status__: str = 'Updated'
                         
                         
                        -
                        -[docs] -class AlephTawBetShin(AlephTawBetShinEncode, AlephTawBetShinDecode): +
                        +[docs] +class ATBS(ATBSEncode, ATBSDecode): ''' - Defines class AlephTawBetShin with attribute(s) and method(s). + Defines class ATBS with attribute(s) and method(s). Creates container class with aggregate backend API. It defines: @@ -90,12 +90,12 @@

                        Source code for codecipher.atbs

                                     :attributes:
                                         | None.
                                     :methods:
                        -                | __init__ - Initials AlephTawBetShin constructor.
                        +                | __init__ - Initials ATBS constructor.
                             '''
                         
                             def __init__(self) -> None:
                                 '''
                        -            Initials AlephTawBetShin constructor.
                        +            Initials ATBS constructor.
                         
                                     :exceptions: None
                                 '''
                        diff --git a/docs/build/html/_modules/codecipher/atbs/decode.html b/docs/build/html/_modules/codecipher/atbs/decode.html
                        index 68db314..80d521c 100644
                        --- a/docs/build/html/_modules/codecipher/atbs/decode.html
                        +++ b/docs/build/html/_modules/codecipher/atbs/decode.html
                        @@ -55,7 +55,7 @@ 

                        Source code for codecipher.atbs.decode

                             You should have received a copy of the GNU General Public License along
                             with this program. If not, see <http://www.gnu.org/licenses/>.
                         Info
                        -    Defines class AlephTawBetShinDecode with attribute(s) and method(s).
                        +    Defines class ATBSDecode with attribute(s) and method(s).
                             Creates decode class with backend API.
                         '''
                         
                        @@ -79,12 +79,12 @@ 

                        Source code for codecipher.atbs.decode

                         __status__: str = 'Updated'
                         
                         
                        -
                        -[docs] +
                        +[docs] @dataclass -class AlephTawBetShinDecode: +class ATBSDecode: ''' - Defines class AlephTawBetShinDecode with attribute(s) and method(s). + Defines class ATBSDecode with attribute(s) and method(s). Creates decode class with backend API. It defines: @@ -93,7 +93,7 @@

                        Source code for codecipher.atbs.decode

                                         | _decode_data - Data decode container.
                                     :methods:
                                         | decode_data - Property methods for decode data.
                        -                | decode - Decode data from AlephTawBetShin format.
                        +                | decode - Decode data from ATBS format.
                             '''
                         
                             _decode_data: Optional[str] = field(default=None)
                        @@ -122,11 +122,11 @@ 

                        Source code for codecipher.atbs.decode

                                 if bool(decode_data):
                                     self._decode_data = decode_data
                         
                        -
                        -[docs] +
                        +[docs] def decode(self, data: Optional[str]) -> None: ''' - Decoding data from AlephTawBetShin format. + Decoding data from ATBS format. :param data: Data which should be decoded | None :type data: <Optional[str]> diff --git a/docs/build/html/_modules/codecipher/atbs/encode.html b/docs/build/html/_modules/codecipher/atbs/encode.html index 0f15683..99385e4 100644 --- a/docs/build/html/_modules/codecipher/atbs/encode.html +++ b/docs/build/html/_modules/codecipher/atbs/encode.html @@ -55,7 +55,7 @@

                        Source code for codecipher.atbs.encode

                             You should have received a copy of the GNU General Public License along
                             with this program. If not, see <http://www.gnu.org/licenses/>.
                         Info
                        -    Defines class AlephTawBetShinEncode with attribute(s) and method(s).
                        +    Defines class ATBSEncode with attribute(s) and method(s).
                             Creates encode class with backend API.
                         '''
                         
                        @@ -79,12 +79,12 @@ 

                        Source code for codecipher.atbs.encode

                         __status__: str = 'Updated'
                         
                         
                        -
                        -[docs] +
                        +[docs] @dataclass -class AlephTawBetShinEncode: +class ATBSEncode: ''' - Defines class AlephTawBetShinEncode with attribute(s) and method(s). + Defines class ATBSEncode with attribute(s) and method(s). Creates encode class with backend API. It defines: @@ -93,7 +93,7 @@

                        Source code for codecipher.atbs.encode

                                         | _encode_data - Data encode container.
                                     :methods:
                                         | encode_data - Property methods for encode data.
                        -                | encode - Encode data to AlephTawBetShin format.
                        +                | encode - Encode data to ATBS format.
                             '''
                         
                             _encode_data: Optional[str] = field(default=None)
                        @@ -122,11 +122,11 @@ 

                        Source code for codecipher.atbs.encode

                                 if bool(encode_data):
                                     self._encode_data = encode_data
                         
                        -
                        -[docs] +
                        +[docs] def encode(self, data: Optional[str]) -> None: ''' - Encoding data to AlephTawBetShin format. + Encoding data to ATBS format. :param data: Data which should be encoded | None :type data: <Optional[str]> diff --git a/docs/build/html/_modules/codecipher/b64/decode.html b/docs/build/html/_modules/codecipher/b64/decode.html index ce5c928..530735f 100644 --- a/docs/build/html/_modules/codecipher/b64/decode.html +++ b/docs/build/html/_modules/codecipher/b64/decode.html @@ -55,7 +55,7 @@

                        Source code for codecipher.b64.decode

                             You should have received a copy of the GNU General Public License along
                             with this program. If not, see <http://www.gnu.org/licenses/>.
                         Info
                        -    Defines class AlephTawBetShinDecode with attribute(s) and method(s).
                        +    Defines class ATBSDecode with attribute(s) and method(s).
                             Creates decode class with backend API.
                         '''
                         
                        @@ -78,7 +78,7 @@ 

                        Source code for codecipher.b64.decode

                         @dataclass
                         class B64Decode:
                             '''
                        -        Defines class AlephTawBetShinDecode with attribute(s) and method(s).
                        +        Defines class ATBSDecode with attribute(s) and method(s).
                                 Creates decode class with backend API.
                         
                                 It defines:
                        @@ -87,7 +87,7 @@ 

                        Source code for codecipher.b64.decode

                                         | _decode_data - Data decode container.
                                     :methods:
                                         | decode_data - Property methods for decode data.
                        -                | decode - Decode data from AlephTawBetShin format.
                        +                | decode - Decode data from ATBS format.
                             '''
                         
                             _decode_data: Optional[str] = field(default=None)
                        @@ -120,7 +120,7 @@ 

                        Source code for codecipher.b64.decode

                         [docs]
                             def decode(self, data: Optional[str]) -> None:
                                 '''
                        -            Decoding data from AlephTawBetShin format.
                        +            Decoding data from ATBS format.
                         
                                     :param data: Data which should be decoded | None
                                     :type data: <Optional[str]>
                        diff --git a/docs/build/html/_modules/codecipher/b64/encode.html b/docs/build/html/_modules/codecipher/b64/encode.html
                        index 25e4748..2211328 100644
                        --- a/docs/build/html/_modules/codecipher/b64/encode.html
                        +++ b/docs/build/html/_modules/codecipher/b64/encode.html
                        @@ -87,7 +87,7 @@ 

                        Source code for codecipher.b64.encode

                                         | _encode_data - Data encode container.
                                     :methods:
                                         | encode_data - Property methods for encode data.
                        -                | encode - Encode data to AlephTawBetShin format.
                        +                | encode - Encode data to ATBS format.
                             '''
                         
                             _encode_data: Optional[str] = field(default=None)
                        @@ -120,7 +120,7 @@ 

                        Source code for codecipher.b64.encode

                         [docs]
                             def encode(self, data: Optional[str]) -> None:
                                 '''
                        -            Encoding data to AlephTawBetShin format.
                        +            Encoding data to ATBS format.
                         
                                     :param data: Data which should be encoded | None
                                     :type data: <Optional[str]>
                        diff --git a/docs/build/html/codecipher.atbs.decode.html b/docs/build/html/codecipher.atbs.decode.html
                        index 1363ece..44a6151 100644
                        --- a/docs/build/html/codecipher.atbs.decode.html
                        +++ b/docs/build/html/codecipher.atbs.decode.html
                        @@ -63,15 +63,15 @@ 

                        Navigation

                        You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.

                        -
                        Info

                        Defines class AlephTawBetShinDecode with attribute(s) and method(s). +

                        Info

                        Defines class ATBSDecode with attribute(s) and method(s). Creates decode class with backend API.

                        -
                        -class codecipher.atbs.decode.AlephTawBetShinDecode(_decode_data: str | None = None)[source]
                        +
                        +class codecipher.atbs.decode.ATBSDecode(_decode_data: str | None = None)[source]

                        Bases: object

                        -

                        Defines class AlephTawBetShinDecode with attribute(s) and method(s). +

                        Defines class ATBSDecode with attribute(s) and method(s). Creates decode class with backend API.

                        It defines:

                        @@ -84,20 +84,20 @@

                        Navigation

                        methods:
                        decode_data - Property methods for decode data.
                        -
                        decode - Decode data from AlephTawBetShin format.
                        +
                        decode - Decode data from ATBS format.
                        -
                        -_decode_data: str | None = None
                        +
                        +_decode_data: str | None = None
                        -
                        -decode(data: str | None) None[source]
                        -

                        Decoding data from AlephTawBetShin format.

                        +
                        +decode(data: str | None) None[source]
                        +

                        Decoding data from ATBS format.

                        Parameters:

                        data (<Optional[str]>) – Data which should be decoded | None

                        @@ -112,8 +112,8 @@

                        Navigation

                        -
                        -property decode_data: str | None
                        +
                        +property decode_data: str | None

                        Property method for getting decode data.

                        Returns:
                        @@ -143,10 +143,10 @@

                        Navigation

                        Table of Contents

                        -
                        Info

                        Defines class AlephTawBetShinEncode with attribute(s) and method(s). +

                        Info

                        Defines class ATBSEncode with attribute(s) and method(s). Creates encode class with backend API.

                        -
                        -class codecipher.atbs.encode.AlephTawBetShinEncode(_encode_data: str | None = None)[source]
                        +
                        +class codecipher.atbs.encode.ATBSEncode(_encode_data: str | None = None)[source]

                        Bases: object

                        -

                        Defines class AlephTawBetShinEncode with attribute(s) and method(s). +

                        Defines class ATBSEncode with attribute(s) and method(s). Creates encode class with backend API.

                        It defines:

                        @@ -84,20 +84,20 @@

                        Navigation

                        methods:
                        encode_data - Property methods for encode data.
                        -
                        encode - Encode data to AlephTawBetShin format.
                        +
                        encode - Encode data to ATBS format.
                        -
                        -_encode_data: str | None = None
                        +
                        +_encode_data: str | None = None
                        -
                        -encode(data: str | None) None[source]
                        -

                        Encoding data to AlephTawBetShin format.

                        +
                        +encode(data: str | None) None[source]
                        +

                        Encoding data to ATBS format.

                        Parameters:

                        data (<Optional[str]>) – Data which should be encoded | None

                        @@ -112,8 +112,8 @@

                        Navigation

                        -
                        -property encode_data: str | None
                        +
                        +property encode_data: str | None

                        Property method for getting encode data.

                        Returns:
                        @@ -143,10 +143,10 @@

                        Navigation

                        Table of Contents

                        -
                        Info

                        Defines class AlephTawBetShin with attribute(s) and method(s). +

                        Info

                        Defines class ATBS with attribute(s) and method(s). Creates container class with aggregate backend API.

                        -
                        -class codecipher.atbs.AlephTawBetShin[source]
                        -

                        Bases: AlephTawBetShinEncode, AlephTawBetShinDecode

                        -

                        Defines class AlephTawBetShin with attribute(s) and method(s). +

                        +class codecipher.atbs.ATBS[source]
                        +

                        Bases: ATBSEncode, ATBSDecode

                        +

                        Defines class ATBS with attribute(s) and method(s). Creates container class with aggregate backend API.

                        It defines:

                        @@ -110,7 +110,7 @@

                        Submodulesmethods:
                        -
                        __init__ - Initials AlephTawBetShin constructor.
                        +
                        __init__ - Initials ATBS constructor.

                        @@ -133,7 +133,7 @@

                        Table of Contents

                      • codecipher.atbs package diff --git a/docs/build/html/codecipher.atbs.lookup_table.html b/docs/build/html/codecipher.atbs.lookup_table.html index 9995c3b..f5e06be 100644 --- a/docs/build/html/codecipher.atbs.lookup_table.html +++ b/docs/build/html/codecipher.atbs.lookup_table.html @@ -63,7 +63,7 @@

                        Navigation

                        You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.

                      • -
                        Info

                        Defines dict LOOKUP_TABLE for AlephTawBetShin format.

                        +
                        Info

                        Defines dict LOOKUP_TABLE for ATBS format.

                        diff --git a/docs/build/html/codecipher.b64.decode.html b/docs/build/html/codecipher.b64.decode.html index 114a034..01045b5 100644 --- a/docs/build/html/codecipher.b64.decode.html +++ b/docs/build/html/codecipher.b64.decode.html @@ -63,7 +63,7 @@

                        Navigation

                        You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.

                        -
                        Info

                        Defines class AlephTawBetShinDecode with attribute(s) and method(s). +

                        Info

                        Defines class ATBSDecode with attribute(s) and method(s). Creates decode class with backend API.

                        @@ -71,7 +71,7 @@

                        Navigation

                        class codecipher.b64.decode.B64Decode(_decode_data: str | None = None)[source]

                        Bases: object

                        -

                        Defines class AlephTawBetShinDecode with attribute(s) and method(s). +

                        Defines class ATBSDecode with attribute(s) and method(s). Creates decode class with backend API.

                        It defines:

                        @@ -84,7 +84,7 @@

                        Navigation

                        methods:
                        decode_data - Property methods for decode data.
                        -
                        decode - Decode data from AlephTawBetShin format.
                        +
                        decode - Decode data from ATBS format.
                        @@ -97,7 +97,7 @@

                        Navigation

                        decode(data: str | None) None[source]
                        -

                        Decoding data from AlephTawBetShin format.

                        +

                        Decoding data from ATBS format.

                        Parameters:

                        data (<Optional[str]>) – Data which should be decoded | None

                        diff --git a/docs/build/html/codecipher.b64.encode.html b/docs/build/html/codecipher.b64.encode.html index eb0f04f..d1766aa 100644 --- a/docs/build/html/codecipher.b64.encode.html +++ b/docs/build/html/codecipher.b64.encode.html @@ -84,7 +84,7 @@

                        Navigation

                        methods:
                        encode_data - Property methods for encode data.
                        -
                        encode - Encode data to AlephTawBetShin format.
                        +
                        encode - Encode data to ATBS format.
                        @@ -97,7 +97,7 @@

                        Navigation

                        encode(data: str | None) None[source]
                        -

                        Encoding data to AlephTawBetShin format.

                        +

                        Encoding data to ATBS format.

                        Parameters:

                        data (<Optional[str]>) – Data which should be encoded | None

                        diff --git a/docs/build/html/codecipher.html b/docs/build/html/codecipher.html index 4d450cf..50b99ad 100644 --- a/docs/build/html/codecipher.html +++ b/docs/build/html/codecipher.html @@ -71,18 +71,18 @@

                        Subpackagescodecipher.atbs package diff --git a/docs/build/html/genindex.html b/docs/build/html/genindex.html index 7b0dbe9..02e7d60 100644 --- a/docs/build/html/genindex.html +++ b/docs/build/html/genindex.html @@ -62,7 +62,7 @@

                        _

                      • _decode_data (codecipher.a1z52n62.decode.A1z52N62Decoder attribute)
                      • - + @@ -146,7 +146,7 @@

                        - + @@ -162,7 +162,7 @@

                        - + diff --git a/tests/htmlcov/function_index.html b/tests/htmlcov/function_index.html index c26ef60..607f984 100644 --- a/tests/htmlcov/function_index.html +++ b/tests/htmlcov/function_index.html @@ -162,7 +162,7 @@

                        - + @@ -178,7 +178,7 @@

                        - + @@ -186,7 +186,7 @@

                        - + @@ -194,7 +194,7 @@

                        - + @@ -210,7 +210,7 @@

                        - + @@ -218,7 +218,7 @@

                        - + @@ -226,7 +226,7 @@

                        - + diff --git a/tests/htmlcov/z_8f54ab6b5b508ca0_decode_py.html b/tests/htmlcov/z_8f54ab6b5b508ca0_decode_py.html index 77cd588..be0db39 100644 --- a/tests/htmlcov/z_8f54ab6b5b508ca0_decode_py.html +++ b/tests/htmlcov/z_8f54ab6b5b508ca0_decode_py.html @@ -98,7 +98,7 @@

                        16 You should have received a copy of the GNU General Public License along 

                        17 with this program. If not, see <http://www.gnu.org/licenses/>. 

                        18Info 

                        -

                        19 Defines class AlephTawBetShinDecode with attribute(s) and method(s). 

                        +

                        19 Defines class ATBSDecode with attribute(s) and method(s). 

                        20 Creates decode class with backend API. 

                        21''' 

                        22 

                        @@ -119,7 +119,7 @@

                        37@dataclass 

                        38class B64Decode: 

                        39 ''' 

                        -

                        40 Defines class AlephTawBetShinDecode with attribute(s) and method(s). 

                        +

                        40 Defines class ATBSDecode with attribute(s) and method(s). 

                        41 Creates decode class with backend API. 

                        42 

                        43 It defines: 

                        @@ -128,7 +128,7 @@

                        46 | _decode_data - Data decode container. 

                        47 :methods: 

                        48 | decode_data - Property methods for decode data. 

                        -

                        49 | decode - Decode data from AlephTawBetShin format. 

                        +

                        49 | decode - Decode data from ATBS format. 

                        50 ''' 

                        51 

                        52 _decode_data: Optional[str] = field(default=None) 

                        @@ -159,7 +159,7 @@

                        77 

                        78 def decode(self, data: Optional[str]) -> None: 

                        79 ''' 

                        -

                        80 Decoding data from AlephTawBetShin format. 

                        +

                        80 Decoding data from ATBS format. 

                        81 

                        82 :param data: Data which should be decoded | None 

                        83 :type data: <Optional[str]> 

                        diff --git a/tests/htmlcov/z_8f54ab6b5b508ca0_encode_py.html b/tests/htmlcov/z_8f54ab6b5b508ca0_encode_py.html index 2491587..e3c4ee2 100644 --- a/tests/htmlcov/z_8f54ab6b5b508ca0_encode_py.html +++ b/tests/htmlcov/z_8f54ab6b5b508ca0_encode_py.html @@ -128,7 +128,7 @@

                        46 | _encode_data - Data encode container. 

                        47 :methods: 

                        48 | encode_data - Property methods for encode data. 

                        -

                        49 | encode - Encode data to AlephTawBetShin format. 

                        +

                        49 | encode - Encode data to ATBS format. 

                        50 ''' 

                        51 

                        52 _encode_data: Optional[str] = field(default=None) 

                        @@ -159,7 +159,7 @@

                        77 

                        78 def encode(self, data: Optional[str]) -> None: 

                        79 ''' 

                        -

                        80 Encoding data to AlephTawBetShin format. 

                        +

                        80 Encoding data to ATBS format. 

                        81 

                        82 :param data: Data which should be encoded | None 

                        83 :type data: <Optional[str]> 

                        diff --git a/tests/htmlcov/z_9927f90504198b80___init___py.html b/tests/htmlcov/z_9927f90504198b80___init___py.html index caf1f02..ebcee85 100644 --- a/tests/htmlcov/z_9927f90504198b80___init___py.html +++ b/tests/htmlcov/z_9927f90504198b80___init___py.html @@ -98,7 +98,7 @@

                        16 You should have received a copy of the GNU General Public License along 

                        17 with this program. If not, see <http://www.gnu.org/licenses/>. 

                        18Info 

                        -

                        19 Defines class AlephTawBetShin with attribute(s) and method(s). 

                        +

                        19 Defines class ATBS with attribute(s) and method(s). 

                        20 Creates container class with aggregate backend API. 

                        21''' 

                        22 

                        @@ -106,8 +106,8 @@

                        24from typing import List 

                        25 

                        26try: 

                        -

                        27 from codecipher.atbs.encode import AlephTawBetShinEncode 

                        -

                        28 from codecipher.atbs.decode import AlephTawBetShinDecode 

                        +

                        27 from codecipher.atbs.encode import ATBSEncode 

                        +

                        28 from codecipher.atbs.decode import ATBSDecode 

                        29except ImportError as ats_error_message: # pragma: no cover 

                        30 # Force exit python ####################################################### 

                        31 sys.exit(f'\n{__file__}\n{ats_error_message}\n') # pragma: no cover 

                        @@ -122,9 +122,9 @@

                        40__status__: str = 'Updated' 

                        41 

                        42 

                        -

                        43class AlephTawBetShin(AlephTawBetShinEncode, AlephTawBetShinDecode): 

                        +

                        43class ATBS(ATBSEncode, ATBSDecode): 

                        44 ''' 

                        -

                        45 Defines class AlephTawBetShin with attribute(s) and method(s). 

                        +

                        45 Defines class ATBS with attribute(s) and method(s). 

                        46 Creates container class with aggregate backend API. 

                        47 

                        48 It defines: 

                        @@ -132,12 +132,12 @@

                        50 :attributes: 

                        51 | None. 

                        52 :methods: 

                        -

                        53 | __init__ - Initials AlephTawBetShin constructor. 

                        +

                        53 | __init__ - Initials ATBS constructor. 

                        54 ''' 

                        55 

                        56 def __init__(self) -> None: 

                        57 ''' 

                        -

                        58 Initials AlephTawBetShin constructor. 

                        +

                        58 Initials ATBS constructor. 

                        59 

                        60 :exceptions: None 

                        61 ''' 

                        diff --git a/tests/htmlcov/z_9927f90504198b80_decode_py.html b/tests/htmlcov/z_9927f90504198b80_decode_py.html index 34eb426..780caa9 100644 --- a/tests/htmlcov/z_9927f90504198b80_decode_py.html +++ b/tests/htmlcov/z_9927f90504198b80_decode_py.html @@ -98,7 +98,7 @@

                        16 You should have received a copy of the GNU General Public License along 

                        17 with this program. If not, see <http://www.gnu.org/licenses/>. 

                        18Info 

                        -

                        19 Defines class AlephTawBetShinDecode with attribute(s) and method(s). 

                        +

                        19 Defines class ATBSDecode with attribute(s) and method(s). 

                        20 Creates decode class with backend API. 

                        21''' 

                        22 

                        @@ -123,9 +123,9 @@

                        41 

                        42 

                        43@dataclass 

                        -

                        44class AlephTawBetShinDecode: 

                        +

                        44class ATBSDecode: 

                        45 ''' 

                        -

                        46 Defines class AlephTawBetShinDecode with attribute(s) and method(s). 

                        +

                        46 Defines class ATBSDecode with attribute(s) and method(s). 

                        47 Creates decode class with backend API. 

                        48 

                        49 It defines: 

                        @@ -134,7 +134,7 @@

                        52 | _decode_data - Data decode container. 

                        53 :methods: 

                        54 | decode_data - Property methods for decode data. 

                        -

                        55 | decode - Decode data from AlephTawBetShin format. 

                        +

                        55 | decode - Decode data from ATBS format. 

                        56 ''' 

                        57 

                        58 _decode_data: Optional[str] = field(default=None) 

                        @@ -165,7 +165,7 @@

                        83 

                        84 def decode(self, data: Optional[str]) -> None: 

                        85 ''' 

                        -

                        86 Decoding data from AlephTawBetShin format. 

                        +

                        86 Decoding data from ATBS format. 

                        87 

                        88 :param data: Data which should be decoded | None 

                        89 :type data: <Optional[str]> 

                        diff --git a/tests/htmlcov/z_9927f90504198b80_encode_py.html b/tests/htmlcov/z_9927f90504198b80_encode_py.html index 0eb457d..03515f1 100644 --- a/tests/htmlcov/z_9927f90504198b80_encode_py.html +++ b/tests/htmlcov/z_9927f90504198b80_encode_py.html @@ -98,7 +98,7 @@

                        16 You should have received a copy of the GNU General Public License along 

                        17 with this program. If not, see <http://www.gnu.org/licenses/>. 

                        18Info 

                        -

                        19 Defines class AlephTawBetShinEncode with attribute(s) and method(s). 

                        +

                        19 Defines class ATBSEncode with attribute(s) and method(s). 

                        20 Creates encode class with backend API. 

                        21''' 

                        22 

                        @@ -123,9 +123,9 @@

                        41 

                        42 

                        43@dataclass 

                        -

                        44class AlephTawBetShinEncode: 

                        +

                        44class ATBSEncode: 

                        45 ''' 

                        -

                        46 Defines class AlephTawBetShinEncode with attribute(s) and method(s). 

                        +

                        46 Defines class ATBSEncode with attribute(s) and method(s). 

                        47 Creates encode class with backend API. 

                        48 

                        49 It defines: 

                        @@ -134,7 +134,7 @@

                        52 | _encode_data - Data encode container. 

                        53 :methods: 

                        54 | encode_data - Property methods for encode data. 

                        -

                        55 | encode - Encode data to AlephTawBetShin format. 

                        +

                        55 | encode - Encode data to ATBS format. 

                        56 ''' 

                        57 

                        58 _encode_data: Optional[str] = field(default=None) 

                        @@ -165,7 +165,7 @@

                        83 

                        84 def encode(self, data: Optional[str]) -> None: 

                        85 ''' 

                        -

                        86 Encoding data to AlephTawBetShin format. 

                        +

                        86 Encoding data to ATBS format. 

                        87 

                        88 :param data: Data which should be encoded | None 

                        89 :type data: <Optional[str]> 

                        diff --git a/tests/htmlcov/z_9927f90504198b80_lookup_table_py.html b/tests/htmlcov/z_9927f90504198b80_lookup_table_py.html index e1d14fd..53aed23 100644 --- a/tests/htmlcov/z_9927f90504198b80_lookup_table_py.html +++ b/tests/htmlcov/z_9927f90504198b80_lookup_table_py.html @@ -98,7 +98,7 @@

                        16 You should have received a copy of the GNU General Public License along 

                        17 with this program. If not, see <http://www.gnu.org/licenses/>. 

                        18Info 

                        -

                        19 Defines dict LOOKUP_TABLE for AlephTawBetShin format. 

                        +

                        19 Defines dict LOOKUP_TABLE for ATBS format. 

                        20''' 

                        21 

                        22from typing import List, Dict 

                        From 271a209fab020876cab5e0f35dd1a195ef558085 Mon Sep 17 00:00:00 2001 From: Vladimir Roncevic Date: Wed, 10 Jun 2026 16:28:48 +0200 Subject: [PATCH 03/10] [codecipher] Refactor based on SOLID principles --- README.md | 92 +- codecipher/__init__.py | 2 + codecipher/a1z52n62/__init__.py | 18 +- codecipher/a1z52n62/a1z52n62.py | 12 +- ...ator.py => default_character_validator.py} | 18 +- ...validator.py => default_data_validator.py} | 26 +- .../a1z52n62/default_validation_engine.py | 89 + .../__init__.py} | 40 +- .../icharacter_validator.py | 6 +- .../idata_validator.py | 4 +- .../ivalidation_engine.py | 8 +- codecipher/atbs/__init__.py | 18 +- codecipher/atbs/atbs.py | 10 +- ...ator.py => default_character_validator.py} | 21 +- ...validator.py => default_data_validator.py} | 27 +- codecipher/atbs/default_validation_engine.py | 89 + codecipher/b64/__init__.py | 26 +- codecipher/b64/b64.py | 25 +- codecipher/b64/b64decoder.py | 4 +- codecipher/b64/b64encoder.py | 4 +- ...ator.py => default_character_validator.py} | 16 +- ...validator.py => default_data_validator.py} | 26 +- .../default_validation_engine.py} | 32 +- .../b64/{ib64decoder.py => idecoder.py} | 8 +- .../b64/{ib64encoder.py => iencoder.py} | 8 +- codecipher/b64/ivalidation_engine.py | 71 - codecipher/caesar/__init__.py | 23 +- codecipher/caesar/caesar.py | 39 +- codecipher/caesar/decoder.py | 4 +- .../default_character_validator.py} | 35 +- codecipher/caesar/default_data_validator.py | 73 + .../caesar/default_validation_engine.py | 89 + codecipher/caesar/encoder.py | 4 +- .../{icaesar_decoder.py => idecoder.py} | 8 +- .../{icaesar_encoder.py => iencoder.py} | 8 +- .../lookup_table.py} | 31 +- codecipher/vernam/__init__.py | 52 +- codecipher/vernam/{decode.py => decoder.py} | 16 +- .../vernam/default_character_validator.py | 68 + codecipher/vernam/default_data_validator.py | 73 + .../default_validation_engine.py} | 30 +- codecipher/vernam/{encode.py => encoder.py} | 16 +- .../idecoder.py} | 39 +- codecipher/vernam/iencoder.py | 72 + codecipher/vernam/ivernam.py | 99 + .../lookup_table.py} | 31 +- codecipher/vernam/vernam.py | 128 + codecipher/vigenere/__init__.py | 55 +- codecipher/vigenere/{decode.py => decoder.py} | 58 +- .../vigenere/default_character_validator.py | 68 + codecipher/vigenere/default_data_validator.py | 73 + .../default_validation_engine.py} | 32 +- codecipher/vigenere/{encode.py => encoder.py} | 58 +- codecipher/vigenere/idecoder.py | 72 + codecipher/vigenere/iencoder.py | 72 + codecipher/vigenere/ikey_generator.py | 78 + codecipher/vigenere/ivigenere.py | 85 + codecipher/vigenere/key_generator.py | 32 +- codecipher/vigenere/vigenere.py | 145 ++ setup.py | 12 +- tests/.coverage | Bin 53248 -> 69632 bytes tests/a1z52n62_test.py | 8 +- tests/atbs_test.py | 8 +- tests/ats_coverage.py | 59 +- tests/caesar_test.py | 42 +- tests/codecipher_coverage.json | 2 +- tests/codecipher_coverage.xml | 2111 ++++++++++++++--- tests/htmlcov/class_index.html | 1074 +++++++-- tests/htmlcov/function_index.html | 1956 ++++++++++++--- tests/htmlcov/index.html | 486 +++- tests/htmlcov/status.json | 2 +- .../z_094bd7de807a5f14___init___py.html | 76 +- .../htmlcov/z_094bd7de807a5f14_caesar_py.html | 230 ++ ...tml => z_094bd7de807a5f14_decoder_py.html} | 206 +- ...7a5f14_default_character_validator_py.html | 165 ++ ...7de807a5f14_default_data_validator_py.html | 170 ++ ...807a5f14_default_validation_engine_py.html | 186 ++ ...tml => z_094bd7de807a5f14_encoder_py.html} | 206 +- .../z_094bd7de807a5f14_icaesar_py.html | 190 ++ .../z_094bd7de807a5f14_idecoder_py.html | 161 ++ .../z_094bd7de807a5f14_iencoder_py.html | 161 ++ .../z_094bd7de807a5f14_lookup_table_py.html | 145 ++ .../z_68dd2e06c08fee1b___init___py.html | 138 ++ ...d2e06c08fee1b_icharacter_validator_py.html | 154 ++ ...z_68dd2e06c08fee1b_idata_validator_py.html | 154 ++ ...8dd2e06c08fee1b_ivalidation_engine_py.html | 168 ++ .../z_75799433d8182c47___init___py.html | 79 +- ...tml => z_75799433d8182c47_decoder_py.html} | 228 +- ...182c47_default_character_validator_py.html | 165 ++ ...433d8182c47_default_data_validator_py.html | 170 ++ ...d8182c47_default_validation_engine_py.html | 186 ++ ...tml => z_75799433d8182c47_encoder_py.html} | 232 +- .../z_75799433d8182c47_idecoder_py.html | 169 ++ .../z_75799433d8182c47_iencoder_py.html | 169 ++ .../z_75799433d8182c47_ikey_generator_py.html | 175 ++ .../z_75799433d8182c47_ivigenere_py.html | 182 ++ .../z_75799433d8182c47_key_generator_py.html | 216 +- .../z_75799433d8182c47_lookup_table_py.html | 8 +- .../z_75799433d8182c47_vigenere_py.html | 242 ++ .../z_7dc3960ecaf412e4___init___py.html | 23 +- .../z_8f54ab6b5b508ca0___init___py.html | 83 +- tests/htmlcov/z_8f54ab6b5b508ca0_b64_py.html | 215 ++ ... => z_8f54ab6b5b508ca0_b64decoder_py.html} | 135 +- ... => z_8f54ab6b5b508ca0_b64encoder_py.html} | 137 +- ...508ca0_default_character_validator_py.html | 165 ++ ...b6b5b508ca0_default_data_validator_py.html | 170 ++ ...5b508ca0_default_validation_engine_py.html | 186 ++ tests/htmlcov/z_8f54ab6b5b508ca0_ib64_py.html | 192 ++ .../z_8f54ab6b5b508ca0_idecoder_py.html | 167 ++ .../z_8f54ab6b5b508ca0_iencoder_py.html | 167 ++ .../z_96938f9400a5cdf6___init___py.html | 92 +- ...z_96938f9400a5cdf6_a1z52n62_config_py.html | 150 ++ .../z_96938f9400a5cdf6_a1z52n62_py.html | 234 ++ .../z_96938f9400a5cdf6_decoder_py.html | 213 ++ ...a5cdf6_default_character_validator_py.html | 168 ++ ...f9400a5cdf6_default_data_validator_py.html | 170 ++ ...00a5cdf6_default_validation_engine_py.html | 186 ++ .../z_96938f9400a5cdf6_encoder_py.html | 216 ++ .../z_96938f9400a5cdf6_ia1z52n62_py.html | 194 ++ ...ml => z_96938f9400a5cdf6_idecoder_py.html} | 165 +- ...ml => z_96938f9400a5cdf6_iencoder_py.html} | 165 +- .../z_9927f90504198b80___init___py.html | 76 +- tests/htmlcov/z_9927f90504198b80_atbs_py.html | 211 ++ ...tml => z_9927f90504198b80_decoder_py.html} | 112 +- ...198b80_default_character_validator_py.html | 156 ++ ...90504198b80_default_data_validator_py.html | 171 ++ ...04198b80_default_validation_engine_py.html | 186 ++ ...tml => z_9927f90504198b80_encoder_py.html} | 112 +- .../htmlcov/z_9927f90504198b80_iatbs_py.html | 182 ++ .../z_9927f90504198b80_idecoder_py.html | 167 ++ .../z_9927f90504198b80_iencoder_py.html | 167 ++ .../z_9927f90504198b80_lookup_table_py.html | 8 +- .../z_aba196749d301797___init___py.html | 76 +- ...tml => z_aba196749d301797_decoder_py.html} | 184 +- ...301797_default_character_validator_py.html | 165 ++ ...6749d301797_default_data_validator_py.html | 170 ++ ...9d301797_default_validation_engine_py.html | 186 ++ ...tml => z_aba196749d301797_encoder_py.html} | 188 +- .../z_aba196749d301797_idecoder_py.html | 169 ++ .../z_aba196749d301797_iencoder_py.html | 169 ++ .../z_aba196749d301797_ivernam_py.html | 196 ++ .../z_aba196749d301797_lookup_table_py.html | 145 ++ .../htmlcov/z_aba196749d301797_vernam_py.html | 225 ++ tests/vernam_test.py | 213 +- tests/vigenere_test.py | 162 +- 145 files changed, 17351 insertions(+), 2995 deletions(-) rename codecipher/a1z52n62/{character_validator.py => default_character_validator.py} (77%) rename codecipher/a1z52n62/{data_validator.py => default_data_validator.py} (75%) create mode 100644 codecipher/a1z52n62/default_validation_engine.py rename codecipher/{b64/icharacter_validator.py => abstracts/__init__.py} (55%) rename codecipher/{atbs => abstracts}/icharacter_validator.py (90%) rename codecipher/{a1z52n62 => abstracts}/idata_validator.py (94%) rename codecipher/{a1z52n62 => abstracts}/ivalidation_engine.py (90%) rename codecipher/atbs/{character_validator.py => default_character_validator.py} (69%) rename codecipher/atbs/{data_validator.py => default_data_validator.py} (75%) create mode 100644 codecipher/atbs/default_validation_engine.py rename codecipher/b64/{character_validator.py => default_character_validator.py} (79%) rename codecipher/b64/{data_validator.py => default_data_validator.py} (76%) rename codecipher/{atbs/validation_engine.py => b64/default_validation_engine.py} (73%) rename codecipher/b64/{ib64decoder.py => idecoder.py} (93%) rename codecipher/b64/{ib64encoder.py => iencoder.py} (93%) delete mode 100644 codecipher/b64/ivalidation_engine.py rename codecipher/{a1z52n62/icharacter_validator.py => caesar/default_character_validator.py} (57%) create mode 100644 codecipher/caesar/default_data_validator.py create mode 100644 codecipher/caesar/default_validation_engine.py rename codecipher/caesar/{icaesar_decoder.py => idecoder.py} (91%) rename codecipher/caesar/{icaesar_encoder.py => iencoder.py} (91%) rename codecipher/{b64/idata_validator.py => caesar/lookup_table.py} (60%) rename codecipher/vernam/{decode.py => decoder.py} (91%) create mode 100644 codecipher/vernam/default_character_validator.py create mode 100644 codecipher/vernam/default_data_validator.py rename codecipher/{a1z52n62/validation_engine.py => vernam/default_validation_engine.py} (75%) rename codecipher/vernam/{encode.py => encoder.py} (91%) rename codecipher/{atbs/ivalidation_engine.py => vernam/idecoder.py} (60%) create mode 100644 codecipher/vernam/iencoder.py create mode 100644 codecipher/vernam/ivernam.py rename codecipher/{atbs/idata_validator.py => vernam/lookup_table.py} (60%) create mode 100644 codecipher/vernam/vernam.py rename codecipher/vigenere/{decode.py => decoder.py} (68%) create mode 100644 codecipher/vigenere/default_character_validator.py create mode 100644 codecipher/vigenere/default_data_validator.py rename codecipher/{b64/validation_engine.py => vigenere/default_validation_engine.py} (73%) rename codecipher/vigenere/{encode.py => encoder.py} (68%) create mode 100644 codecipher/vigenere/idecoder.py create mode 100644 codecipher/vigenere/iencoder.py create mode 100644 codecipher/vigenere/ikey_generator.py create mode 100644 codecipher/vigenere/ivigenere.py create mode 100644 codecipher/vigenere/vigenere.py create mode 100644 tests/htmlcov/z_094bd7de807a5f14_caesar_py.html rename tests/htmlcov/{z_094bd7de807a5f14_decode_py.html => z_094bd7de807a5f14_decoder_py.html} (79%) create mode 100644 tests/htmlcov/z_094bd7de807a5f14_default_character_validator_py.html create mode 100644 tests/htmlcov/z_094bd7de807a5f14_default_data_validator_py.html create mode 100644 tests/htmlcov/z_094bd7de807a5f14_default_validation_engine_py.html rename tests/htmlcov/{z_094bd7de807a5f14_encode_py.html => z_094bd7de807a5f14_encoder_py.html} (79%) create mode 100644 tests/htmlcov/z_094bd7de807a5f14_icaesar_py.html create mode 100644 tests/htmlcov/z_094bd7de807a5f14_idecoder_py.html create mode 100644 tests/htmlcov/z_094bd7de807a5f14_iencoder_py.html create mode 100644 tests/htmlcov/z_094bd7de807a5f14_lookup_table_py.html create mode 100644 tests/htmlcov/z_68dd2e06c08fee1b___init___py.html create mode 100644 tests/htmlcov/z_68dd2e06c08fee1b_icharacter_validator_py.html create mode 100644 tests/htmlcov/z_68dd2e06c08fee1b_idata_validator_py.html create mode 100644 tests/htmlcov/z_68dd2e06c08fee1b_ivalidation_engine_py.html rename tests/htmlcov/{z_75799433d8182c47_decode_py.html => z_75799433d8182c47_decoder_py.html} (70%) create mode 100644 tests/htmlcov/z_75799433d8182c47_default_character_validator_py.html create mode 100644 tests/htmlcov/z_75799433d8182c47_default_data_validator_py.html create mode 100644 tests/htmlcov/z_75799433d8182c47_default_validation_engine_py.html rename tests/htmlcov/{z_75799433d8182c47_encode_py.html => z_75799433d8182c47_encoder_py.html} (69%) create mode 100644 tests/htmlcov/z_75799433d8182c47_idecoder_py.html create mode 100644 tests/htmlcov/z_75799433d8182c47_iencoder_py.html create mode 100644 tests/htmlcov/z_75799433d8182c47_ikey_generator_py.html create mode 100644 tests/htmlcov/z_75799433d8182c47_ivigenere_py.html create mode 100644 tests/htmlcov/z_75799433d8182c47_vigenere_py.html create mode 100644 tests/htmlcov/z_8f54ab6b5b508ca0_b64_py.html rename tests/htmlcov/{z_8f54ab6b5b508ca0_decode_py.html => z_8f54ab6b5b508ca0_b64decoder_py.html} (78%) rename tests/htmlcov/{z_8f54ab6b5b508ca0_encode_py.html => z_8f54ab6b5b508ca0_b64encoder_py.html} (76%) create mode 100644 tests/htmlcov/z_8f54ab6b5b508ca0_default_character_validator_py.html create mode 100644 tests/htmlcov/z_8f54ab6b5b508ca0_default_data_validator_py.html create mode 100644 tests/htmlcov/z_8f54ab6b5b508ca0_default_validation_engine_py.html create mode 100644 tests/htmlcov/z_8f54ab6b5b508ca0_ib64_py.html create mode 100644 tests/htmlcov/z_8f54ab6b5b508ca0_idecoder_py.html create mode 100644 tests/htmlcov/z_8f54ab6b5b508ca0_iencoder_py.html create mode 100644 tests/htmlcov/z_96938f9400a5cdf6_a1z52n62_config_py.html create mode 100644 tests/htmlcov/z_96938f9400a5cdf6_a1z52n62_py.html create mode 100644 tests/htmlcov/z_96938f9400a5cdf6_decoder_py.html create mode 100644 tests/htmlcov/z_96938f9400a5cdf6_default_character_validator_py.html create mode 100644 tests/htmlcov/z_96938f9400a5cdf6_default_data_validator_py.html create mode 100644 tests/htmlcov/z_96938f9400a5cdf6_default_validation_engine_py.html create mode 100644 tests/htmlcov/z_96938f9400a5cdf6_encoder_py.html create mode 100644 tests/htmlcov/z_96938f9400a5cdf6_ia1z52n62_py.html rename tests/htmlcov/{z_96938f9400a5cdf6_decode_py.html => z_96938f9400a5cdf6_idecoder_py.html} (62%) rename tests/htmlcov/{z_96938f9400a5cdf6_encode_py.html => z_96938f9400a5cdf6_iencoder_py.html} (63%) create mode 100644 tests/htmlcov/z_9927f90504198b80_atbs_py.html rename tests/htmlcov/{z_9927f90504198b80_decode_py.html => z_9927f90504198b80_decoder_py.html} (76%) create mode 100644 tests/htmlcov/z_9927f90504198b80_default_character_validator_py.html create mode 100644 tests/htmlcov/z_9927f90504198b80_default_data_validator_py.html create mode 100644 tests/htmlcov/z_9927f90504198b80_default_validation_engine_py.html rename tests/htmlcov/{z_9927f90504198b80_encode_py.html => z_9927f90504198b80_encoder_py.html} (76%) create mode 100644 tests/htmlcov/z_9927f90504198b80_iatbs_py.html create mode 100644 tests/htmlcov/z_9927f90504198b80_idecoder_py.html create mode 100644 tests/htmlcov/z_9927f90504198b80_iencoder_py.html rename tests/htmlcov/{z_aba196749d301797_decode_py.html => z_aba196749d301797_decoder_py.html} (86%) create mode 100644 tests/htmlcov/z_aba196749d301797_default_character_validator_py.html create mode 100644 tests/htmlcov/z_aba196749d301797_default_data_validator_py.html create mode 100644 tests/htmlcov/z_aba196749d301797_default_validation_engine_py.html rename tests/htmlcov/{z_aba196749d301797_encode_py.html => z_aba196749d301797_encoder_py.html} (85%) create mode 100644 tests/htmlcov/z_aba196749d301797_idecoder_py.html create mode 100644 tests/htmlcov/z_aba196749d301797_iencoder_py.html create mode 100644 tests/htmlcov/z_aba196749d301797_ivernam_py.html create mode 100644 tests/htmlcov/z_aba196749d301797_lookup_table_py.html create mode 100644 tests/htmlcov/z_aba196749d301797_vernam_py.html diff --git a/README.md b/README.md index 5158ef5..5c48a05 100644 --- a/README.md +++ b/README.md @@ -238,29 +238,79 @@ Package structure | Name | Stmts | Miss | Cover | |------|-------|------|-------| -| `codecipher/__init__.py` | 0 | 0 | 100%| -| `codecipher/a1z52n62/__init__.py` | 16 | 0 | 100%| -| `codecipher/a1z52n62/decode.py` | 32 | 2 | 94%| -| `codecipher/a1z52n62/encode.py` | 32 | 2 | 94%| -| `codecipher/atbs/__init__.py` | 16 | 0 | 100%| -| `codecipher/atbs/decode.py` | 29 | 2 | 93%| -| `codecipher/atbs/encode.py` | 29 | 2 | 93%| +| `codecipher/__init__.py` | 9 | 0 | 100%| +| `codecipher/a1z52n62/__init__.py` | 20 | 0 | 100%| +| `codecipher/a1z52n62/a1z52n62.py` | 37 | 0 | 100%| +| `codecipher/a1z52n62/a1z52n62_config.py` | 18 | 0 | 100%| +| `codecipher/a1z52n62/decoder.py` | 40 | 19 | 52%| +| `codecipher/a1z52n62/default_character_validator.py` | 18 | 3 | 83%| +| `codecipher/a1z52n62/default_data_validator.py` | 18 | 3 | 83%| +| `codecipher/a1z52n62/default_validation_engine.py` | 23 | 7 | 70%| +| `codecipher/a1z52n62/encoder.py` | 39 | 18 | 54%| +| `codecipher/a1z52n62/ia1z52n62.py` | 25 | 4 | 84%| +| `codecipher/a1z52n62/idecoder.py` | 22 | 3 | 86%| +| `codecipher/a1z52n62/iencoder.py` | 22 | 3 | 86%| +| `codecipher/abstracts/__init__.py` | 13 | 0 | 100%| +| `codecipher/abstracts/icharacter_validator.py` | 14 | 1 | 93%| +| `codecipher/abstracts/idata_validator.py` | 14 | 1 | 93%| +| `codecipher/abstracts/ivalidation_engine.py` | 18 | 2 | 89%| +| `codecipher/atbs/__init__.py` | 19 | 0 | 100%| +| `codecipher/atbs/atbs.py` | 35 | 0 | 100%| +| `codecipher/atbs/decoder.py` | 29 | 10 | 66%| +| `codecipher/atbs/default_character_validator.py` | 10 | 3 | 70%| +| `codecipher/atbs/default_data_validator.py` | 19 | 3 | 84%| +| `codecipher/atbs/default_validation_engine.py` | 23 | 7 | 70%| +| `codecipher/atbs/encoder.py` | 29 | 10 | 66%| +| `codecipher/atbs/iatbs.py` | 17 | 4 | 76%| +| `codecipher/atbs/idecoder.py` | 18 | 2 | 89%| +| `codecipher/atbs/iencoder.py` | 18 | 2 | 89%| | `codecipher/atbs/lookup_table.py` | 10 | 0 | 100%| -| `codecipher/b64/__init__.py` | 16 | 0 | 100%| -| `codecipher/b64/decode.py` | 24 | 2 | 92%| -| `codecipher/b64/encode.py` | 24 | 2 | 92%| -| `codecipher/caesar/__init__.py` | 16 | 0 | 100%| -| `codecipher/caesar/decode.py` | 41 | 2 | 95%| -| `codecipher/caesar/encode.py` | 41 | 2 | 95%| -| `codecipher/vernam/__init__.py` | 16 | 0 | 100%| -| `codecipher/vernam/decode.py` | 36 | 2 | 94%| -| `codecipher/vernam/encode.py` | 36 | 2 | 94%| -| `codecipher/vigenere/__init__.py` | 17 | 0 | 100%| -| `codecipher/vigenere/decode.py` | 37 | 2 | 95%| -| `codecipher/vigenere/encode.py` | 37 | 2 | 95%| -| `codecipher/vigenere/key_generator.py` | 37 | 2 | 95%| +| `codecipher/b64/__init__.py` | 19 | 0 | 100%| +| `codecipher/b64/b64.py` | 35 | 0 | 100%| +| `codecipher/b64/b64decoder.py` | 26 | 3 | 88%| +| `codecipher/b64/b64encoder.py` | 26 | 3 | 88%| +| `codecipher/b64/default_character_validator.py` | 18 | 1 | 94%| +| `codecipher/b64/default_data_validator.py` | 18 | 1 | 94%| +| `codecipher/b64/default_validation_engine.py` | 23 | 4 | 83%| +| `codecipher/b64/ib64.py` | 25 | 4 | 84%| +| `codecipher/b64/idecoder.py` | 18 | 2 | 89%| +| `codecipher/b64/iencoder.py` | 18 | 2 | 89%| +| `codecipher/caesar/__init__.py` | 19 | 0 | 100%| +| `codecipher/caesar/caesar.py` | 35 | 0 | 100%| +| `codecipher/caesar/decoder.py` | 44 | 2 | 95%| +| `codecipher/caesar/default_character_validator.py` | 18 | 4 | 78%| +| `codecipher/caesar/default_data_validator.py` | 18 | 4 | 78%| +| `codecipher/caesar/default_validation_engine.py` | 23 | 8 | 65%| +| `codecipher/caesar/encoder.py` | 44 | 2 | 95%| +| `codecipher/caesar/icaesar.py` | 17 | 4 | 76%| +| `codecipher/caesar/idecoder.py` | 10 | 2 | 80%| +| `codecipher/caesar/iencoder.py` | 10 | 2 | 80%| +| `codecipher/caesar/lookup_table.py` | 11 | 0 | 100%| +| `codecipher/vernam/__init__.py` | 19 | 0 | 100%| +| `codecipher/vernam/decoder.py` | 39 | 2 | 95%| +| `codecipher/vernam/default_character_validator.py` | 18 | 1 | 94%| +| `codecipher/vernam/default_data_validator.py` | 18 | 1 | 94%| +| `codecipher/vernam/default_validation_engine.py` | 23 | 4 | 83%| +| `codecipher/vernam/encoder.py` | 39 | 2 | 95%| +| `codecipher/vernam/idecoder.py` | 18 | 2 | 89%| +| `codecipher/vernam/iencoder.py` | 18 | 2 | 89%| +| `codecipher/vernam/ivernam.py` | 25 | 4 | 84%| +| `codecipher/vernam/lookup_table.py` | 11 | 0 | 100%| +| `codecipher/vernam/vernam.py` | 35 | 0 | 100%| +| `codecipher/vigenere/__init__.py` | 20 | 0 | 100%| +| `codecipher/vigenere/decoder.py` | 38 | 3 | 92%| +| `codecipher/vigenere/default_character_validator.py` | 18 | 1 | 94%| +| `codecipher/vigenere/default_data_validator.py` | 18 | 1 | 94%| +| `codecipher/vigenere/default_validation_engine.py` | 23 | 4 | 83%| +| `codecipher/vigenere/encoder.py` | 38 | 3 | 92%| +| `codecipher/vigenere/idecoder.py` | 18 | 2 | 89%| +| `codecipher/vigenere/iencoder.py` | 18 | 2 | 89%| +| `codecipher/vigenere/ikey_generator.py` | 22 | 3 | 86%| +| `codecipher/vigenere/ivigenere.py` | 25 | 4 | 84%| +| `codecipher/vigenere/key_generator.py` | 41 | 5 | 88%| | `codecipher/vigenere/lookup_table.py` | 16 | 0 | 100%| -| **Total** | 558 | 26 | 95% | +| `codecipher/vigenere/vigenere.py` | 46 | 0 | 100%| +| **Total** | 1656 | 199 | 88% | ### Docs diff --git a/codecipher/__init__.py b/codecipher/__init__.py index 2e07062..c050a7f 100644 --- a/codecipher/__init__.py +++ b/codecipher/__init__.py @@ -15,6 +15,8 @@ See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . + + Initialization for codecipher package. ''' from typing import List diff --git a/codecipher/a1z52n62/__init__.py b/codecipher/a1z52n62/__init__.py index 15ca667..9ddb589 100644 --- a/codecipher/a1z52n62/__init__.py +++ b/codecipher/a1z52n62/__init__.py @@ -27,12 +27,9 @@ from .encoder import A1z52N62Encoder from .decoder import A1z52N62Decoder from .a1z52n62_config import A1z52N62Config -from .ivalidation_engine import IValidationEngine -from .validation_engine import ValidationEngine -from .idata_validator import IDataValidator -from .data_validator import DataValidator -from .icharacter_validator import ICharacterValidator -from .character_validator import CharacterValidator +from .default_validation_engine import DefaultA1Z52N62ValidationEngine +from .default_data_validator import DefaultA1Z52N62DataValidator +from .default_character_validator import DefaultA1Z52N62CharacterValidator __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -51,10 +48,7 @@ 'A1z52N62Decoder', 'A1z52N62', 'A1z52N62Config', - 'IValidationEngine', - 'ValidationEngine', - 'IDataValidator', - 'DataValidator', - 'ICharacterValidator', - 'CharacterValidator' + 'DefaultA1Z52N62ValidationEngine', + 'DefaultA1Z52N62DataValidator', + 'DefaultA1Z52N62CharacterValidator' ] diff --git a/codecipher/a1z52n62/a1z52n62.py b/codecipher/a1z52n62/a1z52n62.py index b394bc9..c61ad36 100644 --- a/codecipher/a1z52n62/a1z52n62.py +++ b/codecipher/a1z52n62/a1z52n62.py @@ -21,17 +21,14 @@ ''' from typing import List, Optional +from codecipher.abstracts import IValidationEngine from .ia1z52n62 import IA1z52N62 from .iencoder import IA1z52N62Encoder from .encoder import A1z52N62Encoder from .idecoder import IA1z52N62Decoder from .decoder import A1z52N62Decoder from .a1z52n62_config import A1z52N62Config -from .ivalidation_engine import IValidationEngine -from .validation_engine import ValidationEngine -from .data_validator import DataValidator -from .character_validator import CharacterValidator - +from .default_validation_engine import DefaultA1Z52N62ValidationEngine __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -84,10 +81,7 @@ def __init__( :exceptions: None ''' self.__config = config or A1z52N62Config() - - self.__validation_engine: IValidationEngine = validation_engine or ValidationEngine( - [DataValidator(CharacterValidator())] - ) + self.__validation_engine: IValidationEngine = validation_engine or DefaultA1Z52N62ValidationEngine() self.__encoder: IA1z52N62Encoder = encoder or A1z52N62Encoder(_config=self.__config) self.__decoder: IA1z52N62Decoder = decoder or A1z52N62Decoder(_config=self.__config) diff --git a/codecipher/a1z52n62/character_validator.py b/codecipher/a1z52n62/default_character_validator.py similarity index 77% rename from codecipher/a1z52n62/character_validator.py rename to codecipher/a1z52n62/default_character_validator.py index c79644a..707c6bb 100644 --- a/codecipher/a1z52n62/character_validator.py +++ b/codecipher/a1z52n62/default_character_validator.py @@ -2,7 +2,7 @@ ''' Module - character_validator.py + default_character_validator.py Copyright Copyright (C) 2021 - 2026 Vladimir Roncevic codecipher is free software: you can redistribute it and/or modify it @@ -16,12 +16,12 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines class CharacterValidator for strict A1z52N62 character validation. + Defines class DefaultA1Z52N62CharacterValidator for strict A1z52N62 character validation. ''' from typing import List, Optional, Set from string import ascii_lowercase, ascii_uppercase, digits -from .icharacter_validator import ICharacterValidator +from codecipher.abstracts import ICharacterValidator __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -33,23 +33,23 @@ __status__: str = 'Updated' -class CharacterValidator(ICharacterValidator): +class DefaultA1Z52N62CharacterValidator(ICharacterValidator): ''' - Defines class CharacterValidator with attribute(s) and method(s). - Creates character validator class with backend API. + Defines class DefaultA1Z52N62CharacterValidator with attribute(s) and method(s). + Creates character validator for A1z52N62. It defines: :attributes: | __allowed_chars - Strict ASCII alphanumeric character set. :methods: - | __init__ - Initializes CharacterValidator constructor. + | __init__ - Initializes DefaultA1Z52N62CharacterValidator constructor. | is_valid_char - Validates if a single character belongs to A1z52N62. ''' def __init__(self) -> None: ''' - Initializes CharacterValidator constructor. + Initializes DefaultA1Z52N62CharacterValidator constructor. :exceptions: None ''' @@ -57,7 +57,7 @@ def __init__(self) -> None: def is_valid_char(self, char: Optional[str]) -> bool: ''' - Validating if a character belongs strictly to ASCII alphanumeric set. + Validates if a single character belongs to A1z52N62. :param char: Single character to validate | None :type char: diff --git a/codecipher/a1z52n62/data_validator.py b/codecipher/a1z52n62/default_data_validator.py similarity index 75% rename from codecipher/a1z52n62/data_validator.py rename to codecipher/a1z52n62/default_data_validator.py index 3a5dab0..7393014 100644 --- a/codecipher/a1z52n62/data_validator.py +++ b/codecipher/a1z52n62/default_data_validator.py @@ -2,7 +2,7 @@ ''' Module - idata_validator.py + default_data_validator.py Copyright Copyright (C) 2021 - 2026 Vladimir Roncevic codecipher is free software: you can redistribute it and/or modify it @@ -16,13 +16,12 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines interface IDataValidator for DataValidator class. + Defines class DefaultA1Z52N62DataValidator for strict A1z52N62 data validation. ''' from typing import List, Optional -from .idata_validator import IDataValidator -from .icharacter_validator import ICharacterValidator -from .character_validator import CharacterValidator +from codecipher.abstracts import IDataValidator, ICharacterValidator +from .default_character_validator import DefaultA1Z52N62CharacterValidator __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -34,29 +33,29 @@ __status__: str = 'Updated' -class DataValidator(IDataValidator): +class DefaultA1Z52N62DataValidator(IDataValidator): ''' - Defines class DataValidator with attribute(s) and method(s). - Creates data validator class with backend API. + Defines class DefaultA1Z52N62DataValidator with attribute(s) and method(s). + Creates data validator for A1z52N62. It defines: :attributes: | __char_validator - Validator for individual characters. :methods: - | __init__ - Initializes DataValidator constructor. + | __init__ - Initializes DefaultA1Z52N62DataValidator constructor. | is_valid - Validates if data is in A1z52N62 format. ''' def __init__(self, char_validator: Optional[ICharacterValidator] = None) -> None: ''' - Initializes DataValidator constructor. + Initializes DefaultA1Z52N62DataValidator constructor. :param char_validator: Character validator instance | None :type char_validator: :exceptions: None ''' - self.__char_validator: ICharacterValidator = char_validator or CharacterValidator() + self.__char_validator: ICharacterValidator = char_validator or DefaultA1Z52N62CharacterValidator() def is_valid(self, data: Optional[str]) -> bool: ''' @@ -71,7 +70,4 @@ def is_valid(self, data: Optional[str]) -> bool: if not bool(data): return False - for element in data: - if not self.__char_validator.is_valid_char(element): - return False - return True + return all(self.__char_validator.is_valid_char(element) for element in data) diff --git a/codecipher/a1z52n62/default_validation_engine.py b/codecipher/a1z52n62/default_validation_engine.py new file mode 100644 index 0000000..0a07dd1 --- /dev/null +++ b/codecipher/a1z52n62/default_validation_engine.py @@ -0,0 +1,89 @@ +# -*- coding: UTF-8 -*- + +''' +Module + default_validation_engine.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines class DefaultA1Z52N62ValidationEngine for managing multiple data validators. +''' + +from typing import List, Optional +from codecipher.abstracts import IValidationEngine, IDataValidator +from .default_data_validator import DefaultA1Z52N62DataValidator + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class DefaultA1Z52N62ValidationEngine(IValidationEngine): + ''' + Defines class DefaultA1Z52N62ValidationEngine with attribute(s) and method(s). + Creates validation engine class for A1z52N62. + + It defines: + + :attributes: + | __validators - List of registered data validators. + :methods: + | __init__ - Initializes DefaultA1Z52N62ValidationEngine constructor. + | add_validator - Adds a new data validator to the engine. + | is_valid - Validates data using all registered validators. + ''' + + def __init__(self, validators: Optional[List[IDataValidator]] = None) -> None: + ''' + Initializes DefaultA1Z52N62ValidationEngine constructor. + + :param validators: Initial list of validators | None + :type validators: + :exceptions: None + ''' + self.__validators: List[IDataValidator] = validators or [DefaultA1Z52N62DataValidator()] + + def add_validator(self, validator: IDataValidator) -> None: + ''' + Adding a new data validator to the engine. + + :param validator: Data validator instance to add. + :type validator: + :return: None + :exceptions: None + ''' + if validator and validator not in self.__validators: + self.__validators.append(validator) + + def is_valid(self, data: Optional[str]) -> bool: + ''' + Validating data using all registered validators. + + :param data: Data which should be validated | None + :type data: + :return: True (if all valid) | False (if any invalid) + :rtype: + :exceptions: None + ''' + if not bool(data): + return False + + if not self.__validators: + return False + + return all(validator.is_valid(data) for validator in self.__validators) diff --git a/codecipher/b64/icharacter_validator.py b/codecipher/abstracts/__init__.py similarity index 55% rename from codecipher/b64/icharacter_validator.py rename to codecipher/abstracts/__init__.py index bbbde19..d3580d2 100644 --- a/codecipher/b64/icharacter_validator.py +++ b/codecipher/abstracts/__init__.py @@ -1,8 +1,9 @@ + # -*- coding: UTF-8 -*- ''' Module - icharacter_validator.py + __init__.py Copyright Copyright (C) 2021 - 2026 Vladimir Roncevic codecipher is free software: you can redistribute it and/or modify it @@ -16,11 +17,13 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines interface ICharacterValidator for CharacterValidator class. + Initialization for abstracts package. ''' -from abc import ABC, abstractmethod -from typing import Optional, List +from typing import List +from .icharacter_validator import ICharacterValidator +from .idata_validator import IDataValidator +from .ivalidation_engine import IValidationEngine __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -31,27 +34,8 @@ __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' - -class ICharacterValidator(ABC): - ''' - Defines interface ICharacterValidator with methods. - - It defines: - - :attributes: None - :methods: - | is_valid_char - Validates if a character is a valid constituent. - ''' - - @abstractmethod - def is_valid_char(self, char: Optional[str]) -> bool: - ''' - Validating if a character is a valid B64 alphabet constituent. - - :param char: Single character to validate | None - :type char: - :return: True (if valid) | False (if invalid) - :rtype: - :exceptions: NotImplementedError - ''' - raise NotImplementedError("Subclasses must implement is_valid_char method") +__all__: List[str] = [ + 'ICharacterValidator', + 'IDataValidator', + 'IValidationEngine' +] diff --git a/codecipher/atbs/icharacter_validator.py b/codecipher/abstracts/icharacter_validator.py similarity index 90% rename from codecipher/atbs/icharacter_validator.py rename to codecipher/abstracts/icharacter_validator.py index 1fff0ed..ec8fefc 100644 --- a/codecipher/atbs/icharacter_validator.py +++ b/codecipher/abstracts/icharacter_validator.py @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines interface ICharacterValidator for CharacterValidator class. + Defines interface ICharacterValidator for character validators. ''' from abc import ABC, abstractmethod @@ -34,7 +34,7 @@ class ICharacterValidator(ABC): ''' - Defines interface ICharacterValidator with methods. + Defines interface ICharacterValidator with abstract method. It defines: @@ -48,7 +48,7 @@ def is_valid_char(self, char: Optional[str]) -> bool: ''' Validating if a character is a valid ATBS alphabet constituent. - :param char: Single character to validate | None + :param char: Single character to be validated | None :type char: :return: True (if valid) | False (if invalid) :rtype: diff --git a/codecipher/a1z52n62/idata_validator.py b/codecipher/abstracts/idata_validator.py similarity index 94% rename from codecipher/a1z52n62/idata_validator.py rename to codecipher/abstracts/idata_validator.py index 92c5f6b..4f0022c 100644 --- a/codecipher/a1z52n62/idata_validator.py +++ b/codecipher/abstracts/idata_validator.py @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines interface IDataValidator for DataValidator class. + Defines interface IDataValidator for data validators. ''' from abc import ABC, abstractmethod @@ -34,7 +34,7 @@ class IDataValidator(ABC): ''' - Defines interface IDataValidator with methods. + Defines interface IDataValidator with abstract method. It defines: diff --git a/codecipher/a1z52n62/ivalidation_engine.py b/codecipher/abstracts/ivalidation_engine.py similarity index 90% rename from codecipher/a1z52n62/ivalidation_engine.py rename to codecipher/abstracts/ivalidation_engine.py index 8672cc6..e6a2427 100644 --- a/codecipher/a1z52n62/ivalidation_engine.py +++ b/codecipher/abstracts/ivalidation_engine.py @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines interface IValidationEngine for ValidationEngine class. + Defines interface IValidationEngine for validation engines. ''' from abc import ABC, abstractmethod @@ -35,7 +35,7 @@ class IValidationEngine(ABC): ''' - Defines interface IValidationEngine with methods. + Defines interface IValidationEngine with abstract method(s). It defines: @@ -48,9 +48,9 @@ class IValidationEngine(ABC): @abstractmethod def add_validator(self, validator: IDataValidator) -> None: ''' - Adding a new validator to the engine. + Adding a new data validator to the engine. - :param validator: Validator instance to add. + :param validator: Data validator instance to add. :type validator: :return: None :exceptions: NotImplementedError diff --git a/codecipher/atbs/__init__.py b/codecipher/atbs/__init__.py index 1ce4dfe..71709c4 100644 --- a/codecipher/atbs/__init__.py +++ b/codecipher/atbs/__init__.py @@ -26,12 +26,9 @@ from .encoder import ATBSEncoder from .decoder import ATBSDecoder from .atbs import ATBS -from .ivalidation_engine import IValidationEngine -from .validation_engine import ValidationEngine -from .idata_validator import IDataValidator -from .data_validator import DataValidator -from .icharacter_validator import ICharacterValidator -from .character_validator import CharacterValidator +from .default_validation_engine import DefaultATBSValidationEngine +from .default_data_validator import DefaultATBSDataValidator +from .default_character_validator import DefaultATBSCharacterValidator __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -49,10 +46,7 @@ 'ATBSEncoder', 'ATBSDecoder', 'ATBS', - 'IValidationEngine', - 'ValidationEngine', - 'IDataValidator', - 'DataValidator', - 'ICharacterValidator', - 'CharacterValidator' + 'DefaultATBSValidationEngine', + 'DefaultATBSDataValidator', + 'DefaultATBSCharacterValidator' ] diff --git a/codecipher/atbs/atbs.py b/codecipher/atbs/atbs.py index 56c2eaa..f74a958 100644 --- a/codecipher/atbs/atbs.py +++ b/codecipher/atbs/atbs.py @@ -21,15 +21,13 @@ ''' from typing import Optional, List +from codecipher.abstracts import IValidationEngine from .iatbs import IATBS from .iencoder import IATBSEncoder from .encoder import ATBSEncoder from .idecoder import IATBSDecoder from .decoder import ATBSDecoder -from .ivalidation_engine import IValidationEngine -from .validation_engine import ValidationEngine -from .data_validator import DataValidator -from .character_validator import CharacterValidator +from .default_validation_engine import DefaultATBSValidationEngine __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -80,9 +78,7 @@ def __init__( :type decoder: :exceptions: None ''' - self.__validation_engine: IValidationEngine = validation_engine or ValidationEngine( - [DataValidator(CharacterValidator())] - ) + self.__validation_engine: IValidationEngine = validation_engine or DefaultATBSValidationEngine() self.__encoder: IATBSEncoder = encoder or ATBSEncoder() self.__decoder: IATBSDecoder = decoder or ATBSDecoder() diff --git a/codecipher/atbs/character_validator.py b/codecipher/atbs/default_character_validator.py similarity index 69% rename from codecipher/atbs/character_validator.py rename to codecipher/atbs/default_character_validator.py index 903e2b6..f1414eb 100644 --- a/codecipher/atbs/character_validator.py +++ b/codecipher/atbs/default_character_validator.py @@ -2,7 +2,7 @@ ''' Module - character_validator.py + default_character_validator.py Copyright Copyright (C) 2021 - 2026 Vladimir Roncevic codecipher is free software: you can redistribute it and/or modify it @@ -16,36 +16,37 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines class CharacterValidator for ATBS. + Defines class DefaultATBSCharacterValidator for strict ATBS character validation. ''' from typing import Optional, Set -from codecipher.atbs.lookup_table import LOOKUP_TABLE -from .icharacter_validator import ICharacterValidator +from codecipher.abstracts import ICharacterValidator +from .lookup_table import LOOKUP_TABLE -class CharacterValidator(ICharacterValidator): + +class DefaultATBSCharacterValidator(ICharacterValidator): ''' - Defines class CharacterValidator with attribute(s) and method(s). + Defines class DefaultATBSCharacterValidator with attribute(s) and method(s). Creates character validator class for ATBS. It defines: :attributes: - | __allowed_chars - Characters supported by ATBS lookup table. + | __allowed_chars - Strict ASCII alphanumeric character set (ATBS lookup table). :methods: - | __init__ - Initializes CharacterValidator constructor. + | __init__ - Initializes DefaultATBSCharacterValidator constructor. | is_valid_char - Validates if a single character belongs to ATBS. ''' def __init__(self) -> None: ''' - Initializes CharacterValidator constructor. + Initializes DefaultATBSCharacterValidator constructor. ''' self.__allowed_chars: Set[str] = set(LOOKUP_TABLE.keys()) def is_valid_char(self, char: Optional[str]) -> bool: ''' - Validating if a character belongs strictly to ATBS set. + Validates if a single character belongs to ATBS. :param char: Single character to validate | None :type char: diff --git a/codecipher/atbs/data_validator.py b/codecipher/atbs/default_data_validator.py similarity index 75% rename from codecipher/atbs/data_validator.py rename to codecipher/atbs/default_data_validator.py index c49924f..1e84f00 100644 --- a/codecipher/atbs/data_validator.py +++ b/codecipher/atbs/default_data_validator.py @@ -2,7 +2,7 @@ ''' Module - data_validator.py + default_data_validator.py Copyright Copyright (C) 2021 - 2026 Vladimir Roncevic codecipher is free software: you can redistribute it and/or modify it @@ -16,13 +16,13 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines class DataValidator for ATBS. + Defines class DefaultATBSDataValidator for strict ATBS data validation. ''' from typing import List, Optional -from .idata_validator import IDataValidator -from .icharacter_validator import ICharacterValidator -from .character_validator import CharacterValidator +from codecipher.abstracts import IDataValidator +from codecipher.abstracts import ICharacterValidator +from .default_character_validator import DefaultATBSCharacterValidator __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -34,29 +34,29 @@ __status__: str = 'Updated' -class DataValidator(IDataValidator): +class DefaultATBSDataValidator(IDataValidator): ''' - Defines class DataValidator with attribute(s) and method(s). - Creates data validator class for ATBS. + Defines class DefaultATBSDataValidator with attribute(s) and method(s). + Creates data validator for ATBS. It defines: :attributes: | __char_validator - Validator for individual characters. :methods: - | __init__ - Initializes DataValidator constructor. + | __init__ - Initializes DefaultATBSDataValidator constructor. | is_valid - Validates if data is in ATBS format. ''' def __init__(self, char_validator: Optional[ICharacterValidator] = None) -> None: ''' - Initializes DataValidator constructor. + Initializes DefaultATBSDataValidator constructor. :param char_validator: Character validator instance | None :type char_validator: :exceptions: None ''' - self.__char_validator: ICharacterValidator = char_validator or CharacterValidator() + self.__char_validator: ICharacterValidator = char_validator or DefaultATBSCharacterValidator() def is_valid(self, data: Optional[str]) -> bool: ''' @@ -71,7 +71,4 @@ def is_valid(self, data: Optional[str]) -> bool: if not bool(data): return False - for element in data: - if not self.__char_validator.is_valid_char(element): - return False - return True + return all(self.__char_validator.is_valid_char(element) for element in data) diff --git a/codecipher/atbs/default_validation_engine.py b/codecipher/atbs/default_validation_engine.py new file mode 100644 index 0000000..ef7d953 --- /dev/null +++ b/codecipher/atbs/default_validation_engine.py @@ -0,0 +1,89 @@ +# -*- coding: UTF-8 -*- + +''' +Module + validation_engine.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines class DefaultATBSValidationEngine for managing multiple data validators. +''' + +from typing import List, Optional +from codecipher.abstracts import IValidationEngine, IDataValidator +from .default_data_validator import DefaultATBSDataValidator + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class DefaultATBSValidationEngine(IValidationEngine): + ''' + Defines class DefaultATBSValidationEngine with attribute(s) and method(s). + Creates validation engine class for ATBS. + + It defines: + + :attributes: + | __validators - List of registered data validators. + :methods: + | __init__ - Initializes DefaultATBSValidationEngine constructor. + | add_validator - Adds a new data validator to the engine. + | is_valid - Validates data using all registered validators. + ''' + + def __init__(self, validators: Optional[List[IDataValidator]] = None) -> None: + ''' + Initializes DefaultATBSValidationEngine constructor. + + :param validators: Initial list of validators | None + :type validators: + :exceptions: None + ''' + self.__validators: List[IDataValidator] = validators or [DefaultATBSDataValidator()] + + def add_validator(self, validator: IDataValidator) -> None: + ''' + Adding a new data validator to the engine. + + :param validator: Validator instance to add. + :type validator: + :return: None + :exceptions: None + ''' + if validator and validator not in self.__validators: + self.__validators.append(validator) + + def is_valid(self, data: Optional[str]) -> bool: + ''' + Validating data using all registered validators. + + :param data: Data which should be validated | None + :type data: + :return: True (if all valid) | False (if any invalid) + :rtype: + :exceptions: None + ''' + if not bool(data): + return False + + if not self.__validators: + return False + + return all(validator.is_valid(data) for validator in self.__validators) diff --git a/codecipher/b64/__init__.py b/codecipher/b64/__init__.py index 7bf0684..34374a7 100644 --- a/codecipher/b64/__init__.py +++ b/codecipher/b64/__init__.py @@ -25,14 +25,11 @@ from .ib64 import IB64 from .b64encoder import B64Encoder from .b64decoder import B64Decoder -from .ib64encoder import IB64Encoder -from .ib64decoder import IB64Decoder -from .validation_engine import ValidationEngine -from .ivalidation_engine import IValidationEngine -from .data_validator import DataValidator -from .idata_validator import IDataValidator -from .character_validator import CharacterValidator -from .icharacter_validator import ICharacterValidator +from .iencoder import IEncoder +from .idecoder import IDecoder +from .default_validation_engine import DefaultB64ValidationEngine +from .default_data_validator import DefaultB64DataValidator +from .default_character_validator import DefaultB64CharacterValidator __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -45,15 +42,12 @@ __all__: List[str] = [ 'IB64', - 'IB64Encoder', - 'IB64Decoder', + 'IEncoder', + 'IDecoder', 'B64Encoder', 'B64Decoder', 'B64', - 'IValidationEngine', - 'ValidationEngine', - 'IDataValidator', - 'DataValidator', - 'ICharacterValidator', - 'CharacterValidator' + 'DefaultB64ValidationEngine', + 'DefaultB64DataValidator', + 'DefaultB64CharacterValidator' ] diff --git a/codecipher/b64/b64.py b/codecipher/b64/b64.py index 5a85d8d..f012a88 100644 --- a/codecipher/b64/b64.py +++ b/codecipher/b64/b64.py @@ -21,14 +21,13 @@ ''' from typing import List, Optional +from codecipher.abstracts import IValidationEngine from .ib64 import IB64 -from .ib64encoder import IB64Encoder -from .ib64decoder import IB64Decoder +from .iencoder import IEncoder +from .idecoder import IDecoder from .b64encoder import B64Encoder from .b64decoder import B64Decoder -from .ivalidation_engine import IValidationEngine -from .validation_engine import ValidationEngine -from .data_validator import DataValidator +from .default_validation_engine import DefaultB64ValidationEngine __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -62,8 +61,8 @@ class B64(IB64): def __init__( self, validation_engine: Optional[IValidationEngine] = None, - encoder: Optional[IB64Encoder] = None, - decoder: Optional[IB64Decoder] = None, + encoder: Optional[IEncoder] = None, + decoder: Optional[IDecoder] = None, ) -> None: ''' Initializes B64 constructor. @@ -71,16 +70,14 @@ def __init__( :param validation_engine: Engine for data validation | None :type validation_engine: :param encoder: Encoder for algorithm | None - :type encoder: + :type encoder: :param decoder: Decoder for algorithm | None - :type decoder: + :type decoder: :exceptions: None ''' - self.__validation_engine: IValidationEngine = validation_engine or ValidationEngine( - [DataValidator()] - ) - self.__encoder: IB64Encoder = encoder or B64Encoder() - self.__decoder: IB64Decoder = decoder or B64Decoder() + self.__validation_engine: IValidationEngine = validation_engine or DefaultB64ValidationEngine() + self.__encoder: IEncoder = encoder or B64Encoder() + self.__decoder: IDecoder = decoder or B64Decoder() def encode(self, data: Optional[str]) -> bool: ''' diff --git a/codecipher/b64/b64decoder.py b/codecipher/b64/b64decoder.py index 75167a0..d02c120 100644 --- a/codecipher/b64/b64decoder.py +++ b/codecipher/b64/b64decoder.py @@ -22,7 +22,7 @@ from base64 import b64decode from typing import List, Optional -from .ib64decoder import IB64Decoder +from .idecoder import IDecoder __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -34,7 +34,7 @@ __status__: str = 'Updated' -class B64Decoder(IB64Decoder): +class B64Decoder(IDecoder): ''' Defines class B64Decoder with attribute(s) and method(s). Creates decode class with backend API. diff --git a/codecipher/b64/b64encoder.py b/codecipher/b64/b64encoder.py index a68936c..bab8059 100644 --- a/codecipher/b64/b64encoder.py +++ b/codecipher/b64/b64encoder.py @@ -22,7 +22,7 @@ from base64 import b64encode from typing import List, Optional -from .ib64encoder import IB64Encoder +from .iencoder import IEncoder __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -34,7 +34,7 @@ __status__: str = 'Updated' -class B64Encoder(IB64Encoder): +class B64Encoder(IEncoder): ''' Defines class B64Encoder with attribute(s) and method(s). Creates encode class with backend API. diff --git a/codecipher/b64/character_validator.py b/codecipher/b64/default_character_validator.py similarity index 79% rename from codecipher/b64/character_validator.py rename to codecipher/b64/default_character_validator.py index 4d92ea4..2cf3b11 100644 --- a/codecipher/b64/character_validator.py +++ b/codecipher/b64/default_character_validator.py @@ -2,7 +2,7 @@ ''' Module - character_validator.py + default_character_validator.py Copyright Copyright (C) 2021 - 2026 Vladimir Roncevic codecipher is free software: you can redistribute it and/or modify it @@ -16,12 +16,12 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines class CharacterValidator for B64. + Defines class DefaultB64CharacterValidator for strict B64 character validation. ''' from typing import Optional, Set, List from string import ascii_uppercase, ascii_lowercase, digits -from .icharacter_validator import ICharacterValidator +from codecipher.abstracts import ICharacterValidator __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -33,23 +33,23 @@ __status__: str = 'Updated' -class CharacterValidator(ICharacterValidator): +class DefaultB64CharacterValidator(ICharacterValidator): ''' - Defines class CharacterValidator with attribute(s) and method(s). + Defines class DefaultB64CharacterValidator with attribute(s) and method(s). Creates character validator class for B64. It defines: :attributes: - | __allowed_chars - Characters supported by B64 alphabet. + | __allowed_chars - Strict ASCII alphanumeric character B64 set. :methods: - | __init__ - Initializes CharacterValidator constructor. + | __init__ - Initializes DefaultB64CharacterValidator constructor. | is_valid_char - Validates if a single character belongs to B64. ''' def __init__(self) -> None: ''' - Initializes CharacterValidator constructor. + Initializes DefaultB64CharacterValidator constructor. ''' self.__allowed_chars: Set[str] = set(ascii_uppercase + ascii_lowercase + digits + '+/=' ) diff --git a/codecipher/b64/data_validator.py b/codecipher/b64/default_data_validator.py similarity index 76% rename from codecipher/b64/data_validator.py rename to codecipher/b64/default_data_validator.py index 784f9de..df0b319 100644 --- a/codecipher/b64/data_validator.py +++ b/codecipher/b64/default_data_validator.py @@ -2,7 +2,7 @@ ''' Module - data_validator.py + default_data_validator.py Copyright Copyright (C) 2021 - 2026 Vladimir Roncevic codecipher is free software: you can redistribute it and/or modify it @@ -16,13 +16,12 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines class DataValidator for B64. + Defines class DefaultB64DataValidator for strict B64 data validation. ''' from typing import List, Optional -from .idata_validator import IDataValidator -from .icharacter_validator import ICharacterValidator -from .character_validator import CharacterValidator +from codecipher.abstracts import IDataValidator, ICharacterValidator +from .default_character_validator import DefaultB64CharacterValidator __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -34,29 +33,29 @@ __status__: str = 'Updated' -class DataValidator(IDataValidator): +class DefaultB64DataValidator(IDataValidator): ''' - Defines class DataValidator with attribute(s) and method(s). - Creates data validator class for B64. + Defines class DefaultB64DataValidator with attribute(s) and method(s). + Creates data validator for B64. It defines: :attributes: | __char_validator - Validator for individual characters. :methods: - | __init__ - Initializes DataValidator constructor. + | __init__ - Initializes DefaultB64DataValidator constructor. | is_valid - Validates if data is in B64 format. ''' def __init__(self, char_validator: Optional[ICharacterValidator] = None) -> None: ''' - Initializes DataValidator constructor. + Initializes DefaultB64DataValidator constructor. :param char_validator: Character validator instance | None :type char_validator: :exceptions: None ''' - self.__char_validator: ICharacterValidator = char_validator or CharacterValidator() + self.__char_validator: ICharacterValidator = char_validator or DefaultB64CharacterValidator() def is_valid(self, data: Optional[str]) -> bool: ''' @@ -71,7 +70,4 @@ def is_valid(self, data: Optional[str]) -> bool: if not bool(data): return False - for element in data: - if not self.__char_validator.is_valid_char(element): - return False - return True + return all(self.__char_validator.is_valid_char(element) for element in data) diff --git a/codecipher/atbs/validation_engine.py b/codecipher/b64/default_validation_engine.py similarity index 73% rename from codecipher/atbs/validation_engine.py rename to codecipher/b64/default_validation_engine.py index c37fa6c..e8e7c24 100644 --- a/codecipher/atbs/validation_engine.py +++ b/codecipher/b64/default_validation_engine.py @@ -16,12 +16,12 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines class ValidationEngine for managing multiple validators. + Defines class DefaultB64ValidationEngine for managing multiple data validators. ''' from typing import List, Optional -from .ivalidation_engine import IValidationEngine -from .idata_validator import IDataValidator +from codecipher.abstracts import IValidationEngine, IDataValidator +from .default_data_validator import DefaultB64DataValidator __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -33,41 +33,41 @@ __status__: str = 'Updated' -class ValidationEngine(IValidationEngine): +class DefaultB64ValidationEngine(IValidationEngine): ''' - Defines class ValidationEngine with attribute(s) and method(s). - Creates validation engine class with backend API. + Defines class DefaultB64ValidationEngine with attribute(s) and method(s). + Creates validation engine class for B64. It defines: :attributes: | __validators - List of registered data validators. :methods: - | __init__ - Initializes ValidationEngine constructor. - | add_validator - Adds a new validator to the engine. + | __init__ - Initializes DefaultB64ValidationEngine constructor. + | add_validator - Adds a new data validator to the engine. | is_valid - Validates data using all registered validators. ''' def __init__(self, validators: Optional[List[IDataValidator]] = None) -> None: ''' - Initializes ValidationEngine constructor. + Initializes DefaultB64ValidationEngine constructor. :param validators: Initial list of validators | None :type validators: :exceptions: None ''' - self.__validators: List[IDataValidator] = validators or [] + self.__validators: List[IDataValidator] = validators or [DefaultB64DataValidator()] def add_validator(self, validator: IDataValidator) -> None: ''' - Adding a new validator to the engine. + Adding a new data validator to the engine. :param validator: Validator instance to add. :type validator: :return: None :exceptions: None ''' - if validator not in self.__validators: + if validator and validator not in self.__validators: self.__validators.append(validator) def is_valid(self, data: Optional[str]) -> bool: @@ -83,7 +83,7 @@ def is_valid(self, data: Optional[str]) -> bool: if not bool(data): return False - for validator in self.__validators: - if not validator.is_valid(data): - return False - return True + if not self.__validators: + return False + + return all(validator.is_valid(data) for validator in self.__validators) diff --git a/codecipher/b64/ib64decoder.py b/codecipher/b64/idecoder.py similarity index 93% rename from codecipher/b64/ib64decoder.py rename to codecipher/b64/idecoder.py index 1339d70..8149909 100644 --- a/codecipher/b64/ib64decoder.py +++ b/codecipher/b64/idecoder.py @@ -2,7 +2,7 @@ ''' Module - ib64decoder.py + idecoder.py Copyright Copyright (C) 2021 - 2026 Vladimir Roncevic codecipher is free software: you can redistribute it and/or modify it @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines interface IB64Decoder for B64Decoder class. + Defines interface IDecoder for B64Decoder class. ''' from abc import ABC, abstractmethod @@ -32,9 +32,9 @@ __status__: str = 'Updated' -class IB64Decoder(ABC): +class IDecoder(ABC): ''' - Defines interface IB64Decoder with methods. + Defines interface IDecoder with methods. It defines: diff --git a/codecipher/b64/ib64encoder.py b/codecipher/b64/iencoder.py similarity index 93% rename from codecipher/b64/ib64encoder.py rename to codecipher/b64/iencoder.py index efe0aa7..dfb93a8 100644 --- a/codecipher/b64/ib64encoder.py +++ b/codecipher/b64/iencoder.py @@ -2,7 +2,7 @@ ''' Module - ib64encoder.py + iencoder.py Copyright Copyright (C) 2021 - 2026 Vladimir Roncevic codecipher is free software: you can redistribute it and/or modify it @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines interface IB64Encoder for B64Encoder class. + Defines interface IEncoder for B64Encoder class. ''' from abc import ABC, abstractmethod @@ -32,9 +32,9 @@ __status__: str = 'Updated' -class IB64Encoder(ABC): +class IEncoder(ABC): ''' - Defines interface IB64Encoder with methods. + Defines interface IEncoder with methods. It defines: diff --git a/codecipher/b64/ivalidation_engine.py b/codecipher/b64/ivalidation_engine.py deleted file mode 100644 index 8672cc6..0000000 --- a/codecipher/b64/ivalidation_engine.py +++ /dev/null @@ -1,71 +0,0 @@ -# -*- coding: UTF-8 -*- - -''' -Module - ivalidation_engine.py -Copyright - Copyright (C) 2021 - 2026 Vladimir Roncevic - codecipher is free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - codecipher is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program. If not, see . -Info - Defines interface IValidationEngine for ValidationEngine class. -''' - -from abc import ABC, abstractmethod -from typing import List, Optional -from .idata_validator import IDataValidator - -__author__: str = 'Vladimir Roncevic' -__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' -__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] -__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' -__version__: str = '1.5.1' -__maintainer__: str = 'Vladimir Roncevic' -__email__: str = 'elektron.ronca@gmail.com' -__status__: str = 'Updated' - - -class IValidationEngine(ABC): - ''' - Defines interface IValidationEngine with methods. - - It defines: - - :attributes: None - :methods: - | add_validator - Adds a new validator to the engine. - | is_valid - Validates data using all registered validators. - ''' - - @abstractmethod - def add_validator(self, validator: IDataValidator) -> None: - ''' - Adding a new validator to the engine. - - :param validator: Validator instance to add. - :type validator: - :return: None - :exceptions: NotImplementedError - ''' - raise NotImplementedError('Method add_validator must be implemented.') - - @abstractmethod - def is_valid(self, data: Optional[str]) -> bool: - ''' - Validating data using all registered validators. - - :param data: Data which should be validated | None - :type data: - :return: True (if all valid) | False (if any invalid) - :rtype: - :exceptions: NotImplementedError - ''' - raise NotImplementedError('Method is_valid must be implemented.') diff --git a/codecipher/caesar/__init__.py b/codecipher/caesar/__init__.py index 0652d68..627cb59 100644 --- a/codecipher/caesar/__init__.py +++ b/codecipher/caesar/__init__.py @@ -16,17 +16,19 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines class Caesar with attribute(s) and method(s). - Creates container class with aggregate backend API. + Initialization for caesar package. ''' from typing import List -from .caesar import Caesar from .icaesar import ICaesar -from .icaesar_encoder import ICaesarEncoder -from .icaesar_decoder import ICaesarDecoder +from .iencoder import IEncoder +from .idecoder import IDecoder from .encoder import CaesarEncoder from .decoder import CaesarDecoder +from .caesar import Caesar +from .default_validation_engine import DefaultCaesarValidationEngine +from .default_data_validator import DefaultCaesarDataValidator +from .default_character_validator import DefaultCaesarCharacterValidator __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -38,10 +40,13 @@ __status__: str = 'Updated' __all__: List[str] = [ - 'Caesar', 'ICaesar', - 'ICaesarEncoder', - 'ICaesarDecoder', + 'IEncoder', + 'IDecoder', 'CaesarEncoder', - 'CaesarDecoder' + 'CaesarDecoder', + 'Caesar', + 'DefaultCaesarValidationEngine', + 'DefaultCaesarDataValidator', + 'DefaultCaesarCharacterValidator' ] diff --git a/codecipher/caesar/caesar.py b/codecipher/caesar/caesar.py index fa67806..8aa9c66 100644 --- a/codecipher/caesar/caesar.py +++ b/codecipher/caesar/caesar.py @@ -20,12 +20,24 @@ Creates container class with aggregate backend API. ''' -from typing import Optional -from .icaesar_encoder import ICaesarEncoder +from typing import Optional, List +from codecipher.abstracts import IValidationEngine +from .iencoder import IEncoder from .icaesar import ICaesar -from .icaesar_decoder import ICaesarDecoder +from .idecoder import IDecoder from .encoder import CaesarEncoder from .decoder import CaesarDecoder +from .default_validation_engine import DefaultCaesarValidationEngine + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + class Caesar(ICaesar): ''' @@ -34,6 +46,7 @@ class Caesar(ICaesar): It defines: :attributes: + | __validation_engine - Engine for data validation. | __encoder - Encoder for Caesar algorithm. | __decoder - Decoder for Caesar algorithm. :methods: @@ -46,20 +59,24 @@ class Caesar(ICaesar): def __init__( self, - encoder: Optional[ICaesarEncoder] = None, - decoder: Optional[ICaesarDecoder] = None, + validation_engine: Optional[IValidationEngine] = None, + encoder: Optional[IEncoder] = None, + decoder: Optional[IDecoder] = None, ) -> None: ''' Initializes Caesar constructor. + :param validation_engine: Engine for data validation | None + :type validation_engine: :param encoder: Encoder for algorithm | None - :type encoder: + :type encoder: :param decoder: Decoder for algorithm | None - :type decoder: + :type decoder: :exceptions: None ''' - self.__encoder: ICaesarEncoder = encoder or CaesarEncoder() - self.__decoder: ICaesarDecoder = decoder or CaesarDecoder() + self.__validation_engine: IValidationEngine = validation_engine or DefaultCaesarValidationEngine() + self.__encoder: IEncoder = encoder or CaesarEncoder() + self.__decoder: IDecoder = decoder or CaesarDecoder() def encode(self, data: Optional[str], shift_counter: Optional[int]) -> bool: ''' @@ -73,7 +90,7 @@ def encode(self, data: Optional[str], shift_counter: Optional[int]) -> bool: :rtype: :exceptions: None ''' - if not bool(data) or shift_counter is None: + if shift_counter is None or not self.__validation_engine.is_valid(data): return False return self.__encoder.encode(data, shift_counter) @@ -100,7 +117,7 @@ def decode(self, data: Optional[str], shift_counter: Optional[int]) -> bool: :rtype: :exceptions: None ''' - if not bool(data) or shift_counter is None: + if shift_counter is None or not self.__validation_engine.is_valid(data): return False return self.__decoder.decode(data, shift_counter) diff --git a/codecipher/caesar/decoder.py b/codecipher/caesar/decoder.py index ec9fe9d..7e9c9d1 100644 --- a/codecipher/caesar/decoder.py +++ b/codecipher/caesar/decoder.py @@ -22,7 +22,7 @@ from dataclasses import dataclass, field from typing import List, Optional -from .icaesar_decoder import ICaesarDecoder +from .idecoder import IDecoder __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -35,7 +35,7 @@ @dataclass -class CaesarDecoder(ICaesarDecoder): +class CaesarDecoder(IDecoder): ''' Defines class CaesarDecoder with attribute(s) and method(s). Creates decode class with backend API. diff --git a/codecipher/a1z52n62/icharacter_validator.py b/codecipher/caesar/default_character_validator.py similarity index 57% rename from codecipher/a1z52n62/icharacter_validator.py rename to codecipher/caesar/default_character_validator.py index 6b1fa4b..ae67391 100644 --- a/codecipher/a1z52n62/icharacter_validator.py +++ b/codecipher/caesar/default_character_validator.py @@ -2,7 +2,7 @@ ''' Module - icharacter_validator.py + default_character_validator.py Copyright Copyright (C) 2021 - 2026 Vladimir Roncevic codecipher is free software: you can redistribute it and/or modify it @@ -16,11 +16,12 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines interface ICharacterValidator for CharacterValidator class. + Defines class DefaultCaesarCharacterValidator for strict CAESAR character validation. ''' -from abc import ABC, abstractmethod -from typing import Optional, List +from typing import List, Optional +from codecipher.abstracts import ICharacterValidator +from .lookup_table import LookUpTable __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -32,26 +33,36 @@ __status__: str = 'Updated' -class ICharacterValidator(ABC): +class DefaultCaesarCharacterValidator(ICharacterValidator): ''' - Defines interface ICharacterValidator with methods. + Defines class DefaultCaesarCharacterValidator with attribute(s) and method(s). + Creates character validator class for CAESAR. It defines: - :attributes: None + :attributes: + | __allowed_chars - Strict ASCII alphanumeric character CAESAR set. :methods: - | is_valid_char - Validates if a character is a valid constituent. + | __init__ - Initializes DefaultCaesarCharacterValidator constructor. + | is_valid_char - Validates if a single character belongs to CAESAR. ''' - @abstractmethod + def __init__(self) -> None: + ''' + Initializes DefaultCaesarCharacterValidator constructor. + ''' + self.__allowed_chars: str = LookUpTable.ALPHA + def is_valid_char(self, char: Optional[str]) -> bool: ''' - Validating if a character is a valid A1z52N62 alphabet constituent. + Validating if a character belongs strictly to CAESAR set. :param char: Single character to validate | None :type char: :return: True (if valid) | False (if invalid) :rtype: - :exceptions: NotImplementedError ''' - raise NotImplementedError("Subclasses must implement is_valid_char method") + if not bool(char) or len(char) != 1: + return False + + return char in self.__allowed_chars diff --git a/codecipher/caesar/default_data_validator.py b/codecipher/caesar/default_data_validator.py new file mode 100644 index 0000000..3ca3101 --- /dev/null +++ b/codecipher/caesar/default_data_validator.py @@ -0,0 +1,73 @@ +# -*- coding: UTF-8 -*- + +''' +Module + default_data_validator.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines class DefaultCaesarDataValidator for strict CAESAR data validation. +''' + +from typing import List, Optional +from codecipher.abstracts import IDataValidator, ICharacterValidator +from .default_character_validator import DefaultCaesarCharacterValidator + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class DefaultCaesarDataValidator(IDataValidator): + ''' + Defines class DefaultCaesarDataValidator with attribute(s) and method(s). + Creates data validator for CAESAR. + + It defines: + + :attributes: + | __char_validator - Validator for individual characters. + :methods: + | __init__ - Initializes DefaultCaesarDataValidator constructor. + | is_valid - Validates if data is in CAESAR format. + ''' + + def __init__(self, char_validator: Optional[ICharacterValidator] = None) -> None: + ''' + Initializes DefaultCaesarDataValidator constructor. + + :param char_validator: Character validator instance | None + :type char_validator: + :exceptions: None + ''' + self.__char_validator: ICharacterValidator = char_validator or DefaultCaesarCharacterValidator() + + def is_valid(self, data: Optional[str]) -> bool: + ''' + Validating if data is in CAESAR format. + + :param data: Data which should be validated | None + :type data: + :return: True (if valid) | False (if invalid) + :rtype: + :exceptions: None + ''' + if not bool(data): + return False + + return all(self.__char_validator.is_valid_char(element) for element in data) diff --git a/codecipher/caesar/default_validation_engine.py b/codecipher/caesar/default_validation_engine.py new file mode 100644 index 0000000..e13bc3a --- /dev/null +++ b/codecipher/caesar/default_validation_engine.py @@ -0,0 +1,89 @@ +# -*- coding: UTF-8 -*- + +''' +Module + default_validation_engine.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines class DefaultCaesarValidationEngine for managing multiple data validators. +''' + +from typing import List, Optional +from codecipher.abstracts import IValidationEngine, IDataValidator +from .default_data_validator import DefaultCaesarDataValidator + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class DefaultCaesarValidationEngine(IValidationEngine): + ''' + Defines class DefaultCaesarValidationEngine with attribute(s) and method(s). + Creates validation engine class for CAESAR. + + It defines: + + :attributes: + | __validators - List of registered data validators. + :methods: + | __init__ - Initializes DefaultCaesarValidationEngine constructor. + | add_validator - Adds a new data validator to the engine. + | is_valid - Validates data using all registered validators. + ''' + + def __init__(self, validators: Optional[List[IDataValidator]] = None) -> None: + ''' + Initializes DefaultCaesarValidationEngine. + + :param validators: Initial list of validators | None + :type validators: + :exceptions: None + ''' + self.__validators: List[IDataValidator] = validators or [DefaultCaesarDataValidator()] + + def add_validator(self, validator: IDataValidator) -> None: + ''' + Adding a new data validator to the engine. + + :param validator: Validator instance to add. + :type validator: + :return: None + :exceptions: None + ''' + if validator and validator not in self.__validators: + self.__validators.append(validator) + + def is_valid(self, data: Optional[str]) -> bool: + ''' + Validating data using all registered validators. + + :param data: Data which should be validated | None + :type data: + :return: True (if all valid) | False (if any invalid) + :rtype: + :exceptions: None + ''' + if not bool(data): + return False + + if not self.__validators: + return False + + return all(validator.is_valid(data) for validator in self.__validators) diff --git a/codecipher/caesar/encoder.py b/codecipher/caesar/encoder.py index 10a6525..7e17813 100644 --- a/codecipher/caesar/encoder.py +++ b/codecipher/caesar/encoder.py @@ -22,7 +22,7 @@ from dataclasses import dataclass, field from typing import List, Optional -from .icaesar_encoder import ICaesarEncoder +from .iencoder import IEncoder __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -35,7 +35,7 @@ @dataclass -class CaesarEncoder(ICaesarEncoder): +class CaesarEncoder(IEncoder): ''' Defines class CaesarEncoder with attribute(s) and method(s). Creates encode class with backend API. diff --git a/codecipher/caesar/icaesar_decoder.py b/codecipher/caesar/idecoder.py similarity index 91% rename from codecipher/caesar/icaesar_decoder.py rename to codecipher/caesar/idecoder.py index 55a2acd..3bdafa5 100644 --- a/codecipher/caesar/icaesar_decoder.py +++ b/codecipher/caesar/idecoder.py @@ -2,7 +2,7 @@ ''' Module - icaesar_decoder.py + idecoder.py Copyright Copyright (C) 2021 - 2026 Vladimir Roncevic codecipher is free software: you can redistribute it and/or modify it @@ -16,16 +16,16 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines interface ICaesarDecoder with attribute(s) and method(s). + Defines interface IDecoder with attribute(s) and method(s). Interface for Caesar Decoder. ''' from abc import ABC, abstractmethod from typing import Optional -class ICaesarDecoder(ABC): +class IDecoder(ABC): ''' - Defines interface ICaesarDecoder with attribute(s) and method(s). + Defines interface IDecoder with attribute(s) and method(s). Interface for Caesar Decoder. It defines: diff --git a/codecipher/caesar/icaesar_encoder.py b/codecipher/caesar/iencoder.py similarity index 91% rename from codecipher/caesar/icaesar_encoder.py rename to codecipher/caesar/iencoder.py index d4fafe5..2345352 100644 --- a/codecipher/caesar/icaesar_encoder.py +++ b/codecipher/caesar/iencoder.py @@ -2,7 +2,7 @@ ''' Module - icaesar_encoder.py + iencoder.py Copyright Copyright (C) 2021 - 2026 Vladimir Roncevic codecipher is free software: you can redistribute it and/or modify it @@ -16,16 +16,16 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines interface ICaesarEncoder with attribute(s) and method(s). + Defines interface IEncoder with attribute(s) and method(s). Interface for Caesar Encoder. ''' from abc import ABC, abstractmethod from typing import Optional -class ICaesarEncoder(ABC): +class IEncoder(ABC): ''' - Defines interface ICaesarEncoder with attribute(s) and method(s). + Defines interface IEncoder with attribute(s) and method(s). Interface for Caesar Encoder. It defines: diff --git a/codecipher/b64/idata_validator.py b/codecipher/caesar/lookup_table.py similarity index 60% rename from codecipher/b64/idata_validator.py rename to codecipher/caesar/lookup_table.py index 578c49d..7beec83 100644 --- a/codecipher/b64/idata_validator.py +++ b/codecipher/caesar/lookup_table.py @@ -2,7 +2,7 @@ ''' Module - idata_validator.py + lookup_table.py Copyright Copyright (C) 2021 - 2026 Vladimir Roncevic codecipher is free software: you can redistribute it and/or modify it @@ -16,11 +16,11 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines interface IDataValidator for DataValidator class. + Defines class LookUpTable with attribute(s). + Creates lookup table class with support for encoding/decoding. ''' -from abc import ABC, abstractmethod -from typing import List, Optional +from typing import List __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -32,26 +32,17 @@ __status__: str = 'Updated' -class IDataValidator(ABC): +class LookUpTable: ''' - Defines interface IDataValidator with methods. + Defines class LookUpTable with attribute(s) and method(s). + Creates lookup table class with support for encoding/decoding. It defines: - :attributes: None + :attributes: + | ALPHA - Define alphabet for encoding/decoding. :methods: - | is_valid - Validates data using specific validation logic. + | None ''' - @abstractmethod - def is_valid(self, data: Optional[str]) -> bool: - ''' - Validating data using specific validation logic. - - :param data: Data which should be validated | None - :type data: - :return: True (if valid) | False (if invalid) - :rtype: - :exceptions: NotImplementedError - ''' - raise NotImplementedError('Method is_valid must be implemented.') \ No newline at end of file + ALPHA: str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' diff --git a/codecipher/vernam/__init__.py b/codecipher/vernam/__init__.py index 7479058..7fe64a7 100644 --- a/codecipher/vernam/__init__.py +++ b/codecipher/vernam/__init__.py @@ -16,19 +16,19 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines class Vernam with attribute(s) and method(s). - Creates container class with aggregate backend API. + Initialization for vernam package. ''' -import sys from typing import List - -try: - from codecipher.vernam.encode import VernamEncode - from codecipher.vernam.decode import VernamDecode -except ImportError as ats_error_message: # pragma: no cover - # Force exit python ####################################################### - sys.exit(f'\n{__file__}\n{ats_error_message}\n') # pragma: no cover +from .ivernam import IVernam +from .iencoder import IEncoder +from .idecoder import IDecoder +from .encoder import VernamEncoder +from .decoder import VernamDecoder +from .vernam import Vernam +from .default_validation_engine import DefaultVernamValidationEngine +from .default_data_validator import DefaultVernamDataValidator +from .default_character_validator import DefaultVernamCharacterValidator __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -39,24 +39,14 @@ __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' - -class Vernam(VernamEncode, VernamDecode): - ''' - Defines class Vernam with attribute(s) and method(s). - Creates container class with aggregate backend API. - - It defines: - - :attributes: - | None. - :methods: - | __init__ - Initials Vernam constructor. - ''' - - def __init__(self) -> None: - ''' - Initials Vernam constructor. - - :exceptions: None - ''' - super().__init__() +__all__: List[str] = [ + 'IVernam', + 'IEncoder', + 'IDecoder', + 'VernamEncoder', + 'VernamDecoder', + 'Vernam', + 'DefaultVernamValidationEngine', + 'DefaultVernamDataValidator', + 'DefaultVernamCharacterValidator' +] diff --git a/codecipher/vernam/decode.py b/codecipher/vernam/decoder.py similarity index 91% rename from codecipher/vernam/decode.py rename to codecipher/vernam/decoder.py index fa55787..d10b4af 100644 --- a/codecipher/vernam/decode.py +++ b/codecipher/vernam/decoder.py @@ -2,7 +2,7 @@ ''' Module - decode.py + decoder.py Copyright Copyright (C) 2021 - 2026 Vladimir Roncevic codecipher is free software: you can redistribute it and/or modify it @@ -16,12 +16,13 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines class VernamDecode with attribute(s) and method(s). + Defines class VernamDecoder with attribute(s) and method(s). Creates decode class with backend API. ''' from dataclasses import dataclass, field from typing import List, Optional +from .idecoder import IDecoder __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -34,9 +35,9 @@ @dataclass -class VernamDecode: +class VernamDecoder(IDecoder): ''' - Defines class VernamDecode with attribute(s) and method(s). + Defines class VernamDecoder with attribute(s) and method(s). Creates decode class with backend API. It defines: @@ -74,7 +75,7 @@ def decode_data(self, decode_data: Optional[str]) -> None: if bool(decode_data): self._decode_data = decode_data - def decode(self, data: Optional[str], key: Optional[str]) -> None: + def decode(self, data: Optional[str], key: Optional[str]) -> bool: ''' Decoding data from Vernam format. @@ -82,7 +83,8 @@ def decode(self, data: Optional[str], key: Optional[str]) -> None: :type data: :param key: Key for decoding | None :type key: - :return: None + :return: True (if success) | False (if fail) + :rtype: :exceptions: None ''' if bool(data) and bool(key): @@ -102,3 +104,5 @@ def decode(self, data: Optional[str], key: Optional[str]) -> None: else: decode_list.append(element) self._decode_data = ''.join(decode_list) + return True + return False diff --git a/codecipher/vernam/default_character_validator.py b/codecipher/vernam/default_character_validator.py new file mode 100644 index 0000000..30a4ab8 --- /dev/null +++ b/codecipher/vernam/default_character_validator.py @@ -0,0 +1,68 @@ +# -*- coding: UTF-8 -*- + +''' +Module + default_character_validator.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines class DefaultVernamCharacterValidator for strict ATBS character validation. +''' + +from typing import List, Optional +from codecipher.abstracts import ICharacterValidator +from .lookup_table import LookUpTable + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class DefaultVernamCharacterValidator(ICharacterValidator): + ''' + Defines class DefaultVernamCharacterValidator with attribute(s) and method(s). + Creates character validator class for VERNAM. + + It defines: + + :attributes: + | __allowed_chars - Strict ASCII alphanumeric character set (VERNAM lookup table). + :methods: + | __init__ - Initializes DefaultVernamCharacterValidator constructor. + | is_valid_char - Validates if a single character belongs to VERNAM. + ''' + + def __init__(self) -> None: + ''' + Initializes DefaultVernamCharacterValidator constructor. + ''' + self.__allowed_chars: str = LookUpTable.ALPHA + + def is_valid_char(self, char: Optional[str]) -> bool: + ''' + Validates if a single character belongs to VERNAM. + + :param char: Single character to validate | None + :type char: + :return: True (if valid) | False (if invalid) + :rtype: + ''' + if not bool(char) or len(char) != 1: + return False + + return char in self.__allowed_chars diff --git a/codecipher/vernam/default_data_validator.py b/codecipher/vernam/default_data_validator.py new file mode 100644 index 0000000..9300e66 --- /dev/null +++ b/codecipher/vernam/default_data_validator.py @@ -0,0 +1,73 @@ +# -*- coding: UTF-8 -*- + +''' +Module + default_data_validator.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines class DefaultVernamDataValidator for strict VERNAM data validation. +''' + +from typing import List, Optional +from codecipher.abstracts import IDataValidator, ICharacterValidator +from .default_character_validator import DefaultVernamCharacterValidator + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class DefaultVernamDataValidator(IDataValidator): + ''' + Defines class DefaultVernamDataValidator with attribute(s) and method(s). + Creates data validator for VERNAM. + + It defines: + + :attributes: + | __char_validator - Validator for individual characters. + :methods: + | __init__ - Initializes DefaultVernamDataValidator constructor. + | is_valid - Validates if data is in VERNAM format. + ''' + + def __init__(self, char_validator: Optional[ICharacterValidator] = None) -> None: + ''' + Initializes DefaultVernamDataValidator constructor. + + :param char_validator: Character validator instance | None + :type char_validator: + :exceptions: None + ''' + self.__char_validator: ICharacterValidator = char_validator or DefaultVernamCharacterValidator() + + def is_valid(self, data: Optional[str]) -> bool: + ''' + Validating if data is in VERNAM format. + + :param data: Data which should be validated | None + :type data: + :return: True (if valid) | False (if invalid) + :rtype: + :exceptions: None + ''' + if not bool(data): + return False + + return all(self.__char_validator.is_valid_char(element) for element in data) diff --git a/codecipher/a1z52n62/validation_engine.py b/codecipher/vernam/default_validation_engine.py similarity index 75% rename from codecipher/a1z52n62/validation_engine.py rename to codecipher/vernam/default_validation_engine.py index c37fa6c..ed53aaf 100644 --- a/codecipher/a1z52n62/validation_engine.py +++ b/codecipher/vernam/default_validation_engine.py @@ -16,12 +16,12 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines class ValidationEngine for managing multiple validators. + Defines class DefaultVernamValidationEngine for managing multiple data validators. ''' from typing import List, Optional -from .ivalidation_engine import IValidationEngine -from .idata_validator import IDataValidator +from codecipher.abstracts import IValidationEngine, IDataValidator +from .default_data_validator import DefaultVernamDataValidator __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -33,34 +33,34 @@ __status__: str = 'Updated' -class ValidationEngine(IValidationEngine): +class DefaultVernamValidationEngine(IValidationEngine): ''' - Defines class ValidationEngine with attribute(s) and method(s). - Creates validation engine class with backend API. + Defines class DefaultVernamValidationEngine with attribute(s) and method(s). + Creates validation engine class for VERNAM. It defines: :attributes: | __validators - List of registered data validators. :methods: - | __init__ - Initializes ValidationEngine constructor. - | add_validator - Adds a new validator to the engine. + | __init__ - Initializes DefaultVernamValidationEngine constructor. + | add_validator - Adds a new data validator to the engine. | is_valid - Validates data using all registered validators. ''' def __init__(self, validators: Optional[List[IDataValidator]] = None) -> None: ''' - Initializes ValidationEngine constructor. + Initializes DefaultVernamValidationEngine. :param validators: Initial list of validators | None :type validators: :exceptions: None ''' - self.__validators: List[IDataValidator] = validators or [] + self.__validators: List[IDataValidator] = validators or [DefaultVernamDataValidator()] def add_validator(self, validator: IDataValidator) -> None: ''' - Adding a new validator to the engine. + Adding a new data validator to the engine. :param validator: Validator instance to add. :type validator: @@ -83,7 +83,7 @@ def is_valid(self, data: Optional[str]) -> bool: if not bool(data): return False - for validator in self.__validators: - if not validator.is_valid(data): - return False - return True + if not self.__validators: + return False + + return all(validator.is_valid(data) for validator in self.__validators) diff --git a/codecipher/vernam/encode.py b/codecipher/vernam/encoder.py similarity index 91% rename from codecipher/vernam/encode.py rename to codecipher/vernam/encoder.py index 6ba9746..95b14cf 100644 --- a/codecipher/vernam/encode.py +++ b/codecipher/vernam/encoder.py @@ -2,7 +2,7 @@ ''' Module - encode.py + encoder.py Copyright Copyright (C) 2021 - 2026 Vladimir Roncevic codecipher is free software: you can redistribute it and/or modify it @@ -16,12 +16,13 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines class VernamEncode with attribute(s) and method(s). + Defines class VernamEncoder with attribute(s) and method(s). Creates encode class with backend API. ''' from dataclasses import dataclass, field from typing import List, Optional +from .iencoder import IEncoder __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -34,9 +35,9 @@ @dataclass -class VernamEncode: +class VernamEncoder(IEncoder): ''' - Defines class VernamEncode with attribute(s) and method(s). + Defines class VernamEncoder with attribute(s) and method(s). Creates encode class with backend API. It defines: @@ -74,7 +75,7 @@ def encode_data(self, encode_data: Optional[str]) -> None: if bool(encode_data): self._encode_data = encode_data - def encode(self, data: Optional[str], key: Optional[str]) -> None: + def encode(self, data: Optional[str], key: Optional[str]) -> bool: ''' Encoding data to Vernam format. @@ -82,7 +83,8 @@ def encode(self, data: Optional[str], key: Optional[str]) -> None: :type data: :param key: Key for encoding | None :type key: - :return: None + :return: True (if success) | False (if fail) + :rtype: :exceptions: None ''' if bool(data) and bool(key): @@ -102,3 +104,5 @@ def encode(self, data: Optional[str], key: Optional[str]) -> None: else: encode_list.append(element) self._encode_data = ''.join(encode_list) + return True + return False diff --git a/codecipher/atbs/ivalidation_engine.py b/codecipher/vernam/idecoder.py similarity index 60% rename from codecipher/atbs/ivalidation_engine.py rename to codecipher/vernam/idecoder.py index 8672cc6..235a9f8 100644 --- a/codecipher/atbs/ivalidation_engine.py +++ b/codecipher/vernam/idecoder.py @@ -2,7 +2,7 @@ ''' Module - ivalidation_engine.py + ivernam_decoder.py Copyright Copyright (C) 2021 - 2026 Vladimir Roncevic codecipher is free software: you can redistribute it and/or modify it @@ -16,12 +16,11 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines interface IValidationEngine for ValidationEngine class. + Defines interface IDecoder for VernamDecoder class. ''' from abc import ABC, abstractmethod -from typing import List, Optional -from .idata_validator import IDataValidator +from typing import Optional, List __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -33,39 +32,41 @@ __status__: str = 'Updated' -class IValidationEngine(ABC): +class IDecoder(ABC): ''' - Defines interface IValidationEngine with methods. + Defines interface IDecoder with methods. It defines: :attributes: None :methods: - | add_validator - Adds a new validator to the engine. - | is_valid - Validates data using all registered validators. + | decode_data - Property method for getting decode data. + | decode - Decoding data from Vernam format. ''' + @property @abstractmethod - def add_validator(self, validator: IDataValidator) -> None: + def decode_data(self) -> Optional[str]: ''' - Adding a new validator to the engine. + Property method for getting decode data. - :param validator: Validator instance to add. - :type validator: - :return: None + :return: Decoded data | None + :rtype: :exceptions: NotImplementedError ''' - raise NotImplementedError('Method add_validator must be implemented.') + raise NotImplementedError('Property decode_data must be implemented.') @abstractmethod - def is_valid(self, data: Optional[str]) -> bool: + def decode(self, data: Optional[str], key: Optional[str]) -> bool: ''' - Validating data using all registered validators. + Decoding data from Vernam format. - :param data: Data which should be validated | None + :param data: Data which should be decoded | None :type data: - :return: True (if all valid) | False (if any invalid) + :param key: Key for decoding | None + :type key: + :return: True (if success) | False (if fail) :rtype: :exceptions: NotImplementedError ''' - raise NotImplementedError('Method is_valid must be implemented.') + raise NotImplementedError('Method decode must be implemented.') diff --git a/codecipher/vernam/iencoder.py b/codecipher/vernam/iencoder.py new file mode 100644 index 0000000..228ea2a --- /dev/null +++ b/codecipher/vernam/iencoder.py @@ -0,0 +1,72 @@ +# -*- coding: UTF-8 -*- + +''' +Module + iencoder.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines interface IEncoder for algorithm encoder class. +''' + +from abc import ABC, abstractmethod +from typing import Optional, List + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class IEncoder(ABC): + ''' + Defines interface IEncoder with methods. + + It defines: + + :attributes: None + :methods: + | encode_data - Property method for getting encode data. + | encode - Encoding data to algorithm data format. + ''' + + @property + @abstractmethod + def encode_data(self) -> Optional[str]: + ''' + Property method for getting encode data. + + :return: Encoded data | None + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Property encode_data must be implemented.') + + @abstractmethod + def encode(self, data: Optional[str], key: Optional[str]) -> bool: + ''' + Encoding data to algorithm data format. + + :param data: Data which should be encoded | None + :type data: + :param key: Key for encoding | None + :type key: + :return: True (if success) | False (if fail) + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Method encode must be implemented.') diff --git a/codecipher/vernam/ivernam.py b/codecipher/vernam/ivernam.py new file mode 100644 index 0000000..5e24e29 --- /dev/null +++ b/codecipher/vernam/ivernam.py @@ -0,0 +1,99 @@ +# -*- coding: UTF-8 -*- + +''' +Module + ivernam.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines interface IVernam for Vernam class. +''' + +from abc import ABC, abstractmethod +from typing import Optional, List + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class IVernam(ABC): + ''' + Defines interface IVernam with methods. + + It defines: + + :attributes: None + :methods: + | encode - Encoding data to Vernam format. + | encode_data - Property method for getting encode data. + | decode - Decoding data from Vernam format. + | decode_data - Property method for getting decode data. + ''' + + @abstractmethod + def encode(self, data: Optional[str], key: Optional[str]) -> bool: + ''' + Encoding data to Vernam format. + + :param data: Data which should be encoded | None + :type data: + :param key: Key for encoding | None + :type key: + :return: True (if success) | False (if fail) + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Method encode must be implemented.') + + @property + @abstractmethod + def encode_data(self) -> Optional[str]: + ''' + Property method for getting encode data. + + :return: Encoded data + :rtype: + ''' + raise NotImplementedError('Property encode_data must be implemented.') + + @abstractmethod + def decode(self, data: Optional[str], key: Optional[str]) -> bool: + ''' + Decoding data from Vernam format. + + :param data: Data which should be decoded | None + :type data: + :param key: Key for decoding | None + :type key: + :return: True (if success) | False (if fail) + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Method decode must be implemented.') + + @property + @abstractmethod + def decode_data(self) -> Optional[str]: + ''' + Property method for getting decode data. + + :return: Decoded data + :rtype: + ''' + raise NotImplementedError('Property decode_data must be implemented.') diff --git a/codecipher/atbs/idata_validator.py b/codecipher/vernam/lookup_table.py similarity index 60% rename from codecipher/atbs/idata_validator.py rename to codecipher/vernam/lookup_table.py index f269dfb..7beec83 100644 --- a/codecipher/atbs/idata_validator.py +++ b/codecipher/vernam/lookup_table.py @@ -2,7 +2,7 @@ ''' Module - idata_validator.py + lookup_table.py Copyright Copyright (C) 2021 - 2026 Vladimir Roncevic codecipher is free software: you can redistribute it and/or modify it @@ -16,11 +16,11 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines interface IDataValidator for DataValidator class. + Defines class LookUpTable with attribute(s). + Creates lookup table class with support for encoding/decoding. ''' -from abc import ABC, abstractmethod -from typing import List, Optional +from typing import List __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -32,26 +32,17 @@ __status__: str = 'Updated' -class IDataValidator(ABC): +class LookUpTable: ''' - Defines interface IDataValidator with methods. + Defines class LookUpTable with attribute(s) and method(s). + Creates lookup table class with support for encoding/decoding. It defines: - :attributes: None + :attributes: + | ALPHA - Define alphabet for encoding/decoding. :methods: - | is_valid - Validates data using specific validation logic. + | None ''' - @abstractmethod - def is_valid(self, data: Optional[str]) -> bool: - ''' - Validating data using specific validation logic. - - :param data: Data which should be validated | None - :type data: - :return: True (if valid) | False (if invalid) - :rtype: - :exceptions: NotImplementedError - ''' - raise NotImplementedError('Method is_valid must be implemented.') + ALPHA: str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' diff --git a/codecipher/vernam/vernam.py b/codecipher/vernam/vernam.py new file mode 100644 index 0000000..209ed42 --- /dev/null +++ b/codecipher/vernam/vernam.py @@ -0,0 +1,128 @@ +# -*- coding: UTF-8 -*- + +''' +Module + vernam.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines class Vernam with attribute(s) and method(s). + Creates container class with aggregate backend API. +''' + +from typing import List, Optional +from codecipher.abstracts import IValidationEngine +from .encoder import VernamEncoder +from .decoder import VernamDecoder +from .ivernam import IVernam +from .iencoder import IEncoder +from .idecoder import IDecoder +from .default_validation_engine import DefaultVernamValidationEngine + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class Vernam(IVernam): + ''' + Defines class Vernam with attribute(s) and method(s). + Creates container class with aggregate backend API. + + It defines: + + :attributes: + | __validation_engine - Engine for data validation. + | __encoder - Encoder for algorithm. + | __decoder - Decoder for algorithm. + :methods: + | __init__ - Initializes Vernam constructor. + | encode - Encoding data to Vernam format. + | encode_data - Property method for getting encode data. + | decode - Decoding data from Vernam format. + | decode_data - Property method for getting decode data. + ''' + + def __init__( + self, + validation_engine: Optional[IValidationEngine] = None, + encoder: Optional[IEncoder] = None, + decoder: Optional[IDecoder] = None + ) -> None: + ''' + Initializes Vernam constructor. + + :param validation_engine: Engine for data validation | None + :type validation_engine: + :param encoder: Encoder for algorithm | None + :type encoder: + :param decoder: Decoder for algorithm | None + :type decoder: + :exceptions: None + ''' + self.__encoder: IEncoder = encoder or VernamEncoder() + self.__decoder: IDecoder = decoder or VernamDecoder() + self.__validation_engine: IValidationEngine = validation_engine or DefaultVernamValidationEngine() + + def encode(self, data: Optional[str], key: Optional[str]) -> bool: + ''' + Encoding data to Vernam format. + + :param data: Data which should be encoded | None + :type data: + :param key: Key for encoding | None + :type key: + :return: True (if success) | False (if fail) + :rtype: + :exceptions: None + ''' + if self.__validation_engine.is_valid(data) and \ + self.__validation_engine.is_valid(key): + return self.__encoder.encode(data, key) + return False + + @property + def encode_data(self) -> Optional[str]: + ''' + Property method for getting encode data. + ''' + return self.__encoder.encode_data + + def decode(self, data: Optional[str], key: Optional[str]) -> bool: + ''' + Decoding data from Vernam format. + + :param data: Data which should be decoded | None + :type data: + :param key: Key for decoding | None + :type key: + :return: True (if success) | False (if fail) + :rtype: + :exceptions: None + ''' + if self.__validation_engine.is_valid(data) and \ + self.__validation_engine.is_valid(key): + return self.__decoder.decode(data, key) + return False + + @property + def decode_data(self) -> Optional[str]: + ''' + Property method for getting decode data. + ''' + return self.__decoder.decode_data diff --git a/codecipher/vigenere/__init__.py b/codecipher/vigenere/__init__.py index aacbfa0..e2499b5 100644 --- a/codecipher/vigenere/__init__.py +++ b/codecipher/vigenere/__init__.py @@ -16,20 +16,20 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines class Vigenere with attribute(s) and method(s). - Creates container class with aggregate backend API. + Initialization for vigenere package. ''' -import sys from typing import List - -try: - from codecipher.vigenere.encode import VigenereEncode - from codecipher.vigenere.decode import VigenereDecode - from codecipher.vigenere.key_generator import KeyGenerator -except ImportError as ats_error_message: # pragma: no cover - # Force exit python ####################################################### - sys.exit(f'\n{__file__}\n{ats_error_message}\n') # pragma: no cover +from .ivigenere import IVigenere +from .iencoder import IEncoder +from .idecoder import IDecoder +from .ikey_generator import IKeyGenerator +from .encoder import VigenereEncoder +from .decoder import VigenereDecoder +from .vigenere import Vigenere +from .default_validation_engine import DefaultVigenereValidationEngine +from .default_data_validator import DefaultVigenereDataValidator +from .default_character_validator import DefaultVigenereCharacterValidator __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -40,24 +40,15 @@ __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' - -class Vigenere(VigenereEncode, VigenereDecode, KeyGenerator): - ''' - Defines class Vigenere with attribute(s) and method(s). - Creates container class with aggregate backend API. - - It defines: - - :attributes: - | None. - :methods: - | __init__ - Initials Vigenere constructor. - ''' - - def __init__(self) -> None: - ''' - Initials Vigenere constructor. - - :exceptions: None - ''' - super().__init__() +__all__: List[str] = [ + 'IVigenere', + 'IEncoder', + 'IDecoder', + 'IKeyGenerator', + 'VigenereEncoder', + 'VigenereDecoder', + 'Vigenere', + 'DefaultVigenereValidationEngine', + 'DefaultVigenereDataValidator', + 'DefaultVigenereCharacterValidator' +] diff --git a/codecipher/vigenere/decode.py b/codecipher/vigenere/decoder.py similarity index 68% rename from codecipher/vigenere/decode.py rename to codecipher/vigenere/decoder.py index 92b37ed..848fd0a 100644 --- a/codecipher/vigenere/decode.py +++ b/codecipher/vigenere/decoder.py @@ -2,7 +2,7 @@ ''' Module - decode.py + decoder.py Copyright Copyright (C) 2021 - 2026 Vladimir Roncevic codecipher is free software: you can redistribute it and/or modify it @@ -16,19 +16,14 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines class VigenereDecode with attribute(s) and method(s). + Defines class VigenereDecoder with attribute(s) and method(s). Creates decode class with backend API. ''' -import sys from dataclasses import dataclass, field from typing import List, Optional - -try: - from codecipher.vigenere.lookup_table import LookUpTable -except ImportError as ats_error_message: # pragma: no cover - # Force exit python ####################################################### - sys.exit(f'\n{__file__}\n{ats_error_message}\n') # pragma: no cover +from .lookup_table import LookUpTable +from .idecoder import IDecoder __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -41,9 +36,9 @@ @dataclass -class VigenereDecode: +class VigenereDecoder(IDecoder): ''' - Defines class VigenereDecode with attribute(s) and method(s). + Defines class VigenereDecoder with attribute(s) and method(s). Creates decode class with backend API. It defines: @@ -70,26 +65,24 @@ def decode_data(self) -> Optional[str]: return self._decode_data @decode_data.setter - def decode_data(self, decode_data_val: Optional[str]) -> None: + def decode_data(self, data: Optional[str]) -> None: ''' Property method for setting decode data. - :param decode_data_val: Decoded data | None - :type decode_data_val: + :param data: Decoded data | None + :type data: :return: None :exceptions: None ''' - if bool(decode_data_val): - self._decode_data = decode_data_val + if bool(data): + self._decode_data = data - def _split_data_decode( - self, data_to_decode: Optional[str], key: Optional[str] - ) -> List[str]: + def _split_data_decode(self, data: Optional[str], key: Optional[str]) -> List[str]: ''' Splitting data for decoding. - :param data_to_decode: Data which should be decoded | None - :type data_to_decode: + :param data: Data which should be decoded | None + :type data: :param key: Key for decoding | None :type key: :return: List with data for decoding @@ -97,27 +90,26 @@ def _split_data_decode( :exceptions: None ''' elements: List[str] = [] - if bool(data_to_decode) and bool(key): - for i in range(0, len(data_to_decode), len(key)): - elements.append(data_to_decode[i: i + len(key)]) + if bool(data) and bool(key): + for i in range(0, len(data), len(key)): + elements.append(data[i: i + len(key)]) return elements - def decode( - self, data_to_decode: Optional[str], key: Optional[str] - ) -> None: + def decode(self, data: Optional[str], key: Optional[str]) -> bool: ''' Decoding data from Vigenere format. - :param data_to_decode: Data which should be decoded - :type data_to_decode: + :param data: Data which should be decoded + :type data: :param key: Key for decoding :type key: - :return: None + :return: True (if success) | False (if fail) + :rtype: :exceptions: None ''' - if bool(data_to_decode) and bool(key): + if bool(data) and bool(key): decode_list: List[str] = [] - for element in self._split_data_decode(data_to_decode, key): + for element in self._split_data_decode(data, key): for index, letter in enumerate(element): process_index: int = ( LookUpTable.LETTER_TO_INDEX[letter] - @@ -127,3 +119,5 @@ def decode( LookUpTable.INDEX_TO_LETTER[process_index] ) self._decode_data = ''.join(decode_list) + return True + return False diff --git a/codecipher/vigenere/default_character_validator.py b/codecipher/vigenere/default_character_validator.py new file mode 100644 index 0000000..8ec27b6 --- /dev/null +++ b/codecipher/vigenere/default_character_validator.py @@ -0,0 +1,68 @@ +# -*- coding: UTF-8 -*- + +''' +Module + default_character_validator.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines class DefaultVigenereCharacterValidator for strict VIGENERE character validation. +''' + +from typing import List, Optional +from codecipher.abstracts import ICharacterValidator +from .lookup_table import LookUpTable + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class DefaultVigenereCharacterValidator(ICharacterValidator): + ''' + Defines class DefaultVigenereCharacterValidator with attribute(s) and method(s). + Creates character validator class for VIGENERE. + + It defines: + + :attributes: + | __allowed_chars - Strict ASCII alphanumeric character set (VIGENERE lookup table). + :methods: + | __init__ - Initializes DefaultVigenereCharacterValidator constructor. + | is_valid_char - Validates if a single character belongs to VIGENERE. + ''' + + def __init__(self) -> None: + ''' + Initializes DefaultVigenereCharacterValidator constructor. + ''' + self.__allowed_chars: str = LookUpTable.ALPHANUM + + def is_valid_char(self, char: Optional[str]) -> bool: + ''' + Validates if a single character belongs to VIGENERE. + + :param char: Single character to validate | None + :type char: + :return: True (if valid) | False (if invalid) + :rtype: + ''' + if not bool(char) or len(char) != 1: + return False + + return char in self.__allowed_chars diff --git a/codecipher/vigenere/default_data_validator.py b/codecipher/vigenere/default_data_validator.py new file mode 100644 index 0000000..45f26c5 --- /dev/null +++ b/codecipher/vigenere/default_data_validator.py @@ -0,0 +1,73 @@ +# -*- coding: UTF-8 -*- + +''' +Module + default_data_validator.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines class DefaultVigenereDataValidator for strict VIGENERE data validation. +''' + +from typing import List, Optional +from codecipher.abstracts import IDataValidator, ICharacterValidator +from .default_character_validator import DefaultVigenereCharacterValidator + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class DefaultVigenereDataValidator(IDataValidator): + ''' + Defines class DefaultVigenereDataValidator with attribute(s) and method(s). + Creates data validator for VIGENERE. + + It defines: + + :attributes: + | __char_validator - Validator for individual characters. + :methods: + | __init__ - Initializes DefaultVigenereDataValidator constructor. + | is_valid - Validates if data is in VIGENERE format. + ''' + + def __init__(self, char_validator: Optional[ICharacterValidator] = None) -> None: + ''' + Initializes DefaultVigenereDataValidator constructor. + + :param char_validator: Character validator instance | None + :type char_validator: + :exceptions: None + ''' + self.__char_validator: ICharacterValidator = char_validator or DefaultVigenereCharacterValidator() + + def is_valid(self, data: Optional[str]) -> bool: + ''' + Validating if data is in VIGENERE format. + + :param data: Data which should be validated | None + :type data: + :return: True (if valid) | False (if invalid) + :rtype: + :exceptions: None + ''' + if not bool(data): + return False + + return all(self.__char_validator.is_valid_char(element) for element in data) diff --git a/codecipher/b64/validation_engine.py b/codecipher/vigenere/default_validation_engine.py similarity index 73% rename from codecipher/b64/validation_engine.py rename to codecipher/vigenere/default_validation_engine.py index c37fa6c..6a3bcc9 100644 --- a/codecipher/b64/validation_engine.py +++ b/codecipher/vigenere/default_validation_engine.py @@ -2,7 +2,7 @@ ''' Module - validation_engine.py + default_validation_engine.py Copyright Copyright (C) 2021 - 2026 Vladimir Roncevic codecipher is free software: you can redistribute it and/or modify it @@ -16,12 +16,12 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines class ValidationEngine for managing multiple validators. + Defines class DefaultVigenereValidationEngine for managing multiple data validators. ''' from typing import List, Optional -from .ivalidation_engine import IValidationEngine -from .idata_validator import IDataValidator +from codecipher.abstracts import IValidationEngine, IDataValidator +from .default_data_validator import DefaultVigenereDataValidator __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -33,34 +33,34 @@ __status__: str = 'Updated' -class ValidationEngine(IValidationEngine): +class DefaultVigenereValidationEngine(IValidationEngine): ''' - Defines class ValidationEngine with attribute(s) and method(s). - Creates validation engine class with backend API. + Defines class DefaultVigenereValidationEngine with attribute(s) and method(s). + Creates validation engine class for VIGENERE. It defines: :attributes: | __validators - List of registered data validators. :methods: - | __init__ - Initializes ValidationEngine constructor. - | add_validator - Adds a new validator to the engine. + | __init__ - Initializes DefaultVigenereValidationEngine constructor. + | add_validator - Adds a new data validator to the engine. | is_valid - Validates data using all registered validators. ''' def __init__(self, validators: Optional[List[IDataValidator]] = None) -> None: ''' - Initializes ValidationEngine constructor. + Initializes DefaultVigenereValidationEngine. :param validators: Initial list of validators | None :type validators: :exceptions: None ''' - self.__validators: List[IDataValidator] = validators or [] + self.__validators: List[IDataValidator] = validators or [DefaultVigenereDataValidator()] def add_validator(self, validator: IDataValidator) -> None: ''' - Adding a new validator to the engine. + Adding a new data validator to the engine. :param validator: Validator instance to add. :type validator: @@ -83,7 +83,7 @@ def is_valid(self, data: Optional[str]) -> bool: if not bool(data): return False - for validator in self.__validators: - if not validator.is_valid(data): - return False - return True + if not self.__validators: + return False + + return all(validator.is_valid(data) for validator in self.__validators) diff --git a/codecipher/vigenere/encode.py b/codecipher/vigenere/encoder.py similarity index 68% rename from codecipher/vigenere/encode.py rename to codecipher/vigenere/encoder.py index 02c8ead..4b4d0b6 100644 --- a/codecipher/vigenere/encode.py +++ b/codecipher/vigenere/encoder.py @@ -2,7 +2,7 @@ ''' Module - encode.py + encoder.py Copyright Copyright (C) 2021 - 2026 Vladimir Roncevic codecipher is free software: you can redistribute it and/or modify it @@ -16,19 +16,14 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines class VigenereEncode with attribute(s) and method(s). + Defines class VigenereEncoder with attribute(s) and method(s). Creates encode class with backend API. ''' -import sys from dataclasses import dataclass, field from typing import List, Optional - -try: - from codecipher.vigenere.lookup_table import LookUpTable -except ImportError as ats_error_message: # pragma: no cover - # Force exit python ####################################################### - sys.exit(f'\n{__file__}\n{ats_error_message}\n') # pragma: no cover +from .lookup_table import LookUpTable +from .iencoder import IEncoder __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -41,9 +36,9 @@ @dataclass -class VigenereEncode: +class VigenereEncoder(IEncoder): ''' - Defines class VigenereEncode with attribute(s) and method(s). + Defines class VigenereEncoder with attribute(s) and method(s). Creates encode class with backend API. It defines: @@ -70,26 +65,24 @@ def encode_data(self) -> Optional[str]: return self._encode_data @encode_data.setter - def encode_data(self, encode_data_val: Optional[str]) -> None: + def encode_data(self, data: Optional[str]) -> None: ''' Property method for setting encode data. - :param encode_data_val: Encode data | None - :type encode_data_val: + :param data: Encode data | None + :type data: :return: None :exceptions: None ''' - if bool(encode_data_val): - self._encode_data = encode_data_val + if bool(data): + self._encode_data = data - def _split_data_encode( - self, data_to_encode: Optional[str], key: Optional[str] - ) -> List[str]: + def _split_data_encode(self, data: Optional[str], key: Optional[str]) -> List[str]: ''' Splitting data for encoding. - :param data_to_encode: Data which should be encoded | None - :type data_to_encode: + :param data: Data which should be encoded | None + :type data: :param key: Key for encoding | None :type key: :return: List with data for encoding @@ -97,27 +90,26 @@ def _split_data_encode( :exceptions: None ''' elements: List[str] = [] - if bool(data_to_encode) and bool(key): - for i in range(0, len(data_to_encode), len(key)): - elements.append(data_to_encode[i: i + len(key)]) + if bool(data) and bool(key): + for i in range(0, len(data), len(key)): + elements.append(data[i: i + len(key)]) return elements - def encode( - self, data_to_encode: Optional[str], key: Optional[str] - ) -> None: + def encode(self, data: Optional[str], key: Optional[str]) -> bool: ''' Encoding data to Vigenere format. - :param data_to_encode: Data which should be encoded | None - :type data_to_encode: + :param data: Data which should be encoded | None + :type data: :param key: Key for encoding | None :type key: - :return: None + :return: True (if success) | False (if fail) + :rtype: :exceptions: None ''' - if bool(data_to_encode) and bool(key): + if bool(data) and bool(key): encode_list: List[str] = [] - for element in self._split_data_encode(data_to_encode, key): + for element in self._split_data_encode(data, key): for index, letter in enumerate(element): process_index: int = ( LookUpTable.LETTER_TO_INDEX[letter] + @@ -127,3 +119,5 @@ def encode( LookUpTable.INDEX_TO_LETTER[process_index] ) self._encode_data = ''.join(encode_list) + return True + return False diff --git a/codecipher/vigenere/idecoder.py b/codecipher/vigenere/idecoder.py new file mode 100644 index 0000000..32f48c0 --- /dev/null +++ b/codecipher/vigenere/idecoder.py @@ -0,0 +1,72 @@ +# -*- coding: UTF-8 -*- + +''' +Module + idecoder.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines interface IDecoder for VigenereDecoder class. +''' + +from abc import ABC, abstractmethod +from typing import Optional, List + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class IDecoder(ABC): + ''' + Defines interface IDecoder with methods. + + It defines: + + :attributes: None + :methods: + | decode_data - Property method for getting decode data. + | decode - Decoding data from algorithm data format. + ''' + + @property + @abstractmethod + def decode_data(self) -> Optional[str]: + ''' + Property method for getting decode data. + + :return: Decoded data | None + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Property decode_data must be implemented.') + + @abstractmethod + def decode(self, data: Optional[str], key: Optional[str]) -> bool: + ''' + Decoding data from algorithm data format. + + :param data: Data which should be decoded | None + :type data: + :param key: Key for decoding | None + :type key: + :return: True (if success) | False (if fail) + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Method decode must be implemented.') diff --git a/codecipher/vigenere/iencoder.py b/codecipher/vigenere/iencoder.py new file mode 100644 index 0000000..228ea2a --- /dev/null +++ b/codecipher/vigenere/iencoder.py @@ -0,0 +1,72 @@ +# -*- coding: UTF-8 -*- + +''' +Module + iencoder.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines interface IEncoder for algorithm encoder class. +''' + +from abc import ABC, abstractmethod +from typing import Optional, List + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class IEncoder(ABC): + ''' + Defines interface IEncoder with methods. + + It defines: + + :attributes: None + :methods: + | encode_data - Property method for getting encode data. + | encode - Encoding data to algorithm data format. + ''' + + @property + @abstractmethod + def encode_data(self) -> Optional[str]: + ''' + Property method for getting encode data. + + :return: Encoded data | None + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Property encode_data must be implemented.') + + @abstractmethod + def encode(self, data: Optional[str], key: Optional[str]) -> bool: + ''' + Encoding data to algorithm data format. + + :param data: Data which should be encoded | None + :type data: + :param key: Key for encoding | None + :type key: + :return: True (if success) | False (if fail) + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Method encode must be implemented.') diff --git a/codecipher/vigenere/ikey_generator.py b/codecipher/vigenere/ikey_generator.py new file mode 100644 index 0000000..30fadef --- /dev/null +++ b/codecipher/vigenere/ikey_generator.py @@ -0,0 +1,78 @@ +# -*- coding: UTF-8 -*- + +''' +Module + ikey_generator.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines interface IKeyGenerator for KeyGenerator class. +''' + +from abc import ABC, abstractmethod +from typing import Optional, List + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class IKeyGenerator(ABC): + ''' + Defines interface IKeyGenerator with methods. + + It defines: + + :attributes: None + :methods: + | key - Property method for getting generated key. + | generate_key - Generating key for algorithm. + ''' + + @property + @abstractmethod + def key(self) -> Optional[str]: + ''' + Property method for getting generated key. + + :return: Generated key | None + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Property key must be implemented.') + + @key.setter + @abstractmethod + def key(self, key: Optional[str]) -> None: + ''' + Property method for setting key. + ''' + raise NotImplementedError('Setter key must be implemented.') + + @abstractmethod + def generate_key(self, data_len: Optional[int]) -> bool: + ''' + Generating key for algorithm. + + :param data_len: Length of data for which key is generated | None + :type data_len: + :return: True (if success) | False (if fail) + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Method generate_key must be implemented.') diff --git a/codecipher/vigenere/ivigenere.py b/codecipher/vigenere/ivigenere.py new file mode 100644 index 0000000..6de033f --- /dev/null +++ b/codecipher/vigenere/ivigenere.py @@ -0,0 +1,85 @@ +# -*- coding: UTF-8 -*- + +''' +Module + ivigenere.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines interface IVigenere for Vigenere class. +''' + +from abc import ABC, abstractmethod +from typing import Optional, List + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class IVigenere(ABC): + ''' + Defines interface IVigenere with methods. + + It defines: + + :attributes: None + :methods: + | encode - Encoding data to Vigenere format. + | encode_data - Property method for getting encode data. + | decode - Decoding data from Vigenere format. + | decode_data - Property method for getting decode data. + ''' + + @abstractmethod + def encode(self, data: Optional[str], key: Optional[str]) -> bool: + ''' + Encoding data to Vigenere format. + + :param data: Data which should be encoded | None + :type data: + :param key: Key for encoding | None + :type key: + :return: True (if success) | False (if fail) + :rtype: + :exceptions: NotImplementedError + ''' + raise NotImplementedError('Method encode must be implemented.') + + @property + @abstractmethod + def encode_data(self) -> Optional[str]: + ''' + Property method for getting encode data. + ''' + raise NotImplementedError('Property encode_data must be implemented.') + + @abstractmethod + def decode(self, data: Optional[str], key: Optional[str]) -> bool: + ''' + Decoding data from Vigenere format. + ''' + raise NotImplementedError('Method decode must be implemented.') + + @property + @abstractmethod + def decode_data(self) -> Optional[str]: + ''' + Property method for getting decode data. + ''' + raise NotImplementedError('Property decode_data must be implemented.') diff --git a/codecipher/vigenere/key_generator.py b/codecipher/vigenere/key_generator.py index feb4e99..77302a5 100644 --- a/codecipher/vigenere/key_generator.py +++ b/codecipher/vigenere/key_generator.py @@ -22,6 +22,7 @@ from dataclasses import dataclass, field from typing import List, Optional +from .ikey_generator import IKeyGenerator __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -34,7 +35,7 @@ @dataclass -class KeyGenerator: +class KeyGenerator(IKeyGenerator): ''' Defines class KeyGenerator with attribute(s) and method(s). Creates key generator class for Vigener encoding/decoding. @@ -101,19 +102,28 @@ def key(self, key: Optional[str]) -> None: if bool(key): self._key = key - def generate_key(self) -> None: + def generate_key(self, data_len: Optional[int] = None) -> bool: ''' Generates key for encoding/decoding. - :return: None + :param data_len: Length of data for which key is generated | None + :type data_len: + :return: True (if success) | False (if fail) :exceptions: None ''' - if bool(self._key): + if bool(data_len): + self._data_len = data_len + + if bool(self._key) and bool(self._data_len): key_list: List[str] = list(self._key) - if bool(key_list) and bool(self._data_len): - if self._data_len == len(key_list): - pass - else: - for i in range(self._data_len - len(key_list)): - key_list.append(key_list[i % len(key_list)]) - self._key = ''. join(key_list) + + if self._data_len == len(key_list): + pass + else: + for i in range(self._data_len - len(key_list)): + key_list.append(key_list[i % len(key_list)]) + self._key = ''.join(key_list) + + return True + + return False diff --git a/codecipher/vigenere/vigenere.py b/codecipher/vigenere/vigenere.py new file mode 100644 index 0000000..d14057f --- /dev/null +++ b/codecipher/vigenere/vigenere.py @@ -0,0 +1,145 @@ +# -*- coding: UTF-8 -*- + +''' +Module + vigenere.py +Copyright + Copyright (C) 2021 - 2026 Vladimir Roncevic + codecipher is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + codecipher is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along + with this program. If not, see . +Info + Defines class Vigenere with attribute(s) and method(s). + Creates container class with aggregate backend API. +''' + +from typing import List, Optional +from codecipher.abstracts import IValidationEngine +from .encoder import VigenereEncoder +from .decoder import VigenereDecoder +from .key_generator import KeyGenerator +from .ivigenere import IVigenere +from .iencoder import IEncoder +from .idecoder import IDecoder +from .ikey_generator import IKeyGenerator +from .default_validation_engine import DefaultVigenereValidationEngine + +__author__: str = 'Vladimir Roncevic' +__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' +__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] +__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' +__version__: str = '1.5.1' +__maintainer__: str = 'Vladimir Roncevic' +__email__: str = 'elektron.ronca@gmail.com' +__status__: str = 'Updated' + + +class Vigenere(IVigenere): + ''' + Defines class Vigenere with attribute(s) and method(s). + Creates container class with aggregate backend API. + + It defines: + + :attributes: + | __validation_engine - Engine for data validation. + | __encoder - Encoder for algorithm. + | __decoder - Decoder for algorithm. + | __key_generator - Key generator for algorithm. + :methods: + | __init__ - Initializes Vigenere constructor. + | encode - Encoding data to Vigenere format. + | encode_data - Property method for getting encode data. + | decode - Decoding data from Vigenere format. + | decode_data - Property method for getting decode data. + ''' + + def __init__( + self, + validation_engine: Optional[IValidationEngine] = None, + encoder: Optional[IEncoder] = None, + decoder: Optional[IDecoder] = None, + key_generator: Optional[IKeyGenerator] = None + ) -> None: + ''' + Initializes Vigenere constructor. + + :param validation_engine: Engine for data validation | None + :type validation_engine: + :param encoder: Encoder for algorithm | None + :type encoder: + :param decoder: Decoder for algorithm | None + :type decoder: + :param key_generator: Key generator for algorithm | None + :type key_generator: + :exceptions: None + ''' + self.__validation_engine: IValidationEngine = validation_engine or DefaultVigenereValidationEngine() + self.__encoder: IEncoder = encoder or VigenereEncoder() + self.__decoder: IDecoder = decoder or VigenereDecoder() + self.__key_generator: IKeyGenerator = key_generator or KeyGenerator() + + def encode(self, data: Optional[str], key: Optional[str]) -> bool: + ''' + Encoding data to Vigenere format. + + :param data: Data which should be encoded | None + :type data: + :param key: Key for encoding | None + :type key: + :return: True (if success) | False (if fail) + :rtype: + :exceptions: None + ''' + if not bool(data) or not bool(key): + return False + + if self.__validation_engine.is_valid(data) and \ + self.__validation_engine.is_valid(key): + self.__key_generator.key = key + if self.__key_generator.generate_key(len(data)): + return self.__encoder.encode(data, self.__key_generator.key) + return False + + @property + def encode_data(self) -> Optional[str]: + ''' + Property method for getting encode data. + ''' + return self.__encoder.encode_data + + def decode(self, data: Optional[str], key: Optional[str]) -> bool: + ''' + Decoding data from Vigenere format. + + :param data: Data which should be decoded | None + :type data: + :param key: Key for decoding | None + :type key: + :return: True (if success) | False (if fail) + :rtype: + :exceptions: None + ''' + if not bool(data) or not bool(key): + return False + + if self.__validation_engine.is_valid(data) and \ + self.__validation_engine.is_valid(key): + self.__key_generator.key = key + if self.__key_generator.generate_key(len(data)): + return self.__decoder.decode(data, self.__key_generator.key) + return False + + @property + def decode_data(self) -> Optional[str]: + ''' + Property method for getting decode data. + ''' + return self.__decoder.decode_data diff --git a/setup.py b/setup.py index 8142db9..4ee1ea6 100644 --- a/setup.py +++ b/setup.py @@ -23,7 +23,7 @@ from __future__ import print_function from typing import List, Optional from os.path import abspath, dirname, join -from setuptools import setup +from setuptools import setup, find_packages __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -57,15 +57,7 @@ keywords='cipher, encryption, decryption, cryptology, cryptography', platforms='any', classifiers=PYP_CLASSIFIERS, - packages=[ - 'codecipher', - 'codecipher.a1z52n62', - 'codecipher.atbs', - 'codecipher.b64', - 'codecipher.caesar', - 'codecipher.vernam', - 'codecipher.vigenere' - ], + packages=find_packages(exclude=['tests', 'tests.*']), package_data={ 'codecipher': [ 'py.typed' diff --git a/tests/.coverage b/tests/.coverage index d58f3cd9fa421e0663025885d1749f5062a5d6ec..e6ce584dc768217b3eb55318cabb2ad4d7370630 100644 GIT binary patch literal 69632 zcmeI5Yiu0Xb%1AfXP@)9OY!{>IebVY#mABqCF(6w5=F|9NKuw8KVq$Rmm_j(a+lg& z%8~)sTFb2+7eRp_aN5Kv+$M;MxD|@lsga_EnYuum{z&ZxZQa&EjRuWVw{;yLu@gU} zo_l9zXGpFDV`qd&?pZ8(_MVx0?z!JR=iYgdd-u%IR9;ihX0nU%ytxisBF?J}x&t6A-=metZpEvI|Ym747i zcVB)y9H_0V>0b6HihtB9VjkaubtjZ;7 z8oL{n&w_L5jEU8%NSlVr%;)s-Vgiu=%JSk89UQ2kH=NJhsOF98<}*fTKk?X<7)z_a ztA^7=PDfO)wVY0!Th@w$->X_Rds#QqnO>E40wQ3O=&#*b$#W2u+J)S?1vuV{#h3FL zR*u2o#|Gh-^khXaP}|bNKXr};3dIvkr1H7qhtR5^DXMP}I&}MuL8(6w6LIN z&a#xDwN-s^Ae!wt6E$JPvoz7vjIkql`b&*A>MZ!6CKfV@)v?ARCZ|Dyz+7PNc6K?P zq^XjleMn}`YuWgm)^BXpr-fg3AVKI1hWxeTEjJ3CVhF?riyy; zhq?SzJ)^$}lRo|Nu5y`bESEo{UFwXZ3WagJQGz$h@}BoW2?zis!X_YEe_^ zF3cGgSdYYWYBHDK=ODu67va79Cs%2oh%P=w-NUXR0VIF~kN^@u0!RP} zAOR$R1dsp{xKjxz$ArR0K1%;pVsutJA6>ebpUzp~D1$<)%kmW|G(^7G3HyT-OL zv3)q2f`3vByJz9wCAQ%I|GQHI0sTe-NB{{S0VIF~kN^@u0!RP}AOR%si3oUkFDKK# z|L4g^9K7*`1dsp{Kmter2_OL^fCP{L5LY^j%5RIH7hsiK$Cso9!{9JiUd0qLg@{;mR<+qe4lygc#xks5)hLjd1qVV!N z^1sS|BflhHk-scIEk7zR$oI(meb#J9zN5nmBs6u&B778k_(Md}c~kN^@u0!RP}AOR$R1dzaOL_nDo_)zm?kX!k9 zD|d+BKqjE9PUvN!YSdG47!)0cbw#j?^GtfG$3fLQ9^@{4_!hU~AK?7ME1rdK*Bt`& z&>>J?2V2}@+`FDLFVArQJ>sc8NGlwKE${ywKk9AZ_;-CP*ZuMVP&XX_^|gBL%|P`S z-D_;^Udkw_n@7QcYxS4BJL=^9wAOy3Tqp0N#eHTmvKNYNds&h5bAiiVaSv$f_JHR4 z$D*_w3JtsUCV6ESl$v+JCZqE^p{(xI%dGP|K+&;7SLmIu839%Q2v~Uhy2L#nSn;hi z!ke$$4*IU`pa&?gUhW{hY8ESopx80QinIfD zT$4Bms=7f?UBBj&2B6R|VDvza(#lcT1U(RVxt|vMjbeoKK~e3~i$Rt1)bxU)zt?d7 zRqvagH~m%Ih+5qP`re+RpDX+yz4I3j`l`23^_I12sTx{Ok!6H0BJ zv_!oh;C6_cK~uL`_g>iqh2~AVM>O0zpsaQn4%2XJ2SrD_;W7)iiZ-fhqh8E$5qX{y zmMU7Qs@1NNRZumlP*JDaLW?bCv7(t)Xl6yuzrw@2Y9pw&Yy=y{f&Bcx9~PTHTh|0y zh!(Mt78;>eJ@V>ce3N@YxcpVM$LMQ~RMz7QR|C36X zBOj8VlK&w;BL7BSC$EveC9jY_C*LAh$rbWE`EBwA@*Cty@)$W!GGv~_$phqWa+Hjd zePo0TkZ#gO8sRE|O#I4qxKi*F5jkN^@u0!RP}AOR$R1dsp{ zxJ3l$NhLoy$;8A26Ne8oF+R@3p+ig@Jjld>15AvKF)=#I#QyzE?Ayo0-n~rh*~7%{ z-AwG-#l+5?Ozhaf#K;H}+qW~ZZ5tEA!%S@5%EZtR6N7_H3=A+4jWW^S&qQAz6TQ7m z^z<;XWeXGC-Ar_KG11w{#OBRRY}&*`M+Xz_?M$?_G11z}gsL*p(!xY@GZPy(GSSq; zL}Mcp4Gm1x*E3O9$3$%{6E!tVR97=mRmDVQB@-JqFi}y#L?prlAxtO=6SB;NBrzef z%K&^h%u1mU6Tu)8fdCVJKNCJ56N12m*UN;*BfvEPcK@G?+@g>|vq%65AOR$R1dsp{ zKmter2_OL^fCP}hZ9#zDXvg#a+hQ!x2_%37kN^@u0!RP}AOR$R1dsp{Kmxal0R8)a zy#Ifz=%QUDfCP{L50^>4Ugh_dyTU_3C3wI8e*-gttHBR~S3^GxebN7%e=0QTyXL#5h5&6|80( z8Tw_a9cP5XL3eB?=i}LUGOuM@oX1owmP)7cu^8ZN zIw2G~%kOPGpU6cQGMR^$mty&NVu6l+OY{H##e?NSTt0<0k>6vkXK zUMe~2?-B~N4((IyK)TLZD6qk^0;?9LtpNOdMkv%f^e<&NxWNSntxT$(6bhB)dq%&N zS)cwkLNBL;LQDC!7&_ZmJXgA5&Kim;7tGm`yh0NS#~gHa@X>8U>Fq=CRoMERUpgxz z&SvKL+E&(OCP@l~BQAEMRCX#eLSd6DZ6u9VTXs0Znpjd+cu4mPg>5c4X(Ep$GwHLb zIhavIm%48yZP=~uTP8zy3x#eMx}P%p4;>G>Z zs}<+^bwfGfY!+VEK&ePPd`c(`mLG}5HXhb4##n#id3N$J?kpvXcFhkkaU60sW15zL zHys6fhI8;?Fpau2OtvL+zgs4)?(cIp=M+ai zWqyLO-|Lc_w#jGDNuki=V3f3MI=;B}9B;S7NkBJx^W(`~&Ms1%U){#Kd2FY%)6_NQ zOU+_CoE^m*E$9MbW5n5ogrdXdJhR;udsaSdJ1!L39S52%XNTP}XnDBRl^&;xBQoTQ zgSK29be5~hxR#4&*XHVgGcOIJwv*j1cMMu9UbnMxF+J2JWJ;$i_N=(s;%urg{4-~} zQd32rv$<|f3+v{(erMD58uO(O!K1D~w}PU_+3acftP6;VURQ$FmaCgN&Wm^5jFS!& zNZ?K+;OxSvdEj0=SuQ;@PSWT9`?;y^W60 z+G77`i*sw1Z^v?*8=Kr{qnK6_Sagt9CVX4u-Y0^|ZO)xE zkz4owkB8mqzLgd;A(y&unLH5$likj{Z@>RP6L7~(6DeGAn(@11(w4}d^?}K~<@daJ zo4e%w|N8~7KH`S;b*X#W3#J_`s+QxWkEKs|z`lc!DB8Edp5(!1`3Gt?OZ5D|A<)5* z=g5Tep7IUl9z~E}lxO8?=})AS;=AHk#L4ha!@nDz3jHkfwa`&`_Ww$7I`ChCXP^?k zkN^@u0!RP}e2NLoPQq$i{yEAgyc8dsfL6*sM_Jd(x&xiWVQ8TIbCh)rlsZSbcO2Rn zEc-aE*v8t&u4WE_-SW>=igwKpa14C>Aeb!wbjq{@=Y;0z)IA5lV$^x(*IcPMKIV?2 z)>+D_QLwnxxuffzj+@yJhFusY+X>~&K9@{d-9NDxOqPE{UL1M*({VF<+;P)(Xnyx@ zFxgZ7D3yFVF0l)YI+z4jKe<-=jOU@9&_?-J_=``2>DO7;&0}YFfcf$-;;u1YY8E>- z0xgt(HP2|F_$=1cb}-lKbReyHW@?)o_N;uE9tL~m-;p!AYs=Z`t*#ifJe(SGqsP|M kanpltIB3t+0Wes8t{OL?*G&A0C>Sk2SJ&LxE}g6Y2i1PHj{pDw delta 1341 zcmZXTO>7fK6vt=0vmdjwGqd(OE+0*Z#D`F&LZU`$0pSE_3k@W04unf3TOyIdC4r`` z#DzGOip0%gkjyQPxC2onIFjVhB2E!)4FUm%9)Q51Js`CO;=b9~>y3JRzxV&od;9*{ zVuchdMrjM?bDg!`9*z*o&~_wm$dfW97R9$>JHN|+;-7l2ycuth)!B8HXTH1Wj=Syj zXZk&DpHKQPoy2gaJmlbEE7wNQ^w#oUHvXKRoERD1b^7e_ba{~C<5n(cwhpq<@kVnf zRsPz=UzSS@Gu8cXZ+W+eDQ`3fd~j?j&obO6BS%h#&uFMRUNCDwXpx$&?okUXEh~>v zJLdMZyP>w#omb52XMi?_X!$p*IlJGD=%0DgTKE`Mi*F97Qk7Xp9gu7WW7ZlO)hnyY z`$MX9kEkbAX&tqi-PZI06PVsLo6P4=ji351pN9kG2+*x+?%@%tE2B}xuawYN+OKXs zpep;AsT=kF9yiRY1Ie3mL@dcbO!D($2mh6S=2g7cUXIOqh!xx=mUJiR4{itTpua#? zD-Jn9rn}Xd+97rJsgE;i`9)TpeoEc7Z-5Qj)b3})I2|>j(+8^ikHcY9W@?bYhn%VH zD|dO=@fv|8zSH3yRhpsm3M zoF?1K=Slx1Osl6FR^$n?upytx|kIg z#3V%2E2h#Jg6T&Y2NmB>qJpuZU~DQ(KhLxQ-PHzk^XeWn)@Rhv-(sPj;A!9=rh%_+ zL^V4TXj$-oSxU=N!1urV1pOE!q1>5-5@x_-ov3~d2fl_={(8!#c1nQlFyTNTv`9pn z8hTeh7jO;vddNL(^qR&bgK`^#^6hi9T(tU%IO%HS#u2Ae+C`hLlmq1s2TJ|fJr(TN z3}yq{U^}R_VQW49$!fyT*A!+dfD%eI_Q93Mc&8 S str: :type pro_name: :exceptions: ATSTypeError | ATSFileError ''' + reporter: ATSReporter = ATSReporter() checker: ATSChecker = ATSChecker() error_msg: Optional[str] = None error_id: Optional[int] = None - error_msg, error_id = checker.check_params([('str:pro_name', pro_name)]) - if error_id == checker.TYPE_ERROR: + error_msg, error_id = checker.validate_parameters([('str:pro_name', pro_name)]) + + if error_id == checker.ERRORS.TYPE_ERROR: raise ATSTypeError(error_msg) + if not exists(f'../{pro_name}'): raise ATSFileError(f'missing ../{pro_name}') + cov = Coverage(source=[f'../{pro_name}']) cov.start() tests: TestSuite = TestLoader().discover('.', pattern='*_test.py') @@ -74,7 +71,7 @@ def run_coverage(pro_name: str) -> str: cov.save() report_file_name: str = f'{pro_name}_coverage.json' cov.json_report(outfile=report_file_name) - success_message([f'\nats_coverage: generated coverage {report_file_name}']) + reporter.success([f'\nats_coverage: generated coverage {report_file_name}']) return report_file_name @@ -89,10 +86,10 @@ def load_report(report_file_path: str) -> Dict[str, Any]: checker: ATSChecker = ATSChecker() error_msg: Optional[str] = None error_id: Optional[int] = None - error_msg, error_id = checker.check_params([( + error_msg, error_id = checker.validate_parameters([( 'str:report_file_path', report_file_path )]) - if error_id == checker.TYPE_ERROR: + if error_id == checker.ERRORS.TYPE_ERROR: raise ATSTypeError(error_msg) if not exists(report_file_path): raise ATSFileError(f'{report_file_path} does not exist.') @@ -113,10 +110,10 @@ def find_root_package(module_path: str) -> Optional[Path]: checker: ATSChecker = ATSChecker() error_msg: Optional[str] = None error_id: Optional[int] = None - error_msg, error_id = checker.check_params([( + error_msg, error_id = checker.validate_parameters([( 'str:module_path', module_path )]) - if error_id == checker.TYPE_ERROR: + if error_id == checker.ERRORS.TYPE_ERROR: raise ATSTypeError(error_msg) root: Optional[Path] = None path: Path = Path(module_path).resolve() @@ -138,8 +135,8 @@ def update_readme(coverage: Dict[str, Any]) -> None: checker: ATSChecker = ATSChecker() error_msg: Optional[str] = None error_id: Optional[int] = None - error_msg, error_id = checker.check_params([('dict:coverage', coverage)]) - if error_id == checker.TYPE_ERROR: + error_msg, error_id = checker.validate_parameters([('dict:coverage', coverage)]) + if error_id == checker.ERRORS.TYPE_ERROR: raise ATSTypeError(error_msg) readme_path: str = '../README.md' start_marker: str = '### Code coverage' @@ -195,21 +192,25 @@ def update_readme(coverage: Dict[str, Any]) -> None: if __name__ == "__main__": - cli: ATSOptionParser = ATSOptionParser( - 'ats_coverage 2025', '1.0.0', 'GPLv3', False - ) + cli: ATSOptionParser = ATSOptionParser({ + 'description': 'ats_coverage 2025', + 'version': '1.0.0', + 'licence': 'GPLv3' + }) cli.add_operation( '-n', '--name', dest='name', help='generate coverage report for project (provide name)' ) - args: Namespace = cli.parse_args(sys.argv) + args: OptionNamespace = cli.parse_args(sys.argv) + main_reporter: ATSReporter = ATSReporter() + if not bool(getattr(args, "name")): - error_message(['ats_coverage: missing name argument']) + main_reporter.error(['ats_coverage: missing name argument']) sys.exit(127) try: pro_report_file: str = f'{getattr(args, "name")}_coverage.json' report_data: Dict[str, Any] = load_report(pro_report_file) update_readme(report_data) except (ATSTypeError, ATSFileError) as e: - error_message([f'ats_coverage: {e}']) + main_reporter.error([f'ats_coverage: {e}']) sys.exit(128) diff --git a/tests/caesar_test.py b/tests/caesar_test.py index 12e9acf..7a8a46e 100644 --- a/tests/caesar_test.py +++ b/tests/caesar_test.py @@ -25,7 +25,8 @@ import unittest from unittest.mock import MagicMock, PropertyMock from typing import List, Optional -from codecipher.caesar import Caesar, ICaesarEncoder, ICaesarDecoder +from codecipher.abstracts import IValidationEngine +from codecipher.caesar import Caesar, IEncoder, IDecoder __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -52,6 +53,7 @@ class CaesarTestCase(unittest.TestCase): | enc_data - Encoded data. | dec_data - Decoded data. | cipher - Cipher object. + | mock_validation_engine - Mocked validation engine. :methods: | setUp - Call before test cases. | tearDown - Call after test cases. @@ -73,14 +75,21 @@ def setUp(self) -> None: self.enc_data: Optional[str] = None self.dec_data: Optional[str] = None - # Initialize Caesar with default (real) encoder/decoder for most tests - self.cipher: Caesar = Caesar() + # Mock validation engine to be used by default or for specific tests + self.mock_validation_engine = MagicMock(spec=IValidationEngine) + self.mock_validation_engine.is_valid.return_value = True + + # Initialize Caesar with mocked validation engine to avoid strict checks in tests + self.cipher: Caesar = Caesar(validation_engine=self.mock_validation_engine) # Mocks for specific mock interaction tests - self.mock_encoder: MagicMock = MagicMock(spec=ICaesarEncoder) - self.mock_decoder: MagicMock = MagicMock(spec=ICaesarDecoder) - self.mock_cipher_with_deps: Caesar = Caesar(encoder=self.mock_encoder, - decoder=self.mock_decoder) + self.mock_encoder = MagicMock(spec=IEncoder) + self.mock_decoder = MagicMock(spec=IDecoder) + self.mock_cipher_with_deps: Caesar = Caesar( + validation_engine=self.mock_validation_engine, + encoder=self.mock_encoder, + decoder=self.mock_decoder + ) def tearDown(self) -> None: '''Call after test cases.''' @@ -88,9 +97,10 @@ def tearDown(self) -> None: self.enc_data = None self.dec_data = None self.cipher = None # type: ignore - self.mock_encoder = None # type: ignore - self.mock_decoder = None # type: ignore - self.mock_cipher_with_deps = None # type: ignore + self.mock_encoder = None # type: ignore + self.mock_decoder = None # type: ignore + self.mock_cipher_with_deps = None # type: ignore + self.mock_validation_engine = None # type: ignore def test_caesar_encoding(self) -> None: '''Test base encoding.''' @@ -194,22 +204,22 @@ def test_caesar_mock_interactions(self) -> None: shift = 3 # Configure mock encoder - self.mock_encoder.encode.return_value = True - type(self.mock_encoder).encode_data = PropertyMock(return_value=mock_encoded) + self.mock_encoder.encode.return_value = True # type: ignore + type(self.mock_encoder).encode_data = PropertyMock(return_value=mock_encoded) # type: ignore # Configure mock decoder - self.mock_decoder.decode.return_value = True - type(self.mock_decoder).decode_data = PropertyMock(return_value=mock_decoded) + self.mock_decoder.decode.return_value = True # type: ignore + type(self.mock_decoder).decode_data = PropertyMock(return_value=mock_decoded) # type: ignore # Test encode interaction self.assertTrue(self.mock_cipher_with_deps.encode(test_data, shift)) self.assertEqual(mock_encoded, self.mock_cipher_with_deps.encode_data) - self.mock_encoder.encode.assert_called_once_with(test_data, shift) + self.mock_encoder.encode.assert_called_once_with(test_data, shift) # type: ignore # Test decode interaction self.assertTrue(self.mock_cipher_with_deps.decode(mock_encoded, shift)) self.assertEqual(mock_decoded, self.mock_cipher_with_deps.decode_data) - self.mock_decoder.decode.assert_called_once_with(mock_encoded, shift) + self.mock_decoder.decode.assert_called_once_with(mock_encoded, shift) # type: ignore if __name__ == '__main__': diff --git a/tests/codecipher_coverage.json b/tests/codecipher_coverage.json index 4c83447..415f331 100644 --- a/tests/codecipher_coverage.json +++ b/tests/codecipher_coverage.json @@ -1 +1 @@ -{"meta": {"format": 3, "version": "7.6.10", "timestamp": "2025-11-05T04:57:55.789623", "branch_coverage": false, "show_contexts": false}, "files": {"/data/dev/python/codecipher/github/codecipher/codecipher/__init__.py": {"executed_lines": [3], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [3], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [3], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/__init__.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56, 62], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31], "functions": {"A1z52N62.__init__": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"A1z52N62": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/decode.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 62, 64, 65, 77, 86, 87, 88, 89, 90, 91, 92, 94, 96, 98, 99], "summary": {"covered_lines": 30, "num_statements": 32, "percent_covered": 93.75, "percent_covered_display": "94", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": [], "functions": {"A1z52N62Decoder.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "A1z52N62Decoder.decode": {"executed_lines": [86, 87, 88, 89, 90, 91, 92, 94, 96, 98, 99], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"A1z52N62Decoder": {"executed_lines": [62, 86, 87, 88, 89, 90, 91, 92, 94, 96, 98, 99], "summary": {"covered_lines": 12, "num_statements": 14, "percent_covered": 85.71428571428571, "percent_covered_display": "86", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/encode.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 62, 64, 65, 77, 86, 87, 88, 89, 90, 91, 93, 95, 96, 98, 99], "summary": {"covered_lines": 30, "num_statements": 32, "percent_covered": 93.75, "percent_covered_display": "94", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": [], "functions": {"A1z52N62Encoder.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "A1z52N62Encoder.encode": {"executed_lines": [86, 87, 88, 89, 90, 91, 93, 95, 96, 98, 99], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"A1z52N62Encoder": {"executed_lines": [62, 86, 87, 88, 89, 90, 91, 93, 95, 96, 98, 99], "summary": {"covered_lines": 12, "num_statements": 14, "percent_covered": 85.71428571428571, "percent_covered_display": "86", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/atbs/__init__.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56, 62], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31], "functions": {"ATBS.__init__": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"ATBS": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/atbs/decode.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 58, 60, 61, 69, 71, 72, 84, 93, 94, 95, 96, 97], "summary": {"covered_lines": 27, "num_statements": 29, "percent_covered": 93.10344827586206, "percent_covered_display": "93", "missing_lines": 2, "excluded_lines": 2}, "missing_lines": [81, 82], "excluded_lines": [29, 31], "functions": {"ATBSDecode.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [81, 82], "excluded_lines": []}, "ATBSDecode.decode": {"executed_lines": [93, 94, 95, 96, 97], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 58, 60, 61, 71, 72, 84], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"ATBSDecode": {"executed_lines": [69, 93, 94, 95, 96, 97], "summary": {"covered_lines": 6, "num_statements": 8, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [81, 82], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 58, 60, 61, 71, 72, 84], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/atbs/encode.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 58, 60, 61, 69, 71, 72, 84, 93, 94, 95, 96, 97], "summary": {"covered_lines": 27, "num_statements": 29, "percent_covered": 93.10344827586206, "percent_covered_display": "93", "missing_lines": 2, "excluded_lines": 2}, "missing_lines": [81, 82], "excluded_lines": [29, 31], "functions": {"ATBSEncode.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [81, 82], "excluded_lines": []}, "ATBSEncode.encode": {"executed_lines": [93, 94, 95, 96, 97], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 58, 60, 61, 71, 72, 84], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"ATBSEncode": {"executed_lines": [69, 93, 94, 95, 96, 97], "summary": {"covered_lines": 6, "num_statements": 8, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [81, 82], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 58, 60, 61, 71, 72, 84], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/atbs/lookup_table.py": {"executed_lines": [3, 22, 24, 25, 26, 27, 28, 29, 30, 31, 33], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [3, 22, 24, 25, 26, 27, 28, 29, 30, 31, 33], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [3, 22, 24, 25, 26, 27, 28, 29, 30, 31, 33], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/b64/__init__.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56, 62], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31], "functions": {"B64.__init__": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"B64": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/b64/decode.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 63, 65, 66, 78, 87, 88], "summary": {"covered_lines": 22, "num_statements": 24, "percent_covered": 91.66666666666667, "percent_covered_display": "92", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": [], "functions": {"B64Decode.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": []}, "B64Decode.decode": {"executed_lines": [87, 88], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 65, 66, 78], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"B64Decode": {"executed_lines": [63, 87, 88], "summary": {"covered_lines": 3, "num_statements": 5, "percent_covered": 60.0, "percent_covered_display": "60", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 65, 66, 78], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/b64/encode.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 63, 65, 66, 78, 87, 88], "summary": {"covered_lines": 22, "num_statements": 24, "percent_covered": 91.66666666666667, "percent_covered_display": "92", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": [], "functions": {"B64Encode.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": []}, "B64Encode.encode": {"executed_lines": [87, 88], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 65, 66, 78], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"B64Encode": {"executed_lines": [63, 87, 88], "summary": {"covered_lines": 3, "num_statements": 5, "percent_covered": 60.0, "percent_covered_display": "60", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 65, 66, 78], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/caesar/__init__.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56, 62], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31], "functions": {"Caesar.__init__": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"Caesar": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/caesar/decode.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 62, 64, 65, 77, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110], "summary": {"covered_lines": 39, "num_statements": 41, "percent_covered": 95.1219512195122, "percent_covered_display": "95", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": [], "functions": {"CaesarDecode.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "CaesarDecode.decode": {"executed_lines": [90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110], "summary": {"covered_lines": 20, "num_statements": 20, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"CaesarDecode": {"executed_lines": [62, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110], "summary": {"covered_lines": 21, "num_statements": 23, "percent_covered": 91.30434782608695, "percent_covered_display": "91", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/caesar/encode.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 62, 64, 65, 77, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110], "summary": {"covered_lines": 39, "num_statements": 41, "percent_covered": 95.1219512195122, "percent_covered_display": "95", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": [], "functions": {"CaesarEncode.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "CaesarEncode.encode": {"executed_lines": [90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110], "summary": {"covered_lines": 20, "num_statements": 20, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"CaesarEncode": {"executed_lines": [62, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110], "summary": {"covered_lines": 21, "num_statements": 23, "percent_covered": 91.30434782608695, "percent_covered_display": "91", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vernam/__init__.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56, 62], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31], "functions": {"Vernam.__init__": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"Vernam": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vernam/decode.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 62, 64, 65, 77, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 101, 103, 104], "summary": {"covered_lines": 34, "num_statements": 36, "percent_covered": 94.44444444444444, "percent_covered_display": "94", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": [], "functions": {"VernamDecode.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "VernamDecode.decode": {"executed_lines": [88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 101, 103, 104], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"VernamDecode": {"executed_lines": [62, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 101, 103, 104], "summary": {"covered_lines": 16, "num_statements": 18, "percent_covered": 88.88888888888889, "percent_covered_display": "89", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vernam/encode.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 62, 64, 65, 77, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 101, 103, 104], "summary": {"covered_lines": 34, "num_statements": 36, "percent_covered": 94.44444444444444, "percent_covered_display": "94", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": [], "functions": {"VernamEncode.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "VernamEncode.encode": {"executed_lines": [88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 101, 103, 104], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"VernamEncode": {"executed_lines": [62, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 101, 103, 104], "summary": {"covered_lines": 16, "num_statements": 18, "percent_covered": 88.88888888888889, "percent_covered_display": "89", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/__init__.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 57, 63], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [30, 32], "functions": {"Vigenere.__init__": {"executed_lines": [63], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 57], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [30, 32]}}, "classes": {"Vigenere": {"executed_lines": [63], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 57], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [30, 32]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/decode.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 59, 61, 62, 70, 72, 73, 85, 99, 100, 101, 102, 103, 105, 118, 119, 120, 121, 122, 126, 129], "summary": {"covered_lines": 35, "num_statements": 37, "percent_covered": 94.5945945945946, "percent_covered_display": "95", "missing_lines": 2, "excluded_lines": 2}, "missing_lines": [82, 83], "excluded_lines": [29, 31], "functions": {"VigenereDecode.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [82, 83], "excluded_lines": []}, "VigenereDecode._split_data_decode": {"executed_lines": [99, 100, 101, 102, 103], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "VigenereDecode.decode": {"executed_lines": [118, 119, 120, 121, 122, 126, 129], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 59, 61, 62, 72, 73, 85, 105], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"VigenereDecode": {"executed_lines": [70, 99, 100, 101, 102, 103, 118, 119, 120, 121, 122, 126, 129], "summary": {"covered_lines": 13, "num_statements": 15, "percent_covered": 86.66666666666667, "percent_covered_display": "87", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [82, 83], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 59, 61, 62, 72, 73, 85, 105], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/encode.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 59, 61, 62, 70, 72, 73, 85, 99, 100, 101, 102, 103, 105, 118, 119, 120, 121, 122, 126, 129], "summary": {"covered_lines": 35, "num_statements": 37, "percent_covered": 94.5945945945946, "percent_covered_display": "95", "missing_lines": 2, "excluded_lines": 2}, "missing_lines": [82, 83], "excluded_lines": [29, 31], "functions": {"VigenereEncode.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [82, 83], "excluded_lines": []}, "VigenereEncode._split_data_encode": {"executed_lines": [99, 100, 101, 102, 103], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "VigenereEncode.encode": {"executed_lines": [118, 119, 120, 121, 122, 126, 129], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 59, 61, 62, 72, 73, 85, 105], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"VigenereEncode": {"executed_lines": [70, 99, 100, 101, 102, 103, 118, 119, 120, 121, 122, 126, 129], "summary": {"covered_lines": 13, "num_statements": 15, "percent_covered": 86.66666666666667, "percent_covered_display": "87", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [82, 83], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 59, 61, 62, 72, 73, 85, 105], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/key_generator.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 53, 54, 56, 57, 67, 68, 77, 78, 80, 81, 89, 91, 92, 101, 102, 104, 111, 112, 113, 114, 117, 118, 119], "summary": {"covered_lines": 35, "num_statements": 37, "percent_covered": 94.5945945945946, "percent_covered_display": "95", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [65, 115], "excluded_lines": [], "functions": {"KeyGenerator.data_len": {"executed_lines": [77, 78], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "KeyGenerator.key": {"executed_lines": [101, 102], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "KeyGenerator.generate_key": {"executed_lines": [111, 112, 113, 114, 117, 118, 119], "summary": {"covered_lines": 7, "num_statements": 8, "percent_covered": 87.5, "percent_covered_display": "88", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [115], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 53, 54, 56, 57, 67, 68, 80, 81, 91, 92, 104], "summary": {"covered_lines": 23, "num_statements": 23, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"KeyGenerator": {"executed_lines": [77, 78, 89, 101, 102, 111, 112, 113, 114, 117, 118, 119], "summary": {"covered_lines": 12, "num_statements": 14, "percent_covered": 85.71428571428571, "percent_covered_display": "86", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [65, 115], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 53, 54, 56, 57, 67, 68, 80, 81, 91, 92, 104], "summary": {"covered_lines": 23, "num_statements": 23, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/lookup_table.py": {"executed_lines": [3, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 53, 54, 55, 56, 57, 58], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [3, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 53, 54, 55, 56, 57, 58], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"LookUpTable": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 53, 54, 55, 56, 57, 58], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}}, "totals": {"covered_lines": 532, "num_statements": 558, "percent_covered": 95.3405017921147, "percent_covered_display": "95", "missing_lines": 26, "excluded_lines": 20}} \ No newline at end of file +{"meta": {"format": 3, "version": "7.6.10", "timestamp": "2026-06-10T16:28:20.810530", "branch_coverage": false, "show_contexts": false}, "files": {"/data/dev/python/codecipher/github/codecipher/codecipher/__init__.py": {"executed_lines": [3, 22, 24, 25, 26, 27, 28, 29, 30, 31], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [3, 22, 24, 25, 26, 27, 28, 29, 30, 31], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [3, 22, 24, 25, 26, 27, 28, 29, 30, 31], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/__init__.py": {"executed_lines": [3, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 43], "summary": {"covered_lines": 20, "num_statements": 20, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [3, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 43], "summary": {"covered_lines": 20, "num_statements": 20, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [3, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 43], "summary": {"covered_lines": 20, "num_statements": 20, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/a1z52n62.py": {"executed_lines": [3, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 63, 83, 84, 85, 86, 88, 98, 99, 100, 102, 103, 111, 113, 123, 124, 126, 128, 129, 137], "summary": {"covered_lines": 37, "num_statements": 37, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"A1z52N62.__init__": {"executed_lines": [83, 84, 85, 86], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "A1z52N62.encode": {"executed_lines": [98, 99, 100], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "A1z52N62.encode_data": {"executed_lines": [111], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "A1z52N62.decode": {"executed_lines": [123, 124, 126], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "A1z52N62.decode_data": {"executed_lines": [137], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 63, 88, 102, 103, 113, 128, 129], "summary": {"covered_lines": 25, "num_statements": 25, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"A1z52N62": {"executed_lines": [83, 84, 85, 86, 98, 99, 100, 111, 123, 124, 126, 137], "summary": {"covered_lines": 12, "num_statements": 12, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 63, 88, 102, 103, 113, 128, 129], "summary": {"covered_lines": 25, "num_statements": 25, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/a1z52n62_config.py": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 37, 48, 49, 50, 51, 52, 53], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 37, 48, 49, 50, 51, 52, 53], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"A1z52N62Config": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 37, 48, 49, 50, 51, 52, 53], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/decoder.py": {"executed_lines": [3, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 38, 39, 40, 54, 55, 57, 58, 68, 69, 81], "summary": {"covered_lines": 21, "num_statements": 40, "percent_covered": 52.5, "percent_covered_display": "52", "missing_lines": 19, "excluded_lines": 0}, "missing_lines": [66, 78, 79, 91, 93, 94, 96, 97, 98, 99, 100, 101, 102, 106, 110, 112, 113, 114, 116], "excluded_lines": [], "functions": {"A1z52N62Decoder.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [78, 79], "excluded_lines": []}, "A1z52N62Decoder.decode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 16, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 16, "excluded_lines": 0}, "missing_lines": [91, 93, 94, 96, 97, 98, 99, 100, 101, 102, 106, 110, 112, 113, 114, 116], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 38, 39, 40, 54, 55, 57, 58, 68, 69, 81], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"A1z52N62Decoder": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 19, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 19, "excluded_lines": 0}, "missing_lines": [66, 78, 79, 91, 93, 94, 96, 97, 98, 99, 100, 101, 102, 106, 110, 112, 113, 114, 116], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 38, 39, 40, 54, 55, 57, 58, 68, 69, 81], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/default_character_validator.py": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 50, 56, 58], "summary": {"covered_lines": 15, "num_statements": 18, "percent_covered": 83.33333333333333, "percent_covered_display": "83", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [68, 69, 71], "excluded_lines": [], "functions": {"DefaultA1Z52N62CharacterValidator.__init__": {"executed_lines": [56], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultA1Z52N62CharacterValidator.is_valid_char": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 3, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [68, 69, 71], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 50, 58], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"DefaultA1Z52N62CharacterValidator": {"executed_lines": [56], "summary": {"covered_lines": 1, "num_statements": 4, "percent_covered": 25.0, "percent_covered_display": "25", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [68, 69, 71], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 50, 58], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/default_data_validator.py": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 50, 58, 60], "summary": {"covered_lines": 15, "num_statements": 18, "percent_covered": 83.33333333333333, "percent_covered_display": "83", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [70, 71, 73], "excluded_lines": [], "functions": {"DefaultA1Z52N62DataValidator.__init__": {"executed_lines": [58], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultA1Z52N62DataValidator.is_valid": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 3, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [70, 71, 73], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 50, 60], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"DefaultA1Z52N62DataValidator": {"executed_lines": [58], "summary": {"covered_lines": 1, "num_statements": 4, "percent_covered": 25.0, "percent_covered_display": "25", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [70, 71, 73], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 50, 60], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/default_validation_engine.py": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 51, 59, 61, 73], "summary": {"covered_lines": 16, "num_statements": 23, "percent_covered": 69.56521739130434, "percent_covered_display": "70", "missing_lines": 7, "excluded_lines": 0}, "missing_lines": [70, 71, 83, 84, 86, 87, 89], "excluded_lines": [], "functions": {"DefaultA1Z52N62ValidationEngine.__init__": {"executed_lines": [59], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultA1Z52N62ValidationEngine.add_validator": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [70, 71], "excluded_lines": []}, "DefaultA1Z52N62ValidationEngine.is_valid": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 5, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 5, "excluded_lines": 0}, "missing_lines": [83, 84, 86, 87, 89], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 51, 61, 73], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"DefaultA1Z52N62ValidationEngine": {"executed_lines": [59], "summary": {"covered_lines": 1, "num_statements": 8, "percent_covered": 12.5, "percent_covered_display": "12", "missing_lines": 7, "excluded_lines": 0}, "missing_lines": [70, 71, 83, 84, 86, 87, 89], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 51, 61, 73], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/encoder.py": {"executed_lines": [3, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 38, 39, 40, 54, 55, 57, 58, 68, 69, 81], "summary": {"covered_lines": 21, "num_statements": 39, "percent_covered": 53.84615384615385, "percent_covered_display": "54", "missing_lines": 18, "excluded_lines": 0}, "missing_lines": [66, 78, 79, 91, 93, 94, 96, 97, 98, 99, 100, 104, 110, 111, 115, 116, 117, 119], "excluded_lines": [], "functions": {"A1z52N62Encoder.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [78, 79], "excluded_lines": []}, "A1z52N62Encoder.encode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 15, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 15, "excluded_lines": 0}, "missing_lines": [91, 93, 94, 96, 97, 98, 99, 100, 104, 110, 111, 115, 116, 117, 119], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 38, 39, 40, 54, 55, 57, 58, 68, 69, 81], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"A1z52N62Encoder": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 18, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 18, "excluded_lines": 0}, "missing_lines": [66, 78, 79, 91, 93, 94, 96, 97, 98, 99, 100, 104, 110, 111, 115, 116, 117, 119], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 38, 39, 40, 54, 55, 57, 58, 68, 69, 81], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/ia1z52n62.py": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 49, 50, 62, 63, 64, 74, 75, 87, 88, 89], "summary": {"covered_lines": 21, "num_statements": 25, "percent_covered": 84.0, "percent_covered_display": "84", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [60, 72, 85, 97], "excluded_lines": [], "functions": {"IA1z52N62.encode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [60], "excluded_lines": []}, "IA1z52N62.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [72], "excluded_lines": []}, "IA1z52N62.decode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [85], "excluded_lines": []}, "IA1z52N62.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [97], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 49, 50, 62, 63, 64, 74, 75, 87, 88, 89], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"IA1z52N62": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 4, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [60, 72, 85, 97], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 49, 50, 62, 63, 64, 74, 75, 87, 88, 89], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/idecoder.py": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 46, 47, 48, 58, 59, 60, 71, 72], "summary": {"covered_lines": 19, "num_statements": 22, "percent_covered": 86.36363636363636, "percent_covered_display": "86", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [56, 69, 82], "excluded_lines": [], "functions": {"IA1z52N62Decoder.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [69], "excluded_lines": []}, "IA1z52N62Decoder.decode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [82], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 46, 47, 48, 58, 59, 60, 71, 72], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"IA1z52N62Decoder": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 3, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [56, 69, 82], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 46, 47, 48, 58, 59, 60, 71, 72], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/iencoder.py": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 46, 47, 48, 58, 59, 60, 71, 72], "summary": {"covered_lines": 19, "num_statements": 22, "percent_covered": 86.36363636363636, "percent_covered_display": "86", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [56, 69, 82], "excluded_lines": [], "functions": {"IA1z52N62Encoder.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [69], "excluded_lines": []}, "IA1z52N62Encoder.encode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [82], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 46, 47, 48, 58, 59, 60, 71, 72], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"IA1z52N62Encoder": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 3, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [56, 69, 82], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 46, 47, 48, 58, 59, 60, 71, 72], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/abstracts/__init__.py": {"executed_lines": [4, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 37], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [4, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 37], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [4, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 37], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/abstracts/icharacter_validator.py": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 46, 47], "summary": {"covered_lines": 13, "num_statements": 14, "percent_covered": 92.85714285714286, "percent_covered_display": "93", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [57], "excluded_lines": [], "functions": {"ICharacterValidator.is_valid_char": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [57], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 46, 47], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"ICharacterValidator": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [57], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 46, 47], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/abstracts/idata_validator.py": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 46, 47], "summary": {"covered_lines": 13, "num_statements": 14, "percent_covered": 92.85714285714286, "percent_covered_display": "93", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [57], "excluded_lines": [], "functions": {"IDataValidator.is_valid": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [57], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 46, 47], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"IDataValidator": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [57], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 46, 47], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/abstracts/ivalidation_engine.py": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 48, 49, 60, 61], "summary": {"covered_lines": 16, "num_statements": 18, "percent_covered": 88.88888888888889, "percent_covered_display": "89", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [58, 71], "excluded_lines": [], "functions": {"IValidationEngine.add_validator": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [58], "excluded_lines": []}, "IValidationEngine.is_valid": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [71], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 48, 49, 60, 61], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"IValidationEngine": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [58, 71], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 48, 49, 60, 61], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/atbs/__init__.py": {"executed_lines": [3, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 42], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [3, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 42], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [3, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 42], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/atbs/atbs.py": {"executed_lines": [3, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 35, 36, 37, 38, 39, 42, 43, 62, 81, 82, 83, 85, 89, 90, 91, 93, 94, 98, 100, 104, 105, 107, 109, 110, 114], "summary": {"covered_lines": 35, "num_statements": 35, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"ATBS.__init__": {"executed_lines": [81, 82, 83], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ATBS.encode": {"executed_lines": [89, 90, 91], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ATBS.encode_data": {"executed_lines": [98], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ATBS.decode": {"executed_lines": [104, 105, 107], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ATBS.decode_data": {"executed_lines": [114], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 35, 36, 37, 38, 39, 42, 43, 62, 85, 93, 94, 100, 109, 110], "summary": {"covered_lines": 24, "num_statements": 24, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"ATBS": {"executed_lines": [81, 82, 83, 89, 90, 91, 98, 104, 105, 107, 114], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 35, 36, 37, 38, 39, 42, 43, 62, 85, 93, 94, 100, 109, 110], "summary": {"covered_lines": 24, "num_statements": 24, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/atbs/decoder.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 52, 58, 60, 61, 71, 72, 84], "summary": {"covered_lines": 19, "num_statements": 29, "percent_covered": 65.51724137931035, "percent_covered_display": "66", "missing_lines": 10, "excluded_lines": 0}, "missing_lines": [69, 81, 82, 93, 94, 95, 96, 97, 98, 99], "excluded_lines": [], "functions": {"ATBSDecoder.__init__": {"executed_lines": [58], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ATBSDecoder.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [81, 82], "excluded_lines": []}, "ATBSDecoder.decode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 7, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 7, "excluded_lines": 0}, "missing_lines": [93, 94, 95, 96, 97, 98, 99], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 52, 60, 61, 71, 72, 84], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"ATBSDecoder": {"executed_lines": [58], "summary": {"covered_lines": 1, "num_statements": 11, "percent_covered": 9.090909090909092, "percent_covered_display": "9", "missing_lines": 10, "excluded_lines": 0}, "missing_lines": [69, 81, 82, 93, 94, 95, 96, 97, 98, 99], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 52, 60, 61, 71, 72, 84], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/atbs/default_character_validator.py": {"executed_lines": [3, 22, 23, 24, 27, 28, 41, 45, 47], "summary": {"covered_lines": 7, "num_statements": 10, "percent_covered": 70.0, "percent_covered_display": "70", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [56, 57, 59], "excluded_lines": [], "functions": {"DefaultATBSCharacterValidator.__init__": {"executed_lines": [45], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultATBSCharacterValidator.is_valid_char": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 3, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [56, 57, 59], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 27, 28, 41, 47], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"DefaultATBSCharacterValidator": {"executed_lines": [45], "summary": {"covered_lines": 1, "num_statements": 4, "percent_covered": 25.0, "percent_covered_display": "25", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [56, 57, 59], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 27, 28, 41, 47], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/atbs/default_data_validator.py": {"executed_lines": [3, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 51, 59, 61], "summary": {"covered_lines": 16, "num_statements": 19, "percent_covered": 84.21052631578948, "percent_covered_display": "84", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [71, 72, 74], "excluded_lines": [], "functions": {"DefaultATBSDataValidator.__init__": {"executed_lines": [59], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultATBSDataValidator.is_valid": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 3, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [71, 72, 74], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 51, 61], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"DefaultATBSDataValidator": {"executed_lines": [59], "summary": {"covered_lines": 1, "num_statements": 4, "percent_covered": 25.0, "percent_covered_display": "25", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [71, 72, 74], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 51, 61], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/atbs/default_validation_engine.py": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 51, 59, 61, 73], "summary": {"covered_lines": 16, "num_statements": 23, "percent_covered": 69.56521739130434, "percent_covered_display": "70", "missing_lines": 7, "excluded_lines": 0}, "missing_lines": [70, 71, 83, 84, 86, 87, 89], "excluded_lines": [], "functions": {"DefaultATBSValidationEngine.__init__": {"executed_lines": [59], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultATBSValidationEngine.add_validator": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [70, 71], "excluded_lines": []}, "DefaultATBSValidationEngine.is_valid": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 5, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 5, "excluded_lines": 0}, "missing_lines": [83, 84, 86, 87, 89], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 51, 61, 73], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"DefaultATBSValidationEngine": {"executed_lines": [59], "summary": {"covered_lines": 1, "num_statements": 8, "percent_covered": 12.5, "percent_covered_display": "12", "missing_lines": 7, "excluded_lines": 0}, "missing_lines": [70, 71, 83, 84, 86, 87, 89], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 51, 61, 73], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/atbs/encoder.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 52, 58, 60, 61, 71, 72, 84], "summary": {"covered_lines": 19, "num_statements": 29, "percent_covered": 65.51724137931035, "percent_covered_display": "66", "missing_lines": 10, "excluded_lines": 0}, "missing_lines": [69, 81, 82, 93, 94, 95, 96, 97, 98, 99], "excluded_lines": [], "functions": {"ATBSEncoder.__init__": {"executed_lines": [58], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ATBSEncoder.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [81, 82], "excluded_lines": []}, "ATBSEncoder.encode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 7, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 7, "excluded_lines": 0}, "missing_lines": [93, 94, 95, 96, 97, 98, 99], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 52, 60, 61, 71, 72, 84], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"ATBSEncoder": {"executed_lines": [58], "summary": {"covered_lines": 1, "num_statements": 11, "percent_covered": 9.090909090909092, "percent_covered_display": "9", "missing_lines": 10, "excluded_lines": 0}, "missing_lines": [69, 81, 82, 93, 94, 95, 96, 97, 98, 99], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 52, 60, 61, 71, 72, 84], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/atbs/iatbs.py": {"executed_lines": [3, 22, 23, 25, 26, 39, 40, 52, 53, 54, 63, 64, 76, 77, 78], "summary": {"covered_lines": 13, "num_statements": 17, "percent_covered": 76.47058823529412, "percent_covered_display": "76", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [50, 61, 74, 85], "excluded_lines": [], "functions": {"IATBS.encode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [50], "excluded_lines": []}, "IATBS.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [61], "excluded_lines": []}, "IATBS.decode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [74], "excluded_lines": []}, "IATBS.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [85], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 39, 40, 52, 53, 54, 63, 64, 76, 77, 78], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"IATBS": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 4, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [50, 61, 74, 85], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 39, 40, 52, 53, 54, 63, 64, 76, 77, 78], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/atbs/idecoder.py": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 47, 48, 49, 59, 60], "summary": {"covered_lines": 16, "num_statements": 18, "percent_covered": 88.88888888888889, "percent_covered_display": "89", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [57, 70], "excluded_lines": [], "functions": {"IATBSDecoder.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [57], "excluded_lines": []}, "IATBSDecoder.decode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [70], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 47, 48, 49, 59, 60], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"IATBSDecoder": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [57, 70], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 47, 48, 49, 59, 60], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/atbs/iencoder.py": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 47, 48, 49, 59, 60], "summary": {"covered_lines": 16, "num_statements": 18, "percent_covered": 88.88888888888889, "percent_covered_display": "89", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [57, 70], "excluded_lines": [], "functions": {"IATBSEncoder.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [57], "excluded_lines": []}, "IATBSEncoder.encode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [70], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 47, 48, 49, 59, 60], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"IATBSEncoder": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [57, 70], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 47, 48, 49, 59, 60], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/atbs/lookup_table.py": {"executed_lines": [3, 22, 24, 25, 26, 27, 28, 29, 30, 31, 33], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [3, 22, 24, 25, 26, 27, 28, 29, 30, 31, 33], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [3, 22, 24, 25, 26, 27, 28, 29, 30, 31, 33], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/b64/__init__.py": {"executed_lines": [3, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 43], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [3, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 43], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [3, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 43], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/b64/b64.py": {"executed_lines": [3, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 35, 36, 37, 38, 39, 42, 43, 61, 78, 79, 80, 82, 94, 95, 96, 98, 99, 103, 105, 109, 110, 111, 113, 114, 118], "summary": {"covered_lines": 35, "num_statements": 35, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"B64.__init__": {"executed_lines": [78, 79, 80], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "B64.encode": {"executed_lines": [94, 95, 96], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "B64.encode_data": {"executed_lines": [103], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "B64.decode": {"executed_lines": [109, 110, 111], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "B64.decode_data": {"executed_lines": [118], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 35, 36, 37, 38, 39, 42, 43, 61, 82, 98, 99, 105, 113, 114], "summary": {"covered_lines": 24, "num_statements": 24, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"B64": {"executed_lines": [78, 79, 80, 94, 95, 96, 103, 109, 110, 111, 118], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 35, 36, 37, 38, 39, 42, 43, 61, 82, 98, 99, 105, 113, 114], "summary": {"covered_lines": 24, "num_statements": 24, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/b64/b64decoder.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 52, 56, 58, 59, 67, 69, 70, 82, 92, 93, 94], "summary": {"covered_lines": 23, "num_statements": 26, "percent_covered": 88.46153846153847, "percent_covered_display": "88", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [79, 80, 95], "excluded_lines": [], "functions": {"B64Decoder.__init__": {"executed_lines": [56], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "B64Decoder.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [79, 80], "excluded_lines": []}, "B64Decoder.decode": {"executed_lines": [92, 93, 94], "summary": {"covered_lines": 3, "num_statements": 4, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [95], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 52, 58, 59, 69, 70, 82], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"B64Decoder": {"executed_lines": [56, 67, 92, 93, 94], "summary": {"covered_lines": 5, "num_statements": 8, "percent_covered": 62.5, "percent_covered_display": "62", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [79, 80, 95], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 52, 58, 59, 69, 70, 82], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/b64/b64encoder.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 52, 56, 58, 59, 67, 69, 70, 82, 92, 93, 94], "summary": {"covered_lines": 23, "num_statements": 26, "percent_covered": 88.46153846153847, "percent_covered_display": "88", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [79, 80, 95], "excluded_lines": [], "functions": {"B64Encoder.__init__": {"executed_lines": [56], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "B64Encoder.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [79, 80], "excluded_lines": []}, "B64Encoder.encode": {"executed_lines": [92, 93, 94], "summary": {"covered_lines": 3, "num_statements": 4, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [95], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 52, 58, 59, 69, 70, 82], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"B64Encoder": {"executed_lines": [56, 67, 92, 93, 94], "summary": {"covered_lines": 5, "num_statements": 8, "percent_covered": 62.5, "percent_covered_display": "62", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [79, 80, 95], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 52, 58, 59, 69, 70, 82], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/b64/default_character_validator.py": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 50, 54, 56, 65, 68], "summary": {"covered_lines": 17, "num_statements": 18, "percent_covered": 94.44444444444444, "percent_covered_display": "94", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [66], "excluded_lines": [], "functions": {"DefaultB64CharacterValidator.__init__": {"executed_lines": [54], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultB64CharacterValidator.is_valid_char": {"executed_lines": [65, 68], "summary": {"covered_lines": 2, "num_statements": 3, "percent_covered": 66.66666666666667, "percent_covered_display": "67", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [66], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 50, 56], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"DefaultB64CharacterValidator": {"executed_lines": [54, 65, 68], "summary": {"covered_lines": 3, "num_statements": 4, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [66], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 50, 56], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/b64/default_data_validator.py": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 50, 58, 60, 70, 73], "summary": {"covered_lines": 17, "num_statements": 18, "percent_covered": 94.44444444444444, "percent_covered_display": "94", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [71], "excluded_lines": [], "functions": {"DefaultB64DataValidator.__init__": {"executed_lines": [58], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultB64DataValidator.is_valid": {"executed_lines": [70, 73], "summary": {"covered_lines": 2, "num_statements": 3, "percent_covered": 66.66666666666667, "percent_covered_display": "67", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [71], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 50, 60], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"DefaultB64DataValidator": {"executed_lines": [58, 70, 73], "summary": {"covered_lines": 3, "num_statements": 4, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [71], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 50, 60], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/b64/default_validation_engine.py": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 51, 59, 61, 73, 83, 86, 89], "summary": {"covered_lines": 19, "num_statements": 23, "percent_covered": 82.6086956521739, "percent_covered_display": "83", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [70, 71, 84, 87], "excluded_lines": [], "functions": {"DefaultB64ValidationEngine.__init__": {"executed_lines": [59], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultB64ValidationEngine.add_validator": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [70, 71], "excluded_lines": []}, "DefaultB64ValidationEngine.is_valid": {"executed_lines": [83, 86, 89], "summary": {"covered_lines": 3, "num_statements": 5, "percent_covered": 60.0, "percent_covered_display": "60", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [84, 87], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 51, 61, 73], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"DefaultB64ValidationEngine": {"executed_lines": [59, 83, 86, 89], "summary": {"covered_lines": 4, "num_statements": 8, "percent_covered": 50.0, "percent_covered_display": "50", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [70, 71, 84, 87], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 51, 61, 73], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/b64/ib64.py": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 49, 50, 62, 63, 64, 73, 74, 86, 87, 88], "summary": {"covered_lines": 21, "num_statements": 25, "percent_covered": 84.0, "percent_covered_display": "84", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [60, 71, 84, 95], "excluded_lines": [], "functions": {"IB64.encode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [60], "excluded_lines": []}, "IB64.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [71], "excluded_lines": []}, "IB64.decode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [84], "excluded_lines": []}, "IB64.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [95], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 49, 50, 62, 63, 64, 73, 74, 86, 87, 88], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"IB64": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 4, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [60, 71, 84, 95], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 49, 50, 62, 63, 64, 73, 74, 86, 87, 88], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/b64/idecoder.py": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 47, 48, 49, 59, 60], "summary": {"covered_lines": 16, "num_statements": 18, "percent_covered": 88.88888888888889, "percent_covered_display": "89", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [57, 70], "excluded_lines": [], "functions": {"IDecoder.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [57], "excluded_lines": []}, "IDecoder.decode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [70], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 47, 48, 49, 59, 60], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"IDecoder": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [57, 70], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 47, 48, 49, 59, 60], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/b64/iencoder.py": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 47, 48, 49, 59, 60], "summary": {"covered_lines": 16, "num_statements": 18, "percent_covered": 88.88888888888889, "percent_covered_display": "89", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [57, 70], "excluded_lines": [], "functions": {"IEncoder.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [57], "excluded_lines": []}, "IEncoder.encode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [70], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 47, 48, 49, 59, 60], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"IEncoder": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [57, 70], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 47, 48, 49, 59, 60], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/caesar/__init__.py": {"executed_lines": [3, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 42], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [3, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 42], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [3, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 42], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/caesar/caesar.py": {"executed_lines": [3, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 35, 36, 37, 38, 39, 42, 43, 60, 77, 78, 79, 81, 93, 94, 95, 97, 98, 106, 108, 120, 121, 122, 124, 125, 133], "summary": {"covered_lines": 35, "num_statements": 35, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"Caesar.__init__": {"executed_lines": [77, 78, 79], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Caesar.encode": {"executed_lines": [93, 94, 95], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Caesar.encode_data": {"executed_lines": [106], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Caesar.decode": {"executed_lines": [120, 121, 122], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Caesar.decode_data": {"executed_lines": [133], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 35, 36, 37, 38, 39, 42, 43, 60, 81, 97, 98, 108, 124, 125], "summary": {"covered_lines": 24, "num_statements": 24, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"Caesar": {"executed_lines": [77, 78, 79, 93, 94, 95, 106, 120, 121, 122, 133], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 35, 36, 37, 38, 39, 42, 43, 60, 81, 97, 98, 108, 124, 125], "summary": {"covered_lines": 24, "num_statements": 24, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/caesar/decoder.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 63, 65, 66, 78, 92, 93, 95, 97, 98, 99, 101, 102, 103, 104, 106, 107, 108, 109, 111, 112, 113, 115, 116, 118, 120, 122], "summary": {"covered_lines": 42, "num_statements": 44, "percent_covered": 95.45454545454545, "percent_covered_display": "95", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": [], "functions": {"CaesarDecoder.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": []}, "CaesarDecoder.decode": {"executed_lines": [92, 93, 95, 97, 98, 99, 101, 102, 103, 104, 106, 107, 108, 109, 111, 112, 113, 115, 116, 118, 120, 122], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 65, 66, 78], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"CaesarDecoder": {"executed_lines": [63, 92, 93, 95, 97, 98, 99, 101, 102, 103, 104, 106, 107, 108, 109, 111, 112, 113, 115, 116, 118, 120, 122], "summary": {"covered_lines": 23, "num_statements": 25, "percent_covered": 92.0, "percent_covered_display": "92", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 65, 66, 78], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/caesar/default_character_validator.py": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 50, 56], "summary": {"covered_lines": 14, "num_statements": 18, "percent_covered": 77.77777777777777, "percent_covered_display": "78", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [54, 65, 66, 68], "excluded_lines": [], "functions": {"DefaultCaesarCharacterValidator.__init__": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [54], "excluded_lines": []}, "DefaultCaesarCharacterValidator.is_valid_char": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 3, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [65, 66, 68], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 50, 56], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"DefaultCaesarCharacterValidator": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 4, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [54, 65, 66, 68], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 50, 56], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/caesar/default_data_validator.py": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 50, 60], "summary": {"covered_lines": 14, "num_statements": 18, "percent_covered": 77.77777777777777, "percent_covered_display": "78", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [58, 70, 71, 73], "excluded_lines": [], "functions": {"DefaultCaesarDataValidator.__init__": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [58], "excluded_lines": []}, "DefaultCaesarDataValidator.is_valid": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 3, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [70, 71, 73], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 50, 60], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"DefaultCaesarDataValidator": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 4, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [58, 70, 71, 73], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 50, 60], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/caesar/default_validation_engine.py": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 51, 61, 73], "summary": {"covered_lines": 15, "num_statements": 23, "percent_covered": 65.21739130434783, "percent_covered_display": "65", "missing_lines": 8, "excluded_lines": 0}, "missing_lines": [59, 70, 71, 83, 84, 86, 87, 89], "excluded_lines": [], "functions": {"DefaultCaesarValidationEngine.__init__": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [59], "excluded_lines": []}, "DefaultCaesarValidationEngine.add_validator": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [70, 71], "excluded_lines": []}, "DefaultCaesarValidationEngine.is_valid": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 5, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 5, "excluded_lines": 0}, "missing_lines": [83, 84, 86, 87, 89], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 51, 61, 73], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"DefaultCaesarValidationEngine": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 8, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 8, "excluded_lines": 0}, "missing_lines": [59, 70, 71, 83, 84, 86, 87, 89], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 51, 61, 73], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/caesar/encoder.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 63, 65, 66, 78, 92, 93, 95, 97, 98, 99, 101, 102, 103, 104, 106, 107, 108, 109, 111, 112, 113, 115, 116, 118, 120, 122], "summary": {"covered_lines": 42, "num_statements": 44, "percent_covered": 95.45454545454545, "percent_covered_display": "95", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": [], "functions": {"CaesarEncoder.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": []}, "CaesarEncoder.encode": {"executed_lines": [92, 93, 95, 97, 98, 99, 101, 102, 103, 104, 106, 107, 108, 109, 111, 112, 113, 115, 116, 118, 120, 122], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 65, 66, 78], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"CaesarEncoder": {"executed_lines": [63, 92, 93, 95, 97, 98, 99, 101, 102, 103, 104, 106, 107, 108, 109, 111, 112, 113, 115, 116, 118, 120, 122], "summary": {"covered_lines": 23, "num_statements": 25, "percent_covered": 92.0, "percent_covered_display": "92", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 65, 66, 78], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/caesar/icaesar.py": {"executed_lines": [3, 23, 24, 26, 27, 41, 42, 56, 57, 58, 68, 69, 83, 84, 85], "summary": {"covered_lines": 13, "num_statements": 17, "percent_covered": 76.47058823529412, "percent_covered_display": "76", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [54, 66, 81, 93], "excluded_lines": [], "functions": {"ICaesar.encode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [54], "excluded_lines": []}, "ICaesar.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [66], "excluded_lines": []}, "ICaesar.decode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [81], "excluded_lines": []}, "ICaesar.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [93], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 41, 42, 56, 57, 58, 68, 69, 83, 84, 85], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"ICaesar": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 4, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [54, 66, 81, 93], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 41, 42, 56, 57, 58, 68, 69, 83, 84, 85], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/caesar/idecoder.py": {"executed_lines": [3, 23, 24, 26, 27, 39, 40, 41, 51, 52], "summary": {"covered_lines": 8, "num_statements": 10, "percent_covered": 80.0, "percent_covered_display": "80", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [49, 64], "excluded_lines": [], "functions": {"IDecoder.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [49], "excluded_lines": []}, "IDecoder.decode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [64], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 39, 40, 41, 51, 52], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"IDecoder": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [49, 64], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 39, 40, 41, 51, 52], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/caesar/iencoder.py": {"executed_lines": [3, 23, 24, 26, 27, 39, 40, 41, 51, 52], "summary": {"covered_lines": 8, "num_statements": 10, "percent_covered": 80.0, "percent_covered_display": "80", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [49, 64], "excluded_lines": [], "functions": {"IEncoder.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [49], "excluded_lines": []}, "IEncoder.encode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [64], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 39, 40, 41, 51, 52], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"IEncoder": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [49, 64], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 39, 40, 41, 51, 52], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/caesar/lookup_table.py": {"executed_lines": [3, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 48], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [3, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 48], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"LookUpTable": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 48], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vernam/__init__.py": {"executed_lines": [3, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 42], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [3, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 42], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [3, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 42], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vernam/decoder.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 63, 65, 66, 78, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 103, 105, 106, 107, 108], "summary": {"covered_lines": 37, "num_statements": 39, "percent_covered": 94.87179487179488, "percent_covered_display": "95", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": [], "functions": {"VernamDecoder.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": []}, "VernamDecoder.decode": {"executed_lines": [90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 103, 105, 106, 107, 108], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 65, 66, 78], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"VernamDecoder": {"executed_lines": [63, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 103, 105, 106, 107, 108], "summary": {"covered_lines": 18, "num_statements": 20, "percent_covered": 90.0, "percent_covered_display": "90", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 65, 66, 78], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vernam/default_character_validator.py": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 50, 54, 56, 65, 68], "summary": {"covered_lines": 17, "num_statements": 18, "percent_covered": 94.44444444444444, "percent_covered_display": "94", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [66], "excluded_lines": [], "functions": {"DefaultVernamCharacterValidator.__init__": {"executed_lines": [54], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultVernamCharacterValidator.is_valid_char": {"executed_lines": [65, 68], "summary": {"covered_lines": 2, "num_statements": 3, "percent_covered": 66.66666666666667, "percent_covered_display": "67", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [66], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 50, 56], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"DefaultVernamCharacterValidator": {"executed_lines": [54, 65, 68], "summary": {"covered_lines": 3, "num_statements": 4, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [66], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 50, 56], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vernam/default_data_validator.py": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 50, 58, 60, 70, 73], "summary": {"covered_lines": 17, "num_statements": 18, "percent_covered": 94.44444444444444, "percent_covered_display": "94", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [71], "excluded_lines": [], "functions": {"DefaultVernamDataValidator.__init__": {"executed_lines": [58], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultVernamDataValidator.is_valid": {"executed_lines": [70, 73], "summary": {"covered_lines": 2, "num_statements": 3, "percent_covered": 66.66666666666667, "percent_covered_display": "67", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [71], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 50, 60], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"DefaultVernamDataValidator": {"executed_lines": [58, 70, 73], "summary": {"covered_lines": 3, "num_statements": 4, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [71], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 50, 60], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vernam/default_validation_engine.py": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 51, 59, 61, 73, 83, 86, 89], "summary": {"covered_lines": 19, "num_statements": 23, "percent_covered": 82.6086956521739, "percent_covered_display": "83", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [70, 71, 84, 87], "excluded_lines": [], "functions": {"DefaultVernamValidationEngine.__init__": {"executed_lines": [59], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultVernamValidationEngine.add_validator": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [70, 71], "excluded_lines": []}, "DefaultVernamValidationEngine.is_valid": {"executed_lines": [83, 86, 89], "summary": {"covered_lines": 3, "num_statements": 5, "percent_covered": 60.0, "percent_covered_display": "60", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [84, 87], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 51, 61, 73], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"DefaultVernamValidationEngine": {"executed_lines": [59, 83, 86, 89], "summary": {"covered_lines": 4, "num_statements": 8, "percent_covered": 50.0, "percent_covered_display": "50", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [70, 71, 84, 87], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 51, 61, 73], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vernam/encoder.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 63, 65, 66, 78, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 103, 105, 106, 107, 108], "summary": {"covered_lines": 37, "num_statements": 39, "percent_covered": 94.87179487179488, "percent_covered_display": "95", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": [], "functions": {"VernamEncoder.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": []}, "VernamEncoder.encode": {"executed_lines": [90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 103, 105, 106, 107, 108], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 65, 66, 78], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"VernamEncoder": {"executed_lines": [63, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 103, 105, 106, 107, 108], "summary": {"covered_lines": 18, "num_statements": 20, "percent_covered": 90.0, "percent_covered_display": "90", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 65, 66, 78], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vernam/idecoder.py": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 47, 48, 49, 59, 60], "summary": {"covered_lines": 16, "num_statements": 18, "percent_covered": 88.88888888888889, "percent_covered_display": "89", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [57, 72], "excluded_lines": [], "functions": {"IDecoder.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [57], "excluded_lines": []}, "IDecoder.decode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [72], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 47, 48, 49, 59, 60], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"IDecoder": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [57, 72], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 47, 48, 49, 59, 60], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vernam/iencoder.py": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 47, 48, 49, 59, 60], "summary": {"covered_lines": 16, "num_statements": 18, "percent_covered": 88.88888888888889, "percent_covered_display": "89", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [57, 72], "excluded_lines": [], "functions": {"IEncoder.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [57], "excluded_lines": []}, "IEncoder.encode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [72], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 47, 48, 49, 59, 60], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"IEncoder": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [57, 72], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 47, 48, 49, 59, 60], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vernam/ivernam.py": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 49, 50, 64, 65, 66, 75, 76, 90, 91, 92], "summary": {"covered_lines": 21, "num_statements": 25, "percent_covered": 84.0, "percent_covered_display": "84", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [62, 73, 88, 99], "excluded_lines": [], "functions": {"IVernam.encode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [62], "excluded_lines": []}, "IVernam.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [73], "excluded_lines": []}, "IVernam.decode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [88], "excluded_lines": []}, "IVernam.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [99], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 49, 50, 64, 65, 66, 75, 76, 90, 91, 92], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"IVernam": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 4, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [62, 73, 88, 99], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 49, 50, 64, 65, 66, 75, 76, 90, 91, 92], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vernam/lookup_table.py": {"executed_lines": [3, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 48], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [3, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 48], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"LookUpTable": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 48], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vernam/vernam.py": {"executed_lines": [3, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 35, 36, 37, 38, 39, 42, 43, 61, 78, 79, 80, 82, 94, 96, 97, 99, 100, 104, 106, 118, 120, 121, 123, 124, 128], "summary": {"covered_lines": 35, "num_statements": 35, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"Vernam.__init__": {"executed_lines": [78, 79, 80], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Vernam.encode": {"executed_lines": [94, 96, 97], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Vernam.encode_data": {"executed_lines": [104], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Vernam.decode": {"executed_lines": [118, 120, 121], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Vernam.decode_data": {"executed_lines": [128], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 35, 36, 37, 38, 39, 42, 43, 61, 82, 99, 100, 106, 123, 124], "summary": {"covered_lines": 24, "num_statements": 24, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"Vernam": {"executed_lines": [78, 79, 80, 94, 96, 97, 104, 118, 120, 121, 128], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 35, 36, 37, 38, 39, 42, 43, 61, 82, 99, 100, 106, 123, 124], "summary": {"covered_lines": 24, "num_statements": 24, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/__init__.py": {"executed_lines": [3, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 43], "summary": {"covered_lines": 20, "num_statements": 20, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [3, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 43], "summary": {"covered_lines": 20, "num_statements": 20, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [3, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 43], "summary": {"covered_lines": 20, "num_statements": 20, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/decoder.py": {"executed_lines": [3, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 38, 39, 40, 54, 56, 57, 65, 67, 68, 80, 92, 93, 94, 95, 96, 98, 110, 111, 112, 113, 114, 118, 121, 122], "summary": {"covered_lines": 35, "num_statements": 38, "percent_covered": 92.10526315789474, "percent_covered_display": "92", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [77, 78, 123], "excluded_lines": [], "functions": {"VigenereDecoder.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [77, 78], "excluded_lines": []}, "VigenereDecoder._split_data_decode": {"executed_lines": [92, 93, 94, 95, 96], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "VigenereDecoder.decode": {"executed_lines": [110, 111, 112, 113, 114, 118, 121, 122], "summary": {"covered_lines": 8, "num_statements": 9, "percent_covered": 88.88888888888889, "percent_covered_display": "89", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [123], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 38, 39, 40, 54, 56, 57, 67, 68, 80, 98], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"VigenereDecoder": {"executed_lines": [65, 92, 93, 94, 95, 96, 110, 111, 112, 113, 114, 118, 121, 122], "summary": {"covered_lines": 14, "num_statements": 17, "percent_covered": 82.3529411764706, "percent_covered_display": "82", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [77, 78, 123], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 38, 39, 40, 54, 56, 57, 67, 68, 80, 98], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/default_character_validator.py": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 50, 54, 56, 65, 68], "summary": {"covered_lines": 17, "num_statements": 18, "percent_covered": 94.44444444444444, "percent_covered_display": "94", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [66], "excluded_lines": [], "functions": {"DefaultVigenereCharacterValidator.__init__": {"executed_lines": [54], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultVigenereCharacterValidator.is_valid_char": {"executed_lines": [65, 68], "summary": {"covered_lines": 2, "num_statements": 3, "percent_covered": 66.66666666666667, "percent_covered_display": "67", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [66], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 50, 56], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"DefaultVigenereCharacterValidator": {"executed_lines": [54, 65, 68], "summary": {"covered_lines": 3, "num_statements": 4, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [66], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 50, 56], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/default_data_validator.py": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 50, 58, 60, 70, 73], "summary": {"covered_lines": 17, "num_statements": 18, "percent_covered": 94.44444444444444, "percent_covered_display": "94", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [71], "excluded_lines": [], "functions": {"DefaultVigenereDataValidator.__init__": {"executed_lines": [58], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultVigenereDataValidator.is_valid": {"executed_lines": [70, 73], "summary": {"covered_lines": 2, "num_statements": 3, "percent_covered": 66.66666666666667, "percent_covered_display": "67", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [71], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 50, 60], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"DefaultVigenereDataValidator": {"executed_lines": [58, 70, 73], "summary": {"covered_lines": 3, "num_statements": 4, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [71], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 50, 60], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/default_validation_engine.py": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 51, 59, 61, 73, 83, 86, 89], "summary": {"covered_lines": 19, "num_statements": 23, "percent_covered": 82.6086956521739, "percent_covered_display": "83", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [70, 71, 84, 87], "excluded_lines": [], "functions": {"DefaultVigenereValidationEngine.__init__": {"executed_lines": [59], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultVigenereValidationEngine.add_validator": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [70, 71], "excluded_lines": []}, "DefaultVigenereValidationEngine.is_valid": {"executed_lines": [83, 86, 89], "summary": {"covered_lines": 3, "num_statements": 5, "percent_covered": 60.0, "percent_covered_display": "60", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [84, 87], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 51, 61, 73], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"DefaultVigenereValidationEngine": {"executed_lines": [59, 83, 86, 89], "summary": {"covered_lines": 4, "num_statements": 8, "percent_covered": 50.0, "percent_covered_display": "50", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [70, 71, 84, 87], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 51, 61, 73], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/encoder.py": {"executed_lines": [3, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 38, 39, 40, 54, 56, 57, 65, 67, 68, 80, 92, 93, 94, 95, 96, 98, 110, 111, 112, 113, 114, 118, 121, 122], "summary": {"covered_lines": 35, "num_statements": 38, "percent_covered": 92.10526315789474, "percent_covered_display": "92", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [77, 78, 123], "excluded_lines": [], "functions": {"VigenereEncoder.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [77, 78], "excluded_lines": []}, "VigenereEncoder._split_data_encode": {"executed_lines": [92, 93, 94, 95, 96], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "VigenereEncoder.encode": {"executed_lines": [110, 111, 112, 113, 114, 118, 121, 122], "summary": {"covered_lines": 8, "num_statements": 9, "percent_covered": 88.88888888888889, "percent_covered_display": "89", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [123], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 38, 39, 40, 54, 56, 57, 67, 68, 80, 98], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"VigenereEncoder": {"executed_lines": [65, 92, 93, 94, 95, 96, 110, 111, 112, 113, 114, 118, 121, 122], "summary": {"covered_lines": 14, "num_statements": 17, "percent_covered": 82.3529411764706, "percent_covered_display": "82", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [77, 78, 123], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 38, 39, 40, 54, 56, 57, 67, 68, 80, 98], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/idecoder.py": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 47, 48, 49, 59, 60], "summary": {"covered_lines": 16, "num_statements": 18, "percent_covered": 88.88888888888889, "percent_covered_display": "89", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [57, 72], "excluded_lines": [], "functions": {"IDecoder.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [57], "excluded_lines": []}, "IDecoder.decode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [72], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 47, 48, 49, 59, 60], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"IDecoder": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [57, 72], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 47, 48, 49, 59, 60], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/iencoder.py": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 47, 48, 49, 59, 60], "summary": {"covered_lines": 16, "num_statements": 18, "percent_covered": 88.88888888888889, "percent_covered_display": "89", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [57, 72], "excluded_lines": [], "functions": {"IEncoder.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [57], "excluded_lines": []}, "IEncoder.encode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [72], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 47, 48, 49, 59, 60], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"IEncoder": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [57, 72], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 47, 48, 49, 59, 60], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/ikey_generator.py": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 47, 48, 49, 59, 60, 61, 67, 68], "summary": {"covered_lines": 19, "num_statements": 22, "percent_covered": 86.36363636363636, "percent_covered_display": "86", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [57, 65, 78], "excluded_lines": [], "functions": {"IKeyGenerator.key": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [65], "excluded_lines": []}, "IKeyGenerator.generate_key": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [78], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 47, 48, 49, 59, 60, 61, 67, 68], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"IKeyGenerator": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 3, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [57, 65, 78], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 47, 48, 49, 59, 60, 61, 67, 68], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/ivigenere.py": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 49, 50, 64, 65, 66, 72, 73, 79, 80, 81], "summary": {"covered_lines": 21, "num_statements": 25, "percent_covered": 84.0, "percent_covered_display": "84", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [62, 70, 77, 85], "excluded_lines": [], "functions": {"IVigenere.encode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [62], "excluded_lines": []}, "IVigenere.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [70], "excluded_lines": []}, "IVigenere.decode": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [77], "excluded_lines": []}, "IVigenere.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [85], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 49, 50, 64, 65, 66, 72, 73, 79, 80, 81], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"IVigenere": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 4, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [62, 70, 77, 85], "excluded_lines": []}, "": {"executed_lines": [3, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 49, 50, 64, 65, 66, 72, 73, 79, 80, 81], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/key_generator.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 54, 55, 57, 58, 68, 69, 81, 82, 90, 92, 93, 102, 103, 105, 114, 115, 117, 118, 120, 123, 124, 125, 127], "summary": {"covered_lines": 36, "num_statements": 41, "percent_covered": 87.8048780487805, "percent_covered_display": "88", "missing_lines": 5, "excluded_lines": 0}, "missing_lines": [66, 78, 79, 121, 129], "excluded_lines": [], "functions": {"KeyGenerator.data_len": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [78, 79], "excluded_lines": []}, "KeyGenerator.key": {"executed_lines": [102, 103], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "KeyGenerator.generate_key": {"executed_lines": [114, 115, 117, 118, 120, 123, 124, 125, 127], "summary": {"covered_lines": 9, "num_statements": 11, "percent_covered": 81.81818181818181, "percent_covered_display": "82", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [121, 129], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 54, 55, 57, 58, 68, 69, 81, 82, 92, 93, 105], "summary": {"covered_lines": 24, "num_statements": 24, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"KeyGenerator": {"executed_lines": [90, 102, 103, 114, 115, 117, 118, 120, 123, 124, 125, 127], "summary": {"covered_lines": 12, "num_statements": 17, "percent_covered": 70.58823529411765, "percent_covered_display": "71", "missing_lines": 5, "excluded_lines": 0}, "missing_lines": [66, 78, 79, 121, 129], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 54, 55, 57, 58, 68, 69, 81, 82, 92, 93, 105], "summary": {"covered_lines": 24, "num_statements": 24, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/lookup_table.py": {"executed_lines": [3, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 53, 54, 55, 56, 57, 58], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [3, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 53, 54, 55, 56, 57, 58], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"LookUpTable": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 53, 54, 55, 56, 57, 58], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/vigenere.py": {"executed_lines": [3, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 64, 84, 85, 86, 87, 89, 101, 102, 104, 106, 107, 108, 109, 111, 112, 116, 118, 130, 131, 133, 135, 136, 137, 138, 140, 141, 145], "summary": {"covered_lines": 46, "num_statements": 46, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"Vigenere.__init__": {"executed_lines": [84, 85, 86, 87], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Vigenere.encode": {"executed_lines": [101, 102, 104, 106, 107, 108, 109], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Vigenere.encode_data": {"executed_lines": [116], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Vigenere.decode": {"executed_lines": [130, 131, 133, 135, 136, 137, 138], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Vigenere.decode_data": {"executed_lines": [145], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 64, 89, 111, 112, 118, 140, 141], "summary": {"covered_lines": 26, "num_statements": 26, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"Vigenere": {"executed_lines": [84, 85, 86, 87, 101, 102, 104, 106, 107, 108, 109, 116, 130, 131, 133, 135, 136, 137, 138, 145], "summary": {"covered_lines": 20, "num_statements": 20, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 64, 89, 111, 112, 118, 140, 141], "summary": {"covered_lines": 26, "num_statements": 26, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}}, "totals": {"covered_lines": 1457, "num_statements": 1656, "percent_covered": 87.98309178743962, "percent_covered_display": "88", "missing_lines": 199, "excluded_lines": 0}} \ No newline at end of file diff --git a/tests/codecipher_coverage.xml b/tests/codecipher_coverage.xml index d36deaa..6cdf4c0 100644 --- a/tests/codecipher_coverage.xml +++ b/tests/codecipher_coverage.xml @@ -1,5 +1,5 @@ - + @@ -10,21 +10,36 @@ - + + + + + + + + + + + - + + + - + + + + @@ -32,53 +47,58 @@ + - - - + + - + + - - - - - - - - - + + + + + + + + - - - - - - - + + + + + + + + + + + - + + - + @@ -86,298 +106,291 @@ - + - + + + + - - - - - - - - - - - - - - - - - - - - - - - + + - + + + + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - + + - + + + + + - - - - - - - - + + - - - - - - - - - - - - - + + + - + + - + + + + + - - - - - - - - + - - - - - - - - - - - - + + + - + + - + + + + + + + + + + + + + - - - - - + + - + + + + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - + + - + - - - - - - - + + + + + - - - - - + + + + + + + - + + - + - - - - - - - - - - - - - - - + + + + + + + + + + + + - - - - - + + - + - - + + + + - - - - - - - - + + + + + + + + + + + - + + + + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + @@ -385,70 +398,18 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - + + - + @@ -456,38 +417,16 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - + + @@ -499,46 +438,32 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + - + - + + + + + + @@ -546,20 +471,21 @@ - - - - + - + + + + + @@ -567,34 +493,28 @@ - - - - - + - - - - - + + + - + + + + + + - - - + - - - - - - - + + + + - + @@ -602,46 +522,1205 @@ + + + + - - - - - - - - + + + - - + + - + - - - - - - - - - - - - - - - + + + + + + + + - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -650,32 +1729,255 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + - - - - - - + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + @@ -699,6 +2001,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/htmlcov/class_index.html b/tests/htmlcov/class_index.html index 2a8e0cf..e66aee8 100644 --- a/tests/htmlcov/class_index.html +++ b/tests/htmlcov/class_index.html @@ -11,7 +11,7 @@

                        Coverage report: - 95% + 88%

                        @@ -75,322 +75,1050 @@

                        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - + + + - + - - - - + + - + + + - - - - + + + - + + - - - + + + - + - - - + + + + + + + + + + + + + + + + + + + - + - - - + + + - + - - - + + + + + + + + + + + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - + + + - + - - - + + + - - + + - - - - + + + + - + - - - + + + + + + + + + - + + + - - - + + + - + - - - + + + + + + + + + + + - + - - - + + - - + + + - - - - + + + + - + - - + + - - - + + + - + - - + + - - + + + + + + + + + + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - + + + - + - - - + + + - + - - - + + + - + - - - + + + - + - - - + + + + + + + + + + + - + - - - + + + + - - + - - - - + + + + - + - - - + + - + + - - - - + + + + - + - - - + + + - + - - - + + + - + - + - - + + - - - - + + + + - + - - - + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + + + + + + + + + + - - - + + + + + + + + + + - + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + @@ -408,15 +1136,31 @@

                        + + + + + + + + + + + + + + + + - - - - + + + +
                          -
                        • encode_data (codecipher.a1z52n62.encode.A1z52N62Encode property) +
                        • encode_data (codecipher.a1z52n62.encode.A1z52N62Encoder property)
                          • (codecipher.atbs.encode.AlephTawBetShinEncode property) diff --git a/docs/build/html/searchindex.js b/docs/build/html/searchindex.js index 318a2a3..65b36a6 100644 --- a/docs/build/html/searchindex.js +++ b/docs/build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["codecipher", "codecipher.a1z52n62", "codecipher.a1z52n62.decode", "codecipher.a1z52n62.encode", "codecipher.atbs", "codecipher.atbs.decode", "codecipher.atbs.encode", "codecipher.atbs.lookup_table", "codecipher.b64", "codecipher.b64.decode", "codecipher.b64.encode", "codecipher.caesar", "codecipher.caesar.decode", "codecipher.caesar.encode", "codecipher.vernam", "codecipher.vernam.decode", "codecipher.vernam.encode", "codecipher.vigenere", "codecipher.vigenere.decode", "codecipher.vigenere.encode", "codecipher.vigenere.key_generator", "codecipher.vigenere.lookup_table", "index", "modules"], "filenames": ["codecipher.rst", "codecipher.a1z52n62.rst", "codecipher.a1z52n62.decode.rst", "codecipher.a1z52n62.encode.rst", "codecipher.atbs.rst", "codecipher.atbs.decode.rst", "codecipher.atbs.encode.rst", "codecipher.atbs.lookup_table.rst", "codecipher.b64.rst", "codecipher.b64.decode.rst", "codecipher.b64.encode.rst", "codecipher.caesar.rst", "codecipher.caesar.decode.rst", "codecipher.caesar.encode.rst", "codecipher.vernam.rst", "codecipher.vernam.decode.rst", "codecipher.vernam.encode.rst", "codecipher.vigenere.rst", "codecipher.vigenere.decode.rst", "codecipher.vigenere.encode.rst", "codecipher.vigenere.key_generator.rst", "codecipher.vigenere.lookup_table.rst", "index.rst", "modules.rst"], "titles": ["codecipher package", "codecipher.a1z52n62 package", "codecipher.a1z52n62.decode module", "codecipher.a1z52n62.encode module", "codecipher.atbs package", "codecipher.atbs.decode module", "codecipher.atbs.encode module", "codecipher.atbs.lookup_table module", "codecipher.b64 package", "codecipher.b64.decode module", "codecipher.b64.encode module", "codecipher.caesar package", "codecipher.caesar.decode module", "codecipher.caesar.encode module", "codecipher.vernam package", "codecipher.vernam.decode module", "codecipher.vernam.encode module", "codecipher.vigenere package", "codecipher.vigenere.decode module", "codecipher.vigenere.encode module", "codecipher.vigenere.key_generator module", "codecipher.vigenere.lookup_table module", "CODECipher", "codecipher"], "terms": {"a1z52n62": [0, 22, 23], "submodul": [0, 23], "decod": [0, 1, 4, 8, 11, 14, 17, 20, 21, 22], "a1z52n62decod": [0, 1, 2], "encod": [0, 1, 4, 8, 11, 14, 17, 20, 21, 22], "a1z52n62encod": [0, 1, 3], "atb": [0, 22, 23], "alephtawbetshindecod": [0, 4, 5, 9], "alephtawbetshinencod": [0, 4, 6], "lookup_t": [0, 4, 17, 22], "alephtawbetshin": [0, 4, 5, 6, 7, 9, 10], "b64": [0, 22, 23], "b64decod": [0, 8, 9], "b64encod": [0, 8, 10], "caesar": [0, 22, 23], "caesardecod": [0, 11, 12], "caesarencod": [0, 11, 13], "vernam": [0, 22, 23], "vernamdecod": [0, 14, 15], "vernamencod": [0, 14, 16], "vigener": [0, 22, 23], "vigeneredecod": [0, 17, 18], "vigenereencod": [0, 17, 19], "key_gener": [0, 17, 22], "keygener": [0, 17, 20], "lookupt": [0, 17, 21], "__init__": [0, 1, 4, 8, 11, 14, 17, 22], "py": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "copyright": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "c": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "2021": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "2026": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "vladimir": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "roncev": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "elektron": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "ronca": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "gmail": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "com": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "free": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "softwar": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "you": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "can": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "redistribut": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "modifi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "under": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "term": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "gnu": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "gener": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "public": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "licens": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "publish": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "foundat": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "either": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "version": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "3": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "your": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "option": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "ani": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "later": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "distribut": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "hope": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "us": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "without": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "warranti": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "even": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "impli": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "merchant": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "fit": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "FOR": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "A": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "particular": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "purpos": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "see": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "more": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "detail": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "should": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "have": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "receiv": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "copi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "along": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "thi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "program": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "If": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "http": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "www": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "org": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "_decode_data": [1, 2, 4, 5, 8, 9, 11, 12, 14, 15, 17, 18], "decode_data": [1, 2, 4, 5, 8, 9, 11, 12, 14, 15, 17, 18], "_encode_data": [1, 3, 4, 6, 8, 10, 11, 13, 14, 16, 17, 19], "encode_data": [1, 3, 4, 6, 8, 10, 11, 13, 14, 16, 17, 19], "info": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "defin": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "class": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "attribut": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "method": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "creat": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "contain": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 22], "aggreg": [1, 4, 8, 11, 14, 17, 21], "backend": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], "api": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], "sourc": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "base": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "It": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "none": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "initi": [1, 4, 8, 11, 14, 17], "constructor": [1, 4, 8, 11, 14, 17], "str": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19, 20, 21], "object": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19, 20, 21], "data": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19, 20], "properti": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19, 20], "from": [2, 5, 9, 12, 15, 18], "format": [2, 3, 5, 6, 7, 9, 10, 12, 13, 15, 16, 18, 19], "paramet": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19], "which": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19], "return": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19, 20], "except": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19, 20], "get": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19, 20], "type": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19, 20, 22], "dict": [7, 21], "shift_count": [12, 13], "int": [12, 13, 20, 21], "shift": [12, 13], "count": [12, 13], "kei": [15, 16, 17, 18, 19, 20], "_split_data_decod": [17, 18], "_split_data_encod": [17, 19], "_data_len": [17, 20], "_kei": [17, 20], "data_len": [17, 20], "generate_kei": [17, 20], "alpha": [17, 21], "alphanum": [17, 21], "index_to_lett": [17, 21], "letter_to_index": [17, 21], "num": [17, 21], "white_spac": [17, 21], "_split_data": [18, 19], "split": [18, 19], "data_to_decod": 18, "list": [18, 19], "data_to_encod": 19, "vigen": 20, "length": 20, "lookup": 21, "tabl": 21, "support": [21, 22], "alphabet": 21, "numer": 21, "white": 21, "space": 21, "char": 21, "index": [21, 22], "letter": 21, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz": 21, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789": 21, "0": 21, "1": 21, "b": 21, "2": 21, "d": 21, "4": 21, "e": 21, "5": 21, "f": 21, "6": 21, "g": 21, "7": [21, 22], "h": 21, "8": 21, "9": 21, "j": 21, "10": 21, "k": 21, "11": 21, "l": 21, "12": 21, "m": [21, 22], "13": 21, "n": 21, "14": 21, "o": 21, "15": 21, "p": 21, "16": 21, "q": 21, "17": 21, "r": [21, 22], "18": 21, "19": 21, "t": 21, "20": 21, "u": 21, "21": 21, "v": 21, "22": 21, "w": 21, "23": [21, 22], "x": [21, 22], "24": 21, "y": [21, 22], "25": 21, "z": [21, 22], "26": 21, "27": 21, "28": 21, "29": 21, "30": 21, "31": 21, "32": 21, "33": 21, "34": 21, "35": 21, "36": 21, "37": 21, "38": 21, "39": 21, "40": 21, "41": 21, "42": 21, "43": 21, "44": 21, "45": 21, "46": 21, "47": 21, "48": 21, "49": 21, "50": 21, "51": 21, "52": 21, "53": 21, "54": 21, "55": 21, "56": 21, "57": 21, "58": 21, "59": 21, "60": 21, "61": 21, "62": 21, "0123456789": 21, "cipher": 22, "util": 22, "develop": 22, "python": 22, "code": 22, "The": 22, "readm": 22, "introduc": 22, "modul": [22, 23], "provid": 22, "instruct": 22, "how": 22, "machin": 22, "mai": 22, "other": 22, "inform": 22, "befor": 22, "ar": 22, "subpackag": [22, 23], "next": 22, "environ": 22, "navig": 22, "releas": 22, "page": 22, "download": 22, "extract": 22, "archiv": 22, "To": 22, "follow": 22, "tar": 22, "xvzf": 22, "gz": 22, "cd": 22, "pyton3": 22, "pip3": 22, "requir": 22, "txt": 22, "python3": 22, "build": 22, "isol": 22, "wheel": 22, "py3": 22, "whl": 22, "old": 22, "fashion": 22, "wai": 22, "setup": 22, "install_lib": 22, "install_egg_info": 22, "docker": 22, "imag": 22, "pip": 22, "librari": 22, "oop": 22, "directori": 22, "file": 22, "electux": 22, "github": 22, "io": 22, "same": 22, "itself": 22, "avail": 22, "let": 22, "help": 22, "psf": 22, "search": 22, "packag": 23, "content": 23}, "objects": {"": [[0, 0, 0, "-", "codecipher"]], "codecipher": [[1, 0, 0, "-", "a1z52n62"], [4, 0, 0, "-", "atbs"], [8, 0, 0, "-", "b64"], [11, 0, 0, "-", "caesar"], [14, 0, 0, "-", "vernam"], [17, 0, 0, "-", "vigenere"]], "codecipher.a1z52n62": [[1, 1, 1, "", "A1z52N62"], [2, 0, 0, "-", "decode"], [3, 0, 0, "-", "encode"]], "codecipher.a1z52n62.decode": [[2, 1, 1, "", "A1z52N62Decode"]], "codecipher.a1z52n62.decode.A1z52N62Decode": [[2, 2, 1, "", "_decode_data"], [2, 3, 1, "", "decode"], [2, 4, 1, "", "decode_data"]], "codecipher.a1z52n62.encode": [[3, 1, 1, "", "A1z52N62Encode"]], "codecipher.a1z52n62.encode.A1z52N62Encode": [[3, 2, 1, "", "_encode_data"], [3, 3, 1, "", "encode"], [3, 4, 1, "", "encode_data"]], "codecipher.atbs": [[4, 1, 1, "", "AlephTawBetShin"], [5, 0, 0, "-", "decode"], [6, 0, 0, "-", "encode"], [7, 0, 0, "-", "lookup_table"]], "codecipher.atbs.decode": [[5, 1, 1, "", "AlephTawBetShinDecode"]], "codecipher.atbs.decode.AlephTawBetShinDecode": [[5, 2, 1, "", "_decode_data"], [5, 3, 1, "", "decode"], [5, 4, 1, "", "decode_data"]], "codecipher.atbs.encode": [[6, 1, 1, "", "AlephTawBetShinEncode"]], "codecipher.atbs.encode.AlephTawBetShinEncode": [[6, 2, 1, "", "_encode_data"], [6, 3, 1, "", "encode"], [6, 4, 1, "", "encode_data"]], "codecipher.b64": [[8, 1, 1, "", "B64"], [9, 0, 0, "-", "decode"], [10, 0, 0, "-", "encode"]], "codecipher.b64.decode": [[9, 1, 1, "", "B64Decode"]], "codecipher.b64.decode.B64Decode": [[9, 2, 1, "", "_decode_data"], [9, 3, 1, "", "decode"], [9, 4, 1, "", "decode_data"]], "codecipher.b64.encode": [[10, 1, 1, "", "B64Encode"]], "codecipher.b64.encode.B64Encode": [[10, 2, 1, "", "_encode_data"], [10, 3, 1, "", "encode"], [10, 4, 1, "", "encode_data"]], "codecipher.caesar": [[11, 1, 1, "", "Caesar"], [12, 0, 0, "-", "decode"], [13, 0, 0, "-", "encode"]], "codecipher.caesar.decode": [[12, 1, 1, "", "CaesarDecode"]], "codecipher.caesar.decode.CaesarDecode": [[12, 2, 1, "", "_decode_data"], [12, 3, 1, "", "decode"], [12, 4, 1, "", "decode_data"]], "codecipher.caesar.encode": [[13, 1, 1, "", "CaesarEncode"]], "codecipher.caesar.encode.CaesarEncode": [[13, 2, 1, "", "_encode_data"], [13, 3, 1, "", "encode"], [13, 4, 1, "", "encode_data"]], "codecipher.vernam": [[14, 1, 1, "", "Vernam"], [15, 0, 0, "-", "decode"], [16, 0, 0, "-", "encode"]], "codecipher.vernam.decode": [[15, 1, 1, "", "VernamDecode"]], "codecipher.vernam.decode.VernamDecode": [[15, 2, 1, "", "_decode_data"], [15, 3, 1, "", "decode"], [15, 4, 1, "", "decode_data"]], "codecipher.vernam.encode": [[16, 1, 1, "", "VernamEncode"]], "codecipher.vernam.encode.VernamEncode": [[16, 2, 1, "", "_encode_data"], [16, 3, 1, "", "encode"], [16, 4, 1, "", "encode_data"]], "codecipher.vigenere": [[17, 1, 1, "", "Vigenere"], [18, 0, 0, "-", "decode"], [19, 0, 0, "-", "encode"], [20, 0, 0, "-", "key_generator"], [21, 0, 0, "-", "lookup_table"]], "codecipher.vigenere.decode": [[18, 1, 1, "", "VigenereDecode"]], "codecipher.vigenere.decode.VigenereDecode": [[18, 2, 1, "", "_decode_data"], [18, 3, 1, "", "_split_data_decode"], [18, 3, 1, "", "decode"], [18, 4, 1, "", "decode_data"]], "codecipher.vigenere.encode": [[19, 1, 1, "", "VigenereEncode"]], "codecipher.vigenere.encode.VigenereEncode": [[19, 2, 1, "", "_encode_data"], [19, 3, 1, "", "_split_data_encode"], [19, 3, 1, "", "encode"], [19, 4, 1, "", "encode_data"]], "codecipher.vigenere.key_generator": [[20, 1, 1, "", "KeyGenerator"]], "codecipher.vigenere.key_generator.KeyGenerator": [[20, 2, 1, "", "_data_len"], [20, 2, 1, "", "_key"], [20, 4, 1, "", "data_len"], [20, 3, 1, "", "generate_key"], [20, 4, 1, "", "key"]], "codecipher.vigenere.lookup_table": [[21, 1, 1, "", "LookUpTable"]], "codecipher.vigenere.lookup_table.LookUpTable": [[21, 2, 1, "", "ALPHA"], [21, 2, 1, "", "ALPHANUM"], [21, 2, 1, "", "INDEX_TO_LETTER"], [21, 2, 1, "", "LETTER_TO_INDEX"], [21, 2, 1, "", "NUM"], [21, 2, 1, "", "WHITE_SPACE"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:attribute", "3": "py:method", "4": "py:property"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "attribute", "Python attribute"], "3": ["py", "method", "Python method"], "4": ["py", "property", "Python property"]}, "titleterms": {"codeciph": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23], "packag": [0, 1, 4, 8, 11, 14, 17, 22], "subpackag": 0, "modul": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "content": [0, 1, 4, 8, 11, 14, 17, 22], "a1z52n62": [1, 2, 3], "submodul": [1, 4, 8, 11, 14, 17], "decod": [2, 5, 9, 12, 15, 18], "encod": [3, 6, 10, 13, 16, 19], "atb": [4, 5, 6, 7], "lookup_t": [7, 21], "b64": [8, 9, 10], "caesar": [11, 12, 13], "vernam": [14, 15, 16], "vigener": [17, 18, 19, 20, 21], "key_gener": 20, "instal": 22, "depend": 22, "structur": 22, "copyright": 22, "licenc": 22, "indic": 22, "tabl": 22}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1, "sphinx": 60}, "alltitles": {"codecipher package": [[0, "codecipher-package"]], "Subpackages": [[0, "subpackages"]], "Module contents": [[0, "module-codecipher"], [1, "module-codecipher.a1z52n62"], [4, "module-codecipher.atbs"], [8, "module-codecipher.b64"], [11, "module-codecipher.caesar"], [14, "module-codecipher.vernam"], [17, "module-codecipher.vigenere"]], "codecipher.a1z52n62 package": [[1, "codecipher-a1z52n62-package"]], "Submodules": [[1, "submodules"], [4, "submodules"], [8, "submodules"], [11, "submodules"], [14, "submodules"], [17, "submodules"]], "codecipher.a1z52n62.decode module": [[2, "module-codecipher.a1z52n62.decode"]], "codecipher.a1z52n62.encode module": [[3, "module-codecipher.a1z52n62.encode"]], "codecipher.atbs package": [[4, "codecipher-atbs-package"]], "codecipher.atbs.decode module": [[5, "module-codecipher.atbs.decode"]], "codecipher.atbs.encode module": [[6, "module-codecipher.atbs.encode"]], "codecipher.atbs.lookup_table module": [[7, "module-codecipher.atbs.lookup_table"]], "codecipher.b64 package": [[8, "codecipher-b64-package"]], "codecipher.b64.decode module": [[9, "module-codecipher.b64.decode"]], "codecipher.b64.encode module": [[10, "module-codecipher.b64.encode"]], "codecipher.caesar package": [[11, "codecipher-caesar-package"]], "codecipher.caesar.decode module": [[12, "module-codecipher.caesar.decode"]], "codecipher.caesar.encode module": [[13, "module-codecipher.caesar.encode"]], "codecipher.vernam package": [[14, "codecipher-vernam-package"]], "codecipher.vernam.decode module": [[15, "module-codecipher.vernam.decode"]], "codecipher.vernam.encode module": [[16, "module-codecipher.vernam.encode"]], "codecipher.vigenere package": [[17, "codecipher-vigenere-package"]], "codecipher.vigenere.decode module": [[18, "module-codecipher.vigenere.decode"]], "codecipher.vigenere.encode module": [[19, "module-codecipher.vigenere.encode"]], "codecipher.vigenere.key_generator module": [[20, "module-codecipher.vigenere.key_generator"]], "codecipher.vigenere.lookup_table module": [[21, "module-codecipher.vigenere.lookup_table"]], "CODECipher": [[22, "codecipher"]], "Contents": [[22, null]], "Installation": [[22, "installation"]], "Dependencies": [[22, "dependencies"]], "Package structure": [[22, "package-structure"]], "Copyright and licence": [[22, "copyright-and-licence"]], "Indices and tables": [[22, "indices-and-tables"]], "codecipher": [[23, "codecipher"]]}, "indexentries": {"codecipher": [[0, "module-codecipher"]], "module": [[0, "module-codecipher"], [1, "module-codecipher.a1z52n62"], [2, "module-codecipher.a1z52n62.decode"], [3, "module-codecipher.a1z52n62.encode"], [4, "module-codecipher.atbs"], [5, "module-codecipher.atbs.decode"], [6, "module-codecipher.atbs.encode"], [7, "module-codecipher.atbs.lookup_table"], [8, "module-codecipher.b64"], [9, "module-codecipher.b64.decode"], [10, "module-codecipher.b64.encode"], [11, "module-codecipher.caesar"], [12, "module-codecipher.caesar.decode"], [13, "module-codecipher.caesar.encode"], [14, "module-codecipher.vernam"], [15, "module-codecipher.vernam.decode"], [16, "module-codecipher.vernam.encode"], [17, "module-codecipher.vigenere"], [18, "module-codecipher.vigenere.decode"], [19, "module-codecipher.vigenere.encode"], [20, "module-codecipher.vigenere.key_generator"], [21, "module-codecipher.vigenere.lookup_table"]], "a1z52n62 (class in codecipher.a1z52n62)": [[1, "codecipher.a1z52n62.A1z52N62"]], "codecipher.a1z52n62": [[1, "module-codecipher.a1z52n62"]], "a1z52n62decode (class in codecipher.a1z52n62.decode)": [[2, "codecipher.a1z52n62.decode.A1z52N62Decode"]], "_decode_data (codecipher.a1z52n62.decode.a1z52n62decode attribute)": [[2, "codecipher.a1z52n62.decode.A1z52N62Decode._decode_data"]], "codecipher.a1z52n62.decode": [[2, "module-codecipher.a1z52n62.decode"]], "decode() (codecipher.a1z52n62.decode.a1z52n62decode method)": [[2, "codecipher.a1z52n62.decode.A1z52N62Decode.decode"]], "decode_data (codecipher.a1z52n62.decode.a1z52n62decode property)": [[2, "codecipher.a1z52n62.decode.A1z52N62Decode.decode_data"]], "a1z52n62encode (class in codecipher.a1z52n62.encode)": [[3, "codecipher.a1z52n62.encode.A1z52N62Encode"]], "_encode_data (codecipher.a1z52n62.encode.a1z52n62encode attribute)": [[3, "codecipher.a1z52n62.encode.A1z52N62Encode._encode_data"]], "codecipher.a1z52n62.encode": [[3, "module-codecipher.a1z52n62.encode"]], "encode() (codecipher.a1z52n62.encode.a1z52n62encode method)": [[3, "codecipher.a1z52n62.encode.A1z52N62Encode.encode"]], "encode_data (codecipher.a1z52n62.encode.a1z52n62encode property)": [[3, "codecipher.a1z52n62.encode.A1z52N62Encode.encode_data"]], "alephtawbetshin (class in codecipher.atbs)": [[4, "codecipher.atbs.AlephTawBetShin"]], "codecipher.atbs": [[4, "module-codecipher.atbs"]], "alephtawbetshindecode (class in codecipher.atbs.decode)": [[5, "codecipher.atbs.decode.AlephTawBetShinDecode"]], "_decode_data (codecipher.atbs.decode.alephtawbetshindecode attribute)": [[5, "codecipher.atbs.decode.AlephTawBetShinDecode._decode_data"]], "codecipher.atbs.decode": [[5, "module-codecipher.atbs.decode"]], "decode() (codecipher.atbs.decode.alephtawbetshindecode method)": [[5, "codecipher.atbs.decode.AlephTawBetShinDecode.decode"]], "decode_data (codecipher.atbs.decode.alephtawbetshindecode property)": [[5, "codecipher.atbs.decode.AlephTawBetShinDecode.decode_data"]], "alephtawbetshinencode (class in codecipher.atbs.encode)": [[6, "codecipher.atbs.encode.AlephTawBetShinEncode"]], "_encode_data (codecipher.atbs.encode.alephtawbetshinencode attribute)": [[6, "codecipher.atbs.encode.AlephTawBetShinEncode._encode_data"]], "codecipher.atbs.encode": [[6, "module-codecipher.atbs.encode"]], "encode() (codecipher.atbs.encode.alephtawbetshinencode method)": [[6, "codecipher.atbs.encode.AlephTawBetShinEncode.encode"]], "encode_data (codecipher.atbs.encode.alephtawbetshinencode property)": [[6, "codecipher.atbs.encode.AlephTawBetShinEncode.encode_data"]], "codecipher.atbs.lookup_table": [[7, "module-codecipher.atbs.lookup_table"]], "b64 (class in codecipher.b64)": [[8, "codecipher.b64.B64"]], "codecipher.b64": [[8, "module-codecipher.b64"]], "b64decode (class in codecipher.b64.decode)": [[9, "codecipher.b64.decode.B64Decode"]], "_decode_data (codecipher.b64.decode.b64decode attribute)": [[9, "codecipher.b64.decode.B64Decode._decode_data"]], "codecipher.b64.decode": [[9, "module-codecipher.b64.decode"]], "decode() (codecipher.b64.decode.b64decode method)": [[9, "codecipher.b64.decode.B64Decode.decode"]], "decode_data (codecipher.b64.decode.b64decode property)": [[9, "codecipher.b64.decode.B64Decode.decode_data"]], "b64encode (class in codecipher.b64.encode)": [[10, "codecipher.b64.encode.B64Encode"]], "_encode_data (codecipher.b64.encode.b64encode attribute)": [[10, "codecipher.b64.encode.B64Encode._encode_data"]], "codecipher.b64.encode": [[10, "module-codecipher.b64.encode"]], "encode() (codecipher.b64.encode.b64encode method)": [[10, "codecipher.b64.encode.B64Encode.encode"]], "encode_data (codecipher.b64.encode.b64encode property)": [[10, "codecipher.b64.encode.B64Encode.encode_data"]], "caesar (class in codecipher.caesar)": [[11, "codecipher.caesar.Caesar"]], "codecipher.caesar": [[11, "module-codecipher.caesar"]], "caesardecode (class in codecipher.caesar.decode)": [[12, "codecipher.caesar.decode.CaesarDecode"]], "_decode_data (codecipher.caesar.decode.caesardecode attribute)": [[12, "codecipher.caesar.decode.CaesarDecode._decode_data"]], "codecipher.caesar.decode": [[12, "module-codecipher.caesar.decode"]], "decode() (codecipher.caesar.decode.caesardecode method)": [[12, "codecipher.caesar.decode.CaesarDecode.decode"]], "decode_data (codecipher.caesar.decode.caesardecode property)": [[12, "codecipher.caesar.decode.CaesarDecode.decode_data"]], "caesarencode (class in codecipher.caesar.encode)": [[13, "codecipher.caesar.encode.CaesarEncode"]], "_encode_data (codecipher.caesar.encode.caesarencode attribute)": [[13, "codecipher.caesar.encode.CaesarEncode._encode_data"]], "codecipher.caesar.encode": [[13, "module-codecipher.caesar.encode"]], "encode() (codecipher.caesar.encode.caesarencode method)": [[13, "codecipher.caesar.encode.CaesarEncode.encode"]], "encode_data (codecipher.caesar.encode.caesarencode property)": [[13, "codecipher.caesar.encode.CaesarEncode.encode_data"]], "vernam (class in codecipher.vernam)": [[14, "codecipher.vernam.Vernam"]], "codecipher.vernam": [[14, "module-codecipher.vernam"]], "vernamdecode (class in codecipher.vernam.decode)": [[15, "codecipher.vernam.decode.VernamDecode"]], "_decode_data (codecipher.vernam.decode.vernamdecode attribute)": [[15, "codecipher.vernam.decode.VernamDecode._decode_data"]], "codecipher.vernam.decode": [[15, "module-codecipher.vernam.decode"]], "decode() (codecipher.vernam.decode.vernamdecode method)": [[15, "codecipher.vernam.decode.VernamDecode.decode"]], "decode_data (codecipher.vernam.decode.vernamdecode property)": [[15, "codecipher.vernam.decode.VernamDecode.decode_data"]], "vernamencode (class in codecipher.vernam.encode)": [[16, "codecipher.vernam.encode.VernamEncode"]], "_encode_data (codecipher.vernam.encode.vernamencode attribute)": [[16, "codecipher.vernam.encode.VernamEncode._encode_data"]], "codecipher.vernam.encode": [[16, "module-codecipher.vernam.encode"]], "encode() (codecipher.vernam.encode.vernamencode method)": [[16, "codecipher.vernam.encode.VernamEncode.encode"]], "encode_data (codecipher.vernam.encode.vernamencode property)": [[16, "codecipher.vernam.encode.VernamEncode.encode_data"]], "vigenere (class in codecipher.vigenere)": [[17, "codecipher.vigenere.Vigenere"]], "codecipher.vigenere": [[17, "module-codecipher.vigenere"]], "vigeneredecode (class in codecipher.vigenere.decode)": [[18, "codecipher.vigenere.decode.VigenereDecode"]], "_decode_data (codecipher.vigenere.decode.vigeneredecode attribute)": [[18, "codecipher.vigenere.decode.VigenereDecode._decode_data"]], "_split_data_decode() (codecipher.vigenere.decode.vigeneredecode method)": [[18, "codecipher.vigenere.decode.VigenereDecode._split_data_decode"]], "codecipher.vigenere.decode": [[18, "module-codecipher.vigenere.decode"]], "decode() (codecipher.vigenere.decode.vigeneredecode method)": [[18, "codecipher.vigenere.decode.VigenereDecode.decode"]], "decode_data (codecipher.vigenere.decode.vigeneredecode property)": [[18, "codecipher.vigenere.decode.VigenereDecode.decode_data"]], "vigenereencode (class in codecipher.vigenere.encode)": [[19, "codecipher.vigenere.encode.VigenereEncode"]], "_encode_data (codecipher.vigenere.encode.vigenereencode attribute)": [[19, "codecipher.vigenere.encode.VigenereEncode._encode_data"]], "_split_data_encode() (codecipher.vigenere.encode.vigenereencode method)": [[19, "codecipher.vigenere.encode.VigenereEncode._split_data_encode"]], "codecipher.vigenere.encode": [[19, "module-codecipher.vigenere.encode"]], "encode() (codecipher.vigenere.encode.vigenereencode method)": [[19, "codecipher.vigenere.encode.VigenereEncode.encode"]], "encode_data (codecipher.vigenere.encode.vigenereencode property)": [[19, "codecipher.vigenere.encode.VigenereEncode.encode_data"]], "keygenerator (class in codecipher.vigenere.key_generator)": [[20, "codecipher.vigenere.key_generator.KeyGenerator"]], "_data_len (codecipher.vigenere.key_generator.keygenerator attribute)": [[20, "codecipher.vigenere.key_generator.KeyGenerator._data_len"]], "_key (codecipher.vigenere.key_generator.keygenerator attribute)": [[20, "codecipher.vigenere.key_generator.KeyGenerator._key"]], "codecipher.vigenere.key_generator": [[20, "module-codecipher.vigenere.key_generator"]], "data_len (codecipher.vigenere.key_generator.keygenerator property)": [[20, "codecipher.vigenere.key_generator.KeyGenerator.data_len"]], "generate_key() (codecipher.vigenere.key_generator.keygenerator method)": [[20, "codecipher.vigenere.key_generator.KeyGenerator.generate_key"]], "key (codecipher.vigenere.key_generator.keygenerator property)": [[20, "codecipher.vigenere.key_generator.KeyGenerator.key"]], "alpha (codecipher.vigenere.lookup_table.lookuptable attribute)": [[21, "codecipher.vigenere.lookup_table.LookUpTable.ALPHA"]], "alphanum (codecipher.vigenere.lookup_table.lookuptable attribute)": [[21, "codecipher.vigenere.lookup_table.LookUpTable.ALPHANUM"]], "index_to_letter (codecipher.vigenere.lookup_table.lookuptable attribute)": [[21, "codecipher.vigenere.lookup_table.LookUpTable.INDEX_TO_LETTER"]], "letter_to_index (codecipher.vigenere.lookup_table.lookuptable attribute)": [[21, "codecipher.vigenere.lookup_table.LookUpTable.LETTER_TO_INDEX"]], "lookuptable (class in codecipher.vigenere.lookup_table)": [[21, "codecipher.vigenere.lookup_table.LookUpTable"]], "num (codecipher.vigenere.lookup_table.lookuptable attribute)": [[21, "codecipher.vigenere.lookup_table.LookUpTable.NUM"]], "white_space (codecipher.vigenere.lookup_table.lookuptable attribute)": [[21, "codecipher.vigenere.lookup_table.LookUpTable.WHITE_SPACE"]], "codecipher.vigenere.lookup_table": [[21, "module-codecipher.vigenere.lookup_table"]]}}) \ No newline at end of file +Search.setIndex({"docnames": ["codecipher", "codecipher.a1z52n62", "codecipher.a1z52n62.decode", "codecipher.a1z52n62.encode", "codecipher.atbs", "codecipher.atbs.decode", "codecipher.atbs.encode", "codecipher.atbs.lookup_table", "codecipher.b64", "codecipher.b64.decode", "codecipher.b64.encode", "codecipher.caesar", "codecipher.caesar.decode", "codecipher.caesar.encode", "codecipher.vernam", "codecipher.vernam.decode", "codecipher.vernam.encode", "codecipher.vigenere", "codecipher.vigenere.decode", "codecipher.vigenere.encode", "codecipher.vigenere.key_generator", "codecipher.vigenere.lookup_table", "index", "modules"], "filenames": ["codecipher.rst", "codecipher.a1z52n62.rst", "codecipher.a1z52n62.decode.rst", "codecipher.a1z52n62.encode.rst", "codecipher.atbs.rst", "codecipher.atbs.decode.rst", "codecipher.atbs.encode.rst", "codecipher.atbs.lookup_table.rst", "codecipher.b64.rst", "codecipher.b64.decode.rst", "codecipher.b64.encode.rst", "codecipher.caesar.rst", "codecipher.caesar.decode.rst", "codecipher.caesar.encode.rst", "codecipher.vernam.rst", "codecipher.vernam.decode.rst", "codecipher.vernam.encode.rst", "codecipher.vigenere.rst", "codecipher.vigenere.decode.rst", "codecipher.vigenere.encode.rst", "codecipher.vigenere.key_generator.rst", "codecipher.vigenere.lookup_table.rst", "index.rst", "modules.rst"], "titles": ["codecipher package", "codecipher.a1z52n62 package", "codecipher.a1z52n62.decode module", "codecipher.a1z52n62.encode module", "codecipher.atbs package", "codecipher.atbs.decode module", "codecipher.atbs.encode module", "codecipher.atbs.lookup_table module", "codecipher.b64 package", "codecipher.b64.decode module", "codecipher.b64.encode module", "codecipher.caesar package", "codecipher.caesar.decode module", "codecipher.caesar.encode module", "codecipher.vernam package", "codecipher.vernam.decode module", "codecipher.vernam.encode module", "codecipher.vigenere package", "codecipher.vigenere.decode module", "codecipher.vigenere.encode module", "codecipher.vigenere.key_generator module", "codecipher.vigenere.lookup_table module", "CODECipher", "codecipher"], "terms": {"a1z52n62": [0, 22, 23], "submodul": [0, 23], "decod": [0, 1, 4, 8, 11, 14, 17, 20, 21, 22], "a1z52n62decod": [0, 1, 2], "encod": [0, 1, 4, 8, 11, 14, 17, 20, 21, 22], "a1z52n62encod": [0, 1, 3], "atb": [0, 22, 23], "alephtawbetshindecod": [0, 4, 5, 9], "alephtawbetshinencod": [0, 4, 6], "lookup_t": [0, 4, 17, 22], "alephtawbetshin": [0, 4, 5, 6, 7, 9, 10], "b64": [0, 22, 23], "b64decod": [0, 8, 9], "b64encod": [0, 8, 10], "caesar": [0, 22, 23], "caesardecod": [0, 11, 12], "caesarencod": [0, 11, 13], "vernam": [0, 22, 23], "vernamdecod": [0, 14, 15], "vernamencod": [0, 14, 16], "vigener": [0, 22, 23], "vigeneredecod": [0, 17, 18], "vigenereencod": [0, 17, 19], "key_gener": [0, 17, 22], "keygener": [0, 17, 20], "lookupt": [0, 17, 21], "__init__": [0, 1, 4, 8, 11, 14, 17, 22], "py": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "copyright": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "c": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "2021": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "2026": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "vladimir": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "roncev": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "elektron": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "ronca": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "gmail": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "com": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "free": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "softwar": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "you": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "can": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "redistribut": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "modifi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "under": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "term": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "gnu": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "gener": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "public": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "licens": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "publish": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "foundat": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "either": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "version": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "3": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "your": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "option": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "ani": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "later": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "distribut": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "hope": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "us": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "without": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "warranti": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "even": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "impli": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "merchant": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "fit": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "FOR": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "A": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "particular": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "purpos": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "see": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "more": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "detail": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "should": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "have": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "receiv": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "copi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "along": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "thi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "program": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "If": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "http": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "www": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "org": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "_decode_data": [1, 2, 4, 5, 8, 9, 11, 12, 14, 15, 17, 18], "decode_data": [1, 2, 4, 5, 8, 9, 11, 12, 14, 15, 17, 18], "_encode_data": [1, 3, 4, 6, 8, 10, 11, 13, 14, 16, 17, 19], "encode_data": [1, 3, 4, 6, 8, 10, 11, 13, 14, 16, 17, 19], "info": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "defin": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "class": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "attribut": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "method": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "creat": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "contain": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 22], "aggreg": [1, 4, 8, 11, 14, 17, 21], "backend": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], "api": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], "sourc": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "base": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "It": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "none": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "initi": [1, 4, 8, 11, 14, 17], "constructor": [1, 4, 8, 11, 14, 17], "str": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19, 20, 21], "object": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19, 20, 21], "data": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19, 20], "properti": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19, 20], "from": [2, 5, 9, 12, 15, 18], "format": [2, 3, 5, 6, 7, 9, 10, 12, 13, 15, 16, 18, 19], "paramet": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19], "which": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19], "return": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19, 20], "except": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19, 20], "get": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19, 20], "type": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19, 20, 22], "dict": [7, 21], "shift_count": [12, 13], "int": [12, 13, 20, 21], "shift": [12, 13], "count": [12, 13], "kei": [15, 16, 17, 18, 19, 20], "_split_data_decod": [17, 18], "_split_data_encod": [17, 19], "_data_len": [17, 20], "_kei": [17, 20], "data_len": [17, 20], "generate_kei": [17, 20], "alpha": [17, 21], "alphanum": [17, 21], "index_to_lett": [17, 21], "letter_to_index": [17, 21], "num": [17, 21], "white_spac": [17, 21], "_split_data": [18, 19], "split": [18, 19], "data_to_decod": 18, "list": [18, 19], "data_to_encod": 19, "vigen": 20, "length": 20, "lookup": 21, "tabl": 21, "support": [21, 22], "alphabet": 21, "numer": 21, "white": 21, "space": 21, "char": 21, "index": [21, 22], "letter": 21, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz": 21, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789": 21, "0": 21, "1": 21, "b": 21, "2": 21, "d": 21, "4": 21, "e": 21, "5": 21, "f": 21, "6": 21, "g": 21, "7": [21, 22], "h": 21, "8": 21, "9": 21, "j": 21, "10": 21, "k": 21, "11": 21, "l": 21, "12": 21, "m": [21, 22], "13": 21, "n": 21, "14": 21, "o": 21, "15": 21, "p": 21, "16": 21, "q": 21, "17": 21, "r": [21, 22], "18": 21, "19": 21, "t": 21, "20": 21, "u": 21, "21": 21, "v": 21, "22": 21, "w": 21, "23": [21, 22], "x": [21, 22], "24": 21, "y": [21, 22], "25": 21, "z": [21, 22], "26": 21, "27": 21, "28": 21, "29": 21, "30": 21, "31": 21, "32": 21, "33": 21, "34": 21, "35": 21, "36": 21, "37": 21, "38": 21, "39": 21, "40": 21, "41": 21, "42": 21, "43": 21, "44": 21, "45": 21, "46": 21, "47": 21, "48": 21, "49": 21, "50": 21, "51": 21, "52": 21, "53": 21, "54": 21, "55": 21, "56": 21, "57": 21, "58": 21, "59": 21, "60": 21, "61": 21, "62": 21, "0123456789": 21, "cipher": 22, "util": 22, "develop": 22, "python": 22, "code": 22, "The": 22, "readm": 22, "introduc": 22, "modul": [22, 23], "provid": 22, "instruct": 22, "how": 22, "machin": 22, "mai": 22, "other": 22, "inform": 22, "befor": 22, "ar": 22, "subpackag": [22, 23], "next": 22, "environ": 22, "navig": 22, "releas": 22, "page": 22, "download": 22, "extract": 22, "archiv": 22, "To": 22, "follow": 22, "tar": 22, "xvzf": 22, "gz": 22, "cd": 22, "pyton3": 22, "pip3": 22, "requir": 22, "txt": 22, "python3": 22, "build": 22, "isol": 22, "wheel": 22, "py3": 22, "whl": 22, "old": 22, "fashion": 22, "wai": 22, "setup": 22, "install_lib": 22, "install_egg_info": 22, "docker": 22, "imag": 22, "pip": 22, "librari": 22, "oop": 22, "directori": 22, "file": 22, "electux": 22, "github": 22, "io": 22, "same": 22, "itself": 22, "avail": 22, "let": 22, "help": 22, "psf": 22, "search": 22, "packag": 23, "content": 23}, "objects": {"": [[0, 0, 0, "-", "codecipher"]], "codecipher": [[1, 0, 0, "-", "a1z52n62"], [4, 0, 0, "-", "atbs"], [8, 0, 0, "-", "b64"], [11, 0, 0, "-", "caesar"], [14, 0, 0, "-", "vernam"], [17, 0, 0, "-", "vigenere"]], "codecipher.a1z52n62": [[1, 1, 1, "", "A1z52N62"], [2, 0, 0, "-", "decode"], [3, 0, 0, "-", "encode"]], "codecipher.a1z52n62.decode": [[2, 1, 1, "", "A1z52N62Decoder"]], "codecipher.a1z52n62.decode.A1z52N62Decoder": [[2, 2, 1, "", "_decode_data"], [2, 3, 1, "", "decode"], [2, 4, 1, "", "decode_data"]], "codecipher.a1z52n62.encode": [[3, 1, 1, "", "A1z52N62Encoder"]], "codecipher.a1z52n62.encode.A1z52N62Encoder": [[3, 2, 1, "", "_encode_data"], [3, 3, 1, "", "encode"], [3, 4, 1, "", "encode_data"]], "codecipher.atbs": [[4, 1, 1, "", "AlephTawBetShin"], [5, 0, 0, "-", "decode"], [6, 0, 0, "-", "encode"], [7, 0, 0, "-", "lookup_table"]], "codecipher.atbs.decode": [[5, 1, 1, "", "AlephTawBetShinDecode"]], "codecipher.atbs.decode.AlephTawBetShinDecode": [[5, 2, 1, "", "_decode_data"], [5, 3, 1, "", "decode"], [5, 4, 1, "", "decode_data"]], "codecipher.atbs.encode": [[6, 1, 1, "", "AlephTawBetShinEncode"]], "codecipher.atbs.encode.AlephTawBetShinEncode": [[6, 2, 1, "", "_encode_data"], [6, 3, 1, "", "encode"], [6, 4, 1, "", "encode_data"]], "codecipher.b64": [[8, 1, 1, "", "B64"], [9, 0, 0, "-", "decode"], [10, 0, 0, "-", "encode"]], "codecipher.b64.decode": [[9, 1, 1, "", "B64Decode"]], "codecipher.b64.decode.B64Decode": [[9, 2, 1, "", "_decode_data"], [9, 3, 1, "", "decode"], [9, 4, 1, "", "decode_data"]], "codecipher.b64.encode": [[10, 1, 1, "", "B64Encode"]], "codecipher.b64.encode.B64Encode": [[10, 2, 1, "", "_encode_data"], [10, 3, 1, "", "encode"], [10, 4, 1, "", "encode_data"]], "codecipher.caesar": [[11, 1, 1, "", "Caesar"], [12, 0, 0, "-", "decode"], [13, 0, 0, "-", "encode"]], "codecipher.caesar.decode": [[12, 1, 1, "", "CaesarDecode"]], "codecipher.caesar.decode.CaesarDecode": [[12, 2, 1, "", "_decode_data"], [12, 3, 1, "", "decode"], [12, 4, 1, "", "decode_data"]], "codecipher.caesar.encode": [[13, 1, 1, "", "CaesarEncode"]], "codecipher.caesar.encode.CaesarEncode": [[13, 2, 1, "", "_encode_data"], [13, 3, 1, "", "encode"], [13, 4, 1, "", "encode_data"]], "codecipher.vernam": [[14, 1, 1, "", "Vernam"], [15, 0, 0, "-", "decode"], [16, 0, 0, "-", "encode"]], "codecipher.vernam.decode": [[15, 1, 1, "", "VernamDecode"]], "codecipher.vernam.decode.VernamDecode": [[15, 2, 1, "", "_decode_data"], [15, 3, 1, "", "decode"], [15, 4, 1, "", "decode_data"]], "codecipher.vernam.encode": [[16, 1, 1, "", "VernamEncode"]], "codecipher.vernam.encode.VernamEncode": [[16, 2, 1, "", "_encode_data"], [16, 3, 1, "", "encode"], [16, 4, 1, "", "encode_data"]], "codecipher.vigenere": [[17, 1, 1, "", "Vigenere"], [18, 0, 0, "-", "decode"], [19, 0, 0, "-", "encode"], [20, 0, 0, "-", "key_generator"], [21, 0, 0, "-", "lookup_table"]], "codecipher.vigenere.decode": [[18, 1, 1, "", "VigenereDecode"]], "codecipher.vigenere.decode.VigenereDecode": [[18, 2, 1, "", "_decode_data"], [18, 3, 1, "", "_split_data_decode"], [18, 3, 1, "", "decode"], [18, 4, 1, "", "decode_data"]], "codecipher.vigenere.encode": [[19, 1, 1, "", "VigenereEncode"]], "codecipher.vigenere.encode.VigenereEncode": [[19, 2, 1, "", "_encode_data"], [19, 3, 1, "", "_split_data_encode"], [19, 3, 1, "", "encode"], [19, 4, 1, "", "encode_data"]], "codecipher.vigenere.key_generator": [[20, 1, 1, "", "KeyGenerator"]], "codecipher.vigenere.key_generator.KeyGenerator": [[20, 2, 1, "", "_data_len"], [20, 2, 1, "", "_key"], [20, 4, 1, "", "data_len"], [20, 3, 1, "", "generate_key"], [20, 4, 1, "", "key"]], "codecipher.vigenere.lookup_table": [[21, 1, 1, "", "LookUpTable"]], "codecipher.vigenere.lookup_table.LookUpTable": [[21, 2, 1, "", "ALPHA"], [21, 2, 1, "", "ALPHANUM"], [21, 2, 1, "", "INDEX_TO_LETTER"], [21, 2, 1, "", "LETTER_TO_INDEX"], [21, 2, 1, "", "NUM"], [21, 2, 1, "", "WHITE_SPACE"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:attribute", "3": "py:method", "4": "py:property"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "attribute", "Python attribute"], "3": ["py", "method", "Python method"], "4": ["py", "property", "Python property"]}, "titleterms": {"codeciph": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23], "packag": [0, 1, 4, 8, 11, 14, 17, 22], "subpackag": 0, "modul": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "content": [0, 1, 4, 8, 11, 14, 17, 22], "a1z52n62": [1, 2, 3], "submodul": [1, 4, 8, 11, 14, 17], "decod": [2, 5, 9, 12, 15, 18], "encod": [3, 6, 10, 13, 16, 19], "atb": [4, 5, 6, 7], "lookup_t": [7, 21], "b64": [8, 9, 10], "caesar": [11, 12, 13], "vernam": [14, 15, 16], "vigener": [17, 18, 19, 20, 21], "key_gener": 20, "instal": 22, "depend": 22, "structur": 22, "copyright": 22, "licenc": 22, "indic": 22, "tabl": 22}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1, "sphinx": 60}, "alltitles": {"codecipher package": [[0, "codecipher-package"]], "Subpackages": [[0, "subpackages"]], "Module contents": [[0, "module-codecipher"], [1, "module-codecipher.a1z52n62"], [4, "module-codecipher.atbs"], [8, "module-codecipher.b64"], [11, "module-codecipher.caesar"], [14, "module-codecipher.vernam"], [17, "module-codecipher.vigenere"]], "codecipher.a1z52n62 package": [[1, "codecipher-a1z52n62-package"]], "Submodules": [[1, "submodules"], [4, "submodules"], [8, "submodules"], [11, "submodules"], [14, "submodules"], [17, "submodules"]], "codecipher.a1z52n62.decode module": [[2, "module-codecipher.a1z52n62.decode"]], "codecipher.a1z52n62.encode module": [[3, "module-codecipher.a1z52n62.encode"]], "codecipher.atbs package": [[4, "codecipher-atbs-package"]], "codecipher.atbs.decode module": [[5, "module-codecipher.atbs.decode"]], "codecipher.atbs.encode module": [[6, "module-codecipher.atbs.encode"]], "codecipher.atbs.lookup_table module": [[7, "module-codecipher.atbs.lookup_table"]], "codecipher.b64 package": [[8, "codecipher-b64-package"]], "codecipher.b64.decode module": [[9, "module-codecipher.b64.decode"]], "codecipher.b64.encode module": [[10, "module-codecipher.b64.encode"]], "codecipher.caesar package": [[11, "codecipher-caesar-package"]], "codecipher.caesar.decode module": [[12, "module-codecipher.caesar.decode"]], "codecipher.caesar.encode module": [[13, "module-codecipher.caesar.encode"]], "codecipher.vernam package": [[14, "codecipher-vernam-package"]], "codecipher.vernam.decode module": [[15, "module-codecipher.vernam.decode"]], "codecipher.vernam.encode module": [[16, "module-codecipher.vernam.encode"]], "codecipher.vigenere package": [[17, "codecipher-vigenere-package"]], "codecipher.vigenere.decode module": [[18, "module-codecipher.vigenere.decode"]], "codecipher.vigenere.encode module": [[19, "module-codecipher.vigenere.encode"]], "codecipher.vigenere.key_generator module": [[20, "module-codecipher.vigenere.key_generator"]], "codecipher.vigenere.lookup_table module": [[21, "module-codecipher.vigenere.lookup_table"]], "CODECipher": [[22, "codecipher"]], "Contents": [[22, null]], "Installation": [[22, "installation"]], "Dependencies": [[22, "dependencies"]], "Package structure": [[22, "package-structure"]], "Copyright and licence": [[22, "copyright-and-licence"]], "Indices and tables": [[22, "indices-and-tables"]], "codecipher": [[23, "codecipher"]]}, "indexentries": {"codecipher": [[0, "module-codecipher"]], "module": [[0, "module-codecipher"], [1, "module-codecipher.a1z52n62"], [2, "module-codecipher.a1z52n62.decode"], [3, "module-codecipher.a1z52n62.encode"], [4, "module-codecipher.atbs"], [5, "module-codecipher.atbs.decode"], [6, "module-codecipher.atbs.encode"], [7, "module-codecipher.atbs.lookup_table"], [8, "module-codecipher.b64"], [9, "module-codecipher.b64.decode"], [10, "module-codecipher.b64.encode"], [11, "module-codecipher.caesar"], [12, "module-codecipher.caesar.decode"], [13, "module-codecipher.caesar.encode"], [14, "module-codecipher.vernam"], [15, "module-codecipher.vernam.decode"], [16, "module-codecipher.vernam.encode"], [17, "module-codecipher.vigenere"], [18, "module-codecipher.vigenere.decode"], [19, "module-codecipher.vigenere.encode"], [20, "module-codecipher.vigenere.key_generator"], [21, "module-codecipher.vigenere.lookup_table"]], "a1z52n62 (class in codecipher.a1z52n62)": [[1, "codecipher.a1z52n62.A1z52N62"]], "codecipher.a1z52n62": [[1, "module-codecipher.a1z52n62"]], "a1z52n62decode (class in codecipher.a1z52n62.decode)": [[2, "codecipher.a1z52n62.decode.A1z52N62Decoder"]], "_decode_data (codecipher.a1z52n62.decode.a1z52n62decode attribute)": [[2, "codecipher.a1z52n62.decode.A1z52N62Decoder._decode_data"]], "codecipher.a1z52n62.decode": [[2, "module-codecipher.a1z52n62.decode"]], "decode() (codecipher.a1z52n62.decode.a1z52n62decode method)": [[2, "codecipher.a1z52n62.decode.A1z52N62Decoder.decode"]], "decode_data (codecipher.a1z52n62.decode.a1z52n62decode property)": [[2, "codecipher.a1z52n62.decode.A1z52N62Decoder.decode_data"]], "a1z52n62encode (class in codecipher.a1z52n62.encode)": [[3, "codecipher.a1z52n62.encode.A1z52N62Encoder"]], "_encode_data (codecipher.a1z52n62.encode.a1z52n62encode attribute)": [[3, "codecipher.a1z52n62.encode.A1z52N62Encoder._encode_data"]], "codecipher.a1z52n62.encode": [[3, "module-codecipher.a1z52n62.encode"]], "encode() (codecipher.a1z52n62.encode.a1z52n62encode method)": [[3, "codecipher.a1z52n62.encode.A1z52N62Encoder.encode"]], "encode_data (codecipher.a1z52n62.encode.a1z52n62encode property)": [[3, "codecipher.a1z52n62.encode.A1z52N62Encoder.encode_data"]], "alephtawbetshin (class in codecipher.atbs)": [[4, "codecipher.atbs.AlephTawBetShin"]], "codecipher.atbs": [[4, "module-codecipher.atbs"]], "alephtawbetshindecode (class in codecipher.atbs.decode)": [[5, "codecipher.atbs.decode.AlephTawBetShinDecode"]], "_decode_data (codecipher.atbs.decode.alephtawbetshindecode attribute)": [[5, "codecipher.atbs.decode.AlephTawBetShinDecode._decode_data"]], "codecipher.atbs.decode": [[5, "module-codecipher.atbs.decode"]], "decode() (codecipher.atbs.decode.alephtawbetshindecode method)": [[5, "codecipher.atbs.decode.AlephTawBetShinDecode.decode"]], "decode_data (codecipher.atbs.decode.alephtawbetshindecode property)": [[5, "codecipher.atbs.decode.AlephTawBetShinDecode.decode_data"]], "alephtawbetshinencode (class in codecipher.atbs.encode)": [[6, "codecipher.atbs.encode.AlephTawBetShinEncode"]], "_encode_data (codecipher.atbs.encode.alephtawbetshinencode attribute)": [[6, "codecipher.atbs.encode.AlephTawBetShinEncode._encode_data"]], "codecipher.atbs.encode": [[6, "module-codecipher.atbs.encode"]], "encode() (codecipher.atbs.encode.alephtawbetshinencode method)": [[6, "codecipher.atbs.encode.AlephTawBetShinEncode.encode"]], "encode_data (codecipher.atbs.encode.alephtawbetshinencode property)": [[6, "codecipher.atbs.encode.AlephTawBetShinEncode.encode_data"]], "codecipher.atbs.lookup_table": [[7, "module-codecipher.atbs.lookup_table"]], "b64 (class in codecipher.b64)": [[8, "codecipher.b64.B64"]], "codecipher.b64": [[8, "module-codecipher.b64"]], "b64decode (class in codecipher.b64.decode)": [[9, "codecipher.b64.decode.B64Decode"]], "_decode_data (codecipher.b64.decode.b64decode attribute)": [[9, "codecipher.b64.decode.B64Decode._decode_data"]], "codecipher.b64.decode": [[9, "module-codecipher.b64.decode"]], "decode() (codecipher.b64.decode.b64decode method)": [[9, "codecipher.b64.decode.B64Decode.decode"]], "decode_data (codecipher.b64.decode.b64decode property)": [[9, "codecipher.b64.decode.B64Decode.decode_data"]], "b64encode (class in codecipher.b64.encode)": [[10, "codecipher.b64.encode.B64Encode"]], "_encode_data (codecipher.b64.encode.b64encode attribute)": [[10, "codecipher.b64.encode.B64Encode._encode_data"]], "codecipher.b64.encode": [[10, "module-codecipher.b64.encode"]], "encode() (codecipher.b64.encode.b64encode method)": [[10, "codecipher.b64.encode.B64Encode.encode"]], "encode_data (codecipher.b64.encode.b64encode property)": [[10, "codecipher.b64.encode.B64Encode.encode_data"]], "caesar (class in codecipher.caesar)": [[11, "codecipher.caesar.Caesar"]], "codecipher.caesar": [[11, "module-codecipher.caesar"]], "caesardecode (class in codecipher.caesar.decode)": [[12, "codecipher.caesar.decode.CaesarDecode"]], "_decode_data (codecipher.caesar.decode.caesardecode attribute)": [[12, "codecipher.caesar.decode.CaesarDecode._decode_data"]], "codecipher.caesar.decode": [[12, "module-codecipher.caesar.decode"]], "decode() (codecipher.caesar.decode.caesardecode method)": [[12, "codecipher.caesar.decode.CaesarDecode.decode"]], "decode_data (codecipher.caesar.decode.caesardecode property)": [[12, "codecipher.caesar.decode.CaesarDecode.decode_data"]], "caesarencode (class in codecipher.caesar.encode)": [[13, "codecipher.caesar.encode.CaesarEncode"]], "_encode_data (codecipher.caesar.encode.caesarencode attribute)": [[13, "codecipher.caesar.encode.CaesarEncode._encode_data"]], "codecipher.caesar.encode": [[13, "module-codecipher.caesar.encode"]], "encode() (codecipher.caesar.encode.caesarencode method)": [[13, "codecipher.caesar.encode.CaesarEncode.encode"]], "encode_data (codecipher.caesar.encode.caesarencode property)": [[13, "codecipher.caesar.encode.CaesarEncode.encode_data"]], "vernam (class in codecipher.vernam)": [[14, "codecipher.vernam.Vernam"]], "codecipher.vernam": [[14, "module-codecipher.vernam"]], "vernamdecode (class in codecipher.vernam.decode)": [[15, "codecipher.vernam.decode.VernamDecode"]], "_decode_data (codecipher.vernam.decode.vernamdecode attribute)": [[15, "codecipher.vernam.decode.VernamDecode._decode_data"]], "codecipher.vernam.decode": [[15, "module-codecipher.vernam.decode"]], "decode() (codecipher.vernam.decode.vernamdecode method)": [[15, "codecipher.vernam.decode.VernamDecode.decode"]], "decode_data (codecipher.vernam.decode.vernamdecode property)": [[15, "codecipher.vernam.decode.VernamDecode.decode_data"]], "vernamencode (class in codecipher.vernam.encode)": [[16, "codecipher.vernam.encode.VernamEncode"]], "_encode_data (codecipher.vernam.encode.vernamencode attribute)": [[16, "codecipher.vernam.encode.VernamEncode._encode_data"]], "codecipher.vernam.encode": [[16, "module-codecipher.vernam.encode"]], "encode() (codecipher.vernam.encode.vernamencode method)": [[16, "codecipher.vernam.encode.VernamEncode.encode"]], "encode_data (codecipher.vernam.encode.vernamencode property)": [[16, "codecipher.vernam.encode.VernamEncode.encode_data"]], "vigenere (class in codecipher.vigenere)": [[17, "codecipher.vigenere.Vigenere"]], "codecipher.vigenere": [[17, "module-codecipher.vigenere"]], "vigeneredecode (class in codecipher.vigenere.decode)": [[18, "codecipher.vigenere.decode.VigenereDecode"]], "_decode_data (codecipher.vigenere.decode.vigeneredecode attribute)": [[18, "codecipher.vigenere.decode.VigenereDecode._decode_data"]], "_split_data_decode() (codecipher.vigenere.decode.vigeneredecode method)": [[18, "codecipher.vigenere.decode.VigenereDecode._split_data_decode"]], "codecipher.vigenere.decode": [[18, "module-codecipher.vigenere.decode"]], "decode() (codecipher.vigenere.decode.vigeneredecode method)": [[18, "codecipher.vigenere.decode.VigenereDecode.decode"]], "decode_data (codecipher.vigenere.decode.vigeneredecode property)": [[18, "codecipher.vigenere.decode.VigenereDecode.decode_data"]], "vigenereencode (class in codecipher.vigenere.encode)": [[19, "codecipher.vigenere.encode.VigenereEncode"]], "_encode_data (codecipher.vigenere.encode.vigenereencode attribute)": [[19, "codecipher.vigenere.encode.VigenereEncode._encode_data"]], "_split_data_encode() (codecipher.vigenere.encode.vigenereencode method)": [[19, "codecipher.vigenere.encode.VigenereEncode._split_data_encode"]], "codecipher.vigenere.encode": [[19, "module-codecipher.vigenere.encode"]], "encode() (codecipher.vigenere.encode.vigenereencode method)": [[19, "codecipher.vigenere.encode.VigenereEncode.encode"]], "encode_data (codecipher.vigenere.encode.vigenereencode property)": [[19, "codecipher.vigenere.encode.VigenereEncode.encode_data"]], "keygenerator (class in codecipher.vigenere.key_generator)": [[20, "codecipher.vigenere.key_generator.KeyGenerator"]], "_data_len (codecipher.vigenere.key_generator.keygenerator attribute)": [[20, "codecipher.vigenere.key_generator.KeyGenerator._data_len"]], "_key (codecipher.vigenere.key_generator.keygenerator attribute)": [[20, "codecipher.vigenere.key_generator.KeyGenerator._key"]], "codecipher.vigenere.key_generator": [[20, "module-codecipher.vigenere.key_generator"]], "data_len (codecipher.vigenere.key_generator.keygenerator property)": [[20, "codecipher.vigenere.key_generator.KeyGenerator.data_len"]], "generate_key() (codecipher.vigenere.key_generator.keygenerator method)": [[20, "codecipher.vigenere.key_generator.KeyGenerator.generate_key"]], "key (codecipher.vigenere.key_generator.keygenerator property)": [[20, "codecipher.vigenere.key_generator.KeyGenerator.key"]], "alpha (codecipher.vigenere.lookup_table.lookuptable attribute)": [[21, "codecipher.vigenere.lookup_table.LookUpTable.ALPHA"]], "alphanum (codecipher.vigenere.lookup_table.lookuptable attribute)": [[21, "codecipher.vigenere.lookup_table.LookUpTable.ALPHANUM"]], "index_to_letter (codecipher.vigenere.lookup_table.lookuptable attribute)": [[21, "codecipher.vigenere.lookup_table.LookUpTable.INDEX_TO_LETTER"]], "letter_to_index (codecipher.vigenere.lookup_table.lookuptable attribute)": [[21, "codecipher.vigenere.lookup_table.LookUpTable.LETTER_TO_INDEX"]], "lookuptable (class in codecipher.vigenere.lookup_table)": [[21, "codecipher.vigenere.lookup_table.LookUpTable"]], "num (codecipher.vigenere.lookup_table.lookuptable attribute)": [[21, "codecipher.vigenere.lookup_table.LookUpTable.NUM"]], "white_space (codecipher.vigenere.lookup_table.lookuptable attribute)": [[21, "codecipher.vigenere.lookup_table.LookUpTable.WHITE_SPACE"]], "codecipher.vigenere.lookup_table": [[21, "module-codecipher.vigenere.lookup_table"]]}}) \ No newline at end of file diff --git a/docs/source/conf.py b/docs/source/conf.py index ec3d9af..28fbf78 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -29,7 +29,7 @@ project: str = 'codecipher' project_copyright: str = '2026, Vladimir Roncevic ' author: str = 'Vladimir Roncevic ' -version: str = '1.5.0' +version: str = '1.5.1' release: str = 'https://github.com/electux/codecipher/releases' extensions: List[str] = ['sphinx.ext.autodoc', 'sphinx.ext.viewcode'] templates_path: List[str] = ['_templates'] diff --git a/setup.py b/setup.py index 14eb626..8142db9 100644 --- a/setup.py +++ b/setup.py @@ -29,7 +29,7 @@ __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' -__version__: str = '1.5.0' +__version__: str = '1.5.1' __maintainer__: str = 'Vladimir Roncevic' __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' @@ -46,7 +46,7 @@ PYP_CLASSIFIERS: List[str] = SUPPORTED_PY_VERSIONS setup( name='codecipher', - version='1.5.0', + version='1.5.1', description='Python Cipher Utilities', author='Vladimir Roncevic', author_email='elektron.ronca@gmail.com', diff --git a/tests/a1z52n62_test.py b/tests/a1z52n62_test.py index b3c5a6e..acb0be4 100644 --- a/tests/a1z52n62_test.py +++ b/tests/a1z52n62_test.py @@ -36,7 +36,7 @@ __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__: str = 'https://github.com/electux/codecipher/blob/dev/LICENSE' -__version__: str = '1.5.0' +__version__: str = '1.5.1' __maintainer__: str = 'Vladimir Roncevic' __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' diff --git a/tests/atbs_test.py b/tests/atbs_test.py index 0e53cd2..e367954 100644 --- a/tests/atbs_test.py +++ b/tests/atbs_test.py @@ -36,7 +36,7 @@ __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__: str = 'https://github.com/electux/codecipher/blob/dev/LICENSE' -__version__: str = '1.5.0' +__version__: str = '1.5.1' __maintainer__: str = 'Vladimir Roncevic' __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' diff --git a/tests/ats_coverage.py b/tests/ats_coverage.py index 6ee464a..3bb9756 100644 --- a/tests/ats_coverage.py +++ b/tests/ats_coverage.py @@ -43,7 +43,7 @@ __copyright__: str = '(C) 2026, https://vroncevic.github.io/ats_coverage' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__: str = 'https://github.com/vroncevic/ats_coverage/blob/dev/LICENSE' -__version__: str = '1.5.0' +__version__: str = '1.5.1' __maintainer__: str = 'Vladimir Roncevic' __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' diff --git a/tests/b64_test.py b/tests/b64_test.py index 902b448..d41cd60 100644 --- a/tests/b64_test.py +++ b/tests/b64_test.py @@ -36,7 +36,7 @@ __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__: str = 'https://github.com/electux/codecipher/blob/dev/LICENSE' -__version__: str = '1.5.0' +__version__: str = '1.5.1' __maintainer__: str = 'Vladimir Roncevic' __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' diff --git a/tests/caesar_test.py b/tests/caesar_test.py index 7412e19..96b49c7 100644 --- a/tests/caesar_test.py +++ b/tests/caesar_test.py @@ -36,7 +36,7 @@ __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__: str = 'https://github.com/electux/codecipher/blob/dev/LICENSE' -__version__: str = '1.5.0' +__version__: str = '1.5.1' __maintainer__: str = 'Vladimir Roncevic' __email__: str = 'elektron.ronca@gmail.com' __status__: str = 'Updated' diff --git a/tests/codecipher_coverage.json b/tests/codecipher_coverage.json index 5bd26bd..17b395b 100644 --- a/tests/codecipher_coverage.json +++ b/tests/codecipher_coverage.json @@ -1 +1 @@ -{"meta": {"format": 3, "version": "7.6.10", "timestamp": "2025-11-05T04:57:55.789623", "branch_coverage": false, "show_contexts": false}, "files": {"/data/dev/python/codecipher/github/codecipher/codecipher/__init__.py": {"executed_lines": [3], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [3], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [3], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/__init__.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56, 62], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31], "functions": {"A1z52N62.__init__": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"A1z52N62": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/decode.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 62, 64, 65, 77, 86, 87, 88, 89, 90, 91, 92, 94, 96, 98, 99], "summary": {"covered_lines": 30, "num_statements": 32, "percent_covered": 93.75, "percent_covered_display": "94", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": [], "functions": {"A1z52N62Decode.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "A1z52N62Decode.decode": {"executed_lines": [86, 87, 88, 89, 90, 91, 92, 94, 96, 98, 99], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"A1z52N62Decode": {"executed_lines": [62, 86, 87, 88, 89, 90, 91, 92, 94, 96, 98, 99], "summary": {"covered_lines": 12, "num_statements": 14, "percent_covered": 85.71428571428571, "percent_covered_display": "86", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/encode.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 62, 64, 65, 77, 86, 87, 88, 89, 90, 91, 93, 95, 96, 98, 99], "summary": {"covered_lines": 30, "num_statements": 32, "percent_covered": 93.75, "percent_covered_display": "94", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": [], "functions": {"A1z52N62Encode.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "A1z52N62Encode.encode": {"executed_lines": [86, 87, 88, 89, 90, 91, 93, 95, 96, 98, 99], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"A1z52N62Encode": {"executed_lines": [62, 86, 87, 88, 89, 90, 91, 93, 95, 96, 98, 99], "summary": {"covered_lines": 12, "num_statements": 14, "percent_covered": 85.71428571428571, "percent_covered_display": "86", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/atbs/__init__.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56, 62], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31], "functions": {"AlephTawBetShin.__init__": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"AlephTawBetShin": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/atbs/decode.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 58, 60, 61, 69, 71, 72, 84, 93, 94, 95, 96, 97], "summary": {"covered_lines": 27, "num_statements": 29, "percent_covered": 93.10344827586206, "percent_covered_display": "93", "missing_lines": 2, "excluded_lines": 2}, "missing_lines": [81, 82], "excluded_lines": [29, 31], "functions": {"AlephTawBetShinDecode.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [81, 82], "excluded_lines": []}, "AlephTawBetShinDecode.decode": {"executed_lines": [93, 94, 95, 96, 97], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 58, 60, 61, 71, 72, 84], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"AlephTawBetShinDecode": {"executed_lines": [69, 93, 94, 95, 96, 97], "summary": {"covered_lines": 6, "num_statements": 8, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [81, 82], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 58, 60, 61, 71, 72, 84], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/atbs/encode.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 58, 60, 61, 69, 71, 72, 84, 93, 94, 95, 96, 97], "summary": {"covered_lines": 27, "num_statements": 29, "percent_covered": 93.10344827586206, "percent_covered_display": "93", "missing_lines": 2, "excluded_lines": 2}, "missing_lines": [81, 82], "excluded_lines": [29, 31], "functions": {"AlephTawBetShinEncode.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [81, 82], "excluded_lines": []}, "AlephTawBetShinEncode.encode": {"executed_lines": [93, 94, 95, 96, 97], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 58, 60, 61, 71, 72, 84], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"AlephTawBetShinEncode": {"executed_lines": [69, 93, 94, 95, 96, 97], "summary": {"covered_lines": 6, "num_statements": 8, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [81, 82], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 58, 60, 61, 71, 72, 84], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/atbs/lookup_table.py": {"executed_lines": [3, 22, 24, 25, 26, 27, 28, 29, 30, 31, 33], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [3, 22, 24, 25, 26, 27, 28, 29, 30, 31, 33], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [3, 22, 24, 25, 26, 27, 28, 29, 30, 31, 33], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/b64/__init__.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56, 62], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31], "functions": {"B64.__init__": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"B64": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/b64/decode.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 63, 65, 66, 78, 87, 88], "summary": {"covered_lines": 22, "num_statements": 24, "percent_covered": 91.66666666666667, "percent_covered_display": "92", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": [], "functions": {"B64Decode.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": []}, "B64Decode.decode": {"executed_lines": [87, 88], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 65, 66, 78], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"B64Decode": {"executed_lines": [63, 87, 88], "summary": {"covered_lines": 3, "num_statements": 5, "percent_covered": 60.0, "percent_covered_display": "60", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 65, 66, 78], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/b64/encode.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 63, 65, 66, 78, 87, 88], "summary": {"covered_lines": 22, "num_statements": 24, "percent_covered": 91.66666666666667, "percent_covered_display": "92", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": [], "functions": {"B64Encode.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": []}, "B64Encode.encode": {"executed_lines": [87, 88], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 65, 66, 78], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"B64Encode": {"executed_lines": [63, 87, 88], "summary": {"covered_lines": 3, "num_statements": 5, "percent_covered": 60.0, "percent_covered_display": "60", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 65, 66, 78], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/caesar/__init__.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56, 62], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31], "functions": {"Caesar.__init__": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"Caesar": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/caesar/decode.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 62, 64, 65, 77, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110], "summary": {"covered_lines": 39, "num_statements": 41, "percent_covered": 95.1219512195122, "percent_covered_display": "95", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": [], "functions": {"CaesarDecode.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "CaesarDecode.decode": {"executed_lines": [90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110], "summary": {"covered_lines": 20, "num_statements": 20, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"CaesarDecode": {"executed_lines": [62, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110], "summary": {"covered_lines": 21, "num_statements": 23, "percent_covered": 91.30434782608695, "percent_covered_display": "91", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/caesar/encode.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 62, 64, 65, 77, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110], "summary": {"covered_lines": 39, "num_statements": 41, "percent_covered": 95.1219512195122, "percent_covered_display": "95", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": [], "functions": {"CaesarEncode.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "CaesarEncode.encode": {"executed_lines": [90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110], "summary": {"covered_lines": 20, "num_statements": 20, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"CaesarEncode": {"executed_lines": [62, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110], "summary": {"covered_lines": 21, "num_statements": 23, "percent_covered": 91.30434782608695, "percent_covered_display": "91", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vernam/__init__.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56, 62], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31], "functions": {"Vernam.__init__": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"Vernam": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vernam/decode.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 62, 64, 65, 77, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 101, 103, 104], "summary": {"covered_lines": 34, "num_statements": 36, "percent_covered": 94.44444444444444, "percent_covered_display": "94", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": [], "functions": {"VernamDecode.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "VernamDecode.decode": {"executed_lines": [88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 101, 103, 104], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"VernamDecode": {"executed_lines": [62, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 101, 103, 104], "summary": {"covered_lines": 16, "num_statements": 18, "percent_covered": 88.88888888888889, "percent_covered_display": "89", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vernam/encode.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 62, 64, 65, 77, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 101, 103, 104], "summary": {"covered_lines": 34, "num_statements": 36, "percent_covered": 94.44444444444444, "percent_covered_display": "94", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": [], "functions": {"VernamEncode.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "VernamEncode.encode": {"executed_lines": [88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 101, 103, 104], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"VernamEncode": {"executed_lines": [62, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 101, 103, 104], "summary": {"covered_lines": 16, "num_statements": 18, "percent_covered": 88.88888888888889, "percent_covered_display": "89", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/__init__.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 57, 63], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [30, 32], "functions": {"Vigenere.__init__": {"executed_lines": [63], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 57], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [30, 32]}}, "classes": {"Vigenere": {"executed_lines": [63], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 57], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [30, 32]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/decode.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 59, 61, 62, 70, 72, 73, 85, 99, 100, 101, 102, 103, 105, 118, 119, 120, 121, 122, 126, 129], "summary": {"covered_lines": 35, "num_statements": 37, "percent_covered": 94.5945945945946, "percent_covered_display": "95", "missing_lines": 2, "excluded_lines": 2}, "missing_lines": [82, 83], "excluded_lines": [29, 31], "functions": {"VigenereDecode.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [82, 83], "excluded_lines": []}, "VigenereDecode._split_data_decode": {"executed_lines": [99, 100, 101, 102, 103], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "VigenereDecode.decode": {"executed_lines": [118, 119, 120, 121, 122, 126, 129], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 59, 61, 62, 72, 73, 85, 105], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"VigenereDecode": {"executed_lines": [70, 99, 100, 101, 102, 103, 118, 119, 120, 121, 122, 126, 129], "summary": {"covered_lines": 13, "num_statements": 15, "percent_covered": 86.66666666666667, "percent_covered_display": "87", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [82, 83], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 59, 61, 62, 72, 73, 85, 105], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/encode.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 59, 61, 62, 70, 72, 73, 85, 99, 100, 101, 102, 103, 105, 118, 119, 120, 121, 122, 126, 129], "summary": {"covered_lines": 35, "num_statements": 37, "percent_covered": 94.5945945945946, "percent_covered_display": "95", "missing_lines": 2, "excluded_lines": 2}, "missing_lines": [82, 83], "excluded_lines": [29, 31], "functions": {"VigenereEncode.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [82, 83], "excluded_lines": []}, "VigenereEncode._split_data_encode": {"executed_lines": [99, 100, 101, 102, 103], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "VigenereEncode.encode": {"executed_lines": [118, 119, 120, 121, 122, 126, 129], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 59, 61, 62, 72, 73, 85, 105], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"VigenereEncode": {"executed_lines": [70, 99, 100, 101, 102, 103, 118, 119, 120, 121, 122, 126, 129], "summary": {"covered_lines": 13, "num_statements": 15, "percent_covered": 86.66666666666667, "percent_covered_display": "87", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [82, 83], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 59, 61, 62, 72, 73, 85, 105], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/key_generator.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 53, 54, 56, 57, 67, 68, 77, 78, 80, 81, 89, 91, 92, 101, 102, 104, 111, 112, 113, 114, 117, 118, 119], "summary": {"covered_lines": 35, "num_statements": 37, "percent_covered": 94.5945945945946, "percent_covered_display": "95", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [65, 115], "excluded_lines": [], "functions": {"KeyGenerator.data_len": {"executed_lines": [77, 78], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "KeyGenerator.key": {"executed_lines": [101, 102], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "KeyGenerator.generate_key": {"executed_lines": [111, 112, 113, 114, 117, 118, 119], "summary": {"covered_lines": 7, "num_statements": 8, "percent_covered": 87.5, "percent_covered_display": "88", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [115], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 53, 54, 56, 57, 67, 68, 80, 81, 91, 92, 104], "summary": {"covered_lines": 23, "num_statements": 23, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"KeyGenerator": {"executed_lines": [77, 78, 89, 101, 102, 111, 112, 113, 114, 117, 118, 119], "summary": {"covered_lines": 12, "num_statements": 14, "percent_covered": 85.71428571428571, "percent_covered_display": "86", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [65, 115], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 53, 54, 56, 57, 67, 68, 80, 81, 91, 92, 104], "summary": {"covered_lines": 23, "num_statements": 23, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/lookup_table.py": {"executed_lines": [3, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 53, 54, 55, 56, 57, 58], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [3, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 53, 54, 55, 56, 57, 58], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"LookUpTable": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 53, 54, 55, 56, 57, 58], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}}, "totals": {"covered_lines": 532, "num_statements": 558, "percent_covered": 95.3405017921147, "percent_covered_display": "95", "missing_lines": 26, "excluded_lines": 20}} \ No newline at end of file +{"meta": {"format": 3, "version": "7.6.10", "timestamp": "2025-11-05T04:57:55.789623", "branch_coverage": false, "show_contexts": false}, "files": {"/data/dev/python/codecipher/github/codecipher/codecipher/__init__.py": {"executed_lines": [3], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [3], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [3], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/__init__.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56, 62], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31], "functions": {"A1z52N62.__init__": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"A1z52N62": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/decode.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 62, 64, 65, 77, 86, 87, 88, 89, 90, 91, 92, 94, 96, 98, 99], "summary": {"covered_lines": 30, "num_statements": 32, "percent_covered": 93.75, "percent_covered_display": "94", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": [], "functions": {"A1z52N62Decoder.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "A1z52N62Decoder.decode": {"executed_lines": [86, 87, 88, 89, 90, 91, 92, 94, 96, 98, 99], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"A1z52N62Decoder": {"executed_lines": [62, 86, 87, 88, 89, 90, 91, 92, 94, 96, 98, 99], "summary": {"covered_lines": 12, "num_statements": 14, "percent_covered": 85.71428571428571, "percent_covered_display": "86", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/encode.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 62, 64, 65, 77, 86, 87, 88, 89, 90, 91, 93, 95, 96, 98, 99], "summary": {"covered_lines": 30, "num_statements": 32, "percent_covered": 93.75, "percent_covered_display": "94", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": [], "functions": {"A1z52N62Encoder.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "A1z52N62Encoder.encode": {"executed_lines": [86, 87, 88, 89, 90, 91, 93, 95, 96, 98, 99], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"A1z52N62Encoder": {"executed_lines": [62, 86, 87, 88, 89, 90, 91, 93, 95, 96, 98, 99], "summary": {"covered_lines": 12, "num_statements": 14, "percent_covered": 85.71428571428571, "percent_covered_display": "86", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/atbs/__init__.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56, 62], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31], "functions": {"AlephTawBetShin.__init__": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"AlephTawBetShin": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/atbs/decode.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 58, 60, 61, 69, 71, 72, 84, 93, 94, 95, 96, 97], "summary": {"covered_lines": 27, "num_statements": 29, "percent_covered": 93.10344827586206, "percent_covered_display": "93", "missing_lines": 2, "excluded_lines": 2}, "missing_lines": [81, 82], "excluded_lines": [29, 31], "functions": {"AlephTawBetShinDecode.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [81, 82], "excluded_lines": []}, "AlephTawBetShinDecode.decode": {"executed_lines": [93, 94, 95, 96, 97], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 58, 60, 61, 71, 72, 84], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"AlephTawBetShinDecode": {"executed_lines": [69, 93, 94, 95, 96, 97], "summary": {"covered_lines": 6, "num_statements": 8, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [81, 82], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 58, 60, 61, 71, 72, 84], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/atbs/encode.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 58, 60, 61, 69, 71, 72, 84, 93, 94, 95, 96, 97], "summary": {"covered_lines": 27, "num_statements": 29, "percent_covered": 93.10344827586206, "percent_covered_display": "93", "missing_lines": 2, "excluded_lines": 2}, "missing_lines": [81, 82], "excluded_lines": [29, 31], "functions": {"AlephTawBetShinEncode.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [81, 82], "excluded_lines": []}, "AlephTawBetShinEncode.encode": {"executed_lines": [93, 94, 95, 96, 97], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 58, 60, 61, 71, 72, 84], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"AlephTawBetShinEncode": {"executed_lines": [69, 93, 94, 95, 96, 97], "summary": {"covered_lines": 6, "num_statements": 8, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [81, 82], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 58, 60, 61, 71, 72, 84], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/atbs/lookup_table.py": {"executed_lines": [3, 22, 24, 25, 26, 27, 28, 29, 30, 31, 33], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [3, 22, 24, 25, 26, 27, 28, 29, 30, 31, 33], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [3, 22, 24, 25, 26, 27, 28, 29, 30, 31, 33], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/b64/__init__.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56, 62], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31], "functions": {"B64.__init__": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"B64": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/b64/decode.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 63, 65, 66, 78, 87, 88], "summary": {"covered_lines": 22, "num_statements": 24, "percent_covered": 91.66666666666667, "percent_covered_display": "92", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": [], "functions": {"B64Decode.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": []}, "B64Decode.decode": {"executed_lines": [87, 88], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 65, 66, 78], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"B64Decode": {"executed_lines": [63, 87, 88], "summary": {"covered_lines": 3, "num_statements": 5, "percent_covered": 60.0, "percent_covered_display": "60", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 65, 66, 78], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/b64/encode.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 63, 65, 66, 78, 87, 88], "summary": {"covered_lines": 22, "num_statements": 24, "percent_covered": 91.66666666666667, "percent_covered_display": "92", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": [], "functions": {"B64Encode.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": []}, "B64Encode.encode": {"executed_lines": [87, 88], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 65, 66, 78], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"B64Encode": {"executed_lines": [63, 87, 88], "summary": {"covered_lines": 3, "num_statements": 5, "percent_covered": 60.0, "percent_covered_display": "60", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 65, 66, 78], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/caesar/__init__.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56, 62], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31], "functions": {"Caesar.__init__": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"Caesar": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/caesar/decode.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 62, 64, 65, 77, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110], "summary": {"covered_lines": 39, "num_statements": 41, "percent_covered": 95.1219512195122, "percent_covered_display": "95", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": [], "functions": {"CaesarDecode.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "CaesarDecode.decode": {"executed_lines": [90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110], "summary": {"covered_lines": 20, "num_statements": 20, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"CaesarDecode": {"executed_lines": [62, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110], "summary": {"covered_lines": 21, "num_statements": 23, "percent_covered": 91.30434782608695, "percent_covered_display": "91", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/caesar/encode.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 62, 64, 65, 77, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110], "summary": {"covered_lines": 39, "num_statements": 41, "percent_covered": 95.1219512195122, "percent_covered_display": "95", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": [], "functions": {"CaesarEncode.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "CaesarEncode.encode": {"executed_lines": [90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110], "summary": {"covered_lines": 20, "num_statements": 20, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"CaesarEncode": {"executed_lines": [62, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110], "summary": {"covered_lines": 21, "num_statements": 23, "percent_covered": 91.30434782608695, "percent_covered_display": "91", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vernam/__init__.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56, 62], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31], "functions": {"Vernam.__init__": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"Vernam": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vernam/decode.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 62, 64, 65, 77, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 101, 103, 104], "summary": {"covered_lines": 34, "num_statements": 36, "percent_covered": 94.44444444444444, "percent_covered_display": "94", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": [], "functions": {"VernamDecode.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "VernamDecode.decode": {"executed_lines": [88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 101, 103, 104], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"VernamDecode": {"executed_lines": [62, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 101, 103, 104], "summary": {"covered_lines": 16, "num_statements": 18, "percent_covered": 88.88888888888889, "percent_covered_display": "89", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vernam/encode.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 62, 64, 65, 77, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 101, 103, 104], "summary": {"covered_lines": 34, "num_statements": 36, "percent_covered": 94.44444444444444, "percent_covered_display": "94", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": [], "functions": {"VernamEncode.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "VernamEncode.encode": {"executed_lines": [88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 101, 103, 104], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"VernamEncode": {"executed_lines": [62, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 101, 103, 104], "summary": {"covered_lines": 16, "num_statements": 18, "percent_covered": 88.88888888888889, "percent_covered_display": "89", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/__init__.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 57, 63], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [30, 32], "functions": {"Vigenere.__init__": {"executed_lines": [63], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 57], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [30, 32]}}, "classes": {"Vigenere": {"executed_lines": [63], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 57], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [30, 32]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/decode.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 59, 61, 62, 70, 72, 73, 85, 99, 100, 101, 102, 103, 105, 118, 119, 120, 121, 122, 126, 129], "summary": {"covered_lines": 35, "num_statements": 37, "percent_covered": 94.5945945945946, "percent_covered_display": "95", "missing_lines": 2, "excluded_lines": 2}, "missing_lines": [82, 83], "excluded_lines": [29, 31], "functions": {"VigenereDecode.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [82, 83], "excluded_lines": []}, "VigenereDecode._split_data_decode": {"executed_lines": [99, 100, 101, 102, 103], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "VigenereDecode.decode": {"executed_lines": [118, 119, 120, 121, 122, 126, 129], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 59, 61, 62, 72, 73, 85, 105], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"VigenereDecode": {"executed_lines": [70, 99, 100, 101, 102, 103, 118, 119, 120, 121, 122, 126, 129], "summary": {"covered_lines": 13, "num_statements": 15, "percent_covered": 86.66666666666667, "percent_covered_display": "87", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [82, 83], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 59, 61, 62, 72, 73, 85, 105], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/encode.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 59, 61, 62, 70, 72, 73, 85, 99, 100, 101, 102, 103, 105, 118, 119, 120, 121, 122, 126, 129], "summary": {"covered_lines": 35, "num_statements": 37, "percent_covered": 94.5945945945946, "percent_covered_display": "95", "missing_lines": 2, "excluded_lines": 2}, "missing_lines": [82, 83], "excluded_lines": [29, 31], "functions": {"VigenereEncode.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [82, 83], "excluded_lines": []}, "VigenereEncode._split_data_encode": {"executed_lines": [99, 100, 101, 102, 103], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "VigenereEncode.encode": {"executed_lines": [118, 119, 120, 121, 122, 126, 129], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 59, 61, 62, 72, 73, 85, 105], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"VigenereEncode": {"executed_lines": [70, 99, 100, 101, 102, 103, 118, 119, 120, 121, 122, 126, 129], "summary": {"covered_lines": 13, "num_statements": 15, "percent_covered": 86.66666666666667, "percent_covered_display": "87", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [82, 83], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 59, 61, 62, 72, 73, 85, 105], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/key_generator.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 53, 54, 56, 57, 67, 68, 77, 78, 80, 81, 89, 91, 92, 101, 102, 104, 111, 112, 113, 114, 117, 118, 119], "summary": {"covered_lines": 35, "num_statements": 37, "percent_covered": 94.5945945945946, "percent_covered_display": "95", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [65, 115], "excluded_lines": [], "functions": {"KeyGenerator.data_len": {"executed_lines": [77, 78], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "KeyGenerator.key": {"executed_lines": [101, 102], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "KeyGenerator.generate_key": {"executed_lines": [111, 112, 113, 114, 117, 118, 119], "summary": {"covered_lines": 7, "num_statements": 8, "percent_covered": 87.5, "percent_covered_display": "88", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [115], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 53, 54, 56, 57, 67, 68, 80, 81, 91, 92, 104], "summary": {"covered_lines": 23, "num_statements": 23, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"KeyGenerator": {"executed_lines": [77, 78, 89, 101, 102, 111, 112, 113, 114, 117, 118, 119], "summary": {"covered_lines": 12, "num_statements": 14, "percent_covered": 85.71428571428571, "percent_covered_display": "86", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [65, 115], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 53, 54, 56, 57, 67, 68, 80, 81, 91, 92, 104], "summary": {"covered_lines": 23, "num_statements": 23, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/lookup_table.py": {"executed_lines": [3, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 53, 54, 55, 56, 57, 58], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [3, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 53, 54, 55, 56, 57, 58], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"LookUpTable": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 53, 54, 55, 56, 57, 58], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}}, "totals": {"covered_lines": 532, "num_statements": 558, "percent_covered": 95.3405017921147, "percent_covered_display": "95", "missing_lines": 26, "excluded_lines": 20}} \ No newline at end of file diff --git a/tests/htmlcov/class_index.html b/tests/htmlcov/class_index.html index fbd5cdb..afdca3f 100644 --- a/tests/htmlcov/class_index.html +++ b/tests/htmlcov/class_index.html @@ -98,7 +98,7 @@

                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/decode.pyA1z52N62DecodeA1z52N62Decoder 14 2 0
                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/encode.pyA1z52N62EncodeA1z52N62Encoder 14 2 0
                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/decode.pyA1z52N62Decode.decode_dataA1z52N62Decoder.decode_data 1 0 0
                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/decode.pyA1z52N62Decode.decode_dataA1z52N62Decoder.decode_data 2 2 0
                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/decode.pyA1z52N62Decode.decodeA1z52N62Decoder.decode 11 0 0
                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/encode.pyA1z52N62Encode.encode_dataA1z52N62Encoder.encode_data 1 0 0
                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/encode.pyA1z52N62Encode.encode_dataA1z52N62Encoder.encode_data 2 2 0
                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/encode.pyA1z52N62Encode.encodeA1z52N62Encoder.encode 11 0 0
                          -
                        • AlephTawBetShinDecode (class in codecipher.atbs.decode) +
                        • ATBSDecode (class in codecipher.atbs.decode)
                        • -
                        • AlephTawBetShinEncode (class in codecipher.atbs.encode) +
                        • ATBSEncode (class in codecipher.atbs.encode)
                        • ALPHA (codecipher.vigenere.lookup_table.LookUpTable attribute)
                        • @@ -312,7 +312,7 @@

                          D

                        • decode() (codecipher.a1z52n62.decode.A1z52N62Decoder method)
                            -
                          • (codecipher.atbs.decode.AlephTawBetShinDecode method) +
                          • (codecipher.atbs.decode.ATBSDecode method)
                          • (codecipher.b64.decode.B64Decode method)
                          • @@ -328,7 +328,7 @@

                            D

                          • decode_data (codecipher.a1z52n62.decode.A1z52N62Decoder property)
                              -
                            • (codecipher.atbs.decode.AlephTawBetShinDecode property) +
                            • (codecipher.atbs.decode.ATBSDecode property)
                            • (codecipher.b64.decode.B64Decode property)
                            • @@ -348,7 +348,7 @@

                              E

                            • encode() (codecipher.a1z52n62.encode.A1z52N62Encoder method)
                                -
                              • (codecipher.atbs.encode.AlephTawBetShinEncode method) +
                              • (codecipher.atbs.encode.ATBSEncode method)
                              • (codecipher.b64.encode.B64Encode method)
                              • @@ -364,7 +364,7 @@

                                E

                              • encode_data (codecipher.a1z52n62.encode.A1z52N62Encoder property)
                                  -
                                • (codecipher.atbs.encode.AlephTawBetShinEncode property) +
                                • (codecipher.atbs.encode.ATBSEncode property)
                                • (codecipher.b64.encode.B64Encode property)
                                • diff --git a/docs/build/html/searchindex.js b/docs/build/html/searchindex.js index 65b36a6..a1ad1ea 100644 --- a/docs/build/html/searchindex.js +++ b/docs/build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["codecipher", "codecipher.a1z52n62", "codecipher.a1z52n62.decode", "codecipher.a1z52n62.encode", "codecipher.atbs", "codecipher.atbs.decode", "codecipher.atbs.encode", "codecipher.atbs.lookup_table", "codecipher.b64", "codecipher.b64.decode", "codecipher.b64.encode", "codecipher.caesar", "codecipher.caesar.decode", "codecipher.caesar.encode", "codecipher.vernam", "codecipher.vernam.decode", "codecipher.vernam.encode", "codecipher.vigenere", "codecipher.vigenere.decode", "codecipher.vigenere.encode", "codecipher.vigenere.key_generator", "codecipher.vigenere.lookup_table", "index", "modules"], "filenames": ["codecipher.rst", "codecipher.a1z52n62.rst", "codecipher.a1z52n62.decode.rst", "codecipher.a1z52n62.encode.rst", "codecipher.atbs.rst", "codecipher.atbs.decode.rst", "codecipher.atbs.encode.rst", "codecipher.atbs.lookup_table.rst", "codecipher.b64.rst", "codecipher.b64.decode.rst", "codecipher.b64.encode.rst", "codecipher.caesar.rst", "codecipher.caesar.decode.rst", "codecipher.caesar.encode.rst", "codecipher.vernam.rst", "codecipher.vernam.decode.rst", "codecipher.vernam.encode.rst", "codecipher.vigenere.rst", "codecipher.vigenere.decode.rst", "codecipher.vigenere.encode.rst", "codecipher.vigenere.key_generator.rst", "codecipher.vigenere.lookup_table.rst", "index.rst", "modules.rst"], "titles": ["codecipher package", "codecipher.a1z52n62 package", "codecipher.a1z52n62.decode module", "codecipher.a1z52n62.encode module", "codecipher.atbs package", "codecipher.atbs.decode module", "codecipher.atbs.encode module", "codecipher.atbs.lookup_table module", "codecipher.b64 package", "codecipher.b64.decode module", "codecipher.b64.encode module", "codecipher.caesar package", "codecipher.caesar.decode module", "codecipher.caesar.encode module", "codecipher.vernam package", "codecipher.vernam.decode module", "codecipher.vernam.encode module", "codecipher.vigenere package", "codecipher.vigenere.decode module", "codecipher.vigenere.encode module", "codecipher.vigenere.key_generator module", "codecipher.vigenere.lookup_table module", "CODECipher", "codecipher"], "terms": {"a1z52n62": [0, 22, 23], "submodul": [0, 23], "decod": [0, 1, 4, 8, 11, 14, 17, 20, 21, 22], "a1z52n62decod": [0, 1, 2], "encod": [0, 1, 4, 8, 11, 14, 17, 20, 21, 22], "a1z52n62encod": [0, 1, 3], "atb": [0, 22, 23], "alephtawbetshindecod": [0, 4, 5, 9], "alephtawbetshinencod": [0, 4, 6], "lookup_t": [0, 4, 17, 22], "alephtawbetshin": [0, 4, 5, 6, 7, 9, 10], "b64": [0, 22, 23], "b64decod": [0, 8, 9], "b64encod": [0, 8, 10], "caesar": [0, 22, 23], "caesardecod": [0, 11, 12], "caesarencod": [0, 11, 13], "vernam": [0, 22, 23], "vernamdecod": [0, 14, 15], "vernamencod": [0, 14, 16], "vigener": [0, 22, 23], "vigeneredecod": [0, 17, 18], "vigenereencod": [0, 17, 19], "key_gener": [0, 17, 22], "keygener": [0, 17, 20], "lookupt": [0, 17, 21], "__init__": [0, 1, 4, 8, 11, 14, 17, 22], "py": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "copyright": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "c": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "2021": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "2026": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "vladimir": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "roncev": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "elektron": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "ronca": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "gmail": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "com": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "free": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "softwar": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "you": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "can": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "redistribut": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "modifi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "under": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "term": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "gnu": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "gener": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "public": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "licens": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "publish": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "foundat": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "either": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "version": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "3": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "your": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "option": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "ani": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "later": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "distribut": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "hope": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "us": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "without": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "warranti": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "even": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "impli": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "merchant": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "fit": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "FOR": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "A": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "particular": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "purpos": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "see": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "more": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "detail": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "should": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "have": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "receiv": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "copi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "along": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "thi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "program": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "If": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "http": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "www": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "org": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "_decode_data": [1, 2, 4, 5, 8, 9, 11, 12, 14, 15, 17, 18], "decode_data": [1, 2, 4, 5, 8, 9, 11, 12, 14, 15, 17, 18], "_encode_data": [1, 3, 4, 6, 8, 10, 11, 13, 14, 16, 17, 19], "encode_data": [1, 3, 4, 6, 8, 10, 11, 13, 14, 16, 17, 19], "info": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "defin": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "class": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "attribut": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "method": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "creat": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "contain": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 22], "aggreg": [1, 4, 8, 11, 14, 17, 21], "backend": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], "api": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], "sourc": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "base": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "It": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "none": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "initi": [1, 4, 8, 11, 14, 17], "constructor": [1, 4, 8, 11, 14, 17], "str": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19, 20, 21], "object": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19, 20, 21], "data": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19, 20], "properti": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19, 20], "from": [2, 5, 9, 12, 15, 18], "format": [2, 3, 5, 6, 7, 9, 10, 12, 13, 15, 16, 18, 19], "paramet": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19], "which": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19], "return": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19, 20], "except": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19, 20], "get": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19, 20], "type": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19, 20, 22], "dict": [7, 21], "shift_count": [12, 13], "int": [12, 13, 20, 21], "shift": [12, 13], "count": [12, 13], "kei": [15, 16, 17, 18, 19, 20], "_split_data_decod": [17, 18], "_split_data_encod": [17, 19], "_data_len": [17, 20], "_kei": [17, 20], "data_len": [17, 20], "generate_kei": [17, 20], "alpha": [17, 21], "alphanum": [17, 21], "index_to_lett": [17, 21], "letter_to_index": [17, 21], "num": [17, 21], "white_spac": [17, 21], "_split_data": [18, 19], "split": [18, 19], "data_to_decod": 18, "list": [18, 19], "data_to_encod": 19, "vigen": 20, "length": 20, "lookup": 21, "tabl": 21, "support": [21, 22], "alphabet": 21, "numer": 21, "white": 21, "space": 21, "char": 21, "index": [21, 22], "letter": 21, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz": 21, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789": 21, "0": 21, "1": 21, "b": 21, "2": 21, "d": 21, "4": 21, "e": 21, "5": 21, "f": 21, "6": 21, "g": 21, "7": [21, 22], "h": 21, "8": 21, "9": 21, "j": 21, "10": 21, "k": 21, "11": 21, "l": 21, "12": 21, "m": [21, 22], "13": 21, "n": 21, "14": 21, "o": 21, "15": 21, "p": 21, "16": 21, "q": 21, "17": 21, "r": [21, 22], "18": 21, "19": 21, "t": 21, "20": 21, "u": 21, "21": 21, "v": 21, "22": 21, "w": 21, "23": [21, 22], "x": [21, 22], "24": 21, "y": [21, 22], "25": 21, "z": [21, 22], "26": 21, "27": 21, "28": 21, "29": 21, "30": 21, "31": 21, "32": 21, "33": 21, "34": 21, "35": 21, "36": 21, "37": 21, "38": 21, "39": 21, "40": 21, "41": 21, "42": 21, "43": 21, "44": 21, "45": 21, "46": 21, "47": 21, "48": 21, "49": 21, "50": 21, "51": 21, "52": 21, "53": 21, "54": 21, "55": 21, "56": 21, "57": 21, "58": 21, "59": 21, "60": 21, "61": 21, "62": 21, "0123456789": 21, "cipher": 22, "util": 22, "develop": 22, "python": 22, "code": 22, "The": 22, "readm": 22, "introduc": 22, "modul": [22, 23], "provid": 22, "instruct": 22, "how": 22, "machin": 22, "mai": 22, "other": 22, "inform": 22, "befor": 22, "ar": 22, "subpackag": [22, 23], "next": 22, "environ": 22, "navig": 22, "releas": 22, "page": 22, "download": 22, "extract": 22, "archiv": 22, "To": 22, "follow": 22, "tar": 22, "xvzf": 22, "gz": 22, "cd": 22, "pyton3": 22, "pip3": 22, "requir": 22, "txt": 22, "python3": 22, "build": 22, "isol": 22, "wheel": 22, "py3": 22, "whl": 22, "old": 22, "fashion": 22, "wai": 22, "setup": 22, "install_lib": 22, "install_egg_info": 22, "docker": 22, "imag": 22, "pip": 22, "librari": 22, "oop": 22, "directori": 22, "file": 22, "electux": 22, "github": 22, "io": 22, "same": 22, "itself": 22, "avail": 22, "let": 22, "help": 22, "psf": 22, "search": 22, "packag": 23, "content": 23}, "objects": {"": [[0, 0, 0, "-", "codecipher"]], "codecipher": [[1, 0, 0, "-", "a1z52n62"], [4, 0, 0, "-", "atbs"], [8, 0, 0, "-", "b64"], [11, 0, 0, "-", "caesar"], [14, 0, 0, "-", "vernam"], [17, 0, 0, "-", "vigenere"]], "codecipher.a1z52n62": [[1, 1, 1, "", "A1z52N62"], [2, 0, 0, "-", "decode"], [3, 0, 0, "-", "encode"]], "codecipher.a1z52n62.decode": [[2, 1, 1, "", "A1z52N62Decoder"]], "codecipher.a1z52n62.decode.A1z52N62Decoder": [[2, 2, 1, "", "_decode_data"], [2, 3, 1, "", "decode"], [2, 4, 1, "", "decode_data"]], "codecipher.a1z52n62.encode": [[3, 1, 1, "", "A1z52N62Encoder"]], "codecipher.a1z52n62.encode.A1z52N62Encoder": [[3, 2, 1, "", "_encode_data"], [3, 3, 1, "", "encode"], [3, 4, 1, "", "encode_data"]], "codecipher.atbs": [[4, 1, 1, "", "AlephTawBetShin"], [5, 0, 0, "-", "decode"], [6, 0, 0, "-", "encode"], [7, 0, 0, "-", "lookup_table"]], "codecipher.atbs.decode": [[5, 1, 1, "", "AlephTawBetShinDecode"]], "codecipher.atbs.decode.AlephTawBetShinDecode": [[5, 2, 1, "", "_decode_data"], [5, 3, 1, "", "decode"], [5, 4, 1, "", "decode_data"]], "codecipher.atbs.encode": [[6, 1, 1, "", "AlephTawBetShinEncode"]], "codecipher.atbs.encode.AlephTawBetShinEncode": [[6, 2, 1, "", "_encode_data"], [6, 3, 1, "", "encode"], [6, 4, 1, "", "encode_data"]], "codecipher.b64": [[8, 1, 1, "", "B64"], [9, 0, 0, "-", "decode"], [10, 0, 0, "-", "encode"]], "codecipher.b64.decode": [[9, 1, 1, "", "B64Decode"]], "codecipher.b64.decode.B64Decode": [[9, 2, 1, "", "_decode_data"], [9, 3, 1, "", "decode"], [9, 4, 1, "", "decode_data"]], "codecipher.b64.encode": [[10, 1, 1, "", "B64Encode"]], "codecipher.b64.encode.B64Encode": [[10, 2, 1, "", "_encode_data"], [10, 3, 1, "", "encode"], [10, 4, 1, "", "encode_data"]], "codecipher.caesar": [[11, 1, 1, "", "Caesar"], [12, 0, 0, "-", "decode"], [13, 0, 0, "-", "encode"]], "codecipher.caesar.decode": [[12, 1, 1, "", "CaesarDecode"]], "codecipher.caesar.decode.CaesarDecode": [[12, 2, 1, "", "_decode_data"], [12, 3, 1, "", "decode"], [12, 4, 1, "", "decode_data"]], "codecipher.caesar.encode": [[13, 1, 1, "", "CaesarEncode"]], "codecipher.caesar.encode.CaesarEncode": [[13, 2, 1, "", "_encode_data"], [13, 3, 1, "", "encode"], [13, 4, 1, "", "encode_data"]], "codecipher.vernam": [[14, 1, 1, "", "Vernam"], [15, 0, 0, "-", "decode"], [16, 0, 0, "-", "encode"]], "codecipher.vernam.decode": [[15, 1, 1, "", "VernamDecode"]], "codecipher.vernam.decode.VernamDecode": [[15, 2, 1, "", "_decode_data"], [15, 3, 1, "", "decode"], [15, 4, 1, "", "decode_data"]], "codecipher.vernam.encode": [[16, 1, 1, "", "VernamEncode"]], "codecipher.vernam.encode.VernamEncode": [[16, 2, 1, "", "_encode_data"], [16, 3, 1, "", "encode"], [16, 4, 1, "", "encode_data"]], "codecipher.vigenere": [[17, 1, 1, "", "Vigenere"], [18, 0, 0, "-", "decode"], [19, 0, 0, "-", "encode"], [20, 0, 0, "-", "key_generator"], [21, 0, 0, "-", "lookup_table"]], "codecipher.vigenere.decode": [[18, 1, 1, "", "VigenereDecode"]], "codecipher.vigenere.decode.VigenereDecode": [[18, 2, 1, "", "_decode_data"], [18, 3, 1, "", "_split_data_decode"], [18, 3, 1, "", "decode"], [18, 4, 1, "", "decode_data"]], "codecipher.vigenere.encode": [[19, 1, 1, "", "VigenereEncode"]], "codecipher.vigenere.encode.VigenereEncode": [[19, 2, 1, "", "_encode_data"], [19, 3, 1, "", "_split_data_encode"], [19, 3, 1, "", "encode"], [19, 4, 1, "", "encode_data"]], "codecipher.vigenere.key_generator": [[20, 1, 1, "", "KeyGenerator"]], "codecipher.vigenere.key_generator.KeyGenerator": [[20, 2, 1, "", "_data_len"], [20, 2, 1, "", "_key"], [20, 4, 1, "", "data_len"], [20, 3, 1, "", "generate_key"], [20, 4, 1, "", "key"]], "codecipher.vigenere.lookup_table": [[21, 1, 1, "", "LookUpTable"]], "codecipher.vigenere.lookup_table.LookUpTable": [[21, 2, 1, "", "ALPHA"], [21, 2, 1, "", "ALPHANUM"], [21, 2, 1, "", "INDEX_TO_LETTER"], [21, 2, 1, "", "LETTER_TO_INDEX"], [21, 2, 1, "", "NUM"], [21, 2, 1, "", "WHITE_SPACE"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:attribute", "3": "py:method", "4": "py:property"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "attribute", "Python attribute"], "3": ["py", "method", "Python method"], "4": ["py", "property", "Python property"]}, "titleterms": {"codeciph": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23], "packag": [0, 1, 4, 8, 11, 14, 17, 22], "subpackag": 0, "modul": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "content": [0, 1, 4, 8, 11, 14, 17, 22], "a1z52n62": [1, 2, 3], "submodul": [1, 4, 8, 11, 14, 17], "decod": [2, 5, 9, 12, 15, 18], "encod": [3, 6, 10, 13, 16, 19], "atb": [4, 5, 6, 7], "lookup_t": [7, 21], "b64": [8, 9, 10], "caesar": [11, 12, 13], "vernam": [14, 15, 16], "vigener": [17, 18, 19, 20, 21], "key_gener": 20, "instal": 22, "depend": 22, "structur": 22, "copyright": 22, "licenc": 22, "indic": 22, "tabl": 22}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1, "sphinx": 60}, "alltitles": {"codecipher package": [[0, "codecipher-package"]], "Subpackages": [[0, "subpackages"]], "Module contents": [[0, "module-codecipher"], [1, "module-codecipher.a1z52n62"], [4, "module-codecipher.atbs"], [8, "module-codecipher.b64"], [11, "module-codecipher.caesar"], [14, "module-codecipher.vernam"], [17, "module-codecipher.vigenere"]], "codecipher.a1z52n62 package": [[1, "codecipher-a1z52n62-package"]], "Submodules": [[1, "submodules"], [4, "submodules"], [8, "submodules"], [11, "submodules"], [14, "submodules"], [17, "submodules"]], "codecipher.a1z52n62.decode module": [[2, "module-codecipher.a1z52n62.decode"]], "codecipher.a1z52n62.encode module": [[3, "module-codecipher.a1z52n62.encode"]], "codecipher.atbs package": [[4, "codecipher-atbs-package"]], "codecipher.atbs.decode module": [[5, "module-codecipher.atbs.decode"]], "codecipher.atbs.encode module": [[6, "module-codecipher.atbs.encode"]], "codecipher.atbs.lookup_table module": [[7, "module-codecipher.atbs.lookup_table"]], "codecipher.b64 package": [[8, "codecipher-b64-package"]], "codecipher.b64.decode module": [[9, "module-codecipher.b64.decode"]], "codecipher.b64.encode module": [[10, "module-codecipher.b64.encode"]], "codecipher.caesar package": [[11, "codecipher-caesar-package"]], "codecipher.caesar.decode module": [[12, "module-codecipher.caesar.decode"]], "codecipher.caesar.encode module": [[13, "module-codecipher.caesar.encode"]], "codecipher.vernam package": [[14, "codecipher-vernam-package"]], "codecipher.vernam.decode module": [[15, "module-codecipher.vernam.decode"]], "codecipher.vernam.encode module": [[16, "module-codecipher.vernam.encode"]], "codecipher.vigenere package": [[17, "codecipher-vigenere-package"]], "codecipher.vigenere.decode module": [[18, "module-codecipher.vigenere.decode"]], "codecipher.vigenere.encode module": [[19, "module-codecipher.vigenere.encode"]], "codecipher.vigenere.key_generator module": [[20, "module-codecipher.vigenere.key_generator"]], "codecipher.vigenere.lookup_table module": [[21, "module-codecipher.vigenere.lookup_table"]], "CODECipher": [[22, "codecipher"]], "Contents": [[22, null]], "Installation": [[22, "installation"]], "Dependencies": [[22, "dependencies"]], "Package structure": [[22, "package-structure"]], "Copyright and licence": [[22, "copyright-and-licence"]], "Indices and tables": [[22, "indices-and-tables"]], "codecipher": [[23, "codecipher"]]}, "indexentries": {"codecipher": [[0, "module-codecipher"]], "module": [[0, "module-codecipher"], [1, "module-codecipher.a1z52n62"], [2, "module-codecipher.a1z52n62.decode"], [3, "module-codecipher.a1z52n62.encode"], [4, "module-codecipher.atbs"], [5, "module-codecipher.atbs.decode"], [6, "module-codecipher.atbs.encode"], [7, "module-codecipher.atbs.lookup_table"], [8, "module-codecipher.b64"], [9, "module-codecipher.b64.decode"], [10, "module-codecipher.b64.encode"], [11, "module-codecipher.caesar"], [12, "module-codecipher.caesar.decode"], [13, "module-codecipher.caesar.encode"], [14, "module-codecipher.vernam"], [15, "module-codecipher.vernam.decode"], [16, "module-codecipher.vernam.encode"], [17, "module-codecipher.vigenere"], [18, "module-codecipher.vigenere.decode"], [19, "module-codecipher.vigenere.encode"], [20, "module-codecipher.vigenere.key_generator"], [21, "module-codecipher.vigenere.lookup_table"]], "a1z52n62 (class in codecipher.a1z52n62)": [[1, "codecipher.a1z52n62.A1z52N62"]], "codecipher.a1z52n62": [[1, "module-codecipher.a1z52n62"]], "a1z52n62decode (class in codecipher.a1z52n62.decode)": [[2, "codecipher.a1z52n62.decode.A1z52N62Decoder"]], "_decode_data (codecipher.a1z52n62.decode.a1z52n62decode attribute)": [[2, "codecipher.a1z52n62.decode.A1z52N62Decoder._decode_data"]], "codecipher.a1z52n62.decode": [[2, "module-codecipher.a1z52n62.decode"]], "decode() (codecipher.a1z52n62.decode.a1z52n62decode method)": [[2, "codecipher.a1z52n62.decode.A1z52N62Decoder.decode"]], "decode_data (codecipher.a1z52n62.decode.a1z52n62decode property)": [[2, "codecipher.a1z52n62.decode.A1z52N62Decoder.decode_data"]], "a1z52n62encode (class in codecipher.a1z52n62.encode)": [[3, "codecipher.a1z52n62.encode.A1z52N62Encoder"]], "_encode_data (codecipher.a1z52n62.encode.a1z52n62encode attribute)": [[3, "codecipher.a1z52n62.encode.A1z52N62Encoder._encode_data"]], "codecipher.a1z52n62.encode": [[3, "module-codecipher.a1z52n62.encode"]], "encode() (codecipher.a1z52n62.encode.a1z52n62encode method)": [[3, "codecipher.a1z52n62.encode.A1z52N62Encoder.encode"]], "encode_data (codecipher.a1z52n62.encode.a1z52n62encode property)": [[3, "codecipher.a1z52n62.encode.A1z52N62Encoder.encode_data"]], "alephtawbetshin (class in codecipher.atbs)": [[4, "codecipher.atbs.AlephTawBetShin"]], "codecipher.atbs": [[4, "module-codecipher.atbs"]], "alephtawbetshindecode (class in codecipher.atbs.decode)": [[5, "codecipher.atbs.decode.AlephTawBetShinDecode"]], "_decode_data (codecipher.atbs.decode.alephtawbetshindecode attribute)": [[5, "codecipher.atbs.decode.AlephTawBetShinDecode._decode_data"]], "codecipher.atbs.decode": [[5, "module-codecipher.atbs.decode"]], "decode() (codecipher.atbs.decode.alephtawbetshindecode method)": [[5, "codecipher.atbs.decode.AlephTawBetShinDecode.decode"]], "decode_data (codecipher.atbs.decode.alephtawbetshindecode property)": [[5, "codecipher.atbs.decode.AlephTawBetShinDecode.decode_data"]], "alephtawbetshinencode (class in codecipher.atbs.encode)": [[6, "codecipher.atbs.encode.AlephTawBetShinEncode"]], "_encode_data (codecipher.atbs.encode.alephtawbetshinencode attribute)": [[6, "codecipher.atbs.encode.AlephTawBetShinEncode._encode_data"]], "codecipher.atbs.encode": [[6, "module-codecipher.atbs.encode"]], "encode() (codecipher.atbs.encode.alephtawbetshinencode method)": [[6, "codecipher.atbs.encode.AlephTawBetShinEncode.encode"]], "encode_data (codecipher.atbs.encode.alephtawbetshinencode property)": [[6, "codecipher.atbs.encode.AlephTawBetShinEncode.encode_data"]], "codecipher.atbs.lookup_table": [[7, "module-codecipher.atbs.lookup_table"]], "b64 (class in codecipher.b64)": [[8, "codecipher.b64.B64"]], "codecipher.b64": [[8, "module-codecipher.b64"]], "b64decode (class in codecipher.b64.decode)": [[9, "codecipher.b64.decode.B64Decode"]], "_decode_data (codecipher.b64.decode.b64decode attribute)": [[9, "codecipher.b64.decode.B64Decode._decode_data"]], "codecipher.b64.decode": [[9, "module-codecipher.b64.decode"]], "decode() (codecipher.b64.decode.b64decode method)": [[9, "codecipher.b64.decode.B64Decode.decode"]], "decode_data (codecipher.b64.decode.b64decode property)": [[9, "codecipher.b64.decode.B64Decode.decode_data"]], "b64encode (class in codecipher.b64.encode)": [[10, "codecipher.b64.encode.B64Encode"]], "_encode_data (codecipher.b64.encode.b64encode attribute)": [[10, "codecipher.b64.encode.B64Encode._encode_data"]], "codecipher.b64.encode": [[10, "module-codecipher.b64.encode"]], "encode() (codecipher.b64.encode.b64encode method)": [[10, "codecipher.b64.encode.B64Encode.encode"]], "encode_data (codecipher.b64.encode.b64encode property)": [[10, "codecipher.b64.encode.B64Encode.encode_data"]], "caesar (class in codecipher.caesar)": [[11, "codecipher.caesar.Caesar"]], "codecipher.caesar": [[11, "module-codecipher.caesar"]], "caesardecode (class in codecipher.caesar.decode)": [[12, "codecipher.caesar.decode.CaesarDecode"]], "_decode_data (codecipher.caesar.decode.caesardecode attribute)": [[12, "codecipher.caesar.decode.CaesarDecode._decode_data"]], "codecipher.caesar.decode": [[12, "module-codecipher.caesar.decode"]], "decode() (codecipher.caesar.decode.caesardecode method)": [[12, "codecipher.caesar.decode.CaesarDecode.decode"]], "decode_data (codecipher.caesar.decode.caesardecode property)": [[12, "codecipher.caesar.decode.CaesarDecode.decode_data"]], "caesarencode (class in codecipher.caesar.encode)": [[13, "codecipher.caesar.encode.CaesarEncode"]], "_encode_data (codecipher.caesar.encode.caesarencode attribute)": [[13, "codecipher.caesar.encode.CaesarEncode._encode_data"]], "codecipher.caesar.encode": [[13, "module-codecipher.caesar.encode"]], "encode() (codecipher.caesar.encode.caesarencode method)": [[13, "codecipher.caesar.encode.CaesarEncode.encode"]], "encode_data (codecipher.caesar.encode.caesarencode property)": [[13, "codecipher.caesar.encode.CaesarEncode.encode_data"]], "vernam (class in codecipher.vernam)": [[14, "codecipher.vernam.Vernam"]], "codecipher.vernam": [[14, "module-codecipher.vernam"]], "vernamdecode (class in codecipher.vernam.decode)": [[15, "codecipher.vernam.decode.VernamDecode"]], "_decode_data (codecipher.vernam.decode.vernamdecode attribute)": [[15, "codecipher.vernam.decode.VernamDecode._decode_data"]], "codecipher.vernam.decode": [[15, "module-codecipher.vernam.decode"]], "decode() (codecipher.vernam.decode.vernamdecode method)": [[15, "codecipher.vernam.decode.VernamDecode.decode"]], "decode_data (codecipher.vernam.decode.vernamdecode property)": [[15, "codecipher.vernam.decode.VernamDecode.decode_data"]], "vernamencode (class in codecipher.vernam.encode)": [[16, "codecipher.vernam.encode.VernamEncode"]], "_encode_data (codecipher.vernam.encode.vernamencode attribute)": [[16, "codecipher.vernam.encode.VernamEncode._encode_data"]], "codecipher.vernam.encode": [[16, "module-codecipher.vernam.encode"]], "encode() (codecipher.vernam.encode.vernamencode method)": [[16, "codecipher.vernam.encode.VernamEncode.encode"]], "encode_data (codecipher.vernam.encode.vernamencode property)": [[16, "codecipher.vernam.encode.VernamEncode.encode_data"]], "vigenere (class in codecipher.vigenere)": [[17, "codecipher.vigenere.Vigenere"]], "codecipher.vigenere": [[17, "module-codecipher.vigenere"]], "vigeneredecode (class in codecipher.vigenere.decode)": [[18, "codecipher.vigenere.decode.VigenereDecode"]], "_decode_data (codecipher.vigenere.decode.vigeneredecode attribute)": [[18, "codecipher.vigenere.decode.VigenereDecode._decode_data"]], "_split_data_decode() (codecipher.vigenere.decode.vigeneredecode method)": [[18, "codecipher.vigenere.decode.VigenereDecode._split_data_decode"]], "codecipher.vigenere.decode": [[18, "module-codecipher.vigenere.decode"]], "decode() (codecipher.vigenere.decode.vigeneredecode method)": [[18, "codecipher.vigenere.decode.VigenereDecode.decode"]], "decode_data (codecipher.vigenere.decode.vigeneredecode property)": [[18, "codecipher.vigenere.decode.VigenereDecode.decode_data"]], "vigenereencode (class in codecipher.vigenere.encode)": [[19, "codecipher.vigenere.encode.VigenereEncode"]], "_encode_data (codecipher.vigenere.encode.vigenereencode attribute)": [[19, "codecipher.vigenere.encode.VigenereEncode._encode_data"]], "_split_data_encode() (codecipher.vigenere.encode.vigenereencode method)": [[19, "codecipher.vigenere.encode.VigenereEncode._split_data_encode"]], "codecipher.vigenere.encode": [[19, "module-codecipher.vigenere.encode"]], "encode() (codecipher.vigenere.encode.vigenereencode method)": [[19, "codecipher.vigenere.encode.VigenereEncode.encode"]], "encode_data (codecipher.vigenere.encode.vigenereencode property)": [[19, "codecipher.vigenere.encode.VigenereEncode.encode_data"]], "keygenerator (class in codecipher.vigenere.key_generator)": [[20, "codecipher.vigenere.key_generator.KeyGenerator"]], "_data_len (codecipher.vigenere.key_generator.keygenerator attribute)": [[20, "codecipher.vigenere.key_generator.KeyGenerator._data_len"]], "_key (codecipher.vigenere.key_generator.keygenerator attribute)": [[20, "codecipher.vigenere.key_generator.KeyGenerator._key"]], "codecipher.vigenere.key_generator": [[20, "module-codecipher.vigenere.key_generator"]], "data_len (codecipher.vigenere.key_generator.keygenerator property)": [[20, "codecipher.vigenere.key_generator.KeyGenerator.data_len"]], "generate_key() (codecipher.vigenere.key_generator.keygenerator method)": [[20, "codecipher.vigenere.key_generator.KeyGenerator.generate_key"]], "key (codecipher.vigenere.key_generator.keygenerator property)": [[20, "codecipher.vigenere.key_generator.KeyGenerator.key"]], "alpha (codecipher.vigenere.lookup_table.lookuptable attribute)": [[21, "codecipher.vigenere.lookup_table.LookUpTable.ALPHA"]], "alphanum (codecipher.vigenere.lookup_table.lookuptable attribute)": [[21, "codecipher.vigenere.lookup_table.LookUpTable.ALPHANUM"]], "index_to_letter (codecipher.vigenere.lookup_table.lookuptable attribute)": [[21, "codecipher.vigenere.lookup_table.LookUpTable.INDEX_TO_LETTER"]], "letter_to_index (codecipher.vigenere.lookup_table.lookuptable attribute)": [[21, "codecipher.vigenere.lookup_table.LookUpTable.LETTER_TO_INDEX"]], "lookuptable (class in codecipher.vigenere.lookup_table)": [[21, "codecipher.vigenere.lookup_table.LookUpTable"]], "num (codecipher.vigenere.lookup_table.lookuptable attribute)": [[21, "codecipher.vigenere.lookup_table.LookUpTable.NUM"]], "white_space (codecipher.vigenere.lookup_table.lookuptable attribute)": [[21, "codecipher.vigenere.lookup_table.LookUpTable.WHITE_SPACE"]], "codecipher.vigenere.lookup_table": [[21, "module-codecipher.vigenere.lookup_table"]]}}) \ No newline at end of file +Search.setIndex({"docnames": ["codecipher", "codecipher.a1z52n62", "codecipher.a1z52n62.decode", "codecipher.a1z52n62.encode", "codecipher.atbs", "codecipher.atbs.decode", "codecipher.atbs.encode", "codecipher.atbs.lookup_table", "codecipher.b64", "codecipher.b64.decode", "codecipher.b64.encode", "codecipher.caesar", "codecipher.caesar.decode", "codecipher.caesar.encode", "codecipher.vernam", "codecipher.vernam.decode", "codecipher.vernam.encode", "codecipher.vigenere", "codecipher.vigenere.decode", "codecipher.vigenere.encode", "codecipher.vigenere.key_generator", "codecipher.vigenere.lookup_table", "index", "modules"], "filenames": ["codecipher.rst", "codecipher.a1z52n62.rst", "codecipher.a1z52n62.decode.rst", "codecipher.a1z52n62.encode.rst", "codecipher.atbs.rst", "codecipher.atbs.decode.rst", "codecipher.atbs.encode.rst", "codecipher.atbs.lookup_table.rst", "codecipher.b64.rst", "codecipher.b64.decode.rst", "codecipher.b64.encode.rst", "codecipher.caesar.rst", "codecipher.caesar.decode.rst", "codecipher.caesar.encode.rst", "codecipher.vernam.rst", "codecipher.vernam.decode.rst", "codecipher.vernam.encode.rst", "codecipher.vigenere.rst", "codecipher.vigenere.decode.rst", "codecipher.vigenere.encode.rst", "codecipher.vigenere.key_generator.rst", "codecipher.vigenere.lookup_table.rst", "index.rst", "modules.rst"], "titles": ["codecipher package", "codecipher.a1z52n62 package", "codecipher.a1z52n62.decode module", "codecipher.a1z52n62.encode module", "codecipher.atbs package", "codecipher.atbs.decode module", "codecipher.atbs.encode module", "codecipher.atbs.lookup_table module", "codecipher.b64 package", "codecipher.b64.decode module", "codecipher.b64.encode module", "codecipher.caesar package", "codecipher.caesar.decode module", "codecipher.caesar.encode module", "codecipher.vernam package", "codecipher.vernam.decode module", "codecipher.vernam.encode module", "codecipher.vigenere package", "codecipher.vigenere.decode module", "codecipher.vigenere.encode module", "codecipher.vigenere.key_generator module", "codecipher.vigenere.lookup_table module", "CODECipher", "codecipher"], "terms": {"a1z52n62": [0, 22, 23], "submodul": [0, 23], "decod": [0, 1, 4, 8, 11, 14, 17, 20, 21, 22], "a1z52n62decod": [0, 1, 2], "encod": [0, 1, 4, 8, 11, 14, 17, 20, 21, 22], "a1z52n62encod": [0, 1, 3], "atb": [0, 22, 23], "alephtawbetshindecod": [0, 4, 5, 9], "alephtawbetshinencod": [0, 4, 6], "lookup_t": [0, 4, 17, 22], "alephtawbetshin": [0, 4, 5, 6, 7, 9, 10], "b64": [0, 22, 23], "b64decod": [0, 8, 9], "b64encod": [0, 8, 10], "caesar": [0, 22, 23], "caesardecod": [0, 11, 12], "caesarencod": [0, 11, 13], "vernam": [0, 22, 23], "vernamdecod": [0, 14, 15], "vernamencod": [0, 14, 16], "vigener": [0, 22, 23], "vigeneredecod": [0, 17, 18], "vigenereencod": [0, 17, 19], "key_gener": [0, 17, 22], "keygener": [0, 17, 20], "lookupt": [0, 17, 21], "__init__": [0, 1, 4, 8, 11, 14, 17, 22], "py": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "copyright": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "c": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "2021": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "2026": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "vladimir": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "roncev": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "elektron": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "ronca": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "gmail": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "com": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "free": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "softwar": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "you": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "can": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "redistribut": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "modifi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "under": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "term": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "gnu": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "gener": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "public": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "licens": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "publish": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "foundat": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "either": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "version": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "3": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "your": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "option": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "ani": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "later": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "distribut": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "hope": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "us": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "without": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "warranti": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "even": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "impli": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "merchant": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "fit": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "FOR": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "A": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "particular": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "purpos": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "see": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "more": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "detail": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "should": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "have": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "receiv": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "copi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "along": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "thi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "program": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "If": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "http": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "www": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "org": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "_decode_data": [1, 2, 4, 5, 8, 9, 11, 12, 14, 15, 17, 18], "decode_data": [1, 2, 4, 5, 8, 9, 11, 12, 14, 15, 17, 18], "_encode_data": [1, 3, 4, 6, 8, 10, 11, 13, 14, 16, 17, 19], "encode_data": [1, 3, 4, 6, 8, 10, 11, 13, 14, 16, 17, 19], "info": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "defin": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "class": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "attribut": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "method": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "creat": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "contain": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 22], "aggreg": [1, 4, 8, 11, 14, 17, 21], "backend": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], "api": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], "sourc": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "base": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "It": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "none": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "initi": [1, 4, 8, 11, 14, 17], "constructor": [1, 4, 8, 11, 14, 17], "str": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19, 20, 21], "object": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19, 20, 21], "data": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19, 20], "properti": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19, 20], "from": [2, 5, 9, 12, 15, 18], "format": [2, 3, 5, 6, 7, 9, 10, 12, 13, 15, 16, 18, 19], "paramet": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19], "which": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19], "return": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19, 20], "except": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19, 20], "get": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19, 20], "type": [2, 3, 5, 6, 9, 10, 12, 13, 15, 16, 18, 19, 20, 22], "dict": [7, 21], "shift_count": [12, 13], "int": [12, 13, 20, 21], "shift": [12, 13], "count": [12, 13], "kei": [15, 16, 17, 18, 19, 20], "_split_data_decod": [17, 18], "_split_data_encod": [17, 19], "_data_len": [17, 20], "_kei": [17, 20], "data_len": [17, 20], "generate_kei": [17, 20], "alpha": [17, 21], "alphanum": [17, 21], "index_to_lett": [17, 21], "letter_to_index": [17, 21], "num": [17, 21], "white_spac": [17, 21], "_split_data": [18, 19], "split": [18, 19], "data_to_decod": 18, "list": [18, 19], "data_to_encod": 19, "vigen": 20, "length": 20, "lookup": 21, "tabl": 21, "support": [21, 22], "alphabet": 21, "numer": 21, "white": 21, "space": 21, "char": 21, "index": [21, 22], "letter": 21, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz": 21, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789": 21, "0": 21, "1": 21, "b": 21, "2": 21, "d": 21, "4": 21, "e": 21, "5": 21, "f": 21, "6": 21, "g": 21, "7": [21, 22], "h": 21, "8": 21, "9": 21, "j": 21, "10": 21, "k": 21, "11": 21, "l": 21, "12": 21, "m": [21, 22], "13": 21, "n": 21, "14": 21, "o": 21, "15": 21, "p": 21, "16": 21, "q": 21, "17": 21, "r": [21, 22], "18": 21, "19": 21, "t": 21, "20": 21, "u": 21, "21": 21, "v": 21, "22": 21, "w": 21, "23": [21, 22], "x": [21, 22], "24": 21, "y": [21, 22], "25": 21, "z": [21, 22], "26": 21, "27": 21, "28": 21, "29": 21, "30": 21, "31": 21, "32": 21, "33": 21, "34": 21, "35": 21, "36": 21, "37": 21, "38": 21, "39": 21, "40": 21, "41": 21, "42": 21, "43": 21, "44": 21, "45": 21, "46": 21, "47": 21, "48": 21, "49": 21, "50": 21, "51": 21, "52": 21, "53": 21, "54": 21, "55": 21, "56": 21, "57": 21, "58": 21, "59": 21, "60": 21, "61": 21, "62": 21, "0123456789": 21, "cipher": 22, "util": 22, "develop": 22, "python": 22, "code": 22, "The": 22, "readm": 22, "introduc": 22, "modul": [22, 23], "provid": 22, "instruct": 22, "how": 22, "machin": 22, "mai": 22, "other": 22, "inform": 22, "befor": 22, "ar": 22, "subpackag": [22, 23], "next": 22, "environ": 22, "navig": 22, "releas": 22, "page": 22, "download": 22, "extract": 22, "archiv": 22, "To": 22, "follow": 22, "tar": 22, "xvzf": 22, "gz": 22, "cd": 22, "pyton3": 22, "pip3": 22, "requir": 22, "txt": 22, "python3": 22, "build": 22, "isol": 22, "wheel": 22, "py3": 22, "whl": 22, "old": 22, "fashion": 22, "wai": 22, "setup": 22, "install_lib": 22, "install_egg_info": 22, "docker": 22, "imag": 22, "pip": 22, "librari": 22, "oop": 22, "directori": 22, "file": 22, "electux": 22, "github": 22, "io": 22, "same": 22, "itself": 22, "avail": 22, "let": 22, "help": 22, "psf": 22, "search": 22, "packag": 23, "content": 23}, "objects": {"": [[0, 0, 0, "-", "codecipher"]], "codecipher": [[1, 0, 0, "-", "a1z52n62"], [4, 0, 0, "-", "atbs"], [8, 0, 0, "-", "b64"], [11, 0, 0, "-", "caesar"], [14, 0, 0, "-", "vernam"], [17, 0, 0, "-", "vigenere"]], "codecipher.a1z52n62": [[1, 1, 1, "", "A1z52N62"], [2, 0, 0, "-", "decode"], [3, 0, 0, "-", "encode"]], "codecipher.a1z52n62.decode": [[2, 1, 1, "", "A1z52N62Decoder"]], "codecipher.a1z52n62.decode.A1z52N62Decoder": [[2, 2, 1, "", "_decode_data"], [2, 3, 1, "", "decode"], [2, 4, 1, "", "decode_data"]], "codecipher.a1z52n62.encode": [[3, 1, 1, "", "A1z52N62Encoder"]], "codecipher.a1z52n62.encode.A1z52N62Encoder": [[3, 2, 1, "", "_encode_data"], [3, 3, 1, "", "encode"], [3, 4, 1, "", "encode_data"]], "codecipher.atbs": [[4, 1, 1, "", "ATBS"], [5, 0, 0, "-", "decode"], [6, 0, 0, "-", "encode"], [7, 0, 0, "-", "lookup_table"]], "codecipher.atbs.decode": [[5, 1, 1, "", "ATBSDecode"]], "codecipher.atbs.decode.ATBSDecode": [[5, 2, 1, "", "_decode_data"], [5, 3, 1, "", "decode"], [5, 4, 1, "", "decode_data"]], "codecipher.atbs.encode": [[6, 1, 1, "", "ATBSEncode"]], "codecipher.atbs.encode.ATBSEncode": [[6, 2, 1, "", "_encode_data"], [6, 3, 1, "", "encode"], [6, 4, 1, "", "encode_data"]], "codecipher.b64": [[8, 1, 1, "", "B64"], [9, 0, 0, "-", "decode"], [10, 0, 0, "-", "encode"]], "codecipher.b64.decode": [[9, 1, 1, "", "B64Decode"]], "codecipher.b64.decode.B64Decode": [[9, 2, 1, "", "_decode_data"], [9, 3, 1, "", "decode"], [9, 4, 1, "", "decode_data"]], "codecipher.b64.encode": [[10, 1, 1, "", "B64Encode"]], "codecipher.b64.encode.B64Encode": [[10, 2, 1, "", "_encode_data"], [10, 3, 1, "", "encode"], [10, 4, 1, "", "encode_data"]], "codecipher.caesar": [[11, 1, 1, "", "Caesar"], [12, 0, 0, "-", "decode"], [13, 0, 0, "-", "encode"]], "codecipher.caesar.decode": [[12, 1, 1, "", "CaesarDecode"]], "codecipher.caesar.decode.CaesarDecode": [[12, 2, 1, "", "_decode_data"], [12, 3, 1, "", "decode"], [12, 4, 1, "", "decode_data"]], "codecipher.caesar.encode": [[13, 1, 1, "", "CaesarEncode"]], "codecipher.caesar.encode.CaesarEncode": [[13, 2, 1, "", "_encode_data"], [13, 3, 1, "", "encode"], [13, 4, 1, "", "encode_data"]], "codecipher.vernam": [[14, 1, 1, "", "Vernam"], [15, 0, 0, "-", "decode"], [16, 0, 0, "-", "encode"]], "codecipher.vernam.decode": [[15, 1, 1, "", "VernamDecode"]], "codecipher.vernam.decode.VernamDecode": [[15, 2, 1, "", "_decode_data"], [15, 3, 1, "", "decode"], [15, 4, 1, "", "decode_data"]], "codecipher.vernam.encode": [[16, 1, 1, "", "VernamEncode"]], "codecipher.vernam.encode.VernamEncode": [[16, 2, 1, "", "_encode_data"], [16, 3, 1, "", "encode"], [16, 4, 1, "", "encode_data"]], "codecipher.vigenere": [[17, 1, 1, "", "Vigenere"], [18, 0, 0, "-", "decode"], [19, 0, 0, "-", "encode"], [20, 0, 0, "-", "key_generator"], [21, 0, 0, "-", "lookup_table"]], "codecipher.vigenere.decode": [[18, 1, 1, "", "VigenereDecode"]], "codecipher.vigenere.decode.VigenereDecode": [[18, 2, 1, "", "_decode_data"], [18, 3, 1, "", "_split_data_decode"], [18, 3, 1, "", "decode"], [18, 4, 1, "", "decode_data"]], "codecipher.vigenere.encode": [[19, 1, 1, "", "VigenereEncode"]], "codecipher.vigenere.encode.VigenereEncode": [[19, 2, 1, "", "_encode_data"], [19, 3, 1, "", "_split_data_encode"], [19, 3, 1, "", "encode"], [19, 4, 1, "", "encode_data"]], "codecipher.vigenere.key_generator": [[20, 1, 1, "", "KeyGenerator"]], "codecipher.vigenere.key_generator.KeyGenerator": [[20, 2, 1, "", "_data_len"], [20, 2, 1, "", "_key"], [20, 4, 1, "", "data_len"], [20, 3, 1, "", "generate_key"], [20, 4, 1, "", "key"]], "codecipher.vigenere.lookup_table": [[21, 1, 1, "", "LookUpTable"]], "codecipher.vigenere.lookup_table.LookUpTable": [[21, 2, 1, "", "ALPHA"], [21, 2, 1, "", "ALPHANUM"], [21, 2, 1, "", "INDEX_TO_LETTER"], [21, 2, 1, "", "LETTER_TO_INDEX"], [21, 2, 1, "", "NUM"], [21, 2, 1, "", "WHITE_SPACE"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:attribute", "3": "py:method", "4": "py:property"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "attribute", "Python attribute"], "3": ["py", "method", "Python method"], "4": ["py", "property", "Python property"]}, "titleterms": {"codeciph": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23], "packag": [0, 1, 4, 8, 11, 14, 17, 22], "subpackag": 0, "modul": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "content": [0, 1, 4, 8, 11, 14, 17, 22], "a1z52n62": [1, 2, 3], "submodul": [1, 4, 8, 11, 14, 17], "decod": [2, 5, 9, 12, 15, 18], "encod": [3, 6, 10, 13, 16, 19], "atb": [4, 5, 6, 7], "lookup_t": [7, 21], "b64": [8, 9, 10], "caesar": [11, 12, 13], "vernam": [14, 15, 16], "vigener": [17, 18, 19, 20, 21], "key_gener": 20, "instal": 22, "depend": 22, "structur": 22, "copyright": 22, "licenc": 22, "indic": 22, "tabl": 22}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1, "sphinx": 60}, "alltitles": {"codecipher package": [[0, "codecipher-package"]], "Subpackages": [[0, "subpackages"]], "Module contents": [[0, "module-codecipher"], [1, "module-codecipher.a1z52n62"], [4, "module-codecipher.atbs"], [8, "module-codecipher.b64"], [11, "module-codecipher.caesar"], [14, "module-codecipher.vernam"], [17, "module-codecipher.vigenere"]], "codecipher.a1z52n62 package": [[1, "codecipher-a1z52n62-package"]], "Submodules": [[1, "submodules"], [4, "submodules"], [8, "submodules"], [11, "submodules"], [14, "submodules"], [17, "submodules"]], "codecipher.a1z52n62.decode module": [[2, "module-codecipher.a1z52n62.decode"]], "codecipher.a1z52n62.encode module": [[3, "module-codecipher.a1z52n62.encode"]], "codecipher.atbs package": [[4, "codecipher-atbs-package"]], "codecipher.atbs.decode module": [[5, "module-codecipher.atbs.decode"]], "codecipher.atbs.encode module": [[6, "module-codecipher.atbs.encode"]], "codecipher.atbs.lookup_table module": [[7, "module-codecipher.atbs.lookup_table"]], "codecipher.b64 package": [[8, "codecipher-b64-package"]], "codecipher.b64.decode module": [[9, "module-codecipher.b64.decode"]], "codecipher.b64.encode module": [[10, "module-codecipher.b64.encode"]], "codecipher.caesar package": [[11, "codecipher-caesar-package"]], "codecipher.caesar.decode module": [[12, "module-codecipher.caesar.decode"]], "codecipher.caesar.encode module": [[13, "module-codecipher.caesar.encode"]], "codecipher.vernam package": [[14, "codecipher-vernam-package"]], "codecipher.vernam.decode module": [[15, "module-codecipher.vernam.decode"]], "codecipher.vernam.encode module": [[16, "module-codecipher.vernam.encode"]], "codecipher.vigenere package": [[17, "codecipher-vigenere-package"]], "codecipher.vigenere.decode module": [[18, "module-codecipher.vigenere.decode"]], "codecipher.vigenere.encode module": [[19, "module-codecipher.vigenere.encode"]], "codecipher.vigenere.key_generator module": [[20, "module-codecipher.vigenere.key_generator"]], "codecipher.vigenere.lookup_table module": [[21, "module-codecipher.vigenere.lookup_table"]], "CODECipher": [[22, "codecipher"]], "Contents": [[22, null]], "Installation": [[22, "installation"]], "Dependencies": [[22, "dependencies"]], "Package structure": [[22, "package-structure"]], "Copyright and licence": [[22, "copyright-and-licence"]], "Indices and tables": [[22, "indices-and-tables"]], "codecipher": [[23, "codecipher"]]}, "indexentries": {"codecipher": [[0, "module-codecipher"]], "module": [[0, "module-codecipher"], [1, "module-codecipher.a1z52n62"], [2, "module-codecipher.a1z52n62.decode"], [3, "module-codecipher.a1z52n62.encode"], [4, "module-codecipher.atbs"], [5, "module-codecipher.atbs.decode"], [6, "module-codecipher.atbs.encode"], [7, "module-codecipher.atbs.lookup_table"], [8, "module-codecipher.b64"], [9, "module-codecipher.b64.decode"], [10, "module-codecipher.b64.encode"], [11, "module-codecipher.caesar"], [12, "module-codecipher.caesar.decode"], [13, "module-codecipher.caesar.encode"], [14, "module-codecipher.vernam"], [15, "module-codecipher.vernam.decode"], [16, "module-codecipher.vernam.encode"], [17, "module-codecipher.vigenere"], [18, "module-codecipher.vigenere.decode"], [19, "module-codecipher.vigenere.encode"], [20, "module-codecipher.vigenere.key_generator"], [21, "module-codecipher.vigenere.lookup_table"]], "a1z52n62 (class in codecipher.a1z52n62)": [[1, "codecipher.a1z52n62.A1z52N62"]], "codecipher.a1z52n62": [[1, "module-codecipher.a1z52n62"]], "a1z52n62decode (class in codecipher.a1z52n62.decode)": [[2, "codecipher.a1z52n62.decode.A1z52N62Decoder"]], "_decode_data (codecipher.a1z52n62.decode.a1z52n62decode attribute)": [[2, "codecipher.a1z52n62.decode.A1z52N62Decoder._decode_data"]], "codecipher.a1z52n62.decode": [[2, "module-codecipher.a1z52n62.decode"]], "decode() (codecipher.a1z52n62.decode.a1z52n62decode method)": [[2, "codecipher.a1z52n62.decode.A1z52N62Decoder.decode"]], "decode_data (codecipher.a1z52n62.decode.a1z52n62decode property)": [[2, "codecipher.a1z52n62.decode.A1z52N62Decoder.decode_data"]], "a1z52n62encode (class in codecipher.a1z52n62.encode)": [[3, "codecipher.a1z52n62.encode.A1z52N62Encoder"]], "_encode_data (codecipher.a1z52n62.encode.a1z52n62encode attribute)": [[3, "codecipher.a1z52n62.encode.A1z52N62Encoder._encode_data"]], "codecipher.a1z52n62.encode": [[3, "module-codecipher.a1z52n62.encode"]], "encode() (codecipher.a1z52n62.encode.a1z52n62encode method)": [[3, "codecipher.a1z52n62.encode.A1z52N62Encoder.encode"]], "encode_data (codecipher.a1z52n62.encode.a1z52n62encode property)": [[3, "codecipher.a1z52n62.encode.A1z52N62Encoder.encode_data"]], "alephtawbetshin (class in codecipher.atbs)": [[4, "codecipher.atbs.ATBS"]], "codecipher.atbs": [[4, "module-codecipher.atbs"]], "alephtawbetshindecode (class in codecipher.atbs.decode)": [[5, "codecipher.atbs.decode.ATBSDecode"]], "_decode_data (codecipher.atbs.decode.alephtawbetshindecode attribute)": [[5, "codecipher.atbs.decode.ATBSDecode._decode_data"]], "codecipher.atbs.decode": [[5, "module-codecipher.atbs.decode"]], "decode() (codecipher.atbs.decode.alephtawbetshindecode method)": [[5, "codecipher.atbs.decode.ATBSDecode.decode"]], "decode_data (codecipher.atbs.decode.alephtawbetshindecode property)": [[5, "codecipher.atbs.decode.ATBSDecode.decode_data"]], "alephtawbetshinencode (class in codecipher.atbs.encode)": [[6, "codecipher.atbs.encode.ATBSEncode"]], "_encode_data (codecipher.atbs.encode.alephtawbetshinencode attribute)": [[6, "codecipher.atbs.encode.ATBSEncode._encode_data"]], "codecipher.atbs.encode": [[6, "module-codecipher.atbs.encode"]], "encode() (codecipher.atbs.encode.alephtawbetshinencode method)": [[6, "codecipher.atbs.encode.ATBSEncode.encode"]], "encode_data (codecipher.atbs.encode.alephtawbetshinencode property)": [[6, "codecipher.atbs.encode.ATBSEncode.encode_data"]], "codecipher.atbs.lookup_table": [[7, "module-codecipher.atbs.lookup_table"]], "b64 (class in codecipher.b64)": [[8, "codecipher.b64.B64"]], "codecipher.b64": [[8, "module-codecipher.b64"]], "b64decode (class in codecipher.b64.decode)": [[9, "codecipher.b64.decode.B64Decode"]], "_decode_data (codecipher.b64.decode.b64decode attribute)": [[9, "codecipher.b64.decode.B64Decode._decode_data"]], "codecipher.b64.decode": [[9, "module-codecipher.b64.decode"]], "decode() (codecipher.b64.decode.b64decode method)": [[9, "codecipher.b64.decode.B64Decode.decode"]], "decode_data (codecipher.b64.decode.b64decode property)": [[9, "codecipher.b64.decode.B64Decode.decode_data"]], "b64encode (class in codecipher.b64.encode)": [[10, "codecipher.b64.encode.B64Encode"]], "_encode_data (codecipher.b64.encode.b64encode attribute)": [[10, "codecipher.b64.encode.B64Encode._encode_data"]], "codecipher.b64.encode": [[10, "module-codecipher.b64.encode"]], "encode() (codecipher.b64.encode.b64encode method)": [[10, "codecipher.b64.encode.B64Encode.encode"]], "encode_data (codecipher.b64.encode.b64encode property)": [[10, "codecipher.b64.encode.B64Encode.encode_data"]], "caesar (class in codecipher.caesar)": [[11, "codecipher.caesar.Caesar"]], "codecipher.caesar": [[11, "module-codecipher.caesar"]], "caesardecode (class in codecipher.caesar.decode)": [[12, "codecipher.caesar.decode.CaesarDecode"]], "_decode_data (codecipher.caesar.decode.caesardecode attribute)": [[12, "codecipher.caesar.decode.CaesarDecode._decode_data"]], "codecipher.caesar.decode": [[12, "module-codecipher.caesar.decode"]], "decode() (codecipher.caesar.decode.caesardecode method)": [[12, "codecipher.caesar.decode.CaesarDecode.decode"]], "decode_data (codecipher.caesar.decode.caesardecode property)": [[12, "codecipher.caesar.decode.CaesarDecode.decode_data"]], "caesarencode (class in codecipher.caesar.encode)": [[13, "codecipher.caesar.encode.CaesarEncode"]], "_encode_data (codecipher.caesar.encode.caesarencode attribute)": [[13, "codecipher.caesar.encode.CaesarEncode._encode_data"]], "codecipher.caesar.encode": [[13, "module-codecipher.caesar.encode"]], "encode() (codecipher.caesar.encode.caesarencode method)": [[13, "codecipher.caesar.encode.CaesarEncode.encode"]], "encode_data (codecipher.caesar.encode.caesarencode property)": [[13, "codecipher.caesar.encode.CaesarEncode.encode_data"]], "vernam (class in codecipher.vernam)": [[14, "codecipher.vernam.Vernam"]], "codecipher.vernam": [[14, "module-codecipher.vernam"]], "vernamdecode (class in codecipher.vernam.decode)": [[15, "codecipher.vernam.decode.VernamDecode"]], "_decode_data (codecipher.vernam.decode.vernamdecode attribute)": [[15, "codecipher.vernam.decode.VernamDecode._decode_data"]], "codecipher.vernam.decode": [[15, "module-codecipher.vernam.decode"]], "decode() (codecipher.vernam.decode.vernamdecode method)": [[15, "codecipher.vernam.decode.VernamDecode.decode"]], "decode_data (codecipher.vernam.decode.vernamdecode property)": [[15, "codecipher.vernam.decode.VernamDecode.decode_data"]], "vernamencode (class in codecipher.vernam.encode)": [[16, "codecipher.vernam.encode.VernamEncode"]], "_encode_data (codecipher.vernam.encode.vernamencode attribute)": [[16, "codecipher.vernam.encode.VernamEncode._encode_data"]], "codecipher.vernam.encode": [[16, "module-codecipher.vernam.encode"]], "encode() (codecipher.vernam.encode.vernamencode method)": [[16, "codecipher.vernam.encode.VernamEncode.encode"]], "encode_data (codecipher.vernam.encode.vernamencode property)": [[16, "codecipher.vernam.encode.VernamEncode.encode_data"]], "vigenere (class in codecipher.vigenere)": [[17, "codecipher.vigenere.Vigenere"]], "codecipher.vigenere": [[17, "module-codecipher.vigenere"]], "vigeneredecode (class in codecipher.vigenere.decode)": [[18, "codecipher.vigenere.decode.VigenereDecode"]], "_decode_data (codecipher.vigenere.decode.vigeneredecode attribute)": [[18, "codecipher.vigenere.decode.VigenereDecode._decode_data"]], "_split_data_decode() (codecipher.vigenere.decode.vigeneredecode method)": [[18, "codecipher.vigenere.decode.VigenereDecode._split_data_decode"]], "codecipher.vigenere.decode": [[18, "module-codecipher.vigenere.decode"]], "decode() (codecipher.vigenere.decode.vigeneredecode method)": [[18, "codecipher.vigenere.decode.VigenereDecode.decode"]], "decode_data (codecipher.vigenere.decode.vigeneredecode property)": [[18, "codecipher.vigenere.decode.VigenereDecode.decode_data"]], "vigenereencode (class in codecipher.vigenere.encode)": [[19, "codecipher.vigenere.encode.VigenereEncode"]], "_encode_data (codecipher.vigenere.encode.vigenereencode attribute)": [[19, "codecipher.vigenere.encode.VigenereEncode._encode_data"]], "_split_data_encode() (codecipher.vigenere.encode.vigenereencode method)": [[19, "codecipher.vigenere.encode.VigenereEncode._split_data_encode"]], "codecipher.vigenere.encode": [[19, "module-codecipher.vigenere.encode"]], "encode() (codecipher.vigenere.encode.vigenereencode method)": [[19, "codecipher.vigenere.encode.VigenereEncode.encode"]], "encode_data (codecipher.vigenere.encode.vigenereencode property)": [[19, "codecipher.vigenere.encode.VigenereEncode.encode_data"]], "keygenerator (class in codecipher.vigenere.key_generator)": [[20, "codecipher.vigenere.key_generator.KeyGenerator"]], "_data_len (codecipher.vigenere.key_generator.keygenerator attribute)": [[20, "codecipher.vigenere.key_generator.KeyGenerator._data_len"]], "_key (codecipher.vigenere.key_generator.keygenerator attribute)": [[20, "codecipher.vigenere.key_generator.KeyGenerator._key"]], "codecipher.vigenere.key_generator": [[20, "module-codecipher.vigenere.key_generator"]], "data_len (codecipher.vigenere.key_generator.keygenerator property)": [[20, "codecipher.vigenere.key_generator.KeyGenerator.data_len"]], "generate_key() (codecipher.vigenere.key_generator.keygenerator method)": [[20, "codecipher.vigenere.key_generator.KeyGenerator.generate_key"]], "key (codecipher.vigenere.key_generator.keygenerator property)": [[20, "codecipher.vigenere.key_generator.KeyGenerator.key"]], "alpha (codecipher.vigenere.lookup_table.lookuptable attribute)": [[21, "codecipher.vigenere.lookup_table.LookUpTable.ALPHA"]], "alphanum (codecipher.vigenere.lookup_table.lookuptable attribute)": [[21, "codecipher.vigenere.lookup_table.LookUpTable.ALPHANUM"]], "index_to_letter (codecipher.vigenere.lookup_table.lookuptable attribute)": [[21, "codecipher.vigenere.lookup_table.LookUpTable.INDEX_TO_LETTER"]], "letter_to_index (codecipher.vigenere.lookup_table.lookuptable attribute)": [[21, "codecipher.vigenere.lookup_table.LookUpTable.LETTER_TO_INDEX"]], "lookuptable (class in codecipher.vigenere.lookup_table)": [[21, "codecipher.vigenere.lookup_table.LookUpTable"]], "num (codecipher.vigenere.lookup_table.lookuptable attribute)": [[21, "codecipher.vigenere.lookup_table.LookUpTable.NUM"]], "white_space (codecipher.vigenere.lookup_table.lookuptable attribute)": [[21, "codecipher.vigenere.lookup_table.LookUpTable.WHITE_SPACE"]], "codecipher.vigenere.lookup_table": [[21, "module-codecipher.vigenere.lookup_table"]]}}) \ No newline at end of file diff --git a/tests/a1z52n62_test.py b/tests/a1z52n62_test.py index acb0be4..af6190f 100644 --- a/tests/a1z52n62_test.py +++ b/tests/a1z52n62_test.py @@ -22,15 +22,15 @@ python3 -m unittest -v a1z52n62_test ''' -import sys import unittest +from unittest.mock import MagicMock, PropertyMock from typing import List, Optional - -try: - from codecipher.a1z52n62 import A1z52N62 -except ImportError as test_error_message: - # Force close python test ################################################# - sys.exit(f'\n{__file__}\n{test_error_message}\n') +from codecipher.a1z52n62 import ( + A1z52N62, + IValidationEngine, + IA1z52N62Encoder, + IA1z52N62Decoder +) __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -62,6 +62,13 @@ class A1z52N62TestCase(unittest.TestCase): | tearDown - Call after test cases. | test_a1z52n62_encoding - Test for base encoding a1z52n62. | test_a1z52n62_decoding - Test for base decoding a1z52n62. + | test_encode_with_none_data - Test for encoding with None data. + | test_encode_with_validation_failure - Test for encoding with validation failure. + | test_encode_delegation - Test for encoding delegation to encoder. + | test_decode_with_none_data - Test for decoding with None data. + | test_decode_with_decoder_failure - Test for decoding with decoder failure. + | test_decode_with_validation_failure - Test for decoding with validation failure. + | test_decode_delegation - Test for decoding delegation to decoder. ''' RAW_DATA: str = 'More Human Than Human01 Is Our Motto' @@ -78,30 +85,115 @@ def setUp(self) -> None: self.enc_sequence: Optional[str] = ' - '.join(A1z52N62TestCase.ENC_SEQ) self.enc_data: Optional[str] = None self.dec_data: Optional[str] = None - self.cipher: Optional[A1z52N62] = A1z52N62() + + # Mock dependencies for the base tests + self.mock_encoder = MagicMock(spec=IA1z52N62Encoder) + self.mock_encoder.encode.return_value = True + type(self.mock_encoder).encode_data = PropertyMock(return_value=self.enc_sequence) + + self.mock_decoder = MagicMock(spec=IA1z52N62Decoder) + self.mock_decoder.decode.return_value = True + type(self.mock_decoder).decode_data = PropertyMock(return_value=self.raw_data) + + self.mock_validation_engine = MagicMock(spec=IValidationEngine) + self.mock_validation_engine.is_valid.return_value = True + + self.cipher: A1z52N62 = A1z52N62( + validation_engine=self.mock_validation_engine, + encoder=self.mock_encoder, + decoder=self.mock_decoder + ) def tearDown(self) -> None: '''Call after test cases.''' self.raw_data = None self.enc_data = None self.dec_data = None - self.cipher = None + self.cipher = None # type: ignore def test_a1z52n62_encoding(self) -> None: - '''Test base encoding.''' - if bool(self.cipher): - self.cipher.encode(self.raw_data) - self.enc_data: Optional[str] = self.cipher.encode_data - self.assertEqual(self.enc_sequence, self.enc_data) + '''Testing base encoding.''' + self.cipher.encode(self.raw_data) + self.enc_data: Optional[str] = self.cipher.encode_data + self.assertEqual(self.enc_sequence, self.enc_data) def test_a1z52n62_decoding(self) -> None: - '''Test base decoding.''' - if bool(self.cipher): - self.cipher.encode(self.raw_data) - self.enc_data = self.cipher.encode_data - self.cipher.decode(self.enc_data) - self.dec_data: Optional[str] = self.cipher.decode_data - self.assertEqual(self.raw_data, self.dec_data) + '''Testing base decoding.''' + self.cipher.encode(self.raw_data) + self.enc_data = self.cipher.encode_data + self.cipher.decode(self.enc_data) + self.dec_data: Optional[str] = self.cipher.decode_data + self.assertEqual(self.raw_data, self.dec_data) + + def test_encode_with_none_data(self) -> None: + '''Testing encode with None or empty data.''' + cipher = A1z52N62() + self.assertFalse(cipher.encode(None)) + self.assertFalse(cipher.encode('')) + + def test_encode_with_validation_failure(self) -> None: + '''Testing encode when validation engine fails.''' + mock_engine = MagicMock(spec=IValidationEngine) + mock_engine.is_valid.return_value = False + cipher = A1z52N62(validation_engine=mock_engine) + + self.assertFalse(cipher.encode("test_data")) + mock_engine.is_valid.assert_called_once_with("test_data") + + def test_encode_delegation(self) -> None: + '''Testing encode delegation to internal encoder.''' + mock_engine = MagicMock(spec=IValidationEngine) + mock_engine.is_valid.return_value = True + mock_encoder = MagicMock(spec=IA1z52N62Encoder) + mock_encoder.encode.return_value = True + cipher = A1z52N62(validation_engine=mock_engine, encoder=mock_encoder) + + self.assertTrue(cipher.encode("valid_data")) + mock_encoder.encode.assert_called_once_with("valid_data") + + def test_decode_with_none_data(self) -> None: + '''Testing decode with None or empty data.''' + cipher = A1z52N62() + self.assertFalse(cipher.decode(None)) + self.assertFalse(cipher.decode('')) + + def test_decode_with_decoder_failure(self) -> None: + '''Testing decode when internal decoder fails.''' + mock_decoder = MagicMock(spec=IA1z52N62Decoder) + mock_decoder.decode.return_value = False + cipher = A1z52N62(decoder=mock_decoder) + + self.assertFalse(cipher.decode("encoded_data")) + mock_decoder.decode.assert_called_once_with("encoded_data") + + def test_decode_with_validation_failure(self) -> None: + '''Testing decode when validation of decoded data fails.''' + mock_decoder = MagicMock(spec=IA1z52N62Decoder) + mock_decoder.decode.return_value = True + type(mock_decoder).decode_data = PropertyMock(return_value="decoded_invalid") + + mock_engine = MagicMock(spec=IValidationEngine) + mock_engine.is_valid.return_value = False + + cipher = A1z52N62(validation_engine=mock_engine, decoder=mock_decoder) + + self.assertFalse(cipher.decode("encoded_data")) + mock_engine.is_valid.assert_called_once_with("decoded_invalid") + + def test_decode_delegation(self) -> None: + '''Testing decode delegation to internal decoder and engine.''' + mock_decoder = MagicMock(spec=IA1z52N62Decoder) + mock_decoder.decode.return_value = True + type(mock_decoder).decode_data = PropertyMock(return_value="decoded_valid") + + mock_engine = MagicMock(spec=IValidationEngine) + mock_engine.is_valid.return_value = True + + cipher = A1z52N62(validation_engine=mock_engine, decoder=mock_decoder) + + self.assertTrue(cipher.decode("encoded_data")) + mock_decoder.decode.assert_called_once_with("encoded_data") + mock_engine.is_valid.assert_called_once_with("decoded_valid") if __name__ == '__main__': diff --git a/tests/atbs_test.py b/tests/atbs_test.py index e367954..ee381fe 100644 --- a/tests/atbs_test.py +++ b/tests/atbs_test.py @@ -16,21 +16,21 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . Info - Defines class AlephTawBetShinTestCase with attribute(s) and method(s). - Creates test cases for checking functionalities of AlephTawBetShin. + Defines class ATBSTestCase with attribute(s) and method(s). + Creates test cases for checking functionalities of ATBS. Execute python3 -m unittest -v atbs_test ''' -import sys import unittest +from unittest.mock import MagicMock, PropertyMock from typing import List, Optional - -try: - from codecipher.atbs import AlephTawBetShin -except ImportError as test_error_message: - # Force close python test ################################################# - sys.exit(f'\n{__file__}\n{test_error_message}\n') +from codecipher.atbs import ( + ATBS, + IValidationEngine, + IATBSEncoder, + IATBSDecoder +) __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -42,10 +42,10 @@ __status__: str = 'Updated' -class AlephTawBetShinTestCase(unittest.TestCase): +class ATBSTestCase(unittest.TestCase): ''' - Defines class AlephTawBetShinTestCase with attribute(s) and method(s). - Creates test cases for checking functionalities of AlephTawBetShin. + Defines class ATBSTestCase with attribute(s) and method(s). + Creates test cases for checking functionalities of ATBS. It defines: @@ -62,41 +62,133 @@ class AlephTawBetShinTestCase(unittest.TestCase): | tearDown - Call after test cases. | test_atbs_encoding - Test for base encoding atbs. | test_atbs_decoding - Test for base decoding atbs. + | test_encode_with_none_data - Test for encoding with None data. + | test_encode_with_validation_failure - Test for encoding with validation failure. + | test_encode_delegation - Test for encoding delegation to encoder. + | test_decode_with_none_data - Test for decoding with None data. + | test_decode_with_decoder_failure - Test for decoding with decoder failure. + | test_decode_with_validation_failure - Test for decoding with validation failure. + | test_decode_delegation - Test for decoding delegation to decoder. ''' RAW_DATA: str = 'More Human Than Human01 Is Our Motto' ENC_SEQ: str = 'Nliv Sfnzm Gszm Sfnzm98 Rh Lfi Nlggl' def setUp(self) -> None: - '''Call before test case.''' - self.raw_data: Optional[str] = AlephTawBetShinTestCase.RAW_DATA - self.enc_sequence: Optional[str] = AlephTawBetShinTestCase.ENC_SEQ + '''Call before test cases.''' + self.raw_data: Optional[str] = ATBSTestCase.RAW_DATA + self.enc_sequence: Optional[str] = ATBSTestCase.ENC_SEQ self.enc_data: Optional[str] = None self.dec_data: Optional[str] = None - self.cipher: Optional[AlephTawBetShin] = AlephTawBetShin() + + # Mock dependencies for the base tests + self.mock_encoder = MagicMock(spec=IATBSEncoder) + self.mock_encoder.encode.return_value = True + type(self.mock_encoder).encode_data = PropertyMock(return_value=self.enc_sequence) + + self.mock_decoder = MagicMock(spec=IATBSDecoder) + self.mock_decoder.decode.return_value = True + type(self.mock_decoder).decode_data = PropertyMock(return_value=self.raw_data) + + self.mock_validation_engine = MagicMock(spec=IValidationEngine) + self.mock_validation_engine.is_valid.return_value = True + + self.cipher: ATBS = ATBS( + validation_engine=self.mock_validation_engine, + encoder=self.mock_encoder, + decoder=self.mock_decoder + ) def tearDown(self) -> None: - '''Call after test case.''' + '''Call after test cases.''' self.raw_data = None self.enc_data = None self.dec_data = None - self.cipher = None + self.cipher = None # type: ignore def test_atbs_encoding(self) -> None: - '''Test base info.''' - if bool(self.cipher): - self.cipher.encode(self.raw_data) - self.enc_data: Optional[str] = self.cipher.encode_data - self.assertEqual(self.enc_sequence, self.enc_data) + '''Testing base encoding.''' + self.cipher.encode(self.raw_data) + self.enc_data: Optional[str] = self.cipher.encode_data + self.assertEqual(self.enc_sequence, self.enc_data) def test_atbs_decoding(self) -> None: - '''Test base info.''' - if bool(self.cipher): - self.cipher.encode(self.raw_data) - self.enc_data = self.cipher.encode_data - self.cipher.decode(self.enc_data) - self.dec_data: Optional[str] = self.cipher.decode_data - self.assertEqual(self.raw_data, self.dec_data) + '''Testing base decoding.''' + self.cipher.encode(self.raw_data) + self.enc_data = self.cipher.encode_data + self.cipher.decode(self.enc_data) + self.dec_data: Optional[str] = self.cipher.decode_data + self.assertEqual(self.raw_data, self.dec_data) + + def test_encode_with_none_data(self) -> None: + '''Testing encode with None or empty data.''' + cipher = ATBS() + self.assertFalse(cipher.encode(None)) + self.assertFalse(cipher.encode('')) + + def test_encode_with_validation_failure(self) -> None: + '''Testing encode when validation engine fails.''' + mock_engine = MagicMock(spec=IValidationEngine) + mock_engine.is_valid.return_value = False + cipher = ATBS(validation_engine=mock_engine) + + self.assertFalse(cipher.encode("test_data")) + mock_engine.is_valid.assert_called_once_with("test_data") + + def test_encode_delegation(self) -> None: + '''Testing encode delegation to internal encoder.''' + mock_engine = MagicMock(spec=IValidationEngine) + mock_engine.is_valid.return_value = True + mock_encoder = MagicMock(spec=IATBSEncoder) + mock_encoder.encode.return_value = True + cipher = ATBS(validation_engine=mock_engine, encoder=mock_encoder) + + self.assertTrue(cipher.encode("valid_data")) + mock_encoder.encode.assert_called_once_with("valid_data") + + def test_decode_with_none_data(self) -> None: + '''Testing decode with None or empty data.''' + cipher = ATBS() + self.assertFalse(cipher.decode(None)) + self.assertFalse(cipher.decode('')) + + def test_decode_with_decoder_failure(self) -> None: + '''Testing decode when internal decoder fails.''' + mock_decoder = MagicMock(spec=IATBSDecoder) + mock_decoder.decode.return_value = False + cipher = ATBS(decoder=mock_decoder) + + self.assertFalse(cipher.decode("encoded_data")) + mock_decoder.decode.assert_called_once_with("encoded_data") + + def test_decode_with_validation_failure(self) -> None: + '''Testing decode when validation of decoded data fails.''' + mock_decoder = MagicMock(spec=IATBSDecoder) + mock_decoder.decode.return_value = True + type(mock_decoder).decode_data = PropertyMock(return_value="decoded_invalid") + + mock_engine = MagicMock(spec=IValidationEngine) + mock_engine.is_valid.return_value = False + + cipher = ATBS(validation_engine=mock_engine, decoder=mock_decoder) + + self.assertFalse(cipher.decode("encoded_data")) + mock_engine.is_valid.assert_called_once_with("decoded_invalid") + + def test_decode_delegation(self) -> None: + '''Testing decode delegation to internal decoder and engine.''' + mock_decoder = MagicMock(spec=IATBSDecoder) + mock_decoder.decode.return_value = True + type(mock_decoder).decode_data = PropertyMock(return_value="decoded_valid") + + mock_engine = MagicMock(spec=IValidationEngine) + mock_engine.is_valid.return_value = True + + cipher = ATBS(validation_engine=mock_engine, decoder=mock_decoder) + + self.assertTrue(cipher.decode("encoded_data")) + mock_decoder.decode.assert_called_once_with("encoded_data") + mock_engine.is_valid.assert_called_once_with("decoded_valid") if __name__ == '__main__': diff --git a/tests/b64_test.py b/tests/b64_test.py index d41cd60..bacbdba 100644 --- a/tests/b64_test.py +++ b/tests/b64_test.py @@ -22,15 +22,10 @@ python3 -m unittest -v b64_test ''' -import sys import unittest +from unittest.mock import MagicMock, PropertyMock from typing import List, Optional - -try: - from codecipher.b64 import B64 -except ImportError as test_error_message: - # Force close python test ################################################# - sys.exit(f'\n{__file__}\n{test_error_message}\n') +from codecipher.b64 import B64 __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -66,6 +61,10 @@ class B64TestCase(unittest.TestCase): RAW_DATA: str = 'More Human Than Human01 Is Our Motto' ENC_SEQ: str = 'TW9yZSBIdW1hbiBUaGFuIEh1bWFuMDEgSXMgT3VyIE1vdHRv' + EMPTY_DATA: str = '' + EMPTY_ENC_SEQ: str = '' + UNICODE_DATA: str = 'Привет, мир! 👋' + UNICODE_ENC_SEQ: str = '0J/RgNC40LLQtdGCLCDQvNC40YAhIPCfkYs=' def setUp(self) -> None: '''Call before test cases.''' @@ -98,6 +97,106 @@ def test_b64_decoding(self) -> None: self.dec_data = self.cipher.decode_data self.assertEqual(self.raw_data, self.dec_data) + def test_b64_encoding_empty_string(self) -> None: + '''Test encoding an empty string.''' + if bool(self.cipher): + # B64.encode returns False for empty string and doesn't set encode_data + result = self.cipher.encode(self.EMPTY_DATA) + self.assertFalse(result) + self.enc_data = self.cipher.encode_data + self.assertIsNone(self.enc_data) + + def test_b64_decoding_empty_string(self) -> None: + '''Test decoding an empty string.''' + if bool(self.cipher): + # B64.decode returns False for empty string and doesn't set decode_data + result = self.cipher.decode(self.EMPTY_ENC_SEQ) + self.assertFalse(result) + self.dec_data = self.cipher.decode_data + self.assertIsNone(self.dec_data) + + def test_b64_with_none_data(self) -> None: + '''Test encoding and decoding with None.''' + if bool(self.cipher): + self.assertFalse(self.cipher.encode(None)) + self.assertFalse(self.cipher.decode(None)) + + def test_b64_encoding_with_spaces(self) -> None: + '''Test encoding a string with only spaces.''' + data_with_spaces = ' ' + expected_encoded = 'ICAg' + if bool(self.cipher): + self.cipher.encode(data_with_spaces) + self.enc_data = self.cipher.encode_data + self.assertEqual(expected_encoded, self.enc_data) + + def test_b64_decoding_with_spaces(self) -> None: + '''Test decoding a string with only spaces.''' + data_with_spaces = ' ' + expected_encoded = 'ICAg' + if bool(self.cipher): + self.cipher.decode(expected_encoded) + self.dec_data = self.cipher.decode_data + self.assertEqual(data_with_spaces, self.dec_data) + + def test_b64_encoding_with_numbers_and_symbols(self) -> None: + '''Test encoding a string with numbers and symbols.''' + data = '123!@#abcABC' + expected_encoded = 'MTIzIUAjYWJjQUJD' + if bool(self.cipher): + self.cipher.encode(data) + self.enc_data = self.cipher.encode_data + self.assertEqual(expected_encoded, self.enc_data) + + def test_b64_decoding_with_numbers_and_symbols(self) -> None: + '''Test decoding a string with numbers and symbols.''' + data = '123!@#abcABC' + expected_encoded = 'MTIzIUAjYWJjQUJD' + if bool(self.cipher): + self.cipher.decode(expected_encoded) + self.dec_data = self.cipher.decode_data + self.assertEqual(data, self.dec_data) + + def test_b64_encoding_unicode(self) -> None: + '''Test encoding a Unicode string.''' + if bool(self.cipher): + self.cipher.encode(self.UNICODE_DATA) + self.enc_data = self.cipher.encode_data + # The actual base64 encoding of 'Привет, мир! 👋' is '0J/QtdC70Ywg0LzQvtC7ISA47u+x' + # when encoded as UTF-8 bytes. + self.assertEqual(self.UNICODE_ENC_SEQ, self.enc_data) + + def test_b64_decoding_unicode(self) -> None: + '''Test decoding a Unicode string.''' + if bool(self.cipher): + self.cipher.decode(self.UNICODE_ENC_SEQ) + self.dec_data = self.cipher.decode_data + self.assertEqual(self.UNICODE_DATA, self.dec_data) + + def test_b64_mock_interactions(self) -> None: + '''Test interactions with a mocked B64 cipher object.''' + mock_cipher = MagicMock(spec=B64) + test_data = "Hello Mock!" + mock_encoded_data = "SGVsbG8gTW9jayE=" + mock_decoded_data = "Hello Mock!" + + # Configure the mock's encode method + mock_cipher.encode.return_value = True + type(mock_cipher).encode_data = PropertyMock(return_value=mock_encoded_data) + + # Configure the mock's decode method + mock_cipher.decode.return_value = True + type(mock_cipher).decode_data = PropertyMock(return_value=mock_decoded_data) + + # Use the mocked cipher + self.assertTrue(mock_cipher.encode(test_data)) + self.assertEqual(mock_encoded_data, mock_cipher.encode_data) + mock_cipher.encode.assert_called_once_with(test_data) + + self.assertTrue(mock_cipher.decode(mock_encoded_data)) + self.assertEqual(mock_decoded_data, mock_cipher.decode_data) + mock_cipher.decode.assert_called_once_with(mock_encoded_data) + if __name__ == '__main__': unittest.main() diff --git a/tests/caesar_test.py b/tests/caesar_test.py index 96b49c7..12e9acf 100644 --- a/tests/caesar_test.py +++ b/tests/caesar_test.py @@ -22,15 +22,10 @@ python3 -m unittest -v caesar_test ''' -import sys import unittest +from unittest.mock import MagicMock, PropertyMock from typing import List, Optional - -try: - from codecipher.caesar import Caesar -except ImportError as test_error_message: - # Force close python test ################################################# - sys.exit(f'\n{__file__}\n{test_error_message}\n') +from codecipher.caesar import Caesar, ICaesarEncoder, ICaesarDecoder __author__: str = 'Vladimir Roncevic' __copyright__: str = '(C) 2026, https://electux.github.io/codecipher' @@ -66,6 +61,10 @@ class CaesarTestCase(unittest.TestCase): RAW_DATA: str = 'More Human Than Human01 Is Our Motto' ENC_SEQ: str = 'Pruh Kxpdq Wkdq Kxpdq01 Lv Rxu Prwwr' + EMPTY_DATA: str = '' + EMPTY_ENC_SEQ: str = '' + UNICODE_DATA: str = 'Привет, мир! 👋' + UNICODE_ENC_SEQ: str = 'Привет, мир! 👋' # Caesar cipher implementation ignores non-ASCII letters def setUp(self) -> None: '''Call before test cases.''' @@ -73,14 +72,25 @@ def setUp(self) -> None: self.enc_sequence: Optional[str] = CaesarTestCase.ENC_SEQ self.enc_data: Optional[str] = None self.dec_data: Optional[str] = None - self.cipher: Optional[Caesar] = Caesar() + + # Initialize Caesar with default (real) encoder/decoder for most tests + self.cipher: Caesar = Caesar() + + # Mocks for specific mock interaction tests + self.mock_encoder: MagicMock = MagicMock(spec=ICaesarEncoder) + self.mock_decoder: MagicMock = MagicMock(spec=ICaesarDecoder) + self.mock_cipher_with_deps: Caesar = Caesar(encoder=self.mock_encoder, + decoder=self.mock_decoder) def tearDown(self) -> None: '''Call after test cases.''' self.raw_data = None self.enc_data = None self.dec_data = None - self.cipher = None + self.cipher = None # type: ignore + self.mock_encoder = None # type: ignore + self.mock_decoder = None # type: ignore + self.mock_cipher_with_deps = None # type: ignore def test_caesar_encoding(self) -> None: '''Test base encoding.''' @@ -98,6 +108,109 @@ def test_caesar_decoding(self) -> None: self.dec_data = self.cipher.decode_data self.assertEqual(self.raw_data, self.dec_data) + def test_caesar_encoding_empty_string(self) -> None: + '''Test encoding an empty string.''' + if bool(self.cipher): + result = self.cipher.encode(self.EMPTY_DATA, 3) + self.assertFalse(result) + self.enc_data = self.cipher.encode_data + self.assertIsNone(self.enc_data) + + def test_caesar_decoding_empty_string(self) -> None: + '''Test decoding an empty string.''' + if bool(self.cipher): + result = self.cipher.decode(self.EMPTY_ENC_SEQ, 3) + self.assertFalse(result) + self.dec_data = self.cipher.decode_data + self.assertIsNone(self.dec_data) + + def test_caesar_with_none_data(self) -> None: + '''Test encoding and decoding with None data.''' + if bool(self.cipher): + self.assertFalse(self.cipher.encode(None, 3)) + self.assertFalse(self.cipher.decode(None, 3)) + + def test_caesar_with_none_shift_counter(self) -> None: + '''Test encoding and decoding with None shift counter.''' + if bool(self.cipher): + self.assertFalse(self.cipher.encode(self.RAW_DATA, None)) + self.assertFalse(self.cipher.decode(self.ENC_SEQ, None)) + + def test_caesar_encoding_with_spaces(self) -> None: + '''Test encoding a string with only spaces.''' + data_with_spaces = ' ' + expected_encoded = ' ' # Spaces are ignored by Caesar cipher + if bool(self.cipher): + self.cipher.encode(data_with_spaces, 5) + self.enc_data = self.cipher.encode_data + self.assertEqual(expected_encoded, self.enc_data) + + def test_caesar_decoding_with_spaces(self) -> None: + '''Test decoding a string with only spaces.''' + data_with_spaces = ' ' + expected_encoded = ' ' + if bool(self.cipher): + self.cipher.decode(expected_encoded, 5) + self.dec_data = self.cipher.decode_data + self.assertEqual(data_with_spaces, self.dec_data) + + def test_caesar_encoding_with_numbers_and_symbols(self) -> None: + '''Test encoding a string with numbers and symbols.''' + data = '123!@#abcABC' + expected_encoded = '123!@#defDEF' # Numbers and symbols are ignored, letters shifted by 3 + if bool(self.cipher): + self.cipher.encode(data, 3) + self.enc_data = self.cipher.encode_data + self.assertEqual(expected_encoded, self.enc_data) + + def test_caesar_decoding_with_numbers_and_symbols(self) -> None: + '''Test decoding a string with numbers and symbols.''' + data = '123!@#abcABC' + encoded_data = '123!@#defDEF' + if bool(self.cipher): + self.cipher.decode(encoded_data, 3) + self.dec_data = self.cipher.decode_data + self.assertEqual(data, self.dec_data) + + def test_caesar_encoding_unicode(self) -> None: + '''Test encoding a Unicode string.''' + if bool(self.cipher): + self.cipher.encode(self.UNICODE_DATA, 3) + self.enc_data = self.cipher.encode_data + self.assertEqual(self.UNICODE_ENC_SEQ, self.enc_data) + + def test_caesar_decoding_unicode(self) -> None: + '''Test decoding a Unicode string.''' + if bool(self.cipher): + self.cipher.decode(self.UNICODE_ENC_SEQ, 3) + self.dec_data = self.cipher.decode_data + self.assertEqual(self.UNICODE_DATA, self.dec_data) + + def test_caesar_mock_interactions(self) -> None: + '''Test interactions with mocked encoder and decoder.''' + test_data = "Mock Data" + mock_encoded = "Pbfn Gdwb" + mock_decoded = "Mock Data" + shift = 3 + + # Configure mock encoder + self.mock_encoder.encode.return_value = True + type(self.mock_encoder).encode_data = PropertyMock(return_value=mock_encoded) + + # Configure mock decoder + self.mock_decoder.decode.return_value = True + type(self.mock_decoder).decode_data = PropertyMock(return_value=mock_decoded) + + # Test encode interaction + self.assertTrue(self.mock_cipher_with_deps.encode(test_data, shift)) + self.assertEqual(mock_encoded, self.mock_cipher_with_deps.encode_data) + self.mock_encoder.encode.assert_called_once_with(test_data, shift) + + # Test decode interaction + self.assertTrue(self.mock_cipher_with_deps.decode(mock_encoded, shift)) + self.assertEqual(mock_decoded, self.mock_cipher_with_deps.decode_data) + self.mock_decoder.decode.assert_called_once_with(mock_encoded, shift) + if __name__ == '__main__': unittest.main() diff --git a/tests/codecipher_coverage.json b/tests/codecipher_coverage.json index 17b395b..4c83447 100644 --- a/tests/codecipher_coverage.json +++ b/tests/codecipher_coverage.json @@ -1 +1 @@ -{"meta": {"format": 3, "version": "7.6.10", "timestamp": "2025-11-05T04:57:55.789623", "branch_coverage": false, "show_contexts": false}, "files": {"/data/dev/python/codecipher/github/codecipher/codecipher/__init__.py": {"executed_lines": [3], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [3], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [3], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/__init__.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56, 62], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31], "functions": {"A1z52N62.__init__": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"A1z52N62": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/decode.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 62, 64, 65, 77, 86, 87, 88, 89, 90, 91, 92, 94, 96, 98, 99], "summary": {"covered_lines": 30, "num_statements": 32, "percent_covered": 93.75, "percent_covered_display": "94", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": [], "functions": {"A1z52N62Decoder.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "A1z52N62Decoder.decode": {"executed_lines": [86, 87, 88, 89, 90, 91, 92, 94, 96, 98, 99], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"A1z52N62Decoder": {"executed_lines": [62, 86, 87, 88, 89, 90, 91, 92, 94, 96, 98, 99], "summary": {"covered_lines": 12, "num_statements": 14, "percent_covered": 85.71428571428571, "percent_covered_display": "86", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/encode.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 62, 64, 65, 77, 86, 87, 88, 89, 90, 91, 93, 95, 96, 98, 99], "summary": {"covered_lines": 30, "num_statements": 32, "percent_covered": 93.75, "percent_covered_display": "94", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": [], "functions": {"A1z52N62Encoder.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "A1z52N62Encoder.encode": {"executed_lines": [86, 87, 88, 89, 90, 91, 93, 95, 96, 98, 99], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"A1z52N62Encoder": {"executed_lines": [62, 86, 87, 88, 89, 90, 91, 93, 95, 96, 98, 99], "summary": {"covered_lines": 12, "num_statements": 14, "percent_covered": 85.71428571428571, "percent_covered_display": "86", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/atbs/__init__.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56, 62], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31], "functions": {"AlephTawBetShin.__init__": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"AlephTawBetShin": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/atbs/decode.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 58, 60, 61, 69, 71, 72, 84, 93, 94, 95, 96, 97], "summary": {"covered_lines": 27, "num_statements": 29, "percent_covered": 93.10344827586206, "percent_covered_display": "93", "missing_lines": 2, "excluded_lines": 2}, "missing_lines": [81, 82], "excluded_lines": [29, 31], "functions": {"AlephTawBetShinDecode.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [81, 82], "excluded_lines": []}, "AlephTawBetShinDecode.decode": {"executed_lines": [93, 94, 95, 96, 97], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 58, 60, 61, 71, 72, 84], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"AlephTawBetShinDecode": {"executed_lines": [69, 93, 94, 95, 96, 97], "summary": {"covered_lines": 6, "num_statements": 8, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [81, 82], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 58, 60, 61, 71, 72, 84], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/atbs/encode.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 58, 60, 61, 69, 71, 72, 84, 93, 94, 95, 96, 97], "summary": {"covered_lines": 27, "num_statements": 29, "percent_covered": 93.10344827586206, "percent_covered_display": "93", "missing_lines": 2, "excluded_lines": 2}, "missing_lines": [81, 82], "excluded_lines": [29, 31], "functions": {"AlephTawBetShinEncode.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [81, 82], "excluded_lines": []}, "AlephTawBetShinEncode.encode": {"executed_lines": [93, 94, 95, 96, 97], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 58, 60, 61, 71, 72, 84], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"AlephTawBetShinEncode": {"executed_lines": [69, 93, 94, 95, 96, 97], "summary": {"covered_lines": 6, "num_statements": 8, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [81, 82], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 58, 60, 61, 71, 72, 84], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/atbs/lookup_table.py": {"executed_lines": [3, 22, 24, 25, 26, 27, 28, 29, 30, 31, 33], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [3, 22, 24, 25, 26, 27, 28, 29, 30, 31, 33], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [3, 22, 24, 25, 26, 27, 28, 29, 30, 31, 33], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/b64/__init__.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56, 62], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31], "functions": {"B64.__init__": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"B64": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/b64/decode.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 63, 65, 66, 78, 87, 88], "summary": {"covered_lines": 22, "num_statements": 24, "percent_covered": 91.66666666666667, "percent_covered_display": "92", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": [], "functions": {"B64Decode.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": []}, "B64Decode.decode": {"executed_lines": [87, 88], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 65, 66, 78], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"B64Decode": {"executed_lines": [63, 87, 88], "summary": {"covered_lines": 3, "num_statements": 5, "percent_covered": 60.0, "percent_covered_display": "60", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 65, 66, 78], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/b64/encode.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 63, 65, 66, 78, 87, 88], "summary": {"covered_lines": 22, "num_statements": 24, "percent_covered": 91.66666666666667, "percent_covered_display": "92", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": [], "functions": {"B64Encode.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": []}, "B64Encode.encode": {"executed_lines": [87, 88], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 65, 66, 78], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"B64Encode": {"executed_lines": [63, 87, 88], "summary": {"covered_lines": 3, "num_statements": 5, "percent_covered": 60.0, "percent_covered_display": "60", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 65, 66, 78], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/caesar/__init__.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56, 62], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31], "functions": {"Caesar.__init__": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"Caesar": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/caesar/decode.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 62, 64, 65, 77, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110], "summary": {"covered_lines": 39, "num_statements": 41, "percent_covered": 95.1219512195122, "percent_covered_display": "95", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": [], "functions": {"CaesarDecode.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "CaesarDecode.decode": {"executed_lines": [90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110], "summary": {"covered_lines": 20, "num_statements": 20, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"CaesarDecode": {"executed_lines": [62, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110], "summary": {"covered_lines": 21, "num_statements": 23, "percent_covered": 91.30434782608695, "percent_covered_display": "91", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/caesar/encode.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 62, 64, 65, 77, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110], "summary": {"covered_lines": 39, "num_statements": 41, "percent_covered": 95.1219512195122, "percent_covered_display": "95", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": [], "functions": {"CaesarEncode.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "CaesarEncode.encode": {"executed_lines": [90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110], "summary": {"covered_lines": 20, "num_statements": 20, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"CaesarEncode": {"executed_lines": [62, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110], "summary": {"covered_lines": 21, "num_statements": 23, "percent_covered": 91.30434782608695, "percent_covered_display": "91", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vernam/__init__.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56, 62], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31], "functions": {"Vernam.__init__": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"Vernam": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vernam/decode.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 62, 64, 65, 77, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 101, 103, 104], "summary": {"covered_lines": 34, "num_statements": 36, "percent_covered": 94.44444444444444, "percent_covered_display": "94", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": [], "functions": {"VernamDecode.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "VernamDecode.decode": {"executed_lines": [88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 101, 103, 104], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"VernamDecode": {"executed_lines": [62, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 101, 103, 104], "summary": {"covered_lines": 16, "num_statements": 18, "percent_covered": 88.88888888888889, "percent_covered_display": "89", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vernam/encode.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 62, 64, 65, 77, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 101, 103, 104], "summary": {"covered_lines": 34, "num_statements": 36, "percent_covered": 94.44444444444444, "percent_covered_display": "94", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": [], "functions": {"VernamEncode.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "VernamEncode.encode": {"executed_lines": [88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 101, 103, 104], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"VernamEncode": {"executed_lines": [62, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 101, 103, 104], "summary": {"covered_lines": 16, "num_statements": 18, "percent_covered": 88.88888888888889, "percent_covered_display": "89", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/__init__.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 57, 63], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [30, 32], "functions": {"Vigenere.__init__": {"executed_lines": [63], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 57], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [30, 32]}}, "classes": {"Vigenere": {"executed_lines": [63], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 57], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [30, 32]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/decode.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 59, 61, 62, 70, 72, 73, 85, 99, 100, 101, 102, 103, 105, 118, 119, 120, 121, 122, 126, 129], "summary": {"covered_lines": 35, "num_statements": 37, "percent_covered": 94.5945945945946, "percent_covered_display": "95", "missing_lines": 2, "excluded_lines": 2}, "missing_lines": [82, 83], "excluded_lines": [29, 31], "functions": {"VigenereDecode.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [82, 83], "excluded_lines": []}, "VigenereDecode._split_data_decode": {"executed_lines": [99, 100, 101, 102, 103], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "VigenereDecode.decode": {"executed_lines": [118, 119, 120, 121, 122, 126, 129], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 59, 61, 62, 72, 73, 85, 105], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"VigenereDecode": {"executed_lines": [70, 99, 100, 101, 102, 103, 118, 119, 120, 121, 122, 126, 129], "summary": {"covered_lines": 13, "num_statements": 15, "percent_covered": 86.66666666666667, "percent_covered_display": "87", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [82, 83], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 59, 61, 62, 72, 73, 85, 105], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/encode.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 59, 61, 62, 70, 72, 73, 85, 99, 100, 101, 102, 103, 105, 118, 119, 120, 121, 122, 126, 129], "summary": {"covered_lines": 35, "num_statements": 37, "percent_covered": 94.5945945945946, "percent_covered_display": "95", "missing_lines": 2, "excluded_lines": 2}, "missing_lines": [82, 83], "excluded_lines": [29, 31], "functions": {"VigenereEncode.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [82, 83], "excluded_lines": []}, "VigenereEncode._split_data_encode": {"executed_lines": [99, 100, 101, 102, 103], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "VigenereEncode.encode": {"executed_lines": [118, 119, 120, 121, 122, 126, 129], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 59, 61, 62, 72, 73, 85, 105], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"VigenereEncode": {"executed_lines": [70, 99, 100, 101, 102, 103, 118, 119, 120, 121, 122, 126, 129], "summary": {"covered_lines": 13, "num_statements": 15, "percent_covered": 86.66666666666667, "percent_covered_display": "87", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [82, 83], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 59, 61, 62, 72, 73, 85, 105], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/key_generator.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 53, 54, 56, 57, 67, 68, 77, 78, 80, 81, 89, 91, 92, 101, 102, 104, 111, 112, 113, 114, 117, 118, 119], "summary": {"covered_lines": 35, "num_statements": 37, "percent_covered": 94.5945945945946, "percent_covered_display": "95", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [65, 115], "excluded_lines": [], "functions": {"KeyGenerator.data_len": {"executed_lines": [77, 78], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "KeyGenerator.key": {"executed_lines": [101, 102], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "KeyGenerator.generate_key": {"executed_lines": [111, 112, 113, 114, 117, 118, 119], "summary": {"covered_lines": 7, "num_statements": 8, "percent_covered": 87.5, "percent_covered_display": "88", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [115], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 53, 54, 56, 57, 67, 68, 80, 81, 91, 92, 104], "summary": {"covered_lines": 23, "num_statements": 23, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"KeyGenerator": {"executed_lines": [77, 78, 89, 101, 102, 111, 112, 113, 114, 117, 118, 119], "summary": {"covered_lines": 12, "num_statements": 14, "percent_covered": 85.71428571428571, "percent_covered_display": "86", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [65, 115], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 53, 54, 56, 57, 67, 68, 80, 81, 91, 92, 104], "summary": {"covered_lines": 23, "num_statements": 23, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/lookup_table.py": {"executed_lines": [3, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 53, 54, 55, 56, 57, 58], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [3, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 53, 54, 55, 56, 57, 58], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"LookUpTable": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 53, 54, 55, 56, 57, 58], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}}, "totals": {"covered_lines": 532, "num_statements": 558, "percent_covered": 95.3405017921147, "percent_covered_display": "95", "missing_lines": 26, "excluded_lines": 20}} \ No newline at end of file +{"meta": {"format": 3, "version": "7.6.10", "timestamp": "2025-11-05T04:57:55.789623", "branch_coverage": false, "show_contexts": false}, "files": {"/data/dev/python/codecipher/github/codecipher/codecipher/__init__.py": {"executed_lines": [3], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [3], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [3], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/__init__.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56, 62], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31], "functions": {"A1z52N62.__init__": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"A1z52N62": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/decode.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 62, 64, 65, 77, 86, 87, 88, 89, 90, 91, 92, 94, 96, 98, 99], "summary": {"covered_lines": 30, "num_statements": 32, "percent_covered": 93.75, "percent_covered_display": "94", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": [], "functions": {"A1z52N62Decoder.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "A1z52N62Decoder.decode": {"executed_lines": [86, 87, 88, 89, 90, 91, 92, 94, 96, 98, 99], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"A1z52N62Decoder": {"executed_lines": [62, 86, 87, 88, 89, 90, 91, 92, 94, 96, 98, 99], "summary": {"covered_lines": 12, "num_statements": 14, "percent_covered": 85.71428571428571, "percent_covered_display": "86", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/encode.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 62, 64, 65, 77, 86, 87, 88, 89, 90, 91, 93, 95, 96, 98, 99], "summary": {"covered_lines": 30, "num_statements": 32, "percent_covered": 93.75, "percent_covered_display": "94", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": [], "functions": {"A1z52N62Encoder.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "A1z52N62Encoder.encode": {"executed_lines": [86, 87, 88, 89, 90, 91, 93, 95, 96, 98, 99], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"A1z52N62Encoder": {"executed_lines": [62, 86, 87, 88, 89, 90, 91, 93, 95, 96, 98, 99], "summary": {"covered_lines": 12, "num_statements": 14, "percent_covered": 85.71428571428571, "percent_covered_display": "86", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/atbs/__init__.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56, 62], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31], "functions": {"ATBS.__init__": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"ATBS": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/atbs/decode.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 58, 60, 61, 69, 71, 72, 84, 93, 94, 95, 96, 97], "summary": {"covered_lines": 27, "num_statements": 29, "percent_covered": 93.10344827586206, "percent_covered_display": "93", "missing_lines": 2, "excluded_lines": 2}, "missing_lines": [81, 82], "excluded_lines": [29, 31], "functions": {"ATBSDecode.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [81, 82], "excluded_lines": []}, "ATBSDecode.decode": {"executed_lines": [93, 94, 95, 96, 97], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 58, 60, 61, 71, 72, 84], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"ATBSDecode": {"executed_lines": [69, 93, 94, 95, 96, 97], "summary": {"covered_lines": 6, "num_statements": 8, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [81, 82], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 58, 60, 61, 71, 72, 84], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/atbs/encode.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 58, 60, 61, 69, 71, 72, 84, 93, 94, 95, 96, 97], "summary": {"covered_lines": 27, "num_statements": 29, "percent_covered": 93.10344827586206, "percent_covered_display": "93", "missing_lines": 2, "excluded_lines": 2}, "missing_lines": [81, 82], "excluded_lines": [29, 31], "functions": {"ATBSEncode.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [81, 82], "excluded_lines": []}, "ATBSEncode.encode": {"executed_lines": [93, 94, 95, 96, 97], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 58, 60, 61, 71, 72, 84], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"ATBSEncode": {"executed_lines": [69, 93, 94, 95, 96, 97], "summary": {"covered_lines": 6, "num_statements": 8, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [81, 82], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 58, 60, 61, 71, 72, 84], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/atbs/lookup_table.py": {"executed_lines": [3, 22, 24, 25, 26, 27, 28, 29, 30, 31, 33], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [3, 22, 24, 25, 26, 27, 28, 29, 30, 31, 33], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [3, 22, 24, 25, 26, 27, 28, 29, 30, 31, 33], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/b64/__init__.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56, 62], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31], "functions": {"B64.__init__": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"B64": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/b64/decode.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 63, 65, 66, 78, 87, 88], "summary": {"covered_lines": 22, "num_statements": 24, "percent_covered": 91.66666666666667, "percent_covered_display": "92", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": [], "functions": {"B64Decode.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": []}, "B64Decode.decode": {"executed_lines": [87, 88], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 65, 66, 78], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"B64Decode": {"executed_lines": [63, 87, 88], "summary": {"covered_lines": 3, "num_statements": 5, "percent_covered": 60.0, "percent_covered_display": "60", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 65, 66, 78], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/b64/encode.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 63, 65, 66, 78, 87, 88], "summary": {"covered_lines": 22, "num_statements": 24, "percent_covered": 91.66666666666667, "percent_covered_display": "92", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": [], "functions": {"B64Encode.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": []}, "B64Encode.encode": {"executed_lines": [87, 88], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 65, 66, 78], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"B64Encode": {"executed_lines": [63, 87, 88], "summary": {"covered_lines": 3, "num_statements": 5, "percent_covered": 60.0, "percent_covered_display": "60", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [75, 76], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 52, 54, 55, 65, 66, 78], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/caesar/__init__.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56, 62], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31], "functions": {"Caesar.__init__": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"Caesar": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/caesar/decode.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 62, 64, 65, 77, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110], "summary": {"covered_lines": 39, "num_statements": 41, "percent_covered": 95.1219512195122, "percent_covered_display": "95", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": [], "functions": {"CaesarDecode.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "CaesarDecode.decode": {"executed_lines": [90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110], "summary": {"covered_lines": 20, "num_statements": 20, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"CaesarDecode": {"executed_lines": [62, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110], "summary": {"covered_lines": 21, "num_statements": 23, "percent_covered": 91.30434782608695, "percent_covered_display": "91", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/caesar/encode.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 62, 64, 65, 77, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110], "summary": {"covered_lines": 39, "num_statements": 41, "percent_covered": 95.1219512195122, "percent_covered_display": "95", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": [], "functions": {"CaesarEncode.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "CaesarEncode.encode": {"executed_lines": [90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110], "summary": {"covered_lines": 20, "num_statements": 20, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"CaesarEncode": {"executed_lines": [62, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110], "summary": {"covered_lines": 21, "num_statements": 23, "percent_covered": 91.30434782608695, "percent_covered_display": "91", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vernam/__init__.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56, 62], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31], "functions": {"Vernam.__init__": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"Vernam": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 56], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vernam/decode.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 62, 64, 65, 77, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 101, 103, 104], "summary": {"covered_lines": 34, "num_statements": 36, "percent_covered": 94.44444444444444, "percent_covered_display": "94", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": [], "functions": {"VernamDecode.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "VernamDecode.decode": {"executed_lines": [88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 101, 103, 104], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"VernamDecode": {"executed_lines": [62, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 101, 103, 104], "summary": {"covered_lines": 16, "num_statements": 18, "percent_covered": 88.88888888888889, "percent_covered_display": "89", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vernam/encode.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 62, 64, 65, 77, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 101, 103, 104], "summary": {"covered_lines": 34, "num_statements": 36, "percent_covered": 94.44444444444444, "percent_covered_display": "94", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": [], "functions": {"VernamEncode.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "VernamEncode.encode": {"executed_lines": [88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 101, 103, 104], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"VernamEncode": {"executed_lines": [62, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 101, 103, 104], "summary": {"covered_lines": 16, "num_statements": 18, "percent_covered": 88.88888888888889, "percent_covered_display": "89", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [74, 75], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 51, 53, 54, 64, 65, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/__init__.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 57, 63], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [30, 32], "functions": {"Vigenere.__init__": {"executed_lines": [63], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 57], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [30, 32]}}, "classes": {"Vigenere": {"executed_lines": [63], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 57], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [30, 32]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/decode.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 59, 61, 62, 70, 72, 73, 85, 99, 100, 101, 102, 103, 105, 118, 119, 120, 121, 122, 126, 129], "summary": {"covered_lines": 35, "num_statements": 37, "percent_covered": 94.5945945945946, "percent_covered_display": "95", "missing_lines": 2, "excluded_lines": 2}, "missing_lines": [82, 83], "excluded_lines": [29, 31], "functions": {"VigenereDecode.decode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [82, 83], "excluded_lines": []}, "VigenereDecode._split_data_decode": {"executed_lines": [99, 100, 101, 102, 103], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "VigenereDecode.decode": {"executed_lines": [118, 119, 120, 121, 122, 126, 129], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 59, 61, 62, 72, 73, 85, 105], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"VigenereDecode": {"executed_lines": [70, 99, 100, 101, 102, 103, 118, 119, 120, 121, 122, 126, 129], "summary": {"covered_lines": 13, "num_statements": 15, "percent_covered": 86.66666666666667, "percent_covered_display": "87", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [82, 83], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 59, 61, 62, 72, 73, 85, 105], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/encode.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 59, 61, 62, 70, 72, 73, 85, 99, 100, 101, 102, 103, 105, 118, 119, 120, 121, 122, 126, 129], "summary": {"covered_lines": 35, "num_statements": 37, "percent_covered": 94.5945945945946, "percent_covered_display": "95", "missing_lines": 2, "excluded_lines": 2}, "missing_lines": [82, 83], "excluded_lines": [29, 31], "functions": {"VigenereEncode.encode_data": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [82, 83], "excluded_lines": []}, "VigenereEncode._split_data_encode": {"executed_lines": [99, 100, 101, 102, 103], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "VigenereEncode.encode": {"executed_lines": [118, 119, 120, 121, 122, 126, 129], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 59, 61, 62, 72, 73, 85, 105], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}, "classes": {"VigenereEncode": {"executed_lines": [70, 99, 100, 101, 102, 103, 118, 119, 120, 121, 122, 126, 129], "summary": {"covered_lines": 13, "num_statements": 15, "percent_covered": 86.66666666666667, "percent_covered_display": "87", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [82, 83], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 25, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 59, 61, 62, 72, 73, 85, 105], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 31]}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/key_generator.py": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 53, 54, 56, 57, 67, 68, 77, 78, 80, 81, 89, 91, 92, 101, 102, 104, 111, 112, 113, 114, 117, 118, 119], "summary": {"covered_lines": 35, "num_statements": 37, "percent_covered": 94.5945945945946, "percent_covered_display": "95", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [65, 115], "excluded_lines": [], "functions": {"KeyGenerator.data_len": {"executed_lines": [77, 78], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "KeyGenerator.key": {"executed_lines": [101, 102], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "KeyGenerator.generate_key": {"executed_lines": [111, 112, 113, 114, 117, 118, 119], "summary": {"covered_lines": 7, "num_statements": 8, "percent_covered": 87.5, "percent_covered_display": "88", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [115], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 53, 54, 56, 57, 67, 68, 80, 81, 91, 92, 104], "summary": {"covered_lines": 23, "num_statements": 23, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"KeyGenerator": {"executed_lines": [77, 78, 89, 101, 102, 111, 112, 113, 114, 117, 118, 119], "summary": {"covered_lines": 12, "num_statements": 14, "percent_covered": 85.71428571428571, "percent_covered_display": "86", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [65, 115], "excluded_lines": []}, "": {"executed_lines": [3, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 53, 54, 56, 57, 67, 68, 80, 81, 91, 92, 104], "summary": {"covered_lines": 23, "num_statements": 23, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/lookup_table.py": {"executed_lines": [3, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 53, 54, 55, 56, 57, 58], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [3, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 53, 54, 55, 56, 57, 58], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"LookUpTable": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [3, 23, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 53, 54, 55, 56, 57, 58], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}}, "totals": {"covered_lines": 532, "num_statements": 558, "percent_covered": 95.3405017921147, "percent_covered_display": "95", "missing_lines": 26, "excluded_lines": 20}} \ No newline at end of file diff --git a/tests/htmlcov/class_index.html b/tests/htmlcov/class_index.html index afdca3f..2a8e0cf 100644 --- a/tests/htmlcov/class_index.html +++ b/tests/htmlcov/class_index.html @@ -130,7 +130,7 @@

                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/__init__.pyAlephTawBetShinATBS 1 0 0
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/decode.pyAlephTawBetShinDecodeATBSDecode 8 2 0
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/encode.pyAlephTawBetShinEncodeATBSEncode 8 2 0
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/__init__.pyAlephTawBetShin.__init__ATBS.__init__ 1 0 0
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/decode.pyAlephTawBetShinDecode.decode_dataATBSDecode.decode_data 1 0 0
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/decode.pyAlephTawBetShinDecode.decode_dataATBSDecode.decode_data 2 2 0
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/decode.pyAlephTawBetShinDecode.decodeATBSDecode.decode 5 0 0
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/encode.pyAlephTawBetShinEncode.encode_dataATBSEncode.encode_data 1 0 0
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/encode.pyAlephTawBetShinEncode.encode_dataATBSEncode.encode_data 2 2 0
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/encode.pyAlephTawBetShinEncode.encodeATBSEncode.encode 5 0 0
                        /data/dev/python/codecipher/github/codecipher/codecipher/__init__.py (no class)9 0 0100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/__init__.py(no class)2000100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/a1z52n62.pyA1z52N621200100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/a1z52n62.py(no class)2500100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/a1z52n62_config.pyA1z52N62Config000100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/a1z52n62_config.py(no class)1800100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/decoder.pyA1z52N62Decoder191900%
                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/decoder.py(no class)2100100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/default_character_validator.pyDefaultA1Z52N62CharacterValidator43025%
                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/default_character_validator.py(no class)1400100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/default_data_validator.pyDefaultA1Z52N62DataValidator43025%
                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/default_data_validator.py(no class)1400100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/default_validation_engine.pyDefaultA1Z52N62ValidationEngine87012%
                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/default_validation_engine.py(no class)1500100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/encoder.pyA1z52N62Encoder181800%
                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/encoder.py(no class)2100100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/ia1z52n62.pyIA1z52N624400%
                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/ia1z52n62.py(no class)2100100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/idecoder.pyIA1z52N62Decoder3300%
                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/idecoder.py(no class)1900100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/iencoder.pyIA1z52N62Encoder3300%
                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/iencoder.py(no class)1900100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/abstracts/__init__.py(no class)1300100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/abstracts/icharacter_validator.pyICharacterValidator1100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/abstracts/icharacter_validator.py(no class)1300100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/abstracts/idata_validator.pyIDataValidator1100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/abstracts/idata_validator.py(no class)1300100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/abstracts/ivalidation_engine.pyIValidationEngine2200%
                        /data/dev/python/codecipher/github/codecipher/codecipher/abstracts/ivalidation_engine.py(no class)1600100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/__init__.py(no class)1900100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/atbs.pyATBS1100100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/atbs.py(no class)2400100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/decoder.pyATBSDecoder111009%
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/decoder.py(no class)1800100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/default_character_validator.pyDefaultATBSCharacterValidator43025%
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/default_character_validator.py(no class)600100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/default_data_validator.pyDefaultATBSDataValidator43025%
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/default_data_validator.py(no class)1500100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/default_validation_engine.pyDefaultATBSValidationEngine87012%
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/default_validation_engine.py(no class)1500100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/encoder.pyATBSEncoder111009%
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/encoder.py(no class)1800100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/iatbs.pyIATBS4400%
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/iatbs.py(no class)1300100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/idecoder.pyIATBSDecoder2200%
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/idecoder.py(no class)1600100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/iencoder.pyIATBSEncoder2200%
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/iencoder.py(no class)1600100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/lookup_table.py(no class)1000100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/b64/__init__.py(no class)1900100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/b64/b64.pyB641100100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/b64/b64.py(no class)2400100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/b64/b64decoder.pyB64Decoder83062%
                        /data/dev/python/codecipher/github/codecipher/codecipher/b64/b64decoder.py(no class)1800100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/b64/b64encoder.pyB64Encoder83062%
                        /data/dev/python/codecipher/github/codecipher/codecipher/b64/b64encoder.py(no class)1800100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/b64/default_character_validator.pyDefaultB64CharacterValidator41075%
                        /data/dev/python/codecipher/github/codecipher/codecipher/b64/default_character_validator.py(no class)1400100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/b64/default_data_validator.pyDefaultB64DataValidator41075%
                        /data/dev/python/codecipher/github/codecipher/codecipher/b64/default_data_validator.py(no class)1400100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/b64/default_validation_engine.pyDefaultB64ValidationEngine84050%
                        /data/dev/python/codecipher/github/codecipher/codecipher/b64/default_validation_engine.py(no class)1500100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/b64/ib64.pyIB644400%
                        /data/dev/python/codecipher/github/codecipher/codecipher/b64/ib64.py(no class)2100100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/b64/idecoder.pyIDecoder22 0100%0%
                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/__init__.pyA1z52N621/data/dev/python/codecipher/github/codecipher/codecipher/b64/idecoder.py(no class)16 0 0100%100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/__init__.py(no class)150/data/dev/python/codecipher/github/codecipher/codecipher/b64/iencoder.pyIEncoder 2100%200%
                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/decode.pyA1z52N62Decoder142/data/dev/python/codecipher/github/codecipher/codecipher/b64/iencoder.py(no class)16 086%0100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/decode.py(no class)18/data/dev/python/codecipher/github/codecipher/codecipher/caesar/__init__.py(no class)19 0 0100%100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/encode.pyA1z52N62Encoder14/data/dev/python/codecipher/github/codecipher/codecipher/caesar/caesar.pyCaesar1100100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/caesar/caesar.py(no class)2400100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/caesar/decoder.pyCaesarDecoder25 2 086%92%
                        /data/dev/python/codecipher/github/codecipher/codecipher/a1z52n62/encode.py(no class)18/data/dev/python/codecipher/github/codecipher/codecipher/caesar/decoder.py(no class)19 0 0100%100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/__init__.pyATBS1/data/dev/python/codecipher/github/codecipher/codecipher/caesar/default_character_validator.pyDefaultCaesarCharacterValidator4400%
                        /data/dev/python/codecipher/github/codecipher/codecipher/caesar/default_character_validator.py(no class)14 0 0100%100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/__init__.py(no class)/data/dev/python/codecipher/github/codecipher/codecipher/caesar/default_data_validator.pyDefaultCaesarDataValidator4400%
                        /data/dev/python/codecipher/github/codecipher/codecipher/caesar/default_data_validator.py(no class)1400100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/caesar/default_validation_engine.pyDefaultCaesarValidationEngine8800%
                        /data/dev/python/codecipher/github/codecipher/codecipher/caesar/default_validation_engine.py(no class) 15 020 100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/decode.pyATBSDecode8/data/dev/python/codecipher/github/codecipher/codecipher/caesar/encoder.pyCaesarEncoder25 2 075%92%
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/decode.py(no class)21/data/dev/python/codecipher/github/codecipher/codecipher/caesar/encoder.py(no class)19 02100%0100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/encode.pyATBSEncode82/data/dev/python/codecipher/github/codecipher/codecipher/caesar/icaesar.pyICaesar44 075%0%
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/encode.py(no class)21/data/dev/python/codecipher/github/codecipher/codecipher/caesar/icaesar.py(no class)130 0100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/caesar/idecoder.pyIDecoder 2100%200%
                        /data/dev/python/codecipher/github/codecipher/codecipher/atbs/lookup_table.py(no class)10/data/dev/python/codecipher/github/codecipher/codecipher/caesar/idecoder.py(no class)8 0 0100%100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/b64/__init__.pyB641/data/dev/python/codecipher/github/codecipher/codecipher/caesar/iencoder.pyIEncoder2200%
                        /data/dev/python/codecipher/github/codecipher/codecipher/caesar/iencoder.py(no class)8 0 0100%100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/b64/__init__.py(no class)15/data/dev/python/codecipher/github/codecipher/codecipher/caesar/lookup_table.pyLookUpTable 02100%00100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/b64/decode.pyB64Decode52/data/dev/python/codecipher/github/codecipher/codecipher/caesar/lookup_table.py(no class)110 060%100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/b64/decode.py(no class)/data/dev/python/codecipher/github/codecipher/codecipher/vernam/__init__.py(no class) 19 0 0 100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/b64/encode.pyB64Encode5/data/dev/python/codecipher/github/codecipher/codecipher/vernam/decoder.pyVernamDecoder20 2 060%90%
                        /data/dev/python/codecipher/github/codecipher/codecipher/b64/encode.py(no class)/data/dev/python/codecipher/github/codecipher/codecipher/vernam/decoder.py(no class) 19 0 0 100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/caesar/__init__.pyCaesar/data/dev/python/codecipher/github/codecipher/codecipher/vernam/default_character_validator.pyDefaultVernamCharacterValidator4 1 075%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vernam/default_character_validator.py(no class)140 0100%100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/caesar/__init__.py(no class)/data/dev/python/codecipher/github/codecipher/codecipher/vernam/default_data_validator.pyDefaultVernamDataValidator41075%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vernam/default_data_validator.py(no class)1400100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vernam/default_validation_engine.pyDefaultVernamValidationEngine84050%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vernam/default_validation_engine.py(no class) 15 020 100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/caesar/decode.pyCaesarDecode23/data/dev/python/codecipher/github/codecipher/codecipher/vernam/encoder.pyVernamEncoder20 2 091%90%
                        /data/dev/python/codecipher/github/codecipher/codecipher/caesar/decode.py(no class)18/data/dev/python/codecipher/github/codecipher/codecipher/vernam/encoder.py(no class)19 0 0100%100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/caesar/encode.pyCaesarEncode23/data/dev/python/codecipher/github/codecipher/codecipher/vernam/idecoder.pyIDecoder2 2 091%0%
                        /data/dev/python/codecipher/github/codecipher/codecipher/caesar/encode.py(no class)18/data/dev/python/codecipher/github/codecipher/codecipher/vernam/idecoder.py(no class)16 0 0100%100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vernam/__init__.pyVernam1/data/dev/python/codecipher/github/codecipher/codecipher/vernam/iencoder.pyIEncoder2200%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vernam/iencoder.py(no class)16 0 0100%100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vernam/__init__.py(no class)15/data/dev/python/codecipher/github/codecipher/codecipher/vernam/ivernam.pyIVernam44 02100%0%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vernam/decode.pyVernamDecode182/data/dev/python/codecipher/github/codecipher/codecipher/vernam/ivernam.py(no class)210 089%100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vernam/decode.py(no class)18/data/dev/python/codecipher/github/codecipher/codecipher/vernam/lookup_table.pyLookUpTable 0 0100%0100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vernam/encode.pyVernamEncode182/data/dev/python/codecipher/github/codecipher/codecipher/vernam/lookup_table.py(no class)110 089%100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vernam/encode.py(no class)18/data/dev/python/codecipher/github/codecipher/codecipher/vernam/vernam.pyVernam11 0 0100%100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vigenere/__init__.pyVigenere1/data/dev/python/codecipher/github/codecipher/codecipher/vernam/vernam.py(no class)24 0 0100%100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vigenere/__init__.py (no class)1620 02100%0100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vigenere/decode.pyVigenereDecode152/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/decoder.pyVigenereDecoder173 087%82%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vigenere/decode.py(no class)22/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/decoder.py(no class)21 02100%0100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vigenere/default_character_validator.pyDefaultVigenereCharacterValidator41075%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vigenere/default_character_validator.py(no class)1400100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vigenere/default_data_validator.pyDefaultVigenereDataValidator41075%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vigenere/default_data_validator.py(no class)1400100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vigenere/default_validation_engine.pyDefaultVigenereValidationEngine84050%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vigenere/encode.pyVigenereEncode/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/default_validation_engine.py(no class) 152 087%0100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vigenere/encoder.pyVigenereEncoder173082%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vigenere/encode.py(no class)22/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/encoder.py(no class)210 0100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vigenere/idecoder.pyIDecoder2 2100%00%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vigenere/key_generator.pyKeyGenerator14/data/dev/python/codecipher/github/codecipher/codecipher/vigenere/idecoder.py(no class)1600100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vigenere/iencoder.pyIEncoder 2200%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vigenere/iencoder.py(no class)1600100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vigenere/ikey_generator.pyIKeyGenerator33 086%0%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vigenere/ikey_generator.py(no class)1900100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vigenere/ivigenere.pyIVigenere4400%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vigenere/ivigenere.py(no class)2100100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vigenere/key_generator.pyKeyGenerator175071%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vigenere/key_generator.py (no class)2324 0 0100%100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vigenere/lookup_table.py0 100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vigenere/vigenere.pyVigenere2000100%
                        /data/dev/python/codecipher/github/codecipher/codecipher/vigenere/vigenere.py(no class)2600100%
                        Total  558262095%1656199088%
                        @@ -428,7 +1172,7 @@

                        coverage.py v7.6.10, - created at 2025-11-05 04:57 +0100 + created at 2026-06-10 16:28 +0200

- 16 statements   - + 19 statements   + - +

- « prev     + « prev     ^ index     - » next + » next       coverage.py v7.6.10, - created at 2025-11-05 04:57 +0100 + created at 2026-06-10 16:28 +0200

- 41 statements   - + 44 statements   +

- « prev     + « prev     ^ index     - » next + » next       coverage.py v7.6.10, - created at 2025-11-05 04:57 +0100 + created at 2026-06-10 16:28 +0200

- 41 statements   - + 44 statements   +

- « prev     + « prev     ^ index     - » next + » next       coverage.py v7.6.10, - created at 2025-11-05 04:57 +0100 + created at 2026-06-10 16:28 +0200

- 17 statements   - + 20 statements   + - +

- « prev     + « prev     ^ index     - » next + » next       coverage.py v7.6.10, - created at 2025-11-05 04:57 +0100 + created at 2026-06-10 16:28 +0200

- 37 statements   + 38 statements   - - + +

« prev     ^ index     - » next + » next       coverage.py v7.6.10, - created at 2025-11-05 04:57 +0100 + created at 2026-06-10 16:28 +0200

- 37 statements   + 38 statements   - - + +

- « prev     + « prev     ^ index     - » next + » next       coverage.py v7.6.10, - created at 2025-11-05 04:57 +0100 + created at 2026-06-10 16:28 +0200

- 37 statements   - - + 41 statements   + +

- « prev     + « prev     ^ index     » next       coverage.py v7.6.10, - created at 2025-11-05 04:57 +0100 + created at 2026-06-10 16:28 +0200

diff --git a/tests/htmlcov/z_75799433d8182c47_vigenere_py.html b/tests/htmlcov/z_75799433d8182c47_vigenere_py.html new file mode 100644 index 0000000..c1c4ee8 --- /dev/null +++ b/tests/htmlcov/z_75799433d8182c47_vigenere_py.html @@ -0,0 +1,242 @@ + + + + + Coverage for /data/dev/python/codecipher/github/codecipher/codecipher/vigenere/vigenere.py: 100% + + + + + +
+
+

+ Coverage for /data/dev/python/codecipher/github/codecipher/codecipher/vigenere/vigenere.py: + 100% +

+ +

+ 46 statements   + + + +

+

+ « prev     + ^ index     + » next +       + coverage.py v7.6.10, + created at 2026-06-10 16:28 +0200 +

+ +
+
+
+

1# -*- coding: UTF-8 -*- 

+

2 

+

3''' 

+

4Module 

+

5 vigenere.py 

+

6Copyright 

+

7 Copyright (C) 2021 - 2026 Vladimir Roncevic <elektron.ronca@gmail.com> 

+

8 codecipher is free software: you can redistribute it and/or modify it 

+

9 under the terms of the GNU General Public License as published by the 

+

10 Free Software Foundation, either version 3 of the License, or 

+

11 (at your option) any later version. 

+

12 codecipher is distributed in the hope that it will be useful, but 

+

13 WITHOUT ANY WARRANTY; without even the implied warranty of 

+

14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

+

15 See the GNU General Public License for more details. 

+

16 You should have received a copy of the GNU General Public License along 

+

17 with this program. If not, see <http://www.gnu.org/licenses/>. 

+

18Info 

+

19 Defines class Vigenere with attribute(s) and method(s). 

+

20 Creates container class with aggregate backend API. 

+

21''' 

+

22 

+

23from typing import List, Optional 

+

24from codecipher.abstracts import IValidationEngine 

+

25from .encoder import VigenereEncoder 

+

26from .decoder import VigenereDecoder 

+

27from .key_generator import KeyGenerator 

+

28from .ivigenere import IVigenere 

+

29from .iencoder import IEncoder 

+

30from .idecoder import IDecoder 

+

31from .ikey_generator import IKeyGenerator 

+

32from .default_validation_engine import DefaultVigenereValidationEngine 

+

33 

+

34__author__: str = 'Vladimir Roncevic' 

+

35__copyright__: str = '(C) 2026, https://electux.github.io/codecipher' 

+

36__credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] 

+

37__license__: str = 'https://github.com/electux/codecipher/blob/main/LICENSE' 

+

38__version__: str = '1.5.1' 

+

39__maintainer__: str = 'Vladimir Roncevic' 

+

40__email__: str = 'elektron.ronca@gmail.com' 

+

41__status__: str = 'Updated' 

+

42 

+

43 

+

44class Vigenere(IVigenere): 

+

45 ''' 

+

46 Defines class Vigenere with attribute(s) and method(s). 

+

47 Creates container class with aggregate backend API. 

+

48 

+

49 It defines: 

+

50 

+

51 :attributes: 

+

52 | __validation_engine - Engine for data validation. 

+

53 | __encoder - Encoder for algorithm. 

+

54 | __decoder - Decoder for algorithm. 

+

55 | __key_generator - Key generator for algorithm. 

+

56 :methods: 

+

57 | __init__ - Initializes Vigenere constructor. 

+

58 | encode - Encoding data to Vigenere format. 

+

59 | encode_data - Property method for getting encode data. 

+

60 | decode - Decoding data from Vigenere format. 

+

61 | decode_data - Property method for getting decode data. 

+

62 ''' 

+

63 

+

64 def __init__( 

+

65 self, 

+

66 validation_engine: Optional[IValidationEngine] = None, 

+

67 encoder: Optional[IEncoder] = None, 

+

68 decoder: Optional[IDecoder] = None, 

+

69 key_generator: Optional[IKeyGenerator] = None 

+

70 ) -> None: 

+

71 ''' 

+

72 Initializes Vigenere constructor. 

+

73 

+

74 :param validation_engine: Engine for data validation | None 

+

75 :type validation_engine: <Optional[IValidationEngine]> 

+

76 :param encoder: Encoder for algorithm | None 

+

77 :type encoder: <Optional[IEncoder]> 

+

78 :param decoder: Decoder for algorithm | None 

+

79 :type decoder: <Optional[IDecoder]> 

+

80 :param key_generator: Key generator for algorithm | None 

+

81 :type key_generator: <Optional[IKeyGenerator]> 

+

82 :exceptions: None 

+

83 ''' 

+

84 self.__validation_engine: IValidationEngine = validation_engine or DefaultVigenereValidationEngine() 

+

85 self.__encoder: IEncoder = encoder or VigenereEncoder() 

+

86 self.__decoder: IDecoder = decoder or VigenereDecoder() 

+

87 self.__key_generator: IKeyGenerator = key_generator or KeyGenerator() 

+

88 

+

89 def encode(self, data: Optional[str], key: Optional[str]) -> bool: 

+

90 ''' 

+

91 Encoding data to Vigenere format. 

+

92 

+

93 :param data: Data which should be encoded | None 

+

94 :type data: <Optional[str]> 

+

95 :param key: Key for encoding | None 

+

96 :type key: <Optional[str]> 

+

97 :return: True (if success) | False (if fail) 

+

98 :rtype: <bool> 

+

99 :exceptions: None 

+

100 ''' 

+

101 if not bool(data) or not bool(key): 

+

102 return False 

+

103 

+

104 if self.__validation_engine.is_valid(data) and \ 

+

105 self.__validation_engine.is_valid(key): 

+

106 self.__key_generator.key = key 

+

107 if self.__key_generator.generate_key(len(data)): 

+

108 return self.__encoder.encode(data, self.__key_generator.key) 

+

109 return False 

+

110 

+

111 @property 

+

112 def encode_data(self) -> Optional[str]: 

+

113 ''' 

+

114 Property method for getting encode data. 

+

115 ''' 

+

116 return self.__encoder.encode_data 

+

117 

+

118 def decode(self, data: Optional[str], key: Optional[str]) -> bool: 

+

119 ''' 

+

120 Decoding data from Vigenere format. 

+

121 

+

122 :param data: Data which should be decoded | None 

+

123 :type data: <Optional[str]> 

+

124 :param key: Key for decoding | None 

+

125 :type key: <Optional[str]> 

+

126 :return: True (if success) | False (if fail) 

+

127 :rtype: <bool> 

+

128 :exceptions: None 

+

129 ''' 

+

130 if not bool(data) or not bool(key): 

+

131 return False 

+

132 

+

133 if self.__validation_engine.is_valid(data) and \ 

+

134 self.__validation_engine.is_valid(key): 

+

135 self.__key_generator.key = key 

+

136 if self.__key_generator.generate_key(len(data)): 

+

137 return self.__decoder.decode(data, self.__key_generator.key) 

+

138 return False 

+

139 

+

140 @property 

+

141 def decode_data(self) -> Optional[str]: 

+

142 ''' 

+

143 Property method for getting decode data. 

+

144 ''' 

+

145 return self.__decoder.decode_data 

+
+ + + diff --git a/tests/htmlcov/z_7dc3960ecaf412e4___init___py.html b/tests/htmlcov/z_7dc3960ecaf412e4___init___py.html index 08adb4b..c232909 100644 --- a/tests/htmlcov/z_7dc3960ecaf412e4___init___py.html +++ b/tests/htmlcov/z_7dc3960ecaf412e4___init___py.html @@ -54,8 +54,8 @@

- 0 statements   - + 9 statements   +

@@ -65,7 +65,7 @@

» next       coverage.py v7.6.10, - created at 2025-11-05 04:57 +0100 + created at 2026-06-10 16:28 +0200

- 16 statements   - + 19 statements   + - +

« prev     ^ index     - » next + » next       coverage.py v7.6.10, - created at 2025-11-05 04:57 +0100 + created at 2026-06-10 16:28 +0200

- 24 statements   - - + 26 statements   + +

- « prev     + « prev     ^ index     - » next + » next       coverage.py v7.6.10, - created at 2025-11-05 04:57 +0100 + created at 2026-06-10 16:28 +0200

- 24 statements   - - + 26 statements   + +

- « prev     + « prev     ^ index     - » next + » next       coverage.py v7.6.10, - created at 2025-11-05 04:57 +0100 + created at 2026-06-10 16:28 +0200

- 16 statements   - + 20 statements   + - +

« prev     ^ index     - » next + » next       coverage.py v7.6.10, - created at 2025-11-05 04:57 +0100 + created at 2026-06-10 16:28 +0200

- 32 statements   - - + 22 statements   + +

- « prev     + « prev     ^ index     - » next + » next       coverage.py v7.6.10, - created at 2025-11-05 04:57 +0100 + created at 2026-06-10 16:28 +0200

- 32 statements   - - + 22 statements   + +

- « prev     + « prev     ^ index     - » next + » next       coverage.py v7.6.10, - created at 2025-11-05 04:57 +0100 + created at 2026-06-10 16:28 +0200

- 16 statements   - + 19 statements   + - +

- « prev     + « prev     ^ index     - » next + » next       coverage.py v7.6.10, - created at 2025-11-05 04:57 +0100 + created at 2026-06-10 16:28 +0200