Skip to content

Instantly share code, notes, and snippets.

@simonw
Created March 4, 2025 00:30
Show Gist options
  • Save simonw/e13064e2e830db77887373ced5df1b5b to your computer and use it in GitHub Desktop.
Save simonw/e13064e2e830db77887373ced5df1b5b to your computer and use it in GitHub Desktop.

Pipfile.lock Dependency Parser

human (Mar 3, 2025, 03:36 PM)

Build a tool I can paste a file like this into:

And it outputs a list like this:

"psycopg2-binary" = "==2.7.4"

Basically showing the names and the things from the version field

paste.txt

{
    "_meta": {
        "hash": {
            "sha256": "e475eef32a4d3dddacfa7721047d7e81aa2faec586964c394da336d9108cadec"
        },
        "pipfile-spec": 6,
        "requires": {
            "python_version": "3.6"
        },
        "sources": [
            {
                "name": "pypi",
                "url": "https://pypi.python.org/simple",
                "verify_ssl": true
            }
        ]
    },
    "default": {
        "beautifulsoup4": {
            "hashes": [
                "sha256:11a9a27b7d3bddc6d86f59fb76afb70e921a25ac2d6cc55b40d072bd68435a76",
                "sha256:7015e76bf32f1f574636c4288399a6de66ce08fb7b2457f628a8d70c0fbabb11",
                "sha256:808b6ac932dccb0a4126558f7dfdcf41710dd44a4ef497a0bb59a77f9f078e89"
            ],
            "version": "==4.6.0"
        },
        "boto3": {
            "hashes": [
                "sha256:13ad5f64a247d655a27dca83274588e9d14cba61b38d3d4fd2b011b7197d88dd",
                "sha256:a56b21efbc994580fc9cef454f0f949745c152326f939aed6609d1c47b2a0f8f"
            ],
            "version": "==1.7.4"
        },
        "botocore": {
            "hashes": [
                "sha256:5602738392ecde5c02a06a3b02de07171f440a44cdfef0aadff4b59567359607",
                "sha256:77f2869b8c27afbab78b72ce6b74c75923421f364c7a0153ac1a38858c59cd91"
            ],
            "version": "==1.10.4"
        },
        "certifi": {
            "hashes": [
                "sha256:14131608ad2fd56836d33a71ee60fa1c82bc9d2c8d98b7bdbc631fe1b3cd1296",
                "sha256:edbc3f203427eef571f79a7692bb160a2b0f7ccaa31953e99bd17e307cf63f7d"
            ],
            "version": "==2018.1.18"
        },
        "chardet": {
            "hashes": [
                "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae",
                "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"
            ],
            "version": "==3.0.4"
        },
        "contextlib2": {
            "hashes": [
                "sha256:509f9419ee91cdd00ba34443217d5ca51f5a364a404e1dce9e8979cea969ca48",
                "sha256:f5260a6e679d2ff42ec91ec5252f4eeffdcf21053db9113bd0a8e4d953769c00"
            ],
            "markers": "python_version < '3.2'",
            "version": "==0.5.5"
        },
        "dj-database-url": {
            "hashes": [
                "sha256:4aeaeb1f573c74835b0686a2b46b85990571159ffc21aa57ecd4d1e1cb334163",
                "sha256:851785365761ebe4994a921b433062309eb882fedd318e1b0fcecc607ed02da9"
            ],
            "version": "==0.5.0"
        },
        "django": {
            "hashes": [
                "sha256:056fe5b9e1f8f7fed9bb392919d64f6b33b3a71cfb0f170a90ee277a6ed32bc2",
                "sha256:4d398c7b02761e234bbde490aea13ea94cb539ceeb72805b72303f348682f2eb"
            ],
            "version": "==1.11.12"
        },
        "django-heroku": {
            "hashes": [
                "sha256:2bc690aab89eedbe01311752320a9a12e7548e3b0ed102681acc5736a41a4762",
                "sha256:6af4bc3ae4a9b55eaad6dbe5164918982d2762661aebc9f83d9fa49f6009514e"
            ],
            "version": "==0.3.1"
        },
        "django-modelcluster": {
            "hashes": [
                "sha256:2a6c0638ba295d44fc316c42b6da20509b186fe3500c674539441d451de5abfe"
            ],
            "version": "==4.1"
        },
        "django-storages": {
            "hashes": [
                "sha256:7339070cf0c8042f5a885783a0a909175a8dbb68e7f5697d597571c830a460c4",
                "sha256:f1dd5668a4df9a23aff56c8321ea3aac3fda23d9d17473158d308d1b13e5363e"
            ],
            "version": "==1.6.6"
        },
        "django-taggit": {
            "hashes": [
                "sha256:58aa3e59e0643446e102523f22d137300298e2a537b1c5b0c310d99143f2c2b8",
                "sha256:fd13e304ba37ff09e601c4797d893fb7d3e699a789b5afb0b09d686f94470441"
            ],
            "version": "==0.22.2"
        },
        "django-treebeard": {
            "hashes": [
                "sha256:474275b1de849eba8ead8e197edb5f6c2c835598eafa1ddfe3e3166a3e6c2d1f"
            ],
            "version": "==4.2.1"
        },
        "djangorestframework": {
            "hashes": [
                "sha256:b6714c3e4b0f8d524f193c91ecf5f5450092c2145439ac2769711f7eba89a9d9",
                "sha256:c375e4f95a3a64fccac412e36fb42ba36881e52313ec021ef410b40f67cddca4"
            ],
            "version": "==3.8.2"
        },
        "docutils": {
            "hashes": [
                "sha256:02aec4bd92ab067f6ff27a38a38a41173bf01bed8f89157768c1573f53e474a6",
                "sha256:51e64ef2ebfb29cae1faa133b3710143496eca21c530f3f71424d77687764274",
                "sha256:7a4bd47eaf6596e1295ecb11361139febe29b084a87bf005bf899f9a42edc3c6"
            ],
            "version": "==0.14"
        },
        "draftjs-exporter": {
            "hashes": [
                "sha256:6d29c45ea12fef51fff65665a1c9c41fd5785b46f0d1ee70f2e61af7bfcfe77c"
            ],
            "version": "==2.0.0"
        },
        "gunicorn": {
            "hashes": [
                "sha256:75af03c99389535f218cc596c7de74df4763803f7b63eb09d77e92b3956b36c6",
                "sha256:eee1169f0ca667be05db3351a0960765620dad53f53434262ff8901b68a1b622"
            ],
            "version": "==19.7.1"
        },
        "html5lib": {
            "hashes": [
                "sha256:b8934484cf22f1db684c0fae27569a0db404d0208d20163fbf51cc537245d008",
                "sha256:ee747c0ffd3028d2722061936b5c65ee4fe13c8e4613519b4447123fc4546298"
            ],
            "version": "==0.999999999"
        },
        "idna": {
            "hashes": [
                "sha256:2c6a5de3089009e3da7c5dde64a141dbc8551d5b7f6cf4ed7c2568d0cc520a8f",
                "sha256:8c7309c718f94b3a625cb648ace320157ad16ff131ae0af362c9f21b80ef6ec4"
            ],
            "version": "==2.6"
        },
        "jmespath": {
            "hashes": [
                "sha256:6a81d4c9aa62caf061cb517b4d9ad1dd300374cd4706997aff9cd6aedd61fc64",
                "sha256:f11b4461f425740a1d908e9a3f7365c3d2e569f6ca68a2ff8bc5bcd9676edd63"
            ],
            "version": "==0.9.3"
        },
        "pillow": {
            "hashes": [
                "sha256:00633bc2ec40313f4daf351855e506d296ec3c553f21b66720d0f1225ca84c6f",
                "sha256:03514478db61b034fc5d38b9bf060f994e5916776e93f02e59732a8270069c61",
                "sha256:040144ba422216aecf7577484865ade90e1a475f867301c48bf9fbd7579efd76",
                "sha256:16246261ff22368e5e32ad74d5ef40403ab6895171a7fc6d34f6c17cfc0f1943",
                "sha256:1cb38df69362af35c14d4a50123b63c7ff18ec9a6d4d5da629a6f19d05e16ba8",
                "sha256:2400e122f7b21d9801798207e424cbe1f716cee7314cd0c8963fdb6fc564b5fb",
                "sha256:2ee6364b270b56a49e8b8a51488e847ab130adc1220c171bed6818c0d4742455",
                "sha256:3b4560c3891b05022c464b09121bd507c477505a4e19d703e1027a3a7c68d896",
                "sha256:41374a6afb3f44794410dab54a0d7175e6209a5a02d407119c81083f1a4c1841",
                "sha256:438a3faf5f702c8d0f80b9f9f9b8382cfa048ca6a0d64ef71b86b563b0ee0359",
                "sha256:472a124c640bde4d5468f6991c9fa7e30b723d84ac4195a77c6ab6aea30f2b9c",
                "sha256:4d32c8e3623a61d6e29ccd024066cd1ba556555abfb4cd714155020e00107e3f",
                "sha256:4d8077fd649ac40a5c4165f2c22fa2a4ad18c668e271ecb2f9d849d1017a9313",
                "sha256:62ec7ae98357fcd46002c110bb7cad15fce532776f0cbe7ca1d44c49b837d49d",
                "sha256:6c7cab6a05351cf61e469937c49dbf3cdf5ffb3eeac71f8d22dc9be3507598d8",
                "sha256:6eca36905444c4b91fe61f1b9933a47a30480738a1dd26501ff67d94fc2bc112",
                "sha256:74e2ebfd19c16c28ad43b8a28ff73b904ed382ea4875188838541751986e8c9a",
                "sha256:7673e7473a13107059377c96c563aa36f73184c29d2926882e0a0210b779a1e7",
                "sha256:81762cf5fca9a82b53b7b2d0e6b420e0f3b06167b97678c81d00470daa622d58",
                "sha256:8554bbeb4218d9cfb1917c69e6f2d2ad0be9b18a775d2162547edf992e1f5f1f",
                "sha256:9b66e968da9c4393f5795285528bc862c7b97b91251f31a08004a3c626d18114",
                "sha256:a00edb2dec0035e98ac3ec768086f0b06dfabb4ad308592ede364ef573692f55",
                "sha256:b48401752496757e95304a46213c3155bc911ac884bed2e9b275ce1c1df3e293",
                "sha256:b6cf18f9e653a8077522bb3aa753a776b117e3e0cc872c25811cfdf1459491c2",
                "sha256:bb8adab1877e9213385cbb1adc297ed8337e01872c42a30cfaa66ff8c422779c",
                "sha256:c8a4b39ba380b57a31a4b5449a9d257b1302d8bc4799767e645dcee25725efe1",
                "sha256:cee9bc75bff455d317b6947081df0824a8f118de2786dc3d74a3503fd631f4ef",
                "sha256:d0dc1313dff48af64517cbbd85e046d6b477fbe5e9d69712801f024dcb08c62b",
                "sha256:d5bf527ed83617edd1855a5c923eeeaf68bcb9ac0ceb28e3f19b575b3a424984",
                "sha256:df5863a21f91de5ecdf7d32a32f406dd9867ebb35d41033b8bd9607a21887599",
                "sha256:e39142332541ed2884c257495504858b22c078a5d781059b07aba4c3a80d7551",
                "sha256:e52e8f675ba0b2b417fa98579e7286a41a8e23871f17f4793772f5aa884fea79",
                "sha256:e6dd55d5d94b9e36929325dd0c9ab85bfde84a5fc35947c334c32af1af668944",
                "sha256:e87cc1acbebf263f308a8494272c2d42016aa33c32bf14d209c81e1f65e11868",
                "sha256:ea0091cd4100519cedfeea2c659f52291f535ac6725e2368bcf59e874f270efa",
                "sha256:eeb247f4f4d962942b3b555530b0c63b77473c7bfe475e51c6b75b7344b49ce3",
                "sha256:f0d4433adce6075efd24fc0285135248b0b50f5a58129c7e552030e04fe45c7f",
                "sha256:f1f3bd92f8e12dc22884935a73c9f94c4d9bd0d34410c456540713d6b7832b8c",
                "sha256:f42a87cbf50e905f49f053c0b1fb86c911c730624022bf44c8857244fc4cdaca",
                "sha256:f5f302db65e2e0ae96e26670818157640d3ca83a3054c290eff3631598dcf819",
                "sha256:f7634d534662bbb08976db801ba27a112aee23e597eeaf09267b4575341e45bf",
                "sha256:fdd374c02e8bb2d6468a85be50ea66e1c4ef9e809974c30d8576728473a6ed03",
                "sha256:fe6931db24716a0845bd8c8915bd096b77c2a7043e6fc59ae9ca364fe816f08b"
            ],
            "version": "==5.1.0"
        },
        "psycopg2": {
            "hashes": [
                "sha256:027ae518d0e3b8fff41990e598bc7774c3d08a3a20e9ecc0b59fb2aaaf152f7f",
                "sha256:092a80da1b052a181b6e6c765849c9b32d46c5dac3b81bf8c9b83e697f3cdbe8",
                "sha256:0b9851e798bae024ed1a2a6377a8dab4b8a128a56ed406f572f9f06194e4b275",
                "sha256:179c52eb870110a8c1b460c86d4f696d58510ea025602cd3f81453746fccb94f",
                "sha256:19983b77ec1fc2a210092aa0333ee48811fd9fb5f194c6cd5b927ed409aea5f8",
                "sha256:1d90379d01d0dc50ae9b40c863933d87ff82d51dd7d52cea5d1cb7019afd72cd",
                "sha256:27467fd5af1dcc0a82d72927113b8f92da8f44b2efbdb8906bd76face95b596d",
                "sha256:32702e3bd8bfe12b36226ba9846ed9e22336fc4bd710039d594b36bd432ae255",
                "sha256:33f9e1032095e1436fa9ec424abcbd4c170da934fb70e391c5d78275d0307c75",
                "sha256:36030ca7f4b4519ee4f52a74edc4ec73c75abfb6ea1d80ac7480953d1c0aa3c3",
                "sha256:363fbbf4189722fc46779be1fad2597e2c40b3f577dc618f353a46391cf5d235",
                "sha256:6f302c486132f8dd11f143e919e236ea4467d53bf18c451cac577e6988ecbd05",
                "sha256:733166464598c239323142c071fa4c9b91c14359176e5ae7e202db6bcc1d2eb5",
                "sha256:7cbc3b21ce2f681ca9ad2d8c0901090b23a30c955e980ebf1006d41f37068a95",
                "sha256:888bba7841116e529f407f15c6d28fe3ef0760df8c45257442ec2f14f161c871",
                "sha256:8966829cb0d21a08a3c5ac971a2eb67c3927ae27c247300a8476554cc0ce2ae8",
                "sha256:8bf51191d60f6987482ef0cfe8511bbf4877a5aa7f313d7b488b53189cf26209",
                "sha256:8eb94c0625c529215b53c08fb4e461546e2f3fc96a49c13d5474b5ad7aeab6cf",
                "sha256:8ebba5314c609a05c6955e5773c7e0e57b8dd817e4f751f30de729be58fa5e78",
                "sha256:932a4c101af007cb3132b1f8a9ffef23386acc53dad46536dc5ba43a3235ae02",
                "sha256:ad75fe10bea19ad2188c5cb5fc4cdf53ee808d9b44578c94a3cd1e9fc2beb656",
                "sha256:aeaba399254ca79c299d9fe6aa811d3c3eac61458dee10270de7f4e71c624998",
                "sha256:b178e0923c93393e16646155794521e063ec17b7cc9f943f15b7d4b39776ea2c",
                "sha256:b68e89bb086a9476fa85298caab43f92d0a6af135a5f433d1f6b6d82cafa7b55",
                "sha256:d74cf9234ba76426add5e123449be08993a9b13ff434c6efa3a07caa305a619f",
                "sha256:f3d3a88128f0c219bdc5b2d9ccd496517199660cea021c560a3252116df91cbd",
                "sha256:fe6a7f87356116f5ea840c65b032af17deef0e1a5c34013a2962dd6f99b860dd"
            ],
            "version": "==2.7.4"
        },
        "psycopg2-binary": {
            "hashes": [
                "sha256:02eb674e3d5810e19b4d5d00720b17130e182da1ba259dda608aaf33d787347d",
                "sha256:3a14baeabcebd4662f12f4bff03e0574a2369a2e41baf829e6fb4a24c95cf88b",
                "sha256:436a503eda41f6adb08f292f40a3784fce0a5f351b6ae7b19a911904db53af93",
                "sha256:465ff1d427ed42c31e456dbbd9edab3552be18a0edaef7450c5b3e6fee745052",
                "sha256:4a1a5ea2fa4b53191637b162873a82822d92a85a08beefe28296b8eb5cf2fea5",
                "sha256:4a4f23a08fbccbe40ecdb5384d807bcb469ea71dd87e6be2e80b036b8e6d47df",
                "sha256:77a2fc622a1f2d08a707673c9be5769d521f03d867d305f172bb417fa7882754",
                "sha256:8014c06a9ed7b78ba81beff3ae71acd78c212390f8ed839e9ce22735880bd5b4",
                "sha256:83af04029bcb4b56c852e5876fef71340dcb465fa44fc99f80bac72e10fb0b74",
                "sha256:86c0d2587f56776f25d52cca8e275adf495c8e01933fbfc2ca23b124610ab761",
                "sha256:9305d7cbc802aaefac5c75a3df725f2654797369f32b18d4d0adb382dfab6c09",
                "sha256:9b5ddbed85ec73293695d7116589d956ef0dd3fcf7bf3b2a3bc1e8e54c1d543a",
                "sha256:a3d2cc0cb0b988dbfd0d11f7fac34058b25a6ce533ed5b8e88d6cb315e77d54a",
                "sha256:ab1db8f3e96570d9f7ebc45133ce2574804b2280499baade178e163d022107b5",
                "sha256:b039f51bca1ddd70234cc3f84f94f42ad43861b931bdfb497f887c60c39a6565",
                "sha256:b287ddf4cafcfb632974907d1e7862119e36bb758228bdb07dd247553e4cdfc0",
                "sha256:b6b2b26590304d97ef2af28d153ee99ace6fe0806934f4618edfc87216c77f91",
                "sha256:c4c6004d410c77bfa5389ae9485498ce32805447a67afbfe8db0d247a5c88fa1",
                "sha256:c606bff0978ee4858d86d40f6b6ab0c4cac4474f627bd054683dc03a4fc1a366",
                "sha256:c8220c521a408b41c4f14036004a621ed0d965941286b978cd2ea2623fabd755",
                "sha256:cb07184a4bfad304831f0a88b1c13fbd8cf9fcdf1f11e71c477dd6d7b1b078a0",
                "sha256:cf3911fba0c47fc1313b5783183cda301032b14637a0b7a336766ae46998c7ee",
                "sha256:d0972f062c73956332e9681dfdb133168618f0abfecc96e89f0205ac89cd454b",
                "sha256:d1dd3eb8edd354083f5d27b968c5a17854c41347ba5a480b520be85ec1a8495c",
                "sha256:d51c7ed810fce1e50464088c37cc8da05534de8afb12a732500827ebcc480081",
                "sha256:d8940b5104588d6313315e037f0f5ed68d2e5f62ccc1c429d3cff11d2ba6de3f",
                "sha256:de4f88f823037a71ea5ef3c1041d96b8a68d73343133edda684fd42f575bd9d7"
            ],
            "version": "==2.7.4"
        },
        "python-dateutil": {
            "hashes": [
                "sha256:891c38b2a02f5bb1be3e4793866c8df49c7d19baabf9c1bad62547e0b4866aca",
                "sha256:95511bae634d69bc7329ba55e646499a842bc4ec342ad54a8cdb65645a0aad3c"
            ],
            "version": "==2.6.1"
        },
        "pytz": {
            "hashes": [
                "sha256:65ae0c8101309c45772196b21b74c46b2e5d11b6275c45d251b150d5da334555",
                "sha256:c06425302f2cf668f1bba7a0a03f3c1d34d4ebeef2c72003da308b3947c7f749"
            ],
            "version": "==2018.4"
        },
        "raven": {
            "hashes": [
                "sha256:738a52019d01955d5b44b49d67c9f2f4cedb1b4f70d4fb0b493931174d00e044",
                "sha256:92bf4c4819472ed20f1b9905eeeafe1bc6fe5f273d7c14506fdb8fb3a6ab2074"
            ],
            "version": "==6.6.0"
        },
        "requests": {
            "hashes": [
                "sha256:6a1b267aa90cac58ac3a765d067950e7dbbf75b1da07e895d1f594193a40a38b",
                "sha256:9c443e7324ba5b85070c4a818ade28bfabedf16ea10206da1132edaa6dda237e"
            ],
            "version": "==2.18.4"
        },
        "s3transfer": {
            "hashes": [
                "sha256:90dc18e028989c609146e241ea153250be451e05ecc0c2832565231dacdf59c1",
                "sha256:c7a9ec356982d5e9ab2d4b46391a7d6a950e2b04c472419f5fdec70cc0ada72f"
            ],
            "version": "==0.1.13"
        },
        "six": {
            "hashes": [
                "sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9",
                "sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb"
            ],
            "version": "==1.11.0"
        },
        "unidecode": {
            "hashes": [
                "sha256:280a6ab88e1f2eb5af79edff450021a0d3f0448952847cd79677e55e58bad051",
                "sha256:61f807220eda0203a774a09f84b4304a3f93b5944110cc132af29ddb81366883"
            ],
            "version": "==0.4.21"
        },
        "urllib3": {
            "hashes": [
                "sha256:06330f386d6e4b195fbfc736b297f58c5a892e4440e54d294d7004e3a9bbea1b",
                "sha256:cc44da8e1145637334317feebd728bd869a35285b93cbb4cca2577da7e62db4f"
            ],
            "version": "==1.22"
        },
        "wagtail": {
            "hashes": [
                "sha256:59331344af34f5aa3592efb1f0f16ec5b2844292c41e08ece3cb677a5701057a",
                "sha256:f548eb3515570575567a1152cc2cd871e5138f00f35b16c3fcfa8220604d36e8"
            ],
            "version": "==2.0.1"
        },
        "webencodings": {
            "hashes": [
                "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78",
                "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"
            ],
            "version": "==0.5.1"
        },
        "whitenoise": {
            "hashes": [
                "sha256:15f43b2e701821b95c9016cf469d29e2a546cb1c7dead584ba82c36f843995cf",
                "sha256:9d81515f2b5b27051910996e1e860b1332e354d9e7bcf30c98f21dcb6713e0dd"
            ],
            "version": "==3.3.1"
        },
        "willow": {
            "hashes": [
                "sha256:76a8874304356b7d86923405f5ca1df125c3540fb55b32747e7a33ba59bc1744",
                "sha256:818ee11803c90a0a6d49c94b0453d6266be1ef83ae00de72731c45fae4d3e78c"
            ],
            "version": "==1.1"
        }
    },
    "develop": {}
}


assistant (Mar 3, 2025, 03:37 PM)

I'll create a tool that parses Pipfile.lock content and outputs dependency names with their version numbers in the requested format.

create Pipfile.lock Dependency Parser

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Pipfile.lock Dependency Parser</title>
  <style>
  * {
    box-sizing: border-box;
  }
  
  body {
    font-family: Helvetica, Arial, sans-serif;
    line-height: 1.6;
    max-width: 800px;
    margin: 0 auto;
    padding: 20px;
    color: #333;
  }
  
  h1 {
    margin-top: 0;
  }
  
  textarea {
    width: 100%;
    height: 300px;
    padding: 10px;
    margin-bottom: 15px;
    border: 1px solid #ccc;
    border-radius: 4px;
    font-size: 16px;
    font-family: monospace;
  }
  
  button {
    background-color: #4CAF50;
    color: white;
    border: none;
    padding: 10px 15px;
    cursor: pointer;
    border-radius: 4px;
    font-size: 16px;
  }
  
  button:hover {
    background-color: #45a049;
  }
  
  pre {
    background-color: #f5f5f5;
    padding: 15px;
    border-radius: 4px;
    overflow-x: auto;
    white-space: pre-wrap;
    margin-top: 20px;
  }
  
  .error {
    color: #d9534f;
    margin-top: 10px;
  }
  
  .controls {
    display: flex;
    gap: 10px;
    margin-bottom: 15px;
  }
  </style>
</head>
<body>
  <h1>Pipfile.lock Dependency Parser</h1>
  <p>Paste your Pipfile.lock content below and click "Parse" to extract dependencies with their versions.</p>
  
  <textarea id="input" placeholder="Paste Pipfile.lock content here..."></textarea>
  
  <div class="controls">
    <button id="parseBtn">Parse Dependencies</button>
    <button id="copyBtn">Copy Output</button>
    <button id="clearBtn">Clear All</button>
  </div>
  
  <div id="error" class="error"></div>
  
  <h2>Output:</h2>
  <pre id="output"></pre>
  
  <script type="module">
// Parse the Pipfile.lock content and extract dependencies
function parsePipfileLock(content) {
  try {
    // Parse the JSON content
    const data = JSON.parse(content);
    let result = [];
    
    // Process dependencies from "default" section
    if (data.default) {
      for (const [name, info] of Object.entries(data.default)) {
        if (info.version) {
          // Extract version without the '==' prefix
          const version = info.version.replace(/^==/, '');
          result.push(`"${name}" = "==${version}"`);
        }
      }
    }
    
    // Process dependencies from "develop" section if needed
    if (data.develop) {
      for (const [name, info] of Object.entries(data.develop)) {
        if (info.version) {
          const version = info.version.replace(/^==/, '');
          result.push(`"${name}" = "==${version}"`);
        }
      }
    }
    
    return result.join('\n');
  } catch (error) {
    throw new Error(`Failed to parse Pipfile.lock: ${error.message}`);
  }
}

// Set up event handlers
document.getElementById('parseBtn').addEventListener('click', () => {
  const input = document.getElementById('input').value.trim();
  const outputEl = document.getElementById('output');
  const errorEl = document.getElementById('error');
  
  errorEl.textContent = '';
  
  if (!input) {
    errorEl.textContent = 'Please paste Pipfile.lock content first.';
    return;
  }
  
  try {
    const result = parsePipfileLock(input);
    outputEl.textContent = result;
  } catch (error) {
    errorEl.textContent = error.message;
  }
});

document.getElementById('copyBtn').addEventListener('click', () => {
  const output = document.getElementById('output').textContent;
  
  if (!output) {
    document.getElementById('error').textContent = 'No content to copy.';
    return;
  }
  
  navigator.clipboard.writeText(output)
    .then(() => {
      const errorEl = document.getElementById('error');
      errorEl.textContent = 'Output copied to clipboard!';
      errorEl.style.color = '#4CAF50';
      setTimeout(() => {
        errorEl.textContent = '';
        errorEl.style.color = '#d9534f';
      }, 2000);
    })
    .catch(err => {
      document.getElementById('error').textContent = 'Failed to copy: ' + err;
    });
});

document.getElementById('clearBtn').addEventListener('click', () => {
  document.getElementById('input').value = '';
  document.getElementById('output').textContent = '';
  document.getElementById('error').textContent = '';
});

// Initialize with example data from the textarea if present
const initialContent = document.getElementById('input').value.trim();
if (initialContent) {
  document.getElementById('parseBtn').click();
}
  </script>
</body>
</html>

I've created a simple web-based tool that parses Pipfile.lock content and formats it according to your requirements. Here's how to use it:

  1. Paste your Pipfile.lock JSON content into the text area
  2. Click "Parse Dependencies" to process the file
  3. The output will appear in the format you requested, with each dependency on a new line like:
    "psycopg2-binary" = "==2.7.4"
    
  4. Use the "Copy Output" button to copy the formatted dependencies to your clipboard
  5. "Clear All" button resets the form if needed

The tool handles both the "default" and "develop" dependencies from your Pipfile.lock, extracting the name and version for each package. It also includes error handling for invalid JSON content.

Is there anything specific you'd like me to modify or explain about how the parser works?

human (Mar 3, 2025, 03:39 PM)

have it output a standard requirement.stxt file too

assistant (Mar 3, 2025, 03:39 PM)

I'll modify the tool to also output a standard requirements.txt format alongside the current output.

update dependency-parser

Find this:

  <h2>Output:</h2>
  <pre id="output"></pre>
  

Replace with this:

  <h2>Pipfile Format:</h2>
  <pre id="output"></pre>
  
  <h2>Requirements.txt Format:</h2>
  <pre id="reqsOutput"></pre>
  

update dependency-parser

Find this:

  <div class="controls">
    <button id="parseBtn">Parse Dependencies</button>
    <button id="copyBtn">Copy Output</button>
    <button id="clearBtn">Clear All</button>
  </div>

Replace with this:

  <div class="controls">
    <button id="parseBtn">Parse Dependencies</button>
    <button id="copyPipfileBtn">Copy Pipfile Format</button>
    <button id="copyReqsBtn">Copy Requirements.txt</button>
    <button id="clearBtn">Clear All</button>
  </div>

update dependency-parser

Find this:

// Parse the Pipfile.lock content and extract dependencies
function parsePipfileLock(content) {
  try {
    // Parse the JSON content
    const data = JSON.parse(content);
    let result = [];
    
    // Process dependencies from "default" section
    if (data.default) {
      for (const [name, info] of Object.entries(data.default)) {
        if (info.version) {
          // Extract version without the '==' prefix
          const version = info.version.replace(/^==/, '');
          result.push(`"${name}" = "==${version}"`);
        }
      }
    }
    
    // Process dependencies from "develop" section if needed
    if (data.develop) {
      for (const [name, info] of Object.entries(data.develop)) {
        if (info.version) {
          const version = info.version.replace(/^==/, '');
          result.push(`"${name}" = "==${version}"`);
        }
      }
    }
    
    return result.join('\n');
  } catch (error) {
    throw new Error(`Failed to parse Pipfile.lock: ${error.message}`);
  }
}

Replace with this:

// Parse the Pipfile.lock content and extract dependencies
function parsePipfileLock(content) {
  try {
    // Parse the JSON content
    const data = JSON.parse(content);
    let pipfileFormat = [];
    let reqsFormat = [];
    
    // Process dependencies from "default" section
    if (data.default) {
      for (const [name, info] of Object.entries(data.default)) {
        if (info.version) {
          // Extract version without the '==' prefix
          const version = info.version.replace(/^==/, '');
          pipfileFormat.push(`"${name}" = "==${version}"`);
          reqsFormat.push(`${name}==${version}`);
        }
      }
    }
    
    // Process dependencies from "develop" section if needed
    if (data.develop) {
      for (const [name, info] of Object.entries(data.develop)) {
        if (info.version) {
          const version = info.version.replace(/^==/, '');
          pipfileFormat.push(`"${name}" = "==${version}"`);
          reqsFormat.push(`${name}==${version}`);
        }
      }
    }
    
    return {
      pipfileFormat: pipfileFormat.join('\n'),
      reqsFormat: reqsFormat.join('\n')
    };
  } catch (error) {
    throw new Error(`Failed to parse Pipfile.lock: ${error.message}`);
  }
}

update dependency-parser

Find this:

document.getElementById('parseBtn').addEventListener('click', () => {
  const input = document.getElementById('input').value.trim();
  const outputEl = document.getElementById('output');
  const errorEl = document.getElementById('error');
  
  errorEl.textContent = '';
  
  if (!input) {
    errorEl.textContent = 'Please paste Pipfile.lock content first.';
    return;
  }
  
  try {
    const result = parsePipfileLock(input);
    outputEl.textContent = result;
  } catch (error) {
    errorEl.textContent = error.message;
  }
});

document.getElementById('copyBtn').addEventListener('click', () => {
  const output = document.getElementById('output').textContent;
  
  if (!output) {
    document.getElementById('error').textContent = 'No content to copy.';
    return;
  }
  
  navigator.clipboard.writeText(output)
    .then(() => {
      const errorEl = document.getElementById('error');
      errorEl.textContent = 'Output copied to clipboard!';
      errorEl.style.color = '#4CAF50';
      setTimeout(() => {
        errorEl.textContent = '';
        errorEl.style.color = '#d9534f';
      }, 2000);
    })
    .catch(err => {
      document.getElementById('error').textContent = 'Failed to copy: ' + err;
    });
});

Replace with this:

document.getElementById('parseBtn').addEventListener('click', () => {
  const input = document.getElementById('input').value.trim();
  const pipfileOutputEl = document.getElementById('output');
  const reqsOutputEl = document.getElementById('reqsOutput');
  const errorEl = document.getElementById('error');
  
  errorEl.textContent = '';
  
  if (!input) {
    errorEl.textContent = 'Please paste Pipfile.lock content first.';
    return;
  }
  
  try {
    const result = parsePipfileLock(input);
    pipfileOutputEl.textContent = result.pipfileFormat;
    reqsOutputEl.textContent = result.reqsFormat;
  } catch (error) {
    errorEl.textContent = error.message;
  }
});

function copyToClipboard(text, successMessage) {
  if (!text) {
    document.getElementById('error').textContent = 'No content to copy.';
    return;
  }
  
  navigator.clipboard.writeText(text)
    .then(() => {
      const errorEl = document.getElementById('error');
      errorEl.textContent = successMessage || 'Output copied to clipboard!';
      errorEl.style.color = '#4CAF50';
      setTimeout(() => {
        errorEl.textContent = '';
        errorEl.style.color = '#d9534f';
      }, 2000);
    })
    .catch(err => {
      document.getElementById('error').textContent = 'Failed to copy: ' + err;
    });
}

document.getElementById('copyPipfileBtn').addEventListener('click', () => {
  const output = document.getElementById('output').textContent;
  copyToClipboard(output, 'Pipfile format copied to clipboard!');
});

document.getElementById('copyReqsBtn').addEventListener('click', () => {
  const output = document.getElementById('reqsOutput').textContent;
  copyToClipboard(output, 'Requirements.txt format copied to clipboard!');
});

I've updated the tool to generate both Pipfile and requirements.txt formats. Here are the changes:

  1. Added a second output section labeled "Requirements.txt Format"
  2. Modified the parsing function to return both formats:
    • Pipfile format: "package-name" = "==1.2.3"
    • Requirements.txt format: package-name==1.2.3
  3. Replaced the single copy button with two separate buttons:
    • "Copy Pipfile Format" - copies the Pipfile-style output
    • "Copy Requirements.txt" - copies the requirements.txt format
  4. Added visual feedback when copying either format

The tool still processes all the same dependencies from both "default" and "develop" sections, but now presents the information in both formats for your convenience.

Is there anything else you'd like me to adjust about the tool?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment