developer-assistant 0.3.5__tar.gz → 0.3.6__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.
- {developer_assistant-0.3.5/developer_assistant.egg-info → developer_assistant-0.3.6}/PKG-INFO +14 -16
- {developer_assistant-0.3.5 → developer_assistant-0.3.6}/PYPI.md +12 -6
- {developer_assistant-0.3.5 → developer_assistant-0.3.6}/README.md +7 -5
- {developer_assistant-0.3.5 → developer_assistant-0.3.6}/da/interface.py +59 -35
- {developer_assistant-0.3.5 → developer_assistant-0.3.6}/da/modules/config_manager.py +24 -8
- {developer_assistant-0.3.5 → developer_assistant-0.3.6}/da/modules/opener.py +1 -1
- {developer_assistant-0.3.5 → developer_assistant-0.3.6}/da/modules/projects_manager.py +6 -7
- {developer_assistant-0.3.5 → developer_assistant-0.3.6}/da/modules/version_logic.py +6 -6
- {developer_assistant-0.3.5 → developer_assistant-0.3.6/developer_assistant.egg-info}/PKG-INFO +14 -16
- {developer_assistant-0.3.5 → developer_assistant-0.3.6}/pyproject.toml +2 -2
- {developer_assistant-0.3.5 → developer_assistant-0.3.6}/LICENSE +0 -0
- {developer_assistant-0.3.5 → developer_assistant-0.3.6}/da/__init__.py +0 -0
- {developer_assistant-0.3.5 → developer_assistant-0.3.6}/da/default/default-changelog.md +0 -0
- {developer_assistant-0.3.5 → developer_assistant-0.3.6}/da/default/default-memory.ini +0 -0
- {developer_assistant-0.3.5 → developer_assistant-0.3.6}/da/default/test-project.ini +0 -0
- {developer_assistant-0.3.5 → developer_assistant-0.3.6}/da/intro.md +0 -0
- {developer_assistant-0.3.5 → developer_assistant-0.3.6}/da/modules/__init__.py +0 -0
- {developer_assistant-0.3.5 → developer_assistant-0.3.6}/da/templates/changelog_template.txt +0 -0
- {developer_assistant-0.3.5 → developer_assistant-0.3.6}/da/templates/entry_template.txt +0 -0
- {developer_assistant-0.3.5 → developer_assistant-0.3.6}/da/templates/header_template.txt +0 -0
- {developer_assistant-0.3.5 → developer_assistant-0.3.6}/developer_assistant.egg-info/SOURCES.txt +0 -0
- {developer_assistant-0.3.5 → developer_assistant-0.3.6}/developer_assistant.egg-info/dependency_links.txt +0 -0
- {developer_assistant-0.3.5 → developer_assistant-0.3.6}/developer_assistant.egg-info/entry_points.txt +0 -0
- {developer_assistant-0.3.5 → developer_assistant-0.3.6}/developer_assistant.egg-info/requires.txt +0 -0
- {developer_assistant-0.3.5 → developer_assistant-0.3.6}/developer_assistant.egg-info/top_level.txt +0 -0
- {developer_assistant-0.3.5 → developer_assistant-0.3.6}/setup.cfg +0 -0
{developer_assistant-0.3.5/developer_assistant.egg-info → developer_assistant-0.3.6}/PKG-INFO
RENAMED
|
@@ -1,16 +1,8 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: developer-assistant
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.6
|
|
4
4
|
Summary: A lightweight TUI app for managing and simplifying your Markdown changelogs.
|
|
5
|
-
License:
|
|
6
|
-
|
|
7
|
-
Copyright (c) 2026 Ivori Huobolainen
|
|
8
|
-
|
|
9
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
10
|
-
|
|
11
|
-
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
12
|
-
|
|
13
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
5
|
+
License-Expression: MIT
|
|
14
6
|
Project-URL: Homepage, https://github.com/Ivory-Hubert/Developer-Assistant
|
|
15
7
|
Project-URL: Changelog, https://github.com/Ivory-Hubert/Developer-Assistant/blob/main/CHANGELOG.md
|
|
16
8
|
Classifier: Programming Language :: Python :: 3
|
|
@@ -30,7 +22,7 @@ Dynamic: license-file
|
|
|
30
22
|
|
|
31
23
|
## Installing from PyPI
|
|
32
24
|
|
|
33
|
-
The program is designed for minimal friction and simple setup. Only installation is required, on first run DA will create local user data automatically. The same process is used for new profiles.
|
|
25
|
+
The program is designed for minimal friction and simple setup. Only installation is required, on first run DA will create local user data automatically. The same automatic process is used for creating new profiles.
|
|
34
26
|
|
|
35
27
|
**Using uv:**
|
|
36
28
|
`uv tool install developer-assistant`
|
|
@@ -46,6 +38,8 @@ The program is designed for minimal friction and simple setup. Only installation
|
|
|
46
38
|
> Avoid using `sudo pip install` because it installs into the system Python.
|
|
47
39
|
If you want a system‑wide install, use the uv method or use `pip install --user`
|
|
48
40
|
|
|
41
|
+
---
|
|
42
|
+
|
|
49
43
|
## Updating DA
|
|
50
44
|
Two possibilities, depending on how you installed.
|
|
51
45
|
|
|
@@ -56,13 +50,16 @@ B. **Using pip:** `python -m pip install -U developer-assistant`
|
|
|
56
50
|
|
|
57
51
|
## Introduction
|
|
58
52
|
|
|
59
|
-
### What does this
|
|
53
|
+
### What does this program do?
|
|
60
54
|
Developer Assistant is a lightweight TUI for simplifying and managing your changelogs. You can customize the templates for **each profile** to match your existing format, and use DA as a central hub to access every changelog and project folder you maintain.
|
|
61
55
|
|
|
62
56
|
You can create as many profiles as you need. Each profile gets its own **project specific** `.ini` files, created automatically through the menu based on the information you provide. These act as links that tell DA where your changelogs are, which profile owns them and what's the last version number.
|
|
63
57
|
|
|
64
|
-
|
|
58
|
+
Each project `.ini` can also hold a custom terminal command, that is run in that projects folder. So you can easly integrate updating your changelogs in DA with Git commands for example.
|
|
65
59
|
|
|
60
|
+
**Your files are kept safe at all times.** Before adding new changes, your existing `CHANGELOG.md` is automatically backed up. While editing, all changes are written to a temporary file first and only prepended to & replaced with your real changelog once you confirm them.
|
|
61
|
+
|
|
62
|
+
---
|
|
66
63
|
|
|
67
64
|
### Using the program.
|
|
68
65
|
1. **What *not* to do**
|
|
@@ -81,13 +78,13 @@ Don't change the folder structure or modify variable names inside `.ini` files.
|
|
|
81
78
|
|
|
82
79
|
The `da-ui/` folder and subfolders will be created automatically.
|
|
83
80
|
|
|
84
|
-
You can access its content quickly when going to: `Main menu / Settings`
|
|
81
|
+
> **Tip:** You can access its content quickly when going to: `Main menu / Settings`
|
|
85
82
|
|
|
86
83
|
**Profiles for seperate projects and templates**
|
|
87
84
|
|
|
88
85
|
The program comes with the "Default" profile, you can choose to either stick with this one or create your own profiles in `Main menu / Profiles`. Each profile has seperate projects and they can't be accessed by other profiles. You can choose to customize the templates seperately too.
|
|
89
86
|
|
|
90
|
-
Migrating a project or template from one profile to another is currently manual, **make sure to also change the "*owner*" value in `.ini` files accordingly**.
|
|
87
|
+
> **Note:** Migrating a project or template from one profile to another is currently manual, **make sure to also change the "*owner*" value in `.ini` files accordingly**.
|
|
91
88
|
|
|
92
89
|
---
|
|
93
90
|
|
|
@@ -144,8 +141,9 @@ The `memory.ini` file does exactly what you'd expect, it features:
|
|
|
144
141
|
|
|
145
142
|
Last project & active profile get updated automatically, the rest are up to you.
|
|
146
143
|
|
|
147
|
-
|
|
144
|
+
> **Tip:** `Ctrl+C` works everywhere to quickly exit DA.
|
|
148
145
|
|
|
146
|
+
---
|
|
149
147
|
|
|
150
148
|
### Setting up the test project
|
|
151
149
|
For a dummy changelog to experiment with, navigate to `Main menu / Projects`, choose `test-project`, then choose option `3.` to start adjusting this projects paths. **Before setting up your own profile don't change "*Default*"**
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## Installing from PyPI
|
|
4
4
|
|
|
5
|
-
The program is designed for minimal friction and simple setup. Only installation is required, on first run DA will create local user data automatically. The same process is used for new profiles.
|
|
5
|
+
The program is designed for minimal friction and simple setup. Only installation is required, on first run DA will create local user data automatically. The same automatic process is used for creating new profiles.
|
|
6
6
|
|
|
7
7
|
**Using uv:**
|
|
8
8
|
`uv tool install developer-assistant`
|
|
@@ -18,6 +18,8 @@ The program is designed for minimal friction and simple setup. Only installation
|
|
|
18
18
|
> Avoid using `sudo pip install` because it installs into the system Python.
|
|
19
19
|
If you want a system‑wide install, use the uv method or use `pip install --user`
|
|
20
20
|
|
|
21
|
+
---
|
|
22
|
+
|
|
21
23
|
## Updating DA
|
|
22
24
|
Two possibilities, depending on how you installed.
|
|
23
25
|
|
|
@@ -28,13 +30,16 @@ B. **Using pip:** `python -m pip install -U developer-assistant`
|
|
|
28
30
|
|
|
29
31
|
## Introduction
|
|
30
32
|
|
|
31
|
-
### What does this
|
|
33
|
+
### What does this program do?
|
|
32
34
|
Developer Assistant is a lightweight TUI for simplifying and managing your changelogs. You can customize the templates for **each profile** to match your existing format, and use DA as a central hub to access every changelog and project folder you maintain.
|
|
33
35
|
|
|
34
36
|
You can create as many profiles as you need. Each profile gets its own **project specific** `.ini` files, created automatically through the menu based on the information you provide. These act as links that tell DA where your changelogs are, which profile owns them and what's the last version number.
|
|
35
37
|
|
|
36
|
-
|
|
38
|
+
Each project `.ini` can also hold a custom terminal command, that is run in that projects folder. So you can easly integrate updating your changelogs in DA with Git commands for example.
|
|
37
39
|
|
|
40
|
+
**Your files are kept safe at all times.** Before adding new changes, your existing `CHANGELOG.md` is automatically backed up. While editing, all changes are written to a temporary file first and only prepended to & replaced with your real changelog once you confirm them.
|
|
41
|
+
|
|
42
|
+
---
|
|
38
43
|
|
|
39
44
|
### Using the program.
|
|
40
45
|
1. **What *not* to do**
|
|
@@ -53,13 +58,13 @@ Don't change the folder structure or modify variable names inside `.ini` files.
|
|
|
53
58
|
|
|
54
59
|
The `da-ui/` folder and subfolders will be created automatically.
|
|
55
60
|
|
|
56
|
-
You can access its content quickly when going to: `Main menu / Settings`
|
|
61
|
+
> **Tip:** You can access its content quickly when going to: `Main menu / Settings`
|
|
57
62
|
|
|
58
63
|
**Profiles for seperate projects and templates**
|
|
59
64
|
|
|
60
65
|
The program comes with the "Default" profile, you can choose to either stick with this one or create your own profiles in `Main menu / Profiles`. Each profile has seperate projects and they can't be accessed by other profiles. You can choose to customize the templates seperately too.
|
|
61
66
|
|
|
62
|
-
Migrating a project or template from one profile to another is currently manual, **make sure to also change the "*owner*" value in `.ini` files accordingly**.
|
|
67
|
+
> **Note:** Migrating a project or template from one profile to another is currently manual, **make sure to also change the "*owner*" value in `.ini` files accordingly**.
|
|
63
68
|
|
|
64
69
|
---
|
|
65
70
|
|
|
@@ -116,8 +121,9 @@ The `memory.ini` file does exactly what you'd expect, it features:
|
|
|
116
121
|
|
|
117
122
|
Last project & active profile get updated automatically, the rest are up to you.
|
|
118
123
|
|
|
119
|
-
|
|
124
|
+
> **Tip:** `Ctrl+C` works everywhere to quickly exit DA.
|
|
120
125
|
|
|
126
|
+
---
|
|
121
127
|
|
|
122
128
|
### Setting up the test project
|
|
123
129
|
For a dummy changelog to experiment with, navigate to `Main menu / Projects`, choose `test-project`, then choose option `3.` to start adjusting this projects paths. **Before setting up your own profile don't change "*Default*"**
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
> `pip install developer-assistant`
|
|
7
7
|
|
|
8
|
-
* **Installation:**
|
|
8
|
+
* **Installation:** more options in [SETUP](./SETUP.md)
|
|
9
9
|
|
|
10
10
|
* **Changes:** yes, I keep a [CHANGELOG](./CHANGELOG.md)
|
|
11
11
|
|
|
@@ -33,12 +33,14 @@ Preview your Markdown changelogs directly in the terminal with Rich rendering:
|
|
|
33
33
|
|
|
34
34
|
## Introduction
|
|
35
35
|
|
|
36
|
-
### What does this
|
|
36
|
+
### What does this program do?
|
|
37
37
|
Developer Assistant is a lightweight TUI for simplifying and managing your changelogs. You can customize the templates for **each profile** to match your existing format, and use DA as a central hub to access every changelog and project folder you maintain.
|
|
38
38
|
|
|
39
39
|
You can create as many profiles as you need. Each profile gets its own **project specific** `.ini` files, created automatically through the menu based on the information you provide. These act as links that tell DA where your changelogs are, which profile owns them and what's the last version number.
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
Each project `.ini` can also hold a custom terminal command, that is run in that projects folder. So you can easly integrate updating your changelogs in DA with Git commands for example.
|
|
42
|
+
|
|
43
|
+
**Your files are kept safe at all times.** Before adding new changes, your existing `CHANGELOG.md` is automatically backed up. While editing, all changes are written to a temporary file first and only prepended to & replaced with your real changelog once you confirm them.
|
|
42
44
|
|
|
43
45
|
---
|
|
44
46
|
|
|
@@ -60,7 +62,7 @@ Don't change the folder structure or modify variable names inside `.ini` files.
|
|
|
60
62
|
The `da-ui/` folder and subfolders will be created automatically.
|
|
61
63
|
|
|
62
64
|
> [!TIP]
|
|
63
|
-
> You can access its
|
|
65
|
+
> You can access its contents quickly when going to: `Main menu / Settings`
|
|
64
66
|
|
|
65
67
|
**Profiles for seperate projects and templates**
|
|
66
68
|
|
|
@@ -90,7 +92,7 @@ The `Projects/` folder holds the `.ini` files you create when starting a new pro
|
|
|
90
92
|
|
|
91
93
|
[Project.ini example](./documents/project-example.ini)
|
|
92
94
|
|
|
93
|
-
The `command` variable is a custom command that DA will run in your project folder once you choose "Format & commit" in `Main menu / Projects / Project menu / Changelog`. Even
|
|
95
|
+
The `command` variable is a custom command that DA will run in your project folder once you choose "Format & commit" in `Main menu / Projects / Project menu / Changelog`. Even if provided, it is **not** run without your confirmation, first it's printed with the folder name and you can choose to skip it.
|
|
94
96
|
|
|
95
97
|
`owner` & `edited` are filled out automatically when a new project is created and `edited` updates with every changelog update.
|
|
96
98
|
|
|
@@ -17,7 +17,7 @@ from importlib import resources
|
|
|
17
17
|
|
|
18
18
|
class Interface:
|
|
19
19
|
def __init__(self):
|
|
20
|
-
self.version = "0.3.
|
|
20
|
+
self.version = "0.3.6"
|
|
21
21
|
self.clear = 'cls' if platform.system() == 'Windows' else 'clear'
|
|
22
22
|
|
|
23
23
|
title = f"DA - {self.version}"
|
|
@@ -50,14 +50,14 @@ class Interface:
|
|
|
50
50
|
if isinstance(result, list):
|
|
51
51
|
for msg in result:
|
|
52
52
|
print(msg.center(65))
|
|
53
|
-
time.sleep(
|
|
53
|
+
time.sleep(1)
|
|
54
54
|
|
|
55
55
|
temp_log = Path(__file__).parent / "CHANGELOG.tmp"
|
|
56
56
|
|
|
57
57
|
if os.path.exists(temp_log):
|
|
58
58
|
while True:
|
|
59
59
|
os.system(self.clear)
|
|
60
|
-
print(colored(f"Temporary changelog detected
|
|
60
|
+
print(colored(f"Temporary changelog detected from your last session!\n", "yellow"))
|
|
61
61
|
print(colored("D", "light_red") + "elete or " + colored("K", "light_red") + "eep?\n")
|
|
62
62
|
choice = input(f"{self.user_path}> ").lower()
|
|
63
63
|
if choice == "d":
|
|
@@ -67,7 +67,7 @@ class Interface:
|
|
|
67
67
|
break
|
|
68
68
|
else:
|
|
69
69
|
print(colored("\nPlease make a valid choice.", "light_red"))
|
|
70
|
-
time.sleep(
|
|
70
|
+
time.sleep(0.5)
|
|
71
71
|
|
|
72
72
|
state = "intro" if self.first_run else "menu"
|
|
73
73
|
|
|
@@ -132,7 +132,7 @@ class Interface:
|
|
|
132
132
|
else:
|
|
133
133
|
print("")
|
|
134
134
|
print(colored("Unknown option...", "light_red", attrs=["bold"]))
|
|
135
|
-
time.sleep(
|
|
135
|
+
time.sleep(0.5)
|
|
136
136
|
|
|
137
137
|
def settings(self):
|
|
138
138
|
while True:
|
|
@@ -167,7 +167,7 @@ class Interface:
|
|
|
167
167
|
else:
|
|
168
168
|
print("")
|
|
169
169
|
print(colored("Unknown option...", "light_red", attrs=["bold"]))
|
|
170
|
-
time.sleep(
|
|
170
|
+
time.sleep(0.5)
|
|
171
171
|
|
|
172
172
|
def profiles(self):
|
|
173
173
|
while True:
|
|
@@ -176,48 +176,43 @@ class Interface:
|
|
|
176
176
|
print(self.header)
|
|
177
177
|
print("E. Back\n")
|
|
178
178
|
|
|
179
|
-
print("1.
|
|
180
|
-
|
|
179
|
+
print("1. Switch profiles\n")
|
|
180
|
+
|
|
181
|
+
print("2. Create a new profile")
|
|
182
|
+
print("3. Delete a profile\n")
|
|
181
183
|
|
|
182
184
|
choice = input(f"{self.user_path}> ").strip()
|
|
183
185
|
|
|
184
186
|
if choice.lower() == "e":
|
|
185
187
|
return
|
|
186
188
|
elif choice == "1":
|
|
187
|
-
self.new_profile()
|
|
188
|
-
elif choice == "2":
|
|
189
189
|
self.switch_profile()
|
|
190
|
+
elif choice == "2":
|
|
191
|
+
self.new_profile()
|
|
192
|
+
elif choice == "3":
|
|
193
|
+
self.delete_profile()
|
|
190
194
|
else:
|
|
191
195
|
print("")
|
|
192
196
|
print(colored("Unknown option...", "light_red", attrs=["bold"]))
|
|
193
|
-
time.sleep(
|
|
197
|
+
time.sleep(0.5)
|
|
194
198
|
|
|
195
199
|
def switch_profile(self):
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
contents = os.listdir(prof_dir)
|
|
199
|
-
|
|
200
|
-
print("\nYour profiles:")
|
|
201
|
-
for item in contents:
|
|
202
|
-
print(colored(f" - {item}", f"{self.color}"))
|
|
203
|
-
|
|
204
|
-
name = input("\nProfile name > ").strip()
|
|
200
|
+
prof_dir = self.config.profile_dir
|
|
201
|
+
contents = os.listdir(prof_dir)
|
|
205
202
|
|
|
206
|
-
|
|
207
|
-
|
|
203
|
+
print("\nYour profiles:")
|
|
204
|
+
for item in contents:
|
|
205
|
+
print(" -" + colored(f" {item}", f"{self.color}"))
|
|
208
206
|
|
|
209
|
-
|
|
207
|
+
name = input("\nProfile name > ").strip()
|
|
210
208
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
print(colored("\nInvalid name!", "yellow"))
|
|
219
|
-
time.sleep(1)
|
|
220
|
-
os.system(self.clear)
|
|
209
|
+
if name in contents:
|
|
210
|
+
self.load_profile(name)
|
|
211
|
+
return
|
|
212
|
+
else:
|
|
213
|
+
print(colored("\nInvalid name!", "yellow"))
|
|
214
|
+
time.sleep(0.5)
|
|
215
|
+
os.system(self.clear)
|
|
221
216
|
|
|
222
217
|
def new_profile(self):
|
|
223
218
|
name = input("\nNew profile name > ").strip()
|
|
@@ -233,6 +228,33 @@ class Interface:
|
|
|
233
228
|
dest = profile_dir / "Templates"
|
|
234
229
|
shutil.copy(item, dest)
|
|
235
230
|
|
|
231
|
+
self.load_profile(name)
|
|
232
|
+
return
|
|
233
|
+
|
|
234
|
+
def delete_profile(self):
|
|
235
|
+
prof_dir = self.config.profile_dir
|
|
236
|
+
contents = os.listdir(prof_dir)
|
|
237
|
+
|
|
238
|
+
print("\nYour profiles:")
|
|
239
|
+
for item in contents:
|
|
240
|
+
print(" -" + colored(f" {item}", f"{self.color}"))
|
|
241
|
+
|
|
242
|
+
name = input("\nProfile name > ").strip()
|
|
243
|
+
|
|
244
|
+
if name in contents and name != "Default":
|
|
245
|
+
profiles = self.config.profile_dir
|
|
246
|
+
profile = profiles / name
|
|
247
|
+
shutil.rmtree(profile)
|
|
248
|
+
|
|
249
|
+
if name == self.active_profile:
|
|
250
|
+
self.load_profile(name="Default")
|
|
251
|
+
return
|
|
252
|
+
else:
|
|
253
|
+
print(colored("\nInvalid name!", "yellow"))
|
|
254
|
+
time.sleep(0.5)
|
|
255
|
+
os.system(self.clear)
|
|
256
|
+
|
|
257
|
+
def load_profile(self, name):
|
|
236
258
|
self.config.update_memory("CONFIG", "profile", name)
|
|
237
259
|
|
|
238
260
|
self.memory = self.config.load_memory()
|
|
@@ -242,7 +264,6 @@ class Interface:
|
|
|
242
264
|
|
|
243
265
|
self.memory = self.config.load_memory()
|
|
244
266
|
self.active_profile = self.memory.get('profile')
|
|
245
|
-
return
|
|
246
267
|
|
|
247
268
|
def runtime_init(self):
|
|
248
269
|
if not self.config.memory_ini.exists():
|
|
@@ -268,6 +289,7 @@ class Interface:
|
|
|
268
289
|
self.header = f"{bars}{brand}{bars}"
|
|
269
290
|
|
|
270
291
|
def local_init(self):
|
|
292
|
+
#==Works together with ConfigManager.data_check==
|
|
271
293
|
default_files = resources.files("da.default")
|
|
272
294
|
dest = self.config.memory_ini
|
|
273
295
|
|
|
@@ -301,9 +323,11 @@ def main():
|
|
|
301
323
|
try:
|
|
302
324
|
app = Interface()
|
|
303
325
|
app.run()
|
|
326
|
+
os.system(app.clear)
|
|
304
327
|
except KeyboardInterrupt:
|
|
305
328
|
print("\n\n" + colored("Execution interrupted. Exiting...", "cyan", attrs=["bold"]))
|
|
306
|
-
time.sleep(
|
|
329
|
+
time.sleep(0.5)
|
|
330
|
+
os.system(app.clear)
|
|
307
331
|
sys.exit(0)
|
|
308
332
|
|
|
309
333
|
if __name__ == "__main__":
|
|
@@ -114,24 +114,40 @@ class ConfigManager:
|
|
|
114
114
|
|
|
115
115
|
def data_check(self):
|
|
116
116
|
internal_dir = Path(__file__).resolve().parents[1]
|
|
117
|
-
|
|
118
|
-
|
|
117
|
+
default_templates = resources.files("da.templates")
|
|
118
|
+
|
|
119
|
+
messages = []
|
|
120
|
+
#==Always ensure fallback profile exists, not just on first run==
|
|
121
|
+
if not (self.profile_dir / "Default").exists():
|
|
122
|
+
default = self.profile_dir / "Default"
|
|
123
|
+
default.mkdir()
|
|
124
|
+
|
|
125
|
+
templates = default / "Templates"
|
|
126
|
+
templates.mkdir()
|
|
127
|
+
|
|
128
|
+
projects = default / "Projects"
|
|
129
|
+
projects.mkdir()
|
|
130
|
+
|
|
131
|
+
for item in default_templates.iterdir():
|
|
132
|
+
dest = templates / item.name
|
|
133
|
+
if not dest.exists():
|
|
134
|
+
shutil.copy(item, dest)
|
|
135
|
+
|
|
136
|
+
messages.append("Restored the Default profile")
|
|
119
137
|
|
|
120
138
|
old_memory = internal_dir / "memory.ini"
|
|
121
139
|
old_projects = self.global_dir / "Projects"
|
|
122
140
|
|
|
123
|
-
messages = []
|
|
124
|
-
|
|
125
141
|
if old_memory.exists() and not self.memory_ini.exists():
|
|
126
142
|
shutil.move(str(old_memory), str(self.memory_ini))
|
|
127
|
-
messages.append(f"Migrated memory.ini to {self.global_dir}")
|
|
143
|
+
messages.append(f"Migrated memory.ini to: {self.global_dir}")
|
|
128
144
|
|
|
129
145
|
if old_projects.exists() and not self.projects_folder.exists():
|
|
130
146
|
shutil.move(str(old_projects), str(self.projects_folder))
|
|
131
|
-
messages.append(f"Migrated Projects folder to {self.projects_folder}")
|
|
147
|
+
messages.append(f"Migrated Projects folder to: {self.projects_folder}")
|
|
132
148
|
|
|
149
|
+
#==Always ensure default templates exist, no matter what profile is active==
|
|
133
150
|
if not self.templates_folder.exists():
|
|
134
|
-
default_templates = resources.files("da.templates")
|
|
135
151
|
user_templates = self.templates_folder
|
|
136
152
|
|
|
137
153
|
user_templates.mkdir(parents=True, exist_ok=True)
|
|
@@ -141,7 +157,7 @@ class ConfigManager:
|
|
|
141
157
|
if not dest.exists():
|
|
142
158
|
shutil.copy(item, dest)
|
|
143
159
|
|
|
144
|
-
messages.append(f"Copied default Templates to {self.templates_folder}")
|
|
160
|
+
messages.append(f"Copied default Templates to: {self.templates_folder}")
|
|
145
161
|
|
|
146
162
|
return messages
|
|
147
163
|
|
|
@@ -78,7 +78,7 @@ class ProjectsManager:
|
|
|
78
78
|
else:
|
|
79
79
|
print("")
|
|
80
80
|
print(colored("Unknown option...", "light_red", attrs=["bold"]))
|
|
81
|
-
time.sleep(
|
|
81
|
+
time.sleep(0.5)
|
|
82
82
|
|
|
83
83
|
def new_project(self):
|
|
84
84
|
os.system(self.clear)
|
|
@@ -143,7 +143,7 @@ class ProjectsManager:
|
|
|
143
143
|
|
|
144
144
|
print("Your projects:")
|
|
145
145
|
for name in projects:
|
|
146
|
-
print(colored(f"
|
|
146
|
+
print(" -" + colored(f" {name}", f"{self.color}"))
|
|
147
147
|
|
|
148
148
|
project = input("\nProject name > ").strip()
|
|
149
149
|
|
|
@@ -152,9 +152,8 @@ class ProjectsManager:
|
|
|
152
152
|
elif project in projects:
|
|
153
153
|
self.load_project(project)
|
|
154
154
|
else:
|
|
155
|
-
print("")
|
|
156
|
-
|
|
157
|
-
time.sleep(1)
|
|
155
|
+
print(colored("\nInvalid name!", "light_red", attrs=["bold"]))
|
|
156
|
+
time.sleep(0.5)
|
|
158
157
|
|
|
159
158
|
def load_project(self, project):
|
|
160
159
|
version_logic = VersionLogic(
|
|
@@ -176,7 +175,7 @@ class ProjectsManager:
|
|
|
176
175
|
setting = load_manager.load_project()
|
|
177
176
|
except KeyError:
|
|
178
177
|
print(colored(f"\nCan't find {project}.ini", "light_red"))
|
|
179
|
-
time.sleep(
|
|
178
|
+
time.sleep(0.5)
|
|
180
179
|
return
|
|
181
180
|
|
|
182
181
|
edited = setting.get('edited')
|
|
@@ -241,7 +240,7 @@ class ProjectsManager:
|
|
|
241
240
|
|
|
242
241
|
if not has_bak:
|
|
243
242
|
print(colored(f"\nCan't find any .bak files for {project}", "yellow"))
|
|
244
|
-
time.sleep(
|
|
243
|
+
time.sleep(0.5)
|
|
245
244
|
return
|
|
246
245
|
|
|
247
246
|
bak = has_bak[0]
|
|
@@ -102,7 +102,7 @@ class VersionLogic:
|
|
|
102
102
|
else:
|
|
103
103
|
print("")
|
|
104
104
|
print(colored("Unknown option...", "light_red", attrs=["bold"]))
|
|
105
|
-
time.sleep(
|
|
105
|
+
time.sleep(0.5)
|
|
106
106
|
|
|
107
107
|
def finalise(self):
|
|
108
108
|
with open(self.changelog_path, "r", encoding="utf-8") as f:
|
|
@@ -212,7 +212,7 @@ class VersionLogic:
|
|
|
212
212
|
else:
|
|
213
213
|
print("")
|
|
214
214
|
print(colored("Unknown option...", "light_red", attrs=["bold"]))
|
|
215
|
-
time.sleep(
|
|
215
|
+
time.sleep(0.5)
|
|
216
216
|
|
|
217
217
|
def prepend_changes(self):
|
|
218
218
|
header = f"### {self.change_type}"
|
|
@@ -249,7 +249,7 @@ class VersionLogic:
|
|
|
249
249
|
with open(self.templog_path, "a", encoding="utf-8") as f:
|
|
250
250
|
f.write(rendered + "\n")
|
|
251
251
|
|
|
252
|
-
choice = input("\nNew type [E] or add more [Enter] > ")
|
|
252
|
+
choice = input("\nNew type [E] or add more [Enter] > ").strip()
|
|
253
253
|
if choice.lower() == "e":
|
|
254
254
|
return
|
|
255
255
|
|
|
@@ -268,7 +268,7 @@ class VersionLogic:
|
|
|
268
268
|
self.view_md(templog_content, message)
|
|
269
269
|
else:
|
|
270
270
|
print(colored("No changes added.", "light_red"))
|
|
271
|
-
time.sleep(
|
|
271
|
+
time.sleep(0.5)
|
|
272
272
|
return
|
|
273
273
|
|
|
274
274
|
choice = input("\nContinue" + colored("[Enter]", f"{self.color}") + " or add more" + colored("[E] ", f"{self.color}"))
|
|
@@ -331,7 +331,7 @@ class VersionLogic:
|
|
|
331
331
|
self.config.update_memory("ITEMS", "last_project", self.active_project)
|
|
332
332
|
|
|
333
333
|
print(colored("\nChangelog updated, returning...", f"{self.color}"))
|
|
334
|
-
time.sleep(
|
|
334
|
+
time.sleep(1.5)
|
|
335
335
|
return
|
|
336
336
|
|
|
337
337
|
def view_md(self, log_content, message=None):
|
|
@@ -370,7 +370,7 @@ class VersionLogic:
|
|
|
370
370
|
|
|
371
371
|
if size > max_size:
|
|
372
372
|
print(colored(f"\nChangelog too large to load safely: {size_mb:.2f} MB", "light_red"))
|
|
373
|
-
time.sleep(
|
|
373
|
+
time.sleep(1.5)
|
|
374
374
|
return "reject"
|
|
375
375
|
|
|
376
376
|
elif size > print_size:
|
{developer_assistant-0.3.5 → developer_assistant-0.3.6/developer_assistant.egg-info}/PKG-INFO
RENAMED
|
@@ -1,16 +1,8 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: developer-assistant
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.6
|
|
4
4
|
Summary: A lightweight TUI app for managing and simplifying your Markdown changelogs.
|
|
5
|
-
License:
|
|
6
|
-
|
|
7
|
-
Copyright (c) 2026 Ivori Huobolainen
|
|
8
|
-
|
|
9
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
10
|
-
|
|
11
|
-
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
12
|
-
|
|
13
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
5
|
+
License-Expression: MIT
|
|
14
6
|
Project-URL: Homepage, https://github.com/Ivory-Hubert/Developer-Assistant
|
|
15
7
|
Project-URL: Changelog, https://github.com/Ivory-Hubert/Developer-Assistant/blob/main/CHANGELOG.md
|
|
16
8
|
Classifier: Programming Language :: Python :: 3
|
|
@@ -30,7 +22,7 @@ Dynamic: license-file
|
|
|
30
22
|
|
|
31
23
|
## Installing from PyPI
|
|
32
24
|
|
|
33
|
-
The program is designed for minimal friction and simple setup. Only installation is required, on first run DA will create local user data automatically. The same process is used for new profiles.
|
|
25
|
+
The program is designed for minimal friction and simple setup. Only installation is required, on first run DA will create local user data automatically. The same automatic process is used for creating new profiles.
|
|
34
26
|
|
|
35
27
|
**Using uv:**
|
|
36
28
|
`uv tool install developer-assistant`
|
|
@@ -46,6 +38,8 @@ The program is designed for minimal friction and simple setup. Only installation
|
|
|
46
38
|
> Avoid using `sudo pip install` because it installs into the system Python.
|
|
47
39
|
If you want a system‑wide install, use the uv method or use `pip install --user`
|
|
48
40
|
|
|
41
|
+
---
|
|
42
|
+
|
|
49
43
|
## Updating DA
|
|
50
44
|
Two possibilities, depending on how you installed.
|
|
51
45
|
|
|
@@ -56,13 +50,16 @@ B. **Using pip:** `python -m pip install -U developer-assistant`
|
|
|
56
50
|
|
|
57
51
|
## Introduction
|
|
58
52
|
|
|
59
|
-
### What does this
|
|
53
|
+
### What does this program do?
|
|
60
54
|
Developer Assistant is a lightweight TUI for simplifying and managing your changelogs. You can customize the templates for **each profile** to match your existing format, and use DA as a central hub to access every changelog and project folder you maintain.
|
|
61
55
|
|
|
62
56
|
You can create as many profiles as you need. Each profile gets its own **project specific** `.ini` files, created automatically through the menu based on the information you provide. These act as links that tell DA where your changelogs are, which profile owns them and what's the last version number.
|
|
63
57
|
|
|
64
|
-
|
|
58
|
+
Each project `.ini` can also hold a custom terminal command, that is run in that projects folder. So you can easly integrate updating your changelogs in DA with Git commands for example.
|
|
65
59
|
|
|
60
|
+
**Your files are kept safe at all times.** Before adding new changes, your existing `CHANGELOG.md` is automatically backed up. While editing, all changes are written to a temporary file first and only prepended to & replaced with your real changelog once you confirm them.
|
|
61
|
+
|
|
62
|
+
---
|
|
66
63
|
|
|
67
64
|
### Using the program.
|
|
68
65
|
1. **What *not* to do**
|
|
@@ -81,13 +78,13 @@ Don't change the folder structure or modify variable names inside `.ini` files.
|
|
|
81
78
|
|
|
82
79
|
The `da-ui/` folder and subfolders will be created automatically.
|
|
83
80
|
|
|
84
|
-
You can access its content quickly when going to: `Main menu / Settings`
|
|
81
|
+
> **Tip:** You can access its content quickly when going to: `Main menu / Settings`
|
|
85
82
|
|
|
86
83
|
**Profiles for seperate projects and templates**
|
|
87
84
|
|
|
88
85
|
The program comes with the "Default" profile, you can choose to either stick with this one or create your own profiles in `Main menu / Profiles`. Each profile has seperate projects and they can't be accessed by other profiles. You can choose to customize the templates seperately too.
|
|
89
86
|
|
|
90
|
-
Migrating a project or template from one profile to another is currently manual, **make sure to also change the "*owner*" value in `.ini` files accordingly**.
|
|
87
|
+
> **Note:** Migrating a project or template from one profile to another is currently manual, **make sure to also change the "*owner*" value in `.ini` files accordingly**.
|
|
91
88
|
|
|
92
89
|
---
|
|
93
90
|
|
|
@@ -144,8 +141,9 @@ The `memory.ini` file does exactly what you'd expect, it features:
|
|
|
144
141
|
|
|
145
142
|
Last project & active profile get updated automatically, the rest are up to you.
|
|
146
143
|
|
|
147
|
-
|
|
144
|
+
> **Tip:** `Ctrl+C` works everywhere to quickly exit DA.
|
|
148
145
|
|
|
146
|
+
---
|
|
149
147
|
|
|
150
148
|
### Setting up the test project
|
|
151
149
|
For a dummy changelog to experiment with, navigate to `Main menu / Projects`, choose `test-project`, then choose option `3.` to start adjusting this projects paths. **Before setting up your own profile don't change "*Default*"**
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "developer-assistant"
|
|
3
|
-
version = "0.3.
|
|
3
|
+
version = "0.3.6"
|
|
4
4
|
description = "A lightweight TUI app for managing and simplifying your Markdown changelogs."
|
|
5
5
|
readme = "PYPI.md"
|
|
6
6
|
requires-python = ">=3.10"
|
|
7
|
-
license =
|
|
7
|
+
license = "MIT"
|
|
8
8
|
dependencies = [
|
|
9
9
|
"platformdirs>=4.9.4",
|
|
10
10
|
"prompt-toolkit>=3.0.52",
|
|
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
|
{developer_assistant-0.3.5 → developer_assistant-0.3.6}/developer_assistant.egg-info/SOURCES.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{developer_assistant-0.3.5 → developer_assistant-0.3.6}/developer_assistant.egg-info/requires.txt
RENAMED
|
File without changes
|
{developer_assistant-0.3.5 → developer_assistant-0.3.6}/developer_assistant.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|