-
Notifications
You must be signed in to change notification settings - Fork 31
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Enhanced Downloadables. #437
base: master
Are you sure you want to change the base?
Enhanced Downloadables. #437
Conversation
Changed Downloadables to accept iterable on initialization. Fixed Downloadables.update to correctly add downloadables to stringtable. Added add_from_file/remove_from_file functions to Downloadables.
There are a few issues I can think of regarding how you parse the file into
|
I would also add a few items in regards to your use of
With the last 2, I understand that they are slower, because they end up calling the other functionality internally. But, this isn't an operation that will be happening frequently, and the speed difference should be negligible. |
Fixed.
Isn't that a tricky thing to do? As both "test #.vtf" and "test///test.vtf" are valid paths, we shouldn't allow end-line comments.
That's not a problem that should be solved by add_from_file/remove_from_file, but by Downloadables itself. Besides, I think the downloadables string is a problem that should be managed by the plugin author/model distributor, and normalization will only add unnecessary problems.
This is intentionally to display an error, because there is nothing we can do as long as we don't know whether the specified file path starts with an absolute path, a relative path, or a path relative to GAME_PATH. The reason I don't like Path.open is that it makes errors more confusing than they need to be. Instead of Path.open error, it now raises FileNotFoundError by default. |
This can be done with a simple regex. For example: import re
from path import Path
from pprint import pprint
def get_files(buffer):
files = set()
for line in buffer.splitlines():
line = line.strip()
if line.startswith('//'):
continue
match = re.match('(.*?)(?=\/\/ )', line)
if match is not None:
line = match.group().rstrip()
file = line.strip()
if not file:
continue
files.add(Path(file).normpath())
return files
pprint(get_files("""
foo//bar/\\baz.mp3 // This is a cool song.
maps/some map.bsp
// my_model.mdl
// Some empty line
myfile.txt
my file.vtf // This material is trash.
foo.wav // blah blah
éééàà.mp3
""")) I discarded
I don't think this should be the responsibility of the |
You're missing when a directory starts and ends with a space. And when there is no space after a comment.
Remember that
I simply thought it would be useful to be able to add and remove files in batches because some models have files in different locations in the directory hierarchy, so I didn't think that far ahead. But if that's the case, wouldn't it make more sense to normalize in all situations? Why do you think normalization is necessary in the first place? If the downloadables don't work, they won't work after all, so I think it can only be the responsibility of the person who added them. For example, on Windows, lowercase and uppercase letters are treated as equal, so mixing them will work, but on Linux, it will not. |
That's because my regex doesn't have the right order. Should be |
That's a great point, actually. Which lead me to agree with:
The goal is that paths are consistent and the resolution from the added strings are the same as the resolution of the |
raise FileNotFoundError(f'No file found at "{file_path}"') | ||
|
||
with file_path.open('r', encoding=encoding) as file: | ||
lines = [line.strip() for line in file.readlines()] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please use core.ConfigFile
to parse the file. E.g.
lines = {
Path(file.strip()).normpath()
for file in set(ConfigFile(file_path, as_strings=True))
}
Changed Downloadables to accept iterable on initialization.
Fixed Downloadables.update to correctly add downloadables to stringtable.
Added add_from_file/remove_from_file functions to Downloadables.
Examples: