Skip to content

Instantly share code, notes, and snippets.

@veganstraightedge
Last active July 25, 2026 19:58
Show Gist options
  • Select an option

  • Save veganstraightedge/0f940849cd8e2c9770cabffb6d4b33e3 to your computer and use it in GitHub Desktop.

Select an option

Save veganstraightedge/0f940849cd8e2c9770cabffb6d4b33e3 to your computer and use it in GitHub Desktop.
Report of gems whose names differ only in case on rubygems.org

Gems whose names differ only in case

Report generated at 2026-07-25 12:56:36 -0700.

178 name collisions covering 356 distinct gems, out of 195399 on RubyGems.org.

These are separate gems that fold to the same name, so any tool storing one gem per file on a case-insensitive filesystem (macOS APFS, Windows) will have them overwrite each other.

Newest release among any colliding gem: 2026-07-20 — several of these gems are still actively maintained.

When each collision was created

Dated by the first release of the second gem in each pair, i.e. when the two names first coexisted. RubyGems.org appears to have added case-insensitive name validation after this: the most recent collision was created 2013-10-04, and none since. So this is legacy data in the index rather than an open validation hole.

All collisions are only pairs, no triples or more.(FooBarBaz and foobarbaz. No FooBarBaz and foobarbaz AND ALSO fooBARbaz)

Year created Collisions
2009 49
2010 21
2011 32
2012 46
2013 30

Groups with a release on or after

Year Groups
2015 40
2018 21
2020 16
2022 14
2024 12
2026 7

Every collision

Folded name Gem Versions Latest First release Last release Collision since
abundance Abundance 1 1.0.0 2009-08-12 2009-08-12 2009-08-12
abundance abundance 25 1.0.3 2009-07-25 2009-07-25 2009-08-12
actionpool ActionPool 6 0.2.3 2009-07-25 2010-01-13 2010-01-06
actionpool actionpool 2 0.2.3 2010-01-06 2010-01-13 2010-01-06
actiontimer ActionTimer 5 0.2.1 2009-07-25 2010-01-13 2010-01-06
actiontimer actiontimer 2 0.2.1 2010-01-06 2010-01-13 2010-01-06
activesambaldap ActiveSambaLdap 1 0.0.7 2009-08-12 2009-08-12 2009-08-12
activesambaldap activesambaldap 10 0.1.0 2009-07-25 2012-07-08 2009-08-12
apfel Apfel 1 0.0.1 2012-12-01 2012-12-01 2012-12-01
apfel apfel 4 0.0.5 2012-12-01 2013-04-16 2012-12-01
appjob Appjob 1 0.0.1 2011-10-24 2011-10-24 2011-10-24
appjob appjob 12 0.0.14 2011-10-24 2011-11-07 2011-10-24
ass ASS 1 0.1.0 2009-11-30 2009-11-30 2012-09-12
ass ass 12 0.0.25 2012-09-12 2013-10-23 2012-09-12
auto Auto 1 4.0.0.alpha.1 2013-01-13 2013-01-13 2013-01-13
auto auto 5 0.1.4 2009-11-06 2009-11-16 2013-01-13
autonzb AutoNZB 1 0.5.4 2009-11-01 2009-11-01 2009-11-01
autonzb autonzb 2 0.5.5 2009-11-01 2009-11-02 2009-11-01
babelfish Babelfish 1 0.0.1 2009-08-12 2009-08-12 2009-08-12
babelfish babelfish 1 0.0.1 2009-08-04 2009-08-04 2009-08-12
banana Banana 1 0.0.1 2012-11-14 2012-11-14 2012-11-14
banana banana 6 0.3.1 2012-07-28 2015-12-10 2012-11-14
base62 Base62 3 0.0.3 2013-01-19 2013-01-19 2013-01-19
base62 base62 4 1.0.0 2009-07-25 2014-01-16 2013-01-19
bashy Bashy 1 0.1.0 2012-04-21 2012-04-21 2012-04-21
bashy bashy 4 0.1.2 2010-08-17 2010-08-24 2012-04-21
basil Basil 1 0.1.0 2012-09-18 2012-09-18 2012-09-18
basil basil 7 0.1.3 2012-02-10 2012-12-18 2012-09-18
bigcat BigCat 4 1.0.2 2011-08-28 2011-09-01 2011-09-01
bigcat bigcat 2 1.0.3 2011-09-01 2011-09-01 2011-09-01
bluecloth BlueCloth 1 1.0.1 2009-10-27 2009-10-27 2009-10-27
bluecloth bluecloth 34 2.2.0 2009-08-12 2011-11-01 2009-10-27
box2d Box2d 2 1.4.3 2009-09-08 2009-09-08 2009-09-08
box2d box2d 2 1.4.3 2009-07-25 2009-07-25 2009-09-08
buildr Buildr 1 0.17.0 2009-08-12 2009-08-12 2009-08-12
buildr buildr 152 1.5.8 2009-07-25 2019-07-14 2009-08-12
cachebar CacheBar 3 1.0.2 2011-06-01 2011-11-18 2012-04-23
cachebar cachebar 2 1.1.1 2012-04-23 2014-10-24 2012-04-23
cartesian Cartesian 6 0.4.2 2009-07-25 2011-01-12 2011-01-04
cartesian cartesian 10 0.6.7 2011-01-04 2013-01-06 2011-01-04
classiccms classicCMS 5 0.2.3 2012-04-01 2012-04-01 2012-05-16
classiccms classiccms 46 0.7.5 2012-05-16 2015-09-25 2012-05-16
collegiatelink CollegiateLink 2 0.0.3 2012-11-13 2013-02-28 2013-01-25
collegiatelink collegiatelink 7 0.3.0 2013-01-25 2014-02-02 2013-01-25
commandline CommandLine 3 0.6.0 2009-08-12 2009-08-12 2009-08-12
commandline commandline 2 0.7.9 2009-07-25 2009-07-25 2009-08-12
crudtree CRUDtree 2 0.1.1 2010-01-25 2010-01-30 2010-02-15
crudtree crudtree 1 0.1.2 2010-02-15 2010-02-15 2010-02-15
csi CSI 1 0.0.2 2013-02-16 2013-02-16 2013-02-16
csi csi 3 0.3.3 2013-02-16 2015-06-24 2013-02-16
currency_converter_cis currency_converter_CIS 2 0.0.1 2012-10-25 2012-10-25 2013-10-04
currency_converter_cis currency_converter_cis 1 0.0.6 2013-10-04 2013-10-04 2013-10-04
cyrillizer Cyrillizer 1 0.1.1 2009-10-26 2009-10-26 2009-11-08
cyrillizer cyrillizer 9 0.3.2 2009-11-08 2022-11-15 2009-11-08
depgraph DepGraph 3 0.8.0 2009-07-25 2009-07-25 2012-07-05
depgraph depgraph 1 0.11.0 2012-07-05 2012-07-05 2012-07-05
devops Devops 5 0.0.7 2013-03-25 2013-05-03 2013-05-06
devops devops 8 0.1.6 2013-05-06 2015-08-27 2013-05-06
dnsruby Dnsruby 3 0.5.0 2009-08-12 2009-08-12 2009-08-12
dnsruby dnsruby 58 1.74.0 2009-07-25 2026-07-04 2009-08-12
domainr Domainr 1 1.1 2012-05-19 2012-05-19 2012-05-19
domainr domainr 4 1.0.0 2010-07-07 2016-02-29 2012-05-19
dtr DTR 2 0.0.1 2009-08-16 2009-08-17 2009-08-16
dtr dtr 4 1.1.0 2009-07-25 2009-07-25 2009-08-16
dynamoid Dynamoid 1 0.0.1 2012-02-24 2012-02-24 2012-02-26
dynamoid dynamoid 49 3.13.1 2012-02-26 2026-05-05 2012-02-26
ec2ssh EC2ssh 4 0.1.6 2011-09-21 2011-09-21 2011-09-21
ec2ssh ec2ssh 24 5.1.0 2010-12-05 2022-04-28 2011-09-21
eric Eric 1 0.0.1 2013-02-03 2013-02-03 2013-02-03
eric eric 3 0.0.3 2012-12-06 2013-08-31 2013-02-03
etch Etch 3 0.1.3 2009-09-08 2009-09-08 2009-11-14
etch etch 11 5.0.0 2009-11-14 2014-10-07 2009-11-14
etl ETL 5 1.1.1 2012-12-27 2013-06-13 2012-12-27
etl etl 1 0.9.5.rc1 2011-10-02 2011-10-02 2012-12-27
fakeweb FakeWeb 4 1.0.0 2009-08-18 2009-08-18 2009-08-18
fakeweb fakeweb 14 1.3.0 2009-07-25 2010-08-23 2009-08-18
farsifu FarsiFu 1 0.1.0 2009-07-25 2009-07-25 2010-03-03
farsifu farsifu 8 0.5.1 2010-03-03 2015-09-03 2010-03-03
fboauth2 Fboauth2 1 0.1.0 2011-07-05 2011-07-05 2011-07-06
fboauth2 fboauth2 5 0.1.4 2011-07-06 2011-07-07 2011-07-06
firstgem firstGem 3 0.0.3 2012-11-17 2012-11-17 2012-11-17
firstgem firstgem 1 0.0.1 2011-08-09 2011-08-09 2012-11-17
flashatron Flashatron 1 0.1.0 2010-02-27 2010-02-27 2010-02-27
flashatron flashatron 8 0.4.3 2010-02-27 2010-08-06 2010-02-27
flipper Flipper 2 1.0 2009-07-25 2009-07-25 2012-08-03
flipper flipper 109 1.4.2 2012-08-03 2026-05-11 2012-08-03
freeswitcher FreeSWITCHeR 1 0.0.8 2009-08-18 2009-08-18 2009-08-18
freeswitcher freeswitcher 53 0.8.0 2009-07-25 2012-11-26 2009-08-18
funit fUnit 7 0.0.1 2009-08-18 2009-08-18 2009-08-18
funit funit 13 0.12.4 2009-07-25 2016-02-11 2009-08-18
gdata GData 3 0.0.4 2009-07-25 2009-07-25 2009-08-18
gdata gdata 6 1.1.2 2009-08-18 2011-03-28 2009-08-18
gemfiler Gemfiler 1 0.0.1 2012-08-22 2012-08-22 2012-08-22
gemfiler gemfiler 9 0.1.7 2012-08-22 2015-04-01 2012-08-22
generator Generator 1 0.0.2 2013-05-07 2013-05-07 2013-05-07
generator generator 1 0.0.1 2012-05-03 2012-05-03 2013-05-07
georuby GeoRuby 20 0.0.3 2009-07-25 2009-07-25 2011-06-30
georuby georuby 12 2.5.2 2011-06-30 2015-02-06 2011-06-30
gitgo GitGo 1 0.0.1 2012-11-16 2012-11-16 2012-11-16
gitgo gitgo 1 0.3.3 2010-08-14 2010-08-14 2012-11-16
gitspotter Gitspotter 1 0.0.1 2013-01-11 2013-01-11 2013-01-11
gitspotter gitspotter 2 0.0.3 2013-01-11 2013-01-11 2013-01-11
gooby Gooby 2 0.9.0 2009-08-18 2009-08-18 2009-08-18
gooby gooby 7 1.0.0 2009-07-25 2009-07-25 2009-08-18
googleplus GooglePlus 1 0.0.2 2011-10-25 2011-10-25 2011-10-25
googleplus googleplus 1 0.0.1 2011-09-15 2011-09-15 2011-10-25
grada GraDA 3 1.1.0 2013-06-25 2013-07-01 2013-07-02
grada grada 12 3.0.0 2013-07-02 2013-08-19 2013-07-02
harry Harry 1 0.0.1 2013-04-03 2013-04-03 2013-04-03
harry harry 1 0.0.1 2013-04-03 2013-04-03 2013-04-03
hebruby Hebruby 2 1.2.1 2009-07-25 2009-07-25 2009-09-24
hebruby hebruby 6 2.1.1 2009-09-24 2018-05-01 2009-09-24
hello Hello 1 0.0.0 2012-06-26 2012-06-26 2012-06-26
hello hello 2 0.0.1 2009-07-25 2009-07-25 2012-06-26
hellogem HelloGem 1 0.0.1 2013-01-17 2013-01-17 2013-01-17
hellogem hellogem 1 0.0.2 2011-01-10 2011-01-10 2013-01-17
impatient Impatient 1 1.0.0 2012-08-08 2012-08-08 2012-08-08
impatient impatient 2 1.1.1 2012-08-08 2012-08-16 2012-08-08
informer Informer 1 0.1.0 2009-10-29 2009-10-29 2009-10-29
informer informer 2 0.2.0 2009-10-29 2009-11-01 2009-10-29
jalalidate JalaliDate 1 0.1.0 2009-07-25 2009-07-25 2010-03-03
jalalidate jalalidate 10 0.3.6 2010-03-03 2017-11-27 2010-03-03
jazz Jazz 2 0.0.4 2011-11-10 2011-11-10 2011-11-10
jazz jazz 1 0.1.1 2010-03-02 2010-03-02 2011-11-10
jazzez Jazzez 2 0.0.1 2009-08-18 2009-08-18 2009-08-18
jazzez jazzez 1 1.1.1 2009-07-25 2009-07-25 2009-08-18
jbootstrap jBootstrap 1 0.0.1 2012-11-13 2012-11-13 2012-11-13
jbootstrap jbootstrap 8 0.0.5.1 2012-11-13 2012-11-15 2012-11-13
jruby-openssl JRuby-OpenSSL 1 0.1 2009-08-18 2009-08-18 2009-08-18
jruby-openssl jruby-openssl 95 0.16.2 2009-07-25 2026-07-20 2009-08-18
jsrender-rails jsRender-rails 4 0.9.3 2012-09-19 2012-09-19 2013-03-08
jsrender-rails jsrender-rails 5 2.0 2013-03-08 2013-06-19 2013-03-08
kanocc Kanocc 1 0.1.0 2009-07-25 2009-07-25 2009-08-18
kanocc kanocc 2 0.2.0 2009-08-18 2009-10-01 2009-08-18
krakken Krakken 1 0.1.0 2013-06-08 2013-06-08 2013-06-08
krakken krakken 1 0.1.0 2013-06-08 2013-06-08 2013-06-08
labrador Labrador 1 0.0.1 2012-07-06 2012-07-06 2012-07-06
labrador labrador 1 0.0.1 2012-07-06 2012-07-06 2012-07-06
langrove LanGrove 2 0.0.2 2012-04-21 2012-04-22 2012-04-23
langrove langrove 10 0.0.5.4 2012-04-23 2012-08-09 2012-04-23
ledelay LeDelay 1 0.2 2011-06-30 2011-06-30 2011-06-30
ledelay leDelay 1 0.2 2011-06-30 2011-06-30 2011-06-30
legit-the-git Legit-the-Git 3 0.0.3 2011-01-10 2011-01-12 2011-02-07
legit-the-git legit-the-git 4 0.0.7 2011-02-07 2011-03-31 2011-02-07
letter Letter 1 0.0.1 2012-01-17 2012-01-17 2012-11-14
letter letter 1 0.0.1 2012-11-14 2012-11-14 2012-11-14
linguistics Linguistics 2 1.0.5 2009-07-25 2009-07-25 2009-11-18
linguistics linguistics 8 2.1.0 2009-11-18 2015-09-16 2009-11-18
locksmith Locksmith 2 0.1.1 2012-07-03 2012-07-03 2012-07-03
locksmith locksmith 4 0.1.1 2011-02-22 2011-05-08 2012-07-03
macaddr MACAddr 1 0.3.0 2011-05-24 2011-05-24 2011-05-24
macaddr macaddr 16 1.7.2 2009-07-25 2019-06-05 2011-05-24
magic Magic 3 1.1.2 2011-04-01 2013-03-05 2011-04-01
magic magic 15 0.2.9 2010-01-10 2015-04-16 2011-04-01
markaby Markaby 2 0.6.5 2009-10-10 2009-10-13 2009-10-10
markaby markaby 19 0.9.4 2009-07-25 2024-06-14 2009-10-10
medea Medea 2 0.2.27 2011-01-04 2011-01-04 2011-01-04
medea medea 54 0.7.2 2010-12-21 2011-03-29 2011-01-04
memoize Memoize 1 0.1.0 2009-08-18 2009-08-18 2009-08-18
memoize memoize 8 1.3.1 2009-07-25 2009-08-09 2009-08-18
midna Midna 2 0.9.0 2012-05-31 2012-06-05 2012-05-31
midna midna 6 0.5.0 2010-08-03 2010-09-22 2012-05-31
missionhub MissionHub 13 2.1.2 2012-10-02 2013-02-19 2012-10-10
missionhub Missionhub 1 1.0.2 2012-10-10 2012-10-10 2012-10-10
moby Moby 2 0.5.1 2013-02-13 2013-02-13 2013-02-13
moby moby 10 1.2.0 2012-02-01 2012-02-03 2013-02-13
modelmaker ModelMaker 3 0.1.2 2012-10-16 2012-10-16 2012-10-16
modelmaker modelmaker 2 0.2.0 2012-10-16 2012-10-25 2012-10-16
mp4info MP4Info 6 0.3.3 2009-07-25 2009-07-25 2010-03-15
mp4info mp4info 1 1.7.3 2010-03-15 2010-03-15 2010-03-15
nabaztag Nabaztag 2 0.3.0 2009-07-25 2009-07-25 2010-02-12
nabaztag nabaztag 2 0.2.3 2010-02-12 2010-02-12 2010-02-12
nilsimsa Nilsimsa 1 1.0.0 2009-08-18 2009-08-18 2009-08-18
nilsimsa nilsimsa 2 1.1.1 2009-07-25 2012-06-21 2009-08-18
nodevent NoDevent 1 0.0.2 2012-05-07 2012-05-07 2012-05-07
nodevent nodevent 21 3.2.0 2012-05-07 2013-02-13 2012-05-07
o_o O_O 1 1.0.0 2012-05-11 2012-05-11 2012-05-11
o_o O_o 3 1.0.1 2012-05-11 2018-05-11 2012-05-11
oasis Oasis 1 0.1.1 2009-12-20 2009-12-20 2009-12-20
oasis oasis 12 0.5.4 2009-12-20 2010-02-12 2009-12-20
onion Onion 2 0.0.2 2009-07-25 2009-07-25 2010-10-02
onion onion 4 0.1.3 2010-10-02 2011-04-10 2010-10-02
onlooker Onlooker 1 0.1.1 2010-01-24 2010-01-24 2010-01-24
onlooker onlooker 1 0.1.1 2010-01-24 2010-01-24 2010-01-24
opal Opal 1 0.2.5.0 2009-07-25 2009-07-25 2010-01-22
opal opal 137 1.8.4.rc1 2010-01-22 2026-05-01 2010-01-22
pablo Pablo 3 0.0.1 2009-08-18 2009-08-18 2009-08-18
pablo pablo 1 1.0.3 2009-07-25 2009-07-25 2009-08-18
pbyf PBYF 1 0.0.1 2012-08-14 2012-08-14 2012-08-23
pbyf pbyf 3 0.0.4 2012-08-23 2012-08-26 2012-08-23
pd_x12 PD_x12 4 1.3.12 2012-12-01 2013-01-27 2013-03-19
pd_x12 pd_x12 13 1.5.4 2013-03-19 2016-02-25 2013-03-19
pickaxe Pickaxe 20 0.7.1 2010-11-16 2010-12-13 2013-07-11
pickaxe pickaxe 1 0.8.1 2013-07-11 2013-07-11 2013-07-11
piggy Piggy 7 0.5.1.3 2009-07-25 2011-01-17 2010-09-07
piggy piggy 2 0.1.0 2010-09-07 2010-09-09 2010-09-07
platform Platform 5 0.4.2 2009-07-25 2018-12-14 2011-10-13
platform platform 4 3.1.4 2011-10-13 2012-04-14 2011-10-13
polar Polar 2 0.2.1 2010-07-29 2010-07-29 2010-07-29
polar polar 1 0.2.1 2010-07-29 2010-07-29 2010-07-29
popen4 POpen4 3 0.1.4 2009-11-13 2009-11-17 2009-11-13
popen4 popen4 1 0.1.2 2009-08-18 2009-08-18 2009-11-13
promotion ProMotion 63 3.0.0 2012-08-30 2020-03-05 2012-09-19
promotion promotion 28 2.1.3 2012-09-19 2013-11-22 2012-09-19
protoncouch ProtonCouch 1 1.0 2011-02-02 2011-02-02 2011-02-02
protoncouch protoncouch 1 1.0 2011-02-02 2011-02-02 2011-02-02
puke Puke 1 0.0.2 2011-10-15 2011-10-15 2011-10-15
puke puke 2 0.0.2 2011-01-22 2011-10-15 2011-10-15
pulse Pulse 16 1.3.3 2010-11-25 2010-12-29 2010-11-25
pulse pulse 2 0.2.0 2009-07-25 2012-01-10 2010-11-25
pushit PushIt 4 1.0.4 2013-06-13 2013-09-12 2013-06-13
pushit pushit 1 0.0.1 2011-04-20 2011-04-20 2013-06-13
q Q 1 0.0.1 2010-08-08 2010-08-08 2011-07-06
q q 3 0.0.1 2011-07-06 2013-12-02 2011-07-06
rack Rack 4 2.0.0 2010-03-26 2010-04-01 2010-03-26
rack rack 178 3.2.6 2009-07-25 2026-04-01 2010-03-26
rangehash RangeHash 1 0.0.6 2011-08-14 2011-08-14 2011-08-14
rangehash rangehash 7 0.0.7 2010-12-29 2011-09-29 2011-08-14
realiaser Realiaser 1 0.0.1 2012-11-30 2012-11-30 2012-11-30
realiaser realiaser 1 0.0.1 2012-11-30 2012-11-30 2012-11-30
recalls Recalls 1 0.1 2011-05-19 2011-05-19 2011-05-19
recalls recalls 1 0.1 2011-05-19 2011-05-19 2011-05-19
redir Redir 1 0.0.4 2012-10-24 2012-10-24 2012-10-24
redir redir 3 0.0.6 2012-10-24 2012-10-29 2012-10-24
relata Relata 2 0.0.3 2010-10-05 2010-10-05 2010-10-22
relata relata 2 0.0.4 2010-10-22 2010-11-01 2010-10-22
reposh Reposh 1 0.1.5 2009-08-18 2009-08-18 2009-08-18
reposh reposh 5 0.1.10 2009-07-25 2010-12-03 2009-08-18
rmeetup rMeetup 3 2.1.0 2011-01-21 2015-01-21 2011-01-21
rmeetup rmeetup 1 1.0.0 2009-11-01 2009-11-01 2011-01-21
roadrunner RoadRunner 3 4.0.1 2009-11-19 2010-03-12 2010-04-22
roadrunner roadrunner 2 4.0.4 2010-04-22 2010-04-29 2010-04-22
robin Robin 1 0.0.3 2013-02-18 2013-02-18 2013-02-18
robin robin 1 0.0.4 2013-02-18 2013-02-18 2013-02-18
ron Ron 3 0.1.2 2009-07-25 2010-01-03 2009-11-05
ron ron 4 0.4 2009-11-05 2010-03-08 2009-11-05
roxml ROXML 1 3.0.0 2009-10-17 2009-10-17 2009-10-17
roxml roxml 28 4.2.0 2009-07-25 2021-09-09 2009-10-17
rsokoban RSokoban 5 0.76.1 2011-01-21 2011-04-02 2012-05-18
rsokoban rsokoban 3 1.1.0 2012-05-18 2013-01-17 2012-05-18
rspec-steps RSpec-Steps 1 0.0.1 2011-04-23 2011-04-23 2011-07-26
rspec-steps rspec-steps 26 2.1.1 2011-07-26 2015-12-22 2011-07-26
rsruby RSRuby 1 0.4.0 2009-08-18 2009-08-18 2009-08-18
rsruby rsruby 8 0.5.1.1 2009-07-25 2009-07-25 2009-08-18
rtalib RTALib 2 0.0.2.pre 2012-12-27 2012-12-27 2012-12-28
rtalib rtalib 1 0.0.1 2012-12-28 2012-12-28 2012-12-28
rtfmd RTFMd 16 0.10301.17 2011-12-17 2011-12-19 2011-12-28
rtfmd rtfmd 4 0.10301.20 2011-12-28 2012-03-14 2011-12-28
rubernate Rubernate 8 0.1.7 2009-07-25 2009-07-25 2011-08-04
rubernate rubernate 1 0.0.2 2011-08-04 2011-08-04 2011-08-04
ruby-hl7 Ruby-HL7 1 0.1.23 2009-08-18 2009-08-18 2009-08-18
ruby-hl7 ruby-hl7 19 1.4.0 2009-07-25 2025-01-07 2009-08-18
rubyapp RubyApp 226 0.7.16 2011-10-27 2013-04-03 2011-10-27
rubyapp rubyapp 2 0.1.2 2010-06-06 2010-06-07 2011-10-27
rubysh RubySH 1 1.0 2012-05-07 2012-05-07 2012-09-12
rubysh rubysh 19 0.3.0 2012-09-12 2014-05-25 2012-09-12
rug Rug 1 0.0.2 2010-11-21 2010-11-21 2011-09-22
rug rug 1 0.0.1 2011-09-22 2011-09-22 2011-09-22
rvm rVM 15 0.0.1 2009-07-25 2009-07-25 2009-08-26
rvm rvm 237 1.11.3.9 2009-08-26 2014-01-28 2009-08-26
sac Sac 1 0.0.1 2009-07-25 2009-07-25 2009-08-18
sac sac 1 0.0.1 2009-08-18 2009-08-18 2009-08-18
saikuro Saikuro 1 1.1.0 2009-07-25 2009-07-25 2011-09-27
saikuro saikuro 3 1.2.1 2011-09-27 2011-09-27 2011-09-27
samplegem SampleGem 1 1.0.1 2013-02-08 2013-02-08 2013-04-25
samplegem samplegem 1 0.0.1 2013-04-25 2013-04-25 2013-04-25
sandrbox Sandrbox 1 0.0.1 2012-03-30 2012-03-30 2012-03-30
sandrbox sandrbox 2 0.1.0 2012-03-30 2012-03-30 2012-03-30
savage SAVAGE 1 0.1.0 2013-06-18 2013-06-18 2013-06-18
savage savage 16 1.2.0 2010-05-02 2013-01-10 2013-06-18
selenium Selenium 8 1.0.4 2009-07-25 2009-07-25 2010-11-08
selenium selenium 19 0.2.11 2010-11-08 2013-11-23 2010-11-08
selenium-client Selenium-Client 1 0.1 2009-08-18 2009-08-18 2009-08-18
selenium-client selenium-client 20 1.2.18 2009-07-25 2010-01-12 2009-08-18
sgfparser SgfParser 7 3.0.1 2010-01-05 2016-04-25 2010-10-22
sgfparser sgfparser 1 0.0.1 2010-10-22 2010-10-22 2010-10-22
shorty Shorty 5 0.3.1 2012-04-20 2012-04-27 2012-04-20
shorty shorty 2 0.1.2 2009-10-10 2009-11-23 2012-04-20
shunt Shunt 2 0.2 2009-07-25 2009-07-25 2011-05-17
shunt shunt 1 0.0.1 2011-05-17 2011-05-17 2011-05-17
si SI 1 0.0.1 2009-07-25 2009-07-25 2012-09-11
si si 7 0.3.0 2012-09-11 2025-06-27 2012-09-11
simplemailer simpleMailer 5 0.1.9 2009-08-18 2012-06-06 2013-05-27
simplemailer simplemailer 1 1.0.0 2013-05-27 2013-05-27 2013-05-27
siriproxy-samsungremote SiriProxy-SamsungRemote 1 0.1.0 2011-12-06 2011-12-06 2011-12-06
siriproxy-samsungremote siriproxy-samsungremote 4 0.1.3 2011-12-06 2011-12-07 2011-12-06
sitemap SiteMap 1 0.0.0 2010-11-03 2010-11-03 2011-09-03
sitemap sitemap 10 0.3.3 2011-09-03 2012-09-18 2011-09-03
skyper SkypeR 8 0.0.8 2009-07-25 2009-07-25 2012-05-07
skyper skyper 1 0.1.0 2012-05-07 2012-05-07 2012-05-07
sms SMS 2 0.0.2 2012-02-16 2012-02-16 2012-02-16
sms sms 1 0.1 2011-08-04 2011-08-04 2012-02-16
soroban Soroban 1 0.1.0 2012-04-23 2012-04-23 2012-04-23
soroban soroban 13 0.10.0 2012-04-23 2014-10-24 2012-04-23
splice Splice 1 0.0.0 2009-09-11 2009-09-11 2012-07-03
splice splice 4 0.5 2012-07-03 2012-08-22 2012-07-03
spy-vs-spy Spy-Vs-Spy 1 0.0.5 2009-11-24 2009-11-24 2009-11-24
spy-vs-spy spy-vs-spy 7 0.0.8 2009-11-19 2009-11-25 2009-11-24
sqs SQS 8 0.1.4 2009-07-25 2009-07-25 2009-10-09
sqs sqs 2 0.1.2 2009-10-09 2009-10-09 2009-10-09
stencil Stencil 2 0.1.1 2009-12-27 2010-01-04 2009-12-27
stencil stencil 7 0.1.8 2009-11-06 2013-11-11 2009-12-27
stompmq StompMq 4 0.1 2009-08-18 2009-08-18 2009-08-18
stompmq stompmq 1 0.5 2009-07-25 2009-07-25 2009-08-18
stormrets StormRETS 4 0.4.0 2012-02-27 2012-06-30 2012-07-01
stormrets stormrets 1 0.5.0 2012-07-01 2012-07-01 2012-07-01
stream Stream 39 0.2.3.1 2011-06-23 2012-09-21 2011-06-23
stream stream 6 0.5.6 2009-11-24 2026-05-10 2011-06-23
support SUPPORT 1 0.0.1pre 2013-03-11 2013-03-11 2013-03-11
support support 2 0.18 2009-07-25 2009-08-20 2013-03-11
surgicalstrike SurgicalStrike 1 0.0.1 2012-04-16 2012-04-16 2012-04-16
surgicalstrike surgicalstrike 2 0.0.3 2012-04-16 2012-04-16 2012-04-16
svy21 SVY21 1 1.0.0 2013-04-07 2013-04-07 2013-04-08
svy21 svy21 1 1.0.1 2013-04-08 2013-04-08 2013-04-08
sysvipc SysVIPC 8 0.10.0 2009-08-05 2016-08-10 2009-09-26
sysvipc sysvipc 1 0.1.0 2009-09-26 2009-09-26 2009-09-26
test Test 1 0.0.0 2013-03-28 2013-03-28 2013-03-28
test test 4 1.0.0 2011-08-11 2012-12-24 2013-03-28
testgem TestGem 1 1.0.0 2013-02-08 2013-02-08 2013-02-08
testgem testgem 1 0.1.0 2011-08-16 2011-08-16 2013-02-08
text Text 5 1.1.3 2009-07-25 2012-06-07 2009-10-12
text text 15 1.3.1 2009-10-12 2015-04-13 2009-10-12
tictactoe TicTacToe 1 0.0.1 2013-07-03 2013-07-03 2013-07-03
tictactoe tictactoe 4 0.0.4 2012-10-20 2012-10-25 2013-07-03
todo Todo 2 0.2 2012-09-01 2012-09-01 2012-09-01
todo todo 4 0.2.0 2009-07-25 2014-07-21 2012-09-01
tracker Tracker 3 1.0.0 2009-07-25 2009-07-25 2012-12-27
tracker tracker 1 0.0.10 2012-12-27 2012-12-27 2012-12-27
tyler TYLER 1 0.0.2 2013-02-21 2013-02-21 2013-02-21
tyler tyler 2 0.1.0 2010-09-10 2010-09-17 2013-02-21
udjrb UDJrb 2 0.0.2 2011-05-13 2011-05-13 2011-05-13
udjrb udjrb 1 0.0.3 2011-05-13 2011-05-13 2011-05-13
urbanesia Urbanesia 1 0.0.1 2012-12-09 2012-12-09 2012-12-09
urbanesia urbanesia 7 0.0.1.7 2012-12-09 2012-12-09 2012-12-09
usage Usage 2 0.0.1 2009-08-18 2009-08-18 2009-08-18
usage usage 2 0.0.4 2009-07-25 2009-07-25 2009-08-18
valuable Valuable 1 0.8 2009-12-10 2009-12-10 2009-12-10
valuable valuable 20 0.9.14 2009-08-05 2017-10-17 2009-12-10
vimmate VimMate 5 0.6.6 2009-07-25 2009-07-25 2009-11-14
vimmate vimmate 4 0.9.2 2009-11-14 2011-06-21 2009-11-14
walt Walt 2 0.1.1 2012-05-15 2012-05-15 2013-01-05
walt walt 2 0.1.2 2013-01-05 2013-05-20 2013-01-05
websocket WEBSocket 5 0.1.1 2013-01-09 2013-02-12 2013-01-09
websocket websocket 24 1.2.11 2012-11-18 2024-07-08 2013-01-09
writeexcel WriteExcel 1 0.2.0 2010-01-21 2010-01-21 2010-01-21
writeexcel writeexcel 42 1.0.9 2009-07-25 2024-01-23 2010-01-21
x12 X12 3 1.1.0 2009-07-25 2009-07-25 2009-08-18
x12 x12 1 0.1.0 2009-08-18 2009-08-18 2009-08-18
xmlcanonicalizer XMLCanonicalizer 2 1.0.1 2009-07-25 2009-07-25 2010-09-12
xmlcanonicalizer xmlcanonicalizer 4 0.1.2 2010-09-12 2012-07-05 2010-09-12
xray XRay 3 1.0 2009-08-18 2009-08-18 2009-08-18
xray xray 1 1.1 2009-07-25 2009-07-25 2009-08-18
zliby Zliby 1 0.0.5 2009-07-25 2009-07-25 2009-08-18
zliby zliby 1 0.0.5 2009-08-18 2009-08-18 2009-08-18
zurb-foundation ZURB-foundation 17 2.2.1.4 2011-12-18 2012-06-07 2011-12-18
zurb-foundation zurb-foundation 67 4.3.2 2011-10-15 2013-09-23 2011-12-18
# frozen_string_literal: true
module RubyResearch
module Reports
# Lists every set of gems on RubyGems.org whose names differ only in
# letter case (`Abundance` / `abundance`).
#
# These are distinct gems sharing one name under case folding, which
# collides on case-insensitive filesystems — macOS (APFS) and Windows
# — for anything that stores a gem per file. This harness hit exactly
# that bug in its own cache; see METHODOLOGY.md "Cache keys".
#
# Reads only the cached compact index, so it needs no network. The
# release dates come from the index too, which makes it possible to
# tell whether the collisions are a historical artifact or something
# still being created.
class CaseCollisions
def initialize(client: CompactIndexClient.new, reports_dir: REPORTS_DIR)
@client = client
@reports_dir = reports_dir
end
def run
groups = collision_groups
errors = []
detailed = groups.filter_map do |folded, names|
variants = names.sort.map { detail_for(it) }
{ folded: folded, collision_created: collision_created(variants), variants: variants }
rescue StandardError => e
errors << { gems: names, error: e.message }
nil
end
detailed.sort_by! { it[:folded] }
last_releases = detailed.flat_map { |group| group[:variants].filter_map { it[:last_release] } }
data = {
corpus_size: @client.names.size,
errors: errors,
group_count: detailed.size,
gems_involved: detailed.sum { it[:variants].size },
group_size_histogram: detailed.map { it[:variants].size }.tally.sort.to_h,
newest_release_among_collisions: last_releases.max,
collision_created_year_histogram: detailed.filter_map { it[:collision_created]&.slice(0, 4) }.tally.sort.to_h,
newest_collision_created: detailed.filter_map { it[:collision_created] }.max,
groups_with_a_release_since: release_recency(detailed),
groups: detailed
}
writer = ReportWriter.new(name: 'case_collisions', reports_dir: @reports_dir)
writer.write(data: data, markdown: markdown_for(data))
end
private
def collision_groups
@client.names.group_by(&:downcase).select { |_folded, names| names.size > 1 }
end
# A collision starts existing when the second gem of the pair is
# first published — that, not the latest release, says whether the
# registry still lets new ones be created.
def collision_created(variants)
firsts = variants.filter_map { it[:first_release] }.sort
firsts.size < 2 ? nil : firsts.last
end
def detail_for(name)
versions = @client.versions_of(name)
{
name: name,
version_count: versions.size,
latest_version: versions.last&.dig(:version),
first_release: versions.first&.dig(:created_at)&.slice(0, 10),
last_release: versions.last&.dig(:created_at)&.slice(0, 10)
}
end
# How many groups have any variant released in or after each year —
# shows whether collisions are historical or still being minted.
def release_recency(groups)
years = groups.filter_map do |group|
group[:variants].filter_map { it[:last_release]&.slice(0, 4) }.max
end
%w[2015 2018 2020 2022 2024 2026].to_h do |cutoff|
[cutoff, years.count { it >= cutoff }]
end
end
def markdown_for(data)
lines = []
lines << '# Gems whose names differ only in case'
lines << ''
lines << "Report generated at #{Time.now}."
lines << ''
lines << "**#{data[:group_count]}** name collisions covering **#{data[:gems_involved]}** distinct gems, out of #{data[:corpus_size]} on RubyGems.org."
lines << ''
lines << 'These are separate gems that fold to the same name, so any tool storing one gem per file'
lines << 'on a case-insensitive filesystem (macOS APFS, Windows) will have them overwrite each other.'
lines << ''
lines << "Newest release among any colliding gem: **#{data[:newest_release_among_collisions]}** — several of these gems are still actively maintained."
lines << ''
lines << '## When each collision was created'
lines << ''
lines << 'Dated by the first release of the *second* gem in each pair, i.e. when the two names first'
lines << 'coexisted. RubyGems.org appears to have added case-insensitive name validation after this:'
lines << "the most recent collision was created **#{data[:newest_collision_created]}**, and none since."
lines << 'So this is legacy data in the index rather than an open validation hole.'
lines << ''
lines << 'All collisions are only pairs, no triples or more.(`FooBarBaz` and `foobarbaz`. No `FooBarBaz` and `foobarbaz` AND ALSO `fooBARbaz`)'
lines << ''
lines << '| Year created | Collisions |'
lines << '| ------------ | ---------- |'
data[:collision_created_year_histogram].each { |year, count| lines << "| #{year} | #{count} |" }
lines << ''
lines << '## Groups with a release on or after'
lines << ''
lines << '| Year | Groups |'
lines << '| ---- | ------ |'
data[:groups_with_a_release_since].each { |year, count| lines << "| #{year} | #{count} |" }
lines << ''
lines << '## Every collision'
lines << ''
lines << '| Folded name | Gem | Versions | Latest | First release | Last release | Collision since |'
lines << '| ----------- | --- | -------- | ------ | ------------- | ------------ | --------------- |'
data[:groups].each do |group|
group[:variants].each do |variant|
line = [
"| `#{group[:folded]}`",
"| `#{variant[:name]}`",
"| `#{variant[:version_count]}`",
"| `#{variant[:latest_version]}`",
"| `#{variant[:first_release]}`",
"| `#{variant[:last_release]}`",
"| `#{group[:collision_created]}` |"
].join
lines << line
end
end
lines << ''
lines << "Errors: #{data[:errors].size}" unless data[:errors].size.zero?
lines.join("\n")
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment