devopsdriver 0.1.36__tar.gz → 0.1.37__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.37/PKG-INFO +230 -0
- devopsdriver-0.1.37/README.md +176 -0
- {devopsdriver-0.1.36 → devopsdriver-0.1.37}/devopsdriver/__init__.py +2 -1
- {devopsdriver-0.1.36 → devopsdriver-0.1.37}/devopsdriver/azdo/workitem/wiql.py +2 -2
- devopsdriver-0.1.37/devopsdriver/template.py +40 -0
- devopsdriver-0.1.37/devopsdriver.egg-info/PKG-INFO +230 -0
- {devopsdriver-0.1.36 → devopsdriver-0.1.37}/devopsdriver.egg-info/SOURCES.txt +3 -1
- {devopsdriver-0.1.36 → devopsdriver-0.1.37}/devopsdriver.egg-info/requires.txt +1 -0
- {devopsdriver-0.1.36 → devopsdriver-0.1.37}/pyproject.toml +1 -0
- {devopsdriver-0.1.36 → devopsdriver-0.1.37}/tests/test_azure_workitem_wiql.py +3 -3
- devopsdriver-0.1.37/tests/test_template.py +29 -0
- devopsdriver-0.1.36/PKG-INFO +0 -76
- devopsdriver-0.1.36/README.md +0 -23
- devopsdriver-0.1.36/devopsdriver.egg-info/PKG-INFO +0 -76
- {devopsdriver-0.1.36 → devopsdriver-0.1.37}/LICENSE +0 -0
- {devopsdriver-0.1.36 → devopsdriver-0.1.37}/devopsdriver/azdo/__init__.py +0 -0
- {devopsdriver-0.1.36 → devopsdriver-0.1.37}/devopsdriver/azdo/clients.py +0 -0
- {devopsdriver-0.1.36 → devopsdriver-0.1.37}/devopsdriver/azdo/workitem/__init__.py +0 -0
- {devopsdriver-0.1.36 → devopsdriver-0.1.37}/devopsdriver/azdo/workitem/client.py +0 -0
- {devopsdriver-0.1.36 → devopsdriver-0.1.37}/devopsdriver/azdo/workitem/workitem.py +0 -0
- {devopsdriver-0.1.36 → devopsdriver-0.1.37}/devopsdriver/sendmail.py +0 -0
- {devopsdriver-0.1.36 → devopsdriver-0.1.37}/devopsdriver/settings.py +0 -0
- {devopsdriver-0.1.36 → devopsdriver-0.1.37}/devopsdriver.egg-info/dependency_links.txt +0 -0
- {devopsdriver-0.1.36 → devopsdriver-0.1.37}/devopsdriver.egg-info/top_level.txt +0 -0
- {devopsdriver-0.1.36 → devopsdriver-0.1.37}/setup.cfg +0 -0
- {devopsdriver-0.1.36 → devopsdriver-0.1.37}/tests/test_azure_clients.py +0 -0
- {devopsdriver-0.1.36 → devopsdriver-0.1.37}/tests/test_azure_workitem.py +0 -0
- {devopsdriver-0.1.36 → devopsdriver-0.1.37}/tests/test_azure_workitem_client.py +0 -0
- {devopsdriver-0.1.36 → devopsdriver-0.1.37}/tests/test_sendmail.py +0 -0
- {devopsdriver-0.1.36 → devopsdriver-0.1.37}/tests/test_settings.py +0 -0
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: devopsdriver
|
|
3
|
+
Version: 0.1.37
|
|
4
|
+
Summary: DevOps tools
|
|
5
|
+
Author-email: Marc Page <marcallenpage@gmail.com>
|
|
6
|
+
License: This is free and unencumbered software released into the public domain.
|
|
7
|
+
|
|
8
|
+
Anyone is free to copy, modify, publish, use, compile, sell, or
|
|
9
|
+
distribute this software, either in source code form or as a compiled
|
|
10
|
+
binary, for any purpose, commercial or non-commercial, and by any
|
|
11
|
+
means.
|
|
12
|
+
|
|
13
|
+
In jurisdictions that recognize copyright laws, the author or authors
|
|
14
|
+
of this software dedicate any and all copyright interest in the
|
|
15
|
+
software to the public domain. We make this dedication for the benefit
|
|
16
|
+
of the public at large and to the detriment of our heirs and
|
|
17
|
+
successors. We intend this dedication to be an overt act of
|
|
18
|
+
relinquishment in perpetuity of all present and future rights to this
|
|
19
|
+
software under copyright law.
|
|
20
|
+
|
|
21
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
22
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
23
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
24
|
+
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
|
25
|
+
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
26
|
+
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
27
|
+
OTHER DEALINGS IN THE SOFTWARE.
|
|
28
|
+
|
|
29
|
+
For more information, please refer to <https://unlicense.org>
|
|
30
|
+
|
|
31
|
+
Project-URL: Homepage, https://github.com/marcpage/devops-driver
|
|
32
|
+
Project-URL: Documentation, https://github.com/marcpage/devops-driver
|
|
33
|
+
Project-URL: Repository, https://github.com/marcpage/devops-driver.git
|
|
34
|
+
Project-URL: Issues, https://github.com/marcpage/devops-driver/issues
|
|
35
|
+
Project-URL: Changelog, https://github.com/marcpage/devops-driver
|
|
36
|
+
Keywords: azure,devops,jira,confluence,email,pipelines,tools
|
|
37
|
+
Classifier: Development Status :: 1 - Planning
|
|
38
|
+
Classifier: Environment :: Console
|
|
39
|
+
Classifier: Intended Audience :: Developers
|
|
40
|
+
Classifier: Programming Language :: Python
|
|
41
|
+
Classifier: Programming Language :: Python :: 3
|
|
42
|
+
Classifier: License :: OSI Approved :: The Unlicense (Unlicense)
|
|
43
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
44
|
+
Classifier: Topic :: Utilities
|
|
45
|
+
Classifier: Topic :: Software Development
|
|
46
|
+
Requires-Python: >=3.10
|
|
47
|
+
Description-Content-Type: text/markdown
|
|
48
|
+
License-File: LICENSE
|
|
49
|
+
Requires-Dist: PyYAML==6.0.1
|
|
50
|
+
Requires-Dist: keyring==25.0.0
|
|
51
|
+
Requires-Dist: setuptools==69.0.2
|
|
52
|
+
Requires-Dist: azure-devops==7.1.0b4
|
|
53
|
+
Requires-Dist: Mako==1.3.2
|
|
54
|
+
|
|
55
|
+

|
|
56
|
+
[](https://pypi.org/project/devopsdriver/0.1.37/)
|
|
57
|
+
[](https://github.com/marcpage/devops-driver?tab=Unlicense-1-ov-file#readme)
|
|
58
|
+
[](https://github.com/marcpage/devops-driver/graphs/contributors)
|
|
59
|
+
[](http://makeapullrequest.com)
|
|
60
|
+
|
|
61
|
+
[](https://github.com/marcpage/devops-driver/commits)
|
|
62
|
+
[](https://github.com/marcpage/devops-driver/commits)
|
|
63
|
+
[](https://github.com/marcpage/devops-driver)
|
|
64
|
+
[](https://github.com/marcpage/devops-driver)
|
|
65
|
+
|
|
66
|
+
[](https://github.com/marcpage/devops-driver/actions/workflows/pr.yml)
|
|
67
|
+
[](https://github.com/marcpage/devops-driver/blob/main/Makefile#L4)
|
|
68
|
+
[](https://github.com/marcpage/devops-driver/issues)
|
|
69
|
+
[](https://github.com/marcpage/devops-driver/pulls)
|
|
70
|
+
|
|
71
|
+
[](https://github.com/marcpage?tab=followers)
|
|
72
|
+
[](https://github.com/marcpage/devops-driver/watchers)
|
|
73
|
+
|
|
74
|
+
[](https://python.org/)
|
|
75
|
+
[](https://azure.microsoft.com/)
|
|
76
|
+
[](https://gmail.com/)
|
|
77
|
+
|
|
78
|
+
OS:
|
|
79
|
+
[](https://microsoft.com/)
|
|
80
|
+
[](https://apple.com/)
|
|
81
|
+
[](https://linux.org/)
|
|
82
|
+
|
|
83
|
+
# devops-driver
|
|
84
|
+
|
|
85
|
+
Devops-driver is a collection of tools to help streamline developer's experience and gain insights into various processes.
|
|
86
|
+
|
|
87
|
+
## Access to secrets
|
|
88
|
+
|
|
89
|
+
To allow seamless work in both pipelines as well as in the development environment, the `Settings` object gives you access to common settings among multiple scripts, secrets, and configuration constants in a way the helps keep secrets out of the repository but runs just as well in the pipeline as your machine.
|
|
90
|
+
|
|
91
|
+
Say you want a pipeline that looks for User Stories that are newer than 3 days and send out an email.
|
|
92
|
+
|
|
93
|
+
### \<platform dependent path\>/devopsdriver.yml
|
|
94
|
+
```yaml
|
|
95
|
+
smtp:
|
|
96
|
+
sender: JohnDoe@company.com
|
|
97
|
+
|
|
98
|
+
secrets:
|
|
99
|
+
azure.token: azure/token
|
|
100
|
+
smtp.password: smtp/password
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
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.
|
|
104
|
+
The `secrets` are extra sensative and are stored in the OS keychain.
|
|
105
|
+
|
|
106
|
+
| Platform | Global Directory |
|
|
107
|
+
|----------|------------------------|
|
|
108
|
+
| Windows | %APPDATA%\ |
|
|
109
|
+
| Linux | ~/.devopsdriver/ |
|
|
110
|
+
| macOS | ~/Library/Preferences/ |
|
|
111
|
+
|
|
112
|
+
### Set secrets in the keychain
|
|
113
|
+
```bash
|
|
114
|
+
$ python3 -m venv .venv
|
|
115
|
+
$ source .venv/bin/activate
|
|
116
|
+
$ pip install devopsdriver
|
|
117
|
+
$ python -m devopsdriver.settings --secrets
|
|
118
|
+
secret: smtp.password key: smtp/password
|
|
119
|
+
smtp.password (smtp/password): ****
|
|
120
|
+
secret: azure.token key: azure/token
|
|
121
|
+
smtp.password (azure/token): ****
|
|
122
|
+
$ python -m devopsdriver.settings --secrets
|
|
123
|
+
secret: azure.token key: azure/token
|
|
124
|
+
Value set
|
|
125
|
+
secret: smtp.password key: smtp/password
|
|
126
|
+
Value set
|
|
127
|
+
$
|
|
128
|
+
```
|
|
129
|
+
The first call to `devopsdriver.settings` will look for every secret and check if they are already set in the keychain.
|
|
130
|
+
For any secret that has not been set in the keychain, you will be prompted to enter the password to store.
|
|
131
|
+
The second call to `devopsdriver.settings` will verify that all the values have been set in the keychain.
|
|
132
|
+
|
|
133
|
+
### devopsdriver.yml
|
|
134
|
+
```yaml
|
|
135
|
+
azure:
|
|
136
|
+
url: https://dev.azure.com/MyCompany
|
|
137
|
+
|
|
138
|
+
smtp:
|
|
139
|
+
server: smtp.company.com
|
|
140
|
+
port: 465
|
|
141
|
+
|
|
142
|
+
cli:
|
|
143
|
+
azure.token: --azure-token
|
|
144
|
+
smtp.password: --smtp-password
|
|
145
|
+
smtp.sender: --smtp-sender
|
|
146
|
+
|
|
147
|
+
env:
|
|
148
|
+
azure.token: AZURE_TOKEN
|
|
149
|
+
smtp.sender: SMTP_SENDER
|
|
150
|
+
smtp.password: SMTP_PASSWORD
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
This file lives next to your scripts in your repository.
|
|
154
|
+
These are settings that would be used by everyone, including the pipeline.
|
|
155
|
+
The `cli` and `env` map command line switches and environment variables to those keys.
|
|
156
|
+
This allows for many options for setting values depending on your needs.
|
|
157
|
+
|
|
158
|
+
### new_stories.yml
|
|
159
|
+
```yaml
|
|
160
|
+
scrum masters:
|
|
161
|
+
- JohnDoe@company.com
|
|
162
|
+
- JaneDoe@company.com
|
|
163
|
+
```
|
|
164
|
+
This file is specific to your script and not shared.
|
|
165
|
+
These are values that you want to use in your script but have them here for easy adjustment.
|
|
166
|
+
|
|
167
|
+
### new_stories.html.mako
|
|
168
|
+
```html
|
|
169
|
+
<h1>Stories created in the last ${days} days</h1>
|
|
170
|
+
<ul>
|
|
171
|
+
% for story in stories:
|
|
172
|
+
<li>${story.id} ${story.title}</li>
|
|
173
|
+
% endfor
|
|
174
|
+
</ul>
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### new_stories.py
|
|
178
|
+
```python
|
|
179
|
+
from datetime import date, timedelta
|
|
180
|
+
|
|
181
|
+
from devopsdriver import Settings, Azure, send_email, Template
|
|
182
|
+
from devopsdriver.azdo import Wiql, GreaterThan
|
|
183
|
+
|
|
184
|
+
# Parse all the settings from files, command line, environment, and keychain
|
|
185
|
+
settings = Settings(__file__).key("secrets").cli("cli").env("env")
|
|
186
|
+
|
|
187
|
+
# Create connection to Azure Devops
|
|
188
|
+
azure = Azure(settings)
|
|
189
|
+
|
|
190
|
+
# Get User Stories created in the last three days
|
|
191
|
+
three_days_ago = date.today() - timedelta(days=settings["days of recent stories"])
|
|
192
|
+
new_stories = azure.workitem.find(
|
|
193
|
+
Wiql().where(GreaterThan("CreatedDate", three_days_ago))
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
# Generate html body of the email
|
|
197
|
+
message = Template(__file__).render(
|
|
198
|
+
days=settings["days of recent stories"],
|
|
199
|
+
stories=new_stories,
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
# Send the email
|
|
203
|
+
send_email(
|
|
204
|
+
recipients=settings["scrum masters"],
|
|
205
|
+
subject=f'Stories created in the last {settings["days of recent stories"]} days',
|
|
206
|
+
html_body=message,
|
|
207
|
+
settings=settings,
|
|
208
|
+
)
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### The email sent
|
|
212
|
+
|
|
213
|
+
**From**: JohnDoe@company.com
|
|
214
|
+
|
|
215
|
+
**To**: JohnDoe@company.com, JaneDoe@company.com
|
|
216
|
+
|
|
217
|
+
**Subject**: Stories created in the last 3 days
|
|
218
|
+
|
|
219
|
+
#### Stories created in the last 3 days
|
|
220
|
+
|
|
221
|
+
- 745 Needs a preprocessing step that makes it case insensitive
|
|
222
|
+
- 749 Create GitHub action to automate process
|
|
223
|
+
- 750 Create GitHub action to automate process
|
|
224
|
+
- 751 Test
|
|
225
|
+
- 752 Feedback Capture
|
|
226
|
+
- 753 draft doc history retrieval method
|
|
227
|
+
- 754 frontend - store to schema
|
|
228
|
+
- 755 Transfer job to production. Setup migrations to move to production
|
|
229
|
+
- 756 Query subscription status from App
|
|
230
|
+
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+

|
|
2
|
+
[](https://pypi.org/project/devopsdriver/0.1.37/)
|
|
3
|
+
[](https://github.com/marcpage/devops-driver?tab=Unlicense-1-ov-file#readme)
|
|
4
|
+
[](https://github.com/marcpage/devops-driver/graphs/contributors)
|
|
5
|
+
[](http://makeapullrequest.com)
|
|
6
|
+
|
|
7
|
+
[](https://github.com/marcpage/devops-driver/commits)
|
|
8
|
+
[](https://github.com/marcpage/devops-driver/commits)
|
|
9
|
+
[](https://github.com/marcpage/devops-driver)
|
|
10
|
+
[](https://github.com/marcpage/devops-driver)
|
|
11
|
+
|
|
12
|
+
[](https://github.com/marcpage/devops-driver/actions/workflows/pr.yml)
|
|
13
|
+
[](https://github.com/marcpage/devops-driver/blob/main/Makefile#L4)
|
|
14
|
+
[](https://github.com/marcpage/devops-driver/issues)
|
|
15
|
+
[](https://github.com/marcpage/devops-driver/pulls)
|
|
16
|
+
|
|
17
|
+
[](https://github.com/marcpage?tab=followers)
|
|
18
|
+
[](https://github.com/marcpage/devops-driver/watchers)
|
|
19
|
+
|
|
20
|
+
[](https://python.org/)
|
|
21
|
+
[](https://azure.microsoft.com/)
|
|
22
|
+
[](https://gmail.com/)
|
|
23
|
+
|
|
24
|
+
OS:
|
|
25
|
+
[](https://microsoft.com/)
|
|
26
|
+
[](https://apple.com/)
|
|
27
|
+
[](https://linux.org/)
|
|
28
|
+
|
|
29
|
+
# devops-driver
|
|
30
|
+
|
|
31
|
+
Devops-driver is a collection of tools to help streamline developer's experience and gain insights into various processes.
|
|
32
|
+
|
|
33
|
+
## Access to secrets
|
|
34
|
+
|
|
35
|
+
To allow seamless work in both pipelines as well as in the development environment, the `Settings` object gives you access to common settings among multiple scripts, secrets, and configuration constants in a way the helps keep secrets out of the repository but runs just as well in the pipeline as your machine.
|
|
36
|
+
|
|
37
|
+
Say you want a pipeline that looks for User Stories that are newer than 3 days and send out an email.
|
|
38
|
+
|
|
39
|
+
### \<platform dependent path\>/devopsdriver.yml
|
|
40
|
+
```yaml
|
|
41
|
+
smtp:
|
|
42
|
+
sender: JohnDoe@company.com
|
|
43
|
+
|
|
44
|
+
secrets:
|
|
45
|
+
azure.token: azure/token
|
|
46
|
+
smtp.password: smtp/password
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
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.
|
|
50
|
+
The `secrets` are extra sensative and are stored in the OS keychain.
|
|
51
|
+
|
|
52
|
+
| Platform | Global Directory |
|
|
53
|
+
|----------|------------------------|
|
|
54
|
+
| Windows | %APPDATA%\ |
|
|
55
|
+
| Linux | ~/.devopsdriver/ |
|
|
56
|
+
| macOS | ~/Library/Preferences/ |
|
|
57
|
+
|
|
58
|
+
### Set secrets in the keychain
|
|
59
|
+
```bash
|
|
60
|
+
$ python3 -m venv .venv
|
|
61
|
+
$ source .venv/bin/activate
|
|
62
|
+
$ pip install devopsdriver
|
|
63
|
+
$ python -m devopsdriver.settings --secrets
|
|
64
|
+
secret: smtp.password key: smtp/password
|
|
65
|
+
smtp.password (smtp/password): ****
|
|
66
|
+
secret: azure.token key: azure/token
|
|
67
|
+
smtp.password (azure/token): ****
|
|
68
|
+
$ python -m devopsdriver.settings --secrets
|
|
69
|
+
secret: azure.token key: azure/token
|
|
70
|
+
Value set
|
|
71
|
+
secret: smtp.password key: smtp/password
|
|
72
|
+
Value set
|
|
73
|
+
$
|
|
74
|
+
```
|
|
75
|
+
The first call to `devopsdriver.settings` will look for every secret and check if they are already set in the keychain.
|
|
76
|
+
For any secret that has not been set in the keychain, you will be prompted to enter the password to store.
|
|
77
|
+
The second call to `devopsdriver.settings` will verify that all the values have been set in the keychain.
|
|
78
|
+
|
|
79
|
+
### devopsdriver.yml
|
|
80
|
+
```yaml
|
|
81
|
+
azure:
|
|
82
|
+
url: https://dev.azure.com/MyCompany
|
|
83
|
+
|
|
84
|
+
smtp:
|
|
85
|
+
server: smtp.company.com
|
|
86
|
+
port: 465
|
|
87
|
+
|
|
88
|
+
cli:
|
|
89
|
+
azure.token: --azure-token
|
|
90
|
+
smtp.password: --smtp-password
|
|
91
|
+
smtp.sender: --smtp-sender
|
|
92
|
+
|
|
93
|
+
env:
|
|
94
|
+
azure.token: AZURE_TOKEN
|
|
95
|
+
smtp.sender: SMTP_SENDER
|
|
96
|
+
smtp.password: SMTP_PASSWORD
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
This file lives next to your scripts in your repository.
|
|
100
|
+
These are settings that would be used by everyone, including the pipeline.
|
|
101
|
+
The `cli` and `env` map command line switches and environment variables to those keys.
|
|
102
|
+
This allows for many options for setting values depending on your needs.
|
|
103
|
+
|
|
104
|
+
### new_stories.yml
|
|
105
|
+
```yaml
|
|
106
|
+
scrum masters:
|
|
107
|
+
- JohnDoe@company.com
|
|
108
|
+
- JaneDoe@company.com
|
|
109
|
+
```
|
|
110
|
+
This file is specific to your script and not shared.
|
|
111
|
+
These are values that you want to use in your script but have them here for easy adjustment.
|
|
112
|
+
|
|
113
|
+
### new_stories.html.mako
|
|
114
|
+
```html
|
|
115
|
+
<h1>Stories created in the last ${days} days</h1>
|
|
116
|
+
<ul>
|
|
117
|
+
% for story in stories:
|
|
118
|
+
<li>${story.id} ${story.title}</li>
|
|
119
|
+
% endfor
|
|
120
|
+
</ul>
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### new_stories.py
|
|
124
|
+
```python
|
|
125
|
+
from datetime import date, timedelta
|
|
126
|
+
|
|
127
|
+
from devopsdriver import Settings, Azure, send_email, Template
|
|
128
|
+
from devopsdriver.azdo import Wiql, GreaterThan
|
|
129
|
+
|
|
130
|
+
# Parse all the settings from files, command line, environment, and keychain
|
|
131
|
+
settings = Settings(__file__).key("secrets").cli("cli").env("env")
|
|
132
|
+
|
|
133
|
+
# Create connection to Azure Devops
|
|
134
|
+
azure = Azure(settings)
|
|
135
|
+
|
|
136
|
+
# Get User Stories created in the last three days
|
|
137
|
+
three_days_ago = date.today() - timedelta(days=settings["days of recent stories"])
|
|
138
|
+
new_stories = azure.workitem.find(
|
|
139
|
+
Wiql().where(GreaterThan("CreatedDate", three_days_ago))
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
# Generate html body of the email
|
|
143
|
+
message = Template(__file__).render(
|
|
144
|
+
days=settings["days of recent stories"],
|
|
145
|
+
stories=new_stories,
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
# Send the email
|
|
149
|
+
send_email(
|
|
150
|
+
recipients=settings["scrum masters"],
|
|
151
|
+
subject=f'Stories created in the last {settings["days of recent stories"]} days',
|
|
152
|
+
html_body=message,
|
|
153
|
+
settings=settings,
|
|
154
|
+
)
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### The email sent
|
|
158
|
+
|
|
159
|
+
**From**: JohnDoe@company.com
|
|
160
|
+
|
|
161
|
+
**To**: JohnDoe@company.com, JaneDoe@company.com
|
|
162
|
+
|
|
163
|
+
**Subject**: Stories created in the last 3 days
|
|
164
|
+
|
|
165
|
+
#### Stories created in the last 3 days
|
|
166
|
+
|
|
167
|
+
- 745 Needs a preprocessing step that makes it case insensitive
|
|
168
|
+
- 749 Create GitHub action to automate process
|
|
169
|
+
- 750 Create GitHub action to automate process
|
|
170
|
+
- 751 Test
|
|
171
|
+
- 752 Feedback Capture
|
|
172
|
+
- 753 draft doc history retrieval method
|
|
173
|
+
- 754 frontend - store to schema
|
|
174
|
+
- 755 Transfer job to production. Setup migrations to move to production
|
|
175
|
+
- 756 Query subscription status from App
|
|
176
|
+
|
|
@@ -87,10 +87,10 @@ class Value: # pylint: disable=too-few-public-methods
|
|
|
87
87
|
|
|
88
88
|
def __str__(self) -> str:
|
|
89
89
|
if isinstance(self.value, datetime):
|
|
90
|
-
return self.value.strftime("%
|
|
90
|
+
return f'"{self.value.strftime("%m/%d/%Y %H:%M:%S")}"'
|
|
91
91
|
|
|
92
92
|
if isinstance(self.value, date):
|
|
93
|
-
return self.value.strftime("%
|
|
93
|
+
return f'"{self.value.strftime("%m/%d/%Y")}"'
|
|
94
94
|
|
|
95
95
|
if isinstance(self.value, int):
|
|
96
96
|
return str(self.value)
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
|
|
3
|
+
""" Module Doc """
|
|
4
|
+
|
|
5
|
+
from os.path import dirname, basename, splitext
|
|
6
|
+
|
|
7
|
+
from mako.lookup import TemplateLookup
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Template: # pylint: disable=too-few-public-methods
|
|
11
|
+
"""render template files"""
|
|
12
|
+
|
|
13
|
+
def __init__(self, file: str, *search_dirs, extension=None):
|
|
14
|
+
self.template = file
|
|
15
|
+
self.extension = extension
|
|
16
|
+
self.lookup = TemplateLookup(
|
|
17
|
+
directories=[dirname(file), *search_dirs],
|
|
18
|
+
output_encoding="utf-8",
|
|
19
|
+
module_directory="/tmp/mako_modules",
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
def render(self, **args) -> str:
|
|
23
|
+
"""Given a set of arguments, render the template
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
args (dict): variables and their values
|
|
27
|
+
|
|
28
|
+
Returns:
|
|
29
|
+
str: The rendered template
|
|
30
|
+
"""
|
|
31
|
+
name = basename(self.template)
|
|
32
|
+
base, extension = splitext(name)
|
|
33
|
+
|
|
34
|
+
if self.extension:
|
|
35
|
+
name = base + self.extension
|
|
36
|
+
|
|
37
|
+
elif extension == ".py":
|
|
38
|
+
name = base + ".html.mako"
|
|
39
|
+
|
|
40
|
+
return self.lookup.get_template(name).render(**args).decode("utf-8")
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: devopsdriver
|
|
3
|
+
Version: 0.1.37
|
|
4
|
+
Summary: DevOps tools
|
|
5
|
+
Author-email: Marc Page <marcallenpage@gmail.com>
|
|
6
|
+
License: This is free and unencumbered software released into the public domain.
|
|
7
|
+
|
|
8
|
+
Anyone is free to copy, modify, publish, use, compile, sell, or
|
|
9
|
+
distribute this software, either in source code form or as a compiled
|
|
10
|
+
binary, for any purpose, commercial or non-commercial, and by any
|
|
11
|
+
means.
|
|
12
|
+
|
|
13
|
+
In jurisdictions that recognize copyright laws, the author or authors
|
|
14
|
+
of this software dedicate any and all copyright interest in the
|
|
15
|
+
software to the public domain. We make this dedication for the benefit
|
|
16
|
+
of the public at large and to the detriment of our heirs and
|
|
17
|
+
successors. We intend this dedication to be an overt act of
|
|
18
|
+
relinquishment in perpetuity of all present and future rights to this
|
|
19
|
+
software under copyright law.
|
|
20
|
+
|
|
21
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
22
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
23
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
24
|
+
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
|
25
|
+
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
26
|
+
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
27
|
+
OTHER DEALINGS IN THE SOFTWARE.
|
|
28
|
+
|
|
29
|
+
For more information, please refer to <https://unlicense.org>
|
|
30
|
+
|
|
31
|
+
Project-URL: Homepage, https://github.com/marcpage/devops-driver
|
|
32
|
+
Project-URL: Documentation, https://github.com/marcpage/devops-driver
|
|
33
|
+
Project-URL: Repository, https://github.com/marcpage/devops-driver.git
|
|
34
|
+
Project-URL: Issues, https://github.com/marcpage/devops-driver/issues
|
|
35
|
+
Project-URL: Changelog, https://github.com/marcpage/devops-driver
|
|
36
|
+
Keywords: azure,devops,jira,confluence,email,pipelines,tools
|
|
37
|
+
Classifier: Development Status :: 1 - Planning
|
|
38
|
+
Classifier: Environment :: Console
|
|
39
|
+
Classifier: Intended Audience :: Developers
|
|
40
|
+
Classifier: Programming Language :: Python
|
|
41
|
+
Classifier: Programming Language :: Python :: 3
|
|
42
|
+
Classifier: License :: OSI Approved :: The Unlicense (Unlicense)
|
|
43
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
44
|
+
Classifier: Topic :: Utilities
|
|
45
|
+
Classifier: Topic :: Software Development
|
|
46
|
+
Requires-Python: >=3.10
|
|
47
|
+
Description-Content-Type: text/markdown
|
|
48
|
+
License-File: LICENSE
|
|
49
|
+
Requires-Dist: PyYAML==6.0.1
|
|
50
|
+
Requires-Dist: keyring==25.0.0
|
|
51
|
+
Requires-Dist: setuptools==69.0.2
|
|
52
|
+
Requires-Dist: azure-devops==7.1.0b4
|
|
53
|
+
Requires-Dist: Mako==1.3.2
|
|
54
|
+
|
|
55
|
+

|
|
56
|
+
[](https://pypi.org/project/devopsdriver/0.1.37/)
|
|
57
|
+
[](https://github.com/marcpage/devops-driver?tab=Unlicense-1-ov-file#readme)
|
|
58
|
+
[](https://github.com/marcpage/devops-driver/graphs/contributors)
|
|
59
|
+
[](http://makeapullrequest.com)
|
|
60
|
+
|
|
61
|
+
[](https://github.com/marcpage/devops-driver/commits)
|
|
62
|
+
[](https://github.com/marcpage/devops-driver/commits)
|
|
63
|
+
[](https://github.com/marcpage/devops-driver)
|
|
64
|
+
[](https://github.com/marcpage/devops-driver)
|
|
65
|
+
|
|
66
|
+
[](https://github.com/marcpage/devops-driver/actions/workflows/pr.yml)
|
|
67
|
+
[](https://github.com/marcpage/devops-driver/blob/main/Makefile#L4)
|
|
68
|
+
[](https://github.com/marcpage/devops-driver/issues)
|
|
69
|
+
[](https://github.com/marcpage/devops-driver/pulls)
|
|
70
|
+
|
|
71
|
+
[](https://github.com/marcpage?tab=followers)
|
|
72
|
+
[](https://github.com/marcpage/devops-driver/watchers)
|
|
73
|
+
|
|
74
|
+
[](https://python.org/)
|
|
75
|
+
[](https://azure.microsoft.com/)
|
|
76
|
+
[](https://gmail.com/)
|
|
77
|
+
|
|
78
|
+
OS:
|
|
79
|
+
[](https://microsoft.com/)
|
|
80
|
+
[](https://apple.com/)
|
|
81
|
+
[](https://linux.org/)
|
|
82
|
+
|
|
83
|
+
# devops-driver
|
|
84
|
+
|
|
85
|
+
Devops-driver is a collection of tools to help streamline developer's experience and gain insights into various processes.
|
|
86
|
+
|
|
87
|
+
## Access to secrets
|
|
88
|
+
|
|
89
|
+
To allow seamless work in both pipelines as well as in the development environment, the `Settings` object gives you access to common settings among multiple scripts, secrets, and configuration constants in a way the helps keep secrets out of the repository but runs just as well in the pipeline as your machine.
|
|
90
|
+
|
|
91
|
+
Say you want a pipeline that looks for User Stories that are newer than 3 days and send out an email.
|
|
92
|
+
|
|
93
|
+
### \<platform dependent path\>/devopsdriver.yml
|
|
94
|
+
```yaml
|
|
95
|
+
smtp:
|
|
96
|
+
sender: JohnDoe@company.com
|
|
97
|
+
|
|
98
|
+
secrets:
|
|
99
|
+
azure.token: azure/token
|
|
100
|
+
smtp.password: smtp/password
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
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.
|
|
104
|
+
The `secrets` are extra sensative and are stored in the OS keychain.
|
|
105
|
+
|
|
106
|
+
| Platform | Global Directory |
|
|
107
|
+
|----------|------------------------|
|
|
108
|
+
| Windows | %APPDATA%\ |
|
|
109
|
+
| Linux | ~/.devopsdriver/ |
|
|
110
|
+
| macOS | ~/Library/Preferences/ |
|
|
111
|
+
|
|
112
|
+
### Set secrets in the keychain
|
|
113
|
+
```bash
|
|
114
|
+
$ python3 -m venv .venv
|
|
115
|
+
$ source .venv/bin/activate
|
|
116
|
+
$ pip install devopsdriver
|
|
117
|
+
$ python -m devopsdriver.settings --secrets
|
|
118
|
+
secret: smtp.password key: smtp/password
|
|
119
|
+
smtp.password (smtp/password): ****
|
|
120
|
+
secret: azure.token key: azure/token
|
|
121
|
+
smtp.password (azure/token): ****
|
|
122
|
+
$ python -m devopsdriver.settings --secrets
|
|
123
|
+
secret: azure.token key: azure/token
|
|
124
|
+
Value set
|
|
125
|
+
secret: smtp.password key: smtp/password
|
|
126
|
+
Value set
|
|
127
|
+
$
|
|
128
|
+
```
|
|
129
|
+
The first call to `devopsdriver.settings` will look for every secret and check if they are already set in the keychain.
|
|
130
|
+
For any secret that has not been set in the keychain, you will be prompted to enter the password to store.
|
|
131
|
+
The second call to `devopsdriver.settings` will verify that all the values have been set in the keychain.
|
|
132
|
+
|
|
133
|
+
### devopsdriver.yml
|
|
134
|
+
```yaml
|
|
135
|
+
azure:
|
|
136
|
+
url: https://dev.azure.com/MyCompany
|
|
137
|
+
|
|
138
|
+
smtp:
|
|
139
|
+
server: smtp.company.com
|
|
140
|
+
port: 465
|
|
141
|
+
|
|
142
|
+
cli:
|
|
143
|
+
azure.token: --azure-token
|
|
144
|
+
smtp.password: --smtp-password
|
|
145
|
+
smtp.sender: --smtp-sender
|
|
146
|
+
|
|
147
|
+
env:
|
|
148
|
+
azure.token: AZURE_TOKEN
|
|
149
|
+
smtp.sender: SMTP_SENDER
|
|
150
|
+
smtp.password: SMTP_PASSWORD
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
This file lives next to your scripts in your repository.
|
|
154
|
+
These are settings that would be used by everyone, including the pipeline.
|
|
155
|
+
The `cli` and `env` map command line switches and environment variables to those keys.
|
|
156
|
+
This allows for many options for setting values depending on your needs.
|
|
157
|
+
|
|
158
|
+
### new_stories.yml
|
|
159
|
+
```yaml
|
|
160
|
+
scrum masters:
|
|
161
|
+
- JohnDoe@company.com
|
|
162
|
+
- JaneDoe@company.com
|
|
163
|
+
```
|
|
164
|
+
This file is specific to your script and not shared.
|
|
165
|
+
These are values that you want to use in your script but have them here for easy adjustment.
|
|
166
|
+
|
|
167
|
+
### new_stories.html.mako
|
|
168
|
+
```html
|
|
169
|
+
<h1>Stories created in the last ${days} days</h1>
|
|
170
|
+
<ul>
|
|
171
|
+
% for story in stories:
|
|
172
|
+
<li>${story.id} ${story.title}</li>
|
|
173
|
+
% endfor
|
|
174
|
+
</ul>
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### new_stories.py
|
|
178
|
+
```python
|
|
179
|
+
from datetime import date, timedelta
|
|
180
|
+
|
|
181
|
+
from devopsdriver import Settings, Azure, send_email, Template
|
|
182
|
+
from devopsdriver.azdo import Wiql, GreaterThan
|
|
183
|
+
|
|
184
|
+
# Parse all the settings from files, command line, environment, and keychain
|
|
185
|
+
settings = Settings(__file__).key("secrets").cli("cli").env("env")
|
|
186
|
+
|
|
187
|
+
# Create connection to Azure Devops
|
|
188
|
+
azure = Azure(settings)
|
|
189
|
+
|
|
190
|
+
# Get User Stories created in the last three days
|
|
191
|
+
three_days_ago = date.today() - timedelta(days=settings["days of recent stories"])
|
|
192
|
+
new_stories = azure.workitem.find(
|
|
193
|
+
Wiql().where(GreaterThan("CreatedDate", three_days_ago))
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
# Generate html body of the email
|
|
197
|
+
message = Template(__file__).render(
|
|
198
|
+
days=settings["days of recent stories"],
|
|
199
|
+
stories=new_stories,
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
# Send the email
|
|
203
|
+
send_email(
|
|
204
|
+
recipients=settings["scrum masters"],
|
|
205
|
+
subject=f'Stories created in the last {settings["days of recent stories"]} days',
|
|
206
|
+
html_body=message,
|
|
207
|
+
settings=settings,
|
|
208
|
+
)
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### The email sent
|
|
212
|
+
|
|
213
|
+
**From**: JohnDoe@company.com
|
|
214
|
+
|
|
215
|
+
**To**: JohnDoe@company.com, JaneDoe@company.com
|
|
216
|
+
|
|
217
|
+
**Subject**: Stories created in the last 3 days
|
|
218
|
+
|
|
219
|
+
#### Stories created in the last 3 days
|
|
220
|
+
|
|
221
|
+
- 745 Needs a preprocessing step that makes it case insensitive
|
|
222
|
+
- 749 Create GitHub action to automate process
|
|
223
|
+
- 750 Create GitHub action to automate process
|
|
224
|
+
- 751 Test
|
|
225
|
+
- 752 Feedback Capture
|
|
226
|
+
- 753 draft doc history retrieval method
|
|
227
|
+
- 754 frontend - store to schema
|
|
228
|
+
- 755 Transfer job to production. Setup migrations to move to production
|
|
229
|
+
- 756 Query subscription status from App
|
|
230
|
+
|
|
@@ -4,6 +4,7 @@ pyproject.toml
|
|
|
4
4
|
devopsdriver/__init__.py
|
|
5
5
|
devopsdriver/sendmail.py
|
|
6
6
|
devopsdriver/settings.py
|
|
7
|
+
devopsdriver/template.py
|
|
7
8
|
devopsdriver.egg-info/PKG-INFO
|
|
8
9
|
devopsdriver.egg-info/SOURCES.txt
|
|
9
10
|
devopsdriver.egg-info/dependency_links.txt
|
|
@@ -20,4 +21,5 @@ tests/test_azure_workitem.py
|
|
|
20
21
|
tests/test_azure_workitem_client.py
|
|
21
22
|
tests/test_azure_workitem_wiql.py
|
|
22
23
|
tests/test_sendmail.py
|
|
23
|
-
tests/test_settings.py
|
|
24
|
+
tests/test_settings.py
|
|
25
|
+
tests/test_template.py
|
|
@@ -46,12 +46,12 @@ def test_expressions() -> None:
|
|
|
46
46
|
"""SELECT [System.State], [System.Id] FROM workitems """
|
|
47
47
|
+ """WHERE [System.State] = "New" AND [System.Title] IS EMPTY """
|
|
48
48
|
+ """AND [Microsoft.VSTS.Common.Priority] IS NOT EMPTY """
|
|
49
|
-
+ """AND [System.CreatedDate] >
|
|
50
|
-
+ """AND [System.CreatedDate] <
|
|
49
|
+
+ """AND [System.CreatedDate] > "06/30/2024" """
|
|
50
|
+
+ """AND [System.CreatedDate] < "01/01/2025 18:30:15" AND [RootCause] IS EMPTY """
|
|
51
51
|
+ """OR [Microsoft.VSTS.Common.Priority] <> 1 OR [Rank] < 5.000 """
|
|
52
52
|
+ """OR [time] <= 4.000 OR [BusinessValue] >= 4 """
|
|
53
53
|
+ """ORDER BY [Microsoft.VSTS.Common.Priority] DESC, [System.CreatedDate] ASC """
|
|
54
|
-
+ """ASOF
|
|
54
|
+
+ """ASOF "06/30/2024\""""
|
|
55
55
|
)
|
|
56
56
|
assert str(builder) == expected, str(builder)
|
|
57
57
|
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
|
|
3
|
+
""" test Template """
|
|
4
|
+
|
|
5
|
+
from os.path import join
|
|
6
|
+
from tempfile import TemporaryDirectory
|
|
7
|
+
|
|
8
|
+
from devopsdriver.template import Template
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def test_basic() -> None:
|
|
12
|
+
"""test the basic usage of the template"""
|
|
13
|
+
with TemporaryDirectory() as working_dir:
|
|
14
|
+
template_path = join(working_dir, "template.html.mako")
|
|
15
|
+
script_path = join(working_dir, "template.py")
|
|
16
|
+
|
|
17
|
+
with open(template_path, "w", encoding="utf-8") as template:
|
|
18
|
+
template.write("value = ${value}")
|
|
19
|
+
|
|
20
|
+
result = Template(template_path).render(value=5)
|
|
21
|
+
assert result == "value = 5", result
|
|
22
|
+
result = Template(script_path).render(value=5)
|
|
23
|
+
assert result == "value = 5", result
|
|
24
|
+
result = Template(script_path, extension=".html.mako").render(value=5)
|
|
25
|
+
assert result == "value = 5", result
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
if __name__ == "__main__":
|
|
29
|
+
test_basic()
|
devopsdriver-0.1.36/PKG-INFO
DELETED
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.1
|
|
2
|
-
Name: devopsdriver
|
|
3
|
-
Version: 0.1.36
|
|
4
|
-
Summary: DevOps tools
|
|
5
|
-
Author-email: Marc Page <marcallenpage@gmail.com>
|
|
6
|
-
License: This is free and unencumbered software released into the public domain.
|
|
7
|
-
|
|
8
|
-
Anyone is free to copy, modify, publish, use, compile, sell, or
|
|
9
|
-
distribute this software, either in source code form or as a compiled
|
|
10
|
-
binary, for any purpose, commercial or non-commercial, and by any
|
|
11
|
-
means.
|
|
12
|
-
|
|
13
|
-
In jurisdictions that recognize copyright laws, the author or authors
|
|
14
|
-
of this software dedicate any and all copyright interest in the
|
|
15
|
-
software to the public domain. We make this dedication for the benefit
|
|
16
|
-
of the public at large and to the detriment of our heirs and
|
|
17
|
-
successors. We intend this dedication to be an overt act of
|
|
18
|
-
relinquishment in perpetuity of all present and future rights to this
|
|
19
|
-
software under copyright law.
|
|
20
|
-
|
|
21
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
22
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
23
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
24
|
-
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
|
25
|
-
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
26
|
-
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
27
|
-
OTHER DEALINGS IN THE SOFTWARE.
|
|
28
|
-
|
|
29
|
-
For more information, please refer to <https://unlicense.org>
|
|
30
|
-
|
|
31
|
-
Project-URL: Homepage, https://github.com/marcpage/devops-driver
|
|
32
|
-
Project-URL: Documentation, https://github.com/marcpage/devops-driver
|
|
33
|
-
Project-URL: Repository, https://github.com/marcpage/devops-driver.git
|
|
34
|
-
Project-URL: Issues, https://github.com/marcpage/devops-driver/issues
|
|
35
|
-
Project-URL: Changelog, https://github.com/marcpage/devops-driver
|
|
36
|
-
Keywords: azure,devops,jira,confluence,email,pipelines,tools
|
|
37
|
-
Classifier: Development Status :: 1 - Planning
|
|
38
|
-
Classifier: Environment :: Console
|
|
39
|
-
Classifier: Intended Audience :: Developers
|
|
40
|
-
Classifier: Programming Language :: Python
|
|
41
|
-
Classifier: Programming Language :: Python :: 3
|
|
42
|
-
Classifier: License :: OSI Approved :: The Unlicense (Unlicense)
|
|
43
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
44
|
-
Classifier: Topic :: Utilities
|
|
45
|
-
Classifier: Topic :: Software Development
|
|
46
|
-
Requires-Python: >=3.10
|
|
47
|
-
Description-Content-Type: text/markdown
|
|
48
|
-
License-File: LICENSE
|
|
49
|
-
Requires-Dist: PyYAML==6.0.1
|
|
50
|
-
Requires-Dist: keyring==25.0.0
|
|
51
|
-
Requires-Dist: setuptools==69.0.2
|
|
52
|
-
Requires-Dist: azure-devops==7.1.0b4
|
|
53
|
-
|
|
54
|
-

|
|
55
|
-
[](https://pypi.org/project/devopsdriver/0.1.36/)
|
|
56
|
-
[](https://github.com/marcpage/devops-driver?tab=Unlicense-1-ov-file#readme)
|
|
57
|
-
[](https://github.com/marcpage/devops-driver/graphs/contributors)
|
|
58
|
-
[](http://makeapullrequest.com)
|
|
59
|
-
|
|
60
|
-
[](https://github.com/marcpage/devops-driver/commits)
|
|
61
|
-
[](https://github.com/marcpage/devops-driver/commits)
|
|
62
|
-
[](https://github.com/marcpage/devops-driver)
|
|
63
|
-
[](https://github.com/marcpage/devops-driver)
|
|
64
|
-
|
|
65
|
-
[](https://github.com/marcpage/devops-driver/actions/workflows/pr.yml)
|
|
66
|
-
[](https://github.com/marcpage/devops-driver/blob/main/Makefile#L4)
|
|
67
|
-
[](https://github.com/marcpage/devops-driver/issues)
|
|
68
|
-
[](https://github.com/marcpage/devops-driver/pulls)
|
|
69
|
-
|
|
70
|
-
[](https://github.com/marcpage?tab=followers)
|
|
71
|
-
[](https://github.com/marcpage/devops-driver/watchers)
|
|
72
|
-
|
|
73
|
-
# devops-driver
|
|
74
|
-
|
|
75
|
-
Devops-driver is a set of tools to help streamline developer's experience. It is a collection of tools to help gain insights into various processes.
|
|
76
|
-
|
devopsdriver-0.1.36/README.md
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-

|
|
2
|
-
[](https://pypi.org/project/devopsdriver/0.1.36/)
|
|
3
|
-
[](https://github.com/marcpage/devops-driver?tab=Unlicense-1-ov-file#readme)
|
|
4
|
-
[](https://github.com/marcpage/devops-driver/graphs/contributors)
|
|
5
|
-
[](http://makeapullrequest.com)
|
|
6
|
-
|
|
7
|
-
[](https://github.com/marcpage/devops-driver/commits)
|
|
8
|
-
[](https://github.com/marcpage/devops-driver/commits)
|
|
9
|
-
[](https://github.com/marcpage/devops-driver)
|
|
10
|
-
[](https://github.com/marcpage/devops-driver)
|
|
11
|
-
|
|
12
|
-
[](https://github.com/marcpage/devops-driver/actions/workflows/pr.yml)
|
|
13
|
-
[](https://github.com/marcpage/devops-driver/blob/main/Makefile#L4)
|
|
14
|
-
[](https://github.com/marcpage/devops-driver/issues)
|
|
15
|
-
[](https://github.com/marcpage/devops-driver/pulls)
|
|
16
|
-
|
|
17
|
-
[](https://github.com/marcpage?tab=followers)
|
|
18
|
-
[](https://github.com/marcpage/devops-driver/watchers)
|
|
19
|
-
|
|
20
|
-
# devops-driver
|
|
21
|
-
|
|
22
|
-
Devops-driver is a set of tools to help streamline developer's experience. It is a collection of tools to help gain insights into various processes.
|
|
23
|
-
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.1
|
|
2
|
-
Name: devopsdriver
|
|
3
|
-
Version: 0.1.36
|
|
4
|
-
Summary: DevOps tools
|
|
5
|
-
Author-email: Marc Page <marcallenpage@gmail.com>
|
|
6
|
-
License: This is free and unencumbered software released into the public domain.
|
|
7
|
-
|
|
8
|
-
Anyone is free to copy, modify, publish, use, compile, sell, or
|
|
9
|
-
distribute this software, either in source code form or as a compiled
|
|
10
|
-
binary, for any purpose, commercial or non-commercial, and by any
|
|
11
|
-
means.
|
|
12
|
-
|
|
13
|
-
In jurisdictions that recognize copyright laws, the author or authors
|
|
14
|
-
of this software dedicate any and all copyright interest in the
|
|
15
|
-
software to the public domain. We make this dedication for the benefit
|
|
16
|
-
of the public at large and to the detriment of our heirs and
|
|
17
|
-
successors. We intend this dedication to be an overt act of
|
|
18
|
-
relinquishment in perpetuity of all present and future rights to this
|
|
19
|
-
software under copyright law.
|
|
20
|
-
|
|
21
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
22
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
23
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
24
|
-
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
|
25
|
-
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
26
|
-
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
27
|
-
OTHER DEALINGS IN THE SOFTWARE.
|
|
28
|
-
|
|
29
|
-
For more information, please refer to <https://unlicense.org>
|
|
30
|
-
|
|
31
|
-
Project-URL: Homepage, https://github.com/marcpage/devops-driver
|
|
32
|
-
Project-URL: Documentation, https://github.com/marcpage/devops-driver
|
|
33
|
-
Project-URL: Repository, https://github.com/marcpage/devops-driver.git
|
|
34
|
-
Project-URL: Issues, https://github.com/marcpage/devops-driver/issues
|
|
35
|
-
Project-URL: Changelog, https://github.com/marcpage/devops-driver
|
|
36
|
-
Keywords: azure,devops,jira,confluence,email,pipelines,tools
|
|
37
|
-
Classifier: Development Status :: 1 - Planning
|
|
38
|
-
Classifier: Environment :: Console
|
|
39
|
-
Classifier: Intended Audience :: Developers
|
|
40
|
-
Classifier: Programming Language :: Python
|
|
41
|
-
Classifier: Programming Language :: Python :: 3
|
|
42
|
-
Classifier: License :: OSI Approved :: The Unlicense (Unlicense)
|
|
43
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
44
|
-
Classifier: Topic :: Utilities
|
|
45
|
-
Classifier: Topic :: Software Development
|
|
46
|
-
Requires-Python: >=3.10
|
|
47
|
-
Description-Content-Type: text/markdown
|
|
48
|
-
License-File: LICENSE
|
|
49
|
-
Requires-Dist: PyYAML==6.0.1
|
|
50
|
-
Requires-Dist: keyring==25.0.0
|
|
51
|
-
Requires-Dist: setuptools==69.0.2
|
|
52
|
-
Requires-Dist: azure-devops==7.1.0b4
|
|
53
|
-
|
|
54
|
-

|
|
55
|
-
[](https://pypi.org/project/devopsdriver/0.1.36/)
|
|
56
|
-
[](https://github.com/marcpage/devops-driver?tab=Unlicense-1-ov-file#readme)
|
|
57
|
-
[](https://github.com/marcpage/devops-driver/graphs/contributors)
|
|
58
|
-
[](http://makeapullrequest.com)
|
|
59
|
-
|
|
60
|
-
[](https://github.com/marcpage/devops-driver/commits)
|
|
61
|
-
[](https://github.com/marcpage/devops-driver/commits)
|
|
62
|
-
[](https://github.com/marcpage/devops-driver)
|
|
63
|
-
[](https://github.com/marcpage/devops-driver)
|
|
64
|
-
|
|
65
|
-
[](https://github.com/marcpage/devops-driver/actions/workflows/pr.yml)
|
|
66
|
-
[](https://github.com/marcpage/devops-driver/blob/main/Makefile#L4)
|
|
67
|
-
[](https://github.com/marcpage/devops-driver/issues)
|
|
68
|
-
[](https://github.com/marcpage/devops-driver/pulls)
|
|
69
|
-
|
|
70
|
-
[](https://github.com/marcpage?tab=followers)
|
|
71
|
-
[](https://github.com/marcpage/devops-driver/watchers)
|
|
72
|
-
|
|
73
|
-
# devops-driver
|
|
74
|
-
|
|
75
|
-
Devops-driver is a set of tools to help streamline developer's experience. It is a collection of tools to help gain insights into various processes.
|
|
76
|
-
|
|
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
|