added formatters to flake and formatted

This commit is contained in:
Benton Edmondson 2022-06-07 21:13:45 -04:00
parent 9114ef63c1
commit 398ef79341
4 changed files with 288 additions and 240 deletions

View file

@ -19,11 +19,13 @@
};
};
outputs = flakes: let
outputs = flakes:
let
version = "1.3.0";
self = flakes.self.packages.x86_64-linux;
nixpkgs = flakes.nixpkgs.legacyPackages.x86_64-linux.pkgsStatic;
nixpkgs-dyn = flakes.nixpkgs.legacyPackages.x86_64-linux;
nixpkgs-fmt = flakes.nixpkgs-fmt.defaultPackage.x86_64-linux;
gourou-src = flakes.gourou-src;
updfparser-src = flakes.updfparser-src;
base64-src = flakes.base64-src;
@ -31,47 +33,56 @@
cxx = "${nixpkgs.stdenv.cc}/bin/x86_64-unknown-linux-musl-g++";
ar = "${nixpkgs.stdenv.cc.bintools.bintools_bin}/bin/x86_64-unknown-linux-musl-ar";
obj-flags = "-O2 -static";
in rec {
in
rec {
packages.x86_64-linux.libzip-static = nixpkgs.libzip.overrideAttrs (prev: {
cmakeFlags = (prev.cmakeFlags or []) ++ [
cmakeFlags = (prev.cmakeFlags or [ ]) ++ [
"-DBUILD_SHARED_LIBS=OFF"
"-DBUILD_EXAMPLES=OFF"
"-DBUILD_DOC=OFF"
"-DBUILD_TOOLS=OFF"
"-DBUILD_REGRESS=OFF"
];
outputs = ["out"];
outputs = [ "out" ];
});
packages.x86_64-linux.base64 = derivation {
name = "updfparser";
system = "x86_64-linux";
builder = "${nixpkgs.bash}/bin/bash";
PATH = "${nixpkgs.coreutils}/bin";
args = ["-c" ''
args = [
"-c"
''
mkdir -p $out/include/base64
cp ${base64-src}/Base64.h $out/include/base64/Base64.h
''];
''
];
};
packages.x86_64-linux.updfparser = derivation {
name = "updfparser";
system = "x86_64-linux";
builder = "${nixpkgs.bash}/bin/bash";
PATH = "${nixpkgs.coreutils}/bin";
args = [ "-c" ''
args = [
"-c"
''
${cxx} \
-c ${updfparser-src}/src/*.cpp \
-I ${updfparser-src}/include \
${obj-flags}
mkdir -p $out/lib
${ar} crs $out/lib/libupdfparser.a *.o
'' ];
''
];
};
packages.x86_64-linux.gourou = derivation {
name = "gourou";
system = "x86_64-linux";
builder = "${nixpkgs.bash}/bin/bash";
PATH = "${nixpkgs.coreutils}/bin";
args = [ "-c" ''
args = [
"-c"
''
${cxx} \
-c \
${gourou-src}/src/*.cpp \
@ -84,14 +95,17 @@
mkdir -p $out/lib $out/debug
${ar} crs $out/lib/libgourou.a *.o
cp *.o $out/debug
'' ];
''
];
};
packages.x86_64-linux.utils-common = derivation {
name = "utils-common";
system = "x86_64-linux";
builder = "${nixpkgs.bash}/bin/bash";
PATH = "${nixpkgs.coreutils}/bin";
args = [ "-c" ''
args = [
"-c"
''
${cxx} \
-c ${gourou-src}/utils/drmprocessorclientimpl.cpp \
${gourou-src}/utils/utils_common.cpp \
@ -105,14 +119,17 @@
${obj-flags}
mkdir -p $out/lib
${ar} crs $out/lib/libutils-common.a *.o
'' ];
''
];
};
packages.x86_64-linux.knock = derivation {
name = "knock";
system = "x86_64-linux";
builder = "${nixpkgs.bash}/bin/bash";
PATH = "${nixpkgs.coreutils}/bin";
args = [ "-c" ''
args = [
"-c"
''
mkdir -p $out/bin
${cxx} \
-o $out/bin/knock \
@ -142,16 +159,19 @@
-I ${nixpkgs.curl.dev}/include \
-I ${nixpkgs.zlib.dev}/include \
-I ${self.libzip-static}/include
'' ];
''
];
};
packages.x86_64-linux.default = self.knock;
packages.x86_64-linux.tests = nixpkgs-dyn.stdenv.mkDerivation {
name = "tests";
src = ./tests;
buildInputs = [ (nixpkgs-dyn.python3.withPackages(p: [
buildInputs = [
(nixpkgs-dyn.python3.withPackages (p: [
p.beautifulsoup4
p.requests
])) ];
]))
];
patchPhase = ''
substituteInPlace tests.py --replace "./result/bin/knock" "${self.knock}/bin/knock"
'';
@ -161,5 +181,24 @@
chmod +x $out/bin/tests
'';
};
devShell.x86_64-linux = nixpkgs.mkShell {
packages = [
# nix formatter
nixpkgs-dyn.nixpkgs-fmt
# python formatter
nixpkgs-dyn.black
# cpp formatter
nixpkgs-dyn.clang-tools
];
shellHook = ''
fmt () {
set -ex
nixpkgs-fmt .
black ./tests
clang-format -i --verbose src/*.cpp
set +ex
}
'';
};
};
}

View file

@ -44,6 +44,14 @@ nix run .#tests -- ./tests/workspace
Test books can be found [here](https://www.adobe.com/solutions/ebook/digital-editions/sample-ebook-library.html).
### Formatting
```
nix develop
fmt
exit
```
## The Name
The name comes from the [D&D 5e spell](https://roll20.net/compendium/dnd5e/Knock#content) for freeing locked items:

View file

@ -1,24 +1,24 @@
#include <filesystem>
#include "drmprocessorclientimpl.h"
#include "libgourou_common.h"
#include "libgourou.h"
#include "libgourou_common.h"
#include <filesystem>
#ifndef KNOCK_VERSION
#error KNOCK_VERSION must be defined
#error KNOCK_VERSION must be defined
#endif
std::string get_data_dir();
void verify_absence(std::string file);
void verify_presence(std::string file);
int main(int argc, char** argv) try {
int main(int argc, char **argv) try {
if (argc == 1) {
std::cout
<< "info: knock version " << KNOCK_VERSION << ", libgourou version "
<< LIBGOUROU_VERSION << "\n"
<< "usage: " << argv[0] << " [ACSM]" << "\n"
<< "result: converts file ACSM to a plain EPUB/PDF if present, otherwise prints this"
std::cout << "info: knock version " << KNOCK_VERSION
<< ", libgourou version " << LIBGOUROU_VERSION << "\n"
<< "usage: " << argv[0] << " [ACSM]\n"
<< "result: converts file ACSM to a plain EPUB/PDF if present, "
"otherwise prints this"
<< std::endl;
return EXIT_SUCCESS;
}
@ -29,7 +29,8 @@ int main(int argc, char** argv) try {
const std::string acsm_file = argv[1];
verify_presence(acsm_file);
const std::string acsm_stem = acsm_file.substr(0, acsm_file.find_last_of("."));
const std::string acsm_stem =
acsm_file.substr(0, acsm_file.find_last_of("."));
const std::string drm_file = acsm_stem + ".drm";
const std::string out_file = acsm_stem + ".out";
verify_absence(drm_file);
@ -37,18 +38,17 @@ int main(int argc, char** argv) try {
const std::string knock_data = get_data_dir();
DRMProcessorClientImpl client;
gourou::DRMProcessor* processor = gourou::DRMProcessor::createDRMProcessor(
gourou::DRMProcessor *processor = gourou::DRMProcessor::createDRMProcessor(
&client,
false, // don't "always generate a new device" (default)
knock_data
);
knock_data);
std::cout << "anonymously signing in..." << std::endl;
processor->signIn("anonymous", "");
processor->activateDevice();
std::cout << "downloading the file from Adobe..." << std::endl;
gourou::FulfillmentItem* item = processor->fulfill(acsm_file);
gourou::FulfillmentItem *item = processor->fulfill(acsm_file);
gourou::DRMProcessor::ITEM_TYPE type = processor->download(item, drm_file);
std::cout << "removing DRM from the file..." << std::endl;
@ -74,8 +74,8 @@ int main(int argc, char** argv) try {
}
if (std::filesystem::exists(ext_file)) {
std::cerr
<< "warning: failed to update file extension; " + ext_file + " already exists"
std::cerr << "warning: failed to update file extension; " + ext_file +
" already exists"
<< std::endl;
ext_file = out_file;
} else {
@ -86,16 +86,16 @@ int main(int argc, char** argv) try {
return 0;
} catch (const gourou::Exception& e) {
} catch (const gourou::Exception &e) {
std::cerr << "error:\n" << e.what();
return EXIT_FAILURE;
} catch (const std::exception& e) {
} catch (const std::exception &e) {
std::cerr << "error: " << e.what() << std::endl;
return EXIT_FAILURE;
}
std::string get_data_dir() {
char* xdg_data_home = std::getenv("XDG_DATA_HOME");
char *xdg_data_home = std::getenv("XDG_DATA_HOME");
std::string knock_data;
if (xdg_data_home != nullptr) {
knock_data = xdg_data_home;
@ -108,7 +108,8 @@ std::string get_data_dir() {
void verify_absence(std::string file) {
if (std::filesystem::exists(file)) {
throw std::runtime_error("file " + file + " must be moved out of the way or deleted");
throw std::runtime_error("file " + file +
" must be moved out of the way or deleted");
}
}

View file

@ -14,7 +14,7 @@ if not knock.exists():
if len(sys.argv) != 2:
print(
"error: missing required argument: directory in which to perform the tests",
file=sys.stderr
file=sys.stderr,
)
sys.exit()
@ -31,13 +31,13 @@ if workspace.exists():
shutil.rmtree(workspace)
workspace.mkdir()
html = requests \
.get("https://www.adobe.com/solutions/ebook/digital-editions/sample-ebook-library.html") \
.text
soup = BeautifulSoup(html, 'html.parser')
html = requests.get(
"https://www.adobe.com/solutions/ebook/digital-editions/sample-ebook-library.html"
).text
soup = BeautifulSoup(html, "html.parser")
links = []
for a_tag in soup.find_all('a'):
for a_tag in soup.find_all("a"):
if a_tag.string != "Download eBook":
continue
if not urlparse(a_tag.get("href")).path.endswith(".acsm"):