{"id":15470488,"url":"https://github.com/comtihon/enot","last_synced_at":"2025-09-23T17:58:08.945Z","repository":{"id":52418118,"uuid":"80228818","full_name":"comtihon/enot","owner":"comtihon","description":"Erlang advanced project manager ","archived":false,"fork":false,"pushed_at":"2022-11-04T05:30:16.000Z","size":651,"stargazers_count":30,"open_issues_count":15,"forks_count":3,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-09-03T21:57:31.336Z","etag":null,"topics":["build-tool","dependency-manager","erlang"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/comtihon.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}},"created_at":"2017-01-27T17:22:09.000Z","updated_at":"2024-01-26T18:08:11.000Z","dependencies_parsed_at":"2023-01-23T09:00:56.747Z","dependency_job_id":null,"html_url":"https://github.com/comtihon/enot","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/comtihon/enot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/comtihon%2Fenot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/comtihon%2Fenot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/comtihon%2Fenot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/comtihon%2Fenot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/comtihon","download_url":"https://codeload.github.com/comtihon/enot/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/comtihon%2Fenot/sbom","scorecard":{"id":301952,"data":{"date":"2025-08-11","repo":{"name":"github.com/comtihon/enot","commit":"d01c380348a18b67dbb73f429464b454165a7ec3"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.7,"checks":[{"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":"Code-Review","score":0,"reason":"Found 0/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":"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":"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":"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":"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":"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: 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":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"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":"19 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2024-4 / GHSA-2mqj-m65w-jghx","Warn: Project is vulnerable to: PYSEC-2023-165 / GHSA-cwvm-v4w8-q58c","Warn: Project is vulnerable to: PYSEC-2022-42992 / GHSA-hcpj-qp55-gfph","Warn: Project is vulnerable to: PYSEC-2023-137 / GHSA-pr76-5cm5-w9cj","Warn: Project is vulnerable to: PYSEC-2023-161 / GHSA-wfm5-v35h-vwf4","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-2014-14 / GHSA-652x-xj99-gmcc","Warn: Project is vulnerable to: GHSA-9hjg-9r4m-mvj7","Warn: Project is vulnerable to: GHSA-9wx4-h78v-vm56","Warn: Project is vulnerable to: PYSEC-2014-13 / GHSA-cfj3-7x9c-4p3h","Warn: Project is vulnerable to: PYSEC-2018-28 / GHSA-x84v-xcm2-53pg"],"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 6 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-17T20:52:23.687Z","repository_id":52418118,"created_at":"2025-08-17T20:52:23.687Z","updated_at":"2025-08-17T20:52:23.687Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":276622502,"owners_count":25675125,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-23T02:00:09.130Z","response_time":73,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["build-tool","dependency-manager","erlang"],"created_at":"2024-10-02T02:05:00.311Z","updated_at":"2025-09-23T17:58:08.898Z","avatar_url":"https://github.com/comtihon.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Enot \n[![Build Status](https://travis-ci.com/comtihon/enot.svg?branch=master)](https://travis-ci.com/comtihon/enot)\n[![PyPI](https://img.shields.io/pypi/v/enot.svg)](https://pypi.python.org/pypi/enot)\n[![PyPI](https://img.shields.io/pypi/pyversions/enot.svg)](https://pypi.python.org/pypi/enot)\n[![PyPI](https://img.shields.io/pypi/wheel/enot.svg)](https://pypi.python.org/pypi/enot)  \nErlang advanced project manager.  \n_Why Enot?_  \n- powerful dependency management -\u003e build stability\n- built deps caching locally and remotely -\u003e increased build speed\n- json project configuration -\u003e devOps and third-party tools are happy\n- Jinja2 [templating](docs/templating.md) -\u003e dynamic environment-dependent configuration\n- automatic files build order -\u003e no problems with parse-transform\n- easy [deployment](docs/installation_and_deploy.md) via [EnotHub](https://enot.justtech.blog) -\u003e run `enot install you/your_service` on every machine\n- notes on [security](docs/packaging_and_security.md).  \n\nBe in touch: [Blog](https://justtech.blog/tag/enot/)\n\n### Installation\nPypi:\n\n    pip install enot\nManual:\n    \n    git clone https://github.com/comtihon/enot.git\n    make install\n\n### Create project\nGenerate a project:\n\n    enot create project_name\nThis will create `project_name` directory with content:  \n* `src/project_name.app.src` - application src file  \n* `src/project_name_app.erl` - application file  \n* `src/project_name_sup.erl` - top supervisor  \n* `enot_config.json` - enot configuration file\n\n### Build\nBuild a project (in project's dir):\n\n    enot build\nThis will build a project and put all `beam` files to `ebin` directory.  \nIf you have `c_src` folder Enot will compile them to `priv/project_name.so`.  \nIf you have `deps` specified in you config file - they will be downloaded to `deps` and also build.  \n`.app` file is generated from `.app.src` with all templates fill in _(see Jinja2 templating)_\n#### Build speed-up\nReproduce:\n```\ngit clone https://github.com/comtihon/mongodb-erlang\ncd mongodb-erlang\ntime make\n\ncd ../ \u0026\u0026 rm -rf mongodb-erlang \u0026\u0026 git clone https://github.com/comtihon/mongodb-erlang\ncd mongodb-erlang\ntime enot build\n\ncd ../ \u0026\u0026 rm -rf mongodb-erlang \u0026\u0026 git clone https://github.com/comtihon/mongodb-erlang\ncd mongodb-erlang\ntime enot build\n```\nResults:\n```\ntime make\nreal    0m8,407s\n\n(no local cache) time enot build\nreal    0m6,609s\n\n(with local cache) time enot build\nreal    0m1,357s\n```\nFor small project with 3 deps enot is 2 seconds faster for the first time and 7 seconds faster for the second time.\n\n### Release\nTo release a project (in project's dir):\n\n    enot release\nThis will build a project if not built, install [relx](https://github.com/erlware/relx]creates) if not installed,\n create `relx.config`, `rel/vm.args`, `rel/sys.config` if not exist and build a release using relx in `_rel` \n directory.\n \n### Package management api\nTo learn how to fetch, install, uninstall and list enot packages read [commands](docs/commands.md).\n\n### Project Configuration\nEnot configuration file is `enot_config.json`, it is placed in project_dir. It is in [JSON](http://www.json.org) format.\nEnot also supports `rebar.config` and `Makefile` ErlangMK's config.  \nFor format, fields and examples read [project configuration](docs/project_configuration.md).\n\n### Dependency management\n* speficy deps in enot_config\n* deps update if tag changed in enot_config\n* deps auto update if newer dep presents in dependency tree\n* deps auto removing if dep is not used any more  \n\nMore about [dependency management](docs/deps.md).\n\n### Jinja2 templating\nEnot allows you to use [Jinja2](http://jinja.pocoo.org/) template engine in your `app.src`, `relx.config`, `vm.args` \nand `sys.config`.  \nAfter filling templates and making a release all file changes are reverted. Enot's files templates won't disturb you \nwith endless git changes.\nFor more information read [templating](docs/templating.md).   \n\n### Caching\nEvery dependency, fetched and built locally is saved to enot local cache. It is situated in `user_cache_dir/enot`: \n`$HOME/.cache/enot` for Linux. Cache path can be changed via enot global config. Cached applications are divided by \nnamespace, project and erlang version, which was used in their compilation.  \nFor example:\n    \n    {\n        \"name\" : \"mongodb-erlang\",\n        \"url\" : \"https://github.com/comtihon/mongodb-erlang\",\n        \"tag\" : \"v3.0.1\"\n    }\nWill be saved to `$HOME/.cache/enot/comtihon/mongodb-erlang/v3.0.1/20`, where path contains static path to cache \n`$HOME/.cache/enot/` it can be specified in Enot global config. Dynamic path - `Namespace/Project/Tag/Erlang_version`.  \nEvery time same version of Erlang and project will be used as dep in another project on this system - dep will be linked\n from cache to this project instead of downloading and compiling new.  \nThere is also remote cache, where already built packages are kept. Enot searches packages in remote cache before cloning\nthem from git and building. Remote cache can be set in Enot global config.   \nBesides using official remote Enot cache - [EnotHub](https://enot.justtech.blog) you can deploy your own remote cache. \nYou can use multiple remote caches.\n\n### Global Enot Configuration\nEnot global configuration is system wide Enot configuration file. It is in JSON format also and stored in\n`user_config_dir/enot`: `$HOME/.config/enot` for Linux.\n\n    {\n      \"compiler\" : \"enot\",\n      \"temp_dir\": \"/tmp/enot\",\n      \"cache\":\n      [\n        {\n          \"name\": \"local\",\n          \"type\": \"local\",\n          \"url\": \"file://$HOME/.cache/enot\"\n        }\n      ]\n    }\nWhere:\n`compiler` is a default build system, which can be used to built projects.  \nOptions are: `enot`, `erlang.mk`, `rebar`, `rebar3`, `native` (will determine compiler by content of the project, f.e. \nif there is `rebar.config` - will use `rebar`), `makefile` (just run `make`), `bootstrap` (just run `./bootstrap`).  \n`temp_dir` is the system temp dir. It is used for downloading deps when building the project, before adding them to \nlocal cache.  \n`cache` is a list of caches. Each cache has its own configuration:  \n`cache.name` is a name of the cache, which should be unique. It is for Enot only.  \n`cache.type` is a type of the cache. Options are: `local` and `enot`.  \n`cache.url` is a url of cache. Local caches use `file://` as a protocol.  \n\n### Unit testing\nPut your unit tests in `test` folder (Enot support subdirectories) and run `enot eunit`. Eunit output will be redirected\nto std output. In case of error Enot's return code will be 1.\n\n### Common  testing\nPut your common tests in `test` folder (Enot support subdirectories) and run `enot ct`. Common test's output will be\nredirected to std output. In case of error Enot's return code will be 1.  \n__--log-dir__ parameter can be specified to set up dir for `logs` where ct output is stored. Default if `test/logs`.\n\n### Enot Testing \nTo test Enot itself, clone this repo and run.\n    \n    python setup.py install\nAll:\n\n    make tests\nSingle Testcase:\n\n    py.test -q -s test/test_module.py::TestClass\nSingle Test\n\n    py.test -q -s test/test_module.py::TestClass::test_fun","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcomtihon%2Fenot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcomtihon%2Fenot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcomtihon%2Fenot/lists"}