Skip to content

Instantly share code, notes, and snippets.

@patrickhulce
Last active October 14, 2024 19:59
Show Gist options
  • Save patrickhulce/889925c3378dbaf2d6ed83974da13af7 to your computer and use it in GitHub Desktop.
Save patrickhulce/889925c3378dbaf2d6ed83974da13af7 to your computer and use it in GitHub Desktop.
Sets up a python monorepo using poetry.
#!/bin/bash
set -euxo pipefail
TEMP_DIR=$(mktemp -d)
mkdir -p $TEMP_DIR/package_a/src/namespace/a
mkdir -p $TEMP_DIR/package_b/src/namespace/b
mkdir -p $TEMP_DIR/package_c/src/namespace/c
touch $TEMP_DIR/package_a/src/namespace/a/__init__.py
touch $TEMP_DIR/package_b/src/namespace/b/__init__.py
touch $TEMP_DIR/package_c/src/namespace/c/__init__.py
cat >> $TEMP_DIR/pyproject.toml <<EOF
[tool.poetry]
name = "PACKAGE_NAME_HERE"
version = "0.1.0"
description = "Test"
authors = ["Patrick Hulce <[email protected]>"]
packages = [
{ include = "INCLUDE_PATH", from = "src" },
]
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
[tool.poetry.dependencies]
python = "==3.11.*"
EOF
cp $TEMP_DIR/pyproject.toml $TEMP_DIR/package_a/pyproject.toml
echo "VALUE_A = 1" >> $TEMP_DIR/package_a/src/namespace/a/__init__.py
sed -i '' 's/PACKAGE_NAME_HERE/namespace-a/g' $TEMP_DIR/package_a/pyproject.toml
sed -i '' 's#INCLUDE_PATH#namespace/a#g' $TEMP_DIR/package_a/pyproject.toml
cp $TEMP_DIR/pyproject.toml $TEMP_DIR/package_b/pyproject.toml
echo "import namespace.a" >> $TEMP_DIR/package_b/src/namespace/b/__init__.py
echo "VALUE_B = 2" >> $TEMP_DIR/package_b/src/namespace/b/__init__.py
sed -i '' 's/PACKAGE_NAME_HERE/namespace-b/g' $TEMP_DIR/package_b/pyproject.toml
sed -i '' 's#INCLUDE_PATH#namespace/b#g' $TEMP_DIR/package_b/pyproject.toml
echo '"namespace.a" = { path = "../package_a", develop = true }' >> $TEMP_DIR/package_b/pyproject.toml
cp $TEMP_DIR/pyproject.toml $TEMP_DIR/package_c/pyproject.toml
touch $TEMP_DIR/package_c/src/namespace/c/__init__.py
echo "import namespace.a" >> $TEMP_DIR/package_c/src/namespace/c/run.py
echo "import namespace.b" >> $TEMP_DIR/package_c/src/namespace/c/run.py
echo "print(namespace.a.VALUE_A)" >> $TEMP_DIR/package_c/src/namespace/c/run.py
echo "print(namespace.b.VALUE_B)" >> $TEMP_DIR/package_c/src/namespace/c/run.py
sed -i '' 's/PACKAGE_NAME_HERE/namespace-c/g' $TEMP_DIR/package_c/pyproject.toml
sed -i '' 's#INCLUDE_PATH#namespace/c#g' $TEMP_DIR/package_c/pyproject.toml
echo '"namespace.a" = { path = "../package_a", develop = true }' >> $TEMP_DIR/package_c/pyproject.toml
echo '"namespace.b" = { path = "../package_b", develop = true }' >> $TEMP_DIR/package_c/pyproject.toml
set +e
cd $TEMP_DIR/package_b
poetry install
poetry run python -c 'import namespace.a; print(namespace.a.VALUE_A)'
poetry run python -c 'import namespace.b; print(namespace.b.VALUE_B)'
cd $TEMP_DIR/package_c
poetry install
poetry run python -c 'import namespace.a; print(namespace.a.VALUE_A)'
poetry run python -c 'import namespace.b; print(namespace.b.VALUE_B)'
poetry run python -m namespace.c.run
poetry run python src/namespace/c/run.py
#!/bin/bash
set -euxo pipefail
TEMP_DIR=$(mktemp -d)
SED_ARGS=(-i)
if [[ "$(uname)" == "Darwin" ]]; then
SED_ARGS=(-i '')
fi
mkdir -p "$TEMP_DIR"/package_a/src/namespace/a
mkdir -p "$TEMP_DIR"/package_b/src/namespace/b
mkdir -p "$TEMP_DIR"/package_c/src/namespace/c
touch "$TEMP_DIR"/package_a/src/namespace/a/__init__.py
touch "$TEMP_DIR"/package_b/src/namespace/b/__init__.py
touch "$TEMP_DIR"/package_c/src/namespace/c/__init__.py
cat >> "$TEMP_DIR"/pyproject.toml <<EOF
[project]
name = "PACKAGE_NAME_HERE"
version = "0.1.0"
description = "Test"
requires-python = ">=3.10"
authors = [
{ name = "Patrick Hulce", email = "[email protected]" }
]
dependencies = [
"DEPENDENCY_NAME"
]
[tool.uv.sources]
DEPENDENCY_NAME = { path = "DEPENDENCY_PATH" }
[tool.hatch.build.targets.wheel]
packages = ["src/namespacePACKAGE_SOURCE"]
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
EOF
cp "$TEMP_DIR"/pyproject.toml "$TEMP_DIR"/package_a/pyproject.toml
echo "VALUE_A = 1" >> "$TEMP_DIR"/package_a/src/namespace/a/__init__.py
sed "${SED_ARGS[@]}" 's/PACKAGE_NAME_HERE/namespace-a/g' "$TEMP_DIR"/package_a/pyproject.toml
sed "${SED_ARGS[@]}" 's/PACKAGE_SOURCE//g' "$TEMP_DIR"/package_a/pyproject.toml
sed "${SED_ARGS[@]}" '/DEPENDENCY_NAME/d' "$TEMP_DIR"/package_a/pyproject.toml
sed "${SED_ARGS[@]}" '/tool.uv.sources/d' "$TEMP_DIR"/package_a/pyproject.toml
cp "$TEMP_DIR"/pyproject.toml "$TEMP_DIR"/package_b/pyproject.toml
echo "import namespace.a" >> "$TEMP_DIR"/package_b/src/namespace/b/__init__.py
echo "VALUE_B = 2" >> "$TEMP_DIR"/package_b/src/namespace/b/__init__.py
sed "${SED_ARGS[@]}" 's/PACKAGE_NAME_HERE/namespace-b/g' "$TEMP_DIR"/package_b/pyproject.toml
sed "${SED_ARGS[@]}" 's/PACKAGE_SOURCE//g' "$TEMP_DIR"/package_b/pyproject.toml
sed "${SED_ARGS[@]}" 's/DEPENDENCY_NAME/namespace-a/g' "$TEMP_DIR"/package_b/pyproject.toml
sed "${SED_ARGS[@]}" 's#DEPENDENCY_PATH#../package_a#g' "$TEMP_DIR"/package_b/pyproject.toml
cp "$TEMP_DIR"/pyproject.toml "$TEMP_DIR"/package_c/pyproject.toml
touch "$TEMP_DIR"/package_c/src/namespace/c/__init__.py
echo "import namespace.a" >> "$TEMP_DIR"/package_c/src/namespace/c/run.py
echo "import namespace.b" >> "$TEMP_DIR"/package_c/src/namespace/c/run.py
echo "print(namespace.a.VALUE_A)" >> "$TEMP_DIR"/package_c/src/namespace/c/run.py
echo "print(namespace.b.VALUE_B)" >> "$TEMP_DIR"/package_c/src/namespace/c/run.py
sed "${SED_ARGS[@]}" 's/PACKAGE_NAME_HERE/namespace-c/g' "$TEMP_DIR"/package_c/pyproject.toml
sed "${SED_ARGS[@]}" 's/PACKAGE_SOURCE//g' "$TEMP_DIR"/package_c/pyproject.toml
sed "${SED_ARGS[@]}" 's/DEPENDENCY_NAME/namespace-b/g' "$TEMP_DIR"/package_c/pyproject.toml
sed "${SED_ARGS[@]}" 's#DEPENDENCY_PATH#../package_b#g' "$TEMP_DIR"/package_c/pyproject.toml
set +e
# Install and test package_b
cd "$TEMP_DIR"/package_b
uv sync
uv run python -c 'import namespace.a; print(namespace.a.VALUE_A)'
uv run python -c 'import namespace.b; print(namespace.b.VALUE_B)'
# Install and test package_c
cd "$TEMP_DIR"/package_c
uv sync
uv run python -c 'import namespace.a; print(namespace.a.VALUE_A)'
uv run python -c 'import namespace.b; print(namespace.b.VALUE_B)'
uv run -m namespace.c.run
uv run src/namespace/c/run.py
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment