munawaba 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +12 -0
  3. data/LICENSE.txt +21 -0
  4. data/README.md +160 -0
  5. data/SECURITY.md +15 -0
  6. data/app/assets/munawaba/INTER-LICENSE.txt +92 -0
  7. data/app/assets/munawaba/JETBRAINS-MONO-LICENSE.txt +93 -0
  8. data/app/assets/munawaba/dashboard.css +272 -0
  9. data/app/assets/munawaba/dashboard.js +60 -0
  10. data/app/assets/munawaba/inter.woff2 +0 -0
  11. data/app/assets/munawaba/jetbrains-mono.woff2 +0 -0
  12. data/app/assets/munawaba/logo.png +0 -0
  13. data/app/controllers/munawaba/application_controller.rb +149 -0
  14. data/app/controllers/munawaba/audit_events_controller.rb +31 -0
  15. data/app/controllers/munawaba/calendars_controller.rb +47 -0
  16. data/app/controllers/munawaba/frontends_controller.rb +28 -0
  17. data/app/controllers/munawaba/notification_deliveries_controller.rb +41 -0
  18. data/app/controllers/munawaba/overrides_controller.rb +52 -0
  19. data/app/controllers/munawaba/overviews_controller.rb +22 -0
  20. data/app/controllers/munawaba/people_controller.rb +73 -0
  21. data/app/controllers/munawaba/rotations_controller.rb +61 -0
  22. data/app/controllers/munawaba/schedules_controller.rb +115 -0
  23. data/app/controllers/munawaba/shifts_controller.rb +16 -0
  24. data/app/controllers/munawaba/slack_integrations_controller.rb +46 -0
  25. data/app/controllers/munawaba/themes_controller.rb +19 -0
  26. data/app/helpers/munawaba/application_helper.rb +208 -0
  27. data/app/jobs/munawaba/application_job.rb +7 -0
  28. data/app/jobs/munawaba/deliver_notification_job.rb +13 -0
  29. data/app/jobs/munawaba/dispatch_due_notifications_job.rb +7 -0
  30. data/app/jobs/munawaba/maintain_projection_job.rb +25 -0
  31. data/app/jobs/munawaba/maintenance_job.rb +28 -0
  32. data/app/models/munawaba/application_record.rb +7 -0
  33. data/app/models/munawaba/audit_event.rb +16 -0
  34. data/app/models/munawaba/notification_delivery.rb +75 -0
  35. data/app/models/munawaba/person.rb +23 -0
  36. data/app/models/munawaba/schedule.rb +85 -0
  37. data/app/models/munawaba/schedule_membership.rb +13 -0
  38. data/app/models/munawaba/shift.rb +51 -0
  39. data/app/models/munawaba/shift_override.rb +31 -0
  40. data/app/services/munawaba/audit/recorder.rb +17 -0
  41. data/app/services/munawaba/canonical.rb +43 -0
  42. data/app/services/munawaba/commands.rb +741 -0
  43. data/app/services/munawaba/conflicts/finder.rb +59 -0
  44. data/app/services/munawaba/integrations/planner_effects.rb +27 -0
  45. data/app/services/munawaba/integrations.rb +93 -0
  46. data/app/services/munawaba/notifications/context/v1.rb +65 -0
  47. data/app/services/munawaba/notifications/deliver.rb +94 -0
  48. data/app/services/munawaba/notifications/dispatcher.rb +50 -0
  49. data/app/services/munawaba/notifications/planner.rb +154 -0
  50. data/app/services/munawaba/notifications/reclaim_expired_leases.rb +27 -0
  51. data/app/services/munawaba/notifications/retry_failed.rb +51 -0
  52. data/app/services/munawaba/notifications/validity.rb +90 -0
  53. data/app/services/munawaba/notifications/wake_dispatcher.rb +17 -0
  54. data/app/services/munawaba/preview.rb +5 -0
  55. data/app/services/munawaba/result.rb +7 -0
  56. data/app/services/munawaba/shifts/normalize_future_timing.rb +172 -0
  57. data/app/services/munawaba/shifts/project.rb +50 -0
  58. data/app/services/munawaba/shifts/projection_plan.rb +89 -0
  59. data/app/services/munawaba/slack/client.rb +105 -0
  60. data/app/services/munawaba/slack/renderer.rb +48 -0
  61. data/app/services/munawaba/slack/webhook_validator.rb +35 -0
  62. data/app/services/munawaba/timing/boundary_calculator.rb +92 -0
  63. data/app/services/munawaba/timing/persisted_interval_verifier.rb +26 -0
  64. data/app/views/layouts/munawaba/application.html.erb +61 -0
  65. data/app/views/munawaba/audit_events/index.html.erb +85 -0
  66. data/app/views/munawaba/calendars/_shift.html.erb +17 -0
  67. data/app/views/munawaba/calendars/show.html.erb +81 -0
  68. data/app/views/munawaba/notification_deliveries/index.html.erb +65 -0
  69. data/app/views/munawaba/overrides/new.html.erb +19 -0
  70. data/app/views/munawaba/overviews/show.html.erb +76 -0
  71. data/app/views/munawaba/people/_form.html.erb +25 -0
  72. data/app/views/munawaba/people/edit.html.erb +2 -0
  73. data/app/views/munawaba/people/index.html.erb +49 -0
  74. data/app/views/munawaba/people/new.html.erb +2 -0
  75. data/app/views/munawaba/people/show.html.erb +34 -0
  76. data/app/views/munawaba/rotations/edit.html.erb +39 -0
  77. data/app/views/munawaba/schedules/_form.html.erb +49 -0
  78. data/app/views/munawaba/schedules/_resume_form.html.erb +24 -0
  79. data/app/views/munawaba/schedules/edit.html.erb +2 -0
  80. data/app/views/munawaba/schedules/index.html.erb +46 -0
  81. data/app/views/munawaba/schedules/new.html.erb +2 -0
  82. data/app/views/munawaba/schedules/resume.html.erb +4 -0
  83. data/app/views/munawaba/schedules/show.html.erb +86 -0
  84. data/app/views/munawaba/shared/_empty.html.erb +6 -0
  85. data/app/views/munawaba/shared/_errors.html.erb +23 -0
  86. data/app/views/munawaba/shared/_navigation.html.erb +8 -0
  87. data/app/views/munawaba/shared/_projection.html.erb +20 -0
  88. data/app/views/munawaba/shared/_proposal_details.html.erb +108 -0
  89. data/app/views/munawaba/shared/_shifts.html.erb +50 -0
  90. data/app/views/munawaba/shared/proposal.html.erb +5 -0
  91. data/app/views/munawaba/shifts/show.html.erb +65 -0
  92. data/app/views/munawaba/slack_integrations/edit.html.erb +48 -0
  93. data/config/routes.rb +45 -0
  94. data/db/migrate/20260905000001_create_munawaba_people.rb +33 -0
  95. data/db/migrate/20260905000002_create_munawaba_schedules.rb +73 -0
  96. data/db/migrate/20260905000003_create_munawaba_schedule_memberships.rb +25 -0
  97. data/db/migrate/20260905000004_create_munawaba_shifts.rb +51 -0
  98. data/db/migrate/20260905000005_create_munawaba_shift_overrides.rb +33 -0
  99. data/db/migrate/20260905000006_create_munawaba_notification_deliveries.rb +83 -0
  100. data/db/migrate/20260905000007_create_munawaba_audit_events.rb +36 -0
  101. data/db/migrate/20260905000008_simplify_munawaba_activity.rb +16 -0
  102. data/lib/generators/munawaba/install_generator.rb +34 -0
  103. data/lib/generators/munawaba/templates/munawaba.rb +23 -0
  104. data/lib/munawaba/configuration.rb +91 -0
  105. data/lib/munawaba/defaults.rb +20 -0
  106. data/lib/munawaba/engine.rb +16 -0
  107. data/lib/munawaba/version.rb +5 -0
  108. data/lib/munawaba.rb +33 -0
  109. metadata +287 -0
metadata ADDED
@@ -0,0 +1,287 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: munawaba
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Ali Hamdi Ali Fadel
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: actionpack
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '7.2'
19
+ - - "<"
20
+ - !ruby/object:Gem::Version
21
+ version: '8.2'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ version: '7.2'
29
+ - - "<"
30
+ - !ruby/object:Gem::Version
31
+ version: '8.2'
32
+ - !ruby/object:Gem::Dependency
33
+ name: actionview
34
+ requirement: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '7.2'
39
+ - - "<"
40
+ - !ruby/object:Gem::Version
41
+ version: '8.2'
42
+ type: :runtime
43
+ prerelease: false
44
+ version_requirements: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '7.2'
49
+ - - "<"
50
+ - !ruby/object:Gem::Version
51
+ version: '8.2'
52
+ - !ruby/object:Gem::Dependency
53
+ name: activejob
54
+ requirement: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: '7.2'
59
+ - - "<"
60
+ - !ruby/object:Gem::Version
61
+ version: '8.2'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '7.2'
69
+ - - "<"
70
+ - !ruby/object:Gem::Version
71
+ version: '8.2'
72
+ - !ruby/object:Gem::Dependency
73
+ name: activerecord
74
+ requirement: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: '7.2'
79
+ - - "<"
80
+ - !ruby/object:Gem::Version
81
+ version: '8.2'
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '7.2'
89
+ - - "<"
90
+ - !ruby/object:Gem::Version
91
+ version: '8.2'
92
+ - !ruby/object:Gem::Dependency
93
+ name: pg
94
+ requirement: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: '1.5'
99
+ - - "<"
100
+ - !ruby/object:Gem::Version
101
+ version: '2'
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '1.5'
109
+ - - "<"
110
+ - !ruby/object:Gem::Version
111
+ version: '2'
112
+ - !ruby/object:Gem::Dependency
113
+ name: railties
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '7.2'
119
+ - - "<"
120
+ - !ruby/object:Gem::Version
121
+ version: '8.2'
122
+ type: :runtime
123
+ prerelease: false
124
+ version_requirements: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: '7.2'
129
+ - - "<"
130
+ - !ruby/object:Gem::Version
131
+ version: '8.2'
132
+ - !ruby/object:Gem::Dependency
133
+ name: tzinfo
134
+ requirement: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '2.0'
139
+ type: :runtime
140
+ prerelease: false
141
+ version_requirements: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '2.0'
146
+ description: Manage on-call rotations, preview handoffs, and reassign whole shifts
147
+ inside an existing Rails application, with optional Slack notifications.
148
+ email:
149
+ - aliosm1997@gmail.com
150
+ executables: []
151
+ extensions: []
152
+ extra_rdoc_files: []
153
+ files:
154
+ - CHANGELOG.md
155
+ - LICENSE.txt
156
+ - README.md
157
+ - SECURITY.md
158
+ - app/assets/munawaba/INTER-LICENSE.txt
159
+ - app/assets/munawaba/JETBRAINS-MONO-LICENSE.txt
160
+ - app/assets/munawaba/dashboard.css
161
+ - app/assets/munawaba/dashboard.js
162
+ - app/assets/munawaba/inter.woff2
163
+ - app/assets/munawaba/jetbrains-mono.woff2
164
+ - app/assets/munawaba/logo.png
165
+ - app/controllers/munawaba/application_controller.rb
166
+ - app/controllers/munawaba/audit_events_controller.rb
167
+ - app/controllers/munawaba/calendars_controller.rb
168
+ - app/controllers/munawaba/frontends_controller.rb
169
+ - app/controllers/munawaba/notification_deliveries_controller.rb
170
+ - app/controllers/munawaba/overrides_controller.rb
171
+ - app/controllers/munawaba/overviews_controller.rb
172
+ - app/controllers/munawaba/people_controller.rb
173
+ - app/controllers/munawaba/rotations_controller.rb
174
+ - app/controllers/munawaba/schedules_controller.rb
175
+ - app/controllers/munawaba/shifts_controller.rb
176
+ - app/controllers/munawaba/slack_integrations_controller.rb
177
+ - app/controllers/munawaba/themes_controller.rb
178
+ - app/helpers/munawaba/application_helper.rb
179
+ - app/jobs/munawaba/application_job.rb
180
+ - app/jobs/munawaba/deliver_notification_job.rb
181
+ - app/jobs/munawaba/dispatch_due_notifications_job.rb
182
+ - app/jobs/munawaba/maintain_projection_job.rb
183
+ - app/jobs/munawaba/maintenance_job.rb
184
+ - app/models/munawaba/application_record.rb
185
+ - app/models/munawaba/audit_event.rb
186
+ - app/models/munawaba/notification_delivery.rb
187
+ - app/models/munawaba/person.rb
188
+ - app/models/munawaba/schedule.rb
189
+ - app/models/munawaba/schedule_membership.rb
190
+ - app/models/munawaba/shift.rb
191
+ - app/models/munawaba/shift_override.rb
192
+ - app/services/munawaba/audit/recorder.rb
193
+ - app/services/munawaba/canonical.rb
194
+ - app/services/munawaba/commands.rb
195
+ - app/services/munawaba/conflicts/finder.rb
196
+ - app/services/munawaba/integrations.rb
197
+ - app/services/munawaba/integrations/planner_effects.rb
198
+ - app/services/munawaba/notifications/context/v1.rb
199
+ - app/services/munawaba/notifications/deliver.rb
200
+ - app/services/munawaba/notifications/dispatcher.rb
201
+ - app/services/munawaba/notifications/planner.rb
202
+ - app/services/munawaba/notifications/reclaim_expired_leases.rb
203
+ - app/services/munawaba/notifications/retry_failed.rb
204
+ - app/services/munawaba/notifications/validity.rb
205
+ - app/services/munawaba/notifications/wake_dispatcher.rb
206
+ - app/services/munawaba/preview.rb
207
+ - app/services/munawaba/result.rb
208
+ - app/services/munawaba/shifts/normalize_future_timing.rb
209
+ - app/services/munawaba/shifts/project.rb
210
+ - app/services/munawaba/shifts/projection_plan.rb
211
+ - app/services/munawaba/slack/client.rb
212
+ - app/services/munawaba/slack/renderer.rb
213
+ - app/services/munawaba/slack/webhook_validator.rb
214
+ - app/services/munawaba/timing/boundary_calculator.rb
215
+ - app/services/munawaba/timing/persisted_interval_verifier.rb
216
+ - app/views/layouts/munawaba/application.html.erb
217
+ - app/views/munawaba/audit_events/index.html.erb
218
+ - app/views/munawaba/calendars/_shift.html.erb
219
+ - app/views/munawaba/calendars/show.html.erb
220
+ - app/views/munawaba/notification_deliveries/index.html.erb
221
+ - app/views/munawaba/overrides/new.html.erb
222
+ - app/views/munawaba/overviews/show.html.erb
223
+ - app/views/munawaba/people/_form.html.erb
224
+ - app/views/munawaba/people/edit.html.erb
225
+ - app/views/munawaba/people/index.html.erb
226
+ - app/views/munawaba/people/new.html.erb
227
+ - app/views/munawaba/people/show.html.erb
228
+ - app/views/munawaba/rotations/edit.html.erb
229
+ - app/views/munawaba/schedules/_form.html.erb
230
+ - app/views/munawaba/schedules/_resume_form.html.erb
231
+ - app/views/munawaba/schedules/edit.html.erb
232
+ - app/views/munawaba/schedules/index.html.erb
233
+ - app/views/munawaba/schedules/new.html.erb
234
+ - app/views/munawaba/schedules/resume.html.erb
235
+ - app/views/munawaba/schedules/show.html.erb
236
+ - app/views/munawaba/shared/_empty.html.erb
237
+ - app/views/munawaba/shared/_errors.html.erb
238
+ - app/views/munawaba/shared/_navigation.html.erb
239
+ - app/views/munawaba/shared/_projection.html.erb
240
+ - app/views/munawaba/shared/_proposal_details.html.erb
241
+ - app/views/munawaba/shared/_shifts.html.erb
242
+ - app/views/munawaba/shared/proposal.html.erb
243
+ - app/views/munawaba/shifts/show.html.erb
244
+ - app/views/munawaba/slack_integrations/edit.html.erb
245
+ - config/routes.rb
246
+ - db/migrate/20260905000001_create_munawaba_people.rb
247
+ - db/migrate/20260905000002_create_munawaba_schedules.rb
248
+ - db/migrate/20260905000003_create_munawaba_schedule_memberships.rb
249
+ - db/migrate/20260905000004_create_munawaba_shifts.rb
250
+ - db/migrate/20260905000005_create_munawaba_shift_overrides.rb
251
+ - db/migrate/20260905000006_create_munawaba_notification_deliveries.rb
252
+ - db/migrate/20260905000007_create_munawaba_audit_events.rb
253
+ - db/migrate/20260905000008_simplify_munawaba_activity.rb
254
+ - lib/generators/munawaba/install_generator.rb
255
+ - lib/generators/munawaba/templates/munawaba.rb
256
+ - lib/munawaba.rb
257
+ - lib/munawaba/configuration.rb
258
+ - lib/munawaba/defaults.rb
259
+ - lib/munawaba/engine.rb
260
+ - lib/munawaba/version.rb
261
+ homepage: https://github.com/milkstrawai/munawaba
262
+ licenses:
263
+ - MIT
264
+ metadata:
265
+ allowed_push_host: https://rubygems.org
266
+ homepage_uri: https://github.com/milkstrawai/munawaba
267
+ source_code_uri: https://github.com/milkstrawai/munawaba
268
+ changelog_uri: https://github.com/milkstrawai/munawaba/blob/main/CHANGELOG.md
269
+ rubygems_mfa_required: 'true'
270
+ rdoc_options: []
271
+ require_paths:
272
+ - lib
273
+ required_ruby_version: !ruby/object:Gem::Requirement
274
+ requirements:
275
+ - - ">="
276
+ - !ruby/object:Gem::Version
277
+ version: 3.2.0
278
+ required_rubygems_version: !ruby/object:Gem::Requirement
279
+ requirements:
280
+ - - ">="
281
+ - !ruby/object:Gem::Version
282
+ version: '0'
283
+ requirements: []
284
+ rubygems_version: 3.6.9
285
+ specification_version: 4
286
+ summary: On-call rotation administration inside your Rails application.
287
+ test_files: []