on 962b3ce help sign in
.github/workflows/ci.yaml+13−7
since splitsnapshots
unifiedsplit
@@ -4,14 +4,20 @@ on:
4 push:
4 push:
5jobs:
5jobs:
6 build:
6 build:
7+ runs-on: ${{ matrix.os }}
8+ strategy:
9+ matrix:
10+ ghc: ['ghc884', 'ghc8101']
7− runs-on: ubuntu-latest
11+ os: [ubuntu-latest]
12+ name: GHC ${{ matrix.ghc }}
8 steps:
13 steps:
9 - uses: actions/checkout@v2
14 - uses: actions/checkout@v2
10− - uses: nixbuild/nix-quick-install-action@v21
15+ - uses: cachix/install-nix-action@v10
16+ - uses: cachix/cachix-action@v6
11 with:
17 with:
12− nix_conf: |
18+ name: juspay-nau
13− experimental-features = nix-command flakes
19+ signingKey: '${{ secrets.CACHIX_SIGNING_KEY }}'
20+ # Only needed for private caches
21+ authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'
14 - name: Build and test 🔧
22 - name: Build and test 🔧
15− run: nix build -j 4 -L
23+ run: nix-build -j4 --argstr compiler ${{ matrix.ghc }}
16− - name: Build and test (GHC 8.8) 🔧
17− run: nix build -j 4 -L .#jrec-ghc88
.vscode/extensions.jsondeleted−11
@@ -1,11 +0,0 @@
1−{
2− // See https://go.microsoft.com/fwlink/?LinkId=827846
3− // for the documentation about the extensions.json format
4− "recommendations": [
5− "haskell.haskell",
6− "arrterian.nix-env-selector",
7− "bbenoist.nix",
8− "jnoortheen.nix-ide",
9− "tamasfe.even-better-toml"
10− ]
11−}
.vscode/settings.json+4−5
@@ -1,6 +1,5 @@
1{
1{
2− "editor.formatOnType": true,
3− "editor.formatOnSave": true,
4− "nixEnvSelector.nixFile": "${workspaceRoot}/shell.nix",
2+ "nixEnvSelector.nixShellConfig": "${workspaceRoot}/default.nix",
5− "haskell.manageHLS": "PATH"
3+ "editor.formatOnType": true,
4+ "editor.formatOnSave": true
6−}
5+}
CHANGELOG.md−4
@@ -1,9 +1,5 @@
1# Revision history for rec
1# Revision history for rec
2
2
3−## Unreleased
4−
5−- GHC 9.2 + Aeson 2.0 support
6−
7## 0.1.0.0 -- YYYY-mm-dd
3## 0.1.0.0 -- YYYY-mm-dd
8
4
9* First version. Released on an unsuspecting world.
5* First version. Released on an unsuspecting world.
Setup.hsnew file+2
@@ -0,0 +1,2 @@
1+import Distribution.Simple
2+main = defaultMain
bin/test+1−1
@@ -2,4 +2,4 @@
2set -xe
2set -xe
3
3
4# NOTE: ghcid should be run with -W to allow warnings from should-not-typecheck
4# NOTE: ghcid should be run with -W to allow warnings from should-not-typecheck
5−nix develop -c sh -c "ghcid $* -W -c 'cabal new-repl test:jrec-test' -T \":main $*\""
5+nix-shell --pure --run "ghcid $* -W -c 'cabal new-repl test:jrec-test' -T \":main $*\""
default.nixnew file+36
@@ -0,0 +1,36 @@
1+let
2+ nixpkgsSrc = builtins.fetchTarball {
3+ url = "https://github.com/nixos/nixpkgs/archive/76f2e271a2ef.tar.gz";
4+ sha256 = "1r4da3kyghqq7vzya5yb295jpnha1fgp755bi6wda4fmhyaynnsp";
5+ };
6+ gitignoreSrc = builtins.fetchTarball {
7+ url = "https://github.com/hercules-ci/gitignore/archive/c4662e6.tar.gz";
8+ sha256 = "1npnx0h6bd0d7ql93ka7azhj40zgjp815fw2r6smg8ch9p7mzdlx";
9+ };
10+ inherit (import gitignoreSrc { inherit (pkgs); }) gitignoreSource;
11+in {
12+ compiler ? "default",
13+ pkgs ? import nixpkgsSrc {},
14+}:
15+ let
16+ haskellPackages =
17+ if compiler == "default"
18+ then pkgs.haskellPackages
19+ else pkgs.haskell.packages.${compiler};
20+ projectDrv =
21+ haskellPackages.override {
22+ overrides = self: super: with pkgs.haskell.lib; {
23+ jrec = self.callCabal2nix "jrec" (gitignoreSource ./.) {};
24+ # https://github.com/lspitzner/data-tree-print/pull/2
25+ data-tree-print = doJailbreak super.data-tree-print;
26+ };
27+ };
28+ projectShell =
29+ projectDrv.shellFor {
30+ packages = p: [ p.jrec ];
31+ buildInputs = with projectDrv; [
32+ cabal-install
33+ ];
34+ };
35+ in
36+ if pkgs.lib.inNixShell then projectShell else projectDrv.jrec
flake.lock+36−20
@@ -18,36 +18,36 @@
18 "type": "github"
18 "type": "github"
19 }
19 }
20 },
20 },
21+ "gitignore": {
22+ "inputs": {
21− "nixpkgs": {
23+ "nixpkgs": "nixpkgs"
24+ },
22 "locked": {
25 "locked": {
23− "lastModified": 1678594102,
26+ "lastModified": 1660459072,
24− "narHash": "sha256-OHAHYiMWJFPNxuW/PcOMlSD2tvXnEYC1jxREBADHwwQ=",
27+ "narHash": "sha256-8DFJjXG8zqoONA1vXtgeKXy68KdJL5UaXR8NtVMUbx8=",
25− "owner": "nixos",
28+ "owner": "hercules-ci",
26− "repo": "nixpkgs",
29+ "repo": "gitignore.nix",
27− "rev": "796b4a3c1d903c4b9270cd2548fe46f524eeb886",
30+ "rev": "a20de23b925fd8264fd7fad6454652e142fd7f73",
28 "type": "github"
31 "type": "github"
29 },
32 },
30 "original": {
33 "original": {
31− "owner": "nixos",
34+ "owner": "hercules-ci",
32− "ref": "nixpkgs-unstable",
35+ "repo": "gitignore.nix",
33− "repo": "nixpkgs",
34 "type": "github"
36 "type": "github"
35 }
37 }
36 },
38 },
37− "nixpkgs-ghc88": {
39+ "nixpkgs": {
38 "locked": {
40 "locked": {
39− "lastModified": 1596466290,
41+ "lastModified": 1632846328,
40− "narHash": "sha256-V1vrlYfVEdW4iauUc58LCtorSxLLF+X/PhjD5+dQjeQ=",
42+ "narHash": "sha256-sFi6YtlGK30TBB9o6CW7LG9mYHkgtKeWbSLAjjrNTX0=",
41− "owner": "nixos",
43+ "owner": "NixOS",
42 "repo": "nixpkgs",
44 "repo": "nixpkgs",
43− "rev": "76f2e271a2ef9de3734dcc9d366a42d6bfb18e82",
45+ "rev": "2b71ddd869ad592510553d09fe89c9709fa26b2b",
44 "type": "github"
46 "type": "github"
45 },
47 },
46 "original": {
48 "original": {
47− "owner": "nixos",
48− "ref": "76f2e271a2ef",
49− "repo": "nixpkgs",
49+ "id": "nixpkgs",
50− "type": "github"
50+ "type": "indirect"
51 }
51 }
52 },
52 },
53 "nixpkgs-lib": {
53 "nixpkgs-lib": {
@@ -68,11 +68,27 @@
68 "type": "github"
68 "type": "github"
69 }
69 }
70 },
70 },
71+ "nixpkgs_2": {
72+ "locked": {
73+ "lastModified": 1678500213,
74+ "narHash": "sha256-A5s2rXawJ+dCThkMXoMuYW8dgyUmkElcyfVJUot/Vr0=",
75+ "owner": "nixos",
76+ "repo": "nixpkgs",
77+ "rev": "2ce9b9842b5e63884dfc3dea6689769e2a1ea309",
78+ "type": "github"
79+ },
80+ "original": {
81+ "owner": "nixos",
82+ "ref": "nixpkgs-unstable",
83+ "repo": "nixpkgs",
84+ "type": "github"
85+ }
86+ },
71 "root": {
87 "root": {
72 "inputs": {
88 "inputs": {
73 "flake-parts": "flake-parts",
89 "flake-parts": "flake-parts",
74− "nixpkgs": "nixpkgs",
90+ "gitignore": "gitignore",
75− "nixpkgs-ghc88": "nixpkgs-ghc88"
91+ "nixpkgs": "nixpkgs_2"
76 }
92 }
77 }
93 }
78 },
94 },
flake.nix+16−13
@@ -1,34 +1,37 @@
1{
1{
2 inputs = {
2 inputs = {
3 nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
3 nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
4− nixpkgs-ghc88.url = "github:nixos/nixpkgs/76f2e271a2ef";
5 flake-parts.url = "github:hercules-ci/flake-parts";
4 flake-parts.url = "github:hercules-ci/flake-parts";
5+ gitignore.url = "github:hercules-ci/gitignore.nix";
6 };
6 };
7− outputs = inputs@{ nixpkgs, flake-parts, ... }:
7+ outputs = inputs@{ nixpkgs, flake-parts, gitignore, ... }:
8 flake-parts.lib.mkFlake { inherit inputs; } {
8 flake-parts.lib.mkFlake { inherit inputs; } {
9 systems = nixpkgs.lib.systems.flakeExposed;
9 systems = nixpkgs.lib.systems.flakeExposed;
10 perSystem = { self', inputs', pkgs, system, ... }:
10 perSystem = { self', inputs', pkgs, system, ... }:
11 let
11 let
12+ inherit (gitignore.lib) gitignoreSource;
13+ fixCyclicReference = drv:
14+ pkgs.haskell.lib.overrideCabal drv (_: {
15+ enableSeparateBinOutput = false;
16+ });
12 overlay = self: super: {
17 overlay = self: super: {
13− jrec = self.callCabal2nix "jrec" ./. { };
18+ jrec = self.callCabal2nix "jrec" (gitignoreSource ./.) { };
14− };
19+ # Workaround for https://github.com/NixOS/nixpkgs/issues/140774
15− ghcVersions = {
20+ haskell-language-server = super.haskell-language-server.overrideScope (lself: lsuper: {
16− ghc88 = inputs.nixpkgs-ghc88.legacyPackages.${system}.haskellPackages.extend overlay;
21+ ormolu = fixCyclicReference super.ormolu;
17− ghc92 = pkgs.haskellPackages.extend overlay;
22+ });
18 };
23 };
24+ haskellPackages' = pkgs.haskellPackages.extend overlay;
19 in
25 in
20 {
26 {
21− packages.default = ghcVersions.ghc92.jrec;
27+ packages.default = haskellPackages'.jrec;
22− devShells.default = ghcVersions.ghc92.shellFor {
28+ devShells.default = haskellPackages'.shellFor {
23 packages = p: [ p.jrec ];
29 packages = p: [ p.jrec ];
24− buildInputs = with ghcVersions.ghc92; [
30+ buildInputs = with haskellPackages'; [
25 cabal-install
31 cabal-install
26− ghcid
27 haskell-language-server
32 haskell-language-server
28 ];
33 ];
29 };
34 };
30− # Expose jrec built with GHC 8.8 so it can be tested in CI.
31− packages.jrec-ghc88 = ghcVersions.ghc88.jrec;
32 };
35 };
33 };
36 };
34}
37}
hie.yaml+16−5
@@ -1,6 +1,17 @@
1cradle:
1cradle:
2+ multi:
3+ - path: ./Setup.hs
4+ config:
5+ cradle:
6+ direct:
7+ arguments:
8+ - "-package Cabal"
9+ - "-package base"
10+ - path: ./
11+ config:
12+ cradle:
2− cabal:
13+ cabal:
3− - path: "./src"
14+ - path: "./src"
4− component: "lib:jrec"
15+ component: "lib:jrec"
5− - path: "./test"
16+ - path: "./test"
6− component: "test:jrec-test"
17+ component: "test:jrec-test"
jrec.cabal−3
@@ -97,9 +97,6 @@ test-suite jrec-test
97 hs-source-dirs: test, src
97 hs-source-dirs: test, src
98 main-is: Spec.hs
98 main-is: Spec.hs
99 cpp-options: -DWITH_AESON -DWITH_GENERICS
99 cpp-options: -DWITH_AESON -DWITH_GENERICS
100− other-modules:
101− JRecShouldNotTypecheckSpec
102− JRecSpec
103 build-depends:
100 build-depends:
104 base,
101 base,
105 hspec,
102 hspec,
shell.nixdeleted−1
@@ -1 +0,0 @@
1−(builtins.getFlake ("git+file://" + toString ./.)).devShells.${builtins.currentSystem}.default
src/JRec/Internal.hs+6−13
@@ -46,14 +46,7 @@ import GHC.TypeLits
46import qualified Optics.Lens as OL
46import qualified Optics.Lens as OL
47import Unsafe.Coerce
47import Unsafe.Coerce
48import Prelude
48import Prelude
49−#if MIN_VERSION_aeson(2,0,0)
50−import Data.Aeson.Key (fromText, fromString)
49+import qualified Data.Aeson.Key as Key
51−#else
52−fromText :: a -> a
53−fromText = id
54−fromString :: String -> T.Text
55−fromString = T.pack
56−#endif
57
50
58-- | Field named @l@ labels value of type @t@ adapted from the awesome /labels/ package.
51-- | Field named @l@ labels value of type @t@ adapted from the awesome /labels/ package.
59-- Example: @(#name := \"Chris\") :: (\"name\" := String)@
52-- Example: @(#name := \"Chris\") :: (\"name\" := String)@
@@ -566,16 +559,16 @@ class ToJSON a => EncodeField a where
566
559
567instance ToJSON a => EncodeField a where
560instance ToJSON a => EncodeField a where
568 encodeField = pure . toJSON
561 encodeField = pure . toJSON
569− encodeKV k v = fromText k .= v
562+ encodeKV k v = Key.fromText k .= v
570
563
571instance {-# OVERLAPS #-} ToJSON a => EncodeField (Maybe a) where
564instance {-# OVERLAPS #-} ToJSON a => EncodeField (Maybe a) where
572 encodeField = fmap toJSON
565 encodeField = fmap toJSON
573 encodeKV _ Nothing = mempty
566 encodeKV _ Nothing = mempty
574− encodeKV k v = fromText k .= v
567+ encodeKV k v = Key.fromText k .= v
575
568
576recToValue :: forall lts. (RecApply lts lts EncodeField) => JSONOptions -> Rec lts -> Value
569recToValue :: forall lts. (RecApply lts lts EncodeField) => JSONOptions -> Rec lts -> Value
577recToValue options r =
570recToValue options r =
578− object $ catMaybes $ reflectRec @EncodeField Proxy (\k v -> (fromString (fieldTransform options k),) <$> encodeField v) r
571+ object $ catMaybes $ reflectRec @EncodeField Proxy (\k v -> (Key.fromString (fieldTransform options k),) <$> encodeField v) r
579
572
580recToEncoding :: forall lts. (RecApply lts lts EncodeField) => JSONOptions -> Rec lts -> Encoding
573recToEncoding :: forall lts. (RecApply lts lts EncodeField) => JSONOptions -> Rec lts -> Encoding
581recToEncoding options r =
574recToEncoding options r =
@@ -680,10 +673,10 @@ class FromJSON a => ParseField a where
680 parseField :: Object -> T.Text -> Parser a
673 parseField :: Object -> T.Text -> Parser a
681
674
682instance FromJSON a => ParseField a where
675instance FromJSON a => ParseField a where
683− parseField o k = o .: fromText k
676+ parseField o k = o .: Key.fromText k
684
677
685instance {-# OVERLAPS #-} FromJSON a => ParseField (Maybe a) where
678instance {-# OVERLAPS #-} FromJSON a => ParseField (Maybe a) where
686− parseField o k = o .:? fromText k
679+ parseField o k = o .:? Key.fromText k
687
680
688instance
681instance
689 ( KnownSymbol l,
682 ( KnownSymbol l,