convenient_service 0.17.0 → 0.18.0

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 (406) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -4
  3. data/lib/convenient_service/common/plugins/ensures_negated_j_send_result/middleware.rb +22 -0
  4. data/lib/convenient_service/common/plugins/ensures_negated_j_send_result.rb +3 -0
  5. data/lib/convenient_service/common/plugins/has_around_callbacks/concern.rb +8 -1
  6. data/lib/convenient_service/common/plugins/has_around_callbacks/middleware.rb +28 -7
  7. data/lib/convenient_service/common/plugins/has_callbacks/concern.rb +19 -9
  8. data/lib/convenient_service/common/plugins/has_callbacks/entities/callback_collection.rb +49 -1
  9. data/lib/convenient_service/common/plugins/has_callbacks/middleware.rb +21 -3
  10. data/lib/convenient_service/common/plugins/has_callbacks.rb +0 -1
  11. data/lib/convenient_service/common/plugins/has_instance_proxy/entities/instance_proxy.rb +1 -1
  12. data/lib/convenient_service/common/plugins/has_internals/entities/internals/plugins/has_cache/concern.rb +12 -0
  13. data/lib/convenient_service/common/plugins.rb +1 -0
  14. data/lib/convenient_service/core/entities/config/exceptions.rb +2 -0
  15. data/lib/convenient_service/core/entities/config.rb +3 -0
  16. data/lib/convenient_service/dependencies.rb +11 -3
  17. data/lib/convenient_service/logger.rb +9 -1
  18. data/lib/convenient_service/rspec/matchers/classes/call_chain_next.rb +41 -0
  19. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/commands/generate_printable_method.rb +46 -0
  20. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/delegation.rb +89 -0
  21. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/inputs.rb +223 -0
  22. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/outputs.rb +38 -0
  23. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/sub_matcher_collection.rb +157 -0
  24. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/sub_matchers/arguments/commands/apply_stub_to_track_delegations.rb +77 -0
  25. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/sub_matchers/arguments/commands/generate_printable_arguments.rb +94 -0
  26. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/sub_matchers/arguments.rb +89 -0
  27. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/sub_matchers/base.rb +99 -0
  28. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/sub_matchers/return_custom_value.rb +91 -0
  29. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/sub_matchers/return_delegation_value.rb +129 -0
  30. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/sub_matchers/with_any_arguments.rb +31 -0
  31. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/sub_matchers/with_concrete_arguments.rb +31 -0
  32. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/sub_matchers/without_arguments.rb +31 -0
  33. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/sub_matchers.rb +11 -0
  34. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities.rb +5 -1
  35. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/exceptions.rb +65 -0
  36. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to.rb +163 -41
  37. data/lib/convenient_service/service/configs/minimal.rb +85 -33
  38. data/lib/convenient_service/service/configs/standard/v1.rb +42 -24
  39. data/lib/convenient_service/service/configs/standard.rb +60 -46
  40. data/lib/convenient_service/service/plugins/can_have_connected_steps/concern.rb +503 -0
  41. data/lib/convenient_service/service/plugins/can_have_connected_steps/entities/expressions/and.rb +133 -0
  42. data/lib/convenient_service/service/plugins/can_have_connected_steps/entities/expressions/base.rb +126 -0
  43. data/lib/convenient_service/service/plugins/can_have_connected_steps/entities/expressions/empty.rb +104 -0
  44. data/lib/convenient_service/service/plugins/can_have_connected_steps/entities/expressions/group.rb +118 -0
  45. data/lib/convenient_service/service/plugins/can_have_connected_steps/entities/expressions/not.rb +118 -0
  46. data/lib/convenient_service/service/plugins/can_have_connected_steps/entities/expressions/or.rb +145 -0
  47. data/lib/convenient_service/service/plugins/can_have_connected_steps/entities/expressions/scalar.rb +133 -0
  48. data/lib/convenient_service/service/plugins/can_have_connected_steps/entities/expressions.rb +10 -0
  49. data/lib/convenient_service/service/plugins/can_have_connected_steps/entities/step_collection.rb +217 -0
  50. data/lib/convenient_service/service/plugins/can_have_connected_steps/entities.rb +4 -0
  51. data/lib/convenient_service/service/plugins/can_have_connected_steps/exceptions.rb +95 -0
  52. data/lib/convenient_service/service/plugins/can_have_connected_steps/middleware.rb +30 -0
  53. data/lib/convenient_service/service/plugins/can_have_connected_steps.rb +6 -0
  54. data/lib/convenient_service/service/plugins/can_have_sequential_steps/concern.rb +76 -0
  55. data/lib/convenient_service/service/plugins/{can_have_steps → can_have_sequential_steps}/entities/step_collection.rb +54 -10
  56. data/lib/convenient_service/service/plugins/can_have_sequential_steps/entities.rb +3 -0
  57. data/lib/convenient_service/service/plugins/{can_have_steps → can_have_sequential_steps}/middleware.rb +7 -3
  58. data/lib/convenient_service/service/plugins/can_have_sequential_steps.rb +5 -0
  59. data/lib/convenient_service/service/plugins/can_have_steps/concern.rb +4 -57
  60. data/lib/convenient_service/service/plugins/can_have_steps/entities/method/commands/define_method_in_container.rb +45 -26
  61. data/lib/convenient_service/service/plugins/can_have_steps/entities/method/entities/callers/reassignment.rb +0 -2
  62. data/lib/convenient_service/service/plugins/can_have_steps/entities/method/exceptions.rb +4 -24
  63. data/lib/convenient_service/service/plugins/can_have_steps/entities/step/concern/instance_methods.rb +155 -80
  64. data/lib/convenient_service/service/plugins/can_have_steps/entities/step/exceptions.rb +19 -0
  65. data/lib/convenient_service/service/plugins/can_have_steps/entities/step/plugins/{can_be_result_step → can_be_method_step}/can_be_executed/exceptions.rb +1 -1
  66. data/lib/convenient_service/service/plugins/can_have_steps/entities/step/plugins/can_be_method_step/can_be_executed/middleware.rb +64 -4
  67. data/lib/convenient_service/service/plugins/can_have_steps/entities/step/plugins/can_be_method_step/can_be_executed.rb +1 -0
  68. data/lib/convenient_service/service/plugins/can_have_steps/entities/step/plugins/can_be_method_step/concern.rb +7 -0
  69. data/lib/convenient_service/service/plugins/can_have_steps/entities/step/plugins/can_have_alternative_steps.rb +3 -0
  70. data/lib/convenient_service/service/plugins/can_have_steps/entities/step/plugins/can_have_fallbacks/concern.rb +0 -46
  71. data/lib/convenient_service/service/plugins/can_have_steps/entities/step/plugins/can_have_fallbacks/middleware.rb +26 -2
  72. data/lib/convenient_service/service/plugins/can_have_steps/entities/step/plugins/can_have_parent_result/middleware.rb +13 -1
  73. data/lib/convenient_service/service/plugins/can_have_steps/entities/step/plugins/{can_be_result_step → has_result}/concern.rb +8 -4
  74. data/lib/convenient_service/service/plugins/can_have_steps/entities/step/plugins/has_result/middleware.rb +33 -0
  75. data/lib/convenient_service/service/plugins/can_have_steps/entities/step/plugins/has_result.rb +4 -0
  76. data/lib/convenient_service/service/plugins/can_have_steps/entities/step/plugins.rb +2 -1
  77. data/lib/convenient_service/service/plugins/can_have_steps/entities.rb +0 -1
  78. data/lib/convenient_service/service/plugins/can_have_steps.rb +0 -1
  79. data/lib/convenient_service/service/plugins/has_j_send_result/entities/result/plugins/can_have_checked_status/concern.rb +2 -2
  80. data/lib/convenient_service/service/plugins/has_j_send_result/entities/result/plugins/can_have_checked_status.rb +0 -1
  81. data/lib/convenient_service/service/plugins/has_j_send_result/entities/result/plugins/has_j_send_status_and_attributes/concern/instance_methods.rb +135 -2
  82. data/lib/convenient_service/service/plugins/has_j_send_result/entities/result/plugins/has_j_send_status_and_attributes/entities/status/concern/instance_methods.rb +45 -17
  83. data/lib/convenient_service/service/plugins/has_j_send_result/entities/result/plugins/has_j_send_status_and_attributes/entities/status/plugins/can_be_checked/concern.rb +38 -0
  84. data/lib/convenient_service/service/plugins/has_j_send_result/entities/result/plugins/has_j_send_status_and_attributes/entities/status/plugins/can_be_checked/middleware.rb +51 -0
  85. data/lib/convenient_service/service/plugins/has_j_send_result/entities/result/plugins/has_j_send_status_and_attributes/entities/status/plugins/can_be_checked.rb +4 -0
  86. data/lib/convenient_service/service/plugins/has_j_send_result/entities/result/plugins/has_j_send_status_and_attributes/entities/status/plugins.rb +1 -0
  87. data/lib/convenient_service/service/plugins/has_j_send_result/entities/result/plugins/has_j_send_status_and_attributes/exceptions.rb +15 -0
  88. data/lib/convenient_service/service/plugins/has_j_send_result/entities/result/plugins/has_negated_result/concern.rb +72 -0
  89. data/lib/convenient_service/service/plugins/has_j_send_result/entities/result/plugins/has_negated_result.rb +3 -0
  90. data/lib/convenient_service/service/plugins/has_j_send_result/entities/result/plugins/raises_on_not_checked_result_status/middleware.rb +1 -1
  91. data/lib/convenient_service/service/plugins/has_j_send_result/entities/result/plugins.rb +1 -0
  92. data/lib/convenient_service/service/plugins/has_j_send_result.rb +0 -1
  93. data/lib/convenient_service/service/plugins/has_j_send_result_params_validations/using_dry_validation/middleware.rb +4 -0
  94. data/lib/convenient_service/service/plugins/has_negated_j_send_result/concern.rb +23 -0
  95. data/lib/convenient_service/service/plugins/has_negated_j_send_result.rb +3 -0
  96. data/lib/convenient_service/service/plugins/has_negated_result/concern.rb +33 -0
  97. data/lib/convenient_service/service/plugins/{has_j_send_result → has_negated_result}/exceptions.rb +3 -3
  98. data/lib/convenient_service/service/plugins/has_negated_result.rb +4 -0
  99. data/lib/convenient_service/service/plugins/{wraps_result_in_db_transaction → wraps_result_in_d_b_transaction}/middleware.rb +1 -1
  100. data/lib/convenient_service/service/plugins.rb +7 -2
  101. data/lib/convenient_service/specification.rb +28 -0
  102. data/lib/convenient_service/support/backtrace_cleaner.rb +6 -1
  103. data/lib/convenient_service/support/cache/entities/caches/base.rb +3 -0
  104. data/lib/convenient_service/support/method_parameters.rb +121 -0
  105. data/lib/convenient_service/support/never_reach_here.rb +21 -0
  106. data/lib/convenient_service/support/unique_value.rb +3 -0
  107. data/lib/convenient_service/support/value.rb +78 -0
  108. data/lib/convenient_service/support.rb +3 -0
  109. data/lib/convenient_service/utils/array/find_last.rb +8 -3
  110. data/lib/convenient_service/utils/object/instance_variable_delete.rb +1 -1
  111. data/lib/convenient_service/version.rb +1 -1
  112. data/lib/convenient_service.rb +23 -0
  113. metadata +109 -308
  114. data/.dev/.tmuxinator.yml +0 -22
  115. data/.dockerignore +0 -1
  116. data/.gem_release.yml +0 -11
  117. data/.github/contributing.md +0 -15
  118. data/.github/issue_template.md +0 -35
  119. data/.github/pull_request_template.md +0 -31
  120. data/.github/workflows/cd.yml +0 -68
  121. data/.github/workflows/ci.yml +0 -212
  122. data/.gitignore +0 -66
  123. data/.inch.yml +0 -7
  124. data/.rspec +0 -3
  125. data/.rubocop.yml +0 -45
  126. data/.rubocop_rspec.yml +0 -58
  127. data/.ruby-version +0 -1
  128. data/.tool-versions +0 -1
  129. data/.vscode/CacheItsValue.code-snippets +0 -15
  130. data/.vscode/DelegateTo.code-snippets +0 -15
  131. data/.vscode/cache_its_value.code-snippets +0 -17
  132. data/.vscode/comparison.code-snippets +0 -41
  133. data/.vscode/delegate_to.code-snippets +0 -20
  134. data/.yardopts +0 -16
  135. data/Appraisals +0 -146
  136. data/CHANGELOG.md +0 -504
  137. data/Gemfile +0 -17
  138. data/ROADMAP.md +0 -92
  139. data/Rakefile +0 -54
  140. data/Taskfile.yml +0 -679
  141. data/benchmark/commit_config/ips.rb +0 -18
  142. data/benchmark/commit_config/profile.rb +0 -30
  143. data/benchmark/empty_service/ips.rb +0 -123
  144. data/benchmark/has_committed_config/ips.rb +0 -78
  145. data/benchmark/has_committed_config/profile.rb +0 -30
  146. data/convenient_service.gemspec +0 -233
  147. data/coverage/.gitkeep +0 -0
  148. data/docker/2.7/Dockerfile +0 -73
  149. data/docker/3.0/Dockerfile +0 -73
  150. data/docker/3.1/Dockerfile +0 -73
  151. data/docker/3.2/Dockerfile +0 -73
  152. data/docker/jruby-9.4/Dockerfile +0 -88
  153. data/docker/truffleruby-22.3/Dockerfile +0 -91
  154. data/docs/.gitkeep +0 -0
  155. data/docs/api/.gitkeep +0 -0
  156. data/env.rb +0 -23
  157. data/gemfiles/.gitkeep +0 -0
  158. data/lib/convenient_service/common/plugins/has_callbacks/container.rb +0 -17
  159. data/lib/convenient_service/examples/dry/gemfile/dry_service/config.rb +0 -45
  160. data/lib/convenient_service/examples/dry/gemfile/dry_service.rb +0 -3
  161. data/lib/convenient_service/examples/dry/gemfile/services/assert_file_exists.rb +0 -29
  162. data/lib/convenient_service/examples/dry/gemfile/services/assert_file_not_empty.rb +0 -29
  163. data/lib/convenient_service/examples/dry/gemfile/services/assert_node_available.rb +0 -26
  164. data/lib/convenient_service/examples/dry/gemfile/services/assert_npm_package_available.rb +0 -39
  165. data/lib/convenient_service/examples/dry/gemfile/services/assert_valid_ruby_syntax.rb +0 -41
  166. data/lib/convenient_service/examples/dry/gemfile/services/format.rb +0 -37
  167. data/lib/convenient_service/examples/dry/gemfile/services/format_body.rb +0 -93
  168. data/lib/convenient_service/examples/dry/gemfile/services/format_gems_with_envs.rb +0 -96
  169. data/lib/convenient_service/examples/dry/gemfile/services/format_gems_without_envs.rb +0 -84
  170. data/lib/convenient_service/examples/dry/gemfile/services/format_header.rb +0 -74
  171. data/lib/convenient_service/examples/dry/gemfile/services/parse_content.rb +0 -93
  172. data/lib/convenient_service/examples/dry/gemfile/services/print_shell_command.rb +0 -44
  173. data/lib/convenient_service/examples/dry/gemfile/services/read_file_content.rb +0 -31
  174. data/lib/convenient_service/examples/dry/gemfile/services/run_shell_command.rb +0 -45
  175. data/lib/convenient_service/examples/dry/gemfile/services/strip_comments.rb +0 -109
  176. data/lib/convenient_service/examples/dry/gemfile/services.rb +0 -18
  177. data/lib/convenient_service/examples/dry/gemfile.rb +0 -27
  178. data/lib/convenient_service/examples/dry/v1/gemfile/dry_service/config.rb +0 -47
  179. data/lib/convenient_service/examples/dry/v1/gemfile/dry_service.rb +0 -3
  180. data/lib/convenient_service/examples/dry/v1/gemfile/services/assert_file_exists.rb +0 -31
  181. data/lib/convenient_service/examples/dry/v1/gemfile/services/assert_file_not_empty.rb +0 -31
  182. data/lib/convenient_service/examples/dry/v1/gemfile/services/assert_node_available.rb +0 -28
  183. data/lib/convenient_service/examples/dry/v1/gemfile/services/assert_npm_package_available.rb +0 -41
  184. data/lib/convenient_service/examples/dry/v1/gemfile/services/assert_valid_ruby_syntax.rb +0 -43
  185. data/lib/convenient_service/examples/dry/v1/gemfile/services/format.rb +0 -39
  186. data/lib/convenient_service/examples/dry/v1/gemfile/services/format_body.rb +0 -95
  187. data/lib/convenient_service/examples/dry/v1/gemfile/services/format_gems_with_envs.rb +0 -98
  188. data/lib/convenient_service/examples/dry/v1/gemfile/services/format_gems_without_envs.rb +0 -86
  189. data/lib/convenient_service/examples/dry/v1/gemfile/services/format_header.rb +0 -76
  190. data/lib/convenient_service/examples/dry/v1/gemfile/services/parse_content.rb +0 -95
  191. data/lib/convenient_service/examples/dry/v1/gemfile/services/read_file_content.rb +0 -33
  192. data/lib/convenient_service/examples/dry/v1/gemfile/services/run_shell_command.rb +0 -43
  193. data/lib/convenient_service/examples/dry/v1/gemfile/services/strip_comments.rb +0 -111
  194. data/lib/convenient_service/examples/dry/v1/gemfile/services.rb +0 -17
  195. data/lib/convenient_service/examples/dry/v1/gemfile.rb +0 -29
  196. data/lib/convenient_service/examples/rails/gemfile/rails_service/config.rb +0 -56
  197. data/lib/convenient_service/examples/rails/gemfile/rails_service.rb +0 -3
  198. data/lib/convenient_service/examples/rails/gemfile/services/assert_file_exists.rb +0 -25
  199. data/lib/convenient_service/examples/rails/gemfile/services/assert_file_not_empty.rb +0 -25
  200. data/lib/convenient_service/examples/rails/gemfile/services/assert_node_available.rb +0 -26
  201. data/lib/convenient_service/examples/rails/gemfile/services/assert_npm_package_available.rb +0 -35
  202. data/lib/convenient_service/examples/rails/gemfile/services/assert_valid_ruby_syntax.rb +0 -35
  203. data/lib/convenient_service/examples/rails/gemfile/services/format.rb +0 -66
  204. data/lib/convenient_service/examples/rails/gemfile/services/format_body.rb +0 -79
  205. data/lib/convenient_service/examples/rails/gemfile/services/format_gems_with_envs.rb +0 -82
  206. data/lib/convenient_service/examples/rails/gemfile/services/format_gems_without_envs.rb +0 -70
  207. data/lib/convenient_service/examples/rails/gemfile/services/format_header.rb +0 -68
  208. data/lib/convenient_service/examples/rails/gemfile/services/merge_sections.rb +0 -25
  209. data/lib/convenient_service/examples/rails/gemfile/services/parse_content.rb +0 -89
  210. data/lib/convenient_service/examples/rails/gemfile/services/print_shell_command.rb +0 -40
  211. data/lib/convenient_service/examples/rails/gemfile/services/read_file_content.rb +0 -27
  212. data/lib/convenient_service/examples/rails/gemfile/services/replace_file_content.rb +0 -37
  213. data/lib/convenient_service/examples/rails/gemfile/services/run_shell_command.rb +0 -40
  214. data/lib/convenient_service/examples/rails/gemfile/services/strip_comments.rb +0 -107
  215. data/lib/convenient_service/examples/rails/gemfile/services.rb +0 -21
  216. data/lib/convenient_service/examples/rails/gemfile.rb +0 -27
  217. data/lib/convenient_service/examples/rails/v1/gemfile/rails_service/config.rb +0 -58
  218. data/lib/convenient_service/examples/rails/v1/gemfile/rails_service.rb +0 -3
  219. data/lib/convenient_service/examples/rails/v1/gemfile/services/assert_file_exists.rb +0 -27
  220. data/lib/convenient_service/examples/rails/v1/gemfile/services/assert_file_not_empty.rb +0 -27
  221. data/lib/convenient_service/examples/rails/v1/gemfile/services/assert_node_available.rb +0 -28
  222. data/lib/convenient_service/examples/rails/v1/gemfile/services/assert_npm_package_available.rb +0 -37
  223. data/lib/convenient_service/examples/rails/v1/gemfile/services/assert_valid_ruby_syntax.rb +0 -37
  224. data/lib/convenient_service/examples/rails/v1/gemfile/services/format.rb +0 -68
  225. data/lib/convenient_service/examples/rails/v1/gemfile/services/format_body.rb +0 -81
  226. data/lib/convenient_service/examples/rails/v1/gemfile/services/format_gems_with_envs.rb +0 -84
  227. data/lib/convenient_service/examples/rails/v1/gemfile/services/format_gems_without_envs.rb +0 -72
  228. data/lib/convenient_service/examples/rails/v1/gemfile/services/format_header.rb +0 -70
  229. data/lib/convenient_service/examples/rails/v1/gemfile/services/merge_sections.rb +0 -27
  230. data/lib/convenient_service/examples/rails/v1/gemfile/services/parse_content.rb +0 -91
  231. data/lib/convenient_service/examples/rails/v1/gemfile/services/read_file_content.rb +0 -29
  232. data/lib/convenient_service/examples/rails/v1/gemfile/services/replace_file_content.rb +0 -39
  233. data/lib/convenient_service/examples/rails/v1/gemfile/services/run_shell_command.rb +0 -38
  234. data/lib/convenient_service/examples/rails/v1/gemfile/services/strip_comments.rb +0 -109
  235. data/lib/convenient_service/examples/rails/v1/gemfile/services.rb +0 -20
  236. data/lib/convenient_service/examples/rails/v1/gemfile.rb +0 -29
  237. data/lib/convenient_service/examples/standard/cowsay/services/build_cloud.rb +0 -42
  238. data/lib/convenient_service/examples/standard/cowsay/services/build_cow.rb +0 -38
  239. data/lib/convenient_service/examples/standard/cowsay/services/print.rb +0 -32
  240. data/lib/convenient_service/examples/standard/cowsay/services.rb +0 -5
  241. data/lib/convenient_service/examples/standard/cowsay.rb +0 -26
  242. data/lib/convenient_service/examples/standard/date_time/services/safe_parse.rb +0 -31
  243. data/lib/convenient_service/examples/standard/date_time/services.rb +0 -3
  244. data/lib/convenient_service/examples/standard/date_time.rb +0 -25
  245. data/lib/convenient_service/examples/standard/factorial/services/calculate.rb +0 -55
  246. data/lib/convenient_service/examples/standard/factorial/services.rb +0 -3
  247. data/lib/convenient_service/examples/standard/factorial/utils/timeout/with_timeout.rb +0 -50
  248. data/lib/convenient_service/examples/standard/factorial/utils/timeout.rb +0 -21
  249. data/lib/convenient_service/examples/standard/factorial/utils.rb +0 -3
  250. data/lib/convenient_service/examples/standard/factorial.rb +0 -26
  251. data/lib/convenient_service/examples/standard/gemfile/services/assert_file_exists.rb +0 -30
  252. data/lib/convenient_service/examples/standard/gemfile/services/assert_file_not_empty.rb +0 -30
  253. data/lib/convenient_service/examples/standard/gemfile/services/assert_node_available.rb +0 -26
  254. data/lib/convenient_service/examples/standard/gemfile/services/assert_npm_package_available.rb +0 -48
  255. data/lib/convenient_service/examples/standard/gemfile/services/assert_valid_ruby_syntax.rb +0 -39
  256. data/lib/convenient_service/examples/standard/gemfile/services/format.rb +0 -80
  257. data/lib/convenient_service/examples/standard/gemfile/services/format_body.rb +0 -83
  258. data/lib/convenient_service/examples/standard/gemfile/services/format_gems_with_envs.rb +0 -86
  259. data/lib/convenient_service/examples/standard/gemfile/services/format_gems_without_envs.rb +0 -74
  260. data/lib/convenient_service/examples/standard/gemfile/services/format_header.rb +0 -66
  261. data/lib/convenient_service/examples/standard/gemfile/services/merge_sections.rb +0 -52
  262. data/lib/convenient_service/examples/standard/gemfile/services/parse_content.rb +0 -101
  263. data/lib/convenient_service/examples/standard/gemfile/services/print_shell_command.rb +0 -45
  264. data/lib/convenient_service/examples/standard/gemfile/services/read_file_content.rb +0 -39
  265. data/lib/convenient_service/examples/standard/gemfile/services/replace_file_content.rb +0 -48
  266. data/lib/convenient_service/examples/standard/gemfile/services/run_shell_command.rb +0 -54
  267. data/lib/convenient_service/examples/standard/gemfile/services/strip_comments.rb +0 -111
  268. data/lib/convenient_service/examples/standard/gemfile/services.rb +0 -21
  269. data/lib/convenient_service/examples/standard/gemfile.rb +0 -26
  270. data/lib/convenient_service/examples/standard/request_params/constants.rb +0 -15
  271. data/lib/convenient_service/examples/standard/request_params/entities/description.rb +0 -40
  272. data/lib/convenient_service/examples/standard/request_params/entities/format.rb +0 -40
  273. data/lib/convenient_service/examples/standard/request_params/entities/id.rb +0 -47
  274. data/lib/convenient_service/examples/standard/request_params/entities/logger.rb +0 -21
  275. data/lib/convenient_service/examples/standard/request_params/entities/request.rb +0 -23
  276. data/lib/convenient_service/examples/standard/request_params/entities/source.rb +0 -40
  277. data/lib/convenient_service/examples/standard/request_params/entities/tag.rb +0 -40
  278. data/lib/convenient_service/examples/standard/request_params/entities/title.rb +0 -40
  279. data/lib/convenient_service/examples/standard/request_params/entities.rb +0 -11
  280. data/lib/convenient_service/examples/standard/request_params/services/apply_default_param_values.rb +0 -26
  281. data/lib/convenient_service/examples/standard/request_params/services/cast_params.rb +0 -38
  282. data/lib/convenient_service/examples/standard/request_params/services/extract_params_from_body.rb +0 -70
  283. data/lib/convenient_service/examples/standard/request_params/services/extract_params_from_path.rb +0 -62
  284. data/lib/convenient_service/examples/standard/request_params/services/filter_out_unpermitted_params.rb +0 -26
  285. data/lib/convenient_service/examples/standard/request_params/services/log_request_params.rb +0 -54
  286. data/lib/convenient_service/examples/standard/request_params/services/merge_params.rb +0 -26
  287. data/lib/convenient_service/examples/standard/request_params/services/prepare.rb +0 -65
  288. data/lib/convenient_service/examples/standard/request_params/services/validate_casted_params.rb +0 -94
  289. data/lib/convenient_service/examples/standard/request_params/services/validate_uncasted_params.rb +0 -72
  290. data/lib/convenient_service/examples/standard/request_params/services.rb +0 -13
  291. data/lib/convenient_service/examples/standard/request_params/utils/array/wrap.rb +0 -46
  292. data/lib/convenient_service/examples/standard/request_params/utils/array.rb +0 -21
  293. data/lib/convenient_service/examples/standard/request_params/utils/http/request/parse_body.rb +0 -42
  294. data/lib/convenient_service/examples/standard/request_params/utils/http/request/parse_path.rb +0 -40
  295. data/lib/convenient_service/examples/standard/request_params/utils/http/request.rb +0 -28
  296. data/lib/convenient_service/examples/standard/request_params/utils/http.rb +0 -3
  297. data/lib/convenient_service/examples/standard/request_params/utils/integer/safe_parse.rb +0 -31
  298. data/lib/convenient_service/examples/standard/request_params/utils/integer.rb +0 -25
  299. data/lib/convenient_service/examples/standard/request_params/utils/json/safe_parse.rb +0 -40
  300. data/lib/convenient_service/examples/standard/request_params/utils/json.rb +0 -21
  301. data/lib/convenient_service/examples/standard/request_params/utils/object/blank.rb +0 -34
  302. data/lib/convenient_service/examples/standard/request_params/utils/object/present.rb +0 -31
  303. data/lib/convenient_service/examples/standard/request_params/utils/object.rb +0 -26
  304. data/lib/convenient_service/examples/standard/request_params/utils/url/valid.rb +0 -47
  305. data/lib/convenient_service/examples/standard/request_params/utils/url.rb +0 -21
  306. data/lib/convenient_service/examples/standard/request_params/utils.rb +0 -8
  307. data/lib/convenient_service/examples/standard/request_params.rb +0 -49
  308. data/lib/convenient_service/examples/standard/v1/cowsay/services/build_cloud.rb +0 -44
  309. data/lib/convenient_service/examples/standard/v1/cowsay/services/build_cow.rb +0 -40
  310. data/lib/convenient_service/examples/standard/v1/cowsay/services/print.rb +0 -34
  311. data/lib/convenient_service/examples/standard/v1/cowsay/services.rb +0 -5
  312. data/lib/convenient_service/examples/standard/v1/cowsay.rb +0 -26
  313. data/lib/convenient_service/examples/standard/v1/date_time/services/safe_parse.rb +0 -33
  314. data/lib/convenient_service/examples/standard/v1/date_time/services.rb +0 -3
  315. data/lib/convenient_service/examples/standard/v1/date_time.rb +0 -25
  316. data/lib/convenient_service/examples/standard/v1/factorial/services/calculate.rb +0 -51
  317. data/lib/convenient_service/examples/standard/v1/factorial/services.rb +0 -3
  318. data/lib/convenient_service/examples/standard/v1/factorial/utils/timeout/with_timeout.rb +0 -52
  319. data/lib/convenient_service/examples/standard/v1/factorial/utils/timeout.rb +0 -23
  320. data/lib/convenient_service/examples/standard/v1/factorial/utils.rb +0 -3
  321. data/lib/convenient_service/examples/standard/v1/factorial.rb +0 -26
  322. data/lib/convenient_service/examples/standard/v1/gemfile/services/assert_file_exists.rb +0 -32
  323. data/lib/convenient_service/examples/standard/v1/gemfile/services/assert_file_not_empty.rb +0 -32
  324. data/lib/convenient_service/examples/standard/v1/gemfile/services/assert_node_available.rb +0 -28
  325. data/lib/convenient_service/examples/standard/v1/gemfile/services/assert_npm_package_available.rb +0 -50
  326. data/lib/convenient_service/examples/standard/v1/gemfile/services/assert_valid_ruby_syntax.rb +0 -41
  327. data/lib/convenient_service/examples/standard/v1/gemfile/services/format.rb +0 -82
  328. data/lib/convenient_service/examples/standard/v1/gemfile/services/format_body.rb +0 -85
  329. data/lib/convenient_service/examples/standard/v1/gemfile/services/format_gems_with_envs.rb +0 -88
  330. data/lib/convenient_service/examples/standard/v1/gemfile/services/format_gems_without_envs.rb +0 -76
  331. data/lib/convenient_service/examples/standard/v1/gemfile/services/format_header.rb +0 -68
  332. data/lib/convenient_service/examples/standard/v1/gemfile/services/merge_sections.rb +0 -54
  333. data/lib/convenient_service/examples/standard/v1/gemfile/services/parse_content.rb +0 -103
  334. data/lib/convenient_service/examples/standard/v1/gemfile/services/read_file_content.rb +0 -41
  335. data/lib/convenient_service/examples/standard/v1/gemfile/services/replace_file_content.rb +0 -50
  336. data/lib/convenient_service/examples/standard/v1/gemfile/services/run_shell_command.rb +0 -52
  337. data/lib/convenient_service/examples/standard/v1/gemfile/services/strip_comments.rb +0 -113
  338. data/lib/convenient_service/examples/standard/v1/gemfile/services.rb +0 -20
  339. data/lib/convenient_service/examples/standard/v1/gemfile.rb +0 -26
  340. data/lib/convenient_service/examples/standard/v1/request_params/constants.rb +0 -17
  341. data/lib/convenient_service/examples/standard/v1/request_params/entities/description.rb +0 -42
  342. data/lib/convenient_service/examples/standard/v1/request_params/entities/format.rb +0 -42
  343. data/lib/convenient_service/examples/standard/v1/request_params/entities/id.rb +0 -49
  344. data/lib/convenient_service/examples/standard/v1/request_params/entities/logger.rb +0 -23
  345. data/lib/convenient_service/examples/standard/v1/request_params/entities/request.rb +0 -25
  346. data/lib/convenient_service/examples/standard/v1/request_params/entities/source.rb +0 -42
  347. data/lib/convenient_service/examples/standard/v1/request_params/entities/tag.rb +0 -42
  348. data/lib/convenient_service/examples/standard/v1/request_params/entities/title.rb +0 -42
  349. data/lib/convenient_service/examples/standard/v1/request_params/entities.rb +0 -11
  350. data/lib/convenient_service/examples/standard/v1/request_params/services/apply_default_param_values.rb +0 -28
  351. data/lib/convenient_service/examples/standard/v1/request_params/services/cast_params.rb +0 -40
  352. data/lib/convenient_service/examples/standard/v1/request_params/services/extract_params_from_body.rb +0 -72
  353. data/lib/convenient_service/examples/standard/v1/request_params/services/extract_params_from_path.rb +0 -64
  354. data/lib/convenient_service/examples/standard/v1/request_params/services/filter_out_unpermitted_params.rb +0 -28
  355. data/lib/convenient_service/examples/standard/v1/request_params/services/log_request_params.rb +0 -56
  356. data/lib/convenient_service/examples/standard/v1/request_params/services/merge_params.rb +0 -28
  357. data/lib/convenient_service/examples/standard/v1/request_params/services/prepare.rb +0 -67
  358. data/lib/convenient_service/examples/standard/v1/request_params/services/validate_casted_params.rb +0 -96
  359. data/lib/convenient_service/examples/standard/v1/request_params/services/validate_uncasted_params.rb +0 -74
  360. data/lib/convenient_service/examples/standard/v1/request_params/services.rb +0 -13
  361. data/lib/convenient_service/examples/standard/v1/request_params/utils/array/wrap.rb +0 -48
  362. data/lib/convenient_service/examples/standard/v1/request_params/utils/array.rb +0 -23
  363. data/lib/convenient_service/examples/standard/v1/request_params/utils/http/request/parse_body.rb +0 -44
  364. data/lib/convenient_service/examples/standard/v1/request_params/utils/http/request/parse_path.rb +0 -42
  365. data/lib/convenient_service/examples/standard/v1/request_params/utils/http/request.rb +0 -30
  366. data/lib/convenient_service/examples/standard/v1/request_params/utils/http.rb +0 -3
  367. data/lib/convenient_service/examples/standard/v1/request_params/utils/integer/safe_parse.rb +0 -33
  368. data/lib/convenient_service/examples/standard/v1/request_params/utils/integer.rb +0 -27
  369. data/lib/convenient_service/examples/standard/v1/request_params/utils/json/safe_parse.rb +0 -42
  370. data/lib/convenient_service/examples/standard/v1/request_params/utils/json.rb +0 -23
  371. data/lib/convenient_service/examples/standard/v1/request_params/utils/object/blank.rb +0 -36
  372. data/lib/convenient_service/examples/standard/v1/request_params/utils/object/present.rb +0 -33
  373. data/lib/convenient_service/examples/standard/v1/request_params/utils/object.rb +0 -28
  374. data/lib/convenient_service/examples/standard/v1/request_params/utils/url/valid.rb +0 -49
  375. data/lib/convenient_service/examples/standard/v1/request_params/utils/url.rb +0 -23
  376. data/lib/convenient_service/examples/standard/v1/request_params/utils.rb +0 -8
  377. data/lib/convenient_service/examples/standard/v1/request_params.rb +0 -49
  378. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/matcher/commands/generate_printable_method.rb +0 -50
  379. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/matcher/entities/chainings/sub_matchers/arguments/commands/apply_stub_to_track_delegations.rb +0 -82
  380. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/matcher/entities/chainings/sub_matchers/arguments/commands/generate_printable_arguments.rb +0 -100
  381. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/matcher/entities/chainings/sub_matchers/arguments.rb +0 -95
  382. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/matcher/entities/chainings/sub_matchers/base.rb +0 -87
  383. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/matcher/entities/chainings/sub_matchers/return_its_value.rb +0 -132
  384. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/matcher/entities/chainings/sub_matchers/with_any_arguments.rb +0 -37
  385. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/matcher/entities/chainings/sub_matchers/with_concrete_arguments.rb +0 -37
  386. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/matcher/entities/chainings/sub_matchers/without_arguments.rb +0 -37
  387. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/matcher/entities/chainings/values/base.rb +0 -41
  388. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/matcher/entities/chainings/values/with_calling_original.rb +0 -30
  389. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/matcher/entities/chainings/values/without_calling_original.rb +0 -30
  390. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/matcher/entities/chainings.rb +0 -12
  391. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/matcher/entities/chainings_collection/exceptions.rb +0 -57
  392. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/matcher/entities/chainings_collection.rb +0 -171
  393. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/matcher/entities/delegation.rb +0 -79
  394. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/matcher/entities.rb +0 -5
  395. data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/matcher.rb +0 -276
  396. data/lib/convenient_service/service/plugins/can_have_steps/entities/method/entities/callers/reassignment/commands/define_method_in_container.rb +0 -74
  397. data/lib/convenient_service/service/plugins/can_have_steps/entities/method/entities/callers/reassignment/commands.rb +0 -3
  398. data/lib/convenient_service/service/plugins/can_have_steps/entities/step/plugins/can_be_result_step/can_be_executed/middleware.rb +0 -72
  399. data/lib/convenient_service/service/plugins/can_have_steps/entities/step/plugins/can_be_result_step/can_be_executed.rb +0 -4
  400. data/lib/convenient_service/service/plugins/can_have_steps/entities/step/plugins/can_be_result_step.rb +0 -5
  401. data/lib/convenient_service/service/plugins/has_j_send_result/entities/result/plugins/can_have_checked_status/middleware.rb +0 -43
  402. data/logo.png +0 -0
  403. data/minitest.rb +0 -30
  404. data/yard/yard-convenient_service_concern.rb +0 -45
  405. /data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/{entities/matcher/commands.rb → commands.rb} +0 -0
  406. /data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/{matcher/entities/chainings/sub_matchers → sub_matchers}/arguments/commands.rb +0 -0
@@ -34,7 +34,6 @@ module ConvenientService
34
34
  use ConvenientService::Plugins::Common::HasCallbacks::Concern
35
35
  use ConvenientService::Plugins::Common::HasAroundCallbacks::Concern
36
36
 
37
- use ConvenientService::Plugins::Service::CanHaveFallbacks::Concern
38
37
  use ConvenientService::Plugins::Service::HasMermaidFlowchart::Concern
39
38
  end
40
39
 
@@ -92,6 +91,28 @@ module ConvenientService
92
91
  use ConvenientService::Plugins::Service::CanHaveFallbacks::Middleware.with(status: :error)
93
92
  end
94
93
 
94
+ ##
95
+ # @internal
96
+ # NOTE: Check `Minimal` docs to understand why `use ConvenientService::Plugins::Common::NormalizesEnv::Middleware` for `:negated_result` is used in `Standard`, not in `Minimal` config.
97
+ #
98
+ middlewares :negated_result do
99
+ use ConvenientService::Plugins::Common::NormalizesEnv::Middleware
100
+ use ConvenientService::Plugins::Service::CollectsServicesInException::Middleware
101
+ use ConvenientService::Plugins::Common::CachesReturnValue::Middleware
102
+
103
+ use ConvenientService::Plugins::Common::EnsuresNegatedJSendResult::Middleware
104
+ end
105
+
106
+ ##
107
+ # TODO:
108
+ # `after :step do |step|` is executed after step result is calculated.
109
+ # This completely makes sence and is useful for debugging for example.
110
+ #
111
+ # But `before :step do` is alos executed after step result is calculated.
112
+ # That confuses the end-users a lot.
113
+ # Probably a dedicated plugin is needed?
114
+ # Or to forbid `before :step do`?
115
+ #
95
116
  middlewares :step do
96
117
  use ConvenientService::Plugins::Common::HasCallbacks::Middleware
97
118
  use ConvenientService::Plugins::Common::HasAroundCallbacks::Middleware
@@ -114,47 +135,59 @@ module ConvenientService
114
135
  use ConvenientService::Plugins::Common::HasJSendResultDuckShortSyntax::Concern
115
136
  use ConvenientService::Plugins::Result::CanRecalculateResult::Concern
116
137
 
117
- use ConvenientService::Plugins::Result::CanHaveStep::Concern
138
+ use ConvenientService::Plugins::Result::HasNegatedResult::Concern
118
139
  use ConvenientService::Plugins::Result::CanBeOwnResult::Concern
119
140
  use ConvenientService::Plugins::Result::CanHaveFallbacks::Concern
120
141
  use ConvenientService::Plugins::Result::CanHaveParentResult::Concern
121
142
  use ConvenientService::Plugins::Result::CanHaveCheckedStatus::Concern
122
143
  end
123
144
 
124
- middlewares :success? do
125
- use ConvenientService::Plugins::Result::CanHaveCheckedStatus::Middleware
145
+ middlewares :data do
146
+ use ConvenientService::Plugins::Result::RaisesOnNotCheckedResultStatus::Middleware
126
147
  end
127
148
 
128
- middlewares :failure? do
129
- use ConvenientService::Plugins::Result::CanHaveCheckedStatus::Middleware
149
+ middlewares :message do
150
+ use ConvenientService::Plugins::Result::RaisesOnNotCheckedResultStatus::Middleware
130
151
  end
131
152
 
132
- middlewares :error? do
133
- use ConvenientService::Plugins::Result::CanHaveCheckedStatus::Middleware
153
+ middlewares :code do
154
+ use ConvenientService::Plugins::Result::RaisesOnNotCheckedResultStatus::Middleware
134
155
  end
135
156
 
136
- middlewares :not_success? do
137
- use ConvenientService::Plugins::Result::CanHaveCheckedStatus::Middleware
138
- end
157
+ middlewares :negated_result do
158
+ use ConvenientService::Plugins::Common::NormalizesEnv::Middleware
139
159
 
140
- middlewares :not_failure? do
141
- use ConvenientService::Plugins::Result::CanHaveCheckedStatus::Middleware
160
+ use ConvenientService::Plugins::Common::EnsuresNegatedJSendResult::Middleware
142
161
  end
143
162
 
144
- middlewares :not_error? do
145
- use ConvenientService::Plugins::Result::CanHaveCheckedStatus::Middleware
146
- end
163
+ class self::Status
164
+ concerns do
165
+ use ConvenientService::Plugins::Status::CanBeChecked::Concern
166
+ end
147
167
 
148
- middlewares :data do
149
- use ConvenientService::Plugins::Result::RaisesOnNotCheckedResultStatus::Middleware
150
- end
168
+ middlewares :success? do
169
+ use ConvenientService::Plugins::Status::CanBeChecked::Middleware
170
+ end
151
171
 
152
- middlewares :message do
153
- use ConvenientService::Plugins::Result::RaisesOnNotCheckedResultStatus::Middleware
154
- end
172
+ middlewares :failure? do
173
+ use ConvenientService::Plugins::Status::CanBeChecked::Middleware
174
+ end
155
175
 
156
- middlewares :code do
157
- use ConvenientService::Plugins::Result::RaisesOnNotCheckedResultStatus::Middleware
176
+ middlewares :error? do
177
+ use ConvenientService::Plugins::Status::CanBeChecked::Middleware
178
+ end
179
+
180
+ middlewares :not_success? do
181
+ use ConvenientService::Plugins::Status::CanBeChecked::Middleware
182
+ end
183
+
184
+ middlewares :not_failure? do
185
+ use ConvenientService::Plugins::Status::CanBeChecked::Middleware
186
+ end
187
+
188
+ middlewares :not_error? do
189
+ use ConvenientService::Plugins::Status::CanBeChecked::Middleware
190
+ end
158
191
  end
159
192
  end
160
193
 
@@ -166,29 +199,10 @@ module ConvenientService
166
199
 
167
200
  middlewares :result do
168
201
  use ConvenientService::Plugins::Step::CanHaveFallbacks::Middleware.with(fallback_true_status: :failure)
169
- use ConvenientService::Plugins::Step::CanHaveParentResult::Middleware
170
- end
171
202
 
172
- middlewares :service_fallback_failure_result do
173
- use ConvenientService::Plugins::Common::NormalizesEnv::Middleware
174
- use ConvenientService::Plugins::Common::CachesReturnValue::Middleware
175
- use ConvenientService::Plugins::Step::RaisesOnNotResultReturnValue::Middleware
176
- end
177
-
178
- middlewares :fallback_failure_result do
179
- use ConvenientService::Plugins::Common::NormalizesEnv::Middleware
180
- use ConvenientService::Plugins::Common::CachesReturnValue::Middleware
181
- end
182
-
183
- middlewares :service_fallback_error_result do
184
- use ConvenientService::Plugins::Common::NormalizesEnv::Middleware
185
- use ConvenientService::Plugins::Common::CachesReturnValue::Middleware
186
- use ConvenientService::Plugins::Step::RaisesOnNotResultReturnValue::Middleware
187
- end
188
-
189
- middlewares :fallback_error_result do
190
- use ConvenientService::Plugins::Common::NormalizesEnv::Middleware
191
- use ConvenientService::Plugins::Common::CachesReturnValue::Middleware
203
+ insert_after \
204
+ ConvenientService::Plugins::Step::HasResult::Middleware,
205
+ ConvenientService::Plugins::Step::CanHaveParentResult::Middleware
192
206
  end
193
207
  end
194
208
 
@@ -0,0 +1,503 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ConvenientService
4
+ module Service
5
+ module Plugins
6
+ module CanHaveConnectedSteps
7
+ module Concern
8
+ include Support::Concern
9
+
10
+ class_methods do
11
+ ##
12
+ # @api public
13
+ #
14
+ # Registers a step (step definition).
15
+ #
16
+ # @param args [Array<Object>]
17
+ # @param kwargs [Hash{Symbol => Object}]
18
+ # @return [ConvenientService::Service::Plugins::CanHaveConnectedSteps::Entities::Expressions::Base]
19
+ #
20
+ # @note It is NOT recommended to rely on the return value of this method, since it may differ across different `step` related plugins.
21
+ #
22
+ def step(*args, **kwargs)
23
+ previous_expression = steps.expression
24
+
25
+ new_step = steps.create(*args, **kwargs)
26
+
27
+ steps.expression =
28
+ if previous_expression.empty?
29
+ Entities::Expressions::Scalar.new(new_step)
30
+ else
31
+ Entities::Expressions::And.new(
32
+ previous_expression,
33
+ Entities::Expressions::Scalar.new(new_step)
34
+ )
35
+ end
36
+ end
37
+
38
+ ##
39
+ # @api public
40
+ #
41
+ # Registers a negated step (step definition).
42
+ #
43
+ # @param args [Array<Object>]
44
+ # @param kwargs [Hash{Symbol => Object}]
45
+ # @return [ConvenientService::Service::Plugins::CanHaveConnectedSteps::Entities::Expressions::Base]
46
+ #
47
+ # @note `not` from `not_step` has a similar precedence as Ruby's `!`.
48
+ # @note `not_step` is a rought equivalent of `!step`.
49
+ # @note It is NOT recommended to rely on the return value of this method, since it may differ across different `step` related plugins.
50
+ # @see https://ruby-doc.org/core-2.7.1/doc/syntax/precedence_rdoc.html
51
+ #
52
+ def not_step(*args, **kwargs)
53
+ previous_expression = steps.expression
54
+
55
+ new_step = steps.create(*args, **kwargs)
56
+
57
+ steps.expression =
58
+ if previous_expression.empty?
59
+ Entities::Expressions::Not.new(
60
+ Entities::Expressions::Scalar.new(new_step)
61
+ )
62
+ else
63
+ Entities::Expressions::And.new(
64
+ previous_expression,
65
+ Entities::Expressions::Not.new(
66
+ Entities::Expressions::Scalar.new(new_step)
67
+ )
68
+ )
69
+ end
70
+ end
71
+
72
+ ##
73
+ # @api public
74
+ #
75
+ # Registers a step (step definition).
76
+ #
77
+ # @param args [Array<Object>]
78
+ # @param kwargs [Hash{Symbol => Object}]
79
+ # @return [ConvenientService::Service::Plugins::CanHaveConnectedSteps::Entities::Expressions::Base]
80
+ #
81
+ # @note `and` from `and_step` has a similar precedence as Ruby's `&&`.
82
+ # @note `and_step` is a rought equivalent of `&& step`.
83
+ # @note It is NOT recommended to rely on the return value of this method, since it may differ across different `step` related plugins.
84
+ # @see https://ruby-doc.org/core-2.7.1/doc/syntax/precedence_rdoc.html
85
+ #
86
+ def and_step(*args, **kwargs)
87
+ previous_expression = steps.expression
88
+
89
+ ::ConvenientService.raise Exceptions::FirstStepIsNotSet.new(container: self) if previous_expression.empty?
90
+
91
+ new_step = steps.create(*args, **kwargs)
92
+
93
+ steps.expression =
94
+ Entities::Expressions::And.new(
95
+ previous_expression,
96
+ Entities::Expressions::Scalar.new(new_step)
97
+ )
98
+ end
99
+
100
+ ##
101
+ # @api public
102
+ #
103
+ # Registers a negated step (step definition).
104
+ #
105
+ # @param args [Array<Object>]
106
+ # @param kwargs [Hash{Symbol => Object}]
107
+ # @return [ConvenientService::Service::Plugins::CanHaveConnectedSteps::Entities::Expressions::Base]
108
+ #
109
+ # @note `and` from `and_step` has a similar precedence as Ruby's `&&`.
110
+ # @note `not` from `and_not_step` has a similar precedence as Ruby's `!`.
111
+ # @note `and_not_step` is a rought equivalent of `&& !step`.
112
+ # @note It is NOT recommended to rely on the return value of this method, since it may differ across different `step` related plugins.
113
+ # @see https://ruby-doc.org/core-2.7.1/doc/syntax/precedence_rdoc.html
114
+ #
115
+ def and_not_step(*args, **kwargs)
116
+ previous_expression = steps.expression
117
+
118
+ ::ConvenientService.raise Exceptions::FirstStepIsNotSet.new(container: self) if previous_expression.empty?
119
+
120
+ new_step = steps.create(*args, **kwargs)
121
+
122
+ steps.expression =
123
+ Entities::Expressions::And.new(
124
+ previous_expression,
125
+ Entities::Expressions::Not.new(
126
+ Entities::Expressions::Scalar.new(new_step)
127
+ )
128
+ )
129
+ end
130
+
131
+ ##
132
+ # @api public
133
+ #
134
+ # Registers an alternative step (step definition).
135
+ #
136
+ # @param args [Array<Object>]
137
+ # @param kwargs [Hash{Symbol => Object}]
138
+ # @return [ConvenientService::Service::Plugins::CanHaveConnectedSteps::Entities::Expressions::Base]
139
+ #
140
+ # @note `or` from `or_step` has a similar precedence as Ruby's `||`.
141
+ # @note `or_step` is a rought equivalent of `|| step`.
142
+ # @note It is NOT recommended to rely on the return value of this method, since it may differ across different `step` related plugins.
143
+ # @see https://ruby-doc.org/core-2.7.1/doc/syntax/precedence_rdoc.html
144
+ #
145
+ # @internal
146
+ # NOTE: Decomposing of the `and` expression is needed to make its priority higher.
147
+ #
148
+ def or_step(*args, **kwargs)
149
+ previous_expression = steps.expression
150
+
151
+ ::ConvenientService.raise Exceptions::FirstStepIsNotSet.new(container: self) if previous_expression.empty?
152
+
153
+ new_step = steps.create(*args, **kwargs)
154
+
155
+ steps.expression =
156
+ if previous_expression.and?
157
+ Entities::Expressions::And.new(
158
+ previous_expression.left_expression,
159
+ Entities::Expressions::Or.new(
160
+ previous_expression.right_expression,
161
+ Entities::Expressions::Scalar.new(new_step)
162
+ )
163
+ )
164
+ else
165
+ Entities::Expressions::Or.new(
166
+ previous_expression,
167
+ Entities::Expressions::Scalar.new(new_step)
168
+ )
169
+ end
170
+ end
171
+
172
+ ##
173
+ # @api public
174
+ #
175
+ # Registers a negated alternative step (step definition).
176
+ #
177
+ # @param args [Array<Object>]
178
+ # @param kwargs [Hash{Symbol => Object}]
179
+ # @return [ConvenientService::Service::Plugins::CanHaveConnectedSteps::Entities::Expressions::Base]
180
+ #
181
+ # @note `or` from `or_not_step` has a similar precedence as Ruby's `||`.
182
+ # @note `not` from `or_not_step` has a similar precedence as Ruby's `!`.
183
+ # @note `or_not_step` is a rought equivalent of `|| !step`.
184
+ # @note It is NOT recommended to rely on the return value of this method, since it may differ across different `step` related plugins.
185
+ # @see https://ruby-doc.org/core-2.7.1/doc/syntax/precedence_rdoc.html
186
+ #
187
+ # @internal
188
+ # NOTE: Decomposing of the `and` expression is needed to make its priority higher.
189
+ #
190
+ def or_not_step(*args, **kwargs)
191
+ previous_expression = steps.expression
192
+
193
+ ::ConvenientService.raise Exceptions::FirstStepIsNotSet.new(container: self) if previous_expression.empty?
194
+
195
+ new_step = steps.create(*args, **kwargs)
196
+
197
+ steps.expression =
198
+ if previous_expression.and?
199
+ Entities::Expressions::And.new(
200
+ previous_expression.left_expression,
201
+ Entities::Expressions::Or.new(
202
+ previous_expression.right_expression,
203
+ Entities::Expressions::Not.new(
204
+ Entities::Expressions::Scalar.new(new_step)
205
+ )
206
+ )
207
+ )
208
+ else
209
+ Entities::Expressions::Or.new(
210
+ previous_expression,
211
+ Entities::Expressions::Not.new(
212
+ Entities::Expressions::Scalar.new(new_step)
213
+ )
214
+ )
215
+ end
216
+ end
217
+
218
+ ##
219
+ # @api public
220
+ #
221
+ # @param block [Proc, nil]
222
+ # @return [ConvenientService::Service::Plugins::CanHaveConnectedSteps::Entities::Expressions::Base]
223
+ #
224
+ # @note `group` has a similar precedence as Ruby's `()`.
225
+ # @note `group` is a rought equivalent of `()`.
226
+ # @note It is NOT recommended to rely on the return value of this method, since it may differ across different `step` related plugins.
227
+ # @see https://ruby-doc.org/core-2.7.1/doc/syntax/precedence_rdoc.html
228
+ #
229
+ def group(&block)
230
+ previous_expression = steps.expression
231
+
232
+ steps.expression = Entities::Expressions::Empty.new
233
+
234
+ block&.call
235
+
236
+ current_expression = steps.expression
237
+
238
+ ::ConvenientService.raise Exceptions::FirstGroupStepIsNotSet.new(container: self, method: __method__) if current_expression.empty?
239
+
240
+ steps.expression =
241
+ if previous_expression.empty?
242
+ Entities::Expressions::Group.new(current_expression)
243
+ else
244
+ Entities::Expressions::And.new(
245
+ previous_expression,
246
+ Entities::Expressions::Group.new(current_expression)
247
+ )
248
+ end
249
+ end
250
+
251
+ ##
252
+ # @api public
253
+ #
254
+ # @param block [Proc, nil]
255
+ # @return [ConvenientService::Service::Plugins::CanHaveConnectedSteps::Entities::Expressions::Base]
256
+ #
257
+ # @note `not` from `not_group` has a similar precedence as Ruby's `!`.
258
+ # @note `group` from `not_group` has a similar precedence as Ruby's `()`.
259
+ # @note `not_group` is a rought equivalent of `!()`.
260
+ # @note It is NOT recommended to rely on the return value of this method, since it may differ across different `step` related plugins.
261
+ # @see https://ruby-doc.org/core-2.7.1/doc/syntax/precedence_rdoc.html
262
+ #
263
+ def not_group(&block)
264
+ previous_expression = steps.expression
265
+
266
+ steps.expression = Entities::Expressions::Empty.new
267
+
268
+ block&.call
269
+
270
+ current_expression = steps.expression
271
+
272
+ ::ConvenientService.raise Exceptions::FirstGroupStepIsNotSet.new(container: self, method: __method__) if current_expression.empty?
273
+
274
+ steps.expression =
275
+ if previous_expression.empty?
276
+ Entities::Expressions::Not.new(
277
+ Entities::Expressions::Group.new(current_expression)
278
+ )
279
+ else
280
+ Entities::Expressions::And.new(
281
+ previous_expression,
282
+ Entities::Expressions::Not.new(
283
+ Entities::Expressions::Group.new(current_expression)
284
+ )
285
+ )
286
+ end
287
+ end
288
+
289
+ ##
290
+ # @api public
291
+ #
292
+ # @param block [Proc, nil]
293
+ # @return [ConvenientService::Service::Plugins::CanHaveConnectedSteps::Entities::Expressions::Base]
294
+ #
295
+ # @note `and` from `and_group` has a similar precedence as Ruby's `&&`.
296
+ # @note `group` from `and_group` has a similar precedence as Ruby's `()`.
297
+ # @note `not_group` is a rought equivalent of `&& ()`.
298
+ # @note It is NOT recommended to rely on the return value of this method, since it may differ across different `step` related plugins.
299
+ # @see https://ruby-doc.org/core-2.7.1/doc/syntax/precedence_rdoc.html
300
+ #
301
+ def and_group(&block)
302
+ previous_expression = steps.expression
303
+
304
+ ::ConvenientService.raise Exceptions::FirstStepIsNotSet.new(container: self) if previous_expression.empty?
305
+
306
+ steps.expression = Entities::Expressions::Empty.new
307
+
308
+ block&.call
309
+
310
+ current_expression = steps.expression
311
+
312
+ ::ConvenientService.raise Exceptions::FirstGroupStepIsNotSet.new(container: self, method: __method__) if current_expression.empty?
313
+
314
+ steps.expression =
315
+ Entities::Expressions::And.new(
316
+ previous_expression,
317
+ Entities::Expressions::Group.new(current_expression)
318
+ )
319
+ end
320
+
321
+ ##
322
+ # @api public
323
+ #
324
+ # @param block [Proc, nil]
325
+ # @return [ConvenientService::Service::Plugins::CanHaveConnectedSteps::Entities::Expressions::Base]
326
+ #
327
+ # @note `and` from `and_not_group` has a similar precedence as Ruby's `&&`.
328
+ # @note `not` from `and_not_group` has a similar precedence as Ruby's `!`.
329
+ # @note `group` from `and_not_group` has a similar precedence as Ruby's `()`.
330
+ # @note `and_not_group` is a rought equivalent of `&& !()`.
331
+ # @note It is NOT recommended to rely on the return value of this method, since it may differ across different `step` related plugins.
332
+ # @see https://ruby-doc.org/core-2.7.1/doc/syntax/precedence_rdoc.html
333
+ #
334
+ def and_not_group(&block)
335
+ previous_expression = steps.expression
336
+
337
+ ::ConvenientService.raise Exceptions::FirstStepIsNotSet.new(container: self) if previous_expression.empty?
338
+
339
+ steps.expression = Entities::Expressions::Empty.new
340
+
341
+ block&.call
342
+
343
+ current_expression = steps.expression
344
+
345
+ ::ConvenientService.raise Exceptions::FirstGroupStepIsNotSet.new(container: self, method: __method__) if current_expression.empty?
346
+
347
+ steps.expression =
348
+ Entities::Expressions::And.new(
349
+ previous_expression,
350
+ Entities::Expressions::Not.new(
351
+ Entities::Expressions::Group.new(current_expression)
352
+ )
353
+ )
354
+ end
355
+
356
+ ##
357
+ # @api public
358
+ #
359
+ # @param block [Proc, nil]
360
+ # @return [ConvenientService::Service::Plugins::CanHaveConnectedSteps::Entities::Expressions::Base]
361
+ #
362
+ # @note `or` from `or_group` has a similar precedence as Ruby's `||`.
363
+ # @note `group` from `or_group` has a similar precedence as Ruby's `()`.
364
+ # @note `or_group` is a rought equivalent of `|| ()`
365
+ # @note It is NOT recommended to rely on the return value of this method, since it may differ across different `step` related plugins.
366
+ # @see https://ruby-doc.org/core-2.7.1/doc/syntax/precedence_rdoc.html
367
+ #
368
+ # @internal
369
+ # NOTE: Decomposing of the `and` expression is needed to make its priority higher.
370
+ #
371
+ def or_group(&block)
372
+ previous_expression = steps.expression
373
+
374
+ ::ConvenientService.raise Exceptions::FirstStepIsNotSet.new(container: self) if previous_expression.empty?
375
+
376
+ steps.expression = Entities::Expressions::Empty.new
377
+
378
+ block&.call
379
+
380
+ current_expression = steps.expression
381
+
382
+ ::ConvenientService.raise Exceptions::FirstGroupStepIsNotSet.new(container: self, method: __method__) if current_expression.empty?
383
+
384
+ steps.expression =
385
+ if previous_expression.and?
386
+ Entities::Expressions::And.new(
387
+ previous_expression.left_expression,
388
+ Entities::Expressions::Or.new(
389
+ previous_expression.right_expression,
390
+ Entities::Expressions::Group.new(current_expression)
391
+ )
392
+ )
393
+ else
394
+ Entities::Expressions::Or.new(
395
+ previous_expression,
396
+ Entities::Expressions::Group.new(current_expression)
397
+ )
398
+ end
399
+ end
400
+
401
+ ##
402
+ # @api public
403
+ #
404
+ # @param block [Proc, nil]
405
+ # @return [ConvenientService::Service::Plugins::CanHaveConnectedSteps::Entities::Expressions::Base]
406
+ #
407
+ # @note `or` from `or_not_group` has a similar precedence as Ruby's `||`.
408
+ # @note `not` from `or_not_group` has a similar precedence as Ruby's `!`.
409
+ # @note `group` from `or_not_group` has a similar precedence as Ruby's `()`.
410
+ # @note `or_not_group` is a rought equivalent of `|| !()`
411
+ # @note It is NOT recommended to rely on the return value of this method, since it may differ across different `step` related plugins.
412
+ # @see https://ruby-doc.org/core-2.7.1/doc/syntax/precedence_rdoc.html
413
+ #
414
+ # @internal
415
+ # NOTE: Decomposing of the `and` expression is needed to make its priority higher.
416
+ #
417
+ def or_not_group(&block)
418
+ previous_expression = steps.expression
419
+
420
+ ::ConvenientService.raise Exceptions::FirstStepIsNotSet.new(container: self) if previous_expression.empty?
421
+
422
+ steps.expression = Entities::Expressions::Empty.new
423
+
424
+ block&.call
425
+
426
+ current_expression = steps.expression
427
+
428
+ ::ConvenientService.raise Exceptions::FirstGroupStepIsNotSet.new(container: self, method: __method__) if current_expression.empty?
429
+
430
+ steps.expression =
431
+ if previous_expression.and?
432
+ Entities::Expressions::And.new(
433
+ previous_expression.left_expression,
434
+ Entities::Expressions::Or.new(
435
+ previous_expression.right_expression,
436
+ Entities::Expressions::Not.new(
437
+ Entities::Expressions::Group.new(current_expression)
438
+ )
439
+ )
440
+ )
441
+ else
442
+ Entities::Expressions::Or.new(
443
+ previous_expression,
444
+ Entities::Expressions::Not.new(
445
+ Entities::Expressions::Group.new(current_expression)
446
+ )
447
+ )
448
+ end
449
+ end
450
+
451
+ ##
452
+ # @api private
453
+ #
454
+ # @return [ConvenientService::Service::Plugins::CanHaveConnectedSteps::Entities::StepCollection]
455
+ #
456
+ def steps
457
+ internals_class.cache.fetch(:steps) { Entities::StepCollection.new(container: self) }
458
+ end
459
+ end
460
+
461
+ instance_methods do
462
+ ##
463
+ # @api public
464
+ #
465
+ # @note May be useful for debugging purposes.
466
+ # @see https://userdocs.convenientservice.org/guides/how_to_debug_services_via_callbacks
467
+ #
468
+ # @note `steps` are frozen.
469
+ # @see https://userdocs.convenientservice.org/faq#is-it-possible-to-modify-the-step-collection-from-a-callback
470
+ #
471
+ # @return [ConvenientService::Service::Plugins::CanHaveConnectedSteps::Entities::StepCollection]
472
+ #
473
+ def steps
474
+ internals.cache.fetch(:steps) do
475
+ self.class
476
+ .steps
477
+ .tap(&:commit!)
478
+ .with_organizer(self)
479
+ .tap(&:commit!)
480
+ end
481
+ end
482
+
483
+ ##
484
+ # @api private
485
+ #
486
+ # Returns step by index.
487
+ # Returns `nil` when index is out of range.
488
+ #
489
+ # @param index [Integer]
490
+ # @return [ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step]
491
+ #
492
+ # @note This method was initially designed as a hook (callback trigger).
493
+ # @see ConvenientService::Service::Plugins::CanHaveConnectedSteps::Middleware#next
494
+ #
495
+ def step(index)
496
+ steps[index]
497
+ end
498
+ end
499
+ end
500
+ end
501
+ end
502
+ end
503
+ end