Skip to content

Commit c42252b

Browse files
committed
add support for 'decapitalize'
1 parent bf0cf9c commit c42252b

File tree

6 files changed

+132
-0
lines changed

6 files changed

+132
-0
lines changed

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ LuckyCase.lower_case('Some_FuckingShit') # => 'some_fuckingshit'
5353
LuckyCase.upper_case('Some_FuckingShit') # => 'SOME_FUCKINGSHIT'
5454
LuckyCase.capital('example') # => 'Example'
5555
LuckyCase.capitalize('example') # => 'Example'
56+
LuckyCase.decapitalize('ExaMple') # => 'exaMple'
5657
LuckyCase.swap_case('SomeSwappy_Case-Example') # => 'sOMEsWAPPY-cASE_eXAMPLE'
5758
LuckyCase.constantize('some_constant') # => SomeConstant
5859
LuckyCase.constantize('SOME_CONSTANT') # => SomeConstant
@@ -81,6 +82,8 @@ LuckyCase.upper_case?('UPPER50984') # => true
8182
LuckyCase.lower_case?('lower_cheese') # => true
8283
LuckyCase.capital?('Some') # => true
8384
LuckyCase.capitalized?('some') # => false
85+
LuckyCase.decapitalized?('soMe') # => true
86+
LuckyCase.not_capital?('Some') # => false
8487
LuckyCase.valid_case_type?(:snake_case) # => true
8588
LuckyCase.valid_case_type?(:apple_case) # => false
8689
LuckyCase.valid_case_string?('validString') # => true

Rakefile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,8 @@ task :default do
88
system 'rake --tasks'
99
end
1010

11+
task :test do
12+
system 'rspec'
13+
end
14+
1115
RSpec::Core::RakeTask.new(:spec)

lib/lucky_case.rb

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -611,6 +611,44 @@ def self.capitalized?(string, skip_prefixed_underscores: false)
611611
capital? string, skip_prefixed_underscores: skip_prefixed_underscores
612612
end
613613

614+
# Convert the first character to lower case
615+
#
616+
# @param [String] string to convert
617+
# @param [Boolean] skip_prefixed_underscores
618+
# @return [String]
619+
def self.decapitalize(string, skip_prefixed_underscores: false)
620+
return string if string.empty?
621+
s = if skip_prefixed_underscores
622+
cut_underscores_at_start string
623+
else
624+
string
625+
end
626+
s = s[0].downcase + s[1..-1]
627+
if skip_prefixed_underscores
628+
underscores_at_start(string) + s
629+
else
630+
s
631+
end
632+
end
633+
634+
# Check if the strings first character is a lower letter
635+
#
636+
# @param [String] string to check
637+
# @param [Boolean] skip_prefixed_underscores
638+
# @return [Boolean]
639+
def self.not_capital?(string, skip_prefixed_underscores: false)
640+
decapitalized? string, skip_prefixed_underscores
641+
end
642+
643+
# Check if the strings first character is a lower letter
644+
#
645+
# @param [String] string to check
646+
# @param [Boolean] skip_prefixed_underscores
647+
# @return [Boolean]
648+
def self.decapitalized?(string, skip_prefixed_underscores: false)
649+
!(capital? string, skip_prefixed_underscores)
650+
end
651+
614652
#----------------------------------------------------------------------------------------------------
615653
# MIXED CASE
616654
#----------------------------------------------------------------------------------------------------

lib/lucky_case/string.rb

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,34 @@ def capitalized?(skip_prefixed_underscores: false)
451451
self.capital? skip_prefixed_underscores: skip_prefixed_underscores
452452
end
453453

454+
# Convert the first character to lower case
455+
#
456+
# @param [Boolean] skip_prefixed_underscores
457+
# @return [String]
458+
def decapitalize(skip_prefixed_underscores: false)
459+
LuckyCase.decapitalize self, skip_prefixed_underscores: skip_prefixed_underscores
460+
end
461+
462+
def decapitalize!(skip_prefixed_underscores: false)
463+
set_self_value self.decapitalize skip_prefixed_underscores: skip_prefixed_underscores
464+
end
465+
466+
# Check if the strings first character is a lower letter
467+
#
468+
# @param [Boolean] skip_prefixed_underscores
469+
# @return [Boolean]
470+
def decapitalized?(skip_prefixed_underscores: false)
471+
LuckyCase.decapitalized? self, skip_prefixed_underscores: skip_prefixed_underscores
472+
end
473+
474+
# Check if the strings first character is a lower letter
475+
#
476+
# @param [Boolean] skip_prefixed_underscores
477+
# @return [Boolean]
478+
def not_capital?(skip_prefixed_underscores: false)
479+
self.decapitalized? skip_prefixed_underscores: skip_prefixed_underscores
480+
end
481+
454482
#----------------------------------------------------------------------------------------------------
455483
# MIXED CASE
456484
#----------------------------------------------------------------------------------------------------

spec/lucky_case_spec.rb

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1113,6 +1113,63 @@
11131113
end
11141114
end
11151115

1116+
context 'decapitalize conversions: ' do
1117+
it 'default into lower first letter' do
1118+
conversion_examples = {
1119+
'ExampleOne' => 'exampleOne',
1120+
'exampleTwo' => 'exampleTwo',
1121+
'example-three' => 'example-three',
1122+
'Example-Four' => 'example-Four',
1123+
'EXAMPLE-FIVE' => 'eXAMPLE-FIVE',
1124+
'EXAMPLE_SIX' => 'eXAMPLE_SIX',
1125+
'example_Seven-extra' => 'example_Seven-extra',
1126+
'example_eight' => 'example_eight',
1127+
'_Example_underscoreOne' => '_Example_underscoreOne',
1128+
'___Example_underscoreTwo' => '___Example_underscoreTwo',
1129+
}
1130+
conversion_examples.each do |source, expected_result|
1131+
final_result = LuckyCase.decapitalize source
1132+
expect(final_result).to eql(expected_result)
1133+
end
1134+
end
1135+
it 'into lower first letter with skipping underscores' do
1136+
conversion_examples = {
1137+
'ExampleOne' => 'exampleOne',
1138+
'exampleTwo' => 'exampleTwo',
1139+
'example-three' => 'example-three',
1140+
'Example-Four' => 'example-Four',
1141+
'EXAMPLE-FIVE' => 'eXAMPLE-FIVE',
1142+
'EXAMPLE_SIX' => 'eXAMPLE_SIX',
1143+
'example_Seven-extra' => 'example_Seven-extra',
1144+
'example_eight' => 'example_eight',
1145+
'_Example_underscoreOne' => '_example_underscoreOne',
1146+
'___Example_underscoreTwo' => '___example_underscoreTwo',
1147+
}
1148+
conversion_examples.each do |source, expected_result|
1149+
final_result = LuckyCase.decapitalize source, skip_prefixed_underscores: true
1150+
expect(final_result).to eql(expected_result)
1151+
end
1152+
end
1153+
it 'into lower first letter without explicitly skipping underscores' do
1154+
conversion_examples = {
1155+
'_ExampleOne' => '_ExampleOne',
1156+
'_exampleTwo' => '_exampleTwo',
1157+
'____example-three' => '____example-three',
1158+
'_Example-Four' => '_Example-Four',
1159+
'__EXAMPLE-FIVE' => '__EXAMPLE-FIVE',
1160+
'___eXAMPLE_SIX' => '___eXAMPLE_SIX',
1161+
'Example_Seven-extra' => 'example_Seven-extra',
1162+
'__Example_eight' => '__Example_eight',
1163+
'_Example_underscoreOne' => '_Example_underscoreOne',
1164+
'___Example_underscoreTwo' => '___Example_underscoreTwo',
1165+
}
1166+
conversion_examples.each do |source, expected_result|
1167+
final_result = LuckyCase.decapitalize source, skip_prefixed_underscores: false
1168+
expect(final_result).to eql(expected_result)
1169+
end
1170+
end
1171+
end
1172+
11161173
context 'mixed case conversions: ' do
11171174
it 'default into mixed case' do
11181175
conversion_examples = [

spec/lucky_case_string_spec.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@
4444
expect(s).to eql('Some')
4545
s = "some"; s.capitalize!
4646
expect(s).to eql('Some')
47+
s = "SoMe"; s.decapitalize!
48+
expect(s).to eql('soMe')
4749
s = "swap_it"; s.swap_case!
4850
expect(s).to eql('SWAP-IT')
4951
s = "SwapMore-Than_Him"; s.swap_case!

0 commit comments

Comments
 (0)