Skip to content

blext.cli

blext.cli.__main__

Entrypoint of the cli package.

Notes

This allows blext to be run using python -m blext.cli.


blext.cli._entrypoint

blext *

blext.cli._context

Shared context for blext commands.


blext.cli.build

Implements blext build.

build

build(
	proj: ParameterProj = None,
	*,
	blext_info: ParameterBLExtInfo = DEFAULT_BLEXT_INFO,
	global_config: ParameterConfig = DEFAULT_CONFIG,
	output: Path | None = None,
	overwrite: bool = True,
	vendor: bool = True,
	check_output: bool = True,
) -> None

Build an extension project.

PARAMETER DESCRIPTION
proj

Location specifier for blext projects.

TYPE: ParameterProj DEFAULT: None

blext_info

Information used to find and load blext project.

TYPE: ParameterBLExtInfo DEFAULT: DEFAULT_BLEXT_INFO

global_config

Loaded global configuration.

TYPE: ParameterConfig DEFAULT: DEFAULT_CONFIG

output

Write built extension to this file / folder.

TYPE: Path | None DEFAULT: None

overwrite

Allow overwriting .zip.

TYPE: bool DEFAULT: True

vendor

Include dependencies as wheels in the .zip. When False, write uv.lock to the extension.

TYPE: bool DEFAULT: True

check_output

Run blext check on the packed .zip.

TYPE: bool DEFAULT: True

Source code in blext/cli/build.py
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
@APP.command()
def build(  # noqa: C901, PLR0912, PLR0913, PLR0915
	proj: ParameterProj = None,
	*,
	blext_info: ParameterBLExtInfo = DEFAULT_BLEXT_INFO,
	global_config: ParameterConfig = DEFAULT_CONFIG,
	output: typ.Annotated[
		Path | None,
		cyclopts.Parameter(name=['--output', '-o']),
	] = None,
	overwrite: bool = True,
	vendor: bool = True,
	check_output: bool = True,
) -> None:
	"""Build an extension project.

	Parameters:
		proj: Location specifier for `blext` projects.
		blext_info: Information used to find and load `blext` project.
		global_config: Loaded global configuration.
		output: Write built extension to this file / folder.
		overwrite: Allow overwriting `.zip`.
		vendor: Include dependencies as wheels in the `.zip`.
			When `False`, write `uv.lock` to the extension.
		check_output: Run `blext check` on the packed `.zip`.
	"""
	blext_info = blext_info.parse_proj(proj)
	blext_location = blext_info.blext_location(global_config)

	####################
	# - Parse Specification
	####################
	blext_spec = blext_info.blext_spec(global_config)

	####################
	# - Report BLVersion Selection(s)
	####################
	bl_versions = blext_info.bl_versions(global_config)
	match blext_info.bl_version:
		case ():
			CONSOLE.print(
				rich.markdown.Markdown(
					'\n'.join(
						[
							f'Selected **all {len(bl_versions)} ext-supported Blender version** chunk(s):',
							*[
								f'- `{bl_version.version}`'
								for bl_version in sorted(
									bl_versions, key=lambda el: el.version
								)
							],
						]
					)
				),
				'',
			)

		case ('detect',):
			bl_version = next(iter(bl_versions))
			CONSOLE.print(
				rich.markdown.Markdown(
					f'Selected **detected local Blender version**: `{bl_version.version}`'
				)
			)

		case _:
			CONSOLE.print(
				rich.markdown.Markdown(
					'\n'.join(
						[
							f'Selected **{len(bl_versions)} Blender version** chunks:',
							*[
								f'- `{bl_version.version}`'
								for bl_version in sorted(
									bl_versions, key=lambda el: el.version
								)
							],
						]
					)
				),
				'',
			)

	####################
	# - Report BLPlatform Selection(s)
	####################
	bl_platforms = blext_info.bl_platforms(global_config)
	match blext_info.platform:
		case ():
			CONSOLE.print(
				rich.markdown.Markdown(
					'\n'.join(
						[
							f'Selected **all {len(bl_platforms)} ext-supported platform(s)**:',
							*[
								f'- `{bl_platform}`'
								for bl_platform in sorted(bl_platforms)
							],
						]
					)
				),
				'',
			)
		case ('detect',):
			bl_platform = next(iter(bl_platforms))
			CONSOLE.print(
				rich.markdown.Markdown(
					f'Selected **detected local Blender platform**: `{bl_platform}`'
				)
			)
		case _:
			CONSOLE.print(
				rich.markdown.Markdown(
					'\n'.join(
						[
							f'Selected **{len(bl_platforms)} Blender platforms**:',
							*[
								f'- `{bl_platform}`'
								for bl_platform in sorted(bl_platforms)
							],
						]
					)
				),
				'',
			)

	if any(
		[
			blext_spec.deps.min_glibc_version is not None,
			blext_spec.deps.min_macos_version is not None,
			blext_spec.deps.valid_python_tags is not None,
			blext_spec.deps.valid_abi_tags is not None,
		]
	):
		if blext_spec.deps.min_glibc_version is not None:
			CONSOLE.print(
				rich.markdown.Markdown(
					f'Using **modified platform support** `min_glibc_version={list(blext_spec.deps.min_glibc_version)}`'
				)
			)
		if blext_spec.deps.min_macos_version is not None:
			CONSOLE.print(
				rich.markdown.Markdown(
					f'Using **modified platform support**: `min_macos_version={list(blext_spec.deps.min_macos_version)}`'
				)
			)
		if blext_spec.deps.valid_python_tags is not None:
			CONSOLE.print(
				rich.markdown.Markdown(
					f'Using **modified platform support**: `valid_python_tags={sorted(blext_spec.deps.valid_python_tags)}`'
				)
			)

	####################
	# - Select Paths
	####################
	# Packed .zip Paths
	if output:
		if len(bl_versions) == 1:
			bl_version = next(iter(bl_versions))
			path_zips: frozendict[extyp.BLVersion, Path] = frozendict(
				{bl_version: output}
			)
		else:
			msg = 'Cannot set filename of extension zip when building extension for multiple Blender versions.'
			raise ValueError(msg)
	else:
		path_zips = blext_info.path_zips(global_config)

	# Pre-Packed .zip Paths
	path_zip_prepacks = blext_info.path_zip_prepacks(global_config)
	if vendor:
		files_in_prepack = blext_spec.wheel_paths_to_prepack(
			path_wheels=blext_location.path_wheel_cache
		)
	else:
		raise NotImplementedError

	# Wheel Paths (Cached & To Download)
	wheels_in_cache = blext_spec.cached_wheels(
		path_wheels=blext_location.path_wheel_cache,
		bl_versions=bl_versions,
	)
	wheels_to_download = blext_spec.missing_wheels(
		path_wheels=blext_location.path_wheel_cache,
		bl_versions=bl_versions,
	)

	####################
	# - Download Wheels
	####################
	if wheels_in_cache:
		CONSOLE.print(
			rich.markdown.Markdown(
				f'Found **{len(wheels_in_cache)} wheel(s)** in cache'
			)
		)

	with ui.ui_download_wheels(
		wheels_to_download,
		console=CONSOLE,
	) as ui_callbacks:
		pydeps.download_wheels(
			wheels_to_download,
			path_wheels=blext_location.path_wheel_cache,
			cb_start_wheel_download=ui_callbacks.cb_start_wheel_download,
			cb_update_wheel_download=ui_callbacks.cb_update_wheel_download,
			cb_finish_wheel_download=ui_callbacks.cb_finish_wheel_download,
		)

	CONSOLE.print(
		rich.markdown.Markdown(f'Downloaded **{len(wheels_to_download)} wheel(s)**')
	)

	####################
	# - Pre-Pack Extension
	####################
	for bl_version in bl_versions:
		CONSOLE.print()
		CONSOLE.print(
			rich.markdown.Markdown(f'**Pre-Packing** for `{bl_version.version}`')
		)
		files_in_prepack_cache = pack.existing_prepacked_files(
			files_in_prepack[bl_version], path_zip_prepack=path_zip_prepacks[bl_version]
		)
		if files_in_prepack_cache:
			CONSOLE.print(
				rich.markdown.Markdown(
					f'Found **{len(files_in_prepack_cache)} pre-packed file(s)** in cache'
				)
			)

		files_to_prepack = {
			path: zipfile_path
			for path, zipfile_path in files_in_prepack[bl_version].items()
			if zipfile_path not in files_in_prepack_cache
		}
		with ui.ui_prepack_extension(
			files_to_prepack,
			console=CONSOLE,
		) as ui_callbacks:
			pack.prepack_extension(
				files_to_prepack,
				path_zip_prepack=path_zip_prepacks[bl_version],
				cb_pre_file_write=ui_callbacks.cb_pre_file_write,  # pyright: ignore[reportArgumentType]
				cb_post_file_write=ui_callbacks.cb_post_file_write,  # pyright: ignore[reportArgumentType]
			)

		if files_in_prepack:
			CONSOLE.print(
				rich.markdown.Markdown(
					f'Pre-Packed **{len(files_to_prepack)} file(s)**'
				)
			)

	####################
	# - Pack Extension
	####################
	for bl_version in bl_versions:
		pack.pack_bl_extension(
			blext_spec,
			bl_version=bl_version,
			overwrite=overwrite,
			path_zip_prepack=path_zip_prepacks[bl_version],
			path_zip=path_zips[bl_version],
			path_pysrc=blext_location.path_pysrc(blext_spec.id),
		)

	####################
	# - Check Extension
	####################
	if check_output:
		for bl_version in bl_versions:
			check(
				blext_info=uityp.BLExtUI(path=path_zips[bl_version]),
				global_config=global_config,
			)

	####################
	# - Report Success
	####################
	CONSOLE.print()
	CONSOLE.print(
		rich.markdown.Markdown(
			'\n'.join(
				[
					f'Built `{blext_spec.id}` extension(s):',
					'',
					*[
						'\n'.join(
							[
								f'- {path_zips[bl_version]}',
								'',
							]
						)
						for bl_version in blext_info.bl_versions(global_config)
					],
				]
			)
		)
	)

blext.cli.check

Implements blext check.

check

check(
	proj: ParameterProj = None,
	*,
	blext_info: ParameterBLExtInfo = DEFAULT_BLEXT_INFO,
	global_config: ParameterConfig = DEFAULT_CONFIG,
) -> None

Check an extension project for problems.

PARAMETER DESCRIPTION
proj

Location specifier for blext projects.

TYPE: ParameterProj DEFAULT: None

blext_info

Information used to find and load blext project.

TYPE: ParameterBLExtInfo DEFAULT: DEFAULT_BLEXT_INFO

global_config

Loaded global configuration.

TYPE: ParameterConfig DEFAULT: DEFAULT_CONFIG

Source code in blext/cli/check.py
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
@APP.command()
def check(
	proj: ParameterProj = None,
	*,
	blext_info: ParameterBLExtInfo = DEFAULT_BLEXT_INFO,
	global_config: ParameterConfig = DEFAULT_CONFIG,
) -> None:
	"""Check an extension project for problems.

	Parameters:
		proj: Location specifier for `blext` projects.
		blext_info: Information used to find and load `blext` project.
		global_config: Loaded global configuration.
	"""
	blext_info = blext_info.parse_proj(proj)

	if blext_info.path is None:
		raise NotImplementedError

	check_target_name = blext_info.path.parts[-1]

	####################
	# - Packed ZIP
	####################
	checks: dict[str, bool] = {}
	if blext_info.path.name.endswith('.zip'):
		checks = {
			'blender --command extension validate': False,
		}
		path_zip = blext_info.path

		####################
		# - Check: Validate w/Blender
		####################
		try:
			blender.validate_extension(
				global_config.path_default_blender_exe, path_zip=path_zip
			)
			checks['blender --command extension validate'] = True

		except ValueError:
			pass

	####################
	# - Script/Project
	####################
	else:
		checks = {
			'Find Extension Specification': False,
			'Load Extension Specification': False,
		}
		####################
		# - Check: Load and Validate Specification
		####################
		try:
			_ = blext_info.blext_location(global_config)
			checks['Find Extension Specification'] = True
		except ValueError:
			pass

		try:
			blext_spec = blext_info.blext_spec(global_config)
			checks['Load Extension Specification'] = True

			check_target_name = blext_spec.id

		except (ValueError, pyd.ValidationError):
			pass

	####################
	# - Report
	####################
	if all(checks.values()):
		all_pass_str = r'\[[green]✓[/green]]'
	elif not any(checks.values()):
		all_pass_str = r'\[[red]X[/red]]'
	else:
		all_pass_str = r'\[[yellow]-[/yellow]]'

	checks_passed = len(
		[check_status for check_status in checks.values() if check_status]
	)
	checks_passed_str = f'{checks_passed}/{len(checks)}'

	CONSOLE.print()
	CONSOLE.print(
		all_pass_str + f' [bold]{check_target_name}[/bold] ({checks_passed_str})'
	)
	for check_text, check_status in checks.items():
		CONSOLE.print(
			'   ',
			r'\[[green]✓[/green]]' if check_status else r'\[[red]X[/red]]',
			' ',
			check_text,
			sep='',
		)

	####################
	# - Exit Code
	####################
	if not all(checks.values()):
		sys.exit(1)

blext.cli.run

Implements blext dev.

run

run(
	proj: ParameterProj = None,
	*,
	blext_info: ParameterBLExtInfo = DEFAULT_BLEXT_INFO,
	global_config: ParameterConfig = DEFAULT_CONFIG,
	blend: Path | None = None,
	headless: bool = False,
	factory_startup: bool = True,
) -> None

Run an extension live in Blender.

PARAMETER DESCRIPTION
proj

Location specifier for blext projects.

TYPE: ParameterProj DEFAULT: None

blext_info

Information used to find and load blext project.

TYPE: ParameterBLExtInfo DEFAULT: DEFAULT_BLEXT_INFO

global_config

Loaded global configuration.

TYPE: ParameterConfig DEFAULT: DEFAULT_CONFIG

blend

.blend file to open after loading the extension.

TYPE: Path | None DEFAULT: None

headless

Run Blender without a GUI.

TYPE: bool DEFAULT: False

factory_startup

Run Blender with default "factory settings".

TYPE: bool DEFAULT: True

Source code in blext/cli/run.py
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
@APP.command()
def run(
	proj: ParameterProj = None,
	*,
	blext_info: ParameterBLExtInfo = DEFAULT_BLEXT_INFO,
	global_config: ParameterConfig = DEFAULT_CONFIG,
	blend: Path | None = None,
	headless: bool = False,
	factory_startup: bool = True,
) -> None:
	"""Run an extension live in Blender.

	Parameters:
		proj: Location specifier for `blext` projects.
		blext_info: Information used to find and load `blext` project.
		global_config: Loaded global configuration.
		blend: `.blend` file to open after loading the extension.
		headless: Run Blender without a GUI.
		factory_startup: Run Blender with default "factory settings".
	"""
	blext_info = blext_info.parse_proj(proj)

	# Enforce Default Detection of BLPlatform and BLVersion
	blext_info = blext_info.model_copy(
		update={
			'platform': (
				('detect',) if blext_info.platform == () else blext_info.platform
			),
			'bl_version': (
				('detect',) if blext_info.bl_version == () else blext_info.bl_version
			),
		},
		deep=True,
	)

	# Run Extension
	with tempfile.TemporaryDirectory() as tmp_build_dir:
		path_zip = Path(tmp_build_dir) / 'blext-dev-extension.zip'

		####################
		# - Build Extension
		####################
		build(
			blext_info=blext_info,
			output=path_zip,
			overwrite=True,
			vendor=True,
			global_config=global_config,
		)

		####################
		# - Run Extension in Blender
		####################
		CONSOLE.print()
		CONSOLE.rule('[bold]Running Extension w/Blender[/bold]')
		blender.run_extension(
			global_config.path_default_blender_exe,
			path_zip=path_zip,
			headless=headless,
			factory_startup=factory_startup,
			path_blend=blend,
		)

blext show

blext.cli._context_show

Shared context for blext show commands.


blext.cli.show_blender_manifest

Implements blext show blender_manifest.

show_blender_manifest

show_blender_manifest(
	proj: ParameterProj = None,
	*,
	blext_info: ParameterBLExtInfo = DEFAULT_BLEXT_INFO,
	global_config: ParameterConfig = DEFAULT_CONFIG,
	format: Literal['json', 'toml'] = 'toml',
) -> None

Print the complete extension specification.

PARAMETER DESCRIPTION
proj

Location specifier for blext projects.

TYPE: ParameterProj DEFAULT: None

blext_info

Information used to find and load blext project.

TYPE: ParameterBLExtInfo DEFAULT: DEFAULT_BLEXT_INFO

global_config

Loaded global configuration.

TYPE: ParameterConfig DEFAULT: DEFAULT_CONFIG

format

The text format to show the Blender manifest as.

TYPE: Literal['json', 'toml'] DEFAULT: 'toml'

Source code in blext/cli/show_blender_manifest.py
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
@APP_SHOW.command(name='blender_manifest')
def show_blender_manifest(
	proj: ParameterProj = None,
	*,
	blext_info: ParameterBLExtInfo = DEFAULT_BLEXT_INFO,
	global_config: ParameterConfig = DEFAULT_CONFIG,
	format: typ.Literal['json', 'toml'] = 'toml',  # noqa: A002
) -> None:
	"""Print the complete extension specification.

	Parameters:
		proj: Location specifier for `blext` projects.
		blext_info: Information used to find and load `blext` project.
		global_config: Loaded global configuration.
		format: The text format to show the Blender manifest as.
	"""
	blext_info = blext_info.parse_proj(proj)
	blext_spec = blext_info.blext_spec(global_config)

	bl_versions = blext_info.bl_versions(global_config)
	if len(bl_versions) == 1:
		bl_version = next(iter(bl_versions))
		CONSOLE.print(
			blext_spec.export_blender_manifest(
				bl_version.max_manifest_version,
				bl_version=bl_version,
				fmt=format,
			),
			markup=False,
			end='',
		)

blext.cli.show_global_config

Implements blext show config.

show_global_config

show_global_config(
	*,
	format: Literal['raw', 'json', 'toml'] = 'toml',
	config: ParameterConfig = DEFAULT_CONFIG,
) -> None

Inspect all Python dependencies.

PARAMETER DESCRIPTION
format

Column to sort dependencies by.

TYPE: Literal['raw', 'json', 'toml'] DEFAULT: 'toml'

config

Global configuration overrides.

TYPE: ParameterConfig DEFAULT: DEFAULT_CONFIG

Source code in blext/cli/show_global_config.py
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
@APP_SHOW.command(name='global_config')
def show_global_config(
	*,
	format: typ.Literal['raw', 'json', 'toml'] = 'toml',  # noqa: A002
	config: ParameterConfig = DEFAULT_CONFIG,
) -> None:
	"""Inspect all Python dependencies.

	Parameters:
		format: Column to sort dependencies by.
		config: Global configuration overrides.
	"""
	if format == 'raw':
		CONSOLE.print(config)
	else:
		CONSOLE.print(config.export_config(fmt=format), markup=False, end='')

blext.cli.show_deps

Implements blext show deps.

show_deps

show_deps(
	proj: ParameterProj = None,
	*,
	blext_info: ParameterBLExtInfo = DEFAULT_BLEXT_INFO,
	global_config: ParameterConfig = DEFAULT_CONFIG,
	sort_by: Literal['filename', 'size'] = 'filename',
	format: Literal['table'] = 'table',
) -> None

Inspect all Python dependencies.

PARAMETER DESCRIPTION
proj

Location specifier for blext projects.

TYPE: ParameterProj DEFAULT: None

blext_info

Information used to find and load blext project.

TYPE: ParameterBLExtInfo DEFAULT: DEFAULT_BLEXT_INFO

global_config

Loaded global configuration.

TYPE: ParameterConfig DEFAULT: DEFAULT_CONFIG

sort_by

Column to sort dependencies by.

TYPE: Literal['filename', 'size'] DEFAULT: 'filename'

format

Text format to output.

TYPE: Literal['table'] DEFAULT: 'table'

Source code in blext/cli/show_deps.py
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
@APP_SHOW.command(name='deps')
def show_deps(
	proj: ParameterProj = None,
	*,
	blext_info: ParameterBLExtInfo = DEFAULT_BLEXT_INFO,
	global_config: ParameterConfig = DEFAULT_CONFIG,
	sort_by: typ.Literal['filename', 'size'] = 'filename',
	format: typ.Literal['table'] = 'table',  # noqa: A002
) -> None:
	"""Inspect all Python dependencies.

	Parameters:
		proj: Location specifier for `blext` projects.
		blext_info: Information used to find and load `blext` project.
		global_config: Loaded global configuration.
		sort_by: Column to sort dependencies by.
		format: Text format to output.
	"""
	blext_info = blext_info.parse_proj(proj)
	blext_spec = blext_info.blext_spec(global_config)

	blext_wheels = sorted(
		blext_spec.bl_versions_by_wheel.keys(),
		key={  # pyright: ignore[reportUnknownArgumentType]
			'filename': lambda wheel: wheel.filename,  # pyright: ignore[reportUnknownLambdaType,reportUnknownMemberType]
			'size': lambda wheel: wheel.sort_key_size,  # pyright: ignore[reportUnknownLambdaType,reportUnknownMemberType]
		}[sort_by],
	)

	####################
	# - UI: Create Table w/Wheel Data
	####################
	if format == 'table':
		bl_version_strs = {
			wheel: ', '.join(
				[
					bl_version.version
					for bl_version in blext_spec.bl_versions_by_wheel[wheel]
				]
			)
			for wheel in blext_wheels
		}
		all_the_same = len(set(bl_version_strs.values())) == 1

		table = rich.table.Table()
		table.add_column('Name')
		table.add_column('Version', no_wrap=True)
		if not all_the_same:
			table.add_column('BL')
		table.add_column('Platforms')
		table.add_column('Py|ABI', no_wrap=True)
		table.add_column('Size', no_wrap=True)

		for wheel in blext_wheels:
			table.add_row(
				wheel.project,
				wheel.version,
				*([bl_version_strs[wheel]] if not all_the_same else []),
				', '.join(list(wheel.platform_tags)),
				', '.join(list(wheel.python_tags))
				+ '|'
				+ ', '.join(list(wheel.abi_tags)),
				wheel.size.human_readable(decimal=True, separator=' '),
			)
		table.add_section()
		table.add_row(
			f'={len(blext_wheels)} wheels',
			'',
			*(
				[
					', '.join(
						[bl_version.version for bl_version in blext_spec.bl_versions]
					)
				]
				if not all_the_same
				else []
			),
			', '.join(blext_spec.bl_platforms),
			'',
			'',
		)

		####################
		# - UI: Print
		####################
		CONSOLE.print(table)

blext.cli.show_profile

Implements blext show init_settings.

show_profile

show_profile(
	proj: ParameterProj = None,
	*,
	blext_info: ParameterBLExtInfo = DEFAULT_BLEXT_INFO,
	global_config: ParameterConfig = DEFAULT_CONFIG,
	format: Literal['json', 'toml'] = 'toml',
) -> None

Show release-profile settings.

PARAMETER DESCRIPTION
proj

Location specifier for blext projects.

TYPE: ParameterProj DEFAULT: None

blext_info

Information used to find and load blext project.

TYPE: ParameterBLExtInfo DEFAULT: DEFAULT_BLEXT_INFO

global_config

Loaded global configuration.

TYPE: ParameterConfig DEFAULT: DEFAULT_CONFIG

format

Text format to output.

TYPE: Literal['json', 'toml'] DEFAULT: 'toml'

Source code in blext/cli/show_profile.py
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
@APP_SHOW.command(name='profile')
def show_profile(
	proj: ParameterProj = None,
	*,
	blext_info: ParameterBLExtInfo = DEFAULT_BLEXT_INFO,
	global_config: ParameterConfig = DEFAULT_CONFIG,
	format: typ.Literal['json', 'toml'] = 'toml',  # noqa: A002
) -> None:
	"""Show release-profile settings.

	Parameters:
		proj: Location specifier for `blext` projects.
		blext_info: Information used to find and load `blext` project.
		global_config: Loaded global configuration.
		format: Text format to output.
	"""
	blext_info = blext_info.parse_proj(proj)
	blext_spec = blext_info.blext_spec(global_config)

	# Show BLExtSpec
	if blext_spec.release_profile is not None:
		CONSOLE.print(
			blext_spec.release_profile.export_init_settings(fmt=format),
			markup=False,
			end='',
		)
	else:
		msg = f'Extension `{blext_spec.id}` has no release profile defined.'
		raise ValueError(msg)

blext show path

blext.cli._context_show_path

Shared context for blext show path commands.


blext.cli.show_path_blender

Implements show path blender.

show_path_blender

show_path_blender(
	*, global_config: ParameterConfig = DEFAULT_CONFIG
) -> None

Path to the blender executable used by blext.

Source code in blext/cli/show_path_blender.py
29
30
31
32
33
34
35
@APP_SHOW_PATH.command(name='blender')
def show_path_blender(
	*,
	global_config: ParameterConfig = DEFAULT_CONFIG,
) -> None:
	"""Path to the `blender` executable used by `blext`."""
	CONSOLE.print(global_config.path_default_blender_exe)

blext.cli.show_path_uv

Implements blext show path uv.

show_path_uv

show_path_uv(
	*, global_config: ParameterConfig = DEFAULT_CONFIG
) -> None

Path to uv executable used by blext.

Source code in blext/cli/show_path_uv.py
29
30
31
32
33
34
35
@APP_SHOW_PATH.command(name='uv')
def show_path_uv(
	*,
	global_config: ParameterConfig = DEFAULT_CONFIG,
) -> None:
	"""Path to `uv` executable used by `blext`."""
	CONSOLE.print(global_config.path_uv_exe)