format_engine 0.5.4 → 0.6.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 +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:
|