* .gitignore migrations/0x_ganache_snapshot * .gitignore new-ish Python contract wrappers These should have been added back when we started generating these wrappers. * rm superfluous contract artifact in Python package All of the contract artifacts were removed from the Python package recently, because now they're copied from the monorepo/packages area as an automated build step. Somehow this one artifact slipped through the cracks. * Eliminate circular dependency This was preventing the Exchange wrapper from ever importing its validator! * Improve output of monorepo-level parallel script - Capture stderr (and have it included in stdout) so that it doesn't leak onto the console for commands that didn't actually fail. - Include all error output in the Exception object (eliminate print statement). * Silence new versions of linters Newer versions care about this stuff. Old versions didn't, and we don't either. * Support Rich Reverts via Web3.py middleware * Fix bug in generated wrappers' bytes handling `bytes.fromhex(bytes.decode('utf-8')` is just plain wrong. It would work for some cases, but is not working when trying to fill orders with the latest Exchange contract. * Migrate to Exchange v3 * Fix typo in DevUtils documentation * Include new contracts in docs * Re-enable Python checks in CI * Accept strings for bytes * Fix CircleCI build artifacts for gen'd python I swear the previous way was working before, but it wasn't working now, so this fixes it. * Accept a provider OR a Web3 object In various places. This allows the caller to install middleware (which in web3.py is installed on a Web3 object, not on a provider) before executing any RPC calls, which is important for the case where one wants to produce signatures locally before submitting to a remote node. * wrapper base: don't assume there are accounts * Eliminate some inline linter directives * make CHANGELOGs be REVERSE chronological * Update CHANGELOG entries and bump version numbers * @0x/contract-addresses: Put addr's in JSON, not TS This allows easier consumption by other languages. (Specifically, it eliminates the overhead of keeping the Python addresses package in sync with the TypeScript one.) * sra_client.py: incl. docker in `./setup.py clean` * sra_client.py: Migrate to protocol v3 Removed script that existed only to exclude runs of sra_client builds (parallel_without_sra_client). Now `parallel` is used by CI, re-including sra_client in CI checks. * abi-gen/templates/Py: clarify if/else logic In response to https://github.com/0xProject/0x-monorepo/pull/2284#discussion_r342200906 * sra_client.py: Update CHANGELOG and bump version * contract_addresses/setup.py: rm unnecessary rm * json_schemas.py: corrections to dev dependencies * In tests against deployment, also run doctests * contract_wrappers example: rm xtra Order attribute Thanks to @steveklebanoff for catching this. https://github.com/0xProject/0x-monorepo/pull/2284#pullrequestreview-312065368
59 lines
1.8 KiB
Python
Executable File
59 lines
1.8 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
"""Run the given command in all packages in parallel.
|
|
|
|
Handy for quick verification test runs, but annoying in that all of the output
|
|
is interleaved.
|
|
|
|
$ ./parallel ./setup.py lint
|
|
|
|
This will `cd` into each package, run `./setup.py lint`, then `cd ..`, all in
|
|
parallel, in a separate process for each package. The number of processes is
|
|
decided by ProcessPoolExecutor. Replace "lint" with any of "test", "clean",
|
|
"build_sphinx" (for docs), etc.
|
|
|
|
Also consider:
|
|
|
|
$ ./parallel pip install -e .[dev] # install all the packages in editable mode
|
|
|
|
$ ./parallel pip uninstall $(basename $(pwd))
|
|
|
|
>>>"""
|
|
|
|
from concurrent.futures import ProcessPoolExecutor, wait
|
|
from os import chdir
|
|
from subprocess import CalledProcessError, check_output, STDOUT
|
|
from sys import argv
|
|
|
|
PACKAGES = [
|
|
"contract_addresses",
|
|
"contract_artifacts",
|
|
"contract_wrappers",
|
|
"json_schemas",
|
|
"sra_client",
|
|
"order_utils",
|
|
"middlewares",
|
|
]
|
|
|
|
def run_cmd_on_package(package: str):
|
|
"""cd to the package dir, ./setup.py lint, cd .."""
|
|
chdir(package)
|
|
command = f"{' '.join(argv[1:])}"
|
|
try:
|
|
check_output(command.split(), stderr=STDOUT)
|
|
except CalledProcessError as error:
|
|
raise RuntimeError(
|
|
f"Failure return code received from command `{command}` in package"
|
|
+ f" {package}, which produced the following output:\n"
|
|
+ f"{error.output.decode('utf-8')}") from error
|
|
finally:
|
|
chdir("..")
|
|
|
|
with ProcessPoolExecutor() as executor:
|
|
for future in executor.map(run_cmd_on_package, PACKAGES):
|
|
# iterate over map()'s return value, to resolve the futures.
|
|
# but we don't actually care what the return values are, so just `pass`.
|
|
# if any exceptions were raised by the underlying task, they'll be
|
|
# raised as the iteration encounters them.
|
|
pass
|