devopsdriver 0.1.48__tar.gz → 0.1.50__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.
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/PKG-INFO +30 -18
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/README.md +21 -11
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/devopsdriver/__init__.py +3 -2
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/devopsdriver/azdo/__init__.py +1 -1
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/devopsdriver/azdo/azureobject.py +1 -1
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/devopsdriver/azdo/builds/build.py +1 -1
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/devopsdriver/azdo/builds/client.py +2 -2
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/devopsdriver/azdo/clients.py +1 -1
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/devopsdriver/azdo/pipeline/client.py +1 -1
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/devopsdriver/azdo/pipeline/log.py +1 -1
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/devopsdriver/azdo/pipeline/pipeline.py +1 -1
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/devopsdriver/azdo/pipeline/run.py +1 -1
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/devopsdriver/azdo/timestamp.py +1 -1
- devopsdriver-0.1.50/devopsdriver/azdo/workitem/__init__.py +1 -0
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/devopsdriver/azdo/workitem/client.py +2 -2
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/devopsdriver/azdo/workitem/wiql.py +1 -1
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/devopsdriver/dataobject.py +1 -1
- devopsdriver-0.1.50/devopsdriver/github/__init__.py +0 -0
- devopsdriver-0.1.50/devopsdriver/github/client.py +27 -0
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/devopsdriver/manage_settings.py +10 -3
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/devopsdriver/sendmail.py +1 -1
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/devopsdriver/settings.py +72 -72
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/devopsdriver/template.py +1 -1
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/devopsdriver.egg-info/PKG-INFO +30 -18
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/devopsdriver.egg-info/SOURCES.txt +2 -0
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/devopsdriver.egg-info/requires.txt +5 -4
- devopsdriver-0.1.50/pyproject.toml +65 -0
- devopsdriver-0.1.48/devopsdriver/azdo/workitem/__init__.py +0 -1
- devopsdriver-0.1.48/pyproject.toml +0 -64
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/LICENSE +0 -0
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/devopsdriver/azdo/builds/__init__.py +0 -0
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/devopsdriver/azdo/pipeline/__init__.py +0 -0
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/devopsdriver/templates/manage_settings.txt.mako +0 -0
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/devopsdriver.egg-info/dependency_links.txt +0 -0
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/devopsdriver.egg-info/entry_points.txt +0 -0
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/devopsdriver.egg-info/top_level.txt +0 -0
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/setup.cfg +0 -0
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/tests/test_azure_azureobject.py +0 -0
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/tests/test_azure_build.py +0 -0
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/tests/test_azure_build_client.py +0 -0
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/tests/test_azure_clients.py +0 -0
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/tests/test_azure_pipeline.py +0 -0
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/tests/test_azure_pipeline_client.py +0 -0
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/tests/test_azure_pipeline_run.py +0 -0
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/tests/test_azure_timestamp.py +0 -0
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/tests/test_azure_workitem_client.py +0 -0
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/tests/test_azure_workitem_wiql.py +0 -0
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/tests/test_dataobject.py +0 -0
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/tests/test_manage_settings.py +0 -0
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/tests/test_sendmail.py +0 -0
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/tests/test_settings.py +0 -0
- {devopsdriver-0.1.48 → devopsdriver-0.1.50}/tests/test_template.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: devopsdriver
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.50
|
|
4
4
|
Summary: DevOps tools
|
|
5
5
|
Author-email: Marc Page <marcallenpage@gmail.com>
|
|
6
6
|
License: This is free and unencumbered software released into the public domain.
|
|
@@ -33,7 +33,7 @@ Project-URL: Documentation, https://github.com/marcpage/devops-driver
|
|
|
33
33
|
Project-URL: Repository, https://github.com/marcpage/devops-driver.git
|
|
34
34
|
Project-URL: Issues, https://github.com/marcpage/devops-driver/issues
|
|
35
35
|
Project-URL: Changelog, https://github.com/marcpage/devops-driver/releases
|
|
36
|
-
Keywords: azure,devops,jira,confluence,email,pipelines,tools
|
|
36
|
+
Keywords: azure,devops,jira,confluence,email,pipelines,tools,github
|
|
37
37
|
Classifier: Development Status :: 1 - Planning
|
|
38
38
|
Classifier: Environment :: Console
|
|
39
39
|
Classifier: Intended Audience :: Developers
|
|
@@ -46,11 +46,12 @@ Classifier: Topic :: Software Development
|
|
|
46
46
|
Requires-Python: >=3.10
|
|
47
47
|
Description-Content-Type: text/markdown
|
|
48
48
|
License-File: LICENSE
|
|
49
|
-
Requires-Dist: PyYAML==6.0.
|
|
50
|
-
Requires-Dist: keyring==25.
|
|
51
|
-
Requires-Dist: setuptools==
|
|
49
|
+
Requires-Dist: PyYAML==6.0.3
|
|
50
|
+
Requires-Dist: keyring==25.6.0
|
|
51
|
+
Requires-Dist: setuptools==80.9.0
|
|
52
52
|
Requires-Dist: azure-devops==7.1.0b4
|
|
53
|
-
Requires-Dist: Mako==1.3.
|
|
53
|
+
Requires-Dist: Mako==1.3.10
|
|
54
|
+
Requires-Dist: PyGithub==2.5.0
|
|
54
55
|
Provides-Extra: dev
|
|
55
56
|
Requires-Dist: black>=24.3.0; extra == "dev"
|
|
56
57
|
Requires-Dist: pylint>=3.1.0; extra == "dev"
|
|
@@ -58,9 +59,12 @@ Provides-Extra: test
|
|
|
58
59
|
Requires-Dist: pytest>=8.1.1; extra == "test"
|
|
59
60
|
Requires-Dist: coverage>=7.4.4; extra == "test"
|
|
60
61
|
Provides-Extra: doc
|
|
62
|
+
Dynamic: license-file
|
|
63
|
+
|
|
64
|
+
# devops-driver
|
|
61
65
|
|
|
62
66
|

|
|
63
|
-
[](https://pypi.org/project/devopsdriver/0.1.50/)
|
|
64
68
|
[](https://github.com/marcpage/devops-driver?tab=Unlicense-1-ov-file#readme)
|
|
65
69
|
[](https://github.com/marcpage/devops-driver/graphs/contributors)
|
|
66
70
|
[](http://makeapullrequest.com)
|
|
@@ -71,7 +75,7 @@ Provides-Extra: doc
|
|
|
71
75
|
[](https://github.com/marcpage/devops-driver)
|
|
72
76
|
|
|
73
77
|
[](https://github.com/marcpage/devops-driver/actions/workflows/pr.yml)
|
|
74
|
-
[](https://github.com/marcpage/devops-driver/blob/main/Makefile#L4)
|
|
75
79
|
[](https://github.com/marcpage/devops-driver/issues)
|
|
76
80
|
[](https://github.com/marcpage/devops-driver/pulls)
|
|
77
81
|
|
|
@@ -82,13 +86,11 @@ Provides-Extra: doc
|
|
|
82
86
|
[](https://azure.microsoft.com/)
|
|
83
87
|
[](https://gmail.com/)
|
|
84
88
|
|
|
85
|
-
OS:
|
|
89
|
+
OS:
|
|
86
90
|
[](https://microsoft.com/)
|
|
87
91
|
[](https://apple.com/)
|
|
88
92
|
[](https://linux.org/)
|
|
89
93
|
|
|
90
|
-
# devops-driver
|
|
91
|
-
|
|
92
94
|
Devops-driver is a collection of tools to help streamline developer's experience and gain insights into various processes.
|
|
93
95
|
|
|
94
96
|
## Tools
|
|
@@ -107,6 +109,7 @@ To allow seamless work in both pipelines as well as in the development environme
|
|
|
107
109
|
Say you want a pipeline that looks for User Stories that are newer than 3 days and send out an email.
|
|
108
110
|
|
|
109
111
|
### \<platform dependent path\>/devopsdriver.yml
|
|
112
|
+
|
|
110
113
|
```yaml
|
|
111
114
|
smtp:
|
|
112
115
|
sender: JohnDoe@company.com
|
|
@@ -116,7 +119,7 @@ secrets:
|
|
|
116
119
|
smtp.password: smtp/password
|
|
117
120
|
```
|
|
118
121
|
|
|
119
|
-
This file is in a global place (location varies by OS) and stores information that you may not want in your repository or is specific to development.
|
|
122
|
+
This file is in a global place (location varies by OS) and stores information that you may not want in your repository or is specific to development.
|
|
120
123
|
|
|
121
124
|
| Platform | Global Directory |
|
|
122
125
|
|----------|------------------------|
|
|
@@ -127,6 +130,7 @@ This file is in a global place (location varies by OS) and stores information th
|
|
|
127
130
|
The `secrets` are extra sensative and are stored in the OS keychain.
|
|
128
131
|
|
|
129
132
|
### Set secrets in the keychain
|
|
133
|
+
|
|
130
134
|
```bash
|
|
131
135
|
$ python3 -m venv .venv
|
|
132
136
|
$ source .venv/bin/activate
|
|
@@ -138,16 +142,21 @@ secret: azure.token key: azure/token
|
|
|
138
142
|
smtp.password (azure/token): ****
|
|
139
143
|
$ settings --secrets
|
|
140
144
|
secret: azure.token key: azure/token
|
|
141
|
-
|
|
145
|
+
Value set
|
|
142
146
|
secret: smtp.password key: smtp/password
|
|
143
|
-
|
|
147
|
+
Value set
|
|
144
148
|
$
|
|
145
149
|
```
|
|
150
|
+
|
|
146
151
|
The first call to `settings` will look for every secret and check if they are already set in the keychain.
|
|
147
152
|
For any secret that has not been set in the keychain, you will be prompted to enter the password to store.
|
|
148
153
|
The second call to `settings` will verify that all the values have been set in the keychain.
|
|
149
154
|
|
|
155
|
+
**Note**: If your `secrets`, `cli`, or `env` are in a yaml file named after your script,
|
|
156
|
+
you can call `settings --secrets --script my_script.py`.
|
|
157
|
+
|
|
150
158
|
### devopsdriver.yml
|
|
159
|
+
|
|
151
160
|
```yaml
|
|
152
161
|
azure:
|
|
153
162
|
url: https://dev.azure.com/MyCompany
|
|
@@ -173,15 +182,18 @@ The `cli` and `env` map command line switches and environment variables to those
|
|
|
173
182
|
This allows for many options for setting values depending on your needs.
|
|
174
183
|
|
|
175
184
|
### new_stories.yml
|
|
185
|
+
|
|
176
186
|
```yaml
|
|
177
187
|
scrum masters:
|
|
178
188
|
- JohnDoe@company.com
|
|
179
189
|
- JaneDoe@company.com
|
|
180
190
|
```
|
|
191
|
+
|
|
181
192
|
This file is specific to your script and not shared.
|
|
182
193
|
These are values that you want to use in your script but have them here for easy adjustment.
|
|
183
194
|
|
|
184
195
|
### new_stories.html.mako
|
|
196
|
+
|
|
185
197
|
```html
|
|
186
198
|
<h1>Stories created in the last ${days} days</h1>
|
|
187
199
|
<ul>
|
|
@@ -194,6 +206,7 @@ These are values that you want to use in your script but have them here for easy
|
|
|
194
206
|
This file is the template for the email body.
|
|
195
207
|
|
|
196
208
|
### new_stories.py
|
|
209
|
+
|
|
197
210
|
```python
|
|
198
211
|
from datetime import date, timedelta
|
|
199
212
|
|
|
@@ -229,9 +242,9 @@ send_email(
|
|
|
229
242
|
|
|
230
243
|
### The email sent
|
|
231
244
|
|
|
232
|
-
**From**: JohnDoe@company.com
|
|
245
|
+
**From**: `JohnDoe@company.com`
|
|
233
246
|
|
|
234
|
-
**To**: JohnDoe@company.com
|
|
247
|
+
**To**: `JohnDoe@company.com`, `JaneDoe@company.com`
|
|
235
248
|
|
|
236
249
|
**Subject**: Stories created in the last 3 days
|
|
237
250
|
|
|
@@ -246,4 +259,3 @@ send_email(
|
|
|
246
259
|
- 754 frontend - store to schema
|
|
247
260
|
- 755 Transfer job to production. Setup migrations to move to production
|
|
248
261
|
- 756 Query subscription status from App
|
|
249
|
-
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
# devops-driver
|
|
2
|
+
|
|
1
3
|

|
|
2
|
-
[](https://pypi.org/project/devopsdriver/0.1.50/)
|
|
3
5
|
[](https://github.com/marcpage/devops-driver?tab=Unlicense-1-ov-file#readme)
|
|
4
6
|
[](https://github.com/marcpage/devops-driver/graphs/contributors)
|
|
5
7
|
[](http://makeapullrequest.com)
|
|
@@ -10,7 +12,7 @@
|
|
|
10
12
|
[](https://github.com/marcpage/devops-driver)
|
|
11
13
|
|
|
12
14
|
[](https://github.com/marcpage/devops-driver/actions/workflows/pr.yml)
|
|
13
|
-
[](https://github.com/marcpage/devops-driver/blob/main/Makefile#L4)
|
|
14
16
|
[](https://github.com/marcpage/devops-driver/issues)
|
|
15
17
|
[](https://github.com/marcpage/devops-driver/pulls)
|
|
16
18
|
|
|
@@ -21,13 +23,11 @@
|
|
|
21
23
|
[](https://azure.microsoft.com/)
|
|
22
24
|
[](https://gmail.com/)
|
|
23
25
|
|
|
24
|
-
OS:
|
|
26
|
+
OS:
|
|
25
27
|
[](https://microsoft.com/)
|
|
26
28
|
[](https://apple.com/)
|
|
27
29
|
[](https://linux.org/)
|
|
28
30
|
|
|
29
|
-
# devops-driver
|
|
30
|
-
|
|
31
31
|
Devops-driver is a collection of tools to help streamline developer's experience and gain insights into various processes.
|
|
32
32
|
|
|
33
33
|
## Tools
|
|
@@ -46,6 +46,7 @@ To allow seamless work in both pipelines as well as in the development environme
|
|
|
46
46
|
Say you want a pipeline that looks for User Stories that are newer than 3 days and send out an email.
|
|
47
47
|
|
|
48
48
|
### \<platform dependent path\>/devopsdriver.yml
|
|
49
|
+
|
|
49
50
|
```yaml
|
|
50
51
|
smtp:
|
|
51
52
|
sender: JohnDoe@company.com
|
|
@@ -55,7 +56,7 @@ secrets:
|
|
|
55
56
|
smtp.password: smtp/password
|
|
56
57
|
```
|
|
57
58
|
|
|
58
|
-
This file is in a global place (location varies by OS) and stores information that you may not want in your repository or is specific to development.
|
|
59
|
+
This file is in a global place (location varies by OS) and stores information that you may not want in your repository or is specific to development.
|
|
59
60
|
|
|
60
61
|
| Platform | Global Directory |
|
|
61
62
|
|----------|------------------------|
|
|
@@ -66,6 +67,7 @@ This file is in a global place (location varies by OS) and stores information th
|
|
|
66
67
|
The `secrets` are extra sensative and are stored in the OS keychain.
|
|
67
68
|
|
|
68
69
|
### Set secrets in the keychain
|
|
70
|
+
|
|
69
71
|
```bash
|
|
70
72
|
$ python3 -m venv .venv
|
|
71
73
|
$ source .venv/bin/activate
|
|
@@ -77,16 +79,21 @@ secret: azure.token key: azure/token
|
|
|
77
79
|
smtp.password (azure/token): ****
|
|
78
80
|
$ settings --secrets
|
|
79
81
|
secret: azure.token key: azure/token
|
|
80
|
-
|
|
82
|
+
Value set
|
|
81
83
|
secret: smtp.password key: smtp/password
|
|
82
|
-
|
|
84
|
+
Value set
|
|
83
85
|
$
|
|
84
86
|
```
|
|
87
|
+
|
|
85
88
|
The first call to `settings` will look for every secret and check if they are already set in the keychain.
|
|
86
89
|
For any secret that has not been set in the keychain, you will be prompted to enter the password to store.
|
|
87
90
|
The second call to `settings` will verify that all the values have been set in the keychain.
|
|
88
91
|
|
|
92
|
+
**Note**: If your `secrets`, `cli`, or `env` are in a yaml file named after your script,
|
|
93
|
+
you can call `settings --secrets --script my_script.py`.
|
|
94
|
+
|
|
89
95
|
### devopsdriver.yml
|
|
96
|
+
|
|
90
97
|
```yaml
|
|
91
98
|
azure:
|
|
92
99
|
url: https://dev.azure.com/MyCompany
|
|
@@ -112,15 +119,18 @@ The `cli` and `env` map command line switches and environment variables to those
|
|
|
112
119
|
This allows for many options for setting values depending on your needs.
|
|
113
120
|
|
|
114
121
|
### new_stories.yml
|
|
122
|
+
|
|
115
123
|
```yaml
|
|
116
124
|
scrum masters:
|
|
117
125
|
- JohnDoe@company.com
|
|
118
126
|
- JaneDoe@company.com
|
|
119
127
|
```
|
|
128
|
+
|
|
120
129
|
This file is specific to your script and not shared.
|
|
121
130
|
These are values that you want to use in your script but have them here for easy adjustment.
|
|
122
131
|
|
|
123
132
|
### new_stories.html.mako
|
|
133
|
+
|
|
124
134
|
```html
|
|
125
135
|
<h1>Stories created in the last ${days} days</h1>
|
|
126
136
|
<ul>
|
|
@@ -133,6 +143,7 @@ These are values that you want to use in your script but have them here for easy
|
|
|
133
143
|
This file is the template for the email body.
|
|
134
144
|
|
|
135
145
|
### new_stories.py
|
|
146
|
+
|
|
136
147
|
```python
|
|
137
148
|
from datetime import date, timedelta
|
|
138
149
|
|
|
@@ -168,9 +179,9 @@ send_email(
|
|
|
168
179
|
|
|
169
180
|
### The email sent
|
|
170
181
|
|
|
171
|
-
**From**: JohnDoe@company.com
|
|
182
|
+
**From**: `JohnDoe@company.com`
|
|
172
183
|
|
|
173
|
-
**To**: JohnDoe@company.com
|
|
184
|
+
**To**: `JohnDoe@company.com`, `JaneDoe@company.com`
|
|
174
185
|
|
|
175
186
|
**Subject**: Stories created in the last 3 days
|
|
176
187
|
|
|
@@ -185,4 +196,3 @@ send_email(
|
|
|
185
196
|
- 754 frontend - store to schema
|
|
186
197
|
- 755 Transfer job to production. Setup migrations to move to production
|
|
187
198
|
- 756 Query subscription status from App
|
|
188
|
-
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
"""
|
|
1
|
+
"""DevOps tools"""
|
|
2
2
|
|
|
3
3
|
from .settings import Settings
|
|
4
4
|
from .sendmail import send_email
|
|
5
5
|
from .template import Template
|
|
6
6
|
from .azdo.clients import Azure
|
|
7
|
+
from .github.client import Github
|
|
7
8
|
|
|
8
9
|
|
|
9
|
-
__version__ = "0.1.
|
|
10
|
+
__version__ = "0.1.50"
|
|
10
11
|
__author__ = "Marc Page"
|
|
11
12
|
__credits__ = ""
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
"""
|
|
4
|
+
"""Azure Build Client"""
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
from datetime import datetime
|
|
@@ -16,7 +16,7 @@ class Client: # pylint: disable=too-few-public-methods
|
|
|
16
16
|
def __init__(self, client: BuildClient):
|
|
17
17
|
self.client = client
|
|
18
18
|
|
|
19
|
-
def list( # pylint: disable=too-many-arguments
|
|
19
|
+
def list( # pylint: disable=too-many-positional-arguments,too-many-arguments
|
|
20
20
|
self,
|
|
21
21
|
project: str,
|
|
22
22
|
pipelines: list[int] = None,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""init workitem module"""
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
"""
|
|
4
|
+
"""Azure WorkItem Client"""
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
from azure.devops.v7_1.work_item_tracking.models import Wiql as AzureWiql
|
|
@@ -43,7 +43,7 @@ class Client:
|
|
|
43
43
|
top=top,
|
|
44
44
|
)
|
|
45
45
|
|
|
46
|
-
def get_history( # pylint: disable=too-many-arguments
|
|
46
|
+
def get_history( # pylint: disable=too-many-positional-arguments,too-many-arguments
|
|
47
47
|
self,
|
|
48
48
|
wi_id: int,
|
|
49
49
|
project: str = None,
|
|
File without changes
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
|
|
3
|
+
"""Manages GitHub connection"""
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
from github import Github as Github_connection, Auth
|
|
7
|
+
|
|
8
|
+
from devopsdriver.settings import Settings
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class Github:
|
|
12
|
+
"""Manages the GitHub connection"""
|
|
13
|
+
|
|
14
|
+
def __init__(self, settings: Settings):
|
|
15
|
+
self.settings: Settings = settings
|
|
16
|
+
self.connection: Github_connection | None = None
|
|
17
|
+
assert settings.get("github.token") is not None, "github.token not set"
|
|
18
|
+
|
|
19
|
+
def __enter__(self) -> Github_connection:
|
|
20
|
+
self.connection = Github_connection(
|
|
21
|
+
auth=Auth.Token(self.settings["github.token"])
|
|
22
|
+
)
|
|
23
|
+
return self.connection
|
|
24
|
+
|
|
25
|
+
def __exit__(self, exception_type, exception_value, exception_traceback):
|
|
26
|
+
if self.connection is not None:
|
|
27
|
+
self.connection.close()
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
"""
|
|
4
|
+
"""Module Doc"""
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
from os.path import dirname, join
|
|
7
|
+
from os.path import dirname, join, abspath
|
|
8
8
|
from sys import argv as sys_argv
|
|
9
9
|
from getpass import getpass as os_getpass
|
|
10
10
|
|
|
@@ -31,7 +31,14 @@ def main() -> None:
|
|
|
31
31
|
)
|
|
32
32
|
return
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
position = args.index("--script") if "--script" in args else len(args)
|
|
35
|
+
script = __file__
|
|
36
|
+
|
|
37
|
+
if position + 1 < len(args):
|
|
38
|
+
args.pop(position)
|
|
39
|
+
script = abspath(args.pop(position))
|
|
40
|
+
|
|
41
|
+
settings = Settings(script, dirname(dirname(__file__))).key("secrets")
|
|
35
42
|
|
|
36
43
|
if "--secrets" in args:
|
|
37
44
|
args.remove("--secrets")
|
|
@@ -1,78 +1,78 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
4
|
+
"""Settings that can be in files, environment, or on the command line
|
|
5
|
+
|
|
6
|
+
Settings can be set on the command line, environment, in the code, or in files.
|
|
7
|
+
|
|
8
|
+
Priority order:
|
|
9
|
+
- in code
|
|
10
|
+
- command line
|
|
11
|
+
- environment
|
|
12
|
+
- files
|
|
13
|
+
|
|
14
|
+
Files can be JSON or YAML.
|
|
15
|
+
They must have .json, .yml, or .yaml extension.
|
|
16
|
+
Files can be named after the file passed in (__file__) or "devopsdriver".
|
|
17
|
+
All files named after the file passed in have priority over "devopsdriver".
|
|
18
|
+
This allows for shared settings for multiple scripts as well as specific settings.
|
|
19
|
+
Files can be in an OS-specific preferences location, a series of specified directories,
|
|
20
|
+
or next to the file passed in (__file__).
|
|
21
|
+
This allows for secrets, keys, and tokens to be stored on the machine and not in the repo.
|
|
22
|
+
|
|
23
|
+
Files in the OS specific directories have priority over other files and are stored in:
|
|
24
|
+
- macOS: ~/Library/Preferences/
|
|
25
|
+
- Windows: %APPDATA%/
|
|
26
|
+
- Linux: ~/.devopsdriver/
|
|
27
|
+
|
|
28
|
+
You can have environment variable substitutions in the values in the files.
|
|
29
|
+
For instance, you can specify:
|
|
30
|
+
|
|
31
|
+
output: ${home}/reports
|
|
32
|
+
|
|
33
|
+
The `${home}` will be replaced with the value of the HOME environment variable, if it exists.
|
|
34
|
+
If the environment variable does not exist, no change is made.
|
|
35
|
+
|
|
36
|
+
Use case 1: Secrets not in repo
|
|
37
|
+
tokens, passwords, etc can be stored in <pref>/devopsdriver.yml
|
|
38
|
+
This will allow for all scripts to access those secrets
|
|
39
|
+
but they are not in the repo.
|
|
40
|
+
For pipeline runs these secrets can be passed on the command line or in the environment.
|
|
41
|
+
|
|
42
|
+
Use case 2: common settings among scripts
|
|
43
|
+
Store your common settings in devopsdriver.yml next to your script.
|
|
44
|
+
All scripts in this directory will have access to these settings.
|
|
45
|
+
For instance, say you want all emails sent from the same person.
|
|
46
|
+
You could set 'email: me@domain.com' in devopsdriver.html.
|
|
47
|
+
You could also, store report paths, emails, groups, holidays, etc.
|
|
48
|
+
Any data all scripts may want to have access to.
|
|
49
|
+
|
|
50
|
+
Use case 3: configurable settings
|
|
51
|
+
Any settings in your script that you may want to configure.
|
|
52
|
+
If your script is `cool_script.py` then put the settings in `cool_script.yml` next to it.
|
|
53
|
+
This could be colors, emails, repos, queries, whatever.
|
|
54
|
+
|
|
55
|
+
Use case 4: override secrets for specific script
|
|
56
|
+
Overriding secrets stored in `<pref>/devopsdriver.yml` for specific scripts.
|
|
57
|
+
If your script is `cool_script.py` save them to `<pref>/cool_script.yml`.
|
|
58
|
+
|
|
59
|
+
*Note*: You can override a specific setting in a sub-dictionary.
|
|
60
|
+
For instance, say `<pref>/devopsdriver.yml`:
|
|
61
|
+
|
|
62
|
+
```yaml
|
|
63
|
+
api:
|
|
64
|
+
user: johndoe
|
|
65
|
+
password: Setec Astronomy
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
You could override this for `cool_script.py` be adding `<pref>/cool_script.yml`:
|
|
69
|
+
|
|
70
|
+
```yaml
|
|
71
|
+
api:
|
|
72
|
+
user: janedoe
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
johndoe and janedoe share the same password, so you just need to update the `user`
|
|
76
76
|
"""
|
|
77
77
|
|
|
78
78
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: devopsdriver
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.50
|
|
4
4
|
Summary: DevOps tools
|
|
5
5
|
Author-email: Marc Page <marcallenpage@gmail.com>
|
|
6
6
|
License: This is free and unencumbered software released into the public domain.
|
|
@@ -33,7 +33,7 @@ Project-URL: Documentation, https://github.com/marcpage/devops-driver
|
|
|
33
33
|
Project-URL: Repository, https://github.com/marcpage/devops-driver.git
|
|
34
34
|
Project-URL: Issues, https://github.com/marcpage/devops-driver/issues
|
|
35
35
|
Project-URL: Changelog, https://github.com/marcpage/devops-driver/releases
|
|
36
|
-
Keywords: azure,devops,jira,confluence,email,pipelines,tools
|
|
36
|
+
Keywords: azure,devops,jira,confluence,email,pipelines,tools,github
|
|
37
37
|
Classifier: Development Status :: 1 - Planning
|
|
38
38
|
Classifier: Environment :: Console
|
|
39
39
|
Classifier: Intended Audience :: Developers
|
|
@@ -46,11 +46,12 @@ Classifier: Topic :: Software Development
|
|
|
46
46
|
Requires-Python: >=3.10
|
|
47
47
|
Description-Content-Type: text/markdown
|
|
48
48
|
License-File: LICENSE
|
|
49
|
-
Requires-Dist: PyYAML==6.0.
|
|
50
|
-
Requires-Dist: keyring==25.
|
|
51
|
-
Requires-Dist: setuptools==
|
|
49
|
+
Requires-Dist: PyYAML==6.0.3
|
|
50
|
+
Requires-Dist: keyring==25.6.0
|
|
51
|
+
Requires-Dist: setuptools==80.9.0
|
|
52
52
|
Requires-Dist: azure-devops==7.1.0b4
|
|
53
|
-
Requires-Dist: Mako==1.3.
|
|
53
|
+
Requires-Dist: Mako==1.3.10
|
|
54
|
+
Requires-Dist: PyGithub==2.5.0
|
|
54
55
|
Provides-Extra: dev
|
|
55
56
|
Requires-Dist: black>=24.3.0; extra == "dev"
|
|
56
57
|
Requires-Dist: pylint>=3.1.0; extra == "dev"
|
|
@@ -58,9 +59,12 @@ Provides-Extra: test
|
|
|
58
59
|
Requires-Dist: pytest>=8.1.1; extra == "test"
|
|
59
60
|
Requires-Dist: coverage>=7.4.4; extra == "test"
|
|
60
61
|
Provides-Extra: doc
|
|
62
|
+
Dynamic: license-file
|
|
63
|
+
|
|
64
|
+
# devops-driver
|
|
61
65
|
|
|
62
66
|

|
|
63
|
-
[](https://pypi.org/project/devopsdriver/0.1.50/)
|
|
64
68
|
[](https://github.com/marcpage/devops-driver?tab=Unlicense-1-ov-file#readme)
|
|
65
69
|
[](https://github.com/marcpage/devops-driver/graphs/contributors)
|
|
66
70
|
[](http://makeapullrequest.com)
|
|
@@ -71,7 +75,7 @@ Provides-Extra: doc
|
|
|
71
75
|
[](https://github.com/marcpage/devops-driver)
|
|
72
76
|
|
|
73
77
|
[](https://github.com/marcpage/devops-driver/actions/workflows/pr.yml)
|
|
74
|
-
[](https://github.com/marcpage/devops-driver/blob/main/Makefile#L4)
|
|
75
79
|
[](https://github.com/marcpage/devops-driver/issues)
|
|
76
80
|
[](https://github.com/marcpage/devops-driver/pulls)
|
|
77
81
|
|
|
@@ -82,13 +86,11 @@ Provides-Extra: doc
|
|
|
82
86
|
[](https://azure.microsoft.com/)
|
|
83
87
|
[](https://gmail.com/)
|
|
84
88
|
|
|
85
|
-
OS:
|
|
89
|
+
OS:
|
|
86
90
|
[](https://microsoft.com/)
|
|
87
91
|
[](https://apple.com/)
|
|
88
92
|
[](https://linux.org/)
|
|
89
93
|
|
|
90
|
-
# devops-driver
|
|
91
|
-
|
|
92
94
|
Devops-driver is a collection of tools to help streamline developer's experience and gain insights into various processes.
|
|
93
95
|
|
|
94
96
|
## Tools
|
|
@@ -107,6 +109,7 @@ To allow seamless work in both pipelines as well as in the development environme
|
|
|
107
109
|
Say you want a pipeline that looks for User Stories that are newer than 3 days and send out an email.
|
|
108
110
|
|
|
109
111
|
### \<platform dependent path\>/devopsdriver.yml
|
|
112
|
+
|
|
110
113
|
```yaml
|
|
111
114
|
smtp:
|
|
112
115
|
sender: JohnDoe@company.com
|
|
@@ -116,7 +119,7 @@ secrets:
|
|
|
116
119
|
smtp.password: smtp/password
|
|
117
120
|
```
|
|
118
121
|
|
|
119
|
-
This file is in a global place (location varies by OS) and stores information that you may not want in your repository or is specific to development.
|
|
122
|
+
This file is in a global place (location varies by OS) and stores information that you may not want in your repository or is specific to development.
|
|
120
123
|
|
|
121
124
|
| Platform | Global Directory |
|
|
122
125
|
|----------|------------------------|
|
|
@@ -127,6 +130,7 @@ This file is in a global place (location varies by OS) and stores information th
|
|
|
127
130
|
The `secrets` are extra sensative and are stored in the OS keychain.
|
|
128
131
|
|
|
129
132
|
### Set secrets in the keychain
|
|
133
|
+
|
|
130
134
|
```bash
|
|
131
135
|
$ python3 -m venv .venv
|
|
132
136
|
$ source .venv/bin/activate
|
|
@@ -138,16 +142,21 @@ secret: azure.token key: azure/token
|
|
|
138
142
|
smtp.password (azure/token): ****
|
|
139
143
|
$ settings --secrets
|
|
140
144
|
secret: azure.token key: azure/token
|
|
141
|
-
|
|
145
|
+
Value set
|
|
142
146
|
secret: smtp.password key: smtp/password
|
|
143
|
-
|
|
147
|
+
Value set
|
|
144
148
|
$
|
|
145
149
|
```
|
|
150
|
+
|
|
146
151
|
The first call to `settings` will look for every secret and check if they are already set in the keychain.
|
|
147
152
|
For any secret that has not been set in the keychain, you will be prompted to enter the password to store.
|
|
148
153
|
The second call to `settings` will verify that all the values have been set in the keychain.
|
|
149
154
|
|
|
155
|
+
**Note**: If your `secrets`, `cli`, or `env` are in a yaml file named after your script,
|
|
156
|
+
you can call `settings --secrets --script my_script.py`.
|
|
157
|
+
|
|
150
158
|
### devopsdriver.yml
|
|
159
|
+
|
|
151
160
|
```yaml
|
|
152
161
|
azure:
|
|
153
162
|
url: https://dev.azure.com/MyCompany
|
|
@@ -173,15 +182,18 @@ The `cli` and `env` map command line switches and environment variables to those
|
|
|
173
182
|
This allows for many options for setting values depending on your needs.
|
|
174
183
|
|
|
175
184
|
### new_stories.yml
|
|
185
|
+
|
|
176
186
|
```yaml
|
|
177
187
|
scrum masters:
|
|
178
188
|
- JohnDoe@company.com
|
|
179
189
|
- JaneDoe@company.com
|
|
180
190
|
```
|
|
191
|
+
|
|
181
192
|
This file is specific to your script and not shared.
|
|
182
193
|
These are values that you want to use in your script but have them here for easy adjustment.
|
|
183
194
|
|
|
184
195
|
### new_stories.html.mako
|
|
196
|
+
|
|
185
197
|
```html
|
|
186
198
|
<h1>Stories created in the last ${days} days</h1>
|
|
187
199
|
<ul>
|
|
@@ -194,6 +206,7 @@ These are values that you want to use in your script but have them here for easy
|
|
|
194
206
|
This file is the template for the email body.
|
|
195
207
|
|
|
196
208
|
### new_stories.py
|
|
209
|
+
|
|
197
210
|
```python
|
|
198
211
|
from datetime import date, timedelta
|
|
199
212
|
|
|
@@ -229,9 +242,9 @@ send_email(
|
|
|
229
242
|
|
|
230
243
|
### The email sent
|
|
231
244
|
|
|
232
|
-
**From**: JohnDoe@company.com
|
|
245
|
+
**From**: `JohnDoe@company.com`
|
|
233
246
|
|
|
234
|
-
**To**: JohnDoe@company.com
|
|
247
|
+
**To**: `JohnDoe@company.com`, `JaneDoe@company.com`
|
|
235
248
|
|
|
236
249
|
**Subject**: Stories created in the last 3 days
|
|
237
250
|
|
|
@@ -246,4 +259,3 @@ send_email(
|
|
|
246
259
|
- 754 frontend - store to schema
|
|
247
260
|
- 755 Transfer job to production. Setup migrations to move to production
|
|
248
261
|
- 756 Query subscription status from App
|
|
249
|
-
|
|
@@ -28,6 +28,8 @@ devopsdriver/azdo/pipeline/run.py
|
|
|
28
28
|
devopsdriver/azdo/workitem/__init__.py
|
|
29
29
|
devopsdriver/azdo/workitem/client.py
|
|
30
30
|
devopsdriver/azdo/workitem/wiql.py
|
|
31
|
+
devopsdriver/github/__init__.py
|
|
32
|
+
devopsdriver/github/client.py
|
|
31
33
|
devopsdriver/templates/manage_settings.txt.mako
|
|
32
34
|
tests/test_azure_azureobject.py
|
|
33
35
|
tests/test_azure_build.py
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "devopsdriver"
|
|
3
|
+
description = "DevOps tools"
|
|
4
|
+
readme = "README.md"
|
|
5
|
+
license = { file = "LICENSE" }
|
|
6
|
+
dynamic = ["version"]
|
|
7
|
+
requires-python = ">= 3.10"
|
|
8
|
+
dependencies = [
|
|
9
|
+
"PyYAML==6.0.3",
|
|
10
|
+
"keyring==25.6.0",
|
|
11
|
+
"setuptools==80.9.0", # neded for azure-devops to use 7.1 API
|
|
12
|
+
"azure-devops==7.1.0b4",
|
|
13
|
+
"Mako==1.3.10",
|
|
14
|
+
"PyGithub==2.5.0",
|
|
15
|
+
]
|
|
16
|
+
keywords = [
|
|
17
|
+
"azure",
|
|
18
|
+
"devops",
|
|
19
|
+
"jira",
|
|
20
|
+
"confluence",
|
|
21
|
+
"email",
|
|
22
|
+
"pipelines",
|
|
23
|
+
"tools",
|
|
24
|
+
"github",
|
|
25
|
+
]
|
|
26
|
+
classifiers = [
|
|
27
|
+
"Development Status :: 1 - Planning",
|
|
28
|
+
"Environment :: Console",
|
|
29
|
+
"Intended Audience :: Developers",
|
|
30
|
+
"Programming Language :: Python",
|
|
31
|
+
"Programming Language :: Python :: 3",
|
|
32
|
+
"License :: OSI Approved :: The Unlicense (Unlicense)",
|
|
33
|
+
"Programming Language :: Python :: 3.10",
|
|
34
|
+
"Topic :: Utilities",
|
|
35
|
+
"Topic :: Software Development",
|
|
36
|
+
]
|
|
37
|
+
authors = [{ name = "Marc Page", email = "marcallenpage@gmail.com" }]
|
|
38
|
+
|
|
39
|
+
[project.scripts]
|
|
40
|
+
settings = "devopsdriver.manage_settings:main"
|
|
41
|
+
|
|
42
|
+
[tool.setuptools.package-data]
|
|
43
|
+
"*" = ["*.mako"]
|
|
44
|
+
|
|
45
|
+
[tool.setuptools.packages.find]
|
|
46
|
+
include = ["devopsdriver*"]
|
|
47
|
+
|
|
48
|
+
[project.optional-dependencies]
|
|
49
|
+
dev = ["black>=24.3.0", "pylint>=3.1.0"]
|
|
50
|
+
test = ["pytest>=8.1.1", "coverage>=7.4.4"]
|
|
51
|
+
doc = []
|
|
52
|
+
|
|
53
|
+
[project.urls]
|
|
54
|
+
Homepage = "https://github.com/marcpage/devops-driver"
|
|
55
|
+
Documentation = "https://github.com/marcpage/devops-driver"
|
|
56
|
+
Repository = "https://github.com/marcpage/devops-driver.git"
|
|
57
|
+
Issues = "https://github.com/marcpage/devops-driver/issues"
|
|
58
|
+
Changelog = "https://github.com/marcpage/devops-driver/releases"
|
|
59
|
+
|
|
60
|
+
[tool.setuptools.dynamic]
|
|
61
|
+
version = { attr = "devopsdriver.__version__" }
|
|
62
|
+
|
|
63
|
+
[build-system]
|
|
64
|
+
requires = ["setuptools >= 69.2"]
|
|
65
|
+
build-backend = "setuptools.build_meta"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
""" init workitem module """
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
[project]
|
|
2
|
-
name = "devopsdriver"
|
|
3
|
-
description = "DevOps tools"
|
|
4
|
-
readme = "README.md"
|
|
5
|
-
license = {file = "LICENSE"}
|
|
6
|
-
dynamic = ["version"]
|
|
7
|
-
requires-python = ">= 3.10"
|
|
8
|
-
dependencies = [
|
|
9
|
-
"PyYAML==6.0.2",
|
|
10
|
-
"keyring==25.3.0",
|
|
11
|
-
"setuptools==74.0.0", # neded for azure-devops to use 7.1 API
|
|
12
|
-
"azure-devops==7.1.0b4",
|
|
13
|
-
"Mako==1.3.5",
|
|
14
|
-
]
|
|
15
|
-
keywords = ["azure", "devops", "jira", "confluence", "email", "pipelines", "tools"]
|
|
16
|
-
classifiers=[
|
|
17
|
-
"Development Status :: 1 - Planning",
|
|
18
|
-
"Environment :: Console",
|
|
19
|
-
"Intended Audience :: Developers",
|
|
20
|
-
"Programming Language :: Python",
|
|
21
|
-
"Programming Language :: Python :: 3",
|
|
22
|
-
"License :: OSI Approved :: The Unlicense (Unlicense)",
|
|
23
|
-
"Programming Language :: Python :: 3.10",
|
|
24
|
-
"Topic :: Utilities",
|
|
25
|
-
"Topic :: Software Development",
|
|
26
|
-
]
|
|
27
|
-
authors = [
|
|
28
|
-
{name = "Marc Page", email = "marcallenpage@gmail.com"},
|
|
29
|
-
]
|
|
30
|
-
|
|
31
|
-
[project.scripts]
|
|
32
|
-
settings = "devopsdriver.manage_settings:main"
|
|
33
|
-
|
|
34
|
-
[tool.setuptools.package-data]
|
|
35
|
-
"*" = ["*.mako"]
|
|
36
|
-
|
|
37
|
-
[tool.setuptools.packages.find]
|
|
38
|
-
include = ["devopsdriver*"]
|
|
39
|
-
|
|
40
|
-
[project.optional-dependencies]
|
|
41
|
-
dev = [
|
|
42
|
-
"black>=24.3.0",
|
|
43
|
-
"pylint>=3.1.0",
|
|
44
|
-
]
|
|
45
|
-
test = [
|
|
46
|
-
"pytest>=8.1.1",
|
|
47
|
-
"coverage>=7.4.4",
|
|
48
|
-
]
|
|
49
|
-
doc = []
|
|
50
|
-
|
|
51
|
-
[project.urls]
|
|
52
|
-
Homepage = "https://github.com/marcpage/devops-driver"
|
|
53
|
-
Documentation = "https://github.com/marcpage/devops-driver"
|
|
54
|
-
Repository = "https://github.com/marcpage/devops-driver.git"
|
|
55
|
-
Issues = "https://github.com/marcpage/devops-driver/issues"
|
|
56
|
-
Changelog = "https://github.com/marcpage/devops-driver/releases"
|
|
57
|
-
|
|
58
|
-
[tool.setuptools.dynamic]
|
|
59
|
-
version = {attr = "devopsdriver.__version__"}
|
|
60
|
-
|
|
61
|
-
[build-system]
|
|
62
|
-
requires = ["setuptools >= 69.2"]
|
|
63
|
-
build-backend = "setuptools.build_meta"
|
|
64
|
-
|
|
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
|
|
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
|
|
File without changes
|