strings-case 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +19 -2
- data/LICENSE.txt +1 -1
- data/README.md +231 -131
- data/lib/strings/case/acronyms.rb +111 -0
- data/lib/strings/case/configuration.rb +55 -0
- data/lib/strings/case/extensions.rb +56 -6
- data/lib/strings/case/version.rb +4 -4
- data/lib/strings/case.rb +232 -133
- metadata +17 -41
- data/Rakefile +0 -8
- data/spec/perf/parsecase_spec.rb +0 -22
- data/spec/spec_helper.rb +0 -39
- data/spec/unit/camelcase_spec.rb +0 -51
- data/spec/unit/constcase_spec.rb +0 -44
- data/spec/unit/extensions_spec.rb +0 -75
- data/spec/unit/headercase_spec.rb +0 -50
- data/spec/unit/kebabcase_spec.rb +0 -48
- data/spec/unit/pascalcase_spec.rb +0 -51
- data/spec/unit/pathcase_spec.rb +0 -51
- data/spec/unit/sentencecase_spec.rb +0 -51
- data/spec/unit/snakecase_spec.rb +0 -51
- data/spec/unit/titlecase_spec.rb +0 -51
- data/strings-case.gemspec +0 -32
- data/tasks/console.rake +0 -11
- data/tasks/coverage.rake +0 -11
- data/tasks/spec.rake +0 -34
data/lib/strings/case.rb
CHANGED
@@ -1,287 +1,389 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "forwardable"
|
3
4
|
require "strscan"
|
4
5
|
|
6
|
+
require_relative "case/acronyms"
|
7
|
+
require_relative "case/configuration"
|
5
8
|
require_relative "case/version"
|
6
9
|
|
7
10
|
module Strings
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
11
|
+
# Responsible for converting strings to common cases
|
12
|
+
#
|
13
|
+
# @api public
|
14
|
+
class Case
|
15
|
+
# The word delimiters
|
16
|
+
#
|
17
|
+
# @return [Array<String>]
|
18
|
+
#
|
19
|
+
# @api private
|
12
20
|
DELIMITERS = [" ", "\n", "\t", "_", ".", "-", "#", "?", "!"].freeze
|
21
|
+
private_constant :DELIMITERS
|
22
|
+
|
23
|
+
# The pattern to detect word delimiters
|
24
|
+
#
|
25
|
+
# @return [Regexp]
|
26
|
+
#
|
27
|
+
# @api private
|
13
28
|
DELIMS = Regexp.union(DELIMITERS)
|
14
|
-
|
15
|
-
|
16
|
-
|
29
|
+
private_constant :DELIMS
|
30
|
+
|
31
|
+
# The pattern to detect uppercase characters
|
32
|
+
#
|
33
|
+
# @return [Regexp]
|
34
|
+
#
|
35
|
+
# @api private
|
17
36
|
UPPERCASE = /^(\p{Ll}|\p{Digit})\p{Lu}/.freeze
|
37
|
+
private_constant :UPPERCASE
|
38
|
+
|
39
|
+
# The pattern to detect lowercase characters
|
40
|
+
#
|
41
|
+
# @return [Regexp]
|
42
|
+
#
|
43
|
+
# @api private
|
18
44
|
LOWERCASE = /\p{Lu}(?=\p{Ll})/.freeze
|
45
|
+
private_constant :LOWERCASE
|
19
46
|
|
20
47
|
class Error < StandardError; end
|
21
48
|
|
22
|
-
#
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
49
|
+
# Global instance
|
50
|
+
#
|
51
|
+
# @return [Strings::Case]
|
52
|
+
#
|
53
|
+
# @api private
|
54
|
+
def self.__instance__
|
55
|
+
@__instance__ ||= Case.new
|
29
56
|
end
|
57
|
+
private_class_method :__instance__
|
58
|
+
|
59
|
+
class << self
|
60
|
+
extend Forwardable
|
30
61
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
62
|
+
delegate %i[camelcase constcase constantcase dashcase
|
63
|
+
headercase kebabcase lower_camelcase
|
64
|
+
pascalcase pathcase sentencecase snakecase
|
65
|
+
titlecase underscore upper_camelcase] => :__instance__
|
66
|
+
end
|
67
|
+
|
68
|
+
# Create a Strings::Case instance
|
35
69
|
#
|
36
70
|
# @example
|
37
|
-
#
|
71
|
+
# strings = Strings::Case.new(acronyms: %w[HTTP XML])
|
38
72
|
#
|
39
|
-
# @param [String]
|
40
|
-
# the string to camelcase
|
41
|
-
# @param [Array[String]] acronyms
|
73
|
+
# @param [Array<String>] acronyms
|
42
74
|
# the acronyms to use to prevent modifications
|
43
|
-
# @param [String] separator
|
44
|
-
# the separator for linking words, by default none
|
45
75
|
#
|
46
76
|
# @api public
|
47
|
-
def
|
48
|
-
|
77
|
+
def initialize(acronyms: nil)
|
78
|
+
configure(acronyms: acronyms)
|
79
|
+
end
|
49
80
|
|
50
|
-
|
81
|
+
# Access configuration
|
82
|
+
#
|
83
|
+
# @example
|
84
|
+
# strings.config
|
85
|
+
#
|
86
|
+
# @return [Strings::Case::Configuration]
|
87
|
+
#
|
88
|
+
# @api public
|
89
|
+
def config
|
90
|
+
@config ||= Configuration.new
|
91
|
+
end
|
51
92
|
|
52
|
-
|
53
|
-
|
54
|
-
|
93
|
+
# Configure acronyms
|
94
|
+
#
|
95
|
+
# @example
|
96
|
+
# strings = Strings::Case.new
|
97
|
+
# strings.configure do |config|
|
98
|
+
# config.acronym "HTTP"
|
99
|
+
# end
|
100
|
+
#
|
101
|
+
# @example
|
102
|
+
# strings = Strings::Case.new
|
103
|
+
# strings.configure(acronyms: %w[HTTP XML])
|
104
|
+
#
|
105
|
+
# @param [Array<String>] acronyms
|
106
|
+
# the acronyms to use to prevent modifications
|
107
|
+
#
|
108
|
+
# @yield [Strings::Case::Configuration]
|
109
|
+
#
|
110
|
+
# @return [void]
|
111
|
+
#
|
112
|
+
# @api public
|
113
|
+
def configure(acronyms: nil)
|
114
|
+
if block_given?
|
115
|
+
yield config
|
55
116
|
else
|
56
|
-
|
117
|
+
config.acronym(*acronyms)
|
57
118
|
end
|
58
119
|
end
|
59
|
-
module_function :camelcase
|
60
120
|
|
121
|
+
# Convert string to camel case
|
122
|
+
#
|
123
|
+
# @example
|
124
|
+
# camelcase("foo bar baz") # => "fooBarBaz"
|
125
|
+
#
|
126
|
+
# @param [String] string
|
127
|
+
# the string to convert to camel case
|
128
|
+
# @param [Array<String>] acronyms
|
129
|
+
# the acronyms to use to prevent modifications
|
130
|
+
# @param [String] separator
|
131
|
+
# the words separator, by default an empty string
|
132
|
+
#
|
133
|
+
# @return [String]
|
134
|
+
#
|
135
|
+
# @api public
|
136
|
+
def camelcase(string, acronyms: config.acronyms, separator: "")
|
137
|
+
acronyms = Acronyms.from(acronyms)
|
138
|
+
parsecase(string, acronyms: acronyms, sep: separator) do |word, i|
|
139
|
+
acronyms.fetch(word) || (i.zero? ? word.downcase : word.capitalize)
|
140
|
+
end
|
141
|
+
end
|
61
142
|
alias lower_camelcase camelcase
|
62
|
-
module_function :lower_camelcase
|
63
143
|
|
64
|
-
#
|
144
|
+
# Convert string to constant case
|
65
145
|
#
|
66
146
|
# @example
|
67
147
|
# constantcase("foo bar baz") # => "FOO_BAR_BAZ"
|
68
148
|
#
|
69
149
|
# @param [String] string
|
70
|
-
# the string to
|
71
|
-
# @param [Array
|
150
|
+
# the string to convert to constant case
|
151
|
+
# @param [Array<String>] acronyms
|
72
152
|
# the acronyms to use to prevent modifications
|
73
153
|
# @param [String] separator
|
74
|
-
# the words separator, by default "_"
|
154
|
+
# the words separator, by default an underscore "_"
|
155
|
+
#
|
156
|
+
# @return [String]
|
75
157
|
#
|
76
158
|
# @api public
|
77
|
-
def constcase(string, separator: "_")
|
78
|
-
|
159
|
+
def constcase(string, acronyms: config.acronyms, separator: "_")
|
160
|
+
acronyms = Acronyms.from(acronyms)
|
161
|
+
parsecase(string, acronyms: acronyms, sep: separator, &:upcase)
|
79
162
|
end
|
80
|
-
module_function :constcase
|
81
|
-
|
82
163
|
alias constantcase constcase
|
83
|
-
module_function :constantcase
|
84
164
|
|
85
|
-
# Convert string to
|
165
|
+
# Convert string to header case
|
86
166
|
#
|
87
167
|
# @example
|
88
168
|
# headercase("foo bar baz") # = "Foo-Bar-Baz"
|
89
169
|
#
|
90
170
|
# @param [String] string
|
91
|
-
# the string to
|
92
|
-
# @param [Array
|
171
|
+
# the string to convert to header case
|
172
|
+
# @param [Array<String>] acronyms
|
93
173
|
# the acronyms to use to prevent modifications
|
94
174
|
# @param [String] separator
|
95
|
-
# the words separator, by default "-"
|
175
|
+
# the words separator, by default a hyphen "-"
|
176
|
+
#
|
177
|
+
# @return [String]
|
96
178
|
#
|
97
179
|
# @api public
|
98
|
-
def headercase(string, acronyms:
|
99
|
-
|
180
|
+
def headercase(string, acronyms: config.acronyms, separator: "-")
|
181
|
+
acronyms = Acronyms.from(acronyms)
|
182
|
+
parsecase(string, acronyms: acronyms, sep: separator) do |word|
|
183
|
+
(acronym = acronyms.fetch(word)) ? acronym : word.capitalize
|
184
|
+
end
|
100
185
|
end
|
101
|
-
module_function :headercase
|
102
186
|
|
103
|
-
#
|
187
|
+
# Convert string to kebab case
|
104
188
|
#
|
105
189
|
# @example
|
106
190
|
# kebabcase("fooBarBaz") # => "foo-bar-baz"
|
107
191
|
#
|
192
|
+
# @example
|
108
193
|
# kebabcase("__FOO_BAR__") # => "foo-bar"
|
109
194
|
#
|
110
195
|
# @param [String] string
|
111
|
-
# the string to convert to
|
112
|
-
# @param [Array
|
196
|
+
# the string to convert to kebab case
|
197
|
+
# @param [Array<String>] acronyms
|
113
198
|
# the acronyms to use to prevent modifications
|
114
199
|
# @param [String] separator
|
115
|
-
# the separator
|
200
|
+
# the words separator, by default a hyphen "-"
|
116
201
|
#
|
117
202
|
# @return [String]
|
118
203
|
#
|
119
204
|
# @api public
|
120
|
-
def kebabcase(string, acronyms:
|
121
|
-
|
205
|
+
def kebabcase(string, acronyms: config.acronyms, separator: "-")
|
206
|
+
acronyms = Acronyms.from(acronyms)
|
207
|
+
parsecase(string, acronyms: acronyms, sep: separator, &:downcase)
|
122
208
|
end
|
123
|
-
module_function :kebabcase
|
124
|
-
|
125
209
|
alias dashcase kebabcase
|
126
|
-
module_function :dashcase
|
127
210
|
|
128
|
-
# Convert string to
|
129
|
-
# * every word has its first character uppercased
|
130
|
-
# * all words are compounded together
|
211
|
+
# Convert string to Pascal case
|
131
212
|
#
|
132
213
|
# @example
|
133
214
|
# pascalcase("foo bar baz") # => "FooBarBaz"
|
134
215
|
#
|
135
216
|
# @param [String] string
|
136
|
-
# the string to convert to
|
137
|
-
# @param [Array
|
217
|
+
# the string to convert to Pascal case
|
218
|
+
# @param [Array<String>] acronyms
|
138
219
|
# the acronyms to use to prevent modifications
|
139
220
|
# @param [String] separator
|
140
|
-
# the separator
|
221
|
+
# the words separator, by default an empty string
|
222
|
+
#
|
223
|
+
# @return [String]
|
141
224
|
#
|
142
225
|
# @api public
|
143
|
-
def pascalcase(string, acronyms:
|
144
|
-
|
226
|
+
def pascalcase(string, acronyms: config.acronyms, separator: "")
|
227
|
+
acronyms = Acronyms.from(acronyms)
|
228
|
+
parsecase(string, acronyms: acronyms, sep: separator) do |word|
|
229
|
+
acronyms.fetch(word) || word.capitalize
|
230
|
+
end
|
145
231
|
end
|
146
|
-
module_function :pascalcase
|
147
|
-
|
148
232
|
alias upper_camelcase pascalcase
|
149
|
-
module_function :upper_camelcase
|
150
233
|
|
151
|
-
# Convert string
|
152
|
-
#
|
153
|
-
# By default uses `/` as a path separator.
|
234
|
+
# Convert string to path case
|
154
235
|
#
|
155
236
|
# @example
|
156
237
|
# pathcase("foo bar baz") # => "foo/bar/baz"
|
157
238
|
#
|
239
|
+
# @example
|
158
240
|
# pathcase("FooBarBaz") # => "foo/bar/baz"
|
159
241
|
#
|
160
242
|
# @param [String] string
|
161
|
-
# the string to convert to
|
162
|
-
# @param [Array
|
243
|
+
# the string to convert to path case
|
244
|
+
# @param [Array<String>] acronyms
|
163
245
|
# the acronyms to use to prevent modifications
|
164
246
|
# @param [String] separator
|
165
|
-
# the separator
|
247
|
+
# the words separator, by default a forward slash "/"
|
248
|
+
#
|
249
|
+
# @return [String]
|
166
250
|
#
|
167
251
|
# @api public
|
168
|
-
def pathcase(string, acronyms:
|
169
|
-
|
252
|
+
def pathcase(string, acronyms: config.acronyms, separator: "/")
|
253
|
+
acronyms = Acronyms.from(acronyms)
|
254
|
+
parsecase(string, acronyms: acronyms, sep: separator, &:downcase)
|
170
255
|
end
|
171
|
-
module_function :pathcase
|
172
256
|
|
173
|
-
# Convert string
|
257
|
+
# Convert string to sentence case
|
174
258
|
#
|
175
259
|
# @example
|
176
260
|
# sentencecase("foo bar baz") # => "Foo bar baz"
|
177
261
|
#
|
178
262
|
# @param [String] string
|
179
|
-
# the string to convert to sentence
|
180
|
-
# @param [Array
|
263
|
+
# the string to convert to sentence case
|
264
|
+
# @param [Array<String>] acronyms
|
181
265
|
# the acronyms to use to prevent modifications
|
182
266
|
# @param [String] separator
|
183
|
-
# the separator
|
267
|
+
# the words separator, by default a space
|
268
|
+
#
|
269
|
+
# @return [String]
|
184
270
|
#
|
185
271
|
# @api public
|
186
|
-
def sentencecase(string, acronyms:
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
res[0].upcase + res[1..-1]
|
272
|
+
def sentencecase(string, acronyms: config.acronyms, separator: " ")
|
273
|
+
acronyms = Acronyms.from(acronyms)
|
274
|
+
parsecase(string, acronyms: acronyms, sep: separator) do |word, i|
|
275
|
+
acronyms.fetch(word) || (i.zero? ? word.capitalize : word.downcase)
|
276
|
+
end
|
192
277
|
end
|
193
|
-
module_function :sentencecase
|
194
278
|
|
195
|
-
# Convert string
|
279
|
+
# Convert string to snake case
|
196
280
|
#
|
197
281
|
# @example
|
198
282
|
# snakecase("foo bar baz") # => "foo_bar_baz"
|
199
283
|
#
|
284
|
+
# @example
|
200
285
|
# snakecase("ЗдравствуйтеПривет") # => "здравствуйте_привет"
|
201
286
|
#
|
287
|
+
# @example
|
202
288
|
# snakecase("HTTPResponse") # => "http_response"
|
203
289
|
#
|
204
290
|
# @param [String] string
|
205
291
|
# the string to convert to snake case
|
206
|
-
# @param [Array
|
292
|
+
# @param [Array<String>] acronyms
|
207
293
|
# the acronyms to use to prevent modifications
|
208
294
|
# @param [String] separator
|
209
|
-
# the separator
|
295
|
+
# the words separator, by default an underscore "_"
|
296
|
+
#
|
297
|
+
# @return [String]
|
210
298
|
#
|
211
299
|
# @api public
|
212
|
-
def snakecase(string, acronyms:
|
213
|
-
|
300
|
+
def snakecase(string, acronyms: config.acronyms, separator: "_")
|
301
|
+
acronyms = Acronyms.from(acronyms)
|
302
|
+
parsecase(string, acronyms: acronyms, sep: separator, &:downcase)
|
214
303
|
end
|
215
|
-
module_function :snakecase
|
216
|
-
|
217
304
|
alias underscore snakecase
|
218
|
-
module_function :underscore
|
219
305
|
|
220
|
-
# Convert string
|
306
|
+
# Convert string to title case
|
221
307
|
#
|
222
308
|
# @example
|
223
309
|
# titlecase("foo bar baz") # => "Foo Bar Baz"
|
224
310
|
#
|
225
311
|
# @param [String] string
|
226
312
|
# the string to convert to title case
|
227
|
-
# @param [Array
|
313
|
+
# @param [Array<String>] acronyms
|
228
314
|
# the acronyms to use to prevent modifications
|
229
315
|
# @param [String] separator
|
230
|
-
# the separator
|
316
|
+
# the words separator, by default a space
|
317
|
+
#
|
318
|
+
# @return [String]
|
231
319
|
#
|
232
320
|
# @api public
|
233
|
-
def titlecase(string, acronyms:
|
234
|
-
|
321
|
+
def titlecase(string, acronyms: config.acronyms, separator: " ")
|
322
|
+
acronyms = Acronyms.from(acronyms)
|
323
|
+
parsecase(string, acronyms: acronyms, sep: separator) do |word|
|
324
|
+
acronyms.fetch(word) || word.capitalize
|
325
|
+
end
|
235
326
|
end
|
236
|
-
|
327
|
+
|
328
|
+
private
|
237
329
|
|
238
330
|
# Parse string and transform to desired case
|
239
331
|
#
|
332
|
+
# @param [String] string
|
333
|
+
# the string to convert to a given case
|
334
|
+
# @param [Strings::Case::Acronyms] acronyms
|
335
|
+
# the acronyms to use to parse words
|
336
|
+
# @param [String] sep
|
337
|
+
# the words separator, by default an underscore "_"
|
338
|
+
#
|
339
|
+
# @yield [word, index]
|
340
|
+
#
|
341
|
+
# @return [String]
|
342
|
+
#
|
240
343
|
# @api private
|
241
|
-
def parsecase(string, acronyms:
|
344
|
+
def parsecase(string, acronyms: nil, sep: "_", &conversion)
|
242
345
|
return if string.nil?
|
243
346
|
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
words
|
249
|
-
.map(&no_case)
|
250
|
-
.map(&casing)
|
251
|
-
.join(sep)
|
347
|
+
none_or_index = conversion.arity <= 1 ? :map : :with_index
|
348
|
+
split_into_words(string, acronyms: acronyms, sep: sep)
|
349
|
+
.map.send(none_or_index, &conversion).join(sep)
|
252
350
|
end
|
253
|
-
module_function :parsecase
|
254
|
-
private_class_method :parsecase
|
255
351
|
|
256
352
|
# Split string into words
|
257
353
|
#
|
258
|
-
# @
|
354
|
+
# @param [String] string
|
355
|
+
# the string to split into words
|
356
|
+
# @param [Strings::Case::Acronyms] acronyms
|
357
|
+
# the acronyms to use to split words
|
358
|
+
# @param [String] sep
|
359
|
+
# the separator to use to split words
|
360
|
+
#
|
361
|
+
# @return [Array<String>]
|
259
362
|
# the split words
|
260
363
|
#
|
261
364
|
# @api private
|
262
|
-
def split_into_words(string, sep: nil)
|
365
|
+
def split_into_words(string, acronyms: nil, sep: nil)
|
263
366
|
words = []
|
264
367
|
word = []
|
265
368
|
scanner = StringScanner.new(string)
|
266
369
|
|
267
370
|
while !scanner.eos?
|
268
|
-
if scanner.match?(
|
269
|
-
|
270
|
-
if word.size <= 1 # don't allow single letter words
|
271
|
-
word << char
|
272
|
-
else
|
273
|
-
word << char
|
371
|
+
if scanner.match?(acronyms.pattern)
|
372
|
+
unless word.empty?
|
274
373
|
words << word.join
|
275
|
-
word
|
374
|
+
word.clear
|
276
375
|
end
|
376
|
+
scanner.scan(acronyms.pattern)
|
377
|
+
words << scanner.matched
|
378
|
+
elsif scanner.match?(UPPERCASE)
|
379
|
+
char = scanner.getch
|
380
|
+
word << char
|
381
|
+
words << word.join
|
382
|
+
word.clear
|
277
383
|
elsif scanner.match?(LOWERCASE)
|
278
384
|
char = scanner.getch
|
279
|
-
|
280
|
-
|
281
|
-
else
|
282
|
-
words << word.join
|
283
|
-
word = [char]
|
284
|
-
end
|
385
|
+
words << word.join unless word.empty?
|
386
|
+
word = [char]
|
285
387
|
elsif scanner.match?(DELIMS)
|
286
388
|
char = scanner.getch
|
287
389
|
words << word.join unless word.empty?
|
@@ -290,10 +392,8 @@ module Strings
|
|
290
392
|
elsif scanner.eos? && char == sep
|
291
393
|
word = [""]
|
292
394
|
else
|
293
|
-
word
|
395
|
+
word.clear
|
294
396
|
end
|
295
|
-
elsif scanner.skip(NONALPHAS)
|
296
|
-
# noop
|
297
397
|
else
|
298
398
|
word << scanner.getch
|
299
399
|
end
|
@@ -303,6 +403,5 @@ module Strings
|
|
303
403
|
|
304
404
|
words
|
305
405
|
end
|
306
|
-
module_function :split_into_words
|
307
406
|
end # Case
|
308
407
|
end # Strings
|
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: strings-case
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Piotr Murach
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-11-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: bundler
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '1.5'
|
20
|
-
type: :development
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '1.5'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: rake
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -42,57 +28,47 @@ dependencies:
|
|
42
28
|
name: rspec
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
44
30
|
requirements:
|
45
|
-
- - "
|
31
|
+
- - ">="
|
46
32
|
- !ruby/object:Gem::Version
|
47
33
|
version: '3.0'
|
48
34
|
type: :development
|
49
35
|
prerelease: false
|
50
36
|
version_requirements: !ruby/object:Gem::Requirement
|
51
37
|
requirements:
|
52
|
-
- - "
|
38
|
+
- - ">="
|
53
39
|
- !ruby/object:Gem::Version
|
54
40
|
version: '3.0'
|
55
41
|
description: Convert strings to different cases
|
56
42
|
email:
|
57
|
-
-
|
43
|
+
- piotr@piotrmurach.com
|
58
44
|
executables: []
|
59
45
|
extensions: []
|
60
|
-
extra_rdoc_files:
|
46
|
+
extra_rdoc_files:
|
47
|
+
- README.md
|
48
|
+
- CHANGELOG.md
|
49
|
+
- LICENSE.txt
|
61
50
|
files:
|
62
51
|
- CHANGELOG.md
|
63
52
|
- LICENSE.txt
|
64
53
|
- README.md
|
65
|
-
- Rakefile
|
66
54
|
- lib/strings-case.rb
|
67
55
|
- lib/strings/case.rb
|
56
|
+
- lib/strings/case/acronyms.rb
|
57
|
+
- lib/strings/case/configuration.rb
|
68
58
|
- lib/strings/case/extensions.rb
|
69
59
|
- lib/strings/case/version.rb
|
70
|
-
- spec/perf/parsecase_spec.rb
|
71
|
-
- spec/spec_helper.rb
|
72
|
-
- spec/unit/camelcase_spec.rb
|
73
|
-
- spec/unit/constcase_spec.rb
|
74
|
-
- spec/unit/extensions_spec.rb
|
75
|
-
- spec/unit/headercase_spec.rb
|
76
|
-
- spec/unit/kebabcase_spec.rb
|
77
|
-
- spec/unit/pascalcase_spec.rb
|
78
|
-
- spec/unit/pathcase_spec.rb
|
79
|
-
- spec/unit/sentencecase_spec.rb
|
80
|
-
- spec/unit/snakecase_spec.rb
|
81
|
-
- spec/unit/titlecase_spec.rb
|
82
|
-
- strings-case.gemspec
|
83
|
-
- tasks/console.rake
|
84
|
-
- tasks/coverage.rake
|
85
|
-
- tasks/spec.rake
|
86
60
|
homepage: https://github.com/piotrmurach/strings-case
|
87
61
|
licenses:
|
88
62
|
- MIT
|
89
63
|
metadata:
|
90
64
|
allowed_push_host: https://rubygems.org
|
65
|
+
bug_tracker_uri: https://github.com/piotrmurach/strings-case/issues
|
91
66
|
changelog_uri: https://github.com/piotrmurach/strings-case/blob/master/CHANGELOG.md
|
92
67
|
documentation_uri: https://www.rubydoc.info/gems/strings-case
|
93
68
|
homepage_uri: https://github.com/piotrmurach/strings-case
|
69
|
+
rubygems_mfa_required: 'true'
|
94
70
|
source_code_uri: https://github.com/piotrmurach/strings-case
|
95
|
-
post_install_message:
|
71
|
+
post_install_message:
|
96
72
|
rdoc_options: []
|
97
73
|
require_paths:
|
98
74
|
- lib
|
@@ -107,8 +83,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
107
83
|
- !ruby/object:Gem::Version
|
108
84
|
version: '0'
|
109
85
|
requirements: []
|
110
|
-
rubygems_version: 3.
|
111
|
-
signing_key:
|
86
|
+
rubygems_version: 3.4.10
|
87
|
+
signing_key:
|
112
88
|
specification_version: 4
|
113
89
|
summary: Convert strings to different cases
|
114
90
|
test_files: []
|
data/Rakefile
DELETED
data/spec/perf/parsecase_spec.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "rspec-benchmark"
|
4
|
-
require "active_support"
|
5
|
-
|
6
|
-
RSpec.describe Strings::Case do
|
7
|
-
include RSpec::Benchmark::Matchers
|
8
|
-
|
9
|
-
it "changes case" do
|
10
|
-
expect {
|
11
|
-
Strings::Case.snakecase("fooBarBaz")
|
12
|
-
}.to perform_slower_than {
|
13
|
-
ActiveSupport::Inflector.underscore("fooBarBaz")
|
14
|
-
}.at_most(2).times
|
15
|
-
end
|
16
|
-
|
17
|
-
it "allocates no more than 100 objects" do
|
18
|
-
expect {
|
19
|
-
Strings::Case.snakecase("fooBarBaz")
|
20
|
-
}.to perform_allocation(25)
|
21
|
-
end
|
22
|
-
end
|