anchormodel 0.1.4 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/CHANGELOG.md +10 -0
  4. data/Gemfile.lock +1 -1
  5. data/README.md +114 -3
  6. data/VERSION +1 -1
  7. data/anchormodel.gemspec +5 -5
  8. data/doc/Anchormodel/ActiveModelTypeValueSingle.html +697 -0
  9. data/doc/Anchormodel/Attribute.html +109 -9
  10. data/doc/Anchormodel/ModelMixin.html +75 -3
  11. data/doc/Anchormodel/SimpleFormInputs/Helpers/AnchormodelInputsCommon.html +269 -0
  12. data/doc/Anchormodel/SimpleFormInputs/Helpers.html +124 -0
  13. data/doc/Anchormodel/SimpleFormInputs.html +124 -0
  14. data/doc/Anchormodel/Util.html +612 -0
  15. data/doc/Anchormodel/Version.html +3 -3
  16. data/doc/Anchormodel.html +99 -34
  17. data/doc/AnchormodelGenerator.html +201 -0
  18. data/doc/AnchormodelInput.html +140 -0
  19. data/doc/AnchormodelRadioButtonsInput.html +140 -0
  20. data/doc/_index.html +63 -4
  21. data/doc/class_list.html +1 -1
  22. data/doc/file.README.html +109 -6
  23. data/doc/frames.html +5 -10
  24. data/doc/index.html +109 -6
  25. data/doc/method_list.html +70 -6
  26. data/doc/top-level-namespace.html +4 -4
  27. data/lib/anchormodel/active_model_type_value_multi.rb +31 -0
  28. data/lib/anchormodel/active_model_type_value_single.rb +4 -2
  29. data/lib/anchormodel/attribute.rb +7 -1
  30. data/lib/anchormodel/model_mixin.rb +7 -0
  31. data/lib/anchormodel/simple_form_inputs/anchormodel_check_boxes_input.rb +23 -0
  32. data/lib/anchormodel/simple_form_inputs/anchormodel_input.rb +21 -0
  33. data/lib/anchormodel/simple_form_inputs/anchormodel_radio_buttons_input.rb +23 -0
  34. data/lib/anchormodel/simple_form_inputs/helpers/anchormodel_inputs_common.rb +54 -0
  35. data/lib/anchormodel/util.rb +57 -7
  36. data/lib/anchormodel.rb +10 -0
  37. data/test/active_record_model/user_test.rb +73 -9
  38. data/test/dummy/app/anchormodels/animal.rb +6 -0
  39. data/test/dummy/app/models/user.rb +1 -0
  40. data/test/dummy/db/migrate/20240425182000_add_animals_to_users.rb +5 -0
  41. data/test/dummy/db/schema.rb +2 -1
  42. metadata +18 -4
  43. data/pkg/anchormodel-0.1.3.gem +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 393936de0294a0c3ee8d3096a38c365bce1843b4812e670034ac9037cdd61453
4
- data.tar.gz: 130e1ae1bdf5fd50dcc1c27d9c0fd7e1b81e2923088f2bf0c81ef4d7e57ccfc6
3
+ metadata.gz: 0f7343b6009976e35fa3354eeabe119ad354dd4f103af1d1440251cf178de989
4
+ data.tar.gz: b971498fc5b0028c2f43994130abf55b6edfb9be0a327113e5cf099911c5ed78
5
5
  SHA512:
6
- metadata.gz: 2a9b9e0a451d772fb0c54ae36c9f437b8aab77a74eae058f381b65ba01cc62719ec0adbd5e56b674585bc5071aa239e74e1e540591a3b70bd308c66ec8bd54da
7
- data.tar.gz: f5f5326a0a77605c3a3b5b1e7139e24f5de82b4acb91d59a0624ae3965db0c2dc5dd0b0a0458b96b727bb7560a1495928ea7664b16b432427665449998eaf910
6
+ metadata.gz: a3a0b3e80ea3fa4fdec3fa3ade5ce8536a0e8ff00f17019a291646bc307ec6a84a8c5b12c6e247c8bfad51d6bf80df1bec3114ea9edf9b208537c5db28a1a523
7
+ data.tar.gz: 14af2506a7729e82c7ed664c61a0523e7dcf2e2595c83078986b6a8d590013dcb543b8e6d641f0b742dc23a9f785cd3585286e5066fb10a6a74dc463cd67ac35
data/.gitignore CHANGED
@@ -1,2 +1,3 @@
1
1
  .rubocop.yml
2
- .yardoc
2
+ .yardoc
3
+ /pkg/*
data/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ # 0.2.0 (27.04.2024)
2
+
3
+ - Add support for multiple anchormodels (`belongs_to_anchormodels`)
4
+ - Implement YourAnchormodelclass.form_collection
5
+
6
+ # 0.1.5 (24.04.2024)
7
+
8
+ - Enhance documentation
9
+ - Add support for simple_form
10
+
1
11
  # 0.1.4 (23.04.2024)
2
12
 
3
13
  - Stick closer to the Rails API of Value
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- anchormodel (0.1.4.edge)
4
+ anchormodel (0.1.6.edge)
5
5
  rails (~> 7.0)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -35,7 +35,7 @@ are regular classes and can easily be extended.
35
35
 
36
36
  ### ActiveEnum
37
37
 
38
- The gem (ActiveEnum)[https://github.com/adzap/active_enum] allows to create
38
+ The gem [ActiveEnum](https://github.com/adzap/active_enum) allows to create
39
39
  Enum-like classes that can be extended. However it only supports Integer keys. I
40
40
  find this unsatisfactory, as debugging with tools like `psql` or `mysql` is made
41
41
  unnecessarily hard when you only see numbers. Keys for enums should be
@@ -116,6 +116,41 @@ puts("User #{@user.name} has role #{@user.role.label}")
116
116
  @user.role.admin? # true if and only if the role is admin (false otherwise)
117
117
  ```
118
118
 
119
+ Your form could look something like this:
120
+
121
+ ```erb
122
+ <%= form_with(model: user) do |form| %>
123
+ <%# ... %>
124
+ <%= form.collection_select :role, Role.all, :key, :label %>
125
+ <%# ... %>
126
+ <% end %>
127
+ ```
128
+
129
+ ## Using Anchormodel with Simpleform
130
+
131
+ Anchormodel has built-in support for the [simple_form](https://github.com/heartcombo/simple_form) gem by providing an input for the type `:anchormodel` which displays anchormodel attributes as a collection select.
132
+
133
+ After SimpleForm is installed, you can write your form as:
134
+
135
+ ```erb
136
+ <%= simple_form_for user do |f| %>
137
+ <%# ... %>
138
+ <%= f.input :role %>
139
+ <%# ... %>
140
+ <% end %>
141
+ ```
142
+
143
+ Or, if you prefer radio buttons instead:
144
+
145
+
146
+ ```erb
147
+ <%= simple_form_for user do |f| %>
148
+ <%# ... %>
149
+ <%= f.input :role, as: :anchormodel_radio_buttons %>
150
+ <%# ... %>
151
+ <% end %>
152
+ ```
153
+
119
154
  # Rails Enum style model methods
120
155
 
121
156
  By default, Anchormodel adds three kinds of methods for each key to the model:
@@ -188,6 +223,82 @@ If you want to have multiple attributes in the same model pointing to the same A
188
223
 
189
224
  ```ruby
190
225
  # app/models/user.rb
191
- belongs_to_anchormodel :role
192
- belongs_to_anchormodel :secondary_role, Role, model_methods: false
226
+ belongs_to_anchormodel :role
227
+ belongs_to_anchormodel :secondary_role, Role, model_methods: false
228
+ ```
229
+
230
+ # Attaching multiple Anchormodels to an attribute (similar to a has_many collection)
231
+
232
+ Collections of Anchormodels are supported. Assuming that your `User` can have multiple `Role` anchormodels, your code can look as follows:
233
+
234
+ ```ruby
235
+ # app/models/user.rb
236
+ belongs_to_anchormodels :roles
237
+ ```
238
+
239
+ The method is deliberately called `belongs_to...` and not `has_many...` in order to indicate that the key is stored in a column of the model in which you are calling it. The rule of thumb for using a collection of Anchormodels is:
240
+
241
+ - Your column should be of type `string`, just like with the singular `belongs_to_anchormodel`.
242
+ - Anchormodels will be stored in string form, separated by the `,` character
243
+ - When reading the attribute, you will get a `Set`, thus duplicates are avoided.
244
+
245
+ Example usage for a User model with multiple roles as shown above:
246
+
247
+ ```ruby
248
+ u = User.first
249
+ u.roles = %i[moderator admin] # this will replace the user's roles by the two specified
250
+ u.roles # this will return a set of two Role Anchormodel instances, moderator and role
251
+ u.guest! # this will add the role `guest` to the user's roles
252
+ u.guest? # this will query whether the role `guest` is part of the user's roles
253
+ User.moderator # This will return all users that have the moderator role as part of their roles
254
+ ```
255
+
256
+ For modifying a collection of Anchormodels, the following methods are implemented, the first three accepting a String, Symbol or Anchormodel:
257
+
258
+ ```ruby
259
+ u.roles.add(:moderator) # same as u.moderator!
260
+ u.roles << :moderator # alias of add
261
+ u.roles.delete(:moderator)
262
+ u.roles.clear
263
+ ```
264
+
265
+ Note that no other methods of Set are overwritten at this point - if you use any other methods mutating the underlying Set, your changes will not be applied.
266
+
267
+ ## Basic rails form for a collection of Anchormodels
268
+
269
+ ```erb
270
+ <%= form_with(model: user) do |form| %>
271
+ <%# ... %>
272
+ <%= form.collection_select :role, Role.all, :key, :label, multiple: true %>
273
+ <%# ... %>
274
+ <% end %>
275
+ ```
276
+
277
+ If you get an error due to unpermitted params, make sure, you are allowing array-style parameters: `params.require(:user).permit(roles: [])`
278
+
279
+ ## SimpleForm for a collection of Anchormodels
280
+
281
+ Anchormodel's [simple_form](https://github.com/heartcombo/simple_form) support also includes collections of Anchormodels.
282
+
283
+ Just like in the single Anchormodel implementation, a select input can be provided with:
284
+
285
+ ```erb
286
+ <%= simple_form_for user do |f| %>
287
+ <%# ... %>
288
+ <%= f.input :role %>
289
+ <%# ... %>
290
+ <% end %>
291
+ ```
292
+
293
+ The input figures out automatically that it is operating on a collection, so the form code is the same as for a single Anchormodel.
294
+
295
+ However, radio buttons are unsuitable for collections, so use check boxes instead:
296
+
297
+
298
+ ```erb
299
+ <%= simple_form_for user do |f| %>
300
+ <%# ... %>
301
+ <%= f.input :role, as: :anchormodel_check_boxes %>
302
+ <%# ... %>
303
+ <% end %>
193
304
  ```
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.4
1
+ 0.2.0
data/anchormodel.gemspec CHANGED
@@ -2,21 +2,21 @@
2
2
  # This file is auto-generated via: 'rake gemspec'.
3
3
 
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: anchormodel 0.1.4 ruby lib
5
+ # stub: anchormodel 0.2.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "anchormodel".freeze
9
- s.version = "0.1.4".freeze
9
+ s.version = "0.2.0".freeze
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib".freeze]
13
13
  s.authors = ["Sandro Kalbermatter".freeze]
14
- s.date = "2024-04-23"
15
- s.files = [".gitignore".freeze, ".ruby-version".freeze, ".yardopts".freeze, "CHANGELOG.md".freeze, "Gemfile".freeze, "Gemfile.lock".freeze, "LICENSE".freeze, "README.md".freeze, "Rakefile".freeze, "VERSION".freeze, "anchormodel.gemspec".freeze, "bin/rails".freeze, "doc/Anchormodel.html".freeze, "doc/Anchormodel/ActiveModelTypeValue.html".freeze, "doc/Anchormodel/Attribute.html".freeze, "doc/Anchormodel/ModelMixin.html".freeze, "doc/Anchormodel/Version.html".freeze, "doc/_index.html".freeze, "doc/class_list.html".freeze, "doc/css/common.css".freeze, "doc/css/full_list.css".freeze, "doc/css/style.css".freeze, "doc/file.README.html".freeze, "doc/file_list.html".freeze, "doc/frames.html".freeze, "doc/index.html".freeze, "doc/js/app.js".freeze, "doc/js/full_list.js".freeze, "doc/js/jquery.js".freeze, "doc/method_list.html".freeze, "doc/top-level-namespace.html".freeze, "lib/anchormodel.rb".freeze, "lib/anchormodel/active_model_type_value_single.rb".freeze, "lib/anchormodel/attribute.rb".freeze, "lib/anchormodel/model_mixin.rb".freeze, "lib/anchormodel/util.rb".freeze, "lib/anchormodel/version.rb".freeze, "lib/generators/anchormodel/USAGE".freeze, "lib/generators/anchormodel/anchormodel_generator.rb".freeze, "lib/generators/anchormodel/templates/anchormodel.rb.erb".freeze, "logo.svg".freeze, "pkg/anchormodel-0.1.3.gem".freeze, "test/active_record_model/user_test.rb".freeze, "test/dummy/.gitignore".freeze, "test/dummy/Rakefile".freeze, "test/dummy/app/anchormodels/locale.rb".freeze, "test/dummy/app/anchormodels/role.rb".freeze, "test/dummy/app/helpers/application_helper.rb".freeze, "test/dummy/app/models/application_record.rb".freeze, "test/dummy/app/models/concerns/.keep".freeze, "test/dummy/app/models/user.rb".freeze, "test/dummy/bin/rails".freeze, "test/dummy/bin/rake".freeze, "test/dummy/bin/setup".freeze, "test/dummy/config.ru".freeze, "test/dummy/config/application.rb".freeze, "test/dummy/config/boot.rb".freeze, "test/dummy/config/credentials.yml.enc".freeze, "test/dummy/config/database.yml".freeze, "test/dummy/config/environment.rb".freeze, "test/dummy/config/environments/test.rb".freeze, "test/dummy/config/initializers/content_security_policy.rb".freeze, "test/dummy/config/initializers/filter_parameter_logging.rb".freeze, "test/dummy/config/initializers/inflections.rb".freeze, "test/dummy/config/initializers/permissions_policy.rb".freeze, "test/dummy/config/locales/en.yml".freeze, "test/dummy/config/puma.rb".freeze, "test/dummy/config/routes.rb".freeze, "test/dummy/db/migrate/20230107173151_create_users.rb".freeze, "test/dummy/db/schema.rb".freeze, "test/dummy/db/seeds.rb".freeze, "test/dummy/lib/tasks/.keep".freeze, "test/dummy/log/.keep".freeze, "test/dummy/tmp/.keep".freeze, "test/dummy/tmp/pids/.keep".freeze, "test/test_helper.rb".freeze]
14
+ s.date = "2024-04-27"
15
+ s.files = [".gitignore".freeze, ".ruby-version".freeze, ".yardopts".freeze, "CHANGELOG.md".freeze, "Gemfile".freeze, "Gemfile.lock".freeze, "LICENSE".freeze, "README.md".freeze, "Rakefile".freeze, "VERSION".freeze, "anchormodel.gemspec".freeze, "bin/rails".freeze, "doc/Anchormodel.html".freeze, "doc/Anchormodel/ActiveModelTypeValue.html".freeze, "doc/Anchormodel/ActiveModelTypeValueSingle.html".freeze, "doc/Anchormodel/Attribute.html".freeze, "doc/Anchormodel/ModelMixin.html".freeze, "doc/Anchormodel/SimpleFormInputs.html".freeze, "doc/Anchormodel/SimpleFormInputs/Helpers.html".freeze, "doc/Anchormodel/SimpleFormInputs/Helpers/AnchormodelInputsCommon.html".freeze, "doc/Anchormodel/Util.html".freeze, "doc/Anchormodel/Version.html".freeze, "doc/AnchormodelGenerator.html".freeze, "doc/AnchormodelInput.html".freeze, "doc/AnchormodelRadioButtonsInput.html".freeze, "doc/_index.html".freeze, "doc/class_list.html".freeze, "doc/css/common.css".freeze, "doc/css/full_list.css".freeze, "doc/css/style.css".freeze, "doc/file.README.html".freeze, "doc/file_list.html".freeze, "doc/frames.html".freeze, "doc/index.html".freeze, "doc/js/app.js".freeze, "doc/js/full_list.js".freeze, "doc/js/jquery.js".freeze, "doc/method_list.html".freeze, "doc/top-level-namespace.html".freeze, "lib/anchormodel.rb".freeze, "lib/anchormodel/active_model_type_value_multi.rb".freeze, "lib/anchormodel/active_model_type_value_single.rb".freeze, "lib/anchormodel/attribute.rb".freeze, "lib/anchormodel/model_mixin.rb".freeze, "lib/anchormodel/simple_form_inputs/anchormodel_check_boxes_input.rb".freeze, "lib/anchormodel/simple_form_inputs/anchormodel_input.rb".freeze, "lib/anchormodel/simple_form_inputs/anchormodel_radio_buttons_input.rb".freeze, "lib/anchormodel/simple_form_inputs/helpers/anchormodel_inputs_common.rb".freeze, "lib/anchormodel/util.rb".freeze, "lib/anchormodel/version.rb".freeze, "lib/generators/anchormodel/USAGE".freeze, "lib/generators/anchormodel/anchormodel_generator.rb".freeze, "lib/generators/anchormodel/templates/anchormodel.rb.erb".freeze, "logo.svg".freeze, "test/active_record_model/user_test.rb".freeze, "test/dummy/.gitignore".freeze, "test/dummy/Rakefile".freeze, "test/dummy/app/anchormodels/animal.rb".freeze, "test/dummy/app/anchormodels/locale.rb".freeze, "test/dummy/app/anchormodels/role.rb".freeze, "test/dummy/app/helpers/application_helper.rb".freeze, "test/dummy/app/models/application_record.rb".freeze, "test/dummy/app/models/concerns/.keep".freeze, "test/dummy/app/models/user.rb".freeze, "test/dummy/bin/rails".freeze, "test/dummy/bin/rake".freeze, "test/dummy/bin/setup".freeze, "test/dummy/config.ru".freeze, "test/dummy/config/application.rb".freeze, "test/dummy/config/boot.rb".freeze, "test/dummy/config/credentials.yml.enc".freeze, "test/dummy/config/database.yml".freeze, "test/dummy/config/environment.rb".freeze, "test/dummy/config/environments/test.rb".freeze, "test/dummy/config/initializers/content_security_policy.rb".freeze, "test/dummy/config/initializers/filter_parameter_logging.rb".freeze, "test/dummy/config/initializers/inflections.rb".freeze, "test/dummy/config/initializers/permissions_policy.rb".freeze, "test/dummy/config/locales/en.yml".freeze, "test/dummy/config/puma.rb".freeze, "test/dummy/config/routes.rb".freeze, "test/dummy/db/migrate/20230107173151_create_users.rb".freeze, "test/dummy/db/migrate/20240425182000_add_animals_to_users.rb".freeze, "test/dummy/db/schema.rb".freeze, "test/dummy/db/seeds.rb".freeze, "test/dummy/lib/tasks/.keep".freeze, "test/dummy/log/.keep".freeze, "test/dummy/tmp/.keep".freeze, "test/dummy/tmp/pids/.keep".freeze, "test/test_helper.rb".freeze]
16
16
  s.homepage = "https://github.com/kalsan/anchormodel".freeze
17
17
  s.licenses = ["LGPL-3.0-or-later".freeze]
18
18
  s.required_ruby_version = Gem::Requirement.new(">= 3.0.0".freeze)
19
- s.rubygems_version = "3.5.6".freeze
19
+ s.rubygems_version = "3.5.9".freeze
20
20
  s.summary = "Bringing object-oriented programming to Rails enums".freeze
21
21
 
22
22
  s.specification_version = 4