thefox-ext 2.0.0 → 3.0.0.pre.rc.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/.github/workflows/ci.yml +0 -1
- data/CHANGELOG-v2.md +1 -1
- data/CHANGELOG-v3.md +6 -0
- data/README.md +6 -0
- data/bin/dev +1 -4
- data/bin/test.rb +13 -0
- data/lib/thefox-ext.rb +8 -5
- data/lib/thefox-ext/range/lexer/base.rb +59 -4
- data/lib/thefox-ext/range/lexer/block.rb +10 -1
- data/lib/thefox-ext/range/lexer/block_down.rb +8 -4
- data/lib/thefox-ext/range/lexer/block_level.rb +37 -0
- data/lib/thefox-ext/range/lexer/block_up.rb +6 -4
- data/lib/thefox-ext/range/lexer/collection.rb +73 -0
- data/lib/thefox-ext/range/lexer/interval.rb +35 -26
- data/lib/thefox-ext/range/lexer/lexer.rb +39 -229
- data/lib/thefox-ext/range/lexer/number.rb +74 -27
- data/lib/thefox-ext/range/lexer/range.rb +37 -13
- data/lib/thefox-ext/range/lexer/scope.rb +257 -0
- data/lib/thefox-ext/range/lexer/separator.rb +1 -1
- data/lib/thefox-ext/range/resolver.rb +3 -9
- data/lib/thefox-ext/version.rb +2 -2
- data/thefox-ext.gemspec +3 -1
- metadata +37 -6
- data/lib/thefox-ext/range/lexer/block_stack.rb +0 -44
@@ -3,6 +3,263 @@ module TheFox
|
|
3
3
|
module Range
|
4
4
|
module Lexer
|
5
5
|
class Scope < Base
|
6
|
+
def initialize(items = nil, parent_scope = nil, level = 0)
|
7
|
+
super()
|
8
|
+
|
9
|
+
@item_collection = Collection.new(items)
|
10
|
+
@parent_scope = parent_scope
|
11
|
+
@level = level
|
12
|
+
@ref_item = nil
|
13
|
+
|
14
|
+
# puts '%s-> Scope(#%s).initialize(p=%s lev=%d)'.colorize(:red) % [' ' * (@level * 2), @instance_id, @parent_scope.inspect, @level]
|
15
|
+
end
|
16
|
+
|
17
|
+
# :nocov:
|
18
|
+
def name()
|
19
|
+
'Scope(#%s)' % [@instance_id]
|
20
|
+
end
|
21
|
+
def inspect()
|
22
|
+
'Scope(#%s len=%d)' % [@instance_id, @item_collection.length]
|
23
|
+
end
|
24
|
+
# :nocov:
|
25
|
+
|
26
|
+
def push(item)
|
27
|
+
# puts '%s-> %s.push(%s) -> PS=%s PRI=%s'.colorize(:green) % [' ' * (@level * 2),
|
28
|
+
# inspect,
|
29
|
+
# item.inspect,
|
30
|
+
# @parent_scope.inspect,
|
31
|
+
# @parent_scope.ref_item.inspect,
|
32
|
+
# ]
|
33
|
+
@item_collection.push(item)
|
34
|
+
end
|
35
|
+
|
36
|
+
def items()
|
37
|
+
@item_collection.items
|
38
|
+
end
|
39
|
+
|
40
|
+
def curr()
|
41
|
+
@item_collection.curr
|
42
|
+
end
|
43
|
+
|
44
|
+
def prev()
|
45
|
+
@item_collection.prev
|
46
|
+
end
|
47
|
+
|
48
|
+
def parent_scope()
|
49
|
+
@parent_scope
|
50
|
+
end
|
51
|
+
def parent_scope=(parent_scope)
|
52
|
+
@parent_scope = parent_scope
|
53
|
+
end
|
54
|
+
|
55
|
+
def ref_item()
|
56
|
+
@ref_item
|
57
|
+
end
|
58
|
+
def ref_item=(ref_item)
|
59
|
+
# puts '%s--> Set Ref Item: %s'.colorize(:green) % [' ' * (@level * 2), inspect]
|
60
|
+
ref_item.is_ref_item = true
|
61
|
+
@ref_item = ref_item
|
62
|
+
end
|
63
|
+
|
64
|
+
def resolve()
|
65
|
+
# puts '-> %s.resolve(%d)' % [self.inspect, @level]
|
66
|
+
|
67
|
+
# puts '%s-> SL1: %s P=%s' % [' ' * (@level * 2), inspect, @parent_item.inspect]
|
68
|
+
|
69
|
+
scopes = Collection.new([Scope.new(nil, self, @level + 1)])
|
70
|
+
block_stack = Collection.new()
|
71
|
+
parent_item = nil
|
72
|
+
@item_collection.items.each do |item|
|
73
|
+
# puts '%s-> SL1 Item: %s' % [' ' * (@level * 2), item.inspect]
|
74
|
+
|
75
|
+
push_to_scope = false
|
76
|
+
|
77
|
+
case item
|
78
|
+
when Separator
|
79
|
+
if block_stack.length == 0
|
80
|
+
scopes.push(Scope.new(nil, self, @level + 1))
|
81
|
+
else
|
82
|
+
push_to_scope = true
|
83
|
+
end
|
84
|
+
when BlockDown
|
85
|
+
if block_stack.length == 0
|
86
|
+
# puts '%s--> BlockDown: Curr=%s'.colorize(:green) % [' ' * (@level * 2),
|
87
|
+
# scopes.curr.curr.inspect,
|
88
|
+
# ]
|
89
|
+
|
90
|
+
prev_item = scopes.curr.curr
|
91
|
+
|
92
|
+
scopes.push(Scope.new(nil, self, @level + 1))
|
93
|
+
# scopes.curr.ref_item = item.prev_item
|
94
|
+
scopes.curr.ref_item = prev_item
|
95
|
+
|
96
|
+
# puts '%s--> BlockDown: PrevItem=%s'.colorize(:green) % [' ' * (@level * 2),
|
97
|
+
# scopes.curr.ref_item.inspect,
|
98
|
+
# ]
|
99
|
+
else
|
100
|
+
push_to_scope = true
|
101
|
+
end
|
102
|
+
|
103
|
+
# Block Stack
|
104
|
+
block_stack.push(item)
|
105
|
+
when BlockUp
|
106
|
+
block_stack.pop
|
107
|
+
|
108
|
+
prev_ref_item = scopes.curr.ref_item
|
109
|
+
# puts '-> BlockUp: %s' % [prev_ref_item.inspect]
|
110
|
+
|
111
|
+
# TODO: THIS!!!!
|
112
|
+
scopes.push(Scope.new(nil, self, @level + 1))
|
113
|
+
scopes.curr.ref_item = prev_ref_item
|
114
|
+
else
|
115
|
+
push_to_scope = true
|
116
|
+
end # case item
|
117
|
+
|
118
|
+
if push_to_scope
|
119
|
+
# puts '%s--> Push Item: %s PS=%s PI=%s RI=%s,%s' % [' ' * (@level * 2),
|
120
|
+
# item.inspect,
|
121
|
+
# scopes.curr.parent_scope.inspect,
|
122
|
+
# scopes.curr.parent_item.inspect,
|
123
|
+
# @ref_item.inspect,
|
124
|
+
# scopes.curr.ref_item.inspect,
|
125
|
+
# ]
|
126
|
+
scopes.curr.push(item)
|
127
|
+
scopes.curr.curr.parent_item = self
|
128
|
+
# puts '%s--> Pushed Item: %s' % [' ' * (@level * 2), item.inspect]
|
129
|
+
end
|
130
|
+
end # @item_collection.items
|
131
|
+
|
132
|
+
# puts
|
133
|
+
# puts '%s-> Scopes: %s'.colorize(:blue) % [' ' * (@level * 2), scopes.inspect]
|
134
|
+
# scopes.items.each do |scope|
|
135
|
+
# puts scope.inspect.colorize(:blue)
|
136
|
+
# puts scope.items.map{ |i| i.inspect }.to_s.colorize(:blue)
|
137
|
+
# end
|
138
|
+
|
139
|
+
if scopes.length > 1
|
140
|
+
resolved = []
|
141
|
+
scopes.items.each do |scope|
|
142
|
+
resolved.push(scope.resolve)
|
143
|
+
end
|
144
|
+
resolved
|
145
|
+
else
|
146
|
+
# puts
|
147
|
+
# puts '%s-> SL1 Items' % [' ' * (@level * 2)]
|
148
|
+
# pp scopes.curr.items.map{ |item| item.inspect }
|
149
|
+
|
150
|
+
# puts '%s-> SL2 ' % [' ' * (@level * 2)]
|
151
|
+
item_collection1 = Collection.new
|
152
|
+
scopes.curr.items.each do |item|
|
153
|
+
# puts '%s-> SL2 Item: %s (P=%s)' % [
|
154
|
+
# ' ' * (@level * 2),
|
155
|
+
# item.inspect,
|
156
|
+
# item.parent_item.inspect,
|
157
|
+
# ]
|
158
|
+
|
159
|
+
case item
|
160
|
+
when Number
|
161
|
+
# puts '--> Its %s' % [item.inspect]
|
162
|
+
if item.next_item.is_a?(Range) || item.prev_item.is_a?(Range)
|
163
|
+
# Skip Range
|
164
|
+
# puts '--> Skip Range'
|
165
|
+
elsif item.prev_item.is_a?(Interval)
|
166
|
+
# Skip Interval
|
167
|
+
# puts '%s--> Skip Interval' % [' ' * (@level * 2)]
|
168
|
+
# item.prev_item.next_item = nil
|
169
|
+
# item.parent_item = item.prev_item
|
170
|
+
# item.prev_item = nil
|
171
|
+
# item.next_item = nil
|
172
|
+
elsif item.next_item.is_a?(Operator)
|
173
|
+
# Skip Operator
|
174
|
+
# puts '--> Skip Operator'
|
175
|
+
elsif item.has_children
|
176
|
+
# Skip
|
177
|
+
# puts '--> Skip Has Children'
|
178
|
+
elsif item.is_ref_item
|
179
|
+
# puts '--> Skip Ref Item'
|
180
|
+
else
|
181
|
+
# puts '--> Push'
|
182
|
+
# puts '--> Push: %s' % [item.inspect]
|
183
|
+
item_collection1.push(item)
|
184
|
+
end
|
185
|
+
when Range
|
186
|
+
if item.prev_item.is_a?(Number) && item.next_item.is_a?(Number)
|
187
|
+
# puts '--> Range normal'
|
188
|
+
item_collection1.push(item)
|
189
|
+
item_collection1.curr.left_item = item.prev_item
|
190
|
+
item_collection1.curr.right_item = item.next_item
|
191
|
+
|
192
|
+
# 1-10/3
|
193
|
+
# item.prev_item Number
|
194
|
+
# item Range
|
195
|
+
# item.next_item Number
|
196
|
+
# item.next_item.next_item Interval
|
197
|
+
# item.next_item.next_item.next_item Number
|
198
|
+
|
199
|
+
interval_item = item.next_item.next_item
|
200
|
+
if interval_item.is_a?(Interval)
|
201
|
+
item_collection1.curr.interval = interval_item
|
202
|
+
item_collection1.curr.interval.number = item.next_item.next_item.next_item
|
203
|
+
item_collection1.curr.interval.number.parent_item = item_collection1.curr.interval
|
204
|
+
end
|
205
|
+
else
|
206
|
+
raise 'Invalid Range: %s %s' % [
|
207
|
+
item.prev_item.inspect,
|
208
|
+
item.next_item.inspect,
|
209
|
+
]
|
210
|
+
end
|
211
|
+
when Interval
|
212
|
+
# Skip
|
213
|
+
when Operator
|
214
|
+
if item_collection1.curr.is_a?(Range)
|
215
|
+
# puts '%s-> Operator, Curr Range'.colorize(:cyan) % [' ' * (@level * 2)]
|
216
|
+
|
217
|
+
if item_collection1.curr.right_item.is_a?(Number)
|
218
|
+
item_collection1.curr.right_item.inc
|
219
|
+
end
|
220
|
+
elsif item.prev_item.is_a?(Number)
|
221
|
+
# puts '%s-> Operator, Number'.colorize(:cyan) % [' ' * (@level * 2)]
|
222
|
+
|
223
|
+
item_collection1.push(Range.new(item.symbole))
|
224
|
+
item_collection1.curr.left_item = item.prev_item
|
225
|
+
item_collection1.curr.right_item = item.prev_item
|
226
|
+
item_collection1.curr.right_item.inc
|
227
|
+
elsif item.prev_item.is_a?(Operator)
|
228
|
+
# puts '%s-> Operator, Prev Operator'.colorize(:cyan) % [' ' * (@level * 2)]
|
229
|
+
|
230
|
+
if item_collection1.curr.is_a?(Range)
|
231
|
+
if item_collection1.curr.right_item.is_a?(Number)
|
232
|
+
item_collection1.curr.right_item.inc
|
233
|
+
end
|
234
|
+
end
|
235
|
+
# else
|
236
|
+
# puts '%s-> Operator ELSE: %s' % [' ' * (@level * 2), item.prev_item.inspect]
|
237
|
+
end
|
238
|
+
else
|
239
|
+
item_collection1.push(item)
|
240
|
+
end # case item
|
241
|
+
end # scopes.curr.items.each
|
242
|
+
|
243
|
+
# puts '%s-> L3 Items' % [' ' * (@level * 2)]
|
244
|
+
# pp item_collection1.items.map{ |item| item.inspect }
|
245
|
+
|
246
|
+
# puts '%s-> L4 [convert to int]'.colorize(:blue) % [' ' * (@level * 2)]
|
247
|
+
items2 = []
|
248
|
+
item_collection1.items.each do |item|
|
249
|
+
items2.push(item.resolve)
|
250
|
+
end
|
251
|
+
items2
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
class << self
|
256
|
+
def keep_nonce_on_dup()
|
257
|
+
true
|
258
|
+
end
|
259
|
+
def keep_instance_id_on_dup()
|
260
|
+
true
|
261
|
+
end
|
262
|
+
end
|
6
263
|
end # Scope
|
7
264
|
end # Lexer
|
8
265
|
end # Range
|
@@ -1,6 +1,4 @@
|
|
1
1
|
|
2
|
-
require 'pp'
|
3
|
-
|
4
2
|
module TheFox
|
5
3
|
module Range
|
6
4
|
# Resolve a range string to an array.
|
@@ -21,18 +19,14 @@ module Range
|
|
21
19
|
class Resolver
|
22
20
|
def initialize(original = nil)
|
23
21
|
# puts '-> TheFox::Range::Resolver.initialize'
|
24
|
-
@original = original
|
22
|
+
@original = original.to_s
|
25
23
|
end
|
26
24
|
|
27
25
|
def to_a
|
28
26
|
# puts '-> TheFox::Range::Resolver.to_a'
|
29
27
|
|
30
|
-
|
31
|
-
|
32
|
-
lexer.resolve
|
33
|
-
else
|
34
|
-
[]
|
35
|
-
end
|
28
|
+
lexer = Lexer::Lexer.new(@original.to_s.split(''))
|
29
|
+
lexer.resolve.flatten
|
36
30
|
end
|
37
31
|
end # Resolver
|
38
32
|
end # Range
|
data/lib/thefox-ext/version.rb
CHANGED
data/thefox-ext.gemspec
CHANGED
@@ -19,9 +19,11 @@ Gem::Specification.new do |spec|
|
|
19
19
|
|
20
20
|
spec.files = `git ls-files -z`.split("\x0").reject{ |f| f.match(%r{^(test|spec|features)/}) }
|
21
21
|
spec.require_paths = ['lib']
|
22
|
-
spec.required_ruby_version = ['>=2.
|
22
|
+
spec.required_ruby_version = ['>=2.5.0']
|
23
23
|
|
24
24
|
spec.add_development_dependency 'minitest', '~>5.8'
|
25
25
|
spec.add_development_dependency 'simplecov', '~>0.18'
|
26
26
|
spec.add_development_dependency 'simplecov-phpunit', '~>1.0'
|
27
|
+
spec.add_development_dependency 'colorize', '~>0.8'
|
28
|
+
spec.add_development_dependency 'pry', '~>0.14'
|
27
29
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: thefox-ext
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0.pre.rc.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christian Mayer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-04-
|
11
|
+
date: 2021-04-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -52,6 +52,34 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '1.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: colorize
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0.8'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0.8'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: pry
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0.14'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0.14'
|
55
83
|
description: This gem extents some of the basic Ruby classes by missing functionalities.
|
56
84
|
email: christian@fox21.at
|
57
85
|
executables: []
|
@@ -65,6 +93,7 @@ files:
|
|
65
93
|
- ".gitignore"
|
66
94
|
- CHANGELOG-v1.md
|
67
95
|
- CHANGELOG-v2.md
|
96
|
+
- CHANGELOG-v3.md
|
68
97
|
- Gemfile
|
69
98
|
- LICENSE
|
70
99
|
- README.md
|
@@ -72,6 +101,7 @@ files:
|
|
72
101
|
- bin/install.sh
|
73
102
|
- bin/release.sh
|
74
103
|
- bin/setup.sh
|
104
|
+
- bin/test.rb
|
75
105
|
- bin/test.sh
|
76
106
|
- bin/uninstall.sh
|
77
107
|
- lib/thefox-ext.rb
|
@@ -86,8 +116,9 @@ files:
|
|
86
116
|
- lib/thefox-ext/range/lexer/base.rb
|
87
117
|
- lib/thefox-ext/range/lexer/block.rb
|
88
118
|
- lib/thefox-ext/range/lexer/block_down.rb
|
89
|
-
- lib/thefox-ext/range/lexer/
|
119
|
+
- lib/thefox-ext/range/lexer/block_level.rb
|
90
120
|
- lib/thefox-ext/range/lexer/block_up.rb
|
121
|
+
- lib/thefox-ext/range/lexer/collection.rb
|
91
122
|
- lib/thefox-ext/range/lexer/interval.rb
|
92
123
|
- lib/thefox-ext/range/lexer/lexer.rb
|
93
124
|
- lib/thefox-ext/range/lexer/number.rb
|
@@ -111,12 +142,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
111
142
|
requirements:
|
112
143
|
- - ">="
|
113
144
|
- !ruby/object:Gem::Version
|
114
|
-
version: 2.
|
145
|
+
version: 2.5.0
|
115
146
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
116
147
|
requirements:
|
117
|
-
- - "
|
148
|
+
- - ">"
|
118
149
|
- !ruby/object:Gem::Version
|
119
|
-
version:
|
150
|
+
version: 1.3.1
|
120
151
|
requirements: []
|
121
152
|
rubygems_version: 3.2.15
|
122
153
|
signing_key:
|
@@ -1,44 +0,0 @@
|
|
1
|
-
|
2
|
-
require 'pp'
|
3
|
-
|
4
|
-
module TheFox
|
5
|
-
module Range
|
6
|
-
module Lexer
|
7
|
-
# 0123456789
|
8
|
-
class BlockStack
|
9
|
-
def initialize()
|
10
|
-
# puts '-> BlockStack.initialize()'
|
11
|
-
@stack = []
|
12
|
-
end
|
13
|
-
|
14
|
-
# :nocov:
|
15
|
-
def inspect()
|
16
|
-
'BlockStack(%d)' % [@stack.length]
|
17
|
-
end
|
18
|
-
# :nocov:
|
19
|
-
|
20
|
-
def push(item)
|
21
|
-
@stack.push(item)
|
22
|
-
end
|
23
|
-
|
24
|
-
def pop()
|
25
|
-
@stack.pop
|
26
|
-
end
|
27
|
-
|
28
|
-
def curr()
|
29
|
-
@stack.last
|
30
|
-
end
|
31
|
-
|
32
|
-
def length()
|
33
|
-
@stack.length
|
34
|
-
end
|
35
|
-
|
36
|
-
def add_child(item)
|
37
|
-
if !@stack.last.nil? && !item.nil?
|
38
|
-
@stack.last.add_child(item)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end # BlockStack
|
42
|
-
end # Lexer
|
43
|
-
end # Range
|
44
|
-
end # TheFox
|