diff --git a/Jenkinsfile b/Jenkinsfile index fbf7b24f..69601762 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -855,7 +855,7 @@ pipeline { withCredentials([string(credentialsId: params.SONARCLOUD_TOKEN, variable: 'token')]) { sh( label: 'Running Sonar Scanner', - script: 'uv run pysonar -t $token -Dsonar.projectVersion=$VERSION -Dsonar.buildString="$BUILD_TAG" -Dsonar.cfamily.cache.enabled=false -Dsonar.cfamily.threads=$(grep -c ^processor /proc/cpuinfo) -Dsonar.cfamily.build-wrapper-output=build/build_wrapper_output_directory -Dsonar.python.coverage.reportPaths=./reports/coverage/coverage-python.xml -Dsonar.cfamily.cobertura.reportPaths=reports/coverage/coverage_cpp.xml ' + (env.CHANGE_ID ? '-Dsonar.pullrequest.key=$CHANGE_ID -Dsonar.pullrequest.base=$CHANGE_TARGET' : '-Dsonar.branch.name=$BRANCH_NAME') + script: 'uv run pysonar -t $token -Dsonar.projectVersion=$VERSION -Dsonar.buildString="$BUILD_TAG" -Dsonar.cfamily.cache.enabled=false -Dsonar.cfamily.threads=$(grep -c ^processor /proc/cpuinfo) -Dsonar.cfamily.compile-commands=build/build_wrapper_output_directory/compile_commands.json -Dsonar.python.coverage.reportPaths=./reports/coverage/coverage-python.xml -Dsonar.cfamily.cobertura.reportPaths=reports/coverage/coverage_cpp.xml ' + (env.CHANGE_ID ? '-Dsonar.pullrequest.key=$CHANGE_ID -Dsonar.pullrequest.base=$CHANGE_TARGET' : '-Dsonar.branch.name=$BRANCH_NAME') ) } } @@ -884,25 +884,7 @@ pipeline { } post{ cleanup{ - cleanWs( - patterns: [ - [pattern: '.coverage/', type: 'INCLUDE'], - [pattern: '.eggs/', type: 'INCLUDE'], - [pattern: '.mypy_cache/', type: 'INCLUDE'], - [pattern: '.pytest_cache/', type: 'INCLUDE'], - [pattern: 'dist/', type: 'INCLUDE'], - [pattern: 'build/', type: 'INCLUDE'], - [pattern: '*.dist-info/', type: 'INCLUDE'], - [pattern: 'logs/', type: 'INCLUDE'], - [pattern: 'reports/', type: 'INCLUDE'], - [pattern: 'generatedJUnitFiles/', type: 'INCLUDE'], - [pattern: 'py3exiv2bind/*.so', type: 'INCLUDE'], - [pattern: '**/__pycache__/', type: 'INCLUDE'], - [pattern: 'venv/', type: 'INCLUDE'], - ], - notFailBuild: true, - deleteDirs: true - ) + sh "git clean -dfx" } } } diff --git a/src/py3exiv2bind/core/glue/ExifStrategy.cpp b/src/py3exiv2bind/core/glue/ExifStrategy.cpp index 66f3e212..7ddfe60b 100644 --- a/src/py3exiv2bind/core/glue/ExifStrategy.cpp +++ b/src/py3exiv2bind/core/glue/ExifStrategy.cpp @@ -4,7 +4,10 @@ #include "ExifStrategy.h" #include "make_dictionary.h" -#include +#include +#include + +#include std::unordered_map ExifStrategy::load(const Exiv2::Image &image){ return make_dictionary(image.exifData()); diff --git a/src/py3exiv2bind/core/glue/IPTC_Strategy.cpp b/src/py3exiv2bind/core/glue/IPTC_Strategy.cpp index 6ecddf51..2671e624 100644 --- a/src/py3exiv2bind/core/glue/IPTC_Strategy.cpp +++ b/src/py3exiv2bind/core/glue/IPTC_Strategy.cpp @@ -4,8 +4,12 @@ #include "IPTC_Strategy.h" #include "make_dictionary.h" -#include -#include + +#include + +#include +#include + std::unordered_map IPTC_Strategy::load(const Exiv2::Image &image){ return make_dictionary(image.iptcData()); diff --git a/src/py3exiv2bind/core/glue/Image.cpp b/src/py3exiv2bind/core/glue/Image.cpp index 73a04b35..4a83e0ad 100644 --- a/src/py3exiv2bind/core/glue/Image.cpp +++ b/src/py3exiv2bind/core/glue/Image.cpp @@ -3,17 +3,28 @@ // #include "Image.h" + #include "MetadataProcessor.h" -#include "glue.h" +#include "MetadataStrategies.h" #include "glue_execeptions.h" -#include + #include +#include +#include + +#include #include +#include +#include #include +#include #include +#include -std::ostringstream warning_log; -std::ostringstream error_log; +namespace { + std::ostringstream warning_log; + std::ostringstream error_log; +} // namespace Image::Image(const std::string &filename) : filename(filename) { warning_log.clear(); @@ -22,17 +33,18 @@ Image::Image(const std::string &filename) : filename(filename) { error_log.str(""); try { Exiv2::LogMsg::setHandler([](int level, const char *msg) { - switch((Exiv2::LogMsg::Level)level){ + switch(static_cast(level)){ - case Exiv2::LogMsg::debug:break; - case Exiv2::LogMsg::info:break; + case Exiv2::LogMsg::debug: + case Exiv2::LogMsg::info: + case Exiv2::LogMsg::mute: + break; case Exiv2::LogMsg::warn: warning_log << msg; break; case Exiv2::LogMsg::error: error_log << msg; break; - case Exiv2::LogMsg::mute:break; default: break; } }); @@ -43,8 +55,8 @@ Image::Image(const std::string &filename) : filename(filename) { std::cerr << e.what() << std::endl; throw std::runtime_error(e.what()); } - std::string warning_msg = warning_log.str(); - std::string error_msg = error_log.str(); + const std::string warning_msg = warning_log.str(); + const std::string error_msg = error_log.str(); if(!warning_msg.empty()){ warning_logs.push_back(warning_msg); diff --git a/src/py3exiv2bind/core/glue/MetadataProcessor.cpp b/src/py3exiv2bind/core/glue/MetadataProcessor.cpp index fd76e729..e1fad972 100644 --- a/src/py3exiv2bind/core/glue/MetadataProcessor.cpp +++ b/src/py3exiv2bind/core/glue/MetadataProcessor.cpp @@ -2,11 +2,18 @@ // Created by hborcher on 10/11/2017. // -#include "MetadataProcessor.h" #include "ExifStrategy.h" #include "IPTC_Strategy.h" +#include "MetadataProcessor.h" +#include "MetadataStrategies.h" #include "XmpStrategy.h" +#include + +#include +#include +#include + const std::unordered_map &MetadataProcessor::getMetadata() const { return metadata; } diff --git a/src/py3exiv2bind/core/glue/MetadataProcessor.h b/src/py3exiv2bind/core/glue/MetadataProcessor.h index 2f812ebc..36e9a846 100644 --- a/src/py3exiv2bind/core/glue/MetadataProcessor.h +++ b/src/py3exiv2bind/core/glue/MetadataProcessor.h @@ -6,9 +6,10 @@ #define PYEXIV2BIND_METADATA_PROCESSOR_H -#include -#include #include +#include +#include + #include "AbsMetadataStrategy.h" #include "MetadataStrategies.h" @@ -19,7 +20,7 @@ struct MetadataProcessor { public: void build(const Exiv2::Image &image); const std::unordered_map &getMetadata() const; - void set_output_format(MetadataStrategies); + void set_output_format(MetadataStrategies metadata_type); }; diff --git a/src/py3exiv2bind/core/glue/XmpStrategy.cpp b/src/py3exiv2bind/core/glue/XmpStrategy.cpp index d86d922e..018f8176 100644 --- a/src/py3exiv2bind/core/glue/XmpStrategy.cpp +++ b/src/py3exiv2bind/core/glue/XmpStrategy.cpp @@ -4,7 +4,12 @@ #include "XmpStrategy.h" #include "make_dictionary.h" -#include + +#include + +#include +#include + std::unordered_map XmpStrategy::load(const Exiv2::Image &image){ return make_dictionary(image.xmpData()); } diff --git a/src/py3exiv2bind/core/glue/glue.cpp b/src/py3exiv2bind/core/glue/glue.cpp index 3ec3583a..190c0fd1 100644 --- a/src/py3exiv2bind/core/glue/glue.cpp +++ b/src/py3exiv2bind/core/glue/glue.cpp @@ -2,23 +2,32 @@ // Created by hborcher on 10/4/2017. // #include "glue.h" -#include + + +#include +#include +#include + +#include +#include + using Exiv2::Image; using Exiv2::ImageFactory; + std::string exiv2_version() { return Exiv2::versionString(); } -void set_dpi(const std::string &filename, int x, int y){ - std::unique_ptr image = ImageFactory::open(filename); +void set_dpi(const std::string &filename, int x_res, int y_res){ + const std::unique_ptr image = ImageFactory::open(filename); image->readMetadata(); Exiv2::ExifData metadata = image->exifData(); - metadata["Exif.Image.XResolution"] = Exiv2::URational(x, 1); - metadata["Exif.Image.YResolution"] = Exiv2::URational(y, 1); + metadata["Exif.Image.XResolution"] = Exiv2::URational(x_res, 1); + metadata["Exif.Image.YResolution"] = Exiv2::URational(y_res, 1); metadata["Exif.Image.ResolutionUnit"] = 2; image->setExifData(metadata); image->writeMetadata(); diff --git a/src/py3exiv2bind/core/glue/glue.h b/src/py3exiv2bind/core/glue/glue.h index c6c82c77..43d39634 100644 --- a/src/py3exiv2bind/core/glue/glue.h +++ b/src/py3exiv2bind/core/glue/glue.h @@ -5,8 +5,8 @@ #ifndef SUPERBUILD_GLUE_H #define SUPERBUILD_GLUE_H -#include #include +#include struct metadata_chunk { @@ -19,6 +19,6 @@ struct metadata_chunk { std::string exiv2_version(); -void set_dpi(const std::string &filename, int x, int y); +void set_dpi(const std::string &filename, int x_res, int y_res); #endif //SUPERBUILD_GLUE_H diff --git a/tests/test-core.cpp b/tests/test-core.cpp index 4a6743a2..07eea679 100644 --- a/tests/test-core.cpp +++ b/tests/test-core.cpp @@ -75,11 +75,11 @@ TEST_CASE("bad tiff file with set_dpi raises"){ corruptedFile.open(bad_file, std::ios::binary); OtherDataFormat packet{3, 3, 3, 1.2}; int number = 444; - const char header = 'I'; + constexpr char header = 'I'; corruptedFile.write(&header, sizeof(char )); corruptedFile.write(&header, sizeof(char )); - corruptedFile.write((char*) &number, sizeof(int )); - corruptedFile.write((char *) &packet, sizeof(OtherDataFormat)); + corruptedFile.write(reinterpret_cast(&number), sizeof(int )); + corruptedFile.write(reinterpret_cast(&packet), sizeof(OtherDataFormat)); corruptedFile.close(); REQUIRE_THROWS_AS(set_dpi(bad_file, 100, 100), Exiv2::Error); } diff --git a/tests/test_editing.cpp b/tests/test_editing.cpp index 6b280fdc..1a63db9e 100644 --- a/tests/test_editing.cpp +++ b/tests/test_editing.cpp @@ -2,136 +2,71 @@ // Created by hborcher on 10/4/2018. // -#include + #include -#include +#include + +#include +#include +#include +#include +#include + #include +#include #include - -#include "../src/py3exiv2bind/core/glue/Image.h" -#include "catch2/generators/catch_generators.hpp" -//#include "glue/Image.h" +#include namespace fs = std::filesystem; -void exifPrint(const Exiv2::ExifData& exifData); +static void exifPrint(const Exiv2::ExifData& exifData); -#define METADATA_KEY "Exif.Image.XResolution" -//#define METADATA_KEY "Exif.Image.Make" -//#define METADATA_NEW_VALUE "MEa" - -const std::string IMAGE_TEST_PATH(TEST_IMAGE_PATH); +constexpr auto METADATA_KEY = "Exif.Image.XResolution"; TEST_CASE("Edit"){ - const std::string filename = IMAGE_TEST_PATH + "dummy.tif"; + constexpr auto filename = TEST_IMAGE_PATH "dummy.tif"; { - auto image = Exiv2::ImageFactory::open(filename); - assert(image.get() != 0); + const auto image = Exiv2::ImageFactory::open(filename); + assert(image.get() != nullptr); assert(image->good()); assert(image->checkMode(Exiv2::MetadataId::mdExif) !=Exiv2::AccessMode::amRead); image->readMetadata(); Exiv2::ExifData exifData = image->exifData(); -// Exiv2::ExifData exifData = image->exifData(); - -// exifPrint(exifData); -// -// Exiv2::ExifKey metadata_key(METADATA_KEY); -// -// Exiv2::ExifData::iterator pos = exifData.findKey(metadata_key); -// -// if (pos == exifData.end()) { -// throw Exiv2::Error(Exiv2::kerErrorMessage, "Metadatum with key = " + metadata_key.key() + " not found"); -// } - std::cout << "The original value of "<< METADATA_KEY << " is " << exifData[METADATA_KEY] << std::endl; -// Exiv2::ExifData data; -// data. -// Exiv2::FloatValue("sd") - -// exifData[METADATA_KEY].setValue("300",Exiv2::FloatValue) = "300"; -// std::cout << "The original value of "<< pos->key() << " is " <value() << std::endl; -// exifData["Exif.Image.ResolutionUnit"] = uint16_t(1); -//// auto rc = exifData["Exif.Image.XResolution"].setValue("300"); -//// Exiv2::signedLong d(300); -// pos->setValue(METADATA_NEW_VALUE); -//// exifData["Exif.Image.YResolution"] = Exiv2::Rational(-2, 3); -// -//// -////// exifData["Exif.Image.XResolution"].set; -//// REQUIRE(exifData["Exif.Image.XResolution"].toString() == std::string("300")); -////// Exiv2::Exifdatum& tag = exifData["Exif.Image.XResolution"]; -////// int rc = tag.setValue("400"); -////// std::cout <<"Rc ="<< rc << std::endl; -//// -////// .setValue("200");// = int32_t(-2); -////// exifData["Exif.Image.XResolution"] = Exiv2::Rational(-2, 3); -////// image->clearExifData(); - Exiv2::Exifdatum d = exifData["Exif.Image.XResolution"]; - std::cout << "family name " << d.familyName() << std::endl; - std::cout << "groupName " << d.groupName() << std::endl; - std::cout << "tagName " << d.tagName() << std::endl; - - -// Exiv2::Value::AutoPtr v = Exiv2::Value::create(Exiv2::unsignedRational); -// v->read("300 / 1"); -// std::cout << "converted to String " << v->toString() << "\n"; -// std::cout << "converted to Float " << v->toFloat() << "\n"; -// std::cout << "converted to toRational " << v->toRational().first << "/" << v->toRational().second << "\n"; -// Exiv2::ExifKey key(METADATA_KEY); -// Exiv2::ExifData::iterator i = exifData.findKey(key); -//// i. -//// exifData.erase(i); -// exifData.add(key, v.get()); + std::cout << "The original value of " << METADATA_KEY << " is " << exifData[METADATA_KEY] << std::endl; + const Exiv2::Exifdatum data = exifData["Exif.Image.XResolution"]; + std::cout << "family name " << data.familyName() << std::endl; + std::cout << "groupName " << data.groupName() << std::endl; + std::cout << "tagName " << data.tagName() << std::endl; Exiv2::RationalValue value; value.read("300/1"); -// std::cout << "converted to String " << value.toString() << "\n"; std::cout << "converted to Float " << value.toFloat() << "\n"; std::cout << "converted to toRational " << value.toRational().first << "/" << value.toRational().second << "\n"; exifData["Exif.Image.XResolution"] = value; image->setExifData(exifData); image->writeMetadata(); - -// exifDataExifdatum - - } std::cout << "Written to " << filename <readMetadata(); Exiv2::ExifData exifData_second = image->exifData(); std::cout << "Now the value of " << exifData_second[METADATA_KEY].key() << " is " << exifData_second[METADATA_KEY].value().toFloat() << std::endl; exifPrint(exifData_second); } -// -// { -// Exiv2::Image::AutoPtr image_read = Exiv2::ImageFactory::open(filename); -// assert(image_read.get() != 0); -// image_read->readMetadata(); -// -// -// Exiv2::ExifData exifData_second = image_read->exifData(); -// std::cout <<"Exif.Image.XResolution = " << exifData_second["Exif.Image.XResolution"] << std::endl; -// Exiv2::Exifdatum value = exifData_second["Exif.Image.XResolution"]; -// REQUIRE(value.toString() == "300"); -// std::cout <<"Exif.Image.ResolutionUnit = " << exifData_second["Exif.Image.ResolutionUnit"] << std::endl; -// -// Exiv2::IptcData iptcData = image_read->iptcData(); -// -// } } TEST_CASE("Edit tiff") { - const std::string filename = IMAGE_TEST_PATH + "dummy.tif"; + constexpr auto filename = TEST_IMAGE_PATH "dummy.tif"; { - auto image = Exiv2::ImageFactory::open(filename); + const auto image = Exiv2::ImageFactory::open(filename); - assert(image.get() != 0); + assert(image.get() != nullptr); assert(image->good()); assert(image->checkMode(Exiv2::MetadataId::mdExif) != Exiv2::AccessMode::amRead); @@ -139,14 +74,9 @@ TEST_CASE("Edit tiff") { Exiv2::ExifData exifData = image->exifData(); image->readMetadata(); exifPrint(exifData); - exifData["Exif.Image.XResolution"] = int32_t(300); - exifData["Exif.Image.YResolution"] = int32_t(300); -// exifData["Exif.Image.Make"] = "Mine"; - - std::string stringvalue = exifData[METADATA_KEY].toString(); - exifData["Exif.Image.ResolutionUnit"] = int32_t(2); - Exiv2::Exifdatum d = exifData["Exif.Image.ResolutionUnit"]; - + exifData["Exif.Image.XResolution"] = 300; + exifData["Exif.Image.YResolution"] = 300; + exifData["Exif.Image.ResolutionUnit"] = 2; image->setExifData(exifData); image->writeMetadata(); std::cout << "Written to " << filename << std::endl; @@ -156,8 +86,8 @@ TEST_CASE("Edit tiff") { } { - auto image = Exiv2::ImageFactory::open(filename); - assert(image.get() != 0); + const auto image = Exiv2::ImageFactory::open(filename); + assert(image.get() != nullptr); image->readMetadata(); Exiv2::ExifData exifData_second = image->exifData(); std::cout << "Now the value of " << exifData_second["Exif.Image.XResolution"].key() << " is " @@ -170,8 +100,7 @@ TEST_CASE("Edit tiff") { void exifPrint(const Exiv2::ExifData& exifData) { - Exiv2::ExifData::const_iterator i = exifData.begin(); - for (; i != exifData.end(); ++i) { + for (auto i = exifData.begin(); i != exifData.end(); ++i) { std::cout << std::setw(44) << std::setfill(' ') << std::left << i->key() << " " << "0x" << std::setw(4) << std::setfill('0') << std::right @@ -187,8 +116,6 @@ void exifPrint(const Exiv2::ExifData& exifData) } TEST_CASE("edit jp2 metadata", "[integration,upstream]"){ - const std::string source = IMAGE_TEST_PATH + "dummy.jp2"; - const std::string out = IMAGE_TEST_PATH + "changeme.jp2"; auto [key, startingValue, value] = GENERATE(table({ {"Xmp.iptc.CreatorContactInfo/Iptc4xmpCore:CiAdrCity", "Urbana", "Champaign"}, {"Xmp.iptc.CreatorContactInfo/Iptc4xmpCore:CiEmailWork", "digidcc@library.illinois.edu", "digitizationservices@library.illinois.edu"}, @@ -198,16 +125,17 @@ TEST_CASE("edit jp2 metadata", "[integration,upstream]"){ } ) ); DYNAMIC_SECTION("Change " << key <<" to " << value){ + constexpr auto source = TEST_IMAGE_PATH "dummy.jp2"; + constexpr auto out = TEST_IMAGE_PATH "changeme.jp2"; fs::copy(source, out, fs::copy_options::overwrite_existing); { auto image = Exiv2::ImageFactory::open(out); - assert(image.get() != 0); + assert(image.get() != nullptr); image->readMetadata(); auto xmpData = image->xmpData(); REQUIRE(xmpData[key].value().toString() == startingValue); - auto x = xmpData.findKey(Exiv2::XmpKey(key)); - if (x != xmpData.end()){ - xmpData.erase(x); + if (auto erase_key = xmpData.findKey(Exiv2::XmpKey(key)); erase_key != xmpData.end()){ + xmpData.erase(erase_key); } xmpData[key].setValue(value); image->setXmpData(xmpData); @@ -215,7 +143,7 @@ TEST_CASE("edit jp2 metadata", "[integration,upstream]"){ } { auto second_image = Exiv2::ImageFactory::open(out); - assert(second_image.get() != 0); + assert(second_image.get() != nullptr); second_image->readMetadata(); auto secondXmpData = second_image->xmpData(); REQUIRE(secondXmpData[key].value().toString() == value);