public void FoundDistinctListOfServiceNames()
        {
            int call = 0;
            Func <string, string, SearchOption, IEnumerable <string> > enumerateFiles = (string path, string searchFilter, SearchOption options) => {
                //Call 0 will results in: AWSSDK.ServiceA.dll, AWSSDK.ServiceB.dll, AWSSDK.ServiceC.dll
                //Call 1 will results in: AWSSDK.ServiceA.dll, AWSSDK.ServiceB.dll, AWSSDK.ServiceD.dll
                var files = new List <string>
                {
                    "AWSSDK.ServiceA.dll",
                    "AWSSDK.ServiceB.dll",
                    $"AWSSDK.Service{(call == 0 ? 'C': 'D')}.dll"
                };

                call++;
                return(files);
            };

            var allFoundSdkAssemblies = GenerationSources.SDKFindAssemblyFilenames("test", enumerateFiles);

            //Ensure the two lists of files have been union to the distinct list: ServiceA, ServiceB, ServiceC, ServiceD
            CollectionAssert.AreEqual(new List <string> {
                "ServiceA", "ServiceB", "ServiceC", "ServiceD"
            },
                                      new List <string>(allFoundSdkAssemblies));
        }
Esempio n. 2
0
        protected override void GenerateHelper()
        {
            CmdletsOutputPath = Path.Combine(OutputFolder, CmdletsOutputSubFoldername);
            var configurationsFolder        = Path.Combine(Options.RootPath, ConfigurationFolderName);
            var serviceConfigurationsFolder = Path.Combine(configurationsFolder, ServiceConfigFoldername);

            ModelCollection = ConfigModelCollection.LoadAllConfigs(configurationsFolder, Options.Verbose);

            XmlOverridesMerger.ApplyOverrides(Options.RootPath, ModelCollection, serviceConfigurationsFolder);

            SourceArtifacts = new GenerationSources(OutputFolder, SdkNugetFolder, Options.VersionNumber);
            LoadCoreSDKRuntimeMaterials();
            LoadSpecialServiceAssemblies();

            CheckForServicePrefixDuplication();

            if (!Options.SkipCmdletGeneration)
            {
                //We clean and setup service folders, some services share a folder, project and module, so we use distinct
                foreach (var project in ModelCollection.ConfigModels.Values
                         .Where(service => !service.SkipCmdletGeneration)
                         .GroupBy(folder => folder.AssemblyName))
                {
                    var modelsWithGuid = project.Where(model => !string.IsNullOrWhiteSpace(model.ServiceModuleGuid));
                    if (modelsWithGuid.Count() > 1)
                    {
                        AnalysisError.DuplicatedAssemblyName(modelsWithGuid);
                    }

                    SetupOutputDir(project.Key);
                }
            }

            foreach (var configModel in ModelCollection.ConfigModels.Values)
            {
                // hold some state to model under work so we can make use of
                // static helpers
                CurrentModel = configModel;

                try
                {
                    Logger.Log("=======================================================");
                    Logger.Log("Processing service: {0}", CurrentModel.ServiceName);

                    LoadCurrentService(CurrentModel);

                    if (!Options.SkipCmdletGeneration)
                    {
                        GenerateClientAndCmdlets();
                        // if the service contains any hand-maintained cmdlets, scan them to update the
                        // argument completers for any use of ConstantClass-derived types
                        ScanAdvancedCmdletsForServices();
                        GenerateArgumentCompleters();
                        ProcessLegacyAliasesForCustomCmdlets();

                        CheckForCmdletNameDuplication();
                    }
                }
                catch (Exception e)
                {
                    AnalysisError.ExceptionWhileGeneratingForService(CurrentModel, e);
                }
            }

            if (!Options.SkipCmdletGeneration)
            {
                ScanAdvancedCmdletsForCommonModule();

                SourceArtifacts.WriteLegacyAliasesFile(LegacyAliases, ModelCollection.CommonModuleAliases);
                SourceArtifacts.WriteMonolithicCompletionScriptsFile(GetArgumentCompletionScriptContent());
                SourceArtifacts.WriteMonolithicProjectFile();
                SourceArtifacts.WriteMonolithicModuleFiles();
                SourceArtifacts.WriteAdditionalAliasesFiles(Aliases);

                SourceArtifacts.WriteModularSolution(ModelCollection.ConfigModels.Values);
                SourceArtifacts.WriteCopyModularArtifactsScript(ModelCollection.ConfigModels.Values);

                SourceArtifacts.WriteCmdletsList(ModelCollection.ConfigModels.Values);
                SourceArtifacts.WriteCommonModule(CommonAdvancedCmdlets.Keys, ModelCollection.CommonModuleAliases);
                SourceArtifacts.WriteCommonProjectFile();
                SourceArtifacts.WriteLegacyAliasesFileForCommonModule(ModelCollection.CommonModuleAliases);
                SourceArtifacts.WriteCommonCompletionScriptsFile();
                SourceArtifacts.WriteCommonModuleCmdletsList(ModelCollection.ConfigModels.Values);

                SourceArtifacts.WriteModularProjectFiles(ModelCollection.ConfigModels.Values);
                SourceArtifacts.WriteLegacyAliasesModularFiles(LegacyAliases, ModelCollection.ConfigModels.Values);
                SourceArtifacts.WriteCompletersModularFiles(ModelCollection.ConfigModels.Values);
                SourceArtifacts.WriteModularManifestFiles(ModelCollection.ConfigModels.Values, LegacyAliases);

                SourceArtifacts.WriteVersionFile();

                WriteConfigurationChanges();
            }

            foreach (var configModel in ModelCollection.ConfigModels.Values)
            {
                foreach (var error in configModel.AnalysisErrors.Concat(
                             configModel.ServiceOperationsList
                             .OrderBy(so => so.MethodName)
                             .SelectMany(operation => operation.AnalysisErrors)))
                {
                    Logger.LogError(error.ToString());
                }
            }
        }