convenient_service 0.1.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 (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
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ConvenientService
4
+ module Examples
5
+ module Rails
6
+ module Gemfile
7
+ module Services
8
+ class AssertValidRubySyntax
9
+ include RailsService::Config
10
+
11
+ attribute :content, :string
12
+
13
+ def result
14
+ ##
15
+ # NOTE: `> /dev/null 2>&1` is used to hide output.
16
+ # https://unix.stackexchange.com/a/119650/394253
17
+ #
18
+ check_ruby_syntax_result = Services::RunShell.result(command: "ruby -c #{file.path} > /dev/null 2>&1")
19
+
20
+ return error("`#{content}` contains invalid Ruby syntax") unless check_ruby_syntax_result.success?
21
+
22
+ success
23
+ end
24
+
25
+ private
26
+
27
+ def file
28
+ @file ||= ::Tempfile.new.tap { |tempfile| tempfile.write(content) }.tap(&:close)
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ ##
4
+ # Usage example:
5
+ #
6
+ # result = ConvenientService::Examples::Rails::Gemfile::Services::Format.result(path: "Gemfile")
7
+ # result = ConvenientService::Examples::Rails::Gemfile::Services::Format.result(path: "spec/cli/gemfile/format/fixtures/Gemfile")
8
+ #
9
+ module ConvenientService
10
+ module Examples
11
+ module Rails
12
+ module Gemfile
13
+ module Services
14
+ class Format
15
+ include RailsService::Config
16
+
17
+ attribute :path, :string
18
+
19
+ step Services::ReadFileContent, in: :path, out: :content
20
+ step Services::StripComments, in: :content, out: :content_without_comments
21
+ step Services::ParseContent, in: {content: :content_without_comments}, out: :parsed_content
22
+ step Services::FormatHeader, in: :parsed_content, out: {formatted_content: :formatted_header_content}
23
+ step Services::FormatBody, in: :parsed_content, out: {formatted_content: :formatted_body_content}
24
+
25
+ before :result do
26
+ @progressbar = ::ProgressBar.create(title: "Formatting", total: steps.count)
27
+ end
28
+
29
+ after :step do |step_result|
30
+ @progressbar.increment
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ ##
4
+ # Usage example:
5
+ #
6
+ # result = ConvenientService::Examples::Rails::Gemfile::Services::FormatBody.result(
7
+ # parsed_content: {
8
+ # gems: [
9
+ # {
10
+ # envs: [],
11
+ # line: %(gem "bootsnap", ">= 1.4.4", require: false)
12
+ # },
13
+ # {
14
+ # envs: [],
15
+ # line: %(gem "pg")
16
+ # },
17
+ # {
18
+ # envs: [:development],
19
+ # line: %(gem "listen", "~> 3.3")
20
+ # },
21
+ # {
22
+ # envs: [:development],
23
+ # line: %(gem "web-console", ">= 4.1.0")
24
+ # },
25
+ # {
26
+ # envs: [:development, :test],
27
+ # line: %(gem "rspec-rails")
28
+ # },
29
+ # {
30
+ # envs: [:test],
31
+ # line: %(gem "simplecov", require: false)
32
+ # },
33
+ # {
34
+ # envs: [],
35
+ # line: %(gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw, :jruby])
36
+ # }
37
+ # ]
38
+ # }
39
+ # )
40
+ #
41
+ # NOTE: Check the corresponding spec file to see more examples.
42
+ #
43
+ module ConvenientService
44
+ module Examples
45
+ module Rails
46
+ module Gemfile
47
+ module Services
48
+ class FormatBody
49
+ include RailsService::Config
50
+
51
+ attr_accessor :parsed_content
52
+
53
+ step Services::FormatGemsWithoutEnvs,
54
+ in: :parsed_content,
55
+ out: [{formatted_content: :formatted_gems_without_envs_content}]
56
+
57
+ step Services::FormatGemsWithEnvs,
58
+ in: :parsed_content,
59
+ out: [{formatted_content: :formatted_gems_with_envs_content}]
60
+
61
+ step :result,
62
+ in: [:formatted_gems_without_envs_content, :formatted_gems_with_envs_content],
63
+ out: :formatted_content
64
+
65
+ def result
66
+ success(formatted_content: format_content)
67
+ end
68
+
69
+ private
70
+
71
+ def format_content
72
+ [formatted_gems_without_envs_content, formatted_gems_with_envs_content].reject(&:empty?).join("\n")
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ ##
4
+ # Usage example:
5
+ #
6
+ # result = ConvenientService::Examples::Rails::Gemfile::Services::FormatGemsWithEnvs.result(
7
+ # parsed_content: {
8
+ # gems: [
9
+ # {
10
+ # envs: [:development],
11
+ # line: %(gem "listen", "~> 3.3")
12
+ # },
13
+ # {
14
+ # envs: [:development],
15
+ # line: %(gem "web-console", ">= 4.1.0")
16
+ # },
17
+ # {
18
+ # envs: [:development, :test],
19
+ # line: %(gem "rspec-rails")
20
+ # },
21
+ # {
22
+ # envs: [:test],
23
+ # line: %(gem "simplecov", require: false)
24
+ # }
25
+ # ]
26
+ # }
27
+ # )
28
+ #
29
+ # NOTE: Check the corresponding spec file to see more examples.
30
+ #
31
+ module ConvenientService
32
+ module Examples
33
+ module Rails
34
+ module Gemfile
35
+ module Services
36
+ class FormatGemsWithEnvs
37
+ BLOCK_END = "end"
38
+ BLOCK_DO = "do"
39
+ COMMA_WITH_SPACE = ", "
40
+ EMPTY_LINE = ""
41
+ ENTER = "\n"
42
+ GROUP = "group"
43
+ SPACE = " "
44
+ TAB = " "
45
+
46
+ include RailsService::Config
47
+
48
+ attr_accessor :parsed_content
49
+
50
+ def result
51
+ success(formatted_content: format_content)
52
+ end
53
+
54
+ private
55
+
56
+ def format_content
57
+ return "" if gems_with_envs.none?
58
+
59
+ gems_with_envs
60
+ .group_by { |gem| gem[:envs] }
61
+ .sort
62
+ .map { |envs, gems|
63
+ content = EMPTY_LINE.dup
64
+
65
+ content << GROUP << SPACE << envs.map { |env| ":#{env}" }.join(COMMA_WITH_SPACE) << SPACE << BLOCK_DO << ENTER
66
+
67
+ content << gems.map { |gem| "#{TAB}#{gem[:line]}#{ENTER}" }.join
68
+
69
+ content << BLOCK_END << ENTER
70
+ }
71
+ .join(ENTER)
72
+ end
73
+
74
+ def gems_with_envs
75
+ @gems_with_envs ||= parsed_content[:gems].to_a.select { |gem| gem[:envs].any? }
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ ##
4
+ # Usage example:
5
+ #
6
+ # result = ConvenientService::Examples::Rails::Gemfile::Services::FormatGemsWithoutEnvs.result(
7
+ # parsed_content: {
8
+ # gems: [
9
+ # {
10
+ # envs: [],
11
+ # line: %(gem "bootsnap", ">= 1.4.4", require: false)
12
+ # },
13
+ # {
14
+ # envs: [],
15
+ # line: %(gem "pg")
16
+ # },
17
+ # {
18
+ # envs: [],
19
+ # line: %(gem "rails", "~> 6.1.3", ">= 6.1.3.2")
20
+ # },
21
+ # {
22
+ # envs: [],
23
+ # line: %(gem "webpacker", "~> 5.0")
24
+ # },
25
+ # {
26
+ # envs: [],
27
+ # line: %(gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw, :jruby])
28
+ # }
29
+ # ]
30
+ # }
31
+ # )
32
+ #
33
+ # NOTE: Check the corresponding spec file to see more examples.
34
+ #
35
+ module ConvenientService
36
+ module Examples
37
+ module Rails
38
+ module Gemfile
39
+ module Services
40
+ class FormatGemsWithoutEnvs
41
+ EMPTY_LINE = ""
42
+ ENTER = "\n"
43
+
44
+ include RailsService::Config
45
+
46
+ attr_accessor :parsed_content
47
+
48
+ def result
49
+ success(formatted_content: format_content)
50
+ end
51
+
52
+ private
53
+
54
+ def format_content
55
+ return "" if gems_without_envs.none?
56
+
57
+ gems_without_envs
58
+ .map { |gem| gem[:line] }
59
+ .reduce(EMPTY_LINE.dup) { |content, line| content << line << ENTER }
60
+ end
61
+
62
+ def gems_without_envs
63
+ @gems_without_envs ||= parsed_content[:gems].to_a.select { |gem| gem[:envs].none? }
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ ##
4
+ # Usage example:
5
+ #
6
+ # result = ConvenientService::Examples::Rails::Gemfile::Services::FormatHeader.result(
7
+ # parsed_content: {
8
+ # ruby: [
9
+ # %(ruby "3.0.1")
10
+ # ],
11
+ # source: [
12
+ # %(source "https://rubygems.org")
13
+ # ],
14
+ # git_source: [
15
+ # %(git_source(:github) { |repo| "https://github.com/\#{repo}.git" })
16
+ # ]
17
+ # },
18
+ # skip_frozen_string_literal: true
19
+ # )
20
+ #
21
+ # NOTE: Check the corresponding spec file to see more examples.
22
+ #
23
+ module ConvenientService
24
+ module Examples
25
+ module Rails
26
+ module Gemfile
27
+ module Services
28
+ class FormatHeader
29
+ FROZEN_STRING_LITERAL = "# frozen_string_literal: true"
30
+ EMPTY_LINE = ""
31
+ ENTER = "\n"
32
+
33
+ include RailsService::Config
34
+
35
+ ##
36
+ # NOTE: `attribute` has no `hash` type.
37
+ # https://github.com/rails/rails/blob/v7.0.4/activemodel/lib/active_model/type.rb#L42
38
+ #
39
+ # TODO: Implement custom types.
40
+ #
41
+ attr_accessor :parsed_content
42
+
43
+ attribute :skip_frozen_string_literal, :boolean, default: false
44
+
45
+ def result
46
+ success(formatted_content: format_content)
47
+ end
48
+
49
+ private
50
+
51
+ def format_content
52
+ content = EMPTY_LINE.dup
53
+
54
+ content << FROZEN_STRING_LITERAL << ENTER << ENTER unless skip_frozen_string_literal
55
+
56
+ parsed_content.slice(:source, :git_source, :ruby).each do |_group, lines|
57
+ content << lines.join(ENTER) << ENTER << ENTER
58
+ end
59
+
60
+ content.chomp!
61
+
62
+ content
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ ##
4
+ # Usage example:
5
+ #
6
+ # result = ConvenientService::Examples::Rails::Gemfile::Services::ParseContent.result(
7
+ # content: <<~'RUBY'
8
+ # ruby "3.0.1"
9
+ # source "https://rubygems.org"
10
+
11
+ # git_source(:github) { |repo| "https://github.com/#{repo}.git" }
12
+
13
+ # gem "bootsnap", ">= 1.4.4", require: false
14
+
15
+ # group :development do
16
+ # gem "listen", "~> 3.3"
17
+ # end
18
+
19
+ # group :development, :test do
20
+ # gem "rspec-rails"
21
+ # end
22
+ # RUBY
23
+ # )
24
+ #
25
+ # NOTE: Check the corresponding spec file to see more examples.
26
+ #
27
+ module ConvenientService
28
+ module Examples
29
+ module Rails
30
+ module Gemfile
31
+ module Services
32
+ class ParseContent
33
+ RUBY_REGEX = /\A\s*ruby/
34
+ SOURCE_REGEX = /\A\s*source/
35
+ GIT_SOURCE_REGEX = /\A\s*git_source/
36
+ GROUP_REGEX = /\A\s*group/
37
+ GEM_REGEX = /\A\s*gem/
38
+ BLOCK_END_REGEX = /\A\s*end/
39
+ ENV_SCAN_REGEX = /:(\w+)/
40
+
41
+ include RailsService::Config
42
+
43
+ attribute :content, :string
44
+
45
+ validates :content, presence: true
46
+
47
+ step Services::AssertValidRubySyntax, in: :content
48
+ step :result, in: :content, out: :parsed_content
49
+
50
+ def result
51
+ success(data: {parsed_content: parse_content})
52
+ end
53
+
54
+ def parse_content
55
+ hash = ::Hash.new { |h, k| h[k] = [] }
56
+
57
+ ::StringIO.open(content) do |io|
58
+ envs = []
59
+
60
+ until io.eof?
61
+ line = io.readline.rstrip
62
+
63
+ case line
64
+ when RUBY_REGEX
65
+ hash[:ruby] << line
66
+ when SOURCE_REGEX
67
+ hash[:source] << line
68
+ when GIT_SOURCE_REGEX
69
+ hash[:git_source] << line
70
+ when GROUP_REGEX
71
+ envs = line.scan(ENV_SCAN_REGEX).map(&:first).map(&:to_sym)
72
+ when GEM_REGEX
73
+ hash[:gems] << {envs: envs, line: line.lstrip}
74
+ when BLOCK_END_REGEX
75
+ envs = []
76
+ else
77
+ hash[:rest] << line
78
+ end
79
+ end
80
+ end
81
+
82
+ hash
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ ##
4
+ # Usage example:
5
+ #
6
+ # ConvenientService::Examples::Rails::Gemfile::Services::PrintShellCommand.result(text: "ls -a")
7
+ #
8
+ module ConvenientService
9
+ module Examples
10
+ module Rails
11
+ module Gemfile
12
+ module Services
13
+ class PrintShellCommand
14
+ include RailsService::Config
15
+
16
+ attribute :text, :string
17
+ attribute :out, default: $stdout
18
+
19
+ validates :text, presence: true
20
+
21
+ def result
22
+ out.puts
23
+
24
+ out.puts ::Paint["$ #{text}", :blue, :bold]
25
+
26
+ success
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ConvenientService
4
+ module Examples
5
+ module Rails
6
+ module Gemfile
7
+ module Services
8
+ class ReadFileContent
9
+ include RailsService::Config
10
+
11
+ attribute :path, :string
12
+
13
+ validates :path, presence: true
14
+
15
+ step Services::AssertFileExists, in: :path
16
+ step Services::AssertFileNotEmpty, in: :path
17
+ step :result, in: :path, out: :content
18
+
19
+ def result
20
+ success(data: {content: ::File.read(path)})
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ConvenientService
4
+ module Examples
5
+ module Rails
6
+ module Gemfile
7
+ module Services
8
+ class RunShell
9
+ include RailsService::Config
10
+
11
+ attribute :command, :string
12
+ attribute :debug, :boolean, default: false
13
+
14
+ validates :command, presence: true
15
+
16
+ def result
17
+ Services::PrintShellCommand.result(text: command) if debug
18
+
19
+ ##
20
+ # NOTE: When the command exit code is 0, `system` return true, and false otherwise.
21
+ # - https://ruby-doc.org/core-3.1.2/Kernel.html#method-i-system
22
+ # - https://stackoverflow.com/a/37329716/12201472
23
+ #
24
+ if system(command)
25
+ success
26
+ else
27
+ error(message: "#{command} returned non-zero exit code")
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,107 @@
1
+ # frozen_string_literal: true
2
+
3
+ ##
4
+ # Usage:
5
+ #
6
+ # ConvenientService::Examples::Rails::Gemfile::Services::StripComments.result(content: "abc")
7
+ #
8
+ module ConvenientService
9
+ module Examples
10
+ module Rails
11
+ module Gemfile
12
+ module Services
13
+ class StripComments
14
+ include RailsService::Config
15
+
16
+ attribute :content, :string
17
+
18
+ validates :content, presence: true
19
+
20
+ alias_method :content_with_comments, :content
21
+
22
+ step Services::AssertNpmPackageAvailable, in: {name: -> { "strip-comments" }}
23
+ step Services::RunShell, in: {command: -> { "node -e '#{js_script}' #{file_with_comments.path} #{file_without_comments.path}" }}
24
+ step :result, in: :file_without_comments, out: :content_without_comments
25
+
26
+ def result
27
+ success(data: {content_without_comments: file_without_comments.read})
28
+ end
29
+
30
+ ##
31
+ # NOTE: When you have no time to do something well, delegate that task to someone who already works with it all the time.
32
+ # That is why `strip-comments` npm package is used to remove comments.
33
+ #
34
+ def js_script
35
+ ##
36
+ # NOTE: `main` function is created in order to have an ability to use early returns.
37
+ #
38
+ # IMPORTANT: Use only double quotes inside this JS script, since it is later consumed by `node -e` option wrapped by single quoutes.
39
+ #
40
+ # TODO: Consider to use WeakRef if memory is a concern.
41
+ # https://ruby-doc.org/stdlib-2.5.1/libdoc/weakref/rdoc/WeakRef.html
42
+ #
43
+ # TODO: Jest tests for JS script.
44
+ #
45
+ @js_script ||= <<~JAVASCRIPT.gsub(/\n\s*/, " ")
46
+ const main = () => {
47
+ const process = require("process");
48
+ const fs = require("fs");
49
+
50
+ /**
51
+ * TODO: try/catch when "strip-comments" is not available.
52
+ */
53
+ const strip = require("strip-comments");
54
+
55
+ const fileWithCommentsPath = process.argv[1];
56
+ const fileWithoutCommentsPath = process.argv[2];
57
+ const language = process.argv[3] || "ruby";
58
+
59
+ if (!fileWithCommentsPath) {
60
+ console.log("Error: Input file path is NOT passed.");
61
+
62
+ process.exit(1);
63
+ }
64
+
65
+ if (!fileWithoutCommentsPath) {
66
+ console.log("Error: Output file path is NOT passed.");
67
+
68
+ process.exit(1);
69
+ }
70
+
71
+ if (!["ruby", "javascript"].includes(language)) {
72
+ console.log("Error: Language " + language + " is NOT supported.");
73
+
74
+ process.exit(1);
75
+ }
76
+
77
+ const fileWithCommentsContent = fs.readFileSync(fileWithCommentsPath, { encoding: "utf8" });
78
+ const fileWithoutCommentsContent = strip(fileWithCommentsContent, { language });
79
+
80
+ fs.writeFileSync(fileWithoutCommentsPath, fileWithoutCommentsContent, { encoding: "utf8" });
81
+
82
+ process.exit(0);
83
+ };
84
+
85
+ main();
86
+ JAVASCRIPT
87
+ end
88
+
89
+ def file_with_comments
90
+ ##
91
+ # NOTE: Tempfile is used to avoid issues with escaping of quotes inside JS script.
92
+ #
93
+ @file_with_comments ||= ::Tempfile.new.tap { |tempfile| tempfile.write(content_with_comments) }.tap(&:close)
94
+ end
95
+
96
+ def file_without_comments
97
+ ##
98
+ # NOTE: JS script tries to fill content of the file without comments.
99
+ #
100
+ @file_without_comments ||= ::Tempfile.new
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "services/run_shell"
4
+ require_relative "services/assert_file_exists"
5
+ require_relative "services/assert_file_not_empty"
6
+ require_relative "services/assert_node_available"
7
+ require_relative "services/assert_npm_package_available"
8
+ require_relative "services/assert_valid_ruby_syntax"
9
+ require_relative "services/read_file_content"
10
+ require_relative "services/strip_comments"
11
+ require_relative "services/parse_content"
12
+ require_relative "services/print_shell_command"
13
+ require_relative "services/format_header"
14
+ require_relative "services/format_gems_without_envs"
15
+ require_relative "services/format_gems_with_envs"
16
+ require_relative "services/format_body"
17
+ require_relative "services/format"