parent
07a6530764
commit
02d87c841c
@ -0,0 +1,109 @@ |
||||
import json |
||||
import subprocess |
||||
import os |
||||
import stat |
||||
import sys |
||||
|
||||
import requests |
||||
|
||||
|
||||
class Typgpy(str): |
||||
""" |
||||
Typography constants for pretty printing. |
||||
|
||||
Note that an ENDC is needed to made the end of a 'highlighted' text segment. |
||||
""" |
||||
HEADER = '\033[95m' |
||||
OKBLUE = '\033[94m' |
||||
OKGREEN = '\033[92m' |
||||
WARNING = '\033[93m' |
||||
FAIL = '\033[91m' |
||||
ENDC = '\033[0m' |
||||
BOLD = '\033[1m' |
||||
UNDERLINE = '\033[4m' |
||||
|
||||
|
||||
def get_gopath(): |
||||
""" |
||||
:returns The go-path, assuming that go is installed. |
||||
""" |
||||
return subprocess.check_output(["go", "env", "GOPATH"]).decode().strip() |
||||
|
||||
|
||||
def get_goversion(): |
||||
""" |
||||
:returns The go-version, assuming that go is installed. |
||||
""" |
||||
return subprocess.check_output(["go", "version"]).decode().strip() |
||||
|
||||
|
||||
def get_bls_build_variables(): |
||||
""" |
||||
:returns The environment variables needed to build and/or run programs that |
||||
use the Harmony BLS & MCL repo. |
||||
:raises RuntimeError if openssl is not found. |
||||
|
||||
Note that this assumes that the BLS & MCL repo are in the appropriate directory |
||||
as stated here: https://github.com/harmony-one/harmony/blob/master/README.md |
||||
""" |
||||
variables = {} |
||||
try: |
||||
openssl_dir = subprocess.check_output(["which", "openssl"]).decode().strip().split("\n")[0] |
||||
except (IndexError, subprocess.CalledProcessError) as e: |
||||
raise RuntimeError("`openssl` not found") from e |
||||
hmy_path = f"{get_gopath()}/src/github.com/harmony-one" |
||||
bls_dir = f"{hmy_path}/bls" |
||||
mcl_dir = f"{hmy_path}/mcl" |
||||
assert os.path.exists(bls_dir), f" Harmony BLS repo not found at {bls_dir}" |
||||
assert os.path.exists(mcl_dir), f"Harmony MCL repo not found at {mcl_dir}" |
||||
if sys.platform.startswith("darwin"): |
||||
variables["CGO_CFLAGS"] = f"-I{bls_dir}/include -I{mcl_dir}/include -I{openssl_dir}/include" |
||||
variables["CGO_LDFLAGS"] = f"-L{bls_dir}/lib -L{openssl_dir}/lib" |
||||
variables["LD_LIBRARY_PATH"] = f"{bls_dir}/lib:{mcl_dir}/lib:{openssl_dir}/lib" |
||||
variables["DYLD_FALLBACK_LIBRARY_PATH"] = variables["LD_LIBRARY_PATH"] |
||||
else: |
||||
variables["CGO_CFLAGS"] = f"-I{bls_dir}/include -I{mcl_dir}/include" |
||||
variables["CGO_LDFLAGS"] = f"-L{bls_dir}/lib" |
||||
variables["LD_LIBRARY_PATH"] = f"{bls_dir}/lib:{mcl_dir}/lib" |
||||
return variables |
||||
|
||||
|
||||
def download_cli(bin_name="hmy", replace=False): |
||||
""" |
||||
This function will download the statically linked CLI binary to the current |
||||
working directory. |
||||
|
||||
:param bin_name: The desired filename of the binary |
||||
:param replace: A flag to force a replacement of the binary/file. |
||||
""" |
||||
assert isinstance(bin_name, str), "binary name must be a string" |
||||
assert bin_name, "binary name must be non-empty" |
||||
assert '/' not in bin_name, "binary name must not be path" |
||||
if os.path.exists(f"{os.getcwd()}/{bin_name}") and not replace: |
||||
return |
||||
hmy_script_path = f"{os.getcwd()}/hmy.sh" |
||||
with open(hmy_script_path, 'w') as f: |
||||
f.write(requests.get("https://raw.githubusercontent.com/harmony-one/go-sdk/master/scripts/hmy.sh") |
||||
.content.decode()) |
||||
os.chmod(hmy_script_path, os.stat(hmy_script_path).st_mode | stat.S_IEXEC) |
||||
if os.path.exists(f"{os.getcwd()}/hmy"): |
||||
os.rename(f"{os.getcwd()}/hmy", f"{os.getcwd()}/.hmy_temp") |
||||
subprocess.call([hmy_script_path, '-d']) |
||||
os.rename(f"{os.getcwd()}/hmy", f"{os.getcwd()}/{bin_name}") |
||||
if os.path.exists(f"{os.getcwd()}/.hmy_temp"): |
||||
os.rename(f"{os.getcwd()}/.hmy_temp", f"{os.getcwd()}/hmy") |
||||
|
||||
|
||||
def json_load(string): |
||||
""" |
||||
:param string: The JSON string to load |
||||
:returns A dictionary loaded from a JSON string to a dictionary. |
||||
:raises The exception caused by the load (if present). |
||||
|
||||
Note that this prints the failed input should an error arise. |
||||
""" |
||||
try: |
||||
return json.loads(string) |
||||
except Exception as e: |
||||
print(f"{Typgpy.FAIL}Could not parse input: '{string}'{Typgpy.ENDC}") |
||||
raise e from e |
Loading…
Reference in new issue