PyFoxFile 0.19.6__tar.gz → 0.24.4__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.
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyFoxFile
3
- Version: 0.19.6
4
- Summary: A tar like file format name foxfile.
3
+ Version: 0.24.4
4
+ Summary: A tar like file format name archivefile.
5
5
  Home-page: https://github.com/GameMaker2k/PyFoxFile
6
6
  Download-URL: https://github.com/GameMaker2k/PyFoxFile/archive/master.tar.gz
7
- Author: Kazuki Przyborowski
8
- Author-email: Kazuki Przyborowski <kazuki.przyborowski@gmail.com>
9
- Maintainer: Kazuki Przyborowski
10
- Maintainer-email: kazuki.przyborowski@gmail.com
7
+ Author: Kazuhana Neko-chan
8
+ Author-email: Kazuhika Kitsune-chan <kazuki.suzuki.fox@gmail.com>, Kazuhana Neko-chan <kazuki.suzuki.cat@gmail.com>, Kazuki Neko-kun <kazuki.suzuki.wa@gmail.com>, Game Maker 2k <gamemaker2k@gmail.com>
9
+ Maintainer: Kazuhika Kitsune-chan
10
+ Maintainer-email: kazuki.suzuki.fox@gmail.com
11
11
  License: BSD-3-Clause
12
12
  Platform: OS Independent
13
13
  Description-Content-Type: text/markdown
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyFoxFile
3
- Version: 0.19.6
4
- Summary: A tar like file format name foxfile.
3
+ Version: 0.24.4
4
+ Summary: A tar like file format name archivefile.
5
5
  Home-page: https://github.com/GameMaker2k/PyFoxFile
6
6
  Download-URL: https://github.com/GameMaker2k/PyFoxFile/archive/master.tar.gz
7
- Author: Kazuki Przyborowski
8
- Author-email: Kazuki Przyborowski <kazuki.przyborowski@gmail.com>
9
- Maintainer: Kazuki Przyborowski
10
- Maintainer-email: kazuki.przyborowski@gmail.com
7
+ Author: Kazuhana Neko-chan
8
+ Author-email: Kazuhika Kitsune-chan <kazuki.suzuki.fox@gmail.com>, Kazuhana Neko-chan <kazuki.suzuki.cat@gmail.com>, Kazuki Neko-kun <kazuki.suzuki.wa@gmail.com>, Game Maker 2k <gamemaker2k@gmail.com>
9
+ Maintainer: Kazuhika Kitsune-chan
10
+ Maintainer-email: kazuki.suzuki.fox@gmail.com
11
11
  License: BSD-3-Clause
12
12
  Platform: OS Independent
13
13
  Description-Content-Type: text/markdown
@@ -1,6 +1,7 @@
1
1
  LICENSE
2
2
  README.md
3
3
  foxfile.py
4
+ foxneofile.py
4
5
  neofoxfile.py
5
6
  pyfoxfile.py
6
7
  pyproject.toml
@@ -14,7 +14,7 @@
14
14
  Copyright 2018-2024 Game Maker 2k - http://intdb.sourceforge.net/
15
15
  Copyright 2018-2024 Kazuki Przyborowski - https://github.com/KazukiPrzyborowski
16
16
 
17
- $FileInfo: foxfile.py - Last Update: 3/7/2025 Ver. 0.19.4 RC 1 - Author: cooldude2k $
17
+ $FileInfo: foxfile.py - Last Update: 11/3/2025 Ver. 0.24.4 RC 1 - Author: cooldude2k $
18
18
  '''
19
19
 
20
20
  from __future__ import absolute_import, division, print_function, unicode_literals, generators, with_statement, nested_scopes
@@ -91,57 +91,37 @@ __version_date_plusrc__ = pyfoxfile.__version_date_plusrc__
91
91
  __version__ = pyfoxfile.__version__
92
92
 
93
93
  # Initialize the argument parser
94
- argparser = argparse.ArgumentParser(
95
- description="Manipulate archive files.", conflict_handler="resolve", add_help=True)
94
+ argparser = argparse.ArgumentParser(description="Manipulate archive files.", conflict_handler="resolve", add_help=True)
96
95
 
97
96
  # Version information
98
- argparser.add_argument("-V", "--version", action="version",
99
- version=__program_name__ + " " + __version__)
97
+ argparser.add_argument("-V", "--version", action="version", version=__program_name__ + " " + __version__)
100
98
  # Input and output specifications
101
- argparser.add_argument(
102
- "-i", "--input", nargs="+", help="Specify the file(s) to concatenate or the archive file to extract.", required=True)
103
- argparser.add_argument("-o", "--output", default=None,
104
- help="Specify the name for the extracted or output archive files.")
99
+ argparser.add_argument("-i", "--input", nargs="+", help="Specify the file(s) to concatenate or the archive file to extract.", required=True)
100
+ argparser.add_argument("-o", "--output", default=None, help="Specify the name for the extracted or output archive files.")
105
101
  # Operations
106
- argparser.add_argument("-c", "--create", action="store_true",
107
- help="Perform only the concatenation operation.")
108
- argparser.add_argument("-e", "--extract", action="store_true",
109
- help="Perform only the extraction operation.")
110
- argparser.add_argument("-t", "--convert", action="store_true",
111
- help="Convert a tar/zip/rar/7zip file to a archive file.")
112
- argparser.add_argument("-r", "--repack", action="store_true",
113
- help="Re-concatenate files, fixing checksum errors if any.")
102
+ argparser.add_argument("-c", "--create", action="store_true", help="Perform only the concatenation operation.")
103
+ argparser.add_argument("-e", "--extract", action="store_true", help="Perform only the extraction operation.")
104
+ argparser.add_argument("-t", "--convert", action="store_true", help="Convert a tar/zip/rar/7zip file to a archive file.")
105
+ argparser.add_argument("-r", "--repack", action="store_true", help="Re-concatenate files, fixing checksum errors if any.")
106
+ argparser.add_argument("-S", "--filestart", type=int, default=0, help="Start reading file at.")
114
107
  # File manipulation options
115
- argparser.add_argument(
116
- "-F", "--format", default="auto", help="Specify the format to use.")
117
- argparser.add_argument(
118
- "-D", "--delimiter", default=__file_format_dict__['format_delimiter'], help="Specify the delimiter to use.")
119
- argparser.add_argument(
120
- "-m", "--formatver", default=__file_format_dict__['format_ver'], help="Specify the format version.")
121
- argparser.add_argument("-l", "--list", action="store_true",
122
- help="List files included in the archive file.")
108
+ argparser.add_argument("-F", "--format", default="auto", help="Specify the format to use.")
109
+ argparser.add_argument("-D", "--delimiter", default=__file_format_dict__['format_delimiter'], help="Specify the delimiter to use.")
110
+ argparser.add_argument("-m", "--formatver", default=__file_format_dict__['format_ver'], help="Specify the format version.")
111
+ argparser.add_argument("-l", "--list", action="store_true", help="List files included in the archive file.")
123
112
  # Compression options
124
- argparser.add_argument("-P", "--compression", default="auto",
125
- help="Specify the compression method to use for concatenation.")
126
- argparser.add_argument("-L", "--level", default=None,
127
- help="Specify the compression level for concatenation.")
128
- argparser.add_argument("-W", "--wholefile", action="store_true",
129
- help="Whole file compression method to use for concatenation.")
113
+ argparser.add_argument("-P", "--compression", default="auto", help="Specify the compression method to use for concatenation.")
114
+ argparser.add_argument("-L", "--level", default=None, help="Specify the compression level for concatenation.")
115
+ argparser.add_argument("-W", "--wholefile", action="store_true", help="Whole file compression method to use for concatenation.")
130
116
  # Checksum and validation
131
- argparser.add_argument("-v", "--validate", action="store_true",
132
- help="Validate archive file checksums.")
133
- argparser.add_argument("-C", "--checksum", default="crc32",
134
- help="Specify the type of checksum to use. The default is crc32.")
135
- argparser.add_argument("-s", "--skipchecksum", action="store_true",
136
- help="Skip the checksum check of files.")
117
+ argparser.add_argument("-v", "--validate", action="store_true", help="Validate archive file checksums.")
118
+ argparser.add_argument("-C", "--checksum", default="crc32", help="Specify the type of checksum to use. The default is crc32.")
119
+ argparser.add_argument("-s", "--skipchecksum", action="store_true", help="Skip the checksum check of files.")
137
120
  # Permissions and metadata
138
- argparser.add_argument("-p", "--preserve", action="store_false",
139
- help="Do not preserve permissions and timestamps of files.")
121
+ argparser.add_argument("-p", "--preserve", action="store_false", help="Do not preserve permissions and timestamps of files.")
140
122
  # Miscellaneous
141
- argparser.add_argument("-d", "--verbose", action="store_true",
142
- help="Enable verbose mode to display various debugging information.")
143
- argparser.add_argument("-T", "--text", action="store_true",
144
- help="Read file locations from a text file.")
123
+ argparser.add_argument("-d", "--verbose", action="store_true", help="Enable verbose mode to display various debugging information.")
124
+ argparser.add_argument("-T", "--text", action="store_true", help="Read file locations from a text file.")
145
125
  # Parse the arguments
146
126
  getargs = argparser.parse_args()
147
127
 
@@ -172,8 +152,8 @@ if active_action:
172
152
  if getargs.convert:
173
153
  checkcompressfile = pyfoxfile.CheckCompressionSubType(
174
154
  input_file, fnamedict, True)
175
- if((IsNestedDict(fnamedict) and compresscheck in fnamedict) or (IsSingleDict(fnamedict) and compresscheck==fnamedict['format_magic'])):
176
- tmpout = pyfoxfile.RePackFoxFile(input_file, getargs.output, getargs.compression, getargs.wholefile, getargs.level, pyfoxfile.compressionlistalt, False, 0, 0, [getargs.checksum, getargs.checksum, getargs.checksum, getargs.checksum], getargs.skipchecksum, [], {}, fnamedict, getargs.verbose, False)
155
+ if((pyfoxfile.IsNestedDict(fnamedict) and checkcompressfile in fnamedict) or (pyfoxfile.IsSingleDict(fnamedict) and checkcompressfile==fnamedict['format_magic'])):
156
+ tmpout = pyfoxfile.RePackFoxFile(input_file, getargs.output, getargs.compression, getargs.wholefile, getargs.level, pyfoxfile.compressionlistalt, False, getargs.filestart, 0, 0, [getargs.checksum, getargs.checksum, getargs.checksum, getargs.checksum], getargs.skipchecksum, [], {}, fnamedict, getargs.verbose, False)
177
157
  else:
178
158
  tmpout = pyfoxfile.PackFoxFileFromInFile(
179
159
  input_file, getargs.output, __file_format_default__, getargs.compression, getargs.wholefile, getargs.level, pyfoxfile.compressionlistalt, [getargs.checksum, getargs.checksum, getargs.checksum, getargs.checksum], [], {}, fnamedict, getargs.verbose, False)
@@ -185,58 +165,58 @@ if active_action:
185
165
  if getargs.convert:
186
166
  checkcompressfile = pyfoxfile.CheckCompressionSubType(
187
167
  input_file, fnamedict, True)
188
- if((IsNestedDict(fnamedict) and compresscheck in fnamedict) or (IsSingleDict(fnamedict) and compresscheck==fnamedict['format_magic'])):
168
+ if((pyfoxfile.IsNestedDict(fnamedict) and checkcompressfile in fnamedict) or (pyfoxfile.IsSingleDict(fnamedict) and checkcompressfile==fnamedict['format_magic'])):
189
169
  pyfoxfile.RePackFoxFile(input_file, getargs.output, getargs.compression, getargs.wholefile, getargs.level, pyfoxfile.compressionlistalt,
190
- False, 0, 0, [getargs.checksum, getargs.checksum, getargs.checksum, getargs.checksum], getargs.skipchecksum, [], {}, fnamedict, getargs.verbose, False)
170
+ False, getargs.filestart, 0, 0, [getargs.checksum, getargs.checksum, getargs.checksum, getargs.checksum], getargs.skipchecksum, [], {}, fnamedict, getargs.verbose, False)
191
171
  else:
192
172
  pyfoxfile.PackFoxFileFromInFile(input_file, getargs.output, __file_format_default__, getargs.compression, getargs.wholefile, getargs.level, pyfoxfile.compressionlistalt, [getargs.checksum, getargs.checksum, getargs.checksum, getargs.checksum], [], {}, fnamedict, getargs.verbose, False)
193
173
  if(not tmpout):
194
174
  sys.exit(1)
195
175
  else:
196
176
  pyfoxfile.RePackFoxFile(input_file, getargs.output, getargs.compression, getargs.wholefile, getargs.level, pyfoxfile.compressionlistalt,
197
- False, 0, 0, [getargs.checksum, getargs.checksum, getargs.checksum, getargs.checksum], getargs.skipchecksum, [], {}, fnamedict, getargs.verbose, False)
177
+ False, getargs.filestart, 0, 0, [getargs.checksum, getargs.checksum, getargs.checksum, getargs.checksum], getargs.skipchecksum, [], {}, fnamedict, getargs.verbose, False)
198
178
  elif active_action == 'extract':
199
179
  if getargs.convert:
200
180
  checkcompressfile = pyfoxfile.CheckCompressionSubType(
201
181
  input_file, fnamedict, True)
202
182
  tempout = BytesIO()
203
- if((IsNestedDict(fnamedict) and compresscheck in fnamedict) or (IsSingleDict(fnamedict) and compresscheck==fnamedict['format_magic'])):
204
- tmpout = pyfoxfile.RePackFoxFile(input_file, tempout, getargs.compression, getargs.wholefile, getargs.level, pyfoxfile.compressionlistalt, False, 0, 0, [getargs.checksum, getargs.checksum, getargs.checksum, getargs.checksum], getargs.skipchecksum, [], {}, fnamedict, False, False)
183
+ if((pyfoxfile.IsNestedDict(fnamedict) and checkcompressfile in fnamedict) or (pyfoxfile.IsSingleDict(fnamedict) and checkcompressfile==fnamedict['format_magic'])):
184
+ tmpout = pyfoxfile.RePackFoxFile(input_file, tempout, getargs.compression, getargs.wholefile, getargs.level, pyfoxfile.compressionlistalt, False, getargs.filestart, 0, 0, [getargs.checksum, getargs.checksum, getargs.checksum, getargs.checksum], getargs.skipchecksum, [], {}, fnamedict, False, False)
205
185
  else:
206
186
  tmpout = pyfoxfile.PackFoxFileFromInFile(
207
187
  input_file, tempout, __file_format_default__, getargs.compression, getargs.wholefile, getargs.level, pyfoxfile.compressionlistalt, [getargs.checksum, getargs.checksum, getargs.checksum, getargs.checksum], [], {}, fnamedict, False, False)
208
188
  if(not tmpout):
209
189
  sys.exit(1)
210
190
  input_file = tempout
211
- pyfoxfile.UnPackFoxFile(input_file, getargs.output, False, 0, 0, getargs.skipchecksum,
191
+ pyfoxfile.UnPackFoxFile(input_file, getargs.output, False, getargs.filestart, 0, 0, getargs.skipchecksum,
212
192
  fnamedict, getargs.verbose, getargs.preserve, getargs.preserve, False, False)
213
193
  elif active_action == 'list':
214
194
  if getargs.convert:
215
195
  checkcompressfile = pyfoxfile.CheckCompressionSubType(
216
196
  input_file, fnamedict, True)
217
- if((IsNestedDict(fnamedict) and compresscheck in fnamedict) or (IsSingleDict(fnamedict) and compresscheck==fnamedict['format_magic'])):
218
- tmpout = pyfoxfile.FoxFileListFiles(input_file, "auto", 0, 0, getargs.skipchecksum, fnamedict, False, getargs.verbose, False)
197
+ if((pyfoxfile.IsNestedDict(fnamedict) and checkcompressfile in fnamedict) or (pyfoxfile.IsSingleDict(fnamedict) and checkcompressfile==fnamedict['format_magic'])):
198
+ tmpout = pyfoxfile.FoxFileListFiles(input_file, "auto", getargs.filestart, 0, 0, getargs.skipchecksum, fnamedict, False, getargs.verbose, False, False)
219
199
  else:
220
- tmpout = pyfoxfile.InFileListFiles(input_file, getargs.verbose, fnamedict, False, False)
200
+ tmpout = pyfoxfile.InFileListFiles(input_file, getargs.verbose, fnamedict, False, False, False)
221
201
  if(not tmpout):
222
202
  sys.exit(1)
223
203
  else:
224
- pyfoxfile.FoxFileListFiles(input_file, "auto", 0, 0, getargs.skipchecksum, fnamedict, False, getargs.verbose, False)
204
+ pyfoxfile.FoxFileListFiles(input_file, "auto", getargs.filestart, 0, 0, getargs.skipchecksum, fnamedict, False, getargs.verbose, False, False)
225
205
  elif active_action == 'validate':
226
206
  if getargs.convert:
227
207
  checkcompressfile = pyfoxfile.CheckCompressionSubType(
228
208
  input_file, fnamedict, True)
229
209
  tempout = BytesIO()
230
- if((IsNestedDict(fnamedict) and compresscheck in fnamedict) or (IsSingleDict(fnamedict) and compresscheck==fnamedict['format_magic'])):
231
- tmpout = pyfoxfile.RePackFoxFile(input_file, tempout, getargs.compression, getargs.wholefile, getargs.level, pyfoxfile.compressionlistalt, False, 0, 0, [getargs.checksum, getargs.checksum, getargs.checksum, getargs.checksum], getargs.skipchecksum, [], {}, fnamedict, False, False, False)
210
+ if((pyfoxfile.IsNestedDict(fnamedict) and checkcompressfile in fnamedict) or (pyfoxfile.IsSingleDict(fnamedict) and checkcompressfile==fnamedict['format_magic'])):
211
+ tmpout = pyfoxfile.RePackFoxFile(input_file, tempout, getargs.compression, getargs.wholefile, getargs.level, pyfoxfile.compressionlistalt, False, getargs.filestart, 0, 0, [getargs.checksum, getargs.checksum, getargs.checksum, getargs.checksum], getargs.skipchecksum, [], {}, fnamedict, False, False, False)
232
212
  else:
233
213
  tmpout = pyfoxfile.PackFoxFileFromInFile(
234
214
  input_file, tempout, __file_format_default__, getargs.compression, getargs.wholefile, getargs.level, pyfoxfile.compressionlistalt, [getargs.checksum, getargs.checksum, getargs.checksum, getargs.checksum], [], {}, fnamedict, False, False)
235
215
  input_file = tempout
236
216
  if(not tmpout):
237
217
  sys.exit(1)
238
- fvalid = pyfoxfile.FoxFileValidate(
239
- input_file, "auto", fnamedict, False, getargs.verbose, False)
218
+ fvalid = pyfoxfile.StackedFoxFileValidate(
219
+ input_file, "auto", getargs.filestart, fnamedict, False, getargs.verbose, False)
240
220
  if(not getargs.verbose):
241
221
  import sys
242
222
  import logging
@@ -0,0 +1,130 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ from __future__ import absolute_import, division, print_function, unicode_literals
4
+
5
+ import sys, os, io, argparse
6
+
7
+ try:
8
+ import pyfoxfile as P # core must provide *_neo functions
9
+ except Exception as e:
10
+ sys.stderr.write("Failed to import core module 'pyfoxfile': %s\n" % (e,))
11
+ sys.exit(2)
12
+
13
+
14
+ def _expand_combined_short_opts(argv):
15
+ out = [argv[0]]
16
+ i = 1
17
+ while i < len(argv):
18
+ a = argv[i]
19
+ if a.startswith("--") or not (a.startswith("-") and len(a) > 2):
20
+ out.append(a); i += 1; continue
21
+ for ch in a[1:]:
22
+ out.append("-" + ch)
23
+ i += 1
24
+ return out
25
+
26
+
27
+ def main():
28
+ argv = _expand_combined_short_opts(sys.argv)
29
+
30
+ p = argparse.ArgumentParser(
31
+ description="PyNeoFile CLI (uses pyfoxfile core)")
32
+ g = p.add_mutually_exclusive_group(required=True)
33
+ g.add_argument("-l", "--list", action="store_true", help="List archive")
34
+ g.add_argument("-e", "--extract", action="store_true", help="Extract archive")
35
+ g.add_argument("-c", "--create", action="store_true", help="Create archive from path")
36
+ g.add_argument("-r", "--repack", action="store_true", help="Repack (recompress) an archive")
37
+ g.add_argument("-E", "--empty", action="store_true", help="Create an empty archive")
38
+
39
+ p.add_argument("-i", "--input", help="Input file/path", nargs="*")
40
+ p.add_argument("-o", "--output", help="Output file/dir (or '-' for stdout)")
41
+ p.add_argument("-d", "--verbose", action="store_true", help="Verbose/detailed listing")
42
+ p.add_argument("-P", "--compression", default="auto", help="Compression algo (auto, none, zlib, gzip, bz2, lzma)")
43
+ p.add_argument("-L", "--level", type=int, default=None, help="Compression level/preset")
44
+ p.add_argument("--checksum", default="crc32", help="Checksum type for header/content/json (default: crc32)")
45
+
46
+ args = p.parse_args(argv[1:])
47
+
48
+ src = None
49
+ if args.input:
50
+ if isinstance(args.input, list) and len(args.input) == 1:
51
+ src = args.input[0]
52
+ elif isinstance(args.input, list) and len(args.input) > 1:
53
+ src = args.input[0]
54
+ else:
55
+ src = args.input
56
+
57
+ if args.empty:
58
+ dst = args.output or "-"
59
+ blob_or_true = P.make_empty_file_neo(dst, fmttype="auto", checksumtype=args.checksum, encoding="UTF-8", returnfp=False)
60
+ if dst in (None, "-"):
61
+ data = blob_or_true if isinstance(blob_or_true, (bytes, bytearray)) else b""
62
+ if hasattr(sys.stdout, "buffer"):
63
+ sys.stdout.buffer.write(data)
64
+ else:
65
+ sys.stdout.write(data.decode("latin1"))
66
+ return 0
67
+
68
+ if args.list:
69
+ if not src:
70
+ p.error("list requires -i <archive>")
71
+ P.archivefilelistfiles_neo(src, advanced=args.verbose, include_dirs=True)
72
+ return 0
73
+
74
+ if args.extract:
75
+ if not src:
76
+ p.error("extract requires -i <archive>")
77
+ outdir = args.output or "."
78
+ ok = P.unpack_neo(src, outdir, skipchecksum=False, uncompress=True)
79
+ return 0 if ok else 1
80
+
81
+ if args.create:
82
+ if not src:
83
+ p.error("create requires -i <path>")
84
+ if args.verbose:
85
+ walkroot = src
86
+ if os.path.isdir(walkroot):
87
+ print(walkroot)
88
+ for root, dirs, files in os.walk(walkroot):
89
+ relroot = root if root.startswith("./") else "./" + root.replace("\\", "/")
90
+ if root != walkroot:
91
+ print(relroot)
92
+ for name in sorted(files):
93
+ path = os.path.join(root, name).replace("\\", "/")
94
+ if not path.startswith("./"):
95
+ path = "./" + path
96
+ print(path)
97
+ else:
98
+ path = src if src.startswith("./") else "./" + src
99
+ print(path)
100
+
101
+ outpath = args.output or "-"
102
+ ok = P.pack_neo(src, outpath, checksumtypes=(args.checksum,args.checksum,args.checksum,args.checksum),
103
+ encoding="UTF-8", compression=args.compression, compression_level=args.level)
104
+ if outpath in (None, "-") and isinstance(ok, (bytes, bytearray)):
105
+ if hasattr(sys.stdout, "buffer"):
106
+ sys.stdout.buffer.write(ok)
107
+ else:
108
+ sys.stdout.write(ok.decode("latin1"))
109
+ return 0
110
+ return 0 if ok else 1
111
+
112
+ if args.repack:
113
+ if not src:
114
+ p.error("repack requires -i <archive>")
115
+ outpath = args.output or "-"
116
+ ok = P.repack_neo(src, outpath, checksumtypes=(args.checksum,args.checksum,args.checksum,args.checksum),
117
+ compression=args.compression, compression_level=args.level)
118
+ if outpath in (None, "-") and isinstance(ok, (bytes, bytearray)):
119
+ if hasattr(sys.stdout, "buffer"):
120
+ sys.stdout.buffer.write(ok)
121
+ else:
122
+ sys.stdout.write(ok.decode("latin1"))
123
+ return 0
124
+ return 0 if ok else 1
125
+
126
+ return 0
127
+
128
+
129
+ if __name__ == "__main__":
130
+ sys.exit(main())
@@ -14,7 +14,7 @@
14
14
  Copyright 2018-2024 Game Maker 2k - http://intdb.sourceforge.net/
15
15
  Copyright 2018-2024 Kazuki Przyborowski - https://github.com/KazukiPrzyborowski
16
16
 
17
- $FileInfo: neofoxfile.py - Last Update: 3/7/2025 Ver. 0.19.0 RC 1 - Author: cooldude2k $
17
+ $FileInfo: neofoxfile.py - Last Update: 8/26/2025 Ver. 0.21.4 RC 1 - Author: cooldude2k $
18
18
  '''
19
19
 
20
20
  from __future__ import absolute_import, division, print_function, unicode_literals, generators, with_statement, nested_scopes