IncludeCPP 3.3.11__py3-none-any.whl → 3.3.20__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- includecpp/__init__.py +1 -1
- includecpp/cli/commands.py +265 -41
- includecpp/core/ai_integration.py +69 -34
- includecpp/core/cppy_converter.py +430 -16
- includecpp/core/error_formatter.py +50 -19
- includecpp/core/project_ui.py +2720 -0
- includecpp/core/settings_ui.py +127 -48
- {includecpp-3.3.11.dist-info → includecpp-3.3.20.dist-info}/METADATA +116 -18
- {includecpp-3.3.11.dist-info → includecpp-3.3.20.dist-info}/RECORD +13 -12
- {includecpp-3.3.11.dist-info → includecpp-3.3.20.dist-info}/WHEEL +0 -0
- {includecpp-3.3.11.dist-info → includecpp-3.3.20.dist-info}/entry_points.txt +0 -0
- {includecpp-3.3.11.dist-info → includecpp-3.3.20.dist-info}/licenses/LICENSE +0 -0
- {includecpp-3.3.11.dist-info → includecpp-3.3.20.dist-info}/top_level.txt +0 -0
includecpp/core/settings_ui.py
CHANGED
|
@@ -5,7 +5,8 @@ from pathlib import Path
|
|
|
5
5
|
try:
|
|
6
6
|
from PyQt6.QtWidgets import (
|
|
7
7
|
QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel,
|
|
8
|
-
QPushButton, QLineEdit, QCheckBox, QComboBox, QFrame
|
|
8
|
+
QPushButton, QLineEdit, QCheckBox, QComboBox, QFrame,
|
|
9
|
+
QScrollArea
|
|
9
10
|
)
|
|
10
11
|
from PyQt6.QtCore import Qt
|
|
11
12
|
from PyQt6.QtGui import QFont
|
|
@@ -14,6 +15,18 @@ except ImportError:
|
|
|
14
15
|
PYQT_AVAILABLE = False
|
|
15
16
|
|
|
16
17
|
|
|
18
|
+
def is_experimental_enabled() -> bool:
|
|
19
|
+
"""Check if experimental features are enabled globally."""
|
|
20
|
+
config_path = Path.home() / '.includecpp' / '.secret'
|
|
21
|
+
if config_path.exists():
|
|
22
|
+
try:
|
|
23
|
+
config = json.loads(config_path.read_text(encoding='utf-8'))
|
|
24
|
+
return config.get('experimental_features', False)
|
|
25
|
+
except Exception:
|
|
26
|
+
pass
|
|
27
|
+
return False
|
|
28
|
+
|
|
29
|
+
|
|
17
30
|
class SettingsWidget(QWidget):
|
|
18
31
|
def __init__(self):
|
|
19
32
|
super().__init__()
|
|
@@ -25,24 +38,26 @@ class SettingsWidget(QWidget):
|
|
|
25
38
|
def _load_config(self):
|
|
26
39
|
if self.config_path.exists():
|
|
27
40
|
try:
|
|
28
|
-
return json.loads(self.config_path.read_text())
|
|
29
|
-
except:
|
|
41
|
+
return json.loads(self.config_path.read_text(encoding='utf-8'))
|
|
42
|
+
except Exception:
|
|
30
43
|
pass
|
|
31
44
|
return {}
|
|
32
45
|
|
|
33
46
|
def _save_config(self):
|
|
34
47
|
self.config_path.parent.mkdir(parents=True, exist_ok=True)
|
|
35
|
-
self.config_path.write_text(json.dumps(self.config, indent=2))
|
|
48
|
+
self.config_path.write_text(json.dumps(self.config, indent=2), encoding='utf-8')
|
|
36
49
|
|
|
37
50
|
def _setup_ui(self):
|
|
38
51
|
self.setWindowTitle('IncludeCPP Settings')
|
|
39
|
-
self.setFixedSize(
|
|
52
|
+
self.setFixedSize(360, 580)
|
|
40
53
|
self.setWindowFlags(Qt.WindowType.FramelessWindowHint)
|
|
41
54
|
self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground)
|
|
42
55
|
|
|
56
|
+
# Main container with background
|
|
43
57
|
main = QWidget(self)
|
|
44
|
-
main.setGeometry(0, 0,
|
|
45
|
-
|
|
58
|
+
main.setGeometry(0, 0, 360, 580)
|
|
59
|
+
|
|
60
|
+
base_style = '''
|
|
46
61
|
QWidget {
|
|
47
62
|
background-color: #1a1a1a;
|
|
48
63
|
border-radius: 12px;
|
|
@@ -51,15 +66,16 @@ class SettingsWidget(QWidget):
|
|
|
51
66
|
QLabel {
|
|
52
67
|
color: #e0e0e0;
|
|
53
68
|
font-size: 12px;
|
|
69
|
+
background-color: transparent;
|
|
54
70
|
}
|
|
55
71
|
QLineEdit {
|
|
56
72
|
background-color: #2d2d2d;
|
|
57
73
|
border: 1px solid #3d3d3d;
|
|
58
74
|
border-radius: 6px;
|
|
59
|
-
padding: 10px
|
|
75
|
+
padding: 8px 10px;
|
|
60
76
|
color: #e0e0e0;
|
|
61
|
-
font-size:
|
|
62
|
-
min-height:
|
|
77
|
+
font-size: 12px;
|
|
78
|
+
min-height: 14px;
|
|
63
79
|
}
|
|
64
80
|
QLineEdit:focus {
|
|
65
81
|
border: 1px solid #4a9eff;
|
|
@@ -68,9 +84,9 @@ class SettingsWidget(QWidget):
|
|
|
68
84
|
background-color: #2d2d2d;
|
|
69
85
|
border: 1px solid #3d3d3d;
|
|
70
86
|
border-radius: 6px;
|
|
71
|
-
padding:
|
|
87
|
+
padding: 8px 16px;
|
|
72
88
|
color: #e0e0e0;
|
|
73
|
-
font-size:
|
|
89
|
+
font-size: 12px;
|
|
74
90
|
}
|
|
75
91
|
QPushButton:hover {
|
|
76
92
|
background-color: #3d3d3d;
|
|
@@ -80,11 +96,12 @@ class SettingsWidget(QWidget):
|
|
|
80
96
|
}
|
|
81
97
|
QCheckBox {
|
|
82
98
|
color: #e0e0e0;
|
|
83
|
-
font-size:
|
|
99
|
+
font-size: 12px;
|
|
100
|
+
background-color: transparent;
|
|
84
101
|
}
|
|
85
102
|
QCheckBox::indicator {
|
|
86
|
-
width:
|
|
87
|
-
height:
|
|
103
|
+
width: 16px;
|
|
104
|
+
height: 16px;
|
|
88
105
|
border-radius: 4px;
|
|
89
106
|
background-color: #2d2d2d;
|
|
90
107
|
border: 1px solid #3d3d3d;
|
|
@@ -96,10 +113,10 @@ class SettingsWidget(QWidget):
|
|
|
96
113
|
background-color: #2d2d2d;
|
|
97
114
|
border: 1px solid #3d3d3d;
|
|
98
115
|
border-radius: 6px;
|
|
99
|
-
padding: 10px
|
|
116
|
+
padding: 8px 10px;
|
|
100
117
|
color: #e0e0e0;
|
|
101
|
-
font-size:
|
|
102
|
-
min-height:
|
|
118
|
+
font-size: 12px;
|
|
119
|
+
min-height: 14px;
|
|
103
120
|
}
|
|
104
121
|
QComboBox::drop-down {
|
|
105
122
|
border: none;
|
|
@@ -110,76 +127,131 @@ class SettingsWidget(QWidget):
|
|
|
110
127
|
color: #e0e0e0;
|
|
111
128
|
selection-background-color: #4a9eff;
|
|
112
129
|
}
|
|
113
|
-
|
|
130
|
+
QScrollArea {
|
|
131
|
+
background-color: transparent;
|
|
132
|
+
border: none;
|
|
133
|
+
}
|
|
134
|
+
QScrollBar:vertical {
|
|
135
|
+
background-color: #2d2d2d;
|
|
136
|
+
width: 8px;
|
|
137
|
+
border-radius: 4px;
|
|
138
|
+
}
|
|
139
|
+
QScrollBar::handle:vertical {
|
|
140
|
+
background-color: #4a4a4a;
|
|
141
|
+
border-radius: 4px;
|
|
142
|
+
min-height: 20px;
|
|
143
|
+
}
|
|
144
|
+
QScrollBar::handle:vertical:hover {
|
|
145
|
+
background-color: #5a5a5a;
|
|
146
|
+
}
|
|
147
|
+
QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical {
|
|
148
|
+
height: 0px;
|
|
149
|
+
}
|
|
150
|
+
'''
|
|
151
|
+
main.setStyleSheet(base_style)
|
|
114
152
|
|
|
115
|
-
layout
|
|
116
|
-
|
|
117
|
-
|
|
153
|
+
# Main layout for the container
|
|
154
|
+
main_layout = QVBoxLayout(main)
|
|
155
|
+
main_layout.setContentsMargins(16, 16, 16, 16)
|
|
156
|
+
main_layout.setSpacing(8)
|
|
118
157
|
|
|
158
|
+
# Header (fixed, not scrollable)
|
|
119
159
|
header = QHBoxLayout()
|
|
120
|
-
title = QLabel('IncludeCPP')
|
|
121
|
-
title.setFont(QFont('Segoe UI',
|
|
122
|
-
title.setStyleSheet('color: #4a9eff;')
|
|
160
|
+
title = QLabel('IncludeCPP Settings')
|
|
161
|
+
title.setFont(QFont('Segoe UI', 13, QFont.Weight.Bold))
|
|
162
|
+
title.setStyleSheet('color: #4a9eff; background-color: transparent;')
|
|
123
163
|
header.addWidget(title)
|
|
124
164
|
header.addStretch()
|
|
125
165
|
close_btn = QPushButton('×')
|
|
126
166
|
close_btn.setFixedSize(24, 24)
|
|
127
|
-
close_btn.setStyleSheet('font-size:
|
|
167
|
+
close_btn.setStyleSheet('font-size: 16px; border-radius: 12px;')
|
|
128
168
|
close_btn.clicked.connect(self.close)
|
|
129
169
|
header.addWidget(close_btn)
|
|
130
|
-
|
|
170
|
+
main_layout.addLayout(header)
|
|
171
|
+
|
|
172
|
+
self._add_separator(main_layout)
|
|
131
173
|
|
|
132
|
-
|
|
174
|
+
# Scroll area for content
|
|
175
|
+
scroll = QScrollArea()
|
|
176
|
+
scroll.setWidgetResizable(True)
|
|
177
|
+
scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
|
|
178
|
+
scroll.setStyleSheet('QScrollArea { background-color: transparent; border: none; }')
|
|
133
179
|
|
|
180
|
+
# Content widget inside scroll area
|
|
181
|
+
content = QWidget()
|
|
182
|
+
content.setStyleSheet('background-color: transparent;')
|
|
183
|
+
content_layout = QVBoxLayout(content)
|
|
184
|
+
content_layout.setContentsMargins(0, 0, 8, 0)
|
|
185
|
+
content_layout.setSpacing(10)
|
|
186
|
+
|
|
187
|
+
# --- Experimental Features Section ---
|
|
188
|
+
exp_label = QLabel('Experimental')
|
|
189
|
+
exp_label.setFont(QFont('Segoe UI', 10, QFont.Weight.Bold))
|
|
190
|
+
exp_label.setStyleSheet('color: #ff9800; background-color: transparent;')
|
|
191
|
+
content_layout.addWidget(exp_label)
|
|
192
|
+
|
|
193
|
+
self.experimental_enabled = QCheckBox('Enable Experimental Features')
|
|
194
|
+
self.experimental_enabled.setToolTip('Enables AI and CPPY commands (may contain bugs)')
|
|
195
|
+
content_layout.addWidget(self.experimental_enabled)
|
|
196
|
+
|
|
197
|
+
self._add_separator(content_layout)
|
|
198
|
+
|
|
199
|
+
# --- AI Configuration Section ---
|
|
134
200
|
ai_label = QLabel('AI Configuration')
|
|
135
|
-
ai_label.setFont(QFont('Segoe UI',
|
|
136
|
-
|
|
201
|
+
ai_label.setFont(QFont('Segoe UI', 10, QFont.Weight.Bold))
|
|
202
|
+
content_layout.addWidget(ai_label)
|
|
137
203
|
|
|
138
204
|
self.ai_enabled = QCheckBox('Enable AI Features')
|
|
139
|
-
|
|
205
|
+
content_layout.addWidget(self.ai_enabled)
|
|
140
206
|
|
|
141
|
-
|
|
207
|
+
content_layout.addWidget(QLabel('OpenAI API Key'))
|
|
142
208
|
self.api_key = QLineEdit()
|
|
143
209
|
self.api_key.setEchoMode(QLineEdit.EchoMode.Password)
|
|
144
210
|
self.api_key.setPlaceholderText('sk-...')
|
|
145
|
-
|
|
211
|
+
content_layout.addWidget(self.api_key)
|
|
146
212
|
|
|
147
|
-
|
|
213
|
+
content_layout.addWidget(QLabel('Model'))
|
|
148
214
|
self.model = QComboBox()
|
|
149
215
|
self.model.addItems(['gpt-5', 'gpt-5-nano', 'gpt-4o', 'gpt-4-turbo', 'gpt-3.5-turbo'])
|
|
150
|
-
|
|
216
|
+
content_layout.addWidget(self.model)
|
|
151
217
|
|
|
152
|
-
self._add_separator(
|
|
218
|
+
self._add_separator(content_layout)
|
|
153
219
|
|
|
220
|
+
# --- API Tokens Section ---
|
|
154
221
|
tokens_label = QLabel('API Tokens')
|
|
155
|
-
tokens_label.setFont(QFont('Segoe UI',
|
|
156
|
-
|
|
222
|
+
tokens_label.setFont(QFont('Segoe UI', 10, QFont.Weight.Bold))
|
|
223
|
+
content_layout.addWidget(tokens_label)
|
|
157
224
|
|
|
158
|
-
|
|
225
|
+
content_layout.addWidget(QLabel('Brave Search API'))
|
|
159
226
|
self.brave_key = QLineEdit()
|
|
160
227
|
self.brave_key.setEchoMode(QLineEdit.EchoMode.Password)
|
|
161
228
|
self.brave_key.setPlaceholderText('Token for --websearch')
|
|
162
|
-
|
|
229
|
+
content_layout.addWidget(self.brave_key)
|
|
163
230
|
|
|
164
|
-
self._add_separator(
|
|
231
|
+
self._add_separator(content_layout)
|
|
165
232
|
|
|
233
|
+
# --- Usage Limits Section ---
|
|
166
234
|
limits_label = QLabel('Usage Limits')
|
|
167
|
-
limits_label.setFont(QFont('Segoe UI',
|
|
168
|
-
|
|
235
|
+
limits_label.setFont(QFont('Segoe UI', 10, QFont.Weight.Bold))
|
|
236
|
+
content_layout.addWidget(limits_label)
|
|
169
237
|
|
|
170
|
-
|
|
238
|
+
content_layout.addWidget(QLabel('Daily Token Limit'))
|
|
171
239
|
self.daily_limit = QLineEdit()
|
|
172
240
|
self.daily_limit.setPlaceholderText('220000')
|
|
173
|
-
|
|
241
|
+
content_layout.addWidget(self.daily_limit)
|
|
242
|
+
|
|
243
|
+
content_layout.addStretch()
|
|
174
244
|
|
|
175
|
-
|
|
245
|
+
scroll.setWidget(content)
|
|
246
|
+
main_layout.addWidget(scroll)
|
|
176
247
|
|
|
248
|
+
# Save button (fixed at bottom)
|
|
177
249
|
btn_layout = QHBoxLayout()
|
|
178
250
|
save_btn = QPushButton('Save')
|
|
179
|
-
save_btn.setStyleSheet('background-color: #4a9eff;')
|
|
251
|
+
save_btn.setStyleSheet('background-color: #4a9eff; font-weight: bold;')
|
|
180
252
|
save_btn.clicked.connect(self._save)
|
|
181
253
|
btn_layout.addWidget(save_btn)
|
|
182
|
-
|
|
254
|
+
main_layout.addLayout(btn_layout)
|
|
183
255
|
|
|
184
256
|
self._drag_pos = None
|
|
185
257
|
|
|
@@ -190,6 +262,9 @@ class SettingsWidget(QWidget):
|
|
|
190
262
|
layout.addWidget(line)
|
|
191
263
|
|
|
192
264
|
def _load_values(self):
|
|
265
|
+
# Experimental features
|
|
266
|
+
self.experimental_enabled.setChecked(self.config.get('experimental_features', False))
|
|
267
|
+
# AI settings
|
|
193
268
|
self.ai_enabled.setChecked(self.config.get('enabled', False))
|
|
194
269
|
api = self.config.get('api_key', '')
|
|
195
270
|
if api:
|
|
@@ -205,10 +280,14 @@ class SettingsWidget(QWidget):
|
|
|
205
280
|
self.daily_limit.setText(str(daily_limit))
|
|
206
281
|
|
|
207
282
|
def _save(self):
|
|
283
|
+
# Experimental features
|
|
284
|
+
self.config['experimental_features'] = self.experimental_enabled.isChecked()
|
|
285
|
+
# AI settings
|
|
208
286
|
self.config['enabled'] = self.ai_enabled.isChecked()
|
|
209
287
|
api = self.api_key.text().strip()
|
|
210
288
|
if api:
|
|
211
289
|
self.config['api_key'] = api
|
|
290
|
+
# Only update model if user explicitly changed it (preserve existing if combo unchanged)
|
|
212
291
|
self.config['model'] = self.model.currentText()
|
|
213
292
|
brave = self.brave_key.text().strip()
|
|
214
293
|
if brave:
|
|
@@ -1,25 +1,22 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: IncludeCPP
|
|
3
|
-
Version: 3.3.
|
|
3
|
+
Version: 3.3.20
|
|
4
4
|
Summary: Professional C++ Python bindings with type-generic templates, pystubs and native threading
|
|
5
|
-
Home-page: https://github.com/
|
|
6
|
-
Author:
|
|
7
|
-
Author-email:
|
|
5
|
+
Home-page: https://github.com/liliassg/IncludeCPP
|
|
6
|
+
Author: Lilias Hatterscheidt
|
|
7
|
+
Author-email: lilias@includecpp.dev
|
|
8
8
|
License: MIT
|
|
9
|
-
Project-URL:
|
|
10
|
-
Project-URL:
|
|
11
|
-
Project-URL: Repository, https://github.com/includecpp/includecpp
|
|
12
|
-
Project-URL: Bug Tracker, https://github.com/includecpp/includecpp/issues
|
|
9
|
+
Project-URL: Repository, https://github.com/liliassg/IncludeCPP
|
|
10
|
+
Project-URL: Bug Tracker, https://github.com/liliasg/IncludeCPP/issues
|
|
13
11
|
Keywords: c++,python,bindings,pybind11,template,performance,threading
|
|
14
12
|
Classifier: Development Status :: 4 - Beta
|
|
15
13
|
Classifier: Intended Audience :: Developers
|
|
16
14
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
17
|
-
Classifier: Programming Language :: Python :: 3
|
|
18
|
-
Classifier: Programming Language :: Python :: 3.8
|
|
19
15
|
Classifier: Programming Language :: Python :: 3.9
|
|
20
16
|
Classifier: Programming Language :: Python :: 3.10
|
|
21
17
|
Classifier: Programming Language :: Python :: 3.11
|
|
22
18
|
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
23
20
|
Classifier: Programming Language :: C++
|
|
24
21
|
Classifier: License :: OSI Approved :: MIT License
|
|
25
22
|
Classifier: Operating System :: OS Independent
|
|
@@ -30,7 +27,7 @@ Requires-Dist: pybind11>=2.11.0
|
|
|
30
27
|
Requires-Dist: click>=8.0.0
|
|
31
28
|
Requires-Dist: typing-extensions>=4.0.0
|
|
32
29
|
Requires-Dist: requests>=2.28.0
|
|
33
|
-
Dynamic: author
|
|
30
|
+
Dynamic: author-email
|
|
34
31
|
Dynamic: home-page
|
|
35
32
|
Dynamic: license-file
|
|
36
33
|
Dynamic: requires-python
|
|
@@ -604,8 +601,115 @@ Options:
|
|
|
604
601
|
- pybind11 (installed automatically)
|
|
605
602
|
- CMake (for build generation)
|
|
606
603
|
|
|
604
|
+
# Experimental Features
|
|
605
|
+
|
|
606
|
+
The following features are **experimental** and may contain bugs:
|
|
607
|
+
|
|
608
|
+
- `includecpp ai` - AI-powered code assistance
|
|
609
|
+
- `includecpp cppy` - Python to C++ code conversion
|
|
610
|
+
|
|
611
|
+
These commands are **hidden by default**. To enable them:
|
|
612
|
+
|
|
613
|
+
```bash
|
|
614
|
+
includecpp settings
|
|
615
|
+
```
|
|
616
|
+
|
|
617
|
+
Then check **"Enable Experimental Features"** and save.
|
|
618
|
+
|
|
619
|
+
**Warning:** Experimental features are under active development and may:
|
|
620
|
+
- Produce incorrect output
|
|
621
|
+
- Have breaking changes between versions
|
|
622
|
+
- Be removed or significantly changed
|
|
623
|
+
|
|
624
|
+
Use at your own discretion. Report issues at: https://github.com/hatte/IncludeCPP/issues
|
|
625
|
+
|
|
607
626
|
# Changelog
|
|
608
627
|
|
|
628
|
+
## v3.3.20
|
|
629
|
+
- **Bug Fixes:**
|
|
630
|
+
- Fixed `QPoint.toPoint()` AttributeError in rubber band selection
|
|
631
|
+
- Added UTF-8 encoding to all file read/write operations for cross-platform compatibility
|
|
632
|
+
- Fixed bare `except:` clauses to proper `except Exception:` in settings_ui.py
|
|
633
|
+
|
|
634
|
+
## v3.3.19
|
|
635
|
+
- **PyQt6 Import Fix:**
|
|
636
|
+
- Fixed silent import failure that caused "PyQt6 not installed" error even when installed
|
|
637
|
+
- Moved `QUndoStack`, `QUndoCommand`, `QShortcut` from QtWidgets to QtGui (correct location in PyQt6)
|
|
638
|
+
|
|
639
|
+
## v3.3.18
|
|
640
|
+
- **CodeMaker Visual Editor (Experimental):**
|
|
641
|
+
- Complete rewrite of `project` command with professional-grade UI
|
|
642
|
+
- 24 node types across 5 categories (Code Structures, Functions, Data, Organization, Flow)
|
|
643
|
+
- Undo/redo system with full command history
|
|
644
|
+
- Multi-selection with rubber band and Ctrl+Click
|
|
645
|
+
- Copy/paste/duplicate with Ctrl+C/V/D shortcuts
|
|
646
|
+
- Node grouping with Ctrl+G
|
|
647
|
+
- Code generation for C++ (header/source) and Python
|
|
648
|
+
- Search and filter nodes by name and type
|
|
649
|
+
- Export to PNG/SVG with transparency support
|
|
650
|
+
- Categorized right-click context menus
|
|
651
|
+
- Toolbar with common actions
|
|
652
|
+
- Cross-platform font detection (Windows/macOS/Linux)
|
|
653
|
+
- DPI-aware scaling for high-resolution displays
|
|
654
|
+
- **Experimental Feature Gating:**
|
|
655
|
+
- `project` command now requires "Enable Experimental Features" in settings
|
|
656
|
+
- Consistent gating with `ai` and `cppy` commands
|
|
657
|
+
|
|
658
|
+
## v3.3.16-3.3.17
|
|
659
|
+
- **QPen Bug Fixes:**
|
|
660
|
+
- Fixed 3 instances of `setPen(Qt.PenStyle.NoPen)` → `setPen(QPen(Qt.PenStyle.NoPen))`
|
|
661
|
+
- Proper QPen construction for PyQt6 compatibility
|
|
662
|
+
|
|
663
|
+
## v3.3.15
|
|
664
|
+
- **CPPY Converter Major Fixes:**
|
|
665
|
+
- Functions returning container now get `std::vector<T>` return type (e.g., shuffle_list)
|
|
666
|
+
- `max(items)` / `min(items)` now correctly uses `std::max_element` / `std::min_element`
|
|
667
|
+
- Template element parameters (`value`, `item`) now use `const T&` instead of `double`
|
|
668
|
+
- Explicit template instantiations now include correct return types and all parameters
|
|
669
|
+
- Python docstrings now become C++ comments instead of dangling string literals
|
|
670
|
+
- **Unicode Fallback System:**
|
|
671
|
+
- AI progress indicators use ASCII fallbacks on Windows terminals
|
|
672
|
+
- Fixed encoding errors in changelog display
|
|
673
|
+
|
|
674
|
+
## v3.3.14
|
|
675
|
+
- **Experimental Features System:**
|
|
676
|
+
- AI and CPPY commands now hidden by default
|
|
677
|
+
- Enable via Settings UI: "Enable Experimental Features" checkbox
|
|
678
|
+
- Warning about potential bugs documented in README
|
|
679
|
+
- **Settings UI Improvements:**
|
|
680
|
+
- Added scrollable content area to prevent layout squashing
|
|
681
|
+
- New "Experimental" section with orange header
|
|
682
|
+
- Better spacing and styling for all elements
|
|
683
|
+
- Preserved existing config values on save
|
|
684
|
+
|
|
685
|
+
## v3.3.13
|
|
686
|
+
- **Template Support for Generic Functions:**
|
|
687
|
+
- Generic container parameters now generate proper C++ templates
|
|
688
|
+
- `template<typename T> T getChoice(const std::vector<T>& choices)` instead of invalid `std::vector<auto>`
|
|
689
|
+
- Automatic explicit template instantiations for int, double, std::string
|
|
690
|
+
- **AI Conversion - No pybind11:**
|
|
691
|
+
- AI no longer generates pybind11 code - IncludeCPP handles bindings automatically
|
|
692
|
+
- Clean C++ output in `namespace includecpp`
|
|
693
|
+
- User runs `includecpp plugin` separately to generate bindings
|
|
694
|
+
- **AI Context - Dynamic README:**
|
|
695
|
+
- AI now loads README.md dynamically for accurate IncludeCPP documentation
|
|
696
|
+
- Better understanding of IncludeCPP workflow and patterns
|
|
697
|
+
|
|
698
|
+
## v3.3.12
|
|
699
|
+
- **Smart Type Inference:**
|
|
700
|
+
- Parameter types now inferred from common naming patterns (start/end → int, name/path → string, etc.)
|
|
701
|
+
- Variable type tracking throughout conversion for accurate string detection
|
|
702
|
+
- Loop variable types inferred from iterables (enumerate, for loops)
|
|
703
|
+
- **String Conversion Fix:**
|
|
704
|
+
- No more `std::to_string()` on already-string variables in f-strings
|
|
705
|
+
- `_is_string_expr()` method for comprehensive string type detection
|
|
706
|
+
- String variables detected by name, type tracking, and method calls
|
|
707
|
+
- **AI Conversion Improvements:**
|
|
708
|
+
- Explicit file extension enforcement (.cpp NOT .cp, .h NOT .hpp)
|
|
709
|
+
- Better --no-h flag handling with clear AI instructions
|
|
710
|
+
- AI can request clarification on unconvertible modules (tkinter, pygame, etc.)
|
|
711
|
+
- User prompted for input when AI needs guidance
|
|
712
|
+
|
|
609
713
|
## v3.3.11
|
|
610
714
|
- **CPPY Converter Improvements:**
|
|
611
715
|
- Added `_safe_arg()` and `_safe_get()` for robust bounds checking on all args
|
|
@@ -655,13 +759,7 @@ Options:
|
|
|
655
759
|
- Fixed duplicate file output in `cppy convert --ai`
|
|
656
760
|
- Plugin command now skips inline and underscore-prefixed functions
|
|
657
761
|
|
|
658
|
-
## v3.3.7
|
|
659
|
-
- Fixed AI knowledge: Now properly documents `SOURCE() && HEADER()` syntax for .cp files
|
|
660
|
-
- AI generates correct .cp format with `&& HEADER()` when creating both .cpp and .h files
|
|
661
|
-
- `cppy convert --ai --no-h` now properly instructs AI to skip header generation
|
|
662
|
-
- Fixed verbose output error in changes_summary method
|
|
663
|
-
|
|
664
762
|
|
|
665
763
|
---
|
|
666
764
|
|
|
667
|
-
MIT License | v3.3.
|
|
765
|
+
MIT License | v3.3.20 | [GitHub](https://github.com/liliassg/IncludeCPP)
|
|
@@ -1,30 +1,31 @@
|
|
|
1
|
-
includecpp/__init__.py,sha256=
|
|
1
|
+
includecpp/__init__.py,sha256=e3MYUBdHTtaJKUe-ATJe7xrI_Cbj8dSJ2IHE3_OXKrk,1560
|
|
2
2
|
includecpp/__init__.pyi,sha256=gNfQTFiM0z-Z2xazX7Hk5ULtW44lEU2j6hGEipcipMY,3637
|
|
3
3
|
includecpp/__main__.py,sha256=d6QK0PkvUe1ENofpmHRAg3bwNbZr8PiRscfI3-WRfVg,72
|
|
4
4
|
includecpp/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
5
|
includecpp/cli/__init__.py,sha256=Yda-4a5QJb_tKu35YQNfc5lu-LewTsM5abqNNkzS47M,113
|
|
6
|
-
includecpp/cli/commands.py,sha256=
|
|
6
|
+
includecpp/cli/commands.py,sha256=WL9xYBVduvqdoQbzkn03-ht415y3_tO8MNw2YYLRKao,304557
|
|
7
7
|
includecpp/cli/config_parser.py,sha256=KveeYUg2TA9sC5hKVzYYfgdNm2WfLG5y7_yxgBWn9yM,4886
|
|
8
8
|
includecpp/core/__init__.py,sha256=L1bT6oikTjdto-6Px7DpjePtM07ymo3Bnov1saZzsGg,390
|
|
9
|
-
includecpp/core/ai_integration.py,sha256=
|
|
9
|
+
includecpp/core/ai_integration.py,sha256=PW6yFDqdXjfchpfKTKg59AOLhLry9kqJEGf_65BztrY,87603
|
|
10
10
|
includecpp/core/build_manager.py,sha256=uLuYsuiC6OsOGaU5wAJfl4M3IbdnIDgogfMd8VsVpq8,102866
|
|
11
11
|
includecpp/core/cpp_api.py,sha256=8y_B1L18rhSBZln654xPPzqO2PdvAlLpJrfEjzl7Wnc,14039
|
|
12
12
|
includecpp/core/cpp_api.pyi,sha256=IEiaKqaPItnn6rjL7aK32D3o9FYmRYCgCZbqiQNUwdc,3496
|
|
13
|
-
includecpp/core/cppy_converter.py,sha256=
|
|
13
|
+
includecpp/core/cppy_converter.py,sha256=T6cjvgSwRD6E6_zV4B1LL3sKqCK1LxjneQIpzc4ifBY,150309
|
|
14
14
|
includecpp/core/error_catalog.py,sha256=VS3N-P0yEbiHimsDPtcaYfrUb7mXQ-7pqw18PtSngaU,33869
|
|
15
|
-
includecpp/core/error_formatter.py,sha256=
|
|
15
|
+
includecpp/core/error_formatter.py,sha256=7-MzRIT8cM4uODxy0IZ9pu7pqR4Pq2I8Si0QQZHjmVc,39239
|
|
16
16
|
includecpp/core/exceptions.py,sha256=szeF4qdzi_q8hBBZi7mJxkliyQ0crplkLYe0ymlBGtk,2459
|
|
17
17
|
includecpp/core/path_discovery.py,sha256=jI0oSq6Hsd4LKXmU4dOiGSrXcEO_KWMXfQ5_ylBmXvU,2561
|
|
18
|
-
includecpp/core/
|
|
18
|
+
includecpp/core/project_ui.py,sha256=NtAiMm9onGWYohjwvDG6Qv22m1OZuE9n9k4iR9WSR7M,112611
|
|
19
|
+
includecpp/core/settings_ui.py,sha256=B2SlwgdplF2KiBk5UYf2l8Jjifjd0F-FmBP0DPsVCEQ,11798
|
|
19
20
|
includecpp/generator/__init__.py,sha256=Rsy41bwimaEloD3gDRR_znPfIJzIsCFuWZgCTJBLJlc,62
|
|
20
21
|
includecpp/generator/parser.cpp,sha256=WA491gF1jmMV5Xl-hYKz0lqIPxR-tqaO5GptGKcm7Ds,72521
|
|
21
22
|
includecpp/generator/parser.h,sha256=EDm0b-pEesIIIQQ2PvH5h2qwlqJU9BH8SiMV7MWbsTo,11073
|
|
22
23
|
includecpp/generator/type_resolver.cpp,sha256=MmFK_4HXd1wqxALDiDyXVuU397SXoQL_o5zb_8N8Hzs,12346
|
|
23
24
|
includecpp/generator/type_resolver.h,sha256=ZsaxQqcCcKJJApYn7KOp2dLlQ1VFVG_oZDjaK5LhBSg,2590
|
|
24
25
|
includecpp/templates/cpp.proj.template,sha256=Iy-L8I4Cl3tIgBMx1Qp5h6gURvkqOAqyodVHuDJ0Luw,359
|
|
25
|
-
includecpp-3.3.
|
|
26
|
-
includecpp-3.3.
|
|
27
|
-
includecpp-3.3.
|
|
28
|
-
includecpp-3.3.
|
|
29
|
-
includecpp-3.3.
|
|
30
|
-
includecpp-3.3.
|
|
26
|
+
includecpp-3.3.20.dist-info/licenses/LICENSE,sha256=fWCsGGsiWZir0UzDd20Hh-3wtRyk1zqUntvtVuAWhvc,1093
|
|
27
|
+
includecpp-3.3.20.dist-info/METADATA,sha256=alndbXkWPVuJmaxQphlwjYojGotFloo175H-EycL3Mk,24361
|
|
28
|
+
includecpp-3.3.20.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
29
|
+
includecpp-3.3.20.dist-info/entry_points.txt,sha256=6A5Mif9gi0139Bf03W5plAb3wnAgbNaEVe1HJoGE-2o,59
|
|
30
|
+
includecpp-3.3.20.dist-info/top_level.txt,sha256=RFUaR1KG-M6mCYwP6w4ydP5Cgc8yNbP78jxGAvyjMa8,11
|
|
31
|
+
includecpp-3.3.20.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|