[05:55:19] <r1chardj0n3s> and of cource sigmavirus24_awa will love that final graph showing the share of python 2.6 downloading requests is *increasing* (WTF)
[21:07:19] <lifeless> dstufft: travis seems to be off in lalalala land anyhow :/
[21:08:03] <lifeless> https://github.com/pypa/pip/pull/2708 then 2709 and 2710 the finally 2699
[21:08:10] <lifeless> are *in principle* all ready
[21:08:23] <lifeless> dstufft: got any advice for the next release-blocker I should tacle?
[21:11:31] <dstufft> lifeless: I think with https://github.com/pypa/pip/issues/2677 we should probably have --install-option and --global-option disable building/using wheels (using your new mechanism makes sense I think), and I'll open another ticket up to just remove those options all together because I don't think they make sense completely in the new world of building wheels for all installs
[21:12:25] <lifeless> double checking: disable *using* all wheels?
[21:13:14] <lifeless> For the wheel command as well? e.g. pip wheel --install-option=xxx foo # this would not use wheels for deps, just sdists ?
[21:14:46] <dstufft> I think that --install-option applies to everything being installed and right now we just silently ignore it if we're installing from a wheel
[21:14:58] <dstufft> so i think it makes sense to fix that silently ignoring bit
[21:16:38] <dstufft> pip wheel doesn't support --install-option, it does have --build-option which functions similarly, and hrm, it should probably imply that too
[21:17:11] <dstufft> and a non blocker issue should be opened to sort of the entire mess between those 3 options and figure out how to get rid of them
[21:21:14] <lifeless> let me summarise for clarity: - --install-option, --global-option, --build-option will all disable the consumption of wheels, and any autobuilding of wheels.
[21:59:01] <qwcode> dstufft, what would the longer term plan for install option support for wheels be? new options? that don't come from setuptools?
[22:00:31] <jdunck> I'm presently wishing req_file.parse_requirements had decoupled the file open from the parsing - and I find other sorts of inconvenient coupling in various places in the code. (Another example is operations.freeze doing parse-y stuff as well.) How do folks view internal refactorings?
[22:00:40] <jdunck> (I haven't contributed to pypa before.)
[22:01:34] <jdunck> As a general rule, is any of the non-CLI API stable?
[22:18:54] <qwcode> dstufft, thanks for the response. I responded back. I'm ok with the current plan, just wanted clarity and to get my 2c in.
[22:19:11] <qwcode> dstufft, one other thing, if you have the head space.... with all the talk of sat solving, it seems the quicker win is not being talked about... that is to start ANDing sub-requirements, and detecting conflicts when ANDing
[22:20:03] <dstufft> qwcode: I thought about that, the problem is dealing with backtracking
[22:24:27] <dstufft> qwcode: when in the process of resolving deps, we download X version Y and add it's dependencies, and we continue parsing the requirements, and we end up adding a specifier for X that excludes version Y (but doesn't exclude other valid versions)
[22:24:48] <dstufft> we need to undo all of the additional dependencies we added from X version Y because it's no longer a valid satisifier
[22:25:03] <dstufft> so we have to backtrack and resolve that part of the dep tree
[22:25:17] <dstufft> otherwise we generate conflict errors when we otherwise could have worked
[22:26:18] <qwcode> excludes version Y, meaning the dep for Y is gone, or conflicts?
[22:27:44] <qwcode> sorry, can't seem to parse "excludes version Y (but doesn't exclude other valid versions)"
[22:28:54] <dstufft> qwcode: say the first specifier is just "X", we resolve that to X 1.0 and download it and discover dependencies, later on we AND in another specifier that says X<1 which excludes X 1.0, but the results of ``X`` & ``X<1`` is satisfiable, we'd just need to install 0.9 or something instead
[22:30:19] <dstufft> qwcode: we need to backtrack (or undo) the things we discovered because we originally downloaded X 1.0 because now that we've added X<1 X 1.0 is no longer valid (and thus anything we added to the specifier list from it is no longer valid)
[22:31:07] <dstufft> we _can_ just ignore that problem, (we're already ignoring it today) but we switch the error case from "we might install versions that don't actually satisfy the cosntraints" to "we might claim there is nothing that satisfies the constraints when there are in fact things that do"
[22:31:36] <dstufft> once you start dealing with backtracking you're already most of the way there to a brute force SAT solver
[22:37:51] <ronny> dstufft: any oppinion on having a user/global repo of unpacked wheels and a 'virtualenv' replacement that picks some of those via a optimized meta import hook for toplevels ?
[22:38:52] <dstufft> ronny: it's an interesting idea, I'd need to experiment with an implementation of it to have a more fully formed opinion about the viability of it
[22:39:54] <ronny> dstufft: will sprint with a friend of mine on this next weekend if his health allows
[22:40:51] <ronny> dstufft: it would also allow some funky details for pip, because each "env" could automatically always get the latest one including the requirements
[22:44:21] <lifeless> sometimes I think Python just wants to tease with functional idioms
[22:45:48] <qwcode> dstufft, it seems the backtracking you describe is a bit different than what justincappos was talking about in the issue. would require a longer email to beak it down, so I won't try here : )
[22:46:35] <qwcode> what you describe sounds easier than sat solving... but I could certainly be naive
[22:46:43] <lifeless> dstufft: I;m working up a backtracker btw
[22:46:55] <lifeless> dstufft: its all part of my needs to fix setup_requires :)
[22:48:48] <lifeless> I need a cache of installable things for setup_requires too
[22:49:15] <lifeless> since we'll often need the same thing to setup something and then install that thing
[22:50:21] <dstufft> qwcode: a brute force sat solver isn't very hard really, you just try different stuff until you solve the equation, the hard parts in sAT solvers come when you want to optimize it so you don't have to redo all your guessing
[22:50:34] <qwcode> lifeless, but your backtracking implementation involves ANDing duplicate specifiers and detecting conflicts?
[22:53:12] <lifeless> we'll want the glue in there to suppot it
[22:53:37] <lifeless> but the generation of possible combinations and the backtracking or annealing or whatever approach is used - thats not packaging internals IMO
[22:54:01] <qwcode> the backtracking stuff would be in pip I assume
[22:54:21] <lifeless> what we need from the data model for a contraint is
[22:54:39] <lifeless> the ability to combine a new constraint with an existing one
[22:54:56] <lifeless> have that either error at that point, or have a predicate, to check if a constraint *can* be satisfied at all
[22:55:25] <lifeless> and either that needs to return new objects (e.g. like frozenset.union(anotherfrozenset))
[22:55:30] <lifeless> or have copy/deepcopy support
[22:55:51] <lifeless> (because otherwise backtracking is eeek)
[22:56:17] <lifeless> SpecifierSet AND may be sufficient already
[22:56:21] <qwcode> I was imagining all the individual specifiers supporting a method, that knows what other specifiers, and under what condition it would conflict
[22:57:04] <qwcode> _conflict(other) # look at other, and see if I conflict with it
[22:57:23] <lifeless> I'll keep my nose out of packaging internals :)
[22:57:54] <lifeless> but - if I may observe - thats O(pyramid)
[22:58:23] <lifeless> with 4 specs, 6 checks, with 5 specs, 10 checks, with 6 specs 15,
[23:11:23] <lifeless> but we can do those without packaging detecting conflicts
[23:11:23] <qwcode> most of the cases I've seen would have been solved with a simple AND
[23:11:32] <lifeless> all we have to do is union the requirements and try
[23:12:00] <lifeless> qwcode: the downside is that without something considering the full set of possibilities many installs that work today will stop working
[23:12:17] <dstufft> in particular, many installs that work today, and that could continue to work
[23:12:21] <lifeless> e.g. the feature of requirements.txt where it overrides package dep rules
[23:12:29] <qwcode> realize when you say union, it's historically, confusing, because until PEP440, unions were odd things, not simple ANDs
[23:12:34] <dstufft> e.g. these aren't ones where the constraints are not satisifable
[23:12:44] <lifeless> qwcode: thanks, will say AND
[23:13:02] <lifeless> I think we're going to need a deprecation period
[23:13:18] <lifeless> where user specified versions continue to win even if additional constraints aren't satisfied
[23:15:11] <dstufft> I agree with having an escape mechanism, I think the current one is problematic because people don't think of it as an escape mechanism, they just think of it as another thing to install