dshellInterpreter 0.2.15.4__py3-none-any.whl → 0.2.16.1__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.

Potentially problematic release.


This version of dshellInterpreter might be problematic. Click here for more details.

@@ -1,8 +1,59 @@
1
1
  __all__ = [
2
2
  "utils_len",
3
+ "utils_get_name",
4
+ "utils_get_id",
5
+ "utils_get_roles",
3
6
  ]
4
7
 
5
- async def utils_len(ctx, value):
8
+ from discord import Message, Role, TextChannel, VoiceChannel, CategoryChannel, ForumChannel, Thread, Member, Guild
9
+ from discord.utils import get
10
+ from typing import Union
11
+ from enum import StrEnum
12
+
13
+
14
+ class DiscordType(StrEnum):
15
+ MEMBER = "member"
16
+ ROLE = "role"
17
+ TEXT_CHANNEL = "text_channel"
18
+ VOICE_CHANNEL = "voice_channel"
19
+ CATEGORY_CHANNEL = "category_channel"
20
+ FORUM_CHANNEL = "forum_channel"
21
+ THREAD = "thread"
22
+ UNKNOWN = "unknown"
23
+
24
+ def utils_what_discord_type_is(ctx: Union[Message, Guild], value: int) -> tuple[str, Union[Member, Role, TextChannel, VoiceChannel, CategoryChannel, ForumChannel, Thread, None]]:
25
+ """
26
+ Return an enum of what the value is (str, int, list, Member, Role, Channel, etc.)
27
+ :param ctx:
28
+ :param value:
29
+ :return:
30
+ """
31
+ guild = ctx if isinstance(ctx, Guild) else ctx.guild
32
+
33
+ if member := guild.get_member(value):
34
+ return DiscordType.MEMBER, member
35
+
36
+ elif role := guild.get_role(value):
37
+ return DiscordType.ROLE, role
38
+
39
+ elif (channel := guild.get_channel(value)) and isinstance(channel, TextChannel):
40
+ return DiscordType.TEXT_CHANNEL, channel
41
+
42
+ elif (channel := guild.get_channel(value)) and isinstance(channel, VoiceChannel):
43
+ return DiscordType.VOICE_CHANNEL, channel
44
+
45
+ elif (channel := guild.get_channel(value)) and isinstance(channel, CategoryChannel):
46
+ return DiscordType.CATEGORY_CHANNEL, channel
47
+
48
+ elif (channel := guild.get_channel(value)) and isinstance(channel, ForumChannel):
49
+ return DiscordType.FORUM_CHANNEL, channel
50
+
51
+ elif (channel := guild.get_channel(value)) and isinstance(channel, Thread):
52
+ return DiscordType.THREAD, channel
53
+ else:
54
+ return DiscordType.UNKNOWN, None
55
+
56
+ async def utils_len(ctx: Message, value):
6
57
  """
7
58
  Return the length of a list, or a string
8
59
  :param value:
@@ -12,4 +63,77 @@ async def utils_len(ctx, value):
12
63
  if not isinstance(value, (str, ListNode)):
13
64
  raise TypeError(f"value must be a list or a string in len command, not {type(value)}")
14
65
 
15
- return len(value)
66
+ return len(value)
67
+
68
+ async def utils_get_name(ctx : Message, value: int) -> Union[str, None]:
69
+ """
70
+ Return the name of a role, member, or channel.
71
+ If not found, return None.
72
+ :param value:
73
+ :return:
74
+ """
75
+
76
+ if not isinstance(value, int):
77
+ raise TypeError(f"value must be an int in name command, not {type(value)}")
78
+
79
+ guild = ctx.guild
80
+ result = None
81
+
82
+ if role := guild.get_role(value):
83
+ result = role.name
84
+
85
+ elif member := guild.get_member(value):
86
+ result = member.name
87
+
88
+ if channel := guild.get_channel(value) :
89
+ result = channel.name
90
+
91
+ return result
92
+
93
+ async def utils_get_id(ctx : Message, value: str) -> Union[int, None]:
94
+ """
95
+ Return the id of a role, member, or channel.
96
+ If not found, return None.
97
+ :param value:
98
+ :return:
99
+ """
100
+
101
+ if not isinstance(value, str):
102
+ raise TypeError(f"value must be a str in id command, not {type(value)}")
103
+
104
+ guild = ctx.guild
105
+ result = None
106
+
107
+ if role := get(guild.roles, name=value):
108
+ result = role.id
109
+
110
+ elif member := get(guild.members, name=value):
111
+ result = member.id
112
+
113
+ if channel := get(guild.channels, name=value) :
114
+ result = channel.id
115
+
116
+ return result
117
+
118
+ async def utils_get_roles(ctx: Message, value: int):
119
+ """
120
+ Return the roles of a member.
121
+ :param value:
122
+ :return:
123
+ """
124
+
125
+ if not isinstance(value, int):
126
+ raise TypeError(f"value must be an int in roles command, not {type(value)}")
127
+
128
+ guild = ctx.guild
129
+
130
+ what_is = utils_what_discord_type_is(ctx, value)
131
+
132
+ if what_is == DiscordType.UNKNOWN:
133
+ raise ValueError(f"{value} member not found in guild {guild.name}")
134
+
135
+ if what_is != DiscordType.MEMBER:
136
+ raise TypeError(f"value must be a member id in roles command, not {what_is}")
137
+
138
+ from ..._DshellParser.ast_nodes import ListNode
139
+ return ListNode([i.id for i in guild.get_member(value).roles])
@@ -4,7 +4,8 @@ __all__ = [
4
4
  "utils_list_clear",
5
5
  "utils_list_pop",
6
6
  "utils_list_sort",
7
- "utils_list_reverse"
7
+ "utils_list_reverse",
8
+ "utils_list_get_value",
8
9
  ]
9
10
 
10
11
  async def utils_list_add(ctx, value: "ListNode", *elements):
@@ -19,22 +20,25 @@ async def utils_list_add(ctx, value: "ListNode", *elements):
19
20
  raise TypeError("value must be a list in add command")
20
21
 
21
22
  for elem in elements:
22
- value.add(elem)
23
+ if isinstance(elem, ListNode):
24
+ value.extend(elem)
25
+ else:
26
+ value.add(elem)
23
27
  return value
24
28
 
25
- async def utils_list_remove(ctx, value: "ListNode", *elements):
29
+ async def utils_list_remove(ctx, value: "ListNode", element, count: int = 1):
26
30
  """
27
31
  Remove an element from a list
28
32
  :param value:
29
- :param elements:
33
+ :param element:
34
+ :param count:
30
35
  :return:
31
36
  """
32
37
  from ..._DshellParser.ast_nodes import ListNode
33
38
  if not isinstance(value, ListNode):
34
39
  raise TypeError("value must be a list in remove command")
35
40
 
36
- for elem in elements:
37
- value.remove(elem)
41
+ value.remove(element, count)
38
42
  return value
39
43
 
40
44
  async def utils_list_clear(ctx, value: "ListNode"):
@@ -89,3 +93,17 @@ async def utils_list_reverse(ctx, value: "ListNode"):
89
93
  raise TypeError("value must be a list in reverse command")
90
94
  value.reverse()
91
95
  return value
96
+
97
+ async def utils_list_get_value(ctx, value: "ListNode", index: int = 0):
98
+ """
99
+ Get a value from a list
100
+ :param value:
101
+ :param index:
102
+ :return:
103
+ """
104
+ from ..._DshellParser.ast_nodes import ListNode
105
+ if not isinstance(value, ListNode):
106
+ raise TypeError("value must be a list in get command")
107
+ if not isinstance(index, int):
108
+ raise TypeError("index must be an integer in get command")
109
+ return value[index]
@@ -0,0 +1,27 @@
1
+ __all__ = [
2
+ "utils_has_permissions",
3
+ ]
4
+ from discord import Message, PermissionOverwrite
5
+
6
+ from .utils_global import utils_what_discord_type_is, DiscordType
7
+
8
+ async def utils_has_permissions(ctx: Message, member: int, permission: PermissionOverwrite) -> bool:
9
+ """
10
+ Return True if the member has the specified permissions.
11
+ :param member:
12
+ :param permission:
13
+ :return:
14
+ """
15
+
16
+ if not isinstance(member, int):
17
+ raise TypeError(f"member must be an int in has_perms command, not {type(member)}")
18
+
19
+ if not isinstance(permission, PermissionOverwrite):
20
+ raise TypeError(f"permissions must be a permission bloc in has_perms command, not {type(permission)}")
21
+
22
+ discord_type, member = utils_what_discord_type_is(ctx, member)
23
+
24
+ if discord_type != DiscordType.MEMBER:
25
+ raise ValueError(f"No member found with ID {member} in has_perms command.")
26
+
27
+ return (member.guild_permissions & permission.pair()[0]) == permission.pair()[0]
@@ -0,0 +1,77 @@
1
+ from typing import Union, TYPE_CHECKING
2
+ from discord import Guild, Member, Role, Permissions, PermissionOverwrite
3
+
4
+ from ..._DshellParser.ast_nodes import ListNode
5
+ from .utils_global import utils_what_discord_type_is, DiscordType
6
+
7
+ class DshellPermissions:
8
+
9
+ def __init__(self, target: dict[str, list[int]]):
10
+ """
11
+ Creates a Dshell permissions object.
12
+ :param target: A dictionary containing parameters and their values.
13
+ Expected parameters: “allow”, “deny”, ‘members’, “roles”.
14
+ For “members” and “roles”, values must be ID ListNodes.
15
+ """
16
+ self.target: dict[str, Union[ListNode, int]] = target
17
+
18
+ @staticmethod
19
+ def get_member(guild, member_id: int) -> Member:
20
+ """
21
+ Return a Member object from a member ID.
22
+ :param member_id:
23
+ :return:
24
+ """
25
+ discord_type, instance = utils_what_discord_type_is(guild, member_id)
26
+ if discord_type == DiscordType.MEMBER:
27
+ return instance
28
+ raise ValueError(f"No member found with ID {member_id} in perm command.")
29
+
30
+ @staticmethod
31
+ def get_role(guild, role_id: int) -> Role:
32
+ """
33
+ Return a Role object from a role ID.
34
+ :param role_id:
35
+ :return:
36
+ """
37
+ discord_type, instance = utils_what_discord_type_is(guild, role_id)
38
+ if discord_type == DiscordType.ROLE:
39
+ return instance
40
+ raise ValueError(f"No role found with ID {role_id} in perm command.")
41
+
42
+ def get_permission_overwrite(self, guild: Guild) -> dict[Union[Member, Role], PermissionOverwrite]:
43
+ """
44
+ Returns a PermissionOverwrite object with member and role permissions.
45
+ If no members or roles are specified, it returns a PermissionOverwrite with None key.
46
+ :param guild: The Discord server
47
+ :return: A dictionary of PermissionOverwrite objects with members and roles as keys
48
+ """
49
+ permissions: dict[Union[Member, Role, None], PermissionOverwrite] = {}
50
+ target_keys = self.target.keys()
51
+
52
+ if 'members' in target_keys:
53
+ for member_id in (
54
+ self.target['members'] if isinstance(self.target['members'], ListNode) else [
55
+ self.target['members']]): # allow a single ID
56
+ member = self.get_member(guild, member_id)
57
+ permissions[member] = PermissionOverwrite.from_pair(
58
+ allow=Permissions(permissions=self.target.get('allow', 0)),
59
+ deny=Permissions(permissions=self.target.get('deny', 0))
60
+ )
61
+
62
+ elif 'roles' in target_keys:
63
+ for role_id in (
64
+ self.target['roles'] if isinstance(self.target['roles'], ListNode) else [
65
+ self.target['roles']]): # allow a single ID
66
+ role = self.get_role(guild, role_id)
67
+ permissions[role] = PermissionOverwrite.from_pair(
68
+ allow=Permissions(permissions=self.target.get('allow', 0)),
69
+ deny=Permissions(permissions=self.target.get('deny', 0))
70
+ )
71
+ else:
72
+ permissions[None] = PermissionOverwrite.from_pair(
73
+ allow=Permissions(permissions=self.target.get('allow', 0)),
74
+ deny=Permissions(permissions=self.target.get('deny', 0))
75
+ )
76
+
77
+ return permissions
@@ -10,6 +10,7 @@ from discord.ui import Button
10
10
  from discord.abc import PrivateChannel
11
11
 
12
12
  from .._DshellParser.ast_nodes import *
13
+ from ..DISCORD_COMMANDS.utils.utils_permissions import DshellPermissions
13
14
  from .._DshellParser.dshell_parser import parse
14
15
  from .._DshellParser.dshell_parser import to_postfix, print_ast
15
16
  from .._DshellTokenizer.dshell_keywords import *
@@ -72,6 +73,11 @@ class DshellInterpreteur:
72
73
  '__guild_emojis__': ListNode([emoji.id for emoji in message.channel.guild.emojis]),
73
74
  '__guild_emojis_count__': len(message.channel.guild.emojis),
74
75
  '__guild_channels__': ListNode([channel.id for channel in message.channel.guild.channels]),
76
+ '__guild_text_channels__': ListNode([channel.id for channel in message.channel.guild.text_channels]),
77
+ '__guild_voice_channels__': ListNode([channel.id for channel in message.channel.guild.voice_channels]),
78
+ '__guild_categories__': ListNode([channel.id for channel in message.channel.guild.categories]),
79
+ '__guild_stage_channels__': ListNode([channel.id for channel in message.channel.guild.stage_channels]),
80
+ '__guild_forum_channels__': ListNode([channel.id for channel in message.channel.guild.forum_channels]),
75
81
  '__guild_channels_count__': len(message.channel.guild.channels),
76
82
 
77
83
  } if message is not None and not debug else {} # {} is used in debug mode, when ctx is None
@@ -102,7 +108,9 @@ class DshellInterpreteur:
102
108
  await self.execute(node.body)
103
109
 
104
110
  if isinstance(node, CommandNode):
105
- self.env['__ret__'] = await call_function(dshell_commands[node.name], node.body, self)
111
+ result = await call_function(dshell_commands[node.name], node.body, self)
112
+ self.env[f'__{node.name}__'] = result # return value of the command
113
+ self.env['__ret__'] = result # global return variable for all commands
106
114
 
107
115
  elif isinstance(node, ParamNode):
108
116
  params = get_params(node, self)
@@ -627,105 +635,3 @@ class DshellIterator:
627
635
  return value
628
636
 
629
637
 
630
- class DshellPermissions:
631
-
632
- def __init__(self, target: dict[str, list[int]]):
633
- """
634
- Creates a Dshell permissions object.
635
- :param target: A dictionary containing parameters and their values.
636
- Expected parameters: “allow”, “deny”, ‘members’, “roles”.
637
- For “members” and “roles”, values must be ID ListNodes.
638
- """
639
- self.target: dict[str, Union[ListNode, int]] = target
640
-
641
- @staticmethod
642
- def get_instance(guild: Guild, target_id: int) -> Union[Member, Role]:
643
- """
644
- Returns the instance corresponding to the given id. Only a Member or Role.
645
- :param guild: The Discord server in which to search
646
- :param target_id: The ID of the member or role
647
- :return: An instance of Member or Role
648
- """
649
- try:
650
- member = DshellPermissions.get_member(guild, target_id)
651
- except ValueError:
652
- member = None
653
-
654
- try:
655
- role = DshellPermissions.get_role(guild, target_id)
656
- except ValueError:
657
- role = None
658
-
659
- if member is not None:
660
- return member
661
-
662
- elif role is not None:
663
- return role
664
-
665
- else:
666
- raise ValueError(f"No member or role found with ID {target_id} in guild {guild.name}.")
667
-
668
- @staticmethod
669
- def get_member(guild: Guild, target_id: int) -> Member:
670
- """
671
- Returns the Member instance corresponding to the given id.
672
- :param guild: The Discord server to search
673
- :param target_id: The member ID
674
- :return: A Member instance
675
- """
676
- member = guild.get_member(target_id)
677
- if member is not None:
678
- return member
679
-
680
- raise ValueError(f"No member found with ID {target_id} in guild {guild.name}.")
681
-
682
- @staticmethod
683
- def get_role(guild: Guild, target_id: int) -> Role:
684
- """
685
- Returns the Role instance corresponding to the given id.
686
- :param guild: The Discord server to search
687
- :param target_id: The role ID
688
- :return: A Role instance
689
- """
690
- role = guild.get_role(target_id)
691
- if role is not None:
692
- return role
693
-
694
- raise ValueError(f"No role found with ID {target_id} in guild {guild.name}.")
695
-
696
- def get_permission_overwrite(self, guild: Guild) -> dict[Union[Member, Role], PermissionOverwrite]:
697
- """
698
- Returns a PermissionOverwrite object with member and role permissions.
699
- If no members or roles are specified, it returns a PermissionOverwrite with None key.
700
- :param guild: The Discord server
701
- :return: A dictionary of PermissionOverwrite objects with members and roles as keys
702
- """
703
- permissions: dict[Union[Member, Role, None], PermissionOverwrite] = {}
704
- target_keys = self.target.keys()
705
-
706
- if 'members' in target_keys:
707
- for member_id in (
708
- self.target['members'] if isinstance(self.target['members'], ListNode) else [
709
- self.target['members']]): # allow a single ID
710
- member = self.get_member(guild, member_id)
711
- permissions[member] = PermissionOverwrite.from_pair(
712
- allow=Permissions(permissions=self.target.get('allow', 0)),
713
- deny=Permissions(permissions=self.target.get('deny', 0))
714
- )
715
-
716
- elif 'roles' in target_keys:
717
- for role_id in (
718
- self.target['roles'] if isinstance(self.target['roles'], ListNode) else [
719
- self.target['roles']]): # allow a single ID
720
- role = self.get_role(guild, role_id)
721
- permissions[role] = PermissionOverwrite.from_pair(
722
- allow=Permissions(permissions=self.target.get('allow', 0)),
723
- deny=Permissions(permissions=self.target.get('deny', 0))
724
- )
725
- else:
726
- permissions[None] = PermissionOverwrite.from_pair(
727
- allow=Permissions(permissions=self.target.get('allow', 0)),
728
- deny=Permissions(permissions=self.target.get('deny', 0))
729
- )
730
-
731
- return permissions
@@ -602,6 +602,14 @@ class ListNode(ASTNode):
602
602
  """
603
603
  self.iterable.reverse()
604
604
 
605
+ def extend(self, values: "ListNode"):
606
+ """
607
+ Extend the list with another list.
608
+ :param values: List of values to extend the list with.
609
+ """
610
+ for v in values:
611
+ self.add(v)
612
+
605
613
  def __add__(self, other: "ListNode"):
606
614
  """
607
615
  Add another ListNode to this one.
@@ -10,7 +10,6 @@ __all__ = [
10
10
 
11
11
  from typing import Callable
12
12
 
13
- from ..DISCORD_COMMANDS import utils_len, utils_list_add
14
13
  from ..DISCORD_COMMANDS.dshell_channel import *
15
14
  from ..DISCORD_COMMANDS.dshell_member import *
16
15
  from ..DISCORD_COMMANDS.dshell_message import *
@@ -19,6 +18,7 @@ from ..DISCORD_COMMANDS.dshell_role import *
19
18
  from ..DISCORD_COMMANDS.dshell_interaction import *
20
19
  from ..DISCORD_COMMANDS.utils.utils_global import *
21
20
  from ..DISCORD_COMMANDS.utils.utils_list import *
21
+ from ..DISCORD_COMMANDS.utils.utils_member import *
22
22
 
23
23
  dshell_keyword: set[str] = {
24
24
  'if', 'else', 'elif', 'loop', '#end', 'var', '#loop', '#if', 'sleep', 'param', '#param'
@@ -29,6 +29,7 @@ dshell_discord_keyword: set[str] = {
29
29
  }
30
30
  dshell_commands: dict[str, Callable] = {
31
31
 
32
+ ## List utils
32
33
  'length': utils_len,
33
34
  'len': utils_len,
34
35
  'add': utils_list_add,
@@ -37,9 +38,20 @@ dshell_commands: dict[str, Callable] = {
37
38
  'pop': utils_list_pop,
38
39
  'sort': utils_list_sort,
39
40
  'reverse': utils_list_reverse,
41
+ 'get': utils_list_get_value,
40
42
 
43
+ ## Discord utils
44
+ 'name': utils_get_name, # get the name from id (channel, role, member)
45
+ 'id': utils_get_id, # get the id from name (channel, role, member)
46
+ 'roles': utils_get_roles, # get all roles of a member
47
+
48
+ ## Member utils
49
+ 'has_perms': utils_has_permissions, # check if a member has the specified permissions
50
+
51
+ ## Pastbin command
41
52
  "gp": dshell_get_pastbin, # get pastbin
42
53
 
54
+ ## Discord commands
43
55
  "sm": dshell_send_message, # send message
44
56
  "spm": dshell_send_private_message, # send private message
45
57
  "srm": dshell_respond_message, # respond to a message
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dshellInterpreter
3
- Version: 0.2.15.4
3
+ Version: 0.2.16.1
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
@@ -8,21 +8,23 @@ Dshell/DISCORD_COMMANDS/dshell_message.py,sha256=zcWl6Y1W31h9MTHS-j9tLDwcrRiE_wG
8
8
  Dshell/DISCORD_COMMANDS/dshell_pastbin.py,sha256=H0tUJOwdzYBXvxqipK3mzoNZUKrSLcVm4EZlWbBRScs,796
9
9
  Dshell/DISCORD_COMMANDS/dshell_role.py,sha256=t_yRZRD0FKE2gT4dIDIsHz2PSZZztDVEkkqkG_OkNh4,5002
10
10
  Dshell/DISCORD_COMMANDS/utils/__init__.py,sha256=-amNcYysjgx3YDpDSnbQmJhnm3lbJere9K9aDH-YnJg,115
11
- Dshell/DISCORD_COMMANDS/utils/utils_global.py,sha256=JDueE5jCIosUziWNuzzW7iw6_RjgGfHEszJXKgU6FR8,387
12
- Dshell/DISCORD_COMMANDS/utils/utils_list.py,sha256=kJ1vgqdAKef-siAUvGwvKgD2ezMJpnFUP2UQ3v6-ARw,2569
11
+ Dshell/DISCORD_COMMANDS/utils/utils_global.py,sha256=TRqKx8FBEJ4cAFfscN-ohx3ySq9tuGI16UAAnZgB5qw,4222
12
+ Dshell/DISCORD_COMMANDS/utils/utils_list.py,sha256=zqImMWvD-1UnbPP1TZewnvZpq7qs1sOTT1YhbJ5I8h8,3160
13
+ Dshell/DISCORD_COMMANDS/utils/utils_member.py,sha256=PbZk4Rzz87mktvJPTIvR2f0sXdMylzUWWM6vGEx2efk,998
13
14
  Dshell/DISCORD_COMMANDS/utils/utils_message.py,sha256=cQvJ15f49ddOjybARwkJKNFe3ITYQciF-pZHERFPkr0,2964
15
+ Dshell/DISCORD_COMMANDS/utils/utils_permissions.py,sha256=N1Ttn-n1qG87AuOuz5Dlw-mEk8io5ogxxbhiuGmBtgA,3461
14
16
  Dshell/DISCORD_COMMANDS/utils/utils_thread.py,sha256=tVl4msEwrWHY-0AytI6eY3JSs-eIFUigDSJfK9mT1ww,1457
15
17
  Dshell/_DshellInterpreteur/__init__.py,sha256=xy5-J-R3YmY99JF3NBHTRRLsComFxpjnCA5xacISctU,35
16
- Dshell/_DshellInterpreteur/dshell_interpreter.py,sha256=OGn6HHPrlVWVI9z7s90edBqrv3Fv410A0rPYW8JP-Hs,32096
18
+ Dshell/_DshellInterpreteur/dshell_interpreter.py,sha256=Us9eLIUbaKC5rRkPRjGWHlX9ZEFNYeOnwEW_w7LwPhI,28665
17
19
  Dshell/_DshellParser/__init__.py,sha256=ONDfhZMvClqP_6tE8SLjp-cf3pXL-auQYnfYRrHZxC4,56
18
- Dshell/_DshellParser/ast_nodes.py,sha256=m6a4bMFVb0grMCyghWMeb4xABxdlWxFBbycnR388dg0,18518
20
+ Dshell/_DshellParser/ast_nodes.py,sha256=S2byqd02RMC-ILCX-ZS8zhwOBIBtvMtQ4ESnljjsWmA,18748
19
21
  Dshell/_DshellParser/dshell_parser.py,sha256=KD2ZbKYa1nnvroKmN8fIRD2exXre54Qx_roEBrTV7Mo,18588
20
22
  Dshell/_DshellTokenizer/__init__.py,sha256=LIQSRhDx2B9pmPx5ADMwwD0Xr9ybneVLhHH8qrJWw_s,172
21
- Dshell/_DshellTokenizer/dshell_keywords.py,sha256=4QvBXvuXJPjKWyhVqAPBYCqE95G7dG8waXD3XtmuoBw,6345
23
+ Dshell/_DshellTokenizer/dshell_keywords.py,sha256=crzX16IbcYCVqxgzz3NvN0-FzKtBjZcZQvtHqdxhDGk,6787
22
24
  Dshell/_DshellTokenizer/dshell_token_type.py,sha256=gYIb2XN2YcgeRgmar_rBDS5CGmwfmxihu8mOW_d6lbE,1533
23
25
  Dshell/_DshellTokenizer/dshell_tokenizer.py,sha256=AJnUocD6hbU6wvjRAN5uDha5QQieTwXlHzZVtgRGaZQ,7307
24
- dshellinterpreter-0.2.15.4.dist-info/licenses/LICENSE,sha256=lNgcw1_xb7QENAQi3uHGymaFtbs0RV-ihiCd7AoLQjA,1082
25
- dshellinterpreter-0.2.15.4.dist-info/METADATA,sha256=FkIk1dGusH1JtAgBPDrT3FSPIDu3frzRXveXsjaWcC8,1151
26
- dshellinterpreter-0.2.15.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
27
- dshellinterpreter-0.2.15.4.dist-info/top_level.txt,sha256=B4CMhtmchGwPQJLuqUy0GhRG-0cUGxKL4GqEbCiB_vE,7
28
- dshellinterpreter-0.2.15.4.dist-info/RECORD,,
26
+ dshellinterpreter-0.2.16.1.dist-info/licenses/LICENSE,sha256=lNgcw1_xb7QENAQi3uHGymaFtbs0RV-ihiCd7AoLQjA,1082
27
+ dshellinterpreter-0.2.16.1.dist-info/METADATA,sha256=0YtsSJdMbvebXArTm2kTLsPOH1UrGPp-x-0gjhWCHKU,1151
28
+ dshellinterpreter-0.2.16.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
29
+ dshellinterpreter-0.2.16.1.dist-info/top_level.txt,sha256=B4CMhtmchGwPQJLuqUy0GhRG-0cUGxKL4GqEbCiB_vE,7
30
+ dshellinterpreter-0.2.16.1.dist-info/RECORD,,