convenient_service 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (410) hide show
  1. checksums.yaml +7 -0
  2. data/.dockerignore +1 -0
  3. data/.gem_release.yml +23 -0
  4. data/.github/workflows/cd.yml +54 -0
  5. data/.github/workflows/ci.yml +190 -0
  6. data/.gitignore +34 -0
  7. data/.inch.yml +7 -0
  8. data/.rspec +3 -0
  9. data/.rubocop.yml +45 -0
  10. data/.rubocop_rspec.yml +58 -0
  11. data/.ruby-version +1 -0
  12. data/.tool-versions +1 -0
  13. data/.yardopts +13 -0
  14. data/Appraisals +124 -0
  15. data/CHANGELOG.md +1 -0
  16. data/Gemfile +6 -0
  17. data/LICENSE.txt +21 -0
  18. data/README.md +55 -0
  19. data/ROADMAP.md +41 -0
  20. data/Rakefile +54 -0
  21. data/Taskfile.yml +316 -0
  22. data/convenient_service.gemspec +52 -0
  23. data/coverage/.gitkeep +0 -0
  24. data/docker/2.7/Dockerfile +73 -0
  25. data/docker/3.0/Dockerfile +73 -0
  26. data/docker/3.1/Dockerfile +73 -0
  27. data/env.rb +19 -0
  28. data/lib/convenient_service/common/plugins/aliases.rb +8 -0
  29. data/lib/convenient_service/common/plugins/assigns_attributes_in_constructor/using_active_model_attribute_assignment/concern.rb +21 -0
  30. data/lib/convenient_service/common/plugins/assigns_attributes_in_constructor/using_active_model_attribute_assignment/middleware.rb +29 -0
  31. data/lib/convenient_service/common/plugins/assigns_attributes_in_constructor/using_active_model_attribute_assignment.rb +4 -0
  32. data/lib/convenient_service/common/plugins/assigns_attributes_in_constructor/using_dry_initializer/concern.rb +21 -0
  33. data/lib/convenient_service/common/plugins/assigns_attributes_in_constructor/using_dry_initializer.rb +3 -0
  34. data/lib/convenient_service/common/plugins/caches_constructor_params/concern.rb +22 -0
  35. data/lib/convenient_service/common/plugins/caches_constructor_params/entities/constructor_params.rb +34 -0
  36. data/lib/convenient_service/common/plugins/caches_constructor_params/entities.rb +3 -0
  37. data/lib/convenient_service/common/plugins/caches_constructor_params/middleware.rb +17 -0
  38. data/lib/convenient_service/common/plugins/caches_constructor_params.rb +5 -0
  39. data/lib/convenient_service/common/plugins/caches_return_value/entities/key.rb +79 -0
  40. data/lib/convenient_service/common/plugins/caches_return_value/entities.rb +3 -0
  41. data/lib/convenient_service/common/plugins/caches_return_value/middleware.rb +17 -0
  42. data/lib/convenient_service/common/plugins/caches_return_value.rb +4 -0
  43. data/lib/convenient_service/common/plugins/can_be_copied/concern.rb +33 -0
  44. data/lib/convenient_service/common/plugins/can_be_copied.rb +3 -0
  45. data/lib/convenient_service/common/plugins/has_around_callbacks/concern.rb +19 -0
  46. data/lib/convenient_service/common/plugins/has_around_callbacks/errors.rb +29 -0
  47. data/lib/convenient_service/common/plugins/has_around_callbacks/middleware.rb +113 -0
  48. data/lib/convenient_service/common/plugins/has_around_callbacks.rb +5 -0
  49. data/lib/convenient_service/common/plugins/has_attributes/using_active_model_attributes/concern.rb +19 -0
  50. data/lib/convenient_service/common/plugins/has_attributes/using_active_model_attributes/patches/active_model_attributes.rb +45 -0
  51. data/lib/convenient_service/common/plugins/has_attributes/using_active_model_attributes/patches.rb +3 -0
  52. data/lib/convenient_service/common/plugins/has_attributes/using_active_model_attributes.rb +4 -0
  53. data/lib/convenient_service/common/plugins/has_callbacks/concern.rb +36 -0
  54. data/lib/convenient_service/common/plugins/has_callbacks/entities/callback.rb +59 -0
  55. data/lib/convenient_service/common/plugins/has_callbacks/entities/callback_collection.rb +35 -0
  56. data/lib/convenient_service/common/plugins/has_callbacks/entities/type/class_methods.rb +26 -0
  57. data/lib/convenient_service/common/plugins/has_callbacks/entities/type.rb +50 -0
  58. data/lib/convenient_service/common/plugins/has_callbacks/entities/type_collection.rb +33 -0
  59. data/lib/convenient_service/common/plugins/has_callbacks/entities.rb +6 -0
  60. data/lib/convenient_service/common/plugins/has_callbacks/middleware.rb +21 -0
  61. data/lib/convenient_service/common/plugins/has_callbacks.rb +5 -0
  62. data/lib/convenient_service/common/plugins/has_constructor/concern.rb +18 -0
  63. data/lib/convenient_service/common/plugins/has_constructor.rb +3 -0
  64. data/lib/convenient_service/common/plugins/has_internals/commands/create_internals_class.rb +56 -0
  65. data/lib/convenient_service/common/plugins/has_internals/commands.rb +3 -0
  66. data/lib/convenient_service/common/plugins/has_internals/concern.rb +28 -0
  67. data/lib/convenient_service/common/plugins/has_internals/entities/internals/concern.rb +25 -0
  68. data/lib/convenient_service/common/plugins/has_internals/entities/internals/plugins/has_cache/concern.rb +30 -0
  69. data/lib/convenient_service/common/plugins/has_internals/entities/internals/plugins/has_cache/entities/cache.rb +81 -0
  70. data/lib/convenient_service/common/plugins/has_internals/entities/internals/plugins/has_cache/entities.rb +3 -0
  71. data/lib/convenient_service/common/plugins/has_internals/entities/internals/plugins/has_cache.rb +4 -0
  72. data/lib/convenient_service/common/plugins/has_internals/entities/internals/plugins.rb +3 -0
  73. data/lib/convenient_service/common/plugins/has_internals/entities/internals.rb +18 -0
  74. data/lib/convenient_service/common/plugins/has_internals/entities.rb +3 -0
  75. data/lib/convenient_service/common/plugins/has_internals.rb +5 -0
  76. data/lib/convenient_service/common/plugins/normalizes_env/middleware.rb +29 -0
  77. data/lib/convenient_service/common/plugins/normalizes_env.rb +3 -0
  78. data/lib/convenient_service/common/plugins.rb +16 -0
  79. data/lib/convenient_service/common.rb +3 -0
  80. data/lib/convenient_service/configs/aliases.rb +7 -0
  81. data/lib/convenient_service/configs/standard.rb +193 -0
  82. data/lib/convenient_service/configs.rb +5 -0
  83. data/lib/convenient_service/core/aliases.rb +9 -0
  84. data/lib/convenient_service/core/class_methods.rb +81 -0
  85. data/lib/convenient_service/core/entities/classic_middleware.rb +32 -0
  86. data/lib/convenient_service/core/entities/config/entities/concerns/entities/default_concern.rb +18 -0
  87. data/lib/convenient_service/core/entities/config/entities/concerns/entities/middleware/commands/cast_middleware.rb +78 -0
  88. data/lib/convenient_service/core/entities/config/entities/concerns/entities/middleware/commands.rb +3 -0
  89. data/lib/convenient_service/core/entities/config/entities/concerns/entities/middleware.rb +103 -0
  90. data/lib/convenient_service/core/entities/config/entities/concerns/entities/stack.rb +206 -0
  91. data/lib/convenient_service/core/entities/config/entities/concerns/entities.rb +5 -0
  92. data/lib/convenient_service/core/entities/config/entities/concerns.rb +216 -0
  93. data/lib/convenient_service/core/entities/config/entities/method_middlewares/commands/generate_stack_name.rb +95 -0
  94. data/lib/convenient_service/core/entities/config/entities/method_middlewares/commands.rb +3 -0
  95. data/lib/convenient_service/core/entities/config/entities/method_middlewares/entities/caller/commands/cast_caller.rb +72 -0
  96. data/lib/convenient_service/core/entities/config/entities/method_middlewares/entities/caller/commands/define_method_middlewares_caller.rb +134 -0
  97. data/lib/convenient_service/core/entities/config/entities/method_middlewares/entities/caller/commands.rb +4 -0
  98. data/lib/convenient_service/core/entities/config/entities/method_middlewares/entities/caller/concern/class_methods.rb +29 -0
  99. data/lib/convenient_service/core/entities/config/entities/method_middlewares/entities/caller/concern/instance_methods.rb +66 -0
  100. data/lib/convenient_service/core/entities/config/entities/method_middlewares/entities/caller/concern.rb +32 -0
  101. data/lib/convenient_service/core/entities/config/entities/method_middlewares/entities/caller.rb +25 -0
  102. data/lib/convenient_service/core/entities/config/entities/method_middlewares/entities/chain.rb +71 -0
  103. data/lib/convenient_service/core/entities/config/entities/method_middlewares/entities/container/commands/cast_container.rb +76 -0
  104. data/lib/convenient_service/core/entities/config/entities/method_middlewares/entities/container/commands/resolve_methods_middlewares_callers.rb +72 -0
  105. data/lib/convenient_service/core/entities/config/entities/method_middlewares/entities/container/commands.rb +4 -0
  106. data/lib/convenient_service/core/entities/config/entities/method_middlewares/entities/container/concern/class_methods.rb +29 -0
  107. data/lib/convenient_service/core/entities/config/entities/method_middlewares/entities/container/concern/instance_methods.rb +165 -0
  108. data/lib/convenient_service/core/entities/config/entities/method_middlewares/entities/container/concern.rb +32 -0
  109. data/lib/convenient_service/core/entities/config/entities/method_middlewares/entities/container.rb +22 -0
  110. data/lib/convenient_service/core/entities/config/entities/method_middlewares/entities/middleware.rb +114 -0
  111. data/lib/convenient_service/core/entities/config/entities/method_middlewares/entities/stack.rb +193 -0
  112. data/lib/convenient_service/core/entities/config/entities/method_middlewares/entities.rb +7 -0
  113. data/lib/convenient_service/core/entities/config/entities/method_middlewares.rb +182 -0
  114. data/lib/convenient_service/core/entities/config/entities.rb +4 -0
  115. data/lib/convenient_service/core/entities/config/errors.rb +27 -0
  116. data/lib/convenient_service/core/entities/config.rb +147 -0
  117. data/lib/convenient_service/core/entities.rb +4 -0
  118. data/lib/convenient_service/core/instance_methods.rb +54 -0
  119. data/lib/convenient_service/core.rb +19 -0
  120. data/lib/convenient_service/dependencies/built_in.rb +36 -0
  121. data/lib/convenient_service/dependencies/extractions/active_support_concern/concern.rb +258 -0
  122. data/lib/convenient_service/dependencies/extractions/active_support_concern.rb +16 -0
  123. data/lib/convenient_service/dependencies/extractions/b.rb +12 -0
  124. data/lib/convenient_service/dependencies/extractions/byebug_syntax_highlighting.rb +58 -0
  125. data/lib/convenient_service/dependencies/extractions/ruby_middleware/middleware/builder.rb +194 -0
  126. data/lib/convenient_service/dependencies/extractions/ruby_middleware/middleware/logger.rb +60 -0
  127. data/lib/convenient_service/dependencies/extractions/ruby_middleware/middleware/runner.rb +79 -0
  128. data/lib/convenient_service/dependencies/extractions/ruby_middleware/middleware.rb +8 -0
  129. data/lib/convenient_service/dependencies/extractions/ruby_middleware.rb +15 -0
  130. data/lib/convenient_service/dependencies/extractions.rb +10 -0
  131. data/lib/convenient_service/dependencies.rb +133 -0
  132. data/lib/convenient_service/error.rb +16 -0
  133. data/lib/convenient_service/examples/dry/gemfile/dry_service/config.rb +43 -0
  134. data/lib/convenient_service/examples/dry/gemfile/dry_service.rb +3 -0
  135. data/lib/convenient_service/examples/dry/gemfile/services/assert_file_exists.rb +29 -0
  136. data/lib/convenient_service/examples/dry/gemfile/services/assert_file_not_empty.rb +29 -0
  137. data/lib/convenient_service/examples/dry/gemfile/services/assert_node_available.rb +26 -0
  138. data/lib/convenient_service/examples/dry/gemfile/services/assert_npm_package_available.rb +39 -0
  139. data/lib/convenient_service/examples/dry/gemfile/services/assert_valid_ruby_syntax.rb +41 -0
  140. data/lib/convenient_service/examples/dry/gemfile/services/format.rb +37 -0
  141. data/lib/convenient_service/examples/dry/gemfile/services/format_body.rb +93 -0
  142. data/lib/convenient_service/examples/dry/gemfile/services/format_gems_with_envs.rb +96 -0
  143. data/lib/convenient_service/examples/dry/gemfile/services/format_gems_without_envs.rb +84 -0
  144. data/lib/convenient_service/examples/dry/gemfile/services/format_header.rb +74 -0
  145. data/lib/convenient_service/examples/dry/gemfile/services/parse_content.rb +93 -0
  146. data/lib/convenient_service/examples/dry/gemfile/services/print_shell_command.rb +37 -0
  147. data/lib/convenient_service/examples/dry/gemfile/services/read_file_content.rb +31 -0
  148. data/lib/convenient_service/examples/dry/gemfile/services/run_shell.rb +40 -0
  149. data/lib/convenient_service/examples/dry/gemfile/services/strip_comments.rb +109 -0
  150. data/lib/convenient_service/examples/dry/gemfile/services.rb +17 -0
  151. data/lib/convenient_service/examples/dry/gemfile.rb +24 -0
  152. data/lib/convenient_service/examples/rails/gemfile/rails_service/config.rb +54 -0
  153. data/lib/convenient_service/examples/rails/gemfile/rails_service.rb +3 -0
  154. data/lib/convenient_service/examples/rails/gemfile/services/assert_file_exists.rb +25 -0
  155. data/lib/convenient_service/examples/rails/gemfile/services/assert_file_not_empty.rb +25 -0
  156. data/lib/convenient_service/examples/rails/gemfile/services/assert_node_available.rb +26 -0
  157. data/lib/convenient_service/examples/rails/gemfile/services/assert_npm_package_available.rb +35 -0
  158. data/lib/convenient_service/examples/rails/gemfile/services/assert_valid_ruby_syntax.rb +35 -0
  159. data/lib/convenient_service/examples/rails/gemfile/services/format.rb +37 -0
  160. data/lib/convenient_service/examples/rails/gemfile/services/format_body.rb +79 -0
  161. data/lib/convenient_service/examples/rails/gemfile/services/format_gems_with_envs.rb +82 -0
  162. data/lib/convenient_service/examples/rails/gemfile/services/format_gems_without_envs.rb +70 -0
  163. data/lib/convenient_service/examples/rails/gemfile/services/format_header.rb +69 -0
  164. data/lib/convenient_service/examples/rails/gemfile/services/parse_content.rb +89 -0
  165. data/lib/convenient_service/examples/rails/gemfile/services/print_shell_command.rb +33 -0
  166. data/lib/convenient_service/examples/rails/gemfile/services/read_file_content.rb +27 -0
  167. data/lib/convenient_service/examples/rails/gemfile/services/run_shell.rb +35 -0
  168. data/lib/convenient_service/examples/rails/gemfile/services/strip_comments.rb +107 -0
  169. data/lib/convenient_service/examples/rails/gemfile/services.rb +17 -0
  170. data/lib/convenient_service/examples/rails/gemfile.rb +24 -0
  171. data/lib/convenient_service/examples/standard/gemfile/services/assert_file_exists.rb +30 -0
  172. data/lib/convenient_service/examples/standard/gemfile/services/assert_file_not_empty.rb +30 -0
  173. data/lib/convenient_service/examples/standard/gemfile/services/assert_node_available.rb +35 -0
  174. data/lib/convenient_service/examples/standard/gemfile/services/assert_npm_package_available.rb +48 -0
  175. data/lib/convenient_service/examples/standard/gemfile/services/assert_valid_ruby_syntax.rb +39 -0
  176. data/lib/convenient_service/examples/standard/gemfile/services/format.rb +39 -0
  177. data/lib/convenient_service/examples/standard/gemfile/services/format_body.rb +83 -0
  178. data/lib/convenient_service/examples/standard/gemfile/services/format_gems_with_envs.rb +86 -0
  179. data/lib/convenient_service/examples/standard/gemfile/services/format_gems_without_envs.rb +74 -0
  180. data/lib/convenient_service/examples/standard/gemfile/services/format_header.rb +66 -0
  181. data/lib/convenient_service/examples/standard/gemfile/services/parse_content.rb +101 -0
  182. data/lib/convenient_service/examples/standard/gemfile/services/print_shell_command.rb +38 -0
  183. data/lib/convenient_service/examples/standard/gemfile/services/read_file_content.rb +39 -0
  184. data/lib/convenient_service/examples/standard/gemfile/services/run_shell.rb +37 -0
  185. data/lib/convenient_service/examples/standard/gemfile/services/strip_comments.rb +111 -0
  186. data/lib/convenient_service/examples/standard/gemfile/services.rb +17 -0
  187. data/lib/convenient_service/examples/standard/gemfile.rb +23 -0
  188. data/lib/convenient_service/logger.rb +70 -0
  189. data/lib/convenient_service/rspec/helpers/custom/ignoring_error.rb +29 -0
  190. data/lib/convenient_service/rspec/helpers/custom/stub_service/entities/result_spec.rb +119 -0
  191. data/lib/convenient_service/rspec/helpers/custom/stub_service/entities/stubbed_service.rb +99 -0
  192. data/lib/convenient_service/rspec/helpers/custom/stub_service/entities.rb +4 -0
  193. data/lib/convenient_service/rspec/helpers/custom/stub_service.rb +26 -0
  194. data/lib/convenient_service/rspec/helpers/custom/wrap_method/entities/wrapped_method.rb +80 -0
  195. data/lib/convenient_service/rspec/helpers/custom/wrap_method/entities.rb +3 -0
  196. data/lib/convenient_service/rspec/helpers/custom/wrap_method/errors.rb +25 -0
  197. data/lib/convenient_service/rspec/helpers/custom/wrap_method.rb +27 -0
  198. data/lib/convenient_service/rspec/helpers/custom.rb +5 -0
  199. data/lib/convenient_service/rspec/helpers/ignoring_error.rb +13 -0
  200. data/lib/convenient_service/rspec/helpers/stub_service.rb +29 -0
  201. data/lib/convenient_service/rspec/helpers/wrap_method.rb +13 -0
  202. data/lib/convenient_service/rspec/helpers.rb +21 -0
  203. data/lib/convenient_service/rspec/matchers/be_descendant_of.rb +13 -0
  204. data/lib/convenient_service/rspec/matchers/be_direct_descendant_of.rb +13 -0
  205. data/lib/convenient_service/rspec/matchers/cache_its_value.rb +13 -0
  206. data/lib/convenient_service/rspec/matchers/call_chain_next.rb +13 -0
  207. data/lib/convenient_service/rspec/matchers/custom/be_descendant_of.rb +55 -0
  208. data/lib/convenient_service/rspec/matchers/custom/be_direct_descendant_of.rb +55 -0
  209. data/lib/convenient_service/rspec/matchers/custom/cache_its_value.rb +55 -0
  210. data/lib/convenient_service/rspec/matchers/custom/call_chain_next.rb +150 -0
  211. data/lib/convenient_service/rspec/matchers/custom/delegate_to.rb +255 -0
  212. data/lib/convenient_service/rspec/matchers/custom/extend_module.rb +40 -0
  213. data/lib/convenient_service/rspec/matchers/custom/have_abstract_method.rb +45 -0
  214. data/lib/convenient_service/rspec/matchers/custom/have_alias_method.rb +45 -0
  215. data/lib/convenient_service/rspec/matchers/custom/have_attr_accessor.rb +43 -0
  216. data/lib/convenient_service/rspec/matchers/custom/have_attr_reader.rb +47 -0
  217. data/lib/convenient_service/rspec/matchers/custom/have_attr_writer.rb +47 -0
  218. data/lib/convenient_service/rspec/matchers/custom/include_module.rb +40 -0
  219. data/lib/convenient_service/rspec/matchers/custom/prepend_module.rb +40 -0
  220. data/lib/convenient_service/rspec/matchers/custom/results/be_error.rb +153 -0
  221. data/lib/convenient_service/rspec/matchers/custom/results/be_failure.rb +120 -0
  222. data/lib/convenient_service/rspec/matchers/custom/results/be_success.rb +120 -0
  223. data/lib/convenient_service/rspec/matchers/custom/results.rb +5 -0
  224. data/lib/convenient_service/rspec/matchers/custom.rb +16 -0
  225. data/lib/convenient_service/rspec/matchers/delegate_to.rb +13 -0
  226. data/lib/convenient_service/rspec/matchers/extend_module.rb +13 -0
  227. data/lib/convenient_service/rspec/matchers/have_abstract_method.rb +13 -0
  228. data/lib/convenient_service/rspec/matchers/have_alias_method.rb +13 -0
  229. data/lib/convenient_service/rspec/matchers/have_attr_accessor.rb +13 -0
  230. data/lib/convenient_service/rspec/matchers/have_attr_reader.rb +13 -0
  231. data/lib/convenient_service/rspec/matchers/have_attr_writer.rb +13 -0
  232. data/lib/convenient_service/rspec/matchers/include_module.rb +13 -0
  233. data/lib/convenient_service/rspec/matchers/prepend_module.rb +13 -0
  234. data/lib/convenient_service/rspec/matchers/results/be_error.rb +15 -0
  235. data/lib/convenient_service/rspec/matchers/results/be_failure.rb +15 -0
  236. data/lib/convenient_service/rspec/matchers/results/be_success.rb +15 -0
  237. data/lib/convenient_service/rspec/matchers/results.rb +21 -0
  238. data/lib/convenient_service/rspec/matchers.rb +43 -0
  239. data/lib/convenient_service/rspec.rb +4 -0
  240. data/lib/convenient_service/service/plugins/aliases.rb +8 -0
  241. data/lib/convenient_service/service/plugins/can_recalculate_result/concern.rb +26 -0
  242. data/lib/convenient_service/service/plugins/can_recalculate_result.rb +3 -0
  243. data/lib/convenient_service/service/plugins/has_result/commands/create_result_class.rb +56 -0
  244. data/lib/convenient_service/service/plugins/has_result/commands.rb +3 -0
  245. data/lib/convenient_service/service/plugins/has_result/concern/class_methods.rb +82 -0
  246. data/lib/convenient_service/service/plugins/has_result/concern/instance_methods.rb +32 -0
  247. data/lib/convenient_service/service/plugins/has_result/concern.rb +22 -0
  248. data/lib/convenient_service/service/plugins/has_result/constants.rb +33 -0
  249. data/lib/convenient_service/service/plugins/has_result/entities/result/commands/cast_result_params.rb +33 -0
  250. data/lib/convenient_service/service/plugins/has_result/entities/result/commands.rb +3 -0
  251. data/lib/convenient_service/service/plugins/has_result/entities/result/concern/instance_methods.rb +64 -0
  252. data/lib/convenient_service/service/plugins/has_result/entities/result/concern.rb +19 -0
  253. data/lib/convenient_service/service/plugins/has_result/entities/result/entities/code/class_methods.rb +30 -0
  254. data/lib/convenient_service/service/plugins/has_result/entities/result/entities/code.rb +45 -0
  255. data/lib/convenient_service/service/plugins/has_result/entities/result/entities/data/class_methods.rb +28 -0
  256. data/lib/convenient_service/service/plugins/has_result/entities/result/entities/data.rb +45 -0
  257. data/lib/convenient_service/service/plugins/has_result/entities/result/entities/message/class_methods.rb +30 -0
  258. data/lib/convenient_service/service/plugins/has_result/entities/result/entities/message.rb +41 -0
  259. data/lib/convenient_service/service/plugins/has_result/entities/result/entities/status/class_methods.rb +30 -0
  260. data/lib/convenient_service/service/plugins/has_result/entities/result/entities/status.rb +69 -0
  261. data/lib/convenient_service/service/plugins/has_result/entities/result/entities.rb +6 -0
  262. data/lib/convenient_service/service/plugins/has_result/entities/result/errors.rb +25 -0
  263. data/lib/convenient_service/service/plugins/has_result/entities/result/plugins/can_recalculate_result/concern.rb +27 -0
  264. data/lib/convenient_service/service/plugins/has_result/entities/result/plugins/can_recalculate_result.rb +3 -0
  265. data/lib/convenient_service/service/plugins/has_result/entities/result/plugins/has_result_short_syntax/concern/instance_methods.rb +28 -0
  266. data/lib/convenient_service/service/plugins/has_result/entities/result/plugins/has_result_short_syntax/concern.rb +30 -0
  267. data/lib/convenient_service/service/plugins/has_result/entities/result/plugins/has_result_short_syntax.rb +3 -0
  268. data/lib/convenient_service/service/plugins/has_result/entities/result/plugins/marks_result_status_as_checked/middleware.rb +25 -0
  269. data/lib/convenient_service/service/plugins/has_result/entities/result/plugins/marks_result_status_as_checked.rb +3 -0
  270. data/lib/convenient_service/service/plugins/has_result/entities/result/plugins/raises_on_not_checked_result_status/errors.rb +31 -0
  271. data/lib/convenient_service/service/plugins/has_result/entities/result/plugins/raises_on_not_checked_result_status/middleware.rb +33 -0
  272. data/lib/convenient_service/service/plugins/has_result/entities/result/plugins/raises_on_not_checked_result_status.rb +4 -0
  273. data/lib/convenient_service/service/plugins/has_result/entities/result/plugins.rb +6 -0
  274. data/lib/convenient_service/service/plugins/has_result/entities/result/structs/result_params.rb +17 -0
  275. data/lib/convenient_service/service/plugins/has_result/entities/result/structs.rb +3 -0
  276. data/lib/convenient_service/service/plugins/has_result/entities/result.rb +22 -0
  277. data/lib/convenient_service/service/plugins/has_result/entities.rb +3 -0
  278. data/lib/convenient_service/service/plugins/has_result/errors.rb +34 -0
  279. data/lib/convenient_service/service/plugins/has_result/middleware.rb +19 -0
  280. data/lib/convenient_service/service/plugins/has_result.rb +8 -0
  281. data/lib/convenient_service/service/plugins/has_result_method_steps/errors.rb +23 -0
  282. data/lib/convenient_service/service/plugins/has_result_method_steps/middleware.rb +37 -0
  283. data/lib/convenient_service/service/plugins/has_result_method_steps/services/method_step_config.rb +29 -0
  284. data/lib/convenient_service/service/plugins/has_result_method_steps/services/run_method_in_organizer.rb +30 -0
  285. data/lib/convenient_service/service/plugins/has_result_method_steps/services/run_own_method_in_organizer.rb +52 -0
  286. data/lib/convenient_service/service/plugins/has_result_method_steps/services.rb +5 -0
  287. data/lib/convenient_service/service/plugins/has_result_method_steps.rb +5 -0
  288. data/lib/convenient_service/service/plugins/has_result_params_validations/using_active_model_validations/concern.rb +19 -0
  289. data/lib/convenient_service/service/plugins/has_result_params_validations/using_active_model_validations/middleware.rb +35 -0
  290. data/lib/convenient_service/service/plugins/has_result_params_validations/using_active_model_validations.rb +4 -0
  291. data/lib/convenient_service/service/plugins/has_result_params_validations/using_dry_validation/concern.rb +22 -0
  292. data/lib/convenient_service/service/plugins/has_result_params_validations/using_dry_validation/middleware.rb +39 -0
  293. data/lib/convenient_service/service/plugins/has_result_params_validations/using_dry_validation.rb +4 -0
  294. data/lib/convenient_service/service/plugins/has_result_short_syntax/concern.rb +30 -0
  295. data/lib/convenient_service/service/plugins/has_result_short_syntax/error/commands/assert_args_count_lower_than_three.rb +25 -0
  296. data/lib/convenient_service/service/plugins/has_result_short_syntax/error/commands/assert_either_args_or_kwargs_are_passed.rb +26 -0
  297. data/lib/convenient_service/service/plugins/has_result_short_syntax/error/commands.rb +4 -0
  298. data/lib/convenient_service/service/plugins/has_result_short_syntax/error/errors.rb +46 -0
  299. data/lib/convenient_service/service/plugins/has_result_short_syntax/error/middleware.rb +27 -0
  300. data/lib/convenient_service/service/plugins/has_result_short_syntax/error.rb +5 -0
  301. data/lib/convenient_service/service/plugins/has_result_short_syntax/failure/commands/refute_kwargs_contain_data_and_extra_keys.rb +29 -0
  302. data/lib/convenient_service/service/plugins/has_result_short_syntax/failure/commands.rb +3 -0
  303. data/lib/convenient_service/service/plugins/has_result_short_syntax/failure/errors.rb +28 -0
  304. data/lib/convenient_service/service/plugins/has_result_short_syntax/failure/middleware.rb +19 -0
  305. data/lib/convenient_service/service/plugins/has_result_short_syntax/failure.rb +5 -0
  306. data/lib/convenient_service/service/plugins/has_result_short_syntax/success/commands/refute_kwargs_contain_data_and_extra_keys.rb +29 -0
  307. data/lib/convenient_service/service/plugins/has_result_short_syntax/success/commands.rb +3 -0
  308. data/lib/convenient_service/service/plugins/has_result_short_syntax/success/errors.rb +28 -0
  309. data/lib/convenient_service/service/plugins/has_result_short_syntax/success/middleware.rb +19 -0
  310. data/lib/convenient_service/service/plugins/has_result_short_syntax/success.rb +5 -0
  311. data/lib/convenient_service/service/plugins/has_result_short_syntax.rb +6 -0
  312. data/lib/convenient_service/service/plugins/has_result_steps/commands/create_step_class.rb +60 -0
  313. data/lib/convenient_service/service/plugins/has_result_steps/commands.rb +3 -0
  314. data/lib/convenient_service/service/plugins/has_result_steps/concern.rb +53 -0
  315. data/lib/convenient_service/service/plugins/has_result_steps/entities/method/commands/cast_method.rb +54 -0
  316. data/lib/convenient_service/service/plugins/has_result_steps/entities/method/commands/cast_method_caller.rb +67 -0
  317. data/lib/convenient_service/service/plugins/has_result_steps/entities/method/commands/cast_method_direction.rb +65 -0
  318. data/lib/convenient_service/service/plugins/has_result_steps/entities/method/commands/cast_method_key.rb +71 -0
  319. data/lib/convenient_service/service/plugins/has_result_steps/entities/method/commands/cast_method_name.rb +74 -0
  320. data/lib/convenient_service/service/plugins/has_result_steps/entities/method/commands/define_method_in_container.rb +55 -0
  321. data/lib/convenient_service/service/plugins/has_result_steps/entities/method/commands.rb +8 -0
  322. data/lib/convenient_service/service/plugins/has_result_steps/entities/method/concern/class_methods.rb +21 -0
  323. data/lib/convenient_service/service/plugins/has_result_steps/entities/method/concern/instance_methods.rb +96 -0
  324. data/lib/convenient_service/service/plugins/has_result_steps/entities/method/concern.rb +29 -0
  325. data/lib/convenient_service/service/plugins/has_result_steps/entities/method/entities/callers/alias.rb +39 -0
  326. data/lib/convenient_service/service/plugins/has_result_steps/entities/method/entities/callers/base.rb +49 -0
  327. data/lib/convenient_service/service/plugins/has_result_steps/entities/method/entities/callers/proc.rb +42 -0
  328. data/lib/convenient_service/service/plugins/has_result_steps/entities/method/entities/callers/raw.rb +42 -0
  329. data/lib/convenient_service/service/plugins/has_result_steps/entities/method/entities/callers/usual.rb +39 -0
  330. data/lib/convenient_service/service/plugins/has_result_steps/entities/method/entities/callers.rb +7 -0
  331. data/lib/convenient_service/service/plugins/has_result_steps/entities/method/entities/directions/base.rb +33 -0
  332. data/lib/convenient_service/service/plugins/has_result_steps/entities/method/entities/directions/input.rb +31 -0
  333. data/lib/convenient_service/service/plugins/has_result_steps/entities/method/entities/directions/output.rb +31 -0
  334. data/lib/convenient_service/service/plugins/has_result_steps/entities/method/entities/directions.rb +5 -0
  335. data/lib/convenient_service/service/plugins/has_result_steps/entities/method/entities/key.rb +40 -0
  336. data/lib/convenient_service/service/plugins/has_result_steps/entities/method/entities/name.rb +40 -0
  337. data/lib/convenient_service/service/plugins/has_result_steps/entities/method/entities/values/raw.rb +48 -0
  338. data/lib/convenient_service/service/plugins/has_result_steps/entities/method/entities/values.rb +3 -0
  339. data/lib/convenient_service/service/plugins/has_result_steps/entities/method/entities.rb +7 -0
  340. data/lib/convenient_service/service/plugins/has_result_steps/entities/method/errors.rb +127 -0
  341. data/lib/convenient_service/service/plugins/has_result_steps/entities/method.rb +20 -0
  342. data/lib/convenient_service/service/plugins/has_result_steps/entities/service/class_methods.rb +32 -0
  343. data/lib/convenient_service/service/plugins/has_result_steps/entities/service.rb +48 -0
  344. data/lib/convenient_service/service/plugins/has_result_steps/entities/step/commands/cast_params.rb +61 -0
  345. data/lib/convenient_service/service/plugins/has_result_steps/entities/step/commands/extract_params.rb +38 -0
  346. data/lib/convenient_service/service/plugins/has_result_steps/entities/step/commands.rb +4 -0
  347. data/lib/convenient_service/service/plugins/has_result_steps/entities/step/concern/instance_methods.rb +138 -0
  348. data/lib/convenient_service/service/plugins/has_result_steps/entities/step/concern.rb +23 -0
  349. data/lib/convenient_service/service/plugins/has_result_steps/entities/step/errors.rb +23 -0
  350. data/lib/convenient_service/service/plugins/has_result_steps/entities/step/structs/params.rb +17 -0
  351. data/lib/convenient_service/service/plugins/has_result_steps/entities/step/structs.rb +3 -0
  352. data/lib/convenient_service/service/plugins/has_result_steps/entities/step.rb +20 -0
  353. data/lib/convenient_service/service/plugins/has_result_steps/entities/step_collection.rb +61 -0
  354. data/lib/convenient_service/service/plugins/has_result_steps/entities.rb +6 -0
  355. data/lib/convenient_service/service/plugins/has_result_steps/middleware.rb +26 -0
  356. data/lib/convenient_service/service/plugins/has_result_steps.rb +6 -0
  357. data/lib/convenient_service/service/plugins/raises_on_double_result/errors.rb +34 -0
  358. data/lib/convenient_service/service/plugins/raises_on_double_result/middleware.rb +33 -0
  359. data/lib/convenient_service/service/plugins/raises_on_double_result.rb +4 -0
  360. data/lib/convenient_service/service/plugins/wraps_result_in_db_transaction/middleware.rb +15 -0
  361. data/lib/convenient_service/service/plugins/wraps_result_in_db_transaction.rb +3 -0
  362. data/lib/convenient_service/service/plugins.rb +14 -0
  363. data/lib/convenient_service/service.rb +3 -0
  364. data/lib/convenient_service/specification.rb +21 -0
  365. data/lib/convenient_service/support/abstract_method/errors.rb +22 -0
  366. data/lib/convenient_service/support/abstract_method.rb +21 -0
  367. data/lib/convenient_service/support/castable/errors.rb +29 -0
  368. data/lib/convenient_service/support/castable.rb +44 -0
  369. data/lib/convenient_service/support/command.rb +25 -0
  370. data/lib/convenient_service/support/concern.rb +11 -0
  371. data/lib/convenient_service/support/copyable.rb +56 -0
  372. data/lib/convenient_service/support/delegate.rb +42 -0
  373. data/lib/convenient_service/support/finite_loop.rb +49 -0
  374. data/lib/convenient_service/support/middleware/stack_builder.rb +78 -0
  375. data/lib/convenient_service/support/middleware.rb +3 -0
  376. data/lib/convenient_service/support.rb +11 -0
  377. data/lib/convenient_service/utils/array/contain_exactly.rb +56 -0
  378. data/lib/convenient_service/utils/array/drop_while.rb +50 -0
  379. data/lib/convenient_service/utils/array/errors.rb +19 -0
  380. data/lib/convenient_service/utils/array/find_last.rb +38 -0
  381. data/lib/convenient_service/utils/array/find_yield.rb +93 -0
  382. data/lib/convenient_service/utils/array/keep_after.rb +41 -0
  383. data/lib/convenient_service/utils/array/merge.rb +77 -0
  384. data/lib/convenient_service/utils/array/rjust.rb +50 -0
  385. data/lib/convenient_service/utils/array/wrap.rb +40 -0
  386. data/lib/convenient_service/utils/array.rb +52 -0
  387. data/lib/convenient_service/utils/bool/to_bool.rb +37 -0
  388. data/lib/convenient_service/utils/bool.rb +15 -0
  389. data/lib/convenient_service/utils/hash/except.rb +46 -0
  390. data/lib/convenient_service/utils/hash.rb +15 -0
  391. data/lib/convenient_service/utils/method/defined.rb +49 -0
  392. data/lib/convenient_service/utils/method.rb +15 -0
  393. data/lib/convenient_service/utils/module/class_method_defined.rb +46 -0
  394. data/lib/convenient_service/utils/module/get_own_const.rb +60 -0
  395. data/lib/convenient_service/utils/module/get_own_instance_method.rb +81 -0
  396. data/lib/convenient_service/utils/module/has_own_instance_method.rb +77 -0
  397. data/lib/convenient_service/utils/module/instance_method_defined.rb +46 -0
  398. data/lib/convenient_service/utils/module.rb +40 -0
  399. data/lib/convenient_service/utils/object/resolve_type.rb +47 -0
  400. data/lib/convenient_service/utils/object.rb +19 -0
  401. data/lib/convenient_service/utils/proc/conjunct.rb +48 -0
  402. data/lib/convenient_service/utils/proc/exec_config.rb +136 -0
  403. data/lib/convenient_service/utils/proc.rb +20 -0
  404. data/lib/convenient_service/utils/string/camelize.rb +56 -0
  405. data/lib/convenient_service/utils/string.rb +15 -0
  406. data/lib/convenient_service/utils.rb +10 -0
  407. data/lib/convenient_service/version.rb +5 -0
  408. data/lib/convenient_service.rb +31 -0
  409. data/logo.png +0 -0
  410. metadata +738 -0
data/ROADMAP.md ADDED
@@ -0,0 +1,41 @@
1
+ # Roadmap
2
+
3
+ | Priority | Status | Goal | Notes |
4
+ | - | - | - | - |
5
+ | High | ✅ | 100% coverage of `Core` | |
6
+ | Medium | 🚧 | Type signatures for the whole codebase ([Yard @param, @overload, @return](https://rubydoc.info/gems/yard/file/docs/Tags.md#taglist)) | |
7
+ | Medium | 🚧 | `Service.success?` shortcut for `Service.result.success?` | |
8
+ | Medium | 🚧 | Release `v0.1.0` with a warning that lib is still under heavy development | |
9
+ | Medium | 🚧 | [Active Record transaction](https://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html) examples | |
10
+ | Low | 🚧 | [Capybara](https://github.com/teamcapybara/capybara) examples | |
11
+ | Low | 🚧 | [Thread.current](https://ruby-doc.org/core-3.1.2/Thread.html#method-c-current) to cache repetable nested steps during an organizer invocation | |
12
+ | Medium | 🚧 | Inline step sequence | |
13
+ | High | 🚧 | Move callbacks to internals | |
14
+ | Low | 🚧 | Create an example of `id_or_record` [attribute](https://api.rubyonrails.org/classes/ActiveRecord/Attributes/ClassMethods.html) |
15
+ | Low | 🚧 | GitHub Wiki/Gists for Support | |
16
+ | Low | 🚧 | Contribute to Shoulda Matchers | |
17
+ | High | ✅ | `respond_to_missing?` | [ConvenientService::Core::ClassMethods#respond_to_missing?](https://github.com/marian13/convenient_service/blob/main/lib/convenient_service/core/class_methods.rb#L105), [ConvenientService::Core::InstanceMethods#respond_to_missing?](https://github.com/marian13/convenient_service/blob/main/lib/convenient_service/core/instance_methods.rb#L30) |
18
+ | High | ⏳ | Custom matcher to track `ConvenientService::Logger` messages | |
19
+ | Medium | 🚧 | Remove `respond_to?` from `Copyable` | Investigate before making any decision |
20
+ | High | 🚧 | Unified `inspect` | |
21
+ | High | ✅ | Remove race condition for `method_missing` | https://github.com/marian13/convenient_service/pull/5 |
22
+ | High | ✅ | Remove incompatiility of [Module#include](https://gist.github.com/marian13/9c25041f835564e945d978839097d419) | https://github.com/marian13/convenient_service/pull/3 |
23
+ | Medium | ✅ | Split `Utils` specs into separate files | [convenient_service/spec/lib/convenient_service/utils](https://github.com/marian13/convenient_service/tree/main/spec/lib/convenient_service/utils) |
24
+ | Medium | 🚧 | How to test thread-safety? | |
25
+ | Medium | ✅ | Rename `Utils::Module.find_own_const` to `Utils::Module.get_own_const` | [ConvenientService::Utils::Module::GetOwnConst](https://github.com/marian13/convenient_service/blob/main/lib/convenient_service/utils/module/get_own_const.rb) |
26
+ | Medium | 🚧 | Mark `@api private` methods, classes | [YARD Tags](https://www.rubydoc.info/gems/yard/file/docs/Tags.md) |
27
+ | Medium | ✅ | A way to check if block has one required positional argument | [#proc_has_one_positional_argument?](https://github.com/marian13/convenient_service/blob/main/lib/convenient_service/utils/proc/exec_config.rb#L96) |
28
+ | Medium | 🚧 | Factories for POROs in specs | |
29
+ | Low | 🚧 | Define method middleware caller with visibility | |
30
+ | Low | 🚧 | Dependency containers to remove high coupling | |
31
+ | Low | 🚧 | Measure performance | |
32
+ | Low | 🚧 | Rewrite middleware backend to count [convenient_service](https://github.com/marian13/convenient_service) specifics | |
33
+ | High | 🚧 | Optimize `stack.dup` in `MethodMiddlewares#call` | Core v3 |
34
+ | Medium | 🚧 | Make a decision of what to do with `printable_block` in custom RSpec matchers | |
35
+ | Medium | 🚧 | User-friendly exception messages | |
36
+ | High | 🚧 | Factories for POROs ❗❗❗ | |
37
+ | High | 🚧 | Resolve warning during specs | |
38
+ | Medium | 🚧 | Consider to change/rewrite `delegate` backend to minify its interface | |
39
+ | Medium | 🚧 | Same order of attr macros, delegators, initialize, class methods, attr methods, queries, actions, to_*, comparison, inspect | |
40
+ | Medium | 🚧 | Move `Cache` to `Support` | |
41
+ | Medium | 🚧 | Statically specify plugin dependencies | |
data/Rakefile ADDED
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+
5
+ ##
6
+ # NOTE: Why not `bin` folder? It has a different purpose. It should contain "binaries/executables" that can be used by the end user.
7
+ # Search for `bin` in the following links for more info.
8
+ # - https://guides.rubygems.org/what-is-a-gem/
9
+ # - https://guides.rubygems.org/faqs/
10
+ #
11
+ task :confirm do
12
+ require "tty-prompt"
13
+
14
+ ##
15
+ # NOTE: `ARGV[0]` contains `confirm` (this task name).
16
+ #
17
+ message = ARGV[1] || "Are you sure?"
18
+
19
+ ##
20
+ # NOTE: Why "tty-prompt"? No time to write, maintain complex, cross-platform bash scripts if you are a full-time application developer.
21
+ #
22
+ prompt = TTY::Prompt.new
23
+
24
+ ##
25
+ # NOTE: `prompt.yes?` docs.
26
+ # https://github.com/piotrmurach/tty-prompt#25-yesno
27
+ #
28
+ yes = prompt.yes?(message)
29
+
30
+ ##
31
+ # NOTE: Use `echo $?` to debug exit code (0 means ok, 1 - error).
32
+ #
33
+ yes ? exit(0) : exit(1)
34
+ end
35
+
36
+ task :playground do
37
+ require "irb"
38
+
39
+ require_relative "env"
40
+
41
+ require "convenient_service"
42
+
43
+ require_relative "spec/support/convenient_service"
44
+ require_relative "spec/support/convenient_service/rails" if ENV["APPRAISAL_NAME"] == "all" || ENV["APPRAISAL_NAME"].include?("rails")
45
+ require_relative "spec/support/convenient_service/dry" if ENV["APPRAISAL_NAME"] == "all" || ENV["APPRAISAL_NAME"].include?("dry")
46
+
47
+ ##
48
+ # NOTE: Clears `ARGV` since both `rake` and `irb` uses it.
49
+ # https://stackoverflow.com/a/2876645/12201472
50
+ #
51
+ ARGV.clear
52
+
53
+ IRB.start(__FILE__)
54
+ end
data/Taskfile.yml ADDED
@@ -0,0 +1,316 @@
1
+ version: '3'
2
+
3
+ ##
4
+ # IMPORTANT: All tasks listed in this file should be executed from the root folder.
5
+ # https://taskfile.dev/usage/#task-directory
6
+ #
7
+ # NOTE: Examples of multiline strings in YAML.
8
+ # https://yaml-multiline.info/
9
+ #
10
+ # NOTE: Use `[ "${IN_DOCKER_CONTAINER}" == "true" ] && echo true || echo false` to debug ``[ "${IN_DOCKER_CONTAINER}" == "true" ]`.
11
+ #
12
+ # NOTE: Forwarding CLI arguments to commands ({{.CLI_ARGS}}).
13
+ # https://taskfile.dev/usage/#forwarding-cli-arguments-to-commands
14
+ #
15
+ tasks:
16
+ default:
17
+ cmds:
18
+ - task: rspec
19
+
20
+ coverage:lcov:merge:
21
+ cmds:
22
+ - npx --yes lcov-result-merger 'coverage/**/lcov.info' coverage/lcov.info
23
+
24
+ coverage:open:
25
+ cmds:
26
+ - open coverage/index.html
27
+ preconditions:
28
+ - sh: '[ "${IN_DOCKER_CONTAINER}" != "true" ]'
29
+ msg: This task can be invoked only from the host operating system (https://www.ibm.com/cloud/learn/containerization)
30
+
31
+ deps:
32
+ cmds:
33
+ - task: deps:install
34
+
35
+ deps:install:
36
+ cmds:
37
+ - bundle install
38
+ - bundle exec appraisal install
39
+
40
+ deps:clean:
41
+ cmds:
42
+ - "bundle exec rake confirm \"This task removes Gemfile*.lock and gemfiles/**/*. Are you sure?\""
43
+ - rm Gemfile*.lock
44
+ - rm -rf gemfiles
45
+
46
+ docker:bash:ruby_2.7:
47
+ cmds:
48
+ - docker run --rm -it -v $(pwd):/gem convenient_service:2.7 bash
49
+ interactive: true
50
+ preconditions:
51
+ - sh: '[ "${IN_DOCKER_CONTAINER}" != "true" ]'
52
+ msg: This task can be invoked only from the host operating system (https://www.ibm.com/cloud/learn/containerization)
53
+
54
+ docker:bash:ruby_3.0:
55
+ cmds:
56
+ - docker run --rm -it -v $(pwd):/gem convenient_service:3.0 bash
57
+ interactive: true
58
+ preconditions:
59
+ - sh: '[ "${IN_DOCKER_CONTAINER}" != "true" ]'
60
+ msg: This task can be invoked only from the host operating system (https://www.ibm.com/cloud/learn/containerization)
61
+
62
+ docker:bash:ruby_3.1:
63
+ cmds:
64
+ - docker run --rm -it -v $(pwd):/gem convenient_service:3.1 bash
65
+ interactive: true
66
+ preconditions:
67
+ - sh: '[ "${IN_DOCKER_CONTAINER}" != "true" ]'
68
+ msg: This task can be invoked only from the host operating system (https://www.ibm.com/cloud/learn/containerization)
69
+
70
+ docker:build:
71
+ cmds:
72
+ - task: docker:build:ruby_2.7
73
+ - task: docker:build:ruby_3.0
74
+ - task: docker:build:ruby_3.1
75
+ preconditions:
76
+ - sh: '[ "${IN_DOCKER_CONTAINER}" != "true" ]'
77
+ msg: This task can be invoked only from the host operating system (https://www.ibm.com/cloud/learn/containerization)
78
+
79
+ docker:build:ruby_2.7:
80
+ cmds:
81
+ - docker build . -f docker/2.7/Dockerfile -t convenient_service:2.7
82
+ preconditions:
83
+ - sh: '[ "${IN_DOCKER_CONTAINER}" != "true" ]'
84
+ msg: This task can be invoked only from the host operating system (https://www.ibm.com/cloud/learn/containerization)
85
+
86
+ docker:build:ruby_3.0:
87
+ cmds:
88
+ - docker build . -f docker/3.0/Dockerfile -t convenient_service:3.0
89
+ preconditions:
90
+ - sh: '[ "${IN_DOCKER_CONTAINER}" != "true" ]'
91
+ msg: This task can be invoked only from the host operating system (https://www.ibm.com/cloud/learn/containerization)
92
+
93
+ docker:build:ruby_3.1:
94
+ cmds:
95
+ - docker build . -f docker/3.1/Dockerfile -t convenient_service:3.1
96
+ preconditions:
97
+ - sh: '[ "${IN_DOCKER_CONTAINER}" != "true" ]'
98
+ msg: This task can be invoked only from the host operating system (https://www.ibm.com/cloud/learn/containerization)
99
+
100
+ ##
101
+ # NOTE: `sdoc` (wrapper for `rdoc`) is replaced by `yard`, since you have a feeling like every time is a first time with `rdoc`.
102
+ # - https://kapeli.com/cheat_sheets/Yard.docset/Contents/Resources/Documents/index
103
+ # - https://rubydoc.info/gems/yard/file/README.md
104
+ # - `yardoc --help`
105
+ #
106
+ # NOTE: `commonmarker` supports GitHub Flavored Markdown.
107
+ # - https://github.com/gjtorikian/commonmarker
108
+ # - https://github.github.com/gfm/
109
+ # - https://github.com/github/markup#markups
110
+ # - https://github.com/lsegal/yard/pull/1388
111
+ #
112
+ # TODO: Contribute. Forward `--parse-option LIBERAL_HTML_TAG` to commonmarker.
113
+ #
114
+ # NOTE: options are specified in the `.yardopts` file.
115
+ #
116
+ docs:generate:
117
+ cmds:
118
+ - bundle exec yardoc
119
+
120
+ docs:generate:open:
121
+ cmds:
122
+ - task: docs:generate
123
+ - task: docs:open
124
+
125
+ docs:lint:
126
+ cmds:
127
+ - mkdir -p docs
128
+ - bundle exec yard-junk --text --html docs/junk-yard.html
129
+
130
+ docs:missed:
131
+ cmds:
132
+ ##
133
+ # NOTE: Options are taken from `.inch.yml`.
134
+ #
135
+ - bundle exec inch
136
+
137
+ docs:open:
138
+ cmds:
139
+ - open docs/index.html
140
+ preconditions:
141
+ - sh: '[ "${IN_DOCKER_CONTAINER}" != "true" ]'
142
+ msg: This task can be invoked only from the host operating system (https://www.ibm.com/cloud/learn/containerization)
143
+
144
+ ##
145
+ # NOTE: A trailing "/**" matches everything inside.
146
+ # https://git-scm.com/docs/gitignore
147
+ #
148
+ git:staged:specs:
149
+ cmds:
150
+ - git diff --cached --name-only --diff-filter=d "spec/**"
151
+
152
+ lint:
153
+ cmds:
154
+ - task: rubocop
155
+ - task: docs:lint
156
+
157
+ playground:
158
+ cmds:
159
+ - bundle exec rake playground
160
+ interactive: true
161
+
162
+ playground:all:
163
+ cmds:
164
+ - bundle exec appraisal all rake playground
165
+ interactive: true
166
+
167
+ playground:dry:
168
+ cmds:
169
+ - bundle exec appraisal dry rake playground
170
+ interactive: true
171
+
172
+ playground:rails_5.2:
173
+ cmds:
174
+ - bundle exec appraisal rails_5.2 rake playground
175
+ interactive: true
176
+
177
+ playground:rails_6.0:
178
+ cmds:
179
+ - bundle exec appraisal rails_6.0 rake playground
180
+ interactive: true
181
+
182
+ playground:rails_6.1:
183
+ cmds:
184
+ - bundle exec appraisal rails_6.1 rake playground
185
+ interactive: true
186
+
187
+ playground:rails_7.0:
188
+ cmds:
189
+ - bundle exec appraisal rails_7.0 rake playground
190
+ interactive: true
191
+
192
+ playground:standard:
193
+ cmds:
194
+ - bundle exec rake playground
195
+ interactive: true
196
+
197
+ release:major:
198
+ cmds:
199
+ - gem bump convenient_service --version major
200
+
201
+ release:minor:
202
+ cmds:
203
+ - gem bump convenient_service --version minor
204
+
205
+ release:patch:
206
+ cmds:
207
+ - gem bump convenient_service --version patch
208
+
209
+ rspec:
210
+ cmds:
211
+ - task: rspec:standard
212
+ - task: rspec:rails_5.2
213
+ - task: rspec:rails_6.0
214
+ - task: rspec:rails_6.1
215
+ - task: rspec:rails_7.0
216
+ - task: rspec:dry
217
+
218
+ ##
219
+ # NOTE: Run rspec only for git staged spec files.
220
+ # https://githowto.com/staging_and_committing
221
+ #
222
+ rspec:staged:
223
+ cmds:
224
+ - task: rspec:standard:staged
225
+ - task: rspec:rails_5.2:staged
226
+ - task: rspec:rails_6.0:staged
227
+ - task: rspec:rails_6.1:staged
228
+ - task: rspec:rails_7.0:staged
229
+ - task: rspec:dry:staged
230
+
231
+ rspec:dry:
232
+ cmds:
233
+ - bundle exec appraisal dry rspec --format progress --require dry_helper {{.GIT_STAGED_SPEC_FILES}} {{.CLI_ARGS}}
234
+
235
+ rspec:dry:staged:
236
+ - task: rspec:dry
237
+ vars:
238
+ GIT_STAGED_SPEC_FILES:
239
+ ##
240
+ # NOTE: `task: git:staged:specs` does NOT work.
241
+ #
242
+ sh: task git:staged:specs --silent
243
+
244
+ rspec:rails_5.2:
245
+ cmds:
246
+ - bundle exec appraisal rails_5.2 rspec --format progress --require rails_helper {{.GIT_STAGED_SPEC_FILES}} {{.CLI_ARGS}}
247
+
248
+ rspec:rails_5.2:staged:
249
+ - task: rspec:rails_5.2
250
+ vars:
251
+ GIT_STAGED_SPEC_FILES:
252
+ ##
253
+ # NOTE: `task: git:staged:specs` does NOT work.
254
+ #
255
+ sh: task git:staged:specs --silent
256
+
257
+ rspec:rails_6.0:
258
+ cmds:
259
+ - bundle exec appraisal rails_6.0 rspec --format progress --require rails_helper {{.GIT_STAGED_SPEC_FILES}} {{.CLI_ARGS}}
260
+
261
+ rspec:rails_6.0:staged:
262
+ - task: rspec:rails_6.0
263
+ vars:
264
+ GIT_STAGED_SPEC_FILES:
265
+ ##
266
+ # NOTE: `task: git:staged:specs` does NOT work.
267
+ #
268
+ sh: task git:staged:specs --silent
269
+
270
+ rspec:rails_6.1:
271
+ cmds:
272
+ - bundle exec appraisal rails_6.1 rspec --format progress --require rails_helper {{.GIT_STAGED_SPEC_FILES}} {{.CLI_ARGS}}
273
+
274
+ rspec:rails_6.1:staged:
275
+ - task: rspec:rails_6.1
276
+ vars:
277
+ GIT_STAGED_SPEC_FILES:
278
+ ##
279
+ # NOTE: `task: git:staged:specs` does NOT work.
280
+ #
281
+ sh: task git:staged:specs --silent
282
+
283
+ rspec:rails_7.0:
284
+ cmds:
285
+ - bundle exec appraisal rails_7.0 rspec --format progress --require rails_helper {{.GIT_STAGED_SPEC_FILES}} {{.CLI_ARGS}}
286
+
287
+ rspec:rails_7.0:staged:
288
+ - task: rspec:rails_7.0
289
+ vars:
290
+ GIT_STAGED_SPEC_FILES:
291
+ ##
292
+ # NOTE: `task: git:staged:specs` does NOT work.
293
+ #
294
+ sh: task git:staged:specs --silent
295
+
296
+ rspec:standard:
297
+ cmds:
298
+ - bundle exec rspec --format progress {{.GIT_STAGED_SPEC_FILES}} {{.CLI_ARGS}}
299
+
300
+ rspec:standard:staged:
301
+ cmds:
302
+ - task: rspec:standard
303
+ vars:
304
+ GIT_STAGED_SPEC_FILES:
305
+ ##
306
+ # NOTE: `task: git:staged:specs` does NOT work.
307
+ #
308
+ sh: task git:staged:specs --silent
309
+
310
+ rubocop:
311
+ cmds:
312
+ - bundle exec rubocop --config .rubocop.yml {{.CLI_ARGS}}
313
+
314
+ rubocop:format:
315
+ cmds:
316
+ - bundle exec rubocop --config .rubocop.yml -A {{.CLI_ARGS}}
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/convenient_service/specification"
4
+ require_relative "lib/convenient_service/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = ConvenientService::Specification::NAME
8
+ spec.authors = ConvenientService::Specification::AUTHORS
9
+ spec.email = ConvenientService::Specification::EMAIL
10
+ spec.homepage = ConvenientService::Specification::HOMEPAGE
11
+ spec.summary = ConvenientService::Specification::SUMMARY
12
+ spec.description = ConvenientService::Specification::DESCRIPTION
13
+
14
+ spec.version = ConvenientService::VERSION
15
+
16
+ spec.license = "MIT"
17
+
18
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.7.0")
19
+
20
+ spec.metadata["homepage_uri"] = spec.homepage
21
+ spec.metadata["source_code_uri"] = spec.homepage
22
+ spec.metadata["changelog_uri"] = "#{spec.homepage}/CHANGELOG.md"
23
+
24
+ # Specify which files should be added to the gem when it is released.
25
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
26
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
27
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
28
+ end
29
+
30
+ spec.require_paths = ["lib"]
31
+
32
+ spec.add_development_dependency "appraisal"
33
+ spec.add_development_dependency "awesome_print"
34
+ spec.add_development_dependency "byebug", "~> 10.0"
35
+ spec.add_development_dependency "commonmarker"
36
+ spec.add_development_dependency "gem-release"
37
+ spec.add_development_dependency "inch"
38
+ spec.add_development_dependency "paint"
39
+ spec.add_development_dependency "progressbar"
40
+ spec.add_development_dependency "rake", "~> 12.0"
41
+ spec.add_development_dependency "rerun"
42
+ spec.add_development_dependency "rouge"
43
+ spec.add_development_dependency "rspec", "~> 3.0"
44
+ spec.add_development_dependency "rubocop"
45
+ spec.add_development_dependency "rubocop-rspec"
46
+ spec.add_development_dependency "tty-prompt"
47
+ spec.add_development_dependency "standard"
48
+ spec.add_development_dependency "simplecov"
49
+ spec.add_development_dependency "simplecov-lcov"
50
+ spec.add_development_dependency "yard"
51
+ spec.add_development_dependency "yard-junk"
52
+ end
data/coverage/.gitkeep ADDED
File without changes
@@ -0,0 +1,73 @@
1
+ ##
2
+ # Ruby 2.7 with Node.js 16.x.
3
+ #
4
+ # NOTE: Linted by hadolint.
5
+ #
6
+ # docker run --rm -i ghcr.io/hadolint/hadolint < docker/3.0/Dockerfile
7
+ #
8
+ # NOTE: A command to build image.
9
+ #
10
+ # cd convenient_service
11
+ # cp Gemfile Gemfile.2.7
12
+ # docker build . -f docker/2.7/Dockerfile -t convenient_service:2.7
13
+ # # or `task docker:build:ruby_2.7`
14
+ #
15
+ # NOTE: A command to run bash in container.
16
+ #
17
+ # cd convenient_service
18
+ # docker run --rm -it -v $(pwd):/gem convenient_service:2.7 bash
19
+ # # or `task docker:bash:ruby_2.7`
20
+ #
21
+ # NOTE: If there are no memory, performance, or cost constraints, prefer to use as standard Linux distribution as it is possible.
22
+ # In a general case, you simply won't have enough time to resolve all the "quirks" of more specific distributions if you are an application developer.
23
+ # That is why a `slim` version is used instead of `alpine`.
24
+ # Also `slim` is more similar to Ubuntu used in CI.
25
+ # - https://github.com/timbru31/docker-ruby-node/tree/master/2.7/16
26
+ # - https://medium.com/swlh/alpine-slim-stretch-buster-jessie-bullseye-bookworm-what-are-the-differences-in-docker-62171ed4531d
27
+ # - https://hub.docker.com/r/timbru31/ruby-node/tags
28
+ #
29
+ # NOTE: Gallium means Node.js 16.x
30
+ # https://github.com/nodejs/Release
31
+ #
32
+ FROM timbru31/ruby-node:2.7-slim-gallium
33
+
34
+ ##
35
+ # NOTE: `bundle install` dependencies.
36
+ #
37
+ RUN apt-get update -qq \
38
+ && apt-get install --no-install-recommends -y git \
39
+ && apt-get install --no-install-recommends -y make \
40
+ && apt-get install --no-install-recommends -y gcc \
41
+ && apt-get clean \
42
+ && rm -rf /var/lib/apt/lists/*
43
+
44
+ RUN mkdir -p /gem
45
+
46
+ WORKDIR /gem
47
+
48
+ COPY . /gem
49
+
50
+ ##
51
+ # NOTE: Every container has its own copy of `Gemfile`. This way a developer doesn't need to delete `Gemfile.lock` all the time when changing containers.
52
+ # - https://docs.docker.com/engine/reference/builder/#env
53
+ # - https://stackoverflow.com/questions/48863711/is-it-possible-to-override-gemfile-for-local-development
54
+ #
55
+ ENV BUNDLE_GEMFILE=Gemfile.2.7
56
+
57
+ RUN bundle install
58
+
59
+ RUN bundle exec appraisal install
60
+
61
+ ##
62
+ # NOTE: Installs `task`.
63
+ # https://taskfile.dev/installation/#install-script
64
+ #
65
+ # NOTE: `task` is installed into `~/bin`. That is why `-b /bin` is used. See `echo ${PATH}` to debug.
66
+ #
67
+ RUN sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d -b /bin
68
+
69
+ ##
70
+ # NOTE: Is used to check whether a command is executed inside a Docker container. See Rakefile for examples.
71
+ # https://stackoverflow.com/a/65942222/12201472
72
+ #
73
+ ENV IN_DOCKER_CONTAINER=true
@@ -0,0 +1,73 @@
1
+ ##
2
+ # Ruby 3.0 with Node.js 16.x.
3
+ #
4
+ # NOTE: Linted by hadolint.
5
+ #
6
+ # docker run --rm -i ghcr.io/hadolint/hadolint < docker/3.0/Dockerfile
7
+ #
8
+ # NOTE: A command to build image.
9
+ #
10
+ # cd convenient_service
11
+ # cp Gemfile Gemfile.3.0
12
+ # docker build . -f docker/3.0/Dockerfile -t convenient_service:3.0
13
+ # # or `task docker:build:ruby_3.0`
14
+ #
15
+ # NOTE: A command to run bash in container.
16
+ #
17
+ # cd convenient_service
18
+ # docker run --rm -it -v $(pwd):/gem convenient_service:3.0 bash
19
+ # # or `task docker:bash:ruby_3.0`
20
+ #
21
+ # NOTE: If there are no memory, performance, or cost constraints, prefer to use as standard Linux distribution as it is possible.
22
+ # In a general case, you simply won't have enough time to resolve all the "quirks" of more specific distributions if you are an application developer.
23
+ # That is why a `slim` version is used instead of `alpine`.
24
+ # Also `slim` is more similar to Ubuntu used in CI.
25
+ # - https://github.com/timbru31/docker-ruby-node/tree/master/3.0/16
26
+ # - https://medium.com/swlh/alpine-slim-stretch-buster-jessie-bullseye-bookworm-what-are-the-differences-in-docker-62171ed4531d
27
+ # - https://hub.docker.com/r/timbru31/ruby-node/tags
28
+ #
29
+ # NOTE: Gallium means Node.js 16.x
30
+ # https://github.com/nodejs/Release
31
+ #
32
+ FROM timbru31/ruby-node:3.0-slim-gallium
33
+
34
+ ##
35
+ # NOTE: `bundle install` dependencies.
36
+ #
37
+ RUN apt-get update -qq \
38
+ && apt-get install --no-install-recommends -y git \
39
+ && apt-get install --no-install-recommends -y make \
40
+ && apt-get install --no-install-recommends -y gcc \
41
+ && apt-get clean \
42
+ && rm -rf /var/lib/apt/lists/*
43
+
44
+ RUN mkdir -p /gem
45
+
46
+ WORKDIR /gem
47
+
48
+ COPY . /gem
49
+
50
+ ##
51
+ # NOTE: Every container has its own copy of `Gemfile`. This way a developer doesn't need to delete `Gemfile.lock` all the time when changing containers.
52
+ # - https://docs.docker.com/engine/reference/builder/#env
53
+ # - https://stackoverflow.com/questions/48863711/is-it-possible-to-override-gemfile-for-local-development
54
+ #
55
+ ENV BUNDLE_GEMFILE=Gemfile.3.0
56
+
57
+ RUN bundle install
58
+
59
+ RUN bundle exec appraisal install
60
+
61
+ ##
62
+ # NOTE: Installs `task`.
63
+ # https://taskfile.dev/installation/#install-script
64
+ #
65
+ # NOTE: `task` is installed into `~/bin`. That is why `-b /bin` is used. See `echo ${PATH}` to debug.
66
+ #
67
+ RUN sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d -b /bin
68
+
69
+ ##
70
+ # NOTE: Is used to check whether a command is executed inside a Docker container. See Rakefile for examples.
71
+ # https://stackoverflow.com/a/65942222/12201472
72
+ #
73
+ ENV IN_DOCKER_CONTAINER=true
@@ -0,0 +1,73 @@
1
+ ##
2
+ # Ruby 3.1 with Node.js 16.x.
3
+ #
4
+ # NOTE: Linted by hadolint.
5
+ #
6
+ # docker run --rm -i ghcr.io/hadolint/hadolint < docker/3.1/Dockerfile
7
+ #
8
+ # NOTE: A command to build image.
9
+ #
10
+ # cd convenient_service
11
+ # cp Gemfile Gemfile.3.1
12
+ # docker build . -f docker/3.1/Dockerfile -t convenient_service:3.1
13
+ # # or `task docker:build:ruby_3.1`
14
+ #
15
+ # NOTE: A command to run bash in container.
16
+ #
17
+ # cd convenient_service
18
+ # docker run --rm -it -v $(pwd):/gem convenient_service:3.1 bash
19
+ # # or `task docker:bash:ruby_3.1`
20
+ #
21
+ # NOTE: If there are no memory, performance, or cost constraints, prefer to use as standard Linux distribution as it is possible.
22
+ # In a general case, you simply won't have enough time to resolve all the "quirks" of more specific distributions if you are an application developer.
23
+ # That is why a `slim` version is used instead of `alpine`.
24
+ # Also `slim` is more similar to Ubuntu used in CI.
25
+ # - https://github.com/timbru31/docker-ruby-node/tree/master/3.1/16
26
+ # - https://medium.com/swlh/alpine-slim-stretch-buster-jessie-bullseye-bookworm-what-are-the-differences-in-docker-62171ed4531d
27
+ # - https://hub.docker.com/r/timbru31/ruby-node/tags
28
+ #
29
+ # NOTE: Gallium means Node.js 16.x
30
+ # https://github.com/nodejs/Release
31
+ #
32
+ FROM timbru31/ruby-node:3.1-slim-gallium
33
+
34
+ ##
35
+ # NOTE: `bundle install` dependencies.
36
+ #
37
+ RUN apt-get update -qq \
38
+ && apt-get install --no-install-recommends -y git \
39
+ && apt-get install --no-install-recommends -y make \
40
+ && apt-get install --no-install-recommends -y gcc \
41
+ && apt-get clean \
42
+ && rm -rf /var/lib/apt/lists/*
43
+
44
+ RUN mkdir -p /gem
45
+
46
+ WORKDIR /gem
47
+
48
+ COPY . /gem
49
+
50
+ ##
51
+ # NOTE: Every container has its own copy of `Gemfile`. This way a developer doesn't need to delete `Gemfile.lock` all the time when changing containers.
52
+ # - https://docs.docker.com/engine/reference/builder/#env
53
+ # - https://stackoverflow.com/questions/48863711/is-it-possible-to-override-gemfile-for-local-development
54
+ #
55
+ ENV BUNDLE_GEMFILE=Gemfile.3.1
56
+
57
+ RUN bundle install
58
+
59
+ RUN bundle exec appraisal install
60
+
61
+ ##
62
+ # NOTE: Installs `task`.
63
+ # https://taskfile.dev/installation/#install-script
64
+ #
65
+ # NOTE: `task` is installed into `~/bin`. That is why `-b /bin` is used. See `echo ${PATH}` to debug.
66
+ #
67
+ RUN sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d -b /bin
68
+
69
+ ##
70
+ # NOTE: Is used to check whether a command is executed inside a Docker container. See Rakefile for examples.
71
+ # https://stackoverflow.com/a/65942222/12201472
72
+ #
73
+ ENV IN_DOCKER_CONTAINER=true