format_engine 0.5.4 → 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/README.md +58 -37
- data/lib/format_engine/engine.rb +7 -1
- data/lib/format_engine/format_spec/literal.rb +5 -0
- data/lib/format_engine/format_spec/set.rb +23 -15
- data/lib/format_engine/format_spec/variable.rb +9 -10
- data/lib/format_engine/format_spec.rb +9 -16
- data/lib/format_engine/spec_info.rb +1 -1
- data/lib/format_engine/version.rb +1 -1
- data/sire.rb +6 -2
- data/tests/format_spec_tests.rb +22 -30
- data/tests/set_spec_tests.rb +25 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: de6ff33cc2d740c1ac1721bc6f2a40bf745208b0
|
4
|
+
data.tar.gz: 9ef57766216651bd454e32ff5cecb8d0c187c39e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 915a1c8a1bcda84ae78e197f990a67519511be97174b36574028af18fded89589bf3425cb666c23e85508057fa876c521038c390d2c164a10e8926caa9f3f972
|
7
|
+
data.tar.gz: 8d80d8e21223443b3806633d7b2ccbf1fbd714a2488c1dd3a67a8096a988eaba26cd04f9b38e0bca0cb42261394bd1927b98213802335d5e30d9ea496e3bf5a0
|
data/README.md
CHANGED
@@ -52,17 +52,17 @@ class Customer
|
|
52
52
|
|
53
53
|
#Demo defn of the strfmt method for formatted string output!
|
54
54
|
attr_formatter :strfmt,
|
55
|
-
{"%a"
|
56
|
-
"%f"
|
57
|
-
"%l"
|
55
|
+
{"%a" => lambda {cat "%#{fmt.width_str}d" % src.age },
|
56
|
+
"%f" => lambda {cat "%#{fmt.width_str}s" % src.first_name },
|
57
|
+
"%l" => lambda {cat "%#{fmt.width_str}s" % src.last_name }
|
58
58
|
}
|
59
59
|
|
60
60
|
#Demo defn of the strprs method for formatted string input!
|
61
61
|
attr_parser :strprs,
|
62
|
-
{"%a"
|
63
|
-
"%f"
|
64
|
-
"%l"
|
65
|
-
:after
|
62
|
+
{"%a" => lambda { tmp[:age] = found.to_i if parse(/(\d)+/ ) },
|
63
|
+
"%f" => lambda { tmp[:fn] = found if parse(/(\w)+/ ) },
|
64
|
+
"%l" => lambda { tmp[:ln] = found if parse(/(\w)+/ ) },
|
65
|
+
:after => lambda { set dst.new(tmp[:fn], tmp[:ln], tmp[:age]) }
|
66
66
|
}
|
67
67
|
|
68
68
|
#Create an instance of the demo customer.
|
@@ -75,7 +75,7 @@ end
|
|
75
75
|
|
76
76
|
cust = Customer.strprs('Jane, Smith 22', "%f, %l %a")
|
77
77
|
|
78
|
-
#
|
78
|
+
# and in another part of Gotham City...
|
79
79
|
|
80
80
|
puts cust.strfmt('%f %l is %a years old.')
|
81
81
|
|
@@ -88,34 +88,58 @@ puts cust.strfmt('%f %l is %a years old.')
|
|
88
88
|
|
89
89
|
Format String Specification Syntax (Regex):
|
90
90
|
|
91
|
+
The parsing of format specification strings is based on the following regular
|
92
|
+
expression. This expression is applied repeatedly until all the specifications
|
93
|
+
have been extracted from the input string.
|
94
|
+
|
91
95
|
REGEX = %r{(?<lead> (^|(?<=[^\\]))%){0}
|
92
|
-
(?<flags> [
|
93
|
-
|
94
|
-
(?<var> \g<lead>\g<flags
|
95
|
-
(?<set> \g<lead>\g<flags
|
96
|
+
(?<flags> [~@#$^&*=?_<>|!]*){0}
|
97
|
+
|
98
|
+
(?<var> \g<lead>\g<flags>[-+]?(\d+(\.\d+)?)?[a-zA-Z]){0}
|
99
|
+
(?<set> \g<lead>\g<flags>(\d+(,\d+)?)?\[([^\]\\]|\\.)+\]){0}
|
96
100
|
(?<per> \g<lead>%){0}
|
101
|
+
|
97
102
|
\g<var> | \g<set> | \g<per>
|
98
103
|
}x
|
99
104
|
|
100
|
-
|
101
|
-
|
105
|
+
### Var
|
106
|
+
A format specification of the classical form:
|
107
|
+
|
108
|
+
%[flags][+/-][width[.precision]]letter
|
109
|
+
|
110
|
+
### Set
|
111
|
+
A reguluar expression set (or un-set) of the form:
|
112
|
+
|
113
|
+
%[flags][[min_width,]max_width]"["[^]set_chars"]"
|
102
114
|
|
103
|
-
###
|
115
|
+
### Per
|
116
|
+
A %% which evaluates to a literal character %.
|
117
|
+
|
118
|
+
### Literal
|
119
|
+
Text in between the various format specifications is treated as literal text.
|
120
|
+
|
121
|
+
###Format Internals:
|
104
122
|
|
105
123
|
The format specification:
|
106
124
|
```ruby
|
107
|
-
"Elapsed = %*02H:%M:%-5.2S
|
125
|
+
"Elapsed = %*02H:%M:%-5.2S %d%% %@1[!?]"
|
108
126
|
```
|
109
127
|
creates the following format specification array:
|
110
128
|
|
111
129
|
```ruby
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
130
|
+
#<FormatEngine::FormatSpec:0x1b4e288
|
131
|
+
@specs=
|
132
|
+
[Literal("Elapsed = "),
|
133
|
+
Variable("%*H", ["02"]),
|
134
|
+
Literal(":"),
|
135
|
+
Variable("%M", nil),
|
136
|
+
Literal(":"),
|
137
|
+
Variable("%S", ["-5", "2"]),
|
138
|
+
Literal(" "),
|
139
|
+
Variable("%d", nil),
|
140
|
+
Literal("%"),
|
141
|
+
Literal(" "),
|
142
|
+
Set("%@[!?]", "%@[", /[!?]{1,1}/)]>
|
119
143
|
```
|
120
144
|
Where literals are processed as themselves, except:
|
121
145
|
* If that literal ends with a space, that space will parse zero or more spaces.
|
@@ -125,7 +149,14 @@ When formatting, the trailing space is just another space.
|
|
125
149
|
character. Thus \\% is equivalent to %%.
|
126
150
|
|
127
151
|
Variables are executed by looking up the format string (without the width or
|
128
|
-
precision fields) in the library and executing the corresponding block.
|
152
|
+
precision fields) in the library and executing the corresponding block. The
|
153
|
+
format string can be seen in the above sample as the first string in the
|
154
|
+
Variable
|
155
|
+
|
156
|
+
Sets work by looking into the input string with their regular expression. Sets
|
157
|
+
are only ever used when parsing, never for formatting. Sets are executed by
|
158
|
+
first looking up their long name, listed first, and then if the long name is not
|
159
|
+
found, their short name, listed second is tried.
|
129
160
|
|
130
161
|
**Note:** If a format string does not correspond to an entry in the library,
|
131
162
|
an exception occurs.
|
@@ -160,6 +191,7 @@ Methods
|
|
160
191
|
* set - Set the return value of the parsing operation to the value that follows.
|
161
192
|
* parse - Look for the string or regex parm that follows. Return the data found or nil.
|
162
193
|
* parse! - Like parse but raises an exception (with optional msg) if not found.
|
194
|
+
* grab - Grab some text based on the width of the format.
|
163
195
|
* found? - Did the last parse succeed?
|
164
196
|
* found - The text found by the last parse (or parse!) operation.
|
165
197
|
|
@@ -174,17 +206,6 @@ fmt attribute, has itself, the following attributes:
|
|
174
206
|
* prec_str - The actual precision text or an empty string.
|
175
207
|
* parm_str - The actual parameter (width and precision) text or an empty string.
|
176
208
|
|
177
|
-
## Philosophy
|
178
|
-
|
179
|
-
When designing this gem, a concerted effort has been applied to keeping it as
|
180
|
-
simple as possible. To this end, many subtle programming techniques have been
|
181
|
-
avoided in favor of simpler, more obvious approaches. This is based on the
|
182
|
-
observation that I don't trust code that I don't understand and I avoid code
|
183
|
-
that I don't trust.
|
184
|
-
|
185
|
-
Feedback on the convenience/clarity balance as well as any other topics are
|
186
|
-
most welcomed.
|
187
|
-
|
188
209
|
## Contributing
|
189
210
|
|
190
211
|
#### Plan A
|
@@ -200,7 +221,7 @@ most welcomed.
|
|
200
221
|
Go to the GitHub repository and raise an issue calling attention to some
|
201
222
|
aspect that could use some TLC or a suggestion or idea. Apply labels to
|
202
223
|
the issue that match the point you are trying to make. Then follow your
|
203
|
-
issue and keep up-to-date as it is worked on.
|
204
|
-
|
224
|
+
issue and keep up-to-date as it is worked on. All input are greatly
|
225
|
+
appreciated.
|
205
226
|
|
206
227
|
|
data/lib/format_engine/engine.rb
CHANGED
@@ -9,6 +9,7 @@ module FormatEngine
|
|
9
9
|
#Set up base data structures.
|
10
10
|
def initialize(library)
|
11
11
|
@library = library
|
12
|
+
@spec_pool = {}
|
12
13
|
|
13
14
|
#Set up defaults for pre and post amble blocks.
|
14
15
|
nop = lambda { }
|
@@ -59,7 +60,7 @@ module FormatEngine
|
|
59
60
|
#* spec_str - The format specification string.
|
60
61
|
#* block - A code block performed for each format specification.
|
61
62
|
def due_process(spec_info, spec_str)
|
62
|
-
format_spec =
|
63
|
+
format_spec = get_spec(spec_str)
|
63
64
|
|
64
65
|
spec_info.instance_exec(&self[:before])
|
65
66
|
|
@@ -72,5 +73,10 @@ module FormatEngine
|
|
72
73
|
spec_info.dst
|
73
74
|
end
|
74
75
|
|
76
|
+
#Get a format specification with caching.
|
77
|
+
def get_spec(spec_str)
|
78
|
+
@spec_pool[spec_str] ||= FormatSpec.new(spec_str).validate(self)
|
79
|
+
end
|
80
|
+
|
75
81
|
end
|
76
82
|
end
|
@@ -3,8 +3,11 @@ module FormatEngine
|
|
3
3
|
#A format engine set specification.
|
4
4
|
class FormatSet
|
5
5
|
|
6
|
-
#The
|
7
|
-
attr_reader :
|
6
|
+
#The full name of the set.
|
7
|
+
attr_reader :long_name
|
8
|
+
|
9
|
+
#The short form name of the set.
|
10
|
+
attr_reader :short_name
|
8
11
|
|
9
12
|
#The regular expression part of this set specification.
|
10
13
|
attr_reader :regex
|
@@ -18,14 +21,16 @@ module FormatEngine
|
|
18
21
|
def initialize(format)
|
19
22
|
@raw = format
|
20
23
|
|
21
|
-
if
|
22
|
-
qualifier
|
23
|
-
@
|
24
|
-
|
24
|
+
if (match_data = /(\d+,)?(\d+)(?=\[)/.match(format))
|
25
|
+
qualifier = "{#{match_data[1] || "1,"}#{match_data[2]}}"
|
26
|
+
@short_name = match_data.pre_match + "["
|
27
|
+
@long_name = match_data.pre_match + match_data.post_match
|
28
|
+
set = match_data.post_match
|
25
29
|
elsif format =~ /\[/
|
26
|
-
qualifier
|
27
|
-
@
|
28
|
-
|
30
|
+
qualifier = "+"
|
31
|
+
@short_name = $PREMATCH + $MATCH
|
32
|
+
@long_name = format
|
33
|
+
set = $MATCH + $POSTMATCH
|
29
34
|
else
|
30
35
|
fail "Invalid set string #{format}"
|
31
36
|
end
|
@@ -33,6 +38,13 @@ module FormatEngine
|
|
33
38
|
@regex = Regexp.new("#{set}#{qualifier}")
|
34
39
|
end
|
35
40
|
|
41
|
+
#Is this format item supported by the engine's library?
|
42
|
+
def validate(engine)
|
43
|
+
@block = engine[@long_name] || engine[@short_name]
|
44
|
+
fail "Unsupported tag = #{@raw.inspect}" unless @block
|
45
|
+
true
|
46
|
+
end
|
47
|
+
|
36
48
|
#Format onto the output string
|
37
49
|
def do_format(spec_info)
|
38
50
|
fail "The tag %{@raw} may not be used in formatting."
|
@@ -40,16 +52,12 @@ module FormatEngine
|
|
40
52
|
|
41
53
|
#Parse from the input string
|
42
54
|
def do_parse(spec_info)
|
43
|
-
|
44
|
-
fail "Unsupported tag = #{format.inspect}"
|
45
|
-
end
|
46
|
-
|
47
|
-
spec_info.instance_exec(&block)
|
55
|
+
spec_info.instance_exec(&@block)
|
48
56
|
end
|
49
57
|
|
50
58
|
#Inspect for debugging.
|
51
59
|
def inspect
|
52
|
-
"Set(#{
|
60
|
+
"Set(#{@long_name.inspect}, #{@short_name.inspect}, #{regex.inspect})"
|
53
61
|
end
|
54
62
|
|
55
63
|
end
|
@@ -61,14 +61,21 @@ module FormatEngine
|
|
61
61
|
has_prec? ? parms[1] : ""
|
62
62
|
end
|
63
63
|
|
64
|
+
#Is this format item supported by the engine's library?
|
65
|
+
def validate(engine)
|
66
|
+
@block = engine[format]
|
67
|
+
fail "Unsupported tag = #{format.inspect}" unless @block
|
68
|
+
true
|
69
|
+
end
|
70
|
+
|
64
71
|
#Format onto the output string
|
65
72
|
def do_format(spec_info)
|
66
|
-
spec_info.instance_exec(
|
73
|
+
spec_info.instance_exec(&@block)
|
67
74
|
end
|
68
75
|
|
69
76
|
#Parse from the input string
|
70
77
|
def do_parse(spec_info)
|
71
|
-
spec_info.instance_exec(
|
78
|
+
spec_info.instance_exec(&@block)
|
72
79
|
end
|
73
80
|
|
74
81
|
#Inspect for debugging.
|
@@ -76,14 +83,6 @@ module FormatEngine
|
|
76
83
|
"Variable(#{format.inspect}, #{parms.inspect})"
|
77
84
|
end
|
78
85
|
|
79
|
-
private
|
80
|
-
|
81
|
-
#Get the execution block from the engine.
|
82
|
-
def get_block(engine)
|
83
|
-
block = engine[format]
|
84
|
-
fail "Unsupported tag = #{format.inspect}" unless block
|
85
|
-
block
|
86
|
-
end
|
87
86
|
end
|
88
87
|
|
89
88
|
end
|
@@ -10,35 +10,28 @@ module FormatEngine
|
|
10
10
|
class FormatSpec
|
11
11
|
#The regex used to parse variable specifications.
|
12
12
|
REGEX = %r{(?<lead> (^|(?<=[^\\]))%){0}
|
13
|
-
(?<flags> [
|
14
|
-
(?<
|
15
|
-
(?<
|
16
|
-
(?<set> \g<lead>\g<flags>\d*\[([^\]\\]|\\.)+\]){0}
|
13
|
+
(?<flags> [~@#$^&*=?_<>|!]*){0}
|
14
|
+
(?<var> \g<lead>\g<flags>[-+]?(\d+(\.\d+)?)?[a-zA-Z]){0}
|
15
|
+
(?<set> \g<lead>\g<flags>(\d+(,\d+)?)?\[([^\]\\]|\\.)+\]){0}
|
17
16
|
(?<per> \g<lead>%){0}
|
18
17
|
\g<var> | \g<set> | \g<per>
|
19
18
|
}x
|
20
19
|
|
21
|
-
#Don't use new, use get_spec instead.
|
22
|
-
private_class_method :new
|
23
|
-
|
24
|
-
#Either get a format specification from the pool or create one.
|
25
|
-
def self.get_spec(fmt_string)
|
26
|
-
@spec_pool ||= {}
|
27
|
-
@spec_pool[fmt_string] ||= new(fmt_string)
|
28
|
-
end
|
29
|
-
|
30
20
|
#The array of specifications that were extracted.
|
31
21
|
attr_reader :specs
|
32
22
|
|
33
23
|
#Set up an instance of a format specification.
|
34
|
-
#<br>Note
|
35
|
-
#This is a private method (rdoc gets it wrong). To create new instances of
|
36
|
-
#\FormatSpec do not use \FormatSpec.new, but use \FormatSpec.get_spec instead.
|
37
24
|
def initialize(fmt_string)
|
38
25
|
@specs = []
|
39
26
|
scan_spec(fmt_string)
|
40
27
|
end
|
41
28
|
|
29
|
+
# Validate the specs of this format against the engine.
|
30
|
+
def validate(engine)
|
31
|
+
specs.each {|item| item.validate(engine)}
|
32
|
+
self
|
33
|
+
end
|
34
|
+
|
42
35
|
#Scan the format string extracting literals and variables.
|
43
36
|
def scan_spec(fmt_string)
|
44
37
|
until fmt_string.empty?
|
data/sire.rb
CHANGED
@@ -29,6 +29,10 @@ class SIRE
|
|
29
29
|
#Set up the interactive session.
|
30
30
|
def initialize
|
31
31
|
@_done = false
|
32
|
+
@_edit = MiniReadline::Readline.new(history: true,
|
33
|
+
auto_complete: true,
|
34
|
+
auto_source: MiniReadline::QuotedFileFolderSource,
|
35
|
+
eoi_detect: true)
|
32
36
|
|
33
37
|
puts "Welcome to a Simple Interactive Ruby Environment\n"
|
34
38
|
puts "FormatEngine version = #{FormatEngine::VERSION}"
|
@@ -69,12 +73,12 @@ class SIRE
|
|
69
73
|
def run_sire
|
70
74
|
until @_done
|
71
75
|
@_break = false
|
72
|
-
exec_line(
|
76
|
+
exec_line(@_edit.readline(prompt: 'SIRE>'))
|
73
77
|
end
|
74
78
|
|
75
79
|
puts "\n\n"
|
76
80
|
|
77
|
-
rescue Interrupt => e
|
81
|
+
rescue MiniReadlineEOI, Interrupt => e
|
78
82
|
puts "\nInterrupted! Program Terminating."
|
79
83
|
end
|
80
84
|
|
data/tests/format_spec_tests.rb
CHANGED
@@ -9,7 +9,7 @@ class FormatSpecTester < Minitest::Test
|
|
9
9
|
include MinitestVisible
|
10
10
|
|
11
11
|
def test_that_it_scans_literal_formats
|
12
|
-
test = FormatEngine::FormatSpec.
|
12
|
+
test = FormatEngine::FormatSpec.new "ABCDEFG!"
|
13
13
|
assert_equal(Array, test.specs.class)
|
14
14
|
assert_equal(1, test.specs.length)
|
15
15
|
assert_equal(FormatEngine::FormatLiteral, test.specs[0].class)
|
@@ -17,7 +17,7 @@ class FormatSpecTester < Minitest::Test
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def test_that_backslash_quotes
|
20
|
-
test = FormatEngine::FormatSpec.
|
20
|
+
test = FormatEngine::FormatSpec.new "ABC\\%DEFG!"
|
21
21
|
assert_equal(Array, test.specs.class)
|
22
22
|
assert_equal(1, test.specs.length)
|
23
23
|
assert_equal(FormatEngine::FormatLiteral, test.specs[0].class)
|
@@ -25,7 +25,7 @@ class FormatSpecTester < Minitest::Test
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def test_that_it_scans_simple_variable_formats
|
28
|
-
test = FormatEngine::FormatSpec.
|
28
|
+
test = FormatEngine::FormatSpec.new "%A"
|
29
29
|
assert_equal(Array, test.specs.class)
|
30
30
|
assert_equal(1, test.specs.length)
|
31
31
|
assert_equal(FormatEngine::FormatVariable, test.specs[0].class)
|
@@ -34,44 +34,48 @@ class FormatSpecTester < Minitest::Test
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def test_that_it_scans_set_formats
|
37
|
-
test = FormatEngine::FormatSpec.
|
37
|
+
test = FormatEngine::FormatSpec.new "%[A]"
|
38
38
|
assert_equal(Array, test.specs.class)
|
39
39
|
assert_equal(1, test.specs.length)
|
40
40
|
assert_equal(FormatEngine::FormatSet, test.specs[0].class)
|
41
|
-
assert_equal("%[", test.specs[0].
|
41
|
+
assert_equal("%[", test.specs[0].short_name)
|
42
|
+
assert_equal("%[A]", test.specs[0].long_name)
|
42
43
|
assert_equal(/[A]+/, test.specs[0].regex)
|
43
44
|
|
44
|
-
test = FormatEngine::FormatSpec.
|
45
|
+
test = FormatEngine::FormatSpec.new "%*[A]"
|
45
46
|
assert_equal(Array, test.specs.class)
|
46
47
|
assert_equal(1, test.specs.length)
|
47
48
|
assert_equal(FormatEngine::FormatSet, test.specs[0].class)
|
48
|
-
assert_equal("%*[", test.specs[0].
|
49
|
+
assert_equal("%*[", test.specs[0].short_name)
|
50
|
+
assert_equal("%*[A]", test.specs[0].long_name)
|
49
51
|
assert_equal(/[A]+/, test.specs[0].regex)
|
50
52
|
|
51
|
-
test = FormatEngine::FormatSpec.
|
53
|
+
test = FormatEngine::FormatSpec.new "%7[A]"
|
52
54
|
assert_equal(Array, test.specs.class)
|
53
55
|
assert_equal(1, test.specs.length)
|
54
56
|
assert_equal(FormatEngine::FormatSet, test.specs[0].class)
|
55
|
-
assert_equal("%[", test.specs[0].
|
57
|
+
assert_equal("%[", test.specs[0].short_name)
|
58
|
+
assert_equal("%[A]", test.specs[0].long_name)
|
56
59
|
assert_equal(/[A]{1,7}/, test.specs[0].regex)
|
57
60
|
|
58
|
-
test = FormatEngine::FormatSpec.
|
61
|
+
test = FormatEngine::FormatSpec.new "%*7[A]"
|
59
62
|
assert_equal(Array, test.specs.class)
|
60
63
|
assert_equal(1, test.specs.length)
|
61
64
|
assert_equal(FormatEngine::FormatSet, test.specs[0].class)
|
62
|
-
assert_equal("%*[", test.specs[0].
|
65
|
+
assert_equal("%*[", test.specs[0].short_name)
|
66
|
+
assert_equal("%*[A]", test.specs[0].long_name)
|
63
67
|
assert_equal(/[A]{1,7}/, test.specs[0].regex)
|
64
68
|
end
|
65
69
|
|
66
70
|
def test_a_mixed_set
|
67
|
-
test = FormatEngine::FormatSpec.
|
71
|
+
test = FormatEngine::FormatSpec.new "%f %l %[age] %a"
|
68
72
|
assert_equal(Array, test.specs.class)
|
69
73
|
assert_equal(7, test.specs.length)
|
70
74
|
|
71
75
|
end
|
72
76
|
|
73
77
|
def test_that_it_scans_tab_seperators
|
74
|
-
test = FormatEngine::FormatSpec.
|
78
|
+
test = FormatEngine::FormatSpec.new "%A\t%B"
|
75
79
|
assert_equal(Array, test.specs.class)
|
76
80
|
assert_equal(3, test.specs.length)
|
77
81
|
|
@@ -89,7 +93,7 @@ class FormatSpecTester < Minitest::Test
|
|
89
93
|
|
90
94
|
def test_that_it_scans_option_variable_formats
|
91
95
|
"~@#&^&*-+=?_<>|".each_char do |char|
|
92
|
-
test = FormatEngine::FormatSpec.
|
96
|
+
test = FormatEngine::FormatSpec.new "%#{char}A"
|
93
97
|
assert_equal(Array, test.specs.class)
|
94
98
|
assert_equal(1, test.specs.length)
|
95
99
|
assert_equal(FormatEngine::FormatVariable, test.specs[0].class)
|
@@ -103,7 +107,7 @@ class FormatSpecTester < Minitest::Test
|
|
103
107
|
end
|
104
108
|
|
105
109
|
def test_that_it_scans_single_variable_formats
|
106
|
-
test = FormatEngine::FormatSpec.
|
110
|
+
test = FormatEngine::FormatSpec.new "%123A"
|
107
111
|
assert_equal(Array, test.specs.class)
|
108
112
|
assert_equal(1, test.specs.length)
|
109
113
|
assert_equal(FormatEngine::FormatVariable, test.specs[0].class)
|
@@ -120,7 +124,7 @@ class FormatSpecTester < Minitest::Test
|
|
120
124
|
end
|
121
125
|
|
122
126
|
def test_that_it_scans_double_variable_formats
|
123
|
-
test = FormatEngine::FormatSpec.
|
127
|
+
test = FormatEngine::FormatSpec.new "%123.456A"
|
124
128
|
assert_equal(Array, test.specs.class)
|
125
129
|
assert_equal(1, test.specs.length)
|
126
130
|
assert_equal(FormatEngine::FormatVariable, test.specs[0].class)
|
@@ -138,7 +142,7 @@ class FormatSpecTester < Minitest::Test
|
|
138
142
|
end
|
139
143
|
|
140
144
|
def test_negative_variable_formats
|
141
|
-
test = FormatEngine::FormatSpec.
|
145
|
+
test = FormatEngine::FormatSpec.new "%-123.456A"
|
142
146
|
assert_equal(Array, test.specs.class)
|
143
147
|
assert_equal(1, test.specs.length)
|
144
148
|
assert_equal(FormatEngine::FormatVariable, test.specs[0].class)
|
@@ -156,7 +160,7 @@ class FormatSpecTester < Minitest::Test
|
|
156
160
|
end
|
157
161
|
|
158
162
|
def test_multipart_formats
|
159
|
-
test = FormatEngine::FormatSpec.
|
163
|
+
test = FormatEngine::FormatSpec.new "T(%+02A:%3B:%4.1C)"
|
160
164
|
|
161
165
|
assert_equal(Array, test.specs.class)
|
162
166
|
assert_equal(7, test.specs.length)
|
@@ -190,16 +194,4 @@ class FormatSpecTester < Minitest::Test
|
|
190
194
|
assert_equal(")", test.specs[6].literal)
|
191
195
|
end
|
192
196
|
|
193
|
-
def test_that_it_caches
|
194
|
-
t1 = FormatEngine::FormatSpec.get_spec "%123.456A"
|
195
|
-
t2 = FormatEngine::FormatSpec.get_spec "%123.456A"
|
196
|
-
assert(t1.object_id == t2.object_id)
|
197
|
-
|
198
|
-
t3 = FormatEngine::FormatSpec.get_spec "%123.457A"
|
199
|
-
assert(t1.object_id != t3.object_id)
|
200
|
-
|
201
|
-
t4 = FormatEngine::FormatSpec.get_spec "%123.457A"
|
202
|
-
assert(t4.object_id == t3.object_id)
|
203
|
-
end
|
204
|
-
|
205
197
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative '../lib/format_engine'
|
2
|
+
gem 'minitest'
|
3
|
+
require 'minitest/autorun'
|
4
|
+
require 'minitest_visible'
|
5
|
+
|
6
|
+
class SetSpecTester < Minitest::Test
|
7
|
+
|
8
|
+
#Track mini-test progress.
|
9
|
+
include MinitestVisible
|
10
|
+
|
11
|
+
def test_the_parms
|
12
|
+
test = FormatEngine::FormatSet.new("%[ABC]")
|
13
|
+
assert_equal(0, test.width)
|
14
|
+
assert_equal(/[ABC]+/, test.regex)
|
15
|
+
|
16
|
+
test = FormatEngine::FormatSet.new("%10[ABC]")
|
17
|
+
assert_equal(0, test.width)
|
18
|
+
assert_equal(/[ABC]{1,10}/, test.regex)
|
19
|
+
|
20
|
+
test = FormatEngine::FormatSet.new("%5,10[ABC]")
|
21
|
+
assert_equal(0, test.width)
|
22
|
+
assert_equal(/[ABC]{5,10}/, test.regex)
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: format_engine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.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-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -119,6 +119,7 @@ files:
|
|
119
119
|
- tests/literal_spec_tests.rb
|
120
120
|
- tests/parser_engine_tests.rb
|
121
121
|
- tests/scan_tests.rb
|
122
|
+
- tests/set_spec_tests.rb
|
122
123
|
- tests/variable_spec_tests.rb
|
123
124
|
homepage: http://teuthida-technologies.com/
|
124
125
|
licenses:
|