requirements-detector 1.3.2__py3-none-any.whl → 1.5.0__py3-none-any.whl

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.
@@ -8,3 +8,14 @@ from requirements_detector.detect import ( # from_setup_py,
8
8
  from_requirements_txt,
9
9
  from_setup_py,
10
10
  )
11
+
12
+ __all__ = [
13
+ "CouldNotParseRequirements",
14
+ "RequirementsNotFound",
15
+ "find_requirements",
16
+ "from_pyproject_toml",
17
+ "from_requirements_blob",
18
+ "from_requirements_dir",
19
+ "from_requirements_txt",
20
+ "from_setup_py",
21
+ ]
@@ -1,21 +1,19 @@
1
1
  import re
2
- import sys
3
2
  from pathlib import Path
4
3
  from typing import List, Optional, Union
5
4
 
6
- import toml
7
-
8
5
  from .exceptions import CouldNotParseRequirements, RequirementsNotFound
9
6
  from .handle_setup import from_setup_py
10
7
  from .poetry_semver import parse_constraint
11
8
  from .poetry_semver.version_constraint import VersionConstraint
12
9
  from .requirement import DetectedRequirement
13
10
 
14
- _USE_TOMLLIB = sys.version_info.major > 3 or sys.version_info.minor >= 11
15
- if _USE_TOMLLIB:
11
+ try:
12
+ # added in Python 3.11: https://docs.python.org/3/library/tomllib.html
16
13
  import tomllib
17
- else:
18
- import toml
14
+ except ImportError:
15
+ # for Python <= 3.10:
16
+ import tomli as tomllib
19
17
 
20
18
  __all__ = [
21
19
  "find_requirements",
@@ -89,7 +87,7 @@ def find_requirements(path: P) -> List[DetectedRequirement]:
89
87
  if reqfile.exists and reqfile.is_file():
90
88
  try:
91
89
  requirements += from_requirements_txt(reqfile)
92
- except CouldNotParseRequirements as e:
90
+ except CouldNotParseRequirements:
93
91
  pass
94
92
 
95
93
  requirements_dir = path / "requirements"
@@ -135,11 +133,9 @@ def from_pyproject_toml(toml_file: P) -> List[DetectedRequirement]:
135
133
  if isinstance(toml_file, str):
136
134
  toml_file = Path(toml_file)
137
135
 
138
- if _USE_TOMLLIB:
139
- with open(toml_file, "rb") as toml_file_open:
140
- parsed = tomllib.load(toml_file_open)
141
- else:
142
- parsed = toml.load(toml_file)
136
+ with open(toml_file, "rb") as toml_file_open:
137
+ parsed = tomllib.load(toml_file_open)
138
+
143
139
  poetry_section = parsed.get("tool", {}).get("poetry", {})
144
140
  dependencies = poetry_section.get("dependencies", {})
145
141
  dependencies.update(poetry_section.get("dev-dependencies", {}))
@@ -156,7 +152,12 @@ def from_pyproject_toml(toml_file: P) -> List[DetectedRequirement]:
156
152
  continue
157
153
  assert parsed_spec_obj is not None
158
154
  parsed_spec = str(parsed_spec_obj)
159
- if "," not in parsed_spec and "<" not in parsed_spec and ">" not in parsed_spec and "=" not in parsed_spec:
155
+ if (
156
+ "," not in parsed_spec
157
+ and "<" not in parsed_spec
158
+ and ">" not in parsed_spec
159
+ and "=" not in parsed_spec
160
+ ):
160
161
  parsed_spec = f"=={parsed_spec}"
161
162
 
162
163
  req = DetectedRequirement.parse(f"{name}{parsed_spec}", toml_file)
@@ -1,6 +1,5 @@
1
1
  import re
2
2
 
3
- from .empty_constraint import EmptyConstraint
4
3
  from .patterns import (
5
4
  BASIC_CONSTRAINT,
6
5
  CARET_CONSTRAINT,
@@ -23,7 +22,9 @@ def parse_constraint(constraints: str) -> VersionConstraint:
23
22
  or_constraints = re.split(r"\s*\|\|?\s*", constraints.strip())
24
23
  or_groups = []
25
24
  for constraints in or_constraints:
26
- and_constraints = re.split("(?<!^)(?<![=>< ,]) *(?<!-)[, ](?!-) *(?!,|$)", constraints)
25
+ and_constraints = re.split(
26
+ "(?<!^)(?<![=>< ,]) *(?<!-)[, ](?!-) *(?!,|$)", constraints
27
+ )
27
28
  constraint_objects = []
28
29
 
29
30
  if len(and_constraints) > 1:
@@ -61,7 +62,9 @@ def parse_single_constraint(constraint: str) -> VersionConstraint:
61
62
  if len(m.group(1).split(".")) == 1:
62
63
  high = version.stable.next_major
63
64
 
64
- return VersionRange(version, high, include_min=True, always_include_max_prerelease=True)
65
+ return VersionRange(
66
+ version, high, include_min=True, always_include_max_prerelease=True
67
+ )
65
68
 
66
69
  # PEP 440 Tilde range (~=)
67
70
  m = TILDE_PEP440_CONSTRAINT.match(constraint)
@@ -82,7 +85,9 @@ def parse_single_constraint(constraint: str) -> VersionConstraint:
82
85
  low = Version(version.major, version.minor, version.patch)
83
86
  high = version.stable.next_minor
84
87
 
85
- return VersionRange(low, high, include_min=True, always_include_max_prerelease=True)
88
+ return VersionRange(
89
+ low, high, include_min=True, always_include_max_prerelease=True
90
+ )
86
91
 
87
92
  # Caret range
88
93
  m = CARET_CONSTRAINT.match(constraint)
@@ -142,7 +147,9 @@ def parse_single_constraint(constraint: str) -> VersionConstraint:
142
147
  try:
143
148
  version = Version.parse(version)
144
149
  except ValueError:
145
- raise ValueError("Could not parse version constraint: {}".format(constraint))
150
+ raise ValueError(
151
+ "Could not parse version constraint: {}".format(constraint)
152
+ )
146
153
 
147
154
  if op == "<":
148
155
  return VersionRange(max=version)
@@ -6,7 +6,9 @@ MODIFIERS = (
6
6
  r"([+-]?([0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*))?"
7
7
  )
8
8
 
9
- _COMPLETE_VERSION = r"v?(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:\.(\d+))?{}(?:\+[^\s]+)?".format(MODIFIERS)
9
+ _COMPLETE_VERSION = (
10
+ r"v?(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:\.(\d+))?{}(?:\+[^\s]+)?".format(MODIFIERS)
11
+ )
10
12
 
11
13
  COMPLETE_VERSION = re.compile("(?i)" + _COMPLETE_VERSION)
12
14
 
@@ -14,4 +16,6 @@ CARET_CONSTRAINT = re.compile(r"(?i)^\^({})$".format(_COMPLETE_VERSION))
14
16
  TILDE_CONSTRAINT = re.compile("(?i)^~(?!=)({})$".format(_COMPLETE_VERSION))
15
17
  TILDE_PEP440_CONSTRAINT = re.compile("(?i)^~=({})$".format(_COMPLETE_VERSION))
16
18
  X_CONSTRAINT = re.compile(r"^(!=|==)?\s*v?(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:\.[xX*])+$")
17
- BASIC_CONSTRAINT = re.compile(r"(?i)^(<>|!=|>=?|<=?|==?)?\s*({}|dev)".format(_COMPLETE_VERSION))
19
+ BASIC_CONSTRAINT = re.compile(
20
+ r"(?i)^(<>|!=|>=?|<=?|==?)?\s*({}|dev)".format(_COMPLETE_VERSION)
21
+ )
@@ -168,7 +168,9 @@ class Version(VersionRange):
168
168
 
169
169
  @property
170
170
  def first_prerelease(self) -> "Version":
171
- return Version.parse("{}.{}.{}-alpha.0".format(self.major, self.minor, self.patch))
171
+ return Version.parse(
172
+ "{}.{}.{}-alpha.0".format(self.major, self.minor, self.patch)
173
+ )
172
174
 
173
175
  @property
174
176
  def min(self):
@@ -271,7 +273,11 @@ class Version(VersionRange):
271
273
  return self
272
274
 
273
275
  def equals_without_prerelease(self, other: "Version") -> bool:
274
- return self.major == other.major and self.minor == other.minor and self.patch == other.patch
276
+ return (
277
+ self.major == other.major
278
+ and self.minor == other.minor
279
+ and self.patch == other.patch
280
+ )
275
281
 
276
282
  def _increment_major(self) -> "Version":
277
283
  return Version(self.major + 1, 0, 0, precision=self._precision)
@@ -280,7 +286,9 @@ class Version(VersionRange):
280
286
  return Version(self.major, self.minor + 1, 0, precision=self._precision)
281
287
 
282
288
  def _increment_patch(self) -> "Version":
283
- return Version(self.major, self.minor, self.patch + 1, precision=self._precision)
289
+ return Version(
290
+ self.major, self.minor, self.patch + 1, precision=self._precision
291
+ )
284
292
 
285
293
  def _normalize_prerelease(self, pre: str) -> str:
286
294
  if not pre:
@@ -22,7 +22,11 @@ class VersionRange(VersionConstraint):
22
22
  and not include_max
23
23
  and not full_max.is_prerelease()
24
24
  and not full_max.build
25
- and (min is None or not min.is_prerelease() or not min.equals_without_prerelease(full_max))
25
+ and (
26
+ min is None
27
+ or not min.is_prerelease()
28
+ or not min.equals_without_prerelease(full_max)
29
+ )
26
30
  ):
27
31
  full_max = full_max.first_prerelease
28
32
 
@@ -105,7 +109,9 @@ class VersionRange(VersionConstraint):
105
109
  return any([self.allows_any(constraint) for constraint in other.ranges])
106
110
 
107
111
  if isinstance(other, VersionRange):
108
- return not other.is_strictly_lower(self) and not other.is_strictly_higher(self)
112
+ return not other.is_strictly_lower(self) and not other.is_strictly_higher(
113
+ self
114
+ )
109
115
 
110
116
  raise ValueError("Unknown VersionConstraint type {}.".format(other))
111
117
 
@@ -160,7 +166,9 @@ class VersionRange(VersionConstraint):
160
166
  return intersect_min
161
167
 
162
168
  # If we got here, there is an actual range.
163
- return VersionRange(intersect_min, intersect_max, intersect_include_min, intersect_include_max)
169
+ return VersionRange(
170
+ intersect_min, intersect_max, intersect_include_min, intersect_include_max
171
+ )
164
172
 
165
173
  def union(self, other: VersionConstraint) -> VersionConstraint:
166
174
  from .version import Version
@@ -170,19 +178,23 @@ class VersionRange(VersionConstraint):
170
178
  return self
171
179
 
172
180
  if other == self.min:
173
- return VersionRange(self.min, self.max, include_min=True, include_max=self.include_max)
181
+ return VersionRange(
182
+ self.min, self.max, include_min=True, include_max=self.include_max
183
+ )
174
184
 
175
185
  if other == self.max:
176
- return VersionRange(self.min, self.max, include_min=self.include_min, include_max=True)
186
+ return VersionRange(
187
+ self.min, self.max, include_min=self.include_min, include_max=True
188
+ )
177
189
 
178
190
  return VersionUnion.of(self, other)
179
191
 
180
192
  if isinstance(other, VersionRange):
181
193
  # If the two ranges don't overlap, we won't be able to create a single
182
194
  # VersionRange for both of them.
183
- edges_touch = (self.max == other.min and (self.include_max or other.include_min)) or (
184
- self.min == other.max and (self.include_min or other.include_max)
185
- )
195
+ edges_touch = (
196
+ self.max == other.min and (self.include_max or other.include_min)
197
+ ) or (self.min == other.max and (self.include_min or other.include_max))
186
198
 
187
199
  if not edges_touch and not self.allows_any(other):
188
200
  return VersionUnion.of(self, other)
@@ -245,14 +257,18 @@ class VersionRange(VersionConstraint):
245
257
  elif self.min == other.min:
246
258
  before = self.min
247
259
  else:
248
- before = VersionRange(self.min, other.min, self.include_min, not other.include_min)
260
+ before = VersionRange(
261
+ self.min, other.min, self.include_min, not other.include_min
262
+ )
249
263
 
250
264
  if not self.allows_higher(other):
251
265
  after = None
252
266
  elif self.max == other.max:
253
267
  after = self.max
254
268
  else:
255
- after = VersionRange(other.max, self.max, not other.include_max, self.include_max)
269
+ after = VersionRange(
270
+ other.max, self.max, not other.include_max, self.include_max
271
+ )
256
272
 
257
273
  if before is None and after is None:
258
274
  return EmptyConstraint()
@@ -345,7 +361,12 @@ class VersionRange(VersionConstraint):
345
361
  if self.max != other.min:
346
362
  return False
347
363
 
348
- return self.include_max and not other.include_min or not self.include_max and other.include_min
364
+ return (
365
+ self.include_max
366
+ and not other.include_min
367
+ or not self.include_max
368
+ and other.include_min
369
+ )
349
370
 
350
371
  def __eq__(self, other):
351
372
  if not isinstance(other, VersionRange):
@@ -60,7 +60,10 @@ class VersionUnion(VersionConstraint):
60
60
  merged = []
61
61
  for constraint in flattened:
62
62
  # Merge this constraint with the previous one, but only if they touch.
63
- if not merged or (not merged[-1].allows_any(constraint) and not merged[-1].is_adjacent_to(constraint)):
63
+ if not merged or (
64
+ not merged[-1].allows_any(constraint)
65
+ and not merged[-1].is_adjacent_to(constraint)
66
+ ):
64
67
  merged.append(constraint)
65
68
  else:
66
69
  merged[-1] = merged[-1].union(constraint)
@@ -8,6 +8,7 @@ we don't expect relative file paths to exist, for example. Note that the parsing
8
8
  is also intentionally more lenient - it is not our job to validate the requirements
9
9
  list.
10
10
  """
11
+
11
12
  import os
12
13
  import re
13
14
  from pathlib import Path
@@ -51,12 +52,18 @@ def _strip_fragment(urlparts):
51
52
 
52
53
  class DetectedRequirement:
53
54
  def __init__(
54
- self, name: str = None, url: str = None, requirement: Requirement = None, location_defined: Path = None
55
+ self,
56
+ name: str = None,
57
+ url: str = None,
58
+ requirement: Requirement = None,
59
+ location_defined: Path = None,
55
60
  ):
56
61
  if requirement is not None:
57
62
  self.name = requirement.name
58
63
  self.requirement = requirement
59
- self.version_specs = [(s.operator, s.version) for s in requirement.specifier]
64
+ self.version_specs = [
65
+ (s.operator, s.version) for s in requirement.specifier
66
+ ]
60
67
  self.url = None
61
68
  else:
62
69
  self.name = name
@@ -66,7 +73,9 @@ class DetectedRequirement:
66
73
  self.location_defined = location_defined
67
74
 
68
75
  def _format_specs(self) -> str:
69
- return ",".join(["%s%s" % (comp, version) for comp, version in self.version_specs])
76
+ return ",".join(
77
+ ["%s%s" % (comp, version) for comp, version in self.version_specs]
78
+ )
70
79
 
71
80
  def pip_format(self) -> str:
72
81
  if self.url:
@@ -95,7 +104,11 @@ class DetectedRequirement:
95
104
  return "<DetectedRequirement:%s>" % str(self)
96
105
 
97
106
  def __eq__(self, other):
98
- return self.name == other.name and self.url == other.url and self.version_specs == other.version_specs
107
+ return (
108
+ self.name == other.name
109
+ and self.url == other.url
110
+ and self.version_specs == other.version_specs
111
+ )
99
112
 
100
113
  def __gt__(self, other):
101
114
  return (self.name or "") > (other.name or "")
@@ -149,7 +162,9 @@ class DetectedRequirement:
149
162
  # this happens if the line is invalid
150
163
  return None
151
164
  else:
152
- return DetectedRequirement(requirement=req, location_defined=location_defined)
165
+ return DetectedRequirement(
166
+ requirement=req, location_defined=location_defined
167
+ )
153
168
 
154
169
  # otherwise, this is some kind of URL
155
170
  name = _parse_egg_name(url.fragment)
@@ -158,4 +173,6 @@ class DetectedRequirement:
158
173
  if vcs_scheme:
159
174
  url = "%s://%s" % (vcs_scheme, url)
160
175
 
161
- return DetectedRequirement(name=name, url=url, location_defined=location_defined)
176
+ return DetectedRequirement(
177
+ name=name, url=url, location_defined=location_defined
178
+ )
@@ -1,4 +1,3 @@
1
- import os
2
1
  import sys
3
2
  from pathlib import Path
4
3
  from typing import NoReturn
@@ -1,29 +1,30 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: requirements-detector
3
- Version: 1.3.2
3
+ Version: 1.5.0
4
4
  Summary: Python tool to find and list requirements of a Python project
5
- Home-page: https://github.com/landscapeio/requirements-detector
6
5
  License: MIT
6
+ License-File: LICENSE
7
7
  Keywords: python,requirements detector
8
8
  Author: Landscape.io
9
9
  Author-email: code@landscape.io
10
- Requires-Python: >=3.8,<4.0
10
+ Requires-Python: >=3.10,<4.0
11
11
  Classifier: Development Status :: 5 - Production/Stable
12
12
  Classifier: Environment :: Console
13
13
  Classifier: Intended Audience :: Developers
14
14
  Classifier: License :: OSI Approved :: MIT License
15
15
  Classifier: Operating System :: Unix
16
16
  Classifier: Programming Language :: Python :: 3
17
- Classifier: Programming Language :: Python :: 3.8
18
- Classifier: Programming Language :: Python :: 3.9
19
17
  Classifier: Programming Language :: Python :: 3.10
20
18
  Classifier: Programming Language :: Python :: 3.11
21
19
  Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Programming Language :: Python :: 3.14
22
22
  Classifier: Topic :: Software Development :: Quality Assurance
23
- Requires-Dist: astroid (>=3.0,<4.0)
23
+ Requires-Dist: astroid (>=4.0,<5.0)
24
24
  Requires-Dist: packaging (>=21.3)
25
25
  Requires-Dist: semver (>=3.0.0,<4.0.0)
26
- Requires-Dist: toml (>=0.10.2,<0.11.0) ; python_version < "3.11"
26
+ Requires-Dist: tomli (>=2.2.1,<3.0.0) ; python_version < "3.11"
27
+ Project-URL: Homepage, https://github.com/landscapeio/requirements-detector
27
28
  Description-Content-Type: text/markdown
28
29
 
29
30
  # Requirements Detector
@@ -45,7 +46,7 @@ When run from the root of a Python project, it will try to ascertain which libra
45
46
  It uses the following methods in order, in the root of the project:
46
47
 
47
48
  1. Parse `setup.py` (if this is successful, the remaining steps are skipped)
48
- 2. Parse `pyproject.yoml` (if a `tool.poetry.dependencies` section is found, the remaining steps are skipped)
49
+ 2. Parse `pyproject.toml` (if a `tool.poetry.dependencies` section is found, the remaining steps are skipped)
49
50
  3. Parse `requirements.txt` or `requirements.pip`
50
51
  4. Parse all `*.txt` and `*.pip` files inside a folder called `requirements`
51
52
  5. Parse all files in the root folder matching `*requirements*.txt` or `reqs.txt` (so for example, `pip_requirements.txt` would match, as would `requirements_common.txt`)
@@ -0,0 +1,23 @@
1
+ requirements_detector/__init__.py,sha256=biTfMJJ-e-rHIf7Iuz9lCtEFdoFkMs2sjY_4mDImdWs,506
2
+ requirements_detector/__main__.py,sha256=U6nHQrMwd11auXYgQsT0wqqqKyyGKXxHZ_SDaaOi878,59
3
+ requirements_detector/detect.py,sha256=eJGCqG8zflBQDhSVjfR7nOzLvfXD2GjqdeTUBAJovl4,6863
4
+ requirements_detector/exceptions.py,sha256=bTy7-ZvAXt-nucXKnaYIBxa5FngtFpD95FXswejc7Wk,103
5
+ requirements_detector/formatters.py,sha256=zcxR2n2Tp8z3DHkpokbjHorNqei5LZ9hprWZK0ZBVik,340
6
+ requirements_detector/handle_setup.py,sha256=K-tnZP9ioKO-zgVsDRaI9aBBZpMtQKLPkXyFWotohEk,3947
7
+ requirements_detector/poetry_semver/README.md,sha256=lU6DxV4Qk1qv_KIgOW1uEahx6PWDNhnIziF2izA49-k,261
8
+ requirements_detector/poetry_semver/__init__.py,sha256=ipZlDj5Kj2_g8jCvMtgPs3zmPO6b-MqptDIjXX14ogs,4711
9
+ requirements_detector/poetry_semver/empty_constraint.py,sha256=U_a8Obi0shKP4KoLDbXTGWzwha3J4HKwqEKWTNiLfuo,562
10
+ requirements_detector/poetry_semver/exceptions.py,sha256=M16rxsgcZfZUUiys8fKBPicD0AqCdP3kLlekm3_WkmA,46
11
+ requirements_detector/poetry_semver/patterns.py,sha256=-ndQHs9xj5OwLiH9DIi6ESvFFeJo6Nt2n0fsUQn_8ZU,755
12
+ requirements_detector/poetry_semver/version.py,sha256=z8yWoNx1LDYmstfpm0SINa_Vf72oCYqcepBl5m33gKM,11921
13
+ requirements_detector/poetry_semver/version_constraint.py,sha256=Vp5KW27IuXroKwcgBT7PZYxLaohoeCY3XMG4h0xvmK0,802
14
+ requirements_detector/poetry_semver/version_range.py,sha256=rR2nX44D5zirsrKtTFy9p-iyfAGYaX5cC1myNgIIpkM,13381
15
+ requirements_detector/poetry_semver/version_union.py,sha256=QPV9pRbjChCK79Ai3h5loaXf2BRxenJ0sst_AgI8PIg,7968
16
+ requirements_detector/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
+ requirements_detector/requirement.py,sha256=7F0otckLuk62WHLQmRdIDIsTRXNeYZmpSy7f0Kofcd0,5742
18
+ requirements_detector/run.py,sha256=v16Du3onkqrJLyVa5fSqq9FbEHaf1lfFhCylnxOGIU8,851
19
+ requirements_detector-1.5.0.dist-info/METADATA,sha256=hmbxqaaNVFXWjYtTBQTNm0heWZr7GH-hW40JEDehulc,3749
20
+ requirements_detector-1.5.0.dist-info/WHEEL,sha256=kJCRJT_g0adfAJzTx2GUMmS80rTJIVHRCfG0DQgLq3o,88
21
+ requirements_detector-1.5.0.dist-info/entry_points.txt,sha256=c1Pyo5EK49kT1g7Wac3vwl0bVs0QBZeQ8Zia1WVL1do,69
22
+ requirements_detector-1.5.0.dist-info/licenses/LICENSE,sha256=548oOCrCNqQty8Fsqqry522lXdxnBTqLyzqr38ct-cw,1040
23
+ requirements_detector-1.5.0.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 1.9.0
2
+ Generator: poetry-core 2.3.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -1,23 +0,0 @@
1
- requirements_detector/__init__.py,sha256=XbBRnMPYhG2Eq2IhZQAzOA9d-9OTYMXJwRiaZhLFAEY,269
2
- requirements_detector/__main__.py,sha256=U6nHQrMwd11auXYgQsT0wqqqKyyGKXxHZ_SDaaOi878,59
3
- requirements_detector/detect.py,sha256=E9jvDPxifmbf0VWhuzVZVkpx990ogrYmIqXLmBtDPxw,6867
4
- requirements_detector/exceptions.py,sha256=bTy7-ZvAXt-nucXKnaYIBxa5FngtFpD95FXswejc7Wk,103
5
- requirements_detector/formatters.py,sha256=zcxR2n2Tp8z3DHkpokbjHorNqei5LZ9hprWZK0ZBVik,340
6
- requirements_detector/handle_setup.py,sha256=K-tnZP9ioKO-zgVsDRaI9aBBZpMtQKLPkXyFWotohEk,3947
7
- requirements_detector/poetry_semver/README.md,sha256=lU6DxV4Qk1qv_KIgOW1uEahx6PWDNhnIziF2izA49-k,261
8
- requirements_detector/poetry_semver/__init__.py,sha256=nSyskyy880xTIhbvvwBuUg0Jmu6DepC27kTWFJO49Hk,4661
9
- requirements_detector/poetry_semver/empty_constraint.py,sha256=U_a8Obi0shKP4KoLDbXTGWzwha3J4HKwqEKWTNiLfuo,562
10
- requirements_detector/poetry_semver/exceptions.py,sha256=M16rxsgcZfZUUiys8fKBPicD0AqCdP3kLlekm3_WkmA,46
11
- requirements_detector/poetry_semver/patterns.py,sha256=ejPriORCt-gB5MoUh8aNo5bcBV5ZTM8joWXJ5WUwlEQ,741
12
- requirements_detector/poetry_semver/version.py,sha256=DzSr4OqxSPY0TgKR2PqNCjQRt_vdg0VtkYnuSuBSXyQ,11829
13
- requirements_detector/poetry_semver/version_constraint.py,sha256=Vp5KW27IuXroKwcgBT7PZYxLaohoeCY3XMG4h0xvmK0,802
14
- requirements_detector/poetry_semver/version_range.py,sha256=FN05z4gituRsah1AxDogx2w-KRQPkRV03jIXTSqCpmI,13055
15
- requirements_detector/poetry_semver/version_union.py,sha256=qBqU0ocnHkLVKxKYZXz_MwODVzyRbuIcD2nN1LFUqL4,7922
16
- requirements_detector/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
- requirements_detector/requirement.py,sha256=XuKspLsLY_sZOVKupXSjGFMxV1u3NHaTgjb-kRXbzFg,5548
18
- requirements_detector/run.py,sha256=8AjUalMAmCgK4HAsswSoxVG4N_uhYrvGMhZnfQUf8X8,861
19
- requirements_detector-1.3.2.dist-info/LICENSE,sha256=548oOCrCNqQty8Fsqqry522lXdxnBTqLyzqr38ct-cw,1040
20
- requirements_detector-1.3.2.dist-info/METADATA,sha256=5QbwMaMSgTDIzgIHcS3afg2Twqam64KiokLHopbOhu4,3713
21
- requirements_detector-1.3.2.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
22
- requirements_detector-1.3.2.dist-info/entry_points.txt,sha256=c1Pyo5EK49kT1g7Wac3vwl0bVs0QBZeQ8Zia1WVL1do,69
23
- requirements_detector-1.3.2.dist-info/RECORD,,