karafka-web 0.11.6 → 1.0.0.rc1

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 (488) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +45 -0
  3. data/Gemfile +3 -2
  4. data/Gemfile.lint +2 -2
  5. data/Gemfile.lint.lock +18 -32
  6. data/Gemfile.lock +65 -94
  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/deserializer.rb +1 -1
  20. data/lib/karafka/web/management/actions/create_initial_states.rb +1 -2
  21. data/lib/karafka/web/management/actions/enable.rb +29 -7
  22. data/lib/karafka/web/management/actions/migrate_states_data.rb +1 -2
  23. data/lib/karafka/web/management/migrations/base.rb +1 -2
  24. data/lib/karafka/web/management/migrations/consumers_reports/1772128000_add_poll_interval_to_subscription_groups.rb +48 -0
  25. data/lib/karafka/web/pro/commanding/commands/base.rb +9 -0
  26. data/lib/karafka/web/pro/commanding/commands/consumers/quiet.rb +8 -1
  27. data/lib/karafka/web/pro/commanding/commands/consumers/stop.rb +8 -1
  28. data/lib/karafka/web/pro/commanding/commands/consumers/trace.rb +8 -1
  29. data/lib/karafka/web/pro/commanding/commands/partitions/pause.rb +8 -0
  30. data/lib/karafka/web/pro/commanding/commands/partitions/resume.rb +8 -0
  31. data/lib/karafka/web/pro/commanding/commands/partitions/seek.rb +8 -0
  32. data/lib/karafka/web/pro/commanding/commands/topics/pause.rb +8 -0
  33. data/lib/karafka/web/pro/commanding/commands/topics/resume.rb +8 -0
  34. data/lib/karafka/web/pro/commanding/config.rb +8 -0
  35. data/lib/karafka/web/pro/commanding/contracts/config.rb +8 -0
  36. data/lib/karafka/web/pro/commanding/dispatcher.rb +8 -0
  37. data/lib/karafka/web/pro/commanding/handlers/group_id_extractor.rb +49 -0
  38. data/lib/karafka/web/pro/commanding/handlers/partitions/commands/base.rb +8 -1
  39. data/lib/karafka/web/pro/commanding/handlers/partitions/commands/pause.rb +8 -0
  40. data/lib/karafka/web/pro/commanding/handlers/partitions/commands/resume.rb +8 -0
  41. data/lib/karafka/web/pro/commanding/handlers/partitions/commands/seek.rb +8 -0
  42. data/lib/karafka/web/pro/commanding/handlers/partitions/executor.rb +8 -0
  43. data/lib/karafka/web/pro/commanding/handlers/partitions/listener.rb +12 -2
  44. data/lib/karafka/web/pro/commanding/handlers/partitions/tracker.rb +8 -0
  45. data/lib/karafka/web/pro/commanding/handlers/topics/commands/base.rb +8 -0
  46. data/lib/karafka/web/pro/commanding/handlers/topics/commands/pause.rb +8 -0
  47. data/lib/karafka/web/pro/commanding/handlers/topics/commands/resume.rb +8 -0
  48. data/lib/karafka/web/pro/commanding/handlers/topics/executor.rb +8 -0
  49. data/lib/karafka/web/pro/commanding/handlers/topics/listener.rb +12 -2
  50. data/lib/karafka/web/pro/commanding/handlers/topics/tracker.rb +8 -0
  51. data/lib/karafka/web/pro/commanding/listener.rb +8 -4
  52. data/lib/karafka/web/pro/commanding/manager.rb +8 -0
  53. data/lib/karafka/web/pro/commanding/matcher.rb +8 -0
  54. data/lib/karafka/web/pro/commanding/matchers/base.rb +8 -0
  55. data/lib/karafka/web/pro/commanding/matchers/consumer_group_id.rb +9 -1
  56. data/lib/karafka/web/pro/commanding/matchers/message_type.rb +8 -0
  57. data/lib/karafka/web/pro/commanding/matchers/partition_id.rb +8 -0
  58. data/lib/karafka/web/pro/commanding/matchers/process_id.rb +8 -0
  59. data/lib/karafka/web/pro/commanding/matchers/schema_version.rb +8 -0
  60. data/lib/karafka/web/pro/commanding/matchers/topic.rb +8 -0
  61. data/lib/karafka/web/pro/commanding/request.rb +8 -0
  62. data/lib/karafka/web/pro/commanding.rb +8 -0
  63. data/lib/karafka/web/pro/loader.rb +8 -0
  64. data/lib/karafka/web/pro/ui/app.rb +8 -0
  65. data/lib/karafka/web/pro/ui/controllers/base_controller.rb +8 -0
  66. data/lib/karafka/web/pro/ui/controllers/cluster_controller.rb +8 -1
  67. data/lib/karafka/web/pro/ui/controllers/consumers/base_controller.rb +23 -0
  68. data/lib/karafka/web/pro/ui/controllers/consumers/commanding_controller.rb +8 -0
  69. data/lib/karafka/web/pro/ui/controllers/consumers/commands_controller.rb +8 -0
  70. data/lib/karafka/web/pro/ui/controllers/consumers/consumers_controller.rb +8 -0
  71. data/lib/karafka/web/pro/ui/controllers/consumers/controls_controller.rb +8 -0
  72. data/lib/karafka/web/pro/ui/controllers/consumers/jobs_controller.rb +8 -0
  73. data/lib/karafka/web/pro/ui/controllers/consumers/partitions/base_controller.rb +9 -6
  74. data/lib/karafka/web/pro/ui/controllers/consumers/partitions/offsets_controller.rb +8 -0
  75. data/lib/karafka/web/pro/ui/controllers/consumers/partitions/pauses_controller.rb +8 -0
  76. data/lib/karafka/web/pro/ui/controllers/consumers/topics/pauses_controller.rb +9 -6
  77. data/lib/karafka/web/pro/ui/controllers/dashboard_controller.rb +8 -0
  78. data/lib/karafka/web/pro/ui/controllers/dlq_controller.rb +8 -0
  79. data/lib/karafka/web/pro/ui/controllers/errors_controller.rb +8 -0
  80. data/lib/karafka/web/pro/ui/controllers/explorer/base_controller.rb +8 -0
  81. data/lib/karafka/web/pro/ui/controllers/explorer/explorer_controller.rb +11 -0
  82. data/lib/karafka/web/pro/ui/controllers/explorer/messages_controller.rb +16 -1
  83. data/lib/karafka/web/pro/ui/controllers/explorer/search_controller.rb +8 -0
  84. data/lib/karafka/web/pro/ui/controllers/health_controller.rb +8 -0
  85. data/lib/karafka/web/pro/ui/controllers/jobs_controller.rb +8 -0
  86. data/lib/karafka/web/pro/ui/controllers/recurring_tasks_controller.rb +8 -0
  87. data/lib/karafka/web/pro/ui/controllers/routing_controller.rb +8 -0
  88. data/lib/karafka/web/pro/ui/controllers/scheduled_messages/base_controller.rb +8 -0
  89. data/lib/karafka/web/pro/ui/controllers/scheduled_messages/explorer_controller.rb +8 -0
  90. data/lib/karafka/web/pro/ui/controllers/scheduled_messages/messages_controller.rb +8 -0
  91. data/lib/karafka/web/pro/ui/controllers/scheduled_messages/schedules_controller.rb +8 -1
  92. data/lib/karafka/web/pro/ui/controllers/status_controller.rb +8 -0
  93. data/lib/karafka/web/pro/ui/controllers/support_controller.rb +8 -0
  94. data/lib/karafka/web/pro/ui/controllers/topics/base_controller.rb +8 -0
  95. data/lib/karafka/web/pro/ui/controllers/topics/configs_controller.rb +8 -0
  96. data/lib/karafka/web/pro/ui/controllers/topics/distributions_controller.rb +8 -0
  97. data/lib/karafka/web/pro/ui/controllers/topics/offsets_controller.rb +11 -1
  98. data/lib/karafka/web/pro/ui/controllers/topics/replications_controller.rb +8 -0
  99. data/lib/karafka/web/pro/ui/controllers/topics/topics_controller.rb +8 -0
  100. data/lib/karafka/web/pro/ui/controllers/ux_controller.rb +8 -0
  101. data/lib/karafka/web/pro/ui/lib/branding/config.rb +8 -0
  102. data/lib/karafka/web/pro/ui/lib/branding/contracts/config.rb +8 -0
  103. data/lib/karafka/web/pro/ui/lib/branding.rb +8 -0
  104. data/lib/karafka/web/pro/ui/lib/features.rb +8 -0
  105. data/lib/karafka/web/pro/ui/lib/patterns_detector.rb +9 -1
  106. data/lib/karafka/web/pro/ui/lib/policies/config.rb +8 -0
  107. data/lib/karafka/web/pro/ui/lib/policies/contracts/config.rb +8 -1
  108. data/lib/karafka/web/pro/ui/lib/policies/messages.rb +8 -0
  109. data/lib/karafka/web/pro/ui/lib/policies/requests.rb +8 -0
  110. data/lib/karafka/web/pro/ui/lib/policies.rb +8 -0
  111. data/lib/karafka/web/pro/ui/lib/safe_runner.rb +8 -0
  112. data/lib/karafka/web/pro/ui/lib/search/config.rb +8 -0
  113. data/lib/karafka/web/pro/ui/lib/search/contracts/config.rb +8 -1
  114. data/lib/karafka/web/pro/ui/lib/search/contracts/form.rb +8 -0
  115. data/lib/karafka/web/pro/ui/lib/search/matchers/base.rb +8 -0
  116. data/lib/karafka/web/pro/ui/lib/search/matchers/raw_header_includes.rb +8 -0
  117. data/lib/karafka/web/pro/ui/lib/search/matchers/raw_key_includes.rb +8 -0
  118. data/lib/karafka/web/pro/ui/lib/search/matchers/raw_payload_includes.rb +8 -0
  119. data/lib/karafka/web/pro/ui/lib/search/normalizer.rb +8 -0
  120. data/lib/karafka/web/pro/ui/lib/search/runner.rb +9 -2
  121. data/lib/karafka/web/pro/ui/lib/search.rb +8 -0
  122. data/lib/karafka/web/pro/ui/routes/base.rb +8 -0
  123. data/lib/karafka/web/pro/ui/routes/cluster.rb +8 -0
  124. data/lib/karafka/web/pro/ui/routes/consumers.rb +8 -0
  125. data/lib/karafka/web/pro/ui/routes/dashboard.rb +8 -0
  126. data/lib/karafka/web/pro/ui/routes/dlq.rb +8 -0
  127. data/lib/karafka/web/pro/ui/routes/errors.rb +8 -0
  128. data/lib/karafka/web/pro/ui/routes/explorer.rb +8 -0
  129. data/lib/karafka/web/pro/ui/routes/health.rb +8 -0
  130. data/lib/karafka/web/pro/ui/routes/jobs.rb +8 -0
  131. data/lib/karafka/web/pro/ui/routes/recurring_tasks.rb +8 -0
  132. data/lib/karafka/web/pro/ui/routes/routing.rb +8 -0
  133. data/lib/karafka/web/pro/ui/routes/scheduled_messages.rb +8 -0
  134. data/lib/karafka/web/pro/ui/routes/status.rb +8 -0
  135. data/lib/karafka/web/pro/ui/routes/support.rb +8 -0
  136. data/lib/karafka/web/pro/ui/routes/topics.rb +8 -0
  137. data/lib/karafka/web/pro/ui/routes/ux.rb +8 -0
  138. data/lib/karafka/web/pro/ui/views/cluster/_breadcrumbs.erb +7 -1
  139. data/lib/karafka/web/pro/ui/views/cluster/_broker.erb +6 -0
  140. data/lib/karafka/web/pro/ui/views/cluster/_config.erb +9 -3
  141. data/lib/karafka/web/pro/ui/views/cluster/_partition.erb +43 -0
  142. data/lib/karafka/web/pro/ui/views/cluster/_tabs.erb +6 -0
  143. data/lib/karafka/web/pro/ui/views/cluster/index.erb +7 -1
  144. data/lib/karafka/web/pro/ui/views/cluster/show.erb +6 -0
  145. data/lib/karafka/web/pro/ui/views/consumers/commands/_backtrace.erb +6 -0
  146. data/lib/karafka/web/pro/ui/views/consumers/commands/_breadcrumbs.erb +6 -0
  147. data/lib/karafka/web/pro/ui/views/consumers/commands/_command.erb +6 -0
  148. data/lib/karafka/web/pro/ui/views/consumers/commands/_command_details.erb +6 -0
  149. data/lib/karafka/web/pro/ui/views/consumers/commands/_empty.erb +7 -3
  150. data/lib/karafka/web/pro/ui/views/consumers/commands/_incompatible_command.erb +6 -0
  151. data/lib/karafka/web/pro/ui/views/consumers/commands/_incompatible_schema.erb +6 -0
  152. data/lib/karafka/web/pro/ui/views/consumers/commands/_table.erb +6 -0
  153. data/lib/karafka/web/pro/ui/views/consumers/commands/details/_acceptance.erb +6 -0
  154. data/lib/karafka/web/pro/ui/views/consumers/commands/details/_request.erb +6 -0
  155. data/lib/karafka/web/pro/ui/views/consumers/commands/details/_result.erb +6 -0
  156. data/lib/karafka/web/pro/ui/views/consumers/commands/index.erb +6 -0
  157. data/lib/karafka/web/pro/ui/views/consumers/commands/metadata/_request.erb +6 -0
  158. data/lib/karafka/web/pro/ui/views/consumers/commands/metadata/_response.erb +6 -0
  159. data/lib/karafka/web/pro/ui/views/consumers/commands/rows/_command_name_badge.erb +6 -0
  160. data/lib/karafka/web/pro/ui/views/consumers/commands/rows/_request.erb +6 -0
  161. data/lib/karafka/web/pro/ui/views/consumers/commands/rows/_response.erb +6 -0
  162. data/lib/karafka/web/pro/ui/views/consumers/commands/show.erb +6 -0
  163. data/lib/karafka/web/pro/ui/views/consumers/consumers/_breadcrumbs.erb +6 -0
  164. data/lib/karafka/web/pro/ui/views/consumers/consumers/_consumer.erb +6 -0
  165. data/lib/karafka/web/pro/ui/views/consumers/consumers/_consumer_performance.erb +6 -0
  166. data/lib/karafka/web/pro/ui/views/consumers/consumers/_tabs.erb +6 -0
  167. data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_commands.erb +6 -3
  168. data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_consumer_group.erb +6 -0
  169. data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_metrics.erb +6 -0
  170. data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_no_subscriptions.erb +7 -7
  171. data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_partition.erb +6 -0
  172. data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_partition_edit_options.erb +6 -0
  173. data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_stopped.erb +6 -0
  174. data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_subscription_group.erb +7 -3
  175. data/lib/karafka/web/pro/ui/views/consumers/consumers/consumer/_tabs.erb +6 -0
  176. data/lib/karafka/web/pro/ui/views/consumers/consumers/details.erb +6 -0
  177. data/lib/karafka/web/pro/ui/views/consumers/consumers/index.erb +11 -5
  178. data/lib/karafka/web/pro/ui/views/consumers/consumers/performance.erb +6 -0
  179. data/lib/karafka/web/pro/ui/views/consumers/consumers/subscriptions.erb +6 -0
  180. data/lib/karafka/web/pro/ui/views/consumers/controls/_breadcrumbs.erb +6 -0
  181. data/lib/karafka/web/pro/ui/views/consumers/controls/_controls.erb +6 -4
  182. data/lib/karafka/web/pro/ui/views/consumers/controls/index.erb +6 -2
  183. data/lib/karafka/web/pro/ui/views/consumers/jobs/_breadcrumbs.erb +6 -0
  184. data/lib/karafka/web/pro/ui/views/consumers/jobs/_job.erb +6 -0
  185. data/lib/karafka/web/pro/ui/views/consumers/jobs/_no_jobs.erb +7 -3
  186. data/lib/karafka/web/pro/ui/views/consumers/jobs/pending.erb +6 -0
  187. data/lib/karafka/web/pro/ui/views/consumers/jobs/running.erb +6 -0
  188. data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_basics.erb +6 -0
  189. data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_breadcrumbs.erb +6 -0
  190. data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_form.erb +6 -1
  191. data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_not_running_error.erb +6 -0
  192. data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/_running_warning.erb +6 -0
  193. data/lib/karafka/web/pro/ui/views/consumers/partitions/offsets/edit.erb +6 -0
  194. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_active_not_editable.erb +6 -0
  195. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_adjusting_warning.erb +6 -0
  196. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_breadcrumbs.erb +6 -0
  197. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_edit_form.erb +6 -1
  198. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_lrj_not_manageable.erb +6 -0
  199. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_new_form.erb +6 -2
  200. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_not_running.erb +6 -0
  201. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/_partition_info.erb +6 -0
  202. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/edit.erb +6 -0
  203. data/lib/karafka/web/pro/ui/views/consumers/partitions/pauses/new.erb +6 -0
  204. data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_adjusting_warning.erb +6 -0
  205. data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_breadcrumbs.erb +6 -0
  206. data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_edit_form.erb +6 -1
  207. data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_lrj_not_manageable.erb +6 -0
  208. data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_new_form.erb +6 -2
  209. data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_not_running.erb +6 -0
  210. data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/_topic_info.erb +6 -0
  211. data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/edit.erb +6 -0
  212. data/lib/karafka/web/pro/ui/views/consumers/topics/pauses/new.erb +6 -0
  213. data/lib/karafka/web/pro/ui/views/dashboard/_counters.erb +96 -0
  214. data/lib/karafka/web/pro/ui/views/dashboard/index.erb +6 -0
  215. data/lib/karafka/web/pro/ui/views/dlq/_breadcrumbs.erb +7 -1
  216. data/lib/karafka/web/pro/ui/views/dlq/_no_topics.erb +7 -1
  217. data/lib/karafka/web/pro/ui/views/dlq/_topic.erb +11 -1
  218. data/lib/karafka/web/pro/ui/views/dlq/index.erb +6 -0
  219. data/lib/karafka/web/pro/ui/views/errors/_breadcrumbs.erb +6 -0
  220. data/lib/karafka/web/pro/ui/views/errors/_detail.erb +68 -0
  221. data/lib/karafka/web/pro/ui/views/errors/_error.erb +6 -0
  222. data/lib/karafka/web/pro/ui/views/errors/_partition_option.erb +6 -0
  223. data/lib/karafka/web/pro/ui/views/errors/_selector.erb +6 -0
  224. data/lib/karafka/web/pro/ui/views/errors/_table.erb +8 -2
  225. data/lib/karafka/web/pro/ui/views/errors/index.erb +6 -0
  226. data/lib/karafka/web/pro/ui/views/errors/partition.erb +6 -0
  227. data/lib/karafka/web/pro/ui/views/errors/show.erb +6 -0
  228. data/lib/karafka/web/pro/ui/views/explorer/explorer/_breadcrumbs.erb +6 -0
  229. data/lib/karafka/web/pro/ui/views/explorer/explorer/_failed_deserialization.erb +6 -0
  230. data/lib/karafka/web/pro/ui/views/explorer/explorer/_filtered.erb +9 -16
  231. data/lib/karafka/web/pro/ui/views/explorer/explorer/_message.erb +6 -0
  232. data/lib/karafka/web/pro/ui/views/explorer/explorer/_no_topics.erb +7 -1
  233. data/lib/karafka/web/pro/ui/views/explorer/explorer/_partition_option.erb +6 -0
  234. data/lib/karafka/web/pro/ui/views/explorer/explorer/_selector.erb +6 -0
  235. data/lib/karafka/web/pro/ui/views/explorer/explorer/_topic.erb +11 -1
  236. data/lib/karafka/web/pro/ui/views/explorer/explorer/index.erb +6 -0
  237. data/lib/karafka/web/pro/ui/views/explorer/explorer/message/_metadata.erb +6 -0
  238. data/lib/karafka/web/pro/ui/views/explorer/explorer/message/_payload.erb +15 -2
  239. data/lib/karafka/web/pro/ui/views/explorer/explorer/message/_resources_utilization.erb +6 -0
  240. data/lib/karafka/web/pro/ui/views/explorer/explorer/message/_too_big_to_be_displayed.erb +6 -0
  241. data/lib/karafka/web/pro/ui/views/explorer/explorer/messages/_detail.erb +6 -0
  242. data/lib/karafka/web/pro/ui/views/explorer/explorer/messages/_headers.erb +6 -0
  243. data/lib/karafka/web/pro/ui/views/explorer/explorer/messages/_key.erb +6 -0
  244. data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_cleaned.erb +7 -3
  245. data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_empty.erb +7 -3
  246. data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_messages.erb +6 -0
  247. data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_time_selector.erb +6 -0
  248. data/lib/karafka/web/pro/ui/views/explorer/explorer/partition/_timestamp_selector.erb +6 -0
  249. data/lib/karafka/web/pro/ui/views/explorer/explorer/partition.erb +6 -0
  250. data/lib/karafka/web/pro/ui/views/explorer/explorer/show.erb +7 -2
  251. data/lib/karafka/web/pro/ui/views/explorer/explorer/topic/_actions.erb +6 -0
  252. data/lib/karafka/web/pro/ui/views/explorer/explorer/topic/_empty.erb +7 -3
  253. data/lib/karafka/web/pro/ui/views/explorer/explorer/topic/_limited.erb +6 -0
  254. data/lib/karafka/web/pro/ui/views/explorer/explorer/topic.erb +6 -0
  255. data/lib/karafka/web/pro/ui/views/explorer/messages/_breadcrumbs.erb +6 -0
  256. data/lib/karafka/web/pro/ui/views/explorer/messages/forward.erb +6 -2
  257. data/lib/karafka/web/pro/ui/views/explorer/search/_breadcrumbs.erb +6 -0
  258. data/lib/karafka/web/pro/ui/views/explorer/search/_fix_errors.erb +6 -0
  259. data/lib/karafka/web/pro/ui/views/explorer/search/_metadata.erb +6 -0
  260. data/lib/karafka/web/pro/ui/views/explorer/search/_no_results.erb +7 -3
  261. data/lib/karafka/web/pro/ui/views/explorer/search/_no_search_criteria.erb +7 -3
  262. data/lib/karafka/web/pro/ui/views/explorer/search/_search_criteria.erb +6 -0
  263. data/lib/karafka/web/pro/ui/views/explorer/search/_search_modal.erb +6 -0
  264. data/lib/karafka/web/pro/ui/views/explorer/search/_timeout.erb +6 -0
  265. data/lib/karafka/web/pro/ui/views/explorer/search/index.erb +6 -0
  266. data/lib/karafka/web/pro/ui/views/health/_breadcrumbs.erb +7 -1
  267. data/lib/karafka/web/pro/ui/views/health/_no_data.erb +7 -1
  268. data/lib/karafka/web/pro/ui/views/health/_no_partition_data.erb +6 -0
  269. data/lib/karafka/web/pro/ui/views/health/_partition.erb +6 -0
  270. data/lib/karafka/web/pro/ui/views/health/_partition_lags.erb +6 -0
  271. data/lib/karafka/web/pro/ui/views/health/_partition_offset.erb +6 -0
  272. data/lib/karafka/web/pro/ui/views/health/_partition_times.erb +6 -0
  273. data/lib/karafka/web/pro/ui/views/health/_partitions_with_fallback.erb +6 -0
  274. data/lib/karafka/web/pro/ui/views/health/_table_metadata.erb +6 -0
  275. data/lib/karafka/web/pro/ui/views/health/_tabs.erb +7 -1
  276. data/lib/karafka/web/pro/ui/views/health/_topic_edit_options.erb +6 -0
  277. data/lib/karafka/web/pro/ui/views/health/changes.erb +6 -0
  278. data/lib/karafka/web/pro/ui/views/health/cluster_lags.erb +6 -0
  279. data/lib/karafka/web/pro/ui/views/health/lags.erb +6 -0
  280. data/lib/karafka/web/pro/ui/views/health/offsets.erb +6 -0
  281. data/lib/karafka/web/pro/ui/views/health/overview.erb +6 -0
  282. data/lib/karafka/web/pro/ui/views/jobs/_job.erb +6 -0
  283. data/lib/karafka/web/pro/ui/views/jobs/_no_jobs.erb +7 -1
  284. data/lib/karafka/web/pro/ui/views/jobs/pending.erb +6 -0
  285. data/lib/karafka/web/pro/ui/views/jobs/running.erb +6 -0
  286. data/lib/karafka/web/pro/ui/views/recurring_tasks/_actions.erb +7 -4
  287. data/lib/karafka/web/pro/ui/views/recurring_tasks/_batch_actions.erb +6 -3
  288. data/lib/karafka/web/pro/ui/views/recurring_tasks/_breadcrumbs.erb +6 -0
  289. data/lib/karafka/web/pro/ui/views/recurring_tasks/_log.erb +6 -0
  290. data/lib/karafka/web/pro/ui/views/recurring_tasks/_not_active.erb +9 -5
  291. data/lib/karafka/web/pro/ui/views/recurring_tasks/_tabs.erb +7 -1
  292. data/lib/karafka/web/pro/ui/views/recurring_tasks/_task.erb +6 -0
  293. data/lib/karafka/web/pro/ui/views/recurring_tasks/logs.erb +7 -1
  294. data/lib/karafka/web/pro/ui/views/recurring_tasks/schedule.erb +6 -0
  295. data/lib/karafka/web/pro/ui/views/routing/_consumer_group.erb +6 -0
  296. data/lib/karafka/web/pro/ui/views/routing/_detail.erb +6 -0
  297. data/lib/karafka/web/pro/ui/views/routing/_topic.erb +6 -0
  298. data/lib/karafka/web/pro/ui/views/routing/index.erb +6 -0
  299. data/lib/karafka/web/pro/ui/views/routing/show.erb +7 -1
  300. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/_breadcrumbs.erb +6 -0
  301. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/_key.erb +6 -0
  302. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/_message.erb +6 -0
  303. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/_messages.erb +6 -0
  304. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/message/_cancel.erb +6 -0
  305. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/message/_compacted.erb +6 -0
  306. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/message/_schedule.erb +7 -2
  307. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/message/_tombstone.erb +6 -0
  308. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/message/_unknown.erb +6 -0
  309. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/partition.erb +6 -0
  310. data/lib/karafka/web/pro/ui/views/scheduled_messages/explorer/topic.erb +6 -0
  311. data/lib/karafka/web/pro/ui/views/scheduled_messages/schedules/_breadcrumbs.erb +6 -0
  312. data/lib/karafka/web/pro/ui/views/scheduled_messages/schedules/_no_groups.erb +9 -5
  313. data/lib/karafka/web/pro/ui/views/scheduled_messages/schedules/index.erb +6 -0
  314. data/lib/karafka/web/pro/ui/views/scheduled_messages/schedules/show.erb +8 -2
  315. data/lib/karafka/web/pro/ui/views/shared/_navigation.erb +6 -0
  316. data/lib/karafka/web/pro/ui/views/shared/_rdkafka_form_error_alert_box.erb +6 -0
  317. data/lib/karafka/web/pro/ui/views/shared/branding/_label.erb +6 -0
  318. data/lib/karafka/web/pro/ui/views/shared/branding/_notice.erb +6 -0
  319. data/lib/karafka/web/pro/ui/views/topics/configs/_breadcrumbs.erb +6 -0
  320. data/lib/karafka/web/pro/ui/views/topics/configs/_config.erb +7 -1
  321. data/lib/karafka/web/pro/ui/views/topics/configs/_delete_button.erb +6 -0
  322. data/lib/karafka/web/pro/ui/views/topics/configs/_edit_form.erb +6 -1
  323. data/lib/karafka/web/pro/ui/views/topics/configs/_edit_plan.erb +16 -13
  324. data/lib/karafka/web/pro/ui/views/topics/configs/_edit_warning.erb +6 -0
  325. data/lib/karafka/web/pro/ui/views/topics/configs/edit.erb +6 -0
  326. data/lib/karafka/web/pro/ui/views/topics/configs/index.erb +6 -0
  327. data/lib/karafka/web/pro/ui/views/topics/distributions/_add_partitions_button.erb +6 -0
  328. data/lib/karafka/web/pro/ui/views/topics/distributions/_badges.erb +6 -0
  329. data/lib/karafka/web/pro/ui/views/topics/distributions/_breadcrumbs.erb +6 -0
  330. data/lib/karafka/web/pro/ui/views/topics/distributions/_chart.erb +6 -0
  331. data/lib/karafka/web/pro/ui/views/topics/distributions/_edit_form.erb +6 -1
  332. data/lib/karafka/web/pro/ui/views/topics/distributions/_edit_hints.erb +15 -12
  333. data/lib/karafka/web/pro/ui/views/topics/distributions/_edit_warnings.erb +6 -0
  334. data/lib/karafka/web/pro/ui/views/topics/distributions/_empty_partitions.erb +9 -1
  335. data/lib/karafka/web/pro/ui/views/topics/distributions/_limited.erb +6 -0
  336. data/lib/karafka/web/pro/ui/views/topics/distributions/_partition.erb +6 -0
  337. data/lib/karafka/web/pro/ui/views/topics/distributions/edit.erb +6 -0
  338. data/lib/karafka/web/pro/ui/views/topics/distributions/show.erb +6 -0
  339. data/lib/karafka/web/pro/ui/views/topics/offsets/_breadcrumbs.erb +6 -0
  340. data/lib/karafka/web/pro/ui/views/topics/offsets/_partition.erb +6 -0
  341. data/lib/karafka/web/pro/ui/views/topics/offsets/show.erb +6 -0
  342. data/lib/karafka/web/pro/ui/views/topics/replications/_breadcrumbs.erb +6 -0
  343. data/lib/karafka/web/pro/ui/views/topics/replications/_metric_box.erb +6 -0
  344. data/lib/karafka/web/pro/ui/views/topics/replications/_partition.erb +6 -0
  345. data/lib/karafka/web/pro/ui/views/topics/replications/_replication_info.erb +6 -0
  346. data/lib/karafka/web/pro/ui/views/topics/replications/_resilience_success.erb +6 -0
  347. data/lib/karafka/web/pro/ui/views/topics/replications/_warning_low_durability.erb +7 -1
  348. data/lib/karafka/web/pro/ui/views/topics/replications/_warning_no_redundancy.erb +7 -1
  349. data/lib/karafka/web/pro/ui/views/topics/replications/_warning_zero_fault_tolerance.erb +7 -1
  350. data/lib/karafka/web/pro/ui/views/topics/replications/show.erb +6 -0
  351. data/lib/karafka/web/pro/ui/views/topics/topics/_breadcrumbs.erb +6 -0
  352. data/lib/karafka/web/pro/ui/views/topics/topics/_create_button.erb +6 -0
  353. data/lib/karafka/web/pro/ui/views/topics/topics/_create_hints.erb +6 -0
  354. data/lib/karafka/web/pro/ui/views/topics/topics/_delete_form.erb +6 -1
  355. data/lib/karafka/web/pro/ui/views/topics/topics/_delete_hints.erb +14 -12
  356. data/lib/karafka/web/pro/ui/views/topics/topics/_delete_warning.erb +6 -0
  357. data/lib/karafka/web/pro/ui/views/topics/topics/_new_form.erb +6 -2
  358. data/lib/karafka/web/pro/ui/views/topics/topics/_tabs.erb +6 -0
  359. data/lib/karafka/web/pro/ui/views/topics/topics/_topic.erb +11 -1
  360. data/lib/karafka/web/pro/ui/views/topics/topics/edit.erb +6 -0
  361. data/lib/karafka/web/pro/ui/views/topics/topics/index.erb +6 -0
  362. data/lib/karafka/web/pro/ui/views/topics/topics/new.erb +6 -0
  363. data/lib/karafka/web/processing/consumers/aggregators/metrics.rb +1 -1
  364. data/lib/karafka/web/processing/consumers/aggregators/state/context.rb +39 -0
  365. data/lib/karafka/web/processing/consumers/aggregators/state/steps/base.rb +41 -0
  366. data/lib/karafka/web/processing/consumers/aggregators/state/steps/evict_expired_processes.rb +38 -0
  367. data/lib/karafka/web/processing/consumers/aggregators/state/steps/increment_counters.rb +26 -0
  368. data/lib/karafka/web/processing/consumers/aggregators/state/steps/refresh_current_stats.rb +89 -0
  369. data/lib/karafka/web/processing/consumers/aggregators/state/steps/register_process.rb +32 -0
  370. data/lib/karafka/web/processing/consumers/aggregators/state.rb +34 -103
  371. data/lib/karafka/web/processing/consumers/contracts/aggregated_stats.rb +1 -1
  372. data/lib/karafka/web/processing/time_series_tracker.rb +1 -2
  373. data/lib/karafka/web/producer.rb +2 -1
  374. data/lib/karafka/web/tracking/consumers/contracts/consumer_group.rb +1 -2
  375. data/lib/karafka/web/tracking/consumers/contracts/report.rb +1 -1
  376. data/lib/karafka/web/tracking/consumers/contracts/subscription_group.rb +2 -2
  377. data/lib/karafka/web/tracking/consumers/listeners/base.rb +6 -0
  378. data/lib/karafka/web/tracking/consumers/listeners/connections.rb +7 -2
  379. data/lib/karafka/web/tracking/consumers/listeners/errors.rb +3 -3
  380. data/lib/karafka/web/tracking/consumers/listeners/processing.rb +1 -1
  381. data/lib/karafka/web/tracking/consumers/listeners/statistics.rb +1 -1
  382. data/lib/karafka/web/tracking/consumers/listeners/tags.rb +1 -2
  383. data/lib/karafka/web/tracking/consumers/sampler/enrichers/consumer_groups.rb +1 -0
  384. data/lib/karafka/web/tracking/consumers/sampler/metrics/container.rb +1 -2
  385. data/lib/karafka/web/tracking/consumers/sampler/metrics/jobs.rb +14 -5
  386. data/lib/karafka/web/tracking/consumers/sampler/metrics/os.rb +3 -5
  387. data/lib/karafka/web/tracking/consumers/sampler/metrics/server.rb +2 -1
  388. data/lib/karafka/web/tracking/consumers/sampler.rb +10 -4
  389. data/lib/karafka/web/tracking/helpers/error_info.rb +0 -1
  390. data/lib/karafka/web/ui/base.rb +7 -4
  391. data/lib/karafka/web/ui/controllers/errors_controller.rb +2 -3
  392. data/lib/karafka/web/ui/controllers/requests/params.rb +1 -2
  393. data/lib/karafka/web/ui/helpers/application_helper.rb +39 -3
  394. data/lib/karafka/web/ui/lib/admin.rb +2 -1
  395. data/lib/karafka/web/ui/lib/cache.rb +2 -3
  396. data/lib/karafka/web/ui/lib/hash_proxy.rb +1 -2
  397. data/lib/karafka/web/ui/lib/paginations/paginators/arrays.rb +5 -1
  398. data/lib/karafka/web/ui/lib/sorter.rb +1 -2
  399. data/lib/karafka/web/ui/models/counters.rb +23 -25
  400. data/lib/karafka/web/ui/models/message.rb +1 -2
  401. data/lib/karafka/web/ui/models/metrics/aggregated.rb +4 -1
  402. data/lib/karafka/web/ui/models/recurring_tasks/schedule.rb +1 -2
  403. data/lib/karafka/web/ui/models/status/checks/base.rb +1 -2
  404. data/lib/karafka/web/ui/models/status/checks/replication.rb +3 -4
  405. data/lib/karafka/web/ui/models/status/context.rb +12 -0
  406. data/lib/karafka/web/ui/models/subscription_group.rb +0 -1
  407. data/lib/karafka/web/ui/models/topic.rb +3 -1
  408. data/lib/karafka/web/ui/public/javascripts/application.js +1 -0
  409. data/lib/karafka/web/ui/public/javascripts/application.min.js +9 -9
  410. data/lib/karafka/web/ui/public/javascripts/application.min.js.br +0 -0
  411. data/lib/karafka/web/ui/public/javascripts/application.min.js.gz +0 -0
  412. data/lib/karafka/web/ui/public/javascripts/components/modal_opener.js +19 -0
  413. data/lib/karafka/web/ui/public/javascripts/components/tabs_manager.js +8 -3
  414. data/lib/karafka/web/ui/public/stylesheets/application.min.css +3528 -4141
  415. data/lib/karafka/web/ui/public/stylesheets/application.min.css.br +0 -0
  416. data/lib/karafka/web/ui/public/stylesheets/application.min.css.gz +0 -0
  417. data/lib/karafka/web/ui/public/stylesheets/libs/highlight_dark.min.css.gz +0 -0
  418. data/lib/karafka/web/ui/public/stylesheets/libs/highlight_light.min.css.gz +0 -0
  419. data/lib/karafka/web/ui/public/stylesheets/libs/tailwind.css +30 -61
  420. data/lib/karafka/web/ui/routes/assets.rb +0 -1
  421. data/lib/karafka/web/ui/views/cluster/_breadcrumbs.erb +1 -1
  422. data/lib/karafka/web/ui/views/cluster/_no_partitions.erb +1 -1
  423. data/lib/karafka/web/ui/views/cluster/_partition.erb +2 -6
  424. data/lib/karafka/web/ui/views/cluster/brokers.erb +1 -1
  425. data/lib/karafka/web/ui/views/cluster/replication.erb +2 -2
  426. data/lib/karafka/web/ui/views/consumers/_assignments_badges.erb +0 -1
  427. data/lib/karafka/web/ui/views/consumers/_consumer.erb +1 -3
  428. data/lib/karafka/web/ui/views/consumers/_no_consumers.erb +2 -2
  429. data/lib/karafka/web/ui/views/consumers/_tabs.erb +6 -19
  430. data/lib/karafka/web/ui/views/consumers/index.erb +4 -4
  431. data/lib/karafka/web/ui/views/dashboard/_counters.erb +8 -12
  432. data/lib/karafka/web/ui/views/dashboard/_feature_pro.erb +1 -1
  433. data/lib/karafka/web/ui/views/dashboard/_not_enough_data.erb +1 -1
  434. data/lib/karafka/web/ui/views/errors/_cleaned.erb +1 -1
  435. data/lib/karafka/web/ui/views/errors/_detail.erb +0 -12
  436. data/lib/karafka/web/ui/views/errors/_no_errors.erb +1 -1
  437. data/lib/karafka/web/ui/views/jobs/_job.erb +1 -3
  438. data/lib/karafka/web/ui/views/jobs/_no_jobs.erb +1 -1
  439. data/lib/karafka/web/ui/views/layout.erb +0 -1
  440. data/lib/karafka/web/ui/views/routing/_breadcrumbs.erb +1 -1
  441. data/lib/karafka/web/ui/views/routing/_topic.erb +5 -3
  442. data/lib/karafka/web/ui/views/routing/show.erb +1 -1
  443. data/lib/karafka/web/ui/views/shared/_compacted_message_info.erb +5 -5
  444. data/lib/karafka/web/ui/views/shared/_empty_state.erb +26 -0
  445. data/lib/karafka/web/ui/views/shared/_gated_nav_item.erb +11 -0
  446. data/lib/karafka/web/ui/views/shared/_navigation.erb +7 -60
  447. data/lib/karafka/web/ui/views/shared/_no_paginated_data.erb +4 -3
  448. data/lib/karafka/web/ui/views/shared/_tab_nav.erb +16 -3
  449. data/lib/karafka/web/ui/views/shared/_title.erb +2 -2
  450. data/lib/karafka/web/ui/views/shared/alerts/_box_primary.erb +1 -1
  451. data/lib/karafka/web/ui/views/shared/alerts/_box_secondary.erb +1 -1
  452. data/lib/karafka/web/ui/views/shared/exceptions/pro_only.erb +6 -6
  453. data/lib/karafka/web/ui/views/shared/icons/_document.erb +4 -0
  454. data/lib/karafka/web/ui/views/shared/icons/_folder.erb +4 -0
  455. data/lib/karafka/web/ui/views/shared/icons/_gear.erb +2 -1
  456. data/lib/karafka/web/ui/views/shared/icons/_inbox.erb +4 -0
  457. data/lib/karafka/web/ui/views/shared/icons/_key.erb +4 -0
  458. data/lib/karafka/web/ui/views/shared/icons/_magnifying_glass.erb +2 -1
  459. data/lib/karafka/web/ui/views/status/failures/_state_calculation.erb +1 -1
  460. data/lib/karafka/web/ui/views/status/failures/_topics.erb +1 -1
  461. data/lib/karafka/web/ui/views/status/warnings/_commands_topic_presence.erb +1 -1
  462. data/lib/karafka/web/ui/views/status/warnings/_pro_subscription.erb +1 -1
  463. data/lib/karafka/web/ui/views/support/show.erb +12 -4
  464. data/lib/karafka/web/ui/views/ux/_badges.erb +32 -0
  465. data/lib/karafka/web/ui/views/ux/_breadcrumbs_showcase.erb +24 -0
  466. data/lib/karafka/web/ui/views/ux/_buttons.erb +24 -0
  467. data/lib/karafka/web/ui/views/ux/_card_support.erb +2 -2
  468. data/lib/karafka/web/ui/views/ux/_cards.erb +6 -0
  469. data/lib/karafka/web/ui/views/ux/_data_table.erb +8 -8
  470. data/lib/karafka/web/ui/views/ux/_dropdowns.erb +16 -0
  471. data/lib/karafka/web/ui/views/ux/_empty_states.erb +41 -0
  472. data/lib/karafka/web/ui/views/ux/_modals.erb +31 -0
  473. data/lib/karafka/web/ui/views/ux/_pagination.erb +4 -4
  474. data/lib/karafka/web/ui/views/ux/_status_rows.erb +1 -1
  475. data/lib/karafka/web/ui/views/ux/_tabs.erb +3 -3
  476. data/lib/karafka/web/ui/views/ux/_text.erb +18 -0
  477. data/lib/karafka/web/ui/views/ux/_tooltips.erb +4 -0
  478. data/lib/karafka/web/ui/views/ux/_topic_tiles.erb +4 -4
  479. data/lib/karafka/web/ui/views/ux/show.erb +6 -1
  480. data/lib/karafka/web/version.rb +1 -1
  481. data/lib/karafka/web.rb +1 -8
  482. data/package-lock.json +727 -725
  483. data/package.json +5 -3
  484. data/renovate.json +25 -3
  485. metadata +44 -23
  486. data/config/locales/slogans.yml +0 -62
  487. data/lib/karafka/web/ui/views/shared/_become_pro.erb +0 -13
  488. data/lib/karafka/web/ui/views/ux/_row_table.erb +0 -52
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5377e1f7c20ed732850895389e9e47be86f94c85068fe363fab13fb52d4f12a4
4
- data.tar.gz: f774171188b56858db87e66088436f88dc4d36460743d29152cb3b3fcc7119b2
3
+ metadata.gz: 64a1fc3668da51d60226e170e3942d77e9da1dc440d85a16e5678d0bb54ca592
4
+ data.tar.gz: efa56ac32d1591a5a47fb220f295909796e2b891bb26ab26ced879f55f0c8484
5
5
  SHA512:
6
- metadata.gz: 494a61a08bf0fd768827c05add65ad3d6d13f9e50140d37b25cf9faf9c8f2eecc1b6033612d377fd9cde6fe9d2004817ffa4e1ce8fea1fb24363ca845f979c69
7
- data.tar.gz: 3c55088e048fe5a8a861a09d2dabdbea6d4e47423949d3927de646456a5f891628858c377c0bb636e34545d512d3a01887cc25dc55c37bf3904ccc79b3b918de
6
+ metadata.gz: aacdce1efe87f6d288f6167e980418def9d1f5c17c51fc255c2bdce025caf3bd80466d946b48972c5f33259a5e6aff3d38f1b529133688b0698e6e6f86b8f21c
7
+ data.tar.gz: db6a64d3fefd229472b6b67c96844328e7e926e9bc145602c8d72b8f40cbf2911bc7092e8401fab30dad6cdc39a09fb7e020ddc279d4c103d3425a58041db422
data/CHANGELOG.md CHANGED
@@ -1,5 +1,50 @@
1
1
  # Karafka Web Changelog
2
2
 
3
+ ## 1.0.0 (Unreleased)
4
+ - [Fix] Fix two precision bugs in `Aggregators::State`/`Aggregators::Metrics` process eviction and utilization, both caught by a Copilot PR review and confirmed on the merged pipeline refactor. `evict_expired_processes` computed the ttl window via integer division (`config.ttl / 1_000`), truncating any non-multiple-of-1000 millisecond ttl and evicting processes up to ~999ms earlier than configured; it now uses float division. `RefreshCurrentStats#call` computed average utilization via `utilization / (stats[:processes] + 0.0001)`, an epsilon guard against division by zero that also systematically underestimated utilization for any nonzero process count; it now divides exactly and returns `0.0` only when there are zero active processes.
5
+ - [Fix] Fix the real cause of the intermittent, seemingly-unrelated CI-only Pro Explorer flakes finally surfaced by the `assert_ok` diagnostic below: not a Kafka broker/timing race, but Ruby's object-shape warning (a controller class crossing 8 distinct instance-variable shapes) being turned into a hard failure by the test suite's `Warning.process` hook. Controllers, like the Roda app classes already exempted, legitimately accumulate many shapes because they conditionally set a handful of instance variables depending on the specific request branch taken (e.g. Explorer's `#show` only sets `@safe_key`/`@safe_headers`/`@safe_payload` when the message isn't a compacted/system entry). Which controller happens to cross the threshold depends on minitest's random run order, which is why it surfaced as an unrelated-looking flake instead of a stable, reproducible failure. Widened the existing `Ui::App` shape-variation exception to cover controller classes too.
6
+ - [Enhancement] Make `assert_ok` surface the actual captured exception (class, message, backtrace) on a 500, not just the generic static error page body. Subscribes to the same `error.occurred` monitor event the production error handler already dispatches web UI errors through, capturing the last one per test. This has been the main blocker in diagnosing rare CI-only flakes in the Pro Explorer controller specs, where a failure only ever showed the generic HTML error page with no indication of what actually broke.
7
+ - [Enhancement] Remove the OSS "support Karafka Pro" banner that was rendered on every Web UI page for non-Pro users. It's no longer needed at this stage since users are already aware of the Pro offering.
8
+ - [Enhancement] Migrate the Web UI topic declarations to Karafka's new standalone `Karafka::App.declaratives.draw` API (Karafka `2.6.0.beta1`). The Web UI topics are declared as `active false` (Web UI manages their creation and runtime replication factor itself), replacing the deprecated routing-based `config(active: false)` bridge that was previously called on each routing topic.
9
+ - [Enhancement] Add `Warning.process` block to the test helper to turn Ruby warnings originating from the project code into test failures.
10
+ - [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.
11
+ - [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.
12
+ - [Enhancement] Allow for zero value in number of workers to support dynamic scaling of Karafka workers.
13
+ - [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.
14
+ - [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.
15
+ - [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.
16
+ - [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.
17
+ - [Change] Require Roda `>= 3.100` (previously `~> 3.69`).
18
+ - [Fix] Harden the `wait_for_offset_visible` test helper (used after a transactional produce) to also exercise the Web UI's own message-read path, not just the admin watermark offset. The admin watermark advancing only proves the broker appended the control record; the Web UI reads with a much shorter `fetch.wait.max.ms` than the admin client and could still intermittently raise or return stale results on that exact offset (e.g. the flaky Pro Explorer `system entry` spec), even after the watermark-only wait introduced previously. The helper now also polls the same `Karafka::Web::Ui::Lib::Admin.read_topic` call the Web UI performs and requires it to complete without error before returning.
19
+ - [Fix] Fix two more flaky Pro Explorer `#recent` specs (`when getting recent for the whole topic` / `when recent is on the first partition` and `when recent is on another partition`). Both produced a message to one partition, then a fixed `sleep(0.1)` before producing the message that should be "most recent" to another partition and immediately requesting the endpoint, racing broker propagation under CI load the same way the already-fixed single-partition `#recent` spec did. Replaced the fixed sleep with a `wait_for_message` poll on the second produce's own offset, matching the existing pattern used by the sibling spec right below it.
20
+ - [Fix] Stop a long, unbreakable page title (e.g. a long topic name on the Pro Explorer topic page) and the breadcrumbs bar above it from overflowing the page. A grid/flex item's default `min-width: auto` let the title and breadcrumbs blow out past the viewport instead of shrinking, which pushed layout wide enough to force an unexpected page scrollbar. The title wrapper and `breadcrumbs-wrapper` now set `min-width: 0`, the title text wraps via `overflow-wrap: anywhere`, and the breadcrumbs list now wraps onto multiple lines instead of relying on an easy-to-miss horizontal scroll.
21
+ - [Fix] Stop long, unbreakable flash messages (e.g. a long dotted/underscored topic name in a "successfully created" notice) from overflowing their alert box. DaisyUI's `.alert` grid track sized the message column to its content's intrinsic width, so long single-token strings pushed past the box edge instead of wrapping. The message `span` now sets `overflow-wrap: anywhere` and `min-width: 0` so it wraps within the alert instead.
22
+ - [Fix] Stop long, dotted/underscored Pro Explorer, DLQ, and Topics topic-tile names from overflowing or overlapping their tile. `topic-tile-text` now sets `overflow-wrap: anywhere` so unbreakable names wrap inside the tile instead of spilling out, and the topic-tile link in those three views now carries a `title` attribute showing the full topic name on hover.
23
+ - [Fix] Make the `create_topic` test helper wait until a freshly created topic's partitions are actually readable (expected partition count visible and watermark offsets queryable), not just until the topic name appears in cluster metadata. This removes a flaky failure in multi-partition specs (e.g. the topics distribution controller) that intermittently 404'd because watermark offsets were read before the partition leaders had propagated.
24
+ - [Fix] Stop the array paginator from offering a "Next" link to an empty page when the last page is exactly full. `Paginators::Arrays` decided "is there a next page?" from whether the current page was full, so any list whose total size was an exact multiple of `per_page` (25/50/75/...) surfaced a Next link leading to an empty page. It now reports the last page based on whether a further slice actually exists.
25
+ - [Fix] Compute the dashboard average batch size with float division so it is no longer floored. `Metrics::Aggregated` divided the per-window message delta by the batch delta using integer division, so e.g. 1000 messages over 47 batches charted as `21` instead of `21.28`, systematically under-reporting the average. It now uses float division rounded to 2 decimals.
26
+ - [Fix] Include jobs in the `waiting` state when aggregating the dashboard "Pending" counter. `State#refresh_current_stats` now resets and sums `stats[:waiting]` from incoming consumer reports (previously it was never aggregated and stayed `0`), so `Counters#pending` (`enqueued + waiting`) no longer undercounts jobs sitting in advanced/recurring/scheduled-message schedulers. `:waiting` is now also validated by the `AggregatedStats` contract.
27
+ - [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.
28
+ - [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.
29
+ - [Fix] Remove `cgi` as no longer needed.
30
+ - [Fix] Exclude `test/` directory from gem releases to reduce package size.
31
+ - [Fix] Update LinksValidator regexes to match the new `it-{hash}-{uuid}` test topic naming format, fixing test-order dependent failures in explorer controller specs.
32
+ - [Fix] Fix alerts formatting for the distribution view.
33
+ - [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.
34
+ - [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.
35
+ - [Fix] Normalize a batch of styling inconsistencies found while auditing #906: a `data-table-wraper` typo left the Cluster replication table unstyled, `Cluster::_config` rendered raw `true`/`false` instead of badges (unlike the identical `Topics::Configs` table), a Recurring Tasks "Trigger" button's disabled state was computed but never applied to its class, several views carried dead pre-Tailwind Bootstrap classes (`col-sm-*`, `col-lg-*`, `row`, `container-wrapper`) with no effect, one Topics Configs action cell was missing the `options` column class, a handful of breadcrumb/title labels had grammar or casing inconsistencies ("Cluster informations", "Consumers Groups Health", "Dead Letter Queue topics"), the OSS Routing topic list hand-rolled a `badge-warning` for inactive topics instead of the `badge_secondary` used by the identical Pro table, the filtered-payload notice used unstyled Bootstrap-era markup instead of the shared `alert_box_warning` primitive, `status-row-stopping` was colored red (`border-l-error`) while `status_badge` treats "stopping" as the same warning tier as "quiet"/"quieting", three Pro Topics checklist notices (before deleting a topic, increasing partitions, or editing a config value) hand-rolled a bare `alert` div with no severity color or icon instead of the shared `alert_box_warning` primitive used by their sibling warning boxes on the same pages, `alert_box_primary`/`alert_box_secondary` displayed the success checkmark icon (copy-pasted from `alert_box_success`) instead of matching their non-box `info_circle`/`pause_circle` siblings, the internal style-guide page demoed the wrong pencil icon for edit actions, and a scheduled message's "Cancel dispatch" button used a passive error-status icon instead of the `trash` icon already used for every other removal action.
36
+ - [Fix] Continue normalizing styling inconsistencies from the #906 audit: Health and Recurring Tasks tab bars hand-rolled `col-span-12 mb-9` instead of the shared `tab-container-wrapper` class, and the Scheduled Messages per-partition schedule heading used `h3`/`.h3` where the equivalent per-group heading on Health pages uses `h2`/`.h2`.
37
+ - [Fix] Retire the `.row-table`/`.row-table-wrapper` table primitive, which had drifted to a single real caller (the Pro per-topic Errors table) against 45+ real uses of `.data-table`, and additionally used a different button-alignment convention (`text-center` vs. `.data-table`'s `text-right`) than every other action column in the app. Switched that one table to `.data-table`, removed the now fully unused CSS utilities and their style-guide demo, and fixed a stale ".row-table" label left over in an unrelated `.data-table` demo section.
38
+ - [Enhancement] Add a standardized `empty_state` helper/component (icon, message, optional description, and optional call-to-action) and replace the ad hoc `alert_info`/`alert_box_info` "There are no X" messages across every empty-list view (Jobs, DLQ, Explorer, Health, Errors, Consumers, Recurring Tasks, Scheduled Messages, dashboard, and paginated tables) with it, for a consistent look across the Web UI. Demoed on the internal style-guide `/ux` page.
39
+ - [Fix] Fix unreadable `.btn-outline.btn-active` buttons (e.g. the dashboard time-range selector) in both the light and dark themes. The daisyUI 5.6 upgrade left the active state's background color computed from the same `--btn-color` variable as the outline's text color, so the two nearly matched; the button now switches to the color-variant's contrasting foreground color when active, matching its existing `:hover` behavior.
40
+ - [Enhancement] Expand the internal `/ux` style-guide page to cover every UI component actually used across the app, so upgrades (daisyUI, Tailwind, etc.) can be visually spot-checked in one place: plain `.card`/`.card-body`, `.modal`/`dialog`, `.dropdown`, `.tooltip`, the `.btn-ghost`/`.btn-square`/`.btn-action`/`.btn-lockable`/`.confirm-action` button modifiers, the breadcrumbs component, and the `status_badge`/`lag_trend_badge`/`kafka_state_badge`/`lso_risk_state_badge`/`truncate`/`lag_with_label`/`offset_with_label` helper methods (previously only their raw CSS classes were demoed). Adds a small reusable `ModalOpener` JS component (`[data-modal-open]`) since the CSP disallows the inline `onclick` handler style used by the existing search modal trigger.
41
+ - [Fix] Fix a flaky Pro Explorer spec (`when requested message exists but is a system entry`) caused by the `produce` test helper's transactional flow: it only waited a fixed `sleep(0.1)` for a transactional produce's commit control record to become visible before the test reads it back, which is too short under CI load and made the spec intermittently 404 or see stale content. Replaced the fixed sleep with a `wait_for_offset_visible` poll that waits until the control record's offset is actually part of the readable watermark range, mirroring the existing `wait_for_message`/`create_topic` readiness-polling pattern instead of a fixed delay.
42
+ - [Fix] Stop a misclick on a Pro-gated OSS element from fully navigating away to the standalone "Pro Feature" upsell page. This affected the sidebar (Health, Explorer, Cron, Schedules, Dead, Topics), the Consumers tabs (Performance, Controls, Commands), the dashboard's "Data transfers" chart tab, and several unguarded links with no visual gating indicator at all: the dashboard's "Total lag"/"Dead" counters, Cluster topic/partition names, per-message Explorer offset links on the Errors detail page, and consumer process IDs on the Consumers and Jobs list pages. Gated sidebar/tab items are now truly inert `disabled` buttons with an "Available in Karafka Pro" hover tooltip instead of `<a href>` links (or, for the dashboard chart tab, a JS-clickable `<span>`) pointing at the real Pro-only content; the previously-unguarded inline links are now plain text in the OSS templates, with a matching Pro-only view override (`dashboard/_counters`, `cluster/_partition`, `errors/_detail`) restoring the links for Pro users, keeping the OSS templates free of any `Karafka.pro?` branching. Also fixes the sidebar's collapse/expand toggle showing the default arrow cursor instead of a pointer on hover, and hardens `TabsManager` (the chart-tab-switching JS) to no-op instead of throwing when a tab's target content or a previously-active tab is missing/disabled, which had broken tab-switching for the Utilization/RSS/Concurrency charts for anyone who had the now-disabled "Data transfers" tab persisted as their last-active tab. Closes #1106.
43
+ - [Fix] Add `rel="noopener noreferrer"` to every `target="_blank"` link across the Web UI (docs, Slack, GitHub, and "become Pro" links in the support, status, dashboard, and Pro topic-replication warning views). Without it, the opened external page could access `window.opener` and redirect the original Web UI tab to an arbitrary page (reverse tabnabbing).
44
+ - [Fix] Fix a flaky Pro Explorer spec (`ExplorerController#recent::when getting recent for the partition`) that produced a message and immediately requested the "recent" endpoint with no readiness wait, occasionally racing the broker's propagation of the just-produced message under CI load. Added a `wait_for_message` poll before the request, matching the existing readiness-polling pattern used elsewhere in the suite.
45
+ - [Enhancement] Replace the bare `assert(response.ok?)` pattern with a new `assert_ok` test helper across the whole controller test suite (381 call sites). On failure it now prints the actual response status and a body excerpt instead of a generic "Expected false to be truthy", making intermittent CI-only non-200 failures actually diagnosable.
46
+ - [Change] Switch to Karafka 2.6's new, group-type-agnostic `#group`/`group_id` accessors instead of `#consumer_group`/`consumer_group_id` when reading from Karafka's own routing and instrumentation APIs (`topic.group`, `subscription_group.group`, `event[:group_id]`), preparing for upcoming Kafka share group support (KIP-932). `consumer_group`/`consumer_group_id` remain as karafka-web's own internal naming (tracking payloads, commanding schema, UI labels) — only the calls into Karafka's own API surface changed. Closes #1022.
47
+
3
48
  ## 0.11.6 (2026-02-01)
4
49
  - **[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
50
  - [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,39 +49,37 @@ 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)
73
- yard (0.9.38)
74
- yard-lint (1.4.0)
61
+ yard (0.9.45)
62
+ yard-lint (1.10.1)
75
63
  yard (~> 0.9)
76
64
  zeitwerk (~> 2.6)
77
- zeitwerk (2.7.4)
65
+ zeitwerk (2.8.2)
78
66
 
79
67
  PLATFORMS
80
68
  ruby
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
93
81
  ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383
82
+ bundler (4.0.17) sha256=214e21431b5665dd2f99df8a5511c6b151d7a72e8015c8b38f8b775b61cbb6c1
94
83
  json (2.18.0) sha256=b10506aee4183f5cf49e0efc48073d7b75843ce3782c68dbeb763351c08fd505
95
84
  language_server-protocol (3.17.0.5) sha256=fd1e39a51a28bf3eec959379985a72e296e9f9acfce46f6a79d31ca8760803cc
96
85
  lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87
@@ -102,22 +91,19 @@ CHECKSUMS
102
91
  regexp_parser (2.11.3) sha256=ca13f381a173b7a93450e53459075c9b76a10433caadcb2f1180f2c741fc55a4
103
92
  rubocop (1.82.1) sha256=09f1a6a654a960eda767aebea33e47603080f8e9c9a3f019bf9b94c9cab5e273
104
93
  rubocop-ast (1.49.0) sha256=49c3676d3123a0923d333e20c6c2dbaaae2d2287b475273fddee0c61da9f71fd
105
- rubocop-capybara (2.22.1) sha256=ced88caef23efea53f46e098ff352f8fc1068c649606ca75cb74650970f51c0c
106
- rubocop-factory_bot (2.28.0) sha256=4b17fc02124444173317e131759d195b0d762844a71a29fe8139c1105d92f0cb
94
+ rubocop-minitest (0.39.1) sha256=998398d6da4026d297f0f9bf709a1eac5f2b6947c24431f94af08138510cf7ed
107
95
  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
96
  rubocop-thread_safety (0.7.3) sha256=067cdd52fbf5deffc18995437e45b5194236eaff4f71de3375a1f6052e48f431
111
97
  ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
112
98
  standard (1.53.0) sha256=f3c9493385db7079d0abce6f7582f553122156997b81258cd361d3480eeacf9c
113
99
  standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b
100
+ standard-minitest (1.0.0) sha256=450caa86a64a6e6f6f186cc88601dbb49b6cfaa3b0dce77a73b50ba8cdc15b2a
114
101
  standard-performance (1.9.0) sha256=49483d31be448292951d80e5e67cdcb576c2502103c7b40aec6f1b6e9c88e3f2
115
- standard-rspec (0.3.1) sha256=67bc957281cacf24f0d88235ca1bf28a8995265b1a60eb519cd0451858b56a22
116
102
  unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42
117
103
  unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f
118
- yard (0.9.38) sha256=721fb82afb10532aa49860655f6cc2eaa7130889df291b052e1e6b268283010f
119
- yard-lint (1.4.0) sha256=7dd88fbb08fd77cb840bea899d58812817b36d92291b5693dd0eeb3af9f91f0f
120
- zeitwerk (2.7.4) sha256=2bef90f356bdafe9a6c2bd32bcd804f83a4f9b8bc27f3600fff051eb3edcec8b
104
+ yard (0.9.45) sha256=52e211493f7cb8a3ebf7e104a25a1e73937a3103092545d34cb88fafebb3dc51
105
+ yard-lint (1.10.1) sha256=172ea1905304580bd515c093d82831ec4889e725100c49d5bf77e62101f49129
106
+ zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12
121
107
 
122
108
  BUNDLED WITH
123
- 4.0.3
109
+ 4.0.17
data/Gemfile.lock CHANGED
@@ -1,95 +1,78 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- karafka-web (0.11.6)
4
+ karafka-web (1.0.0.rc1)
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.6.0.beta1, < 2.7.0)
7
+ karafka-core (>= 2.6.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)
34
- docile (1.4.1)
16
+ concurrent-ruby (1.3.7)
35
17
  drb (2.2.3)
36
18
  erubi (1.13.1)
37
19
  et-orbi (1.4.0)
38
20
  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)
21
+ ffi (1.17.4)
22
+ ffi (1.17.4-aarch64-linux-gnu)
23
+ ffi (1.17.4-aarch64-linux-musl)
24
+ ffi (1.17.4-arm-linux-gnu)
25
+ ffi (1.17.4-arm-linux-musl)
26
+ ffi (1.17.4-arm64-darwin)
27
+ ffi (1.17.4-x86-linux-gnu)
28
+ ffi (1.17.4-x86-linux-musl)
29
+ ffi (1.17.4-x86_64-darwin)
30
+ ffi (1.17.4-x86_64-linux-gnu)
31
+ ffi (1.17.4-x86_64-linux-musl)
32
+ fugit (1.13.0)
53
33
  et-orbi (~> 1.4)
54
34
  raabro (~> 1.4)
55
- i18n (1.14.7)
56
- concurrent-ruby (~> 1.0)
57
35
  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)
36
+ json (2.20.0)
37
+ karafka (2.6.0.beta1)
38
+ karafka-core (>= 2.6.0, < 2.7.0)
39
+ karafka-rdkafka (>= 0.27.2)
40
+ waterdrop (>= 2.10.1, < 3.0.0)
64
41
  zeitwerk (~> 2.3)
65
- karafka-core (2.5.7)
42
+ karafka-core (2.6.2)
66
43
  karafka-rdkafka (>= 0.20.0)
67
44
  logger (>= 1.6.0)
68
- karafka-rdkafka (0.23.0)
45
+ karafka-rdkafka (0.27.2)
69
46
  ffi (~> 1.17.1)
70
47
  json (> 2.0)
71
48
  logger
72
49
  mini_portile2 (~> 2.6)
73
50
  rake (> 12)
74
- karafka-rdkafka (0.23.0-aarch64-linux-gnu)
51
+ karafka-rdkafka (0.27.2-aarch64-linux-gnu)
75
52
  ffi (~> 1.17.1)
76
53
  json (> 2.0)
77
54
  logger
78
55
  mini_portile2 (~> 2.6)
79
56
  rake (> 12)
80
- karafka-rdkafka (0.23.0-arm64-darwin)
57
+ karafka-rdkafka (0.27.2-aarch64-linux-musl)
81
58
  ffi (~> 1.17.1)
82
59
  json (> 2.0)
83
60
  logger
84
61
  mini_portile2 (~> 2.6)
85
62
  rake (> 12)
86
- karafka-rdkafka (0.23.0-x86_64-linux-gnu)
63
+ karafka-rdkafka (0.27.2-arm64-darwin)
87
64
  ffi (~> 1.17.1)
88
65
  json (> 2.0)
89
66
  logger
90
67
  mini_portile2 (~> 2.6)
91
68
  rake (> 12)
92
- karafka-rdkafka (0.23.0-x86_64-linux-musl)
69
+ karafka-rdkafka (0.27.2-x86_64-linux-gnu)
70
+ ffi (~> 1.17.1)
71
+ json (> 2.0)
72
+ logger
73
+ mini_portile2 (~> 2.6)
74
+ rake (> 12)
75
+ karafka-rdkafka (0.27.2-x86_64-linux-musl)
93
76
  ffi (~> 1.17.1)
94
77
  json (> 2.0)
95
78
  logger
@@ -97,70 +80,57 @@ GEM
97
80
  rake (> 12)
98
81
  logger (1.7.0)
99
82
  mini_portile2 (2.8.9)
100
- minitest (5.26.1)
101
- nokogiri (1.19.0)
83
+ minitest (6.0.6)
84
+ drb (~> 2.0)
85
+ prism (~> 1.5)
86
+ mocha (3.1.0)
87
+ ruby2_keywords (>= 0.0.5)
88
+ nokogiri (1.19.4)
102
89
  mini_portile2 (~> 2.8.2)
103
90
  racc (~> 1.4)
104
- nokogiri (1.19.0-aarch64-linux-gnu)
91
+ nokogiri (1.19.4-aarch64-linux-gnu)
105
92
  racc (~> 1.4)
106
- nokogiri (1.19.0-aarch64-linux-musl)
93
+ nokogiri (1.19.4-aarch64-linux-musl)
107
94
  racc (~> 1.4)
108
- nokogiri (1.19.0-arm-linux-gnu)
95
+ nokogiri (1.19.4-arm-linux-gnu)
109
96
  racc (~> 1.4)
110
- nokogiri (1.19.0-arm-linux-musl)
97
+ nokogiri (1.19.4-arm-linux-musl)
111
98
  racc (~> 1.4)
112
- nokogiri (1.19.0-arm64-darwin)
99
+ nokogiri (1.19.4-arm64-darwin)
113
100
  racc (~> 1.4)
114
- nokogiri (1.19.0-x86_64-darwin)
101
+ nokogiri (1.19.4-x86_64-darwin)
115
102
  racc (~> 1.4)
116
- nokogiri (1.19.0-x86_64-linux-gnu)
103
+ nokogiri (1.19.4-x86_64-linux-gnu)
117
104
  racc (~> 1.4)
118
- nokogiri (1.19.0-x86_64-linux-musl)
105
+ nokogiri (1.19.4-x86_64-linux-musl)
119
106
  racc (~> 1.4)
120
107
  ostruct (0.6.3)
108
+ prism (1.9.0)
121
109
  raabro (1.4.0)
122
110
  racc (1.8.1)
123
- rack (3.2.4)
111
+ rack (3.2.6)
124
112
  rack-test (2.2.0)
125
113
  rack (>= 1.3)
126
114
  rackup (0.2.3)
127
115
  rack (>= 3.0.0.beta1)
128
116
  webrick
129
- rake (13.3.1)
117
+ rake (13.4.2)
130
118
  reline (0.6.3)
131
119
  io-console (~> 0.5)
132
- roda (3.98.0)
120
+ roda (3.105.0)
133
121
  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)
148
- simplecov (0.22.0)
149
- docile (~> 1.1)
150
- simplecov-html (~> 0.11)
151
- simplecov_json_formatter (~> 0.1)
152
- simplecov-html (0.13.2)
153
- simplecov_json_formatter (0.1.4)
154
- tilt (2.6.1)
122
+ ruby2_keywords (0.0.5)
123
+ simplecov (1.0.2)
124
+ tilt (2.7.0)
155
125
  tzinfo (2.0.6)
156
126
  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)
127
+ warning (1.6.0)
128
+ waterdrop (2.10.2)
129
+ karafka-core (>= 2.5.12, < 3.0.0)
130
+ karafka-rdkafka (>= 0.24.0)
161
131
  zeitwerk (~> 2.3)
162
- webrick (1.9.1)
163
- zeitwerk (2.7.3)
132
+ webrick (1.9.2)
133
+ zeitwerk (2.8.2)
164
134
 
165
135
  PLATFORMS
166
136
  aarch64-linux-gnu
@@ -177,15 +147,16 @@ PLATFORMS
177
147
 
178
148
  DEPENDENCIES
179
149
  byebug
180
- factory_bot
181
150
  fugit
182
151
  karafka-web!
152
+ minitest
153
+ mocha
183
154
  nokogiri
184
155
  ostruct
185
156
  rack-test
186
157
  rackup (~> 0.2)
187
- rspec
188
158
  simplecov
159
+ warning
189
160
 
190
161
  BUNDLED WITH
191
- 2.7.1
162
+ 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/'