dynflow 1.8.1 → 1.8.3

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.
Files changed (233) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +1 -1
  3. data/.rubocop.yml +11 -5
  4. data/.rubocop_todo.yml +777 -345
  5. data/Gemfile +4 -3
  6. data/Rakefile +1 -0
  7. data/doc/pages/Gemfile +4 -3
  8. data/doc/pages/Rakefile +1 -0
  9. data/doc/pages/plugins/alert_block.rb +1 -0
  10. data/doc/pages/plugins/div_tag.rb +1 -0
  11. data/doc/pages/plugins/graphviz.rb +6 -6
  12. data/doc/pages/plugins/plantuml.rb +2 -3
  13. data/doc/pages/plugins/play.rb +1 -2
  14. data/doc/pages/plugins/tags.rb +2 -8
  15. data/doc/pages/plugins/toc.rb +1 -1
  16. data/dynflow.gemspec +11 -10
  17. data/examples/clock_benchmark.rb +1 -0
  18. data/examples/example_helper.rb +4 -3
  19. data/examples/future_execution.rb +0 -2
  20. data/examples/memory_limit_watcher.rb +8 -8
  21. data/examples/orchestrate.rb +9 -21
  22. data/examples/orchestrate_evented.rb +18 -33
  23. data/examples/remote_executor.rb +13 -14
  24. data/examples/singletons.rb +1 -0
  25. data/examples/sub_plan_concurrency_control.rb +0 -1
  26. data/examples/sub_plans.rb +1 -0
  27. data/examples/sub_plans_v2.rb +1 -0
  28. data/lib/dynflow/action/cancellable.rb +1 -0
  29. data/lib/dynflow/action/format.rb +1 -4
  30. data/lib/dynflow/action/missing.rb +4 -4
  31. data/lib/dynflow/action/polling.rb +2 -3
  32. data/lib/dynflow/action/progress.rb +1 -4
  33. data/lib/dynflow/action/rescue.rb +1 -2
  34. data/lib/dynflow/action/singleton.rb +1 -0
  35. data/lib/dynflow/action/suspended.rb +1 -0
  36. data/lib/dynflow/action/timeouts.rb +2 -1
  37. data/lib/dynflow/action/with_bulk_sub_plans.rb +1 -0
  38. data/lib/dynflow/action/with_polling_sub_plans.rb +1 -1
  39. data/lib/dynflow/action/with_sub_plans.rb +20 -19
  40. data/lib/dynflow/action.rb +37 -37
  41. data/lib/dynflow/active_job/queue_adapter.rb +2 -1
  42. data/lib/dynflow/actor.rb +2 -2
  43. data/lib/dynflow/actors/execution_plan_cleaner.rb +1 -0
  44. data/lib/dynflow/actors.rb +1 -0
  45. data/lib/dynflow/clock.rb +3 -4
  46. data/lib/dynflow/config.rb +6 -5
  47. data/lib/dynflow/connectors/abstract.rb +11 -10
  48. data/lib/dynflow/connectors/database.rb +2 -2
  49. data/lib/dynflow/connectors/direct.rb +2 -3
  50. data/lib/dynflow/connectors.rb +1 -0
  51. data/lib/dynflow/coordinator.rb +2 -6
  52. data/lib/dynflow/coordinator_adapters/abstract.rb +1 -0
  53. data/lib/dynflow/coordinator_adapters/sequel.rb +1 -0
  54. data/lib/dynflow/coordinator_adapters.rb +1 -2
  55. data/lib/dynflow/dead_letter_silencer.rb +1 -0
  56. data/lib/dynflow/debug/telemetry/persistence.rb +3 -2
  57. data/lib/dynflow/delayed_executors/abstract.rb +1 -2
  58. data/lib/dynflow/delayed_executors/abstract_core.rb +1 -1
  59. data/lib/dynflow/delayed_executors/polling.rb +1 -2
  60. data/lib/dynflow/delayed_executors.rb +1 -2
  61. data/lib/dynflow/delayed_plan.rb +6 -6
  62. data/lib/dynflow/director/execution_plan_manager.rb +1 -1
  63. data/lib/dynflow/director/flow_manager.rb +1 -0
  64. data/lib/dynflow/director/queue_hash.rb +2 -1
  65. data/lib/dynflow/director/running_steps_manager.rb +3 -2
  66. data/lib/dynflow/director/sequence_cursor.rb +1 -2
  67. data/lib/dynflow/director/sequential_manager.rb +1 -0
  68. data/lib/dynflow/director.rb +12 -11
  69. data/lib/dynflow/dispatcher/abstract.rb +1 -0
  70. data/lib/dynflow/dispatcher/client_dispatcher.rb +33 -33
  71. data/lib/dynflow/dispatcher/executor_dispatcher.rb +7 -6
  72. data/lib/dynflow/dispatcher.rb +8 -7
  73. data/lib/dynflow/errors.rb +1 -0
  74. data/lib/dynflow/execution_history.rb +2 -1
  75. data/lib/dynflow/execution_plan/dependency_graph.rb +1 -2
  76. data/lib/dynflow/execution_plan/hooks.rb +1 -1
  77. data/lib/dynflow/execution_plan/output_reference.rb +4 -4
  78. data/lib/dynflow/execution_plan/steps/abstract.rb +21 -20
  79. data/lib/dynflow/execution_plan/steps/abstract_flow_step.rb +1 -1
  80. data/lib/dynflow/execution_plan/steps/error.rb +10 -9
  81. data/lib/dynflow/execution_plan/steps/finalize_step.rb +1 -2
  82. data/lib/dynflow/execution_plan/steps/plan_step.rb +12 -11
  83. data/lib/dynflow/execution_plan/steps/run_step.rb +1 -1
  84. data/lib/dynflow/execution_plan/steps.rb +1 -2
  85. data/lib/dynflow/execution_plan.rb +46 -46
  86. data/lib/dynflow/executors/abstract/core.rb +4 -3
  87. data/lib/dynflow/executors/parallel/core.rb +3 -2
  88. data/lib/dynflow/executors/parallel/pool.rb +1 -4
  89. data/lib/dynflow/executors/parallel/worker.rb +1 -0
  90. data/lib/dynflow/executors/parallel.rb +3 -2
  91. data/lib/dynflow/executors/sidekiq/core.rb +3 -1
  92. data/lib/dynflow/executors/sidekiq/internal_job_base.rb +1 -0
  93. data/lib/dynflow/executors/sidekiq/orchestrator_jobs.rb +1 -0
  94. data/lib/dynflow/executors/sidekiq/redis_locking.rb +1 -0
  95. data/lib/dynflow/executors/sidekiq/serialization.rb +1 -0
  96. data/lib/dynflow/executors/sidekiq/worker_jobs.rb +1 -0
  97. data/lib/dynflow/executors.rb +1 -1
  98. data/lib/dynflow/extensions/msgpack.rb +5 -4
  99. data/lib/dynflow/extensions.rb +1 -0
  100. data/lib/dynflow/flows/abstract.rb +1 -1
  101. data/lib/dynflow/flows/abstract_composed.rb +1 -2
  102. data/lib/dynflow/flows/atom.rb +1 -2
  103. data/lib/dynflow/flows/concurrence.rb +1 -1
  104. data/lib/dynflow/flows/registry.rb +1 -0
  105. data/lib/dynflow/flows/sequence.rb +1 -1
  106. data/lib/dynflow/flows.rb +1 -2
  107. data/lib/dynflow/logger_adapters/abstract.rb +1 -1
  108. data/lib/dynflow/logger_adapters/delegator.rb +1 -1
  109. data/lib/dynflow/logger_adapters/formatters/abstract.rb +1 -0
  110. data/lib/dynflow/logger_adapters/formatters/exception.rb +1 -0
  111. data/lib/dynflow/logger_adapters/formatters.rb +1 -0
  112. data/lib/dynflow/logger_adapters/simple.rb +6 -5
  113. data/lib/dynflow/logger_adapters.rb +1 -0
  114. data/lib/dynflow/middleware/common/singleton.rb +1 -0
  115. data/lib/dynflow/middleware/common/transaction.rb +1 -0
  116. data/lib/dynflow/middleware/register.rb +1 -0
  117. data/lib/dynflow/middleware/resolver.rb +2 -3
  118. data/lib/dynflow/middleware/stack.rb +1 -0
  119. data/lib/dynflow/middleware/world.rb +1 -2
  120. data/lib/dynflow/middleware.rb +1 -0
  121. data/lib/dynflow/persistence.rb +4 -5
  122. data/lib/dynflow/persistence_adapters/abstract.rb +1 -1
  123. data/lib/dynflow/persistence_adapters/sequel.rb +14 -14
  124. data/lib/dynflow/persistence_adapters/sequel_migrations/001_initial.rb +2 -1
  125. data/lib/dynflow/persistence_adapters/sequel_migrations/002_incremental_progress.rb +1 -0
  126. data/lib/dynflow/persistence_adapters/sequel_migrations/003_parent_action.rb +1 -0
  127. data/lib/dynflow/persistence_adapters/sequel_migrations/004_coordinator_records.rb +1 -1
  128. data/lib/dynflow/persistence_adapters/sequel_migrations/005_envelopes.rb +1 -0
  129. data/lib/dynflow/persistence_adapters/sequel_migrations/006_fix_data_length.rb +1 -0
  130. data/lib/dynflow/persistence_adapters/sequel_migrations/007_future_execution.rb +1 -0
  131. data/lib/dynflow/persistence_adapters/sequel_migrations/008_rename_scheduled_plans_to_delayed_plans.rb +1 -0
  132. data/lib/dynflow/persistence_adapters/sequel_migrations/009_fix_mysql_data_length.rb +1 -1
  133. data/lib/dynflow/persistence_adapters/sequel_migrations/010_add_execution_plans_label.rb +1 -0
  134. data/lib/dynflow/persistence_adapters/sequel_migrations/011_placeholder.rb +1 -0
  135. data/lib/dynflow/persistence_adapters/sequel_migrations/012_add_delayed_plans_serialized_args.rb +1 -0
  136. data/lib/dynflow/persistence_adapters/sequel_migrations/013_add_action_columns.rb +1 -0
  137. data/lib/dynflow/persistence_adapters/sequel_migrations/014_add_step_columns.rb +1 -0
  138. data/lib/dynflow/persistence_adapters/sequel_migrations/015_add_execution_plan_columns.rb +1 -0
  139. data/lib/dynflow/persistence_adapters/sequel_migrations/016_add_step_queue.rb +1 -0
  140. data/lib/dynflow/persistence_adapters/sequel_migrations/017_add_delayed_plan_frozen.rb +1 -0
  141. data/lib/dynflow/persistence_adapters/sequel_migrations/018_add_uuid_column.rb +37 -30
  142. data/lib/dynflow/persistence_adapters/sequel_migrations/019_update_mysql_time_precision.rb +1 -0
  143. data/lib/dynflow/persistence_adapters/sequel_migrations/020_drop_duplicate_indices.rb +1 -0
  144. data/lib/dynflow/persistence_adapters/sequel_migrations/021_create_output_chunks.rb +4 -3
  145. data/lib/dynflow/persistence_adapters/sequel_migrations/023_sqlite_workarounds.rb +1 -0
  146. data/lib/dynflow/persistence_adapters.rb +1 -0
  147. data/lib/dynflow/rails/configuration.rb +5 -4
  148. data/lib/dynflow/rails/daemon.rb +1 -1
  149. data/lib/dynflow/rails.rb +3 -2
  150. data/lib/dynflow/round_robin.rb +2 -2
  151. data/lib/dynflow/semaphores/abstract.rb +1 -1
  152. data/lib/dynflow/semaphores/aggregating.rb +1 -2
  153. data/lib/dynflow/semaphores/dummy.rb +1 -1
  154. data/lib/dynflow/semaphores/stateful.rb +1 -1
  155. data/lib/dynflow/semaphores.rb +1 -0
  156. data/lib/dynflow/serializable.rb +1 -0
  157. data/lib/dynflow/serializer.rb +2 -2
  158. data/lib/dynflow/serializers/abstract.rb +1 -2
  159. data/lib/dynflow/serializers/noop.rb +1 -2
  160. data/lib/dynflow/serializers.rb +1 -2
  161. data/lib/dynflow/stateful.rb +1 -0
  162. data/lib/dynflow/telemetry.rb +11 -10
  163. data/lib/dynflow/telemetry_adapters/abstract.rb +1 -0
  164. data/lib/dynflow/telemetry_adapters/dummy.rb +1 -0
  165. data/lib/dynflow/telemetry_adapters/statsd.rb +2 -1
  166. data/lib/dynflow/testing/assertions.rb +7 -7
  167. data/lib/dynflow/testing/dummy_coordinator.rb +1 -0
  168. data/lib/dynflow/testing/dummy_execution_plan.rb +1 -0
  169. data/lib/dynflow/testing/dummy_executor.rb +1 -0
  170. data/lib/dynflow/testing/dummy_planned_action.rb +3 -1
  171. data/lib/dynflow/testing/dummy_step.rb +1 -0
  172. data/lib/dynflow/testing/dummy_world.rb +1 -0
  173. data/lib/dynflow/testing/factories.rb +42 -37
  174. data/lib/dynflow/testing/in_thread_executor.rb +1 -0
  175. data/lib/dynflow/testing/in_thread_world.rb +1 -0
  176. data/lib/dynflow/testing/managed_clock.rb +1 -1
  177. data/lib/dynflow/testing/mimic.rb +4 -4
  178. data/lib/dynflow/testing.rb +1 -0
  179. data/lib/dynflow/throttle_limiter.rb +1 -1
  180. data/lib/dynflow/transaction_adapters/abstract.rb +1 -0
  181. data/lib/dynflow/transaction_adapters/active_record.rb +1 -0
  182. data/lib/dynflow/transaction_adapters/none.rb +1 -0
  183. data/lib/dynflow/transaction_adapters.rb +1 -2
  184. data/lib/dynflow/utils/indifferent_hash.rb +7 -1
  185. data/lib/dynflow/utils/priority_queue.rb +1 -0
  186. data/lib/dynflow/utils.rb +1 -1
  187. data/lib/dynflow/version.rb +2 -1
  188. data/lib/dynflow/watchers/memory_consumption_watcher.rb +1 -1
  189. data/lib/dynflow/web/console.rb +1 -3
  190. data/lib/dynflow/web/console_helpers.rb +5 -4
  191. data/lib/dynflow/web/filtering_helpers.rb +1 -0
  192. data/lib/dynflow/web/world_helpers.rb +1 -0
  193. data/lib/dynflow/web.rb +3 -3
  194. data/lib/dynflow/web_console.rb +1 -0
  195. data/lib/dynflow/world/invalidation.rb +1 -0
  196. data/lib/dynflow/world.rb +19 -19
  197. data/lib/dynflow.rb +3 -6
  198. data/test/abnormal_states_recovery_test.rb +4 -8
  199. data/test/action_test.rb +10 -18
  200. data/test/activejob_adapter_test.rb +2 -2
  201. data/test/batch_sub_tasks_test.rb +1 -1
  202. data/test/clock_test.rb +2 -3
  203. data/test/concurrency_control_test.rb +6 -7
  204. data/test/coordinator_test.rb +1 -0
  205. data/test/daemon_test.rb +3 -2
  206. data/test/dead_letter_silencer_test.rb +2 -1
  207. data/test/dispatcher_test.rb +4 -5
  208. data/test/execution_plan_cleaner_test.rb +1 -0
  209. data/test/execution_plan_hooks_test.rb +1 -0
  210. data/test/execution_plan_test.rb +10 -32
  211. data/test/executor_test.rb +20 -37
  212. data/test/extensions_test.rb +1 -0
  213. data/test/flows_test.rb +2 -2
  214. data/test/future_execution_test.rb +2 -3
  215. data/test/memory_cosumption_watcher_test.rb +1 -0
  216. data/test/middleware_test.rb +4 -6
  217. data/test/persistence_test.rb +26 -26
  218. data/test/redis_locking_test.rb +1 -0
  219. data/test/rescue_test.rb +3 -11
  220. data/test/round_robin_test.rb +1 -0
  221. data/test/semaphores_test.rb +5 -7
  222. data/test/support/code_workflow_example.rb +11 -28
  223. data/test/support/dummy_example.rb +20 -19
  224. data/test/support/middleware_example.rb +2 -8
  225. data/test/support/rescue_example.rb +1 -14
  226. data/test/support/test_execution_log.rb +1 -2
  227. data/test/test_helper.rb +3 -7
  228. data/test/testing_test.rb +6 -8
  229. data/test/utils_test.rb +1 -0
  230. data/test/v2_sub_plans_test.rb +1 -0
  231. data/test/web_console_test.rb +4 -4
  232. data/test/world_test.rb +4 -3
  233. metadata +43 -43
data/Gemfile CHANGED
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  source 'https://rubygems.org'
3
4
 
4
5
  gemspec
@@ -13,8 +14,8 @@ group :pry do
13
14
  end
14
15
 
15
16
  group :sidekiq do
16
- gem 'sidekiq'
17
17
  gem 'gitlab-sidekiq-fetcher', :require => 'sidekiq-reliable-fetch'
18
+ gem 'sidekiq'
18
19
  end
19
20
 
20
21
  group :postgresql do
@@ -26,7 +27,7 @@ group :mysql do
26
27
  end
27
28
 
28
29
  group :lint do
29
- gem 'rubocop', '0.39.0'
30
+ gem 'theforeman-rubocop', '~> 0.0.4'
30
31
  end
31
32
 
32
33
  group :memory_watcher do
@@ -35,8 +36,8 @@ end
35
36
 
36
37
  group :rails do
37
38
  gem 'daemons'
38
- gem 'rails', '>= 4.2.9', '< 7'
39
39
  gem 'logging'
40
+ gem 'rails', '>= 4.2.9', '< 7'
40
41
  end
41
42
 
42
43
  group :telemetry do
data/Rakefile CHANGED
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'rake/testtask'
3
4
  require 'fileutils'
4
5
 
data/doc/pages/Gemfile CHANGED
@@ -1,10 +1,11 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  source 'https://rubygems.org'
3
4
 
4
- gem 'rake'
5
5
  gem 'jekyll'
6
6
  gem 'pry'
7
+ gem 'pygments.rb'
8
+ gem 'rake'
9
+ gem 'redcarpet'
7
10
  gem 'ruby-nuggets' # require by tags plugin
8
11
  gem 'therubyracer'
9
- gem 'redcarpet'
10
- gem 'pygments.rb'
data/doc/pages/Rakefile CHANGED
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'rubygems'
3
4
  require 'rake'
4
5
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative 'div_tag'
3
4
 
4
5
  module Jekyll
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Jekyll
3
4
  class DivTag < Liquid::Block
4
5
  def render(context)
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  # taken from https://raw.githubusercontent.com/kui/octopress-graphviz/master/graphviz_block.rb
3
4
 
4
5
  require 'open3'
5
6
 
6
7
  module Jekyll
7
8
  class GraphvizBlock < Liquid::Block
8
-
9
9
  DIV_CLASS_ATTR = 'graphviz-wrapper'
10
10
  DEFAULT_GRAPH_NAME = 'Graphviz'
11
11
  DOT_OPTS = '-Tsvg'
@@ -13,9 +13,9 @@ module Jekyll
13
13
  DOT_EXTS = (ENV['PATHEXT'] || '.exe;.bat;.com').split(";")
14
14
  DOT_EXTS.unshift ''
15
15
  DOT_PATH = ENV['PATH'].split(File::PATH_SEPARATOR)
16
- .map { |a| File.join a, DOT_EXEC }
17
- .map { |a| DOT_EXTS.map { |ex| a+ex } }.flatten
18
- .find { |c| File.executable_real? c }
16
+ .map { |a| File.join a, DOT_EXEC }
17
+ .map { |a| DOT_EXTS.map { |ex| a + ex } }.flatten
18
+ .find { |c| File.executable_real? c }
19
19
  raise "not found a executable file: #{DOT_EXEC}" if DOT_PATH.nil?
20
20
  DOT_CMD = "#{DOT_PATH} #{DOT_OPTS}"
21
21
 
@@ -61,7 +61,7 @@ module Jekyll
61
61
  code = add_desc_attrs code
62
62
  code = insert_desc_elements code
63
63
  code = wrap_with_div code
64
- code = code.gsub /<polygon fill="white" stroke="none"/, '<polygon fill="transparent" stroke="none"'
64
+ code = code.gsub(/<polygon fill="white" stroke="none"/, '<polygon fill="transparent" stroke="none"')
65
65
  code
66
66
  end
67
67
 
@@ -89,7 +89,7 @@ module Jekyll
89
89
 
90
90
  def remove_xmlns_attrs(svg)
91
91
  svg.sub(%[xmlns="http://www.w3.org/2000/svg"], '')
92
- .sub(%[xmlns:xlink="http://www.w3.org/1999/xlink"], '')
92
+ .sub(%[xmlns:xlink="http://www.w3.org/1999/xlink"], '')
93
93
  end
94
94
 
95
95
  def add_desc_attrs(svg)
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  # Title: PlantUML Code Blocks for Jekyll
3
4
  # Author: YJ Park (yjpark@gmail.com)
4
5
  # https://github.com/yjpark/jekyll-plantuml
@@ -13,7 +14,6 @@ require 'open3'
13
14
  require 'fileutils'
14
15
 
15
16
  module Jekyll
16
-
17
17
  class PlantUMLBlock < Liquid::Block
18
18
  attr_reader :config
19
19
 
@@ -31,7 +31,7 @@ module Jekyll
31
31
  if !File.exist?(filepath)
32
32
  plantuml_jar = File.expand_path(plantuml_jar_path)
33
33
  cmd = "java -Djava.awt.headless=true -jar " + plantuml_jar + dot_cmd + " -pipe > " + filepath
34
- result, status = Open3.capture2e(cmd, :stdin_data=>code)
34
+ result, status = Open3.capture2e(cmd, :stdin_data => code)
35
35
  Jekyll.logger.debug(filepath + " -->\t" + status.inspect() + "\t" + result)
36
36
  end
37
37
 
@@ -79,7 +79,6 @@ module Jekyll
79
79
  Jekyll.logger.info("Create PlantUML image folder: " + folderpath)
80
80
  end
81
81
  end
82
-
83
82
  end # PlantUMLBlock
84
83
  end
85
84
 
@@ -1,14 +1,13 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'pp'
3
4
  require 'pry'
4
5
 
5
6
  module Jekyll
6
-
7
7
  class Play < Generator
8
8
  def generate(site)
9
9
  # pp site
10
10
  # binding.pry
11
11
  end
12
-
13
12
  end
14
13
  end
@@ -1,11 +1,10 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'nuggets/range/quantile'
3
4
  require 'erb'
4
5
 
5
6
  module Jekyll
6
-
7
7
  class Tagger < Generator
8
-
9
8
  safe true
10
9
 
11
10
  attr_accessor :site
@@ -44,7 +43,7 @@ module Jekyll
44
43
  page_name = "#{pretty? ? 'index' : name}#{site.layouts[data['layout']].ext}"
45
44
 
46
45
  site.pages << TagPage.new(
47
- site, site.source, tag_dir, page_name, data
46
+ site, site.source, tag_dir, page_name, data
48
47
  )
49
48
  end
50
49
  }
@@ -79,11 +78,9 @@ module Jekyll
79
78
  def pretty?
80
79
  @pretty ||= (site.permalink_style == :pretty || site.config['tag_permalink_style'] == 'pretty')
81
80
  end
82
-
83
81
  end
84
82
 
85
83
  class TagPage < Page
86
-
87
84
  def initialize(site, base, dir, name, data = {})
88
85
  self.content = data.delete('content') || ''
89
86
  self.data = data
@@ -94,11 +91,9 @@ module Jekyll
94
91
  def read_yaml(*)
95
92
  # Do nothing
96
93
  end
97
-
98
94
  end
99
95
 
100
96
  module Filters
101
-
102
97
  def tag_cloud(site)
103
98
  active_tag_data.map { |tag, set|
104
99
  tag_link(tag, tag_url(tag), :class => "set-#{set} label label-default")
@@ -134,5 +129,4 @@ module Jekyll
134
129
  site.config["tag_data"].reject { |tag, set| site.config["ignored_tags"].include? tag }
135
130
  end
136
131
  end
137
-
138
132
  end
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Jekyll
3
4
  module FancyToCFilter
4
5
  def fancytoc(input)
5
-
6
6
  converter = @context.registers[:site].converters.find { |c| c.is_a? Jekyll::Converters::Markdown }
7
7
  extensions = converter.instance_variable_get(:@parser).instance_variable_get(:@redcarpet_extensions)
8
8
  toc_generator = Redcarpet::Markdown.new(Redcarpet::Render::HTML_TOC, extensions)
data/dynflow.gemspec CHANGED
@@ -1,5 +1,6 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  # frozen_string_literal: true
3
+
3
4
  $:.push File.expand_path("../lib", __FILE__)
4
5
  require "dynflow/version"
5
6
 
@@ -17,24 +18,24 @@ Gem::Specification.new do |s|
17
18
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
19
  s.require_paths = ["lib"]
19
20
 
20
- s.required_ruby_version = '>= 2.3.0'
21
+ s.required_ruby_version = '>= 2.7.0'
21
22
 
22
- s.add_dependency "multi_json"
23
- s.add_dependency "msgpack", '~> 1.3', '>= 1.3.3'
24
- s.add_dependency "apipie-params"
25
23
  s.add_dependency "algebrick", '~> 0.7.0'
24
+ s.add_dependency "apipie-params"
26
25
  s.add_dependency "concurrent-ruby", '~> 1.1.3'
27
26
  s.add_dependency "concurrent-ruby-edge", '~> 0.6.0'
27
+ s.add_dependency "msgpack", '~> 1.3', '>= 1.3.3'
28
+ s.add_dependency "multi_json"
28
29
  s.add_dependency "sequel", '>= 4.0.0'
29
30
 
30
- s.add_development_dependency "rake"
31
- s.add_development_dependency "rack-test"
31
+ s.add_development_dependency 'activejob'
32
+ s.add_development_dependency "activerecord"
32
33
  s.add_development_dependency "minitest", "< 5.19"
33
34
  s.add_development_dependency "minitest-reporters"
34
35
  s.add_development_dependency "minitest-stub-const"
35
- s.add_development_dependency "activerecord"
36
- s.add_development_dependency 'activejob'
37
- s.add_development_dependency "sqlite3"
38
- s.add_development_dependency "sinatra"
39
36
  s.add_development_dependency 'mocha'
37
+ s.add_development_dependency "rack-test"
38
+ s.add_development_dependency "rake"
39
+ s.add_development_dependency "sinatra"
40
+ s.add_development_dependency "sqlite3"
40
41
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'dynflow'
3
4
  require 'benchmark'
4
5
 
@@ -1,12 +1,13 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  $:.unshift(File.expand_path('../../lib', __FILE__))
3
4
 
4
5
  require 'dynflow'
5
6
 
6
7
  class ExampleHelper
7
- CONSOLE_URL='http://localhost:4567'
8
- DYNFLOW_URL="#{CONSOLE_URL}/dynflow"
9
- SIDEKIQ_URL="#{CONSOLE_URL}/sidekiq"
8
+ CONSOLE_URL = 'http://localhost:4567'
9
+ DYNFLOW_URL = "#{CONSOLE_URL}/dynflow"
10
+ SIDEKIQ_URL = "#{CONSOLE_URL}/sidekiq"
10
11
 
11
12
  class << self
12
13
  def world
@@ -25,7 +25,6 @@ class CustomPassedObjectSerializer < ::Dynflow::Serializers::Abstract
25
25
  end
26
26
 
27
27
  class DelayedAction < Dynflow::Action
28
-
29
28
  def delay(delay_options, *args)
30
29
  CustomPassedObjectSerializer.new(args)
31
30
  end
@@ -36,7 +35,6 @@ class DelayedAction < Dynflow::Action
36
35
 
37
36
  def run
38
37
  end
39
-
40
38
  end
41
39
 
42
40
  if $0 == __FILE__
@@ -3,14 +3,14 @@
3
3
 
4
4
  require_relative 'example_helper'
5
5
 
6
- example_description = <<DESC
7
- Memory limit watcher Example
8
- ===========================
9
-
10
- In this example we are setting a watcher that will terminate our world object
11
- when process memory consumption exceeds a limit that will be set.
12
-
13
-
6
+ example_description = <<~DESC
7
+ Memory limit watcher Example
8
+ ===========================
9
+
10
+ In this example we are setting a watcher that will terminate our world object
11
+ when process memory consumption exceeds a limit that will be set.
12
+
13
+
14
14
  DESC
15
15
 
16
16
  module MemorylimiterExample
@@ -24,9 +24,7 @@ DESC
24
24
  require_relative 'example_helper'
25
25
 
26
26
  module Orchestrate
27
-
28
27
  class CreateInfrastructure < Dynflow::Action
29
-
30
28
  def plan
31
29
  sequence do
32
30
  concurrence do
@@ -34,26 +32,25 @@ module Orchestrate
34
32
  plan_action(CreateMachine, 'host2', 'storage')
35
33
  end
36
34
  plan_action(CreateMachine,
37
- 'host3',
38
- 'web_server',
39
- :db_machine => 'host1',
40
- :storage_machine => 'host2')
35
+ 'host3',
36
+ 'web_server',
37
+ :db_machine => 'host1',
38
+ :storage_machine => 'host2')
41
39
  end
42
40
  end
43
41
  end
44
42
 
45
43
  class CreateMachine < Dynflow::Action
46
-
47
44
  def plan(name, profile, config_options = {})
48
45
  prepare_disk = plan_action(PrepareDisk, 'name' => name)
49
46
  create_vm = plan_action(CreateVM,
50
- :name => name,
51
- :disk => prepare_disk.output['path'])
47
+ :name => name,
48
+ :disk => prepare_disk.output['path'])
52
49
  plan_action(AddIPtoHosts, :name => name, :ip => create_vm.output[:ip])
53
50
  plan_action(ConfigureMachine,
54
- :ip => create_vm.output[:ip],
55
- :profile => profile,
56
- :config_options => config_options)
51
+ :ip => create_vm.output[:ip],
52
+ :profile => profile,
53
+ :config_options => config_options)
57
54
  plan_self(:name => name)
58
55
  end
59
56
 
@@ -61,7 +58,6 @@ module Orchestrate
61
58
  # this is called after run methods of the actions in the
62
59
  # execution plan were finished
63
60
  end
64
-
65
61
  end
66
62
 
67
63
  class Base < Dynflow::Action
@@ -71,7 +67,6 @@ module Orchestrate
71
67
  end
72
68
 
73
69
  class PrepareDisk < Base
74
-
75
70
  def queue
76
71
  :slow
77
72
  end
@@ -88,11 +83,9 @@ module Orchestrate
88
83
  sleep!
89
84
  output[:path] = "/var/images/#{input[:name]}.img"
90
85
  end
91
-
92
86
  end
93
87
 
94
88
  class CreateVM < Base
95
-
96
89
  input_format do
97
90
  param :name
98
91
  param :disk
@@ -106,11 +99,9 @@ module Orchestrate
106
99
  sleep!
107
100
  output[:ip] = "192.168.100.#{rand(256)}"
108
101
  end
109
-
110
102
  end
111
103
 
112
104
  class AddIPtoHosts < Base
113
-
114
105
  input_format do
115
106
  param :ip
116
107
  end
@@ -118,11 +109,9 @@ module Orchestrate
118
109
  def run
119
110
  sleep!
120
111
  end
121
-
122
112
  end
123
113
 
124
114
  class ConfigureMachine < Base
125
-
126
115
  input_format do
127
116
  param :ip
128
117
  param :profile
@@ -144,7 +133,6 @@ module Orchestrate
144
133
 
145
134
  sleep!
146
135
  end
147
-
148
136
  end
149
137
  end
150
138
 
@@ -24,9 +24,7 @@ example_description = <<DESC
24
24
  DESC
25
25
 
26
26
  module OrchestrateEvented
27
-
28
27
  class CreateInfrastructure < Dynflow::Action
29
-
30
28
  def plan(get_stuck = false)
31
29
  sequence do
32
30
  concurrence do
@@ -34,59 +32,54 @@ module OrchestrateEvented
34
32
  plan_action(CreateMachine, 'host2', 'storage')
35
33
  end
36
34
  plan_action(CreateMachine,
37
- 'host3',
38
- 'web_server',
39
- :db_machine => 'host1',
40
- :storage_machine => 'host2')
35
+ 'host3',
36
+ 'web_server',
37
+ :db_machine => 'host1',
38
+ :storage_machine => 'host2')
41
39
  end
42
40
  end
43
41
  end
44
42
 
45
43
  class CreateMachine < Dynflow::Action
46
-
47
44
  def plan(name, profile, config_options = {})
48
45
  prepare_disk = plan_action(PrepareDisk, 'name' => name)
49
46
  create_vm = plan_action(CreateVM,
50
- :name => name,
51
- :disk => prepare_disk.output['path'])
47
+ :name => name,
48
+ :disk => prepare_disk.output['path'])
52
49
  plan_action(AddIPtoHosts, :name => name, :ip => create_vm.output[:ip])
53
50
  plan_action(ConfigureMachine,
54
- :ip => create_vm.output[:ip],
55
- :profile => profile,
56
- :config_options => config_options)
51
+ :ip => create_vm.output[:ip],
52
+ :profile => profile,
53
+ :config_options => config_options)
57
54
  plan_self(:name => name)
58
55
  end
59
56
 
60
57
  def finalize
61
58
  end
62
-
63
59
  end
64
60
 
65
61
  class Base < Dynflow::Action
66
-
67
62
  Finished = Algebrick.atom
68
63
 
69
64
  def run(event = nil)
70
65
  match(event,
71
- (on Finished do
72
- on_finish
73
- end),
74
- (on Dynflow::Action::Skip do
75
- # do nothing
76
- end),
77
- (on nil do
78
- suspend { |suspended_action| world.clock.ping suspended_action, rand(1), Finished }
79
- end))
66
+ (on Finished do
67
+ on_finish
68
+ end),
69
+ (on Dynflow::Action::Skip do
70
+ # do nothing
71
+ end),
72
+ (on nil do
73
+ suspend { |suspended_action| world.clock.ping suspended_action, rand(1), Finished }
74
+ end))
80
75
  end
81
76
 
82
77
  def on_finish
83
78
  raise NotImplementedError
84
79
  end
85
-
86
80
  end
87
81
 
88
82
  class PrepareDisk < Base
89
-
90
83
  input_format do
91
84
  param :name
92
85
  end
@@ -98,11 +91,9 @@ module OrchestrateEvented
98
91
  def on_finish
99
92
  output[:path] = "/var/images/#{input[:name]}.img"
100
93
  end
101
-
102
94
  end
103
95
 
104
96
  class CreateVM < Base
105
-
106
97
  input_format do
107
98
  param :name
108
99
  param :disk
@@ -115,22 +106,18 @@ module OrchestrateEvented
115
106
  def on_finish
116
107
  output[:ip] = "192.168.100.#{rand(256)}"
117
108
  end
118
-
119
109
  end
120
110
 
121
111
  class AddIPtoHosts < Base
122
-
123
112
  input_format do
124
113
  param :ip
125
114
  end
126
115
 
127
116
  def on_finish
128
117
  end
129
-
130
118
  end
131
119
 
132
120
  class ConfigureMachine < Base
133
-
134
121
  # thanks to this Dynflow knows this action can be politely
135
122
  # asked to get canceled
136
123
  include ::Dynflow::Action::Cancellable
@@ -163,9 +150,7 @@ module OrchestrateEvented
163
150
  suspend
164
151
  end
165
152
  end
166
-
167
153
  end
168
-
169
154
  end
170
155
 
171
156
  if $0 == __FILE__
@@ -45,7 +45,6 @@ end
45
45
 
46
46
  class RemoteExecutorExample
47
47
  class << self
48
-
49
48
  def run_observer
50
49
  world = ExampleHelper.create_world do |config|
51
50
  config.persistence_adapter = persistence_adapter
@@ -136,7 +135,6 @@ class RemoteExecutorExample
136
135
  sleep 0.5
137
136
  end
138
137
  end
139
-
140
138
  end
141
139
  end
142
140
 
@@ -145,17 +143,17 @@ command = ARGV.first || 'server'
145
143
  if $0 == __FILE__
146
144
  case command
147
145
  when 'observer'
148
- puts <<MSG
149
- The observer starting…. You can see what's going on there
150
- MSG
146
+ puts <<~MSG
147
+ The observer starting…. You can see what's going on there
148
+ MSG
151
149
  RemoteExecutorExample.run_observer
152
150
  when 'server'
153
- puts <<MSG
154
- The server is starting…. You can send the work to it by running:
155
-
156
- #{$0} client
157
-
158
- MSG
151
+ puts <<~MSG
152
+ The server is starting…. You can send the work to it by running:
153
+
154
+ #{$0} client
155
+
156
+ MSG
159
157
  RemoteExecutorExample.run_server
160
158
  when 'client'
161
159
  RemoteExecutorExample.run_client
@@ -168,10 +166,11 @@ elsif defined?(Sidekiq)
168
166
  Sidekiq.default_worker_options = { :retry => 0, 'backtrace' => true }
169
167
  # assuming the remote executor was required as part of initialization
170
168
  # of the ActiveJob worker
171
- world = if Sidekiq.options[:queues].include?("dynflow_orchestrator")
169
+ queues = Sidekiq.configure_server { |c| c.options[:queues] }
170
+ world = if queues.include?("dynflow_orchestrator")
172
171
  RemoteExecutorExample.initialize_sidekiq_orchestrator
173
- elsif (Sidekiq.options[:queues] - ['dynflow_orchestrator']).any?
172
+ elsif (queues - ['dynflow_orchestrator']).any?
174
173
  RemoteExecutorExample.initialize_sidekiq_worker
175
174
  end
176
- Sidekiq.options[:dynflow_world] = world
175
+ Sidekiq.configure_server { |c| c.options[:dynflow_world] = world }
177
176
  end
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
+
3
4
  example_description = <<DESC
4
5
 
5
6
  Sub Plans Example
@@ -16,7 +16,6 @@ DESC
16
16
  require_relative 'example_helper'
17
17
 
18
18
  class CostyAction < Dynflow::Action
19
-
20
19
  SleepTime = 10
21
20
 
22
21
  def plan(number)
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
+
3
4
  example_description = <<DESC
4
5
  Sub Plans Example
5
6
  ===================
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
+
3
4
  example_description = <<DESC
4
5
  Sub Plans Example
5
6
  ===================
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Dynflow
3
4
  module Action::Cancellable
4
5
  Cancel = Algebrick.atom