{"schema_version":"2","scorer_version":"0.1.0","scoring_version":"prov-2+qual-1+sec-1","generated_at":"2026-11-09T19:28:54.783079Z","repo":{"ref":{"host":"github.com","owner":"psf","name":"requests"},"default_branch":"main","clone_url":"https://github.com/psf/requests.git","html_url":"https://github.com/psf/requests","description":"A simple, yet elegant, HTTP library.","stars":54732,"forks":10844,"is_fork":false,"is_archived":false,"is_private":false,"size_kb":13640,"primary_language":"Python","license_spdx":"Apache-2.0","created_at":"2011-02-13T18:38:17Z","pushed_at":"2026-11-02T16:55:12Z","security_policy_url":"https://github.com/psf/requests/security/policy","distribution":null},"commit_sha":"3c7baaa05ab4aa49cc819ce3a819d260de19c157","profile":{"lines_by_language":{"Python":12032},"files_by_category":{"docs":34,"other":34,"source":22,"config":19,"test":15,"binary":5,"oversized":1},"source_lines":6874,"test_lines":5158},"pillars":{"ai_provenance":{"score":0.0,"confidence":0.65,"coverage":1.0,"label":"possible","breakdown":{"attributed_share":0.0,"suspected_share":0.0,"estimated_share":0.0,"ai_artifacts":0.0,"flagged_work_units":0.0,"flagged_releases":0.0},"summary":"Weak signals consistent with AI-assisted development. 1 commit(s) carry explicit AI attribution, too few to characterize the codebase."},"quality":{"score":85.0,"confidence":0.9,"coverage":1.0,"label":"strong","breakdown":{"complexity":61.8,"duplication":86.4,"lint":80.4,"testing":98.6,"docs":100.0,"type_safety":60.0,"process":100.0},"summary":"Code quality is strong: test-to-source ratio 0.75, CI runs tests; 16% of function code in complex or long functions; 2% duplicated lines. Weakest area: type safety."},"security":{"score":90.0,"confidence":0.85,"coverage":1.0,"label":"strong","breakdown":{"secrets":74.1,"sast":92.9,"dependencies":100.0,"ci_actions":100.0,"posture":100.0,"scorecard":78.6},"summary":"Security posture is strong: no high-impact findings. Weakest area: secrets."}},"analyzer_results":[{"analyzer":"sec-scorecard","pillar":"security","status":"ok","tool_version":"scorecard v5.6.0","metrics":{"aggregate":8.4,"check:Code-Review":10.0,"check:Dangerous-Workflow":10.0,"check:Maintained":10.0,"check:Binary-Artifacts":10.0,"check:Security-Policy":10.0,"check:Token-Permissions":10.0,"check:Pinned-Dependencies":5.0,"check:CII-Best-Practices":0.0,"check:Fuzzing":10.0,"check:License":10.0,"check:Signed-Releases":0.0,"check:Packaging":10.0,"check:SAST":10.0},"findings":[],"evidence":[{"kind":"scorecard-check","description":"Scorecard Code-Review: 10/10 (all changesets reviewed)","ref":"Code-Review","url":"https://scorecard.dev/viewer/?uri=github.com/psf/requests","weight":0.0},{"kind":"scorecard-check","description":"Scorecard Dangerous-Workflow: 10/10 (no dangerous workflow patterns detected)","ref":"Dangerous-Workflow","url":"https://scorecard.dev/viewer/?uri=github.com/psf/requests","weight":0.0},{"kind":"scorecard-check","description":"Scorecard Maintained: 10/10 (8 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 10)","ref":"Maintained","url":"https://scorecard.dev/viewer/?uri=github.com/psf/requests","weight":0.0},{"kind":"scorecard-check","description":"Scorecard Binary-Artifacts: 10/10 (no binaries found in the repo)","ref":"Binary-Artifacts","url":"https://scorecard.dev/viewer/?uri=github.com/psf/requests","weight":0.0},{"kind":"scorecard-check","description":"Scorecard Security-Policy: 10/10 (security policy file detected)","ref":"Security-Policy","url":"https://scorecard.dev/viewer/?uri=github.com/psf/requests","weight":0.0},{"kind":"scorecard-check","description":"Scorecard Token-Permissions: 10/10 (GitHub workflow tokens follow principle of least privilege)","ref":"Token-Permissions","url":"https://scorecard.dev/viewer/?uri=github.com/psf/requests","weight":0.0},{"kind":"scorecard-check","description":"Scorecard Pinned-Dependencies: 5/10 (dependency not pinned by hash detected -- score normalized to 5)","ref":"Pinned-Dependencies","url":"https://scorecard.dev/viewer/?uri=github.com/psf/requests","weight":0.5},{"kind":"scorecard-check","description":"Scorecard CII-Best-Practices: 0/10 (no effort to earn an OpenSSF best practices badge detected)","ref":"CII-Best-Practices","url":"https://scorecard.dev/viewer/?uri=github.com/psf/requests","weight":1.0},{"kind":"scorecard-check","description":"Scorecard Fuzzing: 10/10 (project is fuzzed)","ref":"Fuzzing","url":"https://scorecard.dev/viewer/?uri=github.com/psf/requests","weight":0.0},{"kind":"scorecard-check","description":"Scorecard License: 10/10 (license file detected)","ref":"License","url":"https://scorecard.dev/viewer/?uri=github.com/psf/requests","weight":0.0},{"kind":"scorecard-check","description":"Scorecard Signed-Releases: 0/10 (Project has not signed or included provenance with any releases.)","ref":"Signed-Releases","url":"https://scorecard.dev/viewer/?uri=github.com/psf/requests","weight":1.0},{"kind":"scorecard-check","description":"Scorecard Packaging: 10/10 (packaging workflow detected)","ref":"Packaging","url":"https://scorecard.dev/viewer/?uri=github.com/psf/requests","weight":0.0},{"kind":"scorecard-check","description":"Scorecard SAST: 10/10 (SAST tool is run on all commits)","ref":"SAST","url":"https://scorecard.dev/viewer/?uri=github.com/psf/requests","weight":0.0}],"data":{"date":"2026-10-26","commit":"3c7baaa05ab4aa49cc819ce3a819d260de19c157","matches_head":true},"error":null},{"analyzer":"ai-attribution","pillar":"ai_provenance","status":"ok","tool_version":"signatures-v1","metrics":{"commits":4884.0,"attributed_commits":1.0,"attributed_commit_share":0.00020475020475020476,"effective_loc":113982.0,"attributed_loc":2.0,"attributed_loc_share":0.000017546630169675913,"tools_detected":1.0},"findings":[],"evidence":[{"kind":"attribution-summary","description":"Claude Code: 1 attributed commits, 2 lines added","ref":null,"url":null,"weight":1.0},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"b2a1d33f571518ca9a6148e7da787cc5827f897a","url":"https://github.com/psf/requests/commit/b2a1d33f571518ca9a6148e7da787cc5827f897a","weight":0.9}],"data":{"attributed_loc_by_commit":{"b2a1d33f571518ca9a6148e7da787cc5827f897a":2},"tools":{"claude-code":{"name":"Claude Code","commits":1,"loc":2,"first_seen":1772491759,"last_seen":1772491759}},"monthly":{"2011-02":{"loc":2941,"attributed_loc":0},"2011-03":{"loc":69,"attributed_loc":0},"2011-04":{"loc":493,"attributed_loc":0},"2011-05":{"loc":911,"attributed_loc":0},"2011-06":{"loc":482,"attributed_loc":0},"2011-07":{"loc":165,"attributed_loc":0},"2011-08":{"loc":1826,"attributed_loc":0},"2011-09":{"loc":2877,"attributed_loc":0},"2011-10":{"loc":3962,"attributed_loc":0},"2011-11":{"loc":2830,"attributed_loc":0},"2011-12":{"loc":549,"attributed_loc":0},"2012-01":{"loc":1644,"attributed_loc":0},"2012-02":{"loc":850,"attributed_loc":0},"2012-03":{"loc":530,"attributed_loc":0},"2012-04":{"loc":998,"attributed_loc":0},"2012-05":{"loc":709,"attributed_loc":0},"2012-06":{"loc":17642,"attributed_loc":0},"2012-07":{"loc":933,"attributed_loc":0},"2012-08":{"loc":1046,"attributed_loc":0},"2012-09":{"loc":171,"attributed_loc":0},"2012-10":{"loc":284,"attributed_loc":0},"2012-11":{"loc":16045,"attributed_loc":0},"2012-12":{"loc":7521,"attributed_loc":0},"2013-01":{"loc":542,"attributed_loc":0},"2013-02":{"loc":229,"attributed_loc":0},"2013-03":{"loc":725,"attributed_loc":0},"2013-04":{"loc":558,"attributed_loc":0},"2013-05":{"loc":249,"attributed_loc":0},"2013-06":{"loc":158,"attributed_loc":0},"2013-07":{"loc":374,"attributed_loc":0},"2013-08":{"loc":70,"attributed_loc":0},"2013-09":{"loc":1013,"attributed_loc":0},"2013-10":{"loc":654,"attributed_loc":0},"2013-11":{"loc":246,"attributed_loc":0},"2013-12":{"loc":4894,"attributed_loc":0},"2014-01":{"loc":310,"attributed_loc":0},"2014-02":{"loc":80,"attributed_loc":0},"2014-03":{"loc":538,"attributed_loc":0},"2014-04":{"loc":746,"attributed_loc":0},"2014-05":{"loc":109,"attributed_loc":0},"2014-06":{"loc":127,"attributed_loc":0},"2014-07":{"loc":889,"attributed_loc":0},"2014-08":{"loc":310,"attributed_loc":0},"2014-09":{"loc":105,"attributed_loc":0},"2014-10":{"loc":206,"attributed_loc":0},"2014-11":{"loc":63,"attributed_loc":0},"2014-12":{"loc":616,"attributed_loc":0},"2015-01":{"loc":73,"attributed_loc":0},"2015-02":{"loc":285,"attributed_loc":0},"2015-03":{"loc":161,"attributed_loc":0},"2015-04":{"loc":367,"attributed_loc":0},"2015-05":{"loc":166,"attributed_loc":0},"2015-06":{"loc":8,"attributed_loc":0},"2015-07":{"loc":516,"attributed_loc":0},"2015-08":{"loc":82,"attributed_loc":0},"2015-09":{"loc":77,"attributed_loc":0},"2015-10":{"loc":319,"attributed_loc":0},"2015-11":{"loc":178,"attributed_loc":0},"2015-12":{"loc":770,"attributed_loc":0},"2016-01":{"loc":89,"attributed_loc":0},"2016-02":{"loc":1070,"attributed_loc":0},"2016-03":{"loc":597,"attributed_loc":0},"2016-04":{"loc":408,"attributed_loc":0},"2016-05":{"loc":328,"attributed_loc":0},"2016-06":{"loc":187,"attributed_loc":0},"2016-07":{"loc":241,"attributed_loc":0},"2016-08":{"loc":1031,"attributed_loc":0},"2016-09":{"loc":229,"attributed_loc":0},"2016-10":{"loc":9713,"attributed_loc":0},"2016-11":{"loc":990,"attributed_loc":0},"2016-12":{"loc":183,"attributed_loc":0},"2017-01":{"loc":1189,"attributed_loc":0},"2017-02":{"loc":272,"attributed_loc":0},"2017-03":{"loc":187,"attributed_loc":0},"2017-04":{"loc":516,"attributed_loc":0},"2017-05":{"loc":6135,"attributed_loc":0},"2017-06":{"loc":112,"attributed_loc":0},"2017-07":{"loc":78,"attributed_loc":0},"2017-08":{"loc":35,"attributed_loc":0},"2017-09":{"loc":7,"attributed_loc":0},"2017-10":{"loc":82,"attributed_loc":0},"2017-11":{"loc":184,"attributed_loc":0},"2017-12":{"loc":51,"attributed_loc":0},"2018-01":{"loc":192,"attributed_loc":0},"2018-02":{"loc":36,"attributed_loc":0},"2018-03":{"loc":0,"attributed_loc":0},"2018-04":{"loc":3,"attributed_loc":0},"2018-05":{"loc":3,"attributed_loc":0},"2018-06":{"loc":54,"attributed_loc":0},"2018-07":{"loc":38,"attributed_loc":0},"2018-08":{"loc":44,"attributed_loc":0},"2018-09":{"loc":284,"attributed_loc":0},"2018-10":{"loc":88,"attributed_loc":0},"2018-11":{"loc":3,"attributed_loc":0},"2018-12":{"loc":257,"attributed_loc":0},"2019-01":{"loc":0,"attributed_loc":0},"2019-02":{"loc":170,"attributed_loc":0},"2019-03":{"loc":0,"attributed_loc":0},"2019-04":{"loc":5,"attributed_loc":0},"2019-05":{"loc":85,"attributed_loc":0},"2019-06":{"loc":4,"attributed_loc":0},"2019-07":{"loc":18,"attributed_loc":0},"2019-08":{"loc":12,"attributed_loc":0},"2019-09":{"loc":12,"attributed_loc":0},"2019-10":{"loc":4,"attributed_loc":0},"2020-01":{"loc":2,"attributed_loc":0},"2020-02":{"loc":70,"attributed_loc":0},"2020-03":{"loc":29,"attributed_loc":0},"2020-04":{"loc":17,"attributed_loc":0},"2020-05":{"loc":5,"attributed_loc":0},"2020-06":{"loc":17,"attributed_loc":0},"2020-07":{"loc":0,"attributed_loc":0},"2020-08":{"loc":13,"attributed_loc":0},"2020-09":{"loc":0,"attributed_loc":0},"2020-10":{"loc":8,"attributed_loc":0},"2020-11":{"loc":135,"attributed_loc":0},"2020-12":{"loc":47,"attributed_loc":0},"2021-01":{"loc":0,"attributed_loc":0},"2021-02":{"loc":0,"attributed_loc":0},"2021-03":{"loc":6,"attributed_loc":0},"2021-04":{"loc":0,"attributed_loc":0},"2021-05":{"loc":17,"attributed_loc":0},"2021-06":{"loc":0,"attributed_loc":0},"2021-07":{"loc":176,"attributed_loc":0},"2021-08":{"loc":76,"attributed_loc":0},"2021-09":{"loc":38,"attributed_loc":0},"2021-10":{"loc":0,"attributed_loc":0},"2021-11":{"loc":66,"attributed_loc":0},"2021-12":{"loc":13,"attributed_loc":0},"2022-01":{"loc":37,"attributed_loc":0},"2022-02":{"loc":99,"attributed_loc":0},"2022-03":{"loc":143,"attributed_loc":0},"2022-04":{"loc":2764,"attributed_loc":0},"2022-05":{"loc":45,"attributed_loc":0},"2022-06":{"loc":118,"attributed_loc":0},"2022-07":{"loc":0,"attributed_loc":0},"2022-09":{"loc":0,"attributed_loc":0},"2022-10":{"loc":4,"attributed_loc":0},"2022-11":{"loc":0,"attributed_loc":0},"2022-12":{"loc":2,"attributed_loc":0},"2023-01":{"loc":18,"attributed_loc":0},"2023-02":{"loc":48,"attributed_loc":0},"2023-03":{"loc":3,"attributed_loc":0},"2023-04":{"loc":15,"attributed_loc":0},"2023-05":{"loc":43,"attributed_loc":0},"2023-06":{"loc":1,"attributed_loc":0},"2023-07":{"loc":11,"attributed_loc":0},"2023-08":{"loc":36,"attributed_loc":0},"2023-09":{"loc":1,"attributed_loc":0},"2023-10":{"loc":9,"attributed_loc":0},"2023-11":{"loc":39,"attributed_loc":0},"2023-12":{"loc":0,"attributed_loc":0},"2024-01":{"loc":20,"attributed_loc":0},"2024-02":{"loc":14,"attributed_loc":0},"2024-03":{"loc":288,"attributed_loc":0},"2024-04":{"loc":5,"attributed_loc":0},"2024-05":{"loc":202,"attributed_loc":0},"2024-07":{"loc":47,"attributed_loc":0},"2024-08":{"loc":0,"attributed_loc":0},"2024-09":{"loc":4,"attributed_loc":0},"2024-10":{"loc":1,"attributed_loc":0},"2024-11":{"loc":0,"attributed_loc":0},"2025-01":{"loc":0,"attributed_loc":0},"2025-02":{"loc":5,"attributed_loc":0},"2025-03":{"loc":0,"attributed_loc":0},"2025-04":{"loc":0,"attributed_loc":0},"2025-05":{"loc":28,"attributed_loc":0},"2025-06":{"loc":69,"attributed_loc":0},"2025-07":{"loc":4,"attributed_loc":0},"2025-08":{"loc":2,"attributed_loc":0},"2025-09":{"loc":0,"attributed_loc":0},"2025-10":{"loc":0,"attributed_loc":0},"2026-01":{"loc":47,"attributed_loc":0},"2026-02":{"loc":18,"attributed_loc":0},"2026-03":{"loc":39,"attributed_loc":2},"2026-04":{"loc":46,"attributed_loc":0},"2026-05":{"loc":1369,"attributed_loc":0},"2026-06":{"loc":86,"attributed_loc":0},"2026-07":{"loc":0,"attributed_loc":0},"2026-08":{"loc":0,"attributed_loc":0},"2026-09":{"loc":0,"attributed_loc":0},"2026-10":{"loc":0,"attributed_loc":0}}},"error":null},{"analyzer":"ai-artifacts","pillar":"ai_provenance","status":"ok","tool_version":"signatures-v1","metrics":{"artifacts":0.0,"workflow_agents":0.0,"tools_configured":0.0},"findings":[],"evidence":[],"data":{"artifacts":[],"workflows":[],"tools":[]},"error":null},{"analyzer":"ai-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-2","metrics":{"work_units":1698.0,"flagged_units":0.0,"pre_ai_era_bursts":7.0,"measured_loc":100133.0,"flagged_loc":0.0,"flagged_loc_share":0.0,"max_loc_per_hour":3142.4046676390913,"median_loc_per_hour":50.49329373185679,"pr_timed_units":151.0,"excluded_import_loc":13849.0},"findings":[],"evidence":[],"data":{"flagged_loc_by_commit":{},"excluded_import_commits":["0bfbacd8b15ddb6e0c3bc86eb81d969ff4bcc0ae","3c680cc1c6ca3005ae1bee929af330d3187f24c1"]},"error":null},{"analyzer":"ai-release-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-2","metrics":{"releases":99.0,"flagged_releases":0.0,"max_loc_per_day":13920.0},"findings":[],"evidence":[],"data":{"releases":[{"from":"v0.13.6","to":"v0.13.7","loc":520,"days":12.75,"loc_per_day":40.8,"flagged":false},{"from":"v0.13.7","to":"v0.13.9","loc":482,"days":6.6,"loc_per_day":73.1,"flagged":false},{"from":"v0.13.9","to":"v0.14.0","loc":76,"days":7.74,"loc_per_day":9.8,"flagged":false},{"from":"v0.14.0","to":"v0.14.1","loc":205,"days":29.36,"loc_per_day":7.0,"flagged":false},{"from":"v0.14.1","to":"v0.14.2","loc":286,"days":25.9,"loc_per_day":11.0,"flagged":false},{"from":"v0.14.2","to":"v1.0.0","loc":23357,"days":51.0,"loc_per_day":458.0,"flagged":false},{"from":"v1.0.0","to":"v1.0.1","loc":16,"days":0.16,"loc_per_day":101.9,"flagged":false},{"from":"v1.0.1","to":"v1.0.2","loc":4,"days":0.04,"loc_per_day":96.0,"flagged":false},{"from":"v1.0.2","to":"v1.0.3","loc":30,"days":0.62,"loc_per_day":48.4,"flagged":false},{"from":"v1.0.3","to":"v1.0.4","loc":104,"days":4.91,"loc_per_day":21.2,"flagged":false},{"from":"v1.0.4","to":"v1.1.0","loc":221,"days":17.98,"loc_per_day":12.3,"flagged":false},{"from":"v1.1.0","to":"v1.2.0","loc":929,"days":79.93,"loc_per_day":11.6,"flagged":false},{"from":"v1.2.0","to":"v1.2.1","loc":847,"days":50.61,"loc_per_day":16.7,"flagged":false},{"from":"v1.2.1","to":"v1.2.2","loc":87,"days":1.06,"loc_per_day":81.7,"flagged":false},{"from":"v1.2.2","to":"v1.2.3","loc":2,"days":3.79,"loc_per_day":0.5,"flagged":false},{"from":"v1.2.3","to":"2.0","loc":551,"days":67.36,"loc_per_day":8.2,"flagged":false},{"from":"2.0","to":"v2.0","loc":1244,"days":54.71,"loc_per_day":22.7,"flagged":false},{"from":"v2.0","to":"v2.0.0","loc":0,"days":0.04,"loc_per_day":0.0,"flagged":false},{"from":"v2.0.0","to":"v2.0.1","loc":403,"days":29.81,"loc_per_day":13.5,"flagged":false},{"from":"v2.0.1","to":"v2.1.0","loc":772,"days":42.35,"loc_per_day":18.2,"flagged":false},{"from":"v2.1.0","to":"v2.2.0","loc":315,"days":34.86,"loc_per_day":9.0,"flagged":false},{"from":"v2.2.0","to":"v2.2.1","loc":195,"days":13.95,"loc_per_day":14.0,"flagged":false},{"from":"v2.2.1","to":"v2.3.0","loc":1458,"days":112.98,"loc_per_day":12.9,"flagged":false},{"from":"v2.3.0","to":"v2.4.0","loc":1332,"days":104.86,"loc_per_day":12.7,"flagged":false},{"from":"v2.4.0","to":"v2.4.1","loc":50,"days":11.08,"loc_per_day":4.5,"flagged":false},{"from":"v2.4.1","to":"v2.4.2","loc":115,"days":26.03,"loc_per_day":4.4,"flagged":false},{"from":"v2.4.2","to":"v2.4.3","loc":34,"days":0.69,"loc_per_day":49.5,"flagged":false},{"from":"v2.4.3","to":"v2.5.0","loc":634,"days":56.57,"loc_per_day":11.2,"flagged":false},{"from":"v2.5.0","to":"v2.5.1","loc":58,"days":21.77,"loc_per_day":2.7,"flagged":false},{"from":"v2.5.1","to":"v2.5.2","loc":537,"days":62.19,"loc_per_day":8.6,"flagged":false},{"from":"v2.5.2","to":"v2.5.3","loc":2,"days":0.75,"loc_per_day":2.7,"flagged":false},{"from":"v2.5.3","to":"v2.6.0","loc":139,"days":18.01,"loc_per_day":7.7,"flagged":false},{"from":"v2.6.0","to":"v2.6.1","loc":214,"days":39.23,"loc_per_day":5.5,"flagged":false},{"from":"v2.6.1","to":"v2.6.2","loc":36,"days":0.76,"loc_per_day":47.3,"flagged":false},{"from":"v2.6.2","to":"v2.7.0","loc":83,"days":9.93,"loc_per_day":8.4,"flagged":false},{"from":"v2.7.0","to":"v2.8.0","loc":946,"days":155.07,"loc_per_day":6.1,"flagged":false},{"from":"v2.8.0","to":"v2.8.1","loc":19,"days":7.86,"loc_per_day":2.4,"flagged":false},{"from":"v2.8.1","to":"v2.9.0","loc":509,"days":63.11,"loc_per_day":8.1,"flagged":false},{"from":"v2.9.0","to":"v2.9.1","loc":34,"days":5.98,"loc_per_day":5.7,"flagged":false},{"from":"v2.9.1","to":"v2.9.2","loc":2195,"days":130.29,"loc_per_day":16.8,"flagged":false},{"from":"v2.9.2","to":"v2.10.0","loc":580,"days":0.04,"loc_per_day":13920.0,"flagged":false},{"from":"v2.10.0","to":"v2.11.0","loc":1444,"days":100.7,"loc_per_day":14.3,"flagged":false},{"from":"v2.11.0","to":"v2.11.1","loc":166,"days":9.21,"loc_per_day":18.0,"flagged":false},{"from":"v2.11.1","to":"v2.12.0","loc":1373,"days":89.6,"loc_per_day":15.3,"flagged":false},{"from":"v2.12.0","to":"v2.12.1","loc":11,"days":1.01,"loc_per_day":10.9,"flagged":false},{"from":"v2.12.1","to":"v2.12.2","loc":171,"days":14.08,"loc_per_day":12.1,"flagged":false},{"from":"v2.12.2","to":"v2.12.3","loc":76,"days":0.92,"loc_per_day":82.3,"flagged":false},{"from":"v2.12.3","to":"v2.12.4","loc":196,"days":13.03,"loc_per_day":15.0,"flagged":false},{"from":"v2.12.4","to":"v2.12.5","loc":23,"days":35.04,"loc_per_day":0.7,"flagged":false},{"from":"v2.12.5","to":"v2.13.0","loc":1140,"days":5.99,"loc_per_day":190.2,"flagged":false},{"from":"v2.13.0","to":"v2.14.0","loc":6662,"days":105.13,"loc_per_day":63.4,"flagged":false},{"from":"v2.14.0","to":"v2.14.1","loc":3,"days":0.13,"loc_per_day":22.2,"flagged":false},{"from":"v2.14.1","to":"v2.14.2","loc":3,"days":0.8,"loc_per_day":3.8,"flagged":false},{"from":"v2.14.2","to":"v2.15.0","loc":186,"days":16.49,"loc_per_day":11.3,"flagged":false},{"from":"v2.15.0","to":"v2.16.3","loc":0,"days":0.04,"loc_per_day":0.0,"flagged":false},{"from":"v2.16.3","to":"v2.15.1","loc":4,"days":0.04,"loc_per_day":96.0,"flagged":false},{"from":"v2.15.1","to":"v2.16.0","loc":78,"days":0.06,"loc_per_day":1342.7,"flagged":false},{"from":"v2.16.0","to":"v2.16.1","loc":8,"days":0.43,"loc_per_day":18.5,"flagged":false},{"from":"v2.16.1","to":"v2.16.2","loc":60,"days":0.04,"loc_per_day":1440.0,"flagged":false},{"from":"v2.16.2","to":"v2.16.4","loc":126,"days":0.26,"loc_per_day":476.1,"flagged":false},{"from":"v2.16.4","to":"v2.16.5","loc":11,"days":0.31,"loc_per_day":35.9,"flagged":false},{"from":"v2.16.5","to":"v2.17.0","loc":17,"days":1.53,"loc_per_day":11.1,"flagged":false},{"from":"v2.17.0","to":"v2.17.1","loc":11,"days":0.11,"loc_per_day":98.4,"flagged":false},{"from":"v2.17.1","to":"v2.17.3","loc":18,"days":0.08,"loc_per_day":224.9,"flagged":false},{"from":"v2.17.3","to":"v2.18.0","loc":131,"days":15.74,"loc_per_day":8.3,"flagged":false},{"from":"v2.18.0","to":"v2.18.1","loc":2,"days":0.09,"loc_per_day":22.6,"flagged":false},{"from":"v2.18.1","to":"v2.18.2","loc":32,"days":40.9,"loc_per_day":0.8,"flagged":false},{"from":"v2.18.2","to":"v2.18.3","loc":49,"days":7.92,"loc_per_day":6.2,"flagged":false},{"from":"v2.18.3","to":"v2.18.4","loc":15,"days":13.0,"loc_per_day":1.2,"flagged":false},{"from":"v2.18.4","to":"v2.19.0","loc":603,"days":301.05,"loc_per_day":2.0,"flagged":false},{"from":"v2.19.0","to":"v2.19.1","loc":4,"days":1.95,"loc_per_day":2.1,"flagged":false},{"from":"v2.19.1","to":"v2.20.0","loc":487,"days":125.67,"loc_per_day":3.9,"flagged":false},{"from":"v2.20.0","to":"v2.20.1","loc":27,"days":21.49,"loc_per_day":1.3,"flagged":false},{"from":"v2.20.1","to":"v2.21.0","loc":233,"days":31.54,"loc_per_day":7.4,"flagged":false},{"from":"v2.21.0","to":"v2.22.0","loc":126,"days":156.57,"loc_per_day":0.8,"flagged":false},{"from":"v2.22.0","to":"v2.24.0","loc":313,"days":398.83,"loc_per_day":0.8,"flagged":false},{"from":"v2.24.0","to":"v2.25.0","loc":35,"days":147.17,"loc_per_day":0.2,"flagged":false},{"from":"v2.25.0","to":"v2.25.1","loc":132,"days":34.99,"loc_per_day":3.8,"flagged":false},{"from":"v2.25.1","to":"v2.26.0","loc":198,"days":208.8,"loc_per_day":0.9,"flagged":false},{"from":"v2.26.0","to":"v2.27.0","loc":266,"days":174.0,"loc_per_day":1.5,"flagged":false},{"from":"v2.27.0","to":"v2.27.1","loc":14,"days":2.02,"loc_per_day":6.9,"flagged":false},{"from":"v2.27.1","to":"v2.28.0","loc":3184,"days":154.96,"loc_per_day":20.5,"flagged":false},{"from":"v2.28.0","to":"v2.28.1","loc":7,"days":20.02,"loc_per_day":0.3,"flagged":false},{"from":"v2.28.1","to":"v2.28.2","loc":7,"days":197.05,"loc_per_day":0.0,"flagged":false},{"from":"v2.28.2","to":"v2.29.0","loc":81,"days":103.96,"loc_per_day":0.8,"flagged":false},{"from":"v2.29.0","to":"v2.30.0","loc":7,"days":7.01,"loc_per_day":1.0,"flagged":false},{"from":"v2.30.0","to":"v2.31.0","loc":26,"days":18.98,"loc_per_day":1.4,"flagged":false},{"from":"v2.31.0","to":"v2.32.0","loc":507,"days":364.03,"loc_per_day":1.4,"flagged":false},{"from":"v2.32.0","to":"v2.32.1","loc":2,"days":0.26,"loc_per_day":7.7,"flagged":false},{"from":"v2.32.1","to":"v2.32.2","loc":33,"days":0.87,"loc_per_day":38.1,"flagged":false},{"from":"v2.32.2","to":"v2.32.3","loc":96,"days":7.87,"loc_per_day":12.2,"flagged":false},{"from":"v2.32.3","to":"v2.32.4","loc":138,"days":376.04,"loc_per_day":0.4,"flagged":false},{"from":"v2.32.4","to":"v2.32.5","loc":23,"days":70.16,"loc_per_day":0.3,"flagged":false},{"from":"v2.32.5","to":"v2.33.0","loc":77,"days":218.78,"loc_per_day":0.4,"flagged":false},{"from":"v2.33.0","to":"v2.33.1","loc":27,"days":5.04,"loc_per_day":5.4,"flagged":false},{"from":"v2.33.1","to":"v2.34.0.dev1","loc":1315,"days":34.16,"loc_per_day":38.5,"flagged":false},{"from":"v2.34.0.dev1","to":"v2.34.0","loc":59,"days":7.98,"loc_per_day":7.4,"flagged":false},{"from":"v2.34.0","to":"v2.34.1","loc":36,"days":1.99,"loc_per_day":18.0,"flagged":false},{"from":"v2.34.1","to":"v2.34.2","loc":4,"days":1.0,"loc_per_day":4.0,"flagged":false}]},"error":null},{"analyzer":"sec-secrets","pillar":"security","status":"ok","tool_version":"gitleaks 8.30.1","metrics":{"secrets_current":0.0,"secrets_history":0.0,"secrets_nonprod":6.0,"secrets_low_confidence":3.0},"findings":[{"rule_id":"gitleaks/private-key","severity":"low","message":"Possible private-key secret in the current tree (test/docs/example file)","path":"tests/certs/expired/ca/ca-private.key","line":1,"fingerprint":"tests/certs/expired/ca/ca-private.key:private-key:1"},{"rule_id":"gitleaks/private-key","severity":"low","message":"Possible private-key secret in the current tree (test/docs/example file)","path":"tests/certs/mtls/client/client.key","line":1,"fingerprint":"tests/certs/mtls/client/client.key:private-key:1"},{"rule_id":"gitleaks/private-key","severity":"low","message":"Possible private-key secret in the current tree (test/docs/example file)","path":"tests/certs/expired/server/server.key","line":1,"fingerprint":"tests/certs/expired/server/server.key:private-key:1"},{"rule_id":"gitleaks/private-key","severity":"low","message":"Possible private-key secret in the current tree (test/docs/example file)","path":"tests/certs/valid/server/server.key","line":1,"fingerprint":"tests/certs/valid/server/server.key:private-key:1"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in history (commit 74289f420c); removed from the current tree but still retrievable","path":"docs/_templates/sidebarintro.html","line":27,"fingerprint":"74289f420c20f8ae8691722987e73dc147784c99:docs/_templates/sidebarintro.html:generic-api-key:27"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in history (commit 749419ad0c); removed from the current tree but still retrievable","path":"docs/_templates/sidebarlogo.html","line":26,"fingerprint":"749419ad0c4df9a0452a2a8bd13b4310c8f1e8ec:docs/_templates/sidebarlogo.html:generic-api-key:26"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in history (commit 9576518d69); removed from the current tree but still retrievable","path":"requests/packages/oauthlib/oauth1/rfc5849/parameters.py","line":32,"fingerprint":"9576518d69b819b25cd036397d2624daa6ae088c:requests/packages/oauthlib/oauth1/rfc5849/parameters.py:generic-api-key:32"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in history (commit 9576518d69); removed from the current tree but still retrievable","path":"requests/packages/oauthlib/oauth2/draft25/parameters.py","line":168,"fingerprint":"9576518d69b819b25cd036397d2624daa6ae088c:requests/packages/oauthlib/oauth2/draft25/parameters.py:generic-api-key:168"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in history (commit 9576518d69); removed from the current tree but still retrievable","path":"requests/packages/oauthlib/oauth1/rfc5849/signature.py","line":49,"fingerprint":"9576518d69b819b25cd036397d2624daa6ae088c:requests/packages/oauthlib/oauth1/rfc5849/signature.py:generic-api-key:49"}],"evidence":[],"data":{},"error":null},{"analyzer":"sec-sast","pillar":"security","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":3.0,"findings_high":0.0,"findings_medium":3.0,"findings_low":0.0,"weighted_findings":1.45,"scanned_lines":6874.0,"parse_errors":0.0},"findings":[{"rule_id":"opengrep/python.lang.security.insecure-hash-algorithm-sha1","severity":"medium","message":"Detected SHA1 hash algorithm which is considered insecure. SHA1 is not collision resistant and is therefore not suitable as a cryptographic signature. Use SHA256 or SHA3 instead. [confidence medium]","path":"src/requests/auth.py","line":187,"fingerprint":"python.lang.security.insecure-hash-algorithm-sha1:src/requests/auth.py:187"},{"rule_id":"opengrep/python.lang.security.insecure-hash-algorithm-sha1","severity":"medium","message":"Detected SHA1 hash algorithm which is considered insecure. SHA1 is not collision resistant and is therefore not suitable as a cryptographic signature. Use SHA256 or SHA3 instead. [confidence medium]","path":"src/requests/auth.py","line":237,"fingerprint":"python.lang.security.insecure-hash-algorithm-sha1:src/requests/auth.py:237"},{"rule_id":"opengrep/python.lang.security.audit.non-literal-import","severity":"medium","message":"Untrusted user input in `importlib.import_module()` function allows an attacker to load arbitrary code. Avoid dynamic values in `importlib.import_module()` or use a whitelist to prevent running untrusted code. [confidence low]","path":"src/requests/compat.py","line":42,"fingerprint":"python.lang.security.audit.non-literal-import:src/requests/compat.py:42"}],"evidence":[],"data":{"rulesets":["python"]},"error":null},{"analyzer":"sec-deps","pillar":"security","status":"ok","tool_version":"osv-scanner version: 2.7.1","metrics":{"vulnerable_packages":0.0,"vulnerabilities":0.0,"vulns_critical":0.0,"vulns_high":0.0,"vulns_medium":0.0,"vulns_low":0.0,"vulns_unknown":0.0,"penalty":0.0},"findings":[],"evidence":[],"data":{"ecosystems":["PyPI"]},"error":null},{"analyzer":"sec-actions","pillar":"security","status":"ok","tool_version":"zizmor 1.32.0","metrics":{"workflows":8.0,"findings":0.0,"findings_high":0.0,"findings_medium":0.0,"findings_low":0.0,"penalty":0.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-posture","pillar":"security","status":"ok","tool_version":null,"metrics":{"check:security_policy":1.0,"check:dependency_updates":1.0,"check:signed_commits":1.0,"check:lockfiles":1.0,"signed_commit_share":0.72,"unpinned_manifests":0.0},"findings":[],"evidence":[{"kind":"posture","description":"Security policy: .github/SECURITY.md","ref":".github/SECURITY.md","url":null,"weight":0.0},{"kind":"posture","description":"Dependency updates: .github/dependabot.yml","ref":".github/dependabot.yml","url":null,"weight":0.0}],"data":{},"error":null},{"analyzer":"qual-complexity","pillar":"quality","status":"ok","tool_version":"lizard 1.25.1","metrics":{"functions":245.0,"function_nloc":2590.0,"mean_ccn":3.44,"p90_ccn":7.0,"complex_functions":8.0,"long_functions":0.0,"many_param_functions":4.0,"risky_nloc_share":0.1606},"findings":[],"evidence":[{"kind":"complex-function","description":"_encode_files in src/requests/models.py: complexity 21, 51 lines","ref":"src/requests/models.py","url":"https://github.com/psf/requests/blob/3c7baaa05ab4aa49cc819ce3a819d260de19c157/src/requests/models.py#L183","weight":0.35},{"kind":"complex-function","description":"send in src/requests/adapters.py: complexity 19, 81 lines","ref":"src/requests/adapters.py","url":"https://github.com/psf/requests/blob/3c7baaa05ab4aa49cc819ce3a819d260de19c157/src/requests/adapters.py#L634","weight":0.31666666666666665},{"kind":"complex-function","description":"build_digest_header in src/requests/auth.py: complexity 19, 68 lines","ref":"src/requests/auth.py","url":"https://github.com/psf/requests/blob/3c7baaa05ab4aa49cc819ce3a819d260de19c157/src/requests/auth.py#L157","weight":0.31666666666666665},{"kind":"complex-function","description":"prepare_body in src/requests/models.py: complexity 19, 48 lines","ref":"src/requests/models.py","url":"https://github.com/psf/requests/blob/3c7baaa05ab4aa49cc819ce3a819d260de19c157/src/requests/models.py#L576","weight":0.31666666666666665},{"kind":"complex-function","description":"should_bypass_proxies in src/requests/utils.py: complexity 19, 37 lines","ref":"src/requests/utils.py","url":"https://github.com/psf/requests/blob/3c7baaa05ab4aa49cc819ce3a819d260de19c157/src/requests/utils.py#L810","weight":0.31666666666666665},{"kind":"complex-function","description":"prepare_url in src/requests/models.py: complexity 18, 52 lines","ref":"src/requests/models.py","url":"https://github.com/psf/requests/blob/3c7baaa05ab4aa49cc819ce3a819d260de19c157/src/requests/models.py#L483","weight":0.3},{"kind":"complex-function","description":"super_len in src/requests/utils.py: complexity 16, 45 lines","ref":"src/requests/utils.py","url":"https://github.com/psf/requests/blob/3c7baaa05ab4aa49cc819ce3a819d260de19c157/src/requests/utils.py#L160","weight":0.26666666666666666},{"kind":"complex-function","description":"get_netrc_auth in src/requests/utils.py: complexity 16, 34 lines","ref":"src/requests/utils.py","url":"https://github.com/psf/requests/blob/3c7baaa05ab4aa49cc819ce3a819d260de19c157/src/requests/utils.py#L231","weight":0.26666666666666666}],"data":{},"error":null},{"analyzer":"qual-duplication","pillar":"quality","status":"ok","tool_version":"scoregh-dup-w6","metrics":{"compared_lines":4962.0,"duplicated_lines":121.0,"duplicated_share":0.0244,"files":22.0},"findings":[],"evidence":[{"kind":"duplicate-code","description":"6+ duplicated lines: src/requests/adapters.py:128 and src/requests/adapters.py:634","ref":"src/requests/adapters.py","url":"https://github.com/psf/requests/blob/3c7baaa05ab4aa49cc819ce3a819d260de19c157/src/requests/adapters.py#L128","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/requests/api.py:125 and src/requests/api.py:142","ref":"src/requests/api.py","url":"https://github.com/psf/requests/blob/3c7baaa05ab4aa49cc819ce3a819d260de19c157/src/requests/api.py#L125","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/requests/auth.py:91 and src/requests/auth.py:136","ref":"src/requests/auth.py","url":"https://github.com/psf/requests/blob/3c7baaa05ab4aa49cc819ce3a819d260de19c157/src/requests/auth.py#L91","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/requests/models.py:328 and src/requests/models.py:429","ref":"src/requests/models.py","url":"https://github.com/psf/requests/blob/3c7baaa05ab4aa49cc819ce3a819d260de19c157/src/requests/models.py#L328","weight":0.3}],"data":{},"error":null},{"analyzer":"qual-lint","pillar":"quality","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":4.0,"weighted_findings":6.0,"scanned_lines":6874.0,"category:correctness":1.0,"category:maintainability":3.0},"findings":[{"rule_id":"opengrep/python.lang.correctness.common-mistakes.identical-is-comparison","severity":"high","message":"Found identical comparison using is. Ensure this is what you intended.","path":"src/requests/help.py","line":113,"fingerprint":"python.lang.correctness.common-mistakes.identical-is-comparison:src/requests/help.py:113"},{"rule_id":"opengrep/python.lang.maintainability.is-function-without-parentheses","severity":"medium","message":"Is \"is_redirect\" a function or an attribute? If it is a function, you may have meant r.is_redirect() because r.is_redirect is always true.","path":"src/requests/auth.py","line":270,"fingerprint":"python.lang.maintainability.is-function-without-parentheses:src/requests/auth.py:270"},{"rule_id":"opengrep/python.lang.maintainability.is-function-without-parentheses","severity":"medium","message":"Is \"is_redirect\" a function or an attribute? If it is a function, you may have meant resp.is_redirect() because resp.is_redirect is always true.","path":"src/requests/sessions.py","line":142,"fingerprint":"python.lang.maintainability.is-function-without-parentheses:src/requests/sessions.py:142"},{"rule_id":"opengrep/python.lang.maintainability.is-function-without-parentheses","severity":"medium","message":"Is \"is_urllib3_1\" a function or an attribute? If it is a function, you may have meant is_urllib3_1.is_urllib3_1() because is_urllib3_1.is_urllib3_1 is always true.","path":"src/requests/utils.py","line":164,"fingerprint":"python.lang.maintainability.is-function-without-parentheses:src/requests/utils.py:164"}],"evidence":[],"data":{},"error":null},{"analyzer":"qual-testing","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:has_tests":1.0,"check:test_ratio":1.0,"check:ci_present":1.0,"check:ci_runs_tests":1.0,"check:ci_runs_lint":1.0,"check:tests_cochange":0.8621,"test_lines":5158.0,"source_lines":6874.0,"test_ratio":0.7504,"ci_files":8.0,"cochange_share":0.2155,"cochange_commits":116.0},"findings":[],"evidence":[{"kind":"ci","description":"CI config: .github/workflows/close-issues.yml","ref":".github/workflows/close-issues.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI config: .github/workflows/codeql-analysis.yml","ref":".github/workflows/codeql-analysis.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI config: .github/workflows/lint.yml","ref":".github/workflows/lint.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI config: .github/workflows/lock-issues.yml","ref":".github/workflows/lock-issues.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI config: .github/workflows/publish.yml","ref":".github/workflows/publish.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI config: .github/workflows/run-tests.yml","ref":".github/workflows/run-tests.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI config: .github/workflows/typecheck.yml","ref":".github/workflows/typecheck.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI config: .github/workflows/zizmor.yml","ref":".github/workflows/zizmor.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI runs tests (make ci)","ref":null,"url":null,"weight":0.0},{"kind":"ci","description":"CI runs linters (pyright, pre-commit)","ref":null,"url":null,"weight":0.0}],"data":{"test_commands":["make ci"],"lint_commands":["pyright","pre-commit"]},"error":null},{"analyzer":"qual-docs","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:readme":1.0,"check:license":1.0,"check:contributing":1.0,"check:changelog":1.0,"readme_lines":57.0},"findings":[],"evidence":[{"kind":"docs","description":"README.md","ref":"README.md","url":null,"weight":0.0},{"kind":"docs","description":"LICENSE","ref":"LICENSE","url":null,"weight":0.0},{"kind":"docs","description":".github/CONTRIBUTING.md","ref":".github/CONTRIBUTING.md","url":null,"weight":0.0},{"kind":"docs","description":"HISTORY.md","ref":"HISTORY.md","url":null,"weight":0.0}],"data":{},"error":null},{"analyzer":"qual-type-safety","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:strict_config":1.0,"check:low_escape_density":0.0,"escapes":152.0,"escapes_per_kloc":22.112},"findings":[],"evidence":[{"kind":"typing","description":"Python strict type checking: pyproject.toml","ref":"pyproject.toml","url":null,"weight":0.0}],"data":{},"error":null}],"flags":[]}