# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)

import inspect

from spack import *


class PerlBioperl(PerlPackage):
    """BioPerl is the product of a community effort to produce Perl code which
    is useful in biology. Examples include Sequence objects, Alignment objects
    and database searching objects. These objects not only do what they are
    advertised to do in the documentation, but they also interact - Alignment
    objects are made from the Sequence objects, Sequence objects have access to
    Annotation and SeqFeature objects and databases, Blast objects can be
    converted to Alignment objects, and so on. This means that the objects
    provide a coordinated and extensible framework to do computational biology.

    BioPerl development focuses on Perl classes, or code that is used to create
    objects representing biological entities. There are scripts provided in the
    scripts/ and examples/ directories but scripts are not the main focus of
    the BioPerl developers. Of course, as the objects do most of the hard work
    for you, all you have to do is combine a number of objects together
    sensibly to make useful scripts.

    The intent of the BioPerl development effort is to make reusable tools that
    aid people in creating their own sites or job-specific applications.

    The BioPerl website at https://bioperl.org/ also attempts to maintain links
    and archives of standalone bio-related Perl tools that are not affiliated
    or related to the core BioPerl effort. Check the site for useful code ideas
    and contribute your own if possible."""

    homepage = "https://metacpan.org/pod/BioPerl"
    url      = "https://cpan.metacpan.org/authors/id/C/CD/CDRAUG/BioPerl-1.7.6.tar.gz"

    version('1.7.6',
            sha256='df2a3efc991b9b5d7cc9d038a1452c6dac910c9ad2a0e47e408dd692c111688d',
            preferred=True)
    version('1.007002', sha256='17aa3aaab2f381bbcaffdc370002eaf28f2c341b538068d6586b2276a76464a1',
            url='https://cpan.metacpan.org/authors/id/C/CJ/CJFIELDS/BioPerl-1.007002.tar.gz')

    # According to cpandeps.grinnz.com Module-Build is both a build and run
    # time dependency for BioPerl
    depends_on('perl-module-build', type=('build', 'run'))
    depends_on('perl-uri', type=('build', 'run'))
    depends_on('perl-io-string', type=('build', 'run'))
    depends_on('perl-data-stag', type=('build', 'run'))
    depends_on('perl-test-most', type=('build', 'run'))
    depends_on('perl-error', when='@1.7.6:', type=('build', 'run'))
    depends_on('perl-graph', when='@1.7.6:', type=('build', 'run'))
    depends_on('perl-http-message', when='@1.7.6:', type=('build', 'run'))
    depends_on('perl-io-stringy', when='@1.7.6:', type=('build', 'run'))
    depends_on('perl-ipc-run', when='@1.7.6:', type=('build', 'run'))
    depends_on('perl-list-moreutils', when='@1.7.6:', type=('build', 'run'))
    depends_on('perl-set-scalar', when='@1.7.6:', type=('build', 'run'))
    depends_on('perl-test-requiresinternet', when='@1.7.6:', type=('build', 'run'))
    depends_on('perl-xml-dom', when='@1.7.6:', type=('build', 'run'))
    depends_on('perl-xml-dom-xpath', when='@1.7.6:', type=('build', 'run'))
    depends_on('perl-xml-libxml', when='@1.7.6:', type=('build', 'run'))
    depends_on('perl-xml-sax', when='@1.7.6:', type=('build', 'run'))
    depends_on('perl-xml-sax-base', when='@1.7.6:', type=('build', 'run'))
    depends_on('perl-xml-sax-writer', when='@1.7.6:', type=('build', 'run'))
    depends_on('perl-xml-twig', when='@1.7.6:', type=('build', 'run'))
    depends_on('perl-xml-writer', when='@1.7.6:', type=('build', 'run'))
    depends_on('perl-yaml', when='@1.7.6:', type=('build', 'run'))
    depends_on('perl-libwww-perl', when='@1.7.6:', type=('build', 'run'))
    depends_on('perl-libxml-perl', when='@1.7.6:', type=('build', 'run'))

    @when('@1.007002')
    def configure(self, spec, prefix):
        # Overriding default configure method in order to cater to interactive
        # Build.pl
        self.build_method = 'Build.PL'
        self.build_executable = Executable(
            join_path(self.stage.source_path, 'Build'))

        # Config questions consist of:
        #    Do you want to run the Bio::DB::GFF or Bio::DB::SeqFeature::Store
        #        live database tests? y/n [n]
        #
        #    Install [a]ll BioPerl scripts, [n]one, or choose groups
        #        [i]nteractively? [a]
        #
        #    Do you want to run tests that require connection to servers across
        #        the internet (likely to cause some failures)? y/n [n]
        #
        # Eventually, someone can add capability for the other options, but
        # the current answers are the most practical for a spack install.

        config_answers = ['n\n', 'a\n', 'n\n']
        config_answers_filename = 'spack-config.in'

        with open(config_answers_filename, 'w') as f:
            f.writelines(config_answers)

        with open(config_answers_filename, 'r') as f:
            inspect.getmodule(self).perl('Build.PL', '--install_base=%s' %
                                         self.prefix, input=f)

    # Need to also override the build and install methods to make sure that the
    # Build script is run through perl and not use the shebang, as it might be
    # too long. This is needed because this does not pick up the
    # `@run_after(configure)` step defined in `PerlPackage`.
    @when('@1.007002')
    def build(self, spec, prefix):
        inspect.getmodule(self).perl('Build')

    @when('@1.007002')
    def install(self, spec, prefix):
        inspect.getmodule(self).perl('Build', 'install')
