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