Class: Spider::Model::Sorter

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

Instance Method Summary collapse

Constructor Details

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

Returns a new instance of Sorter.



300
301
302
303
304
305
306
307
# File 'lib/spiderfw/model/model.rb', line 300

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



317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
# File 'lib/spiderfw/model/model.rb', line 317

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



342
343
344
# File 'lib/spiderfw/model/model.rb', line 342

def length
  @model_tasks.keys.length
end

#sortObject



336
337
338
339
# File 'lib/spiderfw/model/model.rb', line 336

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

#tsort_each_child(node, &block) ⇒ Object



313
314
315
# File 'lib/spiderfw/model/model.rb', line 313

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

#tsort_each_node(&block) ⇒ Object



309
310
311
# File 'lib/spiderfw/model/model.rb', line 309

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