lotus-utils 0.5.2 → 0.6.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 +16 -0
- data/LICENSE.md +1 -1
- data/README.md +73 -3
- data/lib/lotus/utils/attributes.rb +1 -1
- data/lib/lotus/utils/callbacks.rb +4 -16
- data/lib/lotus/utils/class.rb +6 -14
- data/lib/lotus/utils/class_attribute.rb +2 -1
- data/lib/lotus/utils/duplicable.rb +80 -0
- data/lib/lotus/utils/escape.rb +4 -1
- data/lib/lotus/utils/hash.rb +17 -17
- data/lib/lotus/utils/inflector.rb +120 -267
- data/lib/lotus/utils/kernel.rb +1 -1
- data/lib/lotus/utils/load_paths.rb +19 -2
- data/lib/lotus/utils/path_prefix.rb +5 -2
- data/lib/lotus/utils/string.rb +54 -3
- data/lib/lotus/utils/version.rb +1 -1
- data/lotus-utils.gemspec +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c9cbb89b047bc9d6da31d644120a6314aae15e13
|
4
|
+
data.tar.gz: ec85522be16a248f320b93fe5ef0911f7de63853
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 529c56324efb450ead039cf3f1747e101d729a9dd8cef9876273acde10cdce5298a1f8a7c14d7136667e1fc9b2d713ec3a878fa6a96ae57a70c67d5c317f76b2
|
7
|
+
data.tar.gz: cc3c30a6aa45031df28cfc0c5b533ce8e3c9fc5d0b81e9893ac71ee845f15118901cc20b8c6b8baf0c24d33732dd8570ff4fa8aa3afc0bc776ca9673a3c40cd2
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,22 @@
|
|
1
1
|
# Lotus::Utils
|
2
2
|
Ruby core extentions and class utilities for Lotus
|
3
3
|
|
4
|
+
## v0.6.0 - 2016-01-12
|
5
|
+
### Added
|
6
|
+
- [Luca Guidi] Official support for Ruby 2.3
|
7
|
+
- [Luca Guidi] Custom inflections
|
8
|
+
- [Luca Guidi] Introduced `Lotus::Utils::Duplicable` as a safe dup logic for Ruby types
|
9
|
+
- [Luca Guidi] Added `Lotus::Utils::String#rsub` replace rightmost occurrence
|
10
|
+
|
11
|
+
### Fixed
|
12
|
+
- [Luca Guidi] Fix `Lotus::Utils::PathPrefix#join` and `#relative_join` by rejecting arguments that are equal to the separator
|
13
|
+
- [Karim Kiatlottiavi] Fix `Encoding::UndefinedConversionError` in `Lotus::Utils::Escape.encode`
|
14
|
+
|
15
|
+
### Changed
|
16
|
+
- [Luca Guidi] Deprecate Ruby 2.0 and 2.1
|
17
|
+
- [Luca Guidi] Removed `Lotus::Utils::Callbacks#add` in favor of `#append`
|
18
|
+
- [Luca Guidi] Removed pattern support for `Utils::Class.load!` (eg. `Articles(Controller|::Controller)`)
|
19
|
+
|
4
20
|
## v0.5.2 - 2015-09-30
|
5
21
|
### Added
|
6
22
|
- [Luca Guidi] Added `Lotus::Utils::String#capitalize`
|
data/LICENSE.md
CHANGED
data/README.md
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
|
1
2
|
# Lotus::Utils
|
2
3
|
|
3
4
|
Ruby core extentions and class utilities for [Lotus](http://lotusrb.org)
|
@@ -43,9 +44,78 @@ Or install it yourself as:
|
|
43
44
|
## Usage
|
44
45
|
|
45
46
|
__Lotus::Utils__ is designed to enhance Ruby's code and stdlib.
|
46
|
-
By default this gem doesn't load any code, you must require what you need
|
47
|
+
**By default this gem doesn't load any code, you must require what you need.**
|
48
|
+
|
49
|
+
## Features
|
50
|
+
|
51
|
+
### Lotus::Interactor
|
52
|
+
|
53
|
+
Standardized Service Object with small interface and rich returning result. [[API doc](http://www.rubydoc.info/gems/lotus-utils/Lotus/Interactor)]
|
54
|
+
|
55
|
+
### Lotus::Logger
|
56
|
+
|
57
|
+
Enhanced version of Ruby's `Logger`. [[API doc](http://www.rubydoc.info/gems/lotus-utils/Lotus/Logger)]
|
58
|
+
|
59
|
+
### Lotus::Utils::Attributes
|
60
|
+
|
61
|
+
Set of attributes with indifferent access. [[API doc](http://www.rubydoc.info/gems/lotus-utils/Lotus/Utils/Attributes)]
|
62
|
+
|
63
|
+
### Lotus::Utils::BasicObject
|
64
|
+
|
65
|
+
Enhanced version of Ruby's `BasicObject`. [[API doc](http://www.rubydoc.info/gems/lotus-utils/Lotus/Utils/BasicObject)]
|
66
|
+
|
67
|
+
### Lotus::Utils::Callbacks
|
68
|
+
|
69
|
+
Callbacks to decorate methods with `before` and `after` logic. It supports polymorphic callbacks (methods and procs). [[API doc](http://www.rubydoc.info/gems/lotus-utils/Lotus/Utils/Callbacks)]
|
70
|
+
|
71
|
+
### Lotus::Utils::Class
|
72
|
+
|
73
|
+
Load classes from strings. It also supports namespaces. [[API doc](http://www.rubydoc.info/gems/lotus-utils/Lotus/Utils/Class)]
|
74
|
+
|
75
|
+
### Lotus::Utils::ClassAttribute
|
76
|
+
|
77
|
+
Inheritable class attributes. [[API doc](http://www.rubydoc.info/gems/lotus-utils/Lotus/Utils/ClassAttribute)]
|
78
|
+
|
79
|
+
### Lotus::Utils::Deprecation
|
80
|
+
|
81
|
+
Deprecate Lotus features. [[API doc](http://www.rubydoc.info/gems/lotus-utils/Lotus/Utils/Deprecation)]
|
82
|
+
|
83
|
+
### Lotus::Utils::Duplicable
|
84
|
+
|
85
|
+
Safe `#dup` logic for Ruby objects. [[API doc](http://www.rubydoc.info/gems/lotus-utils/Lotus/Utils/Deprecation)]
|
86
|
+
|
87
|
+
|
88
|
+
### Lotus::Utils::Escape
|
89
|
+
|
90
|
+
Safe and fast escape for URLs, HTML content and attributes. Based on OWASP/ESAPI code. [[API doc](http://www.rubydoc.info/gems/lotus-utils/Lotus/Utils/Escape)]
|
91
|
+
|
92
|
+
### Lotus::Utils::Hash
|
93
|
+
|
94
|
+
Enhanced version of Ruby's `Hash`. [[API doc](http://www.rubydoc.info/gems/lotus-utils/Lotus/Utils/Hash)]
|
95
|
+
|
96
|
+
### Lotus::Utils::IO
|
97
|
+
|
98
|
+
Silence Ruby warnings. [[API doc](http://www.rubydoc.info/gems/lotus-utils/Lotus/Utils/IO)]
|
99
|
+
|
100
|
+
### Lotus::Utils::Inflector
|
101
|
+
|
102
|
+
Complete and customizable english inflections (pluralization and singularization). [[API doc](http://www.rubydoc.info/gems/lotus-utils/Lotus/Utils/Inflector)]
|
103
|
+
|
104
|
+
### Lotus::Utils::Kernel
|
105
|
+
|
106
|
+
Type coercions for most common Ruby types. [[API doc](http://www.rubydoc.info/gems/lotus-utils/Lotus/Utils/Kernel)]
|
107
|
+
|
108
|
+
### Lotus::Utils::LoadPaths
|
109
|
+
|
110
|
+
Manage directories where to find Ruby source code or web static assets. [[API doc](http://www.rubydoc.info/gems/lotus-utils/Lotus/Utils/LoadPaths)]
|
111
|
+
|
112
|
+
### Lotus::Utils::PathPrefix
|
113
|
+
|
114
|
+
Safe logic to manage relative URLs. [[API doc](http://www.rubydoc.info/gems/lotus-utils/Lotus/Utils/PathPrefix)]
|
115
|
+
|
116
|
+
### Lotus::Utils::String
|
47
117
|
|
48
|
-
|
118
|
+
Enhanced version of Ruby's `String`. [[API doc](http://www.rubydoc.info/gems/lotus-utils/Lotus/Utils/String)]
|
49
119
|
|
50
120
|
## Versioning
|
51
121
|
|
@@ -61,4 +131,4 @@ __Lotus::Utils__ uses [Semantic Versioning 2.0.0](http://semver.org)
|
|
61
131
|
|
62
132
|
## Copyright
|
63
133
|
|
64
|
-
Copyright © 2014-
|
134
|
+
Copyright © 2014-2016 Luca Guidi – Released under MIT License
|
@@ -27,7 +27,7 @@ module Lotus
|
|
27
27
|
# @example
|
28
28
|
# require 'lotus/utils/attributes'
|
29
29
|
#
|
30
|
-
# attributes = Lotus::Utils::Attributes.new(a: 1, b: { 2 => [3, 4] }
|
30
|
+
# attributes = Lotus::Utils::Attributes.new(a: 1, b: { 2 => [3, 4] })
|
31
31
|
# attributes.to_h # => { "a" => 1, "b" => { "2" => [3, 4] } }
|
32
32
|
def initialize(hash = {})
|
33
33
|
@attributes = Utils::Hash.new(hash, &nil).stringify!
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'lotus/utils/deprecation'
|
2
|
-
|
3
1
|
module Lotus
|
4
2
|
module Utils
|
5
3
|
# Before and After callbacks
|
@@ -60,16 +58,6 @@ module Lotus
|
|
60
58
|
@chain.uniq!
|
61
59
|
end
|
62
60
|
|
63
|
-
# @since 0.1.0
|
64
|
-
# @deprecated Use Lotus::Utils::Callbacks::Chain#append as it has the
|
65
|
-
# same effect, but it's more consistent with the new API.
|
66
|
-
#
|
67
|
-
# @see Lotus::Utils::Callbacks::Chain#append
|
68
|
-
def add(*callbacks, &blk)
|
69
|
-
Utils::Deprecation.new("Lotus::Utils::Callbacks::Chain#add is deprecated, use #append instead.")
|
70
|
-
append(*callbacks, &blk)
|
71
|
-
end
|
72
|
-
|
73
61
|
# Prepends the given callbacks to the beginning of the chain.
|
74
62
|
#
|
75
63
|
# @param callbacks [Array] one or multiple callbacks to add
|
@@ -133,7 +121,7 @@ module Lotus
|
|
133
121
|
# params = Hash[id: 23]
|
134
122
|
#
|
135
123
|
# chain = Lotus::Utils::Callbacks::Chain.new
|
136
|
-
# chain.
|
124
|
+
# chain.append :authenticate!, :set_article
|
137
125
|
#
|
138
126
|
# chain.run(action, params)
|
139
127
|
#
|
@@ -143,11 +131,11 @@ module Lotus
|
|
143
131
|
#
|
144
132
|
# chain = Lotus::Utils::Callbacks::Chain.new
|
145
133
|
#
|
146
|
-
# chain.
|
134
|
+
# chain.append do
|
147
135
|
# # some authentication logic
|
148
136
|
# end
|
149
137
|
#
|
150
|
-
# chain.
|
138
|
+
# chain.append do |params|
|
151
139
|
# # some other logic that requires `params`
|
152
140
|
# end
|
153
141
|
#
|
@@ -174,7 +162,7 @@ module Lotus
|
|
174
162
|
#
|
175
163
|
# chain.frozen? # => true
|
176
164
|
#
|
177
|
-
# chain.
|
165
|
+
# chain.append :authenticate! # => RuntimeError
|
178
166
|
def freeze
|
179
167
|
super
|
180
168
|
@chain.freeze
|
data/lib/lotus/utils/class.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'lotus/utils/string'
|
2
|
-
require 'lotus/utils/deprecation'
|
3
2
|
|
4
3
|
module Lotus
|
5
4
|
module Utils
|
@@ -39,14 +38,7 @@ module Lotus
|
|
39
38
|
# # with missing constant
|
40
39
|
# Lotus::Utils::Class.load!('Unknown') # => raises NameError
|
41
40
|
def self.load!(name, namespace = Object)
|
42
|
-
name
|
43
|
-
|
44
|
-
if name.match(/\|/)
|
45
|
-
Utils::Deprecation.new("Using Lotus::Utils::Class.load! with a pattern is deprecated, please use Lotus::Utils::Class.load_from_pattern!: #{ name }, #{ namespace }")
|
46
|
-
return load_from_pattern!(name, namespace)
|
47
|
-
end
|
48
|
-
|
49
|
-
namespace.const_get(name)
|
41
|
+
namespace.const_get(name.to_s)
|
50
42
|
end
|
51
43
|
|
52
44
|
# Loads a class from the given pattern name and namespace
|
@@ -75,17 +67,17 @@ module Lotus
|
|
75
67
|
# end
|
76
68
|
#
|
77
69
|
# # basic usage
|
78
|
-
# Lotus::Utils::Class.
|
70
|
+
# Lotus::Utils::Class.load_from_pattern!('App::Service') # => App::Service
|
79
71
|
#
|
80
72
|
# # with explicit namespace
|
81
|
-
# Lotus::Utils::Class.
|
73
|
+
# Lotus::Utils::Class.load_from_pattern!('Service', App) # => App::Service
|
82
74
|
#
|
83
75
|
# # with pattern
|
84
|
-
# Lotus::Utils::Class.
|
85
|
-
# Lotus::Utils::Class.
|
76
|
+
# Lotus::Utils::Class.load_from_pattern!('App::Service(::Endpoint|Endpoint)') # => App::Service::Endpoint
|
77
|
+
# Lotus::Utils::Class.load_from_pattern!('App::Service(Endpoint|::Endpoint)') # => App::ServiceEndpoint
|
86
78
|
#
|
87
79
|
# # with missing constant
|
88
|
-
# Lotus::Utils::Class.
|
80
|
+
# Lotus::Utils::Class.load_from_pattern!('Unknown') # => raises NameError
|
89
81
|
def self.load_from_pattern!(pattern, namespace = Object)
|
90
82
|
String.new(pattern).tokenize do |token|
|
91
83
|
begin
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'set'
|
2
|
+
require 'lotus/utils/duplicable'
|
2
3
|
|
3
4
|
module Lotus
|
4
5
|
module Utils
|
@@ -74,7 +75,7 @@ module Lotus
|
|
74
75
|
def inherited(subclass)
|
75
76
|
class_attributes.each do |attr|
|
76
77
|
value = send(attr)
|
77
|
-
value =
|
78
|
+
value = Duplicable.dup(value)
|
78
79
|
subclass.class_attribute attr
|
79
80
|
subclass.send("#{attr}=", value)
|
80
81
|
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
module Lotus
|
2
|
+
module Utils
|
3
|
+
# Safe dup logic
|
4
|
+
#
|
5
|
+
# @since 0.6.0
|
6
|
+
module Duplicable
|
7
|
+
# Duplicates the given value.
|
8
|
+
#
|
9
|
+
# It accepts a block to customize the logic.
|
10
|
+
#
|
11
|
+
# The following types aren't duped:
|
12
|
+
#
|
13
|
+
# * <tt>NilClass</tt>
|
14
|
+
# * <tt>FalseClass</tt>
|
15
|
+
# * <tt>TrueClass</tt>
|
16
|
+
# * <tt>Symbol</tt>
|
17
|
+
# * <tt>Numeric</tt>
|
18
|
+
#
|
19
|
+
# All the other types are duped via <tt>#dup</tt>
|
20
|
+
#
|
21
|
+
# @param value [Object] the value to duplicate
|
22
|
+
# @param blk [Proc] the optional block to customize the logic
|
23
|
+
#
|
24
|
+
# @return [Object] the duped value
|
25
|
+
#
|
26
|
+
# @since 0.6.0
|
27
|
+
#
|
28
|
+
# @example Basic Usage With Types That Can't Be Duped
|
29
|
+
# require 'lotus/utils/duplicable'
|
30
|
+
#
|
31
|
+
# object = 23
|
32
|
+
# puts object.object_id # => 47
|
33
|
+
#
|
34
|
+
# result = Lotus::Utils::Duplicable.dup(object)
|
35
|
+
#
|
36
|
+
# puts result # => 23
|
37
|
+
# puts result.object_id # => 47 - Same object, because numbers can't be duped
|
38
|
+
#
|
39
|
+
# @example Basic Usage With Types That Can Be Duped
|
40
|
+
# require 'lotus/utils/duplicable'
|
41
|
+
#
|
42
|
+
# object = "hello"
|
43
|
+
# puts object.object_id # => 70172661782360
|
44
|
+
#
|
45
|
+
# result = Lotus::Utils::Duplicable.dup(object)
|
46
|
+
#
|
47
|
+
# puts result # => "hello"
|
48
|
+
# puts result.object_id # => 70172671467020 – Different object
|
49
|
+
#
|
50
|
+
# @example Custom Logic
|
51
|
+
# require 'lotus/utils/duplicable'
|
52
|
+
# require 'lotus/utils/hash'
|
53
|
+
#
|
54
|
+
# hash = { a: 1 }
|
55
|
+
# puts hash.object_id # => 70207105061680
|
56
|
+
#
|
57
|
+
# result = Lotus::Utils::Duplicable.dup(hash) do |value|
|
58
|
+
# case value
|
59
|
+
# when Lotus::Utils::Hash
|
60
|
+
# value.deep_dup
|
61
|
+
# when ::Hash
|
62
|
+
# Lotus::Utils::Hash.new(value).deep_dup.to_h
|
63
|
+
# end
|
64
|
+
# end
|
65
|
+
#
|
66
|
+
# puts result # => "{:a=>1}"
|
67
|
+
# puts result.object_id # => 70207105185500 – Different object
|
68
|
+
def self.dup(value, &blk)
|
69
|
+
case value
|
70
|
+
when NilClass, FalseClass, TrueClass, Symbol, Numeric
|
71
|
+
value
|
72
|
+
when v = blk && blk.call(value)
|
73
|
+
v
|
74
|
+
else
|
75
|
+
value.dup
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
data/lib/lotus/utils/escape.rb
CHANGED
@@ -528,7 +528,10 @@ module Lotus
|
|
528
528
|
# @since 0.4.0
|
529
529
|
# @api private
|
530
530
|
def self.encode(input)
|
531
|
-
input.
|
531
|
+
return '' if input.nil?
|
532
|
+
input.encode(Encoding::UTF_8)
|
533
|
+
rescue Encoding::UndefinedConversionError
|
534
|
+
input.dup.force_encoding(Encoding::UTF_8)
|
532
535
|
end
|
533
536
|
|
534
537
|
# Encode the given UTF-8 char.
|
data/lib/lotus/utils/hash.rb
CHANGED
@@ -1,8 +1,24 @@
|
|
1
|
+
require 'lotus/utils/duplicable'
|
2
|
+
|
1
3
|
module Lotus
|
2
4
|
module Utils
|
3
5
|
# Hash on steroids
|
4
6
|
# @since 0.1.0
|
5
7
|
class Hash
|
8
|
+
# @since 0.6.0
|
9
|
+
# @api private
|
10
|
+
#
|
11
|
+
# @see Lotus::Utils::Hash#deep_dup
|
12
|
+
# @see Lotus::Utils::Duplicable
|
13
|
+
DUPLICATE_LOGIC = Proc.new do |value|
|
14
|
+
case value
|
15
|
+
when Hash
|
16
|
+
value.deep_dup
|
17
|
+
when ::Hash
|
18
|
+
Hash.new(value).deep_dup.to_h
|
19
|
+
end
|
20
|
+
end.freeze
|
21
|
+
|
6
22
|
# Initialize the hash
|
7
23
|
#
|
8
24
|
# @param hash [#to_h] the value we want to use to initialize this instance
|
@@ -145,7 +161,7 @@ module Lotus
|
|
145
161
|
# duped['u_hash'].class # => Lotus::Utils::Hash
|
146
162
|
def deep_dup
|
147
163
|
Hash.new.tap do |result|
|
148
|
-
@hash.each {|k, v| result[k] =
|
164
|
+
@hash.each {|k, v| result[k] = Duplicable.dup(v, &DUPLICATE_LOGIC) }
|
149
165
|
end
|
150
166
|
end
|
151
167
|
|
@@ -278,22 +294,6 @@ module Lotus
|
|
278
294
|
def respond_to_missing?(m, include_private=false)
|
279
295
|
@hash.respond_to?(m, include_private)
|
280
296
|
end
|
281
|
-
|
282
|
-
private
|
283
|
-
# @api private
|
284
|
-
# @since 0.3.1
|
285
|
-
def duplicate(value)
|
286
|
-
case value
|
287
|
-
when NilClass, FalseClass, TrueClass, Symbol, Numeric
|
288
|
-
value
|
289
|
-
when Hash
|
290
|
-
value.deep_dup
|
291
|
-
when ::Hash
|
292
|
-
Hash.new(value).deep_dup.to_h
|
293
|
-
else
|
294
|
-
value.dup
|
295
|
-
end
|
296
|
-
end
|
297
297
|
end
|
298
298
|
end
|
299
299
|
end
|
@@ -1,30 +1,36 @@
|
|
1
|
+
require 'lotus/utils/class_attribute'
|
2
|
+
|
1
3
|
module Lotus
|
2
4
|
module Utils
|
3
5
|
# String inflector
|
4
6
|
#
|
5
7
|
# @since 0.4.1
|
6
|
-
# @api private
|
7
8
|
module Inflector
|
8
|
-
#
|
9
|
+
# Rules for irregular plurals
|
9
10
|
#
|
10
|
-
# @since 0.
|
11
|
+
# @since 0.6.0
|
11
12
|
# @api private
|
12
|
-
class
|
13
|
-
# @since 0.
|
13
|
+
class IrregularRules
|
14
|
+
# @since 0.6.0
|
14
15
|
# @api private
|
15
16
|
def initialize(rules)
|
16
17
|
@rules = rules
|
17
|
-
@rules.freeze
|
18
18
|
end
|
19
19
|
|
20
|
-
# @since 0.
|
20
|
+
# @since 0.6.0
|
21
|
+
# @api private
|
22
|
+
def add(key, value)
|
23
|
+
@rules[key.downcase] = value.downcase
|
24
|
+
end
|
25
|
+
|
26
|
+
# @since 0.6.0
|
21
27
|
# @api private
|
22
28
|
def ===(other)
|
23
29
|
key = other.downcase
|
24
30
|
@rules.key?(key) || @rules.value?(key)
|
25
31
|
end
|
26
32
|
|
27
|
-
# @since 0.
|
33
|
+
# @since 0.6.0
|
28
34
|
# @api private
|
29
35
|
def apply(string)
|
30
36
|
key = string.downcase
|
@@ -34,30 +40,6 @@ module Lotus
|
|
34
40
|
end
|
35
41
|
end
|
36
42
|
|
37
|
-
# Rule for irregular plural, that uses a suffix.
|
38
|
-
#
|
39
|
-
# @since 0.4.1
|
40
|
-
# @api private
|
41
|
-
class SuffixRule < IrregularRule
|
42
|
-
def initialize(matcher, replacement, rules)
|
43
|
-
super(rules)
|
44
|
-
@matcher = matcher
|
45
|
-
@replacement = replacement
|
46
|
-
end
|
47
|
-
|
48
|
-
# @since 0.4.1
|
49
|
-
# @api private
|
50
|
-
def ===(other)
|
51
|
-
@rules.key?(other.downcase)
|
52
|
-
end
|
53
|
-
|
54
|
-
# @since 0.4.1
|
55
|
-
# @api private
|
56
|
-
def apply(string)
|
57
|
-
string.sub(@matcher, @replacement)
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
43
|
# Matcher for blank strings
|
62
44
|
#
|
63
45
|
# @since 0.4.1
|
@@ -80,6 +62,10 @@ module Lotus
|
|
80
62
|
# @api private
|
81
63
|
EAUX = 'eaux'.freeze
|
82
64
|
|
65
|
+
# @since 0.6.0
|
66
|
+
# @api private
|
67
|
+
ES = 'es'.freeze
|
68
|
+
|
83
69
|
# @since 0.4.1
|
84
70
|
# @api private
|
85
71
|
F = 'f'.freeze
|
@@ -136,6 +122,14 @@ module Lotus
|
|
136
122
|
# @api private
|
137
123
|
MINA = 'mina'.freeze
|
138
124
|
|
125
|
+
# @since 0.6.0
|
126
|
+
# @api private
|
127
|
+
NA = 'na'.freeze
|
128
|
+
|
129
|
+
# @since 0.6.0
|
130
|
+
# @api private
|
131
|
+
NON = 'non'.freeze
|
132
|
+
|
139
133
|
# @since 0.4.1
|
140
134
|
# @api private
|
141
135
|
O = 'o'.freeze
|
@@ -160,6 +154,10 @@ module Lotus
|
|
160
154
|
# @api private
|
161
155
|
SSES = 'sses'.freeze
|
162
156
|
|
157
|
+
# @since 0.6.0
|
158
|
+
# @api private
|
159
|
+
TA = 'ta'.freeze
|
160
|
+
|
163
161
|
# @since 0.4.1
|
164
162
|
# @api private
|
165
163
|
UM = 'um'.freeze
|
@@ -188,66 +186,14 @@ module Lotus
|
|
188
186
|
# @api private
|
189
187
|
Y = 'y'.freeze
|
190
188
|
|
191
|
-
|
192
|
-
#
|
193
|
-
# @since 0.4.1
|
194
|
-
# @api private
|
195
|
-
PLURAL_IS_ES = SuffixRule.new( /is\z/, 'es', {
|
196
|
-
'analysis' => true,
|
197
|
-
'axis' => true,
|
198
|
-
'basis' => true,
|
199
|
-
'crisis' => true,
|
200
|
-
'diagnosis' => true,
|
201
|
-
'ellipsis' => true,
|
202
|
-
'hypothesis' => true,
|
203
|
-
'oasis' => true,
|
204
|
-
'paralysis' => true,
|
205
|
-
'parenthesis' => true,
|
206
|
-
'synopsis' => true,
|
207
|
-
'synthesis' => true,
|
208
|
-
'thesis' => true,
|
209
|
-
})
|
189
|
+
include Utils::ClassAttribute
|
210
190
|
|
211
|
-
#
|
191
|
+
# Irregular rules for plurals
|
212
192
|
#
|
213
|
-
# @since 0.
|
193
|
+
# @since 0.6.0
|
214
194
|
# @api private
|
215
|
-
|
216
|
-
|
217
|
-
'iris' => true,
|
218
|
-
})
|
219
|
-
|
220
|
-
# Plural rule "f" => "s"
|
221
|
-
#
|
222
|
-
# @since 0.4.1
|
223
|
-
# @api private
|
224
|
-
PLURAL_F_S = SuffixRule.new( /\z/, 's', {
|
225
|
-
'chief' => true,
|
226
|
-
'spoof' => true,
|
227
|
-
})
|
228
|
-
|
229
|
-
# Plural rule "o" => "oes"
|
230
|
-
#
|
231
|
-
# @since 0.4.1
|
232
|
-
# @api private
|
233
|
-
PLURAL_O_OES = SuffixRule.new( /\z/, 'es', {
|
234
|
-
'buffalo' => true,
|
235
|
-
'domino' => true,
|
236
|
-
'echo' => true,
|
237
|
-
'embargo' => true,
|
238
|
-
'hero' => true,
|
239
|
-
'mosquito' => true,
|
240
|
-
'potato' => true,
|
241
|
-
'tomato' => true,
|
242
|
-
'torpedo' => true,
|
243
|
-
'veto' => true,
|
244
|
-
})
|
245
|
-
|
246
|
-
# Irregular rules
|
247
|
-
#
|
248
|
-
# @since 0.4.1
|
249
|
-
# @api private
|
250
|
-
PLURAL_IRREGULAR = IrregularRule.new({
|
195
|
+
class_attribute :plurals
|
196
|
+
self.plurals = IrregularRules.new({
|
251
197
|
# irregular
|
252
198
|
'cactus' => 'cacti',
|
253
199
|
'child' => 'children',
|
@@ -276,96 +222,14 @@ module Lotus
|
|
276
222
|
'series' => 'series',
|
277
223
|
'sheep' => 'sheep',
|
278
224
|
'species' => 'species',
|
279
|
-
# a => ae
|
280
|
-
'alumna' => 'alumnae',
|
281
|
-
'alga' => 'algae',
|
282
|
-
'vertebra' => 'vertebrae',
|
283
|
-
'persona' => 'personae',
|
284
|
-
'antenna' => 'antennae',
|
285
|
-
'formula' => 'formulae',
|
286
|
-
'nebula' => 'nebulae',
|
287
|
-
'vita' => 'vitae',
|
288
|
-
# on => a
|
289
|
-
'criterion' => 'criteria',
|
290
|
-
'perihelion' => 'perihelia',
|
291
|
-
'aphelion' => 'aphelia',
|
292
|
-
'phenomenon' => 'phenomena',
|
293
|
-
'prolegomenon' => 'prolegomena',
|
294
|
-
'noumenon' => 'noumena',
|
295
|
-
'organon' => 'organa',
|
296
|
-
'asyndeton' => 'asyndeta',
|
297
|
-
'hyperbaton' => 'hyperbata',
|
298
|
-
# us => i
|
299
|
-
'alumnus' => 'alumni',
|
300
|
-
'alveolus' => 'alveoli',
|
301
|
-
'bacillus' => 'bacilli',
|
302
|
-
'bronchus' => 'bronchi',
|
303
|
-
'locus' => 'loci',
|
304
|
-
'nucleus' => 'nuclei',
|
305
|
-
'stimulus' => 'stimuli',
|
306
|
-
'meniscus' => 'menisci',
|
307
|
-
'thesaurus' => 'thesauri',
|
308
|
-
# a => ata
|
309
|
-
'anathema' => 'anathemata',
|
310
|
-
'enema' => 'enemata',
|
311
|
-
'oedema' => 'oedemata',
|
312
|
-
'bema' => 'bemata',
|
313
|
-
'enigma' => 'enigmata',
|
314
|
-
'sarcoma' => 'sarcomata',
|
315
|
-
'carcinoma' => 'carcinomata',
|
316
|
-
'gumma' => 'gummata',
|
317
|
-
'schema' => 'schemata',
|
318
|
-
'charisma' => 'charismata',
|
319
|
-
'lemma' => 'lemmata',
|
320
|
-
'soma' => 'somata',
|
321
|
-
'diploma' => 'diplomata',
|
322
|
-
'lymphoma' => 'lymphomata',
|
323
|
-
'stigma' => 'stigmata',
|
324
|
-
'dogma' => 'dogmata',
|
325
|
-
'magma' => 'magmata',
|
326
|
-
'stoma' => 'stomata',
|
327
|
-
'drama' => 'dramata',
|
328
|
-
'melisma' => 'melismata',
|
329
|
-
'trauma' => 'traumata',
|
330
|
-
'edema' => 'edemata',
|
331
|
-
'miasma' => 'miasmata',
|
332
|
-
# s => es
|
333
|
-
'acropolis' => 'acropolises',
|
334
|
-
'chaos' => 'chaoses',
|
335
|
-
'lens' => 'lenses',
|
336
|
-
'aegis' => 'aegises',
|
337
|
-
'cosmos' => 'cosmoses',
|
338
|
-
'mantis' => 'mantises',
|
339
|
-
'alias' => 'aliases',
|
340
|
-
'dais' => 'daises',
|
341
|
-
'marquis' => 'marquises',
|
342
|
-
'asbestos' => 'asbestoses',
|
343
|
-
'digitalis' => 'digitalises',
|
344
|
-
'metropolis' => 'metropolises',
|
345
|
-
'atlas' => 'atlases',
|
346
|
-
'epidermis' => 'epidermises',
|
347
|
-
'pathos' => 'pathoses',
|
348
|
-
'bathos' => 'bathoses',
|
349
|
-
'ethos' => 'ethoses',
|
350
|
-
'pelvis' => 'pelvises',
|
351
|
-
'bias' => 'biases',
|
352
|
-
'gas' => 'gases',
|
353
|
-
'polis' => 'polises',
|
354
|
-
'caddis' => 'caddises',
|
355
|
-
'rhinoceros' => 'rhinoceroses',
|
356
|
-
'cannabis' => 'cannabises',
|
357
|
-
'glottis' => 'glottises',
|
358
|
-
'sassafras' => 'sassafrases',
|
359
|
-
'canvas' => 'canvases',
|
360
|
-
'ibis' => 'ibises',
|
361
|
-
'trellis' => 'trellises',
|
362
225
|
})
|
363
226
|
|
364
|
-
# Irregular rules
|
227
|
+
# Irregular rules for singulars
|
365
228
|
#
|
366
|
-
# @since 0.
|
229
|
+
# @since 0.6.0
|
367
230
|
# @api private
|
368
|
-
|
231
|
+
class_attribute :singulars
|
232
|
+
self.singulars = IrregularRules.new({
|
369
233
|
# irregular
|
370
234
|
'cacti' => 'cactus',
|
371
235
|
'children'=> 'child',
|
@@ -395,89 +259,74 @@ module Lotus
|
|
395
259
|
'sheep' => 'sheep',
|
396
260
|
'species' => 'species',
|
397
261
|
'police' => 'police',
|
398
|
-
# ae => a
|
399
|
-
'alumnae' => 'alumna',
|
400
|
-
'algae' => 'alga',
|
401
|
-
'vertebrae' => 'vertebra',
|
402
|
-
'personae' => 'persona',
|
403
|
-
'antennae' => 'antenna',
|
404
|
-
'formulae' => 'formula',
|
405
|
-
'nebulae' => 'nebula',
|
406
|
-
'vitae' => 'vita',
|
407
|
-
# a = on
|
408
|
-
'criteria' => 'criterion',
|
409
|
-
'perihelia' => 'perihelion',
|
410
|
-
'aphelia' => 'aphelion',
|
411
|
-
'phenomena' => 'phenomenon',
|
412
|
-
'prolegomena' => 'prolegomenon',
|
413
|
-
'noumena' => 'noumenon',
|
414
|
-
'organa' => 'organon',
|
415
|
-
'asyndeta' => 'asyndeton',
|
416
|
-
'hyperbata' => 'hyperbaton',
|
417
|
-
# ses => s
|
418
|
-
'acropolises' => 'acropolis',
|
419
|
-
'chaoses' => 'chaos',
|
420
|
-
'lenses' => 'lens',
|
421
|
-
'aegises' => 'aegis',
|
422
|
-
'cosmoses' => 'cosmos',
|
423
|
-
'mantises' => 'mantis',
|
424
|
-
'aliases' => 'alias',
|
425
|
-
'daises' => 'dais',
|
426
|
-
'marquises' => 'marquis',
|
427
|
-
'asbestoses' => 'asbestos',
|
428
|
-
'digitalises' => 'digitalis',
|
429
|
-
'metropolises' => 'metropolis',
|
430
|
-
'atlases' => 'atlas',
|
431
|
-
'epidermises' => 'epidermis',
|
432
|
-
'pathoses' => 'pathos',
|
433
|
-
'bathoses' => 'bathos',
|
434
|
-
'ethoses' => 'ethos',
|
435
|
-
'pelvises' => 'pelvis',
|
436
|
-
'biases' => 'bias',
|
437
|
-
'gases' => 'gas',
|
438
|
-
'polises' => 'polis',
|
439
|
-
'caddises' => 'caddis',
|
440
|
-
'rhinoceroses' => 'rhinoceros',
|
441
|
-
'cannabises' => 'cannabis',
|
442
|
-
'glottises' => 'glottis',
|
443
|
-
'sassafrases' => 'sassafras',
|
444
|
-
'canvases' => 'canvas',
|
445
|
-
'ibises' => 'ibis',
|
446
|
-
'trellises' => 'trellis',
|
447
262
|
# fallback
|
448
|
-
'hives'
|
449
|
-
|
450
|
-
"codices" => "codex",
|
451
|
-
"murices" => "murex",
|
452
|
-
"silices" => "silex",
|
453
|
-
"apices" => "apex",
|
454
|
-
"latices" => "latex",
|
455
|
-
"vertices" => "vertex",
|
456
|
-
"cortices" => "cortex",
|
457
|
-
"pontifices" => "pontifex",
|
458
|
-
"vortices" => "vortex",
|
459
|
-
"indices" => "index",
|
460
|
-
"simplices" => "simplex",
|
461
|
-
# ices => ix
|
462
|
-
"radices" => "radix",
|
463
|
-
"helices" => "helix",
|
464
|
-
"appendices" => "appendix",
|
465
|
-
# es => is
|
466
|
-
"axes" => "axis",
|
467
|
-
"analyses" => "analysis",
|
468
|
-
"bases" => "basis",
|
469
|
-
"crises" => "crisis",
|
470
|
-
"diagnoses" => "diagnosis",
|
471
|
-
"ellipses" => "ellipsis",
|
472
|
-
"hypotheses" => "hypothesis",
|
473
|
-
"oases" => "oasis",
|
474
|
-
"paralyses" => "paralysis",
|
475
|
-
"parentheses" => "parenthesis",
|
476
|
-
"syntheses" => "synthesis",
|
477
|
-
"synopses" => "synopsis",
|
478
|
-
"theses" => "thesis",
|
263
|
+
'hives' => 'hive',
|
264
|
+
'horses' => 'horse',
|
479
265
|
})
|
480
266
|
|
267
|
+
# Block for custom inflection rules.
|
268
|
+
#
|
269
|
+
# @param [Proc] blk custom inflections
|
270
|
+
#
|
271
|
+
# @since 0.6.0
|
272
|
+
#
|
273
|
+
# @see Lotus::Utils::Inflector.exception
|
274
|
+
# @see Lotus::Utils::Inflector.uncountable
|
275
|
+
#
|
276
|
+
# @example
|
277
|
+
# require 'lotus/utils/inflector'
|
278
|
+
#
|
279
|
+
# Lotus::Utils::Inflector.inflections do
|
280
|
+
# exception 'analysis', 'analyses'
|
281
|
+
# exception 'alga', 'algae'
|
282
|
+
# uncountable 'music', 'butter'
|
283
|
+
# end
|
284
|
+
def self.inflections(&blk)
|
285
|
+
class_eval(&blk)
|
286
|
+
end
|
287
|
+
|
288
|
+
# Add a custom inflection exception
|
289
|
+
#
|
290
|
+
# @param [String] singular form
|
291
|
+
# @param [String] plural form
|
292
|
+
#
|
293
|
+
# @since 0.6.0
|
294
|
+
#
|
295
|
+
# @see Lotus::Utils::Inflector.inflections
|
296
|
+
# @see Lotus::Utils::Inflector.uncountable
|
297
|
+
#
|
298
|
+
# @example
|
299
|
+
# require 'lotus/utils/inflector'
|
300
|
+
#
|
301
|
+
# Lotus::Utils::Inflector.inflections do
|
302
|
+
# exception 'alga', 'algae'
|
303
|
+
# end
|
304
|
+
def self.exception(singular, plural)
|
305
|
+
singulars.add(plural, singular)
|
306
|
+
plurals.add(singular, plural)
|
307
|
+
end
|
308
|
+
|
309
|
+
# Add an uncountable word
|
310
|
+
#
|
311
|
+
# @param [Array<String>] words
|
312
|
+
#
|
313
|
+
# @since 0.6.0
|
314
|
+
#
|
315
|
+
# @see Lotus::Utils::Inflector.inflections
|
316
|
+
# @see Lotus::Utils::Inflector.exception
|
317
|
+
#
|
318
|
+
# @example
|
319
|
+
# require 'lotus/utils/inflector'
|
320
|
+
#
|
321
|
+
# Lotus::Utils::Inflector.inflections do
|
322
|
+
# uncountable 'music', 'art'
|
323
|
+
# end
|
324
|
+
def self.uncountable(*words)
|
325
|
+
Array(words).each do |word|
|
326
|
+
exception(word, word)
|
327
|
+
end
|
328
|
+
end
|
329
|
+
|
481
330
|
# Pluralize the given string
|
482
331
|
#
|
483
332
|
# @param string [String] a string to pluralize
|
@@ -490,8 +339,8 @@ module Lotus
|
|
490
339
|
return string if string.nil? || string.match(BLANK_STRING_MATCHER)
|
491
340
|
|
492
341
|
case string
|
493
|
-
when
|
494
|
-
|
342
|
+
when plurals
|
343
|
+
plurals.apply(string)
|
495
344
|
when /\A((.*)[^aeiou])ch\z/
|
496
345
|
$1 + CHES
|
497
346
|
when /\A((.*)[^aeiou])y\z/
|
@@ -502,24 +351,24 @@ module Lotus
|
|
502
351
|
$1 + EAUX
|
503
352
|
when /\A(.*)x\z/
|
504
353
|
$1 + XES
|
354
|
+
when /\A(.*)ma\z/
|
355
|
+
string + TA
|
505
356
|
when /\A(.*)(um|#{ A })\z/
|
506
357
|
$1 + A
|
507
358
|
when /\A(.*)(ouse|#{ ICE })\z/
|
508
359
|
$1 + ICE
|
509
|
-
when
|
510
|
-
|
360
|
+
when /\A(buffal|domin|ech|embarg|her|mosquit|potat|tomat)#{ O }\z/i
|
361
|
+
$1 + OES
|
511
362
|
when /\A(.*)(en|#{ INA })\z/
|
512
363
|
$1 + INA
|
513
|
-
when PLURAL_F_S
|
514
|
-
PLURAL_F_S.apply(string)
|
515
364
|
when /\A(.*)(?:([^f]))f[e]*\z/
|
516
365
|
$1 + $2 + VES
|
517
366
|
when /\A(.*)us\z/
|
518
367
|
$1 + USES
|
519
|
-
when
|
520
|
-
|
521
|
-
when
|
522
|
-
|
368
|
+
when /\A(.*)non\z/
|
369
|
+
$1 + NA
|
370
|
+
when /\A((.*)[^aeiou])is\z/
|
371
|
+
$1 + ES
|
523
372
|
when /\A(.*)ss\z/
|
524
373
|
$1 + SSES
|
525
374
|
when /s\z/
|
@@ -541,8 +390,8 @@ module Lotus
|
|
541
390
|
return string if string.nil? || string.match(BLANK_STRING_MATCHER)
|
542
391
|
|
543
392
|
case string
|
544
|
-
when
|
545
|
-
|
393
|
+
when singulars
|
394
|
+
singulars.apply(string)
|
546
395
|
when /\A.*[^aeiou]#{CHES}\z/
|
547
396
|
string.sub(CHES, CH)
|
548
397
|
when /\A.*[^aeiou]#{IES}\z/
|
@@ -573,6 +422,10 @@ module Lotus
|
|
573
422
|
$1 + F
|
574
423
|
when /\A(.*)#{I}\z/
|
575
424
|
$1 + US
|
425
|
+
when /\A(.*)ae\z/
|
426
|
+
$1 + A
|
427
|
+
when /\A(.*)na\z/
|
428
|
+
$1 + NON
|
576
429
|
when /\A(.*)#{A}\z/
|
577
430
|
$1 + UM
|
578
431
|
when /[^s]\z/
|
data/lib/lotus/utils/kernel.rb
CHANGED
@@ -18,7 +18,7 @@ module Lotus
|
|
18
18
|
# @see http://ruby-doc.org/stdlib/libdoc/pathname/rdoc/Pathname.html
|
19
19
|
# @see Lotus::Utils::Kernel.Pathname
|
20
20
|
def initialize(*paths)
|
21
|
-
@paths = Array(paths)
|
21
|
+
@paths = Utils::Kernel.Array(paths)
|
22
22
|
end
|
23
23
|
|
24
24
|
# It specifies the policy for initialize copies of the object, when #clone
|
@@ -61,7 +61,7 @@ module Lotus
|
|
61
61
|
#
|
62
62
|
# @since 0.2.0
|
63
63
|
def each
|
64
|
-
|
64
|
+
@paths.each do |path|
|
65
65
|
yield realpath(path)
|
66
66
|
end
|
67
67
|
end
|
@@ -111,6 +111,7 @@ module Lotus
|
|
111
111
|
# paths << '.' << '../..'
|
112
112
|
def push(*paths)
|
113
113
|
@paths.push(*paths)
|
114
|
+
@paths = Kernel.Array(@paths)
|
114
115
|
self
|
115
116
|
end
|
116
117
|
|
@@ -136,6 +137,22 @@ module Lotus
|
|
136
137
|
@paths.freeze
|
137
138
|
end
|
138
139
|
|
140
|
+
# @since 0.6.0
|
141
|
+
# @api private
|
142
|
+
def ==(other)
|
143
|
+
case other
|
144
|
+
when self.class
|
145
|
+
other.paths == paths
|
146
|
+
else
|
147
|
+
other == paths
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
protected
|
152
|
+
# @since 0.6.0
|
153
|
+
# @api private
|
154
|
+
attr_reader :paths
|
155
|
+
|
139
156
|
private
|
140
157
|
# Allow subclasses to define their own policy to discover the realpath
|
141
158
|
# of the given path.
|
@@ -80,10 +80,13 @@ module Lotus
|
|
80
80
|
def relative_join(strings, separator = @separator)
|
81
81
|
raise TypeError if separator.nil?
|
82
82
|
prefix = @string.gsub(@separator, separator)
|
83
|
+
result = [prefix, strings]
|
84
|
+
result.flatten!
|
85
|
+
result.compact!
|
86
|
+
result.reject! {|string| string == separator }
|
83
87
|
|
84
88
|
self.class.new(
|
85
|
-
|
86
|
-
separator
|
89
|
+
result.join(separator), separator
|
87
90
|
).relative!
|
88
91
|
end
|
89
92
|
|
data/lib/lotus/utils/string.rb
CHANGED
@@ -6,6 +6,12 @@ module Lotus
|
|
6
6
|
#
|
7
7
|
# @since 0.1.0
|
8
8
|
class String
|
9
|
+
# Empty string for #classify
|
10
|
+
#
|
11
|
+
# @since 0.6.0
|
12
|
+
# @api private
|
13
|
+
EMPTY_STRING = ''.freeze
|
14
|
+
|
9
15
|
# Separator between Ruby namespaces
|
10
16
|
#
|
11
17
|
# @since 0.1.0
|
@@ -135,14 +141,14 @@ module Lotus
|
|
135
141
|
# string = Lotus::Utils::String.new 'lotus_utils'
|
136
142
|
# string.classify # => 'LotusUtils'
|
137
143
|
def classify
|
138
|
-
words = split(CLASSIFY_WORD_SEPARATOR).map(&:capitalize)
|
144
|
+
words = split(CLASSIFY_WORD_SEPARATOR).map!(&:capitalize)
|
139
145
|
delimiters = scan(CLASSIFY_WORD_SEPARATOR)
|
140
146
|
|
141
147
|
delimiters.map! do |delimiter|
|
142
|
-
delimiter == CLASSIFY_SEPARATOR ?
|
148
|
+
delimiter == CLASSIFY_SEPARATOR ? EMPTY_STRING : NAMESPACE_SEPARATOR
|
143
149
|
end
|
144
150
|
|
145
|
-
self.class.new words.zip(delimiters).
|
151
|
+
self.class.new words.zip(delimiters).join
|
146
152
|
end
|
147
153
|
|
148
154
|
# Return a downcased and underscore separated version of the string
|
@@ -340,6 +346,51 @@ module Lotus
|
|
340
346
|
end
|
341
347
|
end
|
342
348
|
|
349
|
+
# Both forms iterate through str, matching the pattern
|
350
|
+
#
|
351
|
+
# @return [String,nil]
|
352
|
+
#
|
353
|
+
# @see http://www.ruby-doc.org/core/String.html#method-i-scan
|
354
|
+
#
|
355
|
+
# @since 0.6.0
|
356
|
+
def scan(pattern, &blk)
|
357
|
+
@string.scan(pattern, &blk)
|
358
|
+
end
|
359
|
+
|
360
|
+
# Replace the rightmost match of <tt>pattern</tt> with <tt>replacement</tt>
|
361
|
+
#
|
362
|
+
# If the pattern cannot be matched, it returns the original string.
|
363
|
+
#
|
364
|
+
# This method does NOT mutate the original string.
|
365
|
+
#
|
366
|
+
# @param pattern [Regexp, String] the pattern to find
|
367
|
+
# @param replacement [String, Lotus::Utils::String] the string to replace
|
368
|
+
#
|
369
|
+
# @return [Lotus::Utils::String] the replaced string
|
370
|
+
#
|
371
|
+
# @since 0.6.0
|
372
|
+
#
|
373
|
+
# @example
|
374
|
+
# require 'lotus/utils/string'
|
375
|
+
#
|
376
|
+
# string = Lotus::Utils::String.new('authors/books/index')
|
377
|
+
# result = string.rsub(/\//, '#')
|
378
|
+
#
|
379
|
+
# puts string
|
380
|
+
# # => #<Lotus::Utils::String:0x007fdb41233ad8 @string="authors/books/index">
|
381
|
+
#
|
382
|
+
# puts result
|
383
|
+
# # => #<Lotus::Utils::String:0x007fdb41232ed0 @string="authors/books#index">
|
384
|
+
def rsub(pattern, replacement)
|
385
|
+
if i = rindex(pattern)
|
386
|
+
s = @string.dup
|
387
|
+
s[i] = replacement
|
388
|
+
self.class.new s
|
389
|
+
else
|
390
|
+
self
|
391
|
+
end
|
392
|
+
end
|
393
|
+
|
343
394
|
# Override Ruby's method_missing in order to provide ::String interface
|
344
395
|
#
|
345
396
|
# @api private
|
data/lib/lotus/utils/version.rb
CHANGED
data/lotus-utils.gemspec
CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.authors = ['Luca Guidi', 'Trung Lê', 'Alfonso Uceda']
|
10
10
|
spec.email = ['me@lucaguidi.com', 'trung.le@ruby-journal.com', 'uceda73@gmail.com']
|
11
11
|
spec.description = %q{Lotus utilities}
|
12
|
-
spec.summary = %q{Ruby core extentions and
|
12
|
+
spec.summary = %q{Ruby core extentions and Lotus utilities}
|
13
13
|
spec.homepage = 'http://lotusrb.org'
|
14
14
|
spec.license = 'MIT'
|
15
15
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lotus-utils
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luca Guidi
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2016-01-12 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|
@@ -76,6 +76,7 @@ files:
|
|
76
76
|
- lib/lotus/utils/class.rb
|
77
77
|
- lib/lotus/utils/class_attribute.rb
|
78
78
|
- lib/lotus/utils/deprecation.rb
|
79
|
+
- lib/lotus/utils/duplicable.rb
|
79
80
|
- lib/lotus/utils/escape.rb
|
80
81
|
- lib/lotus/utils/hash.rb
|
81
82
|
- lib/lotus/utils/inflector.rb
|
@@ -106,9 +107,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
106
107
|
version: '0'
|
107
108
|
requirements: []
|
108
109
|
rubyforge_project:
|
109
|
-
rubygems_version: 2.
|
110
|
+
rubygems_version: 2.5.1
|
110
111
|
signing_key:
|
111
112
|
specification_version: 4
|
112
|
-
summary: Ruby core extentions and
|
113
|
+
summary: Ruby core extentions and Lotus utilities
|
113
114
|
test_files: []
|
114
115
|
has_rdoc:
|