From be997a48922808863c6b5a5bc17391417296e09a Mon Sep 17 00:00:00 2001 From: Daniel Garcia Moreno Date: Mon, 12 Jun 2023 12:22:47 +0200 Subject: [PATCH 1/3] test: Add test to check spelling The .spec file to build these binaries can be found here: https://build.opensuse.org/package/show/devel:openSUSE:Factory:rpmlint:tests/spellingerrors https://github.com/rpm-software-management/rpmlint/issues/1072 --- .../binary/spellingerrors-default-0-0.noarch.rpm | Bin 0 -> 6217 bytes test/binary/spellingerrors-lang-0-0.noarch.rpm | Bin 0 -> 6285 bytes test/binary/spellingerrors-lang2-0-0.noarch.rpm | Bin 0 -> 6289 bytes test/binary/spellingerrors-lang3-0-0.noarch.rpm | Bin 0 -> 6289 bytes test/test_tags.py | 13 +++++++++++++ 5 files changed, 13 insertions(+) create mode 100644 test/binary/spellingerrors-default-0-0.noarch.rpm create mode 100644 test/binary/spellingerrors-lang-0-0.noarch.rpm create mode 100644 test/binary/spellingerrors-lang2-0-0.noarch.rpm create mode 100644 test/binary/spellingerrors-lang3-0-0.noarch.rpm diff --git a/test/binary/spellingerrors-default-0-0.noarch.rpm b/test/binary/spellingerrors-default-0-0.noarch.rpm new file mode 100644 index 0000000000000000000000000000000000000000..0b5d648145ca57feae1c635dbe54a7d071e09745 GIT binary patch literal 6217 zcmeHLON$&;6u$k)%NQ6L!56_2K_{51uJ@yL5=k->gO~}K8Ivd&Zq>cjU07Y!)U8ft zLckzub|UD)jp!n{5f_2DauYXZ;ZJZiJ|I34jiLt0WIU(qMus5^_f~b^{_4Bu+;dNV zb*BfuYoA>Ix<%k>h#^nYBaUUS^T@`O#1#H7eCI1-^){`L&Sl{{u5aZ`y!1~s&fEa%R z!U}hN=K5Yt9iK&^9~j*6Jd+u=!+pbLy6I8RjI4+-$FQ6*V$5~TFfvVp>s}C0#^T8L zBF{B-H;nZ#;Gt_7w(E1p@p%-+4r2jUg$<$Yi=Dq-dw=@lH;wJ?b@HGB_ zsl713*JynYh&c?#Rv37p?}0uE`X)`ue~|nk$$ymm5y{a<*#={$Nj(!Zxw;z^#Me->?=pW_7{@Q*u-<18faUZyE z%6{8j$t{^b3yAAyBtH%a`!xHKp8&-5*bmkZ0Wp6lIjeZk1{*>fc2iCWA z$a(DfY49t70K~jVg5&w>^Q;FMA}W$$ndF&rIw||gxH{U8RSgaH zBCR;p*oD-eo;nL<#MN1y6@VosxcZ4pdIUOg9=jbVZq~LL~v@v{0yd+Ati&&bj*{VTo&DHcV z;-{n8n&FSB;cIZx*!iuO56~>(sd8{Eyz&eiQ>}Uq&yHn_^1&XWDoK`<2~Cw#yb$oD z$z30&Vz|ERxQ-Fv9~@j;(Q;PjOhr9L(^OFxPtMLAT{tv*;^h3?;?eyxih5wf%(SJb zu_$TusyZz4lH(IsMOolUQ{z!~I?0$?(lF%$I2FrqQXmNDQQa7k344Ek?Gr}8yGYW0tf7B+czk<*I-mLFsDru{OiDSJnr$> z@$4Yh4c!iOhgG#qi|Mv$hIY)U>BpXDaNjdM+XzF;12PRCjQ=3|76zIR?orx#MEbHp_x63Kkxpe7+RV-f{pb$9i9t^K+mUHy{G z;35V|aG?mgaG?m|&R>+c(#5zj3-==ECa4fUiAGUE$Yi{?yCUO|g?qbZYEGZJb#GOl zs`m!Y#dj}#(<0Cse87?Aww=5SHgl+%%z}1&_J@wVebJsuo;Lzg7yI+IB=gLt1 zr&gd=pjMz(pjMz(pjMz(pjMz(pjMz(pjMz(;Qy{b>4~hYth@q3fTuyoD&J%j>+2=Uf4f=7a9 zf+vCtecGrC+>h2Nz!5^Wz6uEIw_XQ?^|pQii1ma%TfYYm`)R!`;y(c5d>qI5cz-Z{ z0r>=pa&i-kkf`u8E38AQ@(v~R4#`|E<`VqoaTo`~BpdQ%K}xc;D}{^)c|0iMER~MM zMNhg>x5`(@1Pfw`@j@D=>|e8?R#}YoSz46EhD@SISy0Z5=&*qK+q1mrW!;<(dQ5@6 zlkn8#y-60(q?hqRDWAfuPvaDW(0W;)b;2&qgP3;woTfpK@lME&vZRv@SUNjDJJp${ zL6PMPoqW&-m$c{+dA86sK_!(?mMTat;@U z-1HzN&30|ewlohvw9q!9b1m=FCHWvt5=ovvGQID>+|2ahBeVPF4@^u+^5mM49fl-F zyr99e@*vL&hNms_BF76WN5k}3oQ85i{e*GglrO+7fgoIKd2O(&5+s!OZq&l7E*~sE z9y@YY4D(bj76uF|B}KLa?rkQ?T@no9j4XnbMDylUaq=>%Ay;={>d9+oAK7wx)8}uV zTwXe#;WrAr>#&Gqmrzp;oX|7_-8FUF(`e**R^Yp)t5Mr^G&>9p%hz>qwLQafn8PB= zF+FgxRnt?gu&SjSp=#>7Z$^yjZsa%`a~<6=HQzTJ)$vr{2tw5|Tt*|`v^B8KnX9X? zjBhzq$M3A_AJxjr@(Fkz8U18@ne?_bNOSl4%}YOj`d$D0$kla?FZ-Lxp2zu>mAB4) ObpM7XX>Gqw?)e)cYvCFI literal 0 HcmV?d00001 diff --git a/test/binary/spellingerrors-lang2-0-0.noarch.rpm b/test/binary/spellingerrors-lang2-0-0.noarch.rpm new file mode 100644 index 0000000000000000000000000000000000000000..698be62189964a8ae28471b5aabd6d1e2dadb01f GIT binary patch literal 6289 zcmeHL-)kL36rTH|ZE7h*BKQN9#Xd9@ce6k5?p{n4)1(b*TbjgLeWX=A7%hE zJkQo0%00)9jF#sGE!XvfKsTMx4^6nV0$32X{pXG^?>Th#wD-vBnf&8(&3C?q!Dlg2 zwMv0Xfl7f&fl7f&fl7f&fl7f&fl7f&fl7f&f&aY%r6;nsw)Qe80iFgS>wJ@Ous0@Q z=mF^9Ycy3r%wf<+pku3p?}0uE`X=bXpbv6U@;fB|QSv(_M;~P?^t&a$B)J8M^)3UV zuksOetcN}e)?bqR3LwV6lKeM7jDI8f??Ya@SMon3KPdTCKv=&vFZneYe@gNd$qUI> zB|kaj&08dYPV!p;L66$2lHUdh`>Ubn1lYV?#y^!Db%Fdk`b-!f2Za6C_W{EFHof6^ zUGBH(1IK*1-)39#XJq~iAkKeL^2Y(8Zv8#Uj{xF)+z-}A%Lwy7kem&9BbJ;?o=P4` zE+j`k4CXgZNRGO|`DmO4g!3`>3LvcCka~=L1|0L>0EG3&z6XT;G~SZ@2SChUmi(fO z<2k8KktioOvIvO|KXcMMREFlEg61Ka@5Vxb-#lh*Vp)&IC@i*a*5hr~p?Mh7c97FF>~hg&{1{K#S)ZqK3v<)$ z85$N@zSz$DJ=kc`E?{>;nNY4L9F++q3q*TjA{fL8(=aFof@@jcnOMIJd31K3ETnMX zVI0Mrk#14+VcPl$1lAdxAZZ30>u%H@j9E?Op$6O87%H7xyf1jjH?8mG)`Rh>tk=)E z5S-1#3Exk9T3*>;tI}<~)i|Yz)teCq%(^5lhoGTQ!KS zwKTm%{Of48W_TqvJWYpZa%N;{4^3m9D0@rcmHSyqwc&Gku#_##db^3L#A#f_G*OQ6 zT)>$jH++~17_%*>yjBmGih7tPiJ~qXojGu5es<=_(YXT)ho+_#b#Xg5hNs&#$$;}kCL&AQXk&_@LG5mR5K7AF{P>1JX`pIkOAKrdu z>nE?BURk=3;a3Ijbx=gAN2slbF0<{>^lY=`8#MBLCk#B>Gib|mjTU2;6PTvw8@}bZ z+~twu+J2-Py6x)@eu1EtX))b4&A^U0HND7n4eq(7Ya2mexw`A?ffX{{u{=(rz-}3) zWpU5cVVS@I;~c+R!+%z5Yb&SVdUX8#i51elt48V%ZQi!@(}&;nE{y)QsrE&08`=Aq TxVrZG=jZO*QYVd_t7OOD*>>Tb literal 0 HcmV?d00001 diff --git a/test/binary/spellingerrors-lang3-0-0.noarch.rpm b/test/binary/spellingerrors-lang3-0-0.noarch.rpm new file mode 100644 index 0000000000000000000000000000000000000000..d7bd3d33cafc651982a18e53bc17f0cca33a2eba GIT binary patch literal 6289 zcmeHLTWcLv6yE33HnkK|B6vY%z=x*dOy+($n0iT@HWZuCB-ZLf+%vQ1oWVIWhuL$| zrutAtEC`C=qZNHnUqn!-P|$}6qM(03s6G@GQnjsBDAhKNYt7k}82aG5Gs(_3-(G94 zz2=*JPT;%n!Ns!;0#}XqSdzqPo8@_yb2*`D+mKaR#o&LuYGl*K%-23#sfoEQgbbgC z``s|`{$0Rf*myhOW*B%uZfyr3@?8VoSOILpNCf{C5Z03(3|QZ|1c>nyFkpS-H$aTP z1Yt=xJj2y}i&@O`Y}*S1)%8u&u{B>anZaDkRZZsDL^ngtrK+WSmg5DGZ${Lz{U9`5 zFN}Ow_iWR(e9KlXRSQ&R1%XB#-?e?!FkHun4WaEn5A5(C{r<|Oudls%>b+|-wX-n! zd>N|#R0>oIR0>oIR0>oIR0>oIR0>oIR0>oIR0>oI{NEKQJ(0Dwwbwxi@H7Zn=bMaz zy)h0`55oXoqbUPoP6%TN23~dWJGlH)Q zUI>0e@Z$sCyj}1Y1iu3i^r)Q@{7yjVuZErzVDl~!|3Yxo1@i0YGhuub5c;q02ZZNs zx`X+;=(p(s$9&OmvnBX*B7YJP*S{+GlYmgS{*mBE0C7F`gZ0re!u&IWhXdY-1!sb% zf=7aL!O;(c^^IeKqb_hh8m|Dt`51Wv5cY2fJx0C+j`{BZ!u}&a0zyBH_XYn65c5|A zKQH2VPHGb*%E_%PLZZUYtndz{fq5vQc}V6uF_+*skHa|VCt05-OHz`hZ7F0t$m3oS zXQ^~FE;>?K7|q8)0fkJkAeI;}q<+f&l`e|0E=!BDSf5FBkp*R9MEeD#@67U|leKf& z>o5hH4`04~Fv$X%bTVEjFoUM z-qs`yiY#Ah<-IO6TC@u2j!R?G&4dM!Kr)}V#>V`9oP-Jnd7m>S%iCk?w;_*D&5`*O zo;!%6n1!TM6g^nBegT1f`o~C`L1Ueb+JiBx@H|kUosFT=xy9##mwem$QMT@nPGsF) z&Nye`WSp>rw9EJ|B4RkRCvM}j{WCX1my(Q@$$UR(J(II2KDIGD#h>CuxQiHys+h7y zOvP5z67jF4n2P3>RC5&--pR?Ku7cu8kVo?uBUm1 znd#HTMpIndu#B|YHe-x1l$jgeloU7I``H{{jts4mVf#5hwi!Izc$sr>24$Y Vp5Ry4-u~+22e;HoW9JQW|KB)3;b8y( literal 0 HcmV?d00001 diff --git a/test/test_tags.py b/test/test_tags.py index 556349f3a..f1d8283da 100644 --- a/test/test_tags.py +++ b/test/test_tags.py @@ -421,3 +421,16 @@ def test_summary_on_multiple_lines(tmp_path, package, tagscheck): test.check(get_tested_package(package, tmp_path)) out = output.print_results(output.results) assert 'E: summary-on-multiple-lines' in out + + +@pytest.mark.parametrize('package', [ + 'binary/spellingerrors-default', + 'binary/spellingerrors-lang', + 'binary/spellingerrors-lang2', + 'binary/spellingerrors-lang3', +]) +def test_description_spelling_error(tmp_path, package, tagscheck): + output, test = tagscheck + test.check(get_tested_package(package, tmp_path)) + out = output.print_results(output.results) + assert 'E: spelling-error' in out From 2f07dab0b49aec3ef0acdc8599f37ee2a3509acb Mon Sep 17 00:00:00 2001 From: Daniel Garcia Moreno Date: Wed, 14 Jun 2023 08:24:37 +0200 Subject: [PATCH 2/3] spellcheck: Set lang to en_US when it's C C is not an actual language in the spell checker, so converting to an actual language code to check the spelling correctly. Fix https://github.com/rpm-software-management/rpmlint/issues/1072 --- rpmlint/spellcheck.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rpmlint/spellcheck.py b/rpmlint/spellcheck.py index a3963f063..80884541a 100644 --- a/rpmlint/spellcheck.py +++ b/rpmlint/spellcheck.py @@ -61,6 +61,10 @@ def spell_check(self, text, fmt, lang='en_US', pkgname='', ignored_words=None): warned = set() suggestions = {} + # C lang is 'en_US' + if lang == 'C': + lang = 'en_US' + # Initialize spelling dictionary if not already done if lang not in self._enchant_checkers: self._init_checker(lang) From 8238ac7bcd92cf0807b197db15cf8b165db77c29 Mon Sep 17 00:00:00 2001 From: Daniel Garcia Moreno Date: Wed, 14 Jun 2023 08:38:50 +0200 Subject: [PATCH 3/3] CI: adapt dependencies to new lang tests --- .github/workflows/main.yml | 2 ++ .packit/rpmlint.spec | 2 ++ test/Testing.py | 1 + test/test_tags.py | 5 +++++ 4 files changed, 10 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 0c9203202..dffd8c75f 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -58,6 +58,7 @@ jobs: desktop-file-utils appstream-glib myspell-en_US myspell-cs_CZ + myspell-fr_FR python3-pyenchant if: ${{ contains(matrix.container, 'opensuse') && matrix.build-type == 'normal' }} - run: zypper -n install python3-flake8-comprehensions @@ -98,6 +99,7 @@ jobs: devscripts-checkbashisms hunspell-en hunspell-cs + hunspell-fr python3-enchant if: ${{ contains(matrix.container, 'fedora') && matrix.build-type == 'normal' }} - run: rm -rf $(rpm --eval '%_dbpath') diff --git a/.packit/rpmlint.spec b/.packit/rpmlint.spec index 4e77c5bce..ff529e4f1 100644 --- a/.packit/rpmlint.spec +++ b/.packit/rpmlint.spec @@ -56,9 +56,11 @@ BuildRequires: /usr/bin/desktop-file-validate %if 0%{?suse_version} BuildRequires: myspell-en_US BuildRequires: myspell-cs_CZ +BuildRequires: myspell-fr_FR %else BuildRequires: hunspell-en BuildRequires: hunspell-cs +BuildRequires: hunspell-fr %endif %if 0%{?fedora} || 0%{?rhel} >= 8 diff --git a/test/Testing.py b/test/Testing.py index 83776f7b1..e1f03b5c6 100644 --- a/test/Testing.py +++ b/test/Testing.py @@ -41,6 +41,7 @@ def _has_dictionary(language): HAS_ENGLISH_DICTIONARY = _has_dictionary('en_US') HAS_CZECH_DICTIONARY = _has_dictionary('cs_CZ') +HAS_FRENCH_DICTIONARY = _has_dictionary('fr') def get_tested_path(*paths): diff --git a/test/test_tags.py b/test/test_tags.py index f1d8283da..663aab10a 100644 --- a/test/test_tags.py +++ b/test/test_tags.py @@ -1,8 +1,10 @@ import pytest from rpmlint.checks.TagsCheck import TagsCheck from rpmlint.filter import Filter +import rpmlint.spellcheck from Testing import CONFIG, get_tested_package +from Testing import HAS_ENGLISH_DICTIONARY, HAS_FRENCH_DICTIONARY @pytest.fixture(scope='function', autouse=True) @@ -423,6 +425,9 @@ def test_summary_on_multiple_lines(tmp_path, package, tagscheck): assert 'E: summary-on-multiple-lines' in out +@pytest.mark.skipif(not rpmlint.spellcheck.ENCHANT, reason='Missing enchant bindings') +@pytest.mark.skipif(not HAS_ENGLISH_DICTIONARY, reason='Missing English dictionary') +@pytest.mark.skipif(not HAS_FRENCH_DICTIONARY, reason='Missing French dictionary') @pytest.mark.parametrize('package', [ 'binary/spellingerrors-default', 'binary/spellingerrors-lang',