string-builder 2.1.1 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +27 -51
- data/lib/string/builder.rb +3 -1
- data/string-builder.gemspec +2 -2
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e9be05a5fa8302af3f75659e915cd1ed84f8c87ff6ff5ec177d1dde71910e66a
|
4
|
+
data.tar.gz: 6c3840f7d0ae83a84ad66439ea370b3a25f36dfaee0512c6aeaebb549f0d3253
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8a7d470f28efeb3c0fff8539d908a105f406a8f6b2eeba496c5be6bdd61356cee33a6b96dcac7e663ee2d781c9d4ba991b28027c980e1b03fb44c9123a917493
|
7
|
+
data.tar.gz: 2af21fb239aef87a7ca89f06c7ee4b020f930f5a9c75aef42dc08c0b948f5ad9ff49897264608cc2b385b73062e74e604b2fad82ba9d4c7b2f2a1a07ccaeb9d6
|
data/README.md
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
# String::Builder
|
6
6
|
|
7
|
-
Modified and extended port of the [String::Builder](https://crystal-lang.org/api/0.20.3/String/Builder.html#build%28capacity%3AInt%3D64%2C%26block%29%3AString-class-method) IO-style initializer for the `String` class of the Crystal programming language.
|
7
|
+
Modified and extended port of the [String::Builder](https://crystal-lang.org/api/0.20.3/String/Builder.html#build%28capacity%3AInt%3D64%2C%26block%29%3AString-class-method) IO-style initializer for the `String` class of the Crystal programming language in the form of a Ruby gem refinement module.
|
8
8
|
|
9
9
|
## Methods
|
10
10
|
|
@@ -67,6 +67,16 @@ If no block is given, then the object converted to a string (with `to_s`) is ret
|
|
67
67
|
|
68
68
|
##### Examples
|
69
69
|
|
70
|
+
```ruby
|
71
|
+
foobar = String.build do |s|
|
72
|
+
s << 'fii'
|
73
|
+
s.gsub!('ii','oo')
|
74
|
+
s << 'bar'
|
75
|
+
end
|
76
|
+
|
77
|
+
foobar #=> "foobar"
|
78
|
+
```
|
79
|
+
|
70
80
|
```ruby
|
71
81
|
foobar = String.build 'foo' do |s|
|
72
82
|
s << 'bop'
|
@@ -97,6 +107,20 @@ foobar #=> "foobar"
|
|
97
107
|
foo #=> "foo"
|
98
108
|
```
|
99
109
|
|
110
|
+
#### `String.[]`
|
111
|
+
|
112
|
+
Takes arbitrarily many objects (with splat), converts them to strings and contatenates them (takes the product with the empty string).
|
113
|
+
|
114
|
+
##### Examples
|
115
|
+
|
116
|
+
```ruby
|
117
|
+
String[] #=> ""
|
118
|
+
String[3] #=> "3"
|
119
|
+
String['Hello','World','!'] #=> "HelloWorld!"
|
120
|
+
String[{k: 'v'}, 3, %i[a b c]] #=> "{:k=>\"v\"}3[:a, :b, :c]"
|
121
|
+
String[*['a', 2, :z]] #=> "a2z"
|
122
|
+
```
|
123
|
+
|
100
124
|
## Detailed example
|
101
125
|
|
102
126
|
This example shows how to make a simple logger by constructing log messages with `String::Builder`.
|
@@ -200,54 +224,6 @@ end
|
|
200
224
|
# CANNOT use String::Builder methods in the global scope
|
201
225
|
```
|
202
226
|
|
203
|
-
##
|
204
|
-
|
205
|
-
The [String::Builder](https://crystal-lang.org/api/0.20.3/String/Builder.html) class of the Crystal programming language provides an initializer method for the `String` class called `build` which is essentially an optimized version of Ruby's `StringIO`.
|
206
|
-
|
207
|
-
Ruby's `StringIO` and Crystal's `String::Builder` are great because it essentially turns strings into IO objects, allowing you to pass a block into the constructor (yielding `self`) which leads to nice chaining such as:
|
208
|
-
|
209
|
-
```ruby
|
210
|
-
# Ruby - StringIO
|
211
|
-
test = StringIO.open do |s|
|
212
|
-
s << 'Hello '
|
213
|
-
s << 'World!'
|
214
|
-
s.string
|
215
|
-
end
|
216
|
-
#=> "Hello World!"
|
217
|
-
```
|
218
|
-
|
219
|
-
Note the necessary `StringIO#string` method call. Since we are yielding a `StringIO` object, we must convert it to a `String` at the end. This is a bit cleaner in Crystal:
|
220
|
-
|
221
|
-
```ruby
|
222
|
-
# Crystal - String::Builder
|
223
|
-
test = String.build do |s|
|
224
|
-
s << "Hello "
|
225
|
-
s << "World!"
|
226
|
-
end
|
227
|
-
#=> "Hello World!"
|
228
|
-
```
|
229
|
-
|
230
|
-
---
|
231
|
-
|
232
|
-
However, since **neither** of these two implementations yield a `String` object, you can't use `String` methods to mutate the object:
|
233
|
-
|
234
|
-
```ruby
|
235
|
-
# Ruby - StringIO
|
236
|
-
test = StringIO.open do |s|
|
237
|
-
s << 'Hello '
|
238
|
-
s << 'World!'
|
239
|
-
s.upcase!
|
240
|
-
s.string
|
241
|
-
end
|
242
|
-
#=> ... undefined method `upcase!' for #<StringIO:0x00007fe0bc09d810> (NoMethodError)
|
243
|
-
```
|
227
|
+
## Further information
|
244
228
|
|
245
|
-
|
246
|
-
# Crystal - String::Builder
|
247
|
-
test = String.build do |s|
|
248
|
-
s << "Hello "
|
249
|
-
s << "World!"
|
250
|
-
s.gsub!("!", "?")
|
251
|
-
end
|
252
|
-
#=> ... undefined method 'gsub!' for String::Builder
|
253
|
-
```
|
229
|
+
For more information about string-building in Ruby and Crystal, [read this blog post](https://www.eonuonga.com/posts/2018/06/07/limitations-of-string-building).
|
data/lib/string/builder.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
module String::Builder
|
2
2
|
refine String.singleton_class do
|
3
3
|
|
4
|
+
def [](*args) args.map(&:to_s)*self.new end
|
5
|
+
|
4
6
|
def build(obj = String.new)
|
5
7
|
return obj.to_s unless block_given?
|
6
8
|
yield builder = self.new
|
@@ -8,7 +10,7 @@ module String::Builder
|
|
8
10
|
end
|
9
11
|
|
10
12
|
def respond_to?(id, private = false)
|
11
|
-
id.to_sym
|
13
|
+
%i[[] build].include?(id.to_sym) ? true : super
|
12
14
|
end
|
13
15
|
|
14
16
|
end
|
data/string-builder.gemspec
CHANGED
@@ -3,11 +3,11 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |spec|
|
5
5
|
spec.name = "string-builder"
|
6
|
-
spec.version = "2.
|
6
|
+
spec.version = "2.2.0"
|
7
7
|
spec.authors = ["Edwin Onuonga"]
|
8
8
|
spec.email = ["edwinonuonga@gmail.com"]
|
9
9
|
|
10
|
-
spec.summary = %q{Modified and extended port of the String::Builder IO-style initializer for the String class of the Crystal programming language.}
|
10
|
+
spec.summary = %q{Modified and extended port of the String::Builder IO-style initializer for the String class of the Crystal programming language in the form of a Ruby gem refinement module.}
|
11
11
|
spec.homepage = "https://www.github.com/eonu/string-builder"
|
12
12
|
spec.license = "MIT"
|
13
13
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: string-builder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Edwin Onuonga
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-06-
|
11
|
+
date: 2018-06-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -94,5 +94,6 @@ rubygems_version: 2.7.3
|
|
94
94
|
signing_key:
|
95
95
|
specification_version: 4
|
96
96
|
summary: Modified and extended port of the String::Builder IO-style initializer for
|
97
|
-
the String class of the Crystal programming language
|
97
|
+
the String class of the Crystal programming language in the form of a Ruby gem refinement
|
98
|
+
module.
|
98
99
|
test_files: []
|