Skip to content

Commit 16de069

Browse files
authored
Improve replace_version tool and development wheels (#6626)
- Make `dev_tools/modules.py replace_version` update also the version expected in unit tests - Skip type check in the new test-only source files - Update `dev_tools/packaging/produce-package.sh` to use the `replace_version` utility when building development wheels
1 parent d077532 commit 16de069

File tree

5 files changed

+38
-11
lines changed

5 files changed

+38
-11
lines changed

Diff for: dev_tools/modules.py

+11-3
Original file line numberDiff line numberDiff line change
@@ -160,16 +160,24 @@ def replace_version(search_dir: Path = _DEFAULT_SEARCH_DIR, *, old: str, new: st
160160

161161
for m in list_modules(search_dir=search_dir, include_parent=True):
162162
version_file = _find_version_file(search_dir / m.root)
163-
content = version_file.read_text("UTF-8")
164-
new_content = content.replace(old, new)
165-
version_file.write_text(new_content)
163+
_rewrite_version(version_file, old, new)
164+
version_test = version_file.parent / "_version_test.py"
165+
_rewrite_version(version_test, old, new)
166166

167167

168168
def _validate_version(new_version: str):
169169
if not re.match(r"\d+\.\d+\.\d+(\.dev)?", new_version):
170170
raise ValueError(f"{new_version} is not a valid version number.")
171171

172172

173+
def _rewrite_version(version_file: Path, old: str, new: str) -> None:
174+
pattern = f"(^[^#]*__version__ ==? )(['\"])({re.escape(old)})(\\2)"
175+
repl = f"\\1\\g<2>{new}\\4"
176+
content = version_file.read_text("UTF-8")
177+
new_content = re.sub(pattern, repl, content, flags=re.MULTILINE)
178+
version_file.write_text(new_content)
179+
180+
173181
def _find_version_file(top: Path) -> Path:
174182
for root, _, files in os.walk(str(top)):
175183
if "_version.py" in files:

Diff for: dev_tools/modules_test.py

+3
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ def test_get_version_on_no_modules():
149149
def test_get_version_on_inconsistent_version_modules():
150150
modules.replace_version(search_dir=Path("./mod2"), old="1.2.3.dev", new="1.2.4.dev")
151151
assert modules.get_version(search_dir=Path("./mod2")) == "1.2.4.dev"
152+
assert "1.2.4.dev" in Path("./mod2/pack2/_version_test.py").read_text("UTF-8")
152153
with pytest.raises(ValueError, match="Versions should be the same, instead:"):
153154
modules.get_version(search_dir=Path("."))
154155

@@ -158,6 +159,8 @@ def test_replace_version(tmpdir_factory):
158159
assert modules.get_version() == "1.2.3.dev"
159160
modules.replace_version(old="1.2.3.dev", new="1.2.4.dev")
160161
assert modules.get_version() == "1.2.4.dev"
162+
assert "1.2.4.dev" in Path("./mod1/pack1/_version_test.py").read_text("UTF-8")
163+
assert "1.2.4.dev" in Path("./mod2/pack2/_version_test.py").read_text("UTF-8")
161164

162165

163166
@chdir(target_dir="dev_tools/modules_test_data")
+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# pylint: disable=wrong-or-nonexistent-copyright-notice
2+
import pack1._version # type: ignore
3+
4+
5+
def test_version():
6+
assert pack1._version.__version__ == "1.2.3.dev"
+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# pylint: disable=wrong-or-nonexistent-copyright-notice
2+
import pack2._version # type: ignore
3+
4+
5+
def test_version():
6+
assert pack2._version.__version__ == "1.2.3.dev"

Diff for: dev_tools/packaging/produce-package.sh

+12-8
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,13 @@ out_dir=$(realpath "${1}")
3636

3737
SPECIFIED_VERSION="${2}"
3838

39+
# Helper to run dev_tools/modules.py without CIRQ_PRE_RELEASE_VERSION
40+
# to avoid environment version override in setup.py.
41+
my_dev_tools_modules() {
42+
env -u CIRQ_PRE_RELEASE_VERSION PYTHONPATH=. \
43+
python3 dev_tools/modules.py "$@"
44+
}
45+
3946
# Get the working directory to the repo root.
4047
cd "$( dirname "${BASH_SOURCE[0]}" )"
4148
repo_dir=$(git rev-parse --show-toplevel)
@@ -47,21 +54,18 @@ if [ -n "$(git status --short)" ]; then
4754
fi
4855
tmp_git_dir=$(mktemp -d "/tmp/produce-package-git.XXXXXXXXXXXXXXXX")
4956
trap '{ rm -rf "${tmp_git_dir}"; }' EXIT
57+
echo "Creating pristine repository clone at ${tmp_git_dir}"
58+
git clone --shared --quiet "${repo_dir}" "${tmp_git_dir}"
5059
cd "${tmp_git_dir}"
51-
git init --quiet
52-
git fetch "${repo_dir}" HEAD --quiet --depth=1
53-
git checkout FETCH_HEAD -b work --quiet
5460
if [ -n "${SPECIFIED_VERSION}" ]; then
55-
CIRQ_PACKAGES=$(env PYTHONPATH=. python dev_tools/modules.py list --mode package-path)
56-
for PROJECT_NAME in $CIRQ_PACKAGES; do
57-
echo '__version__ = "'"${SPECIFIED_VERSION}"'"' > "${tmp_git_dir}/${PROJECT_NAME}/_version.py"
58-
done
61+
CURRENT_VERSION=$(my_dev_tools_modules print_version)
62+
my_dev_tools_modules replace_version --old="${CURRENT_VERSION}" --new="${SPECIFIED_VERSION}"
5963
fi
6064

6165
# Python 3 wheel.
6266
echo "Producing python 3 package files."
6367

64-
CIRQ_MODULES=$(env PYTHONPATH=. python dev_tools/modules.py list --mode folder --include-parent)
68+
CIRQ_MODULES=$(my_dev_tools_modules list --mode folder --include-parent)
6569

6670
for m in $CIRQ_MODULES; do
6771
echo "processing $m/setup.py..."

0 commit comments

Comments
 (0)