From 699d2f2dc20523f04013cff793c929671f6ffbe5 Mon Sep 17 00:00:00 2001 From: VB PROGER <97066898+VBPROGER@users.noreply.github.com> Date: Wed, 17 May 2023 12:32:54 +0300 Subject: [PATCH 01/16] Added sub-folders extraction --- programpack/__init__.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/programpack/__init__.py b/programpack/__init__.py index b294e00..0ee5d1b 100644 --- a/programpack/__init__.py +++ b/programpack/__init__.py @@ -67,6 +67,10 @@ def read_main_file(self): return self.archive.read(self.main_file) def read_resources(self) -> dict: '''Read "Resources" folder and return dictionary''' + warn( + 'Function "read_resources" may be deprecated in future', + DeprecationWarning + ) resources_dict = {} for resource in self.archive.namelist(): if resource.startswith(self.resfold): @@ -89,15 +93,12 @@ def run(self, w_resources: bool = True, autocall: bool = True, delete: bool = Tr args = [tempf_name] args.extend(self.call_args) if w_resources: - res = self.read_resources() tmpresfold_n = join(self.tmpresfold, self.generate_unique_id()) if res: mkdir(tmpresfold_n, exist_ok = True) - for key in res: - value = res[key] - if key and value: - with open(join(tmpresfold_n, key), 'wb+') as f: - f.write(value['content']) + for file in self.archive.namelist(): + if file.startswith(self.resfold): self.archive.extract(file, join(tmpresfold_n, basename(file))) + del file args.append(tmpresfold_n) if autocall: if virtual: From 65c61ce6dd6a658b05afa49f7b9c0c03bbb1c3f7 Mon Sep 17 00:00:00 2001 From: VB PROGER <97066898+VBPROGER@users.noreply.github.com> Date: Wed, 17 May 2023 12:34:29 +0300 Subject: [PATCH 02/16] Fixed NameError --- programpack/__init__.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/programpack/__init__.py b/programpack/__init__.py index 0ee5d1b..38d70f4 100644 --- a/programpack/__init__.py +++ b/programpack/__init__.py @@ -94,11 +94,10 @@ def run(self, w_resources: bool = True, autocall: bool = True, delete: bool = Tr args.extend(self.call_args) if w_resources: tmpresfold_n = join(self.tmpresfold, self.generate_unique_id()) - if res: - mkdir(tmpresfold_n, exist_ok = True) - for file in self.archive.namelist(): - if file.startswith(self.resfold): self.archive.extract(file, join(tmpresfold_n, basename(file))) - del file + mkdir(tmpresfold_n, exist_ok = True) + for file in self.archive.namelist(): + if file.startswith(self.resfold): self.archive.extract(file, join(tmpresfold_n, basename(file))) + del file args.append(tmpresfold_n) if autocall: if virtual: From f4e4d519186ac95b2ed91bb402027b08f2c676e8 Mon Sep 17 00:00:00 2001 From: VBPROGER Date: Wed, 17 May 2023 12:54:46 +0300 Subject: [PATCH 03/16] Fixed directory copying bug --- programpack/__init__.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/programpack/__init__.py b/programpack/__init__.py index 38d70f4..a4211e1 100644 --- a/programpack/__init__.py +++ b/programpack/__init__.py @@ -95,9 +95,15 @@ def run(self, w_resources: bool = True, autocall: bool = True, delete: bool = Tr if w_resources: tmpresfold_n = join(self.tmpresfold, self.generate_unique_id()) mkdir(tmpresfold_n, exist_ok = True) - for file in self.archive.namelist(): - if file.startswith(self.resfold): self.archive.extract(file, join(tmpresfold_n, basename(file))) - del file + for current_file in self.archive.namelist(): + if current_file.startswith(self.resfold): + dest = join(tmpresfold_n, current_file.removeprefix(self.resfold)) + if current_file.endswith(sep): mkdir(dest, exist_ok = True) + else: + self.archive.extract(current_file, tmpresfold_n) + move_file(join(tmpresfold_n, current_file), join(tmpresfold_n, dest)) + rmtree(join(tmpresfold_n, 'Resources')) + del current_file args.append(tmpresfold_n) if autocall: if virtual: From 62e4ffeb4f3f8b26cc403bf99901c69bcd6f4ed9 Mon Sep 17 00:00:00 2001 From: VB PROGER <97066898+VBPROGER@users.noreply.github.com> Date: Wed, 17 May 2023 17:07:12 +0300 Subject: [PATCH 04/16] User -> Organization --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8ec8c50..e0430e4 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ This program will help you to pack your program. ## Cloning main branch Paste the following commands in terminal: ```bash -git clone https://github.com/VBPROGER/programpack.git +git clone https://github.com/ProgramPack/programpack.git cd programpack make sinstall && make sclean cd .. @@ -14,9 +14,9 @@ false && rm -rf programpack # Change "false" to "true" if you want to delete the If you want to receive newest (but experimental) branch then execute these commands in in the terminal: ```bash -git clone https://github.com/VBPROGER/programpack.git -b experimental && mv programpack programpack-exp-branch; +git clone https://github.com/ProgramPack/programpack.git -b experimental && mv programpack programpack-exp-branch; cd programpack-exp-branch; make sinstall && make sclean; cd ..; false && rm -rf programpack-exp-branch; # Change "false" to "true" if you want to delete the cloned repository -``` \ No newline at end of file +``` From b9b7b00b7d0b0a0eeb6f1964026e85aae84a7376 Mon Sep 17 00:00:00 2001 From: VB PROGER <97066898+VBPROGER@users.noreply.github.com> Date: Wed, 17 May 2023 18:47:05 +0300 Subject: [PATCH 05/16] Added hub API --- programpack/__init__.py | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/programpack/__init__.py b/programpack/__init__.py index a4211e1..6f74dce 100644 --- a/programpack/__init__.py +++ b/programpack/__init__.py @@ -9,18 +9,24 @@ from hashlib import sha256 from platform import system from warnings import warn +from requests import get as r_get __all__ = [ 'PackedProgram', 'convert_file_to_executable', 'deconvert', 'create_archive' ] __version__ = '0.0.1' -shebang = b'#!/usr/bin/env -S python3 -m programpack run\n' -shebang_v = b'#!/usr/bin/env -S python3 -m programpack run --virtual\n' -_empty = '' -_emptyb = b'' -_os = system().strip().lower() +shebang = b'#!/usr/bin/env -S python3 -m programpack run\n' +shebang_v = b'#!/usr/bin/env -S python3 -m programpack run --virtual\n' +_empty = '' +_emptyb = b'' +_os = system().strip().lower() +_server = 'https://github.com/ProgramPack/hub' +_request_base = '{}/raw/main/apps/'.format(_server) +_server_p_rbase = _server + _request_base +def _get_text(url): return r_get(url).text +def _get_json(url): return r_get(url).json() def _decode(b: bytes or bytearray) -> str: return b.decode('utf-8') def _PropertyBlocked(): raise RuntimeError('Property is privated; blocked') def _get_file_sha256(filename: str = ''): @@ -151,6 +157,7 @@ def update_icon(self, _clean: bool = False) -> bool: ) remove(tempf.name) return True +def generate_unique_id_local(name: str = 'unnamed', domain: str = 'com', author: str = 'unknown'): return '{}.{}.{}'.format(domain, author, name) def convert_file_to_executable(file_name: str = '', virtual: bool = False): '''Make the file executable by other programs''' chmod(file_name, 0o777) @@ -173,3 +180,10 @@ def get_manifest(file_name: str = '') -> dict or bool: program = PackedProgram(str(file_name).strip()) program.read() return program.manifest +def hub_get_id_by(name: str, domain: str, author: str, *args, **kwargs): return _server_p_rbase + generate_unique_id_local(name, domain, author, *args, **kwargs) + '.json' +def hub_get_meta(name: str, domain: str, author: str): return _get_json(hub_get_id_by(name, domain, author)) +def hub_download_s(name: str, domain: str, author: str): return _get_text(hub_get_meta(name, domain, author)) +def hub_download(output: str = 'download.propack', name: str, domain: str, author: str): + data = hub_download_s(name, domain, author) + with open(str(output).strip(), 'r+') as f: + f.write(data) From eb190208cf7ff39561e0f5dcf4bbd36fbb8cec45 Mon Sep 17 00:00:00 2001 From: VB PROGER <97066898+VBPROGER@users.noreply.github.com> Date: Wed, 17 May 2023 18:52:58 +0300 Subject: [PATCH 06/16] Fixed some bugs --- programpack/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/programpack/__init__.py b/programpack/__init__.py index 6f74dce..fcafa74 100644 --- a/programpack/__init__.py +++ b/programpack/__init__.py @@ -183,7 +183,7 @@ def get_manifest(file_name: str = '') -> dict or bool: def hub_get_id_by(name: str, domain: str, author: str, *args, **kwargs): return _server_p_rbase + generate_unique_id_local(name, domain, author, *args, **kwargs) + '.json' def hub_get_meta(name: str, domain: str, author: str): return _get_json(hub_get_id_by(name, domain, author)) def hub_download_s(name: str, domain: str, author: str): return _get_text(hub_get_meta(name, domain, author)) -def hub_download(output: str = 'download.propack', name: str, domain: str, author: str): +def hub_download(name: str, domain: str, author: str, output: str = 'download.propack'): data = hub_download_s(name, domain, author) - with open(str(output).strip(), 'r+') as f: + with open(str(output).strip(), 'rb+') as f: f.write(data) From c066c1ceb06d517a6a2a73ee2bd7d665a8cb5f0b Mon Sep 17 00:00:00 2001 From: VB PROGER <97066898+VBPROGER@users.noreply.github.com> Date: Wed, 17 May 2023 18:53:28 +0300 Subject: [PATCH 07/16] Added hub command --- programpack/__main__.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/programpack/__main__.py b/programpack/__main__.py index 8abcada..431f1d6 100644 --- a/programpack/__main__.py +++ b/programpack/__main__.py @@ -18,6 +18,12 @@ def pull_from_git(): except IndexError: argv2 = None try: argv3 = args[3] except IndexError: argv3 = None +try: argv4 = args[4] +except IndexError: argv4 = None +try: argv5 = args[5] +except IndexError: argv5 = None +try: argv6 = args[6] +except IndexError: argv6 = None help_message = '''--- ProgramPack --- Commands: @@ -44,7 +50,10 @@ def pull_from_git(): version See current version manifest - Print manifest of file''' + Print manifest of file + hub + hub download + Will download ProgramPack file by name, domain and author from hub.''' if 'help' in str(argv1): print(help_message) @@ -73,6 +82,16 @@ def pull_from_git(): elif argv1 == 'manifest': if argv2: print(propack.get_manifest(argv2), end = '') +elif argv1 == 'hub': + if argv2: + if argv2 == 'download': + if argv3 and argv4 and argv5: + propack.hub_download(argv3, argv4, argv5, argv6) + else: + print('usage: hub download [output]') + else: print('Unknown hub command. See --help') + else: + print('usage: hub <>') else: if len(args) <= 1: print('No args given. See --help.') else: print('Invalid arguments. See --help for more info.') From 4eeb43f48bad5900bfc462e76e9ac9f635222e2d Mon Sep 17 00:00:00 2001 From: VB PROGER <97066898+VBPROGER@users.noreply.github.com> Date: Wed, 17 May 2023 18:55:08 +0300 Subject: [PATCH 08/16] Added ['link'] --- programpack/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/programpack/__init__.py b/programpack/__init__.py index fcafa74..952b4f0 100644 --- a/programpack/__init__.py +++ b/programpack/__init__.py @@ -182,7 +182,7 @@ def get_manifest(file_name: str = '') -> dict or bool: return program.manifest def hub_get_id_by(name: str, domain: str, author: str, *args, **kwargs): return _server_p_rbase + generate_unique_id_local(name, domain, author, *args, **kwargs) + '.json' def hub_get_meta(name: str, domain: str, author: str): return _get_json(hub_get_id_by(name, domain, author)) -def hub_download_s(name: str, domain: str, author: str): return _get_text(hub_get_meta(name, domain, author)) +def hub_download_s(name: str, domain: str, author: str): return _get_text(hub_get_meta(name, domain, author)['link']) def hub_download(name: str, domain: str, author: str, output: str = 'download.propack'): data = hub_download_s(name, domain, author) with open(str(output).strip(), 'rb+') as f: From 49e7acb72dbe5eb0ea8a1ce9e4d442bba27718ac Mon Sep 17 00:00:00 2001 From: VB PROGER <97066898+VBPROGER@users.noreply.github.com> Date: Wed, 17 May 2023 18:58:41 +0300 Subject: [PATCH 09/16] Create manifest.json for blankapp --- examples/blankapp/manifest.json | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 examples/blankapp/manifest.json diff --git a/examples/blankapp/manifest.json b/examples/blankapp/manifest.json new file mode 100644 index 0000000..3558626 --- /dev/null +++ b/examples/blankapp/manifest.json @@ -0,0 +1,7 @@ +{ + "name": "blank", + "description": "Application that does nothing", + "author": "VBPROGER", + "version": "1.0.0", + "mainfile": "App" +} From 6ca08292b7c1efb7cd4e6c93e84503a97ecdfbb7 Mon Sep 17 00:00:00 2001 From: VB PROGER <97066898+VBPROGER@users.noreply.github.com> Date: Wed, 17 May 2023 18:58:59 +0300 Subject: [PATCH 10/16] Create App for blankapp --- examples/blankapp/App | 1 + 1 file changed, 1 insertion(+) create mode 100644 examples/blankapp/App diff --git a/examples/blankapp/App b/examples/blankapp/App new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/examples/blankapp/App @@ -0,0 +1 @@ + From 257ce77ed0748f099e5b81b3377eb36b2185720f Mon Sep 17 00:00:00 2001 From: VB PROGER <97066898+VBPROGER@users.noreply.github.com> Date: Wed, 17 May 2023 19:03:18 +0300 Subject: [PATCH 11/16] Added `blank.propack` file to examples --- examples/blank.propack | Bin 0 -> 476 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 examples/blank.propack diff --git a/examples/blank.propack b/examples/blank.propack new file mode 100644 index 0000000000000000000000000000000000000000..5d5ed6f9002259c407aa2c1691dcfe3cec1322fe GIT binary patch literal 476 zcmY#Z)GsYA(of3F(@)JSQ_u}oD5xyS$j>uY(9KmSD9TSSO3W=tOwLv)D$P^S)h){` zDk)9O;R^6(X5nH0fuiXf!@vwE!OS4T;8;))8p6rI{NiUy%4Z-ht>9*0WO>ERzyKyd znni%hIT#9onu}ic=H&xSsX=OiTA1 zxf7zQ&AN2SoFjX3RAoC7ys`?50@EBl)9U0r&TU+vpl)m_cqCNgq=!zR$4P(PuoI{C zPo6mA-Tu;3NB86jeI`x*VlIwP<>kChC#NhG6Lt1Ax?+66xS{j8TH3Rvsn3=;tqpjz z>M0XLfHxzP95XIYOF+HPz_6te!~_QcD Date: Sun, 4 Jun 2023 16:56:20 +0300 Subject: [PATCH 12/16] Fixed major bug & fixed example & fixed manifest --- Makefile | 2 +- examples/blank.propack | Bin 476 -> 452 bytes examples/blankapp/App | 2 +- examples/blankapp/manifest.json | 2 +- programpack/__init__.py | 11 ++++++----- programpack/__main__.py | 4 ++-- 6 files changed, 11 insertions(+), 10 deletions(-) mode change 100644 => 100755 examples/blank.propack diff --git a/Makefile b/Makefile index 7b19fff..8658d6c 100644 --- a/Makefile +++ b/Makefile @@ -15,4 +15,4 @@ sclean: rm -rf build rm -rf dist sgeneratechangelog: - git log --pretty="- %s" > CHANGELOG.md + git log --pretty="- %s" > CHANGELOG.md \ No newline at end of file diff --git a/examples/blank.propack b/examples/blank.propack old mode 100644 new mode 100755 index 5d5ed6f9002259c407aa2c1691dcfe3cec1322fe..f15265626eec95e9f011c11ed7b1e231efa100a1 GIT binary patch delta 312 zcmcb^e1v&|P6AheH!}+tGXoHmw;c(yQWu;m3}k~aNYJsMKv_}0w75t=DKk$$HLpw| zDX};Mq(=lO&B0Iw)U*3(>&rZ#+9^QH3&gpJd6{Xc#U*-K#rb&?cjwfzG6Z-tGTAfZ zvPK1{2?P`xwlsohpru?43Lq8(BZCA(gP!o_*VAq?qSFvVak&FwsPC3W6QEHj&O$by g!N-0(*nF?VgCH8l5AbGX1G#|-2)6*~vmg!w03wJ?o&W#< literal 476 zcmY#Z)GsYA(of3F(@)JSQ_u}oD5xyS$j>uY(9KmSD9TSSO3W=tOwLv)D$P^S)h){` zDk)9O;R^6(X5nH0fuiXf!@vwE!OS4T;8;))8p6rI{NiUy%4Z-ht>9*0WO>ERzyKyd znni%hIT#9onu}ic=H&xSsX=OiTA1 zxf7zQ&AN2SoFjX3RAoC7ys`?50@EBl)9U0r&TU+vpl)m_cqCNgq=!zR$4P(PuoI{C zPo6mA-Tu;3NB86jeI`x*VlIwP<>kChC#NhG6Lt1Ax?+66xS{j8TH3Rvsn3=;tqpjz z>M0XLfHxzP95XIYOF+HPz_6te!~_QcD str: return b.decode('utf-8') def _PropertyBlocked(): raise RuntimeError('Property is privated; blocked') def _get_file_sha256(filename: str = ''): @@ -185,5 +185,6 @@ def hub_get_meta(name: str, domain: str, author: str): return _get_json(hub_get_ def hub_download_s(name: str, domain: str, author: str): return _get_text(hub_get_meta(name, domain, author)['link']) def hub_download(name: str, domain: str, author: str, output: str = 'download.propack'): data = hub_download_s(name, domain, author) - with open(str(output).strip(), 'rb+') as f: + with open(str(output).strip(), 'w+') as f: f.write(data) + chmod(output, 0o777) \ No newline at end of file diff --git a/programpack/__main__.py b/programpack/__main__.py index 431f1d6..5a0fb49 100644 --- a/programpack/__main__.py +++ b/programpack/__main__.py @@ -52,7 +52,7 @@ def pull_from_git(): manifest Print manifest of file hub - hub download + hub download Will download ProgramPack file by name, domain and author from hub.''' if 'help' in str(argv1): @@ -86,7 +86,7 @@ def pull_from_git(): if argv2: if argv2 == 'download': if argv3 and argv4 and argv5: - propack.hub_download(argv3, argv4, argv5, argv6) + propack.hub_download(argv3, argv4, argv5, argv6 or 'output.txt') else: print('usage: hub download [output]') else: print('Unknown hub command. See --help') From a2c3f7d7e619684c21f8d0109ecb0b3e3f84b8a7 Mon Sep 17 00:00:00 2001 From: VBPROGER Date: Sun, 4 Jun 2023 17:09:26 +0300 Subject: [PATCH 13/16] Updated test & fixed `rmtree` bug --- programpack/__init__.py | 4 ++-- test/test.py | 9 ++++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/programpack/__init__.py b/programpack/__init__.py index 32a8213..4cb8eb4 100644 --- a/programpack/__init__.py +++ b/programpack/__init__.py @@ -108,7 +108,7 @@ def run(self, w_resources: bool = True, autocall: bool = True, delete: bool = Tr else: self.archive.extract(current_file, tmpresfold_n) move_file(join(tmpresfold_n, current_file), join(tmpresfold_n, dest)) - rmtree(join(tmpresfold_n, 'Resources')) + rmtree(join(tmpresfold_n, 'Resources'), ignore_errors = True) del current_file args.append(tmpresfold_n) if autocall: @@ -187,4 +187,4 @@ def hub_download(name: str, domain: str, author: str, output: str = 'download.pr data = hub_download_s(name, domain, author) with open(str(output).strip(), 'w+') as f: f.write(data) - chmod(output, 0o777) \ No newline at end of file + chmod(output, 0o777) diff --git a/test/test.py b/test/test.py index a6f66bb..d74b81a 100755 --- a/test/test.py +++ b/test/test.py @@ -1,15 +1,22 @@ #!/usr/bin/env python3 import unittest, pydoc, zipfile +from os import getcwd, chdir +from os.path import join as join_paths propack = pydoc.importfile('programpack/__init__.py') class TestProgramPack(unittest.TestCase): def setUp(self): self.propack = propack def test_PackedProgram(self): + captured_dir = join_paths(getcwd()) + chdir(captured_dir) + program = self.propack.PackedProgram('test/testapp.propack') program.read() program.run() program.close() + chdir(captured_dir) + program = self.propack.PackedProgram('test/also_testing.propack') program.read() program.update_icon() @@ -17,4 +24,4 @@ def test_PackedProgram(self): program.close() if __name__ == '__main__': - unittest.main() \ No newline at end of file + unittest.main() From 2f40c38aa46e90e4b082dffd6ea1b5ce43f201ab Mon Sep 17 00:00:00 2001 From: VB PROGER <97066898+VBPROGER@users.noreply.github.com> Date: Sun, 4 Jun 2023 17:13:41 +0300 Subject: [PATCH 14/16] Added requirements.txt autoload --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index eea1a78..4832c38 100755 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ version = '0.0.1', author = 'VBPROGER', py_modules = ['programpack'], - install_requires = [], + install_requires = [open('requirements.txt', 'r+').read()], packages = find_packages(), python_requires = '>=3.10', ) From e270bc4b4d08a34d9bc74b1c125bbc2e5eddd695 Mon Sep 17 00:00:00 2001 From: VB PROGER <97066898+VBPROGER@users.noreply.github.com> Date: Sun, 4 Jun 2023 17:15:23 +0300 Subject: [PATCH 15/16] Create requirements.txt --- requirements.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..0eb8cae --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +requests>=2.31.0 From e90c457c00fab9461f8feeaf1d997df6a70ab363 Mon Sep 17 00:00:00 2001 From: VB PROGER <97066898+VBPROGER@users.noreply.github.com> Date: Sun, 4 Jun 2023 17:17:56 +0300 Subject: [PATCH 16/16] Removed Python 3.8 as it doesn't work --- .github/workflows/python-package.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 6842659..1124e3e 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -16,7 +16,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.8", "3.9", "3.10"] + python-version: ["3.9", "3.10"] steps: - uses: actions/checkout@v3