dfpyre 0.7.2__py3-none-any.whl → 0.7.3__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 dfpyre might be problematic. Click here for more details.

dfpyre/scriptgen.py CHANGED
@@ -1,152 +1,152 @@
1
- import dataclasses
2
- import re
3
- from dfpyre.items import *
4
- from dfpyre.actiondump import get_default_tags
5
-
6
- SCRIPT_START = '''from dfpyre import *
7
- t = DFTemplate()
8
- '''
9
-
10
- TEMPLATE_METHOD_LOOKUP = {
11
- 'event': 'player_event',
12
- 'entity_event': 'entity_event',
13
- 'func': 'function',
14
- 'process': 'process',
15
- 'call_func': 'call_function',
16
- 'start_process': 'start_process',
17
- 'player_action': 'player_action',
18
- 'game_action': 'game_action',
19
- 'entity_action': 'entity_action',
20
- 'if_player': 'if_player',
21
- 'if_var': 'if_variable',
22
- 'if_game': 'if_game',
23
- 'if_entity': 'if_entity',
24
- 'else': 'else_',
25
- 'repeat': 'repeat',
26
- 'control': 'control',
27
- 'select_obj': 'select_object',
28
- 'set_var': 'set_variable'
29
- }
30
-
31
- TARGET_CODEBLOCKS = {'player_action', 'entity_action', 'if_player', 'if_entity'}
32
- VAR_SCOPES = {'unsaved': 'g', 'saved': 's', 'local': 'l', 'line': 'i'}
33
-
34
-
35
- @dataclasses.dataclass
36
- class GeneratorFlags:
37
- indent_size: int
38
- literal_shorthand: bool
39
- var_shorthand: bool
40
-
41
-
42
- def argument_item_to_string(flags: GeneratorFlags, arg_item: object) -> str:
43
- class_name = arg_item.__class__.__name__
44
- if isinstance(arg_item, item):
45
- return f'{class_name}.from_nbt("""{arg_item.get_nbt()}""")'
46
-
47
- if isinstance(arg_item, string):
48
- value = arg_item.value.replace('\n', '\\n')
49
- return f'{class_name}("{value}")'
50
-
51
- if isinstance(arg_item, text):
52
- value = arg_item.value.replace('\n', '\\n')
53
- if flags.literal_shorthand:
54
- return f'"{value}"'
55
- return f'{class_name}("{value}")'
56
-
57
- if isinstance(arg_item, num):
58
- if not re.match(NUMBER_REGEX, str(arg_item.value)):
59
- return f'{class_name}("{arg_item.value}")'
60
- if flags.literal_shorthand:
61
- return str(arg_item.value)
62
- return f'{class_name}({arg_item.value})'
63
-
64
- if isinstance(arg_item, loc):
65
- loc_components = [arg_item.x, arg_item.y, arg_item.z]
66
- if arg_item.pitch != 0:
67
- loc_components.append(arg_item.pitch)
68
- if arg_item.yaw != 0:
69
- loc_components.append(arg_item.yaw)
70
- return f'{class_name}({", ".join(str(c) for c in loc_components)})'
71
-
72
- if isinstance(arg_item, var):
73
- if flags.var_shorthand:
74
- return f'"${VAR_SCOPES[arg_item.scope]}{arg_item.name}"'
75
- if arg_item.scope == 'unsaved':
76
- return f'{class_name}("{arg_item.name}")'
77
- return f'{class_name}("{arg_item.name}", "{arg_item.scope}")'
78
-
79
- if isinstance(arg_item, sound):
80
- return f'{class_name}("{arg_item.name}", {arg_item.pitch}, {arg_item.vol})'
81
-
82
- if isinstance(arg_item, particle):
83
- return f'{class_name}({arg_item.particle_data})'
84
-
85
- if isinstance(arg_item, potion):
86
- return f'{class_name}("{arg_item.name}", {arg_item.dur}, {arg_item.amp})'
87
-
88
- if isinstance(arg_item, gamevalue):
89
- return f'{class_name}("{arg_item.name}", "{arg_item.target}")'
90
-
91
- if isinstance(arg_item, parameter):
92
- param_type_class_name = arg_item.param_type.__class__.__name__
93
- param_args = [f'"{arg_item.name}"', f'{param_type_class_name}.{arg_item.param_type.name}']
94
- if arg_item.plural:
95
- param_args.append('plural=True')
96
- if arg_item.optional:
97
- param_args.append('optional=True')
98
- if arg_item.default_value is not None:
99
- param_args.append(f'default_value={argument_item_to_string(flags, arg_item.default_value)}')
100
- if arg_item.description:
101
- param_args.append(f'description="{arg_item.description}"')
102
- if arg_item.note:
103
- param_args.append(f'note="{arg_item.note}"')
104
- return f'{class_name}({", ".join(param_args)})'
105
-
106
- if isinstance(arg_item, vector):
107
- return f'{class_name}({arg_item.x}, {arg_item.y}, {arg_item.z})'
108
-
109
-
110
- def add_script_line(flags: GeneratorFlags, script_lines: list[str], indent_level: int, line: str, add_comma: bool=True):
111
- added_line = ' '*flags.indent_size*indent_level + line
112
- if add_comma and indent_level > 0:
113
- added_line += ','
114
- script_lines.append(added_line)
115
-
116
-
117
- # TODO: add tag values if not default
118
- def generate_script(template, flags: GeneratorFlags) -> str:
119
- indent_level = 0
120
- script_lines = []
121
- for codeblock in template.codeblocks:
122
- if codeblock.name == 'bracket':
123
- if codeblock.data['direct'] == 'open':
124
- add_script_line(flags, script_lines, indent_level, 't.bracket(', False)
125
- indent_level += 1
126
- elif codeblock.data['direct'] == 'close':
127
- indent_level -= 1
128
- add_script_line(flags, script_lines, indent_level, ')')
129
- continue
130
- if codeblock.name == 'else':
131
- add_script_line(flags, script_lines, indent_level, 't.else_()')
132
- continue
133
-
134
- method_name = TEMPLATE_METHOD_LOOKUP[codeblock.data['block']]
135
- method_args = [f'"{codeblock.name}"']
136
- if codeblock.name == 'dynamic':
137
- method_args[0] = f'"{codeblock.data["data"]}"'
138
-
139
- codeblock_args = [argument_item_to_string(flags, i) for i in codeblock.args]
140
- if codeblock_args:
141
- method_args.extend(codeblock_args)
142
- if method_name in TARGET_CODEBLOCKS and codeblock.target.name != 'SELECTION':
143
- method_args.append(f'target=Target.{codeblock.target.name}')
144
- if codeblock.tags:
145
- default_tags = get_default_tags(codeblock.data.get('block'), codeblock.name)
146
- written_tags = {t: o for t, o in codeblock.tags.items() if default_tags[t] != o}
147
- if written_tags:
148
- method_args.append(f'tags={str(written_tags)}')
149
-
150
- line = f't.{method_name}({", ".join(method_args)})'
151
- add_script_line(flags, script_lines, indent_level, line)
152
- return SCRIPT_START + '\n'.join(script_lines)
1
+ import dataclasses
2
+ import re
3
+ from dfpyre.items import *
4
+ from dfpyre.actiondump import get_default_tags
5
+
6
+ SCRIPT_START = '''from dfpyre import *
7
+ t = DFTemplate()
8
+ '''
9
+
10
+ TEMPLATE_METHOD_LOOKUP = {
11
+ 'event': 'player_event',
12
+ 'entity_event': 'entity_event',
13
+ 'func': 'function',
14
+ 'process': 'process',
15
+ 'call_func': 'call_function',
16
+ 'start_process': 'start_process',
17
+ 'player_action': 'player_action',
18
+ 'game_action': 'game_action',
19
+ 'entity_action': 'entity_action',
20
+ 'if_player': 'if_player',
21
+ 'if_var': 'if_variable',
22
+ 'if_game': 'if_game',
23
+ 'if_entity': 'if_entity',
24
+ 'else': 'else_',
25
+ 'repeat': 'repeat',
26
+ 'control': 'control',
27
+ 'select_obj': 'select_object',
28
+ 'set_var': 'set_variable'
29
+ }
30
+
31
+ TARGET_CODEBLOCKS = {'player_action', 'entity_action', 'if_player', 'if_entity'}
32
+ VAR_SCOPES = {'unsaved': 'g', 'saved': 's', 'local': 'l', 'line': 'i'}
33
+
34
+
35
+ @dataclasses.dataclass
36
+ class GeneratorFlags:
37
+ indent_size: int
38
+ literal_shorthand: bool
39
+ var_shorthand: bool
40
+
41
+
42
+ def argument_item_to_string(flags: GeneratorFlags, arg_item: object) -> str:
43
+ class_name = arg_item.__class__.__name__
44
+ if isinstance(arg_item, item):
45
+ return f'{class_name}.from_nbt("""{arg_item.get_nbt()}""")'
46
+
47
+ if isinstance(arg_item, string):
48
+ value = arg_item.value.replace('\n', '\\n')
49
+ return f'{class_name}("{value}")'
50
+
51
+ if isinstance(arg_item, text):
52
+ value = arg_item.value.replace('\n', '\\n')
53
+ if flags.literal_shorthand:
54
+ return f'"{value}"'
55
+ return f'{class_name}("{value}")'
56
+
57
+ if isinstance(arg_item, num):
58
+ if not re.match(NUMBER_REGEX, str(arg_item.value)):
59
+ return f'{class_name}("{arg_item.value}")'
60
+ if flags.literal_shorthand:
61
+ return str(arg_item.value)
62
+ return f'{class_name}({arg_item.value})'
63
+
64
+ if isinstance(arg_item, loc):
65
+ loc_components = [arg_item.x, arg_item.y, arg_item.z]
66
+ if arg_item.pitch != 0:
67
+ loc_components.append(arg_item.pitch)
68
+ if arg_item.yaw != 0:
69
+ loc_components.append(arg_item.yaw)
70
+ return f'{class_name}({", ".join(str(c) for c in loc_components)})'
71
+
72
+ if isinstance(arg_item, var):
73
+ if flags.var_shorthand:
74
+ return f'"${VAR_SCOPES[arg_item.scope]}{arg_item.name}"'
75
+ if arg_item.scope == 'unsaved':
76
+ return f'{class_name}("{arg_item.name}")'
77
+ return f'{class_name}("{arg_item.name}", "{arg_item.scope}")'
78
+
79
+ if isinstance(arg_item, sound):
80
+ return f'{class_name}("{arg_item.name}", {arg_item.pitch}, {arg_item.vol})'
81
+
82
+ if isinstance(arg_item, particle):
83
+ return f'{class_name}({arg_item.particle_data})'
84
+
85
+ if isinstance(arg_item, potion):
86
+ return f'{class_name}("{arg_item.name}", {arg_item.dur}, {arg_item.amp})'
87
+
88
+ if isinstance(arg_item, gamevalue):
89
+ return f'{class_name}("{arg_item.name}", "{arg_item.target}")'
90
+
91
+ if isinstance(arg_item, parameter):
92
+ param_type_class_name = arg_item.param_type.__class__.__name__
93
+ param_args = [f'"{arg_item.name}"', f'{param_type_class_name}.{arg_item.param_type.name}']
94
+ if arg_item.plural:
95
+ param_args.append('plural=True')
96
+ if arg_item.optional:
97
+ param_args.append('optional=True')
98
+ if arg_item.default_value is not None:
99
+ param_args.append(f'default_value={argument_item_to_string(flags, arg_item.default_value)}')
100
+ if arg_item.description:
101
+ param_args.append(f'description="{arg_item.description}"')
102
+ if arg_item.note:
103
+ param_args.append(f'note="{arg_item.note}"')
104
+ return f'{class_name}({", ".join(param_args)})'
105
+
106
+ if isinstance(arg_item, vector):
107
+ return f'{class_name}({arg_item.x}, {arg_item.y}, {arg_item.z})'
108
+
109
+
110
+ def add_script_line(flags: GeneratorFlags, script_lines: list[str], indent_level: int, line: str, add_comma: bool=True):
111
+ added_line = ' '*flags.indent_size*indent_level + line
112
+ if add_comma and indent_level > 0:
113
+ added_line += ','
114
+ script_lines.append(added_line)
115
+
116
+
117
+ # TODO: add tag values if not default
118
+ def generate_script(template, flags: GeneratorFlags) -> str:
119
+ indent_level = 0
120
+ script_lines = []
121
+ for codeblock in template.codeblocks:
122
+ if codeblock.name == 'bracket':
123
+ if codeblock.data['direct'] == 'open':
124
+ add_script_line(flags, script_lines, indent_level, 't.bracket(', False)
125
+ indent_level += 1
126
+ elif codeblock.data['direct'] == 'close':
127
+ indent_level -= 1
128
+ add_script_line(flags, script_lines, indent_level, ')')
129
+ continue
130
+ if codeblock.name == 'else':
131
+ add_script_line(flags, script_lines, indent_level, 't.else_()')
132
+ continue
133
+
134
+ method_name = TEMPLATE_METHOD_LOOKUP[codeblock.data['block']]
135
+ method_args = [f'"{codeblock.name}"']
136
+ if codeblock.name == 'dynamic':
137
+ method_args[0] = f'"{codeblock.data["data"]}"'
138
+
139
+ codeblock_args = [argument_item_to_string(flags, i) for i in codeblock.args]
140
+ if codeblock_args:
141
+ method_args.extend(codeblock_args)
142
+ if method_name in TARGET_CODEBLOCKS and codeblock.target.name != 'SELECTION':
143
+ method_args.append(f'target=Target.{codeblock.target.name}')
144
+ if codeblock.tags:
145
+ default_tags = get_default_tags(codeblock.data.get('block'), codeblock.name)
146
+ written_tags = {t: o for t, o in codeblock.tags.items() if default_tags[t] != o}
147
+ if written_tags:
148
+ method_args.append(f'tags={str(written_tags)}')
149
+
150
+ line = f't.{method_name}({", ".join(method_args)})'
151
+ add_script_line(flags, script_lines, indent_level, line)
152
+ return SCRIPT_START + '\n'.join(script_lines)
dfpyre/style.py CHANGED
@@ -1,22 +1,22 @@
1
- import re
2
- from mcitemlib.style import STYLE_CODE_REGEX, FORMAT_CODES, StyledString
3
-
4
- def is_ampersand_coded(s: str) -> bool:
5
- return bool(re.match(STYLE_CODE_REGEX, s))
6
-
7
-
8
- def ampersand_to_minimessage(ampersand_code: str) -> str:
9
- ampersand_code = ampersand_code.replace('&r', '<reset>') # bad but should work most of the time
10
- styled_string = StyledString.from_codes(ampersand_code)
11
- formatted_string_list = []
12
- for substring in styled_string.substrings:
13
- formatted_substring_list = []
14
- for style_type, value in substring.data.items():
15
- if style_type in FORMAT_CODES.values() and value:
16
- formatted_substring_list.append(f'<{style_type}>')
17
- if style_type == 'color':
18
- formatted_substring_list.append(f'<{value}>')
19
-
20
- formatted_substring_list.append(substring.data['text'])
21
- formatted_string_list.append(''.join(formatted_substring_list))
1
+ import re
2
+ from mcitemlib.style import STYLE_CODE_REGEX, FORMAT_CODES, StyledString
3
+
4
+ def is_ampersand_coded(s: str) -> bool:
5
+ return bool(re.match(STYLE_CODE_REGEX, s))
6
+
7
+
8
+ def ampersand_to_minimessage(ampersand_code: str) -> str:
9
+ ampersand_code = ampersand_code.replace('&r', '<reset>') # bad but should work most of the time
10
+ styled_string = StyledString.from_codes(ampersand_code)
11
+ formatted_string_list = []
12
+ for substring in styled_string.substrings:
13
+ formatted_substring_list = []
14
+ for style_type, value in substring.data.items():
15
+ if style_type in FORMAT_CODES.values() and value:
16
+ formatted_substring_list.append(f'<{style_type}>')
17
+ if style_type == 'color':
18
+ formatted_substring_list.append(f'<{value}>')
19
+
20
+ formatted_substring_list.append(substring.data['text'])
21
+ formatted_string_list.append(''.join(formatted_substring_list))
22
22
  return ''.join(formatted_string_list)
dfpyre/util.py CHANGED
@@ -1,28 +1,28 @@
1
- import base64
2
- import gzip
3
-
4
-
5
- COL_WARN = '\x1b[33m'
6
- COL_RESET = '\x1b[0m'
7
- COL_SUCCESS = '\x1b[32m'
8
- COL_ERROR = '\x1b[31m'
9
-
10
-
11
- class PyreException(Exception):
12
- pass
13
-
14
-
15
- def warn(message: str):
16
- print(f'{COL_WARN}! WARNING ! {message}{COL_RESET}')
17
-
18
-
19
- def df_encode(json_string: str) -> str:
20
- """
21
- Encodes a stringified json.
22
- """
23
- encoded_string = gzip.compress(json_string.encode('utf-8'))
24
- return base64.b64encode(encoded_string).decode('utf-8')
25
-
26
-
27
- def df_decode(encoded_string: str) -> str:
28
- return gzip.decompress(base64.b64decode(encoded_string)).decode('utf-8')
1
+ import base64
2
+ import gzip
3
+
4
+
5
+ COL_WARN = '\x1b[33m'
6
+ COL_RESET = '\x1b[0m'
7
+ COL_SUCCESS = '\x1b[32m'
8
+ COL_ERROR = '\x1b[31m'
9
+
10
+
11
+ class PyreException(Exception):
12
+ pass
13
+
14
+
15
+ def warn(message: str):
16
+ print(f'{COL_WARN}! WARNING ! {message}{COL_RESET}')
17
+
18
+
19
+ def df_encode(json_string: str) -> str:
20
+ """
21
+ Encodes a stringified json.
22
+ """
23
+ encoded_string = gzip.compress(json_string.encode('utf-8'))
24
+ return base64.b64encode(encoded_string).decode('utf-8')
25
+
26
+
27
+ def df_decode(encoded_string: str) -> str:
28
+ return gzip.decompress(base64.b64decode(encoded_string)).decode('utf-8')
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2024 Amp
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Amp
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dfpyre
3
- Version: 0.7.2
3
+ Version: 0.7.3
4
4
  Summary: A package for creating and modifying code templates for the DiamondFire Minecraft server.
5
5
  Home-page: https://github.com/Amp63/pyre
6
6
  License: MIT
@@ -12,7 +12,7 @@ Classifier: Programming Language :: Python :: 3
12
12
  Classifier: Programming Language :: Python :: 3.10
13
13
  Classifier: Programming Language :: Python :: 3.11
14
14
  Classifier: Programming Language :: Python :: 3.12
15
- Requires-Dist: mcitemlib (>=0.2.5,<0.3.0)
15
+ Requires-Dist: mcitemlib (>=0.3.0,<0.4.0)
16
16
  Project-URL: Repository, https://github.com/Amp63/pyre
17
17
  Description-Content-Type: text/markdown
18
18
 
@@ -0,0 +1,12 @@
1
+ dfpyre/__init__.py,sha256=apPsSxJ1Tztfl71MoORoSmDfX7LyKLYlLwOGeLQUitw,25
2
+ dfpyre/actiondump.py,sha256=YR5h0ZjgyqNkHUCkLLKS0ovMFZQ8WSKuJQzGncT27cA,2664
3
+ dfpyre/data/actiondump_min.json,sha256=OOSlKqWffFf9dJbY7Kj8uCRz3d6CZPMEWkSpX2-Avqs,1785020
4
+ dfpyre/items.py,sha256=WIiuslk6qyPUWSndDFEUqz_TNGUgIb0YgXrwh2Lokfs,11746
5
+ dfpyre/pyre.py,sha256=gop5idEA2LVvsLMU9S2D6NQPxhqhZOkfnWhdFpSVblE,18681
6
+ dfpyre/scriptgen.py,sha256=HHWiJwuZFF3w7f-i7QVDZ_7UE6KNjHIIdAQ_2THPLI8,6027
7
+ dfpyre/style.py,sha256=YRSKEg5r8rkZH62WkRQYbTPgTWVVGVXLnx4edShs0NM,1001
8
+ dfpyre/util.py,sha256=KThtsPQh4Ep3UXPvJGw5jrzEcM4cDqDG5IG1FXUQROI,610
9
+ dfpyre-0.7.3.dist-info/LICENSE,sha256=nqCBVqcbIX-9lhVDarggfrjgNZoPlKKlyl0-hOPS2wQ,1081
10
+ dfpyre-0.7.3.dist-info/METADATA,sha256=tFkRSW9CYvTKmrig-zIqskEMDaDALVtrWvPleI-TUME,11754
11
+ dfpyre-0.7.3.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
12
+ dfpyre-0.7.3.dist-info/RECORD,,
@@ -1,12 +0,0 @@
1
- dfpyre/__init__.py,sha256=apPsSxJ1Tztfl71MoORoSmDfX7LyKLYlLwOGeLQUitw,25
2
- dfpyre/actiondump.py,sha256=MVI1kVJBNpab882Tgqo-xtemiBN2W1_2OcopBcRupWQ,2587
3
- dfpyre/data/actiondump_min.json,sha256=OOSlKqWffFf9dJbY7Kj8uCRz3d6CZPMEWkSpX2-Avqs,1785020
4
- dfpyre/items.py,sha256=StQnkvGAZj3mb7qG3bMyuuiRaSIttyW1Azs139e5c_4,11374
5
- dfpyre/pyre.py,sha256=snx65yM0ysuBfV4Qe6zEKK9aw0jNmPsPgv7v8XIsSVw,18216
6
- dfpyre/scriptgen.py,sha256=fHjf7KVpz6iPr97Co-6BeacVVwcpVRfHd3g_ez3jnNM,5875
7
- dfpyre/style.py,sha256=mLW1CFvvi8_9fk8JaH10I5S4WI0YBdQIXHtI3G_4sR8,980
8
- dfpyre/util.py,sha256=gHIPPVD0dcLPAaN1M5EnNgxenarwlxfRKN4xno1YJHM,582
9
- dfpyre-0.7.2.dist-info/LICENSE,sha256=_vuDskB0ja2c-Fgm7Gt8Q8cO9NsLNpZAVyvmZwX7E6o,1060
10
- dfpyre-0.7.2.dist-info/METADATA,sha256=mmwlWG_tcoqYC9aWo_rqfT7vO5BIa1_MB5waCL9Z-HE,11754
11
- dfpyre-0.7.2.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
12
- dfpyre-0.7.2.dist-info/RECORD,,
File without changes