gitlabform 5.2.0__tar.gz → 5.3.0__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 (85) hide show
  1. {gitlabform-5.2.0 → gitlabform-5.3.0}/PKG-INFO +1 -1
  2. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/__init__.py +13 -2
  3. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/gitlab/__init__.py +1 -0
  4. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/lists/__init__.py +1 -0
  5. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/lists/projects.py +41 -14
  6. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform.egg-info/PKG-INFO +1 -1
  7. {gitlabform-5.2.0 → gitlabform-5.3.0}/pyproject.toml +3 -2
  8. {gitlabform-5.2.0 → gitlabform-5.3.0}/LICENSE +0 -0
  9. {gitlabform-5.2.0 → gitlabform-5.3.0}/README.md +0 -0
  10. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/configuration/__init__.py +0 -0
  11. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/configuration/common.py +0 -0
  12. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/configuration/core.py +0 -0
  13. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/configuration/groups.py +0 -0
  14. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/configuration/projects.py +0 -0
  15. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/configuration/transform.py +0 -0
  16. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/constants.py +0 -0
  17. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/gitlab/commits.py +0 -0
  18. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/gitlab/core.py +0 -0
  19. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/gitlab/group_badges.py +0 -0
  20. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/gitlab/group_ldap_links.py +0 -0
  21. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/gitlab/groups.py +0 -0
  22. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/gitlab/merge_requests.py +0 -0
  23. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/gitlab/pipelines.py +0 -0
  24. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/gitlab/project_badges.py +0 -0
  25. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/gitlab/project_deploy_keys.py +0 -0
  26. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/gitlab/project_merge_requests_approvals.py +0 -0
  27. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/gitlab/project_protected_environments.py +0 -0
  28. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/gitlab/projects.py +0 -0
  29. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/gitlab/python_gitlab.py +0 -0
  30. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/gitlab/variables.py +0 -0
  31. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/lists/filter.py +0 -0
  32. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/lists/groups.py +0 -0
  33. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/output.py +0 -0
  34. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/__init__.py +0 -0
  35. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/abstract_processor.py +0 -0
  36. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/application/__init__.py +0 -0
  37. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/application/application_settings_processor.py +0 -0
  38. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/defining_keys.py +0 -0
  39. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/group/__init__.py +0 -0
  40. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/group/group_badges_processor.py +0 -0
  41. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/group/group_hooks_processor.py +0 -0
  42. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/group/group_labels_processor.py +0 -0
  43. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/group/group_ldap_links_processor.py +0 -0
  44. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/group/group_members_processor.py +0 -0
  45. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/group/group_push_rules_processor.py +0 -0
  46. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/group/group_saml_links_processor.py +0 -0
  47. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/group/group_settings_processor.py +0 -0
  48. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/group/group_variables_processor.py +0 -0
  49. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/multiple_entities_processor.py +0 -0
  50. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/project/__init__.py +0 -0
  51. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/project/badges_processor.py +0 -0
  52. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/project/branches_processor.py +0 -0
  53. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/project/deploy_keys_processor.py +0 -0
  54. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/project/files_processor.py +0 -0
  55. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/project/hooks_processor.py +0 -0
  56. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/project/integrations_processor.py +0 -0
  57. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/project/job_token_scope_processor.py +0 -0
  58. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/project/members_processor.py +0 -0
  59. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/project/merge_requests_approval_rules.py +0 -0
  60. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/project/merge_requests_approvals.py +0 -0
  61. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/project/project_labels_processor.py +0 -0
  62. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/project/project_processor.py +0 -0
  63. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/project/project_push_rules_processor.py +0 -0
  64. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/project/project_security_settings.py +0 -0
  65. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/project/project_settings_processor.py +0 -0
  66. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/project/project_variables_processor.py +0 -0
  67. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/project/remote_mirrors_processor.py +0 -0
  68. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/project/resource_groups_processor.py +0 -0
  69. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/project/schedules_processor.py +0 -0
  70. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/project/tags_processor.py +0 -0
  71. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/shared/__init__.py +0 -0
  72. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/shared/protected_environments_processor.py +0 -0
  73. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/util/__init__.py +0 -0
  74. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/util/decorators.py +0 -0
  75. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/util/difference_logger.py +0 -0
  76. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/util/labels_processor.py +0 -0
  77. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/processors/util/variables_processor.py +0 -0
  78. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/run.py +0 -0
  79. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform/util.py +0 -0
  80. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform.egg-info/SOURCES.txt +0 -0
  81. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform.egg-info/dependency_links.txt +0 -0
  82. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform.egg-info/entry_points.txt +0 -0
  83. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform.egg-info/requires.txt +0 -0
  84. {gitlabform-5.2.0 → gitlabform-5.3.0}/gitlabform.egg-info/top_level.txt +0 -0
  85. {gitlabform-5.2.0 → gitlabform-5.3.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gitlabform
3
- Version: 5.2.0
3
+ Version: 5.3.0
4
4
  Summary: 🏗 Specialized configuration as a code tool for GitLab projects, groups and more using hierarchical configuration written in YAML
5
5
  Author: Greg Dubicki and Contributors
6
6
  Project-URL: Homepage, https://gitlabform.github.io/gitlabform/
@@ -40,6 +40,7 @@ class GitLabForm:
40
40
  def __init__(
41
41
  self,
42
42
  include_archived_projects=True,
43
+ include_projects_scheduled_for_deletion=True,
43
44
  target=None,
44
45
  config_string=None,
45
46
  noop=False,
@@ -61,6 +62,7 @@ class GitLabForm:
61
62
  self.output_file = output_file
62
63
  self.skip_version_check = True
63
64
  self.include_archived_projects = include_archived_projects
65
+ self.include_projects_scheduled_for_deletion = include_projects_scheduled_for_deletion
64
66
  self.just_show_version = False
65
67
  self.terminate_after_error = True
66
68
  self.only_sections = "all"
@@ -84,6 +86,7 @@ class GitLabForm:
84
86
  self.output_file,
85
87
  self.skip_version_check,
86
88
  self.include_archived_projects,
89
+ self.include_projects_scheduled_for_deletion,
87
90
  self.just_show_version,
88
91
  self.terminate_after_error,
89
92
  self.only_sections,
@@ -115,6 +118,7 @@ class GitLabForm:
115
118
  self.gitlab,
116
119
  self.configuration,
117
120
  self.include_archived_projects,
121
+ self.include_projects_scheduled_for_deletion,
118
122
  self.recurse_subgroups,
119
123
  )
120
124
 
@@ -223,6 +227,13 @@ class GitLabForm:
223
227
  help="Includes processing projects that are archived",
224
228
  )
225
229
 
230
+ parser.add_argument(
231
+ "--include-projects-scheduled-for-deletion",
232
+ dest="include_projects_scheduled_for_deletion",
233
+ action="store_true",
234
+ help="Includes processing projects that are scheduled for deletion",
235
+ )
236
+
226
237
  parser.add_argument(
227
238
  "-t",
228
239
  "--terminate",
@@ -304,6 +315,7 @@ class GitLabForm:
304
315
  args.output_file,
305
316
  args.skip_version_check,
306
317
  args.include_archived_projects,
318
+ args.include_projects_scheduled_for_deletion,
307
319
  args.just_show_version,
308
320
  args.terminate_after_error,
309
321
  args.only_sections,
@@ -321,15 +333,14 @@ class GitLabForm:
321
333
 
322
334
  :param tests: True if we are running in tests mode
323
335
  """
336
+ rich_tracebacks = False
324
337
  if tests or self.debug:
325
338
  level = logging.DEBUG
326
339
  rich_tracebacks = True
327
340
  elif self.verbose:
328
341
  level = logging.INFO
329
- rich_tracebacks = False
330
342
  else:
331
343
  level = logging.WARNING
332
- rich_tracebacks = False
333
344
 
334
345
  logging.basicConfig(
335
346
  level=level, format="%(message)s", datefmt="[%X]", handlers=[RichHandler(rich_tracebacks=rich_tracebacks)]
@@ -1,5 +1,6 @@
1
1
  import enum
2
2
  import inspect
3
+ import logging
3
4
 
4
5
  from typing import List
5
6
 
@@ -13,6 +13,7 @@ from enum import Enum
13
13
  @enum.unique
14
14
  class OmissionReason(Enum):
15
15
  ARCHIVED = "archived"
16
+ SCHEDULED_FOR_DELETION = "scheduled for deletion"
16
17
  EMPTY = "empty effective config"
17
18
  SKIPPED = "skipped"
18
19
 
@@ -19,9 +19,17 @@ class ProjectsProvider(GroupsProvider):
19
19
  Because the projects depend on groups requested, this class inherits GroupsProvider.
20
20
  """
21
21
 
22
- def __init__(self, gitlab, configuration, include_archived_projects, recurse_subgroups):
22
+ def __init__(
23
+ self,
24
+ gitlab,
25
+ configuration,
26
+ include_archived_projects,
27
+ include_projects_scheduled_for_deletion,
28
+ recurse_subgroups,
29
+ ):
23
30
  super().__init__(gitlab, configuration, recurse_subgroups)
24
31
  self.include_archived_projects = include_archived_projects
32
+ self.include_projects_scheduled_for_deletion = include_projects_scheduled_for_deletion
25
33
 
26
34
  def get_projects(self, target: str) -> Projects:
27
35
  """
@@ -70,9 +78,11 @@ class ProjectsProvider(GroupsProvider):
70
78
  (
71
79
  projects_from_groups,
72
80
  archived_projects_from_groups,
73
- ) = self._get_all_and_archived_projects_from_groups(groups.get_effective())
81
+ scheduled_for_deletion_projects_from_groups,
82
+ ) = self._get_all_and_omitted_projects_from_groups(groups.get_effective())
74
83
  projects.add_requested(projects_from_groups)
75
84
  projects.add_omitted(OmissionReason.ARCHIVED, archived_projects_from_groups)
85
+ projects.add_omitted(OmissionReason.SCHEDULED_FOR_DELETION, scheduled_for_deletion_projects_from_groups)
76
86
 
77
87
  projects_from_configuration = self.configuration.get_projects()
78
88
 
@@ -84,17 +94,22 @@ class ProjectsProvider(GroupsProvider):
84
94
  if target == "ALL_DEFINED":
85
95
  # in this case we also need to get the list of projects explicitly
86
96
  # defined in the configuration, but we don't need to re-check for
87
- # being archived projects that we already got from groups
97
+ # being archived or scheduled for deletion projects that we already got from groups
88
98
 
89
- archived_projects_from_configuration_not_from_groups = (
90
- self._verify_if_projects_exist_and_get_archived_projects(projects_from_configuration_not_from_groups)
91
- )
99
+ (
100
+ archived_projects_from_configuration_not_from_groups,
101
+ scheduled_for_deletion_projects_from_configuration_not_from_groups,
102
+ ) = self._verify_if_projects_exist_and_get_omitted_projects(projects_from_configuration_not_from_groups)
92
103
 
93
104
  projects.add_requested(projects_from_configuration_not_from_groups)
94
105
  projects.add_omitted(
95
106
  OmissionReason.ARCHIVED,
96
107
  archived_projects_from_configuration_not_from_groups,
97
108
  )
109
+ projects.add_omitted(
110
+ OmissionReason.SCHEDULED_FOR_DELETION,
111
+ scheduled_for_deletion_projects_from_configuration_not_from_groups,
112
+ )
98
113
  else:
99
114
  # in all other cases, we also need to look for projects in the config
100
115
  # that are being transferred to a different namespace
@@ -117,20 +132,27 @@ class ProjectsProvider(GroupsProvider):
117
132
 
118
133
  return projects
119
134
 
120
- def _verify_if_projects_exist_and_get_archived_projects(self, projects: list) -> list:
135
+ def _verify_if_projects_exist_and_get_omitted_projects(self, projects: list) -> Tuple[list, list]:
121
136
  archived = []
137
+ scheduled_for_deletion = []
122
138
  for project in projects:
123
139
  try:
124
140
  project_object = self.gitlab.get_project_case_insensitive(project)
125
- if project_object["archived"]:
141
+ if not self.include_archived_projects and project_object["archived"]:
126
142
  archived.append(project_object["path_with_namespace"])
143
+ if not self.include_projects_scheduled_for_deletion and project_object.get("marked_for_deletion_on"):
144
+ scheduled_for_deletion.append(project_object["path_with_namespace"])
127
145
  except NotFoundException:
128
146
  debug("Could not find '%s'", project)
129
147
  if project_transfer_source := self._get_project_transfer_source_from_config(project):
130
148
  source_project = self._find_project_transfer_source_in_gitlab(project_transfer_source)
131
149
  if source_project:
132
- if source_project["archived"]:
150
+ if not self.include_archived_projects and source_project["archived"]:
133
151
  archived.append(project)
152
+ if not self.include_projects_scheduled_for_deletion and source_project.get(
153
+ "marked_for_deletion_on"
154
+ ):
155
+ scheduled_for_deletion.append(project)
134
156
  else:
135
157
  critical(
136
158
  f"""Configuration contains project {project} to be transferred from {project_transfer_source}
@@ -143,25 +165,30 @@ class ProjectsProvider(GroupsProvider):
143
165
  )
144
166
  sys.exit(EXIT_INVALID_INPUT)
145
167
 
146
- return archived
168
+ return archived, scheduled_for_deletion
147
169
 
148
- def _get_all_and_archived_projects_from_groups(self, groups: list) -> Tuple[list, list]:
170
+ def _get_all_and_omitted_projects_from_groups(self, groups: list) -> Tuple[list, list, list]:
149
171
  all = []
150
172
  archived = []
173
+ scheduled_for_deletion = []
151
174
  for group in groups:
152
- if self.include_archived_projects:
175
+ if self.include_archived_projects and self.include_projects_scheduled_for_deletion:
153
176
  all += self.gitlab.get_projects(group, include_archived=True)
154
177
  else:
155
178
  project_objects = self.gitlab.get_projects(group, include_archived=True, only_names=False)
156
179
  for project_object in project_objects:
157
180
  project = project_object["path_with_namespace"]
158
181
  all.append(project)
159
- if project_object["archived"]:
182
+ if not self.include_archived_projects and project_object["archived"]:
160
183
  archived.append(project)
184
+ if not self.include_projects_scheduled_for_deletion and project_object.get(
185
+ "marked_for_deletion_on"
186
+ ):
187
+ scheduled_for_deletion.append(project)
161
188
 
162
189
  # deduplicate as we may have a group X and its subgroup X/Y in the groups list so the effective projects
163
190
  # may occur more than once
164
- return list(set(all)), list(set(archived))
191
+ return list(set(all)), list(set(archived)), list(set(scheduled_for_deletion))
165
192
 
166
193
  def _get_skipped_projects(self, projects: list) -> list:
167
194
  skipped = []
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gitlabform
3
- Version: 5.2.0
3
+ Version: 5.3.0
4
4
  Summary: 🏗 Specialized configuration as a code tool for GitLab projects, groups and more using hierarchical configuration written in YAML
5
5
  Author: Greg Dubicki and Contributors
6
6
  Project-URL: Homepage, https://gitlabform.github.io/gitlabform/
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "gitlabform"
7
- version = "5.2.0"
7
+ version = "5.3.0"
8
8
  authors = [{ name = "Greg Dubicki and Contributors" }]
9
9
  description = "🏗 Specialized configuration as a code tool for GitLab projects, groups and more using hierarchical configuration written in YAML"
10
10
  keywords = ["cli", "yaml", "gitlab", "configuration-as-code"]
@@ -79,7 +79,8 @@ exclude = ["tests*"]
79
79
  [tool.pytest.ini_options]
80
80
  filterwarnings = ["ignore::DeprecationWarning"]
81
81
  markers = [
82
- "requires_license: marks tests which require GitLab paid (Premium/Ultimate) license '-m \"not requires_license\"')",
82
+ "requires_license: marks tests which require GitLab paid (Premium) license",
83
+ "requires_ultimate_license: marks tests which require GitLab paid (Ultimate) license)",
83
84
  "ce: marks tests which need to be run against GitLab CE image as well as the standard EE image"
84
85
  ]
85
86
 
File without changes
File without changes
File without changes
File without changes