flet-cli 1.0.4__tar.gz → 1.1.0.dev1__tar.gz

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.
Files changed (89) hide show
  1. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/PKG-INFO +3 -3
  2. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/pyproject.toml +3 -3
  3. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/commands/build.py +107 -94
  4. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/commands/build_base.py +808 -750
  5. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/commands/debug.py +3 -8
  6. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/commands/devices.py +1 -6
  7. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/commands/emulators.py +1 -6
  8. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/commands/flutter_base.py +263 -94
  9. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/commands/run.py +97 -34
  10. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/commands/test.py +17 -16
  11. flet_cli-1.1.0.dev1/src/flet_cli/utils/log_format.py +473 -0
  12. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/utils/python_versions.py +1 -1
  13. flet_cli-1.1.0.dev1/src/flet_cli/version.py +1 -0
  14. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli.egg-info/PKG-INFO +3 -3
  15. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli.egg-info/SOURCES.txt +4 -0
  16. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli.egg-info/requires.txt +2 -2
  17. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/tests/test_build_icons.py +13 -8
  18. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/tests/test_build_linux.py +22 -17
  19. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/tests/test_build_platform_settings.py +56 -0
  20. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/tests/test_build_splash.py +6 -6
  21. flet_cli-1.1.0.dev1/tests/test_build_svg.py +167 -0
  22. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/tests/test_build_template.py +149 -1
  23. flet_cli-1.1.0.dev1/tests/test_build_version.py +119 -0
  24. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/tests/test_create.py +12 -0
  25. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/tests/test_find_platform_image.py +15 -7
  26. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/tests/test_flutter.py +2 -0
  27. flet_cli-1.1.0.dev1/tests/test_log_format.py +829 -0
  28. flet_cli-1.1.0.dev1/tests/test_run_assets_dir.py +375 -0
  29. flet_cli-1.0.4/src/flet_cli/version.py +0 -1
  30. flet_cli-1.0.4/tests/test_run_assets_dir.py +0 -81
  31. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/README.md +0 -0
  32. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/setup.cfg +0 -0
  33. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/__pyinstaller/__init__.py +0 -0
  34. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/__pyinstaller/config.py +0 -0
  35. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/__pyinstaller/hook-flet.py +0 -0
  36. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/__pyinstaller/macos_utils.py +0 -0
  37. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/__pyinstaller/rthooks/pyi_rth_localhost_fletd.py +0 -0
  38. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/__pyinstaller/rthooks.dat +0 -0
  39. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/__pyinstaller/utils.py +0 -0
  40. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/__pyinstaller/win_utils.py +0 -0
  41. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/cli.py +0 -0
  42. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/commands/base.py +0 -0
  43. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/commands/clean.py +0 -0
  44. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/commands/create.py +0 -0
  45. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/commands/doctor.py +0 -0
  46. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/commands/mcp.py +0 -0
  47. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/commands/options.py +0 -0
  48. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/commands/pack.py +0 -0
  49. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/commands/publish.py +0 -0
  50. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/commands/serve.py +0 -0
  51. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/commands/test_host.py +0 -0
  52. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/utils/android.py +0 -0
  53. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/utils/android_sdk.py +0 -0
  54. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/utils/app_excludes.py +0 -0
  55. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/utils/cli.py +0 -0
  56. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/utils/distros.py +0 -0
  57. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/utils/flutter.py +0 -0
  58. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/utils/hash_stamp.py +0 -0
  59. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/utils/ios_sign.py +0 -0
  60. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/utils/jdk.py +0 -0
  61. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/utils/linux_deps.py +0 -0
  62. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/utils/macos_sign.py +0 -0
  63. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/utils/merge.py +0 -0
  64. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/utils/plist.py +0 -0
  65. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/utils/processes.py +0 -0
  66. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/utils/project_dependencies.py +0 -0
  67. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/utils/pyodide.py +0 -0
  68. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/utils/pyproject_toml.py +0 -0
  69. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli/utils/template_cache.py +0 -0
  70. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli.egg-info/dependency_links.txt +0 -0
  71. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli.egg-info/entry_points.txt +0 -0
  72. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/src/flet_cli.egg-info/top_level.txt +0 -0
  73. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/tests/test_app_excludes.py +0 -0
  74. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/tests/test_build_app_path.py +0 -0
  75. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/tests/test_build_copy_output.py +0 -0
  76. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/tests/test_build_ios.py +0 -0
  77. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/tests/test_build_list_options.py +0 -0
  78. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/tests/test_build_macos_signing.py +0 -0
  79. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/tests/test_build_windows_arm64.py +0 -0
  80. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/tests/test_clean.py +0 -0
  81. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/tests/test_cli_pass_through_args.py +0 -0
  82. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/tests/test_cli_positionals.py +0 -0
  83. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/tests/test_macos_sign.py +0 -0
  84. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/tests/test_plist.py +0 -0
  85. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/tests/test_project_dependencies.py +0 -0
  86. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/tests/test_python_versions.py +0 -0
  87. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/tests/test_run_desktop_dependency.py +0 -0
  88. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/tests/test_run_script_args.py +0 -0
  89. {flet_cli-1.0.4 → flet_cli-1.1.0.dev1}/tests/test_run_watcher_unavailable.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flet-cli
3
- Version: 1.0.4
3
+ Version: 1.1.0.dev1
4
4
  Summary: Flet CLI
5
5
  Author-email: "Appveyor Systems Inc." <hello@flet.dev>
6
6
  License-Expression: Apache-2.0
@@ -9,8 +9,8 @@ Project-URL: Repository, https://github.com/flet-dev/flet
9
9
  Project-URL: Documentation, https://flet.dev/docs
10
10
  Requires-Python: >=3.10
11
11
  Description-Content-Type: text/markdown
12
- Requires-Dist: flet==1.0.4
13
- Requires-Dist: flet-platform-assets==1.0.4
12
+ Requires-Dist: flet==1.1.0.dev1
13
+ Requires-Dist: flet-platform-assets==1.1.0.dev1
14
14
  Requires-Dist: watchdog>=4.0.0
15
15
  Requires-Dist: packaging>=25.0
16
16
  Requires-Dist: qrcode>=7.4.2
@@ -1,14 +1,14 @@
1
1
  [project]
2
2
  name = "flet-cli"
3
- version = "1.0.4"
3
+ version = "1.1.0.dev1"
4
4
  description = "Flet CLI"
5
5
  authors = [{ name = "Appveyor Systems Inc.", email = "hello@flet.dev" }]
6
6
  license = "Apache-2.0"
7
7
  readme = "README.md"
8
8
  requires-python = ">=3.10"
9
9
  dependencies = [
10
- "flet==1.0.4",
11
- "flet-platform-assets==1.0.4",
10
+ "flet==1.1.0.dev1",
11
+ "flet-platform-assets==1.1.0.dev1",
12
12
  "watchdog >=4.0.0",
13
13
  "packaging >=25.0",
14
14
  "qrcode >=7.4.2",
@@ -6,9 +6,6 @@ import tempfile
6
6
  from pathlib import Path
7
7
  from typing import Callable, Optional
8
8
 
9
- from rich.console import Group
10
- from rich.live import Live
11
-
12
9
  from flet_cli.commands.build_base import BaseBuildCommand, console
13
10
  from flet_cli.commands.flutter_base import verbose1_style
14
11
  from flet_cli.utils.android import flutter_target_platforms
@@ -94,11 +91,9 @@ class Command(BaseBuildCommand):
94
91
 
95
92
  super().handle(options)
96
93
  assert self.target_platform
97
- self.status = console.status(
98
- f"[bold blue]Initializing {self.target_platform} build...",
99
- spinner="bouncingBall",
100
- )
101
- with Live(Group(self.status, self.progress), console=console) as self.live:
94
+ with self.live_status(
95
+ f"[bold blue]Initializing {self.target_platform} build..."
96
+ ):
102
97
  self.initialize_command()
103
98
  self.validate_target_platform()
104
99
  self.validate_entry_point()
@@ -119,6 +114,21 @@ class Command(BaseBuildCommand):
119
114
  if self.target_platform == "macos":
120
115
  self.sign_macos_app()
121
116
 
117
+ unsigned_ipa = self.target_platform == "ipa" and not self.built_ipa()
118
+ if self.no_rich_output:
119
+ # Non-interactive: the exit code is the result, no banner; only
120
+ # the missing .ipa is worth a warning.
121
+ if unsigned_ipa:
122
+ self.warn(
123
+ "No .ipa was produced: Xcode exports one only for a "
124
+ "signed app. Configure a provisioning profile and a "
125
+ "signing certificate to get an uploadable bundle: "
126
+ "https://flet.dev/docs/publish/ios",
127
+ title="iOS signing",
128
+ )
129
+ self.cleanup(0)
130
+ return
131
+
122
132
  self.cleanup(
123
133
  0,
124
134
  message=(
@@ -139,7 +149,7 @@ class Command(BaseBuildCommand):
139
149
  "[cyan]provisioning profile[/cyan] and a "
140
150
  "[cyan]signing certificate[/cyan] to get an uploadable "
141
151
  "bundle: https://flet.dev/docs/publish/ios"
142
- if self.target_platform == "ipa" and not self.built_ipa()
152
+ if unsigned_ipa
143
153
  else ""
144
154
  )
145
155
  ),
@@ -219,33 +229,32 @@ class Command(BaseBuildCommand):
219
229
  assert self.platforms
220
230
  assert self.target_platform
221
231
 
222
- self.update_status(
232
+ with self.step(
223
233
  f"[bold blue]Building [cyan]"
224
234
  f"{self.platforms[self.target_platform]['status_text']}[/cyan]..."
225
- )
226
-
227
- # Clear the build output directories of artifacts from previous runs. Flutter
228
- # only ever adds files to them, and copy_build_output harvests them wholesale —
229
- # so without this, a previous build with different options (e.g. --arch,
230
- # --split-per-abi, or a renamed product) would leak its artifacts into the
231
- # user's output directory.
232
- assert self.flutter_dir
233
- flutter_dir = self.flutter_dir.resolve()
234
- for output in self.platforms[self.target_platform]["outputs"]:
235
- output_dir = Path(
236
- os.path.dirname(self.resolve_output_path(output))
237
- ).resolve()
238
- # only delete directories that are strictly inside the generated Flutter
239
- # project (and never the project directory itself).
240
- if output_dir != flutter_dir and output_dir.is_relative_to(flutter_dir):
241
- shutil.rmtree(output_dir, ignore_errors=True)
242
-
243
- self._run_flutter_command()
235
+ ):
236
+ # Clear the build output directories of artifacts from previous runs.
237
+ # Flutter only ever adds files to them, and copy_build_output harvests
238
+ # them wholesale — so without this, a previous build with different
239
+ # options (e.g. --arch, --split-per-abi, or a renamed product) would
240
+ # leak its artifacts into the user's output directory.
241
+ assert self.flutter_dir
242
+ flutter_dir = self.flutter_dir.resolve()
243
+ for output in self.platforms[self.target_platform]["outputs"]:
244
+ output_dir = Path(
245
+ os.path.dirname(self.resolve_output_path(output))
246
+ ).resolve()
247
+ # only delete directories that are strictly inside the generated Flutter
248
+ # project (and never the project directory itself).
249
+ if output_dir != flutter_dir and output_dir.is_relative_to(flutter_dir):
250
+ shutil.rmtree(output_dir, ignore_errors=True)
251
+
252
+ self._run_flutter_command()
244
253
 
245
- console.log(
246
- f"Built [cyan]{self.describe_build_output()}"
247
- f"[/cyan] {self.emojis['checkmark']}",
248
- )
254
+ console.log(
255
+ f"Built [cyan]{self.describe_build_output()}"
256
+ f"[/cyan] {self.emojis['checkmark']}",
257
+ )
249
258
 
250
259
  def built_ipa(self) -> bool:
251
260
  """
@@ -646,58 +655,60 @@ class Command(BaseBuildCommand):
646
655
  if self.verbose > 0:
647
656
  console.log(message, style=verbose1_style)
648
657
 
649
- self.update_status(f"[bold blue]Signing [cyan]{app_path.name}[/cyan]...")
650
- try:
651
- # Each lane scopes resolution to the certificate type Apple's
652
- # services accept for it — which also lets an unset identity
653
- # auto-discover the only candidate. The plain lane stays
654
- # unscoped: Apple Development or corporate certificates are
655
- # legitimate there.
656
- if distribution == "app-store":
657
- resolved = resolve_identity(identity, types=APP_STORE_CERTIFICATE_TYPES)
658
- elif distribution == "developer-id":
659
- resolved = resolve_identity(
660
- identity, types=DEVELOPER_ID_CERTIFICATE_TYPES
661
- )
662
- else:
663
- resolved = resolve_identity(identity)
664
- if not identity:
665
- console.log(f"Signing identity: {resolved.name}")
666
- if distribution == "developer-id" and resolved.is_adhoc:
667
- self.cleanup(
668
- 1,
669
- "Developer ID distribution requires a Developer ID "
670
- 'identity; ad-hoc ("-") signed apps cannot be notarized.',
671
- )
672
-
673
- if distribution == "app-store":
674
- self._sign_macos_app_store(app_path, resolved, entitlements, log)
675
- return
658
+ with self.step(f"[bold blue]Signing [cyan]{app_path.name}[/cyan]..."):
659
+ try:
660
+ # Each lane scopes resolution to the certificate type Apple's
661
+ # services accept for it — which also lets an unset identity
662
+ # auto-discover the only candidate. The plain lane stays
663
+ # unscoped: Apple Development or corporate certificates are
664
+ # legitimate there.
665
+ if distribution == "app-store":
666
+ resolved = resolve_identity(
667
+ identity, types=APP_STORE_CERTIFICATE_TYPES
668
+ )
669
+ elif distribution == "developer-id":
670
+ resolved = resolve_identity(
671
+ identity, types=DEVELOPER_ID_CERTIFICATE_TYPES
672
+ )
673
+ else:
674
+ resolved = resolve_identity(identity)
675
+ if not identity:
676
+ console.log(f"Signing identity: {resolved.name}")
677
+ if distribution == "developer-id" and resolved.is_adhoc:
678
+ self.cleanup(
679
+ 1,
680
+ "Developer ID distribution requires a Developer ID "
681
+ 'identity; ad-hoc ("-") signed apps cannot be notarized.',
682
+ )
676
683
 
677
- signed_count = sign_app(
678
- app_path,
679
- resolved,
680
- entitlements=entitlements,
681
- log=log,
682
- )
683
- console.log(
684
- f"Signed [cyan]{app_path.name}[/cyan] ({signed_count} binaries, "
685
- f"identity: {resolved.description}) {self.emojis['checkmark']}"
686
- )
684
+ if distribution == "app-store":
685
+ self._sign_macos_app_store(app_path, resolved, entitlements, log)
686
+ return
687
687
 
688
- if distribution == "developer-id":
689
- credentials = self._macos_notary_credentials()
690
- self.update_status(
691
- f"[bold blue]Notarizing [cyan]{app_path.name}[/cyan] "
692
- "(this can take a few minutes)...",
688
+ signed_count = sign_app(
689
+ app_path,
690
+ resolved,
691
+ entitlements=entitlements,
692
+ log=log,
693
693
  )
694
- notarize_and_staple(app_path, credentials, log=log)
695
694
  console.log(
696
- f"Notarized and stapled [cyan]{app_path.name}[/cyan] "
697
- f"{self.emojis['checkmark']}"
695
+ f"Signed [cyan]{app_path.name}[/cyan] ({signed_count} binaries, "
696
+ f"identity: {resolved.description}) {self.emojis['checkmark']}"
698
697
  )
699
- except MacOSSigningError as e:
700
- self.cleanup(1, str(e))
698
+
699
+ if distribution == "developer-id":
700
+ credentials = self._macos_notary_credentials()
701
+ with self.step(
702
+ f"[bold blue]Notarizing [cyan]{app_path.name}[/cyan] "
703
+ "(this can take a few minutes)...",
704
+ ):
705
+ notarize_and_staple(app_path, credentials, log=log)
706
+ console.log(
707
+ f"Notarized and stapled [cyan]{app_path.name}[/cyan] "
708
+ f"{self.emojis['checkmark']}"
709
+ )
710
+ except MacOSSigningError as e:
711
+ self.cleanup(1, str(e))
701
712
 
702
713
  def _sign_macos_app_store(
703
714
  self,
@@ -797,12 +808,14 @@ class Command(BaseBuildCommand):
797
808
  "or `[tool.flet.macos.info]` in pyproject.toml.",
798
809
  )
799
810
  if "ITSAppUsesNonExemptEncryption" not in info:
800
- console.log(
801
- "[yellow]Warning: ITSAppUsesNonExemptEncryption is not set in "
811
+ self.warn(
812
+ "ITSAppUsesNonExemptEncryption is not set in "
802
813
  "Info.plist — App Store Connect will ask the export-compliance "
803
814
  "question manually for every build. Set it with --info-plist "
804
815
  "ITSAppUsesNonExemptEncryption=False if your app only uses "
805
- "standard encryption.[/yellow]"
816
+ "standard encryption.",
817
+ title="App Store",
818
+ style="yellow",
806
819
  )
807
820
 
808
821
  profile_app_id = profile_application_identifier(profile_path)
@@ -845,17 +858,17 @@ class Command(BaseBuildCommand):
845
858
  f"{self.emojis['checkmark']}"
846
859
  )
847
860
 
848
- self.update_status(f"[bold blue]Packaging [cyan]{app_path.stem}.pkg[/cyan]...")
849
- pkg = build_pkg(
850
- app_path,
851
- installer,
852
- self.out_dir / f"{app_path.stem}.pkg",
853
- log=log,
854
- )
855
- console.log(
856
- f"Packaged [cyan]{pkg.name}[/cyan] for App Store Connect "
857
- f"(installer identity: {installer.name}) {self.emojis['checkmark']}"
858
- )
861
+ with self.step(f"[bold blue]Packaging [cyan]{app_path.stem}.pkg[/cyan]..."):
862
+ pkg = build_pkg(
863
+ app_path,
864
+ installer,
865
+ self.out_dir / f"{app_path.stem}.pkg",
866
+ log=log,
867
+ )
868
+ console.log(
869
+ f"Packaged [cyan]{pkg.name}[/cyan] for App Store Connect "
870
+ f"(installer identity: {installer.name}) {self.emojis['checkmark']}"
871
+ )
859
872
 
860
873
  def _macos_notary_credentials(self) -> NotaryCredentials:
861
874
  """