Class: Spider::Model::Sorter

Inherits:
Object
  • Object
show all
Includes:
TSort
Defined in:
lib/spiderfw/model/model.rb

Overview

Helper class from sorting models using TSort

Instance Method Summary collapse

Constructor Details

#initialize(models, options = {}) ⇒ Sorter

Returns a new instance of Sorter.



393
394
395
396
397
398
399
400
# File 'lib/spiderfw/model/model.rb', line 393

def initialize(models, options={})
    @model_tasks = {}
    @processed_deps = {}
    @processed = {}
    @models = models
    @options = options
    @models.each{ |m| collect_dependencies(m) }
end

Instance Method Details

#collect_dependencies(model) ⇒ Object



410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
# File 'lib/spiderfw/model/model.rb', line 410

def collect_dependencies(model)
    return if model.subclass_of?(Spider::Model::InlineModel)
    @processed_deps[model] = true
    @model_tasks[model] ||= SortTask.new(model)
    if @models.include?(model.superclass)
        @model_tasks[model.superclass] ||= SortTask.new(model.superclass)
        @model_tasks[model] << @model_tasks[model.superclass]
    end
    if @options[:association_dependencies]
        model.elements.each do |name, element|
            if element.model? && !element.attributes[:added_reverse] && @models.include?(element.type)
                @model_tasks[element.type] ||= SortTask.new(element.type)
                @model_tasks[model] << @model_tasks[element.type]
            end
        end
    end
end

#lengthObject



435
436
437
# File 'lib/spiderfw/model/model.rb', line 435

def length
  @model_tasks.keys.length
end

#sortObject



429
430
431
432
# File 'lib/spiderfw/model/model.rb', line 429

def sort
    tasks = tsort
    tasks.map{ |t| t.model }
end

#tsort_each_child(node, &block) ⇒ Object



406
407
408
# File 'lib/spiderfw/model/model.rb', line 406

def tsort_each_child(node, &block)
    node.dependencies.each(&block)
end

#tsort_each_node(&block) ⇒ Object



402
403
404
# File 'lib/spiderfw/model/model.rb', line 402

def tsort_each_node(&block)
    @model_tasks.each_value(&block)
end