idf-build-apps 2.13.2__py3-none-any.whl → 2.14.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
1
+ # SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  """
@@ -8,7 +8,7 @@ Tools for building ESP-IDF related apps.
8
8
  # ruff: noqa: E402
9
9
  # avoid circular imports
10
10
 
11
- __version__ = '2.13.2'
11
+ __version__ = '2.14.0'
12
12
 
13
13
  from .session_args import (
14
14
  SessionArgs,
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
1
+ # SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  from .main import (
idf_build_apps/app.py CHANGED
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
1
+ # SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  import copy
@@ -511,7 +511,9 @@ class App(BaseModel):
511
511
  BuildStatus.UNKNOWN,
512
512
  BuildStatus.SHOULD_BE_BUILT,
513
513
  ):
514
- self.build_comment = f'Build {self.build_status.value}. Skipping...'
514
+ if not self.build_comment:
515
+ self.build_comment = f'Build {self.build_status.value}. Skipping...'
516
+
515
517
  return
516
518
 
517
519
  # real build starts here
idf_build_apps/args.py CHANGED
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD
1
+ # SPDX-FileCopyrightText: 2024-2026 Espressif Systems (Shanghai) CO LTD
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  import argparse
@@ -145,7 +145,6 @@ class BaseArguments(BaseSettings):
145
145
  # these below two are supported in pydantic 2.6
146
146
  pyproject_toml_table_header=('tool', 'idf-build-apps'),
147
147
  pyproject_toml_depth=sys.maxsize,
148
- validate_default=True,
149
148
  extra='ignore', # we're supporting pydantic <2.6 as well, so we ignore extra fields
150
149
  )
151
150
 
@@ -303,6 +302,19 @@ class DependencyDrivenBuildArguments(GlobalArguments):
303
302
  ),
304
303
  default=None, # type: ignore
305
304
  )
305
+ common_components: t.Optional[t.List[str]] = field(
306
+ FieldMetadata(
307
+ validate_method=[ValidateMethod.TO_LIST],
308
+ type=semicolon_separated_str_to_list,
309
+ shorthand='-rc',
310
+ ),
311
+ description='semicolon-separated list of components. '
312
+ 'expand the `- *common_components` placeholder in manifests. '
313
+ 'Must be specified together with --modified-components. '
314
+ 'If set to "", the value would be considered as None. '
315
+ 'If set to ";", the value would be considered as an empty list.',
316
+ default=None, # type: ignore
317
+ )
306
318
  deactivate_dependency_driven_build_by_filepatterns: t.Optional[t.List[str]] = field(
307
319
  FieldMetadata(
308
320
  validate_method=[ValidateMethod.TO_LIST],
@@ -375,6 +387,7 @@ class DependencyDrivenBuildArguments(GlobalArguments):
375
387
  App.MANIFEST = Manifest.from_files(
376
388
  self.manifest_files,
377
389
  root_path=to_absolute_path(self.manifest_rootpath),
390
+ common_components=self.common_components,
378
391
  )
379
392
 
380
393
  @property
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD
1
+ # SPDX-FileCopyrightText: 2024-2026 Espressif Systems (Shanghai) CO LTD
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  import os
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
1
+ # SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  import enum
idf_build_apps/finder.py CHANGED
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
1
+ # SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  import logging
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD
1
+ # SPDX-FileCopyrightText: 2023-2026 Espressif Systems (Shanghai) CO LTD
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  from .report import (
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD
1
+ # SPDX-FileCopyrightText: 2023-2026 Espressif Systems (Shanghai) CO LTD
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  """
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD
1
+ # SPDX-FileCopyrightText: 2023-2026 Espressif Systems (Shanghai) CO LTD
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  import os
idf_build_apps/log.py CHANGED
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD
1
+ # SPDX-FileCopyrightText: 2023-2026 Espressif Systems (Shanghai) CO LTD
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  import logging
idf_build_apps/main.py CHANGED
@@ -1,6 +1,6 @@
1
1
  # PYTHON_ARGCOMPLETE_OK
2
2
 
3
- # SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
3
+ # SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD
4
4
  # SPDX-License-Identifier: Apache-2.0
5
5
 
6
6
  import argparse
@@ -386,26 +386,26 @@ def main():
386
386
  sys.exit(0)
387
387
 
388
388
  kwargs = vars(args)
389
+ kwargs_without_none = drop_none_kwargs(kwargs)
389
390
  action = kwargs.pop('action')
390
391
  config_file = kwargs.pop('config_file')
391
392
  if config_file:
392
393
  apply_config_file(config_file)
393
394
 
394
395
  if action == 'dump-manifest-sha':
395
- arguments = DumpManifestShaArguments(**drop_none_kwargs(kwargs))
396
+ arguments = DumpManifestShaArguments(**kwargs_without_none)
396
397
  Manifest.from_files(arguments.manifest_files).dump_sha_values(arguments.output)
397
398
  sys.exit(0)
398
- elif action == 'find':
399
- print('reinstall idf-build-apps')
400
- print(kwargs['paths'])
401
399
 
402
- arguments = FindArguments(**drop_none_kwargs(kwargs))
400
+ if action == 'find':
401
+ arguments = FindArguments(**kwargs_without_none)
403
402
  else:
404
- arguments = BuildArguments(**drop_none_kwargs(kwargs))
403
+ arguments = BuildArguments(**kwargs_without_none)
405
404
 
406
405
  # real call starts here
407
406
  # build also needs to find first
408
- apps = find_apps(args.paths, args.target, find_arguments=arguments)
407
+ apps = find_apps(args.paths, args.target, find_arguments=FindArguments.model_validate(kwargs_without_none))
408
+
409
409
  if isinstance(arguments, FindArguments): # find only
410
410
  if arguments.output:
411
411
  os.makedirs(os.path.dirname(os.path.realpath(arguments.output)), exist_ok=True)
@@ -447,6 +447,12 @@ def main():
447
447
  for app in failed_apps:
448
448
  print(f' {app}')
449
449
 
450
+ disabled_apps = [app for app in apps if app.build_status == BuildStatus.DISABLED]
451
+ if disabled_apps:
452
+ print('Disabled the following apps:')
453
+ for app in disabled_apps:
454
+ print(f' {app}')
455
+
450
456
  if ret_code != 0:
451
457
  sys.exit(ret_code)
452
458
 
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
1
+ # SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  """
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
1
+ # SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
  import contextvars
4
4
  import logging
@@ -45,7 +45,7 @@ class IfClause:
45
45
  try:
46
46
  self.stmt: BoolStmt = parse_bool_expr(stmt)
47
47
  self._stmt: str = stmt
48
- except (ParseException, InvalidIfClause) as ex:
48
+ except (ParseException, InvalidIfClause, AttributeError) as ex:
49
49
  raise InvalidIfClause(f'Invalid if clause: {stmt}. {ex}')
50
50
 
51
51
  self.temporary = temporary
@@ -342,12 +342,19 @@ class Manifest:
342
342
  self._rule_paths = {rule.folder: rule for rule in self.rules}
343
343
 
344
344
  @classmethod
345
- def from_files(cls, paths: t.Iterable[PathLike], *, root_path: str = os.curdir) -> 'Manifest':
345
+ def from_files(
346
+ cls,
347
+ paths: t.Iterable[PathLike],
348
+ *,
349
+ root_path: str = os.curdir,
350
+ common_components: t.Optional[t.Sequence[str]] = None,
351
+ ) -> 'Manifest':
346
352
  """
347
353
  Create a Manifest instance from multiple manifest files
348
354
 
349
355
  :param paths: manifest file paths
350
356
  :param root_path: root path for relative paths in manifest files
357
+ :param common_components: sequence of strings to expand the ``- *common_components`` placeholder in manifests
351
358
  :return: Manifest instance
352
359
  """
353
360
  # folder, defined as dict
@@ -356,7 +363,7 @@ class Manifest:
356
363
  rules: t.List[FolderRule] = []
357
364
  for path in paths:
358
365
  LOGGER.debug('Loading manifest file %s', path)
359
- _manifest = cls.from_file(path, root_path=root_path)
366
+ _manifest = cls.from_file(path, root_path=root_path, common_components=common_components)
360
367
 
361
368
  for rule in _manifest.rules:
362
369
  if rule.folder in _known_folders:
@@ -373,15 +380,22 @@ class Manifest:
373
380
  return Manifest(rules, root_path=root_path)
374
381
 
375
382
  @classmethod
376
- def from_file(cls, path: PathLike, *, root_path: str = os.curdir) -> 'Manifest':
383
+ def from_file(
384
+ cls,
385
+ path: PathLike,
386
+ *,
387
+ root_path: str = os.curdir,
388
+ common_components: t.Optional[t.Sequence[str]] = None,
389
+ ) -> 'Manifest':
377
390
  """
378
391
  Create a Manifest instance from a manifest file
379
392
 
380
393
  :param path: path to the manifest file
381
394
  :param root_path: root path for relative paths in manifest file
395
+ :param common_components: sequence of strings to expand the ``{{root_components}}`` placeholder in manifests
382
396
  :return: Manifest instance
383
397
  """
384
- manifest_dict = parse(path)
398
+ manifest_dict = parse(path, common_components=common_components)
385
399
 
386
400
  rules: t.List[FolderRule] = []
387
401
  for folder, folder_rule in manifest_dict.items():
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
1
+ # SPDX-FileCopyrightText: 2025-2026 Espressif Systems (Shanghai) CO LTD
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  import esp_bool_parser
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD
1
+ # SPDX-FileCopyrightText: 2023-2026 Espressif Systems (Shanghai) CO LTD
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  import logging
idf_build_apps/utils.py CHANGED
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
1
+ # SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  import fnmatch
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD
1
+ # SPDX-FileCopyrightText: 2024-2026 Espressif Systems (Shanghai) CO LTD
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  from .parser import (
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD
1
+ # SPDX-FileCopyrightText: 2024-2026 Espressif Systems (Shanghai) CO LTD
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  import typing as t
@@ -62,8 +62,41 @@ def parse_postfixes(manifest_dict: t.Dict):
62
62
  manifest_dict[folder] = updated_folder
63
63
 
64
64
 
65
- def parse(path: PathLike) -> t.Dict:
66
- with open(path) as f:
67
- manifest_dict = yaml.safe_load(f) or {}
65
+ def flatten_common_components(manifest_dict: t.Dict):
66
+ """
67
+ Flattens nested lists under `depends_components` into a single list of strings.
68
+ """
69
+
70
+ for folder, folder_rule in manifest_dict.items():
71
+ if not isinstance(folder_rule, t.Dict):
72
+ continue
73
+
74
+ depends = folder_rule.get('depends_components')
75
+ if not isinstance(depends, t.List):
76
+ continue
77
+
78
+ flattened: t.List[str] = []
79
+ for item in depends:
80
+ if isinstance(item, t.List):
81
+ flattened.extend(map(str, item))
82
+ else:
83
+ flattened.append(item)
84
+
85
+ folder_rule['depends_components'] = flattened
86
+
87
+
88
+ def parse(path: PathLike, *, common_components: t.Optional[t.Sequence[str]] = None) -> t.Dict:
89
+ common_components_yaml = (
90
+ '.common_components: &common_components\n' + '\n'.join(f' - {component}' for component in common_components)
91
+ if common_components
92
+ else ''
93
+ )
94
+
95
+ with open(path, encoding='utf-8') as f:
96
+ user_yaml = f.read()
97
+
98
+ manifest_dict = yaml.safe_load(f'{common_components_yaml}\n{user_yaml}') or {}
99
+
100
+ flatten_common_components(manifest_dict)
68
101
  parse_postfixes(manifest_dict)
69
102
  return manifest_dict
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: idf-build-apps
3
- Version: 2.13.2
3
+ Version: 2.14.0
4
4
  Summary: Tools for building ESP-IDF related apps.
5
5
  Author-email: Fu Hanxi <fuhanxi@espressif.com>
6
6
  Requires-Python: >=3.7
@@ -0,0 +1,27 @@
1
+ idf_build_apps/__init__.py,sha256=aPohj9cU8yfQCqYn7wKsJDjVMUJq6A__07PNoAFUHbs,711
2
+ idf_build_apps/__main__.py,sha256=xbvcgp3sNxXZZ0MMr9XU12TjdzHBWq6DF1FYUSmAjHE,182
3
+ idf_build_apps/app.py,sha256=_B4kCTCUq7mSd6T-VwtLbBM9iHSpXRpfM0vmrznkjYo,40223
4
+ idf_build_apps/args.py,sha256=sdp7eI33BXKmqucs60sS0kK8l5p4fRpRS6H7Y0XyITY,40803
5
+ idf_build_apps/autocompletions.py,sha256=UbswHAWRvqvq4TgDBFjqHGlDLS_NEBM8EE0LlLUYY0A,2143
6
+ idf_build_apps/constants.py,sha256=CW7vKXV6brsNLWeGLNCoDj28r5GO9So3RFNqgk_X2CI,2166
7
+ idf_build_apps/finder.py,sha256=eSIr-y5yPTInQk5IQHggRJyxOndciexaNzpU4VVhfQQ,5833
8
+ idf_build_apps/log.py,sha256=2aJRqx3hPT9IhSv3RLkXR5j7PgB2RX47G766c4i_m5c,3899
9
+ idf_build_apps/main.py,sha256=B5yb6cy5UgqHP8-f7VEc9CrbkQmWGEpf6ww70MC_1z8,18255
10
+ idf_build_apps/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
+ idf_build_apps/session_args.py,sha256=BMWfW48hHHt5UsAbzTJ9BMnerVP5lnulb0h3Db-BNC8,2973
12
+ idf_build_apps/utils.py,sha256=YAVIYTvz86G--qjh58H376taQ-qe1PbebXcWxYNdnFs,10976
13
+ idf_build_apps/junit/__init__.py,sha256=ZFbtFP4nrRUsN_7rdCYWPZRSAYH_OXetZyd3JGv71bs,231
14
+ idf_build_apps/junit/report.py,sha256=SUQ7VQwc4zUUwLt6srVncvue9iswIFm7AHOao7umyo4,6565
15
+ idf_build_apps/junit/utils.py,sha256=bmrCn44DH3b_LrlKTN7t7l94ttEmitiwVGVBrCQC1yo,1303
16
+ idf_build_apps/manifest/__init__.py,sha256=Fze5wbperMK1F35KXnkAEc93u-ldDl7eQQkv75DoJ18,479
17
+ idf_build_apps/manifest/manifest.py,sha256=UG6t7l9BNmZ223pl674-gSpBgUos3wwHPWwO9Y7-R0A,18580
18
+ idf_build_apps/manifest/soc_header.py,sha256=vBO8oDEIIcxWRCDOPNXtqHKU0yv8q4yMrTo22W55iNw,177
19
+ idf_build_apps/vendors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
+ idf_build_apps/vendors/pydantic_sources.py,sha256=cxSIPRc3eI5peVMhDxwf58YaGhuG4SCwPRVX2znFEek,4553
21
+ idf_build_apps/yaml/__init__.py,sha256=lbBz5r6hp8dSsxIypGFcc5EbXgWw2codDmky8QCo-sg,167
22
+ idf_build_apps/yaml/parser.py,sha256=qlPZbLOM48CFs4F8i83Sa0QAl8AA-DQceWozTE_CkHM,3191
23
+ idf_build_apps-2.14.0.dist-info/entry_points.txt,sha256=3pVUirUEsb6jsDRikkQWNUt4hqLK2ci1HvW_Vf8b6uE,59
24
+ idf_build_apps-2.14.0.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
25
+ idf_build_apps-2.14.0.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
26
+ idf_build_apps-2.14.0.dist-info/METADATA,sha256=Zo3oJH3A2BCUuQmQ67mhFNw68LrXWfJvDwP5SngpIp4,4795
27
+ idf_build_apps-2.14.0.dist-info/RECORD,,
@@ -1,27 +0,0 @@
1
- idf_build_apps/__init__.py,sha256=E0n56IiCyZFns3uVrkkIGeCv1hE9surybp-xb5vQlLE,711
2
- idf_build_apps/__main__.py,sha256=pT6OsFQRjCw39Jg43HAeGKzq8h5E_0m7kHDE2QMqDe0,182
3
- idf_build_apps/app.py,sha256=iMu2m20O7vMpHWWQv107pjtqIJXMT-0Je3uWeWznfog,40179
4
- idf_build_apps/args.py,sha256=Kf14fvk07qsZYYpJqROMimA8w7YlVqOxjr21W88FZJ8,40171
5
- idf_build_apps/autocompletions.py,sha256=2fZQxzgZ21ie_2uk-B-7-xWYCChfOSgRFRYb7I2Onfo,2143
6
- idf_build_apps/constants.py,sha256=2iwLPZRhSQcn1v4RAcOJnHbqp1fDTp6A1gHaxn5ciTE,2166
7
- idf_build_apps/finder.py,sha256=CKppfxa-nPedHKXfyQ841q1DZc0BimVulXK52EfCD0o,5833
8
- idf_build_apps/log.py,sha256=15sSQhv9dJsHShDR2KgFGFp8ByjV0HogLr1X1lHYqGs,3899
9
- idf_build_apps/main.py,sha256=okfGrChI2i4Vzeag_dRKD5QaxlpAJ2rZ-MFcIS2PzXk,18034
10
- idf_build_apps/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
- idf_build_apps/session_args.py,sha256=1B7e3M9_eKdQezGNXaocqCq7iE4MOxpYJkfanCfdkDE,2973
12
- idf_build_apps/utils.py,sha256=YJZOXIpo3aoRkGZJoQUJHAPWi2VkTDAVzQG5DI2igxw,10976
13
- idf_build_apps/junit/__init__.py,sha256=ljILW1rfeBAIlwZIw8jstYrVbugErlmCYzSzJwNFC2I,231
14
- idf_build_apps/junit/report.py,sha256=yzt5SiJEA_AUlw2Ld23J7enYlfDluvmKAcCnAM8ccqE,6565
15
- idf_build_apps/junit/utils.py,sha256=idBrLgsz6Co2QUQqq1AiyzRHnqbJf_EoykEAxCkjHZw,1303
16
- idf_build_apps/manifest/__init__.py,sha256=CP4_LSkh7sb_DsWLSzqkSZ3UojyVdM10bX9avlmn2pg,479
17
- idf_build_apps/manifest/manifest.py,sha256=i8bXxyHeIFxYN5Z1l0dNNBFdgP7SKl3t0TCVqhlF0Lo,18051
18
- idf_build_apps/manifest/soc_header.py,sha256=_F6H5-HP6ateAqKUGlRGH-SUtQ8NJ1RI0hBeCFvsDYA,172
19
- idf_build_apps/vendors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
- idf_build_apps/vendors/pydantic_sources.py,sha256=cxSIPRc3eI5peVMhDxwf58YaGhuG4SCwPRVX2znFEek,4553
21
- idf_build_apps/yaml/__init__.py,sha256=R6pYasVsD31maeZ4dWRZnS10hwzM7gXdnfzDsOIRJ-4,167
22
- idf_build_apps/yaml/parser.py,sha256=IhY7rCWXOxrzzgEiKipTdPs_8yXDf8JZr-sMewV1pk8,2133
23
- idf_build_apps-2.13.2.dist-info/entry_points.txt,sha256=3pVUirUEsb6jsDRikkQWNUt4hqLK2ci1HvW_Vf8b6uE,59
24
- idf_build_apps-2.13.2.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
25
- idf_build_apps-2.13.2.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
26
- idf_build_apps-2.13.2.dist-info/METADATA,sha256=ELm5hM4bEZkyG9lwiiXAQBCtuE_PySR3qz0mtR0GukE,4795
27
- idf_build_apps-2.13.2.dist-info/RECORD,,