rails-queue-it 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 (108) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +116 -0
  3. data/.circleci/setup-rubygems.sh +3 -0
  4. data/.editorconfig +24 -0
  5. data/.gitignore +9 -0
  6. data/.rspec +3 -0
  7. data/.rubocop.yml +503 -0
  8. data/.ruby-version +1 -0
  9. data/CHANGELOG.md +7 -0
  10. data/Gemfile +15 -0
  11. data/Gemfile.lock +277 -0
  12. data/Guardfile +12 -0
  13. data/LICENSE.txt +21 -0
  14. data/README.md +202 -0
  15. data/Rakefile +10 -0
  16. data/app/assets/config/queue_it_manifest.js +1 -0
  17. data/app/assets/images/queue_it/.keep +0 -0
  18. data/app/assets/stylesheets/queue_it/application.css +15 -0
  19. data/app/controllers/queue_it/application_controller.rb +5 -0
  20. data/app/helpers/queue_it/application_helper.rb +4 -0
  21. data/app/jobs/queue_it/application_job.rb +4 -0
  22. data/app/mailers/queue_it/application_mailer.rb +6 -0
  23. data/app/models/concerns/queue_it/queable.rb +89 -0
  24. data/app/models/queue_it/application_record.rb +5 -0
  25. data/app/models/queue_it/node.rb +68 -0
  26. data/app/models/queue_it/queue.rb +111 -0
  27. data/app/views/layouts/queue_it/application.html.erb +15 -0
  28. data/bin/rails +25 -0
  29. data/config/routes.rb +2 -0
  30. data/db/migrate/20210723140008_create_queue_it_queues.rb +10 -0
  31. data/db/migrate/20210723140434_create_queue_it_nodes.rb +12 -0
  32. data/lib/generators/queue_it/install/USAGE +5 -0
  33. data/lib/generators/queue_it/install/install_generator.rb +19 -0
  34. data/lib/generators/queue_it/install/templates/initializer.rb +2 -0
  35. data/lib/queue_it.rb +25 -0
  36. data/lib/queue_it/engine.rb +15 -0
  37. data/lib/queue_it/example_class.rb +7 -0
  38. data/lib/queue_it/version.rb +3 -0
  39. data/lib/tasks/auto_annotate_models.rake +67 -0
  40. data/lib/tasks/queue_it_tasks.rake +4 -0
  41. data/queue_it.gemspec +38 -0
  42. data/spec/concerns/queue_it/queable_spec.rb +492 -0
  43. data/spec/dummy/Rakefile +6 -0
  44. data/spec/dummy/app/assets/config/manifest.js +3 -0
  45. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  46. data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
  47. data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
  48. data/spec/dummy/app/controllers/application_controller.rb +2 -0
  49. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  50. data/spec/dummy/app/javascript/packs/application.js +15 -0
  51. data/spec/dummy/app/jobs/application_job.rb +7 -0
  52. data/spec/dummy/app/mailers/application_mailer.rb +4 -0
  53. data/spec/dummy/app/models/application_record.rb +3 -0
  54. data/spec/dummy/app/models/task.rb +3 -0
  55. data/spec/dummy/app/models/user.rb +2 -0
  56. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  57. data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
  58. data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
  59. data/spec/dummy/bin/rails +4 -0
  60. data/spec/dummy/bin/rake +4 -0
  61. data/spec/dummy/bin/setup +33 -0
  62. data/spec/dummy/config.ru +5 -0
  63. data/spec/dummy/config/application.rb +30 -0
  64. data/spec/dummy/config/boot.rb +5 -0
  65. data/spec/dummy/config/cable.yml +10 -0
  66. data/spec/dummy/config/database.yml +27 -0
  67. data/spec/dummy/config/environment.rb +5 -0
  68. data/spec/dummy/config/environments/development.rb +81 -0
  69. data/spec/dummy/config/environments/production.rb +112 -0
  70. data/spec/dummy/config/environments/test.rb +49 -0
  71. data/spec/dummy/config/initializers/application_controller_renderer.rb +8 -0
  72. data/spec/dummy/config/initializers/assets.rb +12 -0
  73. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  74. data/spec/dummy/config/initializers/content_security_policy.rb +28 -0
  75. data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
  76. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  77. data/spec/dummy/config/initializers/inflections.rb +16 -0
  78. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  79. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  80. data/spec/dummy/config/locales/en.yml +33 -0
  81. data/spec/dummy/config/puma.rb +38 -0
  82. data/spec/dummy/config/routes.rb +3 -0
  83. data/spec/dummy/config/spring.rb +6 -0
  84. data/spec/dummy/config/storage.yml +34 -0
  85. data/spec/dummy/db/migrate/20210723142357_create_users.rb +9 -0
  86. data/spec/dummy/db/migrate/20210723172002_create_tasks.rb +9 -0
  87. data/spec/dummy/db/schema.rb +52 -0
  88. data/spec/dummy/public/404.html +67 -0
  89. data/spec/dummy/public/422.html +67 -0
  90. data/spec/dummy/public/500.html +66 -0
  91. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  92. data/spec/dummy/public/apple-touch-icon.png +0 -0
  93. data/spec/dummy/public/favicon.ico +0 -0
  94. data/spec/dummy/spec/models/task_spec.rb +7 -0
  95. data/spec/dummy/spec/models/user_spec.rb +7 -0
  96. data/spec/factories/queue_it/nodes.rb +18 -0
  97. data/spec/factories/queue_it/queues.rb +26 -0
  98. data/spec/factories/tasks.rb +11 -0
  99. data/spec/factories/users.rb +5 -0
  100. data/spec/fixtures/files/image.png +0 -0
  101. data/spec/fixtures/files/video.mp4 +0 -0
  102. data/spec/models/queue_it/node_spec.rb +43 -0
  103. data/spec/models/queue_it/queue_spec.rb +116 -0
  104. data/spec/queue_it_spec.rb +16 -0
  105. data/spec/rails_helper.rb +52 -0
  106. data/spec/spec_helper.rb +9 -0
  107. data/spec/support/test_helpers.rb +5 -0
  108. metadata +441 -0
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.7
data/CHANGELOG.md ADDED
@@ -0,0 +1,7 @@
1
+ # Change Log
2
+ All notable changes to this project will be documented in this file.
3
+ This project adheres to [Semantic Versioning](http://semver.org/).
4
+
5
+ ### v0.1.0
6
+
7
+ * Initial release.
data/Gemfile ADDED
@@ -0,0 +1,15 @@
1
+ source 'https://rubygems.org'
2
+ git_source(:github) { |repo| "https://github.com/#{repo}.git" }
3
+
4
+ # Declare your gem's dependencies in queue_it.gemspec.
5
+ # Bundler will treat runtime dependencies like base dependencies, and
6
+ # development dependencies will be added by default to the :development group.
7
+ gemspec
8
+
9
+ # Declare any dependencies that are still in development here instead of in
10
+ # your gemspec. These might include edge Rails or gems from your path or
11
+ # Git. Remember to move these dependencies to your gemspec before releasing
12
+ # your gem to rubygems.org.
13
+
14
+ # To use a debugger
15
+ # gem 'byebug', group: [:development, :test]
data/Gemfile.lock ADDED
@@ -0,0 +1,277 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ rails-queue-it (0.1.0)
5
+ rails (>= 6.0)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ actioncable (6.1.4)
11
+ actionpack (= 6.1.4)
12
+ activesupport (= 6.1.4)
13
+ nio4r (~> 2.0)
14
+ websocket-driver (>= 0.6.1)
15
+ actionmailbox (6.1.4)
16
+ actionpack (= 6.1.4)
17
+ activejob (= 6.1.4)
18
+ activerecord (= 6.1.4)
19
+ activestorage (= 6.1.4)
20
+ activesupport (= 6.1.4)
21
+ mail (>= 2.7.1)
22
+ actionmailer (6.1.4)
23
+ actionpack (= 6.1.4)
24
+ actionview (= 6.1.4)
25
+ activejob (= 6.1.4)
26
+ activesupport (= 6.1.4)
27
+ mail (~> 2.5, >= 2.5.4)
28
+ rails-dom-testing (~> 2.0)
29
+ actionpack (6.1.4)
30
+ actionview (= 6.1.4)
31
+ activesupport (= 6.1.4)
32
+ rack (~> 2.0, >= 2.0.9)
33
+ rack-test (>= 0.6.3)
34
+ rails-dom-testing (~> 2.0)
35
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
36
+ actiontext (6.1.4)
37
+ actionpack (= 6.1.4)
38
+ activerecord (= 6.1.4)
39
+ activestorage (= 6.1.4)
40
+ activesupport (= 6.1.4)
41
+ nokogiri (>= 1.8.5)
42
+ actionview (6.1.4)
43
+ activesupport (= 6.1.4)
44
+ builder (~> 3.1)
45
+ erubi (~> 1.4)
46
+ rails-dom-testing (~> 2.0)
47
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
48
+ activejob (6.1.4)
49
+ activesupport (= 6.1.4)
50
+ globalid (>= 0.3.6)
51
+ activemodel (6.1.4)
52
+ activesupport (= 6.1.4)
53
+ activerecord (6.1.4)
54
+ activemodel (= 6.1.4)
55
+ activesupport (= 6.1.4)
56
+ activestorage (6.1.4)
57
+ actionpack (= 6.1.4)
58
+ activejob (= 6.1.4)
59
+ activerecord (= 6.1.4)
60
+ activesupport (= 6.1.4)
61
+ marcel (~> 1.0.0)
62
+ mini_mime (>= 1.1.0)
63
+ activesupport (6.1.4)
64
+ concurrent-ruby (~> 1.0, >= 1.0.2)
65
+ i18n (>= 1.6, < 2)
66
+ minitest (>= 5.1)
67
+ tzinfo (~> 2.0)
68
+ zeitwerk (~> 2.3)
69
+ annotate (3.1.1)
70
+ activerecord (>= 3.2, < 7.0)
71
+ rake (>= 10.4, < 14.0)
72
+ ast (2.4.2)
73
+ builder (3.2.4)
74
+ coderay (1.1.3)
75
+ concurrent-ruby (1.1.9)
76
+ coveralls (0.8.23)
77
+ json (>= 1.8, < 3)
78
+ simplecov (~> 0.16.1)
79
+ term-ansicolor (~> 1.3)
80
+ thor (>= 0.19.4, < 2.0)
81
+ tins (~> 1.6)
82
+ crass (1.0.6)
83
+ diff-lcs (1.4.4)
84
+ docile (1.4.0)
85
+ erubi (1.10.0)
86
+ factory_bot (6.2.0)
87
+ activesupport (>= 5.0.0)
88
+ factory_bot_rails (6.2.0)
89
+ factory_bot (~> 6.2.0)
90
+ railties (>= 5.0.0)
91
+ faker (2.18.0)
92
+ i18n (>= 1.6, < 2)
93
+ ffi (1.15.3)
94
+ formatador (0.3.0)
95
+ globalid (0.5.2)
96
+ activesupport (>= 5.0)
97
+ guard (2.18.0)
98
+ formatador (>= 0.2.4)
99
+ listen (>= 2.7, < 4.0)
100
+ lumberjack (>= 1.0.12, < 2.0)
101
+ nenv (~> 0.1)
102
+ notiffany (~> 0.0)
103
+ pry (>= 0.13.0)
104
+ shellany (~> 0.0)
105
+ thor (>= 0.18.1)
106
+ guard-compat (1.2.1)
107
+ guard-rspec (4.7.3)
108
+ guard (~> 2.1)
109
+ guard-compat (~> 1.1)
110
+ rspec (>= 2.99.0, < 4.0)
111
+ i18n (1.8.10)
112
+ concurrent-ruby (~> 1.0)
113
+ json (2.5.1)
114
+ listen (3.6.0)
115
+ rb-fsevent (~> 0.10, >= 0.10.3)
116
+ rb-inotify (~> 0.9, >= 0.9.10)
117
+ loofah (2.10.0)
118
+ crass (~> 1.0.2)
119
+ nokogiri (>= 1.5.9)
120
+ lumberjack (1.2.8)
121
+ mail (2.7.1)
122
+ mini_mime (>= 0.1.1)
123
+ marcel (1.0.1)
124
+ method_source (1.0.0)
125
+ mini_mime (1.1.0)
126
+ minitest (5.14.4)
127
+ nenv (0.3.0)
128
+ nio4r (2.5.8)
129
+ nokogiri (1.11.7-arm64-darwin)
130
+ racc (~> 1.4)
131
+ nokogiri (1.11.7-x86_64-darwin)
132
+ racc (~> 1.4)
133
+ nokogiri (1.11.7-x86_64-linux)
134
+ racc (~> 1.4)
135
+ notiffany (0.1.3)
136
+ nenv (~> 0.1)
137
+ shellany (~> 0.0)
138
+ parallel (1.20.1)
139
+ parser (3.0.2.0)
140
+ ast (~> 2.4.1)
141
+ pg (1.2.3)
142
+ pry (0.14.1)
143
+ coderay (~> 1.1)
144
+ method_source (~> 1.0)
145
+ pry-rails (0.3.9)
146
+ pry (>= 0.10.4)
147
+ racc (1.5.2)
148
+ rack (2.2.3)
149
+ rack-test (1.1.0)
150
+ rack (>= 1.0, < 3)
151
+ rails (6.1.4)
152
+ actioncable (= 6.1.4)
153
+ actionmailbox (= 6.1.4)
154
+ actionmailer (= 6.1.4)
155
+ actionpack (= 6.1.4)
156
+ actiontext (= 6.1.4)
157
+ actionview (= 6.1.4)
158
+ activejob (= 6.1.4)
159
+ activemodel (= 6.1.4)
160
+ activerecord (= 6.1.4)
161
+ activestorage (= 6.1.4)
162
+ activesupport (= 6.1.4)
163
+ bundler (>= 1.15.0)
164
+ railties (= 6.1.4)
165
+ sprockets-rails (>= 2.0.0)
166
+ rails-dom-testing (2.0.3)
167
+ activesupport (>= 4.2.0)
168
+ nokogiri (>= 1.6)
169
+ rails-html-sanitizer (1.3.0)
170
+ loofah (~> 2.3)
171
+ railties (6.1.4)
172
+ actionpack (= 6.1.4)
173
+ activesupport (= 6.1.4)
174
+ method_source
175
+ rake (>= 0.13)
176
+ thor (~> 1.0)
177
+ rainbow (3.0.0)
178
+ rake (13.0.6)
179
+ rb-fsevent (0.11.0)
180
+ rb-inotify (0.10.1)
181
+ ffi (~> 1.0)
182
+ regexp_parser (2.1.1)
183
+ rexml (3.2.5)
184
+ rspec (3.10.0)
185
+ rspec-core (~> 3.10.0)
186
+ rspec-expectations (~> 3.10.0)
187
+ rspec-mocks (~> 3.10.0)
188
+ rspec-core (3.10.1)
189
+ rspec-support (~> 3.10.0)
190
+ rspec-expectations (3.10.1)
191
+ diff-lcs (>= 1.2.0, < 2.0)
192
+ rspec-support (~> 3.10.0)
193
+ rspec-mocks (3.10.2)
194
+ diff-lcs (>= 1.2.0, < 2.0)
195
+ rspec-support (~> 3.10.0)
196
+ rspec-rails (5.0.1)
197
+ actionpack (>= 5.2)
198
+ activesupport (>= 5.2)
199
+ railties (>= 5.2)
200
+ rspec-core (~> 3.10)
201
+ rspec-expectations (~> 3.10)
202
+ rspec-mocks (~> 3.10)
203
+ rspec-support (~> 3.10)
204
+ rspec-support (3.10.2)
205
+ rspec_junit_formatter (0.4.1)
206
+ rspec-core (>= 2, < 4, != 2.12.0)
207
+ rubocop (1.18.4)
208
+ parallel (~> 1.10)
209
+ parser (>= 3.0.0.0)
210
+ rainbow (>= 2.2.2, < 4.0)
211
+ regexp_parser (>= 1.8, < 3.0)
212
+ rexml
213
+ rubocop-ast (>= 1.8.0, < 2.0)
214
+ ruby-progressbar (~> 1.7)
215
+ unicode-display_width (>= 1.4.0, < 3.0)
216
+ rubocop-ast (1.8.0)
217
+ parser (>= 3.0.1.1)
218
+ rubocop-rails (2.11.3)
219
+ activesupport (>= 4.2.0)
220
+ rack (>= 1.1)
221
+ rubocop (>= 1.7.0, < 2.0)
222
+ ruby-progressbar (1.11.0)
223
+ shellany (0.0.1)
224
+ shoulda-matchers (5.0.0)
225
+ activesupport (>= 5.2.0)
226
+ simplecov (0.16.1)
227
+ docile (~> 1.1)
228
+ json (>= 1.8, < 3)
229
+ simplecov-html (~> 0.10.0)
230
+ simplecov-html (0.10.2)
231
+ sprockets (4.0.2)
232
+ concurrent-ruby (~> 1.0)
233
+ rack (> 1, < 3)
234
+ sprockets-rails (3.2.2)
235
+ actionpack (>= 4.0)
236
+ activesupport (>= 4.0)
237
+ sprockets (>= 3.0.0)
238
+ sqlite3 (1.4.2)
239
+ sync (0.5.0)
240
+ term-ansicolor (1.7.1)
241
+ tins (~> 1.0)
242
+ thor (1.1.0)
243
+ tins (1.29.1)
244
+ sync
245
+ tzinfo (2.0.4)
246
+ concurrent-ruby (~> 1.0)
247
+ unicode-display_width (2.0.0)
248
+ websocket-driver (0.7.5)
249
+ websocket-extensions (>= 0.1.0)
250
+ websocket-extensions (0.1.5)
251
+ zeitwerk (2.4.2)
252
+
253
+ PLATFORMS
254
+ arm64-darwin-20
255
+ x86_64-darwin-20
256
+ x86_64-linux
257
+
258
+ DEPENDENCIES
259
+ annotate (~> 3.0)
260
+ bundler (~> 2.2.15)
261
+ coveralls
262
+ factory_bot_rails
263
+ faker
264
+ guard-rspec
265
+ pg
266
+ pry
267
+ pry-rails
268
+ rails-queue-it!
269
+ rspec-rails
270
+ rspec_junit_formatter
271
+ rubocop (~> 1.9)
272
+ rubocop-rails
273
+ shoulda-matchers
274
+ sqlite3
275
+
276
+ BUNDLED WITH
277
+ 2.2.24
data/Guardfile ADDED
@@ -0,0 +1,12 @@
1
+ guard :rspec, cmd: "bundle exec rspec" do
2
+ spec_dic = "spec"
3
+ # RSpec files
4
+ watch("spec/spec_helper.rb") { spec_dic }
5
+ watch("spec/rails_helper.rb") { spec_dic }
6
+ watch(%r{^spec/support/(.+)\.rb$}) { spec_dic }
7
+ watch(%r{^spec/.+_spec\.rb$})
8
+ # Engine files
9
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
10
+ watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
11
+ watch(%r{^app/(.*)(\.erb)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
12
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright 2021 Platanus
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,202 @@
1
+ # Queue It
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/queue-it.svg)](https://badge.fury.io/rb/queue-it)
4
+ [![CircleCI](https://circleci.com/gh/platanus/queue-it.svg?style=shield)](https://app.circleci.com/pipelines/github/platanus/queue-it)
5
+
6
+ This gem has been develope to manage recurrent processes that need someone (or something) responsable.
7
+ For example, imagine you have a recurrent task for a certain group of people like responding the chat of
8
+ your website. A recurrent queue would help you distribuit in a uniform way the workload of the people in the group.
9
+ This gem installs an engine in your rails app.
10
+
11
+ ## Installation
12
+
13
+ Add to your Gemfile:
14
+
15
+ ```ruby
16
+ gem "queue-it"
17
+ ```
18
+
19
+ ```bash
20
+ bundle install
21
+ ```
22
+
23
+ Then, run the installer:
24
+
25
+ ```bash
26
+ rails generate queue_it:install
27
+ ```
28
+
29
+ ## Usage
30
+
31
+ For the purpose of this explanation we'll use the models `Task` and `User` to explain the workaround of this gem. Both models only have one attribute: `:name`.
32
+ ### Models of the gem
33
+ This gem implements the models `QueueIt::Queue` and `QueueIt::Node`, each queue has polymorphic relation with a queable object (i.e. a `Task` instace) and each node has a polymorphic relation with a nodable object (i.e. the object queued).
34
+
35
+ ### Before Starting
36
+ This gem uses [`ActiveRecord::Locking::Pessimistic `](https://api.rubyonrails.org/classes/ActiveRecord/Locking/Pessimistic.html) so the behaviour with sqlite is not the same as with Postgres or MySql. Make sure you use one of the latters.
37
+ ### Queable concern
38
+ Add the `QueueIt::Queable` concern to the model you want to have a queue. In this case we'll ilustrate this with the task model:
39
+ ```ruby
40
+ class Task < ApplicationRecord
41
+ include QueueIt::Queable
42
+ end
43
+ ```
44
+
45
+ ### Concern methods
46
+ With the `QueueIt::Queable` concern added to your model you'll have access to a group of methods to manage the queue's behaviour.
47
+ Note that in this version of the gem the model with the concern will have only one queue through a `has_one` relationship included in the concern.
48
+
49
+ #### Create a Queue
50
+ The method `find_or_create_queue!` present in the concern will return a new queue (in case it was not created) or the queue realated to the instance model.
51
+ ```ruby
52
+ task = Task.create!(name: 'Example Task')
53
+ task_queue = task.find_or_create_queue!
54
+ ```
55
+
56
+ #### Add a node to the Queue
57
+ The method `push_to_queue` will allow you to add a nodable in the first position of the queue or the last one depending on the `head_node` param.
58
+ ```ruby
59
+ task = Task.create!(name: 'Example Task')
60
+ nodable = User.create!(name: 'Gabriel')
61
+ head_node = true
62
+ # add the user as the nodable object in the first node of the queue
63
+ task.push_to_queue(nodable, head_node)
64
+ ```
65
+ Note that the second value (`head_node`) is optional with a default `true` value.
66
+
67
+ > It's not necessary to create the queue manually. The `push_to_queue` method will execute `find_or_create_queue!` before adding the node.
68
+
69
+ #### Get next nodable/node of the queue
70
+ To obtain the next nodable/node of the queue we've implemented the methods `get_next_in_queue` and `get_next_node_in_queue`. The first one calls the second one but instead of returning the node returns the nodable object.
71
+ First, let's add some nodes to the queue:
72
+ ```ruby
73
+ task = Task.create!(name: 'Example')
74
+ task.push_to_queue(User.create!(name: 'Gabriel'))
75
+ task.push_to_queue(User.create!(name: 'Leandro'))
76
+ task.push_to_queue(User.create!(name: 'Raimundo'))
77
+ # Note that the order of the queue is now: [Raimundo's node, Leandro's node, Gabriel's node]
78
+ ```
79
+ Now with the `get_next_in_queue` method we'll the obtain user with name `'Raimundo'` and the order of the queue will be updated.
80
+ ```ruby
81
+ nodable = task.get_next_in_queue
82
+ nodable.name == 'Raimundo' # true
83
+ # the new order of the queue will be: [Leandro's node, Gabriel's node, Raimundo's node]
84
+ ```
85
+ Now if we would of used `get_next_node_in_queue` instead of `get_next_in_queue` method we would of obtained the node containing the user with name `'Raimundo'` as nodable and the order of the queue would have been updated like before.
86
+ ```ruby
87
+ node = task.get_next_in_queue
88
+ node.nodable.name == 'Raimundo' # true
89
+ # the new order of the queue will be: [Leandro's node, Gabriel's node, Raimundo's node]
90
+ ```
91
+
92
+ #### Formatted Queue
93
+ We included a method to obtain the queue formatted by an attribute/method. Note that the nodables will need to have the attribute or an implementation of the method called.
94
+ ```ruby
95
+ # creation of the queue
96
+ task = Task.create!(name: 'Example')
97
+ task.push_to_queue(User.create!(name: 'Gabriel'))
98
+ task.push_to_queue(User.create!(name: 'Leandro'))
99
+ task.push_to_queue(User.create!(name: 'Raimundo'))
100
+ # The order of the queue is now: [Raimundo's node, Leandro's node, Gabriel's node]
101
+ response = task.formatted_queue('name')
102
+ response == ['Raimundo', 'Leandro', 'Gabriel'] # true
103
+ ```
104
+
105
+ #### Delete all the nodes of the queue
106
+ With the method `delete_queue_nodes` you'll be able to clean the queue.
107
+ ```ruby
108
+ task = Task.create!(name: 'Example')
109
+ task.push_to_queue(User.create!(name: 'Gabriel'))
110
+ task.push_to_queue(User.create!(name: 'Leandro'))
111
+ task.push_to_queue(User.create!(name: 'Raimundo'))
112
+ # delete de queue nodes
113
+ task.delete_queue_nodes
114
+ task.queue.size? == 0 # true
115
+ ```
116
+
117
+ #### Remove a nodable object
118
+ In case you need to remove all the nodes of a queue containing an specific nodable you can use the `remove_from_queue(nodable)` method.
119
+ ```ruby
120
+ task = Task.create!(name: 'Example')
121
+ gabriel = User.create!(name: 'Gabriel')
122
+ leandro = User.create!(name: 'Leandro')
123
+ raimundo = User.create!(name: 'Raimundo')
124
+ task.push_to_queue(gabriel)
125
+ task.push_to_queue(leandro)
126
+ task.push_to_queue(raimundo)
127
+ task.push_to_queue(leandro)
128
+ # Now we have a queue that look's like this:
129
+ # [Leandro's node, Raimundo's node, Leandro's node, Gabriel's node]
130
+ task.remove_from_queue(leandro)
131
+ # The queue will now look like this: [Raimundo's node, Gabriel's node]
132
+ ```
133
+
134
+ ## Development
135
+
136
+ ### Models and migrations
137
+
138
+ - Create dummy app models with development and testing purposes inside the dummy app `spec/dummy`:
139
+
140
+ `bin/rails g model user`
141
+
142
+ The `User` model will be created in `spec/dummy/app/models`.
143
+ The `user_spec.rb` file needs to be deleted, but it is a good idea to leave the factory.
144
+
145
+ - Create engine related models inside the engine's root path '/':
146
+
147
+ `bin/rails g model job`
148
+
149
+ The `EngineName::Job` model will be created in `app/models/engine_name`.
150
+ A factory will be added to `engine_name/spec/factories/engine_name/jobs.rb`, you must to add the `class` option manually.
151
+
152
+ ```ruby
153
+ FactoryBot.define do
154
+ factory :job, class: "EngineName::Job" do
155
+ # ...
156
+ end
157
+ end
158
+ ```
159
+
160
+ - While developing the engine run migrations in the root path `bin/rails db:migrate`. This will apply the gem and dummy app migrations too.
161
+ - When using in a project, the engine migrations must be copied to it. This can be done by running: `bin/rails engine_name:install:migrations`
162
+
163
+ ## Testing
164
+
165
+ To run the specs you need to execute, in the root path of the engine, the following command:
166
+
167
+ ```bash
168
+ bundle exec guard
169
+ ```
170
+
171
+ You need to put **all your tests** in the `/queue_it/spec` directory.
172
+
173
+ ## Publishing
174
+
175
+ On master/main branch...
176
+
177
+ 1. Change `VERSION` in `lib/queue_it/version.rb`.
178
+ 2. Change `Unreleased` title to current version in `CHANGELOG.md`.
179
+ 3. Run `bundle install`.
180
+ 4. Commit new release. For example: `Releasing v0.1.0`.
181
+ 5. Create tag. For example: `git tag v0.1.0`.
182
+ 6. Push tag. For example: `git push origin v0.1.0`.
183
+
184
+ ## Contributing
185
+
186
+ 1. Fork it
187
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
188
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
189
+ 4. Push to the branch (`git push origin my-new-feature`)
190
+ 5. Create new Pull Request
191
+
192
+ ## Credits
193
+
194
+ Thank you [contributors](https://github.com/platanus/queue_it/graphs/contributors)!
195
+
196
+ <img src="http://platan.us/gravatar_with_text.png" alt="Platanus" width="250"/>
197
+
198
+ Queue It is maintained by [platanus](http://platan.us).
199
+
200
+ ## License
201
+
202
+ Queue It is © 2021 platanus, spa. It is free software and may be redistributed under the terms specified in the LICENSE file.