Class: Squared::Workspace::Series

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Includes:
Rake::DSL
Defined in:
lib/squared/workspace/series.rb

Constant Summary collapse

TASK_ALIAS =
{}

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(workspace) ⇒ Series

Returns a new instance of Series.



63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/squared/workspace/series.rb', line 63

def initialize(workspace)
  @workspace = workspace
  @sync = []
  @multiple = []
  @parallel = []
  @session = {
    group: {},
    parent: {},
    id: []
  }
  @data = {}
  TASK_KEYS.each { |key| @data[key] = [] }
end

Instance Attribute Details

#multipleObject (readonly)

Returns the value of attribute multiple.



59
60
61
# File 'lib/squared/workspace/series.rb', line 59

def multiple
  @multiple
end

#parallelObject (readonly)

Returns the value of attribute parallel.



59
60
61
# File 'lib/squared/workspace/series.rb', line 59

def parallel
  @parallel
end

#syncObject (readonly)

Returns the value of attribute sync.



59
60
61
# File 'lib/squared/workspace/series.rb', line 59

def sync
  @sync
end

Class Method Details

.add(task, obj) ⇒ Object



20
21
22
23
# File 'lib/squared/workspace/series.rb', line 20

def add(task, obj)
  key_set task
  (TASK_EXTEND[task] ||= []).push(obj)
end

.alias(ref, obj) ⇒ Object



37
38
39
40
41
42
43
# File 'lib/squared/workspace/series.rb', line 37

def alias(ref, obj)
  if obj.is_a?(::Hash)
    obj.each { |key, val| (TASK_ALIAS[key] ||= {})[ref] = val }
  elsif (data = TASK_ALIAS[obj])
    data.delete(ref)
  end
end

.batch(ref, obj) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
# File 'lib/squared/workspace/series.rb', line 25

def batch(ref, obj)
  if obj.is_a?(::Hash)
    obj.each do |key, val|
      key_set key
      data = TASK_BATCH[key] ||= {}
      (data[ref] ||= []).concat(val)
    end
  elsif (data = TASK_BATCH[obj]) && data.delete(ref) && data.empty?
    TASK_KEYS.delete(obj)
  end
end

.rename(key, task) ⇒ Object



45
46
47
# File 'lib/squared/workspace/series.rb', line 45

def rename(key, task)
  TASK_NAME[key.to_sym] = task.to_sym
end

Instance Method Details

#alias_get(key) ⇒ Object



137
138
139
# File 'lib/squared/workspace/series.rb', line 137

def alias_get(key)
  TASK_ALIAS[key]
end

#base?(key) ⇒ Boolean

Returns:

  • (Boolean)


150
151
152
# File 'lib/squared/workspace/series.rb', line 150

def base?(key)
  TASK_BASE.include?(key)
end

#batch_get(key) ⇒ Object



133
134
135
# File 'lib/squared/workspace/series.rb', line 133

def batch_get(key)
  TASK_BATCH[key]
end

#build(parallel: []) ⇒ Object



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
# File 'lib/squared/workspace/series.rb', line 100

def build(parallel: [], **)
  @data.merge!(@session[:parent]) if @session[:id].uniq.size > 1
  @data.merge!(@session[:group])
  @data.each do |key, items|
    next if items.empty?

    key = @workspace.task_name(t = name_get(key))
    val = @workspace.task_name(t, desc: true)
    if items.size > 1
      @multiple << key
      if parallel.include?(t) || ((ns = @workspace.task_namespace(t)) && parallel.include?(ns))
        desc "#{val} (thread)"
        multitask key => items
        @parallel << key

        s = @workspace.task_join(key, 'sync')
        desc "#{val} (sync)"
        task s => items
        @sync << s
        next
      end
    end

    desc val
    task key => items
  end
  @multiple += sync
end

#extend?(obj, key) ⇒ Boolean

Returns:

  • (Boolean)


154
155
156
# File 'lib/squared/workspace/series.rb', line 154

def extend?(obj, key)
  TASK_EXTEND.fetch(key, []).any? { |kind| obj.is_a?(kind) && obj.ref?(kind.ref) }
end

#multiple?(val = nil) ⇒ Boolean

Returns:

  • (Boolean)


158
159
160
# File 'lib/squared/workspace/series.rb', line 158

def multiple?(val = nil)
  already_invoked?(multiple, val)
end

#name_get(key) ⇒ Object



129
130
131
# File 'lib/squared/workspace/series.rb', line 129

def name_get(key)
  (TASK_NAME[key] || key).to_s
end

#parallel?(val = nil) ⇒ Boolean

Returns:

  • (Boolean)


166
167
168
# File 'lib/squared/workspace/series.rb', line 166

def parallel?(val = nil)
  already_invoked?(parallel, val)
end

#populate(proj) ⇒ Object



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/squared/workspace/series.rb', line 77

def populate(proj)
  group, parent, id = @session.values
  @data.each do |key, items|
    ws = proj.workspace
    next if (tasks = ws.task_resolve(proj, key)).empty?

    if (g = proj.group)
      id << g
      (group[:"#{key}:#{g}"] ||= []).push(*tasks)
    else
      items.concat(tasks)
    end
    if tasks.size > 1 && (data = batch_get(key)) && data.keys.any? { |ref| proj.ref?(ref) }
      desc ws.task_name(t = ws.task_join(proj.name, key), desc: true)
      task ws.task_name(t) => tasks
    end
    next unless (b = ws.find_base(proj)) && (name = b.ref.to_s) != g

    id << name
    (parent[:"#{key}:#{name}"] ||= []).push(*tasks)
  end
end

#some?(key) ⇒ Boolean

Returns:

  • (Boolean)


141
142
143
144
145
146
147
148
# File 'lib/squared/workspace/series.rb', line 141

def some?(key)
  return @data.key?(key) && !@data[key].empty? unless (batch = batch_get(key))

  batch.each_value do |items|
    return true if items.all? { |val| some?(val) || alias_get(val)&.any? { |_, alt| some?(alt) } }
  end
  false
end

#sync?(val = nil) ⇒ Boolean

Returns:

  • (Boolean)


162
163
164
# File 'lib/squared/workspace/series.rb', line 162

def sync?(val = nil)
  already_invoked?(sync, val)
end