mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-08-16 00:09:01 +03:00
fix(skills): регистронезависимые параметры во всех py-портах
Дорожка CLI из кампании паритета: PowerShell не различает регистр ни в именах параметров, ни в значениях [ValidateSet], argparse различает и в том и в другом. Проверено на читающем навыке: cf-info -Mode BRIEF на PS отрабатывает, на py падал. ci_parse_args (эталон — meta-compile) вставлен в 68 py-портов, вызовы parser.parse_args заменены. Навыков с DSL меньше трети, поэтому именно эта правка делает паритет общим: *-info, *-validate, db-*, cfe-*, web-* тоже принимают ввод так же, как их .ps1. Реестр check-inline-drift дополнен списком потребителей — и сразу окупился: поймал, что массовая замена переписала последнюю строку внутри самого хелпера и копии стали рекурсивными. Версии бампнуты синхронно в обоих портах всех 68 навыков. Проверка: 673/673 (PS), 670+3 skipped (PY), гарды 4/4; паритет версий портов проверен по заголовкам. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
8c0fbed7d6
commit
d325a3d5af
@@ -1,10 +1,32 @@
|
||||
#!/usr/bin/env python3
|
||||
# role-validate v1.1 — Validate 1C role Rights.xml structure
|
||||
# role-validate v1.2 — Validate 1C role Rights.xml structure
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
"""Validates role Rights.xml: root element, global flags, objects, rights, RLS, templates."""
|
||||
import sys, os, argparse, re
|
||||
from lxml import etree
|
||||
|
||||
# Регистронезависимый ввод — паритет с PS1: в PowerShell имена параметров и [ValidateSet]
|
||||
# регистр не различают, в argparse совпадение точное.
|
||||
def ci_parse_args(parser, argv=None):
|
||||
"""parse_args по правилам PS: имена параметров и значения choices регистронезависимы."""
|
||||
argv = list(sys.argv[1:] if argv is None else argv)
|
||||
names = {s.lower(): s for a in parser._actions for s in a.option_strings}
|
||||
for i, tok in enumerate(argv):
|
||||
if tok.startswith('-') and tok.lower() in names:
|
||||
argv[i] = names[tok.lower()]
|
||||
# choices — зеркало [ValidateSet]; канонизируем ДО разбора, иначе argparse отвергнет регистр
|
||||
choice_map = {}
|
||||
for a in parser._actions:
|
||||
if a.choices:
|
||||
for s in a.option_strings:
|
||||
choice_map[s] = {str(c).lower(): c for c in a.choices}
|
||||
for i in range(len(argv) - 1):
|
||||
m = choice_map.get(argv[i])
|
||||
if m and argv[i + 1].lower() in m:
|
||||
argv[i + 1] = m[argv[i + 1].lower()]
|
||||
return parser.parse_args(argv)
|
||||
|
||||
|
||||
GUID_PATTERN = re.compile(
|
||||
r'^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$',
|
||||
re.IGNORECASE
|
||||
@@ -183,7 +205,7 @@ def main():
|
||||
parser.add_argument('-OutFile', dest='OutFile', default='')
|
||||
parser.add_argument('-Detailed', dest='Detailed', action='store_true')
|
||||
parser.add_argument('-MaxErrors', dest='MaxErrors', type=int, default=30)
|
||||
args = parser.parse_args()
|
||||
args = ci_parse_args(parser)
|
||||
|
||||
rights_path = args.RightsPath
|
||||
out_file = args.OutFile
|
||||
|
||||
Reference in New Issue
Block a user