pdm-project / pdm

A modern Python package and dependency manager supporting the latest PEP standards
https://pdm-project.org
MIT License
7.86k stars 391 forks source link

Cannot add ``"pyobjc~=7.2; sys_platform == 'darwin'"`` #449

Closed s0undt3ch closed 3 years ago

s0undt3ch commented 3 years ago

Make sure you run commands with -v flag before pasting the output.

Steps to reproduce

pdm add "pyobjc; sys_platform == 'darwin'" -v
Adding packages to default dependencies: pyobjc
======== Start resolving requirements ========
        pyobjc; sys_platform == "darwin"
        Adding requirement pyobjc; sys_platform == "darwin"
        Adding requirement pyobjc-core==7.2(from pyobjc 7.2)
        Adding requirement pyobjc-framework-AddressBook==7.2(from pyobjc 7.2)
        Adding requirement pyobjc-framework-AppleScriptKit==7.2(from pyobjc 7.2)
        Adding requirement pyobjc-framework-ApplicationServices==7.2(from pyobjc 7.2)
        Adding requirement pyobjc-framework-Automator==7.2(from pyobjc 7.2)
        Adding requirement pyobjc-framework-CFNetwork==7.2(from pyobjc 7.2)
        Adding requirement pyobjc-framework-Cocoa==7.2(from pyobjc 7.2)
        Adding requirement pyobjc-framework-CoreAudio==7.2(from pyobjc 7.2)
        Adding requirement pyobjc-framework-CoreAudioKit==7.2(from pyobjc 7.2)
        Adding requirement pyobjc-framework-CoreData==7.2(from pyobjc 7.2)
        Adding requirement pyobjc-framework-CoreMIDI==7.2(from pyobjc 7.2)
        Adding requirement pyobjc-framework-CoreServices==7.2(from pyobjc 7.2)
        Adding requirement pyobjc-framework-CoreText==7.2(from pyobjc 7.2)
        Adding requirement pyobjc-framework-DiscRecording==7.2(from pyobjc 7.2)
        Adding requirement pyobjc-framework-DiscRecordingUI==7.2(from pyobjc 7.2)
        Adding requirement pyobjc-framework-DiskArbitration==7.2(from pyobjc 7.2)
        Adding requirement pyobjc-framework-DVDPlayback==7.2(from pyobjc 7.2)
        Adding requirement pyobjc-framework-ExceptionHandling==7.2(from pyobjc 7.2)
        Adding requirement pyobjc-framework-InstallerPlugins==7.2(from pyobjc 7.2)
        Adding requirement pyobjc-framework-LatentSemanticMapping==7.2(from pyobjc 7.2)
        [ .... more output .... ]
======== Ending round 133 ========
  Finish resolving
======== Resolution Result ========
Stable pins:
                                             pyobjc 7.2
                    pyobjc-framework-applescriptkit 7.2
               pyobjc-framework-applicationservices 7.2
                         pyobjc-framework-automator 7.2
                   pyobjc-framework-discrecordingui 7.2
                   pyobjc-framework-diskarbitration 7.2
                       pyobjc-framework-dvdplayback 7.2
                 pyobjc-framework-exceptionhandling 7.2
                  pyobjc-framework-installerplugins 7.2
             pyobjc-framework-latentsemanticmapping 7.2
                    pyobjc-framework-launchservices 7.2
                            pyobjc-framework-osakit 7.2
                   pyobjc-framework-preferencepanes 7.2
                pyobjc-framework-securityfoundation 7.2
                         pyobjc-framework-searchkit 7.2
                           pyobjc-framework-message 7.2
                   pyobjc-framework-applescriptobjc 7.2
                         pyobjc-framework-iosurface 7.2
                             pyobjc-framework-netfs 7.2
                     pyobjc-framework-opendirectory 7.2
                 pyobjc-framework-servicemanagement 7.2
                     pyobjc-framework-ituneslibrary 7.2
                pyobjc-framework-servernotification 7.2
                          pyobjc-framework-accounts 7.2
                          pyobjc-framework-eventkit 7.2
                            pyobjc-framework-social 7.2
                pyobjc-framework-mediaaccessibility 7.2
                      pyobjc-framework-medialibrary 7.2
                          pyobjc-framework-cloudkit 7.2
                        pyobjc-framework-findersync 7.2
               pyobjc-framework-localauthentication 7.2
                       pyobjc-framework-mediaplayer 7.2
                         pyobjc-framework-colorsync 7.2
                         pyobjc-framework-adsupport 7.2
                      pyobjc-framework-businesschat 7.2
                   pyobjc-framework-naturallanguage 7.2
            pyobjc-framework-videosubscriberaccount 7.2
                       pyobjc-framework-corehaptics 7.2
                        pyobjc-framework-coremotion 7.2
                       pyobjc-framework-devicecheck 7.2
                   pyobjc-framework-executionpolicy 7.2
                    pyobjc-framework-fileproviderui 7.2
                  pyobjc-framework-linkpresentation 7.2
                         pyobjc-framework-pencilkit 7.2
             pyobjc-framework-quicklookthumbnailing 7.2
                     pyobjc-framework-soundanalysis 7.2
                        pyobjc-framework-adservices 7.2
           pyobjc-framework-apptrackingtransparency 7.2
                           pyobjc-framework-callkit 7.2
                  pyobjc-framework-kernelmanagement 7.2
      pyobjc-framework-metalperformanceshadersgraph 7.2
                         pyobjc-framework-mlcompute 7.2
                        pyobjc-framework-screentime 7.2
            pyobjc-framework-uniformtypeidentifiers 7.2
               pyobjc-framework-usernotificationsui 7.2
                     pyobjc-framework-calendarstore 7.2
                     pyobjc-framework-collaboration 7.2
                pyobjc-framework-dictionaryservices 7.2
                    pyobjc-framework-instantmessage 7.2
               pyobjc-framework-interfacebuilderkit 7.2
                            pyobjc-framework-pubsub 7.2
                       pyobjc-framework-addressbook 7.2
                         pyobjc-framework-cfnetwork 7.2
                      pyobjc-framework-coreaudiokit 7.2
                          pyobjc-framework-coredata 7.2
                          pyobjc-framework-coremidi 7.2
                      pyobjc-framework-coreservices 7.2
                     pyobjc-framework-discrecording 7.2
                       pyobjc-framework-screensaver 7.2
                 pyobjc-framework-securityinterface 7.2
                      pyobjc-framework-syncservices 7.2
               pyobjc-framework-systemconfiguration 7.2
                            pyobjc-framework-webkit 7.2
                      pyobjc-framework-corelocation 7.2
                          pyobjc-framework-corewlan 7.2
                  pyobjc-framework-imagecapturecore 7.2
                      pyobjc-framework-avfoundation 7.2
                       pyobjc-framework-coremediaio 7.2
                   pyobjc-framework-imserviceplugin 7.2
                          pyobjc-framework-storekit 7.2
                          pyobjc-framework-scenekit 7.2
                        pyobjc-framework-gamecenter 7.2
                           pyobjc-framework-gamekit 7.2
                      pyobjc-framework-videotoolbox 7.2
                             pyobjc-framework-avkit 7.2
                    pyobjc-framework-gamecontroller 7.2
                            pyobjc-framework-mapkit 7.2
                      pyobjc-framework-mediatoolbox 7.2
                         pyobjc-framework-spritekit 7.2
                     pyobjc-framework-corebluetooth 7.2
                    pyobjc-framework-cryptotokenkit 7.2
             pyobjc-framework-multipeerconnectivity 7.2
                pyobjc-framework-notificationcenter 7.2
                          pyobjc-framework-contacts 7.2
                        pyobjc-framework-contactsui 7.2
                             pyobjc-framework-metal 7.2
                          pyobjc-framework-metalkit 7.2
                           pyobjc-framework-modelio 7.2
                  pyobjc-framework-networkextension 7.2
                            pyobjc-framework-photos 7.2
                          pyobjc-framework-photosui 7.2
                    pyobjc-framework-safariservices 7.2
                       pyobjc-framework-gameplaykit 7.2
                           pyobjc-framework-intents 7.2
                            pyobjc-framework-vision 7.2
                           pyobjc-framework-network 7.2
                 pyobjc-framework-usernotifications 7.2
            pyobjc-framework-authenticationservices 7.2
  pyobjc-framework-automaticassessmentconfiguration 7.2
                             pyobjc-framework-oslog 7.2
                           pyobjc-framework-pushkit 7.2
                            pyobjc-framework-speech 7.2
                  pyobjc-framework-systemextensions 7.2
                     pyobjc-framework-accessibility 7.2
                          pyobjc-framework-classkit 7.2
                           pyobjc-framework-passkit 7.2
                         pyobjc-framework-replaykit 7.2
                    pyobjc-framework-virtualization 7.2
                          pyobjc-framework-fsevents 7.2
                    pyobjc-framework-inputmethodkit 7.2
                   pyobjc-framework-scriptingbridge 7.2
                                        pyobjc-core 7.2
                             pyobjc-framework-cocoa 7.2
                         pyobjc-framework-coreaudio 7.2
                          pyobjc-framework-coretext 7.2
                            pyobjc-framework-quartz 7.2
                          pyobjc-framework-security 7.2
                         pyobjc-framework-coremedia 7.2
                       pyobjc-framework-libdispatch 7.2
                      pyobjc-framework-fileprovider 7.2
Extracting package metadata
Traceback (most recent call last):
  File "/tmp/.venv/bin/pdm", line 8, in 
    sys.exit(main())
  File "/tmp/.venv/lib/python3.7/site-packages/pdm/core.py", line 184, in main
    return Core().main(args)
  File "/tmp/.venv/lib/python3.7/site-packages/pdm/core.py", line 145, in main
    raise cast(Exception, err).with_traceback(traceback)
  File "/tmp/.venv/lib/python3.7/site-packages/pdm/core.py", line 140, in main
    f(options.project, options)
  File "/tmp/.venv/lib/python3.7/site-packages/pdm/cli/commands/add.py", line 43, in handle
    packages=options.packages,
  File "/tmp/.venv/lib/python3.7/site-packages/pdm/cli/actions.py", line 173, in do_add
    resolved = do_lock(project, strategy, tracked_names, reqs)
  File "/tmp/.venv/lib/python3.7/site-packages/pdm/cli/actions.py", line 68, in do_lock
    resolve_max_rounds,
  File "/tmp/.venv/lib/python3.7/site-packages/pdm/resolver/core.py", line 153, in resolve
    all_metasets = extract_metadata(result)
  File "/tmp/.venv/lib/python3.7/site-packages/pdm/resolver/core.py", line 107, in extract_metadata
    new_metasets[k] = _build_metaset(crit, all_metasets, keep_unresolved)
  File "/tmp/.venv/lib/python3.7/site-packages/pdm/resolver/core.py", line 59, in _build_metaset
    metaset = metaset | merged if metaset is not None else merged
  File "/tmp/.venv/lib/python3.7/site-packages/pdm/resolver/metaset.py", line 36, in __or__
    if any([self.marker_no_python, other.marker_no_python])
  File "/tmp/.venv/lib/python3.7/site-packages/pdm/models/markers.py", line 44, in __or__
    return type(self)(marker_str)
  File "/tmp/.venv/lib/python3.7/site-packages/pip/_vendor/packaging/markers.py", line 307, in __init__
    self._markers = _coerce_parse_result(MARKER.parseString(marker))
  File "/tmp/.venv/lib/python3.7/site-packages/pip/_vendor/pyparsing.py", line 1943, in parseString
    loc, tokens = self._parse(instring, 0)
[ .... more traceback .... ]
  File "/tmp/.venv/lib/python3.7/site-packages/pip/_vendor/pyparsing.py", line 1683, in _parseNoCache
    loc, tokens = self.parseImpl(instring, preloc, doActions)
  File "/tmp/.venv/lib/python3.7/site-packages/pip/_vendor/pyparsing.py", line 4069, in parseImpl
    loc, exprtokens = e._parse(instring, loc, doActions)
  File "/tmp/.venv/lib/python3.7/site-packages/pip/_vendor/pyparsing.py", line 1683, in _parseNoCache
    loc, tokens = self.parseImpl(instring, preloc, doActions)
  File "/tmp/.venv/lib/python3.7/site-packages/pip/_vendor/pyparsing.py", line 4781, in parseImpl
    return super(ZeroOrMore, self).parseImpl(instring, loc, doActions)
  File "/tmp/.venv/lib/python3.7/site-packages/pip/_vendor/pyparsing.py", line 4697, in parseImpl
    loc, tokens = self_expr_parse(instring, loc, doActions, callPreParse=False)
  File "/tmp/.venv/lib/python3.7/site-packages/pip/_vendor/pyparsing.py", line 1683, in _parseNoCache
    loc, tokens = self.parseImpl(instring, preloc, doActions)
  File "/tmp/.venv/lib/python3.7/site-packages/pip/_vendor/pyparsing.py", line 4069, in parseImpl
    loc, exprtokens = e._parse(instring, loc, doActions)
  File "/tmp/.venv/lib/python3.7/site-packages/pip/_vendor/pyparsing.py", line 1683, in _parseNoCache
    loc, tokens = self.parseImpl(instring, preloc, doActions)
  File "/tmp/.venv/lib/python3.7/site-packages/pip/_vendor/pyparsing.py", line 4462, in parseImpl
    return self.expr._parse(instring, loc, doActions, callPreParse=False)
  File "/tmp/.venv/lib/python3.7/site-packages/pip/_vendor/pyparsing.py", line 1683, in _parseNoCache
    loc, tokens = self.parseImpl(instring, preloc, doActions)
  File "/tmp/.venv/lib/python3.7/site-packages/pip/_vendor/pyparsing.py", line 4052, in parseImpl
    loc, resultlist = self.exprs[0]._parse(instring, loc, doActions, callPreParse=False)
  File "/tmp/.venv/lib/python3.7/site-packages/pip/_vendor/pyparsing.py", line 1683, in _parseNoCache
    loc, tokens = self.parseImpl(instring, preloc, doActions)
  File "/tmp/.venv/lib/python3.7/site-packages/pip/_vendor/pyparsing.py", line 4254, in parseImpl
    ret = e._parse(instring, loc, doActions)
  File "/tmp/.venv/lib/python3.7/site-packages/pip/_vendor/pyparsing.py", line 1683, in _parseNoCache
    loc, tokens = self.parseImpl(instring, preloc, doActions)
  File "/tmp/.venv/lib/python3.7/site-packages/pip/_vendor/pyparsing.py", line 4462, in parseImpl
    return self.expr._parse(instring, loc, doActions, callPreParse=False)
  File "/tmp/.venv/lib/python3.7/site-packages/pip/_vendor/pyparsing.py", line 1683, in _parseNoCache
    loc, tokens = self.parseImpl(instring, preloc, doActions)
  File "/tmp/.venv/lib/python3.7/site-packages/pip/_vendor/pyparsing.py", line 4052, in parseImpl
    loc, resultlist = self.exprs[0]._parse(instring, loc, doActions, callPreParse=False)
  File "/tmp/.venv/lib/python3.7/site-packages/pip/_vendor/pyparsing.py", line 1683, in _parseNoCache
    loc, tokens = self.parseImpl(instring, preloc, doActions)
  File "/tmp/.venv/lib/python3.7/site-packages/pip/_vendor/pyparsing.py", line 4254, in parseImpl
    ret = e._parse(instring, loc, doActions)
RecursionError: maximum recursion depth exceede

Actual behavior

Fails to add pyobjct **with the sys_platform == 'darwin' marker. Adding pyobjc without the marker works, although there are ovious failures installing because I'm on linux.

Expected behavior

Add pyobjc; sys_platform == 'darwin' to pyproject.toml

Environment Information

# Paste the output of `pdm info && pdm info --env` below:
❯ pdm info; pdm info --env
PDM version:        1.5.2
Python Interpreter: /tmp/.venv/bin/python (3.7)
Project Root:       /tmp/.venv/proj
Project Packages:   /tmp/.venv/proj/__pypackages__/3.7
{
  "implementation_name": "cpython",
  "implementation_version": "3.7.7",
  "os_name": "posix",
  "platform_machine": "x86_64",
  "platform_release": "5.11.16-arch1-1",
  "platform_system": "Linux",
  "platform_version": "#1 SMP PREEMPT Wed, 21 Apr 2021 17:22:13 +0000",
  "python_full_version": "3.7.7",
  "platform_python_implementation": "CPython",
  "python_version": "3.7",
  "sys_platform": "linux"
}
frostming commented 3 years ago

For those who come to this issue, this is caused by the marker resolution without deduplication. pyobjc is a parent package that defines a large number of dependencies, with markers. As a result, the marker of a low-level dependency get resolved to the combination of all these markers. Such a long marker makes the marker parser fail due to maximum recursion error.