{"id":34257194,"url":"https://github.com/cloudify-cosmo/repex","last_synced_at":"2026-04-09T04:03:51.344Z","repository":{"id":20737880,"uuid":"24022175","full_name":"cloudify-cosmo/repex","owner":"cloudify-cosmo","description":"sed on steroids","archived":false,"fork":false,"pushed_at":"2023-09-06T11:35:58.000Z","size":285,"stargazers_count":10,"open_issues_count":4,"forks_count":3,"subscribers_count":38,"default_branch":"master","last_synced_at":"2024-08-11T12:53:49.174Z","etag":null,"topics":["python","regex","regular-expression","replace","sed"],"latest_commit_sha":null,"homepage":"","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/cloudify-cosmo.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGES","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":"2014-09-14T13:11:18.000Z","updated_at":"2023-03-05T13:19:16.000Z","dependencies_parsed_at":"2023-01-13T21:07:35.965Z","dependency_job_id":null,"html_url":"https://github.com/cloudify-cosmo/repex","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/cloudify-cosmo/repex","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloudify-cosmo%2Frepex","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloudify-cosmo%2Frepex/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloudify-cosmo%2Frepex/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloudify-cosmo%2Frepex/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cloudify-cosmo","download_url":"https://codeload.github.com/cloudify-cosmo/repex/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloudify-cosmo%2Frepex/sbom","scorecard":{"id":292976,"data":{"date":"2025-08-11","repo":{"name":"github.com/cloudify-cosmo/repex","commit":"2911fb058f1b157263e4ed2cb93fc2cd3d4fa7ea"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.3,"checks":[{"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":"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":"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":2,"reason":"Found 4/15 approved changesets -- score normalized to 2","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":"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":"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":"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":"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 '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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 26 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-17T18:45:52.534Z","repository_id":20737880,"created_at":"2025-08-17T18:45:52.535Z","updated_at":"2025-08-17T18:45:52.535Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":27766022,"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-12-16T02:00:10.477Z","response_time":57,"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":["python","regex","regular-expression","replace","sed"],"created_at":"2025-12-16T14:23:46.140Z","updated_at":"2025-12-16T14:23:47.467Z","avatar_url":"https://github.com/cloudify-cosmo.png","language":"Python","readme":"repex (REPlace (regular) EXpression)\n====================================\n\n[![Build Status](https://travis-ci.org/cloudify-cosmo/repex.svg?branch=master)](https://travis-ci.org/cloudify-cosmo/repex)\n[![Build status](https://ci.appveyor.com/api/projects/status/kn6yqwqhsdn54ich/branch/master?svg=true)](https://ci.appveyor.com/project/Cloudify/repex/branch/master)\n[![PyPI version](http://img.shields.io/pypi/v/repex.svg)](https://pypi.python.org/pypi/repex)\n[![Supported Python Versions](https://img.shields.io/pypi/pyversions/repex.svg)](https://img.shields.io/pypi/pyversions/repex.svg)\n[![Requirements Status](https://requires.io/github/cloudify-cosmo/repex/requirements.svg?branch=master)](https://requires.io/github/cloudify-cosmo/repex/requirements/?branch=master)\n[![Code Coverage](https://codecov.io/github/cloudify-cosmo/repex/coverage.svg?branch=master)](https://codecov.io/github/cloudify-cosmo/repex?branch=master)\n[![Code Quality](https://landscape.io/github/cloudify-cosmo/repex/master/landscape.svg?style=flat)](https://landscape.io/github/cloudify-cosmo/repex)\n[![Is Wheel](https://img.shields.io/pypi/wheel/repex.svg?style=flat)](https://pypi.python.org/pypi/repex)\n\n\nNOTE: Beginning with `repex 0.4.1`, file attributes are kept when replacing.\n\nNOTE: Beginning with `repex 0.4.3`, Windows is officially supported (and tested via appveyor).\n\nNOTE: Beggining with `repex 1.0.0`, Python 3 is officially supported.\n\nNOTE: `repex 1.1.0` has breaking CLI and API changes. See [CHANGES](CHANGES) for more information.\n\nNOTE: `repex 1.2.0` does not allow to set variables in the config without providing them.\n\n`repex` replaces strings in single/multiple files based on regular expressions.\n\nWhy not Jinja you ask? Because sometimes you have existing files which are not templated in which you'd like to replace things.. and even if they're in your control, sometimes templates are just not viable if you need something working OOB.\n\nWhy not use sed you ask? Because `repex` provides some layers of protection and an easy to use config yaml in which you easily add new files and folders to iterate through.\n\nThe layers are:\n* Match and only then replace in the matched regular expression which allows the user to provide context for the replacement instead of just iterating through the entire file.\n* Check for existing strings in a file before replacing anything.\n* Exclude files and folders so that you don't screw up.\n* Validate that the replacement went as expected by allowing to execute a validation function post-replacement.\n\nAND, you can use variables (sorta Jinja2 style). How cool is that? See reference config below.\n\n\n## Installation\n\n`repex` is supported and tested on Python 2.6, 2.7, 3.3+ and PyPy.\n\n```shell\npip install repex\n```\n\nFor dev:\n\n```shell\npip install https://github.com/cloudify-cosmo/repex/archive/master.tar.gz\n```\n\n## Usage\n\n### CLI\n\nRepex exposes a CLI which can be used to do one of two things:\n\n1. Use repex's power to basically replace sed in the command line.\n2. Execute repex using a config file.\n\nNOTE: When passing a config file, repex will ignore any options passed which are not `config-only`.\n\n```\n$ rpx -h\n...\n\nUsage: rpx [OPTIONS] [REGEX_PATH]\n\n  Replace strings in one or multiple files.\n\n  You must either provide `REGEX_PATH` or use the `-c` flag to provide a\n  valid repex configuration.\n\n  `REGEX_PATH` can be: a regex of paths under `basedir`, a path to a single\n  directory under `basedir`, or a path to a single file.\n\n  It's important to note that if the `REGEX_PATH` is a path to a directory,\n  the `-t,--ftype` flag must be provided.\n\nOptions:\n  -r, --replace TEXT              A regex string to replace. Mutually\n                                  exclusive with: [config]\n  -w, --replace-with TEXT         Non-regex string to replace with. Mutually\n                                  exclusive with: [config]\n  -m, --match TEXT                Context regex match for `replace`. If this\n                                  is ommited, the context will be the entire\n                                  content of the file. Mutually exclusive\n                                  with: [config]\n  -t, --ftype TEXT                A regex file name to look for. Defaults to\n                                  `None`, which means that `PATH_TO_HANDLE`\n                                  must be a path to a single file [non-config\n                                  only]. Mutually exclusive with: [to_file,\n                                  config]\n  -b, --basedir TEXT              Where to start looking for `path` from.\n                                  Defaults to the cwd. Mutually exclusive\n                                  with: [config]\n  -x, --exclude-paths TEXT        Paths to exclude when searching for files to\n                                  handle. This can be used multiple times.\n                                  Mutually exclusive with: [config]\n  -i, --must-include TEXT         Files found must include this string. This\n                                  can be used multiple times. Mutually\n                                  exclusive with: [config]\n  --validator TEXT                Validator file:function (e.g.\n                                  validator.py:valid_func [non-config only].\n                                  Mutually exclusive with: [config]\n  --validator-type [per_file|per_type]\n                                  Type of validation to perform. `per_type`\n                                  will validate the last file found while\n                                  `per_file` will run validation for each file\n                                  found. Defaults to `per_type` [non-config\n                                  only]. Mutually exclusive with: [config]\n  --to-file TEXT                  File path to write the output to. Mutually\n                                  exclusive with: [ftype, config]\n  -c, --config TEXT               Path to a repex config file. Mutually\n                                  exclusive with: [REGEX_PATH]\n  --vars-file TEXT                Path to YAML based vars file. Mutually\n                                  exclusive with: [REGEX_PATH]\n  --var TEXT                      A variable to pass to Repex. Can be used\n                                  multiple times. Format should be\n                                  `'key'='value'`. Mutually exclusive with:\n                                  [REGEX_PATH]\n  --tag TEXT                      A tag to match with a set of tags in the\n                                  config. Can be used multiple times. Mutually\n                                  exclusive with: [REGEX_PATH]\n  --validate / --no-validate      Validate the config (defaults to True).\n                                  Mutually exclusive with: [validate_only,\n                                  REGEX_PATH]\n  --validate-only                 Only validate the config, do not run\n                                  (defaults to False). Mutually exclusive\n                                  with: [validate, REGEX_PATH]\n  --diff                          Write the diff to a file under `cwd/.rpx\n                                  /diff-TIMESTAMP` (defaults to False)\n  -v, --verbose                   Show verbose output\n  -h, --help                      Show this message and exit.\n\n...\n\n```\n\n\n#### Using repex like sed\n\nJust like sed:\n\n```bash\nrpx /path/to/my/file --replace 3.3 --rwith 3.4\n```\n\nMuch, much more than sed:\n\n```bash\nrpx 'check_validity/resources/.*' \n    -t VERSION \\\n    -r '3.3.0-m\\d+' \\\n    -w 2.1.1 \\\n    -i blah -i yay! \\\n    -x check_validity/resources/VERSION -x another/VERSION \\\n    --validator check_validity/resources/validator.py:validate \\\n    --diff -v\n```\n\nThis will look for all files named \"VERSION\" under all folders named \"check_validity/resources/.*\" (recursively); replace all strings matching \"3.3.0-m\\d+\" with \"2.1.1\"; validate using the \"validate\" function found in \"check_validity/resources/validator.py\" only if the files found include the strings \"blah\" and \"yay!\" excluding specifically the files \"check_validity/resources/VERSION\" and \"another/VERSION\". A git style diff file will be generated.\n\nNote that you must either escape special chars or use single quotes where applicable, that is, where regex strings are provided and bash expansion takes place.\n\n#### Notes\n\n* In complex scenarios, while the CLI can execute repex, it will be more likely that you would use the Python API to execute the `iterate` function as you will most probably want to dynamically pass variables according to certain logic provided by your system.\n* Variables provided via the `--var` flag will override variables provided within the `--vars-file`.\n* Currently, you can't pass variables which contain a `=` within them.\n\n#### Passing a config file to the CLI\n\nPassing a config file to the CLI is done as follows:\n\n```bash\nrpx -c config.yaml -t my_tag -v --vars-file vars.yaml --var 'x'='y' --var 'version'='3.3.0-m3'\n```\n\nSee below for how to use the config file.\n\n\n### Config file based usage \n\nUsing a config file adds some cool features and allows to run repex on multiple paths using a single config file.\n\nLet's say you have files named \"VERSION\" in different directories which look like this:\n\n```json\n{\n  \"date\": \"\",\n  \"commit\": \"\",\n  \"version\": \"3.3.0-m2\",\n  \"version_other\": \"3.1.2-m1\",\n  \"build\": \"8\"\n}\n```\n\nAnd you'd like to replace 3.3.0-m2 with 3.3.0-m3 in all of those files\n\nYou would create a repex config.yaml with the following:\n\n```yaml\n\nvariables:\n    base_dir: .\n    valstr: 'date'\n    regex: '\\d+(\\.\\d+){1,2}(-(m|rc)(\\d+)?)?'\n\npaths:\n    -   type: VERSION\n        path: resources\n        tags:\n            - my_tag\n            - my_other_tag\n        excluded:\n            - x/y/VERSION\n        base_directory: \"{{ .base_dir }}\"\n        match: '\"version\": \"{{ .regex }}'\n        replace: \"{{ .regex }}\"\n        with: \"{{ .version }}\"\n        validate_before: true\n        diff: true\n        must_include:\n            - \"{{ .valstr }}\"\n            - commit\n            - version\n        validator:\n            type: per_file\n            path: '{{ .basedir }}/validator/script/path.py'\n            function: my_validation_function\n```\n\nand do the following\n\n```python\n\nimport os\nimport repex\n\nCONFIG_YAML_FILE = \"config.yaml\"\nVERSION = os.environ['VERSION']  # '3.1.0-m3'\n\nvariables = {\n    'version': VERSION,\n}\n\nrepex.iterate(\n    config_file_path=CONFIG_YAML_FILE,\n    config=None,  # config is simply the dict form of the contents of `CONFIG_YAML_FILE`.\n    tags=['my_tag1', 'my_tag2']  # tags to match\n    variables=variables,\n    validate=True,  # validate config schema\n    validate_only=False,  # only validate config schema without running\n    with_diff=True  # write the diff to a file\n)\n\n```\n\nand even add a validator file:\n\n```python\n\ndef my_validation_function(version_file_path, logger):\n    logger.debug('Validating my thing...')\n    result = verify_replacement()\n    return result == 'yay! it passed!'\n\n```\n\n## Config YAML Explained\n\nIMPORTANT NOTE: variables MUST be enclosed within single or double quotes or they will not expand! Might fix that in future versions...\n\nANOTHER IMPORTANT NOTE: variables must be structured EXACTLY like this: {{ .VER_NAME }}\nDon't forget the spaces!\n\n- `variables` is a dict of variables you can use throughout the config. See below for more info.\n- `type` is a regex string representing the file name you're looking for.\n- `path` is a regex string representing the path in which you'd like to search for files (so, for instance, if you only want to replace files in directory names starting with \"my-\", you would write \"my-.*\"). If `path` is a path to a single file, the `type` attribute must not be configured.\n- `tags` is a list of tags to apply to the path. Tags are used for Repex's triggering mechanism to allow you to choose which paths you want to address in every single execution. More on that below.\n- `excluded` is a list of excluded paths. The paths must be relative to the working directory, NOT to the `path` variable.\n- `base_directory` is the directory from which you'd like to start the recursive search for files. If `path` is a path to a file, this property can be omitted. Alternatively, you can set the `base_directory` and a `path` relative to it.\n- `match` is the initial regex based string you'd like to match before replacing the expression. This provides a more robust way of replacing strings where you first match the exact area in which you'd like to replace the expression and only then match the expression you want to replace within it. It also provides a way to replace only specific instances of an expression, and not all.\n- `replace` - which regex would you like to replace?\n- `with` - what you replace with.\n- `must_include` - as an additional layer of security, you can specify a set of regex based strings to look for to make sure that the files you're dealing with are the actual files you'd like to replace the expressions in.\n- `validator` - validator allows you to run a validation function after replacing expressions. It receives `type` which can be either `per_file` or `per_type` where `per_file` runs the validation on every file while `per_type` runs once for every `type` of file; it receives a `path` to the script and a `function` within the script to call. Note that each validation function must return `True` if successful while any other return value will fail the validation. The validating function receives the file's path as and a logger as arguments.\n- `diff` - if `true`, will write a git-like unified diff to a file under `cwd/.rpx/diff-TIMESTAMP`. Note that `PATH_REGEX` can be anything which means that the names of the files will look somewhat weird. The diff will be written for each replacement. See below for an example.\n\nIn case you're providing a path to a file rather than a directory:\n\n- `type` and `base_directory` are depracated\n- you can provide a `to_file` key with the path to the file you'd like to create after replacing.\n\n\n## Tags\n\nTags allow a user to choose a set of paths on each execution.\nA user could apply a list of tags to a path and then, executing repex will address these paths according to the following logic:\n\n* If a user supplied a list of tags and the path was applied a list of tags, the path will be addressed only if matching tags were found.\n* If a user supplied a list of tags and the path contains no tags, the path will be ignored.\n* If a user did not supply tags and the path contains tags, the path will be ignored.\n* If a user did not supply tags and the path does not contain tags, the path will be addressed.\n* If a user proivded `any` as a tag, all paths, regardless of whether they have or haven't tags will be addressed.\n\n## Variables\n\nVariables are one of the strongest features of repex. They provide a way of injecting dynamic info to the config.\n\nVariables can be declared in 4 ways:\n- Provided via the CLI\n- Provided via the API.\n- Harcoded in the config under a top level `variables` section.\n- Set as Environment Variables.\n\nNote that variables can also be used within variables in the config.\n\nSee the example above for a variable definition reference.\n\nSome important facts about variables:\n\n- Variables with the same name sent via the API will override the hardcoded ones.\n- API provided or hardcoded variables can be overriden if env vars exist with the same name but in upper case and prefixed with `REPEX_VAR_` (so the variable \"version\" can be overriden by an env var called \"REPEX_VAR_VERSION\".) This can help with, for example, using the $BUILD_NUMBER env var in Jenkins to update a file with the new build number.\n\nNote that if any variables are required but not provided, repex will fail stating that they must be provided.\n\n## Diff\n\nNOTE: THIS IS WIP! Use sparingly.\n\nRepex has the ability to write a git-like unified diff for every replacement that occurs. The diff is written to a file under `cwd/.rpx/` and will contain something that looks like the following:\n\n```text\n$ cat .rpx/diff-20170119T115322\n...\n\n2017-01-19 11:53:22 tests/resources/multiple/mock_VERSION\n0  --- \n1  +++ \n2  @@ -1,7 +1,7 @@\n3   {\n4     \"date\": \"\",\n5     \"commit\": \"\",\n6  -  \"version\": \"3.1.0-m2\",\n7  +  \"version\": \"xxx\",\n8     \"versiond\": \"3.1.0-m2\",\n9     \"build\": \"8\"\n10  }\n\n2017-01-19 11:53:22 tests/resources/multiple/folders/mock_VERSION\n0  --- \n1  +++ \n2  @@ -1,7 +1,7 @@\n3   {\n4     \"date\": \"\",\n5     \"commit\": \"\",\n6  -  \"version\": \"3.1.0-m2\",\n7  +  \"version\": \"xxx\",\n8     \"versiond\": \"3.1.0-m2\",\n9     \"build\": \"8\"\n10  }\n\n...\n```\n\nThere is currently no way to ask repex to not generate the diff for every file, so take that into consideration when working with a large amount of files.\n\nDiff generation is off by default. Note that other than providing the overriding `--diff` (or `with_diff` in `iterate`) flag, you can set `diff` for each path in the config.\n\n\n## Testing\n\n```shell\ngit clone git@github.com:cloudify-cosmo/repex.git\ncd repex\npip install tox\ntox\n```\n\n## Contributions..\n\nPull requests are always welcome..\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcloudify-cosmo%2Frepex","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcloudify-cosmo%2Frepex","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcloudify-cosmo%2Frepex/lists"}