For major projects it may work, but sometimes you're updating an old library to work with a newer version of a platform and get dead silence. It doesn't do anyone any good.
But at least with github/bitbucket, most of this friction is reduced to a few simple clicks. It's certainly no worse.
If only things were that simple. A proper maintainer would have to:
a) decide whether what this patch claims to do with the code moves the code in a direction where the maintainers want it to move.
b) review the code for quality, security concerns and outright backdoors.
c) possibly: compare it to a zillion patches that (more or less) claim to do the same.
d) assuming the patch is perfect: check with collisions on other pending patches, recently committed changes, etc.
I do not know about this project, and have no real expertise as a maintainer, but I am fairly sure it is not "just laziness". If it were, all projects would have an email address that blindly applies each patch sent to it to the code base.
In my example case, it certainly is. There certainly aren't zillions of patches. The maintainers are just not "maintaining". Plain and simple.
Consider me skeptical that there will be any real improvement from this.
(I am not claiming forks are bad, only that it solves a different problem than support hell)
For example, my company is working on a huge web project for IBM right now, it is a Javascript based front end, in which we use Dojo as the toolkit. It would be safe to say that there are more lines of Javascript code than Gmail has in this project and yet our Monkey Patch files probably consist of less than 20 lines of code. It would be overkill to maintain a branch of Dojo for those 20 lines of code, especially given the fact that most of the patches are to customize Dojo to do things the way we want it too and not true bugs. So they have no hope of making it back into Dojo proper. With Monkey Patching we just maintain our own Monkey Patch files along with our code base. We just upgraded the project from 1.5 to 1.6 which if we would have been maintaining our own version, it would not have been a 30 minute process.
That being said, if a developer is Monkey Patching his own or internal code, it should serve as a red flag that they may be doing something wrong.
In said project we had a number of modifications to libraries to support some additional desired functionality. The developers at the time simply forked the library and wrote patches on top of the mainline branch. We found this significantly impeded our ability to upgrade, or take advantage of changes, down the line, as well as to track upstream's HEAD. When one forks, branches, and then patches on the branch, these problems are easily skirted. In addition, it's easy to submit your patches for integration into upstream.
In the end the gain is flexibility. One cannot discount the value of flexibility.
Out of the frying pan, into the fire
seems perfectly applicable. Although it originally implies that matters get worse, it's colloquially used to indicate things don't get any better.Especially if you consider that part of the problem is that something won't work but it may take hours to understand it's because the semantics of Enumerable#group_by in library X are not the same as the ones defined in library Y.
- Publishing a new solution and making it available.
The packaging is not ideal, as setup and configuration of the lib+patch will not be as simple as pulling a modified lib. But think what you would have to do to incorporate 5 separate patches to a given library. It could very well be simpler to run 5 monkey patches than to fork a project and do 5 merges.
Isn't just adding members like a "type extension" that statically typed languages can safely do? (Not flaming, just trying to understand the differences.)
Pull requests, if done right, are the real way to go. If the pull request isn't accepted (but the maintainer is an active one), maybe you should ask yourself why you need to implement this change in the first place. (Or why you need to implement it this way.)
That said, refinements (aka, monkey-patching without consequences) should show up soon and can solve this problem for anyone who upgrades to Ruby 2.
But you should make every effort with your fork to adhere to the project's standards and get your fixes merged back in so the entire ecosystem can benefit.
Get off the custom gem as soon as possible.