Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Move parmed to optional dependency #2477

Merged
merged 9 commits into from
Feb 26, 2020

Conversation

lilyminium
Copy link
Member

@lilyminium lilyminium commented Jan 28, 2020

Changes made in this Pull Request:

  • Made ParmEd an optional dependency

If MDAnalysis is going to expand its interoperability with #2468 and more, it seems best to not make users install every library under the sun.

PR Checklist

  • Tests?
  • Docs?
  • CHANGELOG updated?
  • Issue raised/referenced?

@lilyminium lilyminium changed the title moved parmed to optional dependency Moved parmed to optional dependency Jan 28, 2020
@lilyminium lilyminium changed the title Moved parmed to optional dependency Move parmed to optional dependency Jan 28, 2020
@codecov
Copy link

codecov bot commented Jan 28, 2020

Codecov Report

Merging #2477 into develop will increase coverage by 0.1%.
The diff coverage is 0%.

Impacted file tree graph

@@            Coverage Diff             @@
##           develop    #2477     +/-   ##
==========================================
+ Coverage    90.59%   90.69%   +0.1%     
==========================================
  Files          170      170             
  Lines        22860    22860             
  Branches      2944     2944             
==========================================
+ Hits         20709    20733     +24     
+ Misses        1558     1540     -18     
+ Partials       593      587      -6
Impacted Files Coverage Δ
package/MDAnalysis/core/_get_readers.py 96% <ø> (ø) ⬆️
package/MDAnalysis/coordinates/ParmEd.py 83.42% <0%> (+1.14%) ⬆️
...age/MDAnalysis/analysis/hbonds/hbond_autocorrel.py 87.5% <0%> (-0.56%) ⬇️
package/MDAnalysis/core/groups.py 98.38% <0%> (+0.09%) ⬆️
package/MDAnalysis/analysis/waterdynamics.py 90.64% <0%> (+0.23%) ⬆️
package/MDAnalysis/core/topologyobjects.py 97.87% <0%> (+0.35%) ⬆️
package/MDAnalysis/lib/formats/libdcd.pyx 78.96% <0%> (+0.64%) ⬆️
package/MDAnalysis/analysis/gnm.py 96.06% <0%> (+0.78%) ⬆️
package/MDAnalysis/lib/util.py 88.26% <0%> (+0.87%) ⬆️
... and 4 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 1e3f362...b2b2536. Read the comment docs.

@orbeckst
Copy link
Member

If we change our import policy then we should have a quick discussion on the dev list. @lilyminium please propose something with your rationale.

If there's a generic way to detect classes without importing the package then we should codify it.

Also, could we mock anything that it not imported so that the autodetection works but then spits put an automated message that the package XYZ needs to be installed?

Copy link
Member

@orbeckst orbeckst left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we change our import policy then we should have a quick discussion on the dev list. @lilyminium please propose something with your rationale.

@lilyminium
Copy link
Member Author

@orbeckst @richardjgowers

Is there a hack you can do like if str(obj.class.split(‘.’)[0]) == “parmed” which lets you not have to import it?

Yes, pretty much like that. If the dev list agrees we should move ParmEd from the dependencies and put converters in their own module, we could consolidate ParmEdParser and ParmEdReader into some kind of ConverterFromBase subclass (probably with a better name) with a meta class that either tracks the package name, e.g.

class _ConverterFromMeta(type):
    def __init__(cls, name, bases, dct):
        type.__init__(type, name, bases, dct)
        try:
            pkg = dct['package']
        except KeyError:
            pass
        else:
            _CONVERTERS_FROM[pkg.__name__.upper()] = cls

or the class name in the event that there are multiple potentially parseable classes, e.g.

class _ConverterFromMeta(type):
    def __init__(cls, name, bases, dct):
        type.__init__(type, name, bases, dct)
        try:
            klasses = dct['package_classes']
        except KeyError:
            pass
        else:
            for k in klasses:
                k_name = '{}.{}'.format(k.__module__, k.__name__)
                _CONVERTERS_FROM[k_name] = cls

Also, could we mock anything that it not imported so that the autodetection works but then spits put an automated message that the package XYZ needs to be installed?

That's less of a worry than converting to the package. Maybe I'm unimaginative but I wouldn't know how to obtain a ParmEd, etc. class object without actually having it installed. Neither ParmEdReader nor ParmEdParser need to import ParmEd.

@@ -25,7 +25,6 @@
import copy
import inspect
import mmtf
import parmed as pmd
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Given that the standard library has well-designed mocking machinery, is there a reason not to use that approach? I think you can modify mocked objects/methods with pretty much any values you want so they are easy to distinguish from the "real thing."

try:
    import parmed as pmd:
except ImportError:
    from unittest import mock
    # custom mocking modifications as needed
    sys.modules['pmd'] = mock.MagicMock()
    sys.modules['pmd.Structure'] = mock.MagicMock()
    

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I didn't know about this, thanks!

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@tylerjereddy I understand how mocking is super helpful for unit testing but I can't figure out how you would use it for type recognition without, at some point, inspecting the module or class name?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What does the mocked object need to be able to do?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here it would ideally replace if isinstance(obj, pmd.Structure) as the second argument (mock parmed structure).

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This does the trick for me locally, with full diff (to Richard's most recent commit) below the fold & full test suite passing locally:

try:
    import parmed as pmd
except ImportError:
    from unittest import mock
    pmd = mock.MagicMock(Structure=type(None))

Full diff:

diff --git a/package/MDAnalysis/core/_get_readers.py b/package/MDAnalysis/core/_get_readers.py
index 79e65a4c2..0194eb3c1 100644
--- a/package/MDAnalysis/core/_get_readers.py
+++ b/package/MDAnalysis/core/_get_readers.py
@@ -25,6 +25,13 @@ from six import raise_from
 import copy
 import inspect
 import mmtf
+
+try:
+    import parmed as pmd
+except ImportError:
+    from unittest import mock
+    pmd = mock.MagicMock(Structure=type(None))
+
 import numpy as np
 from MDAnalysis.lib.util import isstream
 
@@ -32,15 +39,6 @@ from .. import _READERS, _PARSERS, _MULTIFRAME_WRITERS, _SINGLEFRAME_WRITERS, _C
 from ..lib import util
 
 
-def _is_parmed_object(thing):
-    module = inspect.getmodule(thing.__class__)
-
-    if module is None:
-        return False
-    else:
-        return module.__name__.startswith('parmed')
-
-
 def get_reader_for(filename, format=None):
     """Return the appropriate trajectory reader class for `filename`.
 
@@ -102,7 +100,7 @@ def get_reader_for(filename, format=None):
         elif isinstance(filename, mmtf.MMTFDecoder):
             # mmtf slurps mmtf object
             format = 'MMTF'
-        elif _is_parmed_object(filename):
+        elif isinstance(filename, pmd.Structure):
             format = 'PARMED'
         else:
             # else let the guessing begin!
@@ -247,7 +245,7 @@ def get_parser_for(filename, format=None):
     if format is None:
         if isinstance(filename, mmtf.MMTFDecoder):
             format = 'mmtf'
-        elif _is_parmed_object(filename):
+        elif isinstance(filename, pmd.Structure):
             format = 'PARMED'
         else:
             format = util.guess_format(filename)
diff --git a/testsuite/MDAnalysisTests/coordinates/test_parmed.py b/testsuite/MDAnalysisTests/coordinates/test_parmed.py
index 319f43e7a..f9c624cf9 100644
--- a/testsuite/MDAnalysisTests/coordinates/test_parmed.py
+++ b/testsuite/MDAnalysisTests/coordinates/test_parmed.py
@@ -46,17 +46,6 @@ from MDAnalysisTests.datafiles import (
 
 pmd = pytest.importorskip('parmed')
 
-from MDAnalysis.core._get_readers import _is_parmed_object
-
-
-@pytest.mark.parametrize('thing,reference', [
-    ('foo', False),
-    ([1,2,3], False),
-    (pmd.load_file(GRO), True),
-])
-def test_is_parmed_object(thing, reference):
-    assert _is_parmed_object(thing) == reference
-
 
 
 class TestParmEdReaderGRO:

That said, I'm not going to block on this---I do like that I don't need to add a new function/unit test with my approach since we are leaning on the std library.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was a cool way to deal with missing imports! I'm not sure it's relevant any more now we're doing format hints though (#2533)

@richardjgowers richardjgowers changed the title Move parmed to optional dependency WIP: Move parmed to optional dependency Jan 30, 2020
@RMeli
Copy link
Member

RMeli commented Feb 3, 2020

FYI, the inclusion of parmed causes installation problems on macOS:

Obtaining file:///Users/rmeli/Documents/git/software/mdanalysis/package
Requirement already satisfied: numpy>=1.13.3 in /Users/rmeli/miniconda3/envs/mda-dev/lib/python3.6/site-packages (from MDAnalysis==0.20.2.dev0) (1.17.3)
Requirement already satisfied: biopython>=1.71 in /Users/rmeli/miniconda3/envs/mda-dev/lib/python3.6/site-packages (from MDAnalysis==0.20.2.dev0) (1.74)
Requirement already satisfied: networkx>=1.0 in /Users/rmeli/miniconda3/envs/mda-dev/lib/python3.6/site-packages (from MDAnalysis==0.20.2.dev0) (2.3)
Requirement already satisfied: GridDataFormats>=0.4.0 in /Users/rmeli/miniconda3/envs/mda-dev/lib/python3.6/site-packages (from MDAnalysis==0.20.2.dev0) (0.5.0)
Requirement already satisfied: six>=1.4.0 in /Users/rmeli/miniconda3/envs/mda-dev/lib/python3.6/site-packages (from MDAnalysis==0.20.2.dev0) (1.13.0)
Requirement already satisfied: mmtf-python>=1.0.0 in /Users/rmeli/miniconda3/envs/mda-dev/lib/python3.6/site-packages (from MDAnalysis==0.20.2.dev0) (1.1.2)
Requirement already satisfied: joblib>=0.12 in /Users/rmeli/miniconda3/envs/mda-dev/lib/python3.6/site-packages (from MDAnalysis==0.20.2.dev0) (0.13.2)
Requirement already satisfied: scipy>=1.0.0 in /Users/rmeli/miniconda3/envs/mda-dev/lib/python3.6/site-packages (from MDAnalysis==0.20.2.dev0) (1.3.2)
Requirement already satisfied: matplotlib>=1.5.1 in /Users/rmeli/miniconda3/envs/mda-dev/lib/python3.6/site-packages (from MDAnalysis==0.20.2.dev0) (3.1.2)
Requirement already satisfied: mock in /Users/rmeli/miniconda3/envs/mda-dev/lib/python3.6/site-packages (from MDAnalysis==0.20.2.dev0) (3.0.5)
Collecting parmed
  Using cached https://files.pythonhosted.org/packages/ba/a2/d6a9135efd6b1f7d70b79019a2fb2cd1472fceed979e66deaba64e2b641c/ParmEd-3.2.0.tar.gz
Requirement already satisfied: gsd>=1.4.0 in /Users/rmeli/miniconda3/envs/mda-dev/lib/python3.6/site-packages (from MDAnalysis==0.20.2.dev0) (1.8.0)
Requirement already satisfied: decorator>=4.3.0 in /Users/rmeli/miniconda3/envs/mda-dev/lib/python3.6/site-packages (from networkx>=1.0->MDAnalysis==0.20.2.dev0) (4.4.1)
Requirement already satisfied: msgpack>=0.5.6 in /Users/rmeli/miniconda3/envs/mda-dev/lib/python3.6/site-packages (from mmtf-python>=1.0.0->MDAnalysis==0.20.2.dev0) (0.6.1)
Requirement already satisfied: python-dateutil>=2.1 in /Users/rmeli/miniconda3/envs/mda-dev/lib/python3.6/site-packages (from matplotlib>=1.5.1->MDAnalysis==0.20.2.dev0) (2.8.1)
Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /Users/rmeli/miniconda3/envs/mda-dev/lib/python3.6/site-packages (from matplotlib>=1.5.1->MDAnalysis==0.20.2.dev0) (2.4.5)
Requirement already satisfied: cycler>=0.10 in /Users/rmeli/miniconda3/envs/mda-dev/lib/python3.6/site-packages (from matplotlib>=1.5.1->MDAnalysis==0.20.2.dev0) (0.10.0)
Requirement already satisfied: kiwisolver>=1.0.1 in /Users/rmeli/miniconda3/envs/mda-dev/lib/python3.6/site-packages (from matplotlib>=1.5.1->MDAnalysis==0.20.2.dev0) (1.1.0)
Requirement already satisfied: setuptools in /Users/rmeli/miniconda3/envs/mda-dev/lib/python3.6/site-packages (from kiwisolver>=1.0.1->matplotlib>=1.5.1->MDAnalysis==0.20.2.dev0) (42.0.2.post20191201)
Building wheels for collected packages: parmed
  Building wheel for parmed (setup.py) ... error
  ERROR: Command errored out with exit status 1:
   command: /Users/rmeli/miniconda3/envs/mda-dev/bin/python -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/r0/2dklzyn57d59g13_21b6kt7h0000gp/T/pip-install-j_2qhq_k/parmed/setup.py'"'"'; __file__='"'"'/private/var/folders/r0/2dklzyn57d59g13_21b6kt7h0000gp/T/pip-install-j_2qhq_k/parmed/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /private/var/folders/r0/2dklzyn57d59g13_21b6kt7h0000gp/T/pip-wheel-zjgfscy4 --python-tag cp36
       cwd: /private/var/folders/r0/2dklzyn57d59g13_21b6kt7h0000gp/T/pip-install-j_2qhq_k/parmed/
  Complete output (164 lines):
  running bdist_wheel
  running build
  running build_py
  creating build
  creating build/lib.macosx-10.7-x86_64-3.6
  creating build/lib.macosx-10.7-x86_64-3.6/parmed
  copying parmed/symmetry.py -> build/lib.macosx-10.7-x86_64-3.6/parmed
  copying parmed/periodic_table.py -> build/lib.macosx-10.7-x86_64-3.6/parmed
  copying parmed/_version.py -> build/lib.macosx-10.7-x86_64-3.6/parmed
  copying parmed/constants.py -> build/lib.macosx-10.7-x86_64-3.6/parmed
  copying parmed/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed
  copying parmed/residue.py -> build/lib.macosx-10.7-x86_64-3.6/parmed
  copying parmed/geometry.py -> build/lib.macosx-10.7-x86_64-3.6/parmed
  copying parmed/structure.py -> build/lib.macosx-10.7-x86_64-3.6/parmed
  copying parmed/parameters.py -> build/lib.macosx-10.7-x86_64-3.6/parmed
  copying parmed/exceptions.py -> build/lib.macosx-10.7-x86_64-3.6/parmed
  copying parmed/scripts.py -> build/lib.macosx-10.7-x86_64-3.6/parmed
  copying parmed/topologyobjects.py -> build/lib.macosx-10.7-x86_64-3.6/parmed
  copying parmed/vec3.py -> build/lib.macosx-10.7-x86_64-3.6/parmed
  creating build/lib.macosx-10.7-x86_64-3.6/parmed/amber
  copying parmed/amber/mask.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber
  copying parmed/amber/_tinkerparm.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber
  copying parmed/amber/netcdffiles.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber
  copying parmed/amber/_amberparm.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber
  copying parmed/amber/titratable_residues.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber
  copying parmed/amber/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber
  copying parmed/amber/_chamberparm.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber
  copying parmed/amber/asciicrd.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber
  copying parmed/amber/offlib.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber
  copying parmed/amber/parameters.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber
  copying parmed/amber/readparm.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber
  copying parmed/amber/amberformat.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber
  creating build/lib.macosx-10.7-x86_64-3.6/parmed/modeller
  copying parmed/modeller/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/modeller
  copying parmed/modeller/residue.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/modeller
  copying parmed/modeller/standardtemplates.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/modeller
  creating build/lib.macosx-10.7-x86_64-3.6/parmed/tinker
  copying parmed/tinker/system.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tinker
  copying parmed/tinker/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tinker
  copying parmed/tinker/tinkerfiles.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tinker
  copying parmed/tinker/topologyobjects.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tinker
  copying parmed/tinker/parameterfile.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tinker
  creating build/lib.macosx-10.7-x86_64-3.6/parmed/unit
  copying parmed/unit/prefix.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/unit
  copying parmed/unit/unit_definitions.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/unit
  copying parmed/unit/constants.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/unit
  copying parmed/unit/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/unit
  copying parmed/unit/mymatrix.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/unit
  copying parmed/unit/unit_math.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/unit
  copying parmed/unit/unit.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/unit
  copying parmed/unit/standard_dimensions.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/unit
  copying parmed/unit/baseunit.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/unit
  copying parmed/unit/unit_operators.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/unit
  copying parmed/unit/quantity.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/unit
  copying parmed/unit/basedimension.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/unit
  creating build/lib.macosx-10.7-x86_64-3.6/parmed/amber/mdin
  copying parmed/amber/mdin/pb.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber/mdin
  copying parmed/amber/mdin/cntrl.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber/mdin
  copying parmed/amber/mdin/ewald.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber/mdin
  copying parmed/amber/mdin/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber/mdin
  copying parmed/amber/mdin/qmmm.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber/mdin
  copying parmed/amber/mdin/mdin.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber/mdin
  creating build/lib.macosx-10.7-x86_64-3.6/parmed/charmm
  copying parmed/charmm/charmmcrds.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/charmm
  copying parmed/charmm/_charmmfile.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/charmm
  copying parmed/charmm/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/charmm
  copying parmed/charmm/psf.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/charmm
  copying parmed/charmm/parameters.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/charmm
  creating build/lib.macosx-10.7-x86_64-3.6/parmed/formats
  creating build/lib.macosx-10.7-x86_64-3.6/parmed/formats/pdbx
  copying parmed/formats/pdbx/PdbxContainers.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/formats/pdbx
  copying parmed/formats/pdbx/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/formats/pdbx
  copying parmed/formats/pdbx/PdbxReader.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/formats/pdbx
  copying parmed/formats/pdbx/PdbxWriter.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/formats/pdbx
  creating build/lib.macosx-10.7-x86_64-3.6/parmed/rosetta
  copying parmed/rosetta/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/rosetta
  copying parmed/rosetta/pose.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/rosetta
  creating build/lib.macosx-10.7-x86_64-3.6/parmed/rdkit
  copying parmed/rdkit/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/rdkit
  copying parmed/rdkit/rdkit.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/rdkit
  copying parmed/formats/registry.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/formats
  copying parmed/formats/mol2.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/formats
  copying parmed/formats/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/formats
  copying parmed/formats/psf.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/formats
  copying parmed/formats/pdb.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/formats
  copying parmed/formats/sdf.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/formats
  copying parmed/formats/pqr.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/formats
  creating build/lib.macosx-10.7-x86_64-3.6/parmed/utils
  creating build/lib.macosx-10.7-x86_64-3.6/parmed/utils/fortranformat
  copying parmed/utils/fortranformat/_output.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils/fortranformat
  copying parmed/utils/fortranformat/FortranRecordWriter.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils/fortranformat
  copying parmed/utils/fortranformat/config.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils/fortranformat
  copying parmed/utils/fortranformat/FortranRecordReader.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils/fortranformat
  copying parmed/utils/fortranformat/_edit_descriptors.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils/fortranformat
  copying parmed/utils/fortranformat/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils/fortranformat
  copying parmed/utils/fortranformat/_parser.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils/fortranformat
  copying parmed/utils/fortranformat/_input.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils/fortranformat
  copying parmed/utils/fortranformat/_lexer.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils/fortranformat
  copying parmed/utils/fortranformat/_exceptions.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils/fortranformat
  copying parmed/utils/fortranformat/_misc.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils/fortranformat
  creating build/lib.macosx-10.7-x86_64-3.6/parmed/openmm
  copying parmed/openmm/xmlfile.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/openmm
  copying parmed/openmm/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/openmm
  copying parmed/openmm/utils.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/openmm
  copying parmed/openmm/parameters.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/openmm
  copying parmed/openmm/reporters.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/openmm
  copying parmed/openmm/topsystem.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/openmm
  copying parmed/utils/pairlist.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils
  copying parmed/utils/timer.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils
  copying parmed/utils/io.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils
  copying parmed/utils/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils
  copying parmed/utils/pandautils.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils
  copying parmed/utils/netcdf.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils
  copying parmed/utils/six.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils
  copying parmed/utils/decorators.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils
  creating build/lib.macosx-10.7-x86_64-3.6/parmed/gromacs
  copying parmed/gromacs/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/gromacs
  copying parmed/gromacs/gromacsgro.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/gromacs
  copying parmed/gromacs/_gromacsfile.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/gromacs
  copying parmed/gromacs/_cpp.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/gromacs
  copying parmed/gromacs/gromacstop.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/gromacs
  creating build/lib.macosx-10.7-x86_64-3.6/parmed/tools
  copying parmed/tools/argumentlist.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools
  copying parmed/tools/parmed_cmd.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools
  copying parmed/tools/actions.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools
  copying parmed/tools/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools
  copying parmed/tools/addljtype.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools
  copying parmed/tools/parmlist.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools
  copying parmed/tools/checkvalidity.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools
  copying parmed/tools/coarsegrain.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools
  copying parmed/tools/exceptions.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools
  copying parmed/tools/add1264.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools
  copying parmed/tools/logos.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools
  copying parmed/tools/changeradii.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools
  creating build/lib.macosx-10.7-x86_64-3.6/parmed/namd
  copying parmed/namd/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/namd
  copying parmed/namd/namdbinfiles.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/namd
  creating build/lib.macosx-10.7-x86_64-3.6/parmed/tools/gui
  copying parmed/tools/gui/_guiactions.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools/gui
  copying parmed/tools/gui/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools/gui
  copying parmed/tools/gui/guiactions.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools/gui
  copying parmed/tools/gui/guifiletools.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools/gui
  copying parmed/tools/gui/guitools.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools/gui
  copying parmed/tools/gui/_guiwidgets.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools/gui
  creating build/lib.macosx-10.7-x86_64-3.6/parmed/tools/simulations
  copying parmed/tools/simulations/sanderapi.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools/simulations
  copying parmed/tools/simulations/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools/simulations
  copying parmed/tools/simulations/openmm.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools/simulations
  creating build/lib.macosx-10.7-x86_64-3.6/parmed/modeller/data
  copying parmed/modeller/data/standard_residues.lib -> build/lib.macosx-10.7-x86_64-3.6/parmed/modeller/data
  UPDATING build/lib.macosx-10.7-x86_64-3.6/parmed/_version.py
  set build/lib.macosx-10.7-x86_64-3.6/parmed/_version.py to '3.2.0'
  running build_ext
  building 'parmed.amber._rdparm' extension
  creating build/temp.macosx-10.7-x86_64-3.6
  creating build/temp.macosx-10.7-x86_64-3.6/src
  clang -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/Users/rmeli/miniconda3/envs/mda-dev/include -arch x86_64 -I/Users/rmeli/miniconda3/envs/mda-dev/include -arch x86_64 -I/private/var/folders/r0/2dklzyn57d59g13_21b6kt7h0000gp/T/pip-install-j_2qhq_k/parmed/src -I/Users/rmeli/miniconda3/envs/mda-dev/include/python3.6m -c src/_rdparm.cpp -o build/temp.macosx-10.7-x86_64-3.6/src/_rdparm.o
  warning: include path for stdlibc++ headers not found; pass '-stdlib=libc++' on the command line to use the libc++ standard library instead [-Wstdlibcxx-not-found]
  In file included from src/_rdparm.cpp:17:
  /private/var/folders/r0/2dklzyn57d59g13_21b6kt7h0000gp/T/pip-install-j_2qhq_k/parmed/src/readparm.h:5:10: fatal error: 'locale' file not found
  #include <locale>
           ^~~~~~~~
  1 warning and 1 error generated.
  error: command 'clang' failed with exit status 1
  ----------------------------------------
  ERROR: Failed building wheel for parmed
  Running setup.py clean for parmed
Failed to build parmed
Installing collected packages: parmed, MDAnalysis
    Running setup.py install for parmed ... error
    ERROR: Command errored out with exit status 1:
     command: /Users/rmeli/miniconda3/envs/mda-dev/bin/python -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/r0/2dklzyn57d59g13_21b6kt7h0000gp/T/pip-install-j_2qhq_k/parmed/setup.py'"'"'; __file__='"'"'/private/var/folders/r0/2dklzyn57d59g13_21b6kt7h0000gp/T/pip-install-j_2qhq_k/parmed/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /private/var/folders/r0/2dklzyn57d59g13_21b6kt7h0000gp/T/pip-record-492qkw53/install-record.txt --single-version-externally-managed --compile
         cwd: /private/var/folders/r0/2dklzyn57d59g13_21b6kt7h0000gp/T/pip-install-j_2qhq_k/parmed/
    Complete output (164 lines):
    running install
    running build
    running build_py
    creating build
    creating build/lib.macosx-10.7-x86_64-3.6
    creating build/lib.macosx-10.7-x86_64-3.6/parmed
    copying parmed/symmetry.py -> build/lib.macosx-10.7-x86_64-3.6/parmed
    copying parmed/periodic_table.py -> build/lib.macosx-10.7-x86_64-3.6/parmed
    copying parmed/_version.py -> build/lib.macosx-10.7-x86_64-3.6/parmed
    copying parmed/constants.py -> build/lib.macosx-10.7-x86_64-3.6/parmed
    copying parmed/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed
    copying parmed/residue.py -> build/lib.macosx-10.7-x86_64-3.6/parmed
    copying parmed/geometry.py -> build/lib.macosx-10.7-x86_64-3.6/parmed
    copying parmed/structure.py -> build/lib.macosx-10.7-x86_64-3.6/parmed
    copying parmed/parameters.py -> build/lib.macosx-10.7-x86_64-3.6/parmed
    copying parmed/exceptions.py -> build/lib.macosx-10.7-x86_64-3.6/parmed
    copying parmed/scripts.py -> build/lib.macosx-10.7-x86_64-3.6/parmed
    copying parmed/topologyobjects.py -> build/lib.macosx-10.7-x86_64-3.6/parmed
    copying parmed/vec3.py -> build/lib.macosx-10.7-x86_64-3.6/parmed
    creating build/lib.macosx-10.7-x86_64-3.6/parmed/amber
    copying parmed/amber/mask.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber
    copying parmed/amber/_tinkerparm.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber
    copying parmed/amber/netcdffiles.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber
    copying parmed/amber/_amberparm.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber
    copying parmed/amber/titratable_residues.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber
    copying parmed/amber/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber
    copying parmed/amber/_chamberparm.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber
    copying parmed/amber/asciicrd.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber
    copying parmed/amber/offlib.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber
    copying parmed/amber/parameters.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber
    copying parmed/amber/readparm.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber
    copying parmed/amber/amberformat.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber
    creating build/lib.macosx-10.7-x86_64-3.6/parmed/modeller
    copying parmed/modeller/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/modeller
    copying parmed/modeller/residue.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/modeller
    copying parmed/modeller/standardtemplates.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/modeller
    creating build/lib.macosx-10.7-x86_64-3.6/parmed/tinker
    copying parmed/tinker/system.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tinker
    copying parmed/tinker/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tinker
    copying parmed/tinker/tinkerfiles.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tinker
    copying parmed/tinker/topologyobjects.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tinker
    copying parmed/tinker/parameterfile.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tinker
    creating build/lib.macosx-10.7-x86_64-3.6/parmed/unit
    copying parmed/unit/prefix.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/unit
    copying parmed/unit/unit_definitions.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/unit
    copying parmed/unit/constants.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/unit
    copying parmed/unit/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/unit
    copying parmed/unit/mymatrix.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/unit
    copying parmed/unit/unit_math.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/unit
    copying parmed/unit/unit.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/unit
    copying parmed/unit/standard_dimensions.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/unit
    copying parmed/unit/baseunit.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/unit
    copying parmed/unit/unit_operators.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/unit
    copying parmed/unit/quantity.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/unit
    copying parmed/unit/basedimension.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/unit
    creating build/lib.macosx-10.7-x86_64-3.6/parmed/amber/mdin
    copying parmed/amber/mdin/pb.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber/mdin
    copying parmed/amber/mdin/cntrl.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber/mdin
    copying parmed/amber/mdin/ewald.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber/mdin
    copying parmed/amber/mdin/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber/mdin
    copying parmed/amber/mdin/qmmm.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber/mdin
    copying parmed/amber/mdin/mdin.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/amber/mdin
    creating build/lib.macosx-10.7-x86_64-3.6/parmed/charmm
    copying parmed/charmm/charmmcrds.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/charmm
    copying parmed/charmm/_charmmfile.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/charmm
    copying parmed/charmm/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/charmm
    copying parmed/charmm/psf.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/charmm
    copying parmed/charmm/parameters.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/charmm
    creating build/lib.macosx-10.7-x86_64-3.6/parmed/formats
    creating build/lib.macosx-10.7-x86_64-3.6/parmed/formats/pdbx
    copying parmed/formats/pdbx/PdbxContainers.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/formats/pdbx
    copying parmed/formats/pdbx/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/formats/pdbx
    copying parmed/formats/pdbx/PdbxReader.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/formats/pdbx
    copying parmed/formats/pdbx/PdbxWriter.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/formats/pdbx
    creating build/lib.macosx-10.7-x86_64-3.6/parmed/rosetta
    copying parmed/rosetta/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/rosetta
    copying parmed/rosetta/pose.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/rosetta
    creating build/lib.macosx-10.7-x86_64-3.6/parmed/rdkit
    copying parmed/rdkit/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/rdkit
    copying parmed/rdkit/rdkit.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/rdkit
    copying parmed/formats/registry.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/formats
    copying parmed/formats/mol2.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/formats
    copying parmed/formats/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/formats
    copying parmed/formats/psf.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/formats
    copying parmed/formats/pdb.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/formats
    copying parmed/formats/sdf.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/formats
    copying parmed/formats/pqr.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/formats
    creating build/lib.macosx-10.7-x86_64-3.6/parmed/utils
    creating build/lib.macosx-10.7-x86_64-3.6/parmed/utils/fortranformat
    copying parmed/utils/fortranformat/_output.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils/fortranformat
    copying parmed/utils/fortranformat/FortranRecordWriter.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils/fortranformat
    copying parmed/utils/fortranformat/config.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils/fortranformat
    copying parmed/utils/fortranformat/FortranRecordReader.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils/fortranformat
    copying parmed/utils/fortranformat/_edit_descriptors.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils/fortranformat
    copying parmed/utils/fortranformat/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils/fortranformat
    copying parmed/utils/fortranformat/_parser.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils/fortranformat
    copying parmed/utils/fortranformat/_input.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils/fortranformat
    copying parmed/utils/fortranformat/_lexer.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils/fortranformat
    copying parmed/utils/fortranformat/_exceptions.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils/fortranformat
    copying parmed/utils/fortranformat/_misc.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils/fortranformat
    creating build/lib.macosx-10.7-x86_64-3.6/parmed/openmm
    copying parmed/openmm/xmlfile.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/openmm
    copying parmed/openmm/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/openmm
    copying parmed/openmm/utils.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/openmm
    copying parmed/openmm/parameters.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/openmm
    copying parmed/openmm/reporters.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/openmm
    copying parmed/openmm/topsystem.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/openmm
    copying parmed/utils/pairlist.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils
    copying parmed/utils/timer.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils
    copying parmed/utils/io.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils
    copying parmed/utils/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils
    copying parmed/utils/pandautils.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils
    copying parmed/utils/netcdf.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils
    copying parmed/utils/six.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils
    copying parmed/utils/decorators.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/utils
    creating build/lib.macosx-10.7-x86_64-3.6/parmed/gromacs
    copying parmed/gromacs/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/gromacs
    copying parmed/gromacs/gromacsgro.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/gromacs
    copying parmed/gromacs/_gromacsfile.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/gromacs
    copying parmed/gromacs/_cpp.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/gromacs
    copying parmed/gromacs/gromacstop.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/gromacs
    creating build/lib.macosx-10.7-x86_64-3.6/parmed/tools
    copying parmed/tools/argumentlist.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools
    copying parmed/tools/parmed_cmd.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools
    copying parmed/tools/actions.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools
    copying parmed/tools/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools
    copying parmed/tools/addljtype.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools
    copying parmed/tools/parmlist.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools
    copying parmed/tools/checkvalidity.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools
    copying parmed/tools/coarsegrain.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools
    copying parmed/tools/exceptions.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools
    copying parmed/tools/add1264.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools
    copying parmed/tools/logos.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools
    copying parmed/tools/changeradii.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools
    creating build/lib.macosx-10.7-x86_64-3.6/parmed/namd
    copying parmed/namd/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/namd
    copying parmed/namd/namdbinfiles.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/namd
    creating build/lib.macosx-10.7-x86_64-3.6/parmed/tools/gui
    copying parmed/tools/gui/_guiactions.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools/gui
    copying parmed/tools/gui/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools/gui
    copying parmed/tools/gui/guiactions.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools/gui
    copying parmed/tools/gui/guifiletools.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools/gui
    copying parmed/tools/gui/guitools.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools/gui
    copying parmed/tools/gui/_guiwidgets.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools/gui
    creating build/lib.macosx-10.7-x86_64-3.6/parmed/tools/simulations
    copying parmed/tools/simulations/sanderapi.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools/simulations
    copying parmed/tools/simulations/__init__.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools/simulations
    copying parmed/tools/simulations/openmm.py -> build/lib.macosx-10.7-x86_64-3.6/parmed/tools/simulations
    creating build/lib.macosx-10.7-x86_64-3.6/parmed/modeller/data
    copying parmed/modeller/data/standard_residues.lib -> build/lib.macosx-10.7-x86_64-3.6/parmed/modeller/data
    UPDATING build/lib.macosx-10.7-x86_64-3.6/parmed/_version.py
    set build/lib.macosx-10.7-x86_64-3.6/parmed/_version.py to '3.2.0'
    running build_ext
    building 'parmed.amber._rdparm' extension
    creating build/temp.macosx-10.7-x86_64-3.6
    creating build/temp.macosx-10.7-x86_64-3.6/src
    clang -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/Users/rmeli/miniconda3/envs/mda-dev/include -arch x86_64 -I/Users/rmeli/miniconda3/envs/mda-dev/include -arch x86_64 -I/private/var/folders/r0/2dklzyn57d59g13_21b6kt7h0000gp/T/pip-install-j_2qhq_k/parmed/src -I/Users/rmeli/miniconda3/envs/mda-dev/include/python3.6m -c src/_rdparm.cpp -o build/temp.macosx-10.7-x86_64-3.6/src/_rdparm.o
    warning: include path for stdlibc++ headers not found; pass '-stdlib=libc++' on the command line to use the libc++ standard library instead [-Wstdlibcxx-not-found]
    In file included from src/_rdparm.cpp:17:
    /private/var/folders/r0/2dklzyn57d59g13_21b6kt7h0000gp/T/pip-install-j_2qhq_k/parmed/src/readparm.h:5:10: fatal error: 'locale' file not found
    #include <locale>
             ^~~~~~~~
    1 warning and 1 error generated.
    error: command 'clang' failed with exit status 1
    ----------------------------------------
ERROR: Command errored out with exit status 1: /Users/rmeli/miniconda3/envs/mda-dev/bin/python -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/r0/2dklzyn57d59g13_21b6kt7h0000gp/T/pip-install-j_2qhq_k/parmed/setup.py'"'"'; __file__='"'"'/private/var/folders/r0/2dklzyn57d59g13_21b6kt7h0000gp/T/pip-install-j_2qhq_k/parmed/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /private/var/folders/r0/2dklzyn57d59g13_21b6kt7h0000gp/T/pip-record-492qkw53/install-record.txt --single-version-externally-managed --compile Check the logs for full command output.

OS: macOS 10.15.3
Compiler: clang
Python: 3.6.7
MDAnalysis: 6d6b862

@richardjgowers
Copy link
Member

richardjgowers commented Feb 3, 2020 via email

@RMeli
Copy link
Member

RMeli commented Feb 3, 2020

@richardjgowers I was testing exactly that while you asked. ;) Using parmed from conda-forge does solve the issue. However I had to upgrade to Python 3.7:

Specifications:

  - parmed -> python[version='>=3.7,<3.8.0a0|>=3.8,<3.9.0a0']

Your python: python=3.6

My report was mainly to support the case of parmed as optional dependency.

@richardjgowers
Copy link
Member

@RMeli can you report that upstream to them? I can't reproduce on 10.14.5 so I think it's another one of the great new features in .15.

@RMeli
Copy link
Member

RMeli commented Feb 9, 2020

ParmEd/ParmEd#1077

@richardjgowers
Copy link
Member

richardjgowers commented Feb 9, 2020 via email

@RMeli
Copy link
Member

RMeli commented Feb 9, 2020

@richardjgowers sorry for the misunderstanding, I changed the issue.

@richardjgowers
Copy link
Member

@lilyminium I've pushed to your branch to make this detect parmed stuff without importing parmed

@lilyminium
Copy link
Member Author

lilyminium commented Feb 9, 2020

Thanks @richardjgowers and @RMeli . With limited time in February (😔) I'm prioritising the user guide but I will work on this when I can

@richardjgowers
Copy link
Member

Ok I've force pushed and fixed this up with the new HINT stuff (#2533). So now parmed is optional, but still installed for our CI testing

@richardjgowers richardjgowers changed the title WIP: Move parmed to optional dependency Move parmed to optional dependency Feb 18, 2020
Copy link
Member

@orbeckst orbeckst left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just to make sure: even if a user does not have parmed installed, they are still able to use MDAnalysis without any issues (except not being able to work with pmd objects)?

(Do we still have a "minimal" test where we only install a limited set of packages?)

@@ -163,8 +163,9 @@ def convert(self, obj):
try:
import parmed as pmd
except ModuleNotFoundError:
raise ValueError('Parmed is required for ParmEdConverter but '
'is not installed.')
raise ImportError('ParmEd is required for ParmEdConverter but '
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we import coordinates.ParmEd anywhere, i.e., is it guaranteed that this does not break the installation for anyone not having ParmEd?

@richardjgowers
Copy link
Member

richardjgowers commented Feb 18, 2020 via email

@richardjgowers
Copy link
Member

Ok I've tweaked travis so parmed isn't installed in the minimal build, if this works then hopefully @orbeckst 's question is answered

make minimal build really minimal (ie no duecredit or parmed)
@richardjgowers richardjgowers merged commit 18b50cd into MDAnalysis:develop Feb 26, 2020
@lilyminium lilyminium deleted the parmed-setup branch April 14, 2020 08:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants