IncludeCPP 3.4.1__tar.gz → 3.4.5__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.
Files changed (49) hide show
  1. {includecpp-3.4.1 → includecpp-3.4.5}/IncludeCPP.egg-info/PKG-INFO +12 -2
  2. {includecpp-3.4.1 → includecpp-3.4.5}/IncludeCPP.egg-info/SOURCES.txt +20 -0
  3. {includecpp-3.4.1 → includecpp-3.4.5}/PKG-INFO +12 -2
  4. {includecpp-3.4.1 → includecpp-3.4.5}/README.md +11 -1
  5. {includecpp-3.4.1 → includecpp-3.4.5}/includecpp/__init__.py +59 -58
  6. {includecpp-3.4.1 → includecpp-3.4.5}/includecpp/cli/commands.py +377 -0
  7. includecpp-3.4.5/includecpp/core/cssl/__init__.py +40 -0
  8. includecpp-3.4.5/includecpp/core/cssl/cssl_builtins.py +1693 -0
  9. includecpp-3.4.5/includecpp/core/cssl/cssl_events.py +621 -0
  10. includecpp-3.4.5/includecpp/core/cssl/cssl_modules.py +2803 -0
  11. includecpp-3.4.5/includecpp/core/cssl/cssl_parser.py +1778 -0
  12. includecpp-3.4.5/includecpp/core/cssl/cssl_runtime.py +1560 -0
  13. includecpp-3.4.5/includecpp/core/cssl/cssl_syntax.py +488 -0
  14. includecpp-3.4.5/includecpp/core/cssl/cssl_types.py +390 -0
  15. includecpp-3.4.5/includecpp/core/cssl_bridge.py +204 -0
  16. includecpp-3.4.5/includecpp/core/cssl_bridge.pyi +149 -0
  17. {includecpp-3.4.1 → includecpp-3.4.5}/pyproject.toml +63 -60
  18. {includecpp-3.4.1 → includecpp-3.4.5}/setup.py +1 -1
  19. {includecpp-3.4.1 → includecpp-3.4.5}/IncludeCPP.egg-info/dependency_links.txt +0 -0
  20. {includecpp-3.4.1 → includecpp-3.4.5}/IncludeCPP.egg-info/entry_points.txt +0 -0
  21. {includecpp-3.4.1 → includecpp-3.4.5}/IncludeCPP.egg-info/requires.txt +0 -0
  22. {includecpp-3.4.1 → includecpp-3.4.5}/IncludeCPP.egg-info/top_level.txt +0 -0
  23. {includecpp-3.4.1 → includecpp-3.4.5}/LICENSE +0 -0
  24. {includecpp-3.4.1 → includecpp-3.4.5}/MANIFEST.in +0 -0
  25. {includecpp-3.4.1 → includecpp-3.4.5}/includecpp/__init__.pyi +0 -0
  26. {includecpp-3.4.1 → includecpp-3.4.5}/includecpp/__main__.py +0 -0
  27. {includecpp-3.4.1 → includecpp-3.4.5}/includecpp/cli/__init__.py +0 -0
  28. {includecpp-3.4.1 → includecpp-3.4.5}/includecpp/cli/config_parser.py +0 -0
  29. {includecpp-3.4.1 → includecpp-3.4.5}/includecpp/core/__init__.py +0 -0
  30. {includecpp-3.4.1 → includecpp-3.4.5}/includecpp/core/ai_integration.py +0 -0
  31. {includecpp-3.4.1 → includecpp-3.4.5}/includecpp/core/build_manager.py +0 -0
  32. {includecpp-3.4.1 → includecpp-3.4.5}/includecpp/core/cpp_api.py +0 -0
  33. {includecpp-3.4.1 → includecpp-3.4.5}/includecpp/core/cpp_api.pyi +0 -0
  34. {includecpp-3.4.1 → includecpp-3.4.5}/includecpp/core/cppy_converter.py +0 -0
  35. {includecpp-3.4.1 → includecpp-3.4.5}/includecpp/core/error_catalog.py +0 -0
  36. {includecpp-3.4.1 → includecpp-3.4.5}/includecpp/core/error_formatter.py +0 -0
  37. {includecpp-3.4.1 → includecpp-3.4.5}/includecpp/core/exceptions.py +0 -0
  38. {includecpp-3.4.1 → includecpp-3.4.5}/includecpp/core/path_discovery.py +0 -0
  39. {includecpp-3.4.1 → includecpp-3.4.5}/includecpp/core/project_ui.py +0 -0
  40. {includecpp-3.4.1 → includecpp-3.4.5}/includecpp/core/settings_ui.py +0 -0
  41. {includecpp-3.4.1 → includecpp-3.4.5}/includecpp/generator/__init__.py +0 -0
  42. {includecpp-3.4.1 → includecpp-3.4.5}/includecpp/generator/parser.cpp +0 -0
  43. {includecpp-3.4.1 → includecpp-3.4.5}/includecpp/generator/parser.h +0 -0
  44. {includecpp-3.4.1 → includecpp-3.4.5}/includecpp/generator/type_resolver.cpp +0 -0
  45. {includecpp-3.4.1 → includecpp-3.4.5}/includecpp/generator/type_resolver.h +0 -0
  46. {includecpp-3.4.1 → includecpp-3.4.5}/includecpp/py.typed +0 -0
  47. {includecpp-3.4.1 → includecpp-3.4.5}/includecpp/templates/cpp.proj.template +0 -0
  48. {includecpp-3.4.1 → includecpp-3.4.5}/requirements.txt +0 -0
  49. {includecpp-3.4.1 → includecpp-3.4.5}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: IncludeCPP
3
- Version: 3.4.1
3
+ Version: 3.4.5
4
4
  Summary: Professional C++ Python bindings with type-generic templates, pystubs and native threading
5
5
  Home-page: https://github.com/liliassg/IncludeCPP
6
6
  Author: Lilias Hatterscheidt
@@ -625,6 +625,16 @@ Use at your own discretion. Report issues at: https://github.com/hatte/IncludeCP
625
625
 
626
626
  # Changelog
627
627
 
628
+ ## v3.4.2
629
+ - **New Feature: `exec` Command**
630
+ - Interactive REPL for quick code testing without creating files
631
+ - `includecpp exec py` - Python REPL with IncludeCPP support
632
+ - `includecpp exec cpp` - C++ REPL with auto-compilation
633
+ - Auto-import modules: `includecpp exec py mymodule`
634
+ - Auto-import from plugins: `includecpp exec py plugins/math.cp`
635
+ - Import all modules: `includecpp exec py --all`
636
+ - Enter code line by line, press ENTER on empty line to execute
637
+
628
638
  ## v3.4.1
629
639
  - **Bug Fixes:**
630
640
  - fix command: Fixed false positives for unused variables (sum, memory_) using word-boundary matching
@@ -796,4 +806,4 @@ Use at your own discretion. Report issues at: https://github.com/hatte/IncludeCP
796
806
 
797
807
  ---
798
808
 
799
- MIT License | v3.4.1 | [GitHub](https://github.com/liliassg/IncludeCPP)
809
+ MIT License | v3.4.2 | [GitHub](https://github.com/liliassg/IncludeCPP)
@@ -17,12 +17,22 @@ setup.py
17
17
  ./includecpp/core/cpp_api.py
18
18
  ./includecpp/core/cpp_api.pyi
19
19
  ./includecpp/core/cppy_converter.py
20
+ ./includecpp/core/cssl_bridge.py
21
+ ./includecpp/core/cssl_bridge.pyi
20
22
  ./includecpp/core/error_catalog.py
21
23
  ./includecpp/core/error_formatter.py
22
24
  ./includecpp/core/exceptions.py
23
25
  ./includecpp/core/path_discovery.py
24
26
  ./includecpp/core/project_ui.py
25
27
  ./includecpp/core/settings_ui.py
28
+ ./includecpp/core/cssl/__init__.py
29
+ ./includecpp/core/cssl/cssl_builtins.py
30
+ ./includecpp/core/cssl/cssl_events.py
31
+ ./includecpp/core/cssl/cssl_modules.py
32
+ ./includecpp/core/cssl/cssl_parser.py
33
+ ./includecpp/core/cssl/cssl_runtime.py
34
+ ./includecpp/core/cssl/cssl_syntax.py
35
+ ./includecpp/core/cssl/cssl_types.py
26
36
  ./includecpp/generator/__init__.py
27
37
  ./includecpp/generator/parser.cpp
28
38
  ./includecpp/generator/parser.h
@@ -48,12 +58,22 @@ includecpp/core/build_manager.py
48
58
  includecpp/core/cpp_api.py
49
59
  includecpp/core/cpp_api.pyi
50
60
  includecpp/core/cppy_converter.py
61
+ includecpp/core/cssl_bridge.py
62
+ includecpp/core/cssl_bridge.pyi
51
63
  includecpp/core/error_catalog.py
52
64
  includecpp/core/error_formatter.py
53
65
  includecpp/core/exceptions.py
54
66
  includecpp/core/path_discovery.py
55
67
  includecpp/core/project_ui.py
56
68
  includecpp/core/settings_ui.py
69
+ includecpp/core/cssl/__init__.py
70
+ includecpp/core/cssl/cssl_builtins.py
71
+ includecpp/core/cssl/cssl_events.py
72
+ includecpp/core/cssl/cssl_modules.py
73
+ includecpp/core/cssl/cssl_parser.py
74
+ includecpp/core/cssl/cssl_runtime.py
75
+ includecpp/core/cssl/cssl_syntax.py
76
+ includecpp/core/cssl/cssl_types.py
57
77
  includecpp/generator/__init__.py
58
78
  includecpp/generator/parser.cpp
59
79
  includecpp/generator/parser.h
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: IncludeCPP
3
- Version: 3.4.1
3
+ Version: 3.4.5
4
4
  Summary: Professional C++ Python bindings with type-generic templates, pystubs and native threading
5
5
  Home-page: https://github.com/liliassg/IncludeCPP
6
6
  Author: Lilias Hatterscheidt
@@ -625,6 +625,16 @@ Use at your own discretion. Report issues at: https://github.com/hatte/IncludeCP
625
625
 
626
626
  # Changelog
627
627
 
628
+ ## v3.4.2
629
+ - **New Feature: `exec` Command**
630
+ - Interactive REPL for quick code testing without creating files
631
+ - `includecpp exec py` - Python REPL with IncludeCPP support
632
+ - `includecpp exec cpp` - C++ REPL with auto-compilation
633
+ - Auto-import modules: `includecpp exec py mymodule`
634
+ - Auto-import from plugins: `includecpp exec py plugins/math.cp`
635
+ - Import all modules: `includecpp exec py --all`
636
+ - Enter code line by line, press ENTER on empty line to execute
637
+
628
638
  ## v3.4.1
629
639
  - **Bug Fixes:**
630
640
  - fix command: Fixed false positives for unused variables (sum, memory_) using word-boundary matching
@@ -796,4 +806,4 @@ Use at your own discretion. Report issues at: https://github.com/hatte/IncludeCP
796
806
 
797
807
  ---
798
808
 
799
- MIT License | v3.4.1 | [GitHub](https://github.com/liliassg/IncludeCPP)
809
+ MIT License | v3.4.2 | [GitHub](https://github.com/liliassg/IncludeCPP)
@@ -591,6 +591,16 @@ Use at your own discretion. Report issues at: https://github.com/hatte/IncludeCP
591
591
 
592
592
  # Changelog
593
593
 
594
+ ## v3.4.2
595
+ - **New Feature: `exec` Command**
596
+ - Interactive REPL for quick code testing without creating files
597
+ - `includecpp exec py` - Python REPL with IncludeCPP support
598
+ - `includecpp exec cpp` - C++ REPL with auto-compilation
599
+ - Auto-import modules: `includecpp exec py mymodule`
600
+ - Auto-import from plugins: `includecpp exec py plugins/math.cp`
601
+ - Import all modules: `includecpp exec py --all`
602
+ - Enter code line by line, press ENTER on empty line to execute
603
+
594
604
  ## v3.4.1
595
605
  - **Bug Fixes:**
596
606
  - fix command: Fixed false positives for unused variables (sum, memory_) using word-boundary matching
@@ -762,4 +772,4 @@ Use at your own discretion. Report issues at: https://github.com/hatte/IncludeCP
762
772
 
763
773
  ---
764
774
 
765
- MIT License | v3.4.1 | [GitHub](https://github.com/liliassg/IncludeCPP)
775
+ MIT License | v3.4.2 | [GitHub](https://github.com/liliassg/IncludeCPP)
@@ -1,58 +1,59 @@
1
- from .core.cpp_api import CppApi
2
- import warnings
3
-
4
- __version__ = "3.4.1"
5
- __all__ = ["CppApi"]
6
-
7
- # Module-level cache for C++ modules
8
- _api_instance = None
9
- _loaded_modules = {}
10
-
11
- def _get_api():
12
- """Get or create singleton CppApi instance."""
13
- global _api_instance
14
- if _api_instance is None:
15
- _api_instance = CppApi()
16
- return _api_instance
17
-
18
- def __getattr__(name: str):
19
- """Enable: from includecpp import fast_list
20
-
21
- This hook is called when Python cannot find an attribute in this module.
22
- It allows dynamic C++ module loading via the import system.
23
- """
24
- if name.startswith('_'):
25
- raise AttributeError(f"module 'includecpp' has no attribute '{name}'")
26
-
27
- if name in _loaded_modules:
28
- return _loaded_modules[name]
29
-
30
- api = _get_api()
31
-
32
- if name not in api.registry:
33
- available = list(api.registry.keys())
34
- raise AttributeError(
35
- f"Module '{name}' not found. "
36
- f"Available: {available}. "
37
- f"Run 'includecpp rebuild' first."
38
- )
39
-
40
- if api.need_update(name):
41
- warnings.warn(
42
- f"Module '{name}' source files changed. "
43
- f"Run 'includecpp rebuild' to update.",
44
- UserWarning
45
- )
46
-
47
- module = api.include(name)
48
- _loaded_modules[name] = module
49
- return module
50
-
51
- def __dir__():
52
- """List available attributes including C++ modules."""
53
- base = ['CppApi', '__version__']
54
- try:
55
- api = _get_api()
56
- return sorted(set(base + list(api.registry.keys())))
57
- except Exception:
58
- return base
1
+ from .core.cpp_api import CppApi
2
+ from .core import cssl_bridge as CSSL
3
+ import warnings
4
+
5
+ __version__ = "3.4.5"
6
+ __all__ = ["CppApi", "CSSL"]
7
+
8
+ # Module-level cache for C++ modules
9
+ _api_instance = None
10
+ _loaded_modules = {}
11
+
12
+ def _get_api():
13
+ """Get or create singleton CppApi instance."""
14
+ global _api_instance
15
+ if _api_instance is None:
16
+ _api_instance = CppApi()
17
+ return _api_instance
18
+
19
+ def __getattr__(name: str):
20
+ """Enable: from includecpp import fast_list
21
+
22
+ This hook is called when Python cannot find an attribute in this module.
23
+ It allows dynamic C++ module loading via the import system.
24
+ """
25
+ if name.startswith('_'):
26
+ raise AttributeError(f"module 'includecpp' has no attribute '{name}'")
27
+
28
+ if name in _loaded_modules:
29
+ return _loaded_modules[name]
30
+
31
+ api = _get_api()
32
+
33
+ if name not in api.registry:
34
+ available = list(api.registry.keys())
35
+ raise AttributeError(
36
+ f"Module '{name}' not found. "
37
+ f"Available: {available}. "
38
+ f"Run 'includecpp rebuild' first."
39
+ )
40
+
41
+ if api.need_update(name):
42
+ warnings.warn(
43
+ f"Module '{name}' source files changed. "
44
+ f"Run 'includecpp rebuild' to update.",
45
+ UserWarning
46
+ )
47
+
48
+ module = api.include(name)
49
+ _loaded_modules[name] = module
50
+ return module
51
+
52
+ def __dir__():
53
+ """List available attributes including C++ modules."""
54
+ base = ['CppApi', 'CSSL', '__version__']
55
+ try:
56
+ api = _get_api()
57
+ return sorted(set(base + list(api.registry.keys())))
58
+ except Exception:
59
+ return base
@@ -7135,6 +7135,383 @@ def cppy_types():
7135
7135
  click.echo("=" * 60)
7136
7136
 
7137
7137
 
7138
+ # ============================================================================
7139
+ # EXEC - Interactive Code Execution
7140
+ # ============================================================================
7141
+
7142
+ @cli.command()
7143
+ @click.argument('lang', type=click.Choice(['py', 'cpp', 'python', 'c++']))
7144
+ @click.argument('path', required=False, type=click.Path())
7145
+ @click.option('--all', 'import_all', is_flag=True, help='Import all available modules')
7146
+ def exec(lang, path, import_all):
7147
+ """Execute code interactively for quick testing.
7148
+
7149
+ Run Python or C++ code snippets without creating files.
7150
+ Perfect for testing your IncludeCPP modules quickly.
7151
+
7152
+ \b
7153
+ Usage:
7154
+ includecpp exec py # Interactive Python
7155
+ includecpp exec cpp # Interactive C++
7156
+ includecpp exec py mymodule # Auto-import mymodule
7157
+ includecpp exec py plugins/x.cp # Auto-import from plugin
7158
+ includecpp exec py --all # Import all modules
7159
+
7160
+ \b
7161
+ Controls:
7162
+ ENTER = Add new line
7163
+ Empty line = Execute code (press ENTER twice)
7164
+ CTRL+C = Cancel
7165
+
7166
+ \b
7167
+ Examples:
7168
+ $ includecpp exec py fast_math
7169
+ >>> x = fast_math.add(1, 2)
7170
+ >>> print(x)
7171
+ >>>
7172
+ 3
7173
+ """
7174
+ import sys
7175
+ import subprocess
7176
+ import tempfile
7177
+ from pathlib import Path as PathLib
7178
+
7179
+ # Normalize language
7180
+ is_python = lang in ('py', 'python')
7181
+ lang_name = 'Python' if is_python else 'C++'
7182
+
7183
+ # Build imports/includes
7184
+ imports = []
7185
+ includes = []
7186
+
7187
+ if import_all:
7188
+ # Import all available modules
7189
+ try:
7190
+ from ..core.cpp_api import CppApi
7191
+ api = CppApi()
7192
+ modules = list(api.registry.keys())
7193
+ if is_python:
7194
+ for mod in modules:
7195
+ imports.append(f'from includecpp import {mod}')
7196
+ if modules:
7197
+ click.secho(f"Auto-importing {len(modules)} modules: {', '.join(modules)}", fg='cyan')
7198
+ else:
7199
+ for mod in modules:
7200
+ includes.append(f'#include "{mod}.h"')
7201
+ if modules:
7202
+ click.secho(f"Auto-including {len(modules)} headers", fg='cyan')
7203
+ except Exception:
7204
+ click.secho("Warning: Could not load module registry", fg='yellow')
7205
+
7206
+ elif path:
7207
+ path_obj = PathLib(path)
7208
+ module_name = None
7209
+
7210
+ # Check if it's a .cp plugin file
7211
+ if path.endswith('.cp') or '/plugins/' in path or '\\plugins\\' in path:
7212
+ # Extract module name from plugin path
7213
+ module_name = path_obj.stem
7214
+ elif path_obj.exists():
7215
+ # It's a file path
7216
+ module_name = path_obj.stem
7217
+ else:
7218
+ # Assume it's a module name directly
7219
+ module_name = path
7220
+
7221
+ if module_name:
7222
+ if is_python:
7223
+ imports.append(f'from includecpp import {module_name}')
7224
+ click.secho(f"Auto-importing: {module_name}", fg='cyan')
7225
+ else:
7226
+ includes.append(f'#include "{module_name}.h"')
7227
+ click.secho(f"Auto-including: {module_name}.h", fg='cyan')
7228
+
7229
+ # Show header
7230
+ click.echo()
7231
+ click.secho(f"=== IncludeCPP {lang_name} REPL ===", fg='cyan', bold=True)
7232
+ click.echo("Enter code line by line. Press ENTER on empty line to execute.")
7233
+ click.echo("Press CTRL+C to cancel.")
7234
+ click.echo()
7235
+
7236
+ # Show pre-loaded imports
7237
+ if imports:
7238
+ click.secho("Pre-loaded:", fg='green')
7239
+ for imp in imports:
7240
+ click.echo(f" {imp}")
7241
+ click.echo()
7242
+
7243
+ if includes:
7244
+ click.secho("Pre-loaded:", fg='green')
7245
+ for inc in includes:
7246
+ click.echo(f" {inc}")
7247
+ click.echo()
7248
+
7249
+ # Collect code lines
7250
+ lines = []
7251
+ prompt = '>>> ' if is_python else 'cpp> '
7252
+ continuation = '... ' if is_python else ' > '
7253
+
7254
+ try:
7255
+ while True:
7256
+ try:
7257
+ # Determine prompt
7258
+ current_prompt = prompt if not lines else continuation
7259
+ line = input(current_prompt)
7260
+
7261
+ # Empty line = execute
7262
+ if not line.strip():
7263
+ if lines:
7264
+ break
7265
+ continue
7266
+
7267
+ lines.append(line)
7268
+
7269
+ except EOFError:
7270
+ break
7271
+
7272
+ except KeyboardInterrupt:
7273
+ click.echo()
7274
+ click.secho("Cancelled.", fg='yellow')
7275
+ return
7276
+
7277
+ if not lines:
7278
+ click.secho("No code entered.", fg='yellow')
7279
+ return
7280
+
7281
+ # Build full code
7282
+ code_lines = imports + [''] + lines if imports else lines
7283
+
7284
+ click.echo()
7285
+ click.secho("--- Output ---", fg='green')
7286
+
7287
+ if is_python:
7288
+ # Execute Python code
7289
+ full_code = '\n'.join(code_lines)
7290
+ try:
7291
+ # Use exec with captured output
7292
+ import io
7293
+ from contextlib import redirect_stdout, redirect_stderr
7294
+
7295
+ stdout_capture = io.StringIO()
7296
+ stderr_capture = io.StringIO()
7297
+
7298
+ # Create execution context
7299
+ exec_globals = {'__name__': '__main__'}
7300
+
7301
+ with redirect_stdout(stdout_capture), redirect_stderr(stderr_capture):
7302
+ exec(full_code, exec_globals)
7303
+
7304
+ stdout_val = stdout_capture.getvalue()
7305
+ stderr_val = stderr_capture.getvalue()
7306
+
7307
+ if stdout_val:
7308
+ click.echo(stdout_val, nl=False)
7309
+ if stderr_val:
7310
+ click.secho(stderr_val, fg='red', nl=False)
7311
+
7312
+ if not stdout_val and not stderr_val:
7313
+ click.secho("(no output)", fg='bright_black')
7314
+
7315
+ except Exception as e:
7316
+ click.secho(f"Error: {e}", fg='red')
7317
+
7318
+ else:
7319
+ # Execute C++ code
7320
+ # Build a complete C++ program
7321
+ cpp_code_lines = [
7322
+ '#include <iostream>',
7323
+ '#include <vector>',
7324
+ '#include <string>',
7325
+ '#include <algorithm>',
7326
+ '#include <cmath>',
7327
+ 'using namespace std;',
7328
+ ''
7329
+ ]
7330
+ cpp_code_lines.extend(includes)
7331
+ cpp_code_lines.append('')
7332
+ cpp_code_lines.append('int main() {')
7333
+
7334
+ # Indent user code
7335
+ for line in lines:
7336
+ cpp_code_lines.append(' ' + line)
7337
+
7338
+ cpp_code_lines.append(' return 0;')
7339
+ cpp_code_lines.append('}')
7340
+
7341
+ full_code = '\n'.join(cpp_code_lines)
7342
+
7343
+ # Write to temp file and compile
7344
+ with tempfile.NamedTemporaryFile(mode='w', suffix='.cpp', delete=False, encoding='utf-8') as f:
7345
+ f.write(full_code)
7346
+ cpp_file = f.name
7347
+
7348
+ exe_file = cpp_file.replace('.cpp', '.exe' if sys.platform == 'win32' else '')
7349
+
7350
+ try:
7351
+ # Compile
7352
+ compile_cmd = ['g++', '-std=c++17', '-o', exe_file, cpp_file]
7353
+ result = subprocess.run(compile_cmd, capture_output=True, text=True)
7354
+
7355
+ if result.returncode != 0:
7356
+ click.secho("Compilation Error:", fg='red')
7357
+ click.echo(result.stderr)
7358
+ else:
7359
+ # Run
7360
+ run_result = subprocess.run([exe_file], capture_output=True, text=True, timeout=10)
7361
+ if run_result.stdout:
7362
+ click.echo(run_result.stdout, nl=False)
7363
+ if run_result.stderr:
7364
+ click.secho(run_result.stderr, fg='red', nl=False)
7365
+ if not run_result.stdout and not run_result.stderr:
7366
+ click.secho("(no output)", fg='bright_black')
7367
+
7368
+ except subprocess.TimeoutExpired:
7369
+ click.secho("Execution timed out (10s limit)", fg='red')
7370
+ except FileNotFoundError:
7371
+ click.secho("Error: g++ not found. Install a C++ compiler.", fg='red')
7372
+ except Exception as e:
7373
+ click.secho(f"Error: {e}", fg='red')
7374
+ finally:
7375
+ # Cleanup temp files
7376
+ import os
7377
+ try:
7378
+ os.unlink(cpp_file)
7379
+ if os.path.exists(exe_file):
7380
+ os.unlink(exe_file)
7381
+ except Exception:
7382
+ pass
7383
+
7384
+ click.echo()
7385
+ click.secho("--------------", fg='green')
7386
+
7387
+
7388
+ # ============================================================================
7389
+ # CSSL - Hidden Command Group
7390
+ # ============================================================================
7391
+
7392
+ @click.group(hidden=True)
7393
+ def cssl():
7394
+ """CSSL scripting commands."""
7395
+ pass
7396
+
7397
+
7398
+ @cssl.command(name='exec')
7399
+ @click.argument('path', required=False, type=click.Path())
7400
+ @click.option('--code', '-c', type=str, help='Execute code directly')
7401
+ def cssl_exec(path, code):
7402
+ """Execute CSSL code or file."""
7403
+ from pathlib import Path as PathLib
7404
+
7405
+ try:
7406
+ from ..core.cssl_bridge import CsslLang
7407
+ except ImportError as e:
7408
+ click.secho(f"CSSL runtime not available: {e}", fg='red')
7409
+ return
7410
+
7411
+ cssl_lang = CsslLang()
7412
+
7413
+ # Determine source
7414
+ if code:
7415
+ source = code
7416
+ elif path:
7417
+ path_obj = PathLib(path)
7418
+ if not path_obj.exists():
7419
+ click.secho(f"File not found: {path}", fg='red')
7420
+ return
7421
+ source = path_obj.read_text(encoding='utf-8')
7422
+ else:
7423
+ # Interactive mode
7424
+ click.secho("=== CSSL REPL ===", fg='magenta', bold=True)
7425
+ click.echo("Enter CSSL code. Empty line to execute. CTRL+C to cancel.")
7426
+ click.echo()
7427
+
7428
+ lines = []
7429
+ prompt = 'cssl> '
7430
+
7431
+ try:
7432
+ while True:
7433
+ try:
7434
+ line = input(prompt)
7435
+ if not line.strip():
7436
+ if lines:
7437
+ break
7438
+ continue
7439
+ lines.append(line)
7440
+ except EOFError:
7441
+ break
7442
+ except KeyboardInterrupt:
7443
+ click.echo()
7444
+ click.secho("Cancelled.", fg='yellow')
7445
+ return
7446
+
7447
+ if not lines:
7448
+ click.secho("No code entered.", fg='yellow')
7449
+ return
7450
+
7451
+ source = '\n'.join(lines)
7452
+
7453
+ # Execute
7454
+ click.secho("--- Output ---", fg='green')
7455
+ try:
7456
+ result = cssl_lang.exec(source)
7457
+
7458
+ # Print output buffer
7459
+ for line in cssl_lang.get_output():
7460
+ click.echo(line)
7461
+
7462
+ if result is not None:
7463
+ click.echo(f"Result: {result}")
7464
+
7465
+ except Exception as e:
7466
+ click.secho(f"CSSL Error: {e}", fg='red')
7467
+
7468
+ click.secho("--------------", fg='green')
7469
+
7470
+
7471
+ @cssl.command(name='makemodule')
7472
+ @click.argument('path', type=click.Path(exists=True))
7473
+ @click.option('--output', '-o', type=click.Path(), help='Output path for .cssl-mod')
7474
+ def cssl_makemodule(path, output):
7475
+ """Create a .cssl-mod module from Python/C++ file."""
7476
+ from pathlib import Path as PathLib
7477
+ import pickle
7478
+ import base64
7479
+
7480
+ path_obj = PathLib(path)
7481
+ suffix = path_obj.suffix.lower()
7482
+
7483
+ if suffix not in ('.py', '.cpp', '.cp', '.h'):
7484
+ click.secho(f"Unsupported file type: {suffix}", fg='red')
7485
+ click.echo("Supported: .py, .cpp, .cp, .h")
7486
+ return
7487
+
7488
+ # Read source
7489
+ source = path_obj.read_text(encoding='utf-8')
7490
+
7491
+ # Create module data
7492
+ module_data = {
7493
+ 'name': path_obj.stem,
7494
+ 'type': 'python' if suffix == '.py' else 'cpp',
7495
+ 'source': source,
7496
+ 'version': '1.0',
7497
+ }
7498
+
7499
+ # Encode as base64 pickle
7500
+ encoded = base64.b64encode(pickle.dumps(module_data)).decode('utf-8')
7501
+
7502
+ # Write .cssl-mod file
7503
+ out_path = PathLib(output) if output else path_obj.with_suffix('.cssl-mod')
7504
+ out_path.write_text(f"CSSLMOD1\n{encoded}", encoding='utf-8')
7505
+
7506
+ click.secho(f"Created: {out_path}", fg='green')
7507
+ click.echo(f" Name: {module_data['name']}")
7508
+ click.echo(f" Type: {module_data['type']}")
7509
+
7510
+
7511
+ # Register hidden cssl command group
7512
+ cli.add_command(cssl)
7513
+
7514
+
7138
7515
  # ============================================================================
7139
7516
  # Conditional Registration of Experimental Commands
7140
7517
  # ============================================================================
@@ -0,0 +1,40 @@
1
+ """
2
+ CSSL - CSO Service Script Language
3
+ Bundled with IncludeCPP for integrated scripting support.
4
+
5
+ Features:
6
+ - BruteForce Injection System: <==, ==>, +<==, -<==, <<==, ==>>
7
+ - Dynamic typing with 'dynamic' keyword
8
+ - Function modifiers: undefined, open, meta, super, closed, private, virtual
9
+ - Advanced data types: datastruct, shuffled, iterator, combo, dataspace
10
+ - Injection helpers: string::where, json::key, array::index, etc.
11
+ - Global references: @Name, r@Name, s@Name
12
+ """
13
+
14
+ from .cssl_parser import (
15
+ parse_cssl, parse_cssl_program, tokenize_cssl,
16
+ CSSLSyntaxError, CSSLLexer, CSSLParser, ASTNode,
17
+ KEYWORDS, TYPE_GENERICS, INJECTION_HELPERS
18
+ )
19
+ from .cssl_runtime import CSSLRuntime, CSSLRuntimeError, CSSLServiceRunner, run_cssl, run_cssl_file
20
+ from .cssl_types import (
21
+ DataStruct, Shuffled, Iterator, Combo, DataSpace, OpenQuote,
22
+ OpenFind,
23
+ create_datastruct, create_shuffled, create_iterator,
24
+ create_combo, create_dataspace, create_openquote
25
+ )
26
+
27
+ __all__ = [
28
+ # Parser
29
+ 'parse_cssl', 'parse_cssl_program', 'tokenize_cssl',
30
+ 'CSSLSyntaxError', 'CSSLLexer', 'CSSLParser', 'ASTNode',
31
+ 'KEYWORDS', 'TYPE_GENERICS', 'INJECTION_HELPERS',
32
+ # Runtime
33
+ 'CSSLRuntime', 'CSSLRuntimeError', 'CSSLServiceRunner',
34
+ 'run_cssl', 'run_cssl_file',
35
+ # Data Types
36
+ 'DataStruct', 'Shuffled', 'Iterator', 'Combo', 'DataSpace', 'OpenQuote',
37
+ 'OpenFind',
38
+ 'create_datastruct', 'create_shuffled', 'create_iterator',
39
+ 'create_combo', 'create_dataspace', 'create_openquote'
40
+ ]