From 07efb51bae20fd91cc2ec162d744a6e069f276b3 Mon Sep 17 00:00:00 2001 From: Alexey Kuleshevich Date: Sun, 19 Oct 2025 22:30:03 -0600 Subject: [PATCH 1/4] Update GHC versions on CI --- .github/workflows/haskell.yml | 27 +++++++++++++----------- Color/Color.cabal | 6 +++--- stack/ghc-9.10.3.yaml | 5 +++++ stack/{ghc-9.6.6.yaml => ghc-9.6.7.yaml} | 0 stack/ghc-9.8.4.yaml | 2 +- 5 files changed, 24 insertions(+), 16 deletions(-) create mode 100644 stack/ghc-9.10.3.yaml rename stack/{ghc-9.6.6.yaml => ghc-9.6.7.yaml} (100%) diff --git a/.github/workflows/haskell.yml b/.github/workflows/haskell.yml index 69eaf67..b3a29de 100644 --- a/.github/workflows/haskell.yml +++ b/.github/workflows/haskell.yml @@ -35,8 +35,9 @@ jobs: - { os: Ubuntu-latest, resolver: lts-19, ghc: "9.0.2" } - { os: Ubuntu-latest, resolver: lts-20, ghc: "9.2.8" } - { os: Ubuntu-latest, resolver: lts-21, ghc: "9.4.8" } - - { os: Ubuntu-latest, resolver: lts-22, ghc: "9.6.6" } + - { os: Ubuntu-latest, resolver: lts-22, ghc: "9.6.7" } - { os: Ubuntu-latest, resolver: lts-23, ghc: "9.8.4" } + - { os: Ubuntu-latest, resolver: lts-24, ghc: "9.10.3" } - { os: Ubuntu-latest, resolver: nightly } - { os: Windows-latest, resolver: lts-12, ghc: "8.4.4" } - { os: Windows-latest, resolver: lts-14, ghc: "8.6.5" } @@ -45,8 +46,9 @@ jobs: - { os: Windows-latest, resolver: lts-19, ghc: "9.0.2" } - { os: Windows-latest, resolver: lts-20, ghc: "9.2.8" } - { os: Windows-latest, resolver: lts-21, ghc: "9.4.8" } - - { os: Windows-latest, resolver: lts-22, ghc: "9.6.6" } + - { os: Windows-latest, resolver: lts-22, ghc: "9.6.7" } - { os: Windows-latest, resolver: lts-23, ghc: "9.8.4" } + - { os: Windows-latest, resolver: lts-24, ghc: "9.10.3" } - { os: Windows-latest, resolver: nightly } - { os: MacOS-13, resolver: lts-12, ghc: "8.4.4" } - { os: MacOS-13, resolver: lts-14, ghc: "8.6.5" } @@ -55,8 +57,9 @@ jobs: - { os: MacOS-13, resolver: lts-19, ghc: "9.0.2" } - { os: MacOS-latest, resolver: lts-20, ghc: "9.2.8" } - { os: MacOS-latest, resolver: lts-21, ghc: "9.4.8" } - - { os: MacOS-latest, resolver: lts-22, ghc: "9.6.6" } + - { os: MacOS-latest, resolver: lts-22, ghc: "9.6.7" } - { os: MacOS-latest, resolver: lts-23, ghc: "9.8.4" } + - { os: MacOS-latest, resolver: lts-24, ghc: "9.10.3" } - { os: MacOS-latest, resolver: nightly } env: @@ -131,24 +134,24 @@ jobs: - { cabal: "3.14", os: Ubuntu-latest, ghc: "9.0.2" } - { cabal: "3.14", os: Ubuntu-latest, ghc: "9.2.8" } - { cabal: "3.14", os: Ubuntu-latest, ghc: "9.4.8" } - - { cabal: "3.14", os: Ubuntu-latest, ghc: "9.6.6" } + - { cabal: "3.14", os: Ubuntu-latest, ghc: "9.6.7" } - { cabal: "3.14", os: Ubuntu-latest, ghc: "9.8.2" } - - { cabal: "3.14", os: Ubuntu-latest, ghc: "9.10.1" } - - { cabal: "3.14", os: Ubuntu-latest, ghc: "9.12.1" } + - { cabal: "3.14", os: Ubuntu-latest, ghc: "9.10.3" } + - { cabal: "3.14", os: Ubuntu-latest, ghc: "9.12.2" } - { cabal: "3.14", os: Windows-latest, ghc: "9.0.2" } - { cabal: "3.14", os: Windows-latest, ghc: "9.2.8" } - { cabal: "3.14", os: Windows-latest, ghc: "9.4.8" } - - { cabal: "3.14", os: Windows-latest, ghc: "9.6.6" } + - { cabal: "3.14", os: Windows-latest, ghc: "9.6.7" } - { cabal: "3.14", os: Windows-latest, ghc: "9.8.2" } - - { cabal: "3.14", os: Windows-latest, ghc: "9.10.1" } - - { cabal: "3.14", os: Windows-latest, ghc: "9.12.1" } + - { cabal: "3.14", os: Windows-latest, ghc: "9.10.3" } + - { cabal: "3.14", os: Windows-latest, ghc: "9.12.2" } - { cabal: "3.14", os: MacOS-13, ghc: "9.0.2" } - { cabal: "3.14", os: MacOS-latest, ghc: "9.2.8" } - { cabal: "3.14", os: MacOS-latest, ghc: "9.4.8" } - - { cabal: "3.14", os: MacOS-latest, ghc: "9.6.6" } + - { cabal: "3.14", os: MacOS-latest, ghc: "9.6.7" } - { cabal: "3.14", os: MacOS-latest, ghc: "9.8.2" } - - { cabal: "3.14", os: MacOS-latest, ghc: "9.10.1" } - - { cabal: "3.14", os: MacOS-latest, ghc: "9.12.1" } + - { cabal: "3.14", os: MacOS-latest, ghc: "9.10.3" } + - { cabal: "3.14", os: MacOS-latest, ghc: "9.12.2" } env: cache-version: v0 # bump up this version to invalidate currently stored cache diff --git a/Color/Color.cabal b/Color/Color.cabal index f3789a3..80d01e0 100644 --- a/Color/Color.cabal +++ b/Color/Color.cabal @@ -22,10 +22,10 @@ tested-with: GHC == 8.4.4 , GHC == 9.0.2 , GHC == 9.2.8 , GHC == 9.4.8 - , GHC == 9.6.6 + , GHC == 9.6.7 , GHC == 9.8.4 - , GHC == 9.10.1 - , GHC == 9.12.1 + , GHC == 9.10.3 + , GHC == 9.12.2 library hs-source-dirs: src diff --git a/stack/ghc-9.10.3.yaml b/stack/ghc-9.10.3.yaml new file mode 100644 index 0000000..8137e42 --- /dev/null +++ b/stack/ghc-9.10.3.yaml @@ -0,0 +1,5 @@ +resolver: lts-24.16 +system-ghc: true +packages: +- ../Color +extra-deps: [] diff --git a/stack/ghc-9.6.6.yaml b/stack/ghc-9.6.7.yaml similarity index 100% rename from stack/ghc-9.6.6.yaml rename to stack/ghc-9.6.7.yaml diff --git a/stack/ghc-9.8.4.yaml b/stack/ghc-9.8.4.yaml index 9216577..d90650d 100644 --- a/stack/ghc-9.8.4.yaml +++ b/stack/ghc-9.8.4.yaml @@ -1,4 +1,4 @@ -resolver: lts-23.00 +resolver: lts-23.28 system-ghc: true packages: - ../Color From 0e4d6b29e3e2222ae8838c0d26f3a61bbe7124a8 Mon Sep 17 00:00:00 2001 From: Alexey Kuleshevich Date: Sun, 19 Oct 2025 22:32:36 -0600 Subject: [PATCH 2/4] Fix GithubActions --- .github/workflows/{haskell.yml => haskell.yaml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{haskell.yml => haskell.yaml} (100%) diff --git a/.github/workflows/haskell.yml b/.github/workflows/haskell.yaml similarity index 100% rename from .github/workflows/haskell.yml rename to .github/workflows/haskell.yaml From af842562796b31f3cd912e4b7867b22299acd406 Mon Sep 17 00:00:00 2001 From: Alexey Kuleshevich Date: Sun, 19 Oct 2025 22:36:00 -0600 Subject: [PATCH 3/4] Remove conditional on ghc-9.12 in CI --- .github/workflows/haskell.yaml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/.github/workflows/haskell.yaml b/.github/workflows/haskell.yaml index b3a29de..a694d01 100644 --- a/.github/workflows/haskell.yaml +++ b/.github/workflows/haskell.yaml @@ -179,12 +179,10 @@ jobs: - name: Configure run: | set -ex - # Remove this conditional when criterion and its deps are compatible with ghc-9.12 - if [[ "${{ matrix.ghc }}" == "9.12.1" ]]; then - cabal configure --haddock-all --enable-tests - else - cabal configure --haddock-all --enable-tests --enable-benchmarks - fi + - name: Configure + run: | + set -ex + cabal configure --haddock-all --enable-tests --enable-benchmarks - name: Build dependencies id: build-dependencies From af8b6f8b787a65d8dc5cfdb51cc2b0f14e3a9c50 Mon Sep 17 00:00:00 2001 From: Alexey Kuleshevich Date: Sun, 19 Oct 2025 23:26:20 -0600 Subject: [PATCH 4/4] Switch to lenient testing for LCH-OKLAB --- Color/tests/Graphics/Color/Model/Common.hs | 2 +- Color/tests/Graphics/Color/Space/Common.hs | 18 +++++++++--------- .../Graphics/Color/Space/OKLAB/LAB/LCHSpec.hs | 2 +- .../Graphics/Color/Space/OKLAB/LABSpec.hs | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Color/tests/Graphics/Color/Model/Common.hs b/Color/tests/Graphics/Color/Model/Common.hs index 6c0b763..3d1354d 100644 --- a/Color/tests/Graphics/Color/Model/Common.hs +++ b/Color/tests/Graphics/Color/Model/Common.hs @@ -205,7 +205,7 @@ epsilonEqColorTol epsilon x y = property $ epsilonColorExpect epsilon x y -- | Same as `epsilonEqColorTol` but with indexed counterexample. epsilonEqColorTolIx :: - (ColorModel cs e, RealFloat e) => e -> Int -> Color cs e -> Color cs e -> Property + (ColorModel cs e, RealFloat e, HasCallStack) => e -> Int -> Color cs e -> Color cs e -> Property epsilonEqColorTolIx tol ix expected actual = counterexample ("Index: " ++ show ix) $ epsilonEqColorTol tol expected actual diff --git a/Color/tests/Graphics/Color/Space/Common.hs b/Color/tests/Graphics/Color/Space/Common.hs index cb5db2c..50de606 100644 --- a/Color/tests/Graphics/Color/Space/Common.hs +++ b/Color/tests/Graphics/Color/Space/Common.hs @@ -31,7 +31,7 @@ instance (Elevator e, Random e) => Arbitrary (Color (XYZ i) e) where prop_toFromColorXYZ :: - forall cs e i. (ColorSpace cs i e, RealFloat e) + forall cs e i. (ColorSpace cs i e, RealFloat e, HasCallStack) => Color cs e -> Property prop_toFromColorXYZ c = c `epsilonEqColor` fromColorXYZ (toColorXYZ c :: Color (XYZ i) Double) @@ -39,26 +39,26 @@ prop_toFromColorXYZ c = c `epsilonEqColor` fromColorXYZ (toColorXYZ c :: Color ( -- For RGB standards, that have matrices rounded to 4 digits after the decimal point prop_toFromLenientColorXYZ :: - forall cs e i. (ColorSpace cs i e, RealFloat e) + forall cs e i. (ColorSpace cs i e, RealFloat e, HasCallStack) => e -> Color cs e -> Property prop_toFromLenientColorXYZ epsilon c = epsilonEqColorTol epsilon c (fromColorXYZ (toColorXYZ c :: Color (XYZ i) Double)) -prop_LuminanceColorXYZ :: forall cs e i . ColorSpace cs i e => Color cs e -> Property +prop_LuminanceColorXYZ :: forall cs e i . (ColorSpace cs i e, HasCallStack) => Color cs e -> Property prop_LuminanceColorXYZ c = (luminance c :: Color (Y i) Float) `epsilonEqColor` luminance (toColorXYZ c :: Color (XYZ i) Float) prop_toFromBaseSpace :: - forall cs e i. (ColorSpace cs i e, ColorSpace (BaseSpace cs) i e, RealFloat e) + forall cs e i. (ColorSpace cs i e, ColorSpace (BaseSpace cs) i e, RealFloat e, HasCallStack) => Color cs e -> Property prop_toFromBaseSpace c = c `epsilonEqColor` fromBaseSpace (toBaseSpace c) prop_toFromBaseSpaceLenient :: - forall cs e i. (ColorSpace cs i e, ColorSpace (BaseSpace cs) i e, RealFloat e) + forall cs e i. (ColorSpace cs i e, ColorSpace (BaseSpace cs) i e, RealFloat e, HasCallStack) => e -> Color cs e -> Property @@ -72,14 +72,14 @@ prop_toFromBaseModel :: prop_toFromBaseModel c = c === fromBaseModel (toBaseModel c) prop_toApplyGrayscale :: - forall cs e i. (ColorSpace cs i e, RealFloat e) + forall cs e i. (ColorSpace cs i e, RealFloat e, HasCallStack) => e -> Color cs e -> Property prop_toApplyGrayscale epsilon c = epsilonEqColorTol epsilon c $ applyGrayscale c id prop_toReplaceGrayscale :: - forall cs e i. (ColorSpace cs i e, RealFloat e) + forall cs e i. (ColorSpace cs i e, RealFloat e, HasCallStack) => e -> Color cs e -> Property @@ -87,7 +87,7 @@ prop_toReplaceGrayscale epsilon c = epsilonEqColorTol epsilon c (replaceGrayscale c (grayscale c)) prop_toApplyGrayscaleAsReplace :: - forall cs e i. (ColorSpace cs i e, RealFloat e) + forall cs e i. (ColorSpace cs i e, RealFloat e, HasCallStack) => e -> Color cs e -> Fun (Color X e) (Color X e) @@ -100,7 +100,7 @@ prop_toApplyGrayscaleAsReplace epsilon c f = prop_toReplaceGrayscaleAsApply :: - forall cs e i. (ColorSpace cs i e, RealFloat e) + forall cs e i. (ColorSpace cs i e, RealFloat e, HasCallStack) => e -> Color cs e -> Color X e diff --git a/Color/tests/Graphics/Color/Space/OKLAB/LAB/LCHSpec.hs b/Color/tests/Graphics/Color/Space/OKLAB/LAB/LCHSpec.hs index 7e6392e..1fcc25e 100644 --- a/Color/tests/Graphics/Color/Space/OKLAB/LAB/LCHSpec.hs +++ b/Color/tests/Graphics/Color/Space/OKLAB/LAB/LCHSpec.hs @@ -17,7 +17,7 @@ spec :: Spec spec = describe "OKLCH" $ do colorModelSpec @OKLCH @Word "LCH-OKLAB" - colorSpaceSpec @OKLCH @Double + colorSpaceLenientSpec @OKLCH @Double 1e-9 prop "lab2lch . lch2lab" $ \(lab :: Color OKLAB Double) -> lab `epsilonEqColor` lch2lab (lab2lch lab) prop "lch2lab . lab2lch" $ \(lch :: Color OKLCH Double) -> diff --git a/Color/tests/Graphics/Color/Space/OKLAB/LABSpec.hs b/Color/tests/Graphics/Color/Space/OKLAB/LABSpec.hs index c0eb6ad..8bbc7dc 100644 --- a/Color/tests/Graphics/Color/Space/OKLAB/LABSpec.hs +++ b/Color/tests/Graphics/Color/Space/OKLAB/LABSpec.hs @@ -15,4 +15,4 @@ instance (Elevator e, Random e) => Arbitrary (Color OKLAB e) where spec :: Spec spec = describe "OKLAB" $ do colorModelSpec @OKLAB @Word "OKLAB" - colorSpaceLenientSpec @OKLAB @Double 1e-10 + colorSpaceLenientSpec @OKLAB @Double 1e-9