{"id":16149064,"url":"https://github.com/julianmendez/tabula","last_synced_at":"2026-02-14T11:07:34.963Z","repository":{"id":54043517,"uuid":"46713654","full_name":"julianmendez/tabula","owner":"julianmendez","description":"System to manage human-readable tables using files","archived":false,"fork":false,"pushed_at":"2024-12-28T14:00:50.000Z","size":294,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-03T19:11:08.247Z","etag":null,"topics":["human-readable","java","java-properties","tabula"],"latest_commit_sha":null,"homepage":"https://julianmendez.github.io/tabula/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/julianmendez.png","metadata":{"files":{"readme":"docs/README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2015-11-23T10:41:59.000Z","updated_at":"2024-12-28T14:00:53.000Z","dependencies_parsed_at":"2024-11-01T22:33:41.802Z","dependency_job_id":"7c33ceeb-dd68-4df1-8a36-f06f6e4c78a3","html_url":"https://github.com/julianmendez/tabula","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/julianmendez/tabula","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/julianmendez%2Ftabula","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/julianmendez%2Ftabula/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/julianmendez%2Ftabula/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/julianmendez%2Ftabula/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/julianmendez","download_url":"https://codeload.github.com/julianmendez/tabula/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/julianmendez%2Ftabula/sbom","scorecard":{"id":541915,"data":{"date":"2025-08-11","repo":{"name":"github.com/julianmendez/tabula","commit":"cd404691726e5ad2d51069769ce84de8db906ab7"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.1,"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":"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":"Code-Review","score":0,"reason":"Found 0/24 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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.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":"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/ci.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/julianmendez/tabula/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/julianmendez/tabula/ci.yml/master?enable=pin","Info:   0 out of   2 GitHub-owned GitHubAction 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":"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":"License","score":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"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":"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":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":"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-20T08:23:43.929Z","repository_id":54043517,"created_at":"2025-08-20T08:23:43.929Z","updated_at":"2025-08-20T08:23:43.929Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29443447,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-14T10:51:12.367Z","status":"ssl_error","status_checked_at":"2026-02-14T10:50:52.088Z","response_time":53,"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":["human-readable","java","java-properties","tabula"],"created_at":"2024-10-10T00:36:23.121Z","updated_at":"2026-02-14T11:07:34.945Z","avatar_url":"https://github.com/julianmendez.png","language":"Java","readme":"# [Tabula](https://julianmendez.github.io/tabula/)\n\n[![build](https://github.com/julianmendez/tabula/workflows/Java%20CI/badge.svg)](https://github.com/julianmendez/tabula/actions)\n[![maven central](https://maven-badges.herokuapp.com/maven-central/de.tu-dresden.inf.lat.tabula/tabula-parent/badge.svg)](https://search.maven.org/#search|ga|1|g%3A%22de.tu-dresden.inf.lat.tabula%22)\n[![license](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0.txt)\n\n*System to manage human-readable tables using files*\n\nTabula is a system to manage human-readable tables using files. It uses a specific type of file format that is similar to a [Java Properties](https://docs.oracle.com/javase/8/docs/api/java/util/Properties.html#load-java.io.Reader-) file, but allows defining the same property for different objects. The most updated specification can be found in the Scala implementation: [Tabulas](https://github.com/julianmendez/tabulas).\n\n\n## Download\n\n* [executable JAR file](https://sourceforge.net/projects/latitude/files/tabula/0.2.0/tabula-0.2.0.jar/download)\n* [The Central Repository](https://repo1.maven.org/maven2/de/tu-dresden/inf/lat/tabula/)\n* as dependency:\n\n```xml\n\u003cdependency\u003e\n  \u003cgroupId\u003ede.tu-dresden.inf.lat.tabula\u003c/groupId\u003e\n  \u003cartifactId\u003etabula-ext\u003c/artifactId\u003e\n  \u003cversion\u003e0.2.0\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n\n## Format\n\nThe Tabula format has *primitive types* and *composite types*. Unless something different is stated in the [release notes](https://github.com/julianmendez/tabula/blob/master/RELEASE-NOTES.md), the primitive types are:\n\n* `String`: any string without any newline (`'\\n'` 0x0A, `'\\r'` 0x0D), and not ending in backslash (`'\\'` 0x5C), neither in blanks (`'\\t'` 0x08, `' '` 0x20)\n* `URI`: any valid Uniform Resource Identifier\n* `Integer`: an integer number (`BigInteger`)\n* `Decimal`: a decimal number (`BigDecimal`)\n* `List_`... (e.g. `List_String`): list of space-separated values, for the types above\n* `Empty`: type that ignores any given value\n\nWith this format it is possible to define one or many composite *types*. Each type is defined by its *fields*. The *instances* of each type are listed just after the type definition. The type name can be any Tabula String.\nThe field name can be any Tabula String that does not contain an equals sign (`'='` 0x3D), and that is not the words `type` or `new`. The field name `id` is reserved to identify instances. Thus, two instances of the same type cannot have the same identifier.\n\nEach type is defined as follows:\n\n```properties\ntype = TYPE_NAME\n```\n\nwhere *TYPE_NAME* can be any identifier.\n\nEach type has its *fields*, defined as follow:\n\n```properties\ndef = \\\n FIELD_NAME_0:FIELD_TYPE_0 \\\n FIELD_NAME_1:FIELD_TYPE_1 \\\n...\n FIELD_NAME_n:FIELD_TYPE_n\n```\n\nwhere each *FIELD_NAME* can be any identifier,\nand each *FIELD_TYPE* can be any of the primitive types.\n\nThe URIs can be shortened by using prefixes. The prefixes are URIs themselves without colons, because the colon (`:`) is used to define the association.\n\n```properties\nprefix = \\\n PREFIX_0:URI_0 \\\n PREFIX_1:URI_1 \\\n ...\n PREFIX_n:URI_n\n```\n\nThey are applied using the declaration order during parsing and serialization. Although the serialization shortens every possible URI using the prefixes, it is possible to expand all of them by adding the empty prefix with an empty value, i.e. a colon (`:`) alone, and it has to be the first prefix. This could be useful to rename the prefixes.\n\nThe order in which the instances are shown is defined as follows:\n\n```properties\norder = \\\n [-]FIELD_NAME_a_0 \\\n [-]FIELD_NAME_a_1 \\\n ...\n [-]FIELD_NAME_a_k\n```\n\nwhere the `-` is optional and used to denote reverse order. For example:\n\n```properties\norder = \\\n id \\\n -author\n```\n\norders the instances by `id` (ascending) and then by author (descending).\n\nThe instances come just after the type definition, with the following syntax:\n\n```properties\nnew =\nFIELD_NAME_0 = VALUE_0\nFIELD_NAME_1 = VALUE_1\n...\nFIELD_NAME_n = VALUE_n\n```\n\nwhere each *FIELD_NAME* is one of the already declared field names in the type and each *VALUE* contains a String accoding to the field type.\n\nThe *values* can be any Tabula String. The blanks (`'\\t'` 0x08, `' '` 0x20) at the beginning and at the end are removed. To declare a multi-line value, each line must finish with backslash (`'\\'` 0x5C), except the last one. For the sake of simplicity there is no difference between a multi-line value or the concatenation of all those lines. This means that:\n\n```properties\nfield_name = \\\n a \\\n b \\\n c\n```\n\nis the same as\n\n```properties\nfield_name = a b c\n```\n\nHowever, the format will normalize and present them differently according to the declared type. Thus, the values of fields with type `List_`... (e.g. `List_String`) will be presented as multi-line values.\n\n\n## Example\n\nThis is an example of a library file. Each book record contains an identifier (`id`), a title (`title`), the authors (`authors`), a link to the abstract on the web (`web`), and a list of links to the documents (`documents`). This file is ordered by identifier.\n\n```properties\n\n\n# simple format 1.0.0\n\ntype = record\n\ndef = \\\n id:String \\\n title:String \\\n authors:List_String \\\n web:URI \\\n documents:List_URI\n\nprefix = \\\n arxiv:https://arxiv.org/\n\norder = \\\n id\n\nnew =\nid = arXiv:1412.2223\ntitle = A topological approach to non-Archimedean Mathematics\nauthors = \\\n Vieri_Benci \\\n Lorenzo_Luperi_Baglini\nweb = https://arxiv.org/abs/1412.2223\ndocuments = \\\n https://arxiv.org/pdf/1412.2223#pdf \\\n https://arxiv.org/ps/1412.2223#ps \\\n https://arxiv.org/format/1412.2223#other\n\nnew =\nid = arXiv:1412.3313\ntitle = Infinitary stability theory\nauthors = \\\n Sebastien_Vasey\nweb = \u0026arxiv;abs/1412.3313\ndocuments = \\\n \u0026arxiv;pdf/1412.3313#pdf \\\n \u0026arxiv;ps/1412.3313#ps \\\n \u0026arxiv;format/1412.3313#other\n\n```\n\nAn example like this one is used for the unit tests.\n\nFor example, the [MainTest](https://github.com/julianmendez/tabula/blob/master/tabula-core/src/test/java/de/tudresden/inf/lat/tabula/main/MainTest.java) class does the following steps:\n\n* read the [example file](https://github.com/julianmendez/tabula/blob/master/tabula-core/src/test/resources/example.properties)\n* add a new field `numberOfAuthors`\n* add to each record the number of authors\n* compare the [expected result](https://github.com/julianmendez/tabula/blob/master/tabula-core/src/test/resources/example-modified.properties)\n\nThis [Bash script](https://github.com/julianmendez/tabula/blob/master/docs/examples/tabula.sh.txt) shows how to start Tabula from the command line.\n\n\n## Source code\n\nTo clone and compile the project:\n\n```\n$ git clone https://github.com/julianmendez/tabula.git\n$ cd tabula\n$ mvn clean install\n```\n\nThe created executable library, its sources, and its Javadoc will be in `tabula-distribution/target`.\n\nTo compile the project offline, first download the dependencies:\n\n```\n$ mvn dependency:go-offline\n```\n\nand once offline, use:\n\n```\n$ mvn --offline clean install\n```\n\nThe bundles uploaded to [Sonatype](https://oss.sonatype.org/) are created with:\n\n```\n$ mvn clean install -DperformRelease=true\n```\n\nand then on each module:\n\n```\n$ cd target\n$ jar -cf bundle.jar tabula-*\n```\n\nand on the main directory:\n\n```\n$ cd target\n$ jar -cf bundle.jar tabula-parent-*\n```\n\nThe version number is updated with:\n\n```\n$ mvn versions:set -DnewVersion=NEW_VERSION\n```\n\nwhere *NEW_VERSION* is the new version.\n\n\n## Author\n\n[Julian Mendez](https://julianmendez.github.io)\n\n\n## License\n\nThis software is distributed under the [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt).\n\n\n## Release notes\n\nSee [release notes](https://julianmendez.github.io/tabula/RELEASE-NOTES.html).\n\n\n## Contact\n\nIn case you need more information, please contact @julianmendez .\n\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjulianmendez%2Ftabula","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjulianmendez%2Ftabula","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjulianmendez%2Ftabula/lists"}