Files
hcie-rust-v3.05/logs/__pycache__/generate_semantic_report.cpython-314.pyc
T

254 lines
49 KiB
Plaintext
Raw Normal View History

2026-07-09 02:59:53 +03:00
+
ü.j¿‡ãóNRt^RIt^RIt^RIt^RIt^RIt^RIt^RIHt^RI H
t
]
!] 4P4PPt]R, t]R, t]R, t^RItRRltR R
ltR R ltR
Rlt]P2!R4]P2!R4]P2!R4.t]P2!R4]P2!R4]P2!R4.t]P2!R4t]P2!R4]P2!R4.t]P2!R4t]P2!R4t]P2!R4.t ]P2!R4]P2!R4]P2!R4]P2!R4.t!!RR 4t"R;R!R"llt#R#R$lt$R%R&lt%R<R'R(llt&R)R*lt'R+R,lt(R-R.lt)R/R0lt*R1R2lt+R3R4lt,R=R5R6llt-R>R7R8llt.R9t/]0R:8Xd
]/!4R#R# ]d ^RItEL²i;i)?uo
Semantic Impact Report Generator v4 — Three-Layer Architecture
Layer 1 — Cargo.toml Dependency Graph (auto)
Scans workspace Cargo.toml files to build crate dependency DAG.
Assigns blast radius automatically: leaf crates = LOW, hub crates = HIGH.
Layer 2 — git diff API Analysis
Parses git diff output for public API changes (+pub fn, -pub struct, etc.).
Classifies each change as ADD (safe), REMOVE (breaking), CHANGE (potentially breaking).
Layer 3 — cargo-semver-checks Integration (optional, --semver)
Runs cargo semver-checks on changed crates for definitive semver analysis.
Usage:
# Pre-commit (staged changes)
python3 logs/generate_semantic_report.py --mode staged
# Post-commit (last commit)
python3 logs/generate_semantic_report.py --mode last
# With semver check (slow)
python3 logs/generate_semantic_report.py --mode staged --semver
# Skip Layer 2 API analysis
python3 logs/generate_semantic_report.py --mode staged --no-api
Exit codes:
0 = safe (LOW/MEDIUM impact)
1 = HIGH risk found — review required
Dependencies: Python 3.8+, tomllib (stdlib 3.11+) or tomli (fallback)
N)Ú defaultdict©ÚPathú
Cargo.tomlzproject_manifest.jsonÚlogscó0V^8„dQhR\R\/#)éÚpathÚreturn)rÚdict)Úformats"Ú logs/generate_semantic_report.pyÚ __annotate__rBs÷ñœ4ð¤Dñócó \VR4;_uu_4p\P!V4uuRRR4# +'giR#;i \d.p\ RT RT 2\
P R7/uRp?#Rp?ii;i)z+Parse a Cargo.toml file and return as dict.ÚrbNz [WARN] Failed to parse ú: ©Úfile)ÚopenÚtomllibÚloadÚ ExceptionÚprintÚsysÚstderr)r Úes& r
Úparse_cargo_tomlrBs`ðÜ
$˜×
Ô
 Ü—<< “?÷×
×
Ó
ûä ôÜ
Ð)¨$¨¨r°!°Ð5¼C¿J¹JÕ ûðús7A 7¬
A · A ÁA ÁA Á BÁ"A>Á8BÁ>Bcó$V^8„dQhR\/#©rr
)r )r s"r
rrLs÷jñj¤ñjrc óœa\\4pVPR/4PR.4p.p/pVp\V, pVR, pVP 4'dd\V4pVPR/4PR\ V4P 4o\VP\44VS&KVPRV 24 V'gR/R.R /R
/R R ./#/pVP4Fwop \V , R, p\V4pVPR
/4p
.p V
P4F7wrÍ\V
\4'gKRV
9gK&V PV 4K9 RV RV R./VS&K VP4F<wopVR,F)p WÈ9gK WŒ,R,PS4K+ K> .p/pVP4F“wop\VR,, R, pVP 4'gK9\VPR44F<pVP\4P4pVPV4SVV&K> K• /pVP4wop\!VR,4pV^dRVS&K&V^dRVS&K4V^8Xdd\";QJd-V3RlVP%44F 'gK RM" RM!V3RlVP%444'dRVS&RVS& /p\&P 4'd•\)\&4;_uu_4p\*P,!V4pRRR4XPR.4FGpVR,pRVPRR4R
VPR
R4RVPR.4/VV&KI RVRVR VR
VR VR V/# +'giL{;i \.dpTPRT 24Rp?LERp?ii;i)!a
Build the full workspace dependency graph from Cargo.toml files.
Returns:
{
"crates": { "hcie-protocol": { "path": "hcie-protocol",
"deps": [],
"dependents": ["hcie-color", "hcie-blend", ...] } },
"all_files": [ "hcie-protocol/src/lib.rs", ... ],
"file_to_crate": { "hcie-protocol/src/lib.rs": "hcie-protocol", ... },
"blast_radius": { "hcie-protocol": "HIGH", "hcie-color": "LOW", ... },
"errors": []
}
Ú workspaceÚmembersrÚpackageÚnamez Member path missing Cargo.toml: ÚcratesÚ all_filesÚ
file_to_crateÚ blast_radiusÚerrorszNo crates found in workspaceÚ dependenciesr ÚdepsÚ
dependentsÚsrcz*.rsÚHIGHÚMEDIUMc3ó<<"TFpSVR,9xK R#5i)r,)Ú.0Úcr%s& €r
Ú <genexpr>Ú)build_dependency_graph.<locals>.<genexpr>šsøéÐ(TÁO¸q¨°°6µÖ):ÃOùsƒTFÚLOWNÚfilesÚ file_pathÚ descriptionÚÚsemantic_dependencieszFailed to read manifest: Úmanifest_annotations)rÚWORKSPACE_CARGOÚgetÚ REPO_ROOTÚexistsrr%ÚstrÚ relative_toÚappendÚitemsÚ
isinstancer ÚsortedÚrglobÚas_posixÚlenÚanyÚvaluesÚ
MANIFEST_PATHrÚjsonrr)r"r#r*Ú crate_pathsÚmemberÚ member_pathÚ
cargo_pathÚdatar&Úrel_pathr,Ú
internal_depsÚdep_nameÚdep_infoÚinfor'r(Úsrc_dirÚrs_fileÚrelr)Únum_dependentsr=rÚmanifestÚentryÚfprr%s @r
Úbuild_dependency_graphr`Lø€ôÓ1€IØm‰m˜K¨Ó¸BÓ?€GØ
€Fð€Kۈܠ(ˆ Ø  /ˆ
Ø × Ñ × Ò Ü# JÓ/ˆDØ—8‘8˜I rÓ*×.¨v´t¸F³|×7HÑ7HÓIˆDÜ # K×$;Ñ$;¼IÓ$FÓ GˆK˜Ó à M‰MÐ<¸V¸HÐ ÷ ؘ"˜k¨2¨ÀØ  HÐ/MÐ.NðPð Pð€FØ-‰ˆˆhÜ Õ)¨LÕ
Ü 
ÓØx‰x˜¨Óàˆ
Ø"&§*¡*¦,Ñ ˆ˜(¤D×)¨f¸Ö.@Ø×$ #/ð
  ˜
ˆˆt ñ.ð"—lln‰
ˆˆdؘVŸ ˜ ˆHØÖÕ  Õ5°dÖ €IØ€MØ—l‘l–n‰
ˆˆdܘd 6*¨UÕ2ˆØ >‰>× Ô Ü! '§-¡-°Ó"7Ö8Ø×)¬)Ó?Ø× Ñ  Ô%Ø%)
˜€LØ—l‘l–n‰
ˆˆdܘT ,ÕØ ˜QÔ Ø!'ˆL˜Ó Ø
˜
Ø!)ˆL˜Ó Ø
˜
§S£SÔ(TÀFÇMÁMÄOÓ(T§S§S¢SÔ(TÀFÇMÁMÄOÓ(T×%TÒ%TØ!&ˆL˜Ó à!&ˆL˜Ó ñÐÜ×Ñ×Òð ”m×ÜŸ9š9 Q›<÷ g¨rÖ2ؘ'à! 5§9¡9¨]¸BÓ#?Ø" E§I¡I¨n¸eÓ$DØ+¨U¯Y©YÐ7NÐPRÓ-Sð,Ð$  ˜Ø˜ ØÐ 4Ø
 ð÷$ûôô M‰MÐ5°a°SÐ9× :ûð ;ús1Í.P"ÎPÎA%P"Ð P ÐP"Ð" Q Ð-QÑQ có<V^8„dQhR\R\R\/#©rr9Úgraphr
©rBr )r s"r
rr¹s!÷ ñ ¤Sð ´ð ¼#ñ rcó0VPR/4PV/4pV'd!VPRR4R8wd
VR,#VPR/4PV4pV'd#VPR/4PVR4#R#)zNDetermine blast radius for a file based on crate-level + manifest annotations.r=r)r7r(©r?)r9rcÚannÚcrates&& r
Úget_file_blast_radiusri¹sà
)‰)Ð*¨BÓ
/×
3°I¸
B€Cß
ˆsw‰w~ Ô I‰Io  *× .¨yÓ 9€Eß Øy‰y˜¨Ó¸Ó rcó<V^8„dQhR\R\R\/#rbrd)r s"r
rrÅs!÷=œcð=¬$ð=´=rcóFVPR/4PVR4#)z(Return crate name for a given file path.r(r;rf)r9rcs&&r
Úget_file_craterlÅs à 9‰9_  )× -¨i¸Ó <rzN^\+pub\s+(fn|struct|enum|trait|type|const|static|mod|use|macro_rules!)\s+(\w+)z^\+pub\s+(unsafe\s+)?fn\s+(\w+)z"^\+pub\s+(unsafe\s+)?trait\s+(\w+)zN^\-pub\s+(fn|struct|enum|trait|type|const|static|mod|use|macro_rules!)\s+(\w+)z^\-pub\s+(unsafe\s+)?fn\s+(\w+)z"^\-pub\s+(unsafe\s+)?trait\s+(\w+)z+@@\s+-(\d+),?\d*\s+\+(\d+),?\d*\s+@@\s*(.*)z3pub\s+(fn|struct|enum|trait|type|const|mod)\s+(\w+)z$pub\s+(unsafe\s+)?(fn|trait)\s+(\w+)z#^\s*(\w+)\s*(?:\(.*\))?\s*[,{]?\s*$z^\s+pub\s+(\w+)\s*:z^[+-]\s+(?!pub\b)z ^[+-]\s*$z^[+-]\s*(//|#\[)z
^[+-]\s*\}z^[+-]\s*use\s+cóza]tRt^ñtoRt]V3RlRl4t]V3RlRl4t]V3RlRl4tRt Vt
R #)
Ú APIAnalysiscóh.Vn.Vn.Vn.Vn.Vn^Vn^VnR#)éN)ÚaddedÚremovedÚchangedÚ
field_changesÚvariant_additionsÚ priv_changesÚ total_hunks©Úselfs&r
Ú__init__ÚAPIAnalysis.__init__òs7؈Œ
؈Œ ؈Œ ØˆÔØ!#ˆÔØˆÔØˆÖrcó <V^8„dQhRS[/#r ©Úbool)r Ú
__classdict__s"€r
rÚAPIAnalysis.__annotate__üsø€÷2¡dñ2rcóT\VP;'g
VP4#©N)r~rrrsrxs&r
Úhas_breaking_changesÚ APIAnalysis.has_breaking_changesûsäD—LL×0 D§L¡LÓ1rcó <V^8„dQhRS[/#r r})r rs"€r
rr€sø€÷PñP¡$ñPrcó|\VP;'g!VP;'g
VP4#r)r~rqrurtrxs&r
Úhas_safe_changesÚAPIAnalysis.has_safe_changesÿs-äD—JJ×N $×"8Ñ"8×N¸D×<NÑ<NÓOrcó <V^8„dQhRS[/#r ©rB)r rs"€r
rr€sø€÷?™ñ?rcóà.pVP'd)VPR\VP4 R24VP'd)VPR\VP4 R24VP'd)VPR\VP4 R24VP
'd)VPR\VP
4 R24VP 'd)VPR\VP 4 R24VP'dVPVP R24V'dR PV4#R
#) Ú+z pub itemz enum varz
struct fieldÚ-z pub (BREAKING)Ú~z sig changez internalú, zno API changes) rqrDrJrurtrrrsrvÚjoin)ryÚpartss& r
ÚsummaryÚAPIAnalysis.summarysàˆØ ::ˆ:Ø L‰L˜1œS §¡›_Ð-¨YÐ × L‰L˜1œS ×!7Ñ!7ÓÐ × × Ð Ø L‰L˜1œS ×!3Ñ!3Ó5°]Ð <<ˆ L‰L˜1œS §¡ÓÐ <<ˆ L‰L˜1œS §¡Ó/¨{Ð × × Ð Ø L‰L˜D×.¨iÐ 9ß#(ˆty‰y˜ÓÐ>Ð.>Ð>r)rqrsrtrvrrrwruN) Ú__name__Ú
__module__Ú __qualname__Ú__firstlineno__rzÚpropertyrƒr‡rÚ__static_attributes__Ú__classdictcell__)rs@r
rnrnñsHø‡òð÷ð÷PóðPð÷ö?rrncó<V^8„dQhR\R\R\/#)rr9Úmoder
)rBrn)r s"r
rrs!÷%ñ%¤ð%¬3ð%¼kñ%rcó¦\4pVPR4'g1VPR4'gVPR4'gV#VR8Xd
RRRRRV.pMVR 8Xd RRR
RV.pMRRRV.p\P!VR R \ \
4R 7pVP pTP4'gT#.pR
pTPR4FOpTPR4'dT'd \Yb4T.pR pK4T'gK>TPT4KQ T'd \Yb4T# \dTu#i;i)ú.rsú.svelteú.tsÚlastÚgitÚdiffúHEAD~1ÚHEADú--Ústagedú--cachedT©Úcapture_outputÚtextÚcwdFÚ
z@@)
rnÚendswithÚ
subprocessÚrunrBr@ÚstdoutrÚstripÚsplitÚ
startswithÚ_classify_hunkrD) r9ÚanalysisÚcmdÚresultÚ diff_textÚ current_hunkÚin_hunkÚlines && r
Úanalyze_git_diffr½s<Ü‹}€Hà × Ñ ˜u× ×);Ñ);¸I×)FÒ)FÈ)×J\ÑJ\Ð]b×JcÒJcØˆð Ø 6Œ>ؘ& (¨F°D¸D‰CØ

ؘ& *¨d°IÐ>‰Cà˜& $¨ Ð2ˆØ  ¨4´S¼³^ô
ˆð—M‘Mˆ ð ?‰?× Ò Øˆà€LØ€GØ ÖØ ?‰?˜4× Ò ßܘ|Ô ˜6ˆLØŠGß
‰WØ × Ñ  Ö Ü €Oøô) ôØŠðúsÁAEÅ
EÅEcó0V^8„dQhR\R\/#)rÚ
hunk_linesr¶)Úlistrn)r s"r
rr=s"÷WQñWQœtðWQ¬{ñWQrcó€ a
aV;P^,
unV^,pRp\PV4pV'd VP^4P 4pRpRpRp\
FopVPV4p V 'gKV P
4p
V
^,'d
V
^,MV
^,p V
R,p V R8XdRpT pM V R8XdRpT pM VU
a
u.uFOo
\;QJd#V
3Rl\4F 'gK RM RM!V
3Rl\44'dKMS
NKQ pp
VU
u.uF$qÝPR4'gKV
R,NK& pp
VU
u.uF$qÝPR 4'gKV
R,NK& pp
VFo\F~pVPS4pV'gKVP^dVP^4MR
p VPVP4p VPPV R V 24K‰ K VFo\F~pVPS4pV'gKVP^dVP^4MR
p VPVP4p VPPV R V 24K‰ K V'd´VF­oSP 4P!R 4p\"P%V4pV'gKAVPR
4'dKZVPR4'dKsVP^4pVR9gKVP&PV RV 24 V'dXVFQo\(P%S4pV'gK"VP*PV RVP^4 24KS Vo\;QJd#V3Rl\,4F 'gK RM RM!V3Rl\,44'gKM\;QJd#V3Rl\4F 'gK RM RM!V3Rl\44'dK—V;P.^,
un \14p\14p\2P4!R4pVF>oVPS4pV'gKVP7VP^44K@ VF>oVPS4pV'gKVP7VP^44K@ VV,F[pVP8PV4VVP9gK1VPUu.uFpVV9gK VNK upVn K] R#uup
iuup
iuup
iuupi)ér;enumTÚstructc3óD<"TFqPS4xK R#5ir©Úmatch)r3Úls& €r
r5Ú!_classify_hunk.<locals>.<genexpr>WsøéÐ-RÁ/¸Q¯g©g°a¯j¨jÃ/ùóƒ :rÂNNrÚitemÚ Ú,z///z#[z::Ú.c3óD<"TFqPS4xK R#5ir©r3s& €r
r5søéÐ4¡m w‰wt}ˆ}£mùrËc3óD<"TFqPS4xK R#5irs& €r
r5søéÐ@hÑXgÐSTÇÁÈÇÀÓXgùrËz+^[+-]\s+pub\s+(?:unsafe\s+)?fn\s+(\w+)\s*\(Néÿÿÿÿ)ÚpubrÃ)rwÚHUNK_CONTEXT_PATTERNÚsearchÚgroupr²ÚPUB_CONTEXT_PATTERNSÚgroupsrKÚIGNORE_PATTERNSr´ÚPUB_REMOVE_PATTERNSÚ lastindexrrrDÚPUB_ADD_PATTERNSrqÚrstripÚENUM_VARIANT_LINErÇruÚPUB_FIELD_LINErtÚ
PRIV_PATTERNSrvÚsetÚreÚcompileÚaddrs)r¿ÚheaderÚcontextÚhunk_mÚinside_pub_enumÚinside_pub_structÚpub_context_nameÚpatÚcmrÛÚkindr%ÚlinesrqrrÚstrippedÚvmÚvariantÚfmÚ added_fnsÚ removed_fnsÚFN_SIG_PATTERNÚfn_nameÚxr¼s&& ` @r
=srù€Ø ×Ò˜AÕÕà
˜]€FØ€GÜ
!×
Ó
0€Fß
Ø—,,˜q“/×)ˆà€OØÐØÐߨ
Z‰Z˜Ó
ˆß
‰2Ø—YY“[ˆFØ & q§ ¤ 6˜!9¨v°a­yˆ˜"•:ˆvŒ~Ø"&Ø#'Ñ Ø˜Ô!Ø$(Ð!Ø#'Ð Ù ñ S™
1¯#«#Ô-RÅ/Ó-R¯#¯#ª#Ô-RÅ/Ó-R×*RQˆQ™
€EÐ  7™Eq§\¡\°#×%6ŒUˆQˆrUˆU™E€EÐ 9™e˜§|¡|°C×'8Œuˆquˆu™e€GЈß&ˆ
˜ ˆ‰qØ%&§[¡[°AÔ%5q—ww˜q”z¸6Ø—w‘w˜qŸ{™{Ó+Ø× Ñ ×'¨4¨&°°$°Ð(8Ôó
óˆß#ˆ
˜ ˆ‰qØ%&§[¡[°AÔ%5q—ww˜q”z¸6Ø—w‘w˜qŸ{™{Ó+Ø×¨¨a°¨vÐ&6Ôó
÷ÛˆDØ—z‘z“|×*¨3Ó/ˆ"×Ó2ˆ‰r˜(×-¨e×4¸X×=PÑ=PÐQU×=VÔ=VØŸ(™( 1+ØÐ";Ö×.×,¨B¨w¨iÐñ
÷ÛˆDÜ×% dÓ+ˆ‰rØ×&ר"¯(©(°1«+¨Ðñóˆß ‹3Ô4¥mÓ433Š3Ô4¥mÓ4× 4¿S»SÔ@hÕXgÓ@h¿S¿SºSÔ@hÕXgÓ@h×=hÔ=hØ × !  &× ô€IÜ“%€KÜ—Z’ZÐ NÓO€NÛˆØ × ! $Ó 'ˆß ‰1Ø M‰M˜!Ÿ'™' ! óˆØ × ! $Ó 'ˆß ‰1Ø O‰O˜AŸG™G A ð
 ×Ø×Ñ×Ñ Ô h× &Ø+3×+;Ò+;ÓPÑ+; a¸wÈaÑ?O§ Ñ+;ÑPˆ ó+ùòu
Tùâ 7ùÚ9ùòt Qs<Ã'V,Ã7V,ÄV,Ä6V,ÅV1Å
V1Å2V6Æ
V6Ö
V;ÖV;có0V^8„dQhR\R\/#)rÚ crate_relr
©rBr~)r s"r
rrs÷ñœSð¤TñrcóX\V, R, R, pVP4#)r.zlib.rs)r@rA)Úlib_rss& r
Ú
_is_lib_craters"Ü
˜Õ
" 
*¨XÕ
5€FØ =‰=rcóHV^8„dQhR\R\R\R\/#)rÚchanged_cratesrcr
)r rB)r s"r
rr s)÷%ñ%¤dð%´4ð%¼sð%ÔPTñ%rcó/p\P!.RORRRR7\P!.RORRR7pTP^8wdTF pR.RR/Y4&K
T#TR8XdR pMR
pTF`pTP R /4P T4pT'gK.TR ,p \
T 4'g R.RR
/Y7&KR\YyT4Y7&Kb T# \P\3dTF pR.RR/Y4&K
Tu#i;i)ÚcargoT)ÚcheckÚ
violationsÚerrorzIcargo-semver-checks not installed. Run: cargo install cargo-semver-checks)zMNightly Rust required for rustdoc JSON. Run: rustup toolchain install nightlyr¡r&r z!skipped (binary crate, no lib.rs))rú
semver-checksú --version)Úrustupr°ÚnightlyÚrustcr
)ÚCalledProcessErrorÚFileNotFoundErrorÚ
returncoder?rÚ_check_single_crate)
rrcÚresultsr4r Ú baseline_refÚ
crate_nameÚ
crate_inforýs
&&& r
Úrun_semver_checksr s3Ø€GðÜŠÒ>Ø&*°¸ CônŠnÚ $ô€Gð×јQÔÛˆAبGð6EðFˆG‹Jñ àˆà ˆv„~Ø àˆ ã
Ø—Y‘Y˜x¨ÓÓ<ˆ
ß٠ؘ&ˆ ܘY×'Ø#/°°WÐ>aÐ"bˆ Ù Ü  
ˆÓñ €Nøô?
× )Ô+<Ð Ûˆ¨Gð6AðBˆG‹Jñ àŠðúsCÃ.DÄDcó0V^8„dQhR\R\/#)rrÚ
crate_pathrŠ)r s"r
rrÈs÷ñœSð¬cñrc
ó¨\P!RRRRR\PP VR4RRRR R
. R R \ \ 4R R
7R#)rz+nightlyÚrustdocz--libz--manifest-pathrz-Zzunstable-optionsz--output-formatrNTi,©ÚtimeoutN)Úosr rrBr@)rrs&&r
Ú _gen_rustdocrÈsN܇N‚NØ *˜i¨Ø œBŸG™GŸL™L¨°\Ó
ˆ'Ð):¸ Dð $¬C´ «NØ÷ rcóHV^8„dQhR\R\R\R\/#)rrrr
rd)r s"r
rrÒs0÷FñF¤CðF´FÜ'*ðFÜ/3ñFrc
ó&R.RR/pVPRR4p\PP\ \
4V4p\ P!RRVRV.RR\ \
4R 7\W4^RI p\
R
, R , V R 2, pVP4'g#\
R
, R , V, R
, p\\P!RR74pVP4'd%VP\ V4\ V44\ P!RRRRV.RR\ \