From c10077392e5a9c538345d816f158a384b81e9865 Mon Sep 17 00:00:00 2001 From: furtest Date: Sun, 4 Jan 2026 19:18:18 +0100 Subject: [PATCH 1/3] Change TODOs format. Use TODO: instead of TODO --- src/unisync/main.py | 4 ++-- src/unisync/runners.py | 2 +- src/unisync/synchroniser.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/unisync/main.py b/src/unisync/main.py index f77462d..8374260 100644 --- a/src/unisync/main.py +++ b/src/unisync/main.py @@ -21,11 +21,11 @@ def main(): elif os.path.isfile(config_path): config = load_config(config_path) else: - # TODO replace the next line with something to do if no config file is found + # TODO: replace the next line with something to do if no config file is found config = load_config(config_path) pass - # TODO make the command line arguments work and override the config options + # TODO: make the command line arguments work and override the config options synchroniser = Synchroniser( config.roots.remote, diff --git a/src/unisync/runners.py b/src/unisync/runners.py index 5798941..95bf042 100644 --- a/src/unisync/runners.py +++ b/src/unisync/runners.py @@ -14,7 +14,7 @@ def unisync_sync(synchroniser:Synchroniser, paths_manager:PathsManager): synchroniser.sync_files(paths_manager.get_paths_to_sync()) synchroniser.sync_links(paths_manager.get_paths_to_sync()) - # TODO check the config options and do or don't do the following + # TODO: check the config options and do or don't do the following synchroniser.update_links() #synchroniser.mount_remote_dir() diff --git a/src/unisync/synchroniser.py b/src/unisync/synchroniser.py index 8a39e44..8a9eae0 100644 --- a/src/unisync/synchroniser.py +++ b/src/unisync/synchroniser.py @@ -75,7 +75,6 @@ class Synchroniser: On slow connections one might want to increase this. Returns: An error code (0 success, 1 TimeoutExpired, 2 KeyboardInterrupt). - TODO change that to raising the exception. """ self.control_path = os.path.expanduser(control_path) command = [ @@ -87,6 +86,7 @@ class Synchroniser: "-p", str(self.remote_port) ] master_ssh = subprocess.Popen(command) + # TODO: Raise an exception instead of changing the return value try: ret_code = master_ssh.wait(timeout=connection_timeout) except subprocess.TimeoutExpired: From e639c12c20ceeb03e2dc31d9baeffd1d6d42a2fe Mon Sep 17 00:00:00 2001 From: furtest Date: Sun, 4 Jan 2026 19:18:57 +0100 Subject: [PATCH 2/3] docs : Add sphinx for handling documentation Edit gitignore by ignoring the docs/build directory Add sphinx dependencies to pyproject Add docs folder --- .gitignore | 1 + docs/Makefile | 20 +++++++++++ docs/make.bat | 35 +++++++++++++++++++ docs/source/conf.py | 36 +++++++++++++++++++ docs/source/index.rst | 18 ++++++++++ docs/source/modules.rst | 7 ++++ docs/source/unisync.rst | 77 +++++++++++++++++++++++++++++++++++++++++ pyproject.toml | 7 ++++ 8 files changed, 201 insertions(+) create mode 100644 docs/Makefile create mode 100644 docs/make.bat create mode 100644 docs/source/conf.py create mode 100644 docs/source/index.rst create mode 100644 docs/source/modules.rst create mode 100644 docs/source/unisync.rst diff --git a/.gitignore b/.gitignore index 822c508..85077da 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ poetry.lock __pycache__ +docs/build diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..d0c3cbf --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..747ffb7 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "" goto help + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 0000000..f60d301 --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,36 @@ +# Configuration file for the Sphinx documentation builder. +# +# For the full list of built-in configuration values, see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Project information ----------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information + +project = 'unisync' +copyright = '2026, Paul Retourné' +author = 'Paul Retourné' +release = '0.1.0' + +# -- General configuration --------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration + +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.viewcode', + 'sphinx.ext.napoleon', + 'sphinx.ext.todo' + ] + +templates_path = ['_templates'] +exclude_patterns = [] + + + +# -- Options for HTML output ------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output + +#html_theme = 'alabaster' +html_theme = 'sphinx_rtd_theme' +html_static_path = ['_static'] + +autodoc_docstring_signature = True diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 0000000..c148277 --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,18 @@ +.. unisync documentation master file, created by + sphinx-quickstart on Sun Jan 4 15:02:58 2026. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Documentation for unisync +========================= + +Unisync is a data synchronising tool built around `unison`_ + +.. _unison: https://github.com/bcpierce00/unison + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + modules + diff --git a/docs/source/modules.rst b/docs/source/modules.rst new file mode 100644 index 0000000..54c1554 --- /dev/null +++ b/docs/source/modules.rst @@ -0,0 +1,7 @@ +unisync +======= + +.. toctree:: + :maxdepth: 4 + + unisync diff --git a/docs/source/unisync.rst b/docs/source/unisync.rst new file mode 100644 index 0000000..8f1f7d7 --- /dev/null +++ b/docs/source/unisync.rst @@ -0,0 +1,77 @@ +unisync package +=============== + +Submodules +---------- + +unisync.argparser module +------------------------ + +.. automodule:: unisync.argparser + :members: + :show-inheritance: + :undoc-members: + +unisync.config module +--------------------- + +.. automodule:: unisync.config + :members: + :show-inheritance: + :undoc-members: + +unisync.defaults module +----------------------- + +.. automodule:: unisync.defaults + :members: + :show-inheritance: + :undoc-members: + +unisync.errors module +--------------------- + +.. automodule:: unisync.errors + :members: + :show-inheritance: + :undoc-members: + +unisync.main module +------------------- + +.. automodule:: unisync.main + :members: + :show-inheritance: + :undoc-members: + +unisync.paths module +-------------------- + +.. automodule:: unisync.paths + :members: + :show-inheritance: + :undoc-members: + +unisync.runners module +---------------------- + +.. automodule:: unisync.runners + :members: + :show-inheritance: + :undoc-members: + +unisync.synchroniser module +--------------------------- + +.. automodule:: unisync.synchroniser + :members: + :show-inheritance: + :undoc-members: + +Module contents +--------------- + +.. automodule:: unisync + :members: + :show-inheritance: + :undoc-members: diff --git a/pyproject.toml b/pyproject.toml index 5b96ec5..f3933d6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,3 +20,10 @@ packages = [{include = "unisync", from = "src"}] [build-system] requires = ["poetry-core>=2.0.0,<3.0.0"] build-backend = "poetry.core.masonry.api" + +[dependency-groups] +docs = [ + "sphinx (>=9.1.0,<10.0.0)", + "sphinx-rtd-theme (>=3.0.2,<4.0.0)", +] + From 7705731dd5f838b1c9dc06c287ae491af8a97ff9 Mon Sep 17 00:00:00 2001 From: furtest Date: Tue, 20 Jan 2026 23:39:48 +0100 Subject: [PATCH 3/3] docs : add explanation of what is unisync also add an example --- docs/source/example.rst | 24 ++++++++++++++++++++++++ docs/source/index.rst | 17 +++++++++++++++-- 2 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 docs/source/example.rst diff --git a/docs/source/example.rst b/docs/source/example.rst new file mode 100644 index 0000000..9b232c9 --- /dev/null +++ b/docs/source/example.rst @@ -0,0 +1,24 @@ +.. _example_how_it_works: + +Example of how unisync works +============================ + +Let's say you have the following structure:: + + $ tree . + . + ├── big_file + └── folder +    ├── file +    └── other_file + +If you only want to synchronise `folder` and its content on your laptop the following will be automatically generated:: + + $ tree . + . + ├── big_file -> ../.data/big_file + └── folder +    ├── file +    └── other_file + +`big_file` is now a symbolic link and by mounting the remote directory you can still seemlessly access `big_file` through the network. diff --git a/docs/source/index.rst b/docs/source/index.rst index c148277..6d7408d 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -6,13 +6,26 @@ Documentation for unisync ========================= -Unisync is a data synchronising tool built around `unison`_ +Unisync is a data synchronising tool built around `unison`_ and expending on it. + +Unisync tries to solve two problems that are often solved separately but never together : + +* Keeping your data synchronised between multiple machines (through a central server), examples of this are rsync and of course unison. +* Being able to access and edit files stored on your server without having to download them, the gui interface of nextcloud for example. +* And of course I want to be able to do all of this without ever having to leave my terminal. + +Unisync solves this problem by placing each file on your local machine but with only the selected files and folders being physically present on your drive, +the others are replaced by symbolic links pointing to a directory that is mounted from your server. + +See this +:ref:`example_how_it_works`. .. _unison: https://github.com/bcpierce00/unison .. toctree:: :maxdepth: 2 :caption: Contents: - + + example modules