lite-ruby 1.3.2 → 2.0.2

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.
@@ -1,171 +1,169 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- if Lite::Ruby.configuration.monkey_patches.include?('object')
4
- class Object
5
-
6
- FALSE_VALUES = %w[
7
- 0 f false n no off
8
- ].freeze
9
- TRUE_VALUES = %w[
10
- 1 t true y yes on
11
- ].freeze
12
-
13
- # NOTE: There is a clash between the PG gem and the `array?` method.
14
- # We only need to skip this on migrations since that action
15
- # happens on a seperate runtime.
16
- unless defined?(PG) && ARGV.first.to_s.start_with?('db:')
17
- def array?
18
- is_a?(Array)
19
- end
20
- end
21
-
22
- def bool?
23
- true? || false?
24
- end
25
-
26
- def boolean?
27
- val = to_s.downcase
28
- TRUE_VALUES.include?(val) || FALSE_VALUES.include?(val)
3
+ class Object
4
+
5
+ FALSE_VALUES = %w[
6
+ 0 f false n no off
7
+ ].freeze
8
+ TRUE_VALUES = %w[
9
+ 1 t true y yes on
10
+ ].freeze
11
+
12
+ # NOTE: There is a clash between the PG gem and the `array?` method.
13
+ # We only need to skip this on migrations since that action
14
+ # happens on a seperate runtime.
15
+ unless defined?(PG) && ARGV.first.to_s.start_with?('db:')
16
+ def array?
17
+ is_a?(Array)
29
18
  end
19
+ end
30
20
 
31
- def date?
32
- is_a?(Date)
33
- end
21
+ def bool?
22
+ true? || false?
23
+ end
34
24
 
35
- # rubocop:disable Style/YodaCondition
36
- def false?
37
- false == self
38
- end
39
- # rubocop:enable Style/YodaCondition
25
+ def boolean?
26
+ val = to_s.downcase
27
+ TRUE_VALUES.include?(val) || FALSE_VALUES.include?(val)
28
+ end
40
29
 
41
- def falsey?
42
- nil? || FALSE_VALUES.include?(to_s.downcase)
43
- end
30
+ def date?
31
+ is_a?(Date)
32
+ end
44
33
 
45
- def float?
46
- is_a?(Float)
47
- end
34
+ # rubocop:disable Style/YodaCondition
35
+ def false?
36
+ false == self
37
+ end
38
+ # rubocop:enable Style/YodaCondition
48
39
 
49
- def hash?
50
- is_a?(Hash)
51
- end
40
+ def falsey?
41
+ nil? || FALSE_VALUES.include?(to_s.downcase)
42
+ end
52
43
 
53
- def integer?
54
- is_a?(Integer)
55
- end
44
+ def float?
45
+ is_a?(Float)
46
+ end
56
47
 
57
- # rubocop:disable Naming/PredicateName
58
- def is_any?(*objects)
59
- objects.any? { |obj| is_a?(obj) }
60
- end
61
- # rubocop:enable Naming/PredicateName
48
+ def hash?
49
+ is_a?(Hash)
50
+ end
62
51
 
63
- def numeral?
64
- !to_s.match(/\A[+-]?\d+?(\.\d+)?\Z/).nil?
65
- end
52
+ def integer?
53
+ is_a?(Integer)
54
+ end
66
55
 
67
- def numeric?
68
- is_a?(Numeric)
69
- end
56
+ # rubocop:disable Naming/PredicateName
57
+ def is_any?(*objects)
58
+ objects.any? { |obj| is_a?(obj) }
59
+ end
60
+ # rubocop:enable Naming/PredicateName
70
61
 
71
- def open_struct?
72
- is_a?(OpenStruct)
73
- end
62
+ def numeral?
63
+ !to_s.match(/\A[+-]?\d+?(\.\d+)?\Z/).nil?
64
+ end
74
65
 
75
- def palindrome?
76
- to_s == to_s.reverse
77
- end
66
+ def numeric?
67
+ is_a?(Numeric)
68
+ end
78
69
 
79
- def range?
80
- is_a?(Range)
81
- end
70
+ def open_struct?
71
+ is_a?(OpenStruct)
72
+ end
82
73
 
83
- def safe_call(...)
84
- try_call(...) || self
85
- end
74
+ def palindrome?
75
+ to_s == to_s.reverse
76
+ end
86
77
 
87
- def safe_send(...)
88
- try_send(...) || self
89
- end
78
+ def range?
79
+ is_a?(Range)
80
+ end
90
81
 
91
- def safe_try(...)
92
- try(...) || self
93
- end
82
+ def safe_call(...)
83
+ try_call(...) || self
84
+ end
94
85
 
95
- def salvage(placeholder = '---')
96
- blank? ? placeholder : self
97
- end
86
+ def safe_send(...)
87
+ try_send(...) || self
88
+ end
98
89
 
99
- def salvage_try(method_name = nil, *args, placeholder: '---', &block)
100
- try(method_name, *args, &block).salvage(placeholder)
101
- end
90
+ def safe_try(...)
91
+ try(...) || self
92
+ end
102
93
 
103
- def send_chain(*args)
104
- Array(args).inject(self) { |obj, argz| obj.send(*argz) }
105
- end
94
+ def salvage(placeholder = '---')
95
+ blank? ? placeholder : self
96
+ end
106
97
 
107
- def send_chain_if(*args)
108
- Array(args).inject(self) { |obj, argz| obj.send_if(*argz) }
109
- end
98
+ def salvage_try(method_name = nil, *args, placeholder: '---', &block)
99
+ try(method_name, *args, &block).salvage(placeholder)
100
+ end
110
101
 
111
- def send_if(key, *args, **kwargs, &block)
112
- return self unless respond_to?(key)
102
+ def send_chain(*args)
103
+ Array(args).inject(self) { |obj, argz| obj.send(*argz) }
104
+ end
113
105
 
114
- send(key, *args, **kwargs, &block)
115
- end
106
+ def send_chain_if(*args)
107
+ Array(args).inject(self) { |obj, argz| obj.send_if(*argz) }
108
+ end
116
109
 
117
- def set?
118
- is_a?(Set)
119
- end
110
+ def send_if(key, *args, **kwargs, &block)
111
+ return self unless respond_to?(key)
120
112
 
121
- def string?
122
- is_a?(String)
123
- end
113
+ send(key, *args, **kwargs, &block)
114
+ end
124
115
 
125
- def struct?
126
- is_a?(Struct)
127
- end
116
+ def set?
117
+ is_a?(Set)
118
+ end
128
119
 
129
- def symbol?
130
- is_a?(Symbol)
131
- end
120
+ def string?
121
+ is_a?(String)
122
+ end
132
123
 
133
- def time?
134
- is_a?(Time)
135
- end
124
+ def struct?
125
+ is_a?(Struct)
126
+ end
136
127
 
137
- def to_bool
138
- return true if truthy?
139
- return false if falsey?
128
+ def symbol?
129
+ is_a?(Symbol)
130
+ end
140
131
 
141
- nil
142
- end
132
+ def time?
133
+ is_a?(Time)
134
+ end
143
135
 
144
- # rubocop:disable Style/YodaCondition
145
- def true?
146
- true == self
147
- end
148
- # rubocop:enable Style/YodaCondition
136
+ def to_bool
137
+ return true if truthy?
138
+ return false if falsey?
149
139
 
150
- def truthy?
151
- TRUE_VALUES.include?(to_s.downcase)
152
- end
140
+ nil
141
+ end
153
142
 
154
- def try_call(...)
155
- return unless respond_to?(:call)
143
+ # rubocop:disable Style/YodaCondition
144
+ def true?
145
+ true == self
146
+ end
147
+ # rubocop:enable Style/YodaCondition
156
148
 
157
- call(...)
158
- end
149
+ def truthy?
150
+ TRUE_VALUES.include?(to_s.downcase)
151
+ end
159
152
 
160
- def try_send(...)
161
- send(...)
162
- rescue StandardError
163
- nil
164
- end
153
+ def try_call(...)
154
+ return unless respond_to?(:call)
165
155
 
166
- alias to_b to_bool
156
+ call(...)
157
+ end
167
158
 
159
+ def try_send(...)
160
+ send(...)
161
+ rescue StandardError
162
+ nil
168
163
  end
169
164
 
170
- require 'lite/ruby/safe/object' unless defined?(ActiveSupport)
165
+ alias to_b to_bool
166
+
171
167
  end
168
+
169
+ require 'lite/ruby/safe/object' unless defined?(ActiveSupport)
@@ -1,30 +1,28 @@
1
1
  # frozen_string_literal: false
2
2
 
3
- if Lite::Ruby.configuration.monkey_patches.include?('open_struct')
4
- require 'ostruct'
3
+ require 'ostruct' unless defined?(OpenStruct)
5
4
 
6
- class OpenStruct
5
+ class OpenStruct
7
6
 
8
- def attributes
9
- @table
10
- end
7
+ def attributes
8
+ @table
9
+ end
11
10
 
12
- def replace(args)
13
- args.each { |key, val| self[key] = val }
14
- end
11
+ def replace(args)
12
+ args.each { |key, val| self[key] = val }
13
+ end
15
14
 
16
- def to_hash(table: true)
17
- return attributes unless table
15
+ def to_hash(table: true)
16
+ return attributes unless table
18
17
 
19
- { table: attributes }
20
- end
18
+ { table: attributes }
19
+ end
21
20
 
22
- def to_json(table: true)
23
- to_hash(table: table).to_json
24
- end
21
+ def to_json(table: true)
22
+ to_hash(table: table).to_json
23
+ end
25
24
 
26
- alias as_json to_json
27
- alias to_h to_hash
25
+ alias as_json to_json
26
+ alias to_h to_hash
28
27
 
29
- end
30
28
  end
@@ -1,32 +1,30 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- if Lite::Ruby.configuration.monkey_patches.include?('range')
4
- class Range
3
+ class Range
5
4
 
6
- def combine(other)
7
- to_a.concat(other.to_a)
8
- end
9
-
10
- def include_with_range?(other)
11
- return include?(other) unless other.is_a?(Range)
5
+ def combine(other)
6
+ to_a.concat(other.to_a)
7
+ end
12
8
 
13
- operator = exclude_end? && !other.exclude_end? ? :< : :<=
14
- include?(other.first) && other.last.send(operator, last)
15
- end
9
+ def include_with_range?(other)
10
+ return include?(other) unless other.is_a?(Range)
16
11
 
17
- def sample
18
- to_a.sample
19
- end
12
+ operator = exclude_end? && !other.exclude_end? ? :< : :<=
13
+ include?(other.first) && other.last.send(operator, last)
14
+ end
20
15
 
21
- def shuffle
22
- to_a.shuffle
23
- end
16
+ def sample
17
+ to_a.sample
18
+ end
24
19
 
25
- def within?(other)
26
- cover?(other.first) && cover?(other.last)
27
- end
20
+ def shuffle
21
+ to_a.shuffle
22
+ end
28
23
 
24
+ def within?(other)
25
+ cover?(other.first) && cover?(other.last)
29
26
  end
30
27
 
31
- require 'lite/ruby/safe/range' unless defined?(ActiveSupport)
32
28
  end
29
+
30
+ require 'lite/ruby/safe/range' unless defined?(ActiveSupport)
@@ -151,16 +151,17 @@ class String
151
151
 
152
152
  omission = options[:omission] || '...'
153
153
  seperator = options[:separator]
154
-
155
154
  size_with_room_for_omission = truncate_at - omission.length
155
+ stop = rindex(seperator || '', size_with_room_for_omission) if seperator
156
+ "#{self[0, stop || size_with_room_for_omission]}#{omission}"
157
+ end
156
158
 
157
- stop = if seperator
158
- rindex(seperator || '', size_with_room_for_omission) || size_with_room_for_omission
159
- else
160
- size_with_room_for_omission
161
- end
159
+ def truncate_words(words_count, options = {})
160
+ sep = options[:separator] || /\s+/
161
+ sep = Regexp.escape(sep.to_s) unless sep.is_a?(Regexp)
162
+ return dup unless self =~ /\A((?>.+?#{sep}){#{words_count - 1}}.+?)#{sep}.*/m
162
163
 
163
- "#{self[0, stop]}#{omission}"
164
+ $1 + (options[:omission] || '...')
164
165
  end
165
166
 
166
167
  def underscore
@@ -1,485 +1,449 @@
1
1
  # frozen_string_literal: false
2
2
 
3
- if Lite::Ruby.configuration.monkey_patches.include?('string')
4
- class String
5
-
6
- TRANSLITERATIONS = {
7
- 'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä' => 'A', 'Å' => 'A', 'Æ' => 'Ae',
8
- 'Ç' => 'C', 'È' => 'E', 'É' => 'E', 'Ê' => 'E', 'Ë' => 'E', 'Ì' => 'I', 'Í' => 'I',
9
- 'Î' => 'I', 'Ï' => 'I', 'Ð' => 'D', 'Ñ' => 'N', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O',
10
- 'Õ' => 'O', 'Ö' => 'O', 'Ø' => 'O', 'Ù' => 'U', 'Ú' => 'U', 'Û' => 'U', 'Ü' => 'U',
11
- 'Ý' => 'Y', 'Þ' => 'Th', 'ß' => 'ss', 'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a',
12
- 'ä' => 'a', 'å' => 'a', 'æ' => 'ae', 'ç' => 'c', 'è' => 'e', 'é' => 'e', 'ê' => 'e',
13
- 'ë' => 'e', 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', 'ð' => 'd', 'ñ' => 'n',
14
- 'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o', 'ö' => 'o', 'ø' => 'o', 'ù' => 'u',
15
- 'ú' => 'u', 'û' => 'u', 'ü' => 'u', 'ý' => 'y', 'þ' => 'th', 'ÿ' => 'y', 'Ā' => 'A',
16
- 'ā' => 'a', 'Ă' => 'A', 'ă' => 'a', 'Ą' => 'A', 'ą' => 'a', 'Ć' => 'C', 'ć' => 'c',
17
- 'Ĉ' => 'C', 'ĉ' => 'c', 'Ċ' => 'C', 'ċ' => 'c', 'Č' => 'C', 'č' => 'c', 'Ď' => 'D',
18
- 'ď' => 'd', 'Đ' => 'D', 'đ' => 'd', 'Ē' => 'E', 'ē' => 'e', 'Ĕ' => 'E', 'ĕ' => 'e',
19
- 'Ė' => 'E', 'ė' => 'e', 'Ę' => 'E', 'ę' => 'e', 'Ě' => 'E', 'ě' => 'e', 'Ĝ' => 'G',
20
- 'ĝ' => 'g', 'Ğ' => 'G', 'ğ' => 'g', 'Ġ' => 'G', 'ġ' => 'g', 'Ģ' => 'G', 'ģ' => 'g',
21
- 'Ĥ' => 'H', 'ĥ' => 'h', 'Ħ' => 'H', 'ħ' => 'h', 'Ĩ' => 'I', 'ĩ' => 'i', 'Ī' => 'I',
22
- 'ī' => 'i', 'Ĭ' => 'I', 'ĭ' => 'i', 'Į' => 'I', 'į' => 'i', 'İ' => 'I', 'ı' => 'i',
23
- 'IJ' => 'Ij', 'ij' => 'ij', 'Ĵ' => 'J', 'ĵ' => 'j', 'Ķ' => 'K', 'ķ' => 'k', 'ĸ' => 'k',
24
- 'Ĺ' => 'L', 'ĺ' => 'l', 'Ļ' => 'L', 'ļ' => 'l', 'Ľ' => 'L', 'ľ' => 'l', 'Ŀ' => 'L',
25
- 'ŀ' => 'l', 'Ł' => 'L', 'ł' => 'l', 'Ń' => 'N', 'ń' => 'n', 'Ņ' => 'N', 'ņ' => 'n',
26
- 'Ň' => 'N', 'ň' => 'n', 'ʼn' => 'n', 'Ŋ' => 'Ng', 'ŋ' => 'ng', 'Ō' => 'O', 'ō' => 'o',
27
- 'Ŏ' => 'O', 'ŏ' => 'o', 'Ő' => 'O', 'ő' => 'o', 'Œ' => 'OE', 'œ' => 'oe', 'Ŕ' => 'R',
28
- 'ŕ' => 'r', 'Ŗ' => 'R', 'ŗ' => 'r', 'Ř' => 'R', 'ř' => 'r', 'Ś' => 'S', 'ś' => 's',
29
- 'Ŝ' => 'S', 'ŝ' => 's', 'Ş' => 'S', 'ş' => 's', 'Š' => 'S', 'š' => 's', 'Ţ' => 'T',
30
- 'ţ' => 't', 'Ť' => 'T', 'ť' => 't', 'Ŧ' => 'T', 'ŧ' => 't', 'Ũ' => 'U', 'ũ' => 'u',
31
- 'Ū' => 'U', 'ū' => 'u', 'Ŭ' => 'U', 'ŭ' => 'u', 'Ů' => 'U', 'ů' => 'u', 'Ű' => 'U',
32
- 'ű' => 'u', 'Ų' => 'U', 'ų' => 'u', 'Ŵ' => 'W', 'ŵ' => 'w', 'Ŷ' => 'Y', 'ŷ' => 'y',
33
- 'Ÿ' => 'Y', 'Ź' => 'Z', 'ź' => 'z', 'Ż' => 'Z', 'ż' => 'z', 'Ž' => 'Z', 'ž' => 'z'
34
- }.freeze
35
-
36
- def acronym
37
- gsub(/(([a-zA-Z0-9])([a-zA-Z0-9])*)./, '\\2') || self
38
- end
39
-
40
- def acronym!
41
- replace(acronym)
42
- end
3
+ require 'yaml' unless defined?(YAML)
43
4
 
44
- def any?(*keys)
45
- keys.any? { |key| include?(key) }
46
- end
5
+ class String
47
6
 
48
- def camelize!(first_letter = :upper)
49
- replace(camelize(first_letter))
50
- end
7
+ TRANSLITERATIONS = YAML.load_file(
8
+ File.expand_path('formats/string_transliterations.yml', File.dirname(__FILE__))
9
+ ).freeze
51
10
 
52
- def capitalized?
53
- capitalize == self
54
- end
11
+ def acronym
12
+ gsub(/(([a-zA-Z0-9])([a-zA-Z0-9])*)./, '\\2') || self
13
+ end
55
14
 
56
- def classify!
57
- replace(classify)
58
- end
15
+ def acronym!
16
+ replace(acronym)
17
+ end
59
18
 
60
- def dasherize!
61
- replace(dasherize)
62
- end
19
+ def any?(*keys)
20
+ keys.any? { |key| include?(key) }
21
+ end
63
22
 
64
- def deconstantize!
65
- replace(deconstantize)
66
- end
23
+ def camelize!(first_letter = :upper)
24
+ replace(camelize(first_letter))
25
+ end
67
26
 
68
- def dedupe(pattern)
69
- dup.dedupe!(pattern)
70
- end
27
+ def capitalized?
28
+ capitalize == self
29
+ end
71
30
 
72
- def dedupe!(pattern)
73
- pattern.each_char { |char| gsub!(/#{Regexp.escape(char)}{2,}/, char) }
74
- self
75
- end
31
+ def classify!
32
+ replace(classify)
33
+ end
76
34
 
77
- def demodulize!
78
- replace(demodulize)
79
- end
35
+ def dasherize!
36
+ replace(dasherize)
37
+ end
80
38
 
81
- def domain
82
- return self unless self =~ %r{^(?:\w+://)?([^/?]+)(?:/|\?|$)}
39
+ def deconstantize!
40
+ replace(deconstantize)
41
+ end
83
42
 
84
- Regexp.last_match(1)
85
- end
43
+ def dedupe(pattern)
44
+ dup.dedupe!(pattern)
45
+ end
86
46
 
87
- def downcase?
88
- downcase == self
89
- end
47
+ def dedupe!(pattern)
48
+ pattern.each_char { |char| gsub!(/#{Regexp.escape(char)}{2,}/, char) }
49
+ self
50
+ end
90
51
 
91
- def each_word(&block)
92
- words.each(&block)
93
- end
52
+ def demodulize!
53
+ replace(demodulize)
54
+ end
94
55
 
95
- def ellipsize(ellipsize_at, options = {})
96
- return self if length <= ellipsize_at
56
+ def domain
57
+ return self unless self =~ %r{^(?:\w+://)?([^/?]+)(?:/|\?|$)}
97
58
 
98
- separator = options[:separator] || '...'
99
- offset = options[:offset] || 4
59
+ Regexp.last_match(1)
60
+ end
100
61
 
101
- "#{self[0, offset]}#{separator}#{self[-offset, offset]}"
102
- end
62
+ def downcase?
63
+ downcase == self
64
+ end
103
65
 
104
- def format(*args)
105
- super(self, *args.flatten)
106
- end
66
+ def each_word(&block)
67
+ words.each(&block)
68
+ end
107
69
 
108
- def headerize
109
- squish.each_word(&:capitalize!).join(' ')
110
- end
70
+ def ellipsize(ellipsize_at, options = {})
71
+ return self if length <= ellipsize_at
111
72
 
112
- def headerize!
113
- replace(headerize)
114
- end
73
+ separator = options[:separator] || '...'
74
+ offset = options[:offset] || 4
115
75
 
116
- def humanize!(capitalize: true)
117
- replace(humanize(capitalize: capitalize))
118
- end
76
+ "#{self[0, offset]}#{separator}#{self[-offset, offset]}"
77
+ end
119
78
 
120
- def index_all(pattern)
121
- pattern = pattern.to_s if pattern.is_a?(Numeric)
122
- arr_indexes = []
123
- srch_index = rindex(pattern)
79
+ def format(*args)
80
+ super(self, *args.flatten)
81
+ end
124
82
 
125
- while srch_index
126
- temp_string = self[0..(srch_index - 1)]
127
- arr_indexes << srch_index
128
- srch_index = srch_index.zero? ? nil : temp_string.rindex(pattern)
129
- end
83
+ def headerize
84
+ squish.each_word(&:capitalize!).join(' ')
85
+ end
130
86
 
131
- arr_indexes.reverse
132
- end
87
+ def headerize!
88
+ replace(headerize)
89
+ end
133
90
 
134
- def labelize(capitalize: true)
135
- dup.labelize!(capitalize: capitalize)
136
- end
91
+ def humanize!(capitalize: true)
92
+ replace(humanize(capitalize: capitalize))
93
+ end
137
94
 
138
- def labelize!(capitalize: true)
139
- underscore!
140
- tr!('_', ' ')
141
- squish!
142
- gsub!(/([a-z\d]*)/i, &:downcase)
143
- gsub!(/\A\w/) { |str| capitalize ? str.upcase : str }
144
- gsub!(/ id\z/, ' ID') || self
145
- end
95
+ def index_all(pattern)
96
+ pattern = pattern.to_s if pattern.is_a?(Numeric)
97
+ arr_indexes = []
98
+ srch_index = rindex(pattern)
146
99
 
147
- def lchomp(match)
148
- dup.lchomp!(match)
100
+ while srch_index
101
+ temp_string = self[0..(srch_index - 1)]
102
+ arr_indexes << srch_index
103
+ srch_index = srch_index.zero? ? nil : temp_string.rindex(pattern)
149
104
  end
150
105
 
151
- def lchomp!(match)
152
- return self unless index(match)
106
+ arr_indexes.reverse
107
+ end
153
108
 
154
- self[0...match.size] = ''
155
- self
156
- end
109
+ def labelize(capitalize: true)
110
+ dup.labelize!(capitalize: capitalize)
111
+ end
157
112
 
158
- def methodize
159
- dup.methodize!
160
- end
113
+ def labelize!(capitalize: true)
114
+ underscore!
115
+ tr!('_', ' ')
116
+ squish!
117
+ gsub!(/([a-z\d]*)/i, &:downcase)
118
+ gsub!(/\A\w/) { |str| capitalize ? str.upcase : str }
119
+ gsub!(/ id\z/, ' ID') || self
120
+ end
161
121
 
162
- def methodize!
163
- gsub!(/([A-Z]+)([A-Z])/, '\1_\2')
164
- gsub!(/([a-z])([A-Z])/, '\1_\2')
165
- gsub!('/', '__')
166
- gsub!('::', '__')
167
- downcase! || self
168
- end
122
+ def lchomp(match)
123
+ dup.lchomp!(match)
124
+ end
169
125
 
170
- def modulize
171
- dup.modulize!
172
- end
126
+ def lchomp!(match)
127
+ return self unless index(match)
173
128
 
174
- def modulize!
175
- gsub!(/__(.?)/) { "::#{$1.upcase}" }
176
- gsub!(%r{/(.?)}) { "::#{$1.upcase}" }
177
- gsub!(/(?:_+|-+)([a-z])/) { $1.upcase }
178
- gsub!(/(\A|\s)([a-z])/) { $1 + $2.upcase } || self
179
- end
129
+ self[0...match.size] = ''
130
+ self
131
+ end
180
132
 
181
- def mixedcase?
182
- !upcase? && !downcase?
183
- end
133
+ def methodize
134
+ dup.methodize!
135
+ end
184
136
 
185
- def non_possessive
186
- dup.non_possessive!
187
- end
137
+ def methodize!
138
+ gsub!(/([A-Z]+)([A-Z])/, '\1_\2')
139
+ gsub!(/([a-z])([A-Z])/, '\1_\2')
140
+ gsub!('/', '__')
141
+ gsub!('::', '__')
142
+ downcase! || self
143
+ end
188
144
 
189
- def non_possessive!
190
- return self unless possessive?
145
+ def modulize
146
+ dup.modulize!
147
+ end
191
148
 
192
- chomp!("'s") || chomp!("'") || self
193
- end
149
+ def modulize!
150
+ gsub!(/__(.?)/) { "::#{$1.upcase}" }
151
+ gsub!(%r{/(.?)}) { "::#{$1.upcase}" }
152
+ gsub!(/(?:_+|-+)([a-z])/) { $1.upcase }
153
+ gsub!(/(\A|\s)([a-z])/) { $1 + $2.upcase } || self
154
+ end
194
155
 
195
- def ordinal
196
- to_i.ordinal
197
- end
156
+ def mixedcase?
157
+ !upcase? && !downcase?
158
+ end
198
159
 
199
- def ordinalize
200
- to_i.ordinalize
201
- end
160
+ def non_possessive
161
+ dup.non_possessive!
162
+ end
202
163
 
203
- def parameterize!(separator: '-')
204
- replace(parameterize(separator: separator))
205
- end
164
+ def non_possessive!
165
+ return self unless possessive?
206
166
 
207
- def pathize
208
- dup.pathize!
209
- end
167
+ chomp!("'s") || chomp!("'") || self
168
+ end
210
169
 
211
- def pathize!
212
- gsub!(/([A-Z]+)([A-Z])/, '\1_\2')
213
- gsub!(/([a-z])([A-Z])/, '\1_\2')
214
- gsub!('__', '/')
215
- gsub!('::', '/')
216
- gsub!(/\s+/, '')
217
- gsub!(/[?%*:|"<>.]+/, '')
218
- downcase! || self
219
- end
170
+ def ordinal
171
+ to_i.ordinal
172
+ end
220
173
 
221
- def pollute(delimiter = '^--^--^')
222
- chars.map { |chr| "#{chr}#{delimiter}" }.join
223
- end
174
+ def ordinalize
175
+ to_i.ordinalize
176
+ end
224
177
 
225
- def pollute!(delimiter = '^--^--^')
226
- replace(pollute(delimiter))
227
- end
178
+ def parameterize!(separator: '-')
179
+ replace(parameterize(separator: separator))
180
+ end
228
181
 
229
- def pop
230
- self[-1]
231
- end
182
+ def pathize
183
+ dup.pathize!
184
+ end
232
185
 
233
- def possessive
234
- return self if possessive?
186
+ def pathize!
187
+ gsub!(/([A-Z]+)([A-Z])/, '\1_\2')
188
+ gsub!(/([a-z])([A-Z])/, '\1_\2')
189
+ gsub!('__', '/')
190
+ gsub!('::', '/')
191
+ gsub!(/\s+/, '')
192
+ gsub!(/[?%*:|"<>.]+/, '')
193
+ downcase! || self
194
+ end
235
195
 
236
- possession = end_with?('s') ? "'" : "'s"
237
- "#{self}#{possession}"
238
- end
196
+ def pollute(delimiter = '^--^--^')
197
+ chars.map { |chr| "#{chr}#{delimiter}" }.join
198
+ end
239
199
 
240
- def possessive!
241
- replace(possessive)
242
- end
200
+ def pollute!(delimiter = '^--^--^')
201
+ replace(pollute(delimiter))
202
+ end
243
203
 
244
- def possessive?
245
- %w['s s'].any? { |pos| end_with?(pos) }
246
- end
204
+ def pop
205
+ self[-1]
206
+ end
247
207
 
248
- def push(string)
249
- replace(concat(string))
250
- end
208
+ def possessive
209
+ return self if possessive?
251
210
 
252
- # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
253
- def quote(type = :double, amount = nil)
254
- if type.is_a?(Integer)
255
- tmp = amount
256
- amount = type
257
- type = tmp || :mixed
258
- else
259
- amount ||= 1
260
- end
211
+ possession = end_with?('s') ? "'" : "'s"
212
+ "#{self}#{possession}"
213
+ end
261
214
 
262
- case type.to_s
263
- when "'", 'single', 's', '1'
264
- f = "'" * amount
265
- b = f
266
- when '"', 'double', 'd', '2'
267
- f = '"' * amount
268
- b = f
269
- when '`', 'back', 'backtick', 'b', '-1'
270
- f = '`' * amount
271
- b = f
272
- when "`'", 'bracket', 'sb'
273
- f = '`' * amount
274
- b = "'" * amount
275
- when "'\"", 'mixed', 'm', 'Integer'
276
- c = (amount.to_f / 2).to_i
277
- f = '"' * c
278
- b = f
279
-
280
- if amount.odd?
281
- f = "'#{f}"
282
- b += "'"
283
- end
284
- else
285
- raise ArgumentError, "Invalid quote type: #{type.inspect}"
286
- end
215
+ def possessive!
216
+ replace(possessive)
217
+ end
287
218
 
288
- "#{f}#{self}#{b}"
289
- end
290
- # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
219
+ def possessive?
220
+ %w['s s'].any? { |pos| end_with?(pos) }
221
+ end
291
222
 
292
- def quote!(type = :double, amount = nil)
293
- replace(quote(type, amount))
294
- end
223
+ def push(string)
224
+ replace(concat(string))
225
+ end
295
226
 
296
- def remove_tags
297
- dup.remove_tags!
227
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
228
+ def quote(type = :double, amount = nil)
229
+ if type.is_a?(Integer)
230
+ tmp = amount
231
+ amount = type
232
+ type = tmp || :mixed
233
+ else
234
+ amount ||= 1
235
+ end
236
+
237
+ case type.to_s
238
+ when "'", 'single', 's', '1'
239
+ f = "'" * amount
240
+ b = f
241
+ when '"', 'double', 'd', '2'
242
+ f = '"' * amount
243
+ b = f
244
+ when '`', 'back', 'backtick', 'b', '-1'
245
+ f = '`' * amount
246
+ b = f
247
+ when "`'", 'bracket', 'sb'
248
+ f = '`' * amount
249
+ b = "'" * amount
250
+ when "'\"", 'mixed', 'm', 'Integer'
251
+ c = (amount.to_f / 2).to_i
252
+ f = '"' * c
253
+ b = f
254
+
255
+ if amount.odd?
256
+ f = "'#{f}"
257
+ b += "'"
258
+ end
259
+ else
260
+ raise ArgumentError, "Invalid quote type: #{type.inspect}"
298
261
  end
299
262
 
300
- def remove_tags!
301
- gsub!(%r{</?[^>]*>}, '') || self
302
- end
263
+ "#{f}#{self}#{b}"
264
+ end
265
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
303
266
 
304
- def rotate(amount = 1)
305
- dup.rotate!(amount)
306
- end
267
+ def quote!(type = :double, amount = nil)
268
+ replace(quote(type, amount))
269
+ end
307
270
 
308
- def rotate!(amount = 1)
309
- amount += size if amount.negative?
310
- slice!(amount, size - amount) + slice!(0, amount)
311
- end
271
+ def remove_tags
272
+ dup.remove_tags!
273
+ end
312
274
 
313
- # rubocop:disable Metrics/MethodLength
314
- def safe_encode(target_encoding, replacement = '')
315
- encode(target_encoding)
316
- rescue Encoding::InvalidByteSequenceError
317
- force_encoding(target_encoding).scrub!(replacement)
318
- rescue Encoding::UndefinedConversionError
319
- encode(
320
- target_encoding,
321
- invalid: :replace,
322
- undef: :replace,
323
- replace: replacement,
324
- UNIVERSAL_NEWLINE_DECORATOR: true
325
- )
326
- end
327
- # rubocop:enable Metrics/MethodLength
275
+ def remove_tags!
276
+ gsub!(%r{</?[^>]*>}, '') || self
277
+ end
328
278
 
329
- def safe_encode!(target_encoding, replacement = '')
330
- replace(safe_encode(target_encoding, replacement))
331
- end
279
+ def rotate(amount = 1)
280
+ dup.rotate!(amount)
281
+ end
332
282
 
333
- def sample(separator = ' ')
334
- split(separator).sample
335
- end
283
+ def rotate!(amount = 1)
284
+ amount += size if amount.negative?
285
+ slice!(amount, size - amount) + slice!(0, amount)
286
+ end
336
287
 
337
- def sample!(separator = ' ')
338
- replace(sample(separator))
339
- end
288
+ # rubocop:disable Metrics/MethodLength
289
+ def safe_encode(target_encoding, replacement = '')
290
+ encode(target_encoding)
291
+ rescue Encoding::InvalidByteSequenceError
292
+ force_encoding(target_encoding).scrub!(replacement)
293
+ rescue Encoding::UndefinedConversionError
294
+ encode(
295
+ target_encoding,
296
+ invalid: :replace,
297
+ undef: :replace,
298
+ replace: replacement,
299
+ UNIVERSAL_NEWLINE_DECORATOR: true
300
+ )
301
+ end
302
+ # rubocop:enable Metrics/MethodLength
340
303
 
341
- def shift(*patterns)
342
- dup.shift!(*patterns)
343
- end
304
+ def safe_encode!(target_encoding, replacement = '')
305
+ replace(safe_encode(target_encoding, replacement))
306
+ end
344
307
 
345
- def shift!(*patterns)
346
- return self[0] if patterns.empty?
308
+ def sample(separator = ' ')
309
+ split(separator).sample
310
+ end
347
311
 
348
- patterns.each_with_object(self) { |pat, str| str.sub!(pat, '') }
349
- end
312
+ def sample!(separator = ' ')
313
+ replace(sample(separator))
314
+ end
350
315
 
351
- def shuffle(separator = '')
352
- split(separator).shuffle.join
353
- end
316
+ def shift(*patterns)
317
+ dup.shift!(*patterns)
318
+ end
354
319
 
355
- def shuffle!(separator = '')
356
- replace(shuffle(separator))
357
- end
320
+ def shift!(*patterns)
321
+ return self[0] if patterns.empty?
358
322
 
359
- def sift(keep)
360
- keep = case keep
361
- when String then keep.chars
362
- when Array then keep.map(&:to_s)
363
- when Range then keep.to_a.map(&:to_s)
364
- else raise TypeError, "Invalid parameter: #{keep.inspect}"
365
- end
323
+ patterns.each_with_object(self) { |pat, str| str.sub!(pat, '') }
324
+ end
366
325
 
367
- chars.keep_if { |chr| keep.include?(chr) }.join
368
- end
326
+ def shuffle(separator = '')
327
+ split(separator).shuffle.join
328
+ end
369
329
 
370
- def sift!(keep)
371
- replace(sift(keep))
372
- end
330
+ def shuffle!(separator = '')
331
+ replace(shuffle(separator))
332
+ end
373
333
 
374
- def slugify
375
- dup.slugify!
376
- end
334
+ def sift(keep)
335
+ keep = case keep
336
+ when String then keep.chars
337
+ when Array then keep.map(&:to_s)
338
+ when Range then keep.to_a.map(&:to_s)
339
+ else raise TypeError, "Invalid parameter: #{keep.inspect}"
340
+ end
377
341
 
378
- def slugify!
379
- gsub!(/[^\x00-\x7F]+/, '')
380
- gsub!(/[^\w_ \-]+/i, '')
381
- gsub!(/[ \-]+/i, '-')
382
- gsub!(/^-|-$/i, '')
383
- downcase! || self
384
- end
342
+ chars.keep_if { |chr| keep.include?(chr) }.join
343
+ end
385
344
 
386
- def sort
387
- chars.sort.join
388
- end
345
+ def sift!(keep)
346
+ replace(sift(keep))
347
+ end
389
348
 
390
- def sort!
391
- replace(sort)
392
- end
349
+ def slugify
350
+ dup.slugify!
351
+ end
393
352
 
394
- def transliterize
395
- TRANSLITERATIONS.each_with_object(dup) { |(k, v), s| s.gsub!(k, v) }
396
- end
353
+ def slugify!
354
+ gsub!(/[^\x00-\x7F]+/, '')
355
+ gsub!(/[^\w \-]+/i, '')
356
+ gsub!(/[ \-]+/i, '-')
357
+ gsub!(/^-|-$/i, '')
358
+ downcase! || self
359
+ end
397
360
 
398
- def transliterize!
399
- replace(transliterize)
400
- end
361
+ def sort
362
+ chars.sort.join
363
+ end
401
364
 
402
- def titleize!
403
- replace(titleize)
404
- end
365
+ def sort!
366
+ replace(sort)
367
+ end
405
368
 
406
- def truncate_words(word_count, options = {})
407
- omission = options[:omission] || '...'
408
- seperator = options[:separator] || /\s+/
369
+ def transliterize
370
+ TRANSLITERATIONS.each_with_object(dup) { |(k, v), s| s.gsub!(k, v) }
371
+ end
409
372
 
410
- seperator = Regexp.escape(seperator.to_s) unless seperator.is_a(Regexp)
411
- return self unless /\A((?:.+?#{seperator}){#{word_count - 1}}.+?)#{seperator}.*/m.match?(self)
373
+ def transliterize!
374
+ replace(transliterize)
375
+ end
412
376
 
413
- "#{::Regexp.last_match(1)}#{omission}"
414
- end
377
+ def titleize!
378
+ replace(titleize)
379
+ end
415
380
 
416
- def upcase?
417
- upcase == self
418
- end
381
+ def upcase?
382
+ upcase == self
383
+ end
419
384
 
420
- def underscore!
421
- replace(underscore)
422
- end
385
+ def underscore!
386
+ replace(underscore)
387
+ end
423
388
 
424
- def unpollute(delimiter = '^--^--^')
425
- dup.unpollute!(delimiter)
426
- end
389
+ def unpollute(delimiter = '^--^--^')
390
+ dup.unpollute!(delimiter)
391
+ end
427
392
 
428
- def unpollute!(delimiter = '^--^--^')
429
- gsub!(delimiter, '') || self
430
- end
393
+ def unpollute!(delimiter = '^--^--^')
394
+ gsub!(delimiter, '') || self
395
+ end
431
396
 
432
- def unquote
433
- dup.unquote!
434
- end
397
+ def unquote
398
+ dup.unquote!
399
+ end
435
400
 
436
- def unquote!
437
- [0, -1].each do |i|
438
- case self[i, 1]
439
- when "'", '"', '`' then self[i] = ''
440
- end
401
+ def unquote!
402
+ [0, -1].each do |i|
403
+ case self[i, 1]
404
+ when "'", '"', '`' then self[i] = ''
441
405
  end
442
-
443
- self
444
406
  end
445
407
 
446
- def unshift(*patterns)
447
- patterns.each_with_object('') { |pat, str| str << pat }
448
- .concat(self)
449
- end
450
-
451
- def unshift!(*patterns)
452
- replace(unshift(*patterns))
453
- end
408
+ self
409
+ end
454
410
 
455
- def words
456
- split(/\s+/)
457
- end
411
+ def unshift(*patterns)
412
+ patterns.each_with_object('') { |pat, str| str << pat }
413
+ .concat(self)
414
+ end
458
415
 
459
- def words_without_punctuation
460
- str = dup
461
- str.gsub!(%r{[.?¿¡…!,::;—"。?!、‘“”„«»〈〉《》,/\[\]]}, ' ')
462
- str.gsub!('- ', ' ')
463
- str.squeeze!(' ')
464
- str.strip!
465
- str.words
466
- end
416
+ def unshift!(*patterns)
417
+ replace(unshift(*patterns))
418
+ end
467
419
 
468
- def variablize
469
- "@#{gsub(/\W/, '_')}"
470
- end
420
+ def words
421
+ split(/\s+/)
422
+ end
471
423
 
472
- def variablize!
473
- replace(variablize)
474
- end
424
+ def words_without_punctuation
425
+ str = dup
426
+ str.gsub!(%r{[.?¿¡…!,::;—"。?!、‘“”„«»〈〉《》,/\[\]]}, ' ')
427
+ str.gsub!('- ', ' ')
428
+ str.squeeze!(' ')
429
+ str.strip!
430
+ str.words
431
+ end
475
432
 
476
- alias camelcase! camelize!
477
- alias labelcase labelize
478
- alias labelcase! labelize!
479
- alias snakecase! underscore!
480
- alias titlecase! titleize!
433
+ def variablize
434
+ "@#{gsub(/\W/, '_')}"
435
+ end
481
436
 
437
+ def variablize!
438
+ replace(variablize)
482
439
  end
483
440
 
484
- require 'lite/ruby/safe/string' unless defined?(ActiveSupport)
441
+ alias camelcase! camelize!
442
+ alias labelcase labelize
443
+ alias labelcase! labelize!
444
+ alias snakecase! underscore!
445
+ alias titlecase! titleize!
446
+
485
447
  end
448
+
449
+ require 'lite/ruby/safe/string' unless defined?(ActiveSupport)