-
-
Notifications
You must be signed in to change notification settings - Fork 282
Description
Summary
I would like to achieve the following 2 things for RSpec/FilePath.
I am willing to implement the solution when we reach an agreement on this issue.
Avoid repetitive CustomTransform definitions for single inflection.
When using ActiveSupport::Inflector, we have to write only 1 definition for 1 word with special inflection. On the other hand, when using rubocop-rspec, we have to define multiple definitions (all the composite words derived from a special word). This makes development a little bit less productive.
For example, let's assume that we use a special word like PvP in a project.
When using ActiveSupport::Inflector, all we have to do is write a single rule on PvP.
ActiveSupport::Inflector.inflections(:en) do |inflect|
inflect.acronym 'PvP'
endWhen we use the current CustomTransform, we have to define all the transforms as follows.
RSpec/FilePath:
CustomTransform:
PvP: pvp
SyncPvP: sync_pvp
AsyncPvP: async_pvp
PvPOverPvP: pvp_over_pvp
PvPsController: pvps_controllerThis is mainly because the exact-match substitution is handled before snake casing.
I would like to let the following config just work as ActiveSupport::Inflector config does.
RSpec/FilePath:
CustomTransform:
PvP: pvpShare the same settings as ActiveSupport::Inflector has
I am not so inclined to achieve this as the first one, but, hopefully, I would like to share the same config as we have in Rails application. This motivation is not applicable to non-Rails user. Therefore, I would like to use less-invasive way to achieve this.
In our project, we are using require directive in config YAML to require config/initializers/inflections.rb, where ActiveSupport::Inflector config exists, but there may be a more sophisticated intuitive way.
How to solve this issue
IMHO, I believe that ActiveSupport::Inflector, which is famous for its sophisticated string handling, can solve this issue. Since this idea has both pros and cons, I have set up this issue.
https://api.rubyonrails.org/classes/ActiveSupport/Inflector.html
If RuboCop policy prioritize less dependencies over reinventing the wheel, we can just partially import the code from ActiveSupport::Inflector
Pros and Cons
- Pros
- Avoiding reinventing the wheel on string inflections.
- Reduced code complexity on current and future code.
- Cons
- Breaking backward compatibilities a little.
- Increased dependencies of
RuboCop::RSpeconActiveSupport::Inflector.
Other Information
I made up a gem rubocop-inflector to solve this issue. However, since the gem touch the internal method of rubocop-rspec, later I have found out it is fragile and not so a recommended way to solve the issue. Although it is very thin and comparatively easy to maintain.