# -*- coding: utf-8 -*-
from __future__ import absolute_import
import abc
import attr
import six


@six.add_metaclass(abc.ABCMeta)
class BaseRequirement:
    @classmethod
    def from_line(cls, line):
        """Returns a requirement from a requirements.txt or pip-compatible line"""
        raise NotImplementedError

    @abc.abstractmethod
    def line_part(self):
        """Returns the current requirement as a pip-compatible line"""

    @classmethod
    def from_pipfile(cls, name, pipfile):
        """Returns a requirement from a pipfile entry"""
        raise NotImplementedError

    @abc.abstractmethod
    def pipfile_part(self):
        """Returns the current requirement as a pipfile entry"""

    @classmethod
    def attr_fields(cls):
        return [field.name for field in attr.fields(cls)]

    @property
    def extras_as_pip(self):
        if self.extras:
            return "[{0}]".format(",".join(self.extras))

        return ""