Skip to content

Instantly share code, notes, and snippets.

@sbliven
Created January 28, 2021 16:25
Show Gist options
  • Save sbliven/aab43e1f0bce1f4ac63aaaaa718df0b3 to your computer and use it in GitHub Desktop.
Save sbliven/aab43e1f0bce1f4ac63aaaaa718df0b3 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "realistic-incentive",
"metadata": {},
"outputs": [],
"source": [
"import functools\n",
"import re\n",
"from dataclasses import dataclass\n",
"from typing import Dict, List, Optional\n",
"\n",
"from conda.models import version as cv"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "lonely-separate",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"VersionSpec('>1.0,<4.0')"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"v = cv.VersionSpec(\">1.0,<4.0\")\n",
"v"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "possible-cleaner",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"v.match(\"3.0\")"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "distributed-secretariat",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"False"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"v.match(\"4.0\")"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "fitted-directive",
"metadata": {},
"outputs": [],
"source": [
"# https://stackoverflow.com/questions/62288835/how-to-interpret-conda-package-conflicts\n",
"conflictstr = \"\"\"Package ncurses conflicts for:\n",
"python=3.8 -> ncurses[version='>=6.1,<6.2.0a0|>=6.2,<7.0a0|>=6.1,<7.0a0']\n",
"awscli -> python[version='>=3.8,<3.9.0a0'] -> ncurses[version='5.9.*|5.9|>=6.1,<6.2.0a0|>=6.2,<7.0a0|>=6.1,<7.0a0|>=6.0,<7.0a0|6.0.*']\n",
"instrain -> python[version='>=3.4'] -> ncurses[version='5.9.*|5.9|>=6.1,<6.2.0a0|>=6.2,<7.0a0|>=6.1,<7.0a0|>=6.0,<7.0a0|6.0.*']\n",
"python=3.8 -> readline[version='>=7.0,<8.0a0'] -> ncurses[version='5.9.*|>=6.0,<7.0a0|6.0.*']\n",
"samtools -> ncurses[version='5.9|5.9.*|>=5.9,<5.10.0a0|>=6.1,<6.2.0a0']\n",
"\n",
"Package python conflicts for:\n",
"awscli -> python[version='2.7.*|3.5.*|3.6.*|>=2.7,<2.8.0a0|>=3.6,<3.7.0a0|>=3.7,<3.8.0a0|>=3.8,<3.9.0a0|>=3.5,<3.6.0a0|3.4.*']\n",
"python=3.8\n",
"instrain -> biopython -> python[version='2.7.*|3.5.*|3.6.*|>=2.7,<2.8.0a0|>=3.6,<3.7.0a0|>=3.8,<3.9.0a0|>=3.7,<3.8.0a0|>=3.5,<3.6.0a0|3.4.*|>3|>=3.5|<3.0.0|>=3.6']\n",
"instrain -> python[version='>=3.4']\n",
"awscli -> python_abi=3.8[build=*_cp38] -> python[version='3.7.*|3.8.*']\n",
"\n",
"Package ca-certificates conflicts for:\n",
"samtools -> openssl[version='>=1.1.1a,<1.1.2a'] -> ca-certificates\n",
"python=3.8 -> openssl[version='>=1.1.1g,<1.1.2a'] -> ca-certificates\n",
"awscli -> python[version='>=2.7,<2.8.0a0'] -> ca-certificates\n",
"\n",
"Package setuptools conflicts for:\n",
"python=3.8 -> pip -> setuptools\n",
"instrain -> matplotlib-base -> setuptools[version='>=40.0']\n",
"\n",
"Package libgcc-ng conflicts for:\n",
"samtools -> ncurses[version='>=6.1,<6.2.0a0'] -> libgcc-ng[version='>=7.2.0']\n",
"samtools -> libgcc-ng[version='>=4.9|>=7.3.0']\n",
"\n",
"Package pypy3.6 conflicts for:\n",
"instrain -> numpy -> pypy3.6[version='7.3.0.*|7.3.1.*|>=7.3.1']\n",
"awscli -> python[version='>=3.6,<3.7.0a0'] -> pypy3.6[version='7.3.*|7.3.0.*|7.3.1.*']\n",
"\n",
"Package bzip2 conflicts for:\n",
"samtools -> bzip2[version='1.0.*|>=1.0.6,<2.0a0|>=1.0.8,<2.0a0']\n",
"instrain -> pysam -> bzip2[version='>=1.0.6,<2.0a0|>=1.0.8,<2.0a0']\n",
"awscli -> python[version='>=3.7,<3.8.0a0'] -> bzip2[version='>=1.0.6,<2.0a0|>=1.0.8,<2.0a0']\n",
"\n",
"Package zlib conflicts for:\n",
"samtools -> zlib[version='1.2.11.*|>=1.2.11,<1.3.0a0|1.2.8.*|1.2.8']\n",
"samtools -> curl[version='>=7.59.0,<8.0a0'] -> zlib[version='1.2.*|1.2.11']\n",
"\n",
"Package samtools conflicts for:\n",
"samtools\n",
"instrain -> pysam -> samtools[version='1.3|1.3.1.*|1.3.1|1.5.*|1.6.*|1.7|1.7.*|1.9.*|>=1.4.1|>=1.4.1,<1.5|>=1.4,<1.5|>=1.3,<1.4|>=1.3']\n",
"\n",
"Package openssl conflicts for:\n",
"samtools -> curl[version='>=7.59.0,<8.0a0'] -> openssl[version='1.0.*|>=1.0.2o,<1.0.3a|>=1.0.2m,<1.0.3a']\n",
"samtools -> openssl[version='>=1.0.2p,<1.0.3a|>=1.0.2r,<1.0.3a|>=1.1.1a,<1.1.2a']\n",
"\n",
"Package _libgcc_mutex conflicts for:\n",
"samtools -> libgcc-ng[version='>=7.3.0'] -> _libgcc_mutex[version='*|0.1',build='main|conda_forge']\n",
"python=3.8 -> libgcc-ng[version='>=7.5.0'] -> _libgcc_mutex[version='*|0.1',build='main|conda_forge']\n",
"\"\"\""
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "painful-meditation",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[ConstraintGroup(name='ncurses', constraints=[Constraint(dependency='python=3.8', versions=VersionSpec('>=6.1,<6.2.0a0|>=6.2,<7.0a0|>=6.1,<7.0a0')), Constraint(dependency='awscli', versions=VersionSpec('5.9.*|5.9|>=6.1,<6.2.0a0|>=6.2,<7.0a0|>=6.1,<7.0a0|>=6.0,<7.0a0|6.0.*')), Constraint(dependency='instrain', versions=VersionSpec('5.9.*|5.9|>=6.1,<6.2.0a0|>=6.2,<7.0a0|>=6.1,<7.0a0|>=6.0,<7.0a0|6.0.*')), Constraint(dependency='python=3.8', versions=VersionSpec('5.9.*|>=6.0,<7.0a0|6.0.*')), Constraint(dependency='samtools', versions=VersionSpec('5.9|5.9.*|>=5.9,<5.10.0a0|>=6.1,<6.2.0a0'))]),\n",
" ConstraintGroup(name='python', constraints=[Constraint(dependency='awscli', versions=VersionSpec('2.7.*|3.5.*|3.6.*|>=2.7,<2.8.0a0|>=3.6,<3.7.0a0|>=3.7,<3.8.0a0|>=3.8,<3.9.0a0|>=3.5,<3.6.0a0|3.4.*')), Constraint(dependency='instrain', versions=VersionSpec('2.7.*|3.5.*|3.6.*|>=2.7,<2.8.0a0|>=3.6,<3.7.0a0|>=3.8,<3.9.0a0|>=3.7,<3.8.0a0|>=3.5,<3.6.0a0|3.4.*|>3|>=3.5|<3.0.0|>=3.6')), Constraint(dependency='instrain', versions=VersionSpec('>=3.4')), Constraint(dependency='awscli', versions=VersionSpec('3.7.*|3.8.*'))]),\n",
" ConstraintGroup(name='ca-certificates', constraints=[]),\n",
" ConstraintGroup(name='setuptools', constraints=[Constraint(dependency='instrain', versions=VersionSpec('>=40.0'))]),\n",
" ConstraintGroup(name='libgcc-ng', constraints=[Constraint(dependency='samtools', versions=VersionSpec('>=7.2.0')), Constraint(dependency='samtools', versions=VersionSpec('>=4.9|>=7.3.0'))]),\n",
" ConstraintGroup(name='pypy3.6', constraints=[Constraint(dependency='instrain', versions=VersionSpec('7.3.0.*|7.3.1.*|>=7.3.1')), Constraint(dependency='awscli', versions=VersionSpec('7.3.*|7.3.0.*|7.3.1.*'))]),\n",
" ConstraintGroup(name='bzip2', constraints=[Constraint(dependency='samtools', versions=VersionSpec('1.0.*|>=1.0.6,<2.0a0|>=1.0.8,<2.0a0')), Constraint(dependency='instrain', versions=VersionSpec('>=1.0.6,<2.0a0|>=1.0.8,<2.0a0')), Constraint(dependency='awscli', versions=VersionSpec('>=1.0.6,<2.0a0|>=1.0.8,<2.0a0'))]),\n",
" ConstraintGroup(name='zlib', constraints=[Constraint(dependency='samtools', versions=VersionSpec('1.2.11.*|>=1.2.11,<1.3.0a0|1.2.8.*|1.2.8')), Constraint(dependency='samtools', versions=VersionSpec('1.2.*|1.2.11'))]),\n",
" ConstraintGroup(name='samtools', constraints=[Constraint(dependency='instrain', versions=VersionSpec('1.3|1.3.1.*|1.3.1|1.5.*|1.6.*|1.7|1.7.*|1.9.*|>=1.4.1|>=1.4.1,<1.5|>=1.4,<1.5|>=1.3,<1.4|>=1.3'))]),\n",
" ConstraintGroup(name='openssl', constraints=[Constraint(dependency='samtools', versions=VersionSpec('1.0.*|>=1.0.2o,<1.0.3a|>=1.0.2m,<1.0.3a')), Constraint(dependency='samtools', versions=VersionSpec('>=1.0.2p,<1.0.3a|>=1.0.2r,<1.0.3a|>=1.1.1a,<1.1.2a'))]),\n",
" ConstraintGroup(name='_libgcc_mutex', constraints=[Constraint(dependency='samtools', versions=VersionSpec('*|0.1')), Constraint(dependency='python=3.8', versions=VersionSpec('*|0.1'))])]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"@dataclass\n",
"class Constraint:\n",
" dependency: Optional[\n",
" str\n",
" ] # Name of dependency that requires the conflicting package\n",
" versions: cv.VersionSpec # List of versions for the conflicting package\n",
"\n",
"\n",
"@dataclass\n",
"class ConstraintGroup:\n",
" name: str # Name of conflicting package\n",
" constraints: List[Constraint]\n",
"\n",
" def merge(self) -> cv.VersionSpec:\n",
" return functools.reduce(\n",
" lambda v1, v2: v1.merge(v2), (c.versions for c in self.constraints)\n",
" )\n",
"\n",
"\n",
"def parse_conflicts(conflicts: str) -> List[ConstraintGroup]:\n",
" # groups separated by blank line\n",
" return [_parse_group(group) for group in conflicts.split(\"\\n\\n\")]\n",
"\n",
"\n",
"def _parse_group(group: str) -> ConstraintGroup:\n",
" groupname = re.compile(r\"Package (\\S+) conflicts for:\")\n",
" lines = group.split(\"\\n\")\n",
" # first line gives name\n",
" match = groupname.match(lines[0])\n",
" name = match and match.group(1)\n",
" # look for versions in subsequent lines\n",
" return ConstraintGroup(\n",
" name, [c for c in (_parse_line(name, line) for line in lines[1:] if line) if c]\n",
" )\n",
"\n",
"\n",
"def _parse_line(name: str, line: str) -> Constraint:\n",
" versionre = re.compile(r\"(?:(\\S+) .*)?\" + name + r\"(?:\\[version='([^']+)'[],])?\")\n",
" match = versionre.match(line)\n",
" if match:\n",
" dep = match.group(1)\n",
" spec = match.group(2)\n",
" if spec is None:\n",
" return None\n",
" versions = cv.VersionSpec(spec)\n",
" return Constraint(dep, versions)\n",
" else:\n",
" logging.warning(f\"Unable to parse {name} version in: {line!r}\")\n",
" return None\n",
"\n",
"\n",
"conflicts = parse_conflicts(conflictstr)\n",
"conflicts"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "dramatic-trunk",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"VersionSpec('5.9.*|5.9|>=6.1,<6.2.0a0|>=6.2,<7.0a0|>=6.1,<7.0a0|>=6.0,<7.0a0|6.0.*,5.9.*|5.9|>=6.1,<6.2.0a0|>=6.2,<7.0a0|>=6.1,<7.0a0|>=6.0,<7.0a0|6.0.*,>=6.1,<6.2.0a0|>=6.2,<7.0a0|>=6.1,<7.0a0,5.9.*|>=6.0,<7.0a0|6.0.*,5.9|5.9.*|>=5.9,<5.10.0a0|>=6.1,<6.2.0a0')"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"conflicts[0].merge()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "spanish-extension",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"conflicts[0].merge().match(\"6.1\")"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "informed-cooling",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"VersionSpec('2.7.*|3.5.*|3.6.*|>=2.7,<2.8.0a0|>=3.6,<3.7.0a0|>=3.7,<3.8.0a0|>=3.8,<3.9.0a0|>=3.5,<3.6.0a0|3.4.*,2.7.*|3.5.*|3.6.*|>=2.7,<2.8.0a0|>=3.6,<3.7.0a0|>=3.8,<3.9.0a0|>=3.7,<3.8.0a0|>=3.5,<3.6.0a0|3.4.*|>3|>=3.5|<3.0.0|>=3.6,>=3.4,3.7.*|3.8.*')"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"conflicts[1].merge()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "illegal-owner",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"conflicts[1].merge().match(3.8)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "liable-communication",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"ConstraintGroup(name='ca-certificates', constraints=[])"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"conflicts[2]"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "secure-retail",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"ConstraintGroup(name='setuptools', constraints=[Constraint(dependency='instrain', versions=VersionSpec('>=40.0'))])"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"conflicts[3]"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "institutional-heaven",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"conflicts[3].merge().match(\"40.0\")"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "spare-gregory",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"ConstraintGroup(name='libgcc-ng', constraints=[Constraint(dependency='samtools', versions=VersionSpec('>=7.2.0')), Constraint(dependency='samtools', versions=VersionSpec('>=4.9|>=7.3.0'))])"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"conflicts[4]"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "resident-stadium",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"conflicts[4].merge().match(\"7.3.0\")"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "included-kruger",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"ConstraintGroup(name='pypy3.6', constraints=[Constraint(dependency='instrain', versions=VersionSpec('7.3.0.*|7.3.1.*|>=7.3.1')), Constraint(dependency='awscli', versions=VersionSpec('7.3.*|7.3.0.*|7.3.1.*'))])"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"conflicts[5]"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "several-adolescent",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"conflicts[5].merge().match(\"7.3.1\")"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "preceding-bullet",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"ConstraintGroup(name='bzip2', constraints=[Constraint(dependency='samtools', versions=VersionSpec('1.0.*|>=1.0.6,<2.0a0|>=1.0.8,<2.0a0')), Constraint(dependency='instrain', versions=VersionSpec('>=1.0.6,<2.0a0|>=1.0.8,<2.0a0')), Constraint(dependency='awscli', versions=VersionSpec('>=1.0.6,<2.0a0|>=1.0.8,<2.0a0'))])"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"conflicts[6]"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "acknowledged-marsh",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"conflicts[6].merge().match(\"1.0.8\")"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "strong-spray",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"ConstraintGroup(name='zlib', constraints=[Constraint(dependency='samtools', versions=VersionSpec('1.2.11.*|>=1.2.11,<1.3.0a0|1.2.8.*|1.2.8')), Constraint(dependency='samtools', versions=VersionSpec('1.2.*|1.2.11'))])"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"conflicts[7]"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "informational-decision",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"conflicts[7].merge().match(\"1.2.11\")"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "greek-grade",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"ConstraintGroup(name='samtools', constraints=[Constraint(dependency='instrain', versions=VersionSpec('1.3|1.3.1.*|1.3.1|1.5.*|1.6.*|1.7|1.7.*|1.9.*|>=1.4.1|>=1.4.1,<1.5|>=1.4,<1.5|>=1.3,<1.4|>=1.3'))])"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"conflicts[8]"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "british-institution",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"conflicts[8].merge().match(\"1.3\")"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "finnish-camel",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"ConstraintGroup(name='openssl', constraints=[Constraint(dependency='samtools', versions=VersionSpec('1.0.*|>=1.0.2o,<1.0.3a|>=1.0.2m,<1.0.3a')), Constraint(dependency='samtools', versions=VersionSpec('>=1.0.2p,<1.0.3a|>=1.0.2r,<1.0.3a|>=1.1.1a,<1.1.2a'))])"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"conflicts[9]"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "defensive-tribe",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"conflicts[9].merge().match(\"1.1.1a\")"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "innovative-characterization",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"ConstraintGroup(name='_libgcc_mutex', constraints=[Constraint(dependency='samtools', versions=VersionSpec('*|0.1')), Constraint(dependency='python=3.8', versions=VersionSpec('*|0.1'))])"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"conflicts[10]"
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "alien-penalty",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"conflicts[10].merge().match(\"0.1\")"
]
},
{
"cell_type": "code",
"execution_count": 28,
"id": "needed-rendering",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"11"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(conflicts)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python [conda env:science]",
"language": "python",
"name": "conda-env-science-py"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.1"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment