diff --git a/.gitignore b/.gitignore index 686f558c..844400cd 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,11 @@ etc/*.yaml etc/*.secret public/ conftools/ +thirdparty/build.log +thirdparty/cache +thirdparty/carton/ +thirdparty/latest-build +thirdparty/touch +thirdparty/lib/ +thirdparty/work/ +thirdparty/bin/ diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 00000000..92d82d03 --- /dev/null +++ b/.tool-versions @@ -0,0 +1 @@ +perl system diff --git a/Makefile.am b/Makefile.am index 32c4ba57..60e117d3 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,33 +1,17 @@ -# Copyright (C) 2020 Fritz Zaucker +# Copyright (C) 2023 Fritz Zaucker -AUTOMAKE_OPTIONS = foreign +AUTOMAKE_OPTIONS = foreign -SUBDIRS = etc frontend -PUB := $(shell find -L public -type d \( -name ".??*" -o -name transpiled \) -prune -o -not -name "*db.json" -a -not -name "*.map" -a -not -name "*~" -a -not -name transpiled -a -not -name "*.tmp" -a -type f -print ) -SHARE := $(shell test -d share && find -L share -type d -name ".??*" -prune -o -not -name ".*" -a -not -name "*~" -a -not -name "*.tmp" -a -not -name '*.sql' -a -not -wholename '*/Docu/*' -a -not -wholename '*/Docu' -a -not -wholename '*/_Attic' -a -not -wholename '*/_Attic/*' -a -type f -print) - -PERLTESTS := $(shell find -L t -name "*.t") -PM := $(shell find -L lib -name "*.pm") - -#EXTRA_DIST = META6.json COPYRIGHT LICENSE CHANGES AUTHORS bootstrap $(PUB) $(POD) $(TEMPL) $(SHARE) - -EXTRA_DIST = META6.json COPYRIGHT bin lib/Agrammon bootstrap $(PUB) $(SHARE) # $(PERLTESTS) +SUBDIRS = thirdparty etc frontend -YEAR := $(shell date +%Y) -DATE := $(shell date +%Y-%m-%d) - -datadir = $(prefix) -nobase_data_DATA = $(PUB) $(TEMPL) $(SHARE) - -README.md COPYRIGHT: - $(PERL) -i -p -e 's/(#VERSION#|\d+\.\d+\.\d+[^.\s]*)/$(PACKAGE_VERSION)/g;s/(#YEAR#|20[1-9]\d)/$(YEAR)/g;s/(#DATE#|20[1-9]\d-[01]\d-[0-3]\d)/$(DATE)/g;' $@ +PUB := $(shell find -L public -type d \( -name ".??*" -o -name transpiled \) -prune -o -not -name "*db.json" -a -not -name "*.map" -a -not -name "*~" -a -not -name transpiled -a -not -name "*.tmp" -a -type f -print ) +TEMPL := $(shell test -d templates && find -L templates -type f -name "*.ep") +SHARE := $(shell test -d share && find -L share -type d -name ".??*" -prune -o -not -name ".*" -a -not -name "*~" -a -not -name "*.tmp" -a -type f -print) -LANGUAGES := $(shell $(PERL) -e 'use JSON::PP qw(decode_json); print join(" ", map {"share/".$$_.".po"} @{decode_json(join("",<>))->{locales}})' frontend/compile.json) +PERLTESTS := $(shell find t -name "*.t") +PM := $(shell find lib -name "*.pm") -test: - prove -j8 -e 'raku -Ilib' t +EXTRA_DIST = VERSION cpanfile COPYRIGHT LICENSE CHANGES AUTHORS bootstrap $(PUB) $(wildcard t/*.t) $(POD) $(TEMPL) $(PERLTESTS) $(SHARE) Dockerfile -unit-test: - AGRAMMON_UNIT_TEST=1 prove -j8 -e 'raku -Ilib' t diff --git a/VERSION b/VERSION index 798e3899..19b860c1 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -6.3.0 +6.4.0 diff --git a/configure.ac b/configure.ac index 36df524a..b64433df 100644 --- a/configure.ac +++ b/configure.ac @@ -154,6 +154,7 @@ AC_CONFIG_FILES([ Makefile etc/Makefile frontend/Makefile + thirdparty/Makefile ]) AC_SUBST(VERSION) diff --git a/cpanfile b/cpanfile new file mode 100644 index 00000000..ce89cddd --- /dev/null +++ b/cpanfile @@ -0,0 +1 @@ +requires 'Excel::Writer::XLSX'; diff --git a/dev/META6.json b/dev/META6.json index 3742bdae..18977cc6 100644 --- a/dev/META6.json +++ b/dev/META6.json @@ -21,6 +21,7 @@ "DB::Pg", "Digest::SHA1::Native", "Email::MIME", + "Inline::Perl5", "IO::Path::ChildSecure", "IO::String", "LibXML:ver<0.7.9+>", @@ -29,6 +30,7 @@ "OO::Monitors", "Shell::Command", "Spreadsheet::XLSX:ver<0.2.4+>", + "Temp::Path", "Text::CSV", "YAMLish", "Cro::APIToken", diff --git a/lib/Agrammon/OutputFormatter/ExcelFast.pm6 b/lib/Agrammon/OutputFormatter/ExcelFast.pm6 index 8bfb5569..ccfa01d7 100644 --- a/lib/Agrammon/OutputFormatter/ExcelFast.pm6 +++ b/lib/Agrammon/OutputFormatter/ExcelFast.pm6 @@ -8,6 +8,7 @@ use Agrammon::Web::SessionUser; #use Spreadsheet::XLSX; #use Spreadsheet::XLSX::Styles; +use Temp::Path; use Excel::Writer::XLSX:from; sub input-output-as-excel( @@ -19,9 +20,8 @@ sub input-output-as-excel( Bool $include-filters, Bool $all-filters ) is export { - my $temp-filename = "$dataset-name.xlsx"; - - my $workbook = Excel::Writer::XLSX.new($temp-filename); + my $temp-file = make-temp-path :suffix<.xlsx>; + my $workbook = Excel::Writer::XLSX.new($temp-file.absolute); # prepare sheets my $output-sheet = $workbook.add_worksheet('Ergebnisse'); @@ -162,5 +162,5 @@ sub input-output-as-excel( $row-formatted++; } $workbook.close(); - return $temp-filename.IO.slurp: :bin; + return $temp-file.slurp: :bin; } diff --git a/lib/Agrammon/UI/CommandLine.rakumod b/lib/Agrammon/UI/CommandLine.rakumod index 7c6fb96d..4bbeccc7 100644 --- a/lib/Agrammon/UI/CommandLine.rakumod +++ b/lib/Agrammon/UI/CommandLine.rakumod @@ -59,7 +59,7 @@ multi sub MAIN('web', Str $model-filename, ExistingFile :$cfg-file, Str :$techni multi sub MAIN('run', Str $filename, ExistingFileOrStdin $input, ExistingFile :$cfg-file, Str :$technical-file, SupportedLanguage :$language = 'de', Str :$print-only, Int :$report-selected, Str :$variants = 'Base', Bool :$include-filters, Bool :$include-all-filters=False, Int :$batch=1, Int :$degree=4, Int :$max-runs, - OutputFormat :$format = 'text', Str :$export-filename='test.xlsx' + OutputFormat :$format = 'text', Str :$export-filename='test' ) is export { my @print-set = $print-only.split(',') if $print-only; my $data = run $filename, $input.IO, $technical-file, $variants, $format, $language, @print-set, @@ -98,8 +98,8 @@ multi sub MAIN('run', Str $filename, ExistingFileOrStdin $input, ExistingFile :$ } for %sim-results.keys.sort -> $dataset { if $format eq 'excel' { - spurt "$export-filename.xlsx", %sim-results{$dataset}; - return; + $export-filename //= $dataset; + spurt "$export-filename-$dataset.xlsx", %sim-results{$dataset}; } else { @output.push("# Dataset $dataset"); diff --git a/lib/Agrammon/Web/Routes.rakumod b/lib/Agrammon/Web/Routes.rakumod index d91b589c..0b2887fa 100644 --- a/lib/Agrammon/Web/Routes.rakumod +++ b/lib/Agrammon/Web/Routes.rakumod @@ -357,7 +357,9 @@ sub frontend-api-routes (Str $schema, $ws) { request-body -> %params { # prevent header injection my $filename = cleanup-filename "%params.xlsx"; - my $excel = $ws.get-excel-export($user, %params).to-blob; + # use with Excel.pm + # my $excel = $ws.get-excel-export($user, %params).to-blob; + my $excel = $ws.get-excel-export($user, %params); header 'Content-disposition', qq{attachment; filename="$filename"}; content 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', $excel; CATCH { diff --git a/share/Models/version6/Livestock/DairyCow/Excretion.nhd b/share/Models/version6/Livestock/DairyCow/Excretion.nhd index fe5b4352..e31bd628 100644 --- a/share/Models/version6/Livestock/DairyCow/Excretion.nhd +++ b/share/Models/version6/Livestock/DairyCow/Excretion.nhd @@ -172,6 +172,7 @@ Richner, W., Flisch, R., Mayer, J., Schlegel, P., Zähner, M., Menzi, H., 2017. ?endif ### just for testing hidden inputs +?if TESTING +hiddenAnimals type = float hidden = true @@ -185,6 +186,7 @@ Richner, W., Flisch, R., Mayer, J., Schlegel, P., Zähner, M., Menzi, H., 2017. en = - ++description Just for testing. +?endif *** technical *** diff --git a/thirdparty/Makefile.am b/thirdparty/Makefile.am new file mode 100644 index 00000000..6efed1e6 --- /dev/null +++ b/thirdparty/Makefile.am @@ -0,0 +1,54 @@ +# Copyright (C) 2023 Fritz Zaucker + +AUTOMAKE_OPTIONS = foreign + +THIRDPARTY_DIR := $(shell pwd) + +CPANSNAPV := cpanfile-$(shell $(PERL) -MConfig -e 'my $$v = $$Config{version}; $$v =~ s/\.\d+$$//; print $$v').snapshot + + +#EXTRA_DIST = $(THIRDPARTY_DIST) $(wildcard bin/cpanm) +EXTRA_DIST = bin/cpanm $(wildcard cpanfile*snapshot) + +all-local: touch + +touch: bin/cpanm $(CPANSNAPV) + $(AM_V_at)echo "** Installing Dependencies using $(CPANSNAPV)" + cp $(CPANSNAPV) ../cpanfile.snapshot + test -x carton/bin/carton || PERL_CPANM_OPT= PERL_CPANM_HOME=$(THIRDPARTY_DIR) $(PERL) bin/cpanm -q --notest --local-lib-contained $(THIRDPARTY_DIR)/carton Carton Date::Parse +# if ever DBD::ODBC is compiled, make sure we get the utf8 version + PERL_CPANM_OPT= PERL_CPANM_HOME=$(THIRDPARTY_DIR) DBD_ODBC_UNICODE=1 PERL5LIB=$(THIRDPARTY_DIR)/carton/lib/perl5 PERL_CARTON_PATH=$(THIRDPARTY_DIR) $(PERL) $(THIRDPARTY_DIR)/carton/bin/carton install + $(AM_V_at)rm -f ../cpanfile.snapshot + $(AM_V_at)touch touch + +bin/cpanm: + $(AM_V_at)mkdir -p bin + $(URL_CAT) https://cpanmin.us > bin/cpanm + $(AM_V_at)chmod 755 bin/cpanm + +$(CPANSNAPV): ../cpanfile + $(AM_V_at)echo "** Installing Dependencies using Carton install" + test -f $(CPANSNAPV) && cp $(CPANSNAPV) ../cpanfile.snapshot || true + test -x carton/bin/carton || PERL_CPANM_OPT= PERL_CPANM_HOME=$(THIRDPARTY_DIR) $(PERL) bin/cpanm -q --notest --local-lib-contained $(THIRDPARTY_DIR)/carton Carton Date::Parse +# if ever DBD::ODBC is compiled, make sure we get the utf8 version + PERL_CPANM_OPT= PERL_CPANM_HOME=$(THIRDPARTY_DIR) DBD_ODBC_UNICODE=1 PERL5LIB=$(THIRDPARTY_DIR)/carton/lib/perl5 PERL_CARTON_PATH=$(THIRDPARTY_DIR) $(PERL) $(THIRDPARTY_DIR)/carton/bin/carton install + mv ../cpanfile.snapshot $(CPANSNAPV) + $(AM_V_at)touch touch + +update: $(CPANSNAPV) + $(AM_V_at)echo "** Updating Dependencies using Carton update" + $(AM_V_at)cp $(CPANSNAPV) ../cpanfile.snapshot + $(AM_V_at)PERL_CPANM_OPT= PERL_CPANM_HOME=$(THIRDPARTY_DIR) PERL5LIB=$(THIRDPARTY_DIR)/carton/lib/perl5 PERL_CARTON_PATH=$(THIRDPARTY_DIR) $(PERL) $(THIRDPARTY_DIR)/carton/bin/carton update + $(AM_V_at)mv ../cpanfile.snapshot $(CPANSNAPV) + +clean-local: + ls -1 | grep -v Makefile | grep -v cpanfile |grep -v bin | xargs rm -rf + +distclean-local: + ls -1 | grep -v Makefile | grep -v cpanfile | xargs rm -rf + +install-exec-hook: + cp -fr lib/perl5/* $(DESTDIR)$(libdir) + cp -f bin/cover $(DESTDIR)$(bindir) + $(AM_V_at)echo "** Patching cover command" + $(PERL) -i -p -e 's{use warnings;}{use warnings;\nuse lib qw($(libdir));}' $(DESTDIR)$(bindir)/cover