{"id":28781040,"url":"https://github.com/workday/warp-core","last_synced_at":"2025-06-26T11:33:50.865Z","repository":{"id":34621594,"uuid":"129179180","full_name":"Workday/warp-core","owner":"Workday","description":"Scala framework for collecting performance metrics and conducting sound experimental benchmarking.","archived":false,"fork":false,"pushed_at":"2025-04-23T21:49:19.000Z","size":21629,"stargazers_count":13,"open_issues_count":0,"forks_count":17,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-06-17T18:52:02.990Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Scala","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Workday.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING","funding":null,"license":"LICENSE","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,"zenodo":null}},"created_at":"2018-04-12T02:09:44.000Z","updated_at":"2025-04-23T20:34:01.000Z","dependencies_parsed_at":"2023-02-12T07:15:24.228Z","dependency_job_id":"0c7db4ce-8480-41ad-8c77-6a445fc2c5e8","html_url":"https://github.com/Workday/warp-core","commit_stats":null,"previous_names":[],"tags_count":87,"template":false,"template_full_name":null,"purl":"pkg:github/Workday/warp-core","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Workday%2Fwarp-core","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Workday%2Fwarp-core/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Workday%2Fwarp-core/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Workday%2Fwarp-core/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Workday","download_url":"https://codeload.github.com/Workday/warp-core/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Workday%2Fwarp-core/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260592365,"owners_count":23033455,"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","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":[],"created_at":"2025-06-17T18:39:38.194Z","updated_at":"2025-06-26T11:33:50.857Z","avatar_url":"https://github.com/Workday.png","language":"Scala","funding_links":[],"categories":[],"sub_categories":[],"readme":"# warp-core\n\n[![Build Status](https://travis-ci.org/Workday/warp-core.svg?branch=master)](https://travis-ci.org/Workday/warp-core)\n[![Coverage Status](https://coveralls.io/repos/github/Workday/warp-core/badge.svg?branch=master)](https://coveralls.io/github/Workday/warp-core?branch=master)\n[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.workday.warp/warp-core_2.11/badge.svg?subject=scala+2.11)](https://maven-badges.herokuapp.com/maven-central/com.workday.warp/warp-core_2.11)\n[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.workday.warp/warp-core_2.12/badge.svg?subject=scala+2.12)](https://maven-badges.herokuapp.com/maven-central/com.workday.warp/warp-core_2.12)\n[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.workday.warp/warp-core_2.13/badge.svg?subject=scala+2.13)](https://maven-badges.herokuapp.com/maven-central/com.workday.warp/warp-core_2.13)\n\nWARP (Workday Automated Regression Platform) is a flexible, lightweight, (mostly) functional Scala framework for collecting performance metrics and conducting sound experimental benchmarking.\n\nWARP features a domain specific language for describing experimental designs (conducting repeated trials for different experimental groups). Our library allows users to wrap existing tests with layers of measurement collectors that write performance metrics to a relational database. We also allow users to create arbiters to express custom failure criteria and performance requirements. One arbiter included out of the box is the RobustPcaArbiter, which uses machine learning to detect when a test is deviating from expected behavior and signal an alert.\n\nWe believe engineers should reason more scientifically about code performance, and we are excited to provide a platform that allows for easily describing an experiment, collecting benchmark results, and conducting statistical analyses to verify hypotheses about expected performance.\n\nMore detailed documentation can be found [here.](https://workday.github.io/warp-core)\n\n## Getting Started\n\n### Starting local services\n\nYou can start up the required services (note that the included docker-compose file is not intended to be used in production) to run tests with\n```\n$ docker-compose up -d\n```\nAnd test via\n```\n$ ./gradlew clean test\n```\nor to just run unit tests, run the `unitTest` task.\n\nAll port values and service version numbers are in `.env`.\n\n## Code Coverage Requirements\n\nWe use scoverage and coveralls gradle plugins to track code coverage. We enforce that high coverage should be maintained. At time of\nwriting, coverage must be at least 92% for a build to pass. If you want to test coveralls out on your fork, sign in to coveralls\nand get your repo token. Then you can generate the coverage reports and submit them to coveralls using\n```\n$ export COVERALLS_REPO_TOKEN=abcdefg\n$ ./gradlew clean reportScoverage coveralls\n```\n\n## Scalafix\n\nWe use [scalafix](https://scalacenter.github.io/scalafix/) to automatically refactor code. Since we are interested in using semantic rules,\nwe also need to use semanticdb scala compiler plugin, which harvests and dumps semantic information about the symbols and types in our program.\nScalafix semantic rules depend on semanticdb compiler output. Scalafix should be run like this:\n```\n$ ./gradlew clean scalafix\n```\n\n\n## Publishing\nWe use the `maven-publish` gradle plugin.\nhttps://docs.gradle.org/current/userguide/publishing_maven.html\n\nPlease use the included `publish.sh` for uploading artifacts. This script handles some subtle interaction between\ncreating repo tags and scala multiversion plugin.\n\nExample usage:\n```\n./publish.sh snapshot minor local\n```\n\nWill increment minor version component and publish a snapshot (eg 2.3.0-SNAPSHOT) to local maven repo.\n\nTo publish to sonatype, the invocation would be something like:\n```\n./publish.sh candidate minor sonatype\n```\n\nTo publish to sonatype, you'll need to configure your sonatype and signing credentials as project properties:\n\n[create sonatype jira account](https://issues.sonatype.org/secure/Signup!default.jspa)\n\n[create pgp keys](https://central.sonatype.org/pages/working-with-pgp-signatures.html)\n```\nsigning.keyId=BEEF\nsigning.password=abc123\nsigning.secretKeyRingFile=/full/path/to/secring.gpg\n\nsonatypeUsername=jean-luc.picard\nsonatypePassword=makeItSoNumberOne\n```\nSigning is not required for a local publish.\n\n## Scala Multiversion\nWe use [gradle-scala-multiversion-plugin](https://github.com/ADTRAN/gradle-scala-multiversion-plugin)\nto cross-compile the project with different scala-lang major versions and publish artifacts with scala version suffixes.\nThe versions are defined in gradle.properties, however you can also override from the command line:\n```\n$ ./gradlew -PscalaVersions=2.11.8,2.12.6,2.13.5 test\n```\nThis plugin works by repeatedly invoking the gradle task graph with each different scala version specified.\nWithout any version specified, gradle will use the defaultScalaVersion from gradle.properties. This means local IDE builds\nwill use just one scala version. If you need to run with all configured scala versions, pass the project property `allScalaVersions`\n```\n$ ./gradlew -PallScalaVersions test\n```\n\nWe support Scala cross-compilation for 2.11, 2.12, and 2.13, with the only caveat being the `warp-core-gatling` submodule. This is due to Gatling's choice to only compile with one (usually the latest) Scala version.\n\n\n## Versioning\nWe use the `nebula.release` plugin to determine versions.\nhttps://github.com/nebula-plugins/nebula-release-plugin\n\nVersions exist as git tags in the canonical fork. If you are publishing from your fork, you may need to periodically\nsync the tags:\n```\ngit fetch upstream --tags\ngit push origin --tags\n```\n\nThere are 4 types of releases we support:\n  - final\n  - candidate (rc)\n  - devSnapshot (includes some extra information in the version, including branch name and commit hash)\n  - snapshot\n  \nArtifacts with type `snapshot` or `devSnapshot` are published to sonatype snapshots repo, \nwhile `final` and `candidate` artifacts are published to sonatype releases repo.\n\nPlease use the included `publish.sh` script for publishing, as that script handles interaction between creating repo tags\nand scala multiversion. We don't want to create multiple tags during a release process and incorrectly publish some artifacts\nunder the wrong version.\n\n\n## Dependencies\n\nTo enforce repeatable builds while allowing developers to use the flexibility of dynamic dependency ranges, we use the\ngradle's native dependency-locking mechanism. \n\nWe create/update lock files as follows:\n```\n./gradlew resolveAndLockAll --write-locks\n```\n\nNote that you may need to run this task for other scala versions besides the project default scala version \n\n`./gradlew resolveAndLockAll --write-locks -PallScalaVersions`\n\nAlso note that this locks all configurations in one single build execution. If you have updated `versionInfo.gradle`, you probably need to recreate the lock files as well. If any configuration needs to be excluded/filtered, you can do so in the `resolveAndLockAll` step. Please see https://docs.gradle.org/6.2.1/userguide/dependency_locking.html#generating_and_updating_dependency_locks for more detailed usage.\n\nPlease avoid using global locks. We have noticed behavior where this can override the version of scala-library used by the\nzinc compiler.\n\n\n## Common Errors\n\n```\n~/code/warp-core(master*) » gradle clean unitTest --refresh-dependencies\n* What went wrong:\nA problem occurred evaluating root project 'warp-core'.\n\u003e com.google.common.util.concurrent.ExecutionError: java.lang.NoClassDefFoundError: org/gradle/api/artifacts/VersionConstraint\n\n```\n\nYou probably need a newer version of gradle. The above error has been observed with gradle 4.2.1, however version 4.4 works.\nThe root cause appears to be a runtime incompatibility with one of the plugins.\n\n```\n$ docker-compose up -d\n...\nERROR: for mysql  Cannot start service mysql: driver failed programming external connectivity on endpoint warpcore_mysql_1 (31cb1d98ed696bba0c9ef8cdee368186c52c15c2d0c0f69f1ffae0e7db406a3d): Error starting userland proxy: Bind for 0.0.0.0:3306 failed: port is already allocated\nERROR: Encountered errors while bringing up the project.\n```\n\nChange the MySQL port (or that of the offending service) in `.env`\n\n## Authors\n\nNote that this code has been ported from an internal repository and the public commit history does not accurately reflect authorship.\nSee `CONTRIBUTORS.md` for a full list of everyone who has contributed to this project.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fworkday%2Fwarp-core","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fworkday%2Fwarp-core","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fworkday%2Fwarp-core/lists"}