karafka-web 0.11.6 → 1.0.0.beta1

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 (393) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +19 -0
  3. data/Gemfile +3 -2
  4. data/Gemfile.lint +2 -2
  5. data/Gemfile.lint.lock +10 -25
  6. data/Gemfile.lock +64 -87
  7. data/Rakefile +26 -0
  8. data/bin/{balance_specs → balance_tests} +27 -27
  9. data/bin/check_coverage +5 -5
  10. data/bin/collect_timings +33 -37
  11. data/bin/integrations +5 -5
  12. data/bin/rspecs +5 -8
  13. data/bin/{rspecs_parallel → tests_parallel} +32 -19
  14. data/bin/verify_kafka_warnings +2 -0
  15. data/docker-compose.yml +1 -1
  16. data/gulpfile.js +14 -11
  17. data/karafka-web.gemspec +4 -4
  18. data/lib/karafka/web/config.rb +1 -2
  19. data/lib/karafka/web/management/actions/enable.rb +1 -2
  20. data/lib/karafka/web/management/migrations/consumers_reports/1772128000_add_poll_interval_to_subscription_groups.rb +48 -0
  21. data/lib/karafka/web/pro/commanding/commands/base.rb +8 -0
  22. data/lib/karafka/web/pro/commanding/commands/consumers/quiet.rb +8 -0
  23. data/lib/karafka/web/pro/commanding/commands/consumers/stop.rb +8 -0
  24. data/lib/karafka/web/pro/commanding/commands/consumers/trace.rb +8 -0
  25. data/lib/karafka/web/pro/commanding/commands/partitions/pause.rb +8 -0
  26. data/lib/karafka/web/pro/commanding/commands/partitions/resume.rb +8 -0
  27. data/lib/karafka/web/pro/commanding/commands/partitions/seek.rb +8 -0
  28. data/lib/karafka/web/pro/commanding/commands/topics/pause.rb +8 -0
  29. data/lib/karafka/web/pro/commanding/commands/topics/resume.rb +8 -0
  30. data/lib/karafka/web/pro/commanding/config.rb +8 -0
  31. data/lib/karafka/web/pro/commanding/contracts/config.rb +8 -0
  32. data/lib/karafka/web/pro/commanding/dispatcher.rb +8 -0
  33. data/lib/karafka/web/pro/commanding/handlers/partitions/commands/base.rb +8 -0
  34. data/lib/karafka/web/pro/commanding/handlers/partitions/commands/pause.rb +8 -0
  35. data/lib/karafka/web/pro/commanding/handlers/partitions/commands/resume.rb +8 -0
  36. data/lib/karafka/web/pro/commanding/handlers/partitions/commands/seek.rb +8 -0
  37. data/lib/karafka/web/pro/commanding/handlers/partitions/executor.rb +8 -0
  38. data/lib/karafka/web/pro/commanding/handlers/partitions/listener.rb +8 -0
  39. data/lib/karafka/web/pro/commanding/handlers/partitions/tracker.rb +8 -0
  40. data/lib/karafka/web/pro/commanding/handlers/topics/commands/base.rb +8 -0
  41. data/lib/karafka/web/pro/commanding/handlers/topics/commands/pause.rb +8 -0
  42. data/lib/karafka/web/pro/commanding/handlers/topics/commands/resume.rb +8 -0
  43. data/lib/karafka/web/pro/commanding/handlers/topics/executor.rb +8 -0
  44. data/lib/karafka/web/pro/commanding/handlers/topics/listener.rb +8 -0
  45. data/lib/karafka/web/pro/commanding/handlers/topics/tracker.rb +8 -0
  46. data/lib/karafka/web/pro/commanding/listener.rb +8 -0
  47. data/lib/karafka/web/pro/commanding/manager.rb +8 -0
  48. data/lib/karafka/web/pro/commanding/matcher.rb +8 -0
  49. data/lib/karafka/web/pro/commanding/matchers/base.rb +8 -0
  50. data/lib/karafka/web/pro/commanding/matchers/consumer_group_id.rb +8 -0
  51. data/lib/karafka/web/pro/commanding/matchers/message_type.rb +8 -0
  52. data/lib/karafka/web/pro/commanding/matchers/partition_id.rb +8 -0
  53. data/lib/karafka/web/pro/commanding/matchers/process_id.rb +8 -0
  54. data/lib/karafka/web/pro/commanding/matchers/schema_version.rb +8 -0
  55. data/lib/karafka/web/pro/commanding/matchers/topic.rb +8 -0
  56. data/lib/karafka/web/pro/commanding/request.rb +8 -0
  57. data/lib/karafka/web/pro/commanding.rb +8 -0
  58. data/lib/karafka/web/pro/loader.rb +8 -0
  59. data/lib/karafka/web/pro/ui/app.rb +8 -0
  60. data/lib/karafka/web/pro/ui/controllers/base_controller.rb +8 -0
  61. data/lib/karafka/web/pro/ui/controllers/cluster_controller.rb +8 -0
  62. data/lib/karafka/web/pro/ui/controllers/consumers/base_controller.rb +8 -0
  63. data/lib/karafka/web/pro/ui/controllers/consumers/commanding_controller.rb +8 -0
  64. data/lib/karafka/web/pro/ui/controllers/consumers/commands_controller.rb +8 -0
  65. data/lib/karafka/web/pro/ui/controllers/consumers/consumers_controller.rb +8 -0
  66. data/lib/karafka/web/pro/ui/controllers/consumers/controls_controller.rb +8 -0
  67. data/lib/karafka/web/pro/ui/controllers/consumers/jobs_controller.rb +8 -0
  68. data/lib/karafka/web/pro/ui/controllers/consumers/partitions/base_controller.rb +8 -0
  69. data/lib/karafka/web/pro/ui/controllers/consumers/partitions/offsets_controller.rb +8 -0
  70. data/lib/karafka/web/pro/ui/controllers/consumers/partitions/pauses_controller.rb +8 -0
  71. data/lib/karafka/web/pro/ui/controllers/consumers/topics/pauses_controller.rb +8 -0
  72. data/lib/karafka/web/pro/ui/controllers/dashboard_controller.rb +8 -0
  73. data/lib/karafka/web/pro/ui/controllers/dlq_controller.rb +8 -0
  74. data/lib/karafka/web/pro/ui/controllers/errors_controller.rb +8 -0
  75. data/lib/karafka/web/pro/ui/controllers/explorer/base_controller.rb +8 -0
  76. data/lib/karafka/web/pro/ui/controllers/explorer/explorer_controller.rb +11 -0
  77. data/lib/karafka/web/pro/ui/controllers/explorer/messages_controller.rb +16 -1
  78. data/lib/karafka/web/pro/ui/controllers/explorer/search_controller.rb +8 -0
  79. data/lib/karafka/web/pro/ui/controllers/health_controller.rb +8 -0
  80. data/lib/karafka/web/pro/ui/controllers/jobs_controller.rb +8 -0
  81. data/lib/karafka/web/pro/ui/controllers/recurring_tasks_controller.rb +8 -0
  82. data/lib/karafka/web/pro/ui/controllers/routing_controller.rb +8 -0
  83. data/lib/karafka/web/pro/ui/controllers/scheduled_messages/base_controller.rb +8 -0
  84. data/lib/karafka/web/pro/ui/controllers/scheduled_messages/explorer_controller.rb +8 -0
  85. data/lib/karafka/web/pro/ui/controllers/scheduled_messages/messages_controller.rb +8 -0
  86. data/lib/karafka/web/pro/ui/controllers/scheduled_messages/schedules_controller.rb +8 -0
  87. data/lib/karafka/web/pro/ui/controllers/status_controller.rb +8 -0
  88. data/lib/karafka/web/pro/ui/controllers/support_controller.rb +8 -0
  89. data/lib/karafka/web/pro/ui/controllers/topics/base_controller.rb +8 -0
  90. data/lib/karafka/web/pro/ui/controllers/topics/configs_controller.rb +8 -0
  91. data/lib/karafka/web/pro/ui/controllers/topics/distributions_controller.rb +8 -0
  92. data/lib/karafka/web/pro/ui/controllers/topics/offsets_controller.rb +11 -1
  93. data/lib/karafka/web/pro/ui/controllers/topics/replications_controller.rb +8 -0
  94. data/lib/karafka/web/pro/ui/controllers/topics/topics_controller.rb +8 -0
  95. data/lib/karafka/web/pro/ui/controllers/ux_controller.rb +8 -0
  96. data/lib/karafka/web/pro/ui/lib/branding/config.rb +8 -0
  97. data/lib/karafka/web/pro/ui/lib/branding/contracts/config.rb +8 -0
  98. data/lib/karafka/web/pro/ui/lib/branding.rb +8 -0
  99. data/lib/karafka/web/pro/ui/lib/features.rb +8 -0
  100. data/lib/karafka/web/pro/ui/lib/patterns_detector.rb +8 -0
  101. data/lib/karafka/web/pro/ui/lib/policies/config.rb +8 -0
  102. data/lib/karafka/web/pro/ui/lib/policies/contracts/config.rb +8 -0
  103. data/lib/karafka/web/pro/ui/lib/policies/messages.rb +8 -0
  104. data/lib/karafka/web/pro/ui/lib/policies/requests.rb +8 -0
  105. data/lib/karafka/web/pro/ui/lib/policies.rb +8 -0
  106. data/lib/karafka/web/pro/ui/lib/safe_runner.rb +8 -0
  107. data/lib/karafka/web/pro/ui/lib/search/config.rb +8 -0
  108. data/lib/karafka/web/pro/ui/lib/search/contracts/config.rb +8 -0
  109. data/lib/karafka/web/pro/ui/lib/search/contracts/form.rb +8 -0
  110. data/lib/karafka/web/pro/ui/lib/search/matchers/base.rb +8 -0
  111. data/lib/karafka/web/pro/ui/lib/search/matchers/raw_header_includes.rb +8 -0
  112. data/lib/karafka/web/pro/ui/lib/search/matchers/raw_key_includes.rb +8 -0
  113. data/lib/karafka/web/pro/ui/lib/search/matchers/raw_payload_includes.rb +8 -0
  114. data/lib/karafka/web/pro/ui/lib/search/normalizer.rb +8 -0
  115. data/lib/karafka/web/pro/ui/lib/search/runner.rb +9 -2
  116. data/lib/karafka/web/pro/ui/lib/search.rb +8 -0
  117. data/lib/karafka/web/pro/ui/routes/base.rb +8 -0
  118. data/lib/karafka/web/pro/ui/routes/cluster.rb +8 -0
  119. data/lib/karafka/web/pro/ui/routes/consumers.rb +8 -0
  120. data/lib/karafka/web/pro/ui/routes/dashboard.rb +8 -0
  121. data/lib/karafka/web/pro/ui/routes/dlq.rb +8 -0
  122. data/lib/karafka/web/pro/ui/routes/errors.rb +8 -0
  123. data/lib/karafka/web/pro/ui/routes/explorer.rb +8 -0
  124. data/lib/karafka/web/pro/ui/routes/health.rb +8 -0
  125. data/lib/karafka/web/pro/ui/routes/jobs.rb +8 -0
  126. data/lib/karafka/web/pro/ui/routes/recurring_tasks.rb +8 -0
  127. data/lib/karafka/web/pro/ui/routes/routing.rb +8 -0
  128. data/lib/karafka/web/pro/ui/routes/scheduled_messages.rb +8 -0
  129. data/lib/karafka/web/pro/ui/routes/status.rb +8 -0
  130. data/lib/karafka/web/pro/ui/routes/support.rb +8 -0
  131. data/lib/karafka/web/pro/ui/routes/topics.rb +8 -0
  132. data/lib/karafka/web/pro/ui/routes/ux.rb +8 -0
  133. data/lib/karafka/web/pro/ui/views/cluster/_breadcrumbs.erb +6 -0
  134. data/lib/karafka/web/pro/ui/views/cluster/_broker.erb +6 -0
  135. data/lib/karafka/web/pro/ui/views/cluster/_config.erb +6 -0
  136. data/lib/karafka/web/pro/ui/views/cluster/_tabs.erb +6 -0
  137. data/lib/karafka/web/pro/ui/views/cluster/index.erb +6 -0
  138. data/lib/karafka/web/pro/ui/views/cluster/show.erb +6 -0
  139. data/lib/karafka/web/pro/ui/views/consumers/commands/_backtrace.erb +6 -0
  140. data/lib/karafka/web/pro/ui/views/consumers/commands/_breadcrumbs.erb +6 -0
  141. data/lib/karafka/web/pro/ui/views/consumers/commands/_command.erb +6 -0
  142. data/lib/karafka/web/pro/ui/views/consumers/commands/_command_details.erb +6 -0
  143. data/lib/karafka/web/pro/ui/views/consumers/commands/_empty.erb +6 -0
  144. data/lib/karafka/web/pro/ui/views/consumers/commands/_incompatible_command.erb +6 -0
  145. data/lib/karafka/web/pro/ui/views/consumers/commands/_incompatible_schema.erb +6 -0
  146. data/lib/karafka/web/pro/ui/views/consumers/commands/_table.erb +6 -0
  147. data/lib/karafka/web/pro/ui/views/consumers/commands/details/_acceptance.erb +6 -0
  148. data/lib/karafka/web/pro/ui/views/consumers/commands/details/_request.erb +6 -0
  149. data/lib/karafka/web/pro/ui/views/consumers/commands/details/_result.erb +6 -0
  150. data/lib/karafka/web/pro/ui/views/consumers/commands/index.erb +6 -0
  151. data/lib/karafka/web/pro/ui/views/consumers/commands/metadata/_request.erb +6 -0
  152. data/lib/karafka/web/pro/ui/views/consumers/commands/metadata/_response.erb +6 -0
  153. data/lib/karafka/web/pro/ui/views/consumers/commands/rows/_command_name_badge.erb +6 -0
  154. data/lib/karafka/web/pro/ui/views/consumers/commands/rows/_request.erb +6 -0
  155. data/lib/karafka/web/pro/ui/views/consumers/commands/rows/_response.erb +6 -0
  156. data/lib/karafka/web/pro/ui/views/consumers/commands/show.erb +6 -0
  157. data/lib/karafka/web/pro/ui/views/consumers/consumers/_breadcrumbs.erb +6 -0
  158. data/lib/karafka/web/pro/ui/views/consumers/consumers/_consumer.erb +6 -0
  159. data/lib/karafka/web/pro/ui/views/consumers/consumers/_consumer_performance.erb +6 -0
  160. data/lib/karafka/web/pro/ui/views/consumers/consumers/_tabs.erb +6 -0
  161. data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_commands.erb +6 -3
  162. data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_consumer_group.erb +6 -0
  163. data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_metrics.erb +6 -0
  164. data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_no_subscriptions.erb +6 -0
  165. data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_partition.erb +6 -0
  166. data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_partition_edit_options.erb +6 -0
  167. data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_stopped.erb +6 -0
  168. data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_subscription_group.erb +6 -0
  169. data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_tabs.erb +6 -0
  170. data/lib/karafka/web/pro/ui/views/consumers/consumers/details.erb +6 -0
  171. data/lib/karafka/web/pro/ui/views/consumers/consumers/index.erb +6 -0
  172. data/lib/karafka/web/pro/ui/views/consumers/consumers/performance.erb +6 -0
  173. data/lib/karafka/web/pro/ui/views/consumers/consumers/subscriptions.erb +6 -0
  174. data/lib/karafka/web/pro/ui/views/consumers/controls/_breadcrumbs.erb +6 -0
  175. data/lib/karafka/web/pro/ui/views/consumers/controls/_controls.erb +6 -4
  176. data/lib/karafka/web/pro/ui/views/consumers/controls/index.erb +6 -2
  177. data/lib/karafka/web/pro/ui/views/consumers/jobs/_breadcrumbs.erb +6 -0
  178. data/lib/karafka/web/pro/ui/views/consumers/jobs/_job.erb +6 -0
  179. data/lib/karafka/web/pro/ui/views/consumers/jobs/_no_jobs.erb +6 -0
  180. data/lib/karafka/web/pro/ui/views/consumers/jobs/pending.erb +6 -0
  181. data/lib/karafka/web/pro/ui/views/consumers/jobs/running.erb +6 -0
  182. data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_basics.erb +6 -0
  183. data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_breadcrumbs.erb +6 -0
  184. data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_form.erb +6 -1
  185. data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_not_running_error.erb +6 -0
  186. data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_running_warning.erb +6 -0
  187. data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/edit.erb +6 -0
  188. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_active_not_editable.erb +6 -0
  189. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_adjusting_warning.erb +6 -0
  190. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_breadcrumbs.erb +6 -0
  191. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_edit_form.erb +6 -1
  192. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_lrj_not_manageable.erb +6 -0
  193. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_new_form.erb +6 -2
  194. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_not_running.erb +6 -0
  195. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_partition_info.erb +6 -0
  196. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/edit.erb +6 -0
  197. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/new.erb +6 -0
  198. data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_adjusting_warning.erb +6 -0
  199. data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_breadcrumbs.erb +6 -0
  200. data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_edit_form.erb +6 -1
  201. data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_lrj_not_manageable.erb +6 -0
  202. data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_new_form.erb +6 -2
  203. data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_not_running.erb +6 -0
  204. data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_topic_info.erb +6 -0
  205. data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/edit.erb +6 -0
  206. data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/new.erb +6 -0
  207. data/lib/karafka/web/pro/ui/views/dashboard/index.erb +6 -0
  208. data/lib/karafka/web/pro/ui/views/dlq/_breadcrumbs.erb +6 -0
  209. data/lib/karafka/web/pro/ui/views/dlq/_no_topics.erb +6 -0
  210. data/lib/karafka/web/pro/ui/views/dlq/_topic.erb +6 -0
  211. data/lib/karafka/web/pro/ui/views/dlq/index.erb +6 -0
  212. data/lib/karafka/web/pro/ui/views/errors/_breadcrumbs.erb +6 -0
  213. data/lib/karafka/web/pro/ui/views/errors/_error.erb +6 -0
  214. data/lib/karafka/web/pro/ui/views/errors/_partition_option.erb +6 -0
  215. data/lib/karafka/web/pro/ui/views/errors/_selector.erb +6 -0
  216. data/lib/karafka/web/pro/ui/views/errors/_table.erb +6 -0
  217. data/lib/karafka/web/pro/ui/views/errors/index.erb +6 -0
  218. data/lib/karafka/web/pro/ui/views/errors/partition.erb +6 -0
  219. data/lib/karafka/web/pro/ui/views/errors/show.erb +6 -0
  220. data/lib/karafka/web/pro/ui/views/explorer/explorer/_breadcrumbs.erb +6 -0
  221. data/lib/karafka/web/pro/ui/views/explorer/explorer/_failed_deserialization.erb +6 -0
  222. data/lib/karafka/web/pro/ui/views/explorer/explorer/_filtered.erb +6 -0
  223. data/lib/karafka/web/pro/ui/views/explorer/explorer/_message.erb +6 -0
  224. data/lib/karafka/web/pro/ui/views/explorer/explorer/_no_topics.erb +6 -0
  225. data/lib/karafka/web/pro/ui/views/explorer/explorer/_partition_option.erb +6 -0
  226. data/lib/karafka/web/pro/ui/views/explorer/explorer/_selector.erb +6 -0
  227. data/lib/karafka/web/pro/ui/views/explorer/explorer/_topic.erb +6 -0
  228. data/lib/karafka/web/pro/ui/views/explorer/explorer/index.erb +6 -0
  229. data/lib/karafka/web/pro/ui/views/explorer/explorer/message/_metadata.erb +6 -0
  230. data/lib/karafka/web/pro/ui/views/explorer/explorer/message/_payload.erb +15 -2
  231. data/lib/karafka/web/pro/ui/views/explorer/explorer/message/_resources_utilization.erb +6 -0
  232. data/lib/karafka/web/pro/ui/views/explorer/explorer/message/_too_big_to_be_displayed.erb +6 -0
  233. data/lib/karafka/web/pro/ui/views/explorer/explorer/messages/_detail.erb +6 -0
  234. data/lib/karafka/web/pro/ui/views/explorer/explorer/messages/_headers.erb +6 -0
  235. data/lib/karafka/web/pro/ui/views/explorer/explorer/messages/_key.erb +6 -0
  236. data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_cleaned.erb +6 -0
  237. data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_empty.erb +6 -0
  238. data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_messages.erb +6 -0
  239. data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_time_selector.erb +6 -0
  240. data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_timestamp_selector.erb +6 -0
  241. data/lib/karafka/web/pro/ui/views/explorer/explorer/partition.erb +6 -0
  242. data/lib/karafka/web/pro/ui/views/explorer/explorer/show.erb +7 -2
  243. data/lib/karafka/web/pro/ui/views/explorer/explorer/topic/_actions.erb +6 -0
  244. data/lib/karafka/web/pro/ui/views/explorer/explorer/topic/_empty.erb +6 -0
  245. data/lib/karafka/web/pro/ui/views/explorer/explorer/topic/_limited.erb +6 -0
  246. data/lib/karafka/web/pro/ui/views/explorer/explorer/topic.erb +6 -0
  247. data/lib/karafka/web/pro/ui/views/explorer/messages/_breadcrumbs.erb +6 -0
  248. data/lib/karafka/web/pro/ui/views/explorer/messages/forward.erb +6 -2
  249. data/lib/karafka/web/pro/ui/views/explorer/search/_breadcrumbs.erb +6 -0
  250. data/lib/karafka/web/pro/ui/views/explorer/search/_fix_errors.erb +6 -0
  251. data/lib/karafka/web/pro/ui/views/explorer/search/_metadata.erb +6 -0
  252. data/lib/karafka/web/pro/ui/views/explorer/search/_no_results.erb +6 -0
  253. data/lib/karafka/web/pro/ui/views/explorer/search/_no_search_criteria.erb +6 -0
  254. data/lib/karafka/web/pro/ui/views/explorer/search/_search_criteria.erb +6 -0
  255. data/lib/karafka/web/pro/ui/views/explorer/search/_search_modal.erb +6 -0
  256. data/lib/karafka/web/pro/ui/views/explorer/search/_timeout.erb +6 -0
  257. data/lib/karafka/web/pro/ui/views/explorer/search/index.erb +6 -0
  258. data/lib/karafka/web/pro/ui/views/health/_breadcrumbs.erb +6 -0
  259. data/lib/karafka/web/pro/ui/views/health/_no_data.erb +6 -0
  260. data/lib/karafka/web/pro/ui/views/health/_no_partition_data.erb +6 -0
  261. data/lib/karafka/web/pro/ui/views/health/_partition.erb +6 -0
  262. data/lib/karafka/web/pro/ui/views/health/_partition_lags.erb +6 -0
  263. data/lib/karafka/web/pro/ui/views/health/_partition_offset.erb +6 -0
  264. data/lib/karafka/web/pro/ui/views/health/_partition_times.erb +6 -0
  265. data/lib/karafka/web/pro/ui/views/health/_partitions_with_fallback.erb +6 -0
  266. data/lib/karafka/web/pro/ui/views/health/_table_metadata.erb +6 -0
  267. data/lib/karafka/web/pro/ui/views/health/_tabs.erb +6 -0
  268. data/lib/karafka/web/pro/ui/views/health/_topic_edit_options.erb +6 -0
  269. data/lib/karafka/web/pro/ui/views/health/changes.erb +6 -0
  270. data/lib/karafka/web/pro/ui/views/health/cluster_lags.erb +6 -0
  271. data/lib/karafka/web/pro/ui/views/health/lags.erb +6 -0
  272. data/lib/karafka/web/pro/ui/views/health/offsets.erb +6 -0
  273. data/lib/karafka/web/pro/ui/views/health/overview.erb +6 -0
  274. data/lib/karafka/web/pro/ui/views/jobs/_job.erb +6 -0
  275. data/lib/karafka/web/pro/ui/views/jobs/_no_jobs.erb +6 -0
  276. data/lib/karafka/web/pro/ui/views/jobs/pending.erb +6 -0
  277. data/lib/karafka/web/pro/ui/views/jobs/running.erb +6 -0
  278. data/lib/karafka/web/pro/ui/views/recurring_tasks/_actions.erb +6 -3
  279. data/lib/karafka/web/pro/ui/views/recurring_tasks/_batch_actions.erb +6 -3
  280. data/lib/karafka/web/pro/ui/views/recurring_tasks/_breadcrumbs.erb +6 -0
  281. data/lib/karafka/web/pro/ui/views/recurring_tasks/_log.erb +6 -0
  282. data/lib/karafka/web/pro/ui/views/recurring_tasks/_not_active.erb +6 -0
  283. data/lib/karafka/web/pro/ui/views/recurring_tasks/_tabs.erb +6 -0
  284. data/lib/karafka/web/pro/ui/views/recurring_tasks/_task.erb +6 -0
  285. data/lib/karafka/web/pro/ui/views/recurring_tasks/logs.erb +6 -0
  286. data/lib/karafka/web/pro/ui/views/recurring_tasks/schedule.erb +6 -0
  287. data/lib/karafka/web/pro/ui/views/routing/_consumer_group.erb +6 -0
  288. data/lib/karafka/web/pro/ui/views/routing/_detail.erb +6 -0
  289. data/lib/karafka/web/pro/ui/views/routing/_topic.erb +6 -0
  290. data/lib/karafka/web/pro/ui/views/routing/index.erb +6 -0
  291. data/lib/karafka/web/pro/ui/views/routing/show.erb +6 -0
  292. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/_breadcrumbs.erb +6 -0
  293. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/_key.erb +6 -0
  294. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/_message.erb +6 -0
  295. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/_messages.erb +6 -0
  296. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/message/_cancel.erb +6 -0
  297. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/message/_compacted.erb +6 -0
  298. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/message/_schedule.erb +6 -1
  299. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/message/_tombstone.erb +6 -0
  300. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/message/_unknown.erb +6 -0
  301. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/partition.erb +6 -0
  302. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/topic.erb +6 -0
  303. data/lib/karafka/web/pro/ui/views/scheduled_messages/schedules/_breadcrumbs.erb +6 -0
  304. data/lib/karafka/web/pro/ui/views/scheduled_messages/schedules/_no_groups.erb +6 -0
  305. data/lib/karafka/web/pro/ui/views/scheduled_messages/schedules/index.erb +6 -0
  306. data/lib/karafka/web/pro/ui/views/scheduled_messages/schedules/show.erb +6 -0
  307. data/lib/karafka/web/pro/ui/views/shared/_navigation.erb +6 -0
  308. data/lib/karafka/web/pro/ui/views/shared/_rdkafka_form_error_alert_box.erb +6 -0
  309. data/lib/karafka/web/pro/ui/views/shared/branding/_label.erb +6 -0
  310. data/lib/karafka/web/pro/ui/views/shared/branding/_notice.erb +6 -0
  311. data/lib/karafka/web/pro/ui/views/topics/configs/_breadcrumbs.erb +6 -0
  312. data/lib/karafka/web/pro/ui/views/topics/configs/_config.erb +6 -0
  313. data/lib/karafka/web/pro/ui/views/topics/configs/_delete_button.erb +6 -0
  314. data/lib/karafka/web/pro/ui/views/topics/configs/_edit_form.erb +6 -1
  315. data/lib/karafka/web/pro/ui/views/topics/configs/_edit_plan.erb +6 -0
  316. data/lib/karafka/web/pro/ui/views/topics/configs/_edit_warning.erb +6 -0
  317. data/lib/karafka/web/pro/ui/views/topics/configs/edit.erb +6 -0
  318. data/lib/karafka/web/pro/ui/views/topics/configs/index.erb +6 -0
  319. data/lib/karafka/web/pro/ui/views/topics/distributions/_add_partitions_button.erb +6 -0
  320. data/lib/karafka/web/pro/ui/views/topics/distributions/_badges.erb +6 -0
  321. data/lib/karafka/web/pro/ui/views/topics/distributions/_breadcrumbs.erb +6 -0
  322. data/lib/karafka/web/pro/ui/views/topics/distributions/_chart.erb +6 -0
  323. data/lib/karafka/web/pro/ui/views/topics/distributions/_edit_form.erb +6 -1
  324. data/lib/karafka/web/pro/ui/views/topics/distributions/_edit_hints.erb +6 -0
  325. data/lib/karafka/web/pro/ui/views/topics/distributions/_edit_warnings.erb +6 -0
  326. data/lib/karafka/web/pro/ui/views/topics/distributions/_empty_partitions.erb +9 -1
  327. data/lib/karafka/web/pro/ui/views/topics/distributions/_limited.erb +6 -0
  328. data/lib/karafka/web/pro/ui/views/topics/distributions/_partition.erb +6 -0
  329. data/lib/karafka/web/pro/ui/views/topics/distributions/edit.erb +6 -0
  330. data/lib/karafka/web/pro/ui/views/topics/distributions/show.erb +6 -0
  331. data/lib/karafka/web/pro/ui/views/topics/offsets/_breadcrumbs.erb +6 -0
  332. data/lib/karafka/web/pro/ui/views/topics/offsets/_partition.erb +6 -0
  333. data/lib/karafka/web/pro/ui/views/topics/offsets/show.erb +6 -0
  334. data/lib/karafka/web/pro/ui/views/topics/replications/_breadcrumbs.erb +6 -0
  335. data/lib/karafka/web/pro/ui/views/topics/replications/_metric_box.erb +6 -0
  336. data/lib/karafka/web/pro/ui/views/topics/replications/_partition.erb +6 -0
  337. data/lib/karafka/web/pro/ui/views/topics/replications/_replication_info.erb +6 -0
  338. data/lib/karafka/web/pro/ui/views/topics/replications/_resilience_success.erb +6 -0
  339. data/lib/karafka/web/pro/ui/views/topics/replications/_warning_low_durability.erb +6 -0
  340. data/lib/karafka/web/pro/ui/views/topics/replications/_warning_no_redundancy.erb +6 -0
  341. data/lib/karafka/web/pro/ui/views/topics/replications/_warning_zero_fault_tolerance.erb +6 -0
  342. data/lib/karafka/web/pro/ui/views/topics/replications/show.erb +6 -0
  343. data/lib/karafka/web/pro/ui/views/topics/topics/_breadcrumbs.erb +6 -0
  344. data/lib/karafka/web/pro/ui/views/topics/topics/_create_button.erb +6 -0
  345. data/lib/karafka/web/pro/ui/views/topics/topics/_create_hints.erb +6 -0
  346. data/lib/karafka/web/pro/ui/views/topics/topics/_delete_form.erb +6 -1
  347. data/lib/karafka/web/pro/ui/views/topics/topics/_delete_hints.erb +6 -0
  348. data/lib/karafka/web/pro/ui/views/topics/topics/_delete_warning.erb +6 -0
  349. data/lib/karafka/web/pro/ui/views/topics/topics/_new_form.erb +6 -2
  350. data/lib/karafka/web/pro/ui/views/topics/topics/_tabs.erb +6 -0
  351. data/lib/karafka/web/pro/ui/views/topics/topics/_topic.erb +6 -0
  352. data/lib/karafka/web/pro/ui/views/topics/topics/edit.erb +6 -0
  353. data/lib/karafka/web/pro/ui/views/topics/topics/index.erb +6 -0
  354. data/lib/karafka/web/pro/ui/views/topics/topics/new.erb +6 -0
  355. data/lib/karafka/web/processing/time_series_tracker.rb +1 -2
  356. data/lib/karafka/web/producer.rb +2 -1
  357. data/lib/karafka/web/tracking/consumers/contracts/report.rb +1 -1
  358. data/lib/karafka/web/tracking/consumers/contracts/subscription_group.rb +1 -0
  359. data/lib/karafka/web/tracking/consumers/listeners/connections.rb +6 -1
  360. data/lib/karafka/web/tracking/consumers/listeners/tags.rb +1 -2
  361. data/lib/karafka/web/tracking/consumers/sampler/enrichers/consumer_groups.rb +1 -0
  362. data/lib/karafka/web/tracking/consumers/sampler/metrics/jobs.rb +14 -5
  363. data/lib/karafka/web/tracking/consumers/sampler/metrics/os.rb +1 -2
  364. data/lib/karafka/web/tracking/consumers/sampler/metrics/server.rb +2 -1
  365. data/lib/karafka/web/tracking/consumers/sampler.rb +10 -4
  366. data/lib/karafka/web/ui/base.rb +6 -3
  367. data/lib/karafka/web/ui/lib/admin.rb +2 -1
  368. data/lib/karafka/web/ui/lib/hash_proxy.rb +1 -2
  369. data/lib/karafka/web/ui/models/counters.rb +23 -25
  370. data/lib/karafka/web/ui/models/message.rb +1 -2
  371. data/lib/karafka/web/ui/models/recurring_tasks/schedule.rb +1 -2
  372. data/lib/karafka/web/ui/models/status/checks/base.rb +1 -2
  373. data/lib/karafka/web/ui/models/status/context.rb +12 -0
  374. data/lib/karafka/web/ui/models/topic.rb +3 -1
  375. data/lib/karafka/web/ui/public/javascripts/application.min.js +6 -7
  376. data/lib/karafka/web/ui/public/javascripts/application.min.js.br +0 -0
  377. data/lib/karafka/web/ui/public/javascripts/application.min.js.gz +0 -0
  378. data/lib/karafka/web/ui/public/stylesheets/application.min.css +183 -211
  379. data/lib/karafka/web/ui/public/stylesheets/application.min.css.br +0 -0
  380. data/lib/karafka/web/ui/public/stylesheets/application.min.css.gz +0 -0
  381. data/lib/karafka/web/ui/public/stylesheets/libs/highlight_dark.min.css.gz +0 -0
  382. data/lib/karafka/web/ui/public/stylesheets/libs/highlight_light.min.css.gz +0 -0
  383. data/lib/karafka/web/ui/views/consumers/_assignments_badges.erb +0 -1
  384. data/lib/karafka/web/ui/views/ux/_data_table.erb +5 -5
  385. data/lib/karafka/web/ui/views/ux/_pagination.erb +4 -4
  386. data/lib/karafka/web/ui/views/ux/_tabs.erb +3 -3
  387. data/lib/karafka/web/ui/views/ux/_topic_tiles.erb +4 -4
  388. data/lib/karafka/web/version.rb +1 -1
  389. data/lib/karafka/web.rb +0 -1
  390. data/package-lock.json +748 -697
  391. data/package.json +2 -3
  392. data/renovate.json +25 -3
  393. metadata +19 -18
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5377e1f7c20ed732850895389e9e47be86f94c85068fe363fab13fb52d4f12a4
4
- data.tar.gz: f774171188b56858db87e66088436f88dc4d36460743d29152cb3b3fcc7119b2
3
+ metadata.gz: 27e32327bc795732ee58f5dc757bd1fbe1dbc24198a8561f67cffbb48c5a4eb3
4
+ data.tar.gz: 81bb5e628233f6acf7d9cf0527ed07517271cc87f4b19cef925dd2e4e3887ef0
5
5
  SHA512:
6
- metadata.gz: 494a61a08bf0fd768827c05add65ad3d6d13f9e50140d37b25cf9faf9c8f2eecc1b6033612d377fd9cde6fe9d2004817ffa4e1ce8fea1fb24363ca845f979c69
7
- data.tar.gz: 3c55088e048fe5a8a861a09d2dabdbea6d4e47423949d3927de646456a5f891628858c377c0bb636e34545d512d3a01887cc25dc55c37bf3904ccc79b3b918de
6
+ metadata.gz: 935b6515910e2eaf6871c5cb00920cda705935d06449de61410e941dfdb185c7437a2e7fa388244997dcb338efd0221ad7cf9c9e207d0b2fa4237fd9f63166e0
7
+ data.tar.gz: 9d3fe3b1c638b6a72b729464a2dc5178202fe9158f88aa3d5c692498d82eda3e65760141d5233e43e7bfd083ecd68bbaf2881f97db6a828825498e1771b4bdcf
data/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # Karafka Web Changelog
2
2
 
3
+ ## 1.0.0 (Unreleased)
4
+ - [Fix] Add `initialize` to `Status::Context` that defines all instance variables upfront in a consistent order, giving every instance the same Ruby object shape and eliminating the `:performance` shape-variation warning.
5
+ - [Enhancement] Add `Warning.process` block to the test helper to turn Ruby warnings originating from the project code into test failures.
6
+ - [Enhancement] Enable all opt-in Ruby warning categories in the test helper via `Warning.categories` (available since Ruby 3.4), so any new categories added in future Ruby versions are automatically enabled without code changes.
7
+ - [Enhancement] Replace sequential per-partition `query_watermark_offsets` consumer calls in `Counters#estimate_errors_count` with a single targeted `topic_info` metadata call followed by a batch `read_watermark_offsets` admin call. This eliminates the consumer connection overhead and reduces Kafka roundtrips from up to N+1 sequential calls to 3 regardless of partition count.
8
+ - [Enhancement] Allow for zero value in number of workers to support dynamic scaling of Karafka workers.
9
+ - [Enhancement] Align concurrency tracking with dynamic thread pool scaling. Workers count is now read from `Karafka::Server.workers.size` instead of the static `Karafka::App.config.concurrency`, so the Web UI accurately reflects runtime thread pool changes.
10
+ - [Enhancement] Track `poll_interval` (max.poll.interval.ms) per subscription group alongside `poll_age` to help users monitor how close they are to the polling timeout limit. Consumer schema version bumped to 1.7.0.
11
+ - [Enhancement] Replace token-based CSRF protection (`route_csrf` plugin) with header-based protection using `Sec-Fetch-Site` header (`sec_fetch_site_csrf` plugin). This eliminates the need for CSRF tokens by leveraging browser-enforced headers that cannot be forged from cross-origin requests. Modern browsers automatically include this header, providing simpler and more robust CSRF protection.
12
+ - [Enhancement] Include a short spec file hash in generated test topic names for traceability. Topic names now follow the `it-{hash}-{uuid}` format, making it easy to identify which test file created a given topic in Kafka logs.
13
+ - [Change] Require Roda `>= 3.100` (previously `~> 3.69`).
14
+ - [Fix] Accept (and ignore) a block in `Karafka::Web::Producer#__getobj__` to silence Ruby 3.4's `strict_unused_block` warning emitted via `SimpleDelegator#method_missing` on every delegated producer call.
15
+ - [Fix] Remove `cgi` as no longer needed.
16
+ - [Fix] Exclude `test/` directory from gem releases to reduce package size.
17
+ - [Fix] Update LinksValidator regexes to match the new `it-{hash}-{uuid}` test topic naming format, fixing test-order dependent failures in explorer controller specs.
18
+ - [Fix] Fix alerts formatting for the distribution view.
19
+ - [Fix] Fix 500 error in the Pro Explorer when a message payload parses as valid JSON but contains strings with invalid UTF-8 byte sequences. `JSON.pretty_generate` would raise `JSON::GeneratorError` outside of any error boundary and propagate as an unhandled 500. The pretty-print step is now wrapped in a dedicated `@safe_pretty_payload` SafeRunner; on failure the raw bytes are displayed alongside a deserialization warning.
20
+ - [Fix] Fix 500 error in the Pro Explorer message JSON export when a payload deserializes correctly but cannot be serialized back to JSON (for example when it contains strings with invalid UTF-8 byte sequences). The export endpoint now responds with 404 in such cases and the export action button is no longer rendered for such messages.
21
+
3
22
  ## 0.11.6 (2026-02-01)
4
23
  - **[Feature]** Provide ability to pause/resume all partitions of a topic at once across all consumer processes via the Health Overview page (Pro). Topic-level commands are broadcast to all processes, and each process applies the command to partitions it owns within the specified consumer group. This simplifies bulk operations compared to pausing/resuming individual partitions one by one.
5
24
  - [Enhancement] Optimize partition command tracker to use index-based lookup instead of iterating over 10,000 partitions during rebalance events. The tracker now maintains a partition index for O(n) lookups where n is the number of partitions with pending commands.
data/Gemfile CHANGED
@@ -6,12 +6,13 @@ gemspec
6
6
 
7
7
  group :test do
8
8
  gem "byebug"
9
- gem "factory_bot"
10
9
  gem "fugit"
10
+ gem "mocha"
11
11
  # Needed for links extraction for visits verification
12
12
  gem "nokogiri"
13
13
  gem "ostruct"
14
14
  gem "rack-test"
15
- gem "rspec"
15
+ gem "minitest"
16
16
  gem "simplecov"
17
+ gem "warning"
17
18
  end
data/Gemfile.lint CHANGED
@@ -9,6 +9,6 @@ gem "yard-lint"
9
9
  gem "standard"
10
10
  gem "standard-performance"
11
11
  gem "rubocop-performance"
12
- gem "rubocop-rspec"
13
- gem "standard-rspec"
12
+ gem "rubocop-minitest"
13
+ gem "standard-minitest"
14
14
  gem "rubocop-thread_safety"
data/Gemfile.lint.lock CHANGED
@@ -27,23 +27,14 @@ GEM
27
27
  rubocop-ast (1.49.0)
28
28
  parser (>= 3.3.7.2)
29
29
  prism (~> 1.7)
30
- rubocop-capybara (2.22.1)
30
+ rubocop-minitest (0.39.1)
31
31
  lint_roller (~> 1.1)
32
- rubocop (~> 1.72, >= 1.72.1)
33
- rubocop-factory_bot (2.28.0)
34
- lint_roller (~> 1.1)
35
- rubocop (~> 1.72, >= 1.72.1)
32
+ rubocop (>= 1.75.0, < 2.0)
33
+ rubocop-ast (>= 1.38.0, < 2.0)
36
34
  rubocop-performance (1.26.1)
37
35
  lint_roller (~> 1.1)
38
36
  rubocop (>= 1.75.0, < 2.0)
39
37
  rubocop-ast (>= 1.47.1, < 2.0)
40
- rubocop-rspec (3.9.0)
41
- lint_roller (~> 1.1)
42
- rubocop (~> 1.81)
43
- rubocop-rspec_rails (2.32.0)
44
- lint_roller (~> 1.1)
45
- rubocop (~> 1.72, >= 1.72.1)
46
- rubocop-rspec (~> 3.5)
47
38
  rubocop-thread_safety (0.7.3)
48
39
  lint_roller (~> 1.1)
49
40
  rubocop (~> 1.72, >= 1.72.1)
@@ -58,15 +49,12 @@ GEM
58
49
  standard-custom (1.0.2)
59
50
  lint_roller (~> 1.0)
60
51
  rubocop (~> 1.50)
52
+ standard-minitest (1.0.0)
53
+ lint_roller (~> 1.0)
54
+ rubocop-minitest
61
55
  standard-performance (1.9.0)
62
56
  lint_roller (~> 1.1)
63
57
  rubocop-performance (~> 1.26.0)
64
- standard-rspec (0.3.1)
65
- lint_roller (>= 1.0)
66
- rubocop-capybara (~> 2.22)
67
- rubocop-factory_bot (~> 2.27)
68
- rubocop-rspec (~> 3.5)
69
- rubocop-rspec_rails (~> 2.31)
70
58
  unicode-display_width (3.2.0)
71
59
  unicode-emoji (~> 4.1)
72
60
  unicode-emoji (4.2.0)
@@ -81,12 +69,12 @@ PLATFORMS
81
69
  x86_64-linux
82
70
 
83
71
  DEPENDENCIES
72
+ rubocop-minitest
84
73
  rubocop-performance
85
- rubocop-rspec
86
74
  rubocop-thread_safety
87
75
  standard
76
+ standard-minitest
88
77
  standard-performance
89
- standard-rspec
90
78
  yard-lint
91
79
 
92
80
  CHECKSUMS
@@ -102,17 +90,14 @@ CHECKSUMS
102
90
  regexp_parser (2.11.3) sha256=ca13f381a173b7a93450e53459075c9b76a10433caadcb2f1180f2c741fc55a4
103
91
  rubocop (1.82.1) sha256=09f1a6a654a960eda767aebea33e47603080f8e9c9a3f019bf9b94c9cab5e273
104
92
  rubocop-ast (1.49.0) sha256=49c3676d3123a0923d333e20c6c2dbaaae2d2287b475273fddee0c61da9f71fd
105
- rubocop-capybara (2.22.1) sha256=ced88caef23efea53f46e098ff352f8fc1068c649606ca75cb74650970f51c0c
106
- rubocop-factory_bot (2.28.0) sha256=4b17fc02124444173317e131759d195b0d762844a71a29fe8139c1105d92f0cb
93
+ rubocop-minitest (0.39.1) sha256=998398d6da4026d297f0f9bf709a1eac5f2b6947c24431f94af08138510cf7ed
107
94
  rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834
108
- rubocop-rspec (3.9.0) sha256=8fa70a3619408237d789aeecfb9beef40576acc855173e60939d63332fdb55e2
109
- rubocop-rspec_rails (2.32.0) sha256=4a0d641c72f6ebb957534f539d9d0a62c47abd8ce0d0aeee1ef4701e892a9100
110
95
  rubocop-thread_safety (0.7.3) sha256=067cdd52fbf5deffc18995437e45b5194236eaff4f71de3375a1f6052e48f431
111
96
  ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
112
97
  standard (1.53.0) sha256=f3c9493385db7079d0abce6f7582f553122156997b81258cd361d3480eeacf9c
113
98
  standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b
99
+ standard-minitest (1.0.0) sha256=450caa86a64a6e6f6f186cc88601dbb49b6cfaa3b0dce77a73b50ba8cdc15b2a
114
100
  standard-performance (1.9.0) sha256=49483d31be448292951d80e5e67cdcb576c2502103c7b40aec6f1b6e9c88e3f2
115
- standard-rspec (0.3.1) sha256=67bc957281cacf24f0d88235ca1bf28a8995265b1a60eb519cd0451858b56a22
116
101
  unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42
117
102
  unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f
118
103
  yard (0.9.38) sha256=721fb82afb10532aa49860655f6cc2eaa7130889df291b052e1e6b268283010f
data/Gemfile.lock CHANGED
@@ -1,95 +1,79 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- karafka-web (0.11.6)
4
+ karafka-web (1.0.0.beta1)
5
5
  erubi (~> 1.4)
6
- karafka (>= 2.5.2, < 2.6.0)
7
- karafka-core (>= 2.5.0, < 2.6.0)
8
- roda (~> 3.69, >= 3.69)
6
+ karafka (>= 2.5.10.rc1, < 2.7.0)
7
+ karafka-core (>= 2.5.0, < 2.7.0)
8
+ roda (>= 3.100, < 4.0)
9
9
  tilt (~> 2.0)
10
10
 
11
11
  GEM
12
12
  remote: https://rubygems.org/
13
13
  specs:
14
- activesupport (8.1.1)
15
- base64
16
- bigdecimal
17
- concurrent-ruby (~> 1.0, >= 1.3.1)
18
- connection_pool (>= 2.2.5)
19
- drb
20
- i18n (>= 1.6, < 2)
21
- json
22
- logger (>= 1.4.2)
23
- minitest (>= 5.1)
24
- securerandom (>= 0.3)
25
- tzinfo (~> 2.0, >= 2.0.5)
26
- uri (>= 0.13.1)
27
- base64 (0.3.0)
28
- bigdecimal (3.3.1)
29
14
  byebug (13.0.0)
30
15
  reline (>= 0.6.0)
31
- concurrent-ruby (1.3.5)
32
- connection_pool (2.5.4)
33
- diff-lcs (1.6.2)
16
+ concurrent-ruby (1.3.6)
34
17
  docile (1.4.1)
35
18
  drb (2.2.3)
36
19
  erubi (1.13.1)
37
20
  et-orbi (1.4.0)
38
21
  tzinfo
39
- factory_bot (6.5.6)
40
- activesupport (>= 6.1.0)
41
- ffi (1.17.2)
42
- ffi (1.17.2-aarch64-linux-gnu)
43
- ffi (1.17.2-aarch64-linux-musl)
44
- ffi (1.17.2-arm-linux-gnu)
45
- ffi (1.17.2-arm-linux-musl)
46
- ffi (1.17.2-arm64-darwin)
47
- ffi (1.17.2-x86-linux-gnu)
48
- ffi (1.17.2-x86-linux-musl)
49
- ffi (1.17.2-x86_64-darwin)
50
- ffi (1.17.2-x86_64-linux-gnu)
51
- ffi (1.17.2-x86_64-linux-musl)
52
- fugit (1.12.1)
22
+ ffi (1.17.4)
23
+ ffi (1.17.4-aarch64-linux-gnu)
24
+ ffi (1.17.4-aarch64-linux-musl)
25
+ ffi (1.17.4-arm-linux-gnu)
26
+ ffi (1.17.4-arm-linux-musl)
27
+ ffi (1.17.4-arm64-darwin)
28
+ ffi (1.17.4-x86-linux-gnu)
29
+ ffi (1.17.4-x86-linux-musl)
30
+ ffi (1.17.4-x86_64-darwin)
31
+ ffi (1.17.4-x86_64-linux-gnu)
32
+ ffi (1.17.4-x86_64-linux-musl)
33
+ fugit (1.12.2)
53
34
  et-orbi (~> 1.4)
54
35
  raabro (~> 1.4)
55
- i18n (1.14.7)
56
- concurrent-ruby (~> 1.0)
57
36
  io-console (0.8.2)
58
- json (2.16.0)
59
- karafka (2.5.2)
60
- base64 (~> 0.2)
61
- karafka-core (>= 2.5.6, < 2.6.0)
62
- karafka-rdkafka (>= 0.22.0)
63
- waterdrop (>= 2.8.9, < 3.0.0)
37
+ json (2.19.7)
38
+ karafka (2.5.10.rc1)
39
+ karafka-core (>= 2.5.13, < 2.6.0)
40
+ karafka-rdkafka (>= 0.26.1)
41
+ waterdrop (>= 2.8.14, < 3.0.0)
64
42
  zeitwerk (~> 2.3)
65
- karafka-core (2.5.7)
43
+ karafka-core (2.5.13)
66
44
  karafka-rdkafka (>= 0.20.0)
67
45
  logger (>= 1.6.0)
68
- karafka-rdkafka (0.23.0)
46
+ karafka-rdkafka (0.27.2)
69
47
  ffi (~> 1.17.1)
70
48
  json (> 2.0)
71
49
  logger
72
50
  mini_portile2 (~> 2.6)
73
51
  rake (> 12)
74
- karafka-rdkafka (0.23.0-aarch64-linux-gnu)
52
+ karafka-rdkafka (0.27.2-aarch64-linux-gnu)
75
53
  ffi (~> 1.17.1)
76
54
  json (> 2.0)
77
55
  logger
78
56
  mini_portile2 (~> 2.6)
79
57
  rake (> 12)
80
- karafka-rdkafka (0.23.0-arm64-darwin)
58
+ karafka-rdkafka (0.27.2-aarch64-linux-musl)
81
59
  ffi (~> 1.17.1)
82
60
  json (> 2.0)
83
61
  logger
84
62
  mini_portile2 (~> 2.6)
85
63
  rake (> 12)
86
- karafka-rdkafka (0.23.0-x86_64-linux-gnu)
64
+ karafka-rdkafka (0.27.2-arm64-darwin)
87
65
  ffi (~> 1.17.1)
88
66
  json (> 2.0)
89
67
  logger
90
68
  mini_portile2 (~> 2.6)
91
69
  rake (> 12)
92
- karafka-rdkafka (0.23.0-x86_64-linux-musl)
70
+ karafka-rdkafka (0.27.2-x86_64-linux-gnu)
71
+ ffi (~> 1.17.1)
72
+ json (> 2.0)
73
+ logger
74
+ mini_portile2 (~> 2.6)
75
+ rake (> 12)
76
+ karafka-rdkafka (0.27.2-x86_64-linux-musl)
93
77
  ffi (~> 1.17.1)
94
78
  json (> 2.0)
95
79
  logger
@@ -97,70 +81,62 @@ GEM
97
81
  rake (> 12)
98
82
  logger (1.7.0)
99
83
  mini_portile2 (2.8.9)
100
- minitest (5.26.1)
101
- nokogiri (1.19.0)
84
+ minitest (6.0.6)
85
+ drb (~> 2.0)
86
+ prism (~> 1.5)
87
+ mocha (3.1.0)
88
+ ruby2_keywords (>= 0.0.5)
89
+ nokogiri (1.19.3)
102
90
  mini_portile2 (~> 2.8.2)
103
91
  racc (~> 1.4)
104
- nokogiri (1.19.0-aarch64-linux-gnu)
92
+ nokogiri (1.19.3-aarch64-linux-gnu)
105
93
  racc (~> 1.4)
106
- nokogiri (1.19.0-aarch64-linux-musl)
94
+ nokogiri (1.19.3-aarch64-linux-musl)
107
95
  racc (~> 1.4)
108
- nokogiri (1.19.0-arm-linux-gnu)
96
+ nokogiri (1.19.3-arm-linux-gnu)
109
97
  racc (~> 1.4)
110
- nokogiri (1.19.0-arm-linux-musl)
98
+ nokogiri (1.19.3-arm-linux-musl)
111
99
  racc (~> 1.4)
112
- nokogiri (1.19.0-arm64-darwin)
100
+ nokogiri (1.19.3-arm64-darwin)
113
101
  racc (~> 1.4)
114
- nokogiri (1.19.0-x86_64-darwin)
102
+ nokogiri (1.19.3-x86_64-darwin)
115
103
  racc (~> 1.4)
116
- nokogiri (1.19.0-x86_64-linux-gnu)
104
+ nokogiri (1.19.3-x86_64-linux-gnu)
117
105
  racc (~> 1.4)
118
- nokogiri (1.19.0-x86_64-linux-musl)
106
+ nokogiri (1.19.3-x86_64-linux-musl)
119
107
  racc (~> 1.4)
120
108
  ostruct (0.6.3)
109
+ prism (1.9.0)
121
110
  raabro (1.4.0)
122
111
  racc (1.8.1)
123
- rack (3.2.4)
112
+ rack (3.2.6)
124
113
  rack-test (2.2.0)
125
114
  rack (>= 1.3)
126
115
  rackup (0.2.3)
127
116
  rack (>= 3.0.0.beta1)
128
117
  webrick
129
- rake (13.3.1)
118
+ rake (13.4.2)
130
119
  reline (0.6.3)
131
120
  io-console (~> 0.5)
132
- roda (3.98.0)
121
+ roda (3.104.0)
133
122
  rack
134
- rspec (3.13.2)
135
- rspec-core (~> 3.13.0)
136
- rspec-expectations (~> 3.13.0)
137
- rspec-mocks (~> 3.13.0)
138
- rspec-core (3.13.6)
139
- rspec-support (~> 3.13.0)
140
- rspec-expectations (3.13.5)
141
- diff-lcs (>= 1.2.0, < 2.0)
142
- rspec-support (~> 3.13.0)
143
- rspec-mocks (3.13.7)
144
- diff-lcs (>= 1.2.0, < 2.0)
145
- rspec-support (~> 3.13.0)
146
- rspec-support (3.13.6)
147
- securerandom (0.4.1)
123
+ ruby2_keywords (0.0.5)
148
124
  simplecov (0.22.0)
149
125
  docile (~> 1.1)
150
126
  simplecov-html (~> 0.11)
151
127
  simplecov_json_formatter (~> 0.1)
152
128
  simplecov-html (0.13.2)
153
129
  simplecov_json_formatter (0.1.4)
154
- tilt (2.6.1)
130
+ tilt (2.7.0)
155
131
  tzinfo (2.0.6)
156
132
  concurrent-ruby (~> 1.0)
157
- uri (1.1.1)
158
- waterdrop (2.8.13)
159
- karafka-core (>= 2.4.9, < 3.0.0)
160
- karafka-rdkafka (>= 0.20.0)
133
+ warning (1.6.0)
134
+ waterdrop (2.10.1)
135
+ karafka-core (>= 2.5.12, < 3.0.0)
136
+ karafka-rdkafka (>= 0.24.0)
161
137
  zeitwerk (~> 2.3)
162
- webrick (1.9.1)
163
- zeitwerk (2.7.3)
138
+ webrick (1.9.2)
139
+ zeitwerk (2.8.2)
164
140
 
165
141
  PLATFORMS
166
142
  aarch64-linux-gnu
@@ -177,15 +153,16 @@ PLATFORMS
177
153
 
178
154
  DEPENDENCIES
179
155
  byebug
180
- factory_bot
181
156
  fugit
182
157
  karafka-web!
158
+ minitest
159
+ mocha
183
160
  nokogiri
184
161
  ostruct
185
162
  rack-test
186
163
  rackup (~> 0.2)
187
- rspec
188
164
  simplecov
165
+ warning
189
166
 
190
167
  BUNDLED WITH
191
- 2.7.1
168
+ 4.0.12
data/Rakefile CHANGED
@@ -2,3 +2,29 @@
2
2
 
3
3
  require "bundler/setup"
4
4
  require "bundler/gem_tasks"
5
+ require "minitest/test_task"
6
+
7
+ specs_type = ENV.fetch("SPECS_TYPE", "regular")
8
+
9
+ Minitest::TestTask.create(:test) do |t|
10
+ t.libs << "test"
11
+ t.libs << "lib"
12
+ t.test_prelude = 'require "test_helper"; require "minitest/autorun"'
13
+
14
+ t.test_globs = if specs_type == "pro"
15
+ ["test/lib/karafka/web/pro/**/*_test.rb"]
16
+ else
17
+ # Exclude pro tests from regular test runs
18
+ [
19
+ "test/lib/karafka/web/*_test.rb",
20
+ "test/lib/karafka/web/cli/**/*_test.rb",
21
+ "test/lib/karafka/web/contracts/**/*_test.rb",
22
+ "test/lib/karafka/web/management/**/*_test.rb",
23
+ "test/lib/karafka/web/processing/**/*_test.rb",
24
+ "test/lib/karafka/web/tracking/**/*_test.rb",
25
+ "test/lib/karafka/web/ui/**/*_test.rb"
26
+ ]
27
+ end
28
+ end
29
+
30
+ task default: :test
@@ -1,29 +1,29 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- # Balances spec files across N workers using timing data
4
+ # Balances test files across N workers using timing data
5
5
  # Uses greedy bin-packing: assign each file to worker with lowest total time
6
6
  #
7
- # Usage: bin/balance_specs <regular|pro> <num_workers>
7
+ # Usage: bin/balance_tests <regular|pro> <num_workers>
8
8
  #
9
- # Output: JSON array of arrays where each inner array contains the spec files
9
+ # Output: JSON array of arrays where each inner array contains the test files
10
10
  # assigned to that worker
11
11
  #
12
12
  # Example:
13
- # bin/balance_specs regular 4
14
- # [["spec/a.rb","spec/d.rb"],["spec/b.rb"],["spec/c.rb"],["spec/e.rb"]]
13
+ # bin/balance_tests regular 4
14
+ # [["test/a.rb","test/d.rb"],["test/b.rb"],["test/c.rb"],["test/e.rb"]]
15
15
 
16
16
  require 'json'
17
17
 
18
- TIMINGS_DIR = File.expand_path('../spec/timings', __dir__)
18
+ TIMINGS_DIR = File.expand_path('../test/timings', __dir__)
19
19
  DEFAULT_TIME = 1.0 # Default time for files not in timing data
20
20
 
21
- # Loads timing data from a JSON file for the given spec type
21
+ # Loads timing data from a JSON file for the given test type
22
22
  #
23
- # @param specs_type [String] the type of specs ('regular' or 'pro')
23
+ # @param tests_type [String] the type of tests ('regular' or 'pro')
24
24
  # @return [Hash<String, Float>] hash mapping file paths to execution times in seconds
25
- def load_timings(specs_type)
26
- file_path = File.join(TIMINGS_DIR, "#{specs_type}.json")
25
+ def load_timings(tests_type)
26
+ file_path = File.join(TIMINGS_DIR, "#{tests_type}.json")
27
27
 
28
28
  if File.exist?(file_path)
29
29
  JSON.parse(File.read(file_path))
@@ -32,37 +32,37 @@ def load_timings(specs_type)
32
32
  end
33
33
  end
34
34
 
35
- # Returns a sorted list of spec files for the given spec type
35
+ # Returns a sorted list of test files for the given test type
36
36
  #
37
- # @param specs_type [String] the type of specs ('regular' or 'pro')
38
- # @return [Array<String>] sorted array of spec file paths
39
- def get_spec_files(specs_type)
40
- all_specs = Dir.glob('spec/lib/karafka/web/**/*_spec.rb').sort
37
+ # @param tests_type [String] the type of tests ('regular' or 'pro')
38
+ # @return [Array<String>] sorted array of test file paths
39
+ def get_test_files(tests_type)
40
+ all_tests = Dir.glob('test/lib/karafka/web/**/*_test.rb').sort
41
41
 
42
- case specs_type
42
+ case tests_type
43
43
  when 'pro'
44
- all_specs.select { |f| f.include?('/pro/') }
44
+ all_tests.select { |f| f.include?('/pro/') }
45
45
  when 'regular'
46
- all_specs.reject { |f| f.include?('/pro/') }
46
+ all_tests.reject { |f| f.include?('/pro/') }
47
47
  else
48
- warn "Unknown specs type: #{specs_type}"
48
+ warn "Unknown tests type: #{tests_type}"
49
49
  exit 1
50
50
  end
51
51
  end
52
52
 
53
- # Balances spec files across workers using greedy bin-packing algorithm
53
+ # Balances test files across workers using greedy bin-packing algorithm
54
54
  #
55
55
  # Files are sorted by execution time (descending) and each file is assigned
56
56
  # to the worker with the lowest total time. This minimizes the imbalance
57
57
  # between the slowest and fastest workers.
58
58
  #
59
- # @param files [Array<String>] list of spec file paths to balance
59
+ # @param files [Array<String>] list of test file paths to balance
60
60
  # @param timings [Hash<String, Float>] hash mapping file paths to execution times
61
61
  # @param num_workers [Integer] number of workers to distribute files across
62
62
  # @return [Array<Hash>] array of worker hashes, each with :files and :total_time keys
63
63
  def balance_files(files, timings, num_workers)
64
64
  # Get timing for each file, using default if not found
65
- # Handle both "./spec/..." and "spec/..." path formats
65
+ # Handle both "./test/..." and "test/..." path formats
66
66
  files_with_times = files.map do |file|
67
67
  time = timings[file] || timings["./#{file}"] || DEFAULT_TIME
68
68
  [file, time]
@@ -101,16 +101,16 @@ def print_balance_info(workers)
101
101
  end
102
102
 
103
103
  # Main
104
- specs_type = ARGV[0]
104
+ tests_type = ARGV[0]
105
105
  num_workers = (ARGV[1] || '4').to_i
106
106
 
107
- unless specs_type
108
- warn "Usage: bin/balance_specs <regular|pro> <num_workers>"
107
+ unless tests_type
108
+ warn "Usage: bin/balance_tests <regular|pro> <num_workers>"
109
109
  exit 1
110
110
  end
111
111
 
112
- timings = load_timings(specs_type)
113
- files = get_spec_files(specs_type)
112
+ timings = load_timings(tests_type)
113
+ files = get_test_files(tests_type)
114
114
  workers = balance_files(files, timings, num_workers)
115
115
 
116
116
  # Print balance info to stderr
data/bin/check_coverage CHANGED
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env bash
2
2
 
3
- # Collates SimpleCov results from parallel spec runs and checks minimum coverage
3
+ # Collates SimpleCov results from parallel test runs and checks minimum coverage
4
4
  #
5
- # This script should be run after bin/rspecs_parallel or bin/rspecs to verify
5
+ # This script should be run after bin/tests_parallel to verify
6
6
  # code coverage meets the minimum threshold.
7
7
  #
8
- # Coverage thresholds are defined in spec/support/coverage_config.rb
8
+ # Coverage thresholds are defined in test/support/coverage_config.rb
9
9
 
10
10
  set -e
11
11
 
@@ -13,10 +13,10 @@ echo "Collating SimpleCov coverage results..."
13
13
 
14
14
  bundle exec ruby -e "
15
15
  require 'simplecov'
16
- require_relative 'spec/support/coverage_config'
16
+ require_relative 'test/support/coverage_config'
17
17
 
18
18
  SimpleCov.collate Dir['coverage/.resultset.json'], 'rails' do
19
- add_filter '/spec/'
19
+ add_filter '/test/'
20
20
  add_filter '/vendor/'
21
21
  add_filter '/gems/'
22
22
  add_filter '/.bundle/'