IncludeCPP 3.7.21__py3-none-any.whl → 3.7.22__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 CHANGED
@@ -2,7 +2,7 @@ from .core.cpp_api import CppApi
2
2
  from .core import cssl_bridge as CSSL
3
3
  import warnings
4
4
 
5
- __version__ = "3.7.21"
5
+ __version__ = "3.7.22"
6
6
  __all__ = ["CppApi", "CSSL"]
7
7
 
8
8
  # Module-level cache for C++ modules
@@ -7720,7 +7720,13 @@ def cssl_doc(search, list_sections):
7720
7720
  click.echo("Or use: includecpp cssl doc --list")
7721
7721
  else:
7722
7722
  # Full documentation mode
7723
- click.echo_via_pager(content)
7723
+ # Replace Unicode characters that may not be supported on all terminals
7724
+ safe_content = content.replace('✓', '[OK]').replace('✗', '[X]').replace('→', '->').replace('←', '<-').replace('•', '*').replace('─', '-').replace('│', '|').replace('└', '+').replace('├', '+').replace('▸', '>').replace('▾', 'v')
7725
+ try:
7726
+ click.echo_via_pager(safe_content)
7727
+ except UnicodeEncodeError:
7728
+ # Fallback: encode with errors='replace'
7729
+ click.echo(safe_content.encode('ascii', errors='replace').decode('ascii'))
7724
7730
  else:
7725
7731
  click.secho("Documentation file not found.", fg='yellow')
7726
7732
  click.echo("Looking for: CSSL_DOCUMENTATION.md")
@@ -252,8 +252,15 @@ class CSSLLexer:
252
252
  # $<name> shared object reference
253
253
  self._read_shared_ref()
254
254
  elif char == '%':
255
- # %<name> captured reference (for infusion)
256
- self._read_captured_ref()
255
+ # Check if this is %<name> captured reference or % modulo operator
256
+ next_char = self._peek(1)
257
+ if next_char and (next_char.isalpha() or next_char == '_'):
258
+ # %<name> captured reference (for infusion)
259
+ self._read_captured_ref()
260
+ else:
261
+ # % modulo operator
262
+ self._add_token(TokenType.MODULO, '%')
263
+ self._advance()
257
264
  elif char == '&':
258
265
  # & for references
259
266
  if self._peek(1) == '&':
@@ -321,9 +328,6 @@ class CSSLLexer:
321
328
  else:
322
329
  # Already handled by // comment check above, but just in case
323
330
  self._skip_comment()
324
- elif char == '%':
325
- self._add_token(TokenType.MODULO, '%')
326
- self._advance()
327
331
  elif char == '<':
328
332
  self._read_less_than()
329
333
  elif char == '>':
@@ -1554,13 +1554,112 @@ class CSSLRuntime:
1554
1554
 
1555
1555
  # === DYNAMIC HELPERS ===
1556
1556
  elif filter_type == 'dynamic':
1557
- # dynamic::VarName=VALUE - Match if variable equals value
1558
- var_name = helper
1559
- var_value = self.scope.get(var_name)
1560
- if var_value == filter_val:
1561
- pass # Keep result
1557
+ if helper == 'content':
1558
+ # dynamic::content=VALUE - General content filter for any type
1559
+ # Filters elements where content equals VALUE
1560
+ if isinstance(result, (list, tuple)):
1561
+ # Filter list/tuple elements by content value
1562
+ result = [item for item in result if item == filter_val]
1563
+ elif isinstance(result, dict):
1564
+ # Filter dict by values matching filter_val
1565
+ result = {k: v for k, v in result.items() if v == filter_val}
1566
+ elif result == filter_val:
1567
+ pass # Keep result if it matches
1568
+ else:
1569
+ result = None
1570
+ elif helper == 'not':
1571
+ # dynamic::not=VALUE - Exclude elements equal to VALUE
1572
+ if isinstance(result, (list, tuple)):
1573
+ result = [item for item in result if item != filter_val]
1574
+ elif isinstance(result, dict):
1575
+ result = {k: v for k, v in result.items() if v != filter_val}
1576
+ elif result != filter_val:
1577
+ pass # Keep result if it doesn't match
1578
+ else:
1579
+ result = None
1580
+ elif helper == 'gt':
1581
+ # dynamic::gt=VALUE - Greater than
1582
+ if isinstance(result, (list, tuple)):
1583
+ result = [item for item in result if item > filter_val]
1584
+ elif result > filter_val:
1585
+ pass
1586
+ else:
1587
+ result = None
1588
+ elif helper == 'lt':
1589
+ # dynamic::lt=VALUE - Less than
1590
+ if isinstance(result, (list, tuple)):
1591
+ result = [item for item in result if item < filter_val]
1592
+ elif result < filter_val:
1593
+ pass
1594
+ else:
1595
+ result = None
1596
+ elif helper == 'gte':
1597
+ # dynamic::gte=VALUE - Greater than or equal
1598
+ if isinstance(result, (list, tuple)):
1599
+ result = [item for item in result if item >= filter_val]
1600
+ elif result >= filter_val:
1601
+ pass
1602
+ else:
1603
+ result = None
1604
+ elif helper == 'lte':
1605
+ # dynamic::lte=VALUE - Less than or equal
1606
+ if isinstance(result, (list, tuple)):
1607
+ result = [item for item in result if item <= filter_val]
1608
+ elif result <= filter_val:
1609
+ pass
1610
+ else:
1611
+ result = None
1612
+ elif helper == 'mod':
1613
+ # dynamic::mod=VALUE - Modulo filter (item % VALUE == 0)
1614
+ if isinstance(result, (list, tuple)):
1615
+ result = [item for item in result if isinstance(item, (int, float)) and item % filter_val == 0]
1616
+ elif isinstance(result, (int, float)) and result % filter_val == 0:
1617
+ pass
1618
+ else:
1619
+ result = None
1620
+ elif helper == 'range':
1621
+ # dynamic::range="min:max" - Filter values in range
1622
+ if isinstance(filter_val, str) and ':' in filter_val:
1623
+ parts = filter_val.split(':')
1624
+ min_val = int(parts[0]) if parts[0] else None
1625
+ max_val = int(parts[1]) if parts[1] else None
1626
+ if isinstance(result, (list, tuple)):
1627
+ def in_range(x):
1628
+ if min_val is not None and x < min_val:
1629
+ return False
1630
+ if max_val is not None and x > max_val:
1631
+ return False
1632
+ return True
1633
+ result = [item for item in result if in_range(item)]
1634
+ elif isinstance(result, (int, float)):
1635
+ if min_val is not None and result < min_val:
1636
+ result = None
1637
+ elif max_val is not None and result > max_val:
1638
+ result = None
1639
+ elif helper == 'even':
1640
+ # dynamic::even - Filter even numbers
1641
+ if isinstance(result, (list, tuple)):
1642
+ result = [item for item in result if isinstance(item, int) and item % 2 == 0]
1643
+ elif isinstance(result, int) and result % 2 == 0:
1644
+ pass
1645
+ else:
1646
+ result = None
1647
+ elif helper == 'odd':
1648
+ # dynamic::odd - Filter odd numbers
1649
+ if isinstance(result, (list, tuple)):
1650
+ result = [item for item in result if isinstance(item, int) and item % 2 != 0]
1651
+ elif isinstance(result, int) and result % 2 != 0:
1652
+ pass
1653
+ else:
1654
+ result = None
1562
1655
  else:
1563
- result = None
1656
+ # dynamic::VarName=VALUE - Match if variable equals value
1657
+ var_name = helper
1658
+ var_value = self.scope.get(var_name)
1659
+ if var_value == filter_val:
1660
+ pass # Keep result
1661
+ else:
1662
+ result = None
1564
1663
 
1565
1664
  # === SQL HELPERS ===
1566
1665
  elif filter_type == 'sql':
@@ -1853,14 +1952,36 @@ class CSSLRuntime:
1853
1952
  final_value = [current_value, source]
1854
1953
  elif mode == 'move':
1855
1954
  final_value = source
1856
- # Clear the source - handle all node types
1955
+ # Remove filtered elements from source (not clear entirely)
1857
1956
  if isinstance(source_node, ASTNode):
1858
- if source_node.type == 'identifier':
1859
- self.scope.set(source_node.value, None)
1860
- elif source_node.type == 'module_ref':
1861
- self._set_module_value(source_node.value, None)
1862
- elif source_node.type == 'member_access':
1863
- self._set_member(source_node, None)
1957
+ if filter_info:
1958
+ # Get original source value
1959
+ original_source = self._evaluate(source_node)
1960
+ if isinstance(original_source, list) and isinstance(final_value, list):
1961
+ # Remove filtered items from original list
1962
+ remaining = [item for item in original_source if item not in final_value]
1963
+ if source_node.type == 'identifier':
1964
+ self.scope.set(source_node.value, remaining)
1965
+ elif source_node.type == 'module_ref':
1966
+ self._set_module_value(source_node.value, remaining)
1967
+ elif source_node.type == 'member_access':
1968
+ self._set_member(source_node, remaining)
1969
+ else:
1970
+ # Single value filter - set source to None
1971
+ if source_node.type == 'identifier':
1972
+ self.scope.set(source_node.value, None)
1973
+ elif source_node.type == 'module_ref':
1974
+ self._set_module_value(source_node.value, None)
1975
+ elif source_node.type == 'member_access':
1976
+ self._set_member(source_node, None)
1977
+ else:
1978
+ # No filter - clear entire source
1979
+ if source_node.type == 'identifier':
1980
+ self.scope.set(source_node.value, None)
1981
+ elif source_node.type == 'module_ref':
1982
+ self._set_module_value(source_node.value, None)
1983
+ elif source_node.type == 'member_access':
1984
+ self._set_member(source_node, None)
1864
1985
  else:
1865
1986
  final_value = source
1866
1987
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: IncludeCPP
3
- Version: 3.7.21
3
+ Version: 3.7.22
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
@@ -1,9 +1,9 @@
1
- includecpp/__init__.py,sha256=hYkRPXgViZO8YrWxqA7IX284xwW81zMDqqjHUgMlOEM,1673
1
+ includecpp/__init__.py,sha256=I8UAmvZc1D4Tu6GT2QK0sNoj4q5i2dhrR0Isyb0tJRA,1673
2
2
  includecpp/__init__.pyi,sha256=uSDYlbqd2TinmrdepmE_zvN25jd3Co2cgyPzXgDpopM,7193
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=AeHirETVkzNqNcqh5RVO0ABPz_6gfuV2EpHcWK9BuDY,349032
6
+ includecpp/cli/commands.py,sha256=HDoRuPEPTzxZQcR4rF45GrRVtcw3zDj6cGiwLCZB44Y,349597
7
7
  includecpp/cli/config_parser.py,sha256=KveeYUg2TA9sC5hKVzYYfgdNm2WfLG5y7_yxgBWn9yM,4886
8
8
  includecpp/core/__init__.py,sha256=L1bT6oikTjdto-6Px7DpjePtM07ymo3Bnov1saZzsGg,390
9
9
  includecpp/core/ai_integration.py,sha256=PW6yFDqdXjfchpfKTKg59AOLhLry9kqJEGf_65BztrY,87603
@@ -25,8 +25,8 @@ includecpp/core/cssl/cssl_builtins.py,sha256=r-FX4WQeKxerkepqodIiwhtL_kxxa4PJym_
25
25
  includecpp/core/cssl/cssl_builtins.pyi,sha256=3ai2V4LyhzPBhAKjRRf0rLVu_bg9ECmTfTkdFKM64iA,127430
26
26
  includecpp/core/cssl/cssl_events.py,sha256=nupIcXW_Vjdud7zCU6hdwkQRQ0MujlPM7Tk2u7eDAiY,21013
27
27
  includecpp/core/cssl/cssl_modules.py,sha256=cUg0-zdymMnWWTsA_BUrW5dx4R04dHpKcUhm-Wfiwwo,103006
28
- includecpp/core/cssl/cssl_parser.py,sha256=SaFgehSB2300s4DtC_v1lmVyaBpg2jIRZcEeEiJ9E_o,115774
29
- includecpp/core/cssl/cssl_runtime.py,sha256=EETUsUOZL7PZ1a9Chz0JeJFP0w68DtSthoqSebigxrw,144834
28
+ includecpp/core/cssl/cssl_parser.py,sha256=G9DxPLcmR7rhQvrxskp4Y8l8nXQy0tymkUVpsWWS6VM,116027
29
+ includecpp/core/cssl/cssl_runtime.py,sha256=1z_TecgGmMjiO5RiI_eQeebToyFKZvdpbFU61b6XRUQ,152125
30
30
  includecpp/core/cssl/cssl_syntax.py,sha256=bgo3NFehoPTQa5dqwNd_CstkVGVCNYAXbGYUcu5BEN0,16982
31
31
  includecpp/core/cssl/cssl_types.py,sha256=gVjtfxk0Uzfj-H7_LD79oqspFMYDf79ZrRrlZk8eAEs,50647
32
32
  includecpp/generator/__init__.py,sha256=Rsy41bwimaEloD3gDRR_znPfIJzIsCFuWZgCTJBLJlc,62
@@ -43,9 +43,9 @@ includecpp/vscode/cssl/images/cssl.png,sha256=BxAGsnfS0ZzzCvqV6Zb1OAJAZpDUoXlR86
43
43
  includecpp/vscode/cssl/images/cssl_pl.png,sha256=z4WMk7g6YCTbUUbSFk343BO6yi_OmNEVYkRenWGydwM,799
44
44
  includecpp/vscode/cssl/snippets/cssl.snippets.json,sha256=l4SCEPR3CsPxA8HIVLKYY__I979TfKzYWtH1KYIsboo,33062
45
45
  includecpp/vscode/cssl/syntaxes/cssl.tmLanguage.json,sha256=XKRLBOHlCqDDnGPvmNHDQPsIMR1UD9PBaJIlgZOiPqM,21173
46
- includecpp-3.7.21.dist-info/licenses/LICENSE,sha256=fWCsGGsiWZir0UzDd20Hh-3wtRyk1zqUntvtVuAWhvc,1093
47
- includecpp-3.7.21.dist-info/METADATA,sha256=3M6Vqu-_8hFmQBEst3XiQFaISZ70aTT2BGahWg-Bmpk,32122
48
- includecpp-3.7.21.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
49
- includecpp-3.7.21.dist-info/entry_points.txt,sha256=6A5Mif9gi0139Bf03W5plAb3wnAgbNaEVe1HJoGE-2o,59
50
- includecpp-3.7.21.dist-info/top_level.txt,sha256=RFUaR1KG-M6mCYwP6w4ydP5Cgc8yNbP78jxGAvyjMa8,11
51
- includecpp-3.7.21.dist-info/RECORD,,
46
+ includecpp-3.7.22.dist-info/licenses/LICENSE,sha256=fWCsGGsiWZir0UzDd20Hh-3wtRyk1zqUntvtVuAWhvc,1093
47
+ includecpp-3.7.22.dist-info/METADATA,sha256=XgO09qXzPsH5vKUtuvQ8ptcv9plaocylViuM4c4V2p0,32122
48
+ includecpp-3.7.22.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
49
+ includecpp-3.7.22.dist-info/entry_points.txt,sha256=6A5Mif9gi0139Bf03W5plAb3wnAgbNaEVe1HJoGE-2o,59
50
+ includecpp-3.7.22.dist-info/top_level.txt,sha256=RFUaR1KG-M6mCYwP6w4ydP5Cgc8yNbP78jxGAvyjMa8,11
51
+ includecpp-3.7.22.dist-info/RECORD,,