{"id":42212895,"url":"https://github.com/foliant-docs/foliantcontrib.multiproject","last_synced_at":"2026-02-26T10:58:55.981Z","repository":{"id":57431757,"uuid":"129287218","full_name":"foliant-docs/foliantcontrib.multiproject","owner":"foliant-docs","description":"Extension for Foliant to generate the documentation from multiple sources.","archived":false,"fork":false,"pushed_at":"2025-10-14T13:16:27.000Z","size":51,"stargazers_count":1,"open_issues_count":3,"forks_count":1,"subscribers_count":1,"default_branch":"develop","last_synced_at":"2026-01-27T10:19:18.886Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/foliant-docs.png","metadata":{"files":{"readme":"README.md","changelog":"changelog.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2018-04-12T17:20:58.000Z","updated_at":"2025-09-23T08:10:37.000Z","dependencies_parsed_at":"2025-04-17T10:24:11.262Z","dependency_job_id":"922f89f4-e46a-4c07-86a1-fbf53c7b9121","html_url":"https://github.com/foliant-docs/foliantcontrib.multiproject","commit_stats":{"total_commits":50,"total_committers":3,"mean_commits":"16.666666666666668","dds":0.06000000000000005,"last_synced_commit":"84cd3a234dfd3f14bdfe119e4ef1f0652077b906"},"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/foliant-docs/foliantcontrib.multiproject","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foliant-docs%2Ffoliantcontrib.multiproject","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foliant-docs%2Ffoliantcontrib.multiproject/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foliant-docs%2Ffoliantcontrib.multiproject/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foliant-docs%2Ffoliantcontrib.multiproject/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/foliant-docs","download_url":"https://codeload.github.com/foliant-docs/foliantcontrib.multiproject/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foliant-docs%2Ffoliantcontrib.multiproject/sbom","scorecard":{"id":406091,"data":{"date":"2025-08-11","repo":{"name":"github.com/foliant-docs/foliantcontrib.multiproject","commit":"4350e3a799f04f6bdc1d72e8ed27408d23b40580"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Code-Review","score":0,"reason":"Found 1/25 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'develop'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 7 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-18T21:17:49.481Z","repository_id":57431757,"created_at":"2025-08-18T21:17:49.481Z","updated_at":"2025-08-18T21:17:49.481Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29856783,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-26T08:51:08.701Z","status":"ssl_error","status_checked_at":"2026-02-26T08:50:19.607Z","response_time":89,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-01-27T01:06:52.292Z","updated_at":"2026-02-26T10:58:55.969Z","avatar_url":"https://github.com/foliant-docs.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![](https://img.shields.io/pypi/v/foliantcontrib.multiproject.svg)](https://pypi.org/project/foliantcontrib.multiproject/) [![](https://img.shields.io/github/v/tag/foliant-docs/foliantcontrib.multiproject.svg?label=GitHub)](https://github.com/foliant-docs/foliantcontrib.multiproject)\n\n# MultiProject Extension\n\nMultiProject is an extension for Foliant to generate the documentation from multiple sources. MultiProject consists of three parts:\n\n* extension for `foliant.config` package to resolve the `!from` YAML tag;\n* CLI extension for the `src` command;\n* RepoLink preprocessor;\n* Includesmap preprocessor.\n\n## Installation\n\n```bash\n$ pip install foliantcontrib.multiproject\n```\n\n## Config Extension to Resolve the !from Tag\n\nThis extension resolves the `!from` YAML tag in the project config and replaces the value of the tag with `chapters` section of related subproject.\n\nNested subprojects are processed recursively.\n\n### Usage of the Config Extension\n\nThe subproject location may be specified as a local path, or as a Git repository with optional revision (branch name, commit hash or another reference).\n\nExample of `chapters` section in the project config:\n\n```yaml\nchapters:\n    - index.md\n    - !from local_dir\n    - !from https://github.com/foliant-docs/docs.git\n    - !from https://github.com/some_other_group/some_other_repo.git#develop\n```\n\nBefore building the documentation superproject, Multiproject extension calls Foliant to build each subproject into `pre` target, and then moves the directories of built subprojects into the source directory of the superproject (usually called as `src`).\n\nLimitations:\n\n* directory names of subprojects of the same level should be unique;\n* source directories of the multiproject and of all the subprojects should have the same names; also they should be located inside the “root” directories of corresponding projects;\n* config files of the multiproject and of all the subprojects should have the same names;\n* subprojects from remote Git repositories do not need to be newly cloned before each build, but local subprojects are copied into cache before each build;\n* it’s undesirable if the path of the “root” directory of the top-level project contains `.multiprojectcache` directory as its some part.\n\n## CLI Extension for the src Command\n\nThis extension supports the command `src` to backup the source directory of Foliant project (usually called as `src`) and to restore it from prepared backup.\n\nBacking up of the source directory is needed because MultiProject extension modifies this directory by moving the directories of built subprojects into it.\n\n### Usage of the CLI Extension\n\nTo make a backup of the source directory, use the command:\n\n```bash\n$ foliant src backup\n```\n\nTo restore the source directory from the backup, use the command:\n\n```bash\n$ foliant src restore\n```\n\nYou may use the `--config` option to specify custom config file name of your Foliant project. By default, the name `foliant.yml` is used:\n\n```bash\n$ foliant src backup --config alternative_config.yml\n```\n\nAlso you may specify the root directory of your Foliant project by using the `--path` option. If not specified, current directory will be used.\n\n## Partial build\n\nTo use the partial build features (added in foliant 1.0.14), add `partial_build.yml` file, with the following structure:\n\n```yml\nproject_name:\n    - src/file_1.md\n    - src/dir/file_2.md\n```\n\n## RepoLink Preprocessor\n\nThis preprocessor allows to add into each Markdown source a hyperlink to the related file in Git repository. Applying of the preprocessor to subprojects allows to get links to separate repositories from different pages of a single site (e.g. generated with MkDocs).\n\nBy default, the preprocessor emulates MkDocs behavior. The preprocessor generates HTML hyperlink with specific attributes and inserts the link after the first heading of the document. The default behavior may be overridden.\n\nThe preprocessor supports the same options `repo_url` and `edit_uri` as MkDocs.\n\n### Usage of the Preprocessor\n\nTo enable the preprocessor, add `repolink` to `preprocessors` section in the project config:\n\n```yaml\npreprocessors:\n    - repolink\n```\n\nThe preprocessor has a number of options:\n\n```yaml\npreprocessors:\n    - repolink:\n        repo_url: https://github.com/foliant-docs/docs/\n        edit_uri: /blob/master/src/\n        link_type: html\n        link_location: after_first_heading\n        link_text: \"\u0026#xE3C9;\"\n        link_title: View the source file\n        link_html_attributes: \"class=\\\"md-icon md-content__icon\\\" style=\\\"margin: -7.5rem 0\\\"\"\n        targets:\n            - pre\n```\n\n`repo_url`\n:   URL of the related repository. Default value is an empty string; in this case the preprocessor does not apply. Trailing slashes do not affect.\n\n`edit_uri`\n:   Revision-dependent part of URL of each file in the repository. Default value is `/blob/master/src/`. Leading and trailing slashes do not affect.\n\n`link_type`\n:   Link type: HTML (`html`) or Markdown (`markdown`). Default value is `html`.\n\n`link_location`\n:   Place in the document to put the hyperlink. By default, the hyperlink is placed after the first heading, and newlines are added before and after it (`after_first_heading`). Other values: `before_content`—the hyperlink is placed before the content of the document, the newline after it is provided; `after_content`—the hyperlink is placed after the content of the document, the newline before it is added; `defined_by_tag`—the tags `\u003crepo_link\u003e\u003c/repo_link\u003e` that are met in the content of the document are replaced with the hyperlink.\n\n`link_text`\n:   Hyperlink text. Default value is `Edit this page`.\n\n`link_title`\n:   Hyperlink title (the value of `title` HTML attribute). Default value is also `Edit this page`. This option takes effect only when `link_type` is set to `html`.\n\n`link_html_attributes`\n:   Additional HTML attributes for the hyperlink. By using CSS in combination with `class` attribute, and/or `style` attribute, you may customize the presentation of your hyperlinks. Default value is an empty string. This option takes effect only when `link_type` is set to `html`.\n\n`targets`\n:   Allowed targets for the preprocessor. If not specified (by default), the preprocessor applies to all targets.\n\nYou may override the value of the `edit_uri` config option with the `FOLIANT_REPOLINK_EDIT_URI` system environment variable. It can be useful in some non-stable testing or staging environments.\n\n## Includesmap Preprocessor\n\nThis preprocessor combines the includes maps (`includes_map.json`) obtained as a result of the [preprocessor includes](https://github.com/foliant-docs/foliantcontrib.includes) with the `includes_map` function enabled.\nThe combined includes map (`multiproject_includes_map.json`) will be located in the root of the site.\n\n### Usage of the Preprocessor\n\nTo enable the preprocessor, add `includesmap` to `preprocessors` section in the config of the main project:\n\n```yaml\npreprocessors:\n    - includesmap\n```\n\n\u003e There is no need to add the Includesmap preprocessor to subproject configs.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffoliant-docs%2Ffoliantcontrib.multiproject","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffoliant-docs%2Ffoliantcontrib.multiproject","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffoliant-docs%2Ffoliantcontrib.multiproject/lists"}