hoverpower 1.0.4__tar.gz → 1.2.0__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.
Files changed (32) hide show
  1. {hoverpower-1.0.4 → hoverpower-1.2.0}/PKG-INFO +1 -1
  2. {hoverpower-1.0.4 → hoverpower-1.2.0}/hoverpower/data.py +20 -6
  3. {hoverpower-1.0.4 → hoverpower-1.2.0}/hoverpower/generator.py +2 -1
  4. {hoverpower-1.0.4 → hoverpower-1.2.0}/hoverpower/path.py +81 -20
  5. hoverpower-1.2.0/hoverpower/repo/__init__.py +0 -0
  6. {hoverpower-1.0.4 → hoverpower-1.2.0}/hoverpower/secret.py +2 -3
  7. {hoverpower-1.0.4 → hoverpower-1.2.0}/hoverpower.egg-info/PKG-INFO +1 -1
  8. {hoverpower-1.0.4 → hoverpower-1.2.0}/hoverpower.egg-info/SOURCES.txt +2 -0
  9. {hoverpower-1.0.4 → hoverpower-1.2.0}/hoverpower.egg-info/entry_points.txt +1 -0
  10. {hoverpower-1.0.4 → hoverpower-1.2.0}/pyproject.toml +45 -27
  11. {hoverpower-1.0.4 → hoverpower-1.2.0}/tests/test_cli.py +2 -2
  12. hoverpower-1.2.0/tests/test_path.py +54 -0
  13. {hoverpower-1.0.4 → hoverpower-1.2.0}/LICENSE +0 -0
  14. {hoverpower-1.0.4 → hoverpower-1.2.0}/README +0 -0
  15. {hoverpower-1.0.4 → hoverpower-1.2.0}/hoverpower/__init__.py +0 -0
  16. {hoverpower-1.0.4 → hoverpower-1.2.0}/hoverpower/__main__.py +0 -0
  17. {hoverpower-1.0.4 → hoverpower-1.2.0}/hoverpower/cli/__init__.py +0 -0
  18. {hoverpower-1.0.4 → hoverpower-1.2.0}/hoverpower/cli/give.py +0 -0
  19. {hoverpower-1.0.4 → hoverpower-1.2.0}/hoverpower/hard.py +0 -0
  20. {hoverpower-1.0.4 → hoverpower-1.2.0}/hoverpower/info.py +0 -0
  21. {hoverpower-1.0.4 → hoverpower-1.2.0}/hoverpower/title.py +0 -0
  22. {hoverpower-1.0.4 → hoverpower-1.2.0}/hoverpower.egg-info/dependency_links.txt +0 -0
  23. {hoverpower-1.0.4 → hoverpower-1.2.0}/hoverpower.egg-info/requires.txt +0 -0
  24. {hoverpower-1.0.4 → hoverpower-1.2.0}/hoverpower.egg-info/top_level.txt +0 -0
  25. {hoverpower-1.0.4 → hoverpower-1.2.0}/setup.cfg +0 -0
  26. {hoverpower-1.0.4 → hoverpower-1.2.0}/tests/test_generator.py +0 -0
  27. {hoverpower-1.0.4 → hoverpower-1.2.0}/tests/test_give.py +0 -0
  28. {hoverpower-1.0.4 → hoverpower-1.2.0}/tests/test_hardcore.py +0 -0
  29. {hoverpower-1.0.4 → hoverpower-1.2.0}/tests/test_repository.py +0 -0
  30. {hoverpower-1.0.4 → hoverpower-1.2.0}/tests/test_resources.py +0 -0
  31. {hoverpower-1.0.4 → hoverpower-1.2.0}/tests/test_secret.py +0 -0
  32. {hoverpower-1.0.4 → hoverpower-1.2.0}/tests/test_title.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hoverpower
3
- Version: 1.0.4
3
+ Version: 1.2.0
4
4
  Author-email: Helmut Konrad Schewe <helmutus@outlook.com>
5
5
  License-Expression: MIT
6
6
  Project-URL: Homepage, https://github.com/anaticulae/hoverpower
@@ -15,10 +15,24 @@ import utilo
15
15
  import hoverpower
16
16
 
17
17
 
18
- def collect_folder():
19
- return [
20
- item.name for item in os.scandir(hoverpower.REPO) if not item.is_file()
21
- ]
18
+ def collect_folder() -> list:
19
+ """\
20
+ >>> collect_folder()
21
+ ['bachelor', ...'paper', 'tech']
22
+ """
23
+ files = os.scandir(hoverpower.STORE)
24
+ result = sorted(item.name for item in files if not no_folder(item))
25
+ return result
26
+
27
+
28
+ def no_folder(item) -> bool:
29
+ if item.is_file():
30
+ return True
31
+ if item.name.startswith('.'):
32
+ return True
33
+ if item.name == '__pycache__':
34
+ return True
35
+ return False
22
36
 
23
37
 
24
38
  def log_available_files(package: str):
@@ -34,7 +48,7 @@ def log_available_files(package: str):
34
48
  if package not in collected:
35
49
  utilo.error(f'package not available: {package}')
36
50
  sys.exit(utilo.FAILURE)
37
- featurepath = os.path.join(hoverpower.REPO, package)
51
+ featurepath = os.path.join(hoverpower.STORE, package)
38
52
  # TODO: add recursive feature packages
39
53
  for item in os.scandir(featurepath):
40
54
  utilo.log(f' {item.name}')
@@ -63,7 +77,7 @@ def copy_packages(matched: list, dest: str, merge: bool = False):
63
77
  def copy_package(package, dest):
64
78
  """If resource already exists and is unchanged, the file is not
65
79
  touched."""
66
- source = os.path.join(hoverpower.REPO, package)
80
+ source = os.path.join(hoverpower.STORE, package)
67
81
  utilo.copy_content(
68
82
  source,
69
83
  dest,
@@ -112,7 +112,8 @@ def install():
112
112
  if not package:
113
113
  utilo.error('could not install, define tests.conftest.PACKAGE')
114
114
  return
115
- utilotest.clean_install(resinf.configure.PROJECT, package)
115
+ # TODO: ADD INSTALL STEP LATER?
116
+ # utilotest.clean_install(resinf.configure.PROJECT, package)
116
117
  # run install hook after installing project
117
118
  install_after = conftest.install if hasattr(conftest, 'install') else None
118
119
  if not install_after:
@@ -7,18 +7,24 @@
7
7
  # be prosecuted under federal law. Its content is company confidential.
8
8
  # =============================================================================
9
9
 
10
+ import concurrent.futures
11
+ import importlib.metadata
12
+ import itertools
10
13
  import os
11
14
  import tarfile
15
+ import tomllib
12
16
 
13
17
  import requests
14
18
  import utilo
15
19
 
16
- import hoverpower
17
-
18
20
  # TMP = utilo.tmp(hoverpower.ROOT)
19
21
  TMP = utilo.join('/tmp/power') #nosec B108
20
22
 
21
- REPO = utilo.join(hoverpower.ROOT, 'hoverpower/repo', exist=True)
23
+ REPO = utilo.join(
24
+ os.path.join(os.path.dirname(__file__), '..'),
25
+ 'hoverpower/repo',
26
+ exist=True,
27
+ )
22
28
  STORE = os.getenv('HOVERPOWER_STORE', REPO)
23
29
 
24
30
  BACHELOR = utilo.join(STORE, 'bachelor')
@@ -32,8 +38,17 @@ ORDER = utilo.join(STORE, 'order')
32
38
  PAPER = utilo.join(STORE, 'paper')
33
39
  TECH = utilo.join(STORE, 'tech')
34
40
 
35
- SOURCE = 'https://raw.githubusercontent.com/anaticulae/'+\
36
- f'{hoverpower.PROCESS}/refs/tags/v{hoverpower.__version__}'
41
+ # https://github.com/anaticulae/hoverpower/releases/download/v1.0.2/master.tar.gz
42
+ SOURCE = 'https://github.com/anaticulae/hoverpower/releases/download/'+\
43
+ f'v{importlib.metadata.version("hoverpower")}/'
44
+
45
+ TIMEOUT_DOWNLOAD_SEC = 15
46
+ WORKER = utilo.parse_int(os.getenv('HOVERPOWER_DOWNLOAD_WORKER', '5'))
47
+
48
+ PACKAGES_DEFAULT = 'bachelor book diss docu habil home master order paper tech'
49
+ PACKAGES = os.getenv('HOVERPOWER_PACKAGES', PACKAGES_DEFAULT).strip().split()
50
+
51
+ PYPROJECT = 'pyproject.toml'
37
52
 
38
53
 
39
54
  def download() -> list:
@@ -49,28 +64,57 @@ def download() -> list:
49
64
  return result
50
65
 
51
66
 
52
- def download_package(package: str):
53
- os.makedirs(TMP, exist_ok=True)
54
- path = utilo.join(TMP, package)
55
- dl = utilo.join(TMP, '.' + package)
56
- if utilo.exists(path):
57
- utilo.log(f'already downloaded: {path}')
67
+ def download_packages():
68
+ root = STORE
69
+ packages = PACKAGES
70
+ if utilo.exists(utilo.join(root, PYPROJECT)):
71
+ # determine packages by tool.hoverpower.packages in pyproject.toml
72
+ packages = requires(root)
73
+ with concurrent.futures.ThreadPoolExecutor(max_workers=WORKER) as executor:
74
+ executor.map(
75
+ download_and_extract,
76
+ packages,
77
+ itertools.repeat(root),
78
+ )
79
+
80
+
81
+ def download_and_extract(package, root):
82
+ tar = download_package(package, root=root)
83
+ if not tar:
58
84
  return
59
- url = SOURCE
85
+ outpath = utilo.join(root, package)
86
+ utilo.log(f'untar: {tar} {outpath}')
87
+ untar(
88
+ source=tar,
89
+ outpath=outpath,
90
+ )
91
+ utilo.log()
92
+
93
+
94
+ def download_package(package: str, root=TMP):
95
+ utilo.debug(f'store: {root}')
96
+ os.makedirs(root, exist_ok=True)
97
+ path = utilo.join(root, package)
98
+ dl = utilo.join(root, f'{package}.tar.gz')
99
+ if utilo.exists(path):
100
+ utilo.log(f'already downloaded: {path}\n')
101
+ return None
102
+ url = f'{SOURCE}{package}.tar.gz'
60
103
  data = download_file(url)
61
104
  if not data:
62
105
  utilo.error(f'invalid download: {path}')
63
- return
64
- utilo.file_create_binary(dl, content=data)
106
+ return None
107
+ utilo.file_replace_binary(dl, content=data)
65
108
  os.makedirs(path)
66
- utilo.log(f'extracted: {package}')
109
+ utilo.log(f'downloaded: {package}')
110
+ return dl
67
111
 
68
112
 
69
- def untar(path, data):
70
- with tarfile.open(data) as tar:
113
+ def untar(source, outpath):
114
+ with tarfile.open(source, mode='r:gz') as tar:
71
115
  tar.extractall( #nosec B202
72
- path=path,
73
- members=safe_members(tar, path),
116
+ path=outpath,
117
+ # members=safe_members(tar, outpath),
74
118
  )
75
119
 
76
120
 
@@ -88,7 +132,7 @@ def download_file(url: str) -> bytes:
88
132
  try:
89
133
  response = requests.get(
90
134
  url,
91
- timeout=5000,
135
+ timeout=TIMEOUT_DOWNLOAD_SEC,
92
136
  )
93
137
  except requests.HTTPError as msg:
94
138
  utilo.error(msg)
@@ -102,6 +146,23 @@ def download_file(url: str) -> bytes:
102
146
  return data
103
147
 
104
148
 
149
+ def requires(root: str) -> tuple:
150
+ project = utilo.join(root, PYPROJECT)
151
+ if not utilo.exists(project):
152
+ return tuple()
153
+ with open(project, "rb") as f:
154
+ data = tomllib.load(f)
155
+ try:
156
+ result = data['tool']['hoverpower']['packages']
157
+ except KeyError:
158
+ utilo.error(f'invalid tool.hoverpower.packages: {data}')
159
+ return ()
160
+ result = utilo.sort(*result)
161
+ result = utilo.lower(*result)
162
+ result: tuple = tuple(result)
163
+ return result
164
+
165
+
105
166
  def bachelor(value: str, local: bool = True) -> str:
106
167
  name = f'bachelor{value}.pdf'
107
168
  if local:
File without changes
@@ -60,8 +60,7 @@ def make_private():
60
60
 
61
61
 
62
62
  def make_public():
63
- utilo.log(f'source: {hoverpower.path.STORE}')
64
- utilo.log(f'write to public path: {hoverpower.path.TMP}')
63
+ utilo.log(f'store: {hoverpower.path.STORE}')
65
64
  for source in hoverpower.path.RESOURCES:
66
65
  if 'https://' in source:
67
66
  continue
@@ -102,7 +101,7 @@ def ensure_parant(source: str):
102
101
  fname = utilo.file_name(source, ext=True)
103
102
  # bachelor124.pdfs => bachelor/bachelor124.pdf
104
103
  base = utilo.join(
105
- hoverpower.path.TMP,
104
+ hoverpower.path.STORE,
106
105
  re.split(r'(?=\d)', fname)[0],
107
106
  )
108
107
  os.makedirs(base, exist_ok=True)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hoverpower
3
- Version: 1.0.4
3
+ Version: 1.2.0
4
4
  Author-email: Helmut Konrad Schewe <helmutus@outlook.com>
5
5
  License-Expression: MIT
6
6
  Project-URL: Homepage, https://github.com/anaticulae/hoverpower
@@ -18,10 +18,12 @@ hoverpower.egg-info/requires.txt
18
18
  hoverpower.egg-info/top_level.txt
19
19
  hoverpower/cli/__init__.py
20
20
  hoverpower/cli/give.py
21
+ hoverpower/repo/__init__.py
21
22
  tests/test_cli.py
22
23
  tests/test_generator.py
23
24
  tests/test_give.py
24
25
  tests/test_hardcore.py
26
+ tests/test_path.py
25
27
  tests/test_repository.py
26
28
  tests/test_resources.py
27
29
  tests/test_secret.py
@@ -2,5 +2,6 @@
2
2
  give = hoverpower.cli.give:main
3
3
  power = hoverpower.cli:main
4
4
  powerdecrypt = hoverpower.secret:make_public
5
+ powerdownload = hoverpower.path:download_packages
5
6
  powerencrypt = hoverpower.secret:make_private
6
7
  powersecret = hoverpower.secret:create_secret
@@ -1,73 +1,91 @@
1
1
  [project]
2
2
  name = "hoverpower"
3
- version = "1.0.4"
3
+ version = "1.2.0"
4
4
  description = ""
5
- readme = {file = "README", content-type = "text/markdown"}
6
5
  requires-python = ">=3.12"
7
6
  authors = [
8
- {name = "Helmut Konrad Schewe", email = "helmutus@outlook.com"}
7
+ { name = "Helmut Konrad Schewe", email = "helmutus@outlook.com" },
9
8
  ]
10
-
11
9
  dependencies = [
12
10
  "resinf>=1.0.2,<2.0.0",
13
11
  "jamer>=1.0.0,<2.0.0",
14
12
  "utilo>=2.107.4,<3.0.0",
15
13
  "cryptography>=38.0.0,<47.0.0",
16
14
  ]
17
-
18
- # Optional but recommended metadata
19
15
  keywords = []
20
16
  classifiers = [
21
- 'Programming Language :: Python :: 3.12',
22
- 'Programming Language :: Python :: 3.13',
23
- 'Programming Language :: Python :: 3.14',
17
+ "Programming Language :: Python :: 3.12",
18
+ "Programming Language :: Python :: 3.13",
19
+ "Programming Language :: Python :: 3.14",
24
20
  ]
25
21
  license = "MIT"
26
- license-files = ["LICENSE"]
22
+ license-files = [
23
+ "LICENSE",
24
+ ]
25
+
26
+ [project.readme]
27
+ file = "README"
28
+ content-type = "text/markdown"
27
29
 
28
30
  [project.optional-dependencies]
29
31
  dev = [
30
32
  "utilotest>=1.0.1,<2.0.0",
31
- # hardcore==0.9.0
32
33
  "pdflog==1.0.2",
33
- # extract all pdf
34
- # rawmaker>=2.40.2<3.0.0
35
34
  ]
36
35
 
37
36
  [project.urls]
38
37
  Homepage = "https://github.com/anaticulae/hoverpower"
39
38
  Repository = "https://github.com/anaticulae/hoverpower"
40
39
 
40
+ [project.scripts]
41
+ give = "hoverpower.cli.give:main"
42
+ power = "hoverpower.cli:main"
43
+ powersecret = "hoverpower.secret:create_secret"
44
+ powerencrypt = "hoverpower.secret:make_private"
45
+ powerdecrypt = "hoverpower.secret:make_public"
46
+ powerdownload = "hoverpower.path:download_packages"
47
+
41
48
  [build-system]
42
49
  requires = [
43
50
  "setuptools>=82.0.1",
44
- "wheel>=0.46.3"
51
+ "wheel>=0.46.3",
45
52
  ]
46
53
  build-backend = "setuptools.build_meta"
47
54
 
48
55
  [tool.semantic_release]
49
- version_toml = ["pyproject.toml:project.version"]
50
- [tool.semantic_release.changelog.default_templates]
51
- changelog_file = "CHANGELOG"
56
+ version_toml = [
57
+ "pyproject.toml:project.version",
58
+ ]
59
+
52
60
  [tool.semantic_release.changelog]
53
61
  mode = "init"
54
62
  output_format = "md"
55
- [tool.semantic_release.commit_parser_options]
56
- # allways generate a new version
57
- patch_tags = ["fix", "perf", "build", "chore", "ci", "docs", "style", "refactor", "test", "deps"]
58
63
 
59
- [project.scripts]
60
- give = "hoverpower.cli.give:main"
61
- power = "hoverpower.cli:main"
62
- powersecret = "hoverpower.secret:create_secret"
63
- powerencrypt = "hoverpower.secret:make_private"
64
- powerdecrypt = "hoverpower.secret:make_public"
64
+ [tool.semantic_release.changelog.default_templates]
65
+ changelog_file = "CHANGELOG"
66
+
67
+ [tool.semantic_release.commit_parser_options]
68
+ patch_tags = [
69
+ "fix",
70
+ "perf",
71
+ "build",
72
+ "chore",
73
+ "ci",
74
+ "docs",
75
+ "style",
76
+ "refactor",
77
+ "test",
78
+ "deps",
79
+ ]
65
80
 
66
81
  [tool.setuptools.packages.find]
67
- where = ["."]
82
+ where = [
83
+ ".",
84
+ ]
68
85
  include = [
69
86
  "hoverpower",
70
87
  "hoverpower.cli",
88
+ "hoverpower.repo",
71
89
  ]
72
90
  exclude = [
73
91
  "tests/*",
@@ -14,6 +14,7 @@ import utilotest
14
14
 
15
15
  import hoverpower
16
16
  import hoverpower.cli
17
+ import hoverpower.data
17
18
  import tests
18
19
 
19
20
 
@@ -87,8 +88,7 @@ def test_cli_all(td, mp):
87
88
  cmd='--all',
88
89
  mp=mp,
89
90
  )
90
- # Subtract README.md => -1
91
- expected = tests.foldersize(hoverpower.REPO) - 1
91
+ expected = len(hoverpower.data.collect_folder())
92
92
  assert tests.foldersize(td.tmpdir) == expected, f'{td.tmpdir} is empty'
93
93
 
94
94
 
@@ -0,0 +1,54 @@
1
+ import utilo
2
+
3
+ import hoverpower.path
4
+
5
+ PROJECT = """\
6
+ [build-system]
7
+ requires = [
8
+ "setuptools>=82.0.1",
9
+ "wheel>=0.47.0",
10
+ ]
11
+ build-backend = "setuptools.build_meta"
12
+
13
+ [project]
14
+ name = "genex"
15
+ version = "0.40.0"
16
+ description = ""
17
+ requires-python = ">=3.12"
18
+ authors = [
19
+ { name = "Helmut Konrad Schewe", email = "helmutus@outlook.com" },
20
+ ]
21
+
22
+ [project.readme]
23
+ file = "README"
24
+ content-type = "text/markdown"
25
+
26
+ [project.optional-dependencies]
27
+ dev = [
28
+ "utilotest>=1.0.4,<2.0.0",
29
+ "hoverpower>=1.1.0,<2.0.0",
30
+ ]
31
+
32
+ [tool.hoverpower]
33
+ packages = [
34
+ "BACHELOR",
35
+ "DOCU",
36
+ "HOME",
37
+ ]
38
+
39
+ """
40
+
41
+
42
+ def test_project_requires(td):
43
+ project = utilo.join(td.tmpdir, 'pyproject.toml')
44
+ utilo.file_create(project, PROJECT)
45
+ requires = hoverpower.path.requires(root=td.tmpdir)
46
+ assert requires
47
+
48
+
49
+ def test_project_requires_invalid_config(td):
50
+ project = utilo.join(td.tmpdir, 'pyproject.toml')
51
+ data = PROJECT.replace('packages = [', 'pack = [')
52
+ utilo.file_create(project, data)
53
+ requires = hoverpower.path.requires(root=td.tmpdir)
54
+ assert not requires
File without changes
File without changes
File without changes