Class: Hanami::Utils::String
- Inherits:
-
Object
- Object
- Hanami::Utils::String
- Defined in:
- lib/hanami/utils/string.rb
Overview
String on steroids
Direct Known Subclasses
Constant Summary collapse
- EMPTY_STRING =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Empty string for #classify
''.freeze
- NAMESPACE_SEPARATOR =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Separator between Ruby namespaces
'::'.freeze
- CLASSIFY_SEPARATOR =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Separator for #classify
'_'.freeze
- TOKENIZE_REGEXP =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Regexp for #tokenize
/\((.*)\)/- TOKENIZE_SEPARATOR =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Separator for #tokenize
'|'.freeze
- UNDERSCORE_SEPARATOR =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Separator for #underscore
'/'.freeze
- UNDERSCORE_DIVISION_TARGET =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
gsub second parameter used in #underscore
'\1_\2'.freeze
- TITLEIZE_SEPARATOR =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Separator for #titleize
' '.freeze
- CAPITALIZE_SEPARATOR =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Separator for #capitalize
' '.freeze
- DASHERIZE_SEPARATOR =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Separator for #dasherize
'-'.freeze
- CLASSIFY_WORD_SEPARATOR =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Regexp for #classify
/#{CLASSIFY_SEPARATOR}|#{NAMESPACE_SEPARATOR}|#{UNDERSCORE_SEPARATOR}|#{DASHERIZE_SEPARATOR}/
Instance Method Summary collapse
-
#==(other) ⇒ TrueClass, FalseClass
(also: #eql?)
Equality.
-
#capitalize ⇒ Hanami::Utils::String
Return a capitalized version of the string.
-
#classify ⇒ String
Return a CamelCase version of the string.
-
#dasherize ⇒ Hanami::Utils::String
Return a downcased and dash separated version of the string.
-
#demodulize ⇒ String
Return the string without the Ruby namespace of the class.
-
#gsub(pattern, replacement = nil, &blk) ⇒ String?
Replace the given pattern with the given replacement.
-
#hash ⇒ Fixnum
Returns the hash of the internal string.
-
#initialize(string) ⇒ String
constructor
Initialize the string.
-
#method_missing(m, *args, &blk) ⇒ Object
private
Override Ruby’s method_missing in order to provide ::String interface.
-
#namespace ⇒ String
Return the top level namespace name.
-
#pluralize ⇒ Hanami::Utils::String
private
Return a pluralized version of self.
-
#respond_to_missing?(m, include_private = false) ⇒ Boolean
private
Override Ruby’s respond_to_missing? in order to support ::String interface.
-
#rsub(pattern, replacement) ⇒ Hanami::Utils::String
Replace the rightmost match of
patternwithreplacement. -
#scan(pattern, &blk) ⇒ String?
Both forms iterate through str, matching the pattern.
-
#singularize ⇒ Hanami::Utils::String
private
Return a singularized version of self.
-
#split(pattern, limit = 0) ⇒ Array<String>
Split the string with the given pattern.
-
#titleize ⇒ Hanami::Utils::String
Return a titleized version of the string.
-
#to_s ⇒ String
(also: #to_str)
Returns a string representation.
-
#tokenize { ... } ⇒ void
It iterates through the tokens and calls the given block.
-
#underscore ⇒ String
Return a downcased and underscore separated version of the string.
Constructor Details
#initialize(string) ⇒ String
Initialize the string
82 83 84 |
# File 'lib/hanami/utils/string.rb', line 82 def initialize(string) @string = string.to_s end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(m, *args, &blk) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Override Ruby’s method_missing in order to provide ::String interface
401 402 403 404 405 406 407 |
# File 'lib/hanami/utils/string.rb', line 401 def method_missing(m, *args, &blk) raise NoMethodError.new(%(undefined method `#{m}' for "#{@string}":#{self.class})) unless respond_to?(m) s = @string.__send__(m, *args, &blk) s = self.class.new(s) if s.is_a?(::String) s end |
Instance Method Details
#==(other) ⇒ TrueClass, FalseClass Also known as: eql?
Equality
318 319 320 |
# File 'lib/hanami/utils/string.rb', line 318 def ==(other) to_s == other end |
#capitalize ⇒ Hanami::Utils::String
Return a capitalized version of the string
124 125 126 127 128 129 130 |
# File 'lib/hanami/utils/string.rb', line 124 def capitalize head, *tail = underscore.split(CLASSIFY_SEPARATOR) self.class.new( tail.unshift(head.capitalize).join(CAPITALIZE_SEPARATOR) ) end |
#classify ⇒ String
Return a CamelCase version of the string
143 144 145 146 147 148 149 150 151 152 |
# File 'lib/hanami/utils/string.rb', line 143 def classify words = underscore.split(CLASSIFY_WORD_SEPARATOR).map!(&:capitalize) delimiters = underscore.scan(CLASSIFY_WORD_SEPARATOR) delimiters.map! do |delimiter| delimiter == CLASSIFY_SEPARATOR ? EMPTY_STRING : NAMESPACE_SEPARATOR end self.class.new words.zip(delimiters).join end |
#dasherize ⇒ Hanami::Utils::String
Return a downcased and dash separated version of the string
194 195 196 |
# File 'lib/hanami/utils/string.rb', line 194 def dasherize self.class.new underscore.split(CLASSIFY_SEPARATOR).join(DASHERIZE_SEPARATOR) end |
#demodulize ⇒ String
Return the string without the Ruby namespace of the class
212 213 214 |
# File 'lib/hanami/utils/string.rb', line 212 def demodulize self.class.new split(NAMESPACE_SEPARATOR).last end |
#gsub(pattern, replacement = nil, &blk) ⇒ String?
Replace the given pattern with the given replacement
342 343 344 345 346 347 348 |
# File 'lib/hanami/utils/string.rb', line 342 def gsub(pattern, replacement = nil, &blk) if block_given? @string.gsub(pattern, &blk) else @string.gsub(pattern, replacement) end end |
#hash ⇒ Fixnum
Returns the hash of the internal string
298 299 300 |
# File 'lib/hanami/utils/string.rb', line 298 def hash @string.hash end |
#namespace ⇒ String
Return the top level namespace name
230 231 232 |
# File 'lib/hanami/utils/string.rb', line 230 def namespace self.class.new split(NAMESPACE_SEPARATOR).first end |
#pluralize ⇒ Hanami::Utils::String
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Return a pluralized version of self.
277 278 279 |
# File 'lib/hanami/utils/string.rb', line 277 def pluralize self.class.new Inflector.pluralize(self) end |
#respond_to_missing?(m, include_private = false) ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Override Ruby’s respond_to_missing? in order to support ::String interface
413 414 415 |
# File 'lib/hanami/utils/string.rb', line 413 def respond_to_missing?(m, include_private = false) @string.respond_to?(m, include_private) end |
#rsub(pattern, replacement) ⇒ Hanami::Utils::String
Replace the rightmost match of pattern with replacement
If the pattern cannot be matched, it returns the original string.
This method does NOT mutate the original string.
385 386 387 388 389 390 391 392 393 |
# File 'lib/hanami/utils/string.rb', line 385 def rsub(pattern, replacement) if i = rindex(pattern) # rubocop:disable Lint/AssignmentInCondition s = @string.dup s[i] = replacement self.class.new s else self end end |
#scan(pattern, &blk) ⇒ String?
Both forms iterate through str, matching the pattern
357 358 359 |
# File 'lib/hanami/utils/string.rb', line 357 def scan(pattern, &blk) @string.scan(pattern, &blk) end |
#singularize ⇒ Hanami::Utils::String
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Return a singularized version of self.
289 290 291 |
# File 'lib/hanami/utils/string.rb', line 289 def singularize self.class.new Inflector.singularize(self) end |
#split(pattern, limit = 0) ⇒ Array<String>
Split the string with the given pattern
331 332 333 |
# File 'lib/hanami/utils/string.rb', line 331 def split(pattern, limit = 0) @string.split(pattern, limit) end |
#titleize ⇒ Hanami::Utils::String
Return a titleized version of the string
97 98 99 |
# File 'lib/hanami/utils/string.rb', line 97 def titleize self.class.new underscore.split(CLASSIFY_SEPARATOR).map(&:capitalize).join(TITLEIZE_SEPARATOR) end |
#to_s ⇒ String Also known as: to_str
Returns a string representation
307 308 309 |
# File 'lib/hanami/utils/string.rb', line 307 def to_s @string end |
#tokenize { ... } ⇒ void
This method returns an undefined value.
It iterates through the tokens and calls the given block. A token is a substring wrapped by ‘()` and separated by `|`.
254 255 256 257 258 259 260 261 262 263 264 265 266 267 |
# File 'lib/hanami/utils/string.rb', line 254 def tokenize # rubocop:disable Metrics/MethodLength if match = TOKENIZE_REGEXP.match(@string) # rubocop:disable Lint/AssignmentInCondition pre = match.pre_match post = match.post_match tokens = match[1].split(TOKENIZE_SEPARATOR) tokens.each do |token| yield(self.class.new("#{pre}#{token}#{post}")) end else yield(self.class.new(@string)) end nil end |
#underscore ⇒ String
Return a downcased and underscore separated version of the string
Revised version of ‘ActiveSupport::Inflector.underscore` implementation
168 169 170 171 172 173 174 175 |
# File 'lib/hanami/utils/string.rb', line 168 def underscore new_string = gsub(NAMESPACE_SEPARATOR, UNDERSCORE_SEPARATOR) new_string.gsub!(/([A-Z\d]+)([A-Z][a-z])/, UNDERSCORE_DIVISION_TARGET) new_string.gsub!(/([a-z\d])([A-Z])/, UNDERSCORE_DIVISION_TARGET) new_string.gsub!(/[[:space:]]|\-/, UNDERSCORE_DIVISION_TARGET) new_string.downcase! self.class.new new_string end |