diff --git a/dbrepo-analyse-service/Pipfile.lock b/dbrepo-analyse-service/Pipfile.lock index a34914b5d78f9686bbef821284161e39acc59567..a47ad241be71bb73dd72e470f0d84c8ecf528c97 100644 --- a/dbrepo-analyse-service/Pipfile.lock +++ b/dbrepo-analyse-service/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "81259bb4fb1f303f1bfc9f643c6210d3b5f8de902725e4134cdab680d3fdfbb3" + "sha256": "a445bc066f06e174431552d155daabfdb4271e7f6ba781b61611e816ad8bf48c" }, "pipfile-spec": 6, "requires": { @@ -167,27 +167,28 @@ }, "boto3": { "hashes": [ - "sha256:0314e6598f59ee0f34eb4e6d1a0f69fa65c146d2b88a6e837a527a9956ec2731", - "sha256:d41037e2c680ab8d6c61a0a4ee6bf1fdd9e857f43996672830a95d62d6f6fa79" + "sha256:11edeeacdd517bda3b7615b754d8440820cdc9ddd66794cc995a9693ddeaa3be", + "sha256:f4e6489ba9dc7fb37d53e0e82dbc97f2cb0a4969ef3970e2c88b8f94023ae81a" ], "index": "pypi", - "version": "==1.34.136" + "markers": "python_version >= '3.8'", + "version": "==1.34.149" }, "botocore": { "hashes": [ - "sha256:7f7135178692b39143c8f152a618d2a3b71065a317569a7102d2306d4946f42f", - "sha256:c63fe9032091fb9e9477706a3ebfa4d0c109b807907051d892ed574f9b573e61" + "sha256:2e1eb5ef40102a3d796bb3dd05f2ac5e8fb43fe1ff114b4f6d33153437f5a372", + "sha256:ae6c4be52eeee96f68c116b27d252bab069cd046d61a17cfe8e9da411cf22906" ], "markers": "python_version >= '3.8'", - "version": "==1.34.136" + "version": "==1.34.149" }, "certifi": { "hashes": [ - "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516", - "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56" + "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b", + "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90" ], "markers": "python_version >= '3.6'", - "version": "==2024.6.2" + "version": "==2024.7.4" }, "cffi": { "hashes": [ @@ -247,6 +248,15 @@ "markers": "platform_python_implementation != 'PyPy'", "version": "==1.16.0" }, + "chardet": { + "hashes": [ + "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7", + "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==5.2.0" + }, "charset-normalizer": { "hashes": [ "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", @@ -353,50 +363,44 @@ }, "cryptography": { "hashes": [ - "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad", - "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583", - "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b", - "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c", - "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1", - "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648", - "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949", - "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba", - "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c", - "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9", - "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d", - "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c", - "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e", - "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2", - "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d", - "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7", - "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70", - "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2", - "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7", - "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14", - "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe", - "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e", - "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71", - "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961", - "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7", - "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c", - "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28", - "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842", - "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902", - "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801", - "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a", - "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e" + "sha256:0663585d02f76929792470451a5ba64424acc3cd5227b03921dab0e2f27b1709", + "sha256:08a24a7070b2b6804c1940ff0f910ff728932a9d0e80e7814234269f9d46d069", + "sha256:232ce02943a579095a339ac4b390fbbe97f5b5d5d107f8a08260ea2768be8cc2", + "sha256:2905ccf93a8a2a416f3ec01b1a7911c3fe4073ef35640e7ee5296754e30b762b", + "sha256:299d3da8e00b7e2b54bb02ef58d73cd5f55fb31f33ebbf33bd00d9aa6807df7e", + "sha256:2c6d112bf61c5ef44042c253e4859b3cbbb50df2f78fa8fae6747a7814484a70", + "sha256:31e44a986ceccec3d0498e16f3d27b2ee5fdf69ce2ab89b52eaad1d2f33d8778", + "sha256:3d9a1eca329405219b605fac09ecfc09ac09e595d6def650a437523fcd08dd22", + "sha256:3dcdedae5c7710b9f97ac6bba7e1052b95c7083c9d0e9df96e02a1932e777895", + "sha256:47ca71115e545954e6c1d207dd13461ab81f4eccfcb1345eac874828b5e3eaaf", + "sha256:4a997df8c1c2aae1e1e5ac49c2e4f610ad037fc5a3aadc7b64e39dea42249431", + "sha256:51956cf8730665e2bdf8ddb8da0056f699c1a5715648c1b0144670c1ba00b48f", + "sha256:5bcb8a5620008a8034d39bce21dc3e23735dfdb6a33a06974739bfa04f853947", + "sha256:64c3f16e2a4fc51c0d06af28441881f98c5d91009b8caaff40cf3548089e9c74", + "sha256:6e2b11c55d260d03a8cf29ac9b5e0608d35f08077d8c087be96287f43af3ccdc", + "sha256:7b3f5fe74a5ca32d4d0f302ffe6680fcc5c28f8ef0dc0ae8f40c0f3a1b4fca66", + "sha256:844b6d608374e7d08f4f6e6f9f7b951f9256db41421917dfb2d003dde4cd6b66", + "sha256:9a8d6802e0825767476f62aafed40532bd435e8a5f7d23bd8b4f5fd04cc80ecf", + "sha256:aae4d918f6b180a8ab8bf6511a419473d107df4dbb4225c7b48c5c9602c38c7f", + "sha256:ac1955ce000cb29ab40def14fd1bbfa7af2017cca696ee696925615cafd0dce5", + "sha256:b88075ada2d51aa9f18283532c9f60e72170041bba88d7f37e49cbb10275299e", + "sha256:cb013933d4c127349b3948aa8aaf2f12c0353ad0eccd715ca789c8a0f671646f", + "sha256:cc70b4b581f28d0a254d006f26949245e3657d40d8857066c2ae22a61222ef55", + "sha256:e9c5266c432a1e23738d178e51c2c7a5e2ddf790f248be939448c0ba2021f9d1", + "sha256:ea9e57f8ea880eeea38ab5abf9fbe39f923544d7884228ec67d666abd60f5a47", + "sha256:ee0c405832ade84d4de74b9029bedb7b31200600fa524d218fc29bfa371e97f5", + "sha256:fdcb265de28585de5b859ae13e3846a8e805268a823a12a4da2597f1f5afc9f0" ], "markers": "python_version >= '3.7'", - "version": "==42.0.8" + "version": "==43.0.0" }, "dbrepo": { "hashes": [ - "sha256:2506475fc8fb3f4fdd722e3e92f8e6ad28d0707023c3d8ea5d6d076cef71f395", - "sha256:2bdb48c70b4c99b5044fbfc12aa653c1e9281ca8913a433cc08a1e14cb4bd2ef", - "sha256:dccfaec20a3972a578313206678a119db3d6f898604aab4b694aa2ac37a20629" + "sha256:0a04b67204de6dc969ec68fb21aaead898156077e8a5b6f1e03bb5ab0e124a61", + "sha256:454a182b772cb777d27a22bb334bf059ce68d4e6b5fecae802678fabfdf3f934" ], - "path": "./lib/dbrepo-1.4.5.tar.gz", - "version": "==1.4.5" + "markers": "python_version >= '3.11'", + "path": "./lib/dbrepo-1.4.5.tar.gz" }, "events": { "hashes": [ @@ -406,11 +410,12 @@ }, "exceptiongroup": { "hashes": [ - "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad", - "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16" + "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", + "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc" ], "index": "pypi", - "version": "==1.2.1" + "markers": "python_version >= '3.7'", + "version": "==1.2.2" }, "flasgger": { "hashes": [ @@ -425,6 +430,7 @@ "sha256:ceb27b0af3823ea2737928a4d99d125a06175b8512c445cbd9a9ce200ef76842" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==3.0.3" }, "flask-cors": { @@ -449,6 +455,7 @@ "sha256:9215d05a9413d3855764bcd67035e75819d23af2fafb6b55197eb5a3313fdfb2" ], "index": "pypi", + "markers": "python_version >= '3.7' and python_version < '4'", "version": "==4.6.0" }, "frozenlist": { @@ -579,6 +586,7 @@ "sha256:fbfdce91239fe306772faab57597186710d5699213f4df099d1612da7320d682" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==24.2.1" }, "greenlet": { @@ -643,6 +651,7 @@ "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==3.0.3" }, "gunicorn": { @@ -651,6 +660,7 @@ "sha256:4a0b436239ff76fb33f11c07a16482c521a7e09c1ce3cc293c2330afe01bec63" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==22.0.0" }, "idna": { @@ -687,11 +697,11 @@ }, "jsonschema": { "hashes": [ - "sha256:5b22d434a45935119af990552c862e5d6d564e8f6601206b305a61fdf661a2b7", - "sha256:ff4cfd6b1367a40e7bc6411caec72effadd3db0bbe5017de188f2d6108335802" + "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4", + "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566" ], "markers": "python_version >= '3.8'", - "version": "==4.22.0" + "version": "==4.23.0" }, "jsonschema-specifications": { "hashes": [ @@ -706,6 +716,7 @@ "sha256:61c9170f92e736b530655e75374681d4fcca9cfa8763ab42be57353b2b203494" ], "index": "pypi", + "markers": "python_version >= '3.6'", "version": "==1.3.1" }, "markupsafe": { @@ -888,54 +899,55 @@ }, "numpy": { "hashes": [ - "sha256:04494f6ec467ccb5369d1808570ae55f6ed9b5809d7f035059000a37b8d7e86f", - "sha256:0a43f0974d501842866cc83471bdb0116ba0dffdbaac33ec05e6afed5b615238", - "sha256:0e50842b2295ba8414c8c1d9d957083d5dfe9e16828b37de883f51fc53c4016f", - "sha256:0ec84b9ba0654f3b962802edc91424331f423dcf5d5f926676e0150789cb3d95", - "sha256:17067d097ed036636fa79f6a869ac26df7db1ba22039d962422506640314933a", - "sha256:1cde1753efe513705a0c6d28f5884e22bdc30438bf0085c5c486cdaff40cd67a", - "sha256:1e72728e7501a450288fc8e1f9ebc73d90cfd4671ebbd631f3e7857c39bd16f2", - "sha256:2635dbd200c2d6faf2ef9a0d04f0ecc6b13b3cad54f7c67c61155138835515d2", - "sha256:2ce46fd0b8a0c947ae047d222f7136fc4d55538741373107574271bc00e20e8f", - "sha256:34f003cb88b1ba38cb9a9a4a3161c1604973d7f9d5552c38bc2f04f829536609", - "sha256:354f373279768fa5a584bac997de6a6c9bc535c482592d7a813bb0c09be6c76f", - "sha256:38ecb5b0582cd125f67a629072fed6f83562d9dd04d7e03256c9829bdec027ad", - "sha256:3e8e01233d57639b2e30966c63d36fcea099d17c53bf424d77f088b0f4babd86", - "sha256:3f6bed7f840d44c08ebdb73b1825282b801799e325bcbdfa6bc5c370e5aecc65", - "sha256:4554eb96f0fd263041baf16cf0881b3f5dafae7a59b1049acb9540c4d57bc8cb", - "sha256:46e161722e0f619749d1cd892167039015b2c2817296104487cd03ed4a955995", - "sha256:49d9f7d256fbc804391a7f72d4a617302b1afac1112fac19b6c6cec63fe7fe8a", - "sha256:4d2f62e55a4cd9c58c1d9a1c9edaedcd857a73cb6fda875bf79093f9d9086f85", - "sha256:5f64641b42b2429f56ee08b4f427a4d2daf916ec59686061de751a55aafa22e4", - "sha256:63b92c512d9dbcc37f9d81b123dec99fdb318ba38c8059afc78086fe73820275", - "sha256:6d7696c615765091cc5093f76fd1fa069870304beaccfd58b5dcc69e55ef49c1", - "sha256:79e843d186c8fb1b102bef3e2bc35ef81160ffef3194646a7fdd6a73c6b97196", - "sha256:821eedb7165ead9eebdb569986968b541f9908979c2da8a4967ecac4439bae3d", - "sha256:84554fc53daa8f6abf8e8a66e076aff6ece62de68523d9f665f32d2fc50fd66e", - "sha256:8d83bb187fb647643bd56e1ae43f273c7f4dbcdf94550d7938cfc32566756514", - "sha256:903703372d46bce88b6920a0cd86c3ad82dae2dbef157b5fc01b70ea1cfc430f", - "sha256:9416a5c2e92ace094e9f0082c5fd473502c91651fb896bc17690d6fc475128d6", - "sha256:9a1712c015831da583b21c5bfe15e8684137097969c6d22e8316ba66b5baabe4", - "sha256:9c27f0946a3536403efb0e1c28def1ae6730a72cd0d5878db38824855e3afc44", - "sha256:a356364941fb0593bb899a1076b92dfa2029f6f5b8ba88a14fd0984aaf76d0df", - "sha256:a7039a136017eaa92c1848152827e1424701532ca8e8967fe480fe1569dae581", - "sha256:acd3a644e4807e73b4e1867b769fbf1ce8c5d80e7caaef0d90dcdc640dfc9787", - "sha256:ad0c86f3455fbd0de6c31a3056eb822fc939f81b1618f10ff3406971893b62a5", - "sha256:b4c76e3d4c56f145d41b7b6751255feefae92edbc9a61e1758a98204200f30fc", - "sha256:b6f6a8f45d0313db07d6d1d37bd0b112f887e1369758a5419c0370ba915b3871", - "sha256:c5a59996dc61835133b56a32ebe4ef3740ea5bc19b3983ac60cc32be5a665d54", - "sha256:c73aafd1afca80afecb22718f8700b40ac7cab927b8abab3c3e337d70e10e5a2", - "sha256:cee6cc0584f71adefe2c908856ccc98702baf95ff80092e4ca46061538a2ba98", - "sha256:cef04d068f5fb0518a77857953193b6bb94809a806bd0a14983a8f12ada060c9", - "sha256:cf5d1c9e6837f8af9f92b6bd3e86d513cdc11f60fd62185cc49ec7d1aba34864", - "sha256:e61155fae27570692ad1d327e81c6cf27d535a5d7ef97648a17d922224b216de", - "sha256:e7f387600d424f91576af20518334df3d97bc76a300a755f9a8d6e4f5cadd289", - "sha256:ed08d2703b5972ec736451b818c2eb9da80d66c3e84aed1deeb0c345fefe461b", - "sha256:fbd6acc766814ea6443628f4e6751d0da6593dae29c08c0b2606164db026970c", - "sha256:feff59f27338135776f6d4e2ec7aeeac5d5f7a08a83e80869121ef8164b74af9" + "sha256:08458fbf403bff5e2b45f08eda195d4b0c9b35682311da5a5a0a0925b11b9bd8", + "sha256:0fbb536eac80e27a2793ffd787895242b7f18ef792563d742c2d673bfcb75134", + "sha256:12f5d865d60fb9734e60a60f1d5afa6d962d8d4467c120a1c0cda6eb2964437d", + "sha256:15eb4eca47d36ec3f78cde0a3a2ee24cf05ca7396ef808dda2c0ddad7c2bde67", + "sha256:173a00b9995f73b79eb0191129f2455f1e34c203f559dd118636858cc452a1bf", + "sha256:1b902ce0e0a5bb7704556a217c4f63a7974f8f43e090aff03fcf262e0b135e02", + "sha256:1f682ea61a88479d9498bf2091fdcd722b090724b08b31d63e022adc063bad59", + "sha256:1f87fec1f9bc1efd23f4227becff04bd0e979e23ca50cc92ec88b38489db3b55", + "sha256:24a0e1befbfa14615b49ba9659d3d8818a0f4d8a1c5822af8696706fbda7310c", + "sha256:2c3a346ae20cfd80b6cfd3e60dc179963ef2ea58da5ec074fd3d9e7a1e7ba97f", + "sha256:36d3a9405fd7c511804dc56fc32974fa5533bdeb3cd1604d6b8ff1d292b819c4", + "sha256:3fdabe3e2a52bc4eff8dc7a5044342f8bd9f11ef0934fcd3289a788c0eb10018", + "sha256:4127d4303b9ac9f94ca0441138acead39928938660ca58329fe156f84b9f3015", + "sha256:4658c398d65d1b25e1760de3157011a80375da861709abd7cef3bad65d6543f9", + "sha256:485b87235796410c3519a699cfe1faab097e509e90ebb05dcd098db2ae87e7b3", + "sha256:529af13c5f4b7a932fb0e1911d3a75da204eff023ee5e0e79c1751564221a5c8", + "sha256:5a3d94942c331dd4e0e1147f7a8699a4aa47dffc11bf8a1523c12af8b2e91bbe", + "sha256:5daab361be6ddeb299a918a7c0864fa8618af66019138263247af405018b04e1", + "sha256:61728fba1e464f789b11deb78a57805c70b2ed02343560456190d0501ba37b0f", + "sha256:6790654cb13eab303d8402354fabd47472b24635700f631f041bd0b65e37298a", + "sha256:69ff563d43c69b1baba77af455dd0a839df8d25e8590e79c90fcbe1499ebde42", + "sha256:6bf4e6f4a2a2e26655717a1983ef6324f2664d7011f6ef7482e8c0b3d51e82ac", + "sha256:6e4eeb6eb2fced786e32e6d8df9e755ce5be920d17f7ce00bc38fcde8ccdbf9e", + "sha256:72dc22e9ec8f6eaa206deb1b1355eb2e253899d7347f5e2fae5f0af613741d06", + "sha256:75b4e316c5902d8163ef9d423b1c3f2f6252226d1aa5cd8a0a03a7d01ffc6268", + "sha256:7b9853803278db3bdcc6cd5beca37815b133e9e77ff3d4733c247414e78eb8d1", + "sha256:7d6fddc5fe258d3328cd8e3d7d3e02234c5d70e01ebe377a6ab92adb14039cb4", + "sha256:81b0893a39bc5b865b8bf89e9ad7807e16717f19868e9d234bdaf9b1f1393868", + "sha256:8efc84f01c1cd7e34b3fb310183e72fcdf55293ee736d679b6d35b35d80bba26", + "sha256:8fae4ebbf95a179c1156fab0b142b74e4ba4204c87bde8d3d8b6f9c34c5825ef", + "sha256:99d0d92a5e3613c33a5f01db206a33f8fdf3d71f2912b0de1739894668b7a93b", + "sha256:9adbd9bb520c866e1bfd7e10e1880a1f7749f1f6e5017686a5fbb9b72cf69f82", + "sha256:a1e01dcaab205fbece13c1410253a9eea1b1c9b61d237b6fa59bcc46e8e89343", + "sha256:a8fc2de81ad835d999113ddf87d1ea2b0f4704cbd947c948d2f5513deafe5a7b", + "sha256:b83e16a5511d1b1f8a88cbabb1a6f6a499f82c062a4251892d9ad5d609863fb7", + "sha256:bb2124fdc6e62baae159ebcfa368708867eb56806804d005860b6007388df171", + "sha256:bfc085b28d62ff4009364e7ca34b80a9a080cbd97c2c0630bb5f7f770dae9414", + "sha256:cbab9fc9c391700e3e1287666dfd82d8666d10e69a6c4a09ab97574c0b7ee0a7", + "sha256:e5eeca8067ad04bc8a2a8731183d51d7cbaac66d86085d5f4766ee6bf19c7f87", + "sha256:e9e81fa9017eaa416c056e5d9e71be93d05e2c3c2ab308d23307a8bc4443c368", + "sha256:ea2326a4dca88e4a274ba3a4405eb6c6467d3ffbd8c7d38632502eaae3820587", + "sha256:eacf3291e263d5a67d8c1a581a8ebbcfd6447204ef58828caf69a5e3e8c75990", + "sha256:ec87f5f8aca726117a1c9b7083e7656a9d0d606eec7299cc067bb83d26f16e0c", + "sha256:f1659887361a7151f89e79b276ed8dff3d75877df906328f14d8bb40bb4f5101", + "sha256:f9cf5ea551aec449206954b075db819f52adc1638d46a6738253a712d553c7b4" ], "index": "pypi", - "version": "==2.0.0" + "markers": "python_version >= '3.9'", + "version": "==2.0.1" }, "opensearch-py": { "hashes": [ @@ -943,6 +955,7 @@ "sha256:b6e78b685dd4e9c016d7a4299cf1de69e299c88322e3f81c716e6e23fe5683c1" ], "index": "pypi", + "markers": "python_version >= '3.8' and python_version < '4'", "version": "==2.6.0" }, "packaging": { @@ -986,6 +999,7 @@ "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad" ], "index": "pypi", + "markers": "python_version >= '3.9'", "version": "==2.2.2" }, "pika": { @@ -1006,11 +1020,11 @@ }, "prometheus-flask-exporter": { "hashes": [ - "sha256:7a026b4fdd54ebeddb77589333efe3a1ec43c7c717468825b0b3e9b6c33f7e9e", - "sha256:e4e6beb1b8e1e164da6d70fe1edefc95ef184f113b5047f66f4b7262233da9c0" + "sha256:587c770a1061e93d72c5cbcdefbd7b633fb764e39dffd7dd16932c9124559244", + "sha256:ab49b2c40b57cd35cd51e91e59b3c306b3754477095c4f3cf679034c5122398c" ], "index": "pypi", - "version": "==0.23.0" + "version": "==0.23.1" }, "pycparser": { "hashes": [ @@ -1060,96 +1074,107 @@ }, "pydantic": { "hashes": [ - "sha256:0c84efd9548d545f63ac0060c1e4d39bb9b14db8b3c0652338aecc07b5adec52", - "sha256:ee8538d41ccb9c0a9ad3e0e5f07bf15ed8015b481ced539a1759d8cc89ae90d0" + "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a", + "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8" ], "index": "pypi", - "version": "==2.7.4" + "markers": "python_version >= '3.8'", + "version": "==2.8.2" }, "pydantic-core": { "hashes": [ - "sha256:01dd777215e2aa86dfd664daed5957704b769e726626393438f9c87690ce78c3", - "sha256:0eb2a4f660fcd8e2b1c90ad566db2b98d7f3f4717c64fe0a83e0adb39766d5b8", - "sha256:0fbbdc827fe5e42e4d196c746b890b3d72876bdbf160b0eafe9f0334525119c8", - "sha256:123c3cec203e3f5ac7b000bd82235f1a3eced8665b63d18be751f115588fea30", - "sha256:14601cdb733d741b8958224030e2bfe21a4a881fb3dd6fbb21f071cabd48fa0a", - "sha256:18f469a3d2a2fdafe99296a87e8a4c37748b5080a26b806a707f25a902c040a8", - "sha256:19894b95aacfa98e7cb093cd7881a0c76f55731efad31073db4521e2b6ff5b7d", - "sha256:1b4de2e51bbcb61fdebd0ab86ef28062704f62c82bbf4addc4e37fa4b00b7cbc", - "sha256:1d886dc848e60cb7666f771e406acae54ab279b9f1e4143babc9c2258213daa2", - "sha256:1f4d26ceb5eb9eed4af91bebeae4b06c3fb28966ca3a8fb765208cf6b51102ab", - "sha256:21a5e440dbe315ab9825fcd459b8814bb92b27c974cbc23c3e8baa2b76890077", - "sha256:293afe532740370aba8c060882f7d26cfd00c94cae32fd2e212a3a6e3b7bc15e", - "sha256:2f5966897e5461f818e136b8451d0551a2e77259eb0f73a837027b47dc95dab9", - "sha256:2fd41f6eff4c20778d717af1cc50eca52f5afe7805ee530a4fbd0bae284f16e9", - "sha256:2fdf2156aa3d017fddf8aea5adfba9f777db1d6022d392b682d2a8329e087cef", - "sha256:3c40d4eaad41f78e3bbda31b89edc46a3f3dc6e171bf0ecf097ff7a0ffff7cb1", - "sha256:43d447dd2ae072a0065389092a231283f62d960030ecd27565672bd40746c507", - "sha256:44a688331d4a4e2129140a8118479443bd6f1905231138971372fcde37e43528", - "sha256:44c7486a4228413c317952e9d89598bcdfb06399735e49e0f8df643e1ccd0558", - "sha256:44cd83ab6a51da80fb5adbd9560e26018e2ac7826f9626bc06ca3dc074cd198b", - "sha256:46387e38bd641b3ee5ce247563b60c5ca098da9c56c75c157a05eaa0933ed154", - "sha256:4701b19f7e3a06ea655513f7938de6f108123bf7c86bbebb1196eb9bd35cf724", - "sha256:4748321b5078216070b151d5271ef3e7cc905ab170bbfd27d5c83ee3ec436695", - "sha256:4b06beb3b3f1479d32befd1f3079cc47b34fa2da62457cdf6c963393340b56e9", - "sha256:4d0dcc59664fcb8974b356fe0a18a672d6d7cf9f54746c05f43275fc48636851", - "sha256:4e99bc050fe65c450344421017f98298a97cefc18c53bb2f7b3531eb39bc7805", - "sha256:509daade3b8649f80d4e5ff21aa5673e4ebe58590b25fe42fac5f0f52c6f034a", - "sha256:51991a89639a912c17bef4b45c87bd83593aee0437d8102556af4885811d59f5", - "sha256:53db086f9f6ab2b4061958d9c276d1dbe3690e8dd727d6abf2321d6cce37fa94", - "sha256:564d7922e4b13a16b98772441879fcdcbe82ff50daa622d681dd682175ea918c", - "sha256:574d92eac874f7f4db0ca653514d823a0d22e2354359d0759e3f6a406db5d55d", - "sha256:578e24f761f3b425834f297b9935e1ce2e30f51400964ce4801002435a1b41ef", - "sha256:59ff3e89f4eaf14050c8022011862df275b552caef8082e37b542b066ce1ff26", - "sha256:5f09baa656c904807e832cf9cce799c6460c450c4ad80803517032da0cd062e2", - "sha256:6891a2ae0e8692679c07728819b6e2b822fb30ca7445f67bbf6509b25a96332c", - "sha256:6a750aec7bf431517a9fd78cb93c97b9b0c496090fee84a47a0d23668976b4b0", - "sha256:6f5c4d41b2771c730ea1c34e458e781b18cc668d194958e0112455fff4e402b2", - "sha256:77450e6d20016ec41f43ca4a6c63e9fdde03f0ae3fe90e7c27bdbeaece8b1ed4", - "sha256:81b5efb2f126454586d0f40c4d834010979cb80785173d1586df845a632e4e6d", - "sha256:823be1deb01793da05ecb0484d6c9e20baebb39bd42b5d72636ae9cf8350dbd2", - "sha256:834b5230b5dfc0c1ec37b2fda433b271cbbc0e507560b5d1588e2cc1148cf1ce", - "sha256:847a35c4d58721c5dc3dba599878ebbdfd96784f3fb8bb2c356e123bdcd73f34", - "sha256:86110d7e1907ab36691f80b33eb2da87d780f4739ae773e5fc83fb272f88825f", - "sha256:8951eee36c57cd128f779e641e21eb40bc5073eb28b2d23f33eb0ef14ffb3f5d", - "sha256:8a7164fe2005d03c64fd3b85649891cd4953a8de53107940bf272500ba8a788b", - "sha256:8b8bab4c97248095ae0c4455b5a1cd1cdd96e4e4769306ab19dda135ea4cdb07", - "sha256:90afc12421df2b1b4dcc975f814e21bc1754640d502a2fbcc6d41e77af5ec312", - "sha256:938cb21650855054dc54dfd9120a851c974f95450f00683399006aa6e8abb057", - "sha256:942ba11e7dfb66dc70f9ae66b33452f51ac7bb90676da39a7345e99ffb55402d", - "sha256:972658f4a72d02b8abfa2581d92d59f59897d2e9f7e708fdabe922f9087773af", - "sha256:97736815b9cc893b2b7f663628e63f436018b75f44854c8027040e05230eeddb", - "sha256:98906207f29bc2c459ff64fa007afd10a8c8ac080f7e4d5beff4c97086a3dabd", - "sha256:99457f184ad90235cfe8461c4d70ab7dd2680e28821c29eca00252ba90308c78", - "sha256:a0d829524aaefdebccb869eed855e2d04c21d2d7479b6cada7ace5448416597b", - "sha256:a2fdd81edd64342c85ac7cf2753ccae0b79bf2dfa063785503cb85a7d3593223", - "sha256:a55b5b16c839df1070bc113c1f7f94a0af4433fcfa1b41799ce7606e5c79ce0a", - "sha256:a642295cd0c8df1b86fc3dced1d067874c353a188dc8e0f744626d49e9aa51c4", - "sha256:ab86ce7c8f9bea87b9d12c7f0af71102acbf5ecbc66c17796cff45dae54ef9a5", - "sha256:abc267fa9837245cc28ea6929f19fa335f3dc330a35d2e45509b6566dc18be23", - "sha256:ae1d6df168efb88d7d522664693607b80b4080be6750c913eefb77e34c12c71a", - "sha256:b2ebef0e0b4454320274f5e83a41844c63438fdc874ea40a8b5b4ecb7693f1c4", - "sha256:b48ece5bde2e768197a2d0f6e925f9d7e3e826f0ad2271120f8144a9db18d5c8", - "sha256:b7cdf28938ac6b8b49ae5e92f2735056a7ba99c9b110a474473fd71185c1af5d", - "sha256:bb4462bd43c2460774914b8525f79b00f8f407c945d50881568f294c1d9b4443", - "sha256:bc4ff9805858bd54d1a20efff925ccd89c9d2e7cf4986144b30802bf78091c3e", - "sha256:c1322d7dd74713dcc157a2b7898a564ab091ca6c58302d5c7b4c07296e3fd00f", - "sha256:c67598100338d5d985db1b3d21f3619ef392e185e71b8d52bceacc4a7771ea7e", - "sha256:ca26a1e73c48cfc54c4a76ff78df3727b9d9f4ccc8dbee4ae3f73306a591676d", - "sha256:d323a01da91851a4f17bf592faf46149c9169d68430b3146dcba2bb5e5719abc", - "sha256:dc1803ac5c32ec324c5261c7209e8f8ce88e83254c4e1aebdc8b0a39f9ddb443", - "sha256:e00a3f196329e08e43d99b79b286d60ce46bed10f2280d25a1718399457e06be", - "sha256:e85637bc8fe81ddb73fda9e56bab24560bdddfa98aa64f87aaa4e4b6730c23d2", - "sha256:e858ac0a25074ba4bce653f9b5d0a85b7456eaddadc0ce82d3878c22489fa4ee", - "sha256:eae237477a873ab46e8dd748e515c72c0c804fb380fbe6c85533c7de51f23a8f", - "sha256:ebef0dd9bf9b812bf75bda96743f2a6c5734a02092ae7f721c048d156d5fabae", - "sha256:ec3beeada09ff865c344ff3bc2f427f5e6c26401cc6113d77e372c3fdac73864", - "sha256:f76d0ad001edd426b92233d45c746fd08f467d56100fd8f30e9ace4b005266e4", - "sha256:f85d05aa0918283cf29a30b547b4df2fbb56b45b135f9e35b6807cb28bc47951", - "sha256:f9899c94762343f2cc2fc64c13e7cae4c3cc65cdfc87dd810a31654c9b7358cc" + "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d", + "sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f", + "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686", + "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482", + "sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006", + "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83", + "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6", + "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88", + "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86", + "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a", + "sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6", + "sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a", + "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6", + "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6", + "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43", + "sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c", + "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4", + "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e", + "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203", + "sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd", + "sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1", + "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24", + "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc", + "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc", + "sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3", + "sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598", + "sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98", + "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331", + "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2", + "sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a", + "sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6", + "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688", + "sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91", + "sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa", + "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b", + "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0", + "sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840", + "sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c", + "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd", + "sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3", + "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231", + "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1", + "sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953", + "sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250", + "sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a", + "sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2", + "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20", + "sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434", + "sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab", + "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703", + "sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a", + "sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2", + "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac", + "sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611", + "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121", + "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e", + "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b", + "sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09", + "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906", + "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9", + "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7", + "sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b", + "sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987", + "sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c", + "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b", + "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e", + "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237", + "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1", + "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19", + "sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b", + "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad", + "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0", + "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94", + "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312", + "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f", + "sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669", + "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1", + "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe", + "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99", + "sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a", + "sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a", + "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52", + "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c", + "sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad", + "sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1", + "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a", + "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f", + "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a", + "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27" ], "markers": "python_version >= '3.8'", - "version": "==2.18.4" + "version": "==2.20.1" }, "pyjwt": { "hashes": [ @@ -1245,112 +1270,117 @@ "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==2.32.3" }, "rpds-py": { "hashes": [ - "sha256:05f3d615099bd9b13ecf2fc9cf2d839ad3f20239c678f461c753e93755d629ee", - "sha256:06d218939e1bf2ca50e6b0ec700ffe755e5216a8230ab3e87c059ebb4ea06afc", - "sha256:07f2139741e5deb2c5154a7b9629bc5aa48c766b643c1a6750d16f865a82c5fc", - "sha256:08d74b184f9ab6289b87b19fe6a6d1a97fbfea84b8a3e745e87a5de3029bf944", - "sha256:0abeee75434e2ee2d142d650d1e54ac1f8b01e6e6abdde8ffd6eeac6e9c38e20", - "sha256:154bf5c93d79558b44e5b50cc354aa0459e518e83677791e6adb0b039b7aa6a7", - "sha256:17c6d2155e2423f7e79e3bb18151c686d40db42d8645e7977442170c360194d4", - "sha256:1805d5901779662d599d0e2e4159d8a82c0b05faa86ef9222bf974572286b2b6", - "sha256:19ba472b9606c36716062c023afa2484d1e4220548751bda14f725a7de17b4f6", - "sha256:19e515b78c3fc1039dd7da0a33c28c3154458f947f4dc198d3c72db2b6b5dc93", - "sha256:1d54f74f40b1f7aaa595a02ff42ef38ca654b1469bef7d52867da474243cc633", - "sha256:207c82978115baa1fd8d706d720b4a4d2b0913df1c78c85ba73fe6c5804505f0", - "sha256:2625f03b105328729f9450c8badda34d5243231eef6535f80064d57035738360", - "sha256:27bba383e8c5231cd559affe169ca0b96ec78d39909ffd817f28b166d7ddd4d8", - "sha256:2c3caec4ec5cd1d18e5dd6ae5194d24ed12785212a90b37f5f7f06b8bedd7139", - "sha256:2cc7c1a47f3a63282ab0f422d90ddac4aa3034e39fc66a559ab93041e6505da7", - "sha256:2fc24a329a717f9e2448f8cd1f960f9dac4e45b6224d60734edeb67499bab03a", - "sha256:312fe69b4fe1ffbe76520a7676b1e5ac06ddf7826d764cc10265c3b53f96dbe9", - "sha256:32b7daaa3e9389db3695964ce8e566e3413b0c43e3394c05e4b243a4cd7bef26", - "sha256:338dee44b0cef8b70fd2ef54b4e09bb1b97fc6c3a58fea5db6cc083fd9fc2724", - "sha256:352a88dc7892f1da66b6027af06a2e7e5d53fe05924cc2cfc56495b586a10b72", - "sha256:35b2b771b13eee8729a5049c976197ff58a27a3829c018a04341bcf1ae409b2b", - "sha256:38e14fb4e370885c4ecd734f093a2225ee52dc384b86fa55fe3f74638b2cfb09", - "sha256:3c20f05e8e3d4fc76875fc9cb8cf24b90a63f5a1b4c5b9273f0e8225e169b100", - "sha256:3dd3cd86e1db5aadd334e011eba4e29d37a104b403e8ca24dcd6703c68ca55b3", - "sha256:489bdfe1abd0406eba6b3bb4fdc87c7fa40f1031de073d0cfb744634cc8fa261", - "sha256:48c2faaa8adfacefcbfdb5f2e2e7bdad081e5ace8d182e5f4ade971f128e6bb3", - "sha256:4a98a1f0552b5f227a3d6422dbd61bc6f30db170939bd87ed14f3c339aa6c7c9", - "sha256:4adec039b8e2928983f885c53b7cc4cda8965b62b6596501a0308d2703f8af1b", - "sha256:4e0ee01ad8260184db21468a6e1c37afa0529acc12c3a697ee498d3c2c4dcaf3", - "sha256:51584acc5916212e1bf45edd17f3a6b05fe0cbb40482d25e619f824dccb679de", - "sha256:531796fb842b53f2695e94dc338929e9f9dbf473b64710c28af5a160b2a8927d", - "sha256:5463c47c08630007dc0fe99fb480ea4f34a89712410592380425a9b4e1611d8e", - "sha256:5c45a639e93a0c5d4b788b2613bd637468edd62f8f95ebc6fcc303d58ab3f0a8", - "sha256:6031b25fb1b06327b43d841f33842b383beba399884f8228a6bb3df3088485ff", - "sha256:607345bd5912aacc0c5a63d45a1f73fef29e697884f7e861094e443187c02be5", - "sha256:618916f5535784960f3ecf8111581f4ad31d347c3de66d02e728de460a46303c", - "sha256:636a15acc588f70fda1661234761f9ed9ad79ebed3f2125d44be0862708b666e", - "sha256:673fdbbf668dd958eff750e500495ef3f611e2ecc209464f661bc82e9838991e", - "sha256:6afd80f6c79893cfc0574956f78a0add8c76e3696f2d6a15bca2c66c415cf2d4", - "sha256:6b5ff7e1d63a8281654b5e2896d7f08799378e594f09cf3674e832ecaf396ce8", - "sha256:6c4c4c3f878df21faf5fac86eda32671c27889e13570645a9eea0a1abdd50922", - "sha256:6cd8098517c64a85e790657e7b1e509b9fe07487fd358e19431cb120f7d96338", - "sha256:6d1e42d2735d437e7e80bab4d78eb2e459af48c0a46e686ea35f690b93db792d", - "sha256:6e30ac5e329098903262dc5bdd7e2086e0256aa762cc8b744f9e7bf2a427d3f8", - "sha256:70a838f7754483bcdc830444952fd89645569e7452e3226de4a613a4c1793fb2", - "sha256:720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72", - "sha256:732672fbc449bab754e0b15356c077cc31566df874964d4801ab14f71951ea80", - "sha256:740884bc62a5e2bbb31e584f5d23b32320fd75d79f916f15a788d527a5e83644", - "sha256:7700936ef9d006b7ef605dc53aa364da2de5a3aa65516a1f3ce73bf82ecfc7ae", - "sha256:7732770412bab81c5a9f6d20aeb60ae943a9b36dcd990d876a773526468e7163", - "sha256:7750569d9526199c5b97e5a9f8d96a13300950d910cf04a861d96f4273d5b104", - "sha256:7f1944ce16401aad1e3f7d312247b3d5de7981f634dc9dfe90da72b87d37887d", - "sha256:81c5196a790032e0fc2464c0b4ab95f8610f96f1f2fa3d4deacce6a79852da60", - "sha256:8352f48d511de5f973e4f2f9412736d7dea76c69faa6d36bcf885b50c758ab9a", - "sha256:8927638a4d4137a289e41d0fd631551e89fa346d6dbcfc31ad627557d03ceb6d", - "sha256:8c7672e9fba7425f79019db9945b16e308ed8bc89348c23d955c8c0540da0a07", - "sha256:8d2e182c9ee01135e11e9676e9a62dfad791a7a467738f06726872374a83db49", - "sha256:910e71711d1055b2768181efa0a17537b2622afeb0424116619817007f8a2b10", - "sha256:942695a206a58d2575033ff1e42b12b2aece98d6003c6bc739fbf33d1773b12f", - "sha256:9437ca26784120a279f3137ee080b0e717012c42921eb07861b412340f85bae2", - "sha256:967342e045564cef76dfcf1edb700b1e20838d83b1aa02ab313e6a497cf923b8", - "sha256:998125738de0158f088aef3cb264a34251908dd2e5d9966774fdab7402edfab7", - "sha256:9e6934d70dc50f9f8ea47081ceafdec09245fd9f6032669c3b45705dea096b88", - "sha256:a3d456ff2a6a4d2adcdf3c1c960a36f4fd2fec6e3b4902a42a384d17cf4e7a65", - "sha256:a7b28c5b066bca9a4eb4e2f2663012debe680f097979d880657f00e1c30875a0", - "sha256:a888e8bdb45916234b99da2d859566f1e8a1d2275a801bb8e4a9644e3c7e7909", - "sha256:aa3679e751408d75a0b4d8d26d6647b6d9326f5e35c00a7ccd82b78ef64f65f8", - "sha256:aaa71ee43a703c321906813bb252f69524f02aa05bf4eec85f0c41d5d62d0f4c", - "sha256:b646bf655b135ccf4522ed43d6902af37d3f5dbcf0da66c769a2b3938b9d8184", - "sha256:b906b5f58892813e5ba5c6056d6a5ad08f358ba49f046d910ad992196ea61397", - "sha256:b9bb1f182a97880f6078283b3505a707057c42bf55d8fca604f70dedfdc0772a", - "sha256:bd1105b50ede37461c1d51b9698c4f4be6e13e69a908ab7751e3807985fc0346", - "sha256:bf18932d0003c8c4d51a39f244231986ab23ee057d235a12b2684ea26a353590", - "sha256:c273e795e7a0f1fddd46e1e3cb8be15634c29ae8ff31c196debb620e1edb9333", - "sha256:c69882964516dc143083d3795cb508e806b09fc3800fd0d4cddc1df6c36e76bb", - "sha256:c827576e2fa017a081346dce87d532a5310241648eb3700af9a571a6e9fc7e74", - "sha256:cbfbea39ba64f5e53ae2915de36f130588bba71245b418060ec3330ebf85678e", - "sha256:ce0bb20e3a11bd04461324a6a798af34d503f8d6f1aa3d2aa8901ceaf039176d", - "sha256:d0cee71bc618cd93716f3c1bf56653740d2d13ddbd47673efa8bf41435a60daa", - "sha256:d21be4770ff4e08698e1e8e0bce06edb6ea0626e7c8f560bc08222880aca6a6f", - "sha256:d31dea506d718693b6b2cffc0648a8929bdc51c70a311b2770f09611caa10d53", - "sha256:d44607f98caa2961bab4fa3c4309724b185b464cdc3ba6f3d7340bac3ec97cc1", - "sha256:d58ad6317d188c43750cb76e9deacf6051d0f884d87dc6518e0280438648a9ac", - "sha256:d70129cef4a8d979caa37e7fe957202e7eee8ea02c5e16455bc9808a59c6b2f0", - "sha256:d85164315bd68c0806768dc6bb0429c6f95c354f87485ee3593c4f6b14def2bd", - "sha256:d960de62227635d2e61068f42a6cb6aae91a7fe00fca0e3aeed17667c8a34611", - "sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f", - "sha256:e1735502458621921cee039c47318cb90b51d532c2766593be6207eec53e5c4c", - "sha256:e2be6e9dd4111d5b31ba3b74d17da54a8319d8168890fbaea4b9e5c3de630ae5", - "sha256:e4c39ad2f512b4041343ea3c7894339e4ca7839ac38ca83d68a832fc8b3748ab", - "sha256:ed402d6153c5d519a0faf1bb69898e97fb31613b49da27a84a13935ea9164dfc", - "sha256:ee17cd26b97d537af8f33635ef38be873073d516fd425e80559f4585a7b90c43", - "sha256:f3027be483868c99b4985fda802a57a67fdf30c5d9a50338d9db646d590198da", - "sha256:f5bab211605d91db0e2995a17b5c6ee5edec1270e46223e513eaa20da20076ac", - "sha256:f6f8e3fecca256fefc91bb6765a693d96692459d7d4c644660a9fff32e517843", - "sha256:f7afbfee1157e0f9376c00bb232e80a60e59ed716e3211a80cb8506550671e6e", - "sha256:fa242ac1ff583e4ec7771141606aafc92b361cd90a05c30d93e343a0c2d82a89", - "sha256:fab6ce90574645a0d6c58890e9bcaac8d94dff54fb51c69e5522a7358b80ab64" + "sha256:01227f8b3e6c8961490d869aa65c99653df80d2f0a7fde8c64ebddab2b9b02fd", + "sha256:08ce9c95a0b093b7aec75676b356a27879901488abc27e9d029273d280438505", + "sha256:0b02dd77a2de6e49078c8937aadabe933ceac04b41c5dde5eca13a69f3cf144e", + "sha256:0d4b52811dcbc1aba08fd88d475f75b4f6db0984ba12275d9bed1a04b2cae9b5", + "sha256:13e6d4840897d4e4e6b2aa1443e3a8eca92b0402182aafc5f4ca1f5e24f9270a", + "sha256:1a129c02b42d46758c87faeea21a9f574e1c858b9f358b6dd0bbd71d17713175", + "sha256:1a8dfa125b60ec00c7c9baef945bb04abf8ac772d8ebefd79dae2a5f316d7850", + "sha256:1c32e41de995f39b6b315d66c27dea3ef7f7c937c06caab4c6a79a5e09e2c415", + "sha256:1d494887d40dc4dd0d5a71e9d07324e5c09c4383d93942d391727e7a40ff810b", + "sha256:1d4af2eb520d759f48f1073ad3caef997d1bfd910dc34e41261a595d3f038a94", + "sha256:1fb93d3486f793d54a094e2bfd9cd97031f63fcb5bc18faeb3dd4b49a1c06523", + "sha256:24f8ae92c7fae7c28d0fae9b52829235df83f34847aa8160a47eb229d9666c7b", + "sha256:24fc5a84777cb61692d17988989690d6f34f7f95968ac81398d67c0d0994a897", + "sha256:26ab43b6d65d25b1a333c8d1b1c2f8399385ff683a35ab5e274ba7b8bb7dc61c", + "sha256:271accf41b02687cef26367c775ab220372ee0f4925591c6796e7c148c50cab5", + "sha256:2ddd50f18ebc05ec29a0d9271e9dbe93997536da3546677f8ca00b76d477680c", + "sha256:31dd5794837f00b46f4096aa8ccaa5972f73a938982e32ed817bb520c465e520", + "sha256:31e450840f2f27699d014cfc8865cc747184286b26d945bcea6042bb6aa4d26e", + "sha256:32e0db3d6e4f45601b58e4ac75c6f24afbf99818c647cc2066f3e4b192dabb1f", + "sha256:346557f5b1d8fd9966059b7a748fd79ac59f5752cd0e9498d6a40e3ac1c1875f", + "sha256:34bca66e2e3eabc8a19e9afe0d3e77789733c702c7c43cd008e953d5d1463fde", + "sha256:3511f6baf8438326e351097cecd137eb45c5f019944fe0fd0ae2fea2fd26be39", + "sha256:35af5e4d5448fa179fd7fff0bba0fba51f876cd55212f96c8bbcecc5c684ae5c", + "sha256:3837c63dd6918a24de6c526277910e3766d8c2b1627c500b155f3eecad8fad65", + "sha256:39d67896f7235b2c886fb1ee77b1491b77049dcef6fbf0f401e7b4cbed86bbd4", + "sha256:3b823be829407393d84ee56dc849dbe3b31b6a326f388e171555b262e8456cc1", + "sha256:3c73254c256081704dba0a333457e2fb815364018788f9b501efe7c5e0ada401", + "sha256:3ddab996807c6b4227967fe1587febade4e48ac47bb0e2d3e7858bc621b1cace", + "sha256:3e1dc59a5e7bc7f44bd0c048681f5e05356e479c50be4f2c1a7089103f1621d5", + "sha256:4383beb4a29935b8fa28aca8fa84c956bf545cb0c46307b091b8d312a9150e6a", + "sha256:4cc4bc73e53af8e7a42c8fd7923bbe35babacfa7394ae9240b3430b5dcf16b2a", + "sha256:4dd02e29c8cbed21a1875330b07246b71121a1c08e29f0ee3db5b4cfe16980c4", + "sha256:4f580ae79d0b861dfd912494ab9d477bea535bfb4756a2269130b6607a21802e", + "sha256:53dbc35808c6faa2ce3e48571f8f74ef70802218554884787b86a30947842a14", + "sha256:56313be667a837ff1ea3508cebb1ef6681d418fa2913a0635386cf29cff35165", + "sha256:57863d16187995c10fe9cf911b897ed443ac68189179541734502353af33e693", + "sha256:5953391af1405f968eb5701ebbb577ebc5ced8d0041406f9052638bafe52209d", + "sha256:5beffdbe766cfe4fb04f30644d822a1080b5359df7db3a63d30fa928375b2720", + "sha256:5e360188b72f8080fefa3adfdcf3618604cc8173651c9754f189fece068d2a45", + "sha256:5e58b61dcbb483a442c6239c3836696b79f2cd8e7eec11e12155d3f6f2d886d1", + "sha256:69084fd29bfeff14816666c93a466e85414fe6b7d236cfc108a9c11afa6f7301", + "sha256:6d1d7539043b2b31307f2c6c72957a97c839a88b2629a348ebabe5aa8b626d6b", + "sha256:6d8b735c4d162dc7d86a9cf3d717f14b6c73637a1f9cd57fe7e61002d9cb1972", + "sha256:6ea961a674172ed2235d990d7edf85d15d8dfa23ab8575e48306371c070cda67", + "sha256:71157f9db7f6bc6599a852852f3389343bea34315b4e6f109e5cbc97c1fb2963", + "sha256:720f3108fb1bfa32e51db58b832898372eb5891e8472a8093008010911e324c5", + "sha256:74129d5ffc4cde992d89d345f7f7d6758320e5d44a369d74d83493429dad2de5", + "sha256:747251e428406b05fc86fee3904ee19550c4d2d19258cef274e2151f31ae9d38", + "sha256:75130df05aae7a7ac171b3b5b24714cffeabd054ad2ebc18870b3aa4526eba23", + "sha256:7b3661e6d4ba63a094138032c1356d557de5b3ea6fd3cca62a195f623e381c76", + "sha256:7d5c7e32f3ee42f77d8ff1a10384b5cdcc2d37035e2e3320ded909aa192d32c3", + "sha256:8124101e92c56827bebef084ff106e8ea11c743256149a95b9fd860d3a4f331f", + "sha256:81db2e7282cc0487f500d4db203edc57da81acde9e35f061d69ed983228ffe3b", + "sha256:840e18c38098221ea6201f091fc5d4de6128961d2930fbbc96806fb43f69aec1", + "sha256:89cc8921a4a5028d6dd388c399fcd2eef232e7040345af3d5b16c04b91cf3c7e", + "sha256:8b32cd4ab6db50c875001ba4f5a6b30c0f42151aa1fbf9c2e7e3674893fb1dc4", + "sha256:8df1c283e57c9cb4d271fdc1875f4a58a143a2d1698eb0d6b7c0d7d5f49c53a1", + "sha256:902cf4739458852fe917104365ec0efbea7d29a15e4276c96a8d33e6ed8ec137", + "sha256:97fbb77eaeb97591efdc654b8b5f3ccc066406ccfb3175b41382f221ecc216e8", + "sha256:9c7042488165f7251dc7894cd533a875d2875af6d3b0e09eda9c4b334627ad1c", + "sha256:9e318e6786b1e750a62f90c6f7fa8b542102bdcf97c7c4de2a48b50b61bd36ec", + "sha256:a9421b23c85f361a133aa7c5e8ec757668f70343f4ed8fdb5a4a14abd5437244", + "sha256:aaf71f95b21f9dc708123335df22e5a2fef6307e3e6f9ed773b2e0938cc4d491", + "sha256:afedc35fe4b9e30ab240b208bb9dc8938cb4afe9187589e8d8d085e1aacb8309", + "sha256:b5e28e56143750808c1c79c70a16519e9bc0a68b623197b96292b21b62d6055c", + "sha256:b82c9514c6d74b89a370c4060bdb80d2299bc6857e462e4a215b4ef7aa7b090e", + "sha256:b8f78398e67a7227aefa95f876481485403eb974b29e9dc38b307bb6eb2315ea", + "sha256:bbda75f245caecff8faa7e32ee94dfaa8312a3367397975527f29654cd17a6ed", + "sha256:bca34e913d27401bda2a6f390d0614049f5a95b3b11cd8eff80fe4ec340a1208", + "sha256:bd04d8cab16cab5b0a9ffc7d10f0779cf1120ab16c3925404428f74a0a43205a", + "sha256:c149a652aeac4902ecff2dd93c3b2681c608bd5208c793c4a99404b3e1afc87c", + "sha256:c2087dbb76a87ec2c619253e021e4fb20d1a72580feeaa6892b0b3d955175a71", + "sha256:c34f751bf67cab69638564eee34023909380ba3e0d8ee7f6fe473079bf93f09b", + "sha256:c6d20c8896c00775e6f62d8373aba32956aa0b850d02b5ec493f486c88e12859", + "sha256:c7af6f7b80f687b33a4cdb0a785a5d4de1fb027a44c9a049d8eb67d5bfe8a687", + "sha256:c7b07959866a6afb019abb9564d8a55046feb7a84506c74a6f197cbcdf8a208e", + "sha256:ca0dda0c5715efe2ab35bb83f813f681ebcd2840d8b1b92bfc6fe3ab382fae4a", + "sha256:cdb7eb3cf3deb3dd9e7b8749323b5d970052711f9e1e9f36364163627f96da58", + "sha256:ce757c7c90d35719b38fa3d4ca55654a76a40716ee299b0865f2de21c146801c", + "sha256:d1fa67ef839bad3815124f5f57e48cd50ff392f4911a9f3cf449d66fa3df62a5", + "sha256:d2dbd8f4990d4788cb122f63bf000357533f34860d269c1a8e90ae362090ff3a", + "sha256:d4ec0046facab83012d821b33cead742a35b54575c4edfb7ed7445f63441835f", + "sha256:dbceedcf4a9329cc665452db1aaf0845b85c666e4885b92ee0cddb1dbf7e052a", + "sha256:dc733d35f861f8d78abfaf54035461e10423422999b360966bf1c443cbc42705", + "sha256:dd635c2c4043222d80d80ca1ac4530a633102a9f2ad12252183bcf338c1b9474", + "sha256:de1f7cd5b6b351e1afd7568bdab94934d656abe273d66cda0ceea43bbc02a0c2", + "sha256:df7c841813f6265e636fe548a49664c77af31ddfa0085515326342a751a6ba51", + "sha256:e0f9d268b19e8f61bf42a1da48276bcd05f7ab5560311f541d22557f8227b866", + "sha256:e2d66eb41ffca6cc3c91d8387509d27ba73ad28371ef90255c50cb51f8953301", + "sha256:e429fc517a1c5e2a70d576077231538a98d59a45dfc552d1ac45a132844e6dfb", + "sha256:e4d2b88efe65544a7d5121b0c3b003ebba92bfede2ea3577ce548b69c5235185", + "sha256:e76c902d229a3aa9d5ceb813e1cbcc69bf5bda44c80d574ff1ac1fa3136dea71", + "sha256:ef07a0a1d254eeb16455d839cef6e8c2ed127f47f014bbda64a58b5482b6c836", + "sha256:f09529d2332264a902688031a83c19de8fda5eb5881e44233286b9c9ec91856d", + "sha256:f0a6d4a93d2a05daec7cb885157c97bbb0be4da739d6f9dfb02e101eb40921cd", + "sha256:f0cf2a0dbb5987da4bd92a7ca727eadb225581dd9681365beba9accbe5308f7d", + "sha256:f2671cb47e50a97f419a02cd1e0c339b31de017b033186358db92f4d8e2e17d8", + "sha256:f35b34a5184d5e0cc360b61664c1c06e866aab077b5a7c538a3e20c8fcdbf90b", + "sha256:f3d73022990ab0c8b172cce57c69fd9a89c24fd473a5e79cbce92df87e3d9c48", + "sha256:f5b8353ea1a4d7dfb59a7f45c04df66ecfd363bb5b35f33b11ea579111d4655f", + "sha256:f809a17cc78bd331e137caa25262b507225854073fd319e987bd216bed911b7c", + "sha256:f9bc4161bd3b970cd6a6fcda70583ad4afd10f2750609fb1f3ca9505050d4ef3", + "sha256:fdf4890cda3b59170009d012fca3294c00140e7f2abe1910e6a730809d0f3f9b" ], "markers": "python_version >= '3.8'", - "version": "==0.18.1" + "version": "==0.19.1" }, "s3transfer": { "hashes": [ @@ -1362,11 +1392,11 @@ }, "setuptools": { "hashes": [ - "sha256:937a48c7cdb7a21eb53cd7f9b59e525503aa8abaf3584c730dc5f7a5bec3a650", - "sha256:a58a8fde0541dab0419750bcc521fbdf8585f6e5cb41909df3a472ef7b81ca95" + "sha256:5a0d9c6a2f332881a0153f629d8000118efd33255cfa802757924c53312c76da", + "sha256:98b4d786a12fadd34eabf69e8d014b84e5fc655981e4ff419994700434ace132" ], "markers": "python_version >= '3.8'", - "version": "==70.1.1" + "version": "==72.0.0" }, "six": { "hashes": [ @@ -1609,11 +1639,11 @@ }, "certifi": { "hashes": [ - "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516", - "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56" + "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b", + "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90" ], "markers": "python_version >= '3.6'", - "version": "==2024.6.2" + "version": "==2024.7.4" }, "cffi": { "hashes": [ @@ -1771,61 +1801,62 @@ }, "coverage": { "hashes": [ - "sha256:018a12985185038a5b2bcafab04ab833a9a0f2c59995b3cec07e10074c78635f", - "sha256:02ff6e898197cc1e9fa375581382b72498eb2e6d5fc0b53f03e496cfee3fac6d", - "sha256:042183de01f8b6d531e10c197f7f0315a61e8d805ab29c5f7b51a01d62782747", - "sha256:1014fbf665fef86cdfd6cb5b7371496ce35e4d2a00cda501cf9f5b9e6fced69f", - "sha256:1137f46adb28e3813dec8c01fefadcb8c614f33576f672962e323b5128d9a68d", - "sha256:16852febd96acd953b0d55fc842ce2dac1710f26729b31c80b940b9afcd9896f", - "sha256:2174e7c23e0a454ffe12267a10732c273243b4f2d50d07544a91198f05c48f47", - "sha256:2214ee920787d85db1b6a0bd9da5f8503ccc8fcd5814d90796c2f2493a2f4d2e", - "sha256:3257fdd8e574805f27bb5342b77bc65578e98cbc004a92232106344053f319ba", - "sha256:3684bc2ff328f935981847082ba4fdc950d58906a40eafa93510d1b54c08a66c", - "sha256:3a6612c99081d8d6134005b1354191e103ec9705d7ba2754e848211ac8cacc6b", - "sha256:3d7564cc09dd91b5a6001754a5b3c6ecc4aba6323baf33a12bd751036c998be4", - "sha256:44da56a2589b684813f86d07597fdf8a9c6ce77f58976727329272f5a01f99f7", - "sha256:5013ed890dc917cef2c9f765c4c6a8ae9df983cd60dbb635df8ed9f4ebc9f555", - "sha256:54317c2b806354cbb2dc7ac27e2b93f97096912cc16b18289c5d4e44fc663233", - "sha256:56b4eafa21c6c175b3ede004ca12c653a88b6f922494b023aeb1e836df953ace", - "sha256:581ea96f92bf71a5ec0974001f900db495488434a6928a2ca7f01eee20c23805", - "sha256:5cd64adedf3be66f8ccee418473c2916492d53cbafbfcff851cbec5a8454b136", - "sha256:5df54843b88901fdc2f598ac06737f03d71168fd1175728054c8f5a2739ac3e4", - "sha256:65e528e2e921ba8fd67d9055e6b9f9e34b21ebd6768ae1c1723f4ea6ace1234d", - "sha256:6aae5cce399a0f065da65c7bb1e8abd5c7a3043da9dceb429ebe1b289bc07806", - "sha256:6cfb5a4f556bb51aba274588200a46e4dd6b505fb1a5f8c5ae408222eb416f99", - "sha256:7076b4b3a5f6d2b5d7f1185fde25b1e54eb66e647a1dfef0e2c2bfaf9b4c88c8", - "sha256:73ca8fbc5bc622e54627314c1a6f1dfdd8db69788f3443e752c215f29fa87a0b", - "sha256:79b356f3dd5b26f3ad23b35c75dbdaf1f9e2450b6bcefc6d0825ea0aa3f86ca5", - "sha256:7a892be37ca35eb5019ec85402c3371b0f7cda5ab5056023a7f13da0961e60da", - "sha256:8192794d120167e2a64721d88dbd688584675e86e15d0569599257566dec9bf0", - "sha256:820bc841faa502e727a48311948e0461132a9c8baa42f6b2b84a29ced24cc078", - "sha256:8f894208794b164e6bd4bba61fc98bf6b06be4d390cf2daacfa6eca0a6d2bb4f", - "sha256:a04e990a2a41740b02d6182b498ee9796cf60eefe40cf859b016650147908029", - "sha256:a44963520b069e12789d0faea4e9fdb1e410cdc4aab89d94f7f55cbb7fef0353", - "sha256:a6bb74ed465d5fb204b2ec41d79bcd28afccf817de721e8a807d5141c3426638", - "sha256:ab73b35e8d109bffbda9a3e91c64e29fe26e03e49addf5b43d85fc426dde11f9", - "sha256:aea072a941b033813f5e4814541fc265a5c12ed9720daef11ca516aeacd3bd7f", - "sha256:b1ccf5e728ccf83acd313c89f07c22d70d6c375a9c6f339233dcf792094bcbf7", - "sha256:b385d49609f8e9efc885790a5a0e89f2e3ae042cdf12958b6034cc442de428d3", - "sha256:b3d45ff86efb129c599a3b287ae2e44c1e281ae0f9a9bad0edc202179bcc3a2e", - "sha256:b4a474f799456e0eb46d78ab07303286a84a3140e9700b9e154cfebc8f527016", - "sha256:b95c3a8cb0463ba9f77383d0fa8c9194cf91f64445a63fc26fb2327e1e1eb088", - "sha256:c5986ee7ea0795a4095ac4d113cbb3448601efca7f158ec7f7087a6c705304e4", - "sha256:cdd31315fc20868c194130de9ee6bfd99755cc9565edff98ecc12585b90be882", - "sha256:cef4649ec906ea7ea5e9e796e68b987f83fa9a718514fe147f538cfeda76d7a7", - "sha256:d05c16cf4b4c2fc880cb12ba4c9b526e9e5d5bb1d81313d4d732a5b9fe2b9d53", - "sha256:d2e344d6adc8ef81c5a233d3a57b3c7d5181f40e79e05e1c143da143ccb6377d", - "sha256:d45d3cbd94159c468b9b8c5a556e3f6b81a8d1af2a92b77320e887c3e7a5d080", - "sha256:db14f552ac38f10758ad14dd7b983dbab424e731588d300c7db25b6f89e335b5", - "sha256:dbc5958cb471e5a5af41b0ddaea96a37e74ed289535e8deca404811f6cb0bc3d", - "sha256:ddbd2f9713a79e8e7242d7c51f1929611e991d855f414ca9996c20e44a895f7c", - "sha256:e16f3d6b491c48c5ae726308e6ab1e18ee830b4cdd6913f2d7f77354b33f91c8", - "sha256:e2afe743289273209c992075a5a4913e8d007d569a406ffed0bd080ea02b0633", - "sha256:e564c2cf45d2f44a9da56f4e3a26b2236504a496eb4cb0ca7221cd4cc7a9aca9", - "sha256:ed550e7442f278af76d9d65af48069f1fb84c9f745ae249c1a183c1e9d1b025c" + "sha256:0086cd4fc71b7d485ac93ca4239c8f75732c2ae3ba83f6be1c9be59d9e2c6382", + "sha256:01c322ef2bbe15057bc4bf132b525b7e3f7206f071799eb8aa6ad1940bcf5fb1", + "sha256:03cafe82c1b32b770a29fd6de923625ccac3185a54a5e66606da26d105f37dac", + "sha256:044a0985a4f25b335882b0966625270a8d9db3d3409ddc49a4eb00b0ef5e8cee", + "sha256:07ed352205574aad067482e53dd606926afebcb5590653121063fbf4e2175166", + "sha256:0d1b923fc4a40c5832be4f35a5dab0e5ff89cddf83bb4174499e02ea089daf57", + "sha256:0e7b27d04131c46e6894f23a4ae186a6a2207209a05df5b6ad4caee6d54a222c", + "sha256:1fad32ee9b27350687035cb5fdf9145bc9cf0a094a9577d43e909948ebcfa27b", + "sha256:289cc803fa1dc901f84701ac10c9ee873619320f2f9aff38794db4a4a0268d51", + "sha256:3c59105f8d58ce500f348c5b56163a4113a440dad6daa2294b5052a10db866da", + "sha256:46c3d091059ad0b9c59d1034de74a7f36dcfa7f6d3bde782c49deb42438f2450", + "sha256:482855914928c8175735a2a59c8dc5806cf7d8f032e4820d52e845d1f731dca2", + "sha256:49c76cdfa13015c4560702574bad67f0e15ca5a2872c6a125f6327ead2b731dd", + "sha256:4b03741e70fb811d1a9a1d75355cf391f274ed85847f4b78e35459899f57af4d", + "sha256:4bea27c4269234e06f621f3fac3925f56ff34bc14521484b8f66a580aacc2e7d", + "sha256:4d5fae0a22dc86259dee66f2cc6c1d3e490c4a1214d7daa2a93d07491c5c04b6", + "sha256:543ef9179bc55edfd895154a51792b01c017c87af0ebaae092720152e19e42ca", + "sha256:54dece71673b3187c86226c3ca793c5f891f9fc3d8aa183f2e3653da18566169", + "sha256:6379688fb4cfa921ae349c76eb1a9ab26b65f32b03d46bb0eed841fd4cb6afb1", + "sha256:65fa405b837060db569a61ec368b74688f429b32fa47a8929a7a2f9b47183713", + "sha256:6616d1c9bf1e3faea78711ee42a8b972367d82ceae233ec0ac61cc7fec09fa6b", + "sha256:6fe885135c8a479d3e37a7aae61cbd3a0fb2deccb4dda3c25f92a49189f766d6", + "sha256:7221f9ac9dad9492cecab6f676b3eaf9185141539d5c9689d13fd6b0d7de840c", + "sha256:76d5f82213aa78098b9b964ea89de4617e70e0d43e97900c2778a50856dac605", + "sha256:7792f0ab20df8071d669d929c75c97fecfa6bcab82c10ee4adb91c7a54055463", + "sha256:831b476d79408ab6ccfadaaf199906c833f02fdb32c9ab907b1d4aa0713cfa3b", + "sha256:9146579352d7b5f6412735d0f203bbd8d00113a680b66565e205bc605ef81bc6", + "sha256:9cc44bf0315268e253bf563f3560e6c004efe38f76db03a1558274a6e04bf5d5", + "sha256:a73d18625f6a8a1cbb11eadc1d03929f9510f4131879288e3f7922097a429f63", + "sha256:a8659fd33ee9e6ca03950cfdcdf271d645cf681609153f218826dd9805ab585c", + "sha256:a94925102c89247530ae1dab7dc02c690942566f22e189cbd53579b0693c0783", + "sha256:ad4567d6c334c46046d1c4c20024de2a1c3abc626817ae21ae3da600f5779b44", + "sha256:b2e16f4cd2bc4d88ba30ca2d3bbf2f21f00f382cf4e1ce3b1ddc96c634bc48ca", + "sha256:bbdf9a72403110a3bdae77948b8011f644571311c2fb35ee15f0f10a8fc082e8", + "sha256:beb08e8508e53a568811016e59f3234d29c2583f6b6e28572f0954a6b4f7e03d", + "sha256:c4cbe651f3904e28f3a55d6f371203049034b4ddbce65a54527a3f189ca3b390", + "sha256:c7b525ab52ce18c57ae232ba6f7010297a87ced82a2383b1afd238849c1ff933", + "sha256:ca5d79cfdae420a1d52bf177de4bc2289c321d6c961ae321503b2ca59c17ae67", + "sha256:cdab02a0a941af190df8782aafc591ef3ad08824f97850b015c8c6a8b3877b0b", + "sha256:d17c6a415d68cfe1091d3296ba5749d3d8696e42c37fca5d4860c5bf7b729f03", + "sha256:d39bd10f0ae453554798b125d2f39884290c480f56e8a02ba7a6ed552005243b", + "sha256:d4b3cd1ca7cd73d229487fa5caca9e4bc1f0bca96526b922d61053ea751fe791", + "sha256:d50a252b23b9b4dfeefc1f663c568a221092cbaded20a05a11665d0dbec9b8fb", + "sha256:da8549d17489cd52f85a9829d0e1d91059359b3c54a26f28bec2c5d369524807", + "sha256:dcd070b5b585b50e6617e8972f3fbbee786afca71b1936ac06257f7e178f00f6", + "sha256:ddaaa91bfc4477d2871442bbf30a125e8fe6b05da8a0015507bfbf4718228ab2", + "sha256:df423f351b162a702c053d5dddc0fc0ef9a9e27ea3f449781ace5f906b664428", + "sha256:dff044f661f59dace805eedb4a7404c573b6ff0cdba4a524141bc63d7be5c7fd", + "sha256:e7e128f85c0b419907d1f38e616c4f1e9f1d1b37a7949f44df9a73d5da5cd53c", + "sha256:ed8d1d1821ba5fc88d4a4f45387b65de52382fa3ef1f0115a4f7a20cdfab0e94", + "sha256:f2501d60d7497fd55e391f423f965bbe9e650e9ffc3c627d5f0ac516026000b8", + "sha256:f7db0b6ae1f96ae41afe626095149ecd1b212b424626175a6633c2999eaad45b" ], "index": "pypi", - "version": "==7.5.4" + "markers": "python_version >= '3.8'", + "version": "==7.6.0" }, "docker": { "hashes": [ @@ -1871,6 +1902,7 @@ "sha256:b6e78b685dd4e9c016d7a4299cf1de69e299c88322e3f81c716e6e23fe5683c1" ], "index": "pypi", + "markers": "python_version >= '3.8' and python_version < '4'", "version": "==2.6.0" }, "packaging": { @@ -1937,11 +1969,12 @@ }, "pytest": { "hashes": [ - "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343", - "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977" + "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5", + "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce" ], "index": "pypi", - "version": "==8.2.2" + "markers": "python_version >= '3.8'", + "version": "==8.3.2" }, "python-dateutil": { "hashes": [ @@ -1957,6 +1990,7 @@ "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==2.32.3" }, "requests-mock": { @@ -1965,6 +1999,7 @@ "sha256:e9e12e333b525156e82a3c852f22016b9158220d2f47454de9cae8a77d371401" ], "index": "pypi", + "markers": "python_version >= '3.5'", "version": "==1.12.1" }, "six": { @@ -1987,6 +2022,7 @@ "sha256:54d330d085c0a11fc5da0b001af87aec4dd3e814104376bf7513e8646c77442a" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==0.0.1rc1" }, "testcontainers-opensearch": { @@ -1994,6 +2030,7 @@ "sha256:0bdf270b5b7f53915832f7c31dd2bd3ffdc20b534ea6b32231cc7003049bd0e1" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==0.0.1rc1" }, "typing-extensions": { diff --git a/dbrepo-analyse-service/app.py b/dbrepo-analyse-service/app.py index d19b721a33a211b44a56a8a727c7ff0badbce7f6..bbce751508c62e8a5f375447b97a7486668b9673 100644 --- a/dbrepo-analyse-service/app.py +++ b/dbrepo-analyse-service/app.py @@ -254,10 +254,10 @@ def analyse_datatypes(): return Response(res, mimetype="application/json"), 202 except OSError as e: logging.error(f"Failed to determine data types: {e}") - return ApiError(status='BAD_REQUEST', message=str(e), code='analyse.csv.invalid'), 400 + return ApiError(status='BAD_REQUEST', message=str(e), code='error.analyse.invalid').model_dump_json(), 400 except ClientError as e: logging.error(f"Failed to determine separator: {e}") - return ApiError(status='NOT_FOUND', message='Failed to find csv', code='analyse.csv.missing'), 404 + return ApiError(status='NOT_FOUND', message='Failed to find csv', code='error.analyse.missing').model_dump_json(), 404 @app.route("/api/analyse/keys", methods=["GET"], endpoint="analyse_analyse_keys") @@ -269,7 +269,7 @@ def analyse_keys(): logging.debug(f"Analyse keys from filename '{filename}' with separator {separator}") if filename is None or separator is None: return ApiError(status='BAD_REQUEST', message="Missing required query parameters 'filename' and 'separator'", - code='analyse.csv.invalid'), 400 + code='analyse.csv.invalid').model_dump_json(), 400 try: res = { 'keys': determine_pk(filename, separator) @@ -278,4 +278,4 @@ def analyse_keys(): return Response(dumps(res), mimetype="application/json"), 202 except OSError as e: logging.error(f"Failed to determine primary key: {e}") - return ApiError(status='BAD_REQUEST', message=str(e), code='analyse.database.invalid'), 400 + return ApiError(status='BAD_REQUEST', message=str(e), code='analyse.database.invalid').model_dump_json(), 400 diff --git a/dbrepo-analyse-service/determine_dt.py b/dbrepo-analyse-service/determine_dt.py index 3fcfc73e9454fc5f6c98488a6096a8cdb3859628..6a224018665e9d2583da023f558837a9f24ab4e2 100644 --- a/dbrepo-analyse-service/determine_dt.py +++ b/dbrepo-analyse-service/determine_dt.py @@ -9,11 +9,12 @@ import pandas from numpy import dtype, max, min from flask import current_app +from pandas.errors import EmptyDataError from clients.s3_client import S3Client -def determine_datatypes(filename, enum=False, enum_tol=0.0001, separator=None) -> {}: +def determine_datatypes(filename, enum=False, enum_tol=0.0001, separator=',') -> {}: # Use option enum=True for searching Postgres ENUM Types in CSV file. Remark # Enum is not SQL standard, hence, it might not be supported by all db-engines. # However, it can be used in Postgres and MySQL. @@ -35,10 +36,22 @@ def determine_datatypes(filename, enum=False, enum_tol=0.0001, separator=None) - line_terminator = "\r" elif b"\r\n" in line: line_terminator = "\r\n" - logging.info("Analysing corpus with separator: %s", separator) + logging.info(f"Analysing corpus with separator: {separator}") # index_col=False -> prevent shared index & count length correct - df = pandas.read_csv(fh, delimiter=separator, nrows=100, lineterminator=line_terminator, index_col=False) + df = None + for encoding in ['utf-8', 'cp1252', 'latin1', 'iso-8859-1']: + try: + logging.debug(f"attempt parsing .csv using encoding {encoding}") + df = pandas.read_csv(fh, delimiter=separator, nrows=100, lineterminator=line_terminator, + index_col=False, encoding=encoding) + logging.debug(f"parsing .csv using encoding {encoding} was successful") + break + except (UnicodeDecodeError, EmptyDataError) as error: + logging.warning(f"Failed to parse .csv using encoding {encoding}: {error}") + if df is None: + raise IOError( + f"Failed to parse .csv: no supported encoding found (one of: utf-8, cp1252, latin1, iso-8859-1)") if b"," in line: separator = "," @@ -51,31 +64,44 @@ def determine_datatypes(filename, enum=False, enum_tol=0.0001, separator=None) - for name, dataType in df.dtypes.items(): if dataType == dtype('float64'): - r[name] = 'decimal' + if pandas.to_numeric(df[name], errors='coerce').notnull().all(): + logging.debug(f"mapped column {name} from float64 to decimal") + r[name] = 'decimal' + else: + logging.debug(f"mapped column {name} from float64 to text") + r[name] = 'text' elif dataType == dtype('int64'): min_val = min(df[name]) max_val = max(df[name]) if 0 <= min_val <= 1 and 0 <= max_val <= 1: + logging.debug(f"mapped column {name} from int64 to bool") r[name] = 'bool' continue + logging.debug(f"mapped column {name} from int64 to bigint") r[name] = 'bigint' elif dataType == dtype('O'): try: pandas.to_datetime(df[name], format='mixed') + logging.debug(f"mapped column {name} from O to timestamp") r[name] = 'timestamp' continue except ValueError: pass max_size = max(df[name].astype(str).map(len)) if max_size <= 1: + logging.debug(f"mapped column {name} from O to char") r[name] = 'char' if 0 <= max_size <= 255: + logging.debug(f"mapped column {name} from O to varchar") r[name] = 'varchar' else: + logging.debug(f"mapped column {name} from O to text") r[name] = 'text' elif dataType == dtype('bool'): + logging.debug(f"mapped column {name} from bool to bool") r[name] = 'bool' elif dataType == dtype('datetime64'): + logging.debug(f"mapped column {name} from datetime64 to datetime") r[name] = 'datetime' else: logging.warning(f'default to \'text\' for column {name} and type {dtype}') diff --git a/dbrepo-analyse-service/determine_pk.py b/dbrepo-analyse-service/determine_pk.py index 0e3a66ad19d47c66fa6c6fba5081a25e7e150aaf..141d90b78e43b05cce8b2f6c10700a18d14c6073 100644 --- a/dbrepo-analyse-service/determine_pk.py +++ b/dbrepo-analyse-service/determine_pk.py @@ -8,7 +8,7 @@ from determine_dt import determine_datatypes from clients.s3_client import S3Client -def determine_pk(filename, separator=","): +def determine_pk(filename: str, separator: str = ','): dt = json.loads(determine_datatypes(filename=filename, separator=separator)) dt = {k.lower(): v for k, v in dt["columns"].items()} # {k.lower(): v for k, v in dt['columns'].items() if v != 'Numeric'} diff --git a/dbrepo-analyse-service/lib/dbrepo-1.4.4-py3-none-any.whl b/dbrepo-analyse-service/lib/dbrepo-1.4.4-py3-none-any.whl deleted file mode 100644 index 617969c3eb15926d932b7c0180bed51b9ef7052d..0000000000000000000000000000000000000000 Binary files a/dbrepo-analyse-service/lib/dbrepo-1.4.4-py3-none-any.whl and /dev/null differ diff --git a/dbrepo-analyse-service/lib/dbrepo-1.4.4.tar.gz b/dbrepo-analyse-service/lib/dbrepo-1.4.4.tar.gz deleted file mode 100644 index 9d1d5ae238baba6bc51db4d219a0d09b5aca1c51..0000000000000000000000000000000000000000 Binary files a/dbrepo-analyse-service/lib/dbrepo-1.4.4.tar.gz and /dev/null differ diff --git a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/SubsetEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/SubsetEndpoint.java index f4626deb93f9f1581be1ee5eab2fe748734ee4e6..8f5f4a821484d23a51dd5c60a6bba658278fdb14 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/SubsetEndpoint.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/SubsetEndpoint.java @@ -261,12 +261,12 @@ public class SubsetEndpoint { QueryNotFoundException, StorageUnavailableException, QueryMalformedException, SidecarExportException, StorageNotFoundException, QueryStoreInsertException, TableMalformedException, PaginationException, QueryNotSupportedException, NotAllowedException, UserNotFoundException, MetadataServiceException { - log.debug("endpoint create subset in database, databaseId={}, data.statement={}, principal.name={}, page={}, " + - "size={}, timestamp={}", databaseId, data.getStatement(), principal.getName(), page, size, timestamp); + log.debug("endpoint create subset in database, databaseId={}, data.statement={}, principal.name={}, " + + "page={}, size={}, timestamp={}", databaseId, data.getStatement(), principal.getName(), page, size, + timestamp); /* check */ endpointValidator.validateDataParams(page, size); endpointValidator.validateForbiddenStatements(data.getStatement()); - metadataServiceGateway.getAccess(databaseId, UserUtil.getId(principal)); /* parameters */ if (page == null) { page = 0L; diff --git a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java index 7e95c7cfa94ae356a1e3d908c903bf7294f3621a..f4d31bbc216b333656d1ac70d0e3f28ddd49be0f 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java @@ -646,7 +646,7 @@ public class TableEndpoint { mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @ApiResponse(responseCode = "404", - description = "Failed to find table in metadata database", + description = "Failed to find table or database in metadata database", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @@ -659,9 +659,10 @@ public class TableEndpoint { public ResponseEntity<TableStatisticDto> statistic(@NotBlank @PathVariable("databaseId") Long databaseId, @NotBlank @PathVariable("tableId") Long tableId) throws DatabaseUnavailableException, RemoteUnavailableException, TableNotFoundException, - MetadataServiceException, TableMalformedException, QueryMalformedException { + MetadataServiceException, TableMalformedException, DatabaseNotFoundException { log.debug("endpoint generate table statistic, databaseId={}, tableId={}", databaseId, tableId); final PrivilegedTableDto table = metadataServiceGateway.getTableById(databaseId, tableId); + table.setDatabase(metadataServiceGateway.getDatabaseById(databaseId)); try { final TableStatisticDto dto = tableService.getStatistics(table); return ResponseEntity.ok(dto); diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/SubsetEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/SubsetEndpointUnitTest.java index c45454b8f3c3ac8238726755e0eda19c063ed1f8..d554667467009b396caee8f2800b522f21f8ace6 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/SubsetEndpointUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/SubsetEndpointUnitTest.java @@ -167,7 +167,7 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_1_USERNAME, authorities = {"execute-query"}) - public void create_succeeds() throws UserNotFoundException, QueryStoreInsertException, TableMalformedException, + public void create_noAccess_succeeds() throws UserNotFoundException, QueryStoreInsertException, TableMalformedException, NotAllowedException, SidecarExportException, QueryNotSupportedException, PaginationException, StorageNotFoundException, DatabaseUnavailableException, StorageUnavailableException, QueryMalformedException, QueryNotFoundException, DatabaseNotFoundException, RemoteUnavailableException, @@ -177,8 +177,6 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { .build(); /* mock */ - when(metadataServiceGateway.getAccess(DATABASE_3_ID, USER_1_ID)) - .thenReturn(DATABASE_3_USER_1_READ_ACCESS_DTO); when(metadataServiceGateway.getDatabaseById(DATABASE_3_ID)) .thenReturn(DATABASE_3_PRIVILEGED_DTO); when(queryService.execute(eq(DATABASE_3_PRIVILEGED_DTO), anyString(), any(Instant.class), eq(USER_1_ID), eq(0L), eq(10L), eq(null), eq(null))) @@ -213,8 +211,6 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { .build(); /* mock */ - when(metadataServiceGateway.getAccess(DATABASE_3_ID, USER_1_ID)) - .thenReturn(DATABASE_3_USER_1_READ_ACCESS_DTO); when(metadataServiceGateway.getDatabaseById(DATABASE_3_ID)) .thenReturn(DATABASE_3_PRIVILEGED_DTO); when(queryService.execute(eq(DATABASE_3_PRIVILEGED_DTO), anyString(), any(Instant.class), eq(USER_1_ID), eq(0L), eq(10L), eq(null), eq(null))) @@ -226,15 +222,13 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_1_USERNAME, authorities = {"execute-query"}) - public void create_databaseNotFound_fails() throws NotAllowedException, RemoteUnavailableException, + public void create_databaseNotFound_fails() throws RemoteUnavailableException, DatabaseNotFoundException, MetadataServiceException { final ExecuteStatementDto request = ExecuteStatementDto.builder() .statement(QUERY_5_STATEMENT) .build(); /* mock */ - when(metadataServiceGateway.getAccess(DATABASE_3_ID, USER_1_ID)) - .thenReturn(DATABASE_3_USER_1_READ_ACCESS_DTO); doThrow(DatabaseNotFoundException.class) .when(metadataServiceGateway) .getDatabaseById(DATABASE_3_ID); @@ -258,24 +252,6 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { }); } - @Test - @WithMockUser(username = USER_4_USERNAME, authorities = {"execute-query"}) - public void create_noAccess_fails() throws NotAllowedException, RemoteUnavailableException, MetadataServiceException { - final ExecuteStatementDto request = ExecuteStatementDto.builder() - .statement(QUERY_5_STATEMENT) - .build(); - - /* mock */ - doThrow(NotAllowedException.class) - .when(metadataServiceGateway) - .getAccess(DATABASE_3_ID, USER_4_ID); - - /* test */ - assertThrows(NotAllowedException.class, () -> { - subsetEndpoint.create(DATABASE_3_ID, request, USER_4_PRINCIPAL, null, null, null); - }); - } - @Test public void getData_succeeds() throws DatabaseNotFoundException, RemoteUnavailableException, UserNotFoundException, NotAllowedException, SQLException, QueryNotFoundException, TableMalformedException, QueryMalformedException, diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java index 65ec32c0d501524028e7caef05cb58e997d19446..41fa4963fb26158f11060db383c4cb973e66e1c0 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java @@ -451,7 +451,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { } @Test - public void getStatistics_succeeds() throws TableMalformedException, SQLException, QueryMalformedException { + public void getStatistics_succeeds() throws TableMalformedException, SQLException, TableNotFoundException { /* test */ final TableStatisticDto response = tableService.getStatistics(TABLE_1_PRIVILEGED_DTO); @@ -493,13 +493,8 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { @Test public void create_malformed_fails() { final at.tuwien.api.database.table.internal.TableCreateDto request = TableCreateDto.builder() - .needSequence(false) .name("missing_foreign_key") - .columns(List.of(ColumnCreateDto.builder() - .name("id") - .type(ColumnTypeDto.BIGINT) - .nullAllowed(false) - .build())) + .columns(List.of()) .constraints(ConstraintsCreateDto.builder() .foreignKeys(List.of(ForeignKeyCreateDto.builder() .columns(List.of("i_do_not_exist")) diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/KeycloakGatewayImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/KeycloakGatewayImpl.java index f95bb3fe76a1e95786fae0b109ee7c1619954209..6e233395d92ae03785ba820055cb7d421cfc7b38 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/KeycloakGatewayImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/KeycloakGatewayImpl.java @@ -41,9 +41,17 @@ public class KeycloakGatewayImpl implements KeycloakGateway { final String url = keycloakConfig.getKeycloakEndpoint() + "/realms/dbrepo/protocol/openid-connect/token"; log.trace("request user token from url: {}", url); log.trace("request username: {}", username); - log.trace("request password: {}", password != null ? "(set)" : "(not set)"); + if (password.isEmpty() || password.isBlank()) { + log.warn("request password: (empty)"); + } else { + log.trace("request password: (set)"); + } log.trace("request client_id: {}", keycloakConfig.getKeycloakClient()); - log.trace("request client_secret: {}", keycloakConfig.getKeycloakClientSecret()); + if (keycloakConfig.getKeycloakClientSecret().isEmpty() || keycloakConfig.getKeycloakClientSecret().isBlank()) { + log.warn("request client_secret: (empty)"); + } else { + log.trace("request client_secret: (set)"); + } final ResponseEntity<TokenDto> response; try { response = new RestTemplate() diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/MetadataServiceGatewayImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/MetadataServiceGatewayImpl.java index a3fda6482c2d18cb75bab577644f8ce630314e6e..06641b738b91c4798e9a57b26eb011fbc6c3c4cd 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/MetadataServiceGatewayImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/MetadataServiceGatewayImpl.java @@ -313,6 +313,7 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway { RemoteUnavailableException { final ResponseEntity<Void> response; final String url = "/api/database/" + databaseId + "/table/" + tableId; + log.trace("mapped url: {}", url); try { response = restTemplate.exchange(url, HttpMethod.PUT, HttpEntity.EMPTY, Void.class); } catch (ResourceAccessException | HttpServerErrorException e) { diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MariaDbMapper.java b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MariaDbMapper.java index b6b782a04c6c2c9c353f837caee4c8f1f2b213ec..b2ed933049687a9ea35aa4cfa673999b81db31af 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MariaDbMapper.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MariaDbMapper.java @@ -234,9 +234,7 @@ public interface MariaDbMapper { /* data type */ .append(columnTypeDtoToDataType(column)) /* null expressions */ - .append(column.getNullAllowed() != null && column.getNullAllowed() ? " NULL" : " NOT NULL") - /* default expressions */ - .append(data.getNeedSequence() && column.getName().equals("id") ? " DEFAULT NEXTVAL(`" + tableCreateDtoToSequenceName(data) + "`)" : ""); + .append(column.getNullAllowed() != null && column.getNullAllowed() ? " NULL" : " NOT NULL"); if (column.getDescription() != null && !column.getDescription().isEmpty()) { /* comments */ stringBuilder.append(" COMMENT \"") @@ -565,10 +563,10 @@ public interface MariaDbMapper { final int[] jdx = new int[]{0}; data.getKeys() .forEach((key, value) -> { - statement.append(jdx[0] == 0 ? "" : ", ") + statement.append(jdx[0] == 0 ? "" : " AND ") .append("`") .append(key) - .append("` "); + .append("`"); if (value == null) { statement.append(" IS NULL"); } else { diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/TableService.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/TableService.java index 50894eb77a46b3b2fc0f77d7ebe0f99b73e895af..765a3b7e2e630b70b4e52d99aaddecd8559754a3 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/TableService.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/TableService.java @@ -32,10 +32,10 @@ public interface TableService { * @return The table statistic, if successful. * @throws SQLException Failed to parse SQL query, contains invalid syntax. * @throws TableMalformedException The table statistic generation was unsuccessful, likely due to a bug in the mapping. - * @throws QueryMalformedException The inspection query is malformed. + * @throws TableNotFoundException The table could not be inspected in the data database. */ TableStatisticDto getStatistics(PrivilegedTableDto table) throws SQLException, TableMalformedException, - QueryMalformedException; + TableNotFoundException; /** * Finds a table with given data database and table name. diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java index e913c0cb82f22cd12654c7cd23d160bf68b5ef87..4dacc1e094f0c0f11e6d9949ee4cbf2fbc9e8621 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java @@ -86,7 +86,7 @@ public class TableServiceMariaDbImpl extends HibernateConnector implements Table @Override public TableStatisticDto getStatistics(PrivilegedTableDto table) throws SQLException, TableMalformedException, - QueryMalformedException { + TableNotFoundException { final ComboPooledDataSource dataSource = getPrivilegedDataSource(table.getDatabase()); final Connection connection = dataSource.getConnection(); final TableStatisticDto statistic; @@ -95,7 +95,11 @@ public class TableServiceMariaDbImpl extends HibernateConnector implements Table final ResultSet resultSet = connection.prepareStatement(mariaDbMapper.tableColumnStatisticsSelectRawQuery(table.getColumns(), table.getInternalName())) .executeQuery(); statistic = dataMapper.resultSetToTableStatistic(resultSet); - statistic.setRows(getCount(table, null)); + final TableDto tmpTable = schemaService.inspectTable(table.getDatabase(), table.getInternalName()); + statistic.setAvgRowLength(tmpTable.getAvgRowLength()); + statistic.setDataLength(tmpTable.getDataLength()); + statistic.setMaxDataLength(tmpTable.getMaxDataLength()); + statistic.setRows(tmpTable.getNumRows()); } catch (SQLException e) { connection.rollback(); log.error("Failed to obtain column statistics: {}", e.getMessage()); @@ -107,7 +111,8 @@ public class TableServiceMariaDbImpl extends HibernateConnector implements Table .stream() .filter(column -> !MariaDbUtil.numericDataTypes.contains(column.getColumnType())) .forEach(column -> statistic.getColumns().put(column.getInternalName(), new ColumnStatisticDto())); - log.info("Obtained column statistics for table: {}", table.getInternalName()); + log.info("Obtained statistics for the table and {} column(s)", statistic.getColumns().size()); + log.trace("obtained statistics: {}", statistic); return statistic; } @@ -123,12 +128,6 @@ public class TableServiceMariaDbImpl extends HibernateConnector implements Table final ComboPooledDataSource dataSource = getPrivilegedDataSource(database); final Connection connection = dataSource.getConnection(); try { - if (data.getNeedSequence()) { - /* create table sequence if not exists */ - connection.prepareStatement(mariaDbMapper.tableCreateDtoToCreateSequenceRawQuery(data)) - .execute(); - log.info("Created sequence as primary key"); - } /* create table if not exists */ connection.prepareStatement(mariaDbMapper.tableCreateDtoToCreateTableRawQuery(data)) .execute(); diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableCreateDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableCreateDto.java index 312ecaf2ac45058a5c52677815e05194a647bfd4..e2ef252708c4457165e126ea228b17aa00177c57 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableCreateDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableCreateDto.java @@ -27,9 +27,6 @@ public class TableCreateDto { @Schema(example = "Air Quality") private String name; - @JsonProperty("need_sequence") - private transient boolean needSequence; - @Size(max = 180) @Schema(example = "Air Quality in Austria") private String description; diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableStatisticDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableStatisticDto.java index 8d41bcc7ff79ba6a51ea1caabad2fd52686cd4a5..8862723b9ca573a9b7356f207d145850d1c233af 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableStatisticDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableStatisticDto.java @@ -2,6 +2,7 @@ package at.tuwien.api.database.table; import at.tuwien.api.database.table.columns.ColumnStatisticDto; import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; import lombok.*; import lombok.extern.jackson.Jacksonized; @@ -17,10 +18,23 @@ import java.util.Map; @ToString public class TableStatisticDto { - @NotNull @JsonProperty("rows") + @Schema(example = "5") private Long rows; + @JsonProperty("data_length") + @Schema(example = "16384", description = "in bytes") + private Long dataLength; + + @JsonProperty("max_data_length") + @Schema(example = "0", description = "in bytes") + private Long maxDataLength; + + @JsonProperty("avg_row_length") + @Schema(example = "3276", description = "in bytes") + private Long avgRowLength; + @NotNull + @ToString.Exclude private Map<String, ColumnStatisticDto> columns; } diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/internal/TableCreateDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/internal/TableCreateDto.java index 9e92a46c484eadf1fd486995c39260294241d6c5..0db45a9f1b5690c4cb1d4e3a988b4c76824713e1 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/internal/TableCreateDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/internal/TableCreateDto.java @@ -2,7 +2,6 @@ package at.tuwien.api.database.table.internal; import at.tuwien.api.database.table.columns.ColumnCreateDto; import at.tuwien.api.database.table.constraints.ConstraintsCreateDto; -import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; @@ -26,10 +25,6 @@ public class TableCreateDto { @Schema(example = "Air Quality") private String name; - @NotNull - @JsonProperty("need_sequence") - private Boolean needSequence; - @Size(max = 180) @Schema(example = "Air Quality in Austria") private String description; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java index f463370e4d252f87cdaf11266e3497a4af4c2c36..2e154b86973601af8560c6055fe388fd614858a6 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java @@ -117,6 +117,7 @@ public class Database implements Serializable { private List<Identifier> subsets; @ToString.Exclude + @OrderBy("id DESC") @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL, CascadeType.PERSIST}, mappedBy = "database", orphanRemoval = true) private List<Table> tables; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/Table.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/Table.java index 57d9dbab1b9b95b143fde6752384457d99653857..9a402201eaf38191213abb609544709d28b516c4 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/Table.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/Table.java @@ -88,6 +88,7 @@ public class Table { }) private Database database; + @ToString.Exclude @OnDelete(action = OnDeleteAction.CASCADE) @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST}, mappedBy = "table") @OrderBy("ordinalPosition") @@ -104,6 +105,7 @@ public class Table { @OrderBy("id DESC") private List<Identifier> identifiers; + @ToString.Exclude @Embedded private Constraints constraints; diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java index 33b4594424956b584ff2910898f18d336c1aec7b..59419f9bad37d26687342c51da6155463d674e87 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java @@ -172,29 +172,21 @@ public class TableServiceUnitTest extends AbstractUnitTest { final Table response = tableService.createTable(DATABASE_1, request, USER_1_PRINCIPAL); assertEquals("New Table", response.getName()); assertEquals("new_table", response.getInternalName()); - assertEquals(2, response.getColumns().size()); + assertEquals(1, response.getColumns().size()); /* columns */ final TableColumn column0 = response.getColumns().get(0); - assertEquals("id", column0.getName()); - assertEquals("id", column0.getInternalName()); - assertEquals(TableColumnType.BIGINT, column0.getColumnType()); - assertFalse(column0.getIsNullAllowed()); - assertTrue(column0.getAutoGenerated()); - final TableColumn column1 = response.getColumns().get(1); - assertEquals("I Am Späshül", column1.getName()); - assertEquals("i_am_spa_shu_l", column1.getInternalName()); - assertEquals(TableColumnType.TEXT, column1.getColumnType()); - assertTrue(column1.getIsNullAllowed()); - assertFalse(column1.getAutoGenerated()); + assertEquals("I Am Späshül", column0.getName()); + assertEquals("i_am_spa_shu_l", column0.getInternalName()); + assertEquals(TableColumnType.TEXT, column0.getColumnType()); + assertTrue(column0.getIsNullAllowed()); + assertFalse(column0.getAutoGenerated()); /* constraints */ final Constraints constraints = response.getConstraints(); - assertEquals(1, constraints.getPrimaryKey().size()); - assertEquals(column0.getName(), constraints.getPrimaryKey().get(0).getColumn().getName()); - assertEquals(column0.getInternalName(), constraints.getPrimaryKey().get(0).getColumn().getInternalName()); + assertEquals(0, constraints.getPrimaryKey().size()); assertEquals(1, constraints.getUniques().get(0).getColumns().size()); assertNotNull(constraints.getUniques().get(0).getName()); - assertEquals(column1.getName(), constraints.getUniques().get(0).getColumns().get(0).getName()); - assertEquals(column1.getInternalName(), constraints.getUniques().get(0).getColumns().get(0).getInternalName()); + assertEquals(column0.getName(), constraints.getUniques().get(0).getColumns().get(0).getName()); + assertEquals(column0.getInternalName(), constraints.getUniques().get(0).getColumns().get(0).getInternalName()); assertEquals(0, constraints.getChecks().size()); assertEquals(0, constraints.getForeignKeys().size()); } diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/auth/InternalRequestInterceptor.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/auth/InternalRequestInterceptor.java index 5a7288cf55ead160c3b57436742f93693723592f..835b7245d1ef2ca017375990dd77c20693f3ef6f 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/auth/InternalRequestInterceptor.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/auth/InternalRequestInterceptor.java @@ -38,7 +38,6 @@ public class InternalRequestInterceptor implements ClientHttpRequestInterceptor gatewayConfig.getSystemPassword()); headers.setBearerAuth(token.getAccessToken()); log.trace("set bearer token for internal user: {}", gatewayConfig.getSystemUsername()); - log.trace("set access token: {}", token.getAccessToken()); return execution.execute(request, body); } catch (AuthServiceConnectionException | CredentialsInvalidException | AccountNotSetupException e) { log.error("Failed to obtain token for internal user: {}", gatewayConfig.getSystemUsername()); diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java index 46a0602c74dd4c93cf5ef05c4ad0c51116be0cf6..7ca855974e86b23a5a2ec8abcbc124f97a0e8ab7 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java @@ -100,24 +100,6 @@ public class TableServiceImpl implements TableService { TableExistsException, SearchServiceException, SearchServiceConnectionException, MalformedException, OntologyNotFoundException, SemanticEntityNotFoundException { final User owner = userService.findByUsername(principal.getName()); - /* check */ - if (data.getConstraints().getPrimaryKey().isEmpty()) { - final List<ColumnCreateDto> columns = new LinkedList<>(); - columns.add(ColumnCreateDto.builder() - .name("id") - .type(ColumnTypeDto.BIGINT) - .nullAllowed(false) - .build()); - columns.addAll(data.getColumns()); - data.setNeedSequence(true); - data.setColumns(columns); - data.getConstraints() - .setPrimaryKey(Set.of("id")); - log.debug("no primary key provided: generate primary key column with sequence"); - } else { - log.trace("primary key provided: no column with sequence needed"); - data.setNeedSequence(false); - } /* map table */ final Table table = Table.builder() .isVersioned(true) @@ -144,9 +126,6 @@ public class TableServiceImpl implements TableService { final TableColumn column = metadataMapper.columnCreateDtoToTableColumn(c, database.getContainer().getImage()); column.setOrdinalPosition(idx[0]++); column.setTable(table); - if (data.isNeedSequence() && column.getName().equals("id")) { - column.setAutoGenerated(true); - } if (c.getUnitUri() != null) { log.trace("column {} has assigned unit uri: {}", column.getInternalName(), c.getUnitUri()); TableColumnUnit unit; @@ -292,6 +271,9 @@ public class TableServiceImpl implements TableService { DataServiceException, DataServiceConnectionException { final TableStatisticDto statistic = dataServiceGateway.getTableStatistics(table.getTdbid(), table.getId()); table.setNumRows(statistic.getRows()); + table.setDataLength(statistic.getDataLength()); + table.setAvgRowLength(statistic.getAvgRowLength()); + table.setMaxDataLength(statistic.getMaxDataLength()); for (Map.Entry<String, ColumnStatisticDto> entry : statistic.getColumns().entrySet()) { final Optional<TableColumn> optional = table.getColumns().stream().filter(c -> c.getInternalName().equals(entry.getKey())).findFirst(); if (optional.isEmpty()) { @@ -313,7 +295,8 @@ public class TableServiceImpl implements TableService { databaseRepository.save(database); /* update in open search service */ searchServiceGateway.update(database); - log.info("Updated statistics of table with id: {}", table.getId()); + log.info("Updated statistics for the table and {} column(s)", table.getColumns().size()); + log.trace("updated statistics: {}", table); } } diff --git a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java index 173a3ba9f41ce3d617b99f996d0c4bc0c482a5e3..0341a7a5dfad8f3a218dd195631ff956289b6b15 100644 --- a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java +++ b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java @@ -1842,11 +1842,11 @@ public abstract class BaseTest { .checks(new LinkedHashSet<>()) .primaryKey(new LinkedHashSet<>()) .foreignKeys(new LinkedList<>()) - .uniques(List.of(List.of("id"))) + .uniques(new LinkedList<>()) .build(); public final static ConstraintsCreateDto TABLE_3_CONSTRAINTS_INVALID_CREATE_DTO = ConstraintsCreateDto.builder() - .uniques(List.of(List.of("id"))) + .uniques(new LinkedList<>()) .foreignKeys(List.of(ForeignKeyCreateDto.builder() .referencedTable("weather_location") .columns(List.of("fahrzeug")) @@ -2186,7 +2186,6 @@ public abstract class BaseTest { .description(TABLE_4_DESCRIPTION) .columns(TABLE_4_COLUMNS_CREATE_DTO) .constraints(TABLE_4_CONSTRAINTS_CREATE_DTO) - .needSequence(false) .build(); public final static List<ColumnDto> TABLE_4_COLUMNS_DTO = List.of(ColumnDto.builder() @@ -2889,7 +2888,6 @@ public abstract class BaseTest { .description(TABLE_1_DESCRIPTION) .columns(TABLE_1_COLUMNS_CREATE_DTO) .constraints(TABLE_1_CONSTRAINTS_CREATE_DTO) - .needSequence(true) .build(); public final static List<TableColumn> TABLE_2_COLUMNS = List.of(TableColumn.builder() diff --git a/dbrepo-ui/components/database/DatabaseToolbar.vue b/dbrepo-ui/components/database/DatabaseToolbar.vue index 3597876609f79e42cd40a1951f729a61fab5663b..5a86bbaa01410fb068533930af6636fc9f20d1d7 100644 --- a/dbrepo-ui/components/database/DatabaseToolbar.vue +++ b/dbrepo-ui/components/database/DatabaseToolbar.vue @@ -15,7 +15,7 @@ bottom> <template v-slot:activator="{ props }"> <v-icon - class="ml-2" + class="mr-2" size="small" right :color="database.is_public ? 'success' : 'chip'" @@ -33,20 +33,13 @@ color="tertiary" :variant="buttonVariant" :text="$t('toolbars.database.dashboard.permanent') + ($vuetify.display.lgAndUp ? ' ' + $t('toolbars.database.dashboard.xl') : '')" /> - <v-btn - v-if="canImportCsv" - :prepend-icon="$vuetify.display.lgAndUp ? 'mdi-cloud-upload' : null" - color="tertiary" - :variant="buttonVariant" - :text="$t('toolbars.database.import-csv.permanent') + ($vuetify.display.lgAndUp ? ' ' + $t('toolbars.database.import-csv.xl') : '')" - :to="`/database/${$route.params.database_id}/table/import`" /> <v-btn v-if="canCreateSubset" :prepend-icon="$vuetify.display.lgAndUp ? 'mdi-wrench' : null" color="secondary" variant="flat" :text="($vuetify.display.lgAndUp ? $t('toolbars.database.create-subset.xl') + ' ' : '') + $t('toolbars.database.create-subset.permanent')" - class="ml-2 white--text" + class="mr-2 white--text" :to="`/database/${$route.params.database_id}/subset/create`" /> <v-btn v-if="canCreateView" @@ -54,7 +47,7 @@ color="secondary" variant="flat" :text="($vuetify.display.lgAndUp ? $t('toolbars.database.create-view.xl') + ' ' : '') + $t('toolbars.database.create-view.permanent')" - class="ml-2 white--text" + class="mr-2 white--text" :to="`/database/${$route.params.database_id}/view/create`" /> <v-btn v-if="canCreateTable" @@ -62,15 +55,15 @@ color="secondary" variant="flat" :text="($vuetify.display.lgAndUp ? $t('toolbars.database.create-table.xl') + ' ' : '') + $t('toolbars.database.create-table.permanent')" - class="ml-2" - :to="`/database/${$route.params.database_id}/table/create`" /> + class="mr-2" + :to="`/database/${$route.params.database_id}/table/create/dataset`" /> <v-btn v-if="canCreateIdentifier" :prepend-icon="$vuetify.display.lgAndUp ? 'mdi-identifier' : null" color="primary" variant="flat" :text="($vuetify.display.lgAndUp ? $t('toolbars.database.create-pid.xl') + ' ' : '') + $t('toolbars.database.create-pid.permanent')" - class="ml-2" + class="mr-2" :to="`/database/${$route.params.database_id}/persist`" /> <template v-slot:extension> <v-tabs diff --git a/dbrepo-ui/components/dialogs/EditTuple.vue b/dbrepo-ui/components/dialogs/EditTuple.vue index 3f40a93175b6f3515f9e8b15500ac183cfe95769..589c82b9b7aee5d2678e9ceab8249618878ced3f 100644 --- a/dbrepo-ui/components/dialogs/EditTuple.vue +++ b/dbrepo-ui/components/dialogs/EditTuple.vue @@ -169,6 +169,7 @@ export default { return { valid: false, loading: false, + oldTuple: null, error: false, menu: false, bools: [ @@ -177,6 +178,9 @@ export default { ] } }, + mounted() { + this.oldTuple = Object.assign({}, this.tuple) + }, computed: { title () { return (this.edit ? this.$t('toolbars.table.data.edit') : this.$t('toolbars.table.data.add')) + ' ' + this.$t('toolbars.table.data.tuple') @@ -272,10 +276,19 @@ export default { }, updateTuple () { const constraints = {} - this.table.constraints.primary_key - .forEach((pk) => { - constraints[pk] = this.tuple[pk] - }) + if (this.table.constraints.primary_key.length > 0) { + this.table.constraints.primary_key + .forEach((pk) => { + constraints[pk.column.internal_name] = this.oldTuple[pk.column.internal_name] + }) + console.debug('table has primary key: set update tuple constraints', constraints) + } else { + this.table.columns + .forEach((column) => { + constraints[column.internal_name] = this.oldTuple[column.internal_name] + }) + console.debug('table does not have a primary key: set update tuple constraints', constraints) + } const tupleService = useTupleService() this.loading = true tupleService.update(this.$route.params.database_id, this.$route.params.table_id, { data: this.tuple, keys: constraints }) diff --git a/dbrepo-ui/components/subset/Builder.vue b/dbrepo-ui/components/subset/Builder.vue index a70c32f6505fb3f5fddbb67eba046fed033e4ab6..7c30fd8f5a488cee4173f710e50e50e0154e9210 100644 --- a/dbrepo-ui/components/subset/Builder.vue +++ b/dbrepo-ui/components/subset/Builder.vue @@ -10,10 +10,10 @@ :text="title" /> <v-spacer /> <v-btn - v-if="user" :disabled="!canExecute" color="secondary" variant="flat" + class="mr-2" :loading="loadingQuery" :prepend-icon="$vuetify.display.lgAndUp ? 'mdi-run' : null" :text="$t('navigation.create')" @@ -52,11 +52,13 @@ clearable persistent-hint :variant="inputVariant" + required + :rules="[ + v => !!v || $t('validation.required'), + v => !validViewName(v) || $t('validation.view.exists') + ]" :label="$t('pages.view.subpages.create.name.label')" - :hint="$t('pages.view.subpages.create.name.hint')" - :rules="[v => !!v || $t('validation.required'), - v => !validViewName(v) || $t('validation.view.exists')]" - required /> + :hint="$t('pages.view.subpages.create.name.hint')" /> </v-col> </v-row> <v-row @@ -80,9 +82,11 @@ :variant="inputVariant" required clearable + :rules="[ + v => !!v || $t('validation.required') + ]" :label="$t('pages.view.subpages.create.visibility.label')" - :hint="$t('pages.view.subpages.create.visibility.hint')" - :rules="[v => !!v || $t('validation.required')]" /> + :hint="$t('pages.view.subpages.create.visibility.hint')" /> </v-col> </v-row> <v-window @@ -219,21 +223,6 @@ </div> </div> </div> - <v-row - dense> - <v-col - v-text="$t('pages.subset.subpages.create.generated')" /> - </v-row> - <v-row - id="query-raw" - dense> - <v-col> - <Raw - :value="query.formatted" - disabled - class="mt-2" /> - </v-col> - </v-row> </v-window-item> <v-window-item value="1"> diff --git a/dbrepo-ui/components/table/TableImport.vue b/dbrepo-ui/components/table/TableImport.vue index 8528b3b04edf43c5b0b9058390cf777c73c4d285..22f708175134d40bc50b3c630a3431181c40018a 100644 --- a/dbrepo-ui/components/table/TableImport.vue +++ b/dbrepo-ui/components/table/TableImport.vue @@ -2,15 +2,16 @@ <div> <v-stepper-header> <v-stepper-item - :title="$t('pages.table.subpages.import.dataset.title')" + :title="$t('pages.table.subpages.import.schema.title')" :complete="validStep1" - :value="stepStart"/> + :value="1"/> </v-stepper-header> <v-stepper-window direction="vertical"> <v-form ref="form" v-model="validStep1" + :disabled="disabled" @submit.prevent="submit"> <v-container> <v-row dense> @@ -122,102 +123,149 @@ <v-stepper-item :title="$t('pages.table.subpages.import.file.title')" :complete="validStep2" - :value="stepStart+1"/> + :value="2" /> </v-stepper-header> <v-stepper-window direction="vertical"> - <v-form - ref="form" - v-model="validStep2" - @submit.prevent="submit"> - <v-container> - <v-row - v-if="step > 1 && suggestedAnalyseSeparator && providedSeparator !== analysedSeparator" - dense> - <v-col> - <v-alert - border="start" - color="warning"> - {{ $t('pages.table.subpages.import.separator.warn.prefix') }} - <strong v-text="tableImport.separator"/> - {{ $t('pages.table.subpages.import.separator.warn.middle') }} - <strong v-text="suggestedAnalyseSeparator"/> - {{ $t('pages.table.subpages.import.separator.warn.suffix') }} - </v-alert> - </v-col> - </v-row> - <v-row - v-if="step > 1 && suggestedAnalyseLineTerminator && providedTerminator !== analysedTerminator" - dense> - <v-col> - <v-alert - border="start" - color="warning"> - {{ $t('pages.table.subpages.import.terminator.warn.prefix') }} - <strong>{{ JSON.stringify(tableImport.line_termination).replaceAll('"', '') }}</strong> - {{ $t('pages.table.subpages.import.terminator.warn.middle') }} - <strong>{{ JSON.stringify(suggestedAnalyseLineTerminator).replaceAll('"', '') }}</strong> - {{ $t('pages.table.subpages.import.terminator.warn.suffix') }} - </v-alert> - </v-col> - </v-row> - <v-row - v-if="!hasCompatibleSchema" - dense> - <v-col> - <v-alert - border="start" - color="warning" - :text="$t('pages.table.subpages.import.dataset.warn')"/> - </v-col> - </v-row> - <v-row> - <v-col cols="8"> - <v-file-input - v-model="file" - accept=".csv,.tsv" - :show-size="1000" - counter - required - :rules="[ - v => notFile(v) || $t('validation.required'), - ]" - :prepend-icon="validStep1 ? 'mdi-database-check-outline' : 'mdi-database-arrow-up-outline'" - persistent-hint - :variant="inputVariant" - :hint="$t('pages.table.subpages.import.file.hint')" - :label="$t('pages.table.subpages.import.file.label')" /> - </v-col> - </v-row> - <v-row> - <v-col cols="8"> - <v-btn - :disabled="!isAnalyseAllowed || !validStep1 || !validStep2" - :loading="loading" - :variant="buttonVariant" - color="secondary" - size="small" - :text="$t('pages.table.subpages.import.analyse.text')" - @click="uploadAndAnalyse"/> - </v-col> - </v-row> + <v-container> + <v-row + v-if="$route.query.location" + dense> + <v-col> + <p + v-text="$t('pages.table.subpages.import.storage.text')" /> + <v-chip + prepend-icon="mdi-cloud-upload" + label> + {{ $route.query.location }} + </v-chip> + </v-col> + </v-row> + <v-form + v-if="!$route.query.location" + ref="form" + v-model="validStep2" + :disabled="disabled" + @submit.prevent="submit"> + <v-row + v-if="step > 1 && suggestedAnalyseSeparator && providedSeparator !== analysedSeparator" + dense> + <v-col> + <v-alert + border="start" + color="warning"> + {{ $t('pages.table.subpages.import.separator.warn.prefix') }} + <strong v-text="tableImport.separator"/> + {{ $t('pages.table.subpages.import.separator.warn.middle') }} + <strong v-text="suggestedAnalyseSeparator"/> + {{ $t('pages.table.subpages.import.separator.warn.suffix') }} + </v-alert> + </v-col> + </v-row> + <v-row + v-if="step > 1 && suggestedAnalyseLineTerminator && providedTerminator !== analysedTerminator" + dense> + <v-col> + <v-alert + border="start" + color="warning"> + {{ $t('pages.table.subpages.import.terminator.warn.prefix') }} + <strong>{{ JSON.stringify(tableImport.line_termination).replaceAll('"', '') }}</strong> + {{ $t('pages.table.subpages.import.terminator.warn.middle') }} + <strong>{{ JSON.stringify(suggestedAnalyseLineTerminator).replaceAll('"', '') }}</strong> + {{ $t('pages.table.subpages.import.terminator.warn.suffix') }} + </v-alert> + </v-col> + </v-row> + <v-row + v-if="!hasCompatibleSchema" + dense> + <v-col + md="8"> + <v-alert + border="start" + color="warning" + :text="$t('pages.table.subpages.import.dataset.warn')"/> + </v-col> + </v-row> + <v-row + v-if="!$route.query.location" + dense> + <v-col cols="8"> + <v-file-input + v-model="file" + accept=".csv,.tsv" + :show-size="1000" + counter + required + :rules="[ + v => notFile(v) || $t('validation.required'), + ]" + :prepend-icon="validStep1 ? 'mdi-database-check-outline' : 'mdi-database-arrow-up-outline'" + persistent-hint + :variant="inputVariant" + :hint="$t('pages.table.subpages.import.file.hint')" + :label="$t('pages.table.subpages.import.file.label')" /> + </v-col> + </v-row> + <v-row + dense> + <v-col + cols="8"> + <v-btn + :disabled="!isAnalyseAllowed || !validStep1 || !validStep2 || disabled" + :loading="loading" + :variant="buttonVariant" + color="secondary" + size="small" + :text="$t('pages.table.subpages.import.analyse.text')" + @click="uploadAndAnalyse"/> + </v-col> + </v-row> + </v-form> </v-container> - </v-form> </v-stepper-window> <v-stepper-header v-if="!create"> <v-stepper-item - :title="$t('pages.table.subpages.import.summary.title')" - :value="stepStart+2"/> + :title="$t('pages.table.subpages.import.dataset.title')" + :complete="validStep3" + :value="3" /> </v-stepper-header> <v-stepper-window v-if="!create" direction="vertical"> <v-container> <v-row - v-if="rowCount" dense> <v-col> + <v-btn + color="secondary" + :disabled="step !== 3 || disabled" + size="small" + variant="flat" + :loading="loadingImport" + :text="$t('navigation.import')" + @click="importCsv"/> + </v-col> + </v-row> + </v-container> + </v-stepper-window> + <v-stepper-header + v-if="!create"> + <v-stepper-item + :title="$t('pages.table.subpages.import.summary.title')" + :value="4"/> + </v-stepper-header> + <v-stepper-window + v-if="!create && step === 4" + direction="vertical"> + <v-container> + <v-row + v-if="rowCount" + dense> + <v-col + md="8"> <v-alert border="start" color="success"> @@ -232,19 +280,11 @@ <v-btn v-if="rowCount !== null" color="secondary" - :disabled="step !== stepStart + 2" + :disabled="step !== 4 || disabled" size="small" variant="flat" :text="$t('navigation.data')" :to="`/database/${$route.params.database_id}/table/${tableId}/data`" /> - <v-btn - v-else - color="secondary" - :disabled="step !== stepStart + 2" - size="small" - variant="flat" - :text="$t('navigation.import')" - @click="importCsv"/> </v-col> </v-row> </v-container> @@ -253,7 +293,7 @@ </template> <script> -import {isNonNegativeInteger} from '@/utils' +import { isNonNegativeInteger } from '@/utils' import { useCacheStore } from '@/stores/cache' export default { @@ -263,12 +303,12 @@ export default { return null } }, - stepStart: { + create: { default: () => { - return 1 + return false } }, - create: { + disabled: { default: () => { return false } @@ -276,11 +316,13 @@ export default { }, data() { return { - step: 1, + step: 2, validStep1: false, validStep2: false, + validStep3: false, file: null, loading: false, + loadingImport: false, rowCount: null, suggestedAnalyseSeparator: null, suggestedAnalyseLineTerminator: null, @@ -312,15 +354,19 @@ export default { cacheStore: useCacheStore() } }, - watch: { - stepStart: { - handler() { - this.step = this.stepStart - } - } - }, mounted() { - this.step = this.stepStart + this.setQueryParamSafely('location') + this.setQueryParamSafely('quote') + this.setQueryParamSafely('false_element') + this.setQueryParamSafely('true_element') + this.setQueryParamSafely('null_element') + this.setQueryParamSafely('separator') + this.setQueryParamSafely('line_termination') + this.setQueryParamSafely('skip_lines') + if (this.$route.query.location) { + this.step = 3 + this.validStep2 = true + } }, computed: { table() { @@ -339,11 +385,11 @@ export default { if (!this.columns || !this.table) { return false } - const schema = this.table.columns.map(c => c.internal_name) + const schema = this.table.columns.map(c => c.name) let pass = true this.columns.forEach(c => { if (!schema.includes(c.name)) { - console.error('Failed to find column with id', c.name, 'in schema') + console.error('Failed to find column', c.name, 'in schema') pass = false } }) @@ -395,8 +441,13 @@ export default { submit() { this.$refs.form.validate() }, + setQueryParamSafely(name) { + if (this.$route.query[name]) { + this.tableImport[name] = this.$route.query[name] + } + }, importCsv() { - this.loading = true + this.loadingImport = true const tableService = useTableService() tableService.importCsv(this.$route.params.database_id, this.tableId, this.tableImport) .then(() => { @@ -407,16 +458,18 @@ export default { .then((rowCount) => { this.rowCount = rowCount }) - this.step = this.stepStart + 2 - this.loading = false + this.step = 4 + this.validStep3 = true + this.loadingImport = false }) - .catch(() => { + .catch(({code, message}) => { const toast = useToastInstance() - toast.error(this.$t('error.import.dataset')) - this.loading = false + console.error(code, message) + toast.error(`${this.$t(code)}: ${message}`) + this.loadingImport = false }) .finally(() => { - this.loading = false + this.loadingImport = false }) }, uploadAndAnalyse() { @@ -464,19 +517,21 @@ export default { this.suggestedAnalyseSeparator = separator this.suggestedAnalyseLineTerminator = line_termination this.tableImport.location = filename - this.step = this.stepStart + 2 + this.step = 3 const toast = useToastInstance() toast.success(this.$t('success.analyse.dataset')) this.$emit('analyse', {columns: this.columns, filename, line_termination}) this.loading = false }) - .catch(({code}) => { + .catch(({code, message}) => { this.loading = false const toast = useToastInstance() if (typeof code !== 'string') { + /* fallback default error message */ + toast.error(this.$t('error.analyse.invalid')) return } - toast.error(this.$t(code)) + toast.error(`${this.$t(code)}: ${message}`) }) } } diff --git a/dbrepo-ui/components/table/TableSchema.vue b/dbrepo-ui/components/table/TableSchema.vue index 1cc172858c9302b43dd1bbad5ea311fc5898dbd2..51f186dd4a861850c36c4c9443ae73193c172b9d 100644 --- a/dbrepo-ui/components/table/TableSchema.vue +++ b/dbrepo-ui/components/table/TableSchema.vue @@ -4,33 +4,24 @@ ref="form" v-model="valid" :disabled="disabled"> - <v-row> - <v-col md="8"> - <v-alert - v-if="needsSequence" - class="mb-6" - border="start" - :text="$t('validation.schema.primary-key')" - color="info" /> - </v-col> - </v-row> <v-row v-for="(c, idx) in columns" :key="`r-${idx}`" class="column pa-2 ml-1 mr-1 mb-2" dense> - <v-col cols="2"> + <v-col + cols="2"> <v-text-field v-model="c.name" required :rules="[v => !!v || $t('validation.required')]" - :error-messages="needsSequence && c.name.toLowerCase() === 'id' ? [$t('validation.schema.id')] : []" persistent-hint :variant="inputVariant" :label="$t('pages.table.subpages.schema.name.label')" :hint="$t('pages.table.subpages.schema.name.hint')" /> </v-col> - <v-col cols="2"> + <v-col + cols="1"> <v-select v-model="c.type" :items="columnTypes" @@ -44,7 +35,9 @@ :hint="$t('pages.table.subpages.schema.type.hint')" @update:modelValue="setDefaultSizeAndD(c)" /> </v-col> - <v-col cols="2" :hidden="c.type !== 'set'"> + <v-col + v-if="c.type === 'set'" + cols="2"> <v-text-field v-model="c.sets_values" required @@ -57,7 +50,9 @@ :label="$t('pages.table.subpages.schema.set.label')" @focusout="formatValues(c)" /> </v-col> - <v-col cols="2" :hidden="c.type !== 'enum'"> + <v-col + v-if="c.type === 'enum'" + cols="2"> <v-text-field v-model="c.enums_values" required @@ -66,11 +61,15 @@ :variant="inputVariant" :counter-value="() => c.enums.length" :hint="$t('pages.table.subpages.schema.enum.hint')" - :rules="[v => !!v || $t('validation.required')]" + :rules="[ + v => !!v || $t('validation.required') + ]" :label="$t('pages.table.subpages.schema.enum.label')" @focusout="formatValues(c)" /> </v-col> - <v-col cols="1" :hidden="defaultSize(c) === false"> + <v-col + v-if="defaultSize(c) !== false" + cols="1"> <v-text-field v-model.number="c.size" type="number" @@ -80,7 +79,9 @@ :error-messages="sizeErrorMessages(c)" :label="$t('pages.table.subpages.schema.size.label')" /> </v-col> - <v-col cols="1" :hidden="defaultD(c) === false"> + <v-col + v-if="defaultD(c) !== false" + cols="1"> <v-text-field v-model.number="c.d" type="number" @@ -90,50 +91,49 @@ :error-messages="dErrorMessages(c)" :label="$t('pages.table.subpages.schema.d.label')" /> </v-col> - <v-col v-if="hasDate(c)" cols="2"> + <v-col + cols="2" + v-if="hasDate(c)"> <v-select v-model="c.dfid" required :variant="inputVariant" + :disabled="disabled" :rules="[v => !!v || $t('validation.required')]" :items="filterDateFormats(c)" item-title="unix_format" item-value="id" :label="$t('pages.table.subpages.schema.fsp.label')" /> </v-col> - <v-col v-if="shift(c)" :cols="shift(c)" /> - <v-col cols="auto" class="pl-2"> + <v-col + v-if="shift(c)" + :cols="shift(c)" /> + <v-col + cols="auto" + class="pl-2"> <v-checkbox v-model="c.primary_key" + :disabled="disabled" :label="$t('pages.table.subpages.schema.primary-key.label')" @click="setOthers(c)" /> </v-col> - <v-col cols="auto" class="pl-10"> + <v-col + cols="auto" + class="pl-10"> <v-checkbox v-model="c.null_allowed" - :disabled="c.primary_key" + :disabled="c.primary_key || disabled" :label="$t('pages.table.subpages.schema.null.label')" /> </v-col> - <v-col cols="auto" class="pl-10"> + <v-col + cols="auto" + class="pl-10"> <v-checkbox v-model="c.unique" + :disabled="disabled" :hidden="c.primary_key" :label="$t('pages.table.subpages.schema.unique.label')" /> </v-col> - <v-col v-if="false" cols="auto" class="pl-10"> - <v-text-field - v-model="c.foreign_key" - :variant="inputVariant" - required - :label="$t('pages.table.subpages.schema.foreign-key.label')" /> - </v-col> - <v-col v-if="false" cols="auto" class="pl-10"> - <v-text-field - v-model="c.references" - :variant="inputVariant" - required - :label="$t('pages.table.subpages.schema.references.label')" /> - </v-col> <v-col v-if="canRemove(idx)" cols="auto" @@ -160,21 +160,12 @@ </v-row> <v-row> <v-col> - <v-btn - v-if="back" - :color="disabled ? '' : 'tertiary'" - :variant="buttonVariant" - size="small" - class="mr-2" - :disabled="disabled" - :text="$t('navigation.back')" - @click="goBack" /> <v-btn color="secondary" variant="flat" size="small" :loading="loading" - :disabled="disabled" + :disabled="disabled || !valid || this.columns.length === 0" :text="submitText" @click="submit" /> </v-col> @@ -194,12 +185,6 @@ export default { return [] } }, - back: { - type: Boolean, - default () { - return false - } - }, disabled: { type: Boolean, default () { @@ -262,7 +247,10 @@ export default { return false } let shift = 0 - if (this.hasDate(column) === false && this.columns.filter(c => this.hasDate(c) !== false).length > 0 && this.defaultSize(column) === false && this.columns.filter(c => this.defaultSize(c) !== false).length > 0) { + if (this.hasDate(column) === false && this.columns.filter(c => this.hasDate(c) !== false).length > 0) { + shift++ + } + if (this.defaultSize(column) === false && this.columns.filter(c => this.defaultSize(c) !== false).length > 0) { shift++ } if (this.defaultD(column) === false && this.columns.filter(c => this.defaultD(c) !== false).length > 0) { @@ -281,9 +269,6 @@ export default { column.null_allowed = false column.unique = true }, - goBack () { - this.$emit('back', { success: false }) - }, canRemove (idx) { if (idx > 0) { return true diff --git a/dbrepo-ui/components/table/TableToolbar.vue b/dbrepo-ui/components/table/TableToolbar.vue index d7b3d1596a8e71d02c49b0dc44fc5680d6fa96d5..ef95ad1bd2eee6406925a956a3dda14950070a7d 100644 --- a/dbrepo-ui/components/table/TableToolbar.vue +++ b/dbrepo-ui/components/table/TableToolbar.vue @@ -22,7 +22,7 @@ color="tertiary" :variant="buttonVariant" :text="$t('toolbars.database.import-csv.permanent') + ($vuetify.display.lgAndUp ? ' ' + $t('toolbars.database.import-csv.xl') : '')" - class="ml-2" + class="mr-2" :to="`/database/${$route.params.database_id}/table/${$route.params.table_id}/import`" /> <v-btn v-if="canExecuteQuery" @@ -30,7 +30,7 @@ color="secondary" variant="flat" :text="($vuetify.display.lgAndUp ? $t('toolbars.database.create-subset.xl') + ' ' : '') + $t('toolbars.database.create-subset.permanent')" - class="ml-2" + class="mr-2" :to="`/database/${$route.params.database_id}/subset/create?tid=${$route.params.table_id}`" /> <v-btn v-if="canCreateView" @@ -38,7 +38,7 @@ color="secondary" variant="flat" :text="($vuetify.display.lgAndUp ? $t('toolbars.database.create-view.xl') + ' ' : '') + $t('toolbars.database.create-view.permanent')" - class="ml-2" + class="mr-2" :to="`/database/${$route.params.database_id}/view/create?tid=${$route.params.table_id}`" /> <v-btn v-if="canDropTable" @@ -46,7 +46,7 @@ color="error" variant="flat" :text="($vuetify.display.lgAndUp ? 'Drop ' : '') + 'Table'" - class="ml-2" + class="mr-2" @click="dropTableDialog = true" /> <v-btn v-if="canGetPid" @@ -54,7 +54,7 @@ color="primary" variant="flat" :text="($vuetify.display.lgAndUp ? 'Get ' : '') + 'PID'" - class="ml-2" + class="mr-2" :to="`/database/${$route.params.database_id}/table/${$route.params.table_id}/persist`" /> <template v-slot:extension> <v-tabs v-model="tab" color="primary"> diff --git a/dbrepo-ui/locales/de-AT.json b/dbrepo-ui/locales/de-AT.json index e32fe38ee0f835e7bd9c000b1669e2de22d289be..4d9e25b36e9a38a3e87c8176ec04751811c63528 100644 --- a/dbrepo-ui/locales/de-AT.json +++ b/dbrepo-ui/locales/de-AT.json @@ -30,11 +30,15 @@ "yes": "Ja", "no": "Nein", "mine": "(Meine)", - "loading": "Lade" + "loading": "Lade", + "view": "Ansicht" }, "pages": { "identifier": { "title": "Kennung", + "export": { + "text": "Metadatenexport" + }, "pid": { "title": "Persistenter Bezeichner" }, @@ -273,6 +277,19 @@ "broker": { "title": "Broker" }, + "connection": { + "title": "Verbindungsdetails", + "secure": "sicher", + "insecure": "unsicher", + "permissions": { + "write": "Sie können in diese Tabelle schreiben", + "read": "Sie können den gesamten Inhalt dieser Tabelle lesen" + } + }, + "description": { + "title": "Beschreibung", + "empty": "(Keine Beschreibung)" + }, "exchange": { "title": "Exchange" }, @@ -282,14 +299,8 @@ "routing-key": { "title": "Routing-Schlüssel" }, - "connection": { - "title": "Verbindungsdetails", - "secure": "sicher", - "insecure": "unsicher", - "permissions": { - "write": "Sie können in diese Tabelle schreiben", - "read": "Sie können den gesamten Inhalt dieser Tabelle lesen" - } + "name": { + "title": "Interner Name" }, "protocol": { "title": "Protokoll", @@ -301,10 +312,6 @@ "result-rows": { "title": "Reihen" }, - "description": { - "title": "Beschreibung", - "empty": "(Keine Beschreibung)" - }, "owner": { "title": "Eigentümer" }, @@ -320,9 +327,14 @@ "metadata": { "title": "Tabellenmetadaten" }, - "dataset": { + "schema": { "title": "Datensatzstruktur", - "warn": "Das Datensatzschema stimmt nicht mit dem Zieltabellenschema überein. " + "text": "das Tabellenschema manuell." + }, + "dataset": { + "title": "Datensatz importieren", + "text": "Erstellt ein Tabellenschema aus einem bestimmten CSV-Datensatz. ", + "warn": "Das Datensatzschema stimmt (wahrscheinlich) nicht mit dem Schema der Zieltabelle überein. " }, "name": { "label": "Name", @@ -349,12 +361,15 @@ "label": "Zeilen überspringen", "hint": "Optional. " }, + "storage": { + "text": "Datensatz vom Speicherdienst" + }, "quote": { "label": "Angebotskodierung", "hint": "Optional. " }, "terminator": { - "label": "Kodierung des Leitungsabschlusses", + "label": "Codierung des Leitungsabschlusses", "hint": "Optional. ", "warn": { "prefix": "Wir haben Ihren .csv/.tsv-Datensatz analysiert und festgestellt, dass die von Ihnen angegebene Leitungsabschlusscodierung vorliegt", @@ -375,7 +390,7 @@ "hint": "Optional. " }, "file": { - "title": "Datensatz-Upload", + "title": "Datensatzanalyse", "label": "Datensatzdatei", "hint": "Erforderlich. " }, @@ -396,6 +411,12 @@ "information": { "title": "Information" }, + "simple": { + "text": "Aus Schema" + }, + "from-csv": { + "text": "Von CSV" + }, "name": { "label": "Tabellenname", "hint": "Erforderlich" @@ -405,8 +426,7 @@ "hint": "" }, "summary": { - "prefix": "Tabelle mit Namen erstellt", - "suffix": "und importierter Datensatz erfolgreich" + "text": "Erstellte Tabelle mit internem Namen:" } }, "drop": { @@ -421,7 +441,7 @@ } }, "schema": { - "title": "System Versioniert", + "title": "Systemversioniert", "subtitle": "Tabellenbeschränkungen", "bullet": "●", "assign": "Zuordnen", @@ -447,7 +467,7 @@ "title": "Nullbar" }, "sequence": { - "title": "Sequenz" + "title": "Reihenfolge" }, "description": { "title": "Beschreibung" @@ -501,7 +521,7 @@ } }, "semantics": { - "title": "Semantische Instanz für Tabellenspalte zuweisen", + "title": "Weisen Sie der Tabellenspalte eine semantische Instanz zu", "subtitle": "Semantische Instanzen helfen Maschinen dabei, den richtigen Kontext Ihres Datensatzes zu ermitteln", "recommended": "Empfohlene semantische Instanzen", "bullet": "●", @@ -534,7 +554,7 @@ "hint": "Der Wert ist ein Primärschlüssel" }, "format": { - "hint": "Der Wert muss folgendes Format haben" + "hint": "Der Wert muss im Format vorliegen" }, "required": { "hint": "Erforderlich. " @@ -561,7 +581,7 @@ "title": "Interner Name" }, "visibility": { - "title": "Sichtbarkeit" + "title": "Sichtweite" }, "size": { "title": "Größe" @@ -618,7 +638,7 @@ } }, "tables": { - "empty": "(keine Tabellen)" + "empty": "(keine Tische)" }, "tuple": { "create": { @@ -650,9 +670,9 @@ }, "scheme": { "title": "Schema", - "subtitle": "Aktualisiert die Metadaten im Datenbankschema, um systemversionierte Tabellen und Ansichten in der Benutzeroberfläche anzuzeigen", + "subtitle": "Aktualisieren Sie die Metadaten im Datenbankschema, um systemversionierte Tabellen und Ansichten in der Benutzeroberfläche anzuzeigen", "submit": { - "text": "Aktualisieren" + "text": "Aktualisierung" } }, "ownership": { @@ -665,7 +685,7 @@ } }, "visibility": { - "title": "Sichtbarkeit", + "title": "Sichtweite", "subtitle": "Private Datenbanken verbergen die Daten, während Metadaten weiterhin sichtbar sind. ", "visibility": { "label": "Datenbanksichtbarkeit", @@ -723,7 +743,7 @@ "title": "Information", "subtitle": "Allgemeine Benutzermetadaten", "id": { - "label": "ID" + "label": "AUSWEIS" }, "username": { "label": "Nutzername" @@ -754,13 +774,13 @@ "de": "Deutsch (DE)" }, "theme": { - "title": "Theme", + "title": "Thema", "subtitle": "Aktualisieren Sie das Benutzerdesign, wenn Sie angemeldet sind", "label": "Thema", "dark": "Dunkel", "dark-contrast": "Dunkel – hoher Kontrast", "light": "Licht", - "light-contrast": "Hell – hoher Kontrast", + "light-contrast": "Licht – hoher Kontrast", "submit": { "text": "Aktualisieren" } @@ -836,25 +856,25 @@ } }, "view": { - "title": "Ansicht", + "title": "Sicht", "tabs": { - "info": "Info", + "info": "Die Info", "data": "Daten" }, "name": { "title": "Name" }, "query": { - "title": "Abfrage" + "title": "Stellungnahme" }, "creator": { - "title": "Ersteller" + "title": "Schöpfer" }, "creation": { - "title": "Erstellt" + "title": "Schaffung" }, "visibility": { - "title": "Sichtbarkeit" + "title": "Sichtweite" }, "subpages": { "create": { @@ -885,7 +905,7 @@ "title": "Sichtweite" }, "creator": { - "title": "Ersteller" + "title": "Schöpfer" }, "query": { "title": "Abfrage" @@ -904,13 +924,12 @@ "title": "Ergebniszeilen" }, "tabs": { - "info": "Info", + "info": "Die Info", "data": "Daten" }, "subpages": { "create": { "title": "Teilmenge erstellen", - "generated": "Die folgende Abfrage wird ausgeführt (schreibgeschützt)", "subtitle": "Die folgende Abfrage wird ausgeführt", "simple": { "text": "Einfach" @@ -952,20 +971,20 @@ "search": { "types": { "database": "Datenbank", - "table": "Tabelle", + "table": "Tisch", "column": "Spalte", "user": "Benutzer", "identifier": "Kennung", "concept": "Konzept", "unit": "Einheit", - "view": "View" + "view": "Sicht" }, "type": { "label": "Typ", "hint": "" }, "id": { - "label": "ID", + "label": "AUSWEIS", "hint": "" }, "name": { @@ -977,7 +996,7 @@ "hint": "" }, "publication-range": { - "hint": "Geben Sie Ihren benutzerdefinierten Veröffentlichungsjahrbereich an" + "hint": "Geben Sie Ihren benutzerdefinierten Veröffentlichungsjahresbereich an" }, "start-year": { "label": "Startjahr", @@ -1031,14 +1050,18 @@ }, "error": { "auth": { - "connection": "Kontakt zum Authentifizierungsdienst fehlgeschlagen", - "invalid": "Authentifizierung im Authentifizierungsdienst fehlgeschlagen" + "connection": "Der Authentifizierungsdienst konnte nicht kontaktiert werden", + "invalid": "Die Authentifizierung im Authentifizierungsdienst ist fehlgeschlagen" + }, + "analyse": { + "invalid": "Der Datensatz konnte nicht analysiert werden", + "missing": "Datensatz konnte nicht gefunden werden" }, "access": { "missing": "Der Zugriff in der Metadatendatenbank konnte nicht gefunden werden" }, "axios": { - "connection": "Es konnte keine Verbindung hergestellt werden", + "connection": "Kontakt zum Backend fehlgeschlagen", "timeout": "Zeitüberschreitung der Verbindung" }, "concept": { @@ -1049,17 +1072,17 @@ "missing": "Der Container konnte in der Metadatendatenbank nicht gefunden werden" }, "data": { + "connection": "Kontaktaufnahme zum Datendienst fehlgeschlagen", "invalid": "Die Kommunikation mit dem Datendienst ist fehlgeschlagen", - "connection": "Es konnte keine Verbindung zum Datendienst hergestellt werden", "value": "Spaltenwert konnte nicht festgelegt werden", - "drift": "Die Uhr Ihres Browsers ist nicht mit UTC synchronisiert und scheint um Folgendes eingestellt zu sein" + "drift": "Die Uhr Ihres Browsers ist nicht mit UTC synchronisiert und scheint um 16:00 Uhr verschoben zu sein" }, "database": { - "connection": "Es konnte keine Verbindung zur Datenbank hergestellt werden", + "connection": "Kontakt zur Datenbank konnte nicht hergestellt werden", + "create": "Datenbank konnte im Datendienst nicht erstellt werden", "invalid": "Aktion in der Datenbank konnte nicht ausgeführt werden", "querystore": "Die Abfrage konnte nicht in den Abfragespeicher eingefügt werden", - "missing": "Die Datenbank konnte nicht in der Metadatendatenbank gefunden werden", - "create": "Es konnte keine Verbindung zum Metadatendienst hergestellt werden" + "missing": "Die Datenbank konnte nicht in der Metadatendatenbank gefunden werden" }, "doi": { "missing": "DOI konnte in der Metadatendatenbank nicht gefunden werden" @@ -1107,7 +1130,7 @@ "query": { "missing": "Die Abfrage konnte im Datendienst nicht gefunden werden", "invalid": "Die Abfrage ist ungültig", - "type.exists": "Abfrage konnte nicht erstellt werden: kein solcher Spaltentyp", + "type.exists": "Abfrage konnte nicht erstellt werden: Kein solcher Spaltentyp", "type.build": "Abfrage konnte nicht erstellt werden: Derzeit gibt es keine Abfrageerstellungsunterstützung für den Spaltentyp", "column.exists": "Abfrage konnte nicht erstellt werden: In den Datenspalten fehlt die Spalte mit dem Namen" }, @@ -1118,9 +1141,9 @@ "persist": "Die Abfrage konnte nicht im Abfragespeicher der Datenbank gespeichert werden" }, "metadata": { - "privileged": "Das Abrufen privilegierter Metadaten im Datendienst ist fehlgeschlagen", - "connection": "Es konnte keine Verbindung zum Metadatendienst hergestellt werden", - "invalid": "Es konnten keine Authentifizierungsmetadaten im Datendienst abgerufen werden" + "connection": "Es konnte kein Kontakt zum Metadatendienst hergestellt werden", + "invalid": "Es konnten keine Authentifizierungsmetadaten im Datendienst abgerufen werden", + "privileged": "Das Abrufen privilegierter Metadaten im Datendienst ist fehlgeschlagen" }, "sidecar": { "export": "Der Datensatz konnte nicht in den Datenbank-Sidecar exportiert werden", @@ -1165,12 +1188,12 @@ "malformed": "Ungültige Paginierungsanforderung" }, "table": { + "connection": "Kontakt zur Datenbank konnte nicht hergestellt werden", + "create": "Tabelle konnte nicht erstellt werden", "missing": "Die Tabelle konnte in der Metadatendatenbank nicht gefunden werden", "exists": "Die Tabelle mit diesem Namen existiert bereits", "invalid": "Die Spalten im Datendienst konnten nicht analysiert werden", - "malformed": "Eintrag konnte nicht eingefügt werden", - "create": "Tabelle konnte nicht erstellt werden", - "connection": "Das Laden der Tabellendaten ist fehlgeschlagen, da die Datenbank nicht erreichbar ist" + "malformed": "Eintrag konnte nicht eingefügt werden" }, "unit": { "missing": "Die semantische Einheit konnte in der Metadatendatenbank nicht gefunden werden" @@ -1181,11 +1204,11 @@ "invalid": "Die Ansichtsabfrage konnte den Spalten im Datendienst nicht zugeordnet werden" }, "broker": { - "connection": "Es konnte keine Verbindung zum Vermittlungsdienst hergestellt werden", - "invalid": "Es konnten keine Metadaten im Metadatendienst abgerufen werden" + "connection": "Kontakt zum Broker-Service fehlgeschlagen", + "invalid": "Es konnten keine Metadaten im Brokerdienst abgerufen werden" }, "external": { - "invalid": "Metadaten konnten nicht aus dem Datacite-System abgerufen werden" + "invalid": "Es konnten keine Metadaten vom Datacite-System abgerufen werden" } }, "success": { @@ -1220,10 +1243,6 @@ "created": "Tabelle erfolgreich erstellt", "semantics": "Semantische Instanz erfolgreich zugewiesen" }, - "schema": { - "tables": "Die Metadaten der Datenbanktabellen wurden erfolgreich aktualisiert", - "views": "Metadaten der Datenbankansichten wurden erfolgreich aktualisiert" - }, "schema": { "tables": "Die Metadaten der Datenbanktabellen wurden erfolgreich aktualisiert.", "views": "Metadaten der Datenbankansichten wurden erfolgreich aktualisiert." @@ -1240,14 +1259,14 @@ "pid": { "saved": "Kennung erfolgreich gespeichert", "created": "Kennung erfolgreich erstellt", - "published": "Identifikator erfolgreich veröffentlicht", + "published": "Erfolgreich veröffentlichte Kennung", "updated": "Kennung erfolgreich aktualisiert", "deleted": "Kennung erfolgreich gelöscht" }, "user": { "info": "Benutzerinformationen erfolgreich aktualisiert", "theme": "Benutzerthema erfolgreich aktualisiert", - "password": "Benutzerkennwort erfolgreich aktualisiert", + "password": "Benutzerpasswort erfolgreich aktualisiert", "login": "Erfolgreich angemeldet" }, "view": { @@ -1260,7 +1279,7 @@ }, "toolbars": { "user": { - "info": "Info", + "info": "Die Info", "authentication": "Authentifizierung", "developer": "Entwickler" }, @@ -1294,30 +1313,30 @@ "xl": "CSV" }, "dashboard": { - "permanent": "Visualisiere", + "permanent": "Visualisieren", "xl": "Daten" }, "create-subset": { "permanent": "Teilmenge", - "xl": "Erstelle" + "xl": "Erstellen" }, "create-view": { - "permanent": "Ansicht", - "xl": "Erstelle" + "permanent": "Sicht", + "xl": "Erstellen" }, "create-table": { - "permanent": "Tabelle", - "xl": "Erstelle" + "permanent": "Tisch", + "xl": "Erstellen" }, "create-pid": { "permanent": "PID", "xl": "Erhalten" }, "info": { - "tab": "Info" + "tab": "Die Info" }, "tables": { - "tab": "Tabellen" + "tab": "Tische" }, "subsets": { "tab": "Teilmengen" @@ -1400,14 +1419,11 @@ "integer": "Größer oder gleich Null", "max-length": "Die maximale Länge beträgt: ", "day": "Ungültiger Tag", + "matching": "Nicht passend!", "doi": { "invalid": "Ungültiger DOI. " }, "month": "Ungültiger Monat", - "schema": { - "id": "Die Spalte muss als Primärschlüssel deklariert werden", - "primary-key": "Wir erstellen eine Spalte mit dem Namen „id“ mit einer automatisch ansteigenden Sequenz, die bei 1 beginnt. Bitte geben Sie eine Spalte mit Primärschlüssel an, wenn Sie dieses Verhalten nicht wünschen" - }, "uri": { "pattern": "Ungültiger URI", "exists": "URI existiert" @@ -1420,7 +1436,7 @@ "exists": "Der Ansichtsname existiert bereits" }, "table": { - "exists": "Tabellenname existiert bereits" + "exists": "Der Tabellenname existiert bereits" }, "prefix": { "pattern": "Ungültiges Präfixmuster", diff --git a/dbrepo-ui/locales/en-US.json b/dbrepo-ui/locales/en-US.json index edf6c66ca15a752e442ed3c807c4cb3d31a7c8ff..935023300e5c1fd86934d6187605ea1c1b3b2078 100644 --- a/dbrepo-ui/locales/en-US.json +++ b/dbrepo-ui/locales/en-US.json @@ -19,7 +19,7 @@ "persist": "Persist", "cancel": "Cancel", "user": "User", - "import": "Import", + "import": "Import Data", "delete": "Delete", "recommend": "Recommend", "now": "Now", @@ -30,7 +30,8 @@ "yes": "Yes", "no": "No", "mine": "(mine)", - "loading": "Loading" + "loading": "Loading", + "view": "View" }, "pages": { "identifier": { @@ -276,6 +277,19 @@ "broker": { "title": "Broker" }, + "connection": { + "title": "Connection Details", + "secure": "secure", + "insecure": "insecure", + "permissions": { + "write": "You can write to this table", + "read": "You can read all contents of this table" + } + }, + "description": { + "title": "Description", + "empty": "(no description)" + }, "exchange": { "title": "Exchange" }, @@ -285,14 +299,8 @@ "routing-key": { "title": "Routing Key" }, - "connection": { - "title": "Connection Details", - "secure": "secure", - "insecure": "insecure", - "permissions": { - "write": "You can write to this table", - "read": "You can read all contents of this table" - } + "name": { + "title": "Internal Name" }, "protocol": { "title": "Protocol", @@ -304,10 +312,6 @@ "result-rows": { "title": "Rows" }, - "description": { - "title": "Description", - "empty": "(no description)" - }, "owner": { "title": "Owner" }, @@ -323,9 +327,14 @@ "metadata": { "title": "Table Metadata" }, - "dataset": { + "schema": { "title": "Dataset Structure", - "warn": "The dataset schema does not match the target table schema. You can still force the import but it is not recommended" + "text": "the table schema manually." + }, + "dataset": { + "title": "Import Dataset", + "text": "Creates a table schema from a given .csv dataset. Alternatively you can create", + "warn": "The dataset schema (likely) does not match the target table schema. You can still force the import but it is not recommended" }, "name": { "label": "Name", @@ -352,6 +361,9 @@ "label": "Skip Rows", "hint": "Optional. Number of rows to skip, e.g. when the first one contains header and no data" }, + "storage": { + "text": "Dataset from Storage Service" + }, "quote": { "label": "Quote Encoding", "hint": "Optional. Character that quotes data, e.g. double-quotes \"value\"" @@ -378,7 +390,7 @@ "hint": "Optional. Character sequence that represents boolean false, e.g. 0, false, no" }, "file": { - "title": "Dataset Upload", + "title": "Dataset Analysis", "label": "Dataset File", "hint": "Required. Needs to be in .csv/.tsv file format" }, @@ -399,6 +411,12 @@ "information": { "title": "Information" }, + "simple": { + "text": "From Schema" + }, + "from-csv": { + "text": "From CSV" + }, "name": { "label": "Table Name", "hint": "Required" @@ -408,8 +426,7 @@ "hint": "" }, "summary": { - "prefix": "Created table with name", - "suffix": "and imported dataset successfully" + "text": "Created table with internal name:" } }, "drop": { @@ -913,7 +930,6 @@ "subpages": { "create": { "title": "Create Subset", - "generated": "The following query will be executed (readonly)", "subtitle": "The following query will be executed", "simple": { "text": "Simple" @@ -1037,6 +1053,10 @@ "connection": "Failed to contact auth service", "invalid": "Failed to authenticate in auth service" }, + "analyse": { + "invalid": "Failed to analyse dataset", + "missing": "Failed to find dataset" + }, "access": { "missing": "Failed to find access in metadata database" }, @@ -1399,14 +1419,11 @@ "integer": "Greater or equal to zero", "max-length": "Maximum length is: ", "day": "Invalid day", + "matching": "Not matching!", "doi": { "invalid": "Invalid DOI. Must start with 10.xyz" }, "month": "Invalid month", - "schema": { - "id": "Column needs to be declared as primary key", - "primary-key": "We create a column named id with a auto-increasing sequence starting at 1. Please specify a column with primary key if you don't want this behavior" - }, "uri": { "pattern": "Invalid URI", "exists": "URI exists" diff --git a/dbrepo-ui/nuxt.config.ts b/dbrepo-ui/nuxt.config.ts index 7103e352a30f87450788b3e4cb7e50c820370f23..14a6c3034dbb36e756d0fe58c58a88e6d7edd8dc 100644 --- a/dbrepo-ui/nuxt.config.ts +++ b/dbrepo-ui/nuxt.config.ts @@ -22,137 +22,149 @@ const routeRules = { } export default defineNuxtConfig({ - app: { - head: { - charset: 'utf-8', - viewport: 'width=device-width, initial-scale=1', - meta: [ - { 'http-equiv': 'Content-Security-Policy', content: 'upgrade-insecure-requests' } - ], - htmlAttrs: { - lang: 'en-US' - } - } - }, - build: { - transpile: ['vuetify'], - }, - css: [ - 'vuetify/lib/styles/main.sass', - '@mdi/font/css/materialdesignicons.min.css', - '@/assets/globals.css', - '@/assets/overrides.css', - ], - runtimeConfig: { - public: { - commit: '', - title: 'Database Repository', - logo: '/logo.svg', - icon: '/favicon.ico', - touch: '/apple-touch-icon.png', - version: 'bun-dev', - broker: { - host: 'localhost', - port: { - '5672': false - }, - extra: '' - }, - variant: { - input: { - normal: 'underlined', - contrast: 'outlined', - }, - button: { - normal: 'flat', - contrast: 'outlined', - }, - list: { - normal: '', - contrast: 'flat', - } - }, - api: { - client: 'http://localhost', - server: 'http://gateway-service', - }, - upload: { - client: 'http://localhost/api/upload/files' - }, - database: { - unsupported: '*,AVG,BIT_AND,BIT_OR,BIT_XOR,COUNT,COUNTDISTINCT,GROUP_CONCAT,JSON_ARRAYAGG,JSON_OBJECTAGG,MAX,MIN,STD,STDDEV,STDDEV_POP,STDDEV_SAMP,SUM,VARIANCE,VAR_POP,VAR_SAMP,--', - image: { - width: 400, - height: 400 - }, - extra: '' - }, - pid: { - default: { - publisher: 'Example University' - } - }, - doi: { - enabled: false, - endpoint: 'https://doi.org' - }, - links: { - rabbitmq: { - text: 'RabbitMQ Admin', - href: '/admin/broker/' - }, - keycloak: { - text: 'Keycloak Admin', - href: '/api/auth/' - } - } - } - }, - routeRules, - devServer: { - port: 3001 - }, - modules: [ - '@pinia/nuxt', - '@pinia-plugin-persistedstate/nuxt', - '@nuxtjs/i18n' - ], - pinia: { - storesDirs: ['./stores/**'], - }, - piniaPersistedstate: { - storage: 'localStorage' - }, - i18n: { - lazy: false, - langDir: 'locales', - strategy: 'no_prefix', - defaultLocale: 'de', - locales: [ - { - 'code': 'en', - 'file': 'en-US.json', - 'name': 'English (US)', - 'iso': 'en-US' - }, - { - 'code': 'de', - 'file': 'de-AT.json', - 'name': 'German (AT)', - 'iso': 'de-AT' - } - ] - - }, - vite: { - server: { - proxy - }, - vue: { - template: { - transformAssetUrls, - }, - }, - }, - devtools: { enabled: true } -}) + app: { + head: { + charset: 'utf-8', + viewport: 'width=device-width, initial-scale=1', + meta: [ + { 'http-equiv': 'Content-Security-Policy', content: 'upgrade-insecure-requests' } + ], + htmlAttrs: { + lang: 'en-US' + } + } + }, + + build: { + transpile: ['vuetify'], + }, + + css: [ + 'vuetify/lib/styles/main.sass', + '@mdi/font/css/materialdesignicons.min.css', + '@/assets/globals.css', + '@/assets/overrides.css', + ], + + runtimeConfig: { + public: { + commit: '', + title: 'Database Repository', + logo: '/logo.svg', + icon: '/favicon.ico', + touch: '/apple-touch-icon.png', + version: 'bun-dev', + broker: { + host: 'localhost', + port: { + '5672': false + }, + extra: '' + }, + variant: { + input: { + normal: 'underlined', + contrast: 'outlined', + }, + button: { + normal: 'flat', + contrast: 'outlined', + }, + list: { + normal: '', + contrast: 'flat', + } + }, + api: { + client: 'http://localhost', + server: 'http://gateway-service', + }, + upload: { + client: 'http://localhost/api/upload/files' + }, + database: { + unsupported: '*,AVG,BIT_AND,BIT_OR,BIT_XOR,COUNT,COUNTDISTINCT,GROUP_CONCAT,JSON_ARRAYAGG,JSON_OBJECTAGG,MAX,MIN,STD,STDDEV,STDDEV_POP,STDDEV_SAMP,SUM,VARIANCE,VAR_POP,VAR_SAMP,--', + image: { + width: 400, + height: 400 + }, + extra: '' + }, + pid: { + default: { + publisher: 'Example University' + } + }, + doi: { + enabled: false, + endpoint: 'https://doi.org' + }, + links: { + rabbitmq: { + text: 'RabbitMQ Admin', + href: '/admin/broker/' + }, + keycloak: { + text: 'Keycloak Admin', + href: '/api/auth/' + } + } + } + }, + + routeRules, + + devServer: { + port: 3001 + }, + + modules: [ + '@pinia/nuxt', + '@pinia-plugin-persistedstate/nuxt', + '@nuxtjs/i18n' + ], + + pinia: { + storesDirs: ['./stores/**'], + }, + + piniaPersistedstate: { + storage: 'localStorage' + }, + + i18n: { + lazy: false, + langDir: 'locales', + strategy: 'no_prefix', + defaultLocale: 'de', + locales: [ + { + 'code': 'en', + 'file': 'en-US.json', + 'name': 'English (US)', + 'iso': 'en-US' + }, + { + 'code': 'de', + 'file': 'de-AT.json', + 'name': 'German (AT)', + 'iso': 'de-AT' + } + ] + + }, + + vite: { + server: { + proxy + }, + vue: { + template: { + transformAssetUrls, + }, + }, + }, + + devtools: { enabled: true }, + compatibilityDate: '2024-07-24' +}) \ No newline at end of file diff --git a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/import.vue b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/import.vue index 7b29c6ba8e9f22c1568db41b5ab8898a63b0bda6..38c9be5567046b7b7d97b4941aa4f8bb5170daff 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/import.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/import.vue @@ -1,5 +1,6 @@ <template> - <div v-if="canInsertTableData"> + <div + v-if="canInsertTableData"> <v-toolbar flat> <v-btn class="mr-2" @@ -18,8 +19,7 @@ vertical variant="flat"> <TableImport - :table-id="$route.params.table_id" - @analyse="onAnalyse" /> + :table-id="$route.params.table_id" /> </v-stepper> </v-card-text> </v-card> @@ -94,11 +94,6 @@ export default { } return this.roles.includes('insert-table-data') } - }, - methods: { - onAnalyse (event) { - const { columns } = event - } } } </script> diff --git a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/info.vue b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/info.vue index 47ba1af4337a011f2f160baa574bdeb7087e8615..08b42c0d936c7e034b67e09edbd07203edde12d7 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/info.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/info.vue @@ -32,6 +32,10 @@ :title="$t('pages.table.id.title')"> {{ table.id }} </v-list-item> + <v-list-item + :title="$t('pages.table.name.title')"> + {{ table.internal_name }} + </v-list-item> <v-list-item :title="$t('pages.table.size.title')"> {{ sizeToHumanLabel(table.data_length) }} @@ -71,7 +75,8 @@ </v-list> </v-card-text> </v-card> - <v-divider /> + <v-divider + v-if="canWrite && canWriteQueues" /> <v-card v-if="canWrite && canWriteQueues" variant="flat" @@ -86,25 +91,11 @@ </v-list-item> <v-list-item :title="$t('pages.table.exchange.title')"> - <span> - <v-badge - inline - color="code" - :content="database.exchange_type"> - <span v-text="database.exchange_name" /> - </v-badge> - </span> + {{ database.exchange_name }} </v-list-item> <v-list-item :title="$t('pages.table.queue.title')"> - <span> - <v-badge - inline - color="code" - :content="table.queue_type" > - <span v-text="table.queue_name" /> - </v-badge> - </span> + {{ table.queue_name }} </v-list-item> <v-list-item :title="$t('pages.table.routing-key.title')"> @@ -261,7 +252,7 @@ export default { return this.userStore.getAccess }, hasDescription () { - return this.table && this.table.description !== null + return this.table && this.table.description }, canWriteQueues () { if (!this.roles) { @@ -306,7 +297,7 @@ export default { if (!this.$config.public.broker.port) { return [] } - Object.keys(this.$config.public.broker.port).map(key => { + return Object.keys(this.$config.public.broker.port).map(key => { return { port: key, secure: this.$config.public.broker.port[key] @@ -325,7 +316,6 @@ export default { } }, methods: { - sizeToHumanLabel, amqpString (port) { if (!this.user) { return null diff --git a/dbrepo-ui/pages/database/[database_id]/table/import.vue b/dbrepo-ui/pages/database/[database_id]/table/create/dataset.vue similarity index 85% rename from dbrepo-ui/pages/database/[database_id]/table/import.vue rename to dbrepo-ui/pages/database/[database_id]/table/create/dataset.vue index ed86afe09eed451a853ac72e2224d45a7154303e..9a68b5786f286b5a8123c71669aac75307c2782f 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/import.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/create/dataset.vue @@ -13,6 +13,21 @@ <v-card variant="flat" rounded="0"> + <v-card-text> + <v-row> + <v-col + md="8"> + <v-alert + border="start" + color="info"> + {{ $t('pages.table.subpages.import.dataset.text') }} + <NuxtLink + :href="`/database/${$route.params.database_id}/table/create/schema`" + v-text="$t('pages.table.subpages.import.schema.text')" /> + </v-alert> + </v-col> + </v-row> + </v-card-text> <v-card-text> <v-stepper vertical @@ -28,10 +43,11 @@ <v-form ref="form" v-model="validStep1" + :disabled="step > 4" @submit.prevent="submit"> <v-container> <v-row dense> - <v-col md="8"> + <v-col md="4"> <v-text-field v-model="tableCreate.name" :rules="[ @@ -46,9 +62,7 @@ :hint="$t('pages.table.subpages.import.name.hint')" :label="$t('pages.table.subpages.import.name.label')"/> </v-col> - </v-row> - <v-row dense> - <v-col md="8"> + <v-col md="4"> <v-text-field v-model="generatedTableName" :rules="[ @@ -86,8 +100,8 @@ </v-form> </v-stepper-window> <TableImport - :step-start="2" :create="true" + :disabled="!validStep1 || step > 4" :table="table" @analyse="onAnalyse"/> <v-stepper-header> @@ -103,6 +117,7 @@ <TableSchema ref="schema" :back="false" + :disabled="step > 4" :loading="loading" :submit-text="$t('navigation.continue')" :columns="tableCreate.columns" @@ -119,25 +134,33 @@ direction="vertical"> <v-container> <v-row dense> - <v-col> + <v-col + md="8"> <v-alert border="start" color="success"> - {{ $t('pages.table.subpages.create.summary.prefix') }} + {{ $t('pages.table.subpages.create.summary.text') }} <strong v-text="table.internal_name"/> - {{ $t('pages.table.subpages.create.summary.suffix') }} </v-alert> </v-col> </v-row> <v-row> <v-col> + <v-btn + class="mb-1 mr-2" + color="tertiary" + size="small" + variant="flat" + :loading="loadingImport" + :text="$t('navigation.import')" + @click="onImport"/> <v-btn class="mb-1" color="secondary" size="small" variant="flat" :loading="loadingContinue" - :text="$t('navigation.data')" + :text="$t('navigation.view')" @click="onContinue"/> </v-col> </v-row> @@ -169,6 +192,7 @@ export default { validStep4: false, error: false, loadingContinue: false, + loadingImport: false, fileModel: null, rowCount: null, file: { @@ -306,53 +330,24 @@ export default { if (!success) { return } - const payload = Object.assign({}, this.tableCreate) - payload.columns = columns - payload.constraints = constraints - this.createTable(payload) - .then(table => this.import(table)) - }, - createTable(payload) { + const schema = Object.assign({}, this.tableCreate) + schema.columns = columns + schema.constraints = constraints this.loading = true const tableService = useTableService() - return new Promise((resolve, reject) => { - if (this.table) { - resolve(this.table) - return - } - tableService.create(this.$route.params.database_id, payload) + tableService.create(this.$route.params.database_id, schema) .then((table) => { this.table = table - resolve(table) - }) - .catch((error) => { - this.loading = false const toast = useToastInstance() - if (typeof error.code !== 'string' || typeof error.message !== 'string') { - reject(error) - } - toast.error(`${this.$t(error.code)}: ${error.message}`) - reject(error) - }) - .finally(() => { - this.loading = false - }) - }) - }, - import(table) { - this.loading = true - const tableService = useTableService() - tableService.importCsv(this.$route.params.database_id, table.id, this.tableImport) - .then(() => { + toast.success(this.$t('success.table.created')) this.step = 5 - const toast = useToastInstance() - toast.success(this.$t('success.import.dataset')) - this.cacheStore.reloadDatabase() }) .catch(({code, message}) => { this.loading = false const toast = useToastInstance() if (typeof code !== 'string' || typeof message !== 'string') { + /* fallback */ + toast.error(`${this.$t('error.table.create')}: ${message}`) return } toast.error(`${this.$t(code)}: ${message}`) @@ -361,10 +356,6 @@ export default { this.loading = false }) }, - schemaValidity(event) { - const {valid} = event - this.validStep4 = valid - }, onAnalyse({columns, filename, line_termination}) { console.debug('analysed', columns) this.tableCreate.columns = columns @@ -374,6 +365,10 @@ export default { this.step = 4 } }, + async onImport () { + this.loadingImport = true + await this.$router.push({ path: `/database/${this.$route.params.database_id}/table/${this.table.id}/import`, query: this.tableImport }) + }, async onContinue () { this.loadingContinue = true await this.$router.push(`/database/${this.$route.params.database_id}/table/${this.table.id}/data`) diff --git a/dbrepo-ui/pages/database/[database_id]/table/create.vue b/dbrepo-ui/pages/database/[database_id]/table/create/schema.vue similarity index 93% rename from dbrepo-ui/pages/database/[database_id]/table/create.vue rename to dbrepo-ui/pages/database/[database_id]/table/create/schema.vue index 55c9599f8d0bcac9922c0fff77dce370bc8d8b89..b60de5df3045d3f51bcbb2c203afdff18be87699 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/create.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/create/schema.vue @@ -31,7 +31,7 @@ @submit.prevent="submit"> <v-container> <v-row dense> - <v-col md="8"> + <v-col md="4"> <v-text-field v-model="tableCreate.name" :rules="[ @@ -46,9 +46,7 @@ :hint="$t('pages.table.subpages.import.name.hint')" :label="$t('pages.table.subpages.import.name.label')" /> </v-col> - </v-row> - <v-row dense> - <v-col md="8"> + <v-col md="4"> <v-text-field v-model="generatedTableName" :rules="[ @@ -96,7 +94,7 @@ <v-container> <TableSchema submit-text="Create" - :disabled="!tableCreate.name || table" + :disabled="!valid || table" :columns="tableCreate.columns" :loading="loading" @close="schemaClose" /> @@ -109,8 +107,9 @@ :value="3" /> </v-stepper-header> <v-stepper-window + v-if="table" direction="vertical"> - <v-container v-if="table"> + <v-container> <v-row dense> <v-col md="8"> @@ -122,6 +121,14 @@ </v-row> <v-row> <v-col> + <v-btn + color="tertiary" + class="mr-2" + variant="flat" + size="small" + :loading="loadingImport" + :text="$t('navigation.import')" + @click="onImport" /> <v-btn color="secondary" variant="flat" @@ -157,6 +164,7 @@ export default { valid: false, description: null, loading: false, + loadingImport: false, loadingContinue: false, step: 1, table: null, @@ -279,6 +287,10 @@ export default { } this.createTable(columns, constraints) }, + async onImport () { + this.loadingImport = true + await this.$router.push(`/database/${this.$route.params.database_id}/table/${this.table.id}/import`) + }, async onContinue () { this.loadingContinue = true await this.$router.push(`/database/${this.$route.params.database_id}/table/${this.table.id}/info`) diff --git a/dbrepo-ui/pages/signup.vue b/dbrepo-ui/pages/signup.vue index 5c95e0c0f06a3f7877eb87f113e5991875fe80d9..54c00602256c7815d8aff0b255214e66836bc727 100644 --- a/dbrepo-ui/pages/signup.vue +++ b/dbrepo-ui/pages/signup.vue @@ -47,7 +47,9 @@ autocomplete="off" required name="password" - :rules="[v => !!v || $t('validation.required')]" + :rules="[ + v => !!v || $t('validation.required') + ]" type="password" persistent-hint :label="$t('pages.signup.password.label')" @@ -61,7 +63,10 @@ autocomplete="off" required name="password-confirm" - :rules="[v => !!v || $t('validation.required'), v => (!!v && v) === createAccount.password || $t('Not matching!')]" + :rules="[ + v => !!v || $t('validation.required') + ]" + :error-messages="password2 && password2 !== this.createAccount.password ? [this.$t('validation.matching')] : []" type="password" persistent-hint :label="$t('pages.signup.confirm.label')" diff --git a/dbrepo-ui/utils/index.ts b/dbrepo-ui/utils/index.ts index 66dbe9448329faab2b2c18b4801bb59d878d06bb..d940d076ae2b2d4fafac31c6dca8ad833342f64a 100644 --- a/dbrepo-ui/utils/index.ts +++ b/dbrepo-ui/utils/index.ts @@ -1,7 +1,6 @@ -import {format} from 'date-fns' +import { format } from 'date-fns' import moment from 'moment' import type {AxiosError} from 'axios' -import type {Api} from "@vitejs/plugin-vue"; export function notEmpty(str: string) { @@ -1086,7 +1085,7 @@ export function timestampsToHumanDifference(date1: string, date2: string) { export function sizeToHumanLabel(num: number) { let number = Number(num) if (!number) { - return '0' + return '0 B' } if (number < 1000) { return `${Math.floor(number)} B`