Class: Lotus::Utils::String
- Inherits:
-
Object
- Object
- Lotus::Utils::String
- Defined in:
- lib/lotus/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 ⇒ Lotus::Utils::String
Return a capitalized version of the string.
-
#classify ⇒ String
Return a CamelCase version of the string.
-
#dasherize ⇒ Lotus::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 ⇒ Lotus::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) ⇒ Lotus::Utils::String
Replace the rightmost match of
pattern
withreplacement
. -
#scan(pattern, &blk) ⇒ String?
Both forms iterate through str, matching the pattern.
-
#singularize ⇒ Lotus::Utils::String
private
Return a singularized version of self.
-
#split(pattern, limit = 0) ⇒ Array<String>
Split the string with the given pattern.
-
#titleize ⇒ Lotus::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/lotus/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
400 401 402 403 404 405 406 407 408 |
# File 'lib/lotus/utils/string.rb', line 400 def method_missing(m, *args, &blk) if respond_to?(m) s = @string.__send__(m, *args, &blk) s = self.class.new(s) if s.is_a?(::String) s else raise NoMethodError.new(%(undefined method `#{ m }' for "#{ @string }":#{ self.class })) end end |
Instance Method Details
#==(other) ⇒ TrueClass, FalseClass Also known as: eql?
Equality
317 318 319 |
# File 'lib/lotus/utils/string.rb', line 317 def ==(other) to_s == other end |
#capitalize ⇒ Lotus::Utils::String
Return a capitalized version of the string
124 125 126 127 128 129 130 |
# File 'lib/lotus/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/lotus/utils/string.rb', line 143 def classify words = split(CLASSIFY_WORD_SEPARATOR).map!(&:capitalize) delimiters = 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 ⇒ Lotus::Utils::String
Return a downcased and dash separated version of the string
194 195 196 |
# File 'lib/lotus/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/lotus/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
341 342 343 344 345 346 347 |
# File 'lib/lotus/utils/string.rb', line 341 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
297 298 299 |
# File 'lib/lotus/utils/string.rb', line 297 def hash @string.hash end |
#namespace ⇒ String
Return the top level namespace name
230 231 232 |
# File 'lib/lotus/utils/string.rb', line 230 def namespace self.class.new split(NAMESPACE_SEPARATOR).first end |
#pluralize ⇒ Lotus::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.
276 277 278 |
# File 'lib/lotus/utils/string.rb', line 276 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
414 415 416 |
# File 'lib/lotus/utils/string.rb', line 414 def respond_to_missing?(m, include_private=false) @string.respond_to?(m, include_private) end |
#rsub(pattern, replacement) ⇒ Lotus::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.
384 385 386 387 388 389 390 391 392 |
# File 'lib/lotus/utils/string.rb', line 384 def rsub(pattern, replacement) if i = rindex(pattern) 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
356 357 358 |
# File 'lib/lotus/utils/string.rb', line 356 def scan(pattern, &blk) @string.scan(pattern, &blk) end |
#singularize ⇒ Lotus::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.
288 289 290 |
# File 'lib/lotus/utils/string.rb', line 288 def singularize self.class.new Inflector.singularize(self) end |
#split(pattern, limit = 0) ⇒ Array<String>
Split the string with the given pattern
330 331 332 |
# File 'lib/lotus/utils/string.rb', line 330 def split(pattern, limit = 0) @string.split(pattern, limit) end |
#titleize ⇒ Lotus::Utils::String
Return a titleized version of the string
97 98 99 |
# File 'lib/lotus/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
306 307 308 |
# File 'lib/lotus/utils/string.rb', line 306 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 |
# File 'lib/lotus/utils/string.rb', line 254 def tokenize if match = TOKENIZE_REGEXP.match(@string) pre, post = match.pre_match, 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/lotus/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 |