* .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
|