Class: Dwf::Client

Inherits:
Object
  • Object
show all
Defined in:
lib/dwf/client.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(config = Dwf.configuration) ⇒ Client

Returns a new instance of Client.



8
9
10
# File 'lib/dwf/client.rb', line 8

def initialize(config = Dwf.configuration)
  @config = config
end

Instance Attribute Details

#configObject (readonly)

Returns the value of attribute config.



6
7
8
# File 'lib/dwf/client.rb', line 6

def config
  @config
end

Instance Method Details

#build_job_id(workflow_id, job_klass) ⇒ Object



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/dwf/client.rb', line 83

def build_job_id(workflow_id, job_klass)
  jid = nil

  loop do
    jid = SecureRandom.uuid
    available = !redis.hexists(
      "dwf.jobs.#{workflow_id}.#{job_klass}",
      jid
    )

    break if available
  end

  jid
end

#build_workflow_idObject



99
100
101
102
103
104
105
106
107
108
109
# File 'lib/dwf/client.rb', line 99

def build_workflow_id
  wid = nil
  loop do
    wid = SecureRandom.uuid
    available = !redis.exists?("dwf.workflow.#{wid}")

    break if available
  end

  wid
end

#check_or_lock(workflow_id, job_name, &block) ⇒ Object



67
68
69
70
# File 'lib/dwf/client.rb', line 67

def check_or_lock(workflow_id, job_name, &block)
  key = "wf_enqueue_outgoing_jobs_#{workflow_id}-#{job_name}"
  RedisMutex.with_lock(key, sleep: 0.3, block: 2, &block)
end

#delete(key) ⇒ Object



119
120
121
# File 'lib/dwf/client.rb', line 119

def delete(key)
  redis.del(key)
end

#find_job(workflow_id, job_name) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/dwf/client.rb', line 12

def find_job(workflow_id, job_name)
  job_name_match = /(?<klass>\w*[^-])-(?<identifier>.*)/.match(job_name)
  data = if job_name_match
           find_job_by_klass_and_id(workflow_id, job_name)
         else
           find_job_by_klass(workflow_id, job_name)
         end

  return nil if data.nil?

  data = JSON.parse(data)
  Dwf::Item.from_hash(Dwf::Utils.symbolize_keys(data))
end

#find_node(name, workflow_id) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/dwf/client.rb', line 26

def find_node(name, workflow_id)
  if Utils.workflow_name?(name)
    if name.include?('|')
      _, id = name.split('|')
    else
      id = workflow_id(name, workflow_id)
    end
    find_workflow(id)
  else
    find_job(workflow_id, name)
  end
end

#find_sub_workflow(name, parent_id) ⇒ Object



50
51
52
# File 'lib/dwf/client.rb', line 50

def find_sub_workflow(name, parent_id)
  find_workflow(workflow_id(name, parent_id))
end

#find_workflow(id) ⇒ Object

Raises:



39
40
41
42
43
44
45
46
47
48
# File 'lib/dwf/client.rb', line 39

def find_workflow(id)
  key = redis.keys("dwf.workflows.#{id}*").first
  data = redis.get(key)
  raise WorkflowNotFound, "Workflow with given id doesn't exist" if data.nil?

  hash = JSON.parse(data)
  hash = Dwf::Utils.symbolize_keys(hash)
  nodes = parse_nodes(id)
  workflow_from_hash(hash, nodes)
end

#key_exists?(key) ⇒ Boolean

Returns:

  • (Boolean)


111
112
113
# File 'lib/dwf/client.rb', line 111

def key_exists?(key)
  redis.exists?(key)
end

#persist_job(job) ⇒ Object



63
64
65
# File 'lib/dwf/client.rb', line 63

def persist_job(job)
  redis.hset("dwf.jobs.#{job.workflow_id}.#{job.klass}", job.id, job.as_json)
end

#persist_workflow(workflow) ⇒ Object



76
77
78
79
80
81
# File 'lib/dwf/client.rb', line 76

def persist_workflow(workflow)
  key = [
    'dwf', 'workflows', workflow.id, workflow.class.name, workflow.parent_id
  ].compact.join('.')
  redis.set(key, workflow.as_json)
end

#release_lock(workflow_id, job_name) ⇒ Object



72
73
74
# File 'lib/dwf/client.rb', line 72

def release_lock(workflow_id, job_name)
  delete("dwf_enqueue_outgoing_jobs_#{workflow_id}-#{job_name}")
end

#set(key, value) ⇒ Object



115
116
117
# File 'lib/dwf/client.rb', line 115

def set(key, value)
  redis.set(key, value)
end

#sub_workflows(id) ⇒ Object



54
55
56
57
58
59
60
61
# File 'lib/dwf/client.rb', line 54

def sub_workflows(id)
  keys = redis.keys("dwf.workflows.*.*.#{id}")
  keys.map do |key|
    id = key.split('.')[2]

    find_workflow(id)
  end
end