{"id":13815230,"url":"https://github.com/moremoban/yehua","last_synced_at":"2026-01-14T07:37:08.289Z","repository":{"id":62590580,"uuid":"93660365","full_name":"moremoban/yehua","owner":"moremoban","description":"Make a project in 1 minute from a project template but keep updating it forever","archived":false,"fork":false,"pushed_at":"2020-10-17T22:06:33.000Z","size":11450,"stargazers_count":22,"open_issues_count":12,"forks_count":4,"subscribers_count":2,"default_branch":"dev","last_synced_at":"2025-11-29T03:08:51.252Z","etag":null,"topics":["cookiecutter"],"latest_commit_sha":null,"homepage":"http://yehua.readthedocs.io/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/moremoban.png","metadata":{"files":{"readme":"README.rst","changelog":"CHANGELOG.rst","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"github":"chfw","patreon":"chfw"}},"created_at":"2017-06-07T17:13:31.000Z","updated_at":"2021-10-06T23:26:01.000Z","dependencies_parsed_at":"2022-11-04T07:16:05.561Z","dependency_job_id":null,"html_url":"https://github.com/moremoban/yehua","commit_stats":null,"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/moremoban/yehua","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moremoban%2Fyehua","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moremoban%2Fyehua/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moremoban%2Fyehua/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moremoban%2Fyehua/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/moremoban","download_url":"https://codeload.github.com/moremoban/yehua/tar.gz/refs/heads/dev","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moremoban%2Fyehua/sbom","scorecard":{"id":659955,"data":{"date":"2025-08-11","repo":{"name":"github.com/moremoban/yehua","commit":"e90ac103ec28e1101fd845796c02083d52ddf43e"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.7,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/9 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":"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":"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":10,"reason":"no dangerous workflow patterns detected","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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/moban-update.yml:1","Warn: no topLevel permission defined: .github/workflows/pythonpublish.yml:1","Info: no jobLevel write permissions found"],"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":"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":"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":"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":9,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Warn: project license file does not contain an FSF or OSI license."],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/moban-update.yml:8: update your workflow using https://app.stepsecurity.io/secureworkflow/moremoban/yehua/moban-update.yml/dev?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/moban-update.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/moremoban/yehua/moban-update.yml/dev?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/moban-update.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/moremoban/yehua/moban-update.yml/dev?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pythonpublish.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/moremoban/yehua/pythonpublish.yml/dev?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pythonpublish.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/moremoban/yehua/pythonpublish.yml/dev?enable=pin","Warn: pipCommand not pinned by hash: lint.sh:1","Warn: pipCommand not pinned by hash: test.sh:2","Warn: pipCommand not pinned by hash: tests/fixtures/project_yehua/lint.sh:1","Warn: pipCommand not pinned by hash: .github/workflows/moban-update.yml:17","Warn: pipCommand not pinned by hash: .github/workflows/pythonpublish.yml:18","Warn: pipCommand not pinned by hash: .github/workflows/pythonpublish.yml:19","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned","Info:   0 out of   6 pipCommand dependencies pinned"],"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":"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":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"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":"Vulnerabilities","score":0,"reason":"16 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2019-217 / GHSA-462w-v97r-4m45","Warn: Project is vulnerable to: PYSEC-2014-8 / GHSA-8r7q-cvjq-x353","Warn: Project is vulnerable to: GHSA-cpwx-vrp4-4pq7","Warn: Project is vulnerable to: PYSEC-2014-82 / GHSA-fqh9-2qgg-h84h","Warn: Project is vulnerable to: PYSEC-2021-66 / GHSA-g3rq-g295-4j3m","Warn: Project is vulnerable to: GHSA-h5c8-rqwp-cp95","Warn: Project is vulnerable to: GHSA-h75v-3vvj-5mfj","Warn: Project is vulnerable to: PYSEC-2019-220 / GHSA-hj2j-77xm-mc5v","Warn: Project is vulnerable to: GHSA-q2x7-8rv6-6q7h","Warn: Project is vulnerable to: PYSEC-2021-437 / GHSA-5xp3-jfq3-5q8x","Warn: Project is vulnerable to: PYSEC-2023-228 / GHSA-mq26-g339-26xf","Warn: Project is vulnerable to: PYSEC-2022-43017 / GHSA-qwmp-2cf2-g9g6","Warn: Project is vulnerable to: PYSEC-2024-48 / GHSA-fj7x-q9j7-g6q6","Warn: Project is vulnerable to: PYSEC-2022-238 / GHSA-h3qr-fjhm-jphw","Warn: Project is vulnerable to: PYSEC-2023-117 / GHSA-mrwq-x4v8-fh7p","Warn: Project is vulnerable to: PYSEC-2022-204 / GHSA-f4q6-9qm4-h8j4"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 28 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-21T15:48:50.458Z","repository_id":62590580,"created_at":"2025-08-21T15:48:50.459Z","updated_at":"2025-08-21T15:48:50.459Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28413449,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T05:26:33.345Z","status":"ssl_error","status_checked_at":"2026-01-14T05:21:57.251Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: 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":["cookiecutter"],"created_at":"2024-08-04T04:03:10.104Z","updated_at":"2026-01-14T07:37:08.271Z","avatar_url":"https://github.com/moremoban.png","language":"Python","funding_links":["https://github.com/sponsors/chfw","https://patreon.com/chfw","https://www.patreon.com/chfw"],"categories":["Development","Python"],"sub_categories":["Time Series"],"readme":"================================================================================\nyehua - Project template tool for an organisation\n================================================================================\n\n.. image:: https://api.travis-ci.org/moremoban/yehua.svg\n   :target: http://travis-ci.org/moremoban/yehua\n\n.. image:: https://codecov.io/github/moremoban/yehua/coverage.png\n   :target: https://codecov.io/github/moremoban/yehua\n.. image:: https://badge.fury.io/py/yehua.svg\n   :target: https://pypi.org/project/yehua\n\n.. image:: https://pepy.tech/badge/yehua/month\n   :target: https://pepy.tech/project/yehua/month\n\n.. image:: https://img.shields.io/github/stars/moremoban/yehua.svg?style=social\u0026maxAge=3600\u0026label=Star\n    :target: https://github.com/moremoban/yehua/stargazers\n\n.. image:: https://img.shields.io/static/v1?label=continuous%20templating\u0026message=%E6%A8%A1%E7%89%88%E6%9B%B4%E6%96%B0\u0026color=blue\u0026style=flat-square\n    :target: https://moban.readthedocs.io/en/latest/#at-scale-continous-templating-for-open-source-projects\n\n.. image:: https://img.shields.io/static/v1?label=coding%20style\u0026message=black\u0026color=black\u0026style=flat-square\n    :target: https://github.com/psf/black\n\n.. image:: https://readthedocs.org/projects/yehua/badge/?version=latest\n   :target: http://yehua.readthedocs.org/en/latest/\n\n.. image:: https://raw.githubusercontent.com/pyexcel/pyexcel.github.io/master/images/patreon.png\n   :target: https://www.patreon.com/chfw\n\n.. image:: https://badges.gitter.im/chfw_yehua/Lobby.svg\n   :alt: Join the chat at https://gitter.im/chfw_yehua/Lobby\n   :target: https://gitter.im/chfw_yehua/Lobby?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=badge\n\n\nIntroduction\n================================================================================\n\n\n.. image:: https://github.com/moremoban/yehua/raw/dev/yehua-usage.gif\n   :width: 600px\n\n**yehua** /'jɛhwa/ is yet another a project template tool for an organisation. It creates a project skeleton, S\nfrom the default project template, T,  of an organisation. `moban`_, the other\ntool of moremoban organisation, keeps S in synchronisation with T forever. This\nuse case is what we called: **continuous templating**.\n\n.. image:: https://github.com/moremoban/yehua/raw/dev/docs/source/_static/yehua-story.png\n   :width: 600px\n\nCookiecutter users\n--------------------------\n\nYes, we now support cookiecutter templates. It has been requested since 2018\nEuropython. Simply there is tons of cookiecutter templates out there.\n\n\n.. image:: https://github.com/moremoban/yehua/raw/dev/docs/source/_static/yehua-cookiecutter.gif\n   :width: 600px\n\nWhat you do is to replace 'cookiecutter' with 'yh'::\n\n    $ pip install yehua[cookiecutter]\n    $ yh gh:audreyr/cookiecutter-pypackage\n\nAnd what moremoban promise is, whenever your source template changes, you\ncan `synchronize` them any time with another moremoban's command 'moban'::\n\n    $ moban\n\nYes, you need a separate command, which replaces your effort to synchronize\nthe upstream templates all the time.\n\nWhat's different with Yehua\n------------------------------------\n\nWhen the scope is a single project, **yehua** is no different to `cookiecutter`_ and\n`PyScaffold`_. It will create a project skeleton from `pypi-mobans`_, other templates such\nas cookiecutter templates, yehua mobans.\n\nWhen the scope is all projects within an organisation, **yehua** helps tackle\ninformation fragmentation problem, because all new projects after its creation,\nare still in synchronisation with T. For example, removing python 2.7 test\nin your travis file, can be done either manually by hand or automatically via\n`moban`_. What's the difference? The latter is faster and typo-free option. Here is\n`an example`_.\n\n`PyScaffold`_ version 3 has rolled out '--update' option, recognizing the organisational\nneed of continous templating. Why do not **yehua** join `PyScaffold`_? Well,\nmoremoban organisation started with '--update' at the start so our architecture\nand vision are closer to that of `cookiecutter`_:\n\n1. we do not want to limit ourselves in pythonsphere. We wanted to serve all\n   IT projects. In our mind, they are all about text templating.\n\n2. we split the tool and the templates, serving the previous statement.\n   People can create npm package template and use yehua+moban for continuous templating.\n   Here are a list of examples:\n\n* `pypkg-mobans in pyecharts project \u003chttps://github.com/pyecharts/pypkg-mobans\u003e`_\n* `echarts-js-mobans in echarts-map project \u003chttps://github.com/echarts-maps/echarts-js-mobans\u003e`_\n\n.. _moban: https://github.com/moremoban/moban\n.. _cookiecutter: https://github.com/cookiecutter/cookiecutter\n.. _PyScaffold: https://github.com/pyscaffold/pyscaffold\n.. _pypi-mobans: https://github.com/moremobans/pypi-mobans\n.. _an example: https://github.com/moremoban/yehua/blob/dev/.github/workflows/moban-update.yml\n\n\n\nInstallation\n================================================================================\n\n\nYou can install yehua via pip:\n\n.. code-block:: bash\n\n    $ pip install yehua\n\n\nor clone it and install it:\n\n.. code-block:: bash\n\n    $ git clone https://github.com/moremoban/yehua.git\n    $ cd yehua\n    $ python setup.py install\n\n\nFor offline usage, you need to get `pypi-mobans-pkg` installed::\n\n    $ pip install yehua[pypi-mobans]\n\n\nor::\n\n    $ pip install pypi-mobans-pkg\n\n\nUsage\n================================================================================\n\n\n\nSimply type in and you are taken care of::\n\n    $ yh\n\nIt will use pypi-mobans-pkg by default and if it is not installed, it will\ninstall latest one. Then pypi-mobans-pkg takes over and will do\n[these](https://github.com/moremoban/pypi-mobans/blob/dev/yehua.yml)\nfor you:\n\n#. Consult you on your project static information which can update as\n   many as you want to.\n#. Create the Python package folder structure\n#. Initialize the package as git project\n\nYou will simply need to commit it after you will have reviewed the\ngenerated files.\n\nTutorial\n-----------------\n\nLet's make a python command line utility using `yehua`. The command\nwill be `hello` and it prints `world`. \n\nStep 1 Let's launch yehua\n******************************\n|slide1|\n\nStep 2 Fill-in the meta data for your project\n***********************************************\n|slide2|\n\nAt the end, yehua generates a folder named 'hello', which contains [all necessary\nfiles](https://github.com/moremoban/pypi-mobans).\n\nStep 3 Start coding\n*************************\n\n.. image:: https://github.com/moremoban/yehua/raw/dev/docs/source/_static/yehua-hello.gif\n   :width: 600px\n\n\nIn above animation, we write up the actual code in hello/main.py\n\n.. code:: python\n\n    def main():\n        print('world')\n\nWhy is it enough? yehua generates a command utility python and\nit has pre-wired to invoke hello.main.main() function. You\ncan find it out in setup.py.\n\nStep 4 Install it\n*********************\nNow all is done. Let's install it\n\n|slide7|\n\nYou can now run `hello` at your command line. \n\nStep 5 push to github\n***************************\n\nSuppose you are happy with everything. Please do the following to\npush it to your github::\n\n    $ git commit -am \":sparkle: initial commit\"\n\nThen create your project repository in github and do these to push it out::\n\n    $ git remote add origin https://github.com/moremoban/hello.git\n    $ git push origin master\n\nYou can find the `hello project`_ on github.\n\nStep 7 enable travis\n***************************\n\nThe generated project already has `.travis.yml` file. What you\nwill need to do is to register with travis.org if you have not\ndone so. And then go to travis and activate your project. \n\n\n.. |slide1| image:: docs/source/_static/yehua-0.png\n   :scale: 100%\n.. |slide2| image:: docs/source/_static/yehua-1.png\n   :scale: 100%\n.. |slide3| image:: docs/source/_static/yehua-2.png\n   :scale: 100%\n.. |slide4| image:: docs/source/_static/yehua-3.png\n   :scale: 100%\n.. |slide5| image:: docs/source/_static/yehua-4.png\n   :scale: 100%\n.. |slide6| image:: docs/source/_static/yehua-5.png\n   :scale: 100%\n.. |slide7| image:: docs/source/_static/yehua-7.png\n   :scale: 100%\n.. |slide9| image:: docs/source/_static/github.png\n   :scale: 60%\n.. |slide10| image:: docs/source/_static/push2github.png\n   :scale: 60%\n\n.. _hello project: https://github.com/moremoban/hello\n.. _pyexcel commons: https://github.com/pyexcel/pyexcel-commons\n.. _pyexcel: https://github.com/pyexcel\n.. _moban: https://github.com/moremoban/moban\n.. _setupmobans: https://github.com/moremoban/setupmobans\n\n\nBackground\n================================================================================\n\nThe original problem I was trying to solve is: I would like to place\ncommon paragraphs in the documentation of my projects in a central\nplace (pyexcel-mobans), and all projects could reference it dynamically\nso that when those common paragraphs get updated, the updates can be\neasily propagated to all relevant projects. The derived problem is:\nwhat can I do to a new project? I found myself doing a lot of\ncopy-and-paste a lot, which lead to the creation of \"yehua\". Later,\nJohn Vandenberg, an active member of coala, suggested extracting the\ngeneric sets of pyexcel-mobans to form pypi-mobans, so that\na vanilla python package can be created. Why not cookiecutter?\nWell, I have not heard of it at the time of creation. But it turns out\nthat this project started to pave the way to be the cookiecutter\nfor organisations.\n\nWhy to choose \"yehua\"? Here is `the little story`_ behind the\nchoice of name. And this `music video`_ would help bridge the\ncultural gap between you and me.\n\n.. _the little story: https://github.com/moremoban/yehua/issues/5#issuecomment-317218010\n.. _music video: https://www.youtube.com/watch?v=_JFTOQ6F1-M\u0026frags=pl%2Cwn\n\n\n\n\nLicense\n================================================================================\n\nNEW BSD License\n\n\nIt embeds MIT licensed `cutie \u003chttps://github.com/kamik423/cutie\u003e`_ from\nHans Schülein. Please refer to LICENSE file for more details\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmoremoban%2Fyehua","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmoremoban%2Fyehua","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmoremoban%2Fyehua/lists"}