# Copyright 2017 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Import .whl files into Bazel."""

def _whl_impl(repository_ctx):
    """Core implementation of whl_library."""

    args = [
        repository_ctx.attr.python_interpreter,
        repository_ctx.path(repository_ctx.attr._script),
        "--whl",
        repository_ctx.path(repository_ctx.attr.whl),
        "--requirements",
        repository_ctx.attr.requirements,
    ]

    if repository_ctx.attr.extras:
        args += [
            "--extras=%s" % extra
            for extra in repository_ctx.attr.extras
        ]

    result = repository_ctx.execute(args)
    if result.return_code:
        fail("whl_library failed: %s (%s)" % (result.stdout, result.stderr))

whl_library = repository_rule(
    attrs = {
        "extras": attr.string_list(doc = """
A subset of the "extras" available from this `.whl` for which
`requirements` has the dependencies.
"""),
        "python_interpreter": attr.string(default = "python", doc = """
The command to run the Python interpreter used when unpacking the wheel.
"""),
        "requirements": attr.string(doc = """
The name of the `pip_import` repository rule from which to load this
`.whl`'s dependencies.
"""),
        "whl": attr.label(
            mandatory = True,
            allow_single_file = True,
            doc = """
The path to the `.whl` file. The name is expected to follow [this
convention](https://www.python.org/dev/peps/pep-0427/#file-name-convention)).
""",
        ),
        "_script": attr.label(
            executable = True,
            default = Label("//tools:whltool.par"),
            cfg = "host",
        ),
    },
    implementation = _whl_impl,
    doc = """A rule for importing `.whl` dependencies into Bazel.

<b>This rule is currently used to implement `pip_import`. It is not intended to
work standalone, and the interface may change.</b> See `pip_import` for proper
usage.

This rule imports a `.whl` file as a `py_library`:
```python
whl_library(
    name = "foo",
    whl = ":my-whl-file",
    requirements = "name of pip_import rule",
)
```

This rule defines `@foo//:pkg` as a `py_library` target.
""",
)
