diff options
author | CoprDistGit <infra@openeuler.org> | 2023-05-31 08:00:32 +0000 |
---|---|---|
committer | CoprDistGit <infra@openeuler.org> | 2023-05-31 08:00:32 +0000 |
commit | 1835002d94731bc222a5289f8a3ffc1a5d665a89 (patch) | |
tree | ffd2098ef8be65593b5b376fed9561c48aa5382a | |
parent | 4512ac2844736304210e293782ff4e27b30d7452 (diff) |
automatic import of python-believe
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | python-believe.spec | 535 | ||||
-rw-r--r-- | sources | 1 |
3 files changed, 537 insertions, 0 deletions
@@ -0,0 +1 @@ +/believe-1.0.13.tar.gz diff --git a/python-believe.spec b/python-believe.spec new file mode 100644 index 0000000..8a21f5a --- /dev/null +++ b/python-believe.spec @@ -0,0 +1,535 @@ +%global _empty_manifest_terminate_build 0 +Name: python-believe +Version: 1.0.13 +Release: 1 +Summary: A easy to use validator for json content +License: None +URL: https://pypi.org/project/believe/ +Source0: https://mirrors.nju.edu.cn/pypi/web/packages/91/17/d62d3f8f8b16c6266ee0c070ce51a90c1d732042ac560a41c239b6c08356/believe-1.0.13.tar.gz +BuildArch: noarch + +Requires: python3-flit +Requires: python3-pytest +Requires: python3-pytest-cov +Requires: python3-coverage-lcov + +%description +# Believe +## Motivation +* We often need to compare expected results in our test. It's lousy to check expected result under the following way. + +``` +import uuid + +class TestCases: + def test_user(self): + user = { + "name": "John", + "id": "30e7b1e2-4c80-44c2-8fe5-23bad73ed8f2" + } + assert set("name", "id") == set(user.keys()) + assert isinstance(user["name"], str) + assert 0 < len(user["name"]) < 64 + assert isinstance(user["id"], str) + uuid.UUID(user["id"]) +``` + +* By using this package, we could compare the value using the following way. It's easier to read and maintain. + +``` +import believe as B + +class TestCases: + def test_user(self): + user = { + "name": "John", + "id": "30e7b1e2-4c80-44c2-8fe5-23bad73ed8f2" + } + assert user == {"name": B.AnyStr(min_len=1, max_len=63), + "id": B.AnyUUID()} + +``` + +* If you are looking for web framework input validation, I suggest use [FastAPI](https://fastapi.tiangolo.com/). It properly integrate with openapi as well. + +## Installation +``` +pip install believe +``` + +## Basic usage +``` +import believe as B +import time + +# Match any string +assert B.AnyStr() == "any_str" + +# Match string length >= 1 and <= 10 +assert B.AnyStr(min_len=1, max_len=10) == "a" + +# Match any string that can be converted to int +assert B.AnyIntStr() == "123" + +# Match any UUID format string +assert B.AnyUUID() == "732c0743-2638-47d5-902d-0daa3080348b" + +# Match any sha1 string +assert B.AnySHA1() == "b130c4b97d0640eaf3f45f7360a5b4dbbf561f58" + +# Match any IPv4 string +assert B.AnyIPV4() == "1.2.3.4" + +# Match integer that is >=1 and <= 10 +assert B.AnyInt(min_value=1, max_value=10) == 5 + +# Match any float that is >= 1.0 and <= 10.0 +assert B.AnyFloat(min_value=1.0, max_value=10.0) == 5.0 # 1.0 <= X <= 10.0 + +# Match if values is "one" or "two" +assert B.OneOf("one", "two") == "one" + +# Sometimes we don't care about the order, we can use AnyOrder +assert B.AnyOrder([1, 2, 3]) == [2, 1, 3] + +# Sometimes we assign value as timestamp but test cases takes more than 1 sec +# We can use almost to accept a range of values +assert B.Almost(time.time(), ts_range=3) == time.time() # Allow 3 sec gap + +# If we allow None or any string +assert B.Nullable(B.AnyStr()) == None +assert B.Nullable(B.AnyStr()) == "123" + +# Only check type +assert B.Any(bytes) == b'123' + +# Reverse check result, anything but "A" or "B" +assert B.Not(B.OneOf("A", "B")) == "C" + +# Match list +assert B.ListOf(B.AnyStr()) == ["A", "B", "C"] +assert B.ListOf(B.AnyStr(), n_item=3) == ["A", "B", "C"] # exact 3 items +assert B.ListOf(B.AnyStr(), min_item=1) == ["A", "B", "C"] # >= 1 items +assert B.ListOf(B.AnyStr(), max_item=5) == ["A", "B", "C"] # <= 5 items +``` + +## Advance Usage +``` +# If we don't want to use json.load('{"foo": "bar"}') == {"foo": "bar"}, we can use the following way +assert B.AnyJsonStr({"foo": "bar"}) == '{"foo": "bar"}' + +# We can use AnyUrl to compare the normalized url +# 1. We can compare one with default port and one without, they are identical +assert B.AnyUrl("https://foo.com/") == "https://foo.com:443/" +assert B.AnyUrl("http://foo.com/") == "http://foo.com:80/" +# 2. We can ignore the order in query string +assert B.AnyUrl("https://foo.com/bar?p1=1&p2=2") == "https://foo.com/bar?p2=2&p1=1" + +# We can use Dict to compare a dict with Optional field +assert B.Dict({"name": B.AnyStr(), "value": B.Optional(B.AnyStr())}) == {"name": "abc"} +assert B.Dict({"name": B.AnyStr(), "value": B.Optional(B.AnyStr())}) == {"name": "abc", "value": "def"} + +# If key is a dynamic value, we can use DictOf(<key_matcher>, <value_matcher>) +# i.e. We want to match a dict with random uuid as key +assert B.DictOf(B.AnyUUID(), B.OneOf("ok", "fail")) == {"732c0743-2638-47d5-902d-0daa3080348b": "ok", + "5cfd50ba-c3d3-4fb7-b2fe-e9a6e039ad29": "fail"} +``` + +## Use Validate Function +``` +# validate with error exception +import believe as B +validator = B.Dict({"name": B.AnyInt()}) + +B.validate(validator, {"name": "ken"}) # believe.error.ValidateError: [e_path=$.name] 'ken' != AnyInt() +``` + +## A Complex Example +``` +import believe as B +import time + +result_json = {"name": "john", + "age": 32, + "download_link": "https://download.server.com/?name=john&id=abc", + "role": "admin", + "address": "10.1.2.3", + "updated_at": int(time.time()), + "tags": ["admin", "john"]} + +exp_result = B.Dict({"name": B.AnyStr(min_len=1, max_len=64), + "age": B.AnyInt(min_value=0, max_value=200), + "download_link": B.AnyUrl("https://download.server.com/?id=abc&name=john"), + "role": B.OneOf("admin", "user"), + "address": B.AnyIPV4(), + "updated_at": B.Almost(int(time.time())), + "tags": B.ListOf(B.AnyStr()), + "extra": B.Optional(B.Nullable(B.AnyStr()))}) +B.validate(exp_result, result_json) +``` + + +%package -n python3-believe +Summary: A easy to use validator for json content +Provides: python-believe +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: python3-pip +%description -n python3-believe +# Believe +## Motivation +* We often need to compare expected results in our test. It's lousy to check expected result under the following way. + +``` +import uuid + +class TestCases: + def test_user(self): + user = { + "name": "John", + "id": "30e7b1e2-4c80-44c2-8fe5-23bad73ed8f2" + } + assert set("name", "id") == set(user.keys()) + assert isinstance(user["name"], str) + assert 0 < len(user["name"]) < 64 + assert isinstance(user["id"], str) + uuid.UUID(user["id"]) +``` + +* By using this package, we could compare the value using the following way. It's easier to read and maintain. + +``` +import believe as B + +class TestCases: + def test_user(self): + user = { + "name": "John", + "id": "30e7b1e2-4c80-44c2-8fe5-23bad73ed8f2" + } + assert user == {"name": B.AnyStr(min_len=1, max_len=63), + "id": B.AnyUUID()} + +``` + +* If you are looking for web framework input validation, I suggest use [FastAPI](https://fastapi.tiangolo.com/). It properly integrate with openapi as well. + +## Installation +``` +pip install believe +``` + +## Basic usage +``` +import believe as B +import time + +# Match any string +assert B.AnyStr() == "any_str" + +# Match string length >= 1 and <= 10 +assert B.AnyStr(min_len=1, max_len=10) == "a" + +# Match any string that can be converted to int +assert B.AnyIntStr() == "123" + +# Match any UUID format string +assert B.AnyUUID() == "732c0743-2638-47d5-902d-0daa3080348b" + +# Match any sha1 string +assert B.AnySHA1() == "b130c4b97d0640eaf3f45f7360a5b4dbbf561f58" + +# Match any IPv4 string +assert B.AnyIPV4() == "1.2.3.4" + +# Match integer that is >=1 and <= 10 +assert B.AnyInt(min_value=1, max_value=10) == 5 + +# Match any float that is >= 1.0 and <= 10.0 +assert B.AnyFloat(min_value=1.0, max_value=10.0) == 5.0 # 1.0 <= X <= 10.0 + +# Match if values is "one" or "two" +assert B.OneOf("one", "two") == "one" + +# Sometimes we don't care about the order, we can use AnyOrder +assert B.AnyOrder([1, 2, 3]) == [2, 1, 3] + +# Sometimes we assign value as timestamp but test cases takes more than 1 sec +# We can use almost to accept a range of values +assert B.Almost(time.time(), ts_range=3) == time.time() # Allow 3 sec gap + +# If we allow None or any string +assert B.Nullable(B.AnyStr()) == None +assert B.Nullable(B.AnyStr()) == "123" + +# Only check type +assert B.Any(bytes) == b'123' + +# Reverse check result, anything but "A" or "B" +assert B.Not(B.OneOf("A", "B")) == "C" + +# Match list +assert B.ListOf(B.AnyStr()) == ["A", "B", "C"] +assert B.ListOf(B.AnyStr(), n_item=3) == ["A", "B", "C"] # exact 3 items +assert B.ListOf(B.AnyStr(), min_item=1) == ["A", "B", "C"] # >= 1 items +assert B.ListOf(B.AnyStr(), max_item=5) == ["A", "B", "C"] # <= 5 items +``` + +## Advance Usage +``` +# If we don't want to use json.load('{"foo": "bar"}') == {"foo": "bar"}, we can use the following way +assert B.AnyJsonStr({"foo": "bar"}) == '{"foo": "bar"}' + +# We can use AnyUrl to compare the normalized url +# 1. We can compare one with default port and one without, they are identical +assert B.AnyUrl("https://foo.com/") == "https://foo.com:443/" +assert B.AnyUrl("http://foo.com/") == "http://foo.com:80/" +# 2. We can ignore the order in query string +assert B.AnyUrl("https://foo.com/bar?p1=1&p2=2") == "https://foo.com/bar?p2=2&p1=1" + +# We can use Dict to compare a dict with Optional field +assert B.Dict({"name": B.AnyStr(), "value": B.Optional(B.AnyStr())}) == {"name": "abc"} +assert B.Dict({"name": B.AnyStr(), "value": B.Optional(B.AnyStr())}) == {"name": "abc", "value": "def"} + +# If key is a dynamic value, we can use DictOf(<key_matcher>, <value_matcher>) +# i.e. We want to match a dict with random uuid as key +assert B.DictOf(B.AnyUUID(), B.OneOf("ok", "fail")) == {"732c0743-2638-47d5-902d-0daa3080348b": "ok", + "5cfd50ba-c3d3-4fb7-b2fe-e9a6e039ad29": "fail"} +``` + +## Use Validate Function +``` +# validate with error exception +import believe as B +validator = B.Dict({"name": B.AnyInt()}) + +B.validate(validator, {"name": "ken"}) # believe.error.ValidateError: [e_path=$.name] 'ken' != AnyInt() +``` + +## A Complex Example +``` +import believe as B +import time + +result_json = {"name": "john", + "age": 32, + "download_link": "https://download.server.com/?name=john&id=abc", + "role": "admin", + "address": "10.1.2.3", + "updated_at": int(time.time()), + "tags": ["admin", "john"]} + +exp_result = B.Dict({"name": B.AnyStr(min_len=1, max_len=64), + "age": B.AnyInt(min_value=0, max_value=200), + "download_link": B.AnyUrl("https://download.server.com/?id=abc&name=john"), + "role": B.OneOf("admin", "user"), + "address": B.AnyIPV4(), + "updated_at": B.Almost(int(time.time())), + "tags": B.ListOf(B.AnyStr()), + "extra": B.Optional(B.Nullable(B.AnyStr()))}) +B.validate(exp_result, result_json) +``` + + +%package help +Summary: Development documents and examples for believe +Provides: python3-believe-doc +%description help +# Believe +## Motivation +* We often need to compare expected results in our test. It's lousy to check expected result under the following way. + +``` +import uuid + +class TestCases: + def test_user(self): + user = { + "name": "John", + "id": "30e7b1e2-4c80-44c2-8fe5-23bad73ed8f2" + } + assert set("name", "id") == set(user.keys()) + assert isinstance(user["name"], str) + assert 0 < len(user["name"]) < 64 + assert isinstance(user["id"], str) + uuid.UUID(user["id"]) +``` + +* By using this package, we could compare the value using the following way. It's easier to read and maintain. + +``` +import believe as B + +class TestCases: + def test_user(self): + user = { + "name": "John", + "id": "30e7b1e2-4c80-44c2-8fe5-23bad73ed8f2" + } + assert user == {"name": B.AnyStr(min_len=1, max_len=63), + "id": B.AnyUUID()} + +``` + +* If you are looking for web framework input validation, I suggest use [FastAPI](https://fastapi.tiangolo.com/). It properly integrate with openapi as well. + +## Installation +``` +pip install believe +``` + +## Basic usage +``` +import believe as B +import time + +# Match any string +assert B.AnyStr() == "any_str" + +# Match string length >= 1 and <= 10 +assert B.AnyStr(min_len=1, max_len=10) == "a" + +# Match any string that can be converted to int +assert B.AnyIntStr() == "123" + +# Match any UUID format string +assert B.AnyUUID() == "732c0743-2638-47d5-902d-0daa3080348b" + +# Match any sha1 string +assert B.AnySHA1() == "b130c4b97d0640eaf3f45f7360a5b4dbbf561f58" + +# Match any IPv4 string +assert B.AnyIPV4() == "1.2.3.4" + +# Match integer that is >=1 and <= 10 +assert B.AnyInt(min_value=1, max_value=10) == 5 + +# Match any float that is >= 1.0 and <= 10.0 +assert B.AnyFloat(min_value=1.0, max_value=10.0) == 5.0 # 1.0 <= X <= 10.0 + +# Match if values is "one" or "two" +assert B.OneOf("one", "two") == "one" + +# Sometimes we don't care about the order, we can use AnyOrder +assert B.AnyOrder([1, 2, 3]) == [2, 1, 3] + +# Sometimes we assign value as timestamp but test cases takes more than 1 sec +# We can use almost to accept a range of values +assert B.Almost(time.time(), ts_range=3) == time.time() # Allow 3 sec gap + +# If we allow None or any string +assert B.Nullable(B.AnyStr()) == None +assert B.Nullable(B.AnyStr()) == "123" + +# Only check type +assert B.Any(bytes) == b'123' + +# Reverse check result, anything but "A" or "B" +assert B.Not(B.OneOf("A", "B")) == "C" + +# Match list +assert B.ListOf(B.AnyStr()) == ["A", "B", "C"] +assert B.ListOf(B.AnyStr(), n_item=3) == ["A", "B", "C"] # exact 3 items +assert B.ListOf(B.AnyStr(), min_item=1) == ["A", "B", "C"] # >= 1 items +assert B.ListOf(B.AnyStr(), max_item=5) == ["A", "B", "C"] # <= 5 items +``` + +## Advance Usage +``` +# If we don't want to use json.load('{"foo": "bar"}') == {"foo": "bar"}, we can use the following way +assert B.AnyJsonStr({"foo": "bar"}) == '{"foo": "bar"}' + +# We can use AnyUrl to compare the normalized url +# 1. We can compare one with default port and one without, they are identical +assert B.AnyUrl("https://foo.com/") == "https://foo.com:443/" +assert B.AnyUrl("http://foo.com/") == "http://foo.com:80/" +# 2. We can ignore the order in query string +assert B.AnyUrl("https://foo.com/bar?p1=1&p2=2") == "https://foo.com/bar?p2=2&p1=1" + +# We can use Dict to compare a dict with Optional field +assert B.Dict({"name": B.AnyStr(), "value": B.Optional(B.AnyStr())}) == {"name": "abc"} +assert B.Dict({"name": B.AnyStr(), "value": B.Optional(B.AnyStr())}) == {"name": "abc", "value": "def"} + +# If key is a dynamic value, we can use DictOf(<key_matcher>, <value_matcher>) +# i.e. We want to match a dict with random uuid as key +assert B.DictOf(B.AnyUUID(), B.OneOf("ok", "fail")) == {"732c0743-2638-47d5-902d-0daa3080348b": "ok", + "5cfd50ba-c3d3-4fb7-b2fe-e9a6e039ad29": "fail"} +``` + +## Use Validate Function +``` +# validate with error exception +import believe as B +validator = B.Dict({"name": B.AnyInt()}) + +B.validate(validator, {"name": "ken"}) # believe.error.ValidateError: [e_path=$.name] 'ken' != AnyInt() +``` + +## A Complex Example +``` +import believe as B +import time + +result_json = {"name": "john", + "age": 32, + "download_link": "https://download.server.com/?name=john&id=abc", + "role": "admin", + "address": "10.1.2.3", + "updated_at": int(time.time()), + "tags": ["admin", "john"]} + +exp_result = B.Dict({"name": B.AnyStr(min_len=1, max_len=64), + "age": B.AnyInt(min_value=0, max_value=200), + "download_link": B.AnyUrl("https://download.server.com/?id=abc&name=john"), + "role": B.OneOf("admin", "user"), + "address": B.AnyIPV4(), + "updated_at": B.Almost(int(time.time())), + "tags": B.ListOf(B.AnyStr()), + "extra": B.Optional(B.Nullable(B.AnyStr()))}) +B.validate(exp_result, result_json) +``` + + +%prep +%autosetup -n believe-1.0.13 + +%build +%py3_build + +%install +%py3_install +install -d -m755 %{buildroot}/%{_pkgdocdir} +if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi +if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi +if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi +if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi +pushd %{buildroot} +if [ -d usr/lib ]; then + find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/lib64 ]; then + find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/bin ]; then + find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/sbin ]; then + find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst +fi +touch doclist.lst +if [ -d usr/share/man ]; then + find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst +fi +popd +mv %{buildroot}/filelist.lst . +mv %{buildroot}/doclist.lst . + +%files -n python3-believe -f filelist.lst +%dir %{python3_sitelib}/* + +%files help -f doclist.lst +%{_docdir}/* + +%changelog +* Wed May 31 2023 Python_Bot <Python_Bot@openeuler.org> - 1.0.13-1 +- Package Spec generated @@ -0,0 +1 @@ +3b40604be41e5a4a0d64693c573e335b believe-1.0.13.tar.gz |