{"id":23613696,"url":"https://github.com/freckle/hspec-junit-formatter","last_synced_at":"2025-07-14T03:10:00.206Z","repository":{"id":42621091,"uuid":"177818584","full_name":"freckle/hspec-junit-formatter","owner":"freckle","description":"JUnit style xml output for hspec","archived":false,"fork":false,"pushed_at":"2025-07-07T13:24:34.000Z","size":105,"stargazers_count":12,"open_issues_count":0,"forks_count":3,"subscribers_count":24,"default_branch":"main","last_synced_at":"2025-07-07T14:46:04.706Z","etag":null,"topics":["ghvm-managed"],"latest_commit_sha":null,"homepage":"","language":"Haskell","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/freckle.png","metadata":{"files":{"readme":"README.lhs","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2019-03-26T15:37:22.000Z","updated_at":"2025-07-07T13:24:37.000Z","dependencies_parsed_at":"2025-05-13T08:45:41.131Z","dependency_job_id":null,"html_url":"https://github.com/freckle/hspec-junit-formatter","commit_stats":{"total_commits":64,"total_committers":4,"mean_commits":16.0,"dds":0.390625,"last_synced_commit":"278d98cfc2593950c543634e0352af22777301ff"},"previous_names":[],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/freckle/hspec-junit-formatter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freckle%2Fhspec-junit-formatter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freckle%2Fhspec-junit-formatter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freckle%2Fhspec-junit-formatter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freckle%2Fhspec-junit-formatter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/freckle","download_url":"https://codeload.github.com/freckle/hspec-junit-formatter/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freckle%2Fhspec-junit-formatter/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265237018,"owners_count":23732504,"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":["ghvm-managed"],"created_at":"2024-12-27T17:18:48.586Z","updated_at":"2025-07-14T03:10:00.160Z","avatar_url":"https://github.com/freckle.png","language":"Haskell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# hspec-junit-formatter\n\n[![Hackage](https://img.shields.io/hackage/v/hspec-junit-formatter.svg?style=flat)](https://hackage.haskell.org/package/hspec-junit-formatter)\n[![Stackage Nightly](http://stackage.org/package/hspec-junit-formatter/badge/nightly)](http://stackage.org/nightly/package/hspec-junit-formatter)\n[![Stackage LTS](http://stackage.org/package/hspec-junit-formatter/badge/lts)](http://stackage.org/lts/package/hspec-junit-formatter)\n[![CI](https://github.com/freckle/hspec-junit-formatter/actions/workflows/ci.yml/badge.svg)](https://github.com/freckle/hspec-junit-formatter/actions/workflows/ci.yml)\n\nA `JUnit` XML runner/formatter for [`hspec`](http://hspec.github.io/).\n\n\u003c!--\n```haskell\n{-# OPTIONS_GHC -Wno-unused-top-binds #-}\n\nmodule Main (main) where\nimport Prelude\nimport Text.Markdown.Unlit ()\n\n-- Used in a later example\nimport qualified Test.Hspec.JUnit.Formatter.Env as FormatterEnv\n```\n--\u003e\n\n## Usage (with `hspec-discover`)\n\nPlace the following in `test/SpecHook.hs`:\n\n```haskell\nimport Test.Hspec\nimport Test.Hspec.JUnit.Config\nimport qualified Test.Hspec.JUnit.Formatter as Formatter\n\nhook :: Spec -\u003e Spec\nhook = Formatter.use $ defaultJUnitConfig \"test-suite\"\n```\n\nThis _replaces_ the usual formatter, so only a JUnit report is generated and no\nother output is visible.\n\n### Registering instead of using\n\nTo make the JUnit formatter available for use with `--format`, but not used by\ndefault, use `register`:\n\n```haskell\nhook2 :: Spec -\u003e Spec\nhook2 = Formatter.register $ defaultJUnitConfig \"test-suite\"\n```\n\n\n### Adding a JUnit report\n\nTo produce a JUnit report _in addition to normal output_, use `add`:\n\n```haskell\nhook3 :: Spec -\u003e Spec\nhook3 = Formatter.add $ defaultJUnitConfig \"test-suite\"\n```\n\n### Environment Configuration\n\nTo configure things via @JUNIT_@-prefixed environment variables, import\n`Formatter.Env` instead. It exports all the same functions:\n\n```hs\nimport qualified Test.Hspec.JUnit.Formatter.Env as FormatterEnv\n```\n\nAnd set the necessary variables,\n\n```\nJUNIT_OUTPUT_DIRECTORY=/tmp\nJUNIT_SUITE_NAME=my-tests\n```\n\n```haskell\nhook4 :: Spec -\u003e Spec\nhook4 = FormatterEnv.add\n```\n\n### Environment Enabling\n\nTo only apply a hook if `JUNIT_ENABLED=1`, wrap it in `whenEnabled`:\n\n```\nJUNIT_ENABLED=1\n```\n\n```haskell\nhook5 :: Spec -\u003e Spec\nhook5 = FormatterEnv.whenEnabled FormatterEnv.add\n```\n\n### Without `hspec-discover`\n\nHooks are just functions of type `Spec -\u003e Spec`, so you can apply them right\nbefore calling `hspec` in `main`:\n\n```haskell\nmain :: IO ()\nmain = hspec $ FormatterEnv.whenEnabled FormatterEnv.add spec\n\nspec :: Spec\nspec = describe \"Addition\" $ do\n  it \"adds\" $ do\n    2 + 2 `shouldBe` (4 :: Int)\n```\n\n## Golden Testing\n\nThis project's test suite uses [hspec-golden][] to generate an XML report for\n[`Example.hs`](./tests/Example.hs) and then compare that with golden XML files\nchecked into the repository. If your work changes things in a\nfunctionally-correct way, but that diverges from the golden XML files, you need\nto regenerate them.\n\n1. Run `rm tests/golden*.xml`\n2. Run the specs again\n\nWe maintain specific golden XML files for GHC 8.x vs 9.x, so you will need to\nre-run the test suite with at least one of each series to regenerate all the\nnecessary files.\n\n---\n\n[LICENSE](./LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffreckle%2Fhspec-junit-formatter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffreckle%2Fhspec-junit-formatter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffreckle%2Fhspec-junit-formatter/lists"}