cumulusci-plus 5.0.18__py3-none-any.whl → 5.0.20__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.

Potentially problematic release.


This version of cumulusci-plus might be problematic. Click here for more details.

cumulusci/__about__.py CHANGED
@@ -1 +1 @@
1
- __version__ = "5.0.18"
1
+ __version__ = "5.0.20"
@@ -255,7 +255,9 @@ class UnmanagedDependency(UnmanagedStaticDependency, ABC):
255
255
 
256
256
  return package_zip
257
257
 
258
- def install(self, context: BaseProjectConfig, org: OrgConfig):
258
+ def install(
259
+ self, context: BaseProjectConfig, org: OrgConfig, options: Optional[dict] = {}
260
+ ):
259
261
 
260
262
  context.logger.info(f"Deploying unmanaged metadata from {self.description}")
261
263
 
@@ -411,6 +413,7 @@ class VcsDynamicDependency(BaseVcsDynamicDependency, ABC):
411
413
  unmanaged=not managed,
412
414
  namespace_inject=namespace if namespace and managed else None,
413
415
  namespace_strip=namespace if namespace and not managed else None,
416
+ package_dependency=self.package_dependency,
414
417
  )
415
418
  ]
416
419
  return []
@@ -446,6 +449,7 @@ class VcsDynamicDependency(BaseVcsDynamicDependency, ABC):
446
449
  namespace_strip=namespace
447
450
  if namespace and not managed
448
451
  else None,
452
+ package_dependency=self.package_dependency,
449
453
  )
450
454
  )
451
455
 
@@ -493,22 +497,22 @@ class VcsDynamicDependency(BaseVcsDynamicDependency, ABC):
493
497
 
494
498
  # Look for any flow to executed in project config
495
499
  # Pre flows will run to dynamically generate metadata and deploy.
496
- deps.extend(
497
- self._flatten_dependency_flow(
498
- package_config,
499
- "dependency_flow_pre",
500
- managed=False,
501
- namespace=namespace,
502
- )
500
+ flow = self._flatten_dependency_flow(
501
+ package_config,
502
+ "dependency_flow_pre",
503
+ managed=False,
504
+ namespace=namespace,
503
505
  )
504
-
505
- # Look for subfolders under unpackaged/pre
506
- # unpackaged/pre is always deployed unmanaged, no namespace manipulation.
507
- deps.extend(
508
- self._flatten_unpackaged(
509
- repo, "unpackaged/pre", self.skip, managed=False, namespace=None
506
+ if flow:
507
+ deps.extend(flow)
508
+ else:
509
+ # Look for subfolders under unpackaged/pre
510
+ # unpackaged/pre is always deployed unmanaged, no namespace manipulation.
511
+ deps.extend(
512
+ self._flatten_unpackaged(
513
+ repo, "unpackaged/pre", self.skip, managed=False, namespace=None
514
+ )
510
515
  )
511
- )
512
516
 
513
517
  if not self.package_dependency:
514
518
  if managed:
@@ -532,25 +536,26 @@ class VcsDynamicDependency(BaseVcsDynamicDependency, ABC):
532
536
 
533
537
  # Look for any flow to executed in project config
534
538
  # Pre flows will run to dynamically generate metadata and deploy.
535
- deps.extend(
536
- self._flatten_dependency_flow(
537
- package_config,
538
- "dependency_flow_post",
539
- managed=managed,
540
- namespace=namespace,
541
- )
539
+ flow = self._flatten_dependency_flow(
540
+ package_config,
541
+ "dependency_flow_post",
542
+ managed=managed,
543
+ namespace=namespace,
542
544
  )
543
545
 
544
- # We always inject the project's namespace into unpackaged/post metadata if managed
545
- deps.extend(
546
- self._flatten_unpackaged(
547
- repo,
548
- "unpackaged/post",
549
- self.skip,
550
- managed=managed,
551
- namespace=namespace,
546
+ if flow:
547
+ deps.extend(flow)
548
+ else:
549
+ # We always inject the project's namespace into unpackaged/post metadata if managed
550
+ deps.extend(
551
+ self._flatten_unpackaged(
552
+ repo,
553
+ "unpackaged/post",
554
+ self.skip,
555
+ managed=managed,
556
+ namespace=namespace,
557
+ )
552
558
  )
553
- )
554
559
 
555
560
  return deps
556
561
 
@@ -574,6 +579,9 @@ class UnmanagedVcsDependency(UnmanagedDependency, ABC):
574
579
  namespace_inject: Optional[str] = None
575
580
  namespace_strip: Optional[str] = None
576
581
 
582
+ # Field to reference corresponding package dependency
583
+ package_dependency: Optional["BasePackageVersionDependency"] = None
584
+
577
585
  @root_validator(pre=True)
578
586
  @abstractmethod
579
587
  def sync_vcs_and_url(cls, values):
@@ -619,6 +627,19 @@ class UnmanagedVcsDependency(UnmanagedDependency, ABC):
619
627
 
620
628
  return f"{self.url}{subfolder} @{self.ref}"
621
629
 
630
+ def install(
631
+ self, context: BaseProjectConfig, org: OrgConfig, options: Optional[dict] = {}
632
+ ):
633
+ if (
634
+ self.package_dependency is not None
635
+ and not self.package_dependency.is_installable(org, options)
636
+ ):
637
+ context.logger.info(
638
+ f"{self.description} or a newer version is already deployed; skipping."
639
+ )
640
+ return
641
+ super().install(context, org)
642
+
622
643
 
623
644
  class UnmanagedVcsDependencyFlow(UnmanagedStaticDependency, ABC):
624
645
  vcs: str
@@ -632,6 +653,9 @@ class UnmanagedVcsDependencyFlow(UnmanagedStaticDependency, ABC):
632
653
  namespace_strip: Optional[str] = None
633
654
  password_env_name: Optional[str] = None
634
655
 
656
+ # Field to reference corresponding package dependency
657
+ package_dependency: Optional["BasePackageVersionDependency"] = None
658
+
635
659
  @property
636
660
  def name(self):
637
661
  return f"Deploy {self.url} Flow: {self.flow_name}"
@@ -640,7 +664,18 @@ class UnmanagedVcsDependencyFlow(UnmanagedStaticDependency, ABC):
640
664
  def description(self):
641
665
  return f"{self.url} Flow: {self.flow_name} @{self.commit}"
642
666
 
643
- def install(self, context: BaseProjectConfig, org: OrgConfig):
667
+ def install(
668
+ self, context: BaseProjectConfig, org: OrgConfig, options: Optional[dict] = {}
669
+ ):
670
+ if (
671
+ self.package_dependency is not None
672
+ and not self.package_dependency.is_installable(org, options)
673
+ ):
674
+ context.logger.info(
675
+ f"{self.description} or a newer version is already deployed; skipping."
676
+ )
677
+ return
678
+
644
679
  context.logger.info(f"Deploying dependency Flow from {self.description}")
645
680
 
646
681
  from cumulusci.utils.yaml.cumulusci_yml import VCSSourceModel
@@ -656,7 +691,6 @@ class UnmanagedVcsDependencyFlow(UnmanagedStaticDependency, ABC):
656
691
  vcs_source = VCSSource.create(context, source_model)
657
692
 
658
693
  # Fetch the data and get remote project config.
659
- context.logger.info(f"Fetching from {vcs_source}")
660
694
  project_config = vcs_source.fetch()
661
695
 
662
696
  project_config.set_keychain(context.keychain)
@@ -708,3 +742,13 @@ class UnmanagedVcsDependencyFlow(UnmanagedStaticDependency, ABC):
708
742
  coordinator.run(org)
709
743
  duration = datetime.now() - start_time
710
744
  context.logger.info(f"Ran {self.flow_name} in {format_duration(duration)}")
745
+
746
+
747
+ class BasePackageVersionDependency(StaticDependency, ABC):
748
+ @abstractmethod
749
+ def is_installable(self, org: OrgConfig, options: Optional[dict] = {}) -> bool:
750
+ pass
751
+
752
+
753
+ UnmanagedVcsDependency.update_forward_refs()
754
+ UnmanagedVcsDependencyFlow.update_forward_refs()
@@ -20,7 +20,7 @@ from cumulusci.utils import download_extract_zip
20
20
  logger = logging.getLogger(__name__)
21
21
 
22
22
 
23
- class PackageNamespaceVersionDependency(base_dependency.StaticDependency):
23
+ class PackageNamespaceVersionDependency(base_dependency.BasePackageVersionDependency):
24
24
  """Static dependency on a package identified by namespace and version number."""
25
25
 
26
26
  namespace: str
@@ -34,6 +34,21 @@ class PackageNamespaceVersionDependency(base_dependency.StaticDependency):
34
34
  def package(self):
35
35
  return self.package_name or self.namespace or "Unknown Package"
36
36
 
37
+ def is_installable(self, org: OrgConfig, options: Optional[dict] = {}) -> bool:
38
+ if "Beta" in self.version:
39
+ version_string = self.version.split(" ")[0]
40
+ beta = self.version.split(" ")[-1].strip(")")
41
+ version = f"{version_string}b{beta}"
42
+ else:
43
+ version = self.version
44
+
45
+ if org.has_minimum_package_version(
46
+ self.namespace,
47
+ version,
48
+ ):
49
+ return False
50
+ return True
51
+
37
52
  def install(
38
53
  self,
39
54
  context: BaseProjectConfig,
@@ -48,17 +63,7 @@ class PackageNamespaceVersionDependency(base_dependency.StaticDependency):
48
63
  if not retry_options:
49
64
  retry_options = DEFAULT_PACKAGE_RETRY_OPTIONS
50
65
 
51
- if "Beta" in self.version:
52
- version_string = self.version.split(" ")[0]
53
- beta = self.version.split(" ")[-1].strip(")")
54
- version = f"{version_string}b{beta}"
55
- else:
56
- version = self.version
57
-
58
- if org.has_minimum_package_version(
59
- self.namespace,
60
- version,
61
- ):
66
+ if not self.is_installable(org):
62
67
  context.logger.info(
63
68
  f"{self} or a newer version is already installed; skipping."
64
69
  )
@@ -83,7 +88,7 @@ class PackageNamespaceVersionDependency(base_dependency.StaticDependency):
83
88
  return f"{self.package} {self.version}"
84
89
 
85
90
 
86
- class PackageVersionIdDependency(base_dependency.StaticDependency):
91
+ class PackageVersionIdDependency(base_dependency.BasePackageVersionDependency):
87
92
  """Static dependency on a package identified by 04t version id."""
88
93
 
89
94
  version_id: str
@@ -96,6 +101,14 @@ class PackageVersionIdDependency(base_dependency.StaticDependency):
96
101
  def package(self):
97
102
  return self.package_name or "Unknown Package"
98
103
 
104
+ def is_installable(self, org: OrgConfig, options: Optional[dict] = {}) -> bool:
105
+ if any(
106
+ self.version_id == v.id
107
+ for v in itertools.chain(*org.installed_packages.values())
108
+ ) and not options.get("force_pre_post_install"):
109
+ return False
110
+ return True
111
+
99
112
  def install(
100
113
  self,
101
114
  context: BaseProjectConfig,
@@ -110,10 +123,7 @@ class PackageVersionIdDependency(base_dependency.StaticDependency):
110
123
  if not retry_options:
111
124
  retry_options = DEFAULT_PACKAGE_RETRY_OPTIONS
112
125
 
113
- if any(
114
- self.version_id == v.id
115
- for v in itertools.chain(*org.installed_packages.values())
116
- ):
126
+ if not self.is_installable(org):
117
127
  context.logger.info(
118
128
  f"{self} or a newer version is already installed; skipping."
119
129
  )
@@ -256,6 +256,8 @@ class TestGitHubDynamicDependency:
256
256
  namespace="bar", version="2.0"
257
257
  )
258
258
 
259
+ root_repo = PackageNamespaceVersionDependency(namespace="bar", version="2.0")
260
+
259
261
  assert gh.flatten(project_config) == [
260
262
  GitHubDynamicDependency(
261
263
  github="https://github.com/SFDO-Tooling/DependencyRepo",
@@ -266,20 +268,23 @@ class TestGitHubDynamicDependency:
266
268
  subfolder="unpackaged/pre/first",
267
269
  unmanaged=True,
268
270
  ref="aaaaa",
271
+ package_dependency=root_repo,
269
272
  ),
270
273
  UnmanagedGitHubRefDependency(
271
274
  github="https://github.com/SFDO-Tooling/RootRepo",
272
275
  subfolder="unpackaged/pre/second",
273
276
  unmanaged=True,
274
277
  ref="aaaaa",
278
+ package_dependency=root_repo,
275
279
  ),
276
- PackageNamespaceVersionDependency(namespace="bar", version="2.0"),
280
+ root_repo,
277
281
  UnmanagedGitHubRefDependency(
278
282
  github="https://github.com/SFDO-Tooling/RootRepo",
279
283
  subfolder="unpackaged/post/first",
280
284
  unmanaged=False,
281
285
  ref="aaaaa",
282
286
  namespace_inject="bar",
287
+ package_dependency=root_repo,
283
288
  ),
284
289
  ]
285
290
 
@@ -295,6 +300,8 @@ class TestGitHubDynamicDependency:
295
300
  namespace="bar", version="2.0"
296
301
  )
297
302
 
303
+ root_repo = PackageNamespaceVersionDependency(namespace="bar", version="2.0")
304
+
298
305
  assert gh.flatten(project_config) == [
299
306
  GitHubDynamicDependency(
300
307
  github="https://github.com/SFDO-Tooling/DependencyRepo",
@@ -305,14 +312,16 @@ class TestGitHubDynamicDependency:
305
312
  subfolder="unpackaged/pre/second",
306
313
  unmanaged=True,
307
314
  ref="aaaaa",
315
+ package_dependency=root_repo,
308
316
  ),
309
- PackageNamespaceVersionDependency(namespace="bar", version="2.0"),
317
+ root_repo,
310
318
  UnmanagedGitHubRefDependency(
311
319
  github="https://github.com/SFDO-Tooling/RootRepo",
312
320
  subfolder="unpackaged/post/first",
313
321
  unmanaged=False,
314
322
  ref="aaaaa",
315
323
  namespace_inject="bar",
324
+ package_dependency=root_repo,
316
325
  ),
317
326
  ]
318
327
 
@@ -1086,14 +1095,11 @@ class TestUnmanagedVcsDependencyFlow:
1086
1095
 
1087
1096
  # Verify logging
1088
1097
  assert (
1089
- mock_context.logger.info.call_count == 3
1098
+ mock_context.logger.info.call_count == 2
1090
1099
  ) # Initial log, fetching log, final log
1091
1100
  mock_context.logger.info.assert_any_call(
1092
1101
  "Deploying dependency Flow from https://github.com/test/repo Flow: install_deps @abc123"
1093
1102
  )
1094
- mock_context.logger.info.assert_any_call(
1095
- f"Fetching from {mock_vcs_source_instance}"
1096
- )
1097
1103
  mock_context.logger.info.assert_any_call("Ran install_deps in 5.2s")
1098
1104
 
1099
1105
  # Verify datetime and format_duration calls
@@ -767,6 +767,16 @@ class TestStaticDependencyResolution:
767
767
 
768
768
  gh = GitHubDynamicDependency(github="https://github.com/SFDO-Tooling/RootRepo")
769
769
 
770
+ dep_repo = PackageNamespaceVersionDependency(
771
+ namespace="foo",
772
+ version="1.1",
773
+ package_name="DependencyRepo",
774
+ password_env_name="DEP_PW",
775
+ )
776
+ root_repo = PackageNamespaceVersionDependency(
777
+ namespace="bar", version="2.0", package_name="RootRepo"
778
+ )
779
+
770
780
  assert get_static_dependencies(
771
781
  project_config,
772
782
  dependencies=[gh],
@@ -777,41 +787,39 @@ class TestStaticDependencyResolution:
777
787
  subfolder="unpackaged/pre/top",
778
788
  unmanaged=True,
779
789
  ref="tag_sha",
790
+ package_dependency=dep_repo,
780
791
  ),
781
- PackageNamespaceVersionDependency(
782
- namespace="foo",
783
- version="1.1",
784
- package_name="DependencyRepo",
785
- password_env_name="DEP_PW",
786
- ),
792
+ dep_repo,
787
793
  UnmanagedGitHubRefDependency(
788
794
  github="https://github.com/SFDO-Tooling/DependencyRepo",
789
795
  subfolder="unpackaged/post/top",
790
796
  unmanaged=False,
791
797
  ref="tag_sha",
792
798
  namespace_inject="foo",
799
+ package_dependency=dep_repo,
793
800
  ),
794
801
  UnmanagedGitHubRefDependency(
795
802
  github="https://github.com/SFDO-Tooling/RootRepo",
796
803
  subfolder="unpackaged/pre/first",
797
804
  unmanaged=True,
798
805
  ref="tag_sha",
806
+ package_dependency=root_repo,
799
807
  ),
800
808
  UnmanagedGitHubRefDependency(
801
809
  github="https://github.com/SFDO-Tooling/RootRepo",
802
810
  subfolder="unpackaged/pre/second",
803
811
  unmanaged=True,
804
812
  ref="tag_sha",
813
+ package_dependency=root_repo,
805
814
  ),
806
- PackageNamespaceVersionDependency(
807
- namespace="bar", version="2.0", package_name="RootRepo"
808
- ),
815
+ root_repo,
809
816
  UnmanagedGitHubRefDependency(
810
817
  github="https://github.com/SFDO-Tooling/RootRepo",
811
818
  subfolder="unpackaged/post/first",
812
819
  unmanaged=False,
813
820
  ref="tag_sha",
814
821
  namespace_inject="bar",
822
+ package_dependency=root_repo,
815
823
  ),
816
824
  ]
817
825
 
@@ -855,50 +863,58 @@ version_id: 04t000000000000""",
855
863
  pins=pins,
856
864
  )
857
865
 
866
+ dep_repo = PackageNamespaceVersionDependency(
867
+ namespace="foo",
868
+ version="1.0", # from the pinned tag
869
+ package_name="DependencyRepo",
870
+ version_id="04t000000000000",
871
+ )
872
+ root_repo = PackageNamespaceVersionDependency(
873
+ namespace="bar",
874
+ version="1.5", # From pinned tag
875
+ package_name="RootRepo",
876
+ version_id="04t000000000000",
877
+ )
878
+
858
879
  assert deps == [
859
880
  UnmanagedGitHubRefDependency(
860
881
  github="https://github.com/SFDO-Tooling/DependencyRepo",
861
882
  subfolder="unpackaged/pre/top",
862
883
  unmanaged=True,
863
884
  ref="tag_sha",
885
+ package_dependency=dep_repo,
864
886
  ),
865
- PackageNamespaceVersionDependency(
866
- namespace="foo",
867
- version="1.0", # from the pinned tag
868
- package_name="DependencyRepo",
869
- version_id="04t000000000000",
870
- ),
887
+ dep_repo,
871
888
  UnmanagedGitHubRefDependency(
872
889
  github="https://github.com/SFDO-Tooling/DependencyRepo",
873
890
  subfolder="unpackaged/post/top",
874
891
  unmanaged=False,
875
892
  ref="tag_sha",
876
893
  namespace_inject="foo",
894
+ package_dependency=dep_repo,
877
895
  ),
878
896
  UnmanagedGitHubRefDependency(
879
897
  github="https://github.com/SFDO-Tooling/RootRepo",
880
898
  subfolder="unpackaged/pre/first",
881
899
  unmanaged=True,
882
900
  ref="tag_sha",
901
+ package_dependency=root_repo,
883
902
  ),
884
903
  UnmanagedGitHubRefDependency(
885
904
  github="https://github.com/SFDO-Tooling/RootRepo",
886
905
  subfolder="unpackaged/pre/second",
887
906
  unmanaged=True,
888
907
  ref="tag_sha",
908
+ package_dependency=root_repo,
889
909
  ),
890
- PackageNamespaceVersionDependency(
891
- namespace="bar",
892
- version="1.5", # From pinned tag
893
- package_name="RootRepo",
894
- version_id="04t000000000000",
895
- ),
910
+ root_repo,
896
911
  UnmanagedGitHubRefDependency(
897
912
  github="https://github.com/SFDO-Tooling/RootRepo",
898
913
  subfolder="unpackaged/post/first",
899
914
  unmanaged=False,
900
915
  ref="tag_sha",
901
916
  namespace_inject="bar",
917
+ package_dependency=root_repo,
902
918
  ),
903
919
  ]
904
920
 
@@ -938,6 +954,16 @@ version_id: 04t000000000000""",
938
954
 
939
955
  gh = GitHubDynamicDependency(github="https://github.com/SFDO-Tooling/RootRepo")
940
956
 
957
+ root_repo = PackageNamespaceVersionDependency(
958
+ namespace="bar", version="2.0", package_name="RootRepo"
959
+ )
960
+ dep_repo = PackageNamespaceVersionDependency(
961
+ namespace="foo",
962
+ version="1.1", # from the pinned tag
963
+ package_name="DependencyRepo",
964
+ password_env_name="DEP_PW",
965
+ )
966
+
941
967
  assert get_static_dependencies(
942
968
  project_config,
943
969
  dependencies=[gh],
@@ -949,6 +975,7 @@ version_id: 04t000000000000""",
949
975
  subfolder="unpackaged/pre/top",
950
976
  unmanaged=True,
951
977
  ref="tag_sha",
978
+ package_dependency=dep_repo,
952
979
  ),
953
980
  UnmanagedGitHubRefDependency(
954
981
  github="https://github.com/SFDO-Tooling/DependencyRepo",
@@ -956,28 +983,30 @@ version_id: 04t000000000000""",
956
983
  unmanaged=False,
957
984
  ref="tag_sha",
958
985
  namespace_inject="foo",
986
+ package_dependency=dep_repo,
959
987
  ),
960
988
  UnmanagedGitHubRefDependency(
961
989
  github="https://github.com/SFDO-Tooling/RootRepo",
962
990
  subfolder="unpackaged/pre/first",
963
991
  unmanaged=True,
964
992
  ref="tag_sha",
993
+ package_dependency=root_repo,
965
994
  ),
966
995
  UnmanagedGitHubRefDependency(
967
996
  github="https://github.com/SFDO-Tooling/RootRepo",
968
997
  subfolder="unpackaged/pre/second",
969
998
  unmanaged=True,
970
999
  ref="tag_sha",
1000
+ package_dependency=root_repo,
971
1001
  ),
972
- PackageNamespaceVersionDependency(
973
- namespace="bar", version="2.0", package_name="RootRepo"
974
- ),
1002
+ root_repo,
975
1003
  UnmanagedGitHubRefDependency(
976
1004
  github="https://github.com/SFDO-Tooling/RootRepo",
977
1005
  subfolder="unpackaged/post/first",
978
1006
  unmanaged=False,
979
1007
  ref="tag_sha",
980
1008
  namespace_inject="bar",
1009
+ package_dependency=root_repo,
981
1010
  ),
982
1011
  ]
983
1012
 
@@ -994,6 +1023,10 @@ version_id: 04t000000000000""",
994
1023
 
995
1024
  gh = GitHubDynamicDependency(github="https://github.com/SFDO-Tooling/RootRepo")
996
1025
 
1026
+ root_repo = PackageNamespaceVersionDependency(
1027
+ namespace="bar", version="2.0", package_name="RootRepo"
1028
+ )
1029
+
997
1030
  assert get_static_dependencies(
998
1031
  project_config,
999
1032
  dependencies=[gh],
@@ -1007,21 +1040,22 @@ version_id: 04t000000000000""",
1007
1040
  subfolder="unpackaged/pre/first",
1008
1041
  unmanaged=True,
1009
1042
  ref="tag_sha",
1043
+ package_dependency=root_repo,
1010
1044
  ),
1011
1045
  UnmanagedGitHubRefDependency(
1012
1046
  github="https://github.com/SFDO-Tooling/RootRepo",
1013
1047
  subfolder="unpackaged/pre/second",
1014
1048
  unmanaged=True,
1015
1049
  ref="tag_sha",
1050
+ package_dependency=root_repo,
1016
1051
  ),
1017
- PackageNamespaceVersionDependency(
1018
- namespace="bar", version="2.0", package_name="RootRepo"
1019
- ),
1052
+ root_repo,
1020
1053
  UnmanagedGitHubRefDependency(
1021
1054
  github="https://github.com/SFDO-Tooling/RootRepo",
1022
1055
  subfolder="unpackaged/post/first",
1023
1056
  unmanaged=False,
1024
1057
  ref="tag_sha",
1025
1058
  namespace_inject="bar",
1059
+ package_dependency=root_repo,
1026
1060
  ),
1027
1061
  ]
cumulusci/cumulusci.yml CHANGED
@@ -823,10 +823,6 @@ tasks:
823
823
  class_path: cumulusci.tasks.salesforce.SfDataCommands.DataCreateRecordTask
824
824
  description: "Executes the `sf data create` command against an org"
825
825
  group: SalesforceDX Data Commands
826
- get_first_item_from_record_list:
827
- class_path: cumulusci.tasks.utility.data_management.GetFirstItemFromRecordListTask
828
- description: "Get the first item from a record list"
829
- group: Utilities
830
826
  flows:
831
827
  ci_beta:
832
828
  group: Continuous Integration