ruby_sscanf 0.1.3 → 0.2.0
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.
- checksums.yaml +4 -4
- data/README.md +13 -9
- data/lib/ruby_sscanf.rb +13 -4
- data/lib/ruby_sscanf/version.rb +1 -1
- data/ruby_sscanf.gemspec +1 -1
- data/tests/scan_tests.rb +3 -0
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ebdb3c9a6ba312ee15d515c456ec29608c615a04
|
4
|
+
data.tar.gz: 2d20f9a4f4f278deb583a7d764629c346e31f629
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c17787e331f21a747c6cf5a3542d141399bf236d555dee02c50afaf809db8c0ae04b8101879517b2142bd9f71d93d73e37e8f4917b5d823e0fe4188ff73fdf14
|
7
|
+
data.tar.gz: 9088a19271832f38f28a5ad6c31b98b1316f9d640f3dec292d9288ce376b339dd609c350a3e59cbfeeb05cc722cac35c1521696c79ad04a586361f564e1d588b
|
data/README.md
CHANGED
@@ -49,15 +49,19 @@ Literal string components match themselves in the input string. If the literal
|
|
49
49
|
has a trailing space, then this matches zero or more spaces.
|
50
50
|
The special sequence '%%' matches one '%' in the input string.
|
51
51
|
|
52
|
-
The
|
52
|
+
The layouts of a format specifier are:
|
53
53
|
|
54
54
|
%[skip_flag][width]format
|
55
|
+
%[skip_flag][[min_width,]max_width]set
|
55
56
|
|
56
57
|
* The % sign is the lead-in character.
|
57
58
|
* The optional skip flag, the *, causes any data extracted to be ignored.
|
58
59
|
* The width field is an integer that determines the amount of text to be
|
59
|
-
parsed.
|
60
|
+
parsed. Note that a .precision field may be specified, but it is ignored.
|
60
61
|
* The format field determines the type of data being parsed.
|
62
|
+
* The min_width is the minimum allowed run of characters in the set.
|
63
|
+
* The max_width is the maximum allowed run of characters in the set.
|
64
|
+
* The set field is a regular expression style [...] set.
|
61
65
|
|
62
66
|
The supported format field values are:
|
63
67
|
<br>
|
@@ -152,22 +156,22 @@ pleased to see that in fact ruby_sscanf was faster. Here are the results:
|
|
152
156
|
|
153
157
|
Warming up --------------------------------------
|
154
158
|
Scan strings with ruby_sscanf
|
155
|
-
1.
|
159
|
+
1.768k i/100ms
|
156
160
|
Scan strings with scanf
|
157
|
-
|
161
|
+
310.000 i/100ms
|
158
162
|
Calculating -------------------------------------
|
159
163
|
Scan strings with ruby_sscanf
|
160
|
-
|
164
|
+
18.355k (± 5.8%) i/s - 91.936k
|
161
165
|
Scan strings with scanf
|
162
|
-
3.
|
166
|
+
3.145k (± 7.2%) i/s - 15.810k
|
163
167
|
|
164
168
|
Comparison:
|
165
|
-
Scan strings with ruby_sscanf:
|
166
|
-
Scan strings with scanf:
|
169
|
+
Scan strings with ruby_sscanf: 18354.7 i/s
|
170
|
+
Scan strings with scanf: 3145.0 i/s - 5.84x slower
|
167
171
|
|
168
172
|
This benchmark test was run under:
|
169
173
|
* ruby 2.1.6p336 (2015-04-13 revision 50298) [i386-mingw32]
|
170
|
-
* format_engine version = 0.
|
174
|
+
* format_engine version = 0.6.0
|
171
175
|
|
172
176
|
## Contributing
|
173
177
|
|
data/lib/ruby_sscanf.rb
CHANGED
@@ -43,9 +43,15 @@ class String
|
|
43
43
|
#A regular expression for quoted strings.
|
44
44
|
RSF_QUOTED = /("([^\\"]|\\.)*")|('([^\\']|\\.)*')/
|
45
45
|
|
46
|
+
#The standard handlers for formats with embedded regular expressions.
|
47
|
+
RSF_RGX = lambda {parse(fmt.regex) ? dst << found : :break}
|
48
|
+
RSF_RGX_SKIP = lambda {parse(fmt.regex) || :break}
|
49
|
+
|
50
|
+
|
46
51
|
#Get the parsing engine. This is cached on a per-thread basis. That is to
|
47
52
|
#say, each thread gets its own \FormatEngine::Engine instance.
|
48
|
-
def self.
|
53
|
+
def self.get_parser_engine
|
54
|
+
|
49
55
|
Thread.current[:ruby_sscanf_engine] ||= FormatEngine::Engine.new(
|
50
56
|
"%a" => RSF_FLOAT_PARSE,
|
51
57
|
"%*a" => RSF_FLOAT_SKIP,
|
@@ -114,13 +120,16 @@ class String
|
|
114
120
|
"%X" => RSF_HEX_PARSE,
|
115
121
|
"%*X" => RSF_HEX_SKIP,
|
116
122
|
|
117
|
-
"%[" =>
|
118
|
-
"%*[" =>
|
123
|
+
"%[" => RSF_RGX,
|
124
|
+
"%*[" => RSF_RGX_SKIP,
|
125
|
+
|
126
|
+
"%/" => RSF_RGX,
|
127
|
+
"%*/" => RSF_RGX_SKIP)
|
119
128
|
end
|
120
129
|
|
121
130
|
#Scan the formatted input.
|
122
131
|
def sscanf(format)
|
123
|
-
String.
|
132
|
+
String.get_parser_engine.do_parse(self, [], format)
|
124
133
|
end
|
125
134
|
|
126
135
|
end
|
data/lib/ruby_sscanf/version.rb
CHANGED
data/ruby_sscanf.gemspec
CHANGED
@@ -22,7 +22,7 @@ Gem::Specification.new do |spec|
|
|
22
22
|
|
23
23
|
spec.required_ruby_version = '>= 1.9.3'
|
24
24
|
|
25
|
-
spec.add_runtime_dependency "format_engine", ">= 0.
|
25
|
+
spec.add_runtime_dependency "format_engine", ">= 0.7"
|
26
26
|
|
27
27
|
spec.add_development_dependency "bundler", "~> 1.11"
|
28
28
|
spec.add_development_dependency "rake", "~> 10.0"
|
data/tests/scan_tests.rb
CHANGED
@@ -85,6 +85,9 @@ class ScanTester < Minitest::Test
|
|
85
85
|
|
86
86
|
result = "a b c".sscanf "%[a] %[b] %[c]"
|
87
87
|
assert_equal(["a", "b", "c"] , result)
|
88
|
+
|
89
|
+
result = "a abbccc acbcad".sscanf "%/A/i %/a+b+c+/ %/([ab][cd])+/"
|
90
|
+
assert_equal(["a", "abbccc", "acbcad"] , result)
|
88
91
|
end
|
89
92
|
|
90
93
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_sscanf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Camilleri
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-02-
|
11
|
+
date: 2016-02-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: format_engine
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0.
|
19
|
+
version: '0.7'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '0.
|
26
|
+
version: '0.7'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|