- Notifications
You must be signed in to change notification settings - Fork36
Enhanced Downloadables.#437
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 ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
base:master
Are you sure you want to change the base?
Uh oh!
There was an error while loading.Please reload this page.
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.
jordanbriere commentedNov 13, 2021
There are a few issues I can think of regarding how you parse the file into
|
satoon101 commentedNov 13, 2021
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. |
CookStar commentedNov 15, 2021
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. |
jordanbriere commentedNov 15, 2021
This can be done with a simple regex. For example: importrefrompathimportPathfrompprintimportpprintdefget_files(buffer):files=set()forlineinbuffer.splitlines():line=line.strip()ifline.startswith('//'):continuematch=re.match('(.*?)(?=\/\/ )',line)ifmatchisnotNone:line=match.group().rstrip()file=line.strip()ifnotfile:continuefiles.add(Path(file).normpath())returnfilespprint(get_files("""foo//bar/\\baz.mp3 // This is a cool song.maps/some map.bsp // my_model.mdl // Some empty linemyfile.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 |
CookStar commentedNov 15, 2021
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. |
jordanbriere commentedNov 15, 2021
That's because my regex doesn't have the right order. Should be |
jordanbriere commentedNov 15, 2021
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 |
| raiseFileNotFoundError(f'No file found at "{file_path}"') | ||
| withfile_path.open('r',encoding=encoding)asfile: | ||
| lines= [line.strip()forlineinfile.readlines()] |
jordanbriereDec 3, 2021 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
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 usecore.ConfigFile to parse the file. E.g.
lines= {Path(file.strip()).normpath()forfileinset(ConfigFile(file_path,as_strings=True))}
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.
I fully agree on the normalizing part. At the moment normalizing isn't that important as no users are involved. But I think it's better to normalize. Especially with this PR.
dl.add('foo/bar.baz') and dl.remove('foo\bar.baz') handle the same path.
| The paths to add to the downloadables. | ||
| """ | ||
| ifitemsisNone: | ||
| return |
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.
What is the point of the None check here? A Python set would throw an error:
x=set()x.update(None)Traceback (mostrecentcalllast):File"<pyshell#3>",line1,in<module>x.update(None)TypeError:'NoneType'objectisnotiterable
Ayuto commentedApr 19, 2025
If you agree on the two changes I would be happy to merge into master. I also wouln't add the possibility to add comments at the end. They have to be at the beginning of a line and that's it. No need to make it more complex. |
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: