fast_blank 1.0.1-java

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 1c72ae742348e8648feb70ef9fecb367c7e1586764b3708e89621938ec7ec88c
4
+ data.tar.gz: 85226b0fdb4c4e5b124e2292d32f0826d1d116b2d9b324fff3ce5bde53496c35
5
+ SHA512:
6
+ metadata.gz: 0655db9256f773dad6d67c5741c20a35b32892c165e19f89e3550c8fc21d66f93be21640bcdacfb73bac30b09c89edf5851bf1c98c5c815d30a465fc72b439cf
7
+ data.tar.gz: e798ec0bdda4880cc50d9950a0b3e9928eba66e2084cba329b8293dc8170eacf0d2a31b74f5ee66c1cfa65c78e3d0b6a3ddfe39c99a208b2743a260f8a21d48d
data/MIT-LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ Copyright (c) 2006-2009 Steve Sloan
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
data/README.md ADDED
@@ -0,0 +1,146 @@
1
+ ### `String#blank?` Ruby Extension
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/fast_blank.png)](http://badge.fury.io/rb/fast_blank) [![Build Status](https://travis-ci.org/SamSaffron/fast_blank.png?branch=master)](https://travis-ci.org/SamSaffron/fast_blank)
4
+
5
+ `fast_blank` is a simple C extension which provides a fast implementation of [Active Support's `String#blank?` method](http://api.rubyonrails.org/classes/String.html#method-i-blank-3F).
6
+
7
+ ### How do you use it?
8
+
9
+ require 'fast_blank'
10
+
11
+ or add it to your Bundler Gemfile
12
+
13
+ gem 'fast_blank'
14
+
15
+ ### How fast is "Fast"?
16
+
17
+ About 1.2–20x faster than Active Support on my machine (your mileage my vary, depends on string length):
18
+
19
+ ```
20
+ $ bundle exec ./benchmark
21
+
22
+ ================== Test String Length: 0 ==================
23
+ Calculating -------------------------------------
24
+ Fast Blank 225.251k i/100ms
25
+ Fast ActiveSupport 225.676k i/100ms
26
+ Slow Blank 110.934k i/100ms
27
+ New Slow Blank 221.792k i/100ms
28
+ -------------------------------------------------
29
+ Fast Blank 29.673M (± 2.7%) i/s - 148.215M
30
+ Fast ActiveSupport 28.249M (± 3.5%) i/s - 141.048M
31
+ Slow Blank 2.158M (± 3.3%) i/s - 10.872M
32
+ New Slow Blank 23.558M (± 3.2%) i/s - 117.772M
33
+
34
+ Comparison:
35
+ Fast Blank: 29673200.1 i/s
36
+ Fast ActiveSupport: 28248894.5 i/s - 1.05x slower
37
+ New Slow Blank: 23557900.0 i/s - 1.26x slower
38
+ Slow Blank: 2157787.7 i/s - 13.75x slower
39
+
40
+
41
+ ================== Test String Length: 6 ==================
42
+ Calculating -------------------------------------
43
+ Fast Blank 201.185k i/100ms
44
+ Fast ActiveSupport 205.076k i/100ms
45
+ Slow Blank 102.061k i/100ms
46
+ New Slow Blank 123.087k i/100ms
47
+ -------------------------------------------------
48
+ Fast Blank 13.894M (± 2.3%) i/s - 69.409M
49
+ Fast ActiveSupport 14.627M (± 3.5%) i/s - 73.212M
50
+ Slow Blank 1.943M (± 2.3%) i/s - 9.798M
51
+ New Slow Blank 2.796M (± 1.8%) i/s - 14.032M
52
+
53
+ Comparison:
54
+ Fast ActiveSupport: 14627063.7 i/s
55
+ Fast Blank: 13893631.2 i/s - 1.05x slower
56
+ New Slow Blank: 2795783.3 i/s - 5.23x slower
57
+ Slow Blank: 1943025.9 i/s - 7.53x slower
58
+
59
+
60
+ ================== Test String Length: 14 ==================
61
+ Calculating -------------------------------------
62
+ Fast Blank 220.004k i/100ms
63
+ Fast ActiveSupport 219.716k i/100ms
64
+ Slow Blank 147.399k i/100ms
65
+ New Slow Blank 106.651k i/100ms
66
+ -------------------------------------------------
67
+ Fast Blank 24.949M (± 3.0%) i/s - 124.742M
68
+ Fast ActiveSupport 24.491M (± 3.3%) i/s - 122.382M
69
+ Slow Blank 4.292M (± 1.6%) i/s - 21.520M
70
+ New Slow Blank 2.115M (± 2.4%) i/s - 10.665M
71
+
72
+ Comparison:
73
+ Fast Blank: 24948558.8 i/s
74
+ Fast ActiveSupport: 24491245.1 i/s - 1.02x slower
75
+ Slow Blank: 4292490.5 i/s - 5.81x slower
76
+ New Slow Blank: 2115097.6 i/s - 11.80x slower
77
+
78
+
79
+ ================== Test String Length: 24 ==================
80
+ Calculating -------------------------------------
81
+ Fast Blank 206.555k i/100ms
82
+ Fast ActiveSupport 208.513k i/100ms
83
+ Slow Blank 137.733k i/100ms
84
+ New Slow Blank 101.215k i/100ms
85
+ -------------------------------------------------
86
+ Fast Blank 16.761M (± 2.7%) i/s - 83.861M
87
+ Fast ActiveSupport 17.710M (± 3.2%) i/s - 88.618M
88
+ Slow Blank 3.744M (± 2.0%) i/s - 18.732M
89
+ New Slow Blank 1.962M (± 2.7%) i/s - 9.818M
90
+
91
+ Comparison:
92
+ Fast ActiveSupport: 17709936.5 i/s
93
+ Fast Blank: 16760839.7 i/s - 1.06x slower
94
+ Slow Blank: 3744048.4 i/s - 4.73x slower
95
+ New Slow Blank: 1961831.1 i/s - 9.03x slower
96
+
97
+
98
+ ================== Test String Length: 136 ==================
99
+ Calculating -------------------------------------
100
+ Fast Blank 201.772k i/100ms
101
+ Fast ActiveSupport 189.120k i/100ms
102
+ Slow Blank 129.439k i/100ms
103
+ New Slow Blank 90.677k i/100ms
104
+ -------------------------------------------------
105
+ Fast Blank 16.718M (± 2.8%) i/s - 83.534M
106
+ Fast ActiveSupport 17.617M (± 3.6%) i/s - 87.941M
107
+ Slow Blank 3.725M (± 3.0%) i/s - 18.639M
108
+ New Slow Blank 1.940M (± 4.8%) i/s - 9.702M
109
+
110
+ Comparison:
111
+ Fast ActiveSupport: 17616782.1 i/s
112
+ Fast Blank: 16718307.8 i/s - 1.05x slower
113
+ Slow Blank: 3725097.6 i/s - 4.73x slower
114
+ New Slow Blank: 1940271.2 i/s - 9.08x slower
115
+
116
+
117
+ ```
118
+
119
+ Additionally, this gem allocates no strings during the test, making it less of a GC burden.
120
+
121
+ ### Compatibility note:
122
+
123
+ `fast_blank` supports MRI Ruby 1.9.3, 2.0, 2.1, and 2.2, as well as Rubinius 2.x. Earlier versions of MRI are untested.
124
+
125
+ `fast_blank` implements `String#blank?` as MRI would have implemented it, meaning it has 100% parity with `String#strip.length == 0`.
126
+
127
+ Active Support's version also considers Unicode spaces. For example, `"\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000".blank?` is true in Active Support even though `fast_blank` would treat it as *not* blank. Therefore, `fast_blank` also provides `blank_as?` which is a 100%-compatible Active Support `blank?` replacement.
128
+
129
+ ### Credits
130
+
131
+ * Author: Sam Saffron (sam.saffron@gmail.com)
132
+ * https://github.com/SamSaffron/fast_blank
133
+ * License: MIT
134
+ * Gem template based on [CodeMonkeySteve/fast_xor](https://github.com/CodeMonkeySteve/fast_xor)
135
+
136
+ ### Change log:
137
+
138
+ 1.0.1:
139
+ - Minor, avoid warnings if redefining blank?
140
+
141
+ 1.0.0:
142
+ - Adds Ruby 2.2 support ([@tjschuck](https://github.com/tjschuck) — [#9](https://github.com/SamSaffron/fast_blank/pull/9))
143
+
144
+ 0.0.2:
145
+ - Removed rake dependency ([@tmm1](https://github.com/tmm1) — [#2](https://github.com/SamSaffron/fast_blank/pull/2))
146
+ - Unrolled internal loop to improve perf ([@tmm1](https://github.com/tmm1) — [#2](https://github.com/SamSaffron/fast_blank/pull/2))
data/benchmark ADDED
@@ -0,0 +1,166 @@
1
+ #!/usr/bin/env ruby
2
+ $: << File.dirname(__FILE__)+'/lib'
3
+ require 'benchmark/ips'
4
+ require 'fast_blank'
5
+
6
+ class String
7
+ # active support implementation
8
+ def slow_blank?
9
+ /\A[[:space:]]*\z/ === self
10
+ end
11
+
12
+ def new_slow_blank?
13
+ empty? || !(/[[:^space:]]/ === self)
14
+ end
15
+ end
16
+
17
+ test_strings = [
18
+ "",
19
+ "\r\n\r\n ",
20
+ "this is a test",
21
+ " this is a longer test",
22
+ " this is a longer test
23
+ this is a longer test
24
+ this is a longer test
25
+ this is a longer test
26
+ this is a longer test"
27
+ ]
28
+
29
+ test_strings.each do |s|
30
+ raise "failed on #{s.inspect}" if s.blank? != s.slow_blank?
31
+ raise "failed on #{s.inspect}" if s.blank? != s.new_slow_blank?
32
+ end
33
+
34
+ test_strings.each do |s|
35
+ puts "\n================== Test String Length: #{s.length} =================="
36
+ Benchmark.ips do |x|
37
+ x.report("Fast Blank") do |times|
38
+ i = 0
39
+ while i < times
40
+ s.blank?
41
+ i += 1
42
+ end
43
+ end
44
+
45
+ x.report("Fast ActiveSupport") do |times|
46
+ i = 0
47
+ while i < times
48
+ s.blank_as?
49
+ i += 1
50
+ end
51
+ end
52
+
53
+ x.report("Slow Blank") do |times|
54
+ i = 0
55
+ while i < times
56
+ s.slow_blank?
57
+ i += 1
58
+ end
59
+ end
60
+
61
+ x.report("New Slow Blank") do |times|
62
+ i = 0
63
+ while i < times
64
+ s.new_slow_blank?
65
+ i += 1
66
+ end
67
+ end
68
+
69
+ x.compare!
70
+ end
71
+ end
72
+
73
+ # ================== Test String Length: 0 ==================
74
+ # Calculating -------------------------------------
75
+ # Fast Blank 225.251k i/100ms
76
+ # Fast ActiveSupport 225.676k i/100ms
77
+ # Slow Blank 110.934k i/100ms
78
+ # New Slow Blank 221.792k i/100ms
79
+ # -------------------------------------------------
80
+ # Fast Blank 29.673M (± 2.7%) i/s - 148.215M
81
+ # Fast ActiveSupport 28.249M (± 3.5%) i/s - 141.048M
82
+ # Slow Blank 2.158M (± 3.3%) i/s - 10.872M
83
+ # New Slow Blank 23.558M (± 3.2%) i/s - 117.772M
84
+ #
85
+ # Comparison:
86
+ # Fast Blank: 29673200.1 i/s
87
+ # Fast ActiveSupport: 28248894.5 i/s - 1.05x slower
88
+ # New Slow Blank: 23557900.0 i/s - 1.26x slower
89
+ # Slow Blank: 2157787.7 i/s - 13.75x slower
90
+ #
91
+ #
92
+ # ================== Test String Length: 6 ==================
93
+ # Calculating -------------------------------------
94
+ # Fast Blank 201.185k i/100ms
95
+ # Fast ActiveSupport 205.076k i/100ms
96
+ # Slow Blank 102.061k i/100ms
97
+ # New Slow Blank 123.087k i/100ms
98
+ # -------------------------------------------------
99
+ # Fast Blank 13.894M (± 2.3%) i/s - 69.409M
100
+ # Fast ActiveSupport 14.627M (± 3.5%) i/s - 73.212M
101
+ # Slow Blank 1.943M (± 2.3%) i/s - 9.798M
102
+ # New Slow Blank 2.796M (± 1.8%) i/s - 14.032M
103
+ #
104
+ # Comparison:
105
+ # Fast ActiveSupport: 14627063.7 i/s
106
+ # Fast Blank: 13893631.2 i/s - 1.05x slower
107
+ # New Slow Blank: 2795783.3 i/s - 5.23x slower
108
+ # Slow Blank: 1943025.9 i/s - 7.53x slower
109
+ #
110
+ #
111
+ # ================== Test String Length: 14 ==================
112
+ # Calculating -------------------------------------
113
+ # Fast Blank 220.004k i/100ms
114
+ # Fast ActiveSupport 219.716k i/100ms
115
+ # Slow Blank 147.399k i/100ms
116
+ # New Slow Blank 106.651k i/100ms
117
+ # -------------------------------------------------
118
+ # Fast Blank 24.949M (± 3.0%) i/s - 124.742M
119
+ # Fast ActiveSupport 24.491M (± 3.3%) i/s - 122.382M
120
+ # Slow Blank 4.292M (± 1.6%) i/s - 21.520M
121
+ # New Slow Blank 2.115M (± 2.4%) i/s - 10.665M
122
+ #
123
+ # Comparison:
124
+ # Fast Blank: 24948558.8 i/s
125
+ # Fast ActiveSupport: 24491245.1 i/s - 1.02x slower
126
+ # Slow Blank: 4292490.5 i/s - 5.81x slower
127
+ # New Slow Blank: 2115097.6 i/s - 11.80x slower
128
+ #
129
+ #
130
+ # ================== Test String Length: 24 ==================
131
+ # Calculating -------------------------------------
132
+ # Fast Blank 206.555k i/100ms
133
+ # Fast ActiveSupport 208.513k i/100ms
134
+ # Slow Blank 137.733k i/100ms
135
+ # New Slow Blank 101.215k i/100ms
136
+ # -------------------------------------------------
137
+ # Fast Blank 16.761M (± 2.7%) i/s - 83.861M
138
+ # Fast ActiveSupport 17.710M (± 3.2%) i/s - 88.618M
139
+ # Slow Blank 3.744M (± 2.0%) i/s - 18.732M
140
+ # New Slow Blank 1.962M (± 2.7%) i/s - 9.818M
141
+ #
142
+ # Comparison:
143
+ # Fast ActiveSupport: 17709936.5 i/s
144
+ # Fast Blank: 16760839.7 i/s - 1.06x slower
145
+ # Slow Blank: 3744048.4 i/s - 4.73x slower
146
+ # New Slow Blank: 1961831.1 i/s - 9.03x slower
147
+ #
148
+ #
149
+ # ================== Test String Length: 136 ==================
150
+ # Calculating -------------------------------------
151
+ # Fast Blank 201.772k i/100ms
152
+ # Fast ActiveSupport 189.120k i/100ms
153
+ # Slow Blank 129.439k i/100ms
154
+ # New Slow Blank 90.677k i/100ms
155
+ # -------------------------------------------------
156
+ # Fast Blank 16.718M (± 2.8%) i/s - 83.534M
157
+ # Fast ActiveSupport 17.617M (± 3.6%) i/s - 87.941M
158
+ # Slow Blank 3.725M (± 3.0%) i/s - 18.639M
159
+ # New Slow Blank 1.940M (± 4.8%) i/s - 9.702M
160
+ #
161
+ # Comparison:
162
+ # Fast ActiveSupport: 17616782.1 i/s
163
+ # Fast Blank: 16718307.8 i/s - 1.05x slower
164
+ # Slow Blank: 3725097.6 i/s - 4.73x slower
165
+ # New Slow Blank: 1940271.2 i/s - 9.08x slower
166
+ #
@@ -0,0 +1,119 @@
1
+ package com.headius.jruby.fast_blank;
2
+
3
+ import org.jcodings.Encoding;
4
+ import org.jruby.Ruby;
5
+ import org.jruby.RubyString;
6
+ import org.jruby.anno.JRubyMethod;
7
+ import org.jruby.runtime.ThreadContext;
8
+ import org.jruby.runtime.builtin.IRubyObject;
9
+ import org.jruby.runtime.load.Library;
10
+ import org.jruby.util.ByteList;
11
+ import org.jruby.util.StringSupport;
12
+ import org.jruby.util.io.EncodingUtils;
13
+
14
+ public class FastBlankLibrary implements Library {
15
+ public void load(Ruby runtime, boolean wrap) {
16
+ runtime.getString().defineAnnotatedMethods(FastBlankLibrary.class);
17
+ }
18
+
19
+ @JRubyMethod(name = "blank_as?")
20
+ public static IRubyObject blank_as_p(ThreadContext context, IRubyObject self) {
21
+ Encoding enc;
22
+ int s, e;
23
+ byte[] sBytes;
24
+
25
+ Ruby runtime = context.runtime;
26
+
27
+ RubyString str = (RubyString) self;
28
+ enc = str.getEncoding();
29
+ ByteList sByteList = str.getByteList();
30
+ sBytes = sByteList.unsafeBytes();
31
+ s = sByteList.begin();
32
+ if (str.size() == 0) return context.tru;
33
+
34
+ e = s + sByteList.realSize();
35
+ int[] n = {0};
36
+ while (s < e) {
37
+ int cc = EncodingUtils.encCodepointLength(runtime, sBytes, s, e, n, enc);
38
+
39
+ switch (cc) {
40
+ case 9:
41
+ case 0xa:
42
+ case 0xb:
43
+ case 0xc:
44
+ case 0xd:
45
+ case 0x20:
46
+ case 0x85:
47
+ case 0xa0:
48
+ case 0x1680:
49
+ case 0x2000:
50
+ case 0x2001:
51
+ case 0x2002:
52
+ case 0x2003:
53
+ case 0x2004:
54
+ case 0x2005:
55
+ case 0x2006:
56
+ case 0x2007:
57
+ case 0x2008:
58
+ case 0x2009:
59
+ case 0x200a:
60
+ case 0x2028:
61
+ case 0x2029:
62
+ case 0x202f:
63
+ case 0x205f:
64
+ case 0x3000:
65
+ /* found */
66
+ break;
67
+ default:
68
+ return context.fals;
69
+ }
70
+ s += n[0];
71
+ }
72
+ return context.tru;
73
+ }
74
+
75
+ @JRubyMethod(name = "blank?")
76
+ public static IRubyObject blank_p(ThreadContext context, IRubyObject self) {
77
+ RubyString str = (RubyString) self;
78
+
79
+ if (str.size() == 0) return context.tru;
80
+
81
+ ByteList sByteList = str.getByteList();
82
+ byte[] sBytes = sByteList.unsafeBytes();
83
+ int s = sByteList.begin();
84
+ int e = s + sByteList.realSize();
85
+
86
+ // Move to slower path if the string contains non 7-bit ASCII.
87
+ if (str.getCodeRange() != StringSupport.CR_7BIT) return blankSlow(context, sBytes, s, e, str.getEncoding());
88
+
89
+ for (int i = s; i < e; i++) {
90
+ if (!isSpace(sBytes[i])) return context.fals;
91
+ }
92
+
93
+ return context.tru;
94
+ }
95
+
96
+ private static boolean isSpace(byte c) {
97
+ return c == ' ' || ('\t' <= c && c <= '\r') || c == '\0';
98
+ }
99
+
100
+ private static IRubyObject blankSlow(ThreadContext context, byte[] bytes, int s, int e, Encoding enc) {
101
+ Ruby runtime = context.runtime;
102
+ int[] n = {0};
103
+
104
+ while (s < e) {
105
+ int cc = EncodingUtils.encCodepointLength(runtime, bytes, s, e, n, enc);
106
+
107
+ if (!isSpaceCodepoint(cc) && cc != 0) return context.fals;
108
+ s += n[0];
109
+ }
110
+
111
+ return context.tru;
112
+ }
113
+
114
+ // MRI: rb_isspace
115
+ private static boolean isSpaceCodepoint(int codepoint) {
116
+ long c = codepoint & 0xFFFFFFFF;
117
+ return c == ' ' || ('\t' <= c && c <= '\r');
118
+ }
119
+ }
data/lib/.gemkeep ADDED
File without changes
Binary file
data/lib/fast_blank.rb ADDED
@@ -0,0 +1,12 @@
1
+ class ::String
2
+ # Explicitly undefine method before redefining to avoid Ruby warnings.
3
+ undef_method(:blank?) if method_defined?(:blank?)
4
+ end
5
+
6
+ case RUBY_ENGINE
7
+ when 'jruby'
8
+ require 'fast_blank.jar'
9
+ JRuby::Util.load_ext("com.headius.jruby.fast_blank.FastBlankLibrary")
10
+ else
11
+ require 'fast_blank.so'
12
+ end
@@ -0,0 +1,57 @@
1
+ $VERBOSE = true
2
+
3
+ class ::String
4
+ # Stub the original method to make sure it is redefined correctly.
5
+ def blank?
6
+ raise NotImplementedError
7
+ end
8
+
9
+ def blank2?
10
+ /\A[[:space:]]*\z/ === self
11
+ end
12
+ end
13
+
14
+ require 'fast_blank'
15
+
16
+ describe String do
17
+ it "works" do
18
+ expect("".blank?).to eq(true)
19
+ expect(" ".blank?).to eq(true)
20
+ expect("\r\n".blank?).to eq(true)
21
+ "\r\n\v\f\r\s\u0085".blank? == true
22
+ end
23
+
24
+ it "provides a parity with active support function" do
25
+ (16*16*16*16).times do |i|
26
+ c = i.chr('UTF-8') rescue nil
27
+ unless c.nil?
28
+ expect("#{i.to_s(16)} #{c.blank_as?}").to eq("#{i.to_s(16)} #{c.blank2?}")
29
+ end
30
+ end
31
+
32
+
33
+ (256).times do |i|
34
+ c = i.chr('ASCII') rescue nil
35
+ unless c.nil?
36
+ expect("#{i.to_s(16)} #{c.blank_as?}").to eq("#{i.to_s(16)} #{c.blank2?}")
37
+ end
38
+ end
39
+ end
40
+
41
+ it "has parity with strip.length" do
42
+ (256).times do |i|
43
+ c = i.chr('ASCII') rescue nil
44
+ unless c.nil?
45
+ expect("#{i.to_s(16)} #{c.strip.length == 0}").to eq("#{i.to_s(16)} #{c.blank?}")
46
+ end
47
+ end
48
+ end
49
+
50
+ it "treats \u0000 correctly" do
51
+ # odd I know
52
+ expect("\u0000".strip.length).to eq(0)
53
+ expect("\u0000".blank_as?).to be_falsey
54
+ expect("\u0000".blank?).to be_truthy
55
+ end
56
+
57
+ end
metadata ADDED
@@ -0,0 +1,93 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fast_blank
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.1
5
+ platform: java
6
+ authors:
7
+ - Sam Saffron
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-08-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0'
19
+ name: rake-compiler
20
+ prerelease: false
21
+ type: :development
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ name: rspec
34
+ prerelease: false
35
+ type: :development
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ name: benchmark-ips
48
+ prerelease: false
49
+ type: :development
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: Provides a C-optimized method for determining if a string is blank
56
+ email: sam.saffron@gmail.com
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files: []
60
+ files:
61
+ - MIT-LICENSE
62
+ - README.md
63
+ - benchmark
64
+ - ext/java/com/headius/jruby/fast_blank/FastBlankLibrary.java
65
+ - lib/.gemkeep
66
+ - lib/fast_blank.jar
67
+ - lib/fast_blank.rb
68
+ - spec/fast_blank_spec.rb
69
+ homepage: https://github.com/SamSaffron/fast_blank
70
+ licenses:
71
+ - MIT
72
+ metadata: {}
73
+ post_install_message:
74
+ rdoc_options: []
75
+ require_paths:
76
+ - lib
77
+ required_ruby_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ required_rubygems_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ requirements: []
88
+ rubygems_version: 3.2.29
89
+ signing_key:
90
+ specification_version: 4
91
+ summary: Fast String blank? implementation
92
+ test_files:
93
+ - spec/fast_blank_spec.rb