{"id":43010807,"url":"https://github.com/leftshiftone/implicit","last_synced_at":"2026-01-31T05:10:22.626Z","repository":{"id":49868051,"uuid":"195772153","full_name":"leftshiftone/implicit","owner":"leftshiftone","description":"Runtime code generation library","archived":false,"fork":false,"pushed_at":"2022-09-12T12:44:22.000Z","size":287,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":6,"default_branch":"master","last_synced_at":"2023-08-07T18:46:36.114Z","etag":null,"topics":["codegeneration","no-boilerplate","runtime"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","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/leftshiftone.png","metadata":{"files":{"readme":"README.md","changelog":null,"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":"2019-07-08T08:44:49.000Z","updated_at":"2023-08-07T18:46:36.115Z","dependencies_parsed_at":"2022-08-19T04:40:49.327Z","dependency_job_id":null,"html_url":"https://github.com/leftshiftone/implicit","commit_stats":null,"previous_names":[],"tags_count":25,"template":null,"template_full_name":null,"purl":"pkg:github/leftshiftone/implicit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leftshiftone%2Fimplicit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leftshiftone%2Fimplicit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leftshiftone%2Fimplicit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leftshiftone%2Fimplicit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/leftshiftone","download_url":"https://codeload.github.com/leftshiftone/implicit/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leftshiftone%2Fimplicit/sbom","scorecard":{"id":583046,"data":{"date":"2025-08-11","repo":{"name":"github.com/leftshiftone/implicit","commit":"a6b49b1faabd201f24e2f0c22fd3e481ca7f46ae"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.3,"checks":[{"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":"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":"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":"Code-Review","score":3,"reason":"Found 7/19 approved changesets -- score normalized to 3","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":"Binary-Artifacts","score":9,"reason":"binaries present in source code","details":["Warn: binary detected: gradle/wrapper/gradle-wrapper.jar:1"],"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":"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: 'allow deletion' enabled on branch 'master'","Warn: 'force pushes' enabled on branch 'master'","Warn: 'branch protection settings apply to administrators' is disabled on branch 'master'","Warn: could not determine whether codeowners review is allowed","Warn: no status checks found to merge onto branch 'master'","Warn: PRs are not required to make changes on branch 'master'; or we don't have data to detect it.If you think it might be the latter, make sure to run Scorecard with a PAT or use Repo Rules (that are always public) instead of Branch Protection settings"],"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 21 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-20T19:41:31.821Z","repository_id":49868051,"created_at":"2025-08-20T19:41:31.821Z","updated_at":"2025-08-20T19:41:31.821Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28929866,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-31T04:05:25.756Z","status":"ssl_error","status_checked_at":"2026-01-31T04:02:35.005Z","response_time":128,"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":["codegeneration","no-boilerplate","runtime"],"created_at":"2026-01-31T05:10:21.987Z","updated_at":"2026-01-31T05:10:22.621Z","avatar_url":"https://github.com/leftshiftone.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![CircleCI branch](https://img.shields.io/circleci/project/github/leftshiftone/implicit/master.svg?style=flat-square)](https://circleci.com/gh/leftshiftone/implicit)\n[![GitHub tag (latest SemVer)](https://img.shields.io/github/tag/leftshiftone/implicit.svg?style=flat-square)](https://github.com/leftshiftone/implicit/tags)\n[![Maven Central](https://img.shields.io/maven-central/v/one.leftshift.implicit/implicit?style=flat-square)](https://mvnrepository.com/artifact/one.leftshift.implicit/implicit)\n\n\n# Implicit\n\nImplicit is a runtime code generation library which can be used to generate POJO classes out of interface definitions.\nThe idea of this library is, that starting from an interface definition, the entire POJO class definition including\nvalidation and mapping features is created and so reducing the amount of boilerplate code.\n\nWith regards to performance the library is designed to have no performance losses in contrast to native object\ninstantiation.\n\nThe generated pojo class inherits all annotations of the interface definition class or method level.\n\n## Usage\n````\ninterface IPojo {\n    fun getPartitionKey(): String\n    fun setPartitionKey(str: String)\n\n    fun getSortingKey(): String\n    fun setSortingKey(str: String)\n}\n\n\nval factory = Implicit { \"custom.package.${it.simpleName}\" }\nval pojo = factory.instantiate(IPojo::class.java)\n\npojo.setPartitionKey(UUID.randomUUID().toString())\npojo.setSortingKey(UUID.randomUUID().toString())\n````\n\n## Map initialization\nImplicit also supports a pojo initialization by using a map argument.\n\n````\nval factory = Implicit { \"custom.package.${it.simpleName}\" }\nval pojo = factory.instantiate(IPojo::class.java, mapOf(\"partitionKey\" to \"A\", \"sortingKey\" to \"B\")\n````\n\n## Validation\nBy using annotations it is possible to declare validation rules for class methods.\nImplicit has the following built-in annotations:\n\n| name           | description                                                     |\n|----------------|-----------------------------------------------------------------|        \n| GreaterThan    | Target value must be greater than the configured value          |\n| LowerThan      | Target value must be lower than the configured value            |\n| GreaterEquals  | Target value must be greater equals the configured value        |\n| LowerEquals    | Target value must be lower equals the configured value          |\n| MaxLength      | Target value length must be lower equals the configured value   |\n| MinLength      | Target value length must be greater equals the configured value |\n| Min            | Target value must be greater equals the configured value        |\n| Max            | Target value must be greater equals the configured value        |\n| NotNull        | Target must not be null                                         |\n| NotBlank       | Target must not be blank                                        |\n| NotEmpty       | Target (string or collection) must not be empty                 |\n| ContentNotNull | Target content (map/collection entries) must not be null        |\n| Between        | Target value must be between the min and max value              |\n| Pattern        | Target value must match the regex pattern                       |\n| Email          | Target value must match the email regex pattern                 |\n| URL            | Target value must match the url regex pattern                   |\n| Docker         | Target value must match the docker image regex pattern          |\n| UUID           | Target value must match the uuid regex pattern          |\n\n````\ninterface IPojo {\n    fun setPartitionKey(@NotBlank str: String)\n    fun setSortingKey(@NotBlank str: String)\n}\n````\n\n## Alias\nThe @Alias annotation can be used to create an alias method which delegates to the annotated method.\nThe @Alias annotation can be embedded in an other annotation.\n\n````\ninterface Entity {\n   @Alias(\"partitionKey\") // creates a 'getPartitionKey' method which delegates to 'getIdentityId'\n   fun getIdentityId():String\n}\n````\n\n## Mixin\nThe @Mixin annotation can be used to add a mixin class to the class of the annotated method on the fly.\nThe @Mixin annotation can be embedded in an other annotation.\n\n````\ninterface PartitionKeyAware {\n   fun getPartitionKey()\n}\n\ninterface Entity {\n   @Alias(\"partitionKey\")\n   @Mixin(PartitionKeyAware::class)\n   fun getIdentityId():String\n}\n````\n\n## EqualsHashCode\nThe @EqualsHashCode annotation can be used to define which fields should be used for the equals and hashCode generation.\nThe @EqualsHashCode annotation can be embedded in an other annotation.\n\n````\ninterface Entity {\n   @EqualsHashCode\n   fun getIdentityId():String\n}\n````\n\n\n## ToString\nThe @ToString annotation can be used to define which fields should be used for the toString generation.\nThe @ToString annotation can be embedded in an other annotation.\n\n````\ninterface Entity {\n   @ToString\n   fun getIdentityId():String\n}\n````\n\n## Default\nThe @Default annotation can be used on getter methods to define a default value when the getter method would return null.\nThe @Default annotation can be embedded in an other annotation.\n\nThis mechanism supports all standard datatypes (int, float, string, ...) as well as\nlist and map structures.\n\n````\ninterface Entity {\n   @Default(\"defaultValue\")\n   fun getStringVal():String?\n   @Default(\"0\")\n   fun getFloatVal():Float?\n   @Default(\"true\")\n   fun getBooleanVal():Boolean?\n   @Default\n   fun getListVal():List\u003cString\u003e?\n   @Default\n   fun getMapVal():Map\u003cString, String\u003e?\n}\n````\n\n## GenericType\nThe @GenericType annotation can be used on methods to let implicit-engine know the type of object that is contained in a collection.\n\n\n````\ninterface EntityA {\n    fun getContentList(): List\u003cEntityB\u003e\n    @GenericType(EntityB::class)\n    fun setContentList(content: List\u003cEntityB\u003e)\n}\n\ninterface EntityB {\n    fun getPartitionKey(): String\n    fun setPartitionKey(str: String)\n}\n\n````\n**Use case:** Object instantiation from a Map, where there are fields with collections of nested objects \ne.g.\n\n````\n....\nfun instantiateEntityA(){\n    val factory = Implicit { \"${this.javaClass.name.toLowerCase()}.${it.simpleName}\" }\n    val function = factory.getFunction(IPojoAlpha::class.java)\n    val instance = function.apply(mapOf(\n            \"partitionKey\" to \"abc\",\n            \"contentSet\" to arrayOf(mapOf(\"partitionKey\" to \"ABC\"), mapOf(\"partitionKey\" to \"DEF\"))\n    ))\n}\n````\n\n## Trim\n\nThe @Trim annotation can be used on methods that return a String value and is used to trim the content of the field\n\n````\ninterface EntityA {\n   @Trim\n   fun getStringVal():String?\n}\n\n````\n\n## Development\n\n### Release\n\nReleases are triggered locally. Just a tag will be pushed and CI pipelines take care of the rest.\n\n#### Major\n\nRun `./gradlew final -x sendReleaseEmail -Prelease.scope=major` locally.\n\n#### Minor\n\nRun `./gradlew final -x sendReleaseEmail -Prelease.scope=minor` locally.\n\n#### Patch\nRun `./gradlew final -x sendReleaseEmail -Prelease.scope=patch` locally.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleftshiftone%2Fimplicit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fleftshiftone%2Fimplicit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleftshiftone%2Fimplicit/lists"}