From c52c838ce5ceea5cdaf8dd93479f11a6606ae49c Mon Sep 17 00:00:00 2001 From: Bogdan Gusiev Date: Fri, 12 Dec 2025 15:05:49 +0100 Subject: [PATCH 1/2] Add support for Sony RAW image format - Add detection for `image/x-raw-sony` format in `lib/marcel/tables.rb`. - Updated test fixture for Sony RAW image format (`arw.arw`). - Update `magic_test.rb` to improve error message clarity in assertions. --- lib/marcel/tables.rb | 5 +++-- test/fixtures/magic/image/x-raw-sony/arw.arw | Bin 0 -> 8192 bytes test/fixtures/name/image/x-raw-sony/arw.arw | Bin 108 -> 8192 bytes test/magic_test.rb | 3 ++- 4 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 test/fixtures/magic/image/x-raw-sony/arw.arw diff --git a/lib/marcel/tables.rb b/lib/marcel/tables.rb index bcc7622..774ce5c 100644 --- a/lib/marcel/tables.rb +++ b/lib/marcel/tables.rb @@ -1873,7 +1873,7 @@ module Marcel 'application/x-pkcs7-certreqresp' => %w(p7r), 'application/x-project' => %w(mpx), 'application/x-prt' => %w(prt), - 'application/x-quattro-pro' => %w(wq1 wq2 wkq qpw wb1 wb2 wb3), # Quattro Pro - Corel Spreadsheet (part of WordPerfect Office suite) + 'application/x-quattro-pro' => %w(wq1 wq2 wkq qpw wb1 wb2 wb3), # Quattro Pro - Corel Spreadsheet (part of WordPerfect Office suite) 'application/x-quattro-pro;version=1+5' => %w(wb1), # Quattro Pro for Windows, version 1, 5 'application/x-quattro-pro;version=1-4' => %w(wq1 wkq), # Quattro Pro for DOS, version 1-4 'application/x-quattro-pro;version=5' => %w(wq2 wkq), # Quattro Pro for DOS, version 5 @@ -2047,7 +2047,7 @@ module Marcel 'image/x-dpx' => %w(dpx), # Digital Picture Exchange from SMPTE 'image/x-emf-compressed' => %w(emz), # Compressed Enhanced Metafile 'image/x-freehand' => %w(fh fhc fh4 fh40 fh5 fh50 fh7 fh8 fh9 fh10 fh11 fh12 ft7 ft8 ft9 ft10 ft11 ft12), # FreeHand image - 'image/x-jbig2' => %w(jb2 jbig2), # A lossless image compression standard from the Joint Bi-level Image Experts Group. + 'image/x-jbig2' => %w(jb2 jbig2), # A lossless image compression standard from the Joint Bi-level Image Experts Group. 'image/x-jp2-codestream' => %w(j2c), # JPEG 2000 Codestream 'image/x-pict' => %w(pic pct pict), # Apple Macintosh QuickDraw/PICT Format 'image/x-portable-anymap' => %w(pnm), # Portable Any Map @@ -2514,6 +2514,7 @@ module Marcel ['image/jpeg', [[0, b["\377\330\377"]]]], ['image/png', [[0, b["\211PNG\r\n\032\n"]]]], ['image/gif', [[0, b['GIF87a']], [0, b['GIF89a']]]], + ['image/x-raw-sony', [[0, b["II*\000"], [[0..4096, b['SONY']]]], [0, b["MM\000*"], [[0..4096, b['SONY']]]]]], ['image/tiff', [[0, b["MM\000*"]], [0, b["II*\000"]], [0, b["MM\000+"]]]], ['image/bmp', [[0, b['BM'], [[26, b["\001\000"], [[28, b["\000\000"]], [28, b["\001\000"]], [28, b["\004\000"]], [28, b["\b\000"]], [28, b["\020\000"]], [28, b["\030\000"]], [28, b[" \000"]]]]]]]], ['image/vnd.adobe.photoshop', [[0, b["8BPS\000\001"]], [0, b["8BPS\000\002"]]]], diff --git a/test/fixtures/magic/image/x-raw-sony/arw.arw b/test/fixtures/magic/image/x-raw-sony/arw.arw new file mode 100644 index 0000000000000000000000000000000000000000..b9ce8eacf90fc55db26a43cff585602be503ddce GIT binary patch literal 8192 zcmeI1e{56N701uBoj5Tx2~a|THasB2Ng(ly9ex=S0wEnqNt-3sT3`yh#4dQjj+MNT zEGiOW5)E{kAYQep-Kxy>eyE$OY=1Rgow7|s(WI>tH2a=+ zuft=a>pXS;`HJ`M=bd}*x#ymD?|t#1y}g!-h-fu^KrYfid^t6zRTqLwGzaOZJ!mKe z7l3QQW#D440bZ%}+0r_#!0H=>e7)iW;A*AgfKCJYmZI)}+z);bd=$I~ybK%%cWBa| z-?|*6IV7jb9OO`JE)>!#hxC(e{>Xt&WkjQ>zItBT8C^jXeOC6p1^(t6Zu%^AFMu0= zqG85F6*KVpJ4E__F4XhH<41_v54X0}?d%K?^mg7V9mQVG412Nx-NcbA+4Ii7* z_rm#Lw=kpelg-9npX~|b_}H**Ab4+y;6CHh%-PWYzvKtWDaQG5<-?Uz1aeZ&udaN! za*9As%K6om4_8hR$VoZBy7J-5DFQhu=T}!gTscJ`C*}O=`dGr{x%*>362~w6Vf>VD z=|2-c9*cydf~adS8aLZJ$p{z*vM+>;2Qmvz+Jw8tNX5ullzEAkA#K9-SCEF`dJ-uY zuC<3{-HTKRKR<^)T>soD>))@Jbq&36Ugl@sT}AYD#q;1zV=|Y*!+8~-gEd1j=UDt> zGMB<~y6m>{Cx$=J;JhqzI18}jQe23nP8rw@)pg(%iZ_8*Dy{`6;&N z=eS4ak-#p+2fzj6Ql|s#9+y6IPO3=pBDh%b17MHR?}q*}<8CTT5Hg=`uT&7^B zK*^ChqC#8WA{!Um*rV8bFR;V8tRKTpW7=D2YXs|aD<#?E>6x-CjrO#h`2)jlxv}v=AD{Z{R##M@8mTGMBtzh<{0`|8l zt^(7f%u+g?1>{f}QO?S`G`TzKp|euSA*R)e6JTvp#-SgBEwja;#1@}Yn|y_0_G6`u zSJ`w{tG^0O~`KZ?=uQCEFKDT9;f8m!RY5l0KY6A1}sb z`{R&T+kDun?4yacW#Z@TEKKR4$Fa@3c>K$=5yiGBX9<}iy z9P&I5F6~OrvFK3DZI9XHhbQG+CSkwRX6FeTcPYl^UHqg?-fiO^8;2BIvHr4~{BYoh zu&;r6W6W0|Zs5ysX1*SK8T?1Q#8I3eF7P(!pJ>Eh2H(a)`O*%Ya^M#DerX@}vf`hC zi@@C1gT`W(<9J_a#WT1XcKq#F&tM+w=wn37SqFCJ4`W}0{|qN$<%c=iB|hLldR^_5CFu0{4_Hbg*@2zz77mli%P^70R>aZ#QT6N>+Vi7V`B+M4-nM z@vs;SXVv&`9ghAk?5Hk2vQRj>PO79twe_fO8l7`|Pvg_%e=Tf?cYR{bMCntd-^ZTB z3Bfn3@Th!c*H4uu|1PHSSD!4Roh_EqJ-3z_x``eoFw{~x&rPnP-XgZag}wa34SEJA zz2$J2-kMr(bG^jkOV<6Y?Jl*Yre$PN-g_+_yF~JoB`>n>vahrzTP^Y8;*`q*Y2%)U z4_CXVMcMhNDoM@8XL$DJ%ye6(Yk$pYs*DM9Pg-O|C@H4L-V>oj=3++Fh#Sd}2#s8P z>J^c!jQu7PT5x7UN5XBP8mO)nsp(hdlVQCww2-`dYV3&EHn)1i&Dm2)GnV{rj}W1k zhM*==!n~a^*UpLlt8+Ilijx`PNo7)Zrjr{&Vqw~y4n3cIUZj&Ev`2*6LgIZa=Hl_W>+gtL zV*2&UYts{%mqdj)o|^uP*_N8k{7qa<|1>1Z-xsqX(Lw*b)Uk`d?8oTX%(W{^pHvP= zF69R_rA=wS%dR9_*Zse~k8r7d*Bd21?I?!*A}JT%TT(v_IyP1P)}HD={OUFLUHbdk XPrSQi;J<-uZA&(lx;$S$tna@7kI?M6 literal 0 HcmV?d00001 diff --git a/test/fixtures/name/image/x-raw-sony/arw.arw b/test/fixtures/name/image/x-raw-sony/arw.arw index bae24c97456bf34cf7df65f2e145250fdc64f9dc..b9ce8eacf90fc55db26a43cff585602be503ddce 100644 GIT binary patch literal 8192 zcmeI1e{56N701uBoj5Tx2~a|THasB2Ng(ly9ex=S0wEnqNt-3sT3`yh#4dQjj+MNT zEGiOW5)E{kAYQep-Kxy>eyE$OY=1Rgow7|s(WI>tH2a=+ zuft=a>pXS;`HJ`M=bd}*x#ymD?|t#1y}g!-h-fu^KrYfid^t6zRTqLwGzaOZJ!mKe z7l3QQW#D440bZ%}+0r_#!0H=>e7)iW;A*AgfKCJYmZI)}+z);bd=$I~ybK%%cWBa| z-?|*6IV7jb9OO`JE)>!#hxC(e{>Xt&WkjQ>zItBT8C^jXeOC6p1^(t6Zu%^AFMu0= zqG85F6*KVpJ4E__F4XhH<41_v54X0}?d%K?^mg7V9mQVG412Nx-NcbA+4Ii7* z_rm#Lw=kpelg-9npX~|b_}H**Ab4+y;6CHh%-PWYzvKtWDaQG5<-?Uz1aeZ&udaN! za*9As%K6om4_8hR$VoZBy7J-5DFQhu=T}!gTscJ`C*}O=`dGr{x%*>362~w6Vf>VD z=|2-c9*cydf~adS8aLZJ$p{z*vM+>;2Qmvz+Jw8tNX5ullzEAkA#K9-SCEF`dJ-uY zuC<3{-HTKRKR<^)T>soD>))@Jbq&36Ugl@sT}AYD#q;1zV=|Y*!+8~-gEd1j=UDt> zGMB<~y6m>{Cx$=J;JhqzI18}jQe23nP8rw@)pg(%iZ_8*Dy{`6;&N z=eS4ak-#p+2fzj6Ql|s#9+y6IPO3=pBDh%b17MHR?}q*}<8CTT5Hg=`uT&7^B zK*^ChqC#8WA{!Um*rV8bFR;V8tRKTpW7=D2YXs|aD<#?E>6x-CjrO#h`2)jlxv}v=AD{Z{R##M@8mTGMBtzh<{0`|8l zt^(7f%u+g?1>{f}QO?S`G`TzKp|euSA*R)e6JTvp#-SgBEwja;#1@}Yn|y_0_G6`u zSJ`w{tG^0O~`KZ?=uQCEFKDT9;f8m!RY5l0KY6A1}sb z`{R&T+kDun?4yacW#Z@TEKKR4$Fa@3c>K$=5yiGBX9<}iy z9P&I5F6~OrvFK3DZI9XHhbQG+CSkwRX6FeTcPYl^UHqg?-fiO^8;2BIvHr4~{BYoh zu&;r6W6W0|Zs5ysX1*SK8T?1Q#8I3eF7P(!pJ>Eh2H(a)`O*%Ya^M#DerX@}vf`hC zi@@C1gT`W(<9J_a#WT1XcKq#F&tM+w=wn37SqFCJ4`W}0{|qN$<%c=iB|hLldR^_5CFu0{4_Hbg*@2zz77mli%P^70R>aZ#QT6N>+Vi7V`B+M4-nM z@vs;SXVv&`9ghAk?5Hk2vQRj>PO79twe_fO8l7`|Pvg_%e=Tf?cYR{bMCntd-^ZTB z3Bfn3@Th!c*H4uu|1PHSSD!4Roh_EqJ-3z_x``eoFw{~x&rPnP-XgZag}wa34SEJA zz2$J2-kMr(bG^jkOV<6Y?Jl*Yre$PN-g_+_yF~JoB`>n>vahrzTP^Y8;*`q*Y2%)U z4_CXVMcMhNDoM@8XL$DJ%ye6(Yk$pYs*DM9Pg-O|C@H4L-V>oj=3++Fh#Sd}2#s8P z>J^c!jQu7PT5x7UN5XBP8mO)nsp(hdlVQCww2-`dYV3&EHn)1i&Dm2)GnV{rj}W1k zhM*==!n~a^*UpLlt8+Ilijx`PNo7)Zrjr{&Vqw~y4n3cIUZj&Ev`2*6LgIZa=Hl_W>+gtL zV*2&UYts{%mqdj)o|^uP*_N8k{7qa<|1>1Z-xsqX(Lw*b)Uk`d?8oTX%(W{^pHvP= zF69R_rA=wS%dR9_*Zse~k8r7d*Bd21?I?!*A}JT%TT(v_IyP1P)}HD={OUFLUHbdk XPrSQi;J<-uZA&(lx;$S$tna@7kI?M6 literal 108 zcmebEWzb?^VBlb2XJlYt2C^7|kb#jAiOmLOgCqr!*y2cPq!?JidKnl}7^M+xpcsRK Nf Date: Sat, 13 Dec 2025 15:49:18 +0100 Subject: [PATCH 2/2] Apply suggestion from @bogdan --- test/magic_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/magic_test.rb b/test/magic_test.rb index ad67cbd..e758361 100644 --- a/test/magic_test.rb +++ b/test/magic_test.rb @@ -8,7 +8,7 @@ class Marcel::MimeType::MagicTest < Marcel::TestCase each_content_type_fixture('magic') do |file, name, content_type| test "gets type for #{content_type} by using only magic bytes #{name}" do actual_type = Marcel::MimeType.for(file) - assert_equal content_type, actual_type, "Expected #{file} to have #{content_type}, but was #{actual_type}" + assert_equal content_type, actual_type, "Expected #{file} to be #{content_type}, but was #{actual_type}" end end