dry-inflector 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +26 -11
- data/LICENSE +20 -0
- data/README.md +16 -92
- data/dry-inflector.gemspec +19 -19
- data/lib/dry-inflector.rb +3 -1
- data/lib/dry/inflector.rb +10 -10
- data/lib/dry/inflector/acronyms.rb +1 -1
- data/lib/dry/inflector/inflections.rb +18 -7
- data/lib/dry/inflector/inflections/defaults.rb +13 -9
- data/lib/dry/inflector/version.rb +1 -1
- metadata +16 -30
- data/LICENSE.md +0 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6db17e7fbcdc21a6c06f9763e9267d78045ffa2772272cd93abfc22d54ae80a2
|
4
|
+
data.tar.gz: bd47f925d3d558782192d3ce47cde9c9fb059163967a975e5d6298cd527e9912
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b97888420794db32aa69dbad0b168089a4be99d1c68f7411cefeabba1027e42d1f161147af435740e775ee6836dd5a48dad981c0f825b430c77c3e7eeade8091
|
7
|
+
data.tar.gz: bf81663b753f1e370d4c8c8b84c844de54a7fce16613e8acbc8a0dcfc7302391f8a92edd51cdfb73fd163215aec9ff65db324d28b7df479a102b3f223ac64573
|
data/CHANGELOG.md
CHANGED
@@ -1,40 +1,55 @@
|
|
1
|
-
|
1
|
+
<!--- DO NOT EDIT THIS FILE - IT'S AUTOMATICALLY GENERATED VIA DEVTOOLS --->
|
2
2
|
|
3
|
-
|
3
|
+
## unreleased
|
4
|
+
|
5
|
+
|
6
|
+
### Fixed
|
7
|
+
|
8
|
+
- Fix singularizing -us suffix (issue #33 via #38) (@cllns)
|
9
|
+
|
10
|
+
|
11
|
+
[Compare v0.2.0...master](https://github.com/dry-rb/dry-inflector/compare/v0.2.0...master)
|
12
|
+
|
13
|
+
## 0.2.0 2019-10-13
|
4
14
|
|
5
|
-
## v0.2.0 - 2019-10-13
|
6
15
|
|
7
16
|
### Added
|
8
17
|
|
9
|
-
- [Abinoam P. Marques Jr. & Andrii Savchenko] Introduced `Dry::Inflector#
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
18
|
+
- [Abinoam P. Marques Jr. & Andrii Savchenko] Introduced `Dry::Inflector#camelize_upper` and `Dry::Inflector#camelize_lower`. `Dry::Inflector#camelize` is now an alias for `Dry::Inflector#camelize_upper`.
|
19
|
+
- ```ruby
|
20
|
+
- inflector.camelize_upper("data_mapper") # => "DataMapper"
|
21
|
+
- inflector.camelize_lower("data_mapper") # => "dataMapper"
|
22
|
+
- ```
|
14
23
|
|
15
24
|
### Fixed
|
16
25
|
|
17
26
|
- [ecnal] Fixed singularization rules for words like "alias" or "status"
|
18
27
|
|
28
|
+
|
19
29
|
[Compare v0.1.2...v0.2.0](https://github.com/dry-rb/dry-inflector/compare/v0.1.2...v0.2.0)
|
20
30
|
|
21
|
-
##
|
31
|
+
## 0.1.2 2018-04-25
|
32
|
+
|
22
33
|
|
23
34
|
### Added
|
24
35
|
|
25
36
|
- [Gustavo Caso & Nikita Shilnikov] Added support for acronyms
|
26
37
|
|
38
|
+
|
27
39
|
[Compare v0.1.1...v0.1.2](https://github.com/dry-rb/dry-inflector/compare/v0.1.1...v0.1.2)
|
28
40
|
|
29
|
-
##
|
41
|
+
## 0.1.1 2017-11-18
|
42
|
+
|
30
43
|
|
31
44
|
### Fixed
|
32
45
|
|
33
46
|
- [Luca Guidi & Abinoam P. Marques Jr.] Ensure `Dry::Inflector#ordinalize` to work for all the numbers from 0 to 100
|
34
47
|
|
48
|
+
|
35
49
|
[Compare v0.1.0...v0.1.1](https://github.com/dry-rb/dry-inflector/compare/v0.1.0...v0.1.1)
|
36
50
|
|
37
|
-
##
|
51
|
+
## 0.1.0 2017-11-17
|
52
|
+
|
38
53
|
|
39
54
|
### Added
|
40
55
|
|
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2015-2021 dry-rb team
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
6
|
+
this software and associated documentation files (the "Software"), to deal in
|
7
|
+
the Software without restriction, including without limitation the rights to
|
8
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
9
|
+
the Software, and to permit persons to whom the Software is furnished to do so,
|
10
|
+
subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
17
|
+
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
18
|
+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
19
|
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
20
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
CHANGED
@@ -1,106 +1,30 @@
|
|
1
|
-
|
2
|
-
[
|
3
|
-
[
|
1
|
+
<!--- this file is synced from dry-rb/template-gem project -->
|
2
|
+
[gem]: https://rubygems.org/gems/dry-inflector
|
3
|
+
[actions]: https://github.com/dry-rb/dry-inflector/actions
|
4
|
+
[codacy]: https://www.codacy.com/gh/dry-rb/dry-inflector
|
4
5
|
[chat]: https://dry-rb.zulipchat.com
|
5
6
|
[inchpages]: http://inch-ci.org/github/dry-rb/dry-inflector
|
6
7
|
|
7
8
|
# dry-inflector [][chat]
|
8
9
|
|
9
10
|
[][gem]
|
10
|
-
[][actions]
|
12
|
+
[][codacy]
|
13
|
+
[][codacy]
|
13
14
|
[][inchpages]
|
14
15
|
|
15
|
-
|
16
|
+
## Links
|
16
17
|
|
17
|
-
|
18
|
+
* [User documentation](https://dry-rb.org/gems/dry-inflector)
|
19
|
+
* [API documentation](http://rubydoc.info/gems/dry-inflector)
|
18
20
|
|
19
|
-
|
21
|
+
## Supported Ruby versions
|
20
22
|
|
21
|
-
|
22
|
-
gem 'dry-inflector'
|
23
|
-
```
|
23
|
+
This library officially supports the following Ruby versions:
|
24
24
|
|
25
|
-
|
25
|
+
* MRI `>= 2.6.0`
|
26
|
+
* ~~jruby~~ `>= 9.3` (we are waiting for [2.6 support](https://github.com/jruby/jruby/issues/6161))
|
26
27
|
|
27
|
-
|
28
|
-
$ bundle
|
29
|
-
```
|
28
|
+
## License
|
30
29
|
|
31
|
-
|
32
|
-
|
33
|
-
```shell
|
34
|
-
$ gem install dry-inflector
|
35
|
-
```
|
36
|
-
|
37
|
-
## Usage
|
38
|
-
|
39
|
-
### Basic usage
|
40
|
-
|
41
|
-
```ruby
|
42
|
-
require "dry/inflector"
|
43
|
-
|
44
|
-
inflector = Dry::Inflector.new
|
45
|
-
|
46
|
-
inflector.pluralize("book") # => "books"
|
47
|
-
inflector.singularize("books") # => "book"
|
48
|
-
|
49
|
-
inflector.camelize("dry/inflector") # => "Dry::Inflector"
|
50
|
-
inflector.classify("books") # => "Book"
|
51
|
-
inflector.tableize("Book") # => "books"
|
52
|
-
|
53
|
-
inflector.dasherize("dry_inflector") # => "dry-inflector"
|
54
|
-
inflector.underscore("dry-inflector") # => "dry_inflector"
|
55
|
-
|
56
|
-
inflector.demodulize("Dry::Inflector") # => "Inflector"
|
57
|
-
|
58
|
-
inflector.humanize("dry_inflector") # => "Dry inflector"
|
59
|
-
inflector.humanize("author_id") # => "Author"
|
60
|
-
|
61
|
-
inflector.ordinalize(1) # => "1st"
|
62
|
-
inflector.ordinalize(2) # => "2nd"
|
63
|
-
inflector.ordinalize(3) # => "3rd"
|
64
|
-
inflector.ordinalize(10) # => "10th"
|
65
|
-
inflector.ordinalize(23) # => "23rd"
|
66
|
-
```
|
67
|
-
|
68
|
-
### Custom inflection rules
|
69
|
-
|
70
|
-
```ruby
|
71
|
-
require "dry/inflector"
|
72
|
-
|
73
|
-
inflector = Dry::Inflector.new do |inflections|
|
74
|
-
inflections.plural "virus", "viruses" # specify a rule for #pluralize
|
75
|
-
inflections.singular "thieves", "thief" # specify a rule for #singularize
|
76
|
-
inflections.uncountable "dry-inflector" # add an exception for an uncountable word
|
77
|
-
end
|
78
|
-
|
79
|
-
inflector.pluralize("virus") # => "viruses"
|
80
|
-
inflector.singularize("thieves") # => "thief"
|
81
|
-
|
82
|
-
inflector.pluralize("dry-inflector") # => "dry-inflector"
|
83
|
-
```
|
84
|
-
|
85
|
-
## Credits
|
86
|
-
|
87
|
-
This gem is the cumulative effort of the Ruby community.
|
88
|
-
It started with the extlib inflecto originated from [active_support](https://github.com/rails/rails), then dm-core inflector originated from [extlib](https://github.com/datamapper/extlib).
|
89
|
-
Later, [`inflecto`](https://github.com/mbj/inflecto) was extracted from [dm-core](https://github.com/datamapper/dm-core) as a standalone inflector.
|
90
|
-
Now, we resurrect `inflecto` and merged [`flexus`](https://github.com/Ptico/flexus), with some inflection rules from [`hanami-utils`](https://github.com/hanami/utils).
|
91
|
-
|
92
|
-
This is `dry-inflector`.
|
93
|
-
|
94
|
-
## Development
|
95
|
-
|
96
|
-
After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
97
|
-
|
98
|
-
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
99
|
-
|
100
|
-
## Contributing
|
101
|
-
|
102
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/dry-rb/dry-inflector.
|
103
|
-
|
104
|
-
## Copyright
|
105
|
-
|
106
|
-
Copyright © The Dry, Rails, Merb, Datamapper, Inflecto, Flexus, and Hanami teams - Released under the MIT License
|
30
|
+
See `LICENSE` file.
|
data/dry-inflector.gemspec
CHANGED
@@ -1,36 +1,36 @@
|
|
1
|
-
|
2
1
|
# frozen_string_literal: true
|
3
2
|
|
4
|
-
|
3
|
+
# this file is synced from dry-rb/template-gem project
|
4
|
+
|
5
|
+
lib = File.expand_path("lib", __dir__)
|
5
6
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
6
7
|
require "dry/inflector/version"
|
7
8
|
|
8
9
|
Gem::Specification.new do |spec|
|
9
10
|
spec.name = "dry-inflector"
|
10
|
-
spec.version = Dry::Inflector::VERSION
|
11
11
|
spec.authors = ["Luca Guidi", "Andrii Savchenko", "Abinoam P. Marques Jr."]
|
12
12
|
spec.email = ["me@lucaguidi.com", "andrey@aejis.eu", "abinoam@gmail.com"]
|
13
|
-
|
14
|
-
spec.summary = "DRY Inflector"
|
15
|
-
spec.description = "String inflections for dry-rb"
|
16
|
-
spec.homepage = "https://dry-rb.org"
|
17
13
|
spec.license = "MIT"
|
14
|
+
spec.version = Dry::Inflector::VERSION.dup
|
15
|
+
|
16
|
+
spec.summary = "String inflections for dry-rb"
|
17
|
+
spec.description = spec.summary
|
18
|
+
spec.homepage = "https://dry-rb.org/gems/dry-inflector"
|
19
|
+
spec.files = Dir["CHANGELOG.md", "LICENSE", "README.md", "dry-inflector.gemspec", "lib/**/*"]
|
20
|
+
spec.bindir = "bin"
|
21
|
+
spec.executables = []
|
22
|
+
spec.require_paths = ["lib"]
|
18
23
|
|
19
24
|
spec.metadata["allowed_push_host"] = "https://rubygems.org"
|
20
|
-
spec.metadata["changelog_uri"]
|
21
|
-
spec.metadata["source_code_uri"]
|
22
|
-
spec.metadata["bug_tracker_uri"]
|
25
|
+
spec.metadata["changelog_uri"] = "https://github.com/dry-rb/dry-inflector/blob/master/CHANGELOG.md"
|
26
|
+
spec.metadata["source_code_uri"] = "https://github.com/dry-rb/dry-inflector"
|
27
|
+
spec.metadata["bug_tracker_uri"] = "https://github.com/dry-rb/dry-inflector/issues"
|
23
28
|
|
24
|
-
spec.
|
25
|
-
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
26
|
-
spec.require_paths = ["lib"]
|
29
|
+
spec.required_ruby_version = ">= 2.6.0"
|
27
30
|
|
28
|
-
|
29
|
-
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
30
|
-
spec.required_ruby_version = '>= 2.4'
|
31
|
+
# to update dependencies edit project.yml
|
31
32
|
|
32
33
|
spec.add_development_dependency "bundler"
|
33
|
-
spec.add_development_dependency "rake"
|
34
|
-
spec.add_development_dependency "rspec"
|
35
|
-
spec.add_development_dependency "rubocop", "~> 0.50.0"
|
34
|
+
spec.add_development_dependency "rake"
|
35
|
+
spec.add_development_dependency "rspec"
|
36
36
|
end
|
data/lib/dry-inflector.rb
CHANGED
data/lib/dry/inflector.rb
CHANGED
@@ -67,8 +67,7 @@ module Dry
|
|
67
67
|
internal_camelize(input, true)
|
68
68
|
end
|
69
69
|
|
70
|
-
|
71
|
-
|
70
|
+
alias_method :camelize, :camelize_upper
|
72
71
|
|
73
72
|
# Find a constant with the name specified in the argument string
|
74
73
|
#
|
@@ -87,7 +86,7 @@ module Dry
|
|
87
86
|
# inflector.constantize("Module") # => Module
|
88
87
|
# inflector.constantize("Dry::Inflector") # => Dry::Inflector
|
89
88
|
def constantize(input)
|
90
|
-
Object.const_get(input)
|
89
|
+
Object.const_get(input, false)
|
91
90
|
end
|
92
91
|
|
93
92
|
# Classify a string
|
@@ -159,7 +158,7 @@ module Dry
|
|
159
158
|
match = /(?<separator>\W)/.match(result)
|
160
159
|
separator = match ? match[:separator] : DEFAULT_SEPARATOR
|
161
160
|
result.split(separator).map.with_index { |word, index|
|
162
|
-
inflections.acronyms.apply_to(word, index.zero?)
|
161
|
+
inflections.acronyms.apply_to(word, capitalize: index.zero?)
|
163
162
|
}.join(separator)
|
164
163
|
end
|
165
164
|
|
@@ -193,7 +192,7 @@ module Dry
|
|
193
192
|
# inflector.ordinalize(3) # => "3rd"
|
194
193
|
# inflector.ordinalize(10) # => "10th"
|
195
194
|
# inflector.ordinalize(23) # => "23rd"
|
196
|
-
def ordinalize(number)
|
195
|
+
def ordinalize(number)
|
197
196
|
abs_value = number.abs
|
198
197
|
|
199
198
|
if ORDINALIZE_TH.key?(abs_value % 100)
|
@@ -224,6 +223,7 @@ module Dry
|
|
224
223
|
def pluralize(input)
|
225
224
|
input = input.to_s
|
226
225
|
return input if uncountable?(input)
|
226
|
+
|
227
227
|
inflections.plurals.apply_to(input)
|
228
228
|
end
|
229
229
|
|
@@ -243,6 +243,7 @@ module Dry
|
|
243
243
|
def singularize(input)
|
244
244
|
input = input.to_s
|
245
245
|
return input if uncountable?(input)
|
246
|
+
|
246
247
|
inflections.singulars.apply_to(input)
|
247
248
|
end
|
248
249
|
|
@@ -280,7 +281,7 @@ module Dry
|
|
280
281
|
input.gsub!(inflections.acronyms.regex) do
|
281
282
|
m1 = Regexp.last_match(1)
|
282
283
|
m2 = Regexp.last_match(2)
|
283
|
-
"#{m1 ?
|
284
|
+
"#{m1 ? "_" : ""}#{m2.downcase}"
|
284
285
|
end
|
285
286
|
input.gsub!(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2')
|
286
287
|
input.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
|
@@ -305,9 +306,9 @@ module Dry
|
|
305
306
|
# @since 0.2.0
|
306
307
|
# @api public
|
307
308
|
def to_s
|
308
|
-
|
309
|
+
"#<Dry::Inflector>"
|
309
310
|
end
|
310
|
-
|
311
|
+
alias_method :inspect, :to_s
|
311
312
|
|
312
313
|
private
|
313
314
|
|
@@ -325,7 +326,7 @@ module Dry
|
|
325
326
|
# @api private
|
326
327
|
def internal_camelize(input, upper)
|
327
328
|
input = input.to_s.dup
|
328
|
-
input.sub!(/^[a-z\d]*/) { |match| inflections.acronyms.apply_to(match, upper) }
|
329
|
+
input.sub!(/^[a-z\d]*/) { |match| inflections.acronyms.apply_to(match, capitalize: upper) }
|
329
330
|
input.gsub!(%r{(?:_|(/))([a-z\d]*)}i) do
|
330
331
|
m1 = Regexp.last_match(1)
|
331
332
|
m2 = Regexp.last_match(2)
|
@@ -334,6 +335,5 @@ module Dry
|
|
334
335
|
input.gsub!("/", "::")
|
335
336
|
input
|
336
337
|
end
|
337
|
-
|
338
338
|
end
|
339
339
|
end
|
@@ -87,7 +87,9 @@ module Dry
|
|
87
87
|
#
|
88
88
|
# Specifies a new pluralization rule and its replacement.
|
89
89
|
# The rule can either be a string or a regular expression.
|
90
|
-
#
|
90
|
+
#
|
91
|
+
# The replacement should always be a string that may include
|
92
|
+
# references to the matched data from the rule.
|
91
93
|
#
|
92
94
|
# @param rule [String, Regexp] the rule
|
93
95
|
# @param replacement [String] the replacement
|
@@ -108,7 +110,9 @@ module Dry
|
|
108
110
|
#
|
109
111
|
# Specifies a new singularization rule and its replacement.
|
110
112
|
# The rule can either be a string or a regular expression.
|
111
|
-
#
|
113
|
+
#
|
114
|
+
# The replacement should always be a string that may include
|
115
|
+
# references to the matched data from the rule.
|
112
116
|
#
|
113
117
|
# @param rule [String, Regexp] the rule
|
114
118
|
# @param replacement [String] the replacement
|
@@ -127,7 +131,9 @@ module Dry
|
|
127
131
|
|
128
132
|
# Add a custom pluralization rule
|
129
133
|
#
|
130
|
-
# Specifies a new irregular that applies to both pluralization
|
134
|
+
# Specifies a new irregular that applies to both pluralization
|
135
|
+
# and singularization at the same time.
|
136
|
+
#
|
131
137
|
# This can only be used for strings, not regular expressions.
|
132
138
|
# You simply pass the irregular in singular and plural form.
|
133
139
|
#
|
@@ -194,9 +200,14 @@ module Dry
|
|
194
200
|
|
195
201
|
# Add a custom humanize rule
|
196
202
|
#
|
197
|
-
# Specifies a humanized form of a string by a regular expression rule or
|
198
|
-
#
|
199
|
-
#
|
203
|
+
# Specifies a humanized form of a string by a regular expression rule or
|
204
|
+
# by a string mapping.
|
205
|
+
#
|
206
|
+
# When using a regular expression based replacement, the normal humanize
|
207
|
+
# formatting is called after the replacement.
|
208
|
+
#
|
209
|
+
# When a string is used, the human form should be specified as desired
|
210
|
+
# (example: `"The name"`, not `"the_name"`)
|
200
211
|
#
|
201
212
|
# @param rule [String, Regexp] the rule
|
202
213
|
# @param replacement [String] the replacement
|
@@ -227,7 +238,7 @@ module Dry
|
|
227
238
|
# @api private
|
228
239
|
def add_irregular(rule, replacement, target)
|
229
240
|
head, *tail = rule.chars.to_a
|
230
|
-
rule(/(#{head})#{tail.join}\z/i,
|
241
|
+
rule(/(#{head})#{tail.join}\z/i, "\\1#{replacement[1..]}", target)
|
231
242
|
end
|
232
243
|
|
233
244
|
# Add a new rule
|
@@ -9,7 +9,6 @@ module Dry
|
|
9
9
|
# @api private
|
10
10
|
#
|
11
11
|
# rubocop:disable Metrics/AbcSize
|
12
|
-
# rubocop:disable Metrics/MethodLength
|
13
12
|
module Defaults
|
14
13
|
# @since 0.1.0
|
15
14
|
# @api private
|
@@ -35,7 +34,7 @@ module Dry
|
|
35
34
|
inflect.plural(/(?<!b)um\z/i, '\1a')
|
36
35
|
inflect.plural(/([ti])a\z/i, '\1a')
|
37
36
|
inflect.plural(/sis\z/i, "ses")
|
38
|
-
inflect.plural(/(.*)(?:([^f]))
|
37
|
+
inflect.plural(/(.*)(?:([^f]))fe*\z/i, '\1\2ves')
|
39
38
|
inflect.plural(/(hive|proof)\z/i, '\1s') # TODO: proof can be moved in the above regexp
|
40
39
|
inflect.plural(/([^aeiouy]|qu)y\z/i, '\1ies')
|
41
40
|
inflect.plural(/(x|ch|ss|sh)\z/i, '\1es')
|
@@ -57,7 +56,8 @@ module Dry
|
|
57
56
|
inflect.singular(/s\z/i, "")
|
58
57
|
inflect.singular(/(n)ews\z/i, '\1ews')
|
59
58
|
inflect.singular(/([ti])a\z/i, '\1um')
|
60
|
-
inflect.singular(/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)(sis|ses)\z/i,
|
59
|
+
inflect.singular(/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)(sis|ses)\z/i,
|
60
|
+
'\1\2sis')
|
61
61
|
inflect.singular(/(^analy)(sis|ses)\z/i, '\1sis')
|
62
62
|
inflect.singular(/([^f])ves\z/i, '\1fe')
|
63
63
|
inflect.singular(/(hive)s\z/i, '\1')
|
@@ -69,7 +69,7 @@ module Dry
|
|
69
69
|
inflect.singular(/(ss)\z/i, '\1')
|
70
70
|
inflect.singular(/(x|ch|ss|sh)es\z/i, '\1')
|
71
71
|
inflect.singular(/([m|l])ice\z/i, '\1ouse')
|
72
|
-
inflect.singular(/(
|
72
|
+
inflect.singular(/(us)(es)?\z/i, '\1')
|
73
73
|
inflect.singular(/(o)es\z/i, '\1')
|
74
74
|
inflect.singular(/(shoe)s\z/i, '\1')
|
75
75
|
inflect.singular(/(cris|ax|test)(is|es)\z/i, '\1is')
|
@@ -87,30 +87,34 @@ module Dry
|
|
87
87
|
def self.irregular(inflect)
|
88
88
|
inflect.irregular("person", "people")
|
89
89
|
inflect.irregular("man", "men")
|
90
|
-
|
90
|
+
|
91
|
+
# NOTE: this is here only to override the previous rule
|
92
|
+
inflect.irregular("human", "humans")
|
91
93
|
inflect.irregular("child", "children")
|
92
94
|
inflect.irregular("sex", "sexes")
|
93
95
|
inflect.irregular("foot", "feet")
|
94
96
|
inflect.irregular("tooth", "teeth")
|
95
97
|
inflect.irregular("goose", "geese")
|
96
|
-
|
98
|
+
|
99
|
+
# FIXME: this is here because I need to fix the "um" regexp
|
100
|
+
inflect.irregular("forum", "forums")
|
97
101
|
end
|
98
102
|
|
99
103
|
# @since 0.1.0
|
100
104
|
# @api private
|
101
105
|
def self.uncountable(inflect)
|
102
|
-
inflect.uncountable(%w[hovercraft moose deer milk rain Swiss grass equipment information
|
106
|
+
inflect.uncountable(%w[hovercraft moose deer milk rain Swiss grass equipment information
|
107
|
+
rice money species series fish sheep jeans])
|
103
108
|
end
|
104
109
|
|
105
110
|
# @since 0.1.2
|
106
111
|
# @api private
|
107
112
|
def self.acronyms(inflect)
|
108
|
-
inflect.acronym(*%w[JSON HTTP OpenSSL HMAC])
|
113
|
+
inflect.acronym(*%w[JSON HTTP OpenSSL HMAC CSRF API])
|
109
114
|
end
|
110
115
|
|
111
116
|
private_class_method :plural, :singular, :irregular, :uncountable, :acronyms
|
112
117
|
end
|
113
|
-
# rubocop:enable Metrics/MethodLength
|
114
118
|
# rubocop:enable Metrics/AbcSize
|
115
119
|
end
|
116
120
|
end
|
metadata
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dry-inflector
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luca Guidi
|
8
8
|
- Andrii Savchenko
|
9
9
|
- Abinoam P. Marques Jr.
|
10
10
|
autorequire:
|
11
|
-
bindir:
|
11
|
+
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2021-06-30 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|
@@ -30,44 +30,30 @@ dependencies:
|
|
30
30
|
name: rake
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
32
32
|
requirements:
|
33
|
-
- - "
|
33
|
+
- - ">="
|
34
34
|
- !ruby/object:Gem::Version
|
35
|
-
version: '
|
35
|
+
version: '0'
|
36
36
|
type: :development
|
37
37
|
prerelease: false
|
38
38
|
version_requirements: !ruby/object:Gem::Requirement
|
39
39
|
requirements:
|
40
|
-
- - "
|
40
|
+
- - ">="
|
41
41
|
- !ruby/object:Gem::Version
|
42
|
-
version: '
|
42
|
+
version: '0'
|
43
43
|
- !ruby/object:Gem::Dependency
|
44
44
|
name: rspec
|
45
45
|
requirement: !ruby/object:Gem::Requirement
|
46
46
|
requirements:
|
47
|
-
- - "
|
48
|
-
- !ruby/object:Gem::Version
|
49
|
-
version: '3.7'
|
50
|
-
type: :development
|
51
|
-
prerelease: false
|
52
|
-
version_requirements: !ruby/object:Gem::Requirement
|
53
|
-
requirements:
|
54
|
-
- - "~>"
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
version: '3.7'
|
57
|
-
- !ruby/object:Gem::Dependency
|
58
|
-
name: rubocop
|
59
|
-
requirement: !ruby/object:Gem::Requirement
|
60
|
-
requirements:
|
61
|
-
- - "~>"
|
47
|
+
- - ">="
|
62
48
|
- !ruby/object:Gem::Version
|
63
|
-
version: 0
|
49
|
+
version: '0'
|
64
50
|
type: :development
|
65
51
|
prerelease: false
|
66
52
|
version_requirements: !ruby/object:Gem::Requirement
|
67
53
|
requirements:
|
68
|
-
- - "
|
54
|
+
- - ">="
|
69
55
|
- !ruby/object:Gem::Version
|
70
|
-
version: 0
|
56
|
+
version: '0'
|
71
57
|
description: String inflections for dry-rb
|
72
58
|
email:
|
73
59
|
- me@lucaguidi.com
|
@@ -78,7 +64,7 @@ extensions: []
|
|
78
64
|
extra_rdoc_files: []
|
79
65
|
files:
|
80
66
|
- CHANGELOG.md
|
81
|
-
- LICENSE
|
67
|
+
- LICENSE
|
82
68
|
- README.md
|
83
69
|
- dry-inflector.gemspec
|
84
70
|
- lib/dry-inflector.rb
|
@@ -88,7 +74,7 @@ files:
|
|
88
74
|
- lib/dry/inflector/inflections/defaults.rb
|
89
75
|
- lib/dry/inflector/rules.rb
|
90
76
|
- lib/dry/inflector/version.rb
|
91
|
-
homepage: https://dry-rb.org
|
77
|
+
homepage: https://dry-rb.org/gems/dry-inflector
|
92
78
|
licenses:
|
93
79
|
- MIT
|
94
80
|
metadata:
|
@@ -104,15 +90,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
104
90
|
requirements:
|
105
91
|
- - ">="
|
106
92
|
- !ruby/object:Gem::Version
|
107
|
-
version:
|
93
|
+
version: 2.6.0
|
108
94
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
109
95
|
requirements:
|
110
96
|
- - ">="
|
111
97
|
- !ruby/object:Gem::Version
|
112
98
|
version: '0'
|
113
99
|
requirements: []
|
114
|
-
rubygems_version: 3.
|
100
|
+
rubygems_version: 3.1.6
|
115
101
|
signing_key:
|
116
102
|
specification_version: 4
|
117
|
-
summary:
|
103
|
+
summary: String inflections for dry-rb
|
118
104
|
test_files: []
|
data/LICENSE.md
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
Copyright © The Dry, Rails, Merb, Datamapper, Inflecto, Flexus, and Hanami teams
|
2
|
-
|
3
|
-
MIT License
|
4
|
-
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
-
a copy of this software and associated documentation files (the
|
7
|
-
"Software"), to deal in the Software without restriction, including
|
8
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
-
permit persons to whom the Software is furnished to do so, subject to
|
11
|
-
the following conditions:
|
12
|
-
|
13
|
-
The above copyright notice and this permission notice shall be
|
14
|
-
included in all copies or substantial portions of the Software.
|
15
|
-
|
16
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
-
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
-
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
-
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|