From 4372488aa37253316af8b7f0b32791c3f80df13c Mon Sep 17 00:00:00 2001 From: RemiZOffAlex Date: Sun, 20 Feb 2022 22:47:39 +0300 Subject: [PATCH] =?UTF-8?q?=D0=92=D0=B0=D0=BB=D0=B8=D0=B4=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 +++ docs/Makefile | 20 +++++++++++ docs/make.bat | 35 ++++++++++++++++++++ docs/source/conf.py | 62 +++++++++++++++++++++++++++++++++++ setup.cfg | 3 ++ setup.py | 13 ++++++++ validator/__init__.py | 2 ++ validator/core.py | 31 ++++++++++++++++++ validator/presets/__init__.py | 2 ++ validator/presets/common.py | 41 +++++++++++++++++++++++ 10 files changed, 213 insertions(+) create mode 100644 .gitignore create mode 100644 docs/Makefile create mode 100644 docs/make.bat create mode 100644 docs/source/conf.py create mode 100644 setup.cfg create mode 100755 setup.py create mode 100644 validator/__init__.py create mode 100644 validator/core.py create mode 100644 validator/presets/__init__.py create mode 100644 validator/presets/common.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bb3372c --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +__pycache__ +*.pyc + +build diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..d0c3cbf --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..6fcf05b --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 0000000..904ce98 --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,62 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) + + +# -- Project information ----------------------------------------------------- + +project = 'Validator' +copyright = '2022, RemiZOffAlex' +author = 'RemiZOffAlex' + +# The full version, including alpha/beta/rc tags +release = '0.1.0' + + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = 'ru' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [] + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'alabaster' + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] \ No newline at end of file diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..67d8044 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,3 @@ +[metadata] +name = validator +version = 0.1.0 diff --git a/setup.py b/setup.py new file mode 100755 index 0000000..625b4e3 --- /dev/null +++ b/setup.py @@ -0,0 +1,13 @@ +#!/usr/bin/env python3 + +from setuptools import setup, find_packages + + +setup( + name='validator', + version='0.1.0', + author='RemiZOffAlex', + author_email='remizoffalex@gmail.com', + packages=find_packages(exclude=['prototypes', 'tests']), + keywords=['data validation', 'validator', 'validation'] +) diff --git a/validator/__init__.py b/validator/__init__.py new file mode 100644 index 0000000..18c55bb --- /dev/null +++ b/validator/__init__.py @@ -0,0 +1,2 @@ +__author__ = 'RemiZOffAlex' +__email__ = 'remizoffalex@mail.ru' diff --git a/validator/core.py b/validator/core.py new file mode 100644 index 0000000..cd8a948 --- /dev/null +++ b/validator/core.py @@ -0,0 +1,31 @@ +__author__ = 'RemiZOffAlex' +__email__ = 'remizoffalex@mail.ru' + +import logging + + +log = logging.getLogger(__name__) + + +class Validator(): + def __init__(self, rules: list = []): + self.rules = rules + log.info('rules: {}'.format(rules)) + + def __call__(self, value): + result = True + for rule in self.rules: + log.info('rule: {}'.format(rule)) + result = rule(value) + if result.status is False: + return result + return Result(True) + + +class Result(): + def __init__(self, status: bool = True, message: str = ''): + self.status = status + self.message = message + + def __repr__(self): + return "Result validation is {}".format(self.status) diff --git a/validator/presets/__init__.py b/validator/presets/__init__.py new file mode 100644 index 0000000..18c55bb --- /dev/null +++ b/validator/presets/__init__.py @@ -0,0 +1,2 @@ +__author__ = 'RemiZOffAlex' +__email__ = 'remizoffalex@mail.ru' diff --git a/validator/presets/common.py b/validator/presets/common.py new file mode 100644 index 0000000..85d320c --- /dev/null +++ b/validator/presets/common.py @@ -0,0 +1,41 @@ +__author__ = 'RemiZOffAlex' +__email__ = 'remizoffalex@mail.ru' + +import logging + +from ..core import Result + +log = logging.getLogger(__name__) + + +class EqualTo: + def __init__(self, value, message: str = ''): + self.value = value + self.message = message + + def __call__(self, value): + if self.value != value: + return Result(False, self.message) + return Result(True) + + +class MaxLength(): + def __init__(self, value, message: str = ''): + self.limit = value + self.message = message + + def __call__(self, value): + if len(value) > self.limit: + return Result(False, self.message) + return Result(True) + + +class MinLength(): + def __init__(self, value, message: str = ''): + self.limit = value + self.message = message + + def __call__(self, value): + if len(value) < self.limit: + return Result(False, self.message) + return Result(True)