gitlabform 0.0.540a0__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.
Files changed (79) hide show
  1. gitlabform/__init__.py +719 -0
  2. gitlabform/configuration/__init__.py +12 -0
  3. gitlabform/configuration/common.py +19 -0
  4. gitlabform/configuration/core.py +323 -0
  5. gitlabform/configuration/groups.py +127 -0
  6. gitlabform/configuration/projects.py +73 -0
  7. gitlabform/configuration/transform.py +259 -0
  8. gitlabform/constants.py +7 -0
  9. gitlabform/gitlab/__init__.py +108 -0
  10. gitlabform/gitlab/commits.py +39 -0
  11. gitlabform/gitlab/core.py +334 -0
  12. gitlabform/gitlab/group_badges.py +50 -0
  13. gitlabform/gitlab/group_ldap_links.py +40 -0
  14. gitlabform/gitlab/groups.py +96 -0
  15. gitlabform/gitlab/merge_requests.py +57 -0
  16. gitlabform/gitlab/pipelines.py +23 -0
  17. gitlabform/gitlab/project_badges.py +52 -0
  18. gitlabform/gitlab/project_deploy_keys.py +102 -0
  19. gitlabform/gitlab/project_merge_requests_approvals.py +94 -0
  20. gitlabform/gitlab/project_protected_environments.py +37 -0
  21. gitlabform/gitlab/projects.py +151 -0
  22. gitlabform/gitlab/python_gitlab.py +251 -0
  23. gitlabform/gitlab/variables.py +47 -0
  24. gitlabform/lists/__init__.py +62 -0
  25. gitlabform/lists/filter.py +99 -0
  26. gitlabform/lists/groups.py +87 -0
  27. gitlabform/lists/projects.py +239 -0
  28. gitlabform/output.py +46 -0
  29. gitlabform/processors/__init__.py +43 -0
  30. gitlabform/processors/abstract_processor.py +187 -0
  31. gitlabform/processors/application/__init__.py +17 -0
  32. gitlabform/processors/application/application_settings_processor.py +39 -0
  33. gitlabform/processors/defining_keys.py +152 -0
  34. gitlabform/processors/group/__init__.py +48 -0
  35. gitlabform/processors/group/group_badges_processor.py +17 -0
  36. gitlabform/processors/group/group_hooks_processor.py +75 -0
  37. gitlabform/processors/group/group_labels_processor.py +28 -0
  38. gitlabform/processors/group/group_ldap_links_processor.py +16 -0
  39. gitlabform/processors/group/group_members_processor.py +287 -0
  40. gitlabform/processors/group/group_push_rules_processor.py +44 -0
  41. gitlabform/processors/group/group_saml_links_processor.py +65 -0
  42. gitlabform/processors/group/group_settings_processor.py +90 -0
  43. gitlabform/processors/group/group_variables_processor.py +26 -0
  44. gitlabform/processors/multiple_entities_processor.py +171 -0
  45. gitlabform/processors/project/__init__.py +80 -0
  46. gitlabform/processors/project/badges_processor.py +17 -0
  47. gitlabform/processors/project/branches_processor.py +514 -0
  48. gitlabform/processors/project/deploy_keys_processor.py +18 -0
  49. gitlabform/processors/project/files_processor.py +301 -0
  50. gitlabform/processors/project/hooks_processor.py +64 -0
  51. gitlabform/processors/project/integrations_processor.py +33 -0
  52. gitlabform/processors/project/job_token_scope_processor.py +216 -0
  53. gitlabform/processors/project/members_processor.py +204 -0
  54. gitlabform/processors/project/merge_requests_approval_rules.py +17 -0
  55. gitlabform/processors/project/merge_requests_approvals.py +59 -0
  56. gitlabform/processors/project/project_labels_processor.py +27 -0
  57. gitlabform/processors/project/project_processor.py +62 -0
  58. gitlabform/processors/project/project_push_rules_processor.py +52 -0
  59. gitlabform/processors/project/project_security_settings.py +66 -0
  60. gitlabform/processors/project/project_settings_processor.py +239 -0
  61. gitlabform/processors/project/project_variables_processor.py +94 -0
  62. gitlabform/processors/project/remote_mirrors_processor.py +278 -0
  63. gitlabform/processors/project/resource_groups_processor.py +48 -0
  64. gitlabform/processors/project/schedules_processor.py +208 -0
  65. gitlabform/processors/project/tags_processor.py +108 -0
  66. gitlabform/processors/shared/__init__.py +0 -0
  67. gitlabform/processors/shared/protected_environments_processor.py +20 -0
  68. gitlabform/processors/util/__init__.py +0 -0
  69. gitlabform/processors/util/decorators.py +44 -0
  70. gitlabform/processors/util/difference_logger.py +70 -0
  71. gitlabform/processors/util/labels_processor.py +120 -0
  72. gitlabform/processors/util/variables_processor.py +143 -0
  73. gitlabform/run.py +9 -0
  74. gitlabform/util.py +7 -0
  75. gitlabform-0.0.540a0.dist-info/METADATA +54 -0
  76. gitlabform-0.0.540a0.dist-info/RECORD +79 -0
  77. gitlabform-0.0.540a0.dist-info/WHEEL +4 -0
  78. gitlabform-0.0.540a0.dist-info/entry_points.txt +9 -0
  79. gitlabform-0.0.540a0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,143 @@
1
+ from logging import warning, info
2
+ from typing import Dict, List, Any, Set, Tuple, Callable, cast, overload
3
+
4
+ from gitlab.v4.objects import Group, Project, GroupVariable, ProjectVariable
5
+
6
+
7
+ class VariablesProcessor:
8
+ def __init__(self, needs_update: Callable):
9
+ self.needs_update: Callable = needs_update
10
+
11
+ @overload
12
+ def get_variables_from_gitlab(self, group_or_project: Group) -> List[GroupVariable]: ...
13
+
14
+ @overload
15
+ def get_variables_from_gitlab(self, group_or_project: Project) -> List[ProjectVariable]: ...
16
+
17
+ def get_variables_from_gitlab(
18
+ self, group_or_project: Group | Project
19
+ ) -> List[GroupVariable] | List[ProjectVariable]:
20
+ """Get variables as a properly typed list."""
21
+ variables = group_or_project.variables.list(get_all=True)
22
+
23
+ if isinstance(group_or_project, Project):
24
+ return [cast(ProjectVariable, var) for var in variables] # Return type is List[ProjectVariable]
25
+ else:
26
+ return [cast(GroupVariable, var) for var in variables] # Return type is List[GroupVariable]
27
+
28
+ def _variables_match(self, existing_var: Dict[str, Any], config_var: Dict[str, Any]) -> bool:
29
+ """Compare if existing variable matches the configured attributes."""
30
+ # Ignore internal GitLab attributes and delete flag
31
+ ignore_keys = {"id", "_links", "delete"}
32
+
33
+ # Check if all configured attributes match existing variable
34
+ return all(existing_var.get(key) == value for key, value in config_var.items() if key not in ignore_keys)
35
+
36
+ def process_variables(
37
+ self,
38
+ group_or_project: Group | Project,
39
+ configured_variables: Dict,
40
+ enforce: bool,
41
+ ) -> None:
42
+ """Process variables configuration for a project or group."""
43
+ try:
44
+ # Get existing variables
45
+ existing_variables = self.get_variables_from_gitlab(group_or_project)
46
+ info(f"Found {len(existing_variables)} existing variables in {group_or_project.name}")
47
+
48
+ # Process configured variables
49
+ processed_vars = set()
50
+ if configured_variables:
51
+ info(f"Processing {len(configured_variables)} variables from configuration")
52
+ for var_config in configured_variables.values():
53
+ self._handle_variable(group_or_project, var_config, existing_variables)
54
+ processed_vars.add((var_config["key"], var_config.get("environment_scope", "*")))
55
+
56
+ # Handle enforce mode
57
+ if enforce and existing_variables:
58
+ self._handle_enforce_mode(group_or_project, existing_variables, processed_vars)
59
+
60
+ except Exception as err:
61
+ warning(f"Failed to process variables for {group_or_project.name}: {str(err)}")
62
+ raise
63
+
64
+ def _handle_variable(
65
+ self,
66
+ group_or_project: Group | Project,
67
+ var_config: Dict[str, Any],
68
+ existing_variables: List[GroupVariable] | List[ProjectVariable],
69
+ ) -> None:
70
+ """Handle a single variable operation."""
71
+ key = var_config["key"]
72
+ scope = var_config.get("environment_scope", "*")
73
+ should_delete = var_config.get("delete", False)
74
+
75
+ # Find matching existing variable
76
+ existing_var = next(
77
+ (
78
+ existing_var
79
+ for existing_var in existing_variables
80
+ if existing_var.key == key and getattr(existing_var, "environment_scope", "*") == scope
81
+ ),
82
+ None,
83
+ )
84
+
85
+ if not existing_var:
86
+ # In case config refers to deleting non-existent variable, raise error
87
+ if should_delete:
88
+ raise Exception(f"Cannot delete variable '{key}' with scope '{scope}' - variable does not exist")
89
+ self._create_variable(group_or_project, var_config)
90
+ return
91
+ else:
92
+ # If the variable exists, check if it should be deleted or updated
93
+ if should_delete:
94
+ # If delete is requested, check if the variable matches the config
95
+ # and delete it if it does
96
+ if not self._variables_match(existing_var.asdict(), var_config):
97
+ raise Exception(f"Cannot delete {key} - attributes don't match")
98
+ self._delete_variable(group_or_project, key, scope)
99
+ return
100
+ else:
101
+ # If delete is not requested, update the variable if config is different from gitlab
102
+ if self.needs_update(existing_var.asdict(), var_config):
103
+ self._update_variable(group_or_project, var_config)
104
+ return
105
+ else:
106
+ info(f"Variable {key} with scope {scope} already matches configuration, no update needed")
107
+ return
108
+
109
+ def _handle_enforce_mode(
110
+ self,
111
+ group_or_project: Group | Project,
112
+ existing_variables: List[GroupVariable] | List[ProjectVariable],
113
+ processed_vars: Set[Tuple[str, str]],
114
+ ) -> None:
115
+ """Delete variables not in configuration when enforce mode is enabled."""
116
+ vars_to_delete = [
117
+ existing_var
118
+ for existing_var in existing_variables
119
+ if (existing_var.key, getattr(existing_var, "environment_scope", "*")) not in processed_vars
120
+ ]
121
+
122
+ if vars_to_delete:
123
+ info(f"Enforce mode will delete {len(vars_to_delete)} variables")
124
+ for var in vars_to_delete:
125
+ self._delete_variable(group_or_project, var.key, getattr(var, "environment_scope", "*"))
126
+
127
+ def _create_variable(self, group_or_project: Group | Project, var_config: Dict[str, Any]) -> None:
128
+ """Create a new variable."""
129
+ attrs = var_config.copy()
130
+ info(f"Creating variable {attrs['key']}")
131
+ group_or_project.variables.create(attrs)
132
+
133
+ def _update_variable(self, group_or_project: Group | Project, var_config: Dict[str, Any]) -> None:
134
+ """Update an existing variable."""
135
+ attrs = var_config.copy()
136
+ scope = attrs.get("environment_scope", "*")
137
+ info(f"Updating variable {attrs['key']}")
138
+ group_or_project.variables.update(attrs["key"], attrs, filter={"environment_scope": scope})
139
+
140
+ def _delete_variable(self, group_or_project: Group | Project, key: str, scope: str) -> None:
141
+ """Delete a variable."""
142
+ info(f"Deleting variable {key}")
143
+ group_or_project.variables.delete(key, filter={"environment_scope": scope})
gitlabform/run.py ADDED
@@ -0,0 +1,9 @@
1
+ from gitlabform import GitLabForm
2
+
3
+
4
+ def run():
5
+ GitLabForm().run()
6
+
7
+
8
+ if __name__ == "__main__":
9
+ run()
gitlabform/util.py ADDED
@@ -0,0 +1,7 @@
1
+ import json
2
+
3
+
4
+ def to_str(a_dict: dict) -> str:
5
+ # arguably the most readable form of a dict in a single line
6
+ # is JSON with sorted keys
7
+ return json.dumps(a_dict, sort_keys=True, default=str)
@@ -0,0 +1,54 @@
1
+ Metadata-Version: 2.4
2
+ Name: gitlabform
3
+ Version: 0.0.540a0
4
+ Summary: 🏗 Specialized configuration as a code tool for GitLab projects, groups and more using hierarchical configuration written in YAML
5
+ Project-URL: Homepage, https://gitlabform.github.io/gitlabform/
6
+ Project-URL: Repository, https://github.com/gitlabform/gitlabform.git
7
+ Project-URL: Issues, https://github.com/gitlabform/gitlabform/issues
8
+ Project-URL: Changelog, https://gitlabform.github.io/gitlabform/changelog/
9
+ Author: Greg Dubicki and Contributors
10
+ License-File: LICENSE
11
+ Keywords: cli,configuration-as-code,gitlab,yaml
12
+ Classifier: Development Status :: 5 - Production/Stable
13
+ Classifier: Intended Audience :: Information Technology
14
+ Classifier: Intended Audience :: System Administrators
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Operating System :: MacOS
17
+ Classifier: Operating System :: Microsoft :: Windows
18
+ Classifier: Operating System :: POSIX :: Linux
19
+ Classifier: Programming Language :: Python :: 3.14
20
+ Classifier: Topic :: Software Development :: Version Control :: Git
21
+ Requires-Python: >=3.12.0
22
+ Requires-Dist: certifi==2026.2.25
23
+ Requires-Dist: cli-ui==0.19.0
24
+ Requires-Dist: ez-yaml==1.2.0
25
+ Requires-Dist: jinja2==3.1.6
26
+ Requires-Dist: luddite==1.0.4
27
+ Requires-Dist: markupsafe==3.0.3
28
+ Requires-Dist: mergedeep==1.3.4
29
+ Requires-Dist: packaging==26.0
30
+ Requires-Dist: python-gitlab[graphql]==8.2.0
31
+ Requires-Dist: requests==2.33.1
32
+ Requires-Dist: rich==15.0.0
33
+ Requires-Dist: ruamel-yaml==0.17.21
34
+ Requires-Dist: yamlpath==3.8.2
35
+ Description-Content-Type: text/markdown
36
+
37
+ [![version](https://badge.fury.io/gh/gitlabform%2Fgitlabform.svg)](https://badge.fury.io/gh/gitlabform%2Fgitlabform)
38
+ ![release date](https://img.shields.io/github/release-date/gitlabform/gitlabform)
39
+ [![Downloads](https://static.pepy.tech/badge/gitlabform/month)](https://pepy.tech/project/gitlabform)
40
+ [![code style](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
41
+ [![codecov](https://codecov.io/gh/gitlabform/gitlabform/branch/main/graph/badge.svg?token=NOMttkpB2A)](https://codecov.io/gh/gitlabform/gitlabform)
42
+ [![snyk](https://snyk.io/test/github/gitlabform/gitlabform/badge.svg)](https://security.snyk.io/package/pip/gitlabform)
43
+
44
+ <img src="https://raw.githubusercontent.com/gitlabform/gitlabform/main/docs/images/gitlabform-logo.png" width="600px" alt="logo">
45
+
46
+ 🏗 GitLabForm is a specialized configuration as a code tool for GitLab:
47
+
48
+ * application settings,
49
+ * groups,
50
+ * projects,
51
+
52
+ ...and more using hierarchical configuration written in YAML.
53
+
54
+ Please see <a href="https://gitlabform.github.io/gitlabform/">the project site</a> for more information.
@@ -0,0 +1,79 @@
1
+ gitlabform/__init__.py,sha256=bCx-6CKJCBsQP5qG92VKdX4SSYUr2vP-Hl44FGK1nMY,26483
2
+ gitlabform/constants.py,sha256=tAvpqHST3xnx1FeZ8acsdrQG4IkqNP6ZmIbn4nM7oN0,277
3
+ gitlabform/output.py,sha256=Q3bK-gu7LjeM0Y8rk-ohdA5qoYVdSqLphkPqlcubxx4,1778
4
+ gitlabform/run.py,sha256=bQK0mR0h1nM99wewCbzHHVm5lHpvkKj67Vd7jp1JBtA,109
5
+ gitlabform/util.py,sha256=HUzBwQ2-tw-k5a-wZghaTwwvatEY-nT-gOhCFHFcXH0,202
6
+ gitlabform/configuration/__init__.py,sha256=RZZsO0StbwybL_U7-hKAckuJRwOKCKC6_1wHAQTxEOQ,390
7
+ gitlabform/configuration/common.py,sha256=Rw3MvCgnNJ18YBa3VHwmIsooYvkt7sAaxIvO2eTWH7M,589
8
+ gitlabform/configuration/core.py,sha256=oka_JF_KwOcNxVNv2wlIz-WetBqtZyDTVZGXoPazgss,12783
9
+ gitlabform/configuration/groups.py,sha256=5l77tLBj3pUvsIMy52R-c1wNqdozvn2bkfJOrBYhyyo,4774
10
+ gitlabform/configuration/projects.py,sha256=VGWH1iGOPOQFO4gby-_9pWScvQRjtnFeYNfSi7G8LrI,2716
11
+ gitlabform/configuration/transform.py,sha256=aZmTGWZ7BYlQOjjfrxQ6rytzCWZjUQ27TrZDggyYwvQ,10724
12
+ gitlabform/gitlab/__init__.py,sha256=jhG8fHdlw4WKK1Rtg9_AfNTMKOhho9z-dryxH4-5X4A,3757
13
+ gitlabform/gitlab/commits.py,sha256=QTJlMqSPEAvvBUeobVkKoTNNdVqBmDRMVt62lFKsbGg,1642
14
+ gitlabform/gitlab/core.py,sha256=wBswBAGf1kLiZXS6vzEigteHDt4I5-nMJ9gQS21FriA,13826
15
+ gitlabform/gitlab/group_badges.py,sha256=uKW5LS_jsCfcHy5o3obkxVFwdUkTLyCygehuctfMIDw,1354
16
+ gitlabform/gitlab/group_ldap_links.py,sha256=YKjNx8ljB3HviiBa7qYffcrluDhi98WZ7OrDgu1pFzA,1536
17
+ gitlabform/gitlab/groups.py,sha256=JzSnxCm_qyVyaFKYnNyeqzIS-lrbqO5PTPHFNRlHvbU,3648
18
+ gitlabform/gitlab/merge_requests.py,sha256=KQ6U4cKfekwtGkklPhN20DEcIO4-SXHIHAeTPdwOQd4,1855
19
+ gitlabform/gitlab/pipelines.py,sha256=oeNCYM8r_lWgegz_mVcezKfNxk5-ZVYtSJrFVmp-MLA,833
20
+ gitlabform/gitlab/project_badges.py,sha256=RacZUX0K9ymBZ_BDTSlYA-NqIVuyYrGurloYyTVs-zI,1594
21
+ gitlabform/gitlab/project_deploy_keys.py,sha256=woVQTJBCWZmTiNlg87kvhyHg41OxVL8jJDRJlKIYoE0,4405
22
+ gitlabform/gitlab/project_merge_requests_approvals.py,sha256=JQfDBEWdADtly8lKYMvZMxtYVlptCK83dpiQUdKU_WI,3463
23
+ gitlabform/gitlab/project_protected_environments.py,sha256=GBQYQGpTVXsWmziMj5EdLdKe_bepI9QzV8iSZVZUcAE,1562
24
+ gitlabform/gitlab/projects.py,sha256=s3_J9I79hLyUuBRjwBOpaURToWYyqSbW_4ZYxPTXRO8,5866
25
+ gitlabform/gitlab/python_gitlab.py,sha256=WQURLXpif5Md9tle2vW8QcvwSrOVTTgAObRKKy1JIRU,9117
26
+ gitlabform/gitlab/variables.py,sha256=3FEcQnxA_okv-pWckxmFGC9O1eQO-5566tHrWBd3Maw,1781
27
+ gitlabform/lists/__init__.py,sha256=_qh6nZpUrZBzmYE9l635hPAeNXFehvenMtt3r4GPKjQ,1743
28
+ gitlabform/lists/filter.py,sha256=85773Cr__HuEveT1PuO1YM8MjbXPcjLC9otswl6jgIg,3818
29
+ gitlabform/lists/groups.py,sha256=-EN1Dj8bpQYeFXdt15asiADxzG--umnhtTRr4IfE6qI,3021
30
+ gitlabform/lists/projects.py,sha256=-LtPx_llEBv0qHoM6UIm3bzJ-kIpgWE6X67P9eR4XA8,10806
31
+ gitlabform/processors/__init__.py,sha256=SJlGN52nsUYKk9tv0yT7UV_49bqjFHSYm3sDdCAHiAE,1568
32
+ gitlabform/processors/abstract_processor.py,sha256=wMIvDZI1d94TBCTLHvmlYRNbgP2ECMBspFMpGYtDyDw,7890
33
+ gitlabform/processors/defining_keys.py,sha256=CPyOJp09GI2Mb6c-PrGaqgmnb9mDtX9R5ZksJS9qil8,3934
34
+ gitlabform/processors/multiple_entities_processor.py,sha256=9eGCnggkkLqv3ilDI0mx1jolVXh5iKpJUThcOo2ALck,8457
35
+ gitlabform/processors/application/__init__.py,sha256=t7ShruST8WJ2MyyLheW-id9sSWw2SkhJ_9dR-L_nE68,642
36
+ gitlabform/processors/application/application_settings_processor.py,sha256=EEAOcPvWNShX_rpDsPfM0W7wa8paVGxicAv4d4GInSs,1561
37
+ gitlabform/processors/group/__init__.py,sha256=wjlshT1_ZC5_UeGqBARzgCfmP746gy3Q5d7zT4-hLgg,1723
38
+ gitlabform/processors/group/group_badges_processor.py,sha256=otFGNqQwlQlWcPxS2Er2DcLn5TJMZbe5wJRtIXBf3b0,689
39
+ gitlabform/processors/group/group_hooks_processor.py,sha256=w-sHL8fccyZX6iPp06YMMGfKmx039zkSQc88Ss4x4oo,3382
40
+ gitlabform/processors/group/group_labels_processor.py,sha256=AJMz16rsN0MhjON2o3rwEESpDxJbGI3vDlN0rXJKliE,1014
41
+ gitlabform/processors/group/group_ldap_links_processor.py,sha256=zTNRZ9zrkTKAHaDJM35rvo7Ih1D8IaQ5ilGVxe_X2aU,707
42
+ gitlabform/processors/group/group_members_processor.py,sha256=HTUxYszLs8s8yERxG3k8CX70PYDQnoxNva1O0m7zt4E,13184
43
+ gitlabform/processors/group/group_push_rules_processor.py,sha256=R_wEAymYBcn9qlEHGjJT9cxRiAU1lcVNgksMcUQ0fEo,1837
44
+ gitlabform/processors/group/group_saml_links_processor.py,sha256=pd7SNPxvrOZtLyuliufMOPYFtQfx8MMpNrTNUBwWpn8,2876
45
+ gitlabform/processors/group/group_settings_processor.py,sha256=uLGAIZBMMdw5HSxdHNgzNHPV81Qj4rItVdpeT5WVTqA,3665
46
+ gitlabform/processors/group/group_variables_processor.py,sha256=M4I60LSxVmoGJvXm3h5rEKb2X1HL-ztYRDnf6OUsVRs,1157
47
+ gitlabform/processors/project/__init__.py,sha256=fsJOoUxeDoAp4HikRjGQNYrQWanMvJ7_9WZVzFIopBk,3755
48
+ gitlabform/processors/project/badges_processor.py,sha256=5Cg3noWD_ewhNsOU19WQL5SS2PjIOlND5mnhXG0mIKc,686
49
+ gitlabform/processors/project/branches_processor.py,sha256=CxZvE51nrqwgSaqM8jH-BV-0-7TQWKsC-n18H5Jf0VU,26306
50
+ gitlabform/processors/project/deploy_keys_processor.py,sha256=XiMyuVQpXkbkZkyBvLn2n-tM6NCyq_24wslpi6_1EOo,814
51
+ gitlabform/processors/project/files_processor.py,sha256=BEQg8Ho7_KHvxilBgnl4C1EadAcQrW9dboKbA6kYspY,13452
52
+ gitlabform/processors/project/hooks_processor.py,sha256=Vw3thcfhIKVrqGvQ_HrWtlS-JBveC24y0zSStiEyoKc,2810
53
+ gitlabform/processors/project/integrations_processor.py,sha256=5WWfiIq1qoBOVtt4JHHAjDSZK-TpQP6YsuMvNFuHvm0,1564
54
+ gitlabform/processors/project/job_token_scope_processor.py,sha256=aS52_B-XWAdEm6NsAUyILirnnJU2c16oMrE4Q_OZl-c,8800
55
+ gitlabform/processors/project/members_processor.py,sha256=ifkWLjmLRKe0_GPddeq2u1pSsx3wUTLg2RJx1mIuN5g,9826
56
+ gitlabform/processors/project/merge_requests_approval_rules.py,sha256=HuMWpggshYnGf48NwTyHM2gCGmSKYzDAPyIPnV4f57s,712
57
+ gitlabform/processors/project/merge_requests_approvals.py,sha256=bYeJWA8mBBdvBRVYgV9cZ5CRhHt21lHQJZH8nqWJn7c,2790
58
+ gitlabform/processors/project/project_labels_processor.py,sha256=v6DigXXBspxlZNtD1T68HPyUppdsB0wspDjU7HDNltM,973
59
+ gitlabform/processors/project/project_processor.py,sha256=0GFEqHPlEPUiMSG1pk_4s9AJdJxZtRw7rWoJE2E4qJQ,3636
60
+ gitlabform/processors/project/project_push_rules_processor.py,sha256=NxeyIUow1CWPp6nl53GOo1Q9xbIYH5xTJ-I-HQ_kPIE,2529
61
+ gitlabform/processors/project/project_security_settings.py,sha256=s_HrYq7FX8_-Qv0ETrmG_jfmui_TrgrIEg3iicT1_gQ,3392
62
+ gitlabform/processors/project/project_settings_processor.py,sha256=DCCRsrqY_nOvLemZY6MIpNVIDbQCnbKNu-pNLjBv3Xc,9972
63
+ gitlabform/processors/project/project_variables_processor.py,sha256=SZJzCBVO3aRUpuVr8aaYviZRoZkS04iSkGFdLB7baiw,3798
64
+ gitlabform/processors/project/remote_mirrors_processor.py,sha256=2kD_7p1_sfwTe3r2X54poxuPLcOPUzKjHu61EuUI4JU,12782
65
+ gitlabform/processors/project/resource_groups_processor.py,sha256=NC1LWLbA3cxt1CA4Yy41Ygbiglstz3DCpUK9MM9AAuQ,2521
66
+ gitlabform/processors/project/schedules_processor.py,sha256=F_-D21AaNztBY0GAIBKR3Qtr78kQWu3-XPambPrgbLU,9161
67
+ gitlabform/processors/project/tags_processor.py,sha256=gm3p_HPr8FGgYyJfqj0cZ3OHHspmkdyrGIwdrw2eduw,4886
68
+ gitlabform/processors/shared/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
69
+ gitlabform/processors/shared/protected_environments_processor.py,sha256=jletJgv8GeOo8Ny_Cp_0XEq00xaZ1zILmCHZSwre_jA,893
70
+ gitlabform/processors/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
71
+ gitlabform/processors/util/decorators.py,sha256=IpngOQ9YlcDCGi53ZL4K9gmkceeDSU4nDOty8bwtmUU,1277
72
+ gitlabform/processors/util/difference_logger.py,sha256=Ds2RHc8vA5jGviDKJAn8N5hL8LodcEbQpUWeauQwRMg,2350
73
+ gitlabform/processors/util/labels_processor.py,sha256=AgdrULhz6mA6FP1iMczfRFjKGdJIW5sSmScATQfZtjM,5185
74
+ gitlabform/processors/util/variables_processor.py,sha256=JdN5D38Sb1TlPcSfECCEEVYSafBTLp64kRU6fmuE1-s,6491
75
+ gitlabform-0.0.540a0.dist-info/METADATA,sha256=24L0DKa2idKwQweC9lzE_n1LfGuCHuAC9sIZPDdx1yE,2645
76
+ gitlabform-0.0.540a0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
77
+ gitlabform-0.0.540a0.dist-info/entry_points.txt,sha256=y-onIc1MxG7oRgzpKfRd_ytbpehDuN7sz-Ydplh3XQU,228
78
+ gitlabform-0.0.540a0.dist-info/licenses/LICENSE,sha256=xg2iiBASCK3IVXNkq7mA5Qw82VJBS3PUXXKBwiSMShc,1090
79
+ gitlabform-0.0.540a0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.29.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,9 @@
1
+ [console_scripts]
2
+ dev = dev.main:main
3
+ docker = dev.main:docker
4
+ docs = dev.main:docs
5
+ gitlab-local = dev.main:gitlab_local
6
+ gitlabform = gitlabform.run:run
7
+ package = dev.main:package
8
+ qa = dev.main:qa
9
+ workspace = dev.main:workspace
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2016-∞ Greg Dubicki and Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.