PhoenixGenerator  3.4.0
Generate code from template files and projects in C++, Rust, Python and wrapped C++ to Python
Loading...
Searching...
No Matches
project_generator_load.h File Reference
#include "PPath.h"
#include "PPackageAttribute.h"
#include "PProjectMembers.h"
Include dependency graph for project_generator_load.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  ProjectConfig
 Configuration of the project. More...

Typedefs

typedef std::map< PString, PPackageAttribute > PackageMap
typedef std::map< PString, PProjectMembers > ProjectMembersMap

Functions

bool project_generator_loadConfig (ProjectConfig &config, const PPath &descriptionFile)
 Load the project configuration.
bool project_generator_loadPackageInfo (ProjectConfig &config)
 This function should load the package info file from share/PhoenixGenerator/Packages and retrieve the infos in the datastructure.

Typedef Documentation

◆ PackageMap

typedef std::map<PString, PPackageAttribute> PackageMap

Definition at line 14 of file project_generator_load.h.

◆ ProjectMembersMap

typedef std::map<PString, PProjectMembers> ProjectMembersMap

Definition at line 15 of file project_generator_load.h.

Function Documentation

◆ project_generator_loadConfig()

bool project_generator_loadConfig ( ProjectConfig & config,
const PPath & descriptionFile )

Load the project configuration.

Parameters
[out]config: loaded project configuration
descriptionFile: description of the full project
Returns
true on success, false otherwise

Definition at line 84 of file project_generator_load.cpp.

84 {
85 DicoValue dico;
86 if(!parser_toml(dico, descriptionFile)){
87 std::cerr << termRed() << "project_generator_loadConfig : cannot parse config file '"<<descriptionFile<<"'" << termDefault() << std::endl;
88 return false;
89 }
90 DicoValue * mapProject = dico.getMap("project");
91 if(mapProject == NULL){
92 std::cerr << termRed() << "project_generator_loadConfig : Missing [project] in config file '"<<descriptionFile<<"'" << termDefault() << std::endl;
93 return false;
94 }
95 const PVecString vecRequiredKey{"name", "url", "version", "description", "main_branch", "ci_toolkit_version", "ci_toolkit_url", "authors"};
96 PVecString vecMissingKey;
97 for(const PString & requiredKey : vecRequiredKey){
98 if(!mapProject->isKeyExist(requiredKey)){
99 vecMissingKey.push_back(requiredKey);
100 }
101 }
102 if(!vecMissingKey.empty()){
103 std::cerr << termRed() << "project_generator_loadConfig : missing required attribute(s) in [project] of config file '"<<descriptionFile<<"' : ";
104 for(size_t iMissingKey = 0LU; iMissingKey < vecMissingKey.size(); ++iMissingKey){
105 if(iMissingKey != 0LU){std::cerr << ", ";}
106 std::cerr << vecMissingKey[iMissingKey];
107 }
108 std::cerr << termDefault() << std::endl;
109 return false;
110 }
111 config.name = phoenix_get_string(*mapProject, "name", "MyAwesomeProject");
112 config.url = phoenix_get_string(*mapProject, "url", "need and url");
113 config.version = phoenix_get_string(*mapProject, "version", "0.1.0");
114 config.description = phoenix_get_string(*mapProject, "description", "A very important project");
115 config.mainBranch = phoenix_get_string(*mapProject, "main_branch", "main");
116 config.runnerTag = phoenix_get_string(*mapProject, "runner_tag", ""); //Could be MUST_big_runner
117 config.ciToolkitVersion = phoenix_get_string(*mapProject, "ci_toolkit_version", "8.1.4"); //Default version if not specified
118 config.ciToolkitUrl = phoenix_get_string(*mapProject, "ci_toolkit_url", "https://gitlab.in2p3.fr/CTA-LAPP/PHOENIX_LIBS2/citoolkit/phoenixcitoolkitcpp/phoenix-workflow-cpp");
119
120 //Authors
121 if(mapProject->isKeyExist("authors")){
122 const DicoValue * authorDico = mapProject->getMap("authors");
123 parseProjectMembers(config.authorMap, authorDico);
124 }
125 //Dependencies
126 if(mapProject->isKeyExist("dependencies")){
127 const DicoValue * depDico = mapProject->getMap("dependencies");
128 if(depDico != NULL && depDico->hasVec()){
129 const std::vector<DicoValue> & vecDep = depDico->getVecChild();
130 std::vector<PString> depList;
131 for(size_t iDep = 0; iDep < vecDep.size(); iDep++){
132 depList.push_back(vecDep[iDep].getString());
133 }
134 if(!project_generator_split_dependencies(config, depList)){
135 std::cerr << termRed() << "project_generator_loadConfig : cannot parse dependencies in config file '"<<descriptionFile<<"'" << termDefault() << std::endl;
136 return false;
137 }
138 }
139 }
140 return true;
141}
bool project_generator_split_dependencies(ProjectConfig &config, std::vector< PString > &vecDependencies)
Split dependencies strings into name, min_version, max_version and fill the map of dependencies.
bool parseProjectMembers(ProjectMembersMap &memberMap, const DicoValue *memberDico)
Parse project members (authors, maintainers, contributors) from TOML data.
PString description
Description of the project.
PString name
Name of the project.
ProjectMembersMap authorMap
Map of authors of the project.
PString runnerTag
Specific runner tag if needed (could be MUST_big_runner).
PString ciToolkitUrl
CI toolkit url.
PString ciToolkitVersion
Version of the Phoenix CI toolkit component (optional, defaults to 3.0.4).
PString url
Project url.
PString mainBranch
Main branch of hte project.
PString version
Project version.

References ProjectConfig::authorMap, ProjectConfig::ciToolkitUrl, ProjectConfig::ciToolkitVersion, ProjectConfig::description, ProjectConfig::mainBranch, ProjectConfig::name, parseProjectMembers(), project_generator_loadConfig(), project_generator_split_dependencies(), ProjectConfig::runnerTag, ProjectConfig::url, and ProjectConfig::version.

Referenced by project_generator_loadConfig(), and simple_project_generator().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ project_generator_loadPackageInfo()

bool project_generator_loadPackageInfo ( ProjectConfig & config)

This function should load the package info file from share/PhoenixGenerator/Packages and retrieve the infos in the datastructure.

Parameters
[out]config: project configuration to fill
Returns
true on success, false otherwise

Definition at line 239 of file project_generator_load.cpp.

239 {
240 // 1. Get all files in "share/PhoenixGenerator/Packages"
241 PPath packageDir = PPath(SYSTEM_INSTALL_DIR) / PPath("share") / PPath("PhoenixGenerator") / PPath("Packages");
242 std::cout << "Loading package info from directory '" << packageDir << "'." << std::endl;
243 PVecPath packageFileNames = packageDir.getAllFileInDir();
244 size_t packageNotFound = 0;
245
246 // 2. Search in toml files in PackageDir for each package, and fill other attributes if found
247 for(PackageMap::iterator it = config.mapDependencies.begin(); it != config.mapDependencies.end(); ++it){
248 const PString & name = it->first;
249 PPackageAttribute & pkgAttr = it->second;
250
251 if(!is_package_in_dir(packageFileNames, name, packageDir, pkgAttr)){
252 PPath localPackageDir = PPath::getCurrentDirectory() / PPath("Packages");
253 std::cout << "saving file in local dir: " << localPackageDir << std::endl;
254 PPath tomlFile = localPackageDir / PPath(name + ".toml");
255 if(localPackageDir.isDirectoryExist()){
256 PVecPath localPackageFileNames = localPackageDir.getAllFileInDir();
257 if(!is_package_in_dir(localPackageFileNames, name, localPackageDir, pkgAttr)){
258 is_generate_empty_config_ok(tomlFile, name, pkgAttr);
259 packageNotFound++;
260 }
261 }
262 //If the folder does not exists it means that the package we are looking for is unknown, so we create an empty config file inside the new created Packages/ directory
263 else{
264 localPackageDir.createDirectory();
265 is_generate_empty_config_ok(tomlFile, name, pkgAttr);
266 packageNotFound++;
267 }
268 }
269 }
270 if(packageNotFound != 0){
271 std::cout << termRed() << packageNotFound << " package(s) not found in the package directory." << termDefault() << std::endl;
272 }
273 return packageNotFound == 0;
274}
Describes a package attributes.
bool is_package_in_dir(std::vector< PPath > &packageFileNames, const PString &name, const PPath &packageDir, PPackageAttribute &pkgAttr)
Search the package in the package directory.
void is_generate_empty_config_ok(PPath &tomlFile, const PString &name, PPackageAttribute &pkgAttr)
Generate an empty package info file skeleton and notify the user.
PackageMap mapDependencies
Map of all dependencies of the project with structure PPackageAttribute values.

References is_generate_empty_config_ok(), is_package_in_dir(), ProjectConfig::mapDependencies, and project_generator_loadPackageInfo().

Referenced by project_generator_loadPackageInfo(), and simple_project_generator().

Here is the call graph for this function:
Here is the caller graph for this function: