quickpub 4.1.2__tar.gz → 4.1.3__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.
Files changed (66) hide show
  1. {quickpub-4.1.2/quickpub.egg-info → quickpub-4.1.3}/PKG-INFO +17 -3
  2. {quickpub-4.1.2 → quickpub-4.1.3}/pyproject.toml +17 -3
  3. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/__init__.py +2 -1
  4. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/__main__.py +5 -7
  5. quickpub-4.1.3/quickpub/classifiers.py +138 -0
  6. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/implementations/constraint_enforcers/local_version_enforcer.py +27 -19
  7. {quickpub-4.1.2 → quickpub-4.1.3/quickpub.egg-info}/PKG-INFO +17 -3
  8. quickpub-4.1.2/quickpub/classifiers.py +0 -79
  9. {quickpub-4.1.2 → quickpub-4.1.3}/LICENSE +0 -0
  10. {quickpub-4.1.2 → quickpub-4.1.3}/MANIFEST.in +0 -0
  11. {quickpub-4.1.2 → quickpub-4.1.3}/README.md +0 -0
  12. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/dist_files.py +0 -0
  13. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/enforcers.py +0 -0
  14. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/files.py +0 -0
  15. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/logging_.py +0 -0
  16. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/package_manager_detection.py +0 -0
  17. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/proxy.py +0 -0
  18. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/py.typed +0 -0
  19. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/qa.py +0 -0
  20. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/__init__.py +0 -0
  21. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/build_schema.py +0 -0
  22. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/constraint_enforcer.py +0 -0
  23. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/implementations/__init__.py +0 -0
  24. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/implementations/build_schemas/__init__.py +0 -0
  25. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/implementations/build_schemas/setuptools_build_schema.py +0 -0
  26. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/implementations/build_schemas/uv_build_schema.py +0 -0
  27. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/implementations/constraint_enforcers/__init__.py +0 -0
  28. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/implementations/constraint_enforcers/license_enforcer.py +0 -0
  29. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/implementations/constraint_enforcers/pypi_remote_version_enforcer.py +0 -0
  30. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/implementations/constraint_enforcers/pypirc_enforcer.py +0 -0
  31. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/implementations/constraint_enforcers/readme_enforcer.py +0 -0
  32. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/implementations/package_managers/__init__.py +0 -0
  33. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/implementations/package_managers/installed_package_parser.py +0 -0
  34. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/implementations/package_managers/pip_package_manager.py +0 -0
  35. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/implementations/package_managers/uv_package_manager.py +0 -0
  36. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/implementations/python_providers/__init__.py +0 -0
  37. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/implementations/python_providers/conda_python_provider.py +0 -0
  38. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/implementations/python_providers/default_python_provider.py +0 -0
  39. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/implementations/python_providers/union_provider.py +0 -0
  40. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/implementations/python_providers/uv_python_provider.py +0 -0
  41. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/implementations/quality_assurance_runners/__init__.py +0 -0
  42. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/implementations/quality_assurance_runners/mypy_qa_runner.py +0 -0
  43. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/implementations/quality_assurance_runners/pylint_qa_runner.py +0 -0
  44. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/implementations/quality_assurance_runners/pytest_qa_runner.py +0 -0
  45. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/implementations/quality_assurance_runners/unittest_qa_runner.py +0 -0
  46. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/implementations/upload_targets/__init__.py +0 -0
  47. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/implementations/upload_targets/github_upload_target.py +0 -0
  48. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/implementations/upload_targets/pypirc_upload_target.py +0 -0
  49. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/package_manager.py +0 -0
  50. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/python_provider.py +0 -0
  51. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/quality_assurance_runner.py +0 -0
  52. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/quickpub_strategy.py +0 -0
  53. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/strategies/upload_target.py +0 -0
  54. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/structures/__init__.py +0 -0
  55. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/structures/bound.py +0 -0
  56. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/structures/dependency.py +0 -0
  57. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/structures/version.py +0 -0
  58. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/validators.py +0 -0
  59. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub/worker_pool.py +0 -0
  60. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub.egg-info/SOURCES.txt +0 -0
  61. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub.egg-info/dependency_links.txt +0 -0
  62. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub.egg-info/entry_points.txt +0 -0
  63. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub.egg-info/requires.txt +0 -0
  64. {quickpub-4.1.2 → quickpub-4.1.3}/quickpub.egg-info/top_level.txt +0 -0
  65. {quickpub-4.1.2 → quickpub-4.1.3}/setup.cfg +0 -0
  66. {quickpub-4.1.2 → quickpub-4.1.3}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: quickpub
3
- Version: 4.1.2
3
+ Version: 4.1.3
4
4
  Summary: A local CI/CD simulation tool that runs quality checks, tests, and validations locally before publishing Python packages, ensuring higher build pass rates and faster feedback loops
5
5
  Author-email: danielnachumdev <danielnachumdev@gmail.com>
6
6
  License: MIT License
@@ -26,10 +26,24 @@ License: MIT License
26
26
  SOFTWARE.
27
27
  Project-URL: Homepage, https://github.com/danielnachumdev/quickpub
28
28
  Project-URL: Bug Tracker, https://github.com/danielnachumdev/quickpub/issues
29
- Classifier: Development Status :: 3 - Alpha
29
+ Classifier: Development Status :: 5 - Production/Stable
30
+ Classifier: Environment :: Console
30
31
  Classifier: Intended Audience :: Developers
32
+ Classifier: License :: OSI Approved :: MIT License
33
+ Classifier: Operating System :: OS Independent
34
+ Classifier: Programming Language :: Python
31
35
  Classifier: Programming Language :: Python :: 3
32
- Classifier: Operating System :: Microsoft :: Windows
36
+ Classifier: Programming Language :: Python :: 3 :: Only
37
+ Classifier: Programming Language :: Python :: 3.8
38
+ Classifier: Programming Language :: Python :: 3.9
39
+ Classifier: Programming Language :: Python :: 3.10
40
+ Classifier: Programming Language :: Python :: 3.11
41
+ Classifier: Programming Language :: Python :: 3.12
42
+ Classifier: Programming Language :: Python :: 3.13
43
+ Classifier: Topic :: Software Development :: Build Tools
44
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
45
+ Classifier: Topic :: Software Development :: Quality Assurance
46
+ Classifier: Typing :: Typed
33
47
  Requires-Python: >=3.8.0
34
48
  Description-Content-Type: text/markdown
35
49
  License-File: LICENSE
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "quickpub"
7
- version = "4.1.2"
7
+ version = "4.1.3"
8
8
  authors = [
9
9
  { name = "danielnachumdev", email = "danielnachumdev@gmail.com" },
10
10
  ]
@@ -20,10 +20,24 @@ description = "A local CI/CD simulation tool that runs quality checks, tests, an
20
20
  readme = {file = "./README.md", content-type = "text/markdown"}
21
21
  requires-python = ">=3.8.0"
22
22
  classifiers = [
23
- "Development Status :: 3 - Alpha",
23
+ "Development Status :: 5 - Production/Stable",
24
+ "Environment :: Console",
24
25
  "Intended Audience :: Developers",
26
+ "License :: OSI Approved :: MIT License",
27
+ "Operating System :: OS Independent",
28
+ "Programming Language :: Python",
25
29
  "Programming Language :: Python :: 3",
26
- "Operating System :: Microsoft :: Windows"
30
+ "Programming Language :: Python :: 3 :: Only",
31
+ "Programming Language :: Python :: 3.8",
32
+ "Programming Language :: Python :: 3.9",
33
+ "Programming Language :: Python :: 3.10",
34
+ "Programming Language :: Python :: 3.11",
35
+ "Programming Language :: Python :: 3.12",
36
+ "Programming Language :: Python :: 3.13",
37
+ "Topic :: Software Development :: Build Tools",
38
+ "Topic :: Software Development :: Libraries :: Python Modules",
39
+ "Topic :: Software Development :: Quality Assurance",
40
+ "Typing :: Typed",
27
41
  ]
28
42
  [project.scripts]
29
43
  quickpub = "quickpub.__main__:main"
@@ -1,9 +1,10 @@
1
1
  from .structures import *
2
2
  from .strategies import *
3
+ from .classifiers import *
3
4
  from .enforcers import ExitEarlyError
4
5
  from .qa import SupportsProgress
5
6
  from .logging_ import set_log_level
6
7
  from .package_manager_detection import detect_package_manager, resolve_publish_environment
7
8
  from .__main__ import publish, main
8
9
 
9
- __version__ = "4.1.2"
10
+ __version__ = "4.1.3"
@@ -32,7 +32,7 @@ from .files import (
32
32
  add_version_to_init,
33
33
  update_pyproject_version,
34
34
  )
35
- from .classifiers import *
35
+ from .classifiers import Classifier, default_publish_classifiers
36
36
  from .qa import qa, SupportsProgress
37
37
  from .logging_ import setup_logging
38
38
  from .package_manager_detection import resolve_publish_environment
@@ -134,6 +134,7 @@ def _create_package_files(
134
134
  validated_dependencies: List[Dependency],
135
135
  min_python: Version,
136
136
  scripts: Optional[Dict[str, Callable]],
137
+ classifiers: Optional[List[Classifier]] = None,
137
138
  ) -> None:
138
139
  create_setup()
139
140
  create_toml(
@@ -148,12 +149,7 @@ def _create_package_files(
148
149
  homepage=homepage,
149
150
  keywords=keywords,
150
151
  dependencies=validated_dependencies,
151
- classifiers=[
152
- DevelopmentStatusClassifier.Alpha,
153
- IntendedAudienceClassifier.Developers,
154
- ProgrammingLanguageClassifier.Python3,
155
- OperatingSystemClassifier.MicrosoftWindows,
156
- ],
152
+ classifiers=classifiers or default_publish_classifiers(),
157
153
  min_python=min_python,
158
154
  scripts=scripts,
159
155
  )
@@ -206,6 +202,7 @@ def publish(
206
202
  keywords: Optional[List[str]] = None,
207
203
  explicit_src_folder_path: Optional[str] = None,
208
204
  scripts: Optional[Dict[str, Callable]] = None,
205
+ classifiers: Optional[List[Classifier]] = None,
209
206
  pbar: Optional[SupportsProgress] = None,
210
207
  demo: bool = False,
211
208
  generate_project_files: bool = True,
@@ -253,6 +250,7 @@ def publish(
253
250
  validated_deps,
254
251
  validated_min_python,
255
252
  scripts,
253
+ classifiers,
256
254
  )
257
255
  else:
258
256
  _sync_existing_package_metadata(
@@ -0,0 +1,138 @@
1
+ import logging
2
+ from enum import Enum
3
+ from typing import List
4
+
5
+ logger = logging.getLogger(__name__)
6
+
7
+ _DEVELOPMENT_STATUS_LABELS = {
8
+ 1: "Planning",
9
+ 2: "Pre-Alpha",
10
+ 3: "Alpha",
11
+ 4: "Beta",
12
+ 5: "Production/Stable",
13
+ 6: "Mature",
14
+ 7: "Inactive",
15
+ }
16
+
17
+
18
+ class Classifier(Enum):
19
+
20
+ def _str(self) -> str:
21
+ return str(self.value)
22
+
23
+ @staticmethod
24
+ def _split_name(name: str) -> str:
25
+ words = []
26
+ current_word = ""
27
+
28
+ for char in name:
29
+ if char.isupper():
30
+ if current_word:
31
+ words.append(current_word)
32
+ current_word = char
33
+ else:
34
+ current_word += char
35
+
36
+ if current_word:
37
+ words.append(current_word)
38
+
39
+ return " ".join(words[:-1])
40
+
41
+ def __str__(self) -> str:
42
+ name = Classifier._split_name(self.__class__.__qualname__)
43
+ value = self._str()
44
+ result = f"{name} :: {value}"
45
+ logger.debug("Classifier string representation: %s", result)
46
+ return result
47
+
48
+
49
+ class DevelopmentStatusClassifier(Classifier):
50
+ Planning = 1
51
+ PreAlpha = 2
52
+ Alpha = 3
53
+ Beta = 4
54
+ Production = 5
55
+ Stable = 5
56
+ Mature = 6
57
+ Inactive = 7
58
+
59
+ def _str(self) -> str:
60
+ return f"{self.value} - {_DEVELOPMENT_STATUS_LABELS[self.value]}"
61
+
62
+
63
+ class IntendedAudienceClassifier(Classifier):
64
+ CustomerService = "Customer Service"
65
+ Developers = "Developers"
66
+ Education = "Education"
67
+ EndUsersDesktop = "End Users/Desktop"
68
+ InformationTechnology = "Information Technology"
69
+ ScienceResearch = "Science/Research"
70
+ SystemAdministrators = "System Administrators"
71
+
72
+
73
+ class ProgrammingLanguageClassifier(Classifier):
74
+ Python = "Python"
75
+ Python3 = "Python :: 3"
76
+ Python3Only = "Python :: 3 :: Only"
77
+ Python38 = "Python :: 3.8"
78
+ Python39 = "Python :: 3.9"
79
+ Python310 = "Python :: 3.10"
80
+ Python311 = "Python :: 3.11"
81
+ Python312 = "Python :: 3.12"
82
+ Python313 = "Python :: 3.13"
83
+
84
+
85
+ class OperatingSystemClassifier(Classifier):
86
+ OSIndependent = "OS Independent"
87
+ MicrosoftWindows = "Microsoft :: Windows"
88
+ POSIX = "POSIX"
89
+ Linux = "POSIX :: Linux"
90
+ MacOS = "MacOS"
91
+ Unix = "Unix"
92
+
93
+
94
+ class LicenseClassifier(Classifier):
95
+ MIT = "OSI Approved :: MIT License"
96
+ Apache2 = "OSI Approved :: Apache Software License"
97
+ BSD = "OSI Approved :: BSD License"
98
+ GPLv3 = "OSI Approved :: GNU General Public License v3 (GPLv3)"
99
+
100
+
101
+ class TopicClassifier(Classifier):
102
+ SoftwareDevelopment = "Software Development"
103
+ BuildTools = "Software Development :: Build Tools"
104
+ Libraries = "Software Development :: Libraries"
105
+ PythonModules = "Software Development :: Libraries :: Python Modules"
106
+ QualityAssurance = "Software Development :: Quality Assurance"
107
+ Testing = "Software Development :: Testing"
108
+
109
+
110
+ class TypingClassifier(Classifier):
111
+ Typed = "Typed"
112
+
113
+
114
+ class EnvironmentClassifier(Classifier):
115
+ Console = "Console"
116
+
117
+
118
+ def default_publish_classifiers() -> List[Classifier]:
119
+ return [
120
+ DevelopmentStatusClassifier.Alpha,
121
+ IntendedAudienceClassifier.Developers,
122
+ ProgrammingLanguageClassifier.Python3,
123
+ OperatingSystemClassifier.OSIndependent,
124
+ ]
125
+
126
+
127
+ __all__ = [
128
+ "Classifier",
129
+ "DevelopmentStatusClassifier",
130
+ "IntendedAudienceClassifier",
131
+ "ProgrammingLanguageClassifier",
132
+ "OperatingSystemClassifier",
133
+ "LicenseClassifier",
134
+ "TopicClassifier",
135
+ "TypingClassifier",
136
+ "EnvironmentClassifier",
137
+ "default_publish_classifiers",
138
+ ]
@@ -1,7 +1,7 @@
1
1
  import logging
2
- from typing import Any
2
+ from typing import Any, Optional
3
3
 
4
- from danielutils import directory_exists, get_files, get_python_version
4
+ from danielutils import directory_exists, get_files
5
5
 
6
6
  from quickpub import Version
7
7
  from ...constraint_enforcer import ConstraintEnforcer
@@ -9,19 +9,20 @@ from ...constraint_enforcer import ConstraintEnforcer
9
9
  logger = logging.getLogger(__name__)
10
10
 
11
11
 
12
- def _remove_suffix(s: str, suffix: str) -> str:
13
- if get_python_version() >= (3, 9):
14
- return s.removesuffix(suffix) # type:ignore
15
- return _remove_prefix(s[::-1], suffix[::-1])[::-1]
16
-
17
-
18
- def _remove_prefix(s: str, prefix: str) -> str:
19
- if get_python_version() >= (3, 9):
20
- return s.removeprefix(prefix) # type:ignore
21
-
22
- if s.startswith(prefix):
23
- return s[len(prefix) :]
24
- return s
12
+ def _version_from_dist_filename(name: str, filename: str) -> Optional[Version]:
13
+ prefix = f"{name}-"
14
+ if not filename.startswith(prefix):
15
+ return None
16
+ if filename.endswith(".tar.gz"):
17
+ version_str = filename[len(prefix) : -len(".tar.gz")]
18
+ elif filename.endswith(".whl"):
19
+ version_str = filename[len(prefix) : -len(".whl")].split("-")[0]
20
+ else:
21
+ return None
22
+ try:
23
+ return Version.from_str(version_str)
24
+ except ValueError:
25
+ return None
25
26
 
26
27
 
27
28
  class LocalVersionEnforcer(ConstraintEnforcer):
@@ -49,10 +50,17 @@ class LocalVersionEnforcer(ConstraintEnforcer):
49
50
  return
50
51
 
51
52
  max_local_version = Version(0, 0, 0)
52
- for d in prev_builds:
53
- d = _remove_suffix(_remove_prefix(d, f"{name}-"), ".tar.gz")
54
- v: Version = Version.from_str(d)
55
- max_local_version = max(max_local_version, v)
53
+ found_artifact = False
54
+ for filename in prev_builds:
55
+ parsed = _version_from_dist_filename(name, filename)
56
+ if parsed is None:
57
+ continue
58
+ found_artifact = True
59
+ max_local_version = max(max_local_version, parsed)
60
+
61
+ if not found_artifact:
62
+ logger.info("No sdist or wheel artifacts found in dist directory")
63
+ return
56
64
 
57
65
  if version <= max_local_version:
58
66
  logger.error(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: quickpub
3
- Version: 4.1.2
3
+ Version: 4.1.3
4
4
  Summary: A local CI/CD simulation tool that runs quality checks, tests, and validations locally before publishing Python packages, ensuring higher build pass rates and faster feedback loops
5
5
  Author-email: danielnachumdev <danielnachumdev@gmail.com>
6
6
  License: MIT License
@@ -26,10 +26,24 @@ License: MIT License
26
26
  SOFTWARE.
27
27
  Project-URL: Homepage, https://github.com/danielnachumdev/quickpub
28
28
  Project-URL: Bug Tracker, https://github.com/danielnachumdev/quickpub/issues
29
- Classifier: Development Status :: 3 - Alpha
29
+ Classifier: Development Status :: 5 - Production/Stable
30
+ Classifier: Environment :: Console
30
31
  Classifier: Intended Audience :: Developers
32
+ Classifier: License :: OSI Approved :: MIT License
33
+ Classifier: Operating System :: OS Independent
34
+ Classifier: Programming Language :: Python
31
35
  Classifier: Programming Language :: Python :: 3
32
- Classifier: Operating System :: Microsoft :: Windows
36
+ Classifier: Programming Language :: Python :: 3 :: Only
37
+ Classifier: Programming Language :: Python :: 3.8
38
+ Classifier: Programming Language :: Python :: 3.9
39
+ Classifier: Programming Language :: Python :: 3.10
40
+ Classifier: Programming Language :: Python :: 3.11
41
+ Classifier: Programming Language :: Python :: 3.12
42
+ Classifier: Programming Language :: Python :: 3.13
43
+ Classifier: Topic :: Software Development :: Build Tools
44
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
45
+ Classifier: Topic :: Software Development :: Quality Assurance
46
+ Classifier: Typing :: Typed
33
47
  Requires-Python: >=3.8.0
34
48
  Description-Content-Type: text/markdown
35
49
  License-File: LICENSE
@@ -1,79 +0,0 @@
1
- import logging
2
- from enum import Enum
3
-
4
- logger = logging.getLogger(__name__)
5
-
6
-
7
- class Classifier(Enum):
8
-
9
- def _str(self) -> str:
10
- return str(self.value)
11
-
12
- @staticmethod
13
- def _split_name(name: str) -> str:
14
- words = []
15
- current_word = ""
16
-
17
- for char in name:
18
- if char.isupper():
19
- if current_word:
20
- words.append(current_word)
21
- current_word = char
22
- else:
23
- current_word += char
24
-
25
- if current_word:
26
- words.append(current_word)
27
-
28
- return " ".join(words[:-1])
29
-
30
- def __str__(self) -> str:
31
- name = Classifier._split_name(self.__class__.__qualname__)
32
- value = self._str()
33
- result = f"{name} :: {value}"
34
- logger.debug("Classifier string representation: %s", result)
35
- return result
36
-
37
-
38
- class DevelopmentStatusClassifier(Classifier):
39
- """Classifier for package development status. Use values like Alpha, Beta, Production, etc."""
40
-
41
- Planning = 1
42
- PreAlpha = 2
43
- Alpha = 3
44
- Beta = 4
45
- Production = 5
46
- Stable = 5
47
- Mature = 6
48
- Inactive = 7
49
-
50
- def _str(self) -> str:
51
- return f"{self.value} - {self.name}"
52
-
53
-
54
- class IntendedAudienceClassifier(Classifier):
55
- """Classifier for intended audience of the package."""
56
-
57
- CustomerService = "CustomerService"
58
- Developers = "Developers"
59
-
60
-
61
- class ProgrammingLanguageClassifier(Classifier):
62
- """Classifier for programming languages supported by the package."""
63
-
64
- Python3 = "Python :: 3"
65
-
66
-
67
- class OperatingSystemClassifier(Classifier):
68
- """Classifier for operating systems supported by the package."""
69
-
70
- MicrosoftWindows = "Microsoft :: Windows"
71
-
72
-
73
- __all__ = [
74
- "Classifier",
75
- "DevelopmentStatusClassifier",
76
- "IntendedAudienceClassifier",
77
- "ProgrammingLanguageClassifier",
78
- "OperatingSystemClassifier",
79
- ]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes