From 89e0084b4aea70ef044ccb39f50ad7f61bf3c2bc Mon Sep 17 00:00:00 2001 From: Tom Sydney Kerckhove Date: Wed, 21 Oct 2020 15:02:38 +0200 Subject: [PATCH 1/3] First draft of the nix client generator function --- default.nix | 36 +++++++++++++++-------------- nix/example-client.nix | 16 +++++++++++++ nix/generate-client.nix | 45 ++++++++++++++++++++++++++++++++++++ nix/gitignore-src.nix | 13 +++++++++++ nix/nixpkgs-version.nix | 4 ++++ nix/nixpkgs.nix | 8 +++++++ nix/overlay.nix | 51 +++++++++++++++++++++++++++++++++++++++++ nix/pkgs.nix | 13 +++++++++++ 8 files changed, 169 insertions(+), 17 deletions(-) create mode 100644 nix/example-client.nix create mode 100644 nix/generate-client.nix create mode 100644 nix/gitignore-src.nix create mode 100644 nix/nixpkgs-version.nix create mode 100644 nix/nixpkgs.nix create mode 100644 nix/overlay.nix create mode 100644 nix/pkgs.nix diff --git a/default.nix b/default.nix index 8e64348..260d36a 100644 --- a/default.nix +++ b/default.nix @@ -1,17 +1,19 @@ - let - nix-pre-commit-hooks = import (builtins.fetchTarball "https://github.com/cachix/pre-commit-hooks.nix/tarball/master"); - in { - pre-commit-check = nix-pre-commit-hooks.run { - src = ./.; - hooks = { - ormolu = { - enable = true; - excludes = [".circleci/golden"]; - }; - hlint = { - enable = true; - excludes = [".circleci/golden"]; - }; - }; - }; - } +let + nix-pre-commit-hooks = import (builtins.fetchTarball "https://github.com/cachix/pre-commit-hooks.nix/tarball/master"); +in +{ + pre-commit-check = nix-pre-commit-hooks.run { + src = ./.; + hooks = { + ormolu = { + enable = true; + excludes = [ ".circleci/golden" ]; + }; + hlint = { + enable = true; + excludes = [ ".circleci/golden" ]; + }; + nixpkgs-fmt.enable = true; + }; + }; +} diff --git a/nix/example-client.nix b/nix/example-client.nix new file mode 100644 index 0000000..6a4ae03 --- /dev/null +++ b/nix/example-client.nix @@ -0,0 +1,16 @@ +(import ./pkgs.nix).generateOpenAPIClient +{ + name = "stripe-api"; + src = ../.circleci/specifications/stripe-api.yml; + packageName = "stripe-api"; + moduleName = "StripeAPI"; + extraFlags = [ + "--property-type-suffix=\"'\"" + "--convert-to-camel-case" + ]; + operations = [ + "GetEvents" + "GetCustomers" + "PostCheckoutSessions" + ]; +} diff --git a/nix/generate-client.nix b/nix/generate-client.nix new file mode 100644 index 0000000..6f849c6 --- /dev/null +++ b/nix/generate-client.nix @@ -0,0 +1,45 @@ +{ pkgs ? import ./pkgs.nix +}: +{ name +, src +, packageName ? name +, moduleName +, extraFlags ? [ ] +, operations ? [ ] # Empty list means "All operations" +}: + +with pkgs.lib; +with pkgs.haskell.lib; +let + localPkgs = import ./pkgs.nix; + extraFlagsStr = concatStringsSep "\\\n" extraFlags; + operationFlag = operation: "--operation-to-generate \"${operation}\" \\"; + operationsFlags = optionalString (operations != [ ]) '' + --omit-additional-operation-functions \ + ${concatStringsSep "\n" (map operationFlag operations)} + ''; + generatedCode = pkgs.stdenv.mkDerivation { + name = "generated-${name}"; + buildInputs = [ + localPkgs.haskellPackages.openapi3-code-generator + ]; + buildCommand = '' + # To make sure that we don't get issues with encodings + export LANG=C.utf8 + export LC_ALL=C.utf8 + + openapi3-code-generator-exe ${src} \ + --module-name "${moduleName}" \ + --package-name "${packageName}" \ + --output-dir "$out" \ + ${extraFlagsStr} \ + \ + ${operationsFlags} + ''; + }; + generatedPackage = dontHaddock (disableLibraryProfiling (pkgs.haskellPackages.callCabal2nix name generatedCode { })); +in +{ + code = generatedCode; + package = generatedPackage; +} diff --git a/nix/gitignore-src.nix b/nix/gitignore-src.nix new file mode 100644 index 0000000..b78c485 --- /dev/null +++ b/nix/gitignore-src.nix @@ -0,0 +1,13 @@ +final: previous: +let + gitignoreSrc = + final.fetchFromGitHub { + owner = "hercules-ci"; + repo = "gitignore.nix"; + rev = "c4662e662462e7bf3c2a968483478a665d00e717"; + sha256 = "sha256:1npnx0h6bd0d7ql93ka7azhj40zgjp815fw2r6smg8ch9p7mzdlx"; + }; +in +{ + inherit (import gitignoreSrc { inherit (final) lib; }) gitignoreSource; +} diff --git a/nix/nixpkgs-version.nix b/nix/nixpkgs-version.nix new file mode 100644 index 0000000..962613e --- /dev/null +++ b/nix/nixpkgs-version.nix @@ -0,0 +1,4 @@ +{ + rev = "e3a2247046d4de66b9b193a6ab3ff040fa3da86d"; + sha256 = "sha256:0gnpspk2lhwjfmkim416az7q3p5rjbc7q5pvhq23j4gbgkhs0q6i"; +} diff --git a/nix/nixpkgs.nix b/nix/nixpkgs.nix new file mode 100644 index 0000000..b001688 --- /dev/null +++ b/nix/nixpkgs.nix @@ -0,0 +1,8 @@ +let + nixpkgsVersion = import ./nixpkgs-version.nix; +in +builtins.fetchTarball { + url = + "https://github.com/NixOS/nixpkgs/archive/$%7BnixpkgsVersion.rev%7D.tar.gz"; + inherit (nixpkgsVersion) sha256; +} diff --git a/nix/overlay.nix b/nix/overlay.nix new file mode 100644 index 0000000..55b62de --- /dev/null +++ b/nix/overlay.nix @@ -0,0 +1,51 @@ +final: previous: +with final.lib; +with final.haskell.lib; +let + openAPICodeGeneratorRepo = builtins.fetchGit { + url = "https://github.com/Haskell-OpenAPI-Code-Generator/Haskell-OpenAPI-Client-Code-Generator"; + rev = "c3133bde91430990ff9c03c19a015713ae291e2f"; + ref = "master"; + }; + openAPICodeGenerator = dontHaddock (disableLibraryProfiling (final.haskellPackages.callCabal2nix "openapi3-code-generator" (final.gitignoreSource ../.) { })); + generatedStripeCode = final.stdenv.mkDerivation { + name = "generated-stripe-code"; + buildInputs = [ + openAPICodeGenerator + final.tree + ]; + buildCommand = '' + # To make sure that we don't get issues with encodings + export LANG=C.utf8 + export LC_ALL=C.utf8 + + ${../scripts/generate-stripe.sh} ${openAPICodeGeneratorRepo} $out + ''; + }; + generatedStripePackage = dontHaddock (disableLibraryProfiling (final.haskellPackages.callCabal2nix "stripe-api" generatedStripeCode { })); + +in +{ + generateOpenAPIClient = import ./generate-client.nix { pkgs = final; }; + haskellPackages = + previous.haskellPackages.override ( + old: + { + overrides = + final.lib.composeExtensions + ( + old.overrides or ( + _: + _: + { } + ) + ) + ( + self: super: + { + openapi3-code-generator = openAPICodeGenerator; + } + ); + } + ); +} diff --git a/nix/pkgs.nix b/nix/pkgs.nix new file mode 100644 index 0000000..45e9301 --- /dev/null +++ b/nix/pkgs.nix @@ -0,0 +1,13 @@ +let + pkgsv = import (import ./nixpkgs.nix); + pkgs = pkgsv { }; + ourPkgs = + pkgsv { + overlays = + [ + (import ./gitignore-src.nix) + (import ./overlay.nix) + ]; + }; +in +ourPkgs From adb15a7ebd9483878d28234727863ad4630b09d2 Mon Sep 17 00:00:00 2001 From: Tom Sydney Kerckhove Date: Wed, 21 Oct 2020 15:05:45 +0200 Subject: [PATCH 2/3] Removed some now-obsolete nix code --- nix/overlay.nix | 24 +----------------------- 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/nix/overlay.nix b/nix/overlay.nix index 55b62de..6657a91 100644 --- a/nix/overlay.nix +++ b/nix/overlay.nix @@ -2,28 +2,6 @@ final: previous: with final.lib; with final.haskell.lib; let - openAPICodeGeneratorRepo = builtins.fetchGit { - url = "https://github.com/Haskell-OpenAPI-Code-Generator/Haskell-OpenAPI-Client-Code-Generator"; - rev = "c3133bde91430990ff9c03c19a015713ae291e2f"; - ref = "master"; - }; - openAPICodeGenerator = dontHaddock (disableLibraryProfiling (final.haskellPackages.callCabal2nix "openapi3-code-generator" (final.gitignoreSource ../.) { })); - generatedStripeCode = final.stdenv.mkDerivation { - name = "generated-stripe-code"; - buildInputs = [ - openAPICodeGenerator - final.tree - ]; - buildCommand = '' - # To make sure that we don't get issues with encodings - export LANG=C.utf8 - export LC_ALL=C.utf8 - - ${../scripts/generate-stripe.sh} ${openAPICodeGeneratorRepo} $out - ''; - }; - generatedStripePackage = dontHaddock (disableLibraryProfiling (final.haskellPackages.callCabal2nix "stripe-api" generatedStripeCode { })); - in { generateOpenAPIClient = import ./generate-client.nix { pkgs = final; }; @@ -43,7 +21,7 @@ in ( self: super: { - openapi3-code-generator = openAPICodeGenerator; + openapi3-code-generator = final.haskellPackages.callCabal2nix "openapi3-code-generator" (final.gitignoreSource ../.) { }; } ); } From 523ff12c0eaa19fa379bab057d9ca34128664205 Mon Sep 17 00:00:00 2001 From: Tom Sydney Kerckhove Date: Thu, 22 Oct 2020 12:30:10 +0200 Subject: [PATCH 3/3] fixed the generation script a bit --- nix/generate-client.nix | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/nix/generate-client.nix b/nix/generate-client.nix index 6f849c6..0485b0d 100644 --- a/nix/generate-client.nix +++ b/nix/generate-client.nix @@ -12,11 +12,10 @@ with pkgs.lib; with pkgs.haskell.lib; let localPkgs = import ./pkgs.nix; - extraFlagsStr = concatStringsSep "\\\n" extraFlags; - operationFlag = operation: "--operation-to-generate \"${operation}\" \\"; + extraFlagsStr = concatStringsSep " " extraFlags; + operationFlag = operation: "--operation-to-generate '${operation}'"; operationsFlags = optionalString (operations != [ ]) '' - --omit-additional-operation-functions \ - ${concatStringsSep "\n" (map operationFlag operations)} + --omit-additional-operation-functions ${concatStringsSep " " (map operationFlag operations)} ''; generatedCode = pkgs.stdenv.mkDerivation { name = "generated-${name}"; @@ -28,13 +27,16 @@ let export LANG=C.utf8 export LC_ALL=C.utf8 + set -x + openapi3-code-generator-exe ${src} \ --module-name "${moduleName}" \ --package-name "${packageName}" \ --output-dir "$out" \ ${extraFlagsStr} \ - \ ${operationsFlags} + + set +x ''; }; generatedPackage = dontHaddock (disableLibraryProfiling (pkgs.haskellPackages.callCabal2nix name generatedCode { }));