dshellInterpreter 1.2.0.4__tar.gz → 1.2.0.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 (52) hide show
  1. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DISCORD_COMMANDS/dshell_file.py +22 -1
  2. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DshellInterpreteur/dshell_interpreter.py +33 -8
  3. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DshellParser/ast_nodes.py +59 -1
  4. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DshellTokenizer/dshell_keywords.py +1 -0
  5. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/full_import.py +1 -1
  6. {dshellinterpreter-1.2.0.4/dshellInterpreter.egg-info → dshellinterpreter-1.2.0.5}/PKG-INFO +1 -1
  7. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5/dshellInterpreter.egg-info}/PKG-INFO +1 -1
  8. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/setup.py +1 -1
  9. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DISCORD_COMMANDS/__init__.py +0 -0
  10. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DISCORD_COMMANDS/dshell_channel.py +0 -0
  11. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DISCORD_COMMANDS/dshell_embed.py +0 -0
  12. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DISCORD_COMMANDS/dshell_interaction.py +0 -0
  13. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DISCORD_COMMANDS/dshell_member.py +0 -0
  14. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DISCORD_COMMANDS/dshell_message.py +0 -0
  15. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DISCORD_COMMANDS/dshell_pastbin.py +0 -0
  16. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DISCORD_COMMANDS/dshell_role.py +0 -0
  17. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DISCORD_COMMANDS/dshell_ui.py +0 -0
  18. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DISCORD_COMMANDS/utils/__init__.py +0 -0
  19. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DISCORD_COMMANDS/utils/utils_embed.py +0 -0
  20. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DISCORD_COMMANDS/utils/utils_file.py +0 -0
  21. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DISCORD_COMMANDS/utils/utils_global.py +0 -0
  22. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DISCORD_COMMANDS/utils/utils_list.py +0 -0
  23. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DISCORD_COMMANDS/utils/utils_member.py +0 -0
  24. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DISCORD_COMMANDS/utils/utils_message.py +0 -0
  25. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DISCORD_COMMANDS/utils/utils_numbers.py +0 -0
  26. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DISCORD_COMMANDS/utils/utils_permissions.py +0 -0
  27. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DISCORD_COMMANDS/utils/utils_string.py +0 -0
  28. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DISCORD_COMMANDS/utils/utils_thread.py +0 -0
  29. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DISCORD_COMMANDS/utils/utils_type_validation.py +0 -0
  30. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DshellInterpreteur/__init__.py +0 -0
  31. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DshellInterpreteur/cached_messages.py +0 -0
  32. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DshellInterpreteur/dshell_arguments.py +0 -0
  33. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DshellInterpreteur/dshell_global_variables.py +0 -0
  34. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DshellInterpreteur/dshell_scope.py +0 -0
  35. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DshellInterpreteur/errors.py +0 -0
  36. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DshellInterpreteur/utils_interpreter.py +0 -0
  37. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DshellParser/__init__.py +0 -0
  38. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DshellParser/dshell_parser.py +0 -0
  39. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DshellPreProcess/__init__.py +0 -0
  40. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DshellPreProcess/dshell_preprocess.py +0 -0
  41. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DshellTokenizer/__init__.py +0 -0
  42. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DshellTokenizer/dshell_token_type.py +0 -0
  43. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/DshellTokenizer/dshell_tokenizer.py +0 -0
  44. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/__init__.py +0 -0
  45. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/Dshell/regex_test.py +0 -0
  46. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/LICENSE +0 -0
  47. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/README.md +0 -0
  48. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/dshellInterpreter.egg-info/SOURCES.txt +0 -0
  49. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/dshellInterpreter.egg-info/dependency_links.txt +0 -0
  50. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/dshellInterpreter.egg-info/requires.txt +0 -0
  51. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/dshellInterpreter.egg-info/top_level.txt +0 -0
  52. {dshellinterpreter-1.2.0.4 → dshellinterpreter-1.2.0.5}/setup.cfg +0 -0
@@ -1,5 +1,6 @@
1
+
1
2
  from ..full_import import Message, Union, PartialMessage, Optional
2
- from ..DshellParser.ast_nodes import ListNode, FileNode, StrNode, BoolNode, IntNode
3
+ from ..DshellParser.ast_nodes import ListNode, FileNode, StrNode, BoolNode, IntNode, FileStreamNode
3
4
 
4
5
  from .utils.utils_message import utils_get_message
5
6
  from .utils.utils_type_validation import (_validate_required_file_node,
@@ -11,6 +12,7 @@ __all__ = [
11
12
  "dshell_get_message_files",
12
13
  "dshell_write_file",
13
14
  "dshell_read_file",
15
+ "dshell_stream_file"
14
16
  ]
15
17
 
16
18
  async def dshell_get_message_files(ctx: Message, message: Union[StrNode, IntNode]) -> ListNode:
@@ -50,6 +52,25 @@ async def dshell_read_file(ctx: Message, file: FileNode) -> StrNode:
50
52
 
51
53
  return StrNode(file.read())
52
54
 
55
+ async def dshell_stream_file(ctx: Message, file: FileNode, separator: Optional[StrNode] = None) -> FileStreamNode:
56
+ """
57
+ Stream le contenue d'un fichier. Si un séparateur est passé en paramètre,
58
+ le stream s'arrêtera à chaque fois que le séparateur est rencontré, sinon il streamera ligne par ligne
59
+ (MAX_STR_SIZE de la str max renvoyé)
60
+ :param ctx:
61
+ :param file:
62
+ :param separator:
63
+ :return:
64
+ """
65
+
66
+ _validate_optional_string(separator, 'separator', 'sf')
67
+
68
+ if separator is not None and len(separator) > 1:
69
+ raise Exception(f"Separator in stream file must be a single character, not '{separator}' !")
70
+
71
+ return file.stream(separator)
72
+
73
+
53
74
  async def dshell_write_file(ctx: Message,
54
75
  message: StrNode,
55
76
  append: BoolNode = BoolNode(False),
@@ -3,7 +3,7 @@ from ..DshellTokenizer.dshell_token_type import DshellTokenType as DTT
3
3
  from ..DshellInterpreteur.errors import DshellInterpreterStopExecution
4
4
  from Dshell.full_import import TypeVar, Union, Optional, Any, Callable, sleep, findall
5
5
  from ..DshellParser.ast_nodes import *
6
- from Dshell.full_import import AutoShardedBot, Interaction, Message, PrivateChannel, Embed
6
+ from Dshell.full_import import AutoShardedBot, Interaction, Message, PrivateChannel
7
7
  from ..DshellParser.dshell_parser import parse, print_ast
8
8
  from ..DshellTokenizer.dshell_tokenizer import DshellTokenizer
9
9
  from .cached_messages import dshell_cached_messages
@@ -150,6 +150,7 @@ class DshellInterpreteur:
150
150
  self.env.set(node.variable.name.value, i)
151
151
  await self.execute(node.body)
152
152
 
153
+
153
154
  async def _execute_var_node(self, node: VarNode):
154
155
  """Execute a variable assignment node."""
155
156
  first_node = node.body[0]
@@ -353,19 +354,43 @@ class DshellIterator:
353
354
  """
354
355
 
355
356
  def __init__(self, data):
356
- self.data = data if isinstance(data, (StrNode, list, ListNode)) else range(int(data))
357
+ self.data = self._check_data(data)
357
358
  self.current = 0
358
359
 
359
360
  def __iter__(self):
360
361
  return self
361
362
 
362
363
  def __next__(self):
363
- if self.current >= len(self.data):
364
- self.current = 0
365
- raise StopIteration
364
+ return next(self.data)
365
+
366
+ def _check_data(self, data: Any):
367
+
368
+ if not isinstance(data, (StrNode, ListNode, FloatNode, IntNode, FileNode, FileStreamNode)):
369
+ raise Exception(f"{data} can't be in a loop !")
370
+
371
+ if isinstance(data, FileNode):
372
+ return data.stream()
373
+
374
+ elif isinstance(data, (FloatNode, IntNode)):
375
+ return IntIterator(IntNode(data))
366
376
 
367
- value = self.data[self.current]
368
- self.current += 1
369
- return value
377
+ else:
378
+ return data
379
+
380
+ class IntIterator:
381
+
382
+ def __init__(self, max_iterator: IntNode):
383
+ self.max_iterator = max_iterator
384
+ self.pointer = IntNode(0)
370
385
 
386
+ def __iter__(self) -> "IntIterator":
387
+ return self
388
+
389
+ def __next__(self) -> IntNode:
390
+ if self.pointer >= self.max_iterator:
391
+ self.pointer = IntNode(0)
392
+ raise StopIteration
371
393
 
394
+ current = self.pointer
395
+ self.pointer += 1
396
+ return current
@@ -36,7 +36,8 @@ __all__ = [
36
36
  'UiSelectNode',
37
37
  'OptionUiSelectNode',
38
38
  'ScanNode',
39
- 'FileNode'
39
+ 'FileNode',
40
+ 'FileStreamNode'
40
41
  ]
41
42
 
42
43
 
@@ -54,8 +55,17 @@ class ASTNode:
54
55
  class StrNode(str, ASTNode):
55
56
 
56
57
  def __new__(cls, value: Any):
58
+ cls.pointer = 0
57
59
  return super().__new__(cls, value)
58
60
 
61
+ def __next__(self):
62
+ if self.pointer >= len(self):
63
+ raise StopIteration
64
+
65
+ current = self[self.pointer]
66
+ self.pointer += 1
67
+ return current
68
+
59
69
  def __len__(self):
60
70
  return IntNode(super().__len__())
61
71
 
@@ -802,6 +812,10 @@ class FileNode(ASTNode):
802
812
  def read(self):
803
813
  return self.content.decode(encoding="utf-8", errors="ignore")
804
814
 
815
+ def stream(self, separator: Optional[StrNode] = None):
816
+ return FileStreamNode(self, separator)
817
+
818
+
805
819
  def size(self):
806
820
  return len(self.read())
807
821
 
@@ -811,6 +825,50 @@ class FileNode(ASTNode):
811
825
  def __sizeof__(self):
812
826
  return self.size()+getsizeof(FileNode)
813
827
 
828
+ class FileStreamNode(ASTNode):
829
+
830
+ def __init__(self, file: FileNode, separator: Optional[StrNode] = None):
831
+ super().__init__(-1)
832
+ self.file: FileNode = file
833
+ self.content: str = file.read()
834
+ self.separator: Optional[StrNode] = separator
835
+ self.pointer: int = 0
836
+
837
+ def __iter__(self):
838
+ return self
839
+
840
+ def __next__(self):
841
+
842
+ if self.pointer >= len(self.content):
843
+ self.pointer = 0
844
+ raise StopIteration()
845
+
846
+ buffer = ""
847
+
848
+ if self.separator is None:
849
+
850
+ while self.pointer < len(self.content) and self.content[self.pointer] != "\n":
851
+ if len(buffer.encode('utf-8', errors="ignore")) + len(
852
+ self.content[self.pointer].encode('utf-8', errors="ignore")) > MAX_STR_SIZE:
853
+ return StrNode(buffer)
854
+
855
+ buffer += self.content[self.pointer]
856
+ self.pointer += 1
857
+
858
+ self.pointer += 1 # Skip the newline character
859
+ return StrNode(buffer)
860
+
861
+ while self.pointer < len(self.content) and self.content[self.pointer] != self.separator:
862
+ if len(buffer.encode('utf-8', errors="ignore")) + len(
863
+ self.content[self.pointer].encode('utf-8', errors="ignore")) > MAX_STR_SIZE:
864
+ return StrNode(buffer)
865
+
866
+ buffer += self.content[self.pointer]
867
+ self.pointer += 1
868
+ self.pointer += 1 # Skip the newline character
869
+ return StrNode(buffer)
870
+
871
+
814
872
  class ListNode(ASTNode):
815
873
  """
816
874
  Node representing a list structure in the AST.
@@ -85,6 +85,7 @@ dshell_commands: dict[str, Callable] = {
85
85
 
86
86
  ## Files
87
87
  "rf": dshell_read_file,
88
+ "sf": dshell_stream_file,
88
89
  "wf": dshell_write_file,
89
90
  "gmfs": dshell_get_message_files,
90
91
 
@@ -1,5 +1,5 @@
1
1
  from asyncio import sleep
2
- from typing import TypeVar, Optional, Callable, Union, Any, TYPE_CHECKING
2
+ from typing import *
3
3
  from copy import deepcopy
4
4
  from pycordViews import EasyModifiedViews, SelectMenu
5
5
  from pycordViews.views.errors import CustomIDNotFound
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dshellInterpreter
3
- Version: 1.2.0.4
3
+ Version: 1.2.0.5
4
4
  Summary: A Discord bot interpreter for creating custom commands and automations.
5
5
  Home-page: https://github.com/BOXERRMD/Dshell_Interpreter
6
6
  Author: Chronos
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dshellInterpreter
3
- Version: 1.2.0.4
3
+ Version: 1.2.0.5
4
4
  Summary: A Discord bot interpreter for creating custom commands and automations.
5
5
  Home-page: https://github.com/BOXERRMD/Dshell_Interpreter
6
6
  Author: Chronos
@@ -5,7 +5,7 @@ with open("README.md", "r") as fh:
5
5
 
6
6
  setup(
7
7
  name="dshellInterpreter",
8
- version="1.2.0.4",
8
+ version="1.2.0.5",
9
9
  author="Chronos",
10
10
  author_email="vagabonwalybi@gmail.com",
11
11
  description="A Discord bot interpreter for creating custom commands and automations.",