Class: Yast::SequencerClass
- Inherits:
-
Module
- Object
- Module
- Yast::SequencerClass
- Defined in:
- ../../src/modules/Sequencer.rb
Instance Method Summary (collapse)
- - (Object) main
-
- (Object) Run(aliases, sequence)
The Wizard Sequencer.
-
- (Yast::Term) WS_alias(aliases, alias_)
Find an aliases in the aliases map.
-
- (Object) WS_check(aliases, sequence)
Check correct types in maps and alias presence for sequence.
-
- (Object) WS_error(error)
Report error and return nil.
-
- (Object) WS_next(sequence, current, ret)
Find a next item in the sequence.
-
- (new stack, poped value) WS_pop(stack)
Pop one item from the stack (remove an item and return the stack top item).
-
- (Object) WS_push(stack, item)
Push one item to the stack.
-
- (Object) WS_run(aliases, id)
Run a function from the aliases map.
-
- (Object) WS_special(aliases, alias_)
Decide if an alias is special.
-
- (Object) WS_testall(aliases)
Test (run) all dialogs in the aliases map.
Instance Method Details
- (Object) main
41 42 43 44 45 |
# File '../../src/modules/Sequencer.rb', line 41 def main textdomain "base" @docheck = true end |
- (Object) Run(aliases, sequence)
The Wizard Sequencer
312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 |
# File '../../src/modules/Sequencer.rb', line 312 def Run(aliases, sequence) aliases = deep_copy(aliases) sequence = deep_copy(sequence) # Check aliases and sequence correctness if @docheck && WS_check(aliases, sequence) != true return Convert.to_symbol(WS_error("CHECK FAILED")) end stack = [] # string|symbol current current = Ops.get(sequence, "ws_start") if current.nil? return Convert.to_symbol(WS_error("Starting dialog not found")) end loop do if Ops.is_symbol?(current) Builtins.y2debug("Finished") return Convert.to_symbol(current) end stack = WS_push(stack, current) Builtins.y2debug("stack=%1", stack) ret = WS_run(aliases, Convert.to_string(current)) if ret.nil? || !Ops.is_symbol?(ret) return Convert.to_symbol( WS_error(Builtins.sformat("Invalid ret: %1", ret)) ) elsif ret == :back Builtins.y2debug("Back") poped = [] special = true loop do return :back if Ops.less_than(Builtins.size(stack), 2) poped = WS_pop(stack) Builtins.y2debug("poped=%1", poped) current = Ops.get(poped, 1) stack = Ops.get_list(poped, 0) special = WS_special(aliases, Convert.to_string(current)) Builtins.y2debug("special=%1", special) break if !special end else Builtins.y2debug("ret=%1", ret) current = WS_next( sequence, Convert.to_string(current), Convert.to_symbol(ret) ) Builtins.y2debug("current=%1", current) if current.nil? return Convert.to_symbol( WS_error(Builtins.sformat("Next not found: %1", current)) ) end end end # Not reached nil end |
- (Yast::Term) WS_alias(aliases, alias_)
Find an aliases in the aliases map
191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 |
# File '../../src/modules/Sequencer.rb', line 191 def WS_alias(aliases, alias_) aliases = deep_copy(aliases) found = Ops.get(aliases, alias_) if found.nil? return WS_error(Builtins.sformat("Alias not found: %1", alias_)) end if Ops.is_list?(found) if Ops.less_or_equal(Builtins.size(Convert.to_list(found)), 0) return WS_error(Builtins.sformat("Invalid alias: %1", found)) end found = Ops.get(Convert.to_list(found), 0) end if found.nil? return WS_error(Builtins.sformat("Invalid alias: %1", found)) end deep_copy(found) end |
- (Object) WS_check(aliases, sequence)
Check correct types in maps and alias presence for sequence.
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 |
# File '../../src/modules/Sequencer.rb', line 60 def WS_check(aliases, sequence) aliases = deep_copy(aliases) sequence = deep_copy(sequence) ret = [] # check if aliases is not a nil if aliases.nil? Builtins.y2error(2, "sequencer check: aliases is nil") return false end # check if sequence is not a nil if sequence.nil? Builtins.y2error(2, "sequencer check: sequence is nil") return false end # check if ws_start is in aliases if Ops.get(aliases, "ws_start") Builtins.y2error(2, "sequencer check: ws_start cannot be an alias name") ret = Builtins.add(ret, false) else ret = Builtins.add(ret, true) end # check aliases map types ret0 = Builtins.maplist(aliases) do |key, val| if !Ops.is_string?(key) Builtins.y2error(2, "sequencer check: not a string: %1", key) next false elsif Ops.is_list?(val) if Ops.less_than(Builtins.size(Convert.to_list(val)), 2) Builtins.y2error( 2, "sequencer check: list size too small: %1 (key: %2)", Builtins.size(Convert.to_list(val)), key ) next false # FIXME: use function pointers # else if (!is(select((list) val, 0, nil), term)) { # y2error(2, "sequencer check: not a term: %1", select((list) val, 0, nil)); # return false; # } elsif !Ops.is_boolean?(Ops.get(Convert.to_list(val), 1)) Builtins.y2error( 2, "sequencer check: not a boolean: %1", Ops.get(Convert.to_list(val), 1) ) next false else next true end else # FIXME: use function pointers # else if (!is(val, term)) { # y2error(2, "sequencer check: not a term: %1", val); # return false; # } next true end end ret = Builtins.flatten([ret, ret0]) # check if ws_start is in sequence if Ops.get(sequence, "ws_start").nil? Builtins.y2error(2, "sequencer check: ws_start needs to be defined") ret = Builtins.add(ret, false) else ret = Builtins.add(ret, true) end # check all aliases in sequence ret0 = Builtins.maplist(sequence) do |key, val| if key == "ws_start" if !Ops.is_symbol?(val) && Ops.get(aliases, val).nil? Builtins.y2error(2, "sequencer check: alias not found: %1", val) next false else next true end elsif Ops.get(aliases, key).nil? Builtins.y2error(2, "sequencer check: alias not found: %1", key) next false elsif !Ops.is_map?(val) Builtins.y2error(2, "sequencer check: not a map: %1 %2", key, val) next false else ret1 = Builtins.maplist(Convert.to_map(val)) do |k, v| if !Ops.is_symbol?(k) Builtins.y2error(2, "sequencer check: not a symbol: %1", k) next false elsif !Ops.is_symbol?(v) && Ops.get(aliases, v).nil? Builtins.y2error(2, "sequencer check: alias not found: %1", v) next false else next true end end next ret1.all? { |v| v } end end ret = Builtins.flatten([ret, ret0]) # check that all aliases are used ret0 = Builtins.maplist(aliases) do |key, _val| if !Builtins.haskey(sequence, key) Builtins.y2warning(2, "sequencer check: alias not used: %1", key) # return false; end true end ret = Builtins.flatten([ret, ret0]) ret.all? { |v| v } end |
- (Object) WS_error(error)
Report error and return nil
182 183 184 185 |
# File '../../src/modules/Sequencer.rb', line 182 def WS_error(error) Builtins.y2error(1, "sequencer: %1", error) nil end |
- (Object) WS_next(sequence, current, ret)
Find a next item in the sequence
236 237 238 239 240 241 242 243 244 245 246 247 248 |
# File '../../src/modules/Sequencer.rb', line 236 def WS_next(sequence, current, ret) sequence = deep_copy(sequence) found = Ops.get_map(sequence, current) if found.nil? return WS_error(Builtins.sformat("Current not found: %1", current)) end # string|symbol next next_ = Ops.get(found, ret) if next_.nil? return WS_error(Builtins.sformat("Symbol not found: %1", ret)) end deep_copy(next_) end |
- (new stack, poped value) WS_pop(stack)
Pop one item from the stack (remove an item and return the stack top item)
298 299 300 301 302 303 304 305 306 |
# File '../../src/modules/Sequencer.rb', line 298 def WS_pop(stack) stack = deep_copy(stack) return nil if stack.nil? num = Builtins.size(stack) return nil if Ops.less_than(num, 2) newstack = Builtins.remove(stack, Ops.subtract(num, 1)) poped = Ops.get(stack, Ops.subtract(num, 2)) [newstack, poped] end |
- (Object) WS_push(stack, item)
Push one item to the stack
278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 |
# File '../../src/modules/Sequencer.rb', line 278 def WS_push(stack, item) stack = deep_copy(stack) item = deep_copy(item) return nil if stack.nil? return Builtins.add(stack, item) if !Builtins.contains(stack, item) found = false newstack = Builtins.filter(stack) do |v| next false if found found = true if v == item true end deep_copy(newstack) end |
- (Object) WS_run(aliases, id)
Run a function from the aliases map
254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 |
# File '../../src/modules/Sequencer.rb', line 254 def WS_run(aliases, id) aliases = deep_copy(aliases) Builtins.y2debug("Running: %1", id) function = WS_alias(aliases, id) if function.nil? return Convert.to_symbol(WS_error(Builtins.sformat("Bad id: %1", id))) end ret = Builtins.eval(function) if !Ops.is_symbol?(ret) return Convert.to_symbol( WS_error(Builtins.sformat("Returned value not symbol: %1", ret)) ) end Convert.to_symbol(ret) end |
- (Object) WS_special(aliases, alias_)
Decide if an alias is special
214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 |
# File '../../src/modules/Sequencer.rb', line 214 def WS_special(aliases, alias_) aliases = deep_copy(aliases) found = Ops.get(aliases, alias_) if found.nil? return Convert.to_boolean( WS_error(Builtins.sformat("Alias not found: %1", alias_)) ) end ret = false if Ops.is_list?(found) if Ops.greater_than(Builtins.size(Convert.to_list(found)), 1) ret = Ops.get_boolean(Convert.to_list(found), 1) end end ret end |
- (Object) WS_testall(aliases)
Test (run) all dialogs in the aliases map
51 52 53 54 |
# File '../../src/modules/Sequencer.rb', line 51 def WS_testall(aliases) aliases = deep_copy(aliases) Builtins.maplist(aliases) { |_id, func| Builtins.eval(func) } end |