camunda-workflow 0.2.1 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +22 -2
- data/README.md +12 -2
- data/lib/camunda/bpmn_xml.rb +7 -2
- data/lib/camunda/external_task.rb +20 -1
- data/lib/camunda/model.rb +8 -1
- data/lib/camunda/poller.rb +1 -6
- data/lib/camunda/process_definition.rb +11 -6
- data/lib/camunda/task.rb +18 -0
- data/lib/camunda/variable_serialization.rb +4 -3
- data/lib/camunda/workflow/version.rb +1 -1
- data/lib/camunda/workflow.rb +4 -1
- data/lib/camunda.rb +6 -4
- data/lib/generators/camunda/spring_boot/spring_boot_generator.rb +1 -3
- data/lib/generators/camunda/spring_boot/templates/pom.xml +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3968856a19853532f780e7e81b3449a7e9d45bc23f699a22ddc25e400d787318
|
4
|
+
data.tar.gz: fa0c4ed150e0fabb72c11bbbff14c1f32b7da908b642511de3fe0e674423ba23
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e009f167b8de5e94972ae2e98b1dc97ebdd8c927d6034c5b7461b2c3c41c56ab28590fd8546d8d2049c81892fa9cd0a3de37c933cfc9539a8434a5eebd1c0357
|
7
|
+
data.tar.gz: 57651fbbc6eafc00625a5ac5d826f2b5192979b961f6164cc46d0b44e2fca15492b0be1889f7aacd0a56f112b997c1040d1aa7b69416895ed16a69078e9c7406
|
data/CHANGELOG.md
CHANGED
@@ -1,13 +1,33 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
-
## [
|
3
|
+
## [v0.2.2](https://github.com/amalagaura/camunda-workflow/tree/v0.2.2) (2020-01-08)
|
4
4
|
|
5
|
-
[Full Changelog](https://github.com/amalagaura/camunda-workflow/compare/v0.2.
|
5
|
+
[Full Changelog](https://github.com/amalagaura/camunda-workflow/compare/v0.2.1...v0.2.2)
|
6
6
|
|
7
7
|
**Closed issues:**
|
8
8
|
|
9
|
+
- The task for Message End Events is on the parent node of camunda:type="external" [\#34](https://github.com/amalagaura/camunda-workflow/issues/34)
|
10
|
+
- Error in documentation regarding deployment of BPMN files. [\#32](https://github.com/amalagaura/camunda-workflow/issues/32)
|
11
|
+
|
12
|
+
**Merged pull requests:**
|
13
|
+
|
14
|
+
- Camunda calls the external task from bpmn:endEvent [\#35](https://github.com/amalagaura/camunda-workflow/pull/35) ([amalagaura](https://github.com/amalagaura))
|
15
|
+
- fixed documentation on README [\#33](https://github.com/amalagaura/camunda-workflow/pull/33) ([curatingbits](https://github.com/curatingbits))
|
16
|
+
|
17
|
+
## [v0.2.1](https://github.com/amalagaura/camunda-workflow/tree/v0.2.1) (2019-12-28)
|
18
|
+
|
19
|
+
[Full Changelog](https://github.com/amalagaura/camunda-workflow/compare/v0.2.0...v0.2.1)
|
20
|
+
|
21
|
+
**Closed issues:**
|
22
|
+
|
23
|
+
- Include gems via Railtie instead of by copying the .rake file [\#29](https://github.com/amalagaura/camunda-workflow/issues/29)
|
9
24
|
- Remove check for what bpmn\_perform returns. Ignore if not a hash. [\#27](https://github.com/amalagaura/camunda-workflow/issues/27)
|
10
25
|
|
26
|
+
**Merged pull requests:**
|
27
|
+
|
28
|
+
- Remove startup error instructions [\#31](https://github.com/amalagaura/camunda-workflow/pull/31) ([amalagaura](https://github.com/amalagaura))
|
29
|
+
- create railtie to include rake tasks [\#30](https://github.com/amalagaura/camunda-workflow/pull/30) ([curatingbits](https://github.com/curatingbits))
|
30
|
+
|
11
31
|
## [v0.2.0](https://github.com/amalagaura/camunda-workflow/tree/v0.2.0) (2019-12-20)
|
12
32
|
|
13
33
|
[Full Changelog](https://github.com/amalagaura/camunda-workflow/compare/v0.1.5...v0.2.0)
|
data/README.md
CHANGED
@@ -153,7 +153,7 @@ It will fail to start. Create a postgres database as a service in PCF and bind i
|
|
153
153
|
|
154
154
|
## Usage
|
155
155
|
|
156
|
-
|
156
|
+
### Add to your Gemfile
|
157
157
|
```ruby
|
158
158
|
gem 'camunda-workflow'
|
159
159
|
```
|
@@ -162,7 +162,7 @@ It will fail to start. Create a postgres database as a service in PCF and bind i
|
|
162
162
|
Uses a default name, etc. Below outlines how to deploy a process using the included sample.bpmn file created by the generator. Alternatively you can deploy using Camunda Modeler
|
163
163
|
|
164
164
|
```ruby
|
165
|
-
Camunda::Deployment.create
|
165
|
+
Camunda::Deployment.create file_names: ['bpmn/diagrams/sample.bpmn']
|
166
166
|
```
|
167
167
|
### Processes
|
168
168
|
|
@@ -198,6 +198,16 @@ Poller will need to run in a separate process or thread and needs to be running
|
|
198
198
|
Camunda::Poller.fetch_and_queue %w[CamundaWorkflow]
|
199
199
|
```
|
200
200
|
|
201
|
+
#### Running the poller in a separate thread
|
202
|
+
We have had success with running a long running thread in a Rails app using [Rufus Scheduler](https://github.com/jmettraux/rufus-scheduler). Something like:
|
203
|
+
|
204
|
+
```
|
205
|
+
rufus_scheduler.in('10.seconds') do
|
206
|
+
Camunda::Poller.fetch_and_queue %w[Topics]
|
207
|
+
end
|
208
|
+
```
|
209
|
+
|
210
|
+
|
201
211
|
#### Fetch tasks For testing from the console
|
202
212
|
|
203
213
|
```ruby
|
data/lib/camunda/bpmn_xml.rb
CHANGED
@@ -20,9 +20,14 @@ class Camunda::BpmnXML
|
|
20
20
|
|
21
21
|
# creates a new instance of Camunda::BpmnXML::Task
|
22
22
|
def external_tasks
|
23
|
-
@doc.xpath('
|
23
|
+
@doc.xpath('(//bpmn:serviceTask[@camunda:type="external"]|//bpmn:sendTask[@camunda:type="external"])').map do |task|
|
24
24
|
Task.new(task)
|
25
|
-
end
|
25
|
+
end +
|
26
|
+
@doc.xpath('//bpmn:endEvent/bpmn:messageEventDefinition[@camunda:type="external"]').map do |child_node|
|
27
|
+
task = child_node.parent.dup
|
28
|
+
task["topic"] = child_node["topic"]
|
29
|
+
Task.new(task)
|
30
|
+
end
|
26
31
|
end
|
27
32
|
|
28
33
|
# We may have tasks with different topics. Returns classes with topics which are the same as the BPMN process id
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'active_support/core_ext/string/inflections
|
1
|
+
require 'active_support/core_ext/string/inflections'
|
2
2
|
require 'active_support/backtrace_cleaner'
|
3
3
|
# External Tasks are the task entity for camunda. We can query the topic and lock the task. After the task
|
4
4
|
# is locked, the external task of the process instance can be worked and completed. Below is an excerpt from the Camunda
|
@@ -133,6 +133,25 @@ class Camunda::ExternalTask < Camunda::Model
|
|
133
133
|
topics: topic_details
|
134
134
|
end
|
135
135
|
|
136
|
+
# Locking means that the task is reserved for this worker for a certain duration beginning with the time of fetching and
|
137
|
+
# prevents that another worker can fetch the same task while the lock is valid. Locking duration is set in the the
|
138
|
+
# Camunda::Workflow configuration. Before an external task can be completed, it must be locked.
|
139
|
+
#
|
140
|
+
# This method calls fetch_and_lock and then queues the jobs that were retrieved
|
141
|
+
# @example
|
142
|
+
# task = Camunda::ExternalTask.fetch_and_queue("CamundaWorkflow")
|
143
|
+
# @param topics [Array<String>] definition keys
|
144
|
+
# @param lock_duration [Integer]
|
145
|
+
# @param long_polling_duration [Integer]
|
146
|
+
# @return [Camunda::ExternalTask]
|
147
|
+
def self.fetch_and_queue(topics, lock_duration: nil, long_polling_duration: nil)
|
148
|
+
fetch_and_lock(topics, lock_duration: lock_duration, long_polling_duration: long_polling_duration).each do |task|
|
149
|
+
task.queue_task
|
150
|
+
rescue Camunda::MissingImplementationClass => e
|
151
|
+
task.failure(e)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
136
155
|
# Returns the class name which is supposed to implement this task
|
137
156
|
# @return [String] modularized class name of bpmn task implementation
|
138
157
|
def task_class_name
|
data/lib/camunda/model.rb
CHANGED
@@ -3,6 +3,10 @@ require 'her/model'
|
|
3
3
|
class Camunda::Model
|
4
4
|
include Her::Model
|
5
5
|
|
6
|
+
def self.log_details?
|
7
|
+
defined?(Rails) && Rails.env.development?
|
8
|
+
end
|
9
|
+
|
6
10
|
# We use a lambda so that this is evaluated after Camunda::Workflow.configuration is set
|
7
11
|
api = lambda do
|
8
12
|
# Configuration for Her and Faraday requests and responses
|
@@ -14,12 +18,15 @@ class Camunda::Model
|
|
14
18
|
c.use Faraday::Request::BasicAuthentication, Camunda::Workflow.configuration.camunda_user,
|
15
19
|
Camunda::Workflow.configuration.camunda_password
|
16
20
|
# Response
|
17
|
-
c.use Faraday::Response::Logger, ActiveSupport::Logger.new(
|
21
|
+
c.use Faraday::Response::Logger, ActiveSupport::Logger.new($stdout), bodies: true if log_details?
|
18
22
|
c.use Her::Middleware::FirstLevelParseJSON
|
19
23
|
|
20
24
|
c.use Her::Middleware::SnakeCase
|
21
25
|
# Adapter
|
22
26
|
c.adapter :net_http
|
27
|
+
|
28
|
+
# HTTP proxy
|
29
|
+
c.proxy = Camunda::Workflow.configuration.http_proxy if Camunda::Workflow.configuration.http_proxy
|
23
30
|
end
|
24
31
|
end
|
25
32
|
|
data/lib/camunda/poller.rb
CHANGED
@@ -15,12 +15,7 @@ class Camunda::Poller
|
|
15
15
|
# @param long_polling_duration [Integer] long polling time, default is set to Camunda::Workflow.configuration
|
16
16
|
def self.fetch_and_queue(topics, lock_duration: nil, long_polling_duration: nil)
|
17
17
|
loop do
|
18
|
-
Camunda::ExternalTask
|
19
|
-
.fetch_and_lock(topics, lock_duration: lock_duration, long_polling_duration: long_polling_duration).each do |task|
|
20
|
-
task.queue_task
|
21
|
-
rescue Camunda::MissingImplementationClass => e
|
22
|
-
task.failure(e)
|
23
|
-
end
|
18
|
+
Camunda::ExternalTask.fetch_and_queue(topics, lock_duration: lock_duration, long_polling_duration: long_polling_duration)
|
24
19
|
end
|
25
20
|
end
|
26
21
|
end
|
@@ -23,9 +23,7 @@ class Camunda::ProcessDefinition < Camunda::Model
|
|
23
23
|
tenant_id ||= Camunda::Workflow.configuration.tenant_id
|
24
24
|
|
25
25
|
response = post_raw start_path_for_key(key, tenant_id), hash
|
26
|
-
|
27
|
-
|
28
|
-
Camunda::ProcessInstance.new response[:parsed_data][:data]
|
26
|
+
process_instance_result(response)
|
29
27
|
end
|
30
28
|
|
31
29
|
# Starts an individual process instance for a process definition. The below example shows how to start a process
|
@@ -40,9 +38,7 @@ class Camunda::ProcessDefinition < Camunda::Model
|
|
40
38
|
def start(hash={})
|
41
39
|
hash[:variables] = serialize_variables(hash[:variables]) if hash[:variables]
|
42
40
|
response = self.class.post_raw "process-definition/#{id}/start", hash
|
43
|
-
|
44
|
-
|
45
|
-
Camunda::ProcessInstance.new response[:parsed_data][:data]
|
41
|
+
self.class.process_instance_result(response)
|
46
42
|
end
|
47
43
|
|
48
44
|
# Sets path to include tenant_id if a tenant_id is provided with a process definition on deployment.
|
@@ -51,4 +47,13 @@ class Camunda::ProcessDefinition < Camunda::Model
|
|
51
47
|
path << "/tenant-id/#{tenant_id}" if tenant_id
|
52
48
|
"#{path}/start"
|
53
49
|
end
|
50
|
+
|
51
|
+
def self.process_instance_result(response)
|
52
|
+
unless response[:response].status == 200
|
53
|
+
raise Camunda::ProcessEngineException,
|
54
|
+
"#{response[:parsed_data][:data][:message]} HTTP Status: #{response[:response].status}"
|
55
|
+
end
|
56
|
+
|
57
|
+
Camunda::ProcessInstance.new response[:parsed_data][:data]
|
58
|
+
end
|
54
59
|
end
|
data/lib/camunda/task.rb
CHANGED
@@ -35,6 +35,24 @@ class Camunda::Task < Camunda::Model
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
+
def bpmn_error!(error_code, error_message, vars={})
|
39
|
+
self.class
|
40
|
+
.post_raw("#{self.class.collection_path}/#{id}/bpmnError", errorCode: error_code, errorMessage: error_message,
|
41
|
+
variables: serialize_variables(vars))[:response]
|
42
|
+
.tap do |response|
|
43
|
+
raise SubmissionError, response.body[:data][:message] unless response.success?
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def bpmn_escalation!(escalation_code, vars={})
|
48
|
+
self.class
|
49
|
+
.post_raw("#{self.class.collection_path}/#{id}/bpmnEscalation", escalationCode: escalation_code,
|
50
|
+
variables: serialize_variables(vars))[:response]
|
51
|
+
.tap do |response|
|
52
|
+
raise SubmissionError, response.body[:data][:message] unless response.success?
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
38
56
|
# Error class when the task cannot be submitted. For instance if the bpmn process expects a variable and the variable
|
39
57
|
# isn't supplied, Camunda will not accept the task
|
40
58
|
class SubmissionError < StandardError
|
@@ -30,7 +30,7 @@ module Camunda
|
|
30
30
|
when Float
|
31
31
|
{ value: value, type: 'Double' }
|
32
32
|
else
|
33
|
-
raise ArgumentError, "Not supporting complex types yet"
|
33
|
+
raise ArgumentError, "#{value} - Not supporting complex types yet. Variables are #{variables}."
|
34
34
|
end
|
35
35
|
end
|
36
36
|
camelcase_keys(hash)
|
@@ -41,9 +41,10 @@ module Camunda
|
|
41
41
|
# @param json [Array,Hash]
|
42
42
|
# @return [Hash] returns hash with camelCase keys
|
43
43
|
def transform_json(json)
|
44
|
-
|
44
|
+
case json
|
45
|
+
when Array
|
45
46
|
json.map { |element| transform_json(element) }
|
46
|
-
|
47
|
+
when Hash
|
47
48
|
camelcase_keys(json)
|
48
49
|
else
|
49
50
|
json
|
data/lib/camunda/workflow.rb
CHANGED
@@ -11,7 +11,7 @@ module Camunda
|
|
11
11
|
# Implements Configuration class and sets default instance variables. The default variables can be overridden by creating an
|
12
12
|
# initializer file within your rails application and setting the variables like in the example below.
|
13
13
|
# @note if HTTP Basic Auth is used with the Camunda engine, this is where you would set a camunda_user and camunda_password
|
14
|
-
# using the
|
14
|
+
# using the credentials from a user setup in Camunda Admin.
|
15
15
|
# @example
|
16
16
|
# 'Camunda::Workflow.configure do |config|
|
17
17
|
# config.engine_url = 'http://localhost:8080'
|
@@ -64,6 +64,9 @@ module Camunda
|
|
64
64
|
# Can configure the backtrace silencer
|
65
65
|
# @return [Array<String>] List of backtrace silencer strings which are used to clean incident backtraces
|
66
66
|
attr_accessor :backtrace_silencer_lines
|
67
|
+
# Configure an HTTP proxy for all requests to use
|
68
|
+
# @return [String] The defined HTTP proxy
|
69
|
+
attr_accessor :http_proxy
|
67
70
|
|
68
71
|
def initialize
|
69
72
|
@engine_url = 'http://localhost:8080'
|
data/lib/camunda.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
require 'active_support/core_ext/string/inflections
|
2
|
-
require 'active_support/core_ext/object/blank
|
1
|
+
require 'active_support/core_ext/string/inflections'
|
2
|
+
require 'active_support/core_ext/object/blank'
|
3
3
|
require 'her'
|
4
4
|
require 'faraday'
|
5
5
|
require 'faraday_middleware'
|
@@ -10,6 +10,7 @@ module Camunda
|
|
10
10
|
class << self
|
11
11
|
# Allows setting the logger to a custom logger
|
12
12
|
attr_writer :logger
|
13
|
+
|
13
14
|
# Default is output to the standard output stream.
|
14
15
|
# @return [Object] instance which is used for logging
|
15
16
|
def logger
|
@@ -27,9 +28,10 @@ module Camunda
|
|
27
28
|
return if env[:body].blank?
|
28
29
|
|
29
30
|
json = JSON.parse(env[:body])
|
30
|
-
|
31
|
+
case json
|
32
|
+
when Array
|
31
33
|
json.map { |hash| transform_hash!(hash) }
|
32
|
-
|
34
|
+
when Hash
|
33
35
|
transform_hash!(json)
|
34
36
|
end
|
35
37
|
env[:body] = JSON.generate(json)
|
@@ -35,9 +35,7 @@ module Camunda
|
|
35
35
|
ignores << '.cfignore' if File.exist?('.cfignore')
|
36
36
|
ignores.each do |file|
|
37
37
|
append_to_file file do
|
38
|
-
"\n# BPMN Java app\n"
|
39
|
-
File.join(java_app_path, 'target') +
|
40
|
-
"\n"
|
38
|
+
"\n# BPMN Java app\n#{File.join(java_app_path, 'target')}\n"
|
41
39
|
end
|
42
40
|
end
|
43
41
|
end
|
metadata
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: camunda-workflow
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ankur Sethi
|
8
8
|
- Duggan Roberts
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
date: 2019-11-22 00:00:00.000000000 Z
|
@@ -242,7 +242,7 @@ homepage: https://github.com/amalagaura/camunda-workflow
|
|
242
242
|
licenses:
|
243
243
|
- MIT
|
244
244
|
metadata: {}
|
245
|
-
post_install_message:
|
245
|
+
post_install_message:
|
246
246
|
rdoc_options: []
|
247
247
|
require_paths:
|
248
248
|
- lib
|
@@ -258,7 +258,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
258
258
|
version: '0'
|
259
259
|
requirements: []
|
260
260
|
rubygems_version: 3.0.6
|
261
|
-
signing_key:
|
261
|
+
signing_key:
|
262
262
|
specification_version: 4
|
263
263
|
summary: Opinionated Ruby integration with Camunda
|
264
264
|
test_files: []
|