예제 #1
0
def context(py_ver: PyVer):
    context = DEFAULT_CONTEXT.copy()
    context.update(dict(
        platform_version='',  # remove highly impure platform_version
        python_version=py_ver.python_version(),
        python_full_version=py_ver.python_full_version()
    ))
    return context
예제 #2
0
 def __init__(self, py_ver: PyVer, platform, system, *args, **kwargs):
     self.context = context(py_ver, platform, system)
     self.context_wheel = self.context.copy()
     self.context_wheel['extra'] = None
     self.py_ver = py_ver
     self.py_ver_parsed = parse_ver(py_ver.python_full_version())
     self.py_ver_digits = py_ver.digits()
     self.platform = platform
     self.system = system
예제 #3
0
def context(py_ver: PyVer, platform: str, system: str):
    context = DEFAULT_CONTEXT.copy()
    context.update(
        dict(
            platform_version='',  # remove impure platform_version
            platform_release='',  # remove impure kernel verison
            platform_system=system[0].upper() +
            system[1:],  # eg. Linux or Darwin
            platform_machine=platform,  # eg. x86_64
            python_version=py_ver.python_version(),
            python_full_version=py_ver.python_full_version()))
    return context
예제 #4
0
def test_select_wheel_for_py_ver(expected, py_ver, wheel_fn, system, platform):
    prov = providers.WheelDependencyProvider('',
                                             py_ver=PyVer(py_ver),
                                             system=system,
                                             platform=platform)
    w = WheelRelease(*([""] * 3), wheel_fn, *([""] * 3))
    assert prov._wheel_type_ok(w) == expected
예제 #5
0
파일: generate.py 프로젝트: das-g/mach-nix
def main():
    disable_checks = load_env('disable_checks')
    nixpkgs_commit = load_env('nixpkgs_commit')
    nixpkgs_tarball_sha256 = load_env('nixpkgs_tarball_sha256')
    nixpkgs_json = load_env('nixpkgs_json')
    out_file = load_env('out_file')
    py_ver_str = load_env('py_ver_str')
    prefer_nixpkgs = load_env('prefer_nixpkgs')
    pypi_deps_db_data_dir = load_env('pypi_deps_db_data_dir')
    pypi_fetcher_commit = load_env('pypi_fetcher_commit')
    pypi_fetcher_tarball_sha256 = load_env('pypi_fetcher_tarball_sha256')
    requirements = load_env('requirements')

    py_ver = PyVer(py_ver_str)
    nixpkgs = NixpkgsDirectory(nixpkgs_json)
    deps_db = DependencyDB(py_ver, pypi_deps_db_data_dir)
    generator = OverlaysGenerator(
        py_ver,
        nixpkgs_commit,
        nixpkgs_tarball_sha256,
        nixpkgs,
        pypi_fetcher_commit,
        pypi_fetcher_tarball_sha256,
        disable_checks,
        ResolvelibResolver(nixpkgs, deps_db),
        prefer_nixpkgs=prefer_nixpkgs,
    )
    reqs = parse_reqs(requirements)
    expr = generator.generate(reqs)
    with open(out_file, 'w') as f:
        f.write(expr)
예제 #6
0
 def __init__(self, py_ver: PyVer, platform, system, *args, **kwargs):
     self.context = context(py_ver, platform, system)
     self.context_wheel = self.context.copy()
     self.context_wheel['extra'] = None
     self.py_ver_digits = py_ver.digits()
     self.platform = platform
     self.system = system
예제 #7
0
파일: run.py 프로젝트: InLaw/mach-nix
def gen(args, nixpkgs_rev, nixpkgs_sha256, return_expr=False):
    with open(args.r) as f:
        requirements = f.read().strip()
    o_file = tempfile.mktemp()
    versionPy = PyVer(args.python)
    editionPy = ""  # minimal # Full
    #versionPyNix = "python" +str(versionPy.digits())+ editionPy
    versionPyNix = getVersion(dct=versionConfig['versionConfig'],
                              interpreter="python",
                              versionNixStyle=True,
                              versionNumer=False)

    cmd = f'nix-build {pwd}/nix/call_mach.nix -o {o_file}' \
          f' --argstr requirements "{requirements}"' \
          f' --argstr python_attr {versionPyNix}' \
          f' --argstr nixpkgs_rev {nixpkgs_rev}' \
          f' --argstr nixpkgs_sha {nixpkgs_sha256}'
    proc = sp.run(cmd, shell=True, stdout=sys.stderr)
    if proc.returncode:
        exit(1)
    with open(f"{o_file}/share/mach_nix_file.nix") as src:
        expr = src.read()
        if return_expr:
            return expr
        if getattr(args, 'o', None):
            with open(args.o, 'w') as dest:
                dest.write(expr)
                print(f"Expression written to {args.o}")
        else:
            print(expr)
예제 #8
0
 def __init__(self, py_ver: PyVer, data_dir, *args, **kwargs):
     super(DependencyDB, self).__init__(*args, **kwargs)
     self.data = LazyBucketDict(data_dir)
     self.context = context(py_ver)
     self.py_ver_digits = py_ver.digits()
     for name, releases in self.data.items():
         key = self._unify_key(name)
         if key != name:
             self.data[key] = self.data[name]
             del self.data[name]
예제 #9
0
def do():
    providers_json = load_env('providers')

    conda_channels_json = load_env('conda_channels_json')
    disable_checks = load_env('disable_checks')
    nixpkgs_json = load_env('nixpkgs_json')
    out_file = load_env('out_file')
    provider_settings = ProviderSettings(providers_json)
    py_ver_str = load_env('py_ver_str')
    pypi_deps_db_src = load_env('pypi_deps_db_src')
    pypi_fetcher_commit = load_env('pypi_fetcher_commit')
    pypi_fetcher_sha256 = load_env('pypi_fetcher_sha256')
    requirements = load_env('requirements')

    platform, system = load_env('system').split('-')

    py_ver = PyVer(py_ver_str)
    nixpkgs = NixpkgsIndex(nixpkgs_json)
    deps_provider = CombinedDependencyProvider(
        conda_channels_json=conda_channels_json,
        nixpkgs=nixpkgs,
        provider_settings=provider_settings,
        pypi_deps_db_src=pypi_deps_db_src,
        py_ver=py_ver,
        platform=platform,
        system=system)
    generator = OverridesGenerator(
        py_ver,
        nixpkgs,
        pypi_fetcher_commit,
        pypi_fetcher_sha256,
        disable_checks,
        ResolvelibResolver(nixpkgs, deps_provider),
    )
    reqs = filter_reqs_by_eval_marker(parse_reqs(requirements),
                                      context(py_ver, platform, system))
    try:
        expr = generator.generate(reqs)
    except ResolutionImpossible as e:
        handle_resolution_impossible(e, requirements, providers_json,
                                     py_ver_str)
        exit(1)
    else:
        with open(out_file, 'w') as f:
            f.write(expr)
예제 #10
0
def env(args, nixpkgs_rev, nixpkgs_sha256):
    target_dir = args.directory
    py_ver = PyVer(args.python)

    expr = gen(args, nixpkgs_rev, nixpkgs_sha256, return_expr=True)
    machnix_file = f"{target_dir}/machnix.nix"
    shell_nix_file = f"{target_dir}/shell.nix"
    default_nix_file = f"{target_dir}/default.nix"
    python_nix_file = f"{target_dir}/python.nix"
    python_nix_content = dedent(f"""
        let
          nixpkgs_commit = "{nixpkgs_rev}";
          nixpkgs_sha256 = "{nixpkgs_sha256}";
          pkgs = import (builtins.fetchTarball {{
            name = "nixpkgs";
            url = "https://github.com/nixos/nixpkgs/tarball/${{nixpkgs_commit}}";
            sha256 = nixpkgs_sha256;
          }}) {{ config = {{}}; overlays = []; }};
          python = pkgs.python{str(py_ver.digits())};
          result = import ./machnix.nix {{ inherit pkgs python; }};
          manylinux1 = pkgs.pythonManylinuxPackages.manylinux1;
          overrides = result.overrides manylinux1 pkgs.autoPatchelfHook;
          py = python.override {{ packageOverrides = overrides; }};
        in
        py.withPackages (ps: result.select_pkgs ps)
    """)
    if not os.path.isdir(target_dir):
        if os.path.exists(target_dir):
            print(
                f'Error: {target_dir} already exists and is not a directory!')
            exit(1)
        os.mkdir(target_dir)
    with open(machnix_file, 'w') as machnix:
        machnix.write(expr)
    with open(python_nix_file, 'w') as python:
        python.write(python_nix_content)
    with open(shell_nix_file, 'w') as shell:
        shell.write("(import ./python.nix).env\n")
    with open(default_nix_file, 'w') as default:
        default.write("import ./shell.nix\n")
    print(f"\nInitialized python environment in {target_dir}\n"
          f"To activate it, execute: 'nix-shell {target_dir}'")
예제 #11
0
def gen(args, return_expr=False):
    with open(args.r) as f:
        requirements = f.read().strip()
    o_file = tempfile.mktemp()
    py_ver = PyVer(args.python)
    cmd = f'nix-build {pwd}/nix/call_mach.nix -o {o_file}' \
          f' --argstr requirements "{requirements}"' \
          f' --argstr python_attr python{py_ver.digits()}'
    proc = sp.run(cmd, shell=True, stdout=sys.stderr)
    if proc.returncode:
        exit(1)
    with open(f"{o_file}/share/mach_nix_file.nix") as src:
        expr = src.read()
        if return_expr:
            return expr
        if getattr(args, 'o', None):
            with open(args.o, 'w') as dest:
                dest.write(expr)
                print(f"Expression written to {args.o}")
        else:
            print(expr)
예제 #12
0
 def __init__(self, py_ver: PyVer, *args, **kwargs):
     self.context = context(py_ver)
     self.context_wheel = self.context.copy()
     self.context_wheel['extra'] = None
     self.py_ver_digits = py_ver.digits()
예제 #13
0
def env(args, nixpkgs_ref):
    target_dir = args.directory
    py_ver = PyVer(args.python)

    default_nix_file = f"{target_dir}/default.nix"
    inputs_nix_file = f"{target_dir}/inputs.nix"
    lock_file = f"{target_dir}/lock.toml"
    python_nix_file = f"{target_dir}/python.nix"
    requirements_file = f"{target_dir}/requirements.txt"
    shell_nix_file = f"{target_dir}/shell.nix"

    machnix_version = os.environ.get("MACHNIX_VERSION", default=None)
    if machnix_version is None:
        with open(f"{pwd}/VERSION") as f:
            machnix_version = f.read()

    with open(args.r) as f:
        requirements = f.read().strip()

    inputs_nix_content = dedent(f"""
        with builtins;
        let
          lock = fromTOML (readFile ./lock.toml);
        in rec {{
          pkgs = import (builtins.fetchTarball {{
            name = "nixpkgs";
            url = "https://github.com/nixos/nixpkgs/tarball/${{lock.nixpkgs.rev}}";
            sha256 = "${{lock.nixpkgs.sha256}}";
          }}) {{ config = {{}}; overlays = []; }};
          mach-nix = import (builtins.fetchTarball {{
            url = "https://github.com/DavHau/mach-nix/tarball/${{lock.mach-nix.rev}}";
            sha256 = lock.mach-nix.sha256;
          }}) {{
            python = "python{py_ver.digits()}";
            inherit pkgs;
          }};
        }}
    """)
    python_nix_content = dedent(f"""
        with (import ./inputs.nix);
        mach-nix.mkPython {{
          requirements = builtins.readFile ./requirements.txt;
        }}
    """)
    shell_nix_content = dedent(f"""
        with (import ./inputs.nix);
        pkgs.mkShell {{
          buildInputs = [
            mach-nix.mach-nix
            (import ./python.nix)
          ];
        }}
    """)
    # ensure target path exists
    if not os.path.isdir(target_dir):
        if os.path.exists(target_dir):
            print(f'Error: {target_dir} already exists and is not a directory!')
            exit(1)
        os.mkdir(target_dir)
    # update lock file if mach-nix version mismatch
    update_lock_file(lock_file, 'DavHau', "mach-nix", machnix_version)
    update_lock_file(lock_file, 'nixos', "nixpkgs", nixpkgs_ref)

    # write requirements file
    with open(default_nix_file, 'w') as default:
        default.write("import ./shell.nix\n")
    with open(inputs_nix_file, 'w') as default:
        default.write(inputs_nix_content)
    with open(python_nix_file, 'w') as python:
        python.write(python_nix_content)
    with open(requirements_file, "w") as dest:
        dest.write(requirements)
    with open(shell_nix_file, 'w') as shell:
        shell.write(shell_nix_content)

    class c:
        HEADER = '\033[95m'
        OKBLUE = '\033[94m'
        OKCYAN = '\033[96m'
        OKGREEN = '\033[92m'
        WARNING = '\033[93m'
        FAIL = '\033[91m'
        ENDC = '\033[0m'
        BOLD = '\033[1m'
        UNDERLINE = '\033[4m'

    print(f"\nInitialized python environment in:                {c.OKCYAN}{target_dir}{c.ENDC}\n"
          f"To change python requirements, modify the file:   {c.OKCYAN}{requirements_file}{c.ENDC}\n\n"
          f"To activate the environment, execute:             {c.BOLD}{c.OKGREEN}nix-shell {target_dir}{c.ENDC}")