klastera 1.5.5.1 → 1.5.5.3

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 (65) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE +0 -0
  3. data/README.rdoc +0 -0
  4. data/Rakefile +0 -0
  5. data/app/assets/javascripts/klastera/application.js +0 -0
  6. data/app/assets/javascripts/klastera/clusters.js +0 -0
  7. data/app/assets/stylesheets/klastera/clusters.scss +0 -0
  8. data/app/controllers/klastera/application_controller.rb +0 -0
  9. data/app/controllers/klastera/clusters_controller.rb +0 -0
  10. data/app/helpers/klastera/application_helper.rb +0 -0
  11. data/app/models/klastera/cluster.rb +0 -0
  12. data/app/models/klastera/cluster_entity.rb +0 -0
  13. data/app/models/klastera/cluster_filter.rb +0 -0
  14. data/app/models/klastera/cluster_user.rb +0 -0
  15. data/app/models/klastera/concerns/cluster.rb +0 -0
  16. data/app/models/klastera/concerns/cluster_entity.rb +0 -0
  17. data/app/models/klastera/concerns/cluster_filter.rb +0 -0
  18. data/app/models/klastera/concerns/cluster_user.rb +0 -0
  19. data/app/models/klastera/concerns/clusterizable.rb +8 -2
  20. data/app/models/klastera/concerns/organization.rb +0 -0
  21. data/app/models/klastera/concerns/transfer.rb +0 -0
  22. data/app/models/klastera/concerns/user.rb +0 -0
  23. data/app/models/klastera/transfer.rb +0 -0
  24. data/app/views/klastera/clusters/_filter.html.erb +0 -0
  25. data/app/views/klastera/clusters/_form.html.erb +0 -0
  26. data/app/views/klastera/clusters/_form_transfer.html.erb +0 -0
  27. data/app/views/klastera/clusters/_table.html.erb +0 -0
  28. data/app/views/klastera/clusters/create.js.erb +0 -0
  29. data/app/views/klastera/clusters/destroy.js.erb +0 -0
  30. data/app/views/klastera/clusters/edit.html.erb +0 -0
  31. data/app/views/klastera/clusters/index.html.erb +0 -0
  32. data/app/views/klastera/clusters/new.html.erb +0 -0
  33. data/app/views/klastera/clusters/transfer.html.erb +0 -0
  34. data/app/views/klastera/clusters/update.js.erb +0 -0
  35. data/app/views/layouts/klastera/_cluster_entity_fields.html.erb +0 -0
  36. data/app/views/layouts/klastera/_cluster_filter.html.erb +0 -0
  37. data/app/views/layouts/klastera/_cluster_role.html.erb +0 -0
  38. data/app/views/layouts/klastera/_cluster_selector.html.erb +0 -0
  39. data/app/views/layouts/klastera/_cluster_user_fields.html.erb +0 -0
  40. data/app/views/layouts/klastera/_nested_cluster_entity.html.erb +0 -0
  41. data/app/views/layouts/klastera/_nested_cluster_user.html.erb +0 -0
  42. data/app/views/layouts/klastera/_options.html.erb +0 -0
  43. data/config/locales/es.yml +0 -0
  44. data/config/routes.rb +0 -0
  45. data/db/migrate/20200324203929_create_klastera_clusters.rb +0 -0
  46. data/db/migrate/20200326111219_add_cluster_options_to_organizations.rb +0 -0
  47. data/db/migrate/20200330010551_create_klastera_cluster_users.rb +0 -0
  48. data/db/migrate/20200330221601_add_order_field_to_clusters.rb +0 -0
  49. data/db/migrate/20200518142609_create_klastera_cluster_entities.rb +0 -0
  50. data/db/migrate/20200908180057_add_cluster_config_to_organization.rb +0 -0
  51. data/db/migrate/20220602222332_add_unique_index_to_cluster_entities.rb +0 -0
  52. data/lib/klastera/engine.rb +0 -0
  53. data/lib/klastera/version.rb +1 -1
  54. data/lib/klastera.rb +0 -0
  55. data/lib/tasks/klastera_tasks.rake +0 -0
  56. data/test/controllers/klastera/clusters_controller_test.rb +0 -0
  57. data/test/fixtures/klastera/cluster_users.yml +0 -0
  58. data/test/fixtures/klastera/clusters.yml +0 -0
  59. data/test/integration/navigation_test.rb +0 -0
  60. data/test/klastera_test.rb +0 -0
  61. data/test/models/klastera/cluster_test.rb +0 -0
  62. data/test/models/klastera/cluster_user_test.rb +0 -0
  63. data/test/models/klastera/clusterizable_nested_attributes_test.rb +64 -0
  64. data/test/test_helper.rb +0 -0
  65. metadata +10 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 01b3c7e4c25fc9bfa852d34304d0f0cb12b832da7565375eb9e4cb5f4abc2566
4
- data.tar.gz: 5ccc41a05b2e0ae3a5e8f4b16176be63ec752b0a112f3d8c1276bd403b591386
3
+ metadata.gz: 1b7a266fca197bb8333a1bfa72e2a36b2bdec447429a1e50e95b5b89dc31fb5f
4
+ data.tar.gz: fd8ec6949e6fea5015fe33090ecf09a90e9815361d8e861fb42ac856e83ff111
5
5
  SHA512:
6
- metadata.gz: 07c277261a1ff65e45ca4413587c3ca51952e497176d2a3e29e361c955a51e2d6d77bd4ae5ee8946e8981d56fa1ec756eed81b12e454f623732e5505a7a09349
7
- data.tar.gz: 6f1097125134ab6a528c165df1396697c4c83db96bbfa2265b19f04025a2f72fe5a4e423dcf2a49f23fb0fcb75156911471190e332fae94cd962e2331d0042b7
6
+ metadata.gz: 29ed3030a1296a3fb95073255642e9bef489fea5d136291d8d6f8e71f5b2b6f8ab040034e56c5dc66e70d09451d1880290fedfbbc904ac105ec7dc58ae4810f8
7
+ data.tar.gz: 7bc4e57bdac9abc5cf68be34bc64c48dbce81f6db405485e4dca1e6a8079e1d97e28630e159fb5049158a5d0f280fd000849b89e0cf6dfdc87f2a56bd4ae4e6b
data/MIT-LICENSE CHANGED
File without changes
data/README.rdoc CHANGED
File without changes
data/Rakefile CHANGED
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -7,7 +7,11 @@ module Klastera::Concerns::Clusterizable
7
7
  belongs_to :cluster
8
8
 
9
9
  has_many :cluster_entities, as: :entity, class_name: "Klastera::ClusterEntity"
10
- accepts_nested_attributes_for :cluster_entities, reject_if: :all_blank, allow_destroy: true
10
+ # reject_if exige cluster_id presente. Con :all_blank, una fila EXISTENTE (con id) cuyo select
11
+ # se deja en blanco (include_blank del formulario) no se descarta y se guarda con cluster_id=NULL:
12
+ # queda un cluster_entity huérfano, invisible en el formulario, que cuenta en las validaciones y
13
+ # bloquea el guardado. Para quitar una zona existente se usa _destroy, no vaciar el select.
14
+ accepts_nested_attributes_for :cluster_entities, reject_if: ->(attrs) { attrs[:cluster_id].blank? }, allow_destroy: true
11
15
 
12
16
  validates :cluster_id, presence: true, if: -> { cluster_id.present? && organization.present? && organization.required_suborganization_mode? }
13
17
  validate :at_least_one_cluster_entity, if: -> { organization.present? && organization.required_suborganization_mode? }
@@ -50,8 +54,10 @@ module Klastera::Concerns::Clusterizable
50
54
  )
51
55
  end
52
56
 
57
+ # No cuenta las filas marcadas para destruir: quitar una zona con el basurero y agregar otra en
58
+ # el mismo guardado deja una sola zona al final, y no debe rechazarse.
53
59
  def has_one_cluster_entity
54
- if cluster_entities.length > 1
60
+ if cluster_entities.reject(&:marked_for_destruction?).length > 1
55
61
  return errors.add(:cluster_entities, I18n.t('klastera.messages.has_one_cluster_entity'))
56
62
  end
57
63
  end
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
data/config/routes.rb CHANGED
File without changes
File without changes
@@ -1,3 +1,3 @@
1
1
  module Klastera
2
- VERSION = "1.5.5.1"
2
+ VERSION = "1.5.5.3"
3
3
  end
data/lib/klastera.rb CHANGED
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,64 @@
1
+ require 'test_helper'
2
+
3
+ # Estos tests no corren dentro de este repo: no existe test/dummy y usan modelos de Llegando
4
+ # (Profile, Organization, ::Cluster). Para correrlos hay que copiarlos a llegando-neo con la gema
5
+ # apuntando a esta rama.
6
+ #
7
+ # El test que prueba el fix es "no vacia el cluster_id de una fila existente": con :all_blank
8
+ # falla (la fila queda con cluster_id NULL). Los otros dos pasan igual en main y protegen que
9
+ # el cambio no rompa el descarte de filas nuevas vacias ni agregar/destruir zonas.
10
+ module Klastera
11
+ class ClusterizableNestedAttributesTest < ActiveSupport::TestCase
12
+ def build_entity_with_cluster
13
+ entity = Profile.create!(organization: Organization.first, nid: SecureRandom.hex(4))
14
+ cluster = ::Cluster.create!(organization: entity.organization, name: "c-#{SecureRandom.hex(2)}")
15
+ ce = Klastera::ClusterEntity.create!(entity: entity, cluster_id: cluster.id)
16
+ [entity.reload, ce, cluster]
17
+ end
18
+
19
+ test "descarta una fila nueva con cluster_id vacio" do
20
+ entity, = build_entity_with_cluster
21
+ entity.assign_attributes(cluster_entities_attributes: { "0" => { "cluster_id" => "", "_destroy" => "false" } })
22
+ assert_equal 1, entity.cluster_entities.size
23
+ end
24
+
25
+ test "no vacia el cluster_id de una fila existente" do
26
+ entity, ce, cluster = build_entity_with_cluster
27
+ entity.assign_attributes(cluster_entities_attributes: { "0" => { "id" => ce.id, "cluster_id" => "", "_destroy" => "false" } })
28
+ entity.save!
29
+ assert_equal cluster.id, ce.reload.cluster_id
30
+ end
31
+
32
+ test "sigue permitiendo agregar y destruir zonas" do
33
+ entity, ce, = build_entity_with_cluster
34
+ otro = ::Cluster.create!(organization: entity.organization, name: "otro")
35
+ entity.assign_attributes(cluster_entities_attributes: {
36
+ "0" => { "id" => ce.id, "_destroy" => "1" },
37
+ "1" => { "cluster_id" => otro.id.to_s, "_destroy" => "false" }
38
+ })
39
+ assert entity.cluster_entities.any?(&:marked_for_destruction?)
40
+ assert entity.cluster_entities.any? { |c| c.new_record? && c.cluster_id == otro.id }
41
+ end
42
+
43
+ # Entidad que permite una sola zona (por defecto): quitar una y agregar otra en el mismo guardado
44
+ # deja una sola, y la validacion no debe contar la fila marcada para destruir.
45
+ test "acepta quitar una zona y agregar otra en el mismo guardado" do
46
+ entity, ce, = build_entity_with_cluster
47
+ otro = ::Cluster.create!(organization: entity.organization, name: "otro-#{SecureRandom.hex(2)}")
48
+ entity.assign_attributes(cluster_entities_attributes: {
49
+ "0" => { "id" => ce.id, "_destroy" => "1" },
50
+ "1" => { "cluster_id" => otro.id.to_s, "_destroy" => "false" }
51
+ })
52
+ entity.valid?
53
+ assert_not entity.errors[:cluster_entities].any? { |m| m == I18n.t('klastera.messages.has_one_cluster_entity') }
54
+ end
55
+
56
+ test "sigue rechazando dos zonas vigentes en una entidad de una sola zona" do
57
+ entity, _ce, = build_entity_with_cluster
58
+ otro = ::Cluster.create!(organization: entity.organization, name: "otro2-#{SecureRandom.hex(2)}")
59
+ entity.assign_attributes(cluster_entities_attributes: { "1" => { "cluster_id" => otro.id.to_s, "_destroy" => "false" } })
60
+ entity.valid?
61
+ assert entity.errors[:cluster_entities].any?
62
+ end
63
+ end
64
+ end
data/test/test_helper.rb CHANGED
File without changes
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: klastera
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.5.1
4
+ version: 1.5.5.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gino Barahona
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-06-25 00:00:00.000000000 Z
11
+ date: 2026-11-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -108,6 +108,7 @@ files:
108
108
  - test/klastera_test.rb
109
109
  - test/models/klastera/cluster_test.rb
110
110
  - test/models/klastera/cluster_user_test.rb
111
+ - test/models/klastera/clusterizable_nested_attributes_test.rb
111
112
  - test/test_helper.rb
112
113
  homepage: https://github.com/ginosx/klastera
113
114
  licenses:
@@ -128,16 +129,17 @@ required_rubygems_version: !ruby/object:Gem::Requirement
128
129
  - !ruby/object:Gem::Version
129
130
  version: '0'
130
131
  requirements: []
131
- rubygems_version: 3.4.10
132
+ rubygems_version: 3.1.6
132
133
  signing_key:
133
134
  specification_version: 4
134
135
  summary: Clusterization Engine
135
136
  test_files:
136
- - test/controllers/klastera/clusters_controller_test.rb
137
- - test/fixtures/klastera/cluster_users.yml
138
- - test/fixtures/klastera/clusters.yml
139
137
  - test/integration/navigation_test.rb
140
- - test/klastera_test.rb
141
- - test/models/klastera/cluster_test.rb
138
+ - test/models/klastera/clusterizable_nested_attributes_test.rb
142
139
  - test/models/klastera/cluster_user_test.rb
140
+ - test/models/klastera/cluster_test.rb
141
+ - test/klastera_test.rb
142
+ - test/fixtures/klastera/clusters.yml
143
+ - test/fixtures/klastera/cluster_users.yml
143
144
  - test/test_helper.rb
145
+ - test/controllers/klastera/clusters_controller_test.rb