pytest-expecter 2.3__tar.gz → 3.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,13 +1,13 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: pytest-expecter
3
- Version: 2.3
3
+ Version: 3.1
4
4
  Summary: Better testing with expecter and pytest.
5
- Home-page: https://pypi.org/project/pytest-expecter
6
5
  License: BSD
6
+ License-File: LICENSE.md
7
7
  Keywords: pytest,testing
8
8
  Author: Jace Browning
9
9
  Author-email: jacebrowning@gmail.com
10
- Requires-Python: >=3.6,<4.0
10
+ Requires-Python: >=3.10,<4.0
11
11
  Classifier: Development Status :: 5 - Production/Stable
12
12
  Classifier: Environment :: Plugins
13
13
  Classifier: Framework :: Pytest
@@ -18,12 +18,13 @@ Classifier: Operating System :: OS Independent
18
18
  Classifier: Programming Language :: Python
19
19
  Classifier: Programming Language :: Python :: 3
20
20
  Classifier: Programming Language :: Python :: 3.10
21
- Classifier: Programming Language :: Python :: 3.6
22
- Classifier: Programming Language :: Python :: 3.7
23
- Classifier: Programming Language :: Python :: 3.8
24
- Classifier: Programming Language :: Python :: 3.9
21
+ Classifier: Programming Language :: Python :: 3.11
22
+ Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Programming Language :: Python :: 3.13
24
+ Classifier: Programming Language :: Python :: 3.14
25
25
  Classifier: Topic :: Software Development :: Testing
26
26
  Project-URL: Documentation, https://pytest-expecter.readthedocs.io
27
+ Project-URL: Homepage, https://pypi.org/project/pytest-expecter
27
28
  Project-URL: Repository, https://github.com/jacebrowning/pytest-expecter
28
29
  Description-Content-Type: text/markdown
29
30
 
@@ -31,12 +32,13 @@ Description-Content-Type: text/markdown
31
32
 
32
33
  A `pytest` plugin based on [garybernhardt/expecter](https://github.com/garybernhardt/expecter) to write expressive tests.
33
34
 
34
- [![Build Status](https://img.shields.io/travis/jacebrowning/pytest-expecter/develop.svg?label=unix)](https://travis-ci.org/jacebrowning/pytest-expecter)
35
+ [![Build Status](https://img.shields.io/github/actions/workflow/status/jacebrowning/pytest-expecter/main.yml)](https://github.com/jacebrowning/pytest-expecter/actions/workflows/main.yml)
35
36
  [![Coverage Status](https://img.shields.io/coveralls/jacebrowning/pytest-expecter/develop.svg)](https://coveralls.io/r/jacebrowning/pytest-expecter)
36
- [![PyPI Version](https://img.shields.io/pypi/v/pytest-expecter.svg)](https://pypi.org/project/pytest-expecter)
37
37
  [![PyPI License](https://img.shields.io/pypi/l/pytest-expecter.svg)](https://pypi.org/project/pytest-expecter)
38
+ [![PyPI Version](https://img.shields.io/pypi/v/pytest-expecter.svg)](https://pypi.org/project/pytest-expecter)
39
+ [![PyPI Downloads](https://img.shields.io/pypi/dm/pytest-expecter.svg?color=orange)](https://pypistats.org/packages/pytest-expecter)
38
40
 
39
- # Quick Start
41
+ ## Quick Start
40
42
 
41
43
  With this plugin you can write tests (optionally using [pytest-describe](https://github.com/pytest-dev/pytest-describe)) like this:
42
44
 
@@ -64,7 +66,7 @@ test_foobar.py:7: AssertionError
64
66
  ================ 1 failed, 1 passed in 2.67 seconds ================
65
67
  ```
66
68
 
67
- # Installation
69
+ ## Installation
68
70
 
69
71
  Install it directly into an activated virtual environment:
70
72
 
@@ -2,12 +2,13 @@
2
2
 
3
3
  A `pytest` plugin based on [garybernhardt/expecter](https://github.com/garybernhardt/expecter) to write expressive tests.
4
4
 
5
- [![Build Status](https://img.shields.io/travis/jacebrowning/pytest-expecter/develop.svg?label=unix)](https://travis-ci.org/jacebrowning/pytest-expecter)
5
+ [![Build Status](https://img.shields.io/github/actions/workflow/status/jacebrowning/pytest-expecter/main.yml)](https://github.com/jacebrowning/pytest-expecter/actions/workflows/main.yml)
6
6
  [![Coverage Status](https://img.shields.io/coveralls/jacebrowning/pytest-expecter/develop.svg)](https://coveralls.io/r/jacebrowning/pytest-expecter)
7
- [![PyPI Version](https://img.shields.io/pypi/v/pytest-expecter.svg)](https://pypi.org/project/pytest-expecter)
8
7
  [![PyPI License](https://img.shields.io/pypi/l/pytest-expecter.svg)](https://pypi.org/project/pytest-expecter)
8
+ [![PyPI Version](https://img.shields.io/pypi/v/pytest-expecter.svg)](https://pypi.org/project/pytest-expecter)
9
+ [![PyPI Downloads](https://img.shields.io/pypi/dm/pytest-expecter.svg?color=orange)](https://pypistats.org/packages/pytest-expecter)
9
10
 
10
- # Quick Start
11
+ ## Quick Start
11
12
 
12
13
  With this plugin you can write tests (optionally using [pytest-describe](https://github.com/pytest-dev/pytest-describe)) like this:
13
14
 
@@ -35,7 +36,7 @@ test_foobar.py:7: AssertionError
35
36
  ================ 1 failed, 1 passed in 2.67 seconds ================
36
37
  ```
37
38
 
38
- # Installation
39
+ ## Installation
39
40
 
40
41
  Install it directly into an activated virtual environment:
41
42
 
@@ -10,25 +10,22 @@ import os
10
10
  import pprint
11
11
  import sys
12
12
  from collections import OrderedDict
13
-
14
- import pytest
15
- from pkg_resources import DistributionNotFound, get_distribution
16
-
13
+ from importlib.metadata import PackageNotFoundError, version
17
14
 
18
15
  try:
19
- __version__ = get_distribution('pytest-expecter').version
20
- except DistributionNotFound:
21
- __version__ = '(local)'
16
+ __version__ = version("pytest-expecter")
17
+ except PackageNotFoundError:
18
+ __version__ = "(local)"
22
19
 
23
20
 
24
- __all__ = ['expect']
21
+ __all__ = ["expect"]
25
22
 
26
23
 
27
24
  class Anything:
28
25
  """Placeholder value to ignore uninteresting response data."""
29
26
 
30
27
  def __repr__(self):
31
- return '<anything>'
28
+ return "<anything>"
32
29
 
33
30
  def __eq__(self, other):
34
31
  return True
@@ -73,7 +70,7 @@ class expect:
73
70
 
74
71
  def __eq__(self, other):
75
72
  __tracebackhide__ = _hidetraceback() # pylint: disable=unused-variable
76
- msg = 'Expected %s but got %s' % (repr(other), repr(self._actual))
73
+ msg = "Expected %s but got %s" % (repr(other), repr(self._actual))
77
74
  if isinstance(other, str) and isinstance(self._actual, str):
78
75
  msg += normalized_diff(other, self._actual)
79
76
  elif len(repr(self._actual)) > self.MIN_DIFF_SIZE:
@@ -83,14 +80,14 @@ class expect:
83
80
 
84
81
  def __ne__(self, other):
85
82
  __tracebackhide__ = _hidetraceback() # pylint: disable=unused-variable
86
- assert self._actual != other, 'Expected anything except %s but got it' % repr(
83
+ assert self._actual != other, "Expected anything except %s but got it" % repr(
87
84
  self._actual
88
85
  )
89
86
  return self
90
87
 
91
88
  def __lt__(self, other):
92
89
  __tracebackhide__ = _hidetraceback() # pylint: disable=unused-variable
93
- assert self._actual < other, 'Expected something less than %s but got %s' % (
90
+ assert self._actual < other, "Expected something less than %s but got %s" % (
94
91
  repr(other),
95
92
  repr(self._actual),
96
93
  )
@@ -98,7 +95,7 @@ class expect:
98
95
 
99
96
  def __gt__(self, other):
100
97
  __tracebackhide__ = _hidetraceback() # pylint: disable=unused-variable
101
- assert self._actual > other, 'Expected something greater than %s but got %s' % (
98
+ assert self._actual > other, "Expected something greater than %s but got %s" % (
102
99
  repr(other),
103
100
  repr(self._actual),
104
101
  )
@@ -106,27 +103,31 @@ class expect:
106
103
 
107
104
  def __le__(self, other):
108
105
  __tracebackhide__ = _hidetraceback() # pylint: disable=unused-variable
109
- assert self._actual <= other, (
110
- 'Expected something less than or equal to %s but got %s'
111
- % (repr(other), repr(self._actual))
106
+ assert (
107
+ self._actual <= other
108
+ ), "Expected something less than or equal to %s but got %s" % (
109
+ repr(other),
110
+ repr(self._actual),
112
111
  )
113
112
  return self
114
113
 
115
114
  def __ge__(self, other):
116
115
  __tracebackhide__ = _hidetraceback() # pylint: disable=unused-variable
117
- assert self._actual >= other, (
118
- 'Expected something greater than or equal to %s but got %s'
119
- % (repr(other), repr(self._actual))
116
+ assert (
117
+ self._actual >= other
118
+ ), "Expected something greater than or equal to %s but got %s" % (
119
+ repr(other),
120
+ repr(self._actual),
120
121
  )
121
122
  return self
122
123
 
123
124
  def __repr__(self):
124
- return 'expect(%s)' % repr(self._actual)
125
+ return "expect(%s)" % repr(self._actual)
125
126
 
126
127
  def is_(self, other):
127
128
  """Ensure that ``other`` is identical to the actual value."""
128
129
  __tracebackhide__ = _hidetraceback() # pylint: disable=unused-variable
129
- label = 'condition' if isinstance(self._actual, bool) else 'value'
130
+ label = "condition" if isinstance(self._actual, bool) else "value"
130
131
  assert self._actual is other, "Expected %s to be %s, but it was %s" % (
131
132
  label,
132
133
  repr(other),
@@ -137,7 +138,7 @@ class expect:
137
138
  def is_not(self, other):
138
139
  """Ensure that ``other`` is not identical to the actual value."""
139
140
  __tracebackhide__ = _hidetraceback() # pylint: disable=unused-variable
140
- label = 'condition' if isinstance(self._actual, bool) else 'value'
141
+ label = "condition" if isinstance(self._actual, bool) else "value"
141
142
  assert self._actual is not other, "Expected %s to not be %s, but it was" % (
142
143
  label,
143
144
  repr(other),
@@ -152,12 +153,14 @@ class expect:
152
153
  __tracebackhide__ = _hidetraceback() # pylint: disable=unused-variable
153
154
  if isinstance(expected_cls, tuple):
154
155
  cls_name = [c.__name__ for c in expected_cls]
155
- cls_name = ' or '.join(cls_name) # type: ignore
156
+ cls_name = " or ".join(cls_name) # type: ignore
156
157
  else:
157
158
  cls_name = expected_cls.__name__
158
- assert isinstance(self._actual, expected_cls), (
159
- 'Expected an instance of %s but got an instance of %s'
160
- % (cls_name, self._actual.__class__.__name__)
159
+ assert isinstance(
160
+ self._actual, expected_cls
161
+ ), "Expected an instance of %s but got an instance of %s" % (
162
+ cls_name,
163
+ self._actual.__class__.__name__,
161
164
  )
162
165
 
163
166
  def contains(self, other):
@@ -167,7 +170,7 @@ class expect:
167
170
  """
168
171
  __tracebackhide__ = _hidetraceback() # pylint: disable=unused-variable
169
172
 
170
- if isinstance(self._actual, str) and '\n' in self._actual:
173
+ if isinstance(self._actual, str) and "\n" in self._actual:
171
174
  msg = "Given text:\n\n%s\n\nExpected to contain %s but didn't" % (
172
175
  self._actual.strip(),
173
176
  repr(other),
@@ -184,7 +187,7 @@ class expect:
184
187
  """Same as ``contains` but ignoring case."""
185
188
  __tracebackhide__ = _hidetraceback() # pylint: disable=unused-variable
186
189
 
187
- if isinstance(self._actual, str) and '\n' in self._actual:
190
+ if isinstance(self._actual, str) and "\n" in self._actual:
188
191
  msg = (
189
192
  "Given text:\n\n%s\n\nExpected to contain %s (ignoring case) but didn't"
190
193
  % (self._actual.strip(), repr(other))
@@ -204,7 +207,7 @@ class expect:
204
207
  """Same as ``contains`` but with alternate phrasing."""
205
208
  __tracebackhide__ = _hidetraceback() # pylint: disable=unused-variable
206
209
 
207
- if isinstance(self._actual, str) and '\n' in self._actual:
210
+ if isinstance(self._actual, str) and "\n" in self._actual:
208
211
  msg = "Given text:\n\n%s\n\nExpected to include %s but didn't" % (
209
212
  self._actual.strip(),
210
213
  repr(other),
@@ -221,7 +224,7 @@ class expect:
221
224
  """Opposite of ``contains``."""
222
225
  __tracebackhide__ = _hidetraceback() # pylint: disable=unused-variable
223
226
 
224
- if isinstance(self._actual, str) and '\n' in self._actual:
227
+ if isinstance(self._actual, str) and "\n" in self._actual:
225
228
  msg = "Given text:\n\n%s\n\nExpected not to contain %s but did" % (
226
229
  self._actual.strip(),
227
230
  repr(other),
@@ -238,7 +241,7 @@ class expect:
238
241
  """Opposite of ``contains`` with alternate phrasing."""
239
242
  __tracebackhide__ = _hidetraceback() # pylint: disable=unused-variable
240
243
 
241
- if isinstance(self._actual, str) and '\n' in self._actual:
244
+ if isinstance(self._actual, str) and "\n" in self._actual:
242
245
  msg = "Given text:\n\n%s\n\nExpected to exclude %s but didn't" % (
243
246
  self._actual.strip(),
244
247
  repr(other),
@@ -255,7 +258,7 @@ class expect:
255
258
  """Same as ``excludes`` but ignoring case."""
256
259
  __tracebackhide__ = _hidetraceback() # pylint: disable=unused-variable
257
260
 
258
- if isinstance(self._actual, str) and '\n' in self._actual:
261
+ if isinstance(self._actual, str) and "\n" in self._actual:
259
262
  msg = (
260
263
  "Given text:\n\n%s\n\nExpected to exclude %s (ignoring case) but didn't"
261
264
  % (self._actual.strip(), repr(other))
@@ -275,7 +278,7 @@ class expect:
275
278
  """Ensure that ``other`` starts the actual value."""
276
279
  __tracebackhide__ = _hidetraceback() # pylint: disable=unused-variable
277
280
 
278
- if isinstance(self._actual, str) and '\n' in self._actual:
281
+ if isinstance(self._actual, str) and "\n" in self._actual:
279
282
  msg = "Given text:\n\n%s\n\nExpected to start with %s but didn't" % (
280
283
  self._actual.strip(),
281
284
  repr(other),
@@ -292,7 +295,7 @@ class expect:
292
295
  """Same as ``startswith`` but ignoring case."""
293
296
  __tracebackhide__ = _hidetraceback() # pylint: disable=unused-variable
294
297
 
295
- if isinstance(self._actual, str) and '\n' in self._actual:
298
+ if isinstance(self._actual, str) and "\n" in self._actual:
296
299
  msg = (
297
300
  "Given text:\n\n%s\n\nExpected to start with %s (ignoring case) but didn't"
298
301
  % (self._actual.strip(), repr(other))
@@ -309,7 +312,7 @@ class expect:
309
312
  """Ensure that ``other`` ends the actual value."""
310
313
  __tracebackhide__ = _hidetraceback() # pylint: disable=unused-variable
311
314
 
312
- if isinstance(self._actual, str) and '\n' in self._actual:
315
+ if isinstance(self._actual, str) and "\n" in self._actual:
313
316
  msg = "Given text:\n\n%s\n\nExpected to end with %s but didn't" % (
314
317
  self._actual.strip(),
315
318
  repr(other),
@@ -326,7 +329,7 @@ class expect:
326
329
  """Same as ``endswith`` but ignoring case."""
327
330
  __tracebackhide__ = _hidetraceback() # pylint: disable=unused-variable
328
331
 
329
- if isinstance(self._actual, str) and '\n' in self._actual:
332
+ if isinstance(self._actual, str) and "\n" in self._actual:
330
333
  msg = (
331
334
  "Given text:\n\n%s\n\nExpected to end with %s (ignoring case) but didn't"
332
335
  % (self._actual.strip(), repr(other))
@@ -380,7 +383,7 @@ class _RaisesExpectation:
380
383
  success = not exc_type
381
384
  if success:
382
385
  raise AssertionError(
383
- 'Expected an exception of type %s but got none'
386
+ "Expected an exception of type %s but got none"
384
387
  % self._exception_class.__name__
385
388
  )
386
389
  return self.validate_failure(exc_type, exc_value)
@@ -427,22 +430,22 @@ class _CustomExpectation:
427
430
  def enforce(self, *args, **kwargs):
428
431
  __tracebackhide__ = _hidetraceback() # pylint: disable=unused-variable
429
432
  if not self._predicate(self._actual, *args, **kwargs):
430
- predicate_name = self._predicate.__name__.replace('_', ' ')
433
+ predicate_name = self._predicate.__name__.replace("_", " ")
431
434
  raise AssertionError(
432
- 'Expected that %s %s, but %s'
435
+ "Expected that %s %s, but %s"
433
436
  % (repr(self._actual), predicate_name, self._negative_verb())
434
437
  )
435
438
 
436
439
  def _negative_verb(self):
437
440
  # XXX: getting name in multiple places
438
- first_word_in_predicate = self._predicate.__name__.split('_')[0]
441
+ first_word_in_predicate = self._predicate.__name__.split("_")[0]
439
442
  try:
440
443
  return self.negative_verbs[first_word_in_predicate]
441
444
  except KeyError:
442
445
  return "got False"
443
446
 
444
447
 
445
- _custom_expectations = {}
448
+ _custom_expectations: dict[str, object] = {}
446
449
 
447
450
 
448
451
  def add_expectation(predicate):
@@ -479,10 +482,10 @@ def normalize(value):
479
482
 
480
483
 
481
484
  def normalized_diff(other, actual):
482
- diff = difflib.unified_diff(other.splitlines(), actual.splitlines(), lineterm='')
485
+ diff = difflib.unified_diff(other.splitlines(), actual.splitlines(), lineterm="")
483
486
  diff = list(diff) # type: ignore
484
- return '\n'.join(['\nDiff:'] + diff[2:]) # type: ignore
487
+ return "\n".join(["\nDiff:"] + diff[2:]) # type: ignore
485
488
 
486
489
 
487
490
  def _hidetraceback():
488
- return os.getenv('EXPECTER_HIDETRACEBACK')
491
+ return os.getenv("EXPECTER_HIDETRACEBACK")
@@ -13,7 +13,7 @@ from . import expect as _expect
13
13
 
14
14
 
15
15
  def pytest_configure(config): # pylint: disable=unused-argument
16
- os.environ['EXPECTER_HIDETRACEBACK'] = "true"
16
+ os.environ["EXPECTER_HIDETRACEBACK"] = "true"
17
17
 
18
18
 
19
19
  @pytest.fixture
@@ -1,7 +1,7 @@
1
1
  [tool.poetry]
2
2
 
3
3
  name = "pytest-expecter"
4
- version = "2.3"
4
+ version = "3.1"
5
5
  description = "Better testing with expecter and pytest."
6
6
 
7
7
  license = "BSD"
@@ -23,9 +23,11 @@ classifiers = [
23
23
  "License :: OSI Approved :: BSD License",
24
24
  "Operating System :: OS Independent",
25
25
  "Programming Language :: Python",
26
- "Programming Language :: Python :: 3.6",
27
- "Programming Language :: Python :: 3.7",
28
- "Programming Language :: Python :: 3.8",
26
+ "Programming Language :: Python :: 3.10",
27
+ "Programming Language :: Python :: 3.11",
28
+ "Programming Language :: Python :: 3.12",
29
+ "Programming Language :: Python :: 3.13",
30
+ "Programming Language :: Python :: 3.14",
29
31
  "Topic :: Software Development :: Testing",
30
32
  ]
31
33
 
@@ -35,50 +37,83 @@ packages = [
35
37
 
36
38
  [tool.poetry.dependencies]
37
39
 
38
- python = "^3.6"
40
+ python = "^3.10"
39
41
 
40
- [tool.poetry.dev-dependencies]
42
+ [tool.poetry.group.dev.dependencies]
41
43
 
42
44
  # Formatters
43
- black = "19.10b0"
44
- isort = "4.3.21"
45
+ black = ">=22.1,<27.0"
46
+ isort = "^5.10"
45
47
 
46
48
  # Linters
47
49
  mypy = "*"
48
50
  pydocstyle = "*"
49
- pylint = "^2.0"
51
+ pylint = ">=2.15,<4.1"
50
52
  types-setuptools = "*"
51
53
 
52
54
  # Testing
53
- pytest = "^6.2.5"
55
+ pytest = ">=8.3.5,<10.0.0"
54
56
  pytest-cov = "*"
55
- pytest-describe = "^1.0"
57
+ pytest-describe = ">=2.2,<4.0"
56
58
  pytest-random = "*"
57
59
  freezegun = "*"
58
60
 
59
61
  # Reports
60
- coveragespace = "^3.1.1"
62
+ coveragespace = "*"
61
63
 
62
64
  # Documentation
63
- mkdocs = "^1.2.3"
65
+ mkdocs = "^1.6.1"
64
66
  pygments = "*"
67
+ jinja2 = ">=3.0.3,<3.2.0"
65
68
 
66
69
  # Tooling
67
70
  pyinstaller = "*"
68
71
  sniffer = "*"
69
- MacFSEvents = { version = "*", platform = "darwin" }
72
+ MacFSEvents = { version = "*", platform = "darwin", python = "<3.13" }
70
73
  pync = { version = "*", platform = "darwin" }
71
74
 
75
+ [tool.poetry.requires-plugins]
76
+
77
+ poetry-plugin-export = ">=1.8"
78
+
72
79
  [tool.poetry.plugins.pytest11]
73
80
 
74
81
  "pytest-expecter" = "expecter.plugin"
75
82
 
76
83
  [tool.black]
77
84
 
78
- target-version = ["py36", "py37"]
79
- skip-string-normalization = true
85
+ quiet = true
86
+
87
+ [tool.isort]
88
+
89
+ profile = "black"
90
+
91
+ [tool.mypy]
92
+
93
+ ignore_missing_imports = true
94
+ no_implicit_optional = true
95
+ check_untyped_defs = true
96
+
97
+ cache_dir = ".cache/mypy/"
98
+
99
+ [tool.pytest.ini_options]
100
+
101
+ addopts = """
102
+ --strict-markers
103
+
104
+ -r sxX
105
+ --show-capture=log
106
+
107
+ --cov-report=html
108
+ --cov-report=term-missing:skip-covered
109
+ --no-cov-on-fail
110
+ """
111
+
112
+ cache_dir = ".cache/pytest/"
113
+
114
+ markers = []
80
115
 
81
116
  [build-system]
82
117
 
83
- requires = ["poetry>=0.12"]
84
- build-backend = "poetry.masonry.api"
118
+ requires = ["poetry-core>=2.4.0"]
119
+ build-backend = "poetry.core.masonry.api"
@@ -1,30 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- from setuptools import setup
3
-
4
- packages = \
5
- ['expecter']
6
-
7
- package_data = \
8
- {'': ['*']}
9
-
10
- entry_points = \
11
- {'pytest11': ['pytest-expecter = expecter.plugin']}
12
-
13
- setup_kwargs = {
14
- 'name': 'pytest-expecter',
15
- 'version': '2.3',
16
- 'description': 'Better testing with expecter and pytest.',
17
- 'long_description': '# Overview\n\nA `pytest` plugin based on [garybernhardt/expecter](https://github.com/garybernhardt/expecter) to write expressive tests.\n\n[![Build Status](https://img.shields.io/travis/jacebrowning/pytest-expecter/develop.svg?label=unix)](https://travis-ci.org/jacebrowning/pytest-expecter)\n[![Coverage Status](https://img.shields.io/coveralls/jacebrowning/pytest-expecter/develop.svg)](https://coveralls.io/r/jacebrowning/pytest-expecter)\n[![PyPI Version](https://img.shields.io/pypi/v/pytest-expecter.svg)](https://pypi.org/project/pytest-expecter)\n[![PyPI License](https://img.shields.io/pypi/l/pytest-expecter.svg)](https://pypi.org/project/pytest-expecter)\n\n# Quick Start\n\nWith this plugin you can write tests (optionally using [pytest-describe](https://github.com/pytest-dev/pytest-describe)) like this:\n\n```python\ndef describe_foobar():\n\n def it_can_pass(expect):\n expect(2 + 3) == 5\n\n def it_can_fail(expect):\n expect(2 + 3) == 6\n```\n\nand get output like this:\n\n```python\n============================= FAILURES =============================\n___________________ describe_foobar.it_can_fail ____________________\n\n def it_can_fail(expect):\n> expect(2 + 3) == 6\nE AssertionError: Expected 6 but got 5\n\ntest_foobar.py:7: AssertionError\n================ 1 failed, 1 passed in 2.67 seconds ================\n```\n\n# Installation\n\nInstall it directly into an activated virtual environment:\n\n```\n$ pip install pytest-expecter\n```\n\nor add it to your [Poetry](https://python-poetry.org/docs/) project:\n\n```\n$ poetry add pytest-expecter\n```\n',
18
- 'author': 'Jace Browning',
19
- 'author_email': 'jacebrowning@gmail.com',
20
- 'maintainer': None,
21
- 'maintainer_email': None,
22
- 'url': 'https://pypi.org/project/pytest-expecter',
23
- 'packages': packages,
24
- 'package_data': package_data,
25
- 'entry_points': entry_points,
26
- 'python_requires': '>=3.6,<4.0',
27
- }
28
-
29
-
30
- setup(**setup_kwargs)
File without changes