bemer-simple_form 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: be75bc218822b46c9d58c77805d5a0b27069f49a1e86c37a67710c5593e8070b
4
- data.tar.gz: a33c533dd18ad43cdc298e285ce655bd306b35478c76ccc9d234e3ff94768a4a
3
+ metadata.gz: d3cbbb059d2eb7325fdcea05c4af9a9346d51dbff2786438aafb04e59cd00c00
4
+ data.tar.gz: 4fcb1db714851595aac459463f466e34cdca6c2b25ed6ac7b0a625571cfb17dd
5
5
  SHA512:
6
- metadata.gz: eb2f862f3be9a652a2ffab4e0ab75612e359fcf4a4d2180e89dc35e946be828fc39b1cff25a0db2308e000c8a771097544eeb17f9edae42d4f2724350b1ea385
7
- data.tar.gz: 885e499b291bf83e8ed0428b6295429c69f2f49d5fedeb18467d9b421ca85ca5c2b6f72110268ec5ef893414479b97846c66fe39fe297a143f5a2b5a08433aa2
6
+ metadata.gz: 489518936e9c7d76070c51d04346018f75c9bde67d6f549a8616a4e06123682ab739cc6178f43a5a34597711922c3dd816ef348babf9a2b083ceed51e266aa4c
7
+ data.tar.gz: 9fed8d2631f1451c059b60b9360c22188737aa43d65a01986af544ad0a255c2502ab63c97c05ed97fe3685db4243178dd6bac3c9ca1aff7dc3b950401a04f875
data/README.md CHANGED
@@ -1,31 +1,191 @@
1
- # Bemer::SimpleForm
1
+ # Использование соглашений из БЭМ методологии в формах Simple Form
2
2
 
3
- ## Installation
3
+ ## Установка
4
4
 
5
- Add this line to your application's Gemfile:
5
+ Добавить в `Gemfile`:
6
6
 
7
7
  ```ruby
8
8
  gem 'bemer-simple_form'
9
9
  ```
10
10
 
11
- And then execute:
11
+ Выполнить в терминале команду:
12
12
 
13
13
  $ bundle
14
14
 
15
- Or install it yourself as:
15
+ ## Настройки
16
+ ### Конфигурация `bemer-simple_form`
17
+ Параметры конфигурации по умолчанию:
18
+ ```ruby
19
+ # config/initializers/bemer_simple_form.rb
20
+ Bemer::SimpleForm.setup do |config|
21
+ config.bemify_namespaces = %i[error hint input wrapper label]
22
+ config.element_name_transformer = nil # lambda { |namespace, block, namespaced_elem, initial_elem| ... }
23
+ config.input_type_modifiers_for_namespaces = %i[input wrapper label]
24
+ end
25
+ ```
26
+
27
+ ### Конфигурация `bemer`
28
+ Все параметры конфигурации использующие по умолчанию досутпны [здесь](https://github.com/vill/bemer/blob/master/docs/%D0%9A%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B0%D1%86%D0%B8%D1%8F.md).
29
+ ```ruby
30
+ # config/initializers/bemer.rb
31
+ Bemer.setup do |config|
32
+ config.bem = true
33
+ config.element_name_separator = '__'
34
+ config.modifier_name_separator = '--'
35
+ config.modifier_value_separator = '_'
36
+ end
37
+ ```
38
+
39
+ ### Конфигурация `simple_form`
40
+ Для того, чтобы отключить генерацию ненужных CSS классов от Simple Form, достаточно изменить следующие параметры конфигурации:
41
+ ```ruby
42
+ # config/initializers/simple_form.rb
43
+ SimpleForm.setup do |config|
44
+ config.wrappers :default do |b|
45
+ # ...
46
+
47
+ # Inputs
48
+ b.use :hint, wrap_with: { tag: :span }
49
+ b.use :error, wrap_with: { tag: :span }
50
+
51
+ # ...
52
+ end
53
+
54
+ # ...
55
+
56
+ # DEPRECATED: You can define the class to be used on all forms.
57
+ config.form_class = nil
58
+
59
+ # Default class for buttons
60
+ config.button_class = nil
61
+
62
+ # CSS class to add for error notification helper.
63
+ config.error_notification_class = nil
64
+
65
+ # You can define which elements should obtain additional classes.
66
+ config.generate_additional_classes_for = []
16
67
 
17
- $ gem install bemer-simple_form
68
+ # Define the default class of the input wrapper of the boolean input.
69
+ config.boolean_label_class = nil
18
70
 
19
- ## Usage
71
+ # Defines if the default input wrapper class should be included in radio collection wrappers.
72
+ config.include_default_input_wrapper_class = false
20
73
 
21
- TODO: Write usage instructions here
74
+ # ...
75
+ end
76
+ ```
77
+ Дополнительно при вызове можно указать `class: nil`:
78
+ ```slim
79
+ = simple_form_for resource, url: registration_path(resource_name), html: { class: nil } do |f|
80
+ / ...
81
+ ```
82
+ ## Использование
83
+
84
+ Для `simple_form_for` доступны такие же параметры как и для [хелпера `block_tag`](https://github.com/vill/bemer/blob/master/docs/%D0%A5%D0%B5%D0%BB%D0%BF%D0%B5%D1%80-block_tag.md).
85
+
86
+ Для элементов формы доступны такие же параметры как и для элементов [хелпера `block_tag`](https://github.com/vill/bemer/blob/master/docs/%D0%A5%D0%B5%D0%BB%D0%BF%D0%B5%D1%80-block_tag.md#%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80-content) создаваемых с помощью `content`, переданного в виде Ruby `&block`.
87
+
88
+ Создание формы с параметрами по умолчанию:
89
+
90
+ ```slim
91
+ = simple_form_for resource, url: registration_path(resource_name), html: { class: nil } do |f|
92
+ = f.input :email, required: true, autofocus: true
93
+ = f.input :password, required: true, input_html: { autocomplete: 'off' }
94
+ = f.input :password_confirmation, required: true, input_html: { autocomplete: 'off' }
95
+ => f.button :submit, t('.sign_up')
96
+ ```
22
97
 
23
- ## Development
98
+ Название блока передается через параметр `as`:
99
+ ```slim
100
+ = simple_form_for resource, as: :user, url: registration_path(resource_name), html: { class: nil } do |f|
101
+ = f.input :email, required: true, autofocus: true
102
+ = f.input :password, required: true, input_html: { autocomplete: 'off' }
103
+ = f.input :password_confirmation, required: true, input_html: { autocomplete: 'off' }
104
+ = f.button :submit, t('.sign_up')
105
+ ```
106
+
107
+ Название блока передается через параметр `block`:
108
+ ```slim
109
+ = simple_form_for resource, block: :user, url: registration_path(resource_name), html: { class: nil } do |f|
110
+ = f.input :email, required: true, autofocus: true
111
+ = f.input :password, required: true, input_html: { autocomplete: 'off' }
112
+ = f.input :password_confirmation, required: true, input_html: { autocomplete: 'off' }
113
+ = f.button :submit, t('.sign_up')
114
+ ```
24
115
 
25
- After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
116
+ Добавить модификатор `enabled` в элемент `email`:
117
+ ```slim
118
+ = simple_form_for resource, block: :user, url: registration_path(resource_name), html: { class: nil } do |f|
119
+ = f.input :email, required: true, autofocus: true, input_html: { mods: :enabled }
120
+ = f.input :password, required: true, input_html: { autocomplete: 'off' }
121
+ = f.input :password_confirmation, required: true, input_html: { autocomplete: 'off' }
122
+ = f.button :submit, t('.sign_up')
123
+ ```
124
+
125
+ Результат рендеринга формы с параметрами по умолчанию:
126
+ ```html
127
+ <form id="new_admin_user" novalidate="novalidate" class="admin-user" action="/user" accept-charset="UTF-8" method="post">
128
+ <input type="hidden" name="authenticity_token" value="dXgQo5PvtM5g01pFiQmpMDTb8BYVxsMvzS8n+6YN/UhjFR/tCf4ym7bZzMgs/E/ECxvXZcbr9uzMPcUUIj43jA==">
129
+ <div class="admin-user__email-wrapper admin-user__email-wrapper--email admin-user__email-wrapper--required">
130
+ <label class="admin-user__email-label admin-user__email-label--email admin-user__email-label--required" for="admin_user_email">
131
+ <abbr title="Обязательное">*</abbr>
132
+ Электронный адрес
133
+ </label>
134
+ <input autofocus="autofocus" class="admin-user__email admin-user__email--email admin-user__email--required" required="required" aria-required="true" type="email" value="" name="admin_user[email]" id="admin_user_email">
135
+ </div>
136
+ <div class="admin-user__password-wrapper admin-user__password-wrapper--password admin-user__password-wrapper--required">
137
+ <label class="admin-user__password-label admin-user__password-label--password admin-user__password-label--required" for="admin_user_password">
138
+ <abbr title="Обязательное">*</abbr>
139
+ Пароль
140
+ </label>
141
+ <input autocomplete="off" class="admin-user__password admin-user__password--password admin-user__password--required" required="required" aria-required="true" type="password" name="admin_user[password]" id="admin_user_password">
142
+ </div>
143
+ <div class="admin-user__password-confirmation-wrapper admin-user__password-confirmation-wrapper--password admin-user__password-confirmation-wrapper--required">
144
+ <label class="admin-user__password-confirmation-label admin-user__password-confirmation-label--password admin-user__password-confirmation-label--required" for="admin_user_password_confirmation">
145
+ <abbr title="Обязательное">*</abbr>
146
+ Подтверждение пароля
147
+ </label>
148
+ <input autocomplete="off" class="admin-user__password-confirmation admin-user__password-confirmation--password admin-user__password-confirmation--required" required="required" aria-required="true" type="password" name="admin_user[password_confirmation]" id="admin_user_password_confirmation">
149
+ </div>
150
+ <input type="submit" name="commit" value="Зарегистрироваться" class="admin-user__submit" data-disable-with="Зарегистрироваться">
151
+ </form>
152
+ ```
153
+ Результат рендеринга формы содержащей ошибки валидации:
154
+ ```html
155
+ <form novalidate="novalidate" class="admin-user" action="/user" accept-charset="UTF-8" method="post">
156
+ <input type="hidden" name="authenticity_token" value="5GJ9rIPD1XVg8BDKy2ZBpDt3qYlBuAh/z7u00qw8bzfyD3LiGdJTILb6hkduk6dQBLeO+pKVPbzOqVY9KA+l8w==">
157
+ <div class="admin-user__email-wrapper admin-user__email-wrapper--email admin-user__email-wrapper--required">
158
+ <label class="admin-user__email-label admin-user__email-label--email admin-user__email-label--required" for="admin_user_email">
159
+ <abbr title="Обязательное">*</abbr>
160
+ Электронный адрес
161
+ </label>
162
+ <input autofocus="autofocus" class="admin-user__email admin-user__email--email admin-user__email--required" required="required" aria-required="true" aria-invalid="true" type="email" value="" name="admin_user[email]" id="admin_user_email">
163
+ <span class="admin-user__email-error">не может быть пустым</span>
164
+ </div>
165
+ <div class="admin-user__password-wrapper admin-user__password-wrapper--password admin-user__password-wrapper--required">
166
+ <label class="admin-user__password-label admin-user__password-label--password admin-user__password-label--required" for="admin_user_password">
167
+ <abbr title="Обязательное">*</abbr>
168
+ Пароль
169
+ </label>
170
+ <input autocomplete="off" class="admin-user__password admin-user__password--password admin-user__password--required" required="required" aria-required="true" aria-invalid="true" type="password" name="admin_user[password]" id="admin_user_password">
171
+ <span class="admin-user__password-error">не может быть пустым</span>
172
+ </div>
173
+ <div class="admin-user__password-confirmation-wrapper admin-user__password-confirmation-wrapper--password admin-user__password-confirmation-wrapper--required">
174
+ <label class="admin-user__password-confirmation-label admin-user__password-confirmation-label--password admin-user__password-confirmation-label--required" for="admin_user_password_confirmation">
175
+ <abbr title="Обязательное">*</abbr>
176
+ Подтверждение пароля
177
+ </label>
178
+ <input autocomplete="off" class="admin-user__password-confirmation admin-user__password-confirmation--password admin-user__password-confirmation--required" required="required" aria-required="true" type="password" name="admin_user[password_confirmation]" id="admin_user_password_confirmation">
179
+ </div>
180
+ <input type="submit" name="commit" value="Зарегистрироваться" class="admin-user__submit" data-disable-with="Зарегистрироваться">
181
+ </form>
182
+ ```
183
+ ## Ссылки
26
184
 
27
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
185
+ 1. https://ru.bem.info/methodology/
186
+ 1. https://github.com/bem/bem-xjst
187
+ 1. https://github.com/bem/bem-core
28
188
 
29
- ## License
189
+ ## Лицензия
30
190
 
31
- The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
191
+ Copyright (c) 2019 - 2020 Александр Григорьев. Более подробную информацию о лицензии можно получить в файле [LICENSE-RU.txt](LICENSE-RU.txt).
@@ -19,7 +19,8 @@ module Bemer
19
19
  end
20
20
 
21
21
  class << self
22
- delegate :bemify_suffix_namespaces, :input_type_modifiers_for_suffix_namespaces, to: :config
22
+ delegate :bemify_suffix_namespaces, :input_type_modifiers_for_suffix_namespaces,
23
+ :element_name_transformer, to: :config
23
24
 
24
25
  def config
25
26
  Bemer::SimpleForm::Configuration.instance
@@ -28,6 +29,14 @@ module Bemer
28
29
  def setup
29
30
  yield config
30
31
  end
32
+
33
+ def transform_element_name(namespace, block, namespaced_elem, initial_elem)
34
+ return namespaced_elem unless element_name_transformer.respond_to?(:call)
35
+
36
+ namespace = namespace.to_s.chomp('_html').to_sym unless namespace.nil?
37
+
38
+ element_name_transformer.call(namespace, block, namespaced_elem, initial_elem)
39
+ end
31
40
  end
32
41
  end
33
42
  end
@@ -14,6 +14,7 @@ module Bemer
14
14
  def button(type, *args, &block)
15
15
  options = args.extract_options!
16
16
  elem = extract_name_for!(:elem, type, options)
17
+ elem = Bemer::SimpleForm.transform_element_name(nil, block_entity.block, elem, elem)
17
18
  entity = Bemer::EntityBuilder.new(block_entity.block, elem, extract_bem_options!(options))
18
19
 
19
20
  options.delete(:block)
@@ -57,7 +58,7 @@ module Bemer
57
58
  def extract_name_for!(key, default_name, options)
58
59
  name = options.delete(key)
59
60
 
60
- name.nil? ? default_name.to_s.to_sym : name
61
+ name.nil? ? default_name.to_sym : name
61
62
  end
62
63
 
63
64
  def extract_bem_cascade!(options)
@@ -65,7 +66,7 @@ module Bemer
65
66
 
66
67
  return bem_cascade if block_entity.nil?
67
68
 
68
- bem_cascade.nil? ? block_entity.bem_cascade : bem_cascade
69
+ bem_cascade.nil? ? block_entity.instance_variable_get(:@bem_cascade) : bem_cascade
69
70
  end
70
71
  end
71
72
  end
@@ -8,10 +8,12 @@ module Bemer
8
8
  class Configuration
9
9
  include Singleton
10
10
 
11
- attr_accessor :bemify_namespaces, :input_type_modifiers_for_namespaces
11
+ attr_accessor :bemify_namespaces, :input_type_modifiers_for_namespaces,
12
+ :element_name_transformer
12
13
 
13
14
  def initialize
14
15
  @bemify_namespaces = %i[error hint input wrapper label]
16
+ @element_name_transformer = nil
15
17
  @input_type_modifiers_for_namespaces = %i[input wrapper label]
16
18
  end
17
19
 
@@ -20,7 +22,7 @@ module Bemer
20
22
  end
21
23
 
22
24
  def input_type_modifiers_for_suffix_namespaces
23
- @input_type_modifiers_for_suffix_namespaces ||= Array.wrap(input_type_modifiers_for_namespaces).uniq.map { |n| add_sufix(n) }
25
+ @input_type_modifiers_for_suffix_namespaces ||= Array.wrap(input_type_modifiers_for_namespaces).uniq.map { |n| add_sufix(n) } # rubocop:disable Metrics/LineLength
24
26
  end
25
27
 
26
28
  protected
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'active_support/core_ext/array/wrap'
4
+ require 'active_support/core_ext/object/blank'
5
+
3
6
  module Bemer
4
7
  module SimpleForm
5
8
  module Inputs
@@ -15,11 +18,13 @@ module Bemer
15
18
  @block_entity ||= @options.delete(:block_entity)
16
19
  end
17
20
 
18
- def bemify_input!
21
+ def bemify_input! # rubocop:disable Metrics/AbcSize
19
22
  return unless block_entity
20
23
 
24
+ default_name = options.delete(:elem)
25
+
21
26
  Bemer::SimpleForm.bemify_suffix_namespaces.each do |namespace|
22
- elem = extract_elem_name_for!(namespace)
27
+ elem = extract_elem_name_for!(namespace, default_name)
23
28
  options = extract_bem_options_for!(namespace)
24
29
 
25
30
  add_input_type_modifiers!(namespace, options)
@@ -30,16 +35,23 @@ module Bemer
30
35
  end
31
36
  end
32
37
 
33
- def extract_elem_name_for!(namespace)
34
- bem_options = bem_options_for(namespace)
35
- elem = bem_options.delete(:elem)
38
+ # rubocop:disable Metrics/LineLength
39
+ def extract_elem_name_for!(namespace, default_name) # rubocop:disable Metrics/AbcSize
40
+ elem = bem_options_for(namespace).delete(:elem)
36
41
 
37
- return elem unless elem.nil?
42
+ return Bemer::SimpleForm.transform_element_name(namespace, block_entity.block, elem, elem) unless elem.nil?
43
+
44
+ elem = default_name.nil? ? reflection_or_attribute_name : default_name
45
+
46
+ return Bemer::SimpleForm.transform_element_name(namespace, block_entity.block, elem, elem) if Bemer.bem_class(block_entity.block, elem).blank?
38
47
 
39
48
  suffix = namespace.to_s.chomp('_html') unless namespace.eql?(:input_html)
40
49
 
41
- [reflection_or_attribute_name, suffix].compact.join('_').to_sym
50
+ namespaced_elem = [elem, suffix].compact.join('_').to_sym
51
+
52
+ Bemer::SimpleForm.transform_element_name(namespace, block_entity.block, namespaced_elem, elem)
42
53
  end
54
+ # rubocop:enable Metrics/LineLength
43
55
 
44
56
  def add_input_type_modifiers!(namespace, options)
45
57
  return if Bemer::SimpleForm.input_type_modifiers_for_suffix_namespaces.exclude?(namespace)
@@ -68,7 +80,7 @@ module Bemer
68
80
  def extract_bem_cascade!(options)
69
81
  bem_cascade = options.delete(:bem_cascade)
70
82
 
71
- bem_cascade.nil? ? block_entity.bem_cascade : bem_cascade
83
+ bem_cascade.nil? ? block_entity.instance_variable_get(:@bem_cascade) : bem_cascade
72
84
  end
73
85
  end
74
86
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Bemer
4
4
  module SimpleForm
5
- VERSION = '0.1.0'
5
+ VERSION = '0.2.0'
6
6
  end
7
7
  end
@@ -1,6 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  RSpec.describe 'block builder with a name as a passed object' do
4
+ # Можно сделать заглушку и не создавать миграции и т.д. https://github.com/rails/rails/blob/855cb4bef21f3f658b8cd192cfd087bcbe70006a/actionview/test/template/form_helper/form_with_test.rb#L261-L268
5
+
6
+ # Не имеет значение что передается в `simple_form_for` первым параметром или через `as`, все преобразовывается в symbol
7
+ # Поэтому тесты можно объединить в один файл? Для active record и active model сделать только по несколько основных а остальные для symbol?
8
+
9
+ # Логика для form_for
10
+ # https://github.com/rails/rails/blob/eca6c273fe2729b9634907562c2717cf86443b6b/actionview/lib/action_view/helpers/form_helper.rb#L430-L443
11
+
4
12
  #########################
5
13
  # Покрыть тестами:
6
14
  #########################
@@ -0,0 +1,154 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe 'simple_form_for helper' do
4
+ it do
5
+ form = simple_form_for :block do |f|
6
+ f.input :elem
7
+ end
8
+
9
+ expect(form).to have_tag(:form, with: { class: 'block' }, count: 1) do
10
+ with_tag :div, with: { class: 'block__elem-wrapper' }, count: 1
11
+ with_tag :label, with: { class: 'block__elem-label' }, count: 1
12
+ with_tag :input, with: { class: 'block__elem' }, count: 1
13
+ end
14
+ end
15
+
16
+ it do
17
+ form = simple_form_for :form do |f|
18
+ f.button :submit
19
+ end
20
+
21
+ expect(form).to have_tag(:form, with: { class: 'form' }, count: 1) do
22
+ with_tag :input, with: { class: 'form__submit' }, count: 1
23
+ end
24
+ end
25
+
26
+ it do
27
+ form = simple_form_for :form do |f|
28
+ f.button :button
29
+ end
30
+
31
+ expect(form).to have_tag(:form, with: { class: 'form' }, count: 1) do
32
+ with_tag :button, with: { class: 'form__button' }, count: 1
33
+ end
34
+ end
35
+
36
+ context 'when the element name is passed through input parameters' do
37
+ it do
38
+ form = simple_form_for :block do |f|
39
+ f.input :elem, elem: nil
40
+ end
41
+
42
+ expect(form).to have_tag(:form, with: { class: 'block' }, count: 1) do
43
+ with_tag :div, with: { class: 'block__elem-wrapper' }, count: 1
44
+ with_tag :label, with: { class: 'block__elem-label' }, count: 1
45
+ with_tag :input, with: { class: 'block__elem' }, count: 1
46
+ end
47
+ end
48
+
49
+ it do
50
+ form = simple_form_for :block do |f|
51
+ f.input :elem, elem: false
52
+ end
53
+
54
+ expect(form).to have_tag(:form, with: { class: 'block' }, count: 1) do
55
+ without_tag 'div[class]'
56
+ without_tag 'label[class]'
57
+ without_tag 'input[class]'
58
+ end
59
+ end
60
+
61
+ it do
62
+ form = simple_form_for :block do |f|
63
+ f.input :elem, elem: ''
64
+ end
65
+
66
+ expect(form).to have_tag(:form, with: { class: 'block' }, count: 1) do
67
+ without_tag 'div[class]'
68
+ without_tag 'label[class]'
69
+ without_tag 'input[class]'
70
+ end
71
+ end
72
+
73
+ it do
74
+ form = simple_form_for :block do |f|
75
+ f.input :elem, elem: :elem_name
76
+ end
77
+
78
+ expect(form).to have_tag(:form, with: { class: 'block' }, count: 1) do
79
+ with_tag :div, with: { class: 'block__elem-name-wrapper' }, count: 1
80
+ with_tag :label, with: { class: 'block__elem-name-label' }, count: 1
81
+ with_tag :input, with: { class: 'block__elem-name' }, count: 1
82
+ end
83
+ end
84
+
85
+ it do
86
+ form = simple_form_for :block do |f|
87
+ f.input :elem, elem: :elem_name, input_html: { elem: :input }, label_html: { elem: :label }, wrapper_html: { elem: :wrapper }
88
+ end
89
+
90
+ expect(form).to have_tag(:form, with: { class: 'block' }, count: 1) do
91
+ with_tag :div, with: { class: 'block__wrapper' }, count: 1
92
+ with_tag :label, with: { class: 'block__label' }, count: 1
93
+ with_tag :input, with: { class: 'block__input' }, count: 1
94
+ end
95
+ end
96
+ end
97
+
98
+ context 'when `element_name_transformer` is specified in the configuration' do
99
+ before do
100
+ Bemer::SimpleForm.setup do |config|
101
+ config.element_name_transformer = proc { |namespace, _block, namespaced_elem, initial_elem|
102
+ elem = initial_elem.to_s
103
+
104
+ next namespaced_elem unless elem.end_with?('_id', '_ids') || elem.eql?('submit')
105
+
106
+ elem =
107
+ if elem.end_with?('_ids')
108
+ elem.chomp('_ids').pluralize
109
+ elsif elem.end_with?('_id')
110
+ elem.chomp('_id')
111
+ else
112
+ :submit_button
113
+ end
114
+
115
+ namespace.eql?(:input) ? elem.to_sym : [elem, namespace].compact.join('_').to_sym
116
+ }
117
+ end
118
+ end
119
+
120
+ it do
121
+ form = simple_form_for :form do |f|
122
+ f.input :user_ids
123
+ end
124
+
125
+ expect(form).to have_tag(:form, with: { class: 'form' }, count: 1) do
126
+ with_tag :div, with: { class: 'form__users-wrapper' }, count: 1
127
+ with_tag :label, with: { class: 'form__users-label' }, count: 1
128
+ with_tag :input, with: { class: 'form__users' }, count: 1
129
+ end
130
+ end
131
+
132
+ it do
133
+ form = simple_form_for :form do |f|
134
+ f.input :user_id
135
+ end
136
+
137
+ expect(form).to have_tag(:form, with: { class: 'form' }, count: 1) do
138
+ with_tag :div, with: { class: 'form__user-wrapper' }, count: 1
139
+ with_tag :label, with: { class: 'form__user-label' }, count: 1
140
+ with_tag :input, with: { class: 'form__user' }, count: 1
141
+ end
142
+ end
143
+
144
+ it do
145
+ form = simple_form_for :form do |f|
146
+ f.button :submit
147
+ end
148
+
149
+ expect(form).to have_tag(:form, with: { class: 'form' }, count: 1) do
150
+ with_tag :input, with: { class: 'form__submit-button' }, count: 1
151
+ end
152
+ end
153
+ end
154
+ end
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe 'simple_form_for with a symbolic name as a passed object' do
4
+ context 'when the `element_name_separator` is set to `___`' do
5
+ before do
6
+ Bemer.config.element_name_separator = '___'
7
+ end
8
+
9
+ it do
10
+ form = simple_form_for :block do |f|
11
+ f.input :elem
12
+ end
13
+
14
+ expect(form).to have_tag(:form, with: { class: 'block' }, count: 1) do
15
+ with_tag :input, with: { class: 'block___elem' }, count: 1
16
+ end
17
+ end
18
+ end
19
+
20
+ context 'when the `modifier_name_separator` is set to `--`' do
21
+ before do
22
+ Bemer.config.modifier_name_separator = '--'
23
+ end
24
+
25
+ it do
26
+ form = simple_form_for :block, mods: :enabled do |f|
27
+ f.input :elem
28
+ end
29
+
30
+ expect(form).to have_tag(:form, with: { class: 'block block--enabled' }, count: 1) do
31
+ with_tag :input, with: { class: 'block__elem block__elem--string' }, count: 1
32
+ end
33
+ end
34
+ end
35
+
36
+ context 'when the `modifier_value_separator` is set to `___`' do
37
+ before do
38
+ Bemer.config.modifier_value_separator = '___'
39
+ end
40
+
41
+ it do
42
+ form = simple_form_for :block, mods: { size: :large } do |f|
43
+ f.input :elem, input_html: { mods: { disabled: :yes } }
44
+ end
45
+
46
+ expect(form).to have_tag(:form, with: { class: 'block block_size___large' }, count: 1) do
47
+ with_tag :input, with: { class: 'block__elem block__elem_disabled___yes' }, count: 1
48
+ end
49
+ end
50
+ end
51
+
52
+ context 'when the `bem` is globally set to `false`' do
53
+ before do
54
+ Bemer.config.bem = false
55
+ end
56
+
57
+ it do
58
+ form = simple_form_for :block do |f|
59
+ f.input :elem
60
+ end
61
+
62
+ expect(form).to have_tag(:form, count: 1) do
63
+ without_tag 'form[class]'
64
+ without_tag 'input[class]'
65
+ end
66
+ end
67
+ end
68
+
69
+ it do
70
+ form = simple_form_for Article.new, as: 'sss_sss' do |f|
71
+ # f.input 'elem_name'
72
+ f.input :title
73
+ end
74
+
75
+ form = simple_form_for 'eferg_adFdb', as: 'sss_sss' do |f|
76
+ f.input 'elem_name'
77
+ # f.input :title
78
+ end
79
+
80
+ p form
81
+ # expect(form).to have_tag(:form, count: 1) do
82
+ # without_tag 'form[class]'
83
+ # without_tag 'input[class]'
84
+ # end
85
+ end
86
+ end
@@ -10,4 +10,8 @@ RSpec.describe Bemer::SimpleForm::Configuration do
10
10
  describe '#input_type_modifiers_for_namespaces' do
11
11
  it { expect(configuration.input_type_modifiers_for_namespaces).to match_array %i[input wrapper label] }
12
12
  end
13
+
14
+ describe '#element_name_transformer' do
15
+ it { expect(configuration.element_name_transformer).to be_nil }
16
+ end
13
17
  end
@@ -3,8 +3,8 @@
3
3
  require_relative 'boot'
4
4
 
5
5
  require 'action_view/railtie'
6
- require 'active_model/railtie'
7
- require 'active_record/railtie'
6
+ # require 'active_model/railtie'
7
+ # require 'active_record/railtie'
8
8
 
9
9
  Bundler.require(*Rails.groups)
10
10
 
@@ -13,8 +13,7 @@ SimpleForm.setup do |config|
13
13
  # wrapper, change the order or even add your own to the
14
14
  # stack. The options given below are used to wrap the
15
15
  # whole input.
16
- config.wrappers :default, hint_class: :field_with_hint, error_class: :field_with_errors,
17
- valid_class: :field_without_errors do |b|
16
+ config.wrappers :default do |b|
18
17
  ## Extensions enabled by default
19
18
  # Any of these extensions can be disabled for a
20
19
  # given input by passing: `f.input EXTENSION_NAME => false`.
@@ -1 +1 @@
1
- Rails.application.config.active_record.sqlite3.represent_boolean_as_integer = true
1
+ # Rails.application.config.active_record.sqlite3.represent_boolean_as_integer = true
data/spec/rails_helper.rb CHANGED
@@ -8,6 +8,7 @@ require 'rspec/rails'
8
8
  require 'spec_helper'
9
9
  require 'fuubar'
10
10
  require 'rspec-html-matchers'
11
+ require 'active_support/core_ext/string/inflections'
11
12
 
12
13
  RSpec.configure do |config|
13
14
  config.infer_spec_type_from_file_location!
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- RSpec.configure do |config|
4
- config.before(:all) do
5
- ActiveRecord::Migration.verbose = false
3
+ # RSpec.configure do |config|
4
+ # config.before(:all) do
5
+ # ActiveRecord::Migration.verbose = false
6
6
 
7
- ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')
7
+ # ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')
8
8
 
9
- load Rails.root.join('db', 'schema.rb')
10
- end
11
- end
9
+ # load Rails.root.join('db', 'schema.rb')
10
+ # end
11
+ # end
@@ -3,7 +3,7 @@
3
3
  module Helpers
4
4
  module SimpleForm
5
5
  def simple_form_for(record, options = {}, &block)
6
- options = { url: '', html: { class: '' } }.deep_merge(options)
6
+ options = { url: '', html: { class: nil } }.deep_merge(options)
7
7
 
8
8
  view.simple_form_for(record, options, &(block || proc {}))
9
9
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bemer-simple_form
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexander Grigorev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-01 00:00:00.000000000 Z
11
+ date: 2020-05-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: bundler
14
+ name: appraisal
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.16'
19
+ version: 2.2.0
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.16'
26
+ version: 2.2.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler-audit
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -66,20 +66,6 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: 2.5.0
69
- - !ruby/object:Gem::Dependency
70
- name: overcommit
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: 0.48.0
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: 0.48.0
83
69
  - !ruby/object:Gem::Dependency
84
70
  name: rake
85
71
  requirement: !ruby/object:Gem::Requirement
@@ -164,6 +150,20 @@ dependencies:
164
150
  - - "~>"
165
151
  - !ruby/object:Gem::Version
166
152
  version: 1.33.0
153
+ - !ruby/object:Gem::Dependency
154
+ name: wwtd
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: 1.4.1
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: 1.4.1
167
167
  - !ruby/object:Gem::Dependency
168
168
  name: activesupport
169
169
  requirement: !ruby/object:Gem::Requirement
@@ -229,9 +229,11 @@ files:
229
229
  - lib/bemer/simple_form/inputs.rb
230
230
  - lib/bemer/simple_form/test/configuration_helpers.rb
231
231
  - lib/bemer/simple_form/version.rb
232
- - spec/action_view/block_builder_with_a_name_as_a_passed_object_spec.rb
232
+ - spec/action_view/block_builder_with_a_name_as_a_passed_object_spec_old.rb
233
233
  - spec/action_view/first_spec.rb
234
+ - spec/action_view/helpers/simple_form_spec.rb
234
235
  - spec/action_view/simple_form_for_as_a_block_builder_spec.rb
236
+ - spec/action_view/simple_form_for_with_a_symbolic_name_as_a_passed_object_spec.rb
235
237
  - spec/bemer/simple_form/configuration_spec.rb
236
238
  - spec/dummy/Rakefile
237
239
  - spec/dummy/app/forms/search_form.rb
@@ -275,15 +277,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
275
277
  - !ruby/object:Gem::Version
276
278
  version: 2.2.0
277
279
  requirements: []
278
- rubyforge_project:
279
- rubygems_version: 2.7.7
280
+ rubygems_version: 3.0.3
280
281
  signing_key:
281
282
  specification_version: 4
282
283
  summary: Add the BEM methodology to your SimpleForm forms.
283
284
  test_files:
284
- - spec/action_view/block_builder_with_a_name_as_a_passed_object_spec.rb
285
+ - spec/action_view/block_builder_with_a_name_as_a_passed_object_spec_old.rb
285
286
  - spec/action_view/first_spec.rb
287
+ - spec/action_view/helpers/simple_form_spec.rb
286
288
  - spec/action_view/simple_form_for_as_a_block_builder_spec.rb
289
+ - spec/action_view/simple_form_for_with_a_symbolic_name_as_a_passed_object_spec.rb
287
290
  - spec/bemer/simple_form/configuration_spec.rb
288
291
  - spec/dummy/app/forms/search_form.rb
289
292
  - spec/dummy/app/models/article.rb