pysfi 0.1.6__tar.gz → 0.1.10__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 (64) hide show
  1. {pysfi-0.1.6 → pysfi-0.1.10}/PKG-INFO +28 -3
  2. {pysfi-0.1.6 → pysfi-0.1.10}/README.md +99 -99
  3. pysfi-0.1.10/examples/pack_demo/README.md +77 -0
  4. {pysfi-0.1.6 → pysfi-0.1.10}/pyproject.toml +31 -15
  5. {pysfi-0.1.6 → pysfi-0.1.10}/sfi/__init__.py +1 -1
  6. {pysfi-0.1.6 → pysfi-0.1.10}/sfi/bumpversion/__init__.py +1 -1
  7. pysfi-0.1.10/sfi/cli.py +11 -0
  8. pysfi-0.1.10/sfi/docscan/README.md +813 -0
  9. pysfi-0.1.10/sfi/docscan/__init__.py +3 -0
  10. pysfi-0.1.10/sfi/docscan/docscan.py +1145 -0
  11. pysfi-0.1.10/sfi/docscan/docscan_gui.py +1282 -0
  12. pysfi-0.1.10/sfi/docscan/lang/eng.py +152 -0
  13. pysfi-0.1.10/sfi/docscan/lang/zhcn.py +170 -0
  14. pysfi-0.1.10/sfi/docscan/tests/__init__.py +1 -0
  15. pysfi-0.1.10/sfi/docscan/tests/test_benchmark.py +427 -0
  16. pysfi-0.1.10/sfi/docscan/tests/test_docscan.py +1245 -0
  17. pysfi-0.1.10/sfi/docscan/tests/test_enhanced.py +267 -0
  18. {pysfi-0.1.6 → pysfi-0.1.10}/sfi/embedinstall/embedinstall.py +77 -17
  19. {pysfi-0.1.6 → pysfi-0.1.10}/sfi/makepython/makepython.py +44 -27
  20. {pysfi-0.1.6 → pysfi-0.1.10}/sfi/pdfsplit/pdfsplit.py +173 -173
  21. pysfi-0.1.10/sfi/pdfsplit/tests/__init__.py +0 -0
  22. pysfi-0.1.10/sfi/projectparse/__init__.py +0 -0
  23. pysfi-0.1.10/sfi/pylibpack/README.md +102 -0
  24. pysfi-0.1.10/sfi/pylibpack/__init__.py +0 -0
  25. pysfi-0.1.10/sfi/pylibpack/pylibpack.py +913 -0
  26. pysfi-0.1.10/sfi/pyloadergen/__init__.py +0 -0
  27. {pysfi-0.1.6 → pysfi-0.1.10}/sfi/pyloadergen/pyloadergen.py +697 -111
  28. pysfi-0.1.10/sfi/pyloadergen/tests/__init__.py +0 -0
  29. pysfi-0.1.10/sfi/pyloadergen/tests/test_benchmark.py +235 -0
  30. {pysfi-0.1.6 → pysfi-0.1.10}/sfi/pyloadergen/tests/test_pyloadergen.py +211 -36
  31. pysfi-0.1.10/sfi/pypack/README.md +292 -0
  32. pysfi-0.1.10/sfi/pypack/__init__.py +0 -0
  33. pysfi-0.1.10/sfi/pypack/pypack.py +791 -0
  34. pysfi-0.1.10/sfi/pypack/tests/__init__.py +0 -0
  35. pysfi-0.1.10/sfi/pypack/tests/test_pack.py +257 -0
  36. pysfi-0.1.10/sfi/pysourcepack/README.md +201 -0
  37. pysfi-0.1.10/sfi/pysourcepack/pysourcepack.py +369 -0
  38. pysfi-0.1.10/sfi/taskkill/__init__.py +0 -0
  39. pysfi-0.1.10/sfi/which/__init__.py +0 -0
  40. pysfi-0.1.10/sfi/workflowengine/README.md +0 -0
  41. pysfi-0.1.10/sfi/workflowengine/__init__.py +0 -0
  42. pysfi-0.1.10/sfi/workflowengine/tests/__init__.py +1 -0
  43. pysfi-0.1.10/sfi/workflowengine/tests/test_benchmark.py +725 -0
  44. pysfi-0.1.10/sfi/workflowengine/tests/test_workflowengine.py +740 -0
  45. pysfi-0.1.10/sfi/workflowengine/workflowengine.py +444 -0
  46. pysfi-0.1.6/sfi/pypacker/fspacker.py +0 -91
  47. {pysfi-0.1.6 → pysfi-0.1.10}/.gitignore +0 -0
  48. {pysfi-0.1.6 → pysfi-0.1.10}/sfi/alarmclock/__init__.py +0 -0
  49. {pysfi-0.1.6 → pysfi-0.1.10}/sfi/alarmclock/alarmclock.py +0 -0
  50. {pysfi-0.1.6 → pysfi-0.1.10}/sfi/bumpversion/README.md +0 -0
  51. {pysfi-0.1.6 → pysfi-0.1.10}/sfi/bumpversion/bumpversion.py +0 -0
  52. {pysfi-0.1.6 → pysfi-0.1.10}/sfi/bumpversion/tests/__init__.py +0 -0
  53. {pysfi-0.1.6 → pysfi-0.1.10}/sfi/bumpversion/tests/test_bumpversion.py +0 -0
  54. {pysfi-0.1.6/sfi/filedate → pysfi-0.1.10/sfi/docscan/lang}/__init__.py +0 -0
  55. {pysfi-0.1.6/sfi/makepython → pysfi-0.1.10/sfi/embedinstall}/__init__.py +0 -0
  56. {pysfi-0.1.6 → pysfi-0.1.10}/sfi/filedate/README.md +0 -0
  57. {pysfi-0.1.6/sfi/pdfsplit/tests → pysfi-0.1.10/sfi/filedate}/__init__.py +0 -0
  58. {pysfi-0.1.6 → pysfi-0.1.10}/sfi/filedate/filedate.py +0 -0
  59. {pysfi-0.1.6/sfi/pyloadergen → pysfi-0.1.10/sfi/makepython}/__init__.py +0 -0
  60. {pysfi-0.1.6/sfi/pyloadergen/tests → pysfi-0.1.10/sfi/pdfsplit}/__init__.py +0 -0
  61. {pysfi-0.1.6 → pysfi-0.1.10}/sfi/pdfsplit/tests/test_pdfsplit.py +0 -0
  62. {pysfi-0.1.6 → pysfi-0.1.10}/sfi/projectparse/projectparse.py +0 -0
  63. {pysfi-0.1.6 → pysfi-0.1.10}/sfi/taskkill/taskkill.py +0 -0
  64. {pysfi-0.1.6 → pysfi-0.1.10}/sfi/which/which.py +0 -0
@@ -1,13 +1,38 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pysfi
3
- Version: 0.1.6
3
+ Version: 0.1.10
4
4
  Summary: Single File commands for Interactive python.
5
5
  Requires-Python: >=3.8
6
6
  Requires-Dist: tomli>=2.4.0; python_version < '3.11'
7
7
  Provides-Extra: all
8
+ Requires-Dist: ebooklib>=0.18; extra == 'all'
9
+ Requires-Dist: markdown>=3.5; extra == 'all'
10
+ Requires-Dist: odfpy>=1.4.1; extra == 'all'
11
+ Requires-Dist: openpyxl>=3.1.0; extra == 'all'
12
+ Requires-Dist: pillow>=10.0.0; extra == 'all'
8
13
  Requires-Dist: pymupdf>=1.24.11; extra == 'all'
14
+ Requires-Dist: pypdf>=3.0.0; extra == 'all'
15
+ Requires-Dist: pyside2-stubs>=5.15.2.1.2; extra == 'all'
16
+ Requires-Dist: pyside2>=5.15.2.1; extra == 'all'
17
+ Requires-Dist: pytesseract>=0.3.10; extra == 'all'
18
+ Requires-Dist: python-docx>=1.1.0; extra == 'all'
19
+ Requires-Dist: python-pptx>=0.6.21; extra == 'all'
20
+ Provides-Extra: extra
21
+ Requires-Dist: ebooklib>=0.18; extra == 'extra'
22
+ Requires-Dist: markdown>=3.5; extra == 'extra'
23
+ Requires-Dist: odfpy>=1.4.1; extra == 'extra'
24
+ Requires-Dist: pypdf>=3.0.0; extra == 'extra'
25
+ Provides-Extra: gui
26
+ Requires-Dist: pyside2-stubs>=5.15.2.1.2; extra == 'gui'
27
+ Requires-Dist: pyside2>=5.15.2.1; extra == 'gui'
28
+ Provides-Extra: ocr
29
+ Requires-Dist: pillow>=10.0.0; extra == 'ocr'
30
+ Requires-Dist: pytesseract>=0.3.10; extra == 'ocr'
9
31
  Provides-Extra: office
32
+ Requires-Dist: openpyxl>=3.1.0; extra == 'office'
10
33
  Requires-Dist: pymupdf>=1.24.11; extra == 'office'
34
+ Requires-Dist: python-docx>=1.1.0; extra == 'office'
35
+ Requires-Dist: python-pptx>=0.6.21; extra == 'office'
11
36
  Description-Content-Type: text/markdown
12
37
 
13
38
  # pysfi
@@ -27,7 +52,7 @@ pysfi is a Python project that provides single-file command-line utilities, desi
27
52
  - **mkp**: Make Python project utilities
28
53
  - **projectparse**: Project parsing and analysis tools
29
54
  - **pyloadergen**: Python loader code generation
30
- - **pypacker**: Python packaging utilities
55
+ - **pypack**: Python packaging utilities
31
56
 
32
57
  ## Installation
33
58
 
@@ -97,7 +122,7 @@ pysfi/
97
122
  │ ├── pyloadergen.py
98
123
  │ ├── pyproject.toml
99
124
  │ └── __init__.py
100
- └── pypacker/ # pypacker command module
125
+ └── pypack/ # pypack command module
101
126
  ├── fspacker.py
102
127
  └── pyproject.toml
103
128
  ```
@@ -1,99 +1,99 @@
1
- # pysfi
2
-
3
- Single File commands for Interactive python.
4
-
5
- ## Overview
6
-
7
- pysfi is a Python project that provides single-file command-line utilities, designed to be lightweight and easy-to-use.
8
-
9
- ## Available Commands
10
-
11
- - **alarmclk**: Alarm clock functionality
12
- - **[bumpversion](sfi/bumpversion/README.md)**: Automated version number management tool
13
- - **embedinstall**: Embed installation utilities
14
- - **[filedate](sfi/filedate/README.md)**: A file date management tool that normalizes date prefixes in filenames
15
- - **mkp**: Make Python project utilities
16
- - **projectparse**: Project parsing and analysis tools
17
- - **pyloadergen**: Python loader code generation
18
- - **pypacker**: Python packaging utilities
19
-
20
- ## Installation
21
-
22
- ```bash
23
- # Install using uv (recommended)
24
- uv add pysfi
25
-
26
- # Or using pip
27
- pip install pysfi
28
- ```
29
-
30
- ## Development
31
-
32
- ### Requirements
33
-
34
- - Python >= 3.8
35
- - [uv](https://github.com/astral-sh/uv) (recommended) or pip
36
-
37
- ### Development Dependencies
38
-
39
- ```bash
40
- uv pip install -e ".[dev]"
41
- ```
42
-
43
- ### Code Standards
44
-
45
- The project uses Ruff for code linting and formatting:
46
-
47
- ```bash
48
- # Check code
49
- ruff check .
50
-
51
- # Format code
52
- ruff format .
53
- ```
54
-
55
- ## Project Structure
56
-
57
- ```bash
58
- pysfi/
59
- ├── pyproject.toml # Main project configuration
60
- ├── README.md
61
- └── sfi/
62
- ├── __init__.py
63
- ├── alarmclock/ # alarmclk command module
64
- │ ├── alarmclock.py
65
- │ ├── pyproject.toml
66
- │ └── __init__.py
67
- ├── embedinstall/ # embedinstall command module
68
- │ ├── embedinstall.py
69
- │ ├── pyproject.toml
70
- │ └── __init__.py
71
- ├── filedate/ # filedate command module
72
- │ ├── filedate.py
73
- │ ├── pyproject.toml
74
- │ ├── README.md # Detailed documentation
75
- │ └── __init__.py
76
- ├── makepython/ # mkp command module
77
- │ ├── makepython.py
78
- │ ├── pyproject.toml
79
- │ └── __init__.py
80
- ├── projectparse/ # projectparse command module
81
- │ ├── projectparse.py
82
- │ ├── pyproject.toml
83
- │ └── __init__.py
84
- ├── pyloadergen/ # pyloadergen command module
85
- │ ├── pyloadergen.py
86
- │ ├── pyproject.toml
87
- │ └── __init__.py
88
- └── pypacker/ # pypacker command module
89
- ├── fspacker.py
90
- └── pyproject.toml
91
- ```
92
-
93
- ## License
94
-
95
- MIT License
96
-
97
- ## Contributing
98
-
99
- Issues and Pull Requests are welcome!
1
+ # pysfi
2
+
3
+ Single File commands for Interactive python.
4
+
5
+ ## Overview
6
+
7
+ pysfi is a Python project that provides single-file command-line utilities, designed to be lightweight and easy-to-use.
8
+
9
+ ## Available Commands
10
+
11
+ - **alarmclk**: Alarm clock functionality
12
+ - **[bumpversion](sfi/bumpversion/README.md)**: Automated version number management tool
13
+ - **embedinstall**: Embed installation utilities
14
+ - **[filedate](sfi/filedate/README.md)**: A file date management tool that normalizes date prefixes in filenames
15
+ - **mkp**: Make Python project utilities
16
+ - **projectparse**: Project parsing and analysis tools
17
+ - **pyloadergen**: Python loader code generation
18
+ - **pypack**: Python packaging utilities
19
+
20
+ ## Installation
21
+
22
+ ```bash
23
+ # Install using uv (recommended)
24
+ uv add pysfi
25
+
26
+ # Or using pip
27
+ pip install pysfi
28
+ ```
29
+
30
+ ## Development
31
+
32
+ ### Requirements
33
+
34
+ - Python >= 3.8
35
+ - [uv](https://github.com/astral-sh/uv) (recommended) or pip
36
+
37
+ ### Development Dependencies
38
+
39
+ ```bash
40
+ uv pip install -e ".[dev]"
41
+ ```
42
+
43
+ ### Code Standards
44
+
45
+ The project uses Ruff for code linting and formatting:
46
+
47
+ ```bash
48
+ # Check code
49
+ ruff check .
50
+
51
+ # Format code
52
+ ruff format .
53
+ ```
54
+
55
+ ## Project Structure
56
+
57
+ ```bash
58
+ pysfi/
59
+ ├── pyproject.toml # Main project configuration
60
+ ├── README.md
61
+ └── sfi/
62
+ ├── __init__.py
63
+ ├── alarmclock/ # alarmclk command module
64
+ │ ├── alarmclock.py
65
+ │ ├── pyproject.toml
66
+ │ └── __init__.py
67
+ ├── embedinstall/ # embedinstall command module
68
+ │ ├── embedinstall.py
69
+ │ ├── pyproject.toml
70
+ │ └── __init__.py
71
+ ├── filedate/ # filedate command module
72
+ │ ├── filedate.py
73
+ │ ├── pyproject.toml
74
+ │ ├── README.md # Detailed documentation
75
+ │ └── __init__.py
76
+ ├── makepython/ # mkp command module
77
+ │ ├── makepython.py
78
+ │ ├── pyproject.toml
79
+ │ └── __init__.py
80
+ ├── projectparse/ # projectparse command module
81
+ │ ├── projectparse.py
82
+ │ ├── pyproject.toml
83
+ │ └── __init__.py
84
+ ├── pyloadergen/ # pyloadergen command module
85
+ │ ├── pyloadergen.py
86
+ │ ├── pyproject.toml
87
+ │ └── __init__.py
88
+ └── pypack/ # pypack command module
89
+ ├── fspacker.py
90
+ └── pyproject.toml
91
+ ```
92
+
93
+ ## License
94
+
95
+ MIT License
96
+
97
+ ## Contributing
98
+
99
+ Issues and Pull Requests are welcome!
@@ -0,0 +1,77 @@
1
+ # Pypack Demo
2
+
3
+ This is a demo application to showcase the pypack workflow packaging tool.
4
+
5
+ ## Installation
6
+
7
+ Ensure pypack is installed:
8
+
9
+ ```bash
10
+ cd sfi/pypack
11
+ pip install -e .
12
+ ```
13
+
14
+ ## Usage
15
+
16
+ ### Basic Build
17
+
18
+ ```bash
19
+ cd sfi/examples/pack_demo
20
+ pypack build
21
+ ```
22
+
23
+ This will:
24
+
25
+ 1. Parse the `pyproject.toml` file
26
+ 2. Pack the source code
27
+ 3. Install Python runtime
28
+ 4. Generate a console loader
29
+ 5. Assemble the final package
30
+
31
+ ### Advanced Build Options
32
+
33
+ ```bash
34
+ # Build with GUI loader
35
+ pypack build --loader-type gui
36
+
37
+ # Build with specific Python version
38
+ pypack build --python-version 3.11.5
39
+
40
+ # Skip loader generation (faster for development)
41
+ pypack build --no-loader
42
+
43
+ # Build with verbose logging
44
+ pypack build --debug
45
+ ```
46
+
47
+ ## Output
48
+
49
+ After successful build, the output will be in `dist/package/`:
50
+
51
+ ```
52
+ dist/package/
53
+ ├── src/ # Packed source code
54
+ ├── runtime/ # Python runtime
55
+ ├── main.exe # Generated loader
56
+ └── metadata.json # Package metadata
57
+ ```
58
+
59
+ ## Running the Packaged Application
60
+
61
+ Run the generated loader:
62
+
63
+ ```bash
64
+ cd dist/package
65
+ ./main.exe
66
+ ```
67
+
68
+ ## Workflow Stages
69
+
70
+ The packaging process executes the following stages:
71
+
72
+ 1. **Parse Project**: Extract project information from `pyproject.toml`
73
+ 2. **Pack Source & Install Python**: Parallel execution of source packing and Python installation
74
+ 3. **Generate Loader**: Create cross-platform loader executable
75
+ 4. **Assemble Package**: Combine all components into final package
76
+
77
+ Each stage can run independently or in parallel based on dependencies, maximizing efficiency.
@@ -8,24 +8,38 @@ description = "Single File commands for Interactive python."
8
8
  name = "pysfi"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.8"
11
- version = "0.1.6"
11
+ version = "0.1.10"
12
12
 
13
13
  [project.scripts]
14
14
  alarmclk = "sfi.alarmclock.alarmclock:main"
15
15
  bumpversion = "sfi.bumpversion.bumpversion:main"
16
+ docscan = "sfi.docscan.docscan:main"
17
+ docscan-gui = "sfi.docscan.docscan_gui:main"
16
18
  embedinstall = "sfi.embedinstall.embedinstall:main"
17
19
  filedate = "sfi.filedate.filedate:main"
18
20
  mkp = "sfi.makepython.makepython:main"
19
21
  pdfsplit = "sfi.pdfsplit.pdfsplit:main"
20
22
  projectparse = "sfi.projectparse.projectparse:main"
23
+ pylibpack = "sfi.pylibpack.pylibpack:main"
21
24
  pyloadergen = "sfi.pyloadergen.pyloadergen:main"
22
- pypacker = "sfi.pypacker.pypacker:main"
25
+ pyp = "sfi.pypack.pypack:main"
26
+ pypack = "sfi.pypack.pypack:main"
27
+ pysourcepack = "sfi.pysourcepack.pysourcepack:main"
28
+ sfi = "sfi.cli:main"
23
29
  taskk = "sfi.taskkill.taskkill:main"
24
30
  wch = "sfi.which.which:main"
25
31
 
26
32
  [project.optional-dependencies]
27
- all = ["pysfi[office]"]
28
- office = ["pymupdf>=1.24.11"]
33
+ all = ["pysfi[gui,office,ocr,extra]"]
34
+ extra = ["ebooklib>=0.18", "markdown>=3.5", "odfpy>=1.4.1", "pypdf>=3.0.0"]
35
+ gui = ["PySide2>=5.15.2.1", "pyside2-stubs>=5.15.2.1.2"]
36
+ ocr = ["Pillow>=10.0.0", "pytesseract>=0.3.10"]
37
+ office = [
38
+ "openpyxl>=3.1.0",
39
+ "pymupdf>=1.24.11",
40
+ "python-docx>=1.1.0",
41
+ "python-pptx>=0.6.21",
42
+ ]
29
43
 
30
44
  [tool.hatch.build.targets.wheel]
31
45
  exclude = [
@@ -73,8 +87,11 @@ exclude = [
73
87
  dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"
74
88
  fixable = ["ALL"]
75
89
  ignore = [
76
- "B008", # Do not perform function calls in function arguments
77
- "E501", # Line too long (handled by formatter)
90
+ "B008", # Do not perform function calls in function arguments
91
+ "E501", # Line too long (handled by formatter)
92
+ "RUF001", # Language specific rules
93
+ "RUF002", # Language specific rules
94
+ "RUF003", # Language specific rules
78
95
  ]
79
96
  select = [
80
97
  "B", # flake8-bugbear
@@ -100,15 +117,19 @@ known-first-party = ["sfi"]
100
117
  members = [
101
118
  "sfi/alarmclock",
102
119
  "sfi/bumpversion",
120
+ "sfi/docscan",
103
121
  "sfi/embedinstall",
104
122
  "sfi/filedate",
105
123
  "sfi/makepython",
106
124
  "sfi/pdfsplit",
107
125
  "sfi/projectparse",
126
+ "sfi/pylibpack",
108
127
  "sfi/pyloadergen",
109
- "sfi/pypacker",
128
+ "sfi/pypack",
129
+ "sfi/pysourcepack",
110
130
  "sfi/taskkill",
111
131
  "sfi/which",
132
+ "sfi/workflowengine",
112
133
  ]
113
134
 
114
135
  [dependency-groups]
@@ -116,17 +137,12 @@ dev = [
116
137
  "hatch>=1.14.2",
117
138
  "pysfi[all]",
118
139
  "pyside2>=5.15.2.1",
140
+ "pytest-asyncio>=0.24.0",
141
+ "pytest-benchmark>=4.0.0",
119
142
  "pytest-cov>=5.0.0",
143
+ "pytest-mock>=3.14.0",
120
144
  "pytest>=8.3.5",
121
145
  "qdarkstyle>=3.2.3",
122
146
  "ruff>=0.14.11",
123
147
  "tomli>=2.4.0",
124
148
  ]
125
-
126
- [tool.pytest.ini_options]
127
- addopts = "-v --tb=short"
128
- python_classes = ["Test*"]
129
- python_files = ["test_*.py"]
130
- python_functions = ["test_*"]
131
- pythonpath = ["."]
132
- testpaths = ["sfi"]
@@ -1,3 +1,3 @@
1
1
  """Single File commands for Interactive python."""
2
2
 
3
- __version__ = "0.1.6"
3
+ __version__ = "0.1.10"
@@ -1,3 +1,3 @@
1
1
  """Bumpversion - Automated version number management tool."""
2
2
 
3
- __version__ = "0.1.6"
3
+ __version__ = "0.1.10"
@@ -0,0 +1,11 @@
1
+ import argparse
2
+
3
+ from sfi import __version__ as VERSION # noqa: N812
4
+
5
+
6
+ def main():
7
+ parser = argparse.ArgumentParser()
8
+ parser.add_argument(
9
+ "-v", "--version", action="version", version=f"%(prog)s v{VERSION}", help="Print version and exit"
10
+ )
11
+ parser.parse_args()