summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2023-05-05 09:41:44 +0000
committerCoprDistGit <infra@openeuler.org>2023-05-05 09:41:44 +0000
commitbcfdd3fd573a1d1a0d3c1fdfe98b70312a33fb42 (patch)
treeed4ca65bc514c85b1e8488f27389dd97f8992b7a
parent296bca3b35d042e31c744272f28fc19601515f67 (diff)
automatic import of python-pytest-assert-utilsopeneuler20.03
-rw-r--r--.gitignore1
-rw-r--r--python-pytest-assert-utils.spec966
-rw-r--r--sources1
3 files changed, 968 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index e69de29..8d57ff4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -0,0 +1 @@
+/pytest-assert-utils-0.3.1.tar.gz
diff --git a/python-pytest-assert-utils.spec b/python-pytest-assert-utils.spec
new file mode 100644
index 0000000..5a1031d
--- /dev/null
+++ b/python-pytest-assert-utils.spec
@@ -0,0 +1,966 @@
+%global _empty_manifest_terminate_build 0
+Name: python-pytest-assert-utils
+Version: 0.3.1
+Release: 1
+Summary: Useful assertion utilities for use with pytest
+License: MIT
+URL: https://github.com/theY4Kman/pytest-assert-utils
+Source0: https://mirrors.nju.edu.cn/pypi/web/packages/ea/56/acfda53ad71027f7c657fe317423b734d5ee08813891d2d57c9223053cc0/pytest-assert-utils-0.3.1.tar.gz
+BuildArch: noarch
+
+
+%description
+# pytest-assert-utils
+
+Handy assertion utilities for use with pytest
+
+
+# Installation
+
+```bash
+pip install pytest-assert-utils
+```
+
+
+# Usage
+
+## assert_dict_is_subset
+```python
+def assert_dict_is_subset(subset, superset, recursive=True)
+```
+
+Assert `subset` is a non-strict subset of `superset`
+
+If this assertion fails, a pretty diff will be printed by pytest.
+
+```pycon
+>>> from pytest_assert_utils import assert_dict_is_subset
+
+>>> expected = {'a': 12}
+>>> actual = {'b': 20, 'a': 12}
+>>> assert_dict_is_subset(expected, actual)
+
+>>> expected = {'a': 12}
+>>> actual = {'b': 50000}
+>>> assert_dict_is_subset(expected, actual)
+Traceback (most recent call last):
+ ...
+AssertionError
+```
+
+## assert_model_attrs
+```python
+def assert_model_attrs(instance, _d=UNSET, **attrs)
+```
+
+Assert a model instance has the specified attr values
+
+May be passed a dict of attrs, or kwargs as attrs
+
+```pycon
+>>> from pytest_assert_utils import assert_model_attrs
+
+>>> from collections import namedtuple
+>>> Model = namedtuple('Model', 'id,key,other_key,parent', defaults=(None,)*4)
+
+>>> assert_model_attrs(Model(), {})
+
+>>> assert_model_attrs(Model(key='value'), {'key': 'value'})
+>>> assert_model_attrs(Model(key='value'), key='value')
+>>> assert_model_attrs(Model(key='value'), key='not the value')
+Traceback (most recent call last):
+ ...
+AssertionError
+
+>>> assert_model_attrs(Model(key='value', other_key='other_value'), key='value')
+```
+
+## Any
+Meta-value which compares True to any object (of the specified type(s))
+
+```pycon
+>>> from pytest_assert_utils import util
+
+>>> util.Any() == 'stuff'
+True
+>>> util.Any() == 1
+True
+>>> util.Any() == None
+True
+>>> util.Any() == object()
+True
+
+>>> util.Any(int) == 1
+True
+>>> util.Any(int) == '1'
+False
+```
+
+## Optional
+Meta-value which compares True to None or the optionally specified value
+
+```pycon
+>>> from pytest_assert_utils import util
+
+>>> util.Optional() == None
+True
+>>> util.Optional() is None # this will not work!
+False
+>>> util.Optional(24) == 24
+True
+>>> util.Optional(24) == None
+True
+
+>>> util.Optional(Any(int)) == 1
+True
+>>> util.Optional(Any(int)) == None
+True
+>>> util.Optional(Any(int)) == '1'
+False
+```
+
+## Collection
+Special class enabling equality comparisons to check items in any collection (list, set, tuple, etc)
+
+```pycon
+>>> from pytest_assert_utils import util
+
+>>> util.Collection.containing(1) == [1, 2, 3]
+True
+>>> util.Collection.containing(1) == {1, 2, 3}
+True
+>>> util.Collection.containing(1) == (1, 2, 3)
+True
+
+>>> util.Collection.containing(1) == [4, 5, 6]
+False
+>>> util.Collection.containing(1) == {4, 5, 6}
+False
+>>> util.Collection.containing(1) == (4, 5, 6)
+False
+```
+
+## List
+Special class enabling equality comparisons to check items in a list
+
+```pycon
+>>> from pytest_assert_utils import util
+
+>>> util.List.containing(1) == [1, 2, 3]
+True
+>>> util.List.containing(1) == [4, 5, 6]
+False
+
+>>> util.List.containing_only(1, 2) == [1, 2, 3]
+False
+>>> util.List.containing_only(1, 2) == [1, 2, 2]
+True
+>>> util.List.containing_only(4, 5, 6) == [4, 5, 6]
+True
+>>> util.List.containing_only(4, 5, 6, 7) == [4, 5, 6]
+True
+
+>>> util.List.containing_exactly(1, 2) == [1, 2, 3]
+False
+>>> util.List.containing_exactly(4, 5, 6, 7) == [4, 5, 6]
+False
+>>> util.List.containing_exactly(5, 6, 4) == [4, 5, 6]
+True
+>>> util.List.containing_exactly(4, 5) == [4, 5, 5]
+False
+>>> util.List.containing_exactly(5, 4, 5) == [4, 5, 5]
+True
+
+>>> util.List.not_containing(1) == [1, 2, 3]
+False
+>>> util.List.not_containing(1) == [4, 5, 6]
+True
+
+>>> util.List.empty() == [1, 2, 3]
+False
+>>> util.List.empty() == []
+True
+
+>>> util.List.not_empty() == [1, 2, 3]
+True
+>>> util.List.not_empty() == []
+False
+```
+
+## Set
+Special class enabling equality comparisons to check items in a set
+
+```pycon
+>>> from pytest_assert_utils import util
+
+>>> util.Set.containing(1) == {1, 2, 3}
+True
+>>> util.Set.containing(1) == {4, 5, 6}
+False
+
+>>> util.Set.not_containing(1) == {1, 2, 3}
+False
+>>> util.Set.not_containing(1) == {4, 5, 6}
+True
+
+>>> util.Set.empty() == {1, 2, 3}
+False
+>>> util.Set.empty() == set()
+True
+
+>>> util.Set.not_empty() == {1, 2, 3}
+True
+>>> util.Set.not_empty() == set()
+False
+```
+
+## Dict
+Special class enabling equality comparisons to check items in a dict
+
+```pycon
+>>> from pytest_assert_utils import util
+
+>>> util.Dict.containing('a') == {'a': 1, 'b': 2}
+True
+>>> util.Dict.containing(a=1) == {'a': 1, 'b': 2}
+True
+>>> util.Dict.containing({'a': 1}) == {'a': 1, 'b': 2}
+True
+>>> util.Dict.containing('a') == {'b': 2}
+False
+>>> util.Dict.containing(a=1) == {'b': 2}
+False
+>>> util.Dict.containing({'a': 1}) == {'b': 2}
+False
+
+>>> util.Dict.not_containing('a') == {'a': 1, 'b': 2}
+False
+>>> util.Dict.not_containing(a=1) == {'a': 1, 'b': 2}
+False
+>>> util.Dict.not_containing({'a': 1}) == {'a': 1, 'b': 2}
+False
+>>> util.Dict.not_containing('a') == {'b': 2}
+True
+>>> util.Dict.not_containing(a=1) == {'b': 2}
+True
+>>> util.Dict.not_containing({'a': 1}) == {'b': 2}
+True
+
+>>> util.Dict.empty() == {'a': 1, 'b': 2, 'c': 3}
+False
+>>> util.Dict.empty() == {}
+True
+
+>>> util.Dict.not_empty() == {'a': 1, 'b': 2, 'c': 3}
+True
+>>> util.Dict.not_empty() == {}
+False
+```
+
+## Str
+Special class enabling equality comparisons to check items in a string
+
+```pycon
+>>> from pytest_assert_utils import util
+
+>>> util.Str.containing('app') == 'apple'
+True
+>>> util.Str.containing('app') == 'happy'
+True
+>>> util.Str.containing('app') == 'banana'
+False
+
+>>> util.Str.not_containing('app') == 'apple'
+False
+>>> util.Str.not_containing('app') == 'happy'
+False
+>>> util.Str.not_containing('app') == 'banana'
+True
+
+>>> util.Str.empty() == 'hamster'
+False
+>>> util.Str.empty() == ''
+True
+
+>>> util.Str.not_empty() == 'hamster'
+True
+>>> util.Str.not_empty() == ''
+False
+```
+
+## Model
+Special class enabling equality comparisons to check attrs of another object
+
+
+```pycon
+>>> from collections import namedtuple
+>>> Foo = namedtuple('Foo', 'id,key,other_key,parent', defaults=(None,)*4)
+
+>>> Foo() == Model()
+True
+
+>>> Foo(key='value') == Model(key='value')
+True
+>>> Foo(key='value') == Model(key='not the value')
+False
+>>> Foo(key='value', other_key='other_value') == Model(key='value')
+True
+>>> [Foo(key='value', other_key='other_value')] == List.containing(Model(key='value'))
+True
+```
+
+
+%package -n python3-pytest-assert-utils
+Summary: Useful assertion utilities for use with pytest
+Provides: python-pytest-assert-utils
+BuildRequires: python3-devel
+BuildRequires: python3-setuptools
+BuildRequires: python3-pip
+%description -n python3-pytest-assert-utils
+# pytest-assert-utils
+
+Handy assertion utilities for use with pytest
+
+
+# Installation
+
+```bash
+pip install pytest-assert-utils
+```
+
+
+# Usage
+
+## assert_dict_is_subset
+```python
+def assert_dict_is_subset(subset, superset, recursive=True)
+```
+
+Assert `subset` is a non-strict subset of `superset`
+
+If this assertion fails, a pretty diff will be printed by pytest.
+
+```pycon
+>>> from pytest_assert_utils import assert_dict_is_subset
+
+>>> expected = {'a': 12}
+>>> actual = {'b': 20, 'a': 12}
+>>> assert_dict_is_subset(expected, actual)
+
+>>> expected = {'a': 12}
+>>> actual = {'b': 50000}
+>>> assert_dict_is_subset(expected, actual)
+Traceback (most recent call last):
+ ...
+AssertionError
+```
+
+## assert_model_attrs
+```python
+def assert_model_attrs(instance, _d=UNSET, **attrs)
+```
+
+Assert a model instance has the specified attr values
+
+May be passed a dict of attrs, or kwargs as attrs
+
+```pycon
+>>> from pytest_assert_utils import assert_model_attrs
+
+>>> from collections import namedtuple
+>>> Model = namedtuple('Model', 'id,key,other_key,parent', defaults=(None,)*4)
+
+>>> assert_model_attrs(Model(), {})
+
+>>> assert_model_attrs(Model(key='value'), {'key': 'value'})
+>>> assert_model_attrs(Model(key='value'), key='value')
+>>> assert_model_attrs(Model(key='value'), key='not the value')
+Traceback (most recent call last):
+ ...
+AssertionError
+
+>>> assert_model_attrs(Model(key='value', other_key='other_value'), key='value')
+```
+
+## Any
+Meta-value which compares True to any object (of the specified type(s))
+
+```pycon
+>>> from pytest_assert_utils import util
+
+>>> util.Any() == 'stuff'
+True
+>>> util.Any() == 1
+True
+>>> util.Any() == None
+True
+>>> util.Any() == object()
+True
+
+>>> util.Any(int) == 1
+True
+>>> util.Any(int) == '1'
+False
+```
+
+## Optional
+Meta-value which compares True to None or the optionally specified value
+
+```pycon
+>>> from pytest_assert_utils import util
+
+>>> util.Optional() == None
+True
+>>> util.Optional() is None # this will not work!
+False
+>>> util.Optional(24) == 24
+True
+>>> util.Optional(24) == None
+True
+
+>>> util.Optional(Any(int)) == 1
+True
+>>> util.Optional(Any(int)) == None
+True
+>>> util.Optional(Any(int)) == '1'
+False
+```
+
+## Collection
+Special class enabling equality comparisons to check items in any collection (list, set, tuple, etc)
+
+```pycon
+>>> from pytest_assert_utils import util
+
+>>> util.Collection.containing(1) == [1, 2, 3]
+True
+>>> util.Collection.containing(1) == {1, 2, 3}
+True
+>>> util.Collection.containing(1) == (1, 2, 3)
+True
+
+>>> util.Collection.containing(1) == [4, 5, 6]
+False
+>>> util.Collection.containing(1) == {4, 5, 6}
+False
+>>> util.Collection.containing(1) == (4, 5, 6)
+False
+```
+
+## List
+Special class enabling equality comparisons to check items in a list
+
+```pycon
+>>> from pytest_assert_utils import util
+
+>>> util.List.containing(1) == [1, 2, 3]
+True
+>>> util.List.containing(1) == [4, 5, 6]
+False
+
+>>> util.List.containing_only(1, 2) == [1, 2, 3]
+False
+>>> util.List.containing_only(1, 2) == [1, 2, 2]
+True
+>>> util.List.containing_only(4, 5, 6) == [4, 5, 6]
+True
+>>> util.List.containing_only(4, 5, 6, 7) == [4, 5, 6]
+True
+
+>>> util.List.containing_exactly(1, 2) == [1, 2, 3]
+False
+>>> util.List.containing_exactly(4, 5, 6, 7) == [4, 5, 6]
+False
+>>> util.List.containing_exactly(5, 6, 4) == [4, 5, 6]
+True
+>>> util.List.containing_exactly(4, 5) == [4, 5, 5]
+False
+>>> util.List.containing_exactly(5, 4, 5) == [4, 5, 5]
+True
+
+>>> util.List.not_containing(1) == [1, 2, 3]
+False
+>>> util.List.not_containing(1) == [4, 5, 6]
+True
+
+>>> util.List.empty() == [1, 2, 3]
+False
+>>> util.List.empty() == []
+True
+
+>>> util.List.not_empty() == [1, 2, 3]
+True
+>>> util.List.not_empty() == []
+False
+```
+
+## Set
+Special class enabling equality comparisons to check items in a set
+
+```pycon
+>>> from pytest_assert_utils import util
+
+>>> util.Set.containing(1) == {1, 2, 3}
+True
+>>> util.Set.containing(1) == {4, 5, 6}
+False
+
+>>> util.Set.not_containing(1) == {1, 2, 3}
+False
+>>> util.Set.not_containing(1) == {4, 5, 6}
+True
+
+>>> util.Set.empty() == {1, 2, 3}
+False
+>>> util.Set.empty() == set()
+True
+
+>>> util.Set.not_empty() == {1, 2, 3}
+True
+>>> util.Set.not_empty() == set()
+False
+```
+
+## Dict
+Special class enabling equality comparisons to check items in a dict
+
+```pycon
+>>> from pytest_assert_utils import util
+
+>>> util.Dict.containing('a') == {'a': 1, 'b': 2}
+True
+>>> util.Dict.containing(a=1) == {'a': 1, 'b': 2}
+True
+>>> util.Dict.containing({'a': 1}) == {'a': 1, 'b': 2}
+True
+>>> util.Dict.containing('a') == {'b': 2}
+False
+>>> util.Dict.containing(a=1) == {'b': 2}
+False
+>>> util.Dict.containing({'a': 1}) == {'b': 2}
+False
+
+>>> util.Dict.not_containing('a') == {'a': 1, 'b': 2}
+False
+>>> util.Dict.not_containing(a=1) == {'a': 1, 'b': 2}
+False
+>>> util.Dict.not_containing({'a': 1}) == {'a': 1, 'b': 2}
+False
+>>> util.Dict.not_containing('a') == {'b': 2}
+True
+>>> util.Dict.not_containing(a=1) == {'b': 2}
+True
+>>> util.Dict.not_containing({'a': 1}) == {'b': 2}
+True
+
+>>> util.Dict.empty() == {'a': 1, 'b': 2, 'c': 3}
+False
+>>> util.Dict.empty() == {}
+True
+
+>>> util.Dict.not_empty() == {'a': 1, 'b': 2, 'c': 3}
+True
+>>> util.Dict.not_empty() == {}
+False
+```
+
+## Str
+Special class enabling equality comparisons to check items in a string
+
+```pycon
+>>> from pytest_assert_utils import util
+
+>>> util.Str.containing('app') == 'apple'
+True
+>>> util.Str.containing('app') == 'happy'
+True
+>>> util.Str.containing('app') == 'banana'
+False
+
+>>> util.Str.not_containing('app') == 'apple'
+False
+>>> util.Str.not_containing('app') == 'happy'
+False
+>>> util.Str.not_containing('app') == 'banana'
+True
+
+>>> util.Str.empty() == 'hamster'
+False
+>>> util.Str.empty() == ''
+True
+
+>>> util.Str.not_empty() == 'hamster'
+True
+>>> util.Str.not_empty() == ''
+False
+```
+
+## Model
+Special class enabling equality comparisons to check attrs of another object
+
+
+```pycon
+>>> from collections import namedtuple
+>>> Foo = namedtuple('Foo', 'id,key,other_key,parent', defaults=(None,)*4)
+
+>>> Foo() == Model()
+True
+
+>>> Foo(key='value') == Model(key='value')
+True
+>>> Foo(key='value') == Model(key='not the value')
+False
+>>> Foo(key='value', other_key='other_value') == Model(key='value')
+True
+>>> [Foo(key='value', other_key='other_value')] == List.containing(Model(key='value'))
+True
+```
+
+
+%package help
+Summary: Development documents and examples for pytest-assert-utils
+Provides: python3-pytest-assert-utils-doc
+%description help
+# pytest-assert-utils
+
+Handy assertion utilities for use with pytest
+
+
+# Installation
+
+```bash
+pip install pytest-assert-utils
+```
+
+
+# Usage
+
+## assert_dict_is_subset
+```python
+def assert_dict_is_subset(subset, superset, recursive=True)
+```
+
+Assert `subset` is a non-strict subset of `superset`
+
+If this assertion fails, a pretty diff will be printed by pytest.
+
+```pycon
+>>> from pytest_assert_utils import assert_dict_is_subset
+
+>>> expected = {'a': 12}
+>>> actual = {'b': 20, 'a': 12}
+>>> assert_dict_is_subset(expected, actual)
+
+>>> expected = {'a': 12}
+>>> actual = {'b': 50000}
+>>> assert_dict_is_subset(expected, actual)
+Traceback (most recent call last):
+ ...
+AssertionError
+```
+
+## assert_model_attrs
+```python
+def assert_model_attrs(instance, _d=UNSET, **attrs)
+```
+
+Assert a model instance has the specified attr values
+
+May be passed a dict of attrs, or kwargs as attrs
+
+```pycon
+>>> from pytest_assert_utils import assert_model_attrs
+
+>>> from collections import namedtuple
+>>> Model = namedtuple('Model', 'id,key,other_key,parent', defaults=(None,)*4)
+
+>>> assert_model_attrs(Model(), {})
+
+>>> assert_model_attrs(Model(key='value'), {'key': 'value'})
+>>> assert_model_attrs(Model(key='value'), key='value')
+>>> assert_model_attrs(Model(key='value'), key='not the value')
+Traceback (most recent call last):
+ ...
+AssertionError
+
+>>> assert_model_attrs(Model(key='value', other_key='other_value'), key='value')
+```
+
+## Any
+Meta-value which compares True to any object (of the specified type(s))
+
+```pycon
+>>> from pytest_assert_utils import util
+
+>>> util.Any() == 'stuff'
+True
+>>> util.Any() == 1
+True
+>>> util.Any() == None
+True
+>>> util.Any() == object()
+True
+
+>>> util.Any(int) == 1
+True
+>>> util.Any(int) == '1'
+False
+```
+
+## Optional
+Meta-value which compares True to None or the optionally specified value
+
+```pycon
+>>> from pytest_assert_utils import util
+
+>>> util.Optional() == None
+True
+>>> util.Optional() is None # this will not work!
+False
+>>> util.Optional(24) == 24
+True
+>>> util.Optional(24) == None
+True
+
+>>> util.Optional(Any(int)) == 1
+True
+>>> util.Optional(Any(int)) == None
+True
+>>> util.Optional(Any(int)) == '1'
+False
+```
+
+## Collection
+Special class enabling equality comparisons to check items in any collection (list, set, tuple, etc)
+
+```pycon
+>>> from pytest_assert_utils import util
+
+>>> util.Collection.containing(1) == [1, 2, 3]
+True
+>>> util.Collection.containing(1) == {1, 2, 3}
+True
+>>> util.Collection.containing(1) == (1, 2, 3)
+True
+
+>>> util.Collection.containing(1) == [4, 5, 6]
+False
+>>> util.Collection.containing(1) == {4, 5, 6}
+False
+>>> util.Collection.containing(1) == (4, 5, 6)
+False
+```
+
+## List
+Special class enabling equality comparisons to check items in a list
+
+```pycon
+>>> from pytest_assert_utils import util
+
+>>> util.List.containing(1) == [1, 2, 3]
+True
+>>> util.List.containing(1) == [4, 5, 6]
+False
+
+>>> util.List.containing_only(1, 2) == [1, 2, 3]
+False
+>>> util.List.containing_only(1, 2) == [1, 2, 2]
+True
+>>> util.List.containing_only(4, 5, 6) == [4, 5, 6]
+True
+>>> util.List.containing_only(4, 5, 6, 7) == [4, 5, 6]
+True
+
+>>> util.List.containing_exactly(1, 2) == [1, 2, 3]
+False
+>>> util.List.containing_exactly(4, 5, 6, 7) == [4, 5, 6]
+False
+>>> util.List.containing_exactly(5, 6, 4) == [4, 5, 6]
+True
+>>> util.List.containing_exactly(4, 5) == [4, 5, 5]
+False
+>>> util.List.containing_exactly(5, 4, 5) == [4, 5, 5]
+True
+
+>>> util.List.not_containing(1) == [1, 2, 3]
+False
+>>> util.List.not_containing(1) == [4, 5, 6]
+True
+
+>>> util.List.empty() == [1, 2, 3]
+False
+>>> util.List.empty() == []
+True
+
+>>> util.List.not_empty() == [1, 2, 3]
+True
+>>> util.List.not_empty() == []
+False
+```
+
+## Set
+Special class enabling equality comparisons to check items in a set
+
+```pycon
+>>> from pytest_assert_utils import util
+
+>>> util.Set.containing(1) == {1, 2, 3}
+True
+>>> util.Set.containing(1) == {4, 5, 6}
+False
+
+>>> util.Set.not_containing(1) == {1, 2, 3}
+False
+>>> util.Set.not_containing(1) == {4, 5, 6}
+True
+
+>>> util.Set.empty() == {1, 2, 3}
+False
+>>> util.Set.empty() == set()
+True
+
+>>> util.Set.not_empty() == {1, 2, 3}
+True
+>>> util.Set.not_empty() == set()
+False
+```
+
+## Dict
+Special class enabling equality comparisons to check items in a dict
+
+```pycon
+>>> from pytest_assert_utils import util
+
+>>> util.Dict.containing('a') == {'a': 1, 'b': 2}
+True
+>>> util.Dict.containing(a=1) == {'a': 1, 'b': 2}
+True
+>>> util.Dict.containing({'a': 1}) == {'a': 1, 'b': 2}
+True
+>>> util.Dict.containing('a') == {'b': 2}
+False
+>>> util.Dict.containing(a=1) == {'b': 2}
+False
+>>> util.Dict.containing({'a': 1}) == {'b': 2}
+False
+
+>>> util.Dict.not_containing('a') == {'a': 1, 'b': 2}
+False
+>>> util.Dict.not_containing(a=1) == {'a': 1, 'b': 2}
+False
+>>> util.Dict.not_containing({'a': 1}) == {'a': 1, 'b': 2}
+False
+>>> util.Dict.not_containing('a') == {'b': 2}
+True
+>>> util.Dict.not_containing(a=1) == {'b': 2}
+True
+>>> util.Dict.not_containing({'a': 1}) == {'b': 2}
+True
+
+>>> util.Dict.empty() == {'a': 1, 'b': 2, 'c': 3}
+False
+>>> util.Dict.empty() == {}
+True
+
+>>> util.Dict.not_empty() == {'a': 1, 'b': 2, 'c': 3}
+True
+>>> util.Dict.not_empty() == {}
+False
+```
+
+## Str
+Special class enabling equality comparisons to check items in a string
+
+```pycon
+>>> from pytest_assert_utils import util
+
+>>> util.Str.containing('app') == 'apple'
+True
+>>> util.Str.containing('app') == 'happy'
+True
+>>> util.Str.containing('app') == 'banana'
+False
+
+>>> util.Str.not_containing('app') == 'apple'
+False
+>>> util.Str.not_containing('app') == 'happy'
+False
+>>> util.Str.not_containing('app') == 'banana'
+True
+
+>>> util.Str.empty() == 'hamster'
+False
+>>> util.Str.empty() == ''
+True
+
+>>> util.Str.not_empty() == 'hamster'
+True
+>>> util.Str.not_empty() == ''
+False
+```
+
+## Model
+Special class enabling equality comparisons to check attrs of another object
+
+
+```pycon
+>>> from collections import namedtuple
+>>> Foo = namedtuple('Foo', 'id,key,other_key,parent', defaults=(None,)*4)
+
+>>> Foo() == Model()
+True
+
+>>> Foo(key='value') == Model(key='value')
+True
+>>> Foo(key='value') == Model(key='not the value')
+False
+>>> Foo(key='value', other_key='other_value') == Model(key='value')
+True
+>>> [Foo(key='value', other_key='other_value')] == List.containing(Model(key='value'))
+True
+```
+
+
+%prep
+%autosetup -n pytest-assert-utils-0.3.1
+
+%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-pytest-assert-utils -f filelist.lst
+%dir %{python3_sitelib}/*
+
+%files help -f doclist.lst
+%{_docdir}/*
+
+%changelog
+* Fri May 05 2023 Python_Bot <Python_Bot@openeuler.org> - 0.3.1-1
+- Package Spec generated
diff --git a/sources b/sources
new file mode 100644
index 0000000..d322b0c
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+836148eba593238a9c2db84c4d32cb2c pytest-assert-utils-0.3.1.tar.gz