markdown-os 0.7.2__tar.gz → 0.7.3__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.
- {markdown_os-0.7.2 → markdown_os-0.7.3}/PKG-INFO +1 -1
- markdown_os-0.7.3/markdown_os.spec +149 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/pyproject.toml +1 -1
- {markdown_os-0.7.2 → markdown_os-0.7.3}/tests/test_desktop.py +12 -0
- markdown_os-0.7.2/markdown_os.spec +0 -113
- {markdown_os-0.7.2 → markdown_os-0.7.3}/.github/workflows/desktop-release.yml +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/.github/workflows/publish.yml +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/.gitignore +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/.python-version +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/AGENTS.md +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/CLAUDE.md +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/LICENSE +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/README.md +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/docs/plans/feature-001-pdf-export.md +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/docs/plans/feature-002-file-operations.md +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/docs/plans/feature-003-focus-mode.md +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/__init__.py +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/cli.py +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/desktop.py +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/directory_handler.py +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/file_handler.py +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/server.py +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/css/styles.css +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/css/themes.css +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/favicon.svg +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/index.html +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/js/dialogs.js +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/js/editor.js +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/js/file-tree.js +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/js/focus-mode.js +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/js/pdf-export.js +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/js/search.js +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/js/shared-utils.js +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/js/tabs.js +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/js/theme.js +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/js/toc.js +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/js/websocket.js +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/js/wysiwyg-toolbar.js +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/js/wysiwyg.js +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/static/welcome.html +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/markdown_os/templates/example_template.md +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/scripts/build_desktop.py +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/scripts/download_vendor.py +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/site/demo-frame.html +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/site/downloads.html +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/site/favicon.svg +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/site/images/hero-screenshot.png +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/site/index.html +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/site/styles.css +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/site/themes.css +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/tests/test_cli.py +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/tests/test_directory_handler.py +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/tests/test_file_handler.py +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/tests/test_frontend_navigation_sync.py +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/tests/test_server.py +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/tests/test_version.py +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/uv.lock +0 -0
- {markdown_os-0.7.2 → markdown_os-0.7.3}/vercel.json +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: markdown-os
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.3
|
|
4
4
|
Summary: Developer-focused markdown editor served from a local CLI.
|
|
5
5
|
Project-URL: Homepage, https://github.com/elena-cabrera/markdown-os
|
|
6
6
|
Project-URL: Repository, https://github.com/elena-cabrera/markdown-os
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# -*- mode: python ; coding: utf-8 -*-
|
|
2
|
+
"""PyInstaller spec for building Markdown-OS desktop application.
|
|
3
|
+
|
|
4
|
+
Usage:
|
|
5
|
+
# First download vendor assets
|
|
6
|
+
python scripts/download_vendor.py
|
|
7
|
+
|
|
8
|
+
# Then build
|
|
9
|
+
pyinstaller markdown_os.spec
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import sys
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
|
|
15
|
+
from PyInstaller.utils.hooks import collect_data_files, collect_dynamic_libs
|
|
16
|
+
|
|
17
|
+
block_cipher = None
|
|
18
|
+
|
|
19
|
+
# Paths
|
|
20
|
+
ROOT = Path(SPECPATH)
|
|
21
|
+
PACKAGE_DIR = ROOT / "markdown_os"
|
|
22
|
+
STATIC_DIR = PACKAGE_DIR / "static"
|
|
23
|
+
TEMPLATES_DIR = PACKAGE_DIR / "templates"
|
|
24
|
+
|
|
25
|
+
hiddenimports = [
|
|
26
|
+
"markdown_os",
|
|
27
|
+
"markdown_os.cli",
|
|
28
|
+
"markdown_os.server",
|
|
29
|
+
"markdown_os.file_handler",
|
|
30
|
+
"markdown_os.directory_handler",
|
|
31
|
+
"fastapi",
|
|
32
|
+
"uvicorn",
|
|
33
|
+
"uvicorn.logging",
|
|
34
|
+
"uvicorn.loops",
|
|
35
|
+
"uvicorn.loops.auto",
|
|
36
|
+
"uvicorn.protocols",
|
|
37
|
+
"uvicorn.protocols.http",
|
|
38
|
+
"uvicorn.protocols.http.auto",
|
|
39
|
+
"uvicorn.protocols.websockets",
|
|
40
|
+
"uvicorn.protocols.websockets.auto",
|
|
41
|
+
"uvicorn.lifespan",
|
|
42
|
+
"uvicorn.lifespan.on",
|
|
43
|
+
"watchdog",
|
|
44
|
+
"watchdog.observers",
|
|
45
|
+
"portalocker",
|
|
46
|
+
"webview",
|
|
47
|
+
"pydantic",
|
|
48
|
+
]
|
|
49
|
+
|
|
50
|
+
binaries = []
|
|
51
|
+
datas = [
|
|
52
|
+
(str(STATIC_DIR), "markdown_os/static"),
|
|
53
|
+
(str(TEMPLATES_DIR), "markdown_os/templates"),
|
|
54
|
+
]
|
|
55
|
+
upx_enabled = True
|
|
56
|
+
upx_exclude = []
|
|
57
|
+
|
|
58
|
+
if sys.platform == "win32":
|
|
59
|
+
# pywebview's Windows backend imports pythonnet/clr_loader dynamically and
|
|
60
|
+
# ships extra .NET / WebView2 DLLs that need to be collected explicitly.
|
|
61
|
+
hiddenimports += [
|
|
62
|
+
"clr",
|
|
63
|
+
"pythonnet",
|
|
64
|
+
"clr_loader",
|
|
65
|
+
"webview.platforms.winforms",
|
|
66
|
+
]
|
|
67
|
+
binaries += collect_dynamic_libs("pythonnet")
|
|
68
|
+
binaries += collect_dynamic_libs("clr_loader")
|
|
69
|
+
binaries += collect_dynamic_libs("webview")
|
|
70
|
+
datas += collect_data_files("pythonnet", include_py_files=False)
|
|
71
|
+
datas += collect_data_files("clr_loader", include_py_files=False)
|
|
72
|
+
datas += collect_data_files("webview", include_py_files=False)
|
|
73
|
+
|
|
74
|
+
# UPX can corrupt pythonnet / WebView2 managed assemblies in the frozen
|
|
75
|
+
# Windows app, which then triggers runtime loader failures.
|
|
76
|
+
upx_enabled = False
|
|
77
|
+
upx_exclude = [
|
|
78
|
+
"Python.Runtime.dll",
|
|
79
|
+
"Microsoft.Web.WebView2.Core.dll",
|
|
80
|
+
"Microsoft.Web.WebView2.WinForms.dll",
|
|
81
|
+
"WebBrowserInterop.x64.dll",
|
|
82
|
+
"WebBrowserInterop.x86.dll",
|
|
83
|
+
]
|
|
84
|
+
|
|
85
|
+
a = Analysis(
|
|
86
|
+
[str(PACKAGE_DIR / "desktop.py")],
|
|
87
|
+
pathex=[str(ROOT)],
|
|
88
|
+
binaries=binaries,
|
|
89
|
+
datas=datas,
|
|
90
|
+
hiddenimports=hiddenimports,
|
|
91
|
+
hookspath=[],
|
|
92
|
+
hooksconfig={},
|
|
93
|
+
runtime_hooks=[],
|
|
94
|
+
excludes=[],
|
|
95
|
+
win_no_prefer_redirects=False,
|
|
96
|
+
win_private_assemblies=False,
|
|
97
|
+
cipher=block_cipher,
|
|
98
|
+
noarchive=False,
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
|
|
102
|
+
|
|
103
|
+
exe = EXE(
|
|
104
|
+
pyz,
|
|
105
|
+
a.scripts,
|
|
106
|
+
[],
|
|
107
|
+
exclude_binaries=True,
|
|
108
|
+
name="Markdown-OS",
|
|
109
|
+
debug=False,
|
|
110
|
+
bootloader_ignore_signals=False,
|
|
111
|
+
strip=False,
|
|
112
|
+
upx=upx_enabled,
|
|
113
|
+
console=False,
|
|
114
|
+
icon=None, # Set to .ico (Windows) or .icns (macOS) path when available
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
coll = COLLECT(
|
|
118
|
+
exe,
|
|
119
|
+
a.binaries,
|
|
120
|
+
a.zipfiles,
|
|
121
|
+
a.datas,
|
|
122
|
+
strip=False,
|
|
123
|
+
upx=upx_enabled,
|
|
124
|
+
upx_exclude=upx_exclude,
|
|
125
|
+
name="Markdown-OS",
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
# macOS app bundle
|
|
129
|
+
if sys.platform == "darwin":
|
|
130
|
+
app = BUNDLE(
|
|
131
|
+
coll,
|
|
132
|
+
name="Markdown-OS.app",
|
|
133
|
+
icon=None, # Set to .icns path when available
|
|
134
|
+
bundle_identifier="com.markdown-os.app",
|
|
135
|
+
info_plist={
|
|
136
|
+
"CFBundleName": "Markdown-OS",
|
|
137
|
+
"CFBundleDisplayName": "Markdown-OS",
|
|
138
|
+
"CFBundleShortVersionString": "0.5.0",
|
|
139
|
+
"CFBundleVersion": "0.5.0",
|
|
140
|
+
"NSHighResolutionCapable": True,
|
|
141
|
+
"CFBundleDocumentTypes": [
|
|
142
|
+
{
|
|
143
|
+
"CFBundleTypeName": "Markdown Document",
|
|
144
|
+
"CFBundleTypeExtensions": ["md", "markdown"],
|
|
145
|
+
"CFBundleTypeRole": "Editor",
|
|
146
|
+
}
|
|
147
|
+
],
|
|
148
|
+
},
|
|
149
|
+
)
|
|
@@ -220,3 +220,15 @@ def test_desktop_api_open_path_empty_folder(tmp_path: Path) -> None:
|
|
|
220
220
|
result = api.open_path(str(tmp_path))
|
|
221
221
|
assert "error" in result
|
|
222
222
|
assert "no markdown" in result["error"].lower()
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def test_windows_desktop_spec_collects_pythonnet_runtime() -> None:
|
|
226
|
+
"""Windows PyInstaller spec includes pythonnet/webview runtime assets."""
|
|
227
|
+
spec_text = Path("markdown_os.spec").read_text(encoding="utf-8")
|
|
228
|
+
|
|
229
|
+
assert 'collect_dynamic_libs("pythonnet")' in spec_text
|
|
230
|
+
assert 'collect_data_files("pythonnet", include_py_files=False)' in spec_text
|
|
231
|
+
assert '"clr"' in spec_text
|
|
232
|
+
assert '"webview.platforms.winforms"' in spec_text
|
|
233
|
+
assert 'upx_enabled = False' in spec_text
|
|
234
|
+
assert '"Python.Runtime.dll"' in spec_text
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
# -*- mode: python ; coding: utf-8 -*-
|
|
2
|
-
"""PyInstaller spec for building Markdown-OS desktop application.
|
|
3
|
-
|
|
4
|
-
Usage:
|
|
5
|
-
# First download vendor assets
|
|
6
|
-
python scripts/download_vendor.py
|
|
7
|
-
|
|
8
|
-
# Then build
|
|
9
|
-
pyinstaller markdown_os.spec
|
|
10
|
-
"""
|
|
11
|
-
|
|
12
|
-
import sys
|
|
13
|
-
from pathlib import Path
|
|
14
|
-
|
|
15
|
-
block_cipher = None
|
|
16
|
-
|
|
17
|
-
# Paths
|
|
18
|
-
ROOT = Path(SPECPATH)
|
|
19
|
-
PACKAGE_DIR = ROOT / "markdown_os"
|
|
20
|
-
STATIC_DIR = PACKAGE_DIR / "static"
|
|
21
|
-
TEMPLATES_DIR = PACKAGE_DIR / "templates"
|
|
22
|
-
|
|
23
|
-
a = Analysis(
|
|
24
|
-
[str(PACKAGE_DIR / "desktop.py")],
|
|
25
|
-
pathex=[str(ROOT)],
|
|
26
|
-
binaries=[],
|
|
27
|
-
datas=[
|
|
28
|
-
(str(STATIC_DIR), "markdown_os/static"),
|
|
29
|
-
(str(TEMPLATES_DIR), "markdown_os/templates"),
|
|
30
|
-
],
|
|
31
|
-
hiddenimports=[
|
|
32
|
-
"markdown_os",
|
|
33
|
-
"markdown_os.cli",
|
|
34
|
-
"markdown_os.server",
|
|
35
|
-
"markdown_os.file_handler",
|
|
36
|
-
"markdown_os.directory_handler",
|
|
37
|
-
"fastapi",
|
|
38
|
-
"uvicorn",
|
|
39
|
-
"uvicorn.logging",
|
|
40
|
-
"uvicorn.loops",
|
|
41
|
-
"uvicorn.loops.auto",
|
|
42
|
-
"uvicorn.protocols",
|
|
43
|
-
"uvicorn.protocols.http",
|
|
44
|
-
"uvicorn.protocols.http.auto",
|
|
45
|
-
"uvicorn.protocols.websockets",
|
|
46
|
-
"uvicorn.protocols.websockets.auto",
|
|
47
|
-
"uvicorn.lifespan",
|
|
48
|
-
"uvicorn.lifespan.on",
|
|
49
|
-
"watchdog",
|
|
50
|
-
"watchdog.observers",
|
|
51
|
-
"portalocker",
|
|
52
|
-
"webview",
|
|
53
|
-
"pydantic",
|
|
54
|
-
],
|
|
55
|
-
hookspath=[],
|
|
56
|
-
hooksconfig={},
|
|
57
|
-
runtime_hooks=[],
|
|
58
|
-
excludes=[],
|
|
59
|
-
win_no_prefer_redirects=False,
|
|
60
|
-
win_private_assemblies=False,
|
|
61
|
-
cipher=block_cipher,
|
|
62
|
-
noarchive=False,
|
|
63
|
-
)
|
|
64
|
-
|
|
65
|
-
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
|
|
66
|
-
|
|
67
|
-
exe = EXE(
|
|
68
|
-
pyz,
|
|
69
|
-
a.scripts,
|
|
70
|
-
[],
|
|
71
|
-
exclude_binaries=True,
|
|
72
|
-
name="Markdown-OS",
|
|
73
|
-
debug=False,
|
|
74
|
-
bootloader_ignore_signals=False,
|
|
75
|
-
strip=False,
|
|
76
|
-
upx=True,
|
|
77
|
-
console=False,
|
|
78
|
-
icon=None, # Set to .ico (Windows) or .icns (macOS) path when available
|
|
79
|
-
)
|
|
80
|
-
|
|
81
|
-
coll = COLLECT(
|
|
82
|
-
exe,
|
|
83
|
-
a.binaries,
|
|
84
|
-
a.zipfiles,
|
|
85
|
-
a.datas,
|
|
86
|
-
strip=False,
|
|
87
|
-
upx=True,
|
|
88
|
-
upx_exclude=[],
|
|
89
|
-
name="Markdown-OS",
|
|
90
|
-
)
|
|
91
|
-
|
|
92
|
-
# macOS app bundle
|
|
93
|
-
if sys.platform == "darwin":
|
|
94
|
-
app = BUNDLE(
|
|
95
|
-
coll,
|
|
96
|
-
name="Markdown-OS.app",
|
|
97
|
-
icon=None, # Set to .icns path when available
|
|
98
|
-
bundle_identifier="com.markdown-os.app",
|
|
99
|
-
info_plist={
|
|
100
|
-
"CFBundleName": "Markdown-OS",
|
|
101
|
-
"CFBundleDisplayName": "Markdown-OS",
|
|
102
|
-
"CFBundleShortVersionString": "0.5.0",
|
|
103
|
-
"CFBundleVersion": "0.5.0",
|
|
104
|
-
"NSHighResolutionCapable": True,
|
|
105
|
-
"CFBundleDocumentTypes": [
|
|
106
|
-
{
|
|
107
|
-
"CFBundleTypeName": "Markdown Document",
|
|
108
|
-
"CFBundleTypeExtensions": ["md", "markdown"],
|
|
109
|
-
"CFBundleTypeRole": "Editor",
|
|
110
|
-
}
|
|
111
|
-
],
|
|
112
|
-
},
|
|
113
|
-
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|