formwandler 0.7.0 → 0.9.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2baf488a4d1a35a90e7a53d588c8d843fccab4cc8ce9de5cda36920d4d9b22aa
4
- data.tar.gz: a00ac15d3663ea1e7c313170681bd3d949c30024862a98c44afc891e2d611ca1
3
+ metadata.gz: 9ffd1df3fd9bd73b09841ad5f2ea2179f4a9366fd11f65723948e0e43b217ff4
4
+ data.tar.gz: 5981014ba28b9dee2ecd47650d701ea8bc5d8de47c0094d96ed367e5d9eb332f
5
5
  SHA512:
6
- metadata.gz: 4d91c842de66da094997e6e270349af7fcc76ef66ab32a597fd444e857ee97b3990c0ab3e99539534e8b43dc1478573a41f8c707533805b63ea1c704b0f87dc1
7
- data.tar.gz: 297b12e919ba35ac50d90ae3e73b8d87ff211cdc401bbdcc02cf20457502a63efed0b18b871f165fabc278f3e21b4b231075de9ba87ea316302f68dd9390e45b
6
+ metadata.gz: 15d5c19992dda87e2e26c7cde5c38ce6040b4f9074f78639860f2c896ff04734f25dc0bf97d325ee49c3a52ac3de3b23f68a3d87dbd56b070e8066df5d23960e
7
+ data.tar.gz: dc25518420cd974025447a7bb824f09d99d583e006e5d8795e4ea860843243985577012afd2d8676b4b98a1010bda7b1794da44a8575043d4369198d9c468d6e
@@ -14,7 +14,7 @@ module Formwandler
14
14
  def value=(new_value)
15
15
  new_value = transform_value(new_value, field_definition.in_transformation)
16
16
  if model_instance
17
- model_instance.public_send("#{field_definition.source}=", new_value)
17
+ model_instance.public_send("#{source}=", new_value)
18
18
  else
19
19
  @value = new_value
20
20
  end
@@ -25,7 +25,7 @@ module Formwandler
25
25
  end
26
26
 
27
27
  def raw_value
28
- model_instance ? model_instance.public_send(field_definition.source) : @value
28
+ model_instance ? model_instance.public_send(source) : @value
29
29
  end
30
30
 
31
31
  def hidden?
@@ -40,6 +40,10 @@ module Formwandler
40
40
  _evaluate_field_definition_value(:disabled)
41
41
  end
42
42
 
43
+ def readonly?
44
+ _evaluate_field_definition_value(:readonly)
45
+ end
46
+
43
47
  def options
44
48
  all_options - hidden_options
45
49
  end
@@ -63,7 +67,7 @@ module Formwandler
63
67
  private
64
68
 
65
69
  def transform_value(value, transformation)
66
- return value if value.nil? || value == ''
70
+ return value if !field_definition.transform_blank && (value.nil? || value == '')
67
71
  if transformation.respond_to?(:call)
68
72
  form.instance_exec(value, &transformation)
69
73
  else
@@ -4,14 +4,43 @@ require_relative 'field_value_transformer'
4
4
 
5
5
  module Formwandler
6
6
  class FieldDefinition
7
- attr_reader :name
8
- attr_accessor :hidden, :disabled, :default, :delocalize, :model, :source, :options, :array
7
+ attr_reader :name, :transform_blank
8
+ attr_accessor :hidden, :disabled, :readonly, :default, :delocalize, :model, :model_class, :source, :options, :array
9
9
 
10
10
  def initialize(name)
11
11
  @name = name
12
+ @transform_blank = false
12
13
  set_defaults
13
14
  end
14
15
 
16
+ def model=(model)
17
+ set_model model, model
18
+ end
19
+
20
+ def model_class=(symbol_or_class)
21
+ @model_class =
22
+ if symbol_or_class.nil?
23
+ nil
24
+ elsif symbol_or_class.is_a?(Symbol)
25
+ symbol_or_class.to_s.classify.constantize rescue nil
26
+ elsif symbol_or_class < ActiveRecord::Base || symbol_or_class < ActiveModel::Model
27
+ symbol_or_class
28
+ else
29
+ fail 'The model class must be nil, a symbol or a descendant of ActiveModel::Model or ActiveRecord::Base.'
30
+ end
31
+ end
32
+
33
+ def configure(opts)
34
+ model = opts[:model]
35
+ model_class = opts[:model_class] || model
36
+ set_model model, model_class
37
+ opts.except(:model, :model_class).each do |key, value|
38
+ send("#{key}=", value)
39
+ rescue NoMethodError
40
+ raise ArgumentError, "Invalid option #{key}"
41
+ end
42
+ end
43
+
15
44
  def hide_option(name, value = true)
16
45
  hidden_options[name.to_s] = value
17
46
  end
@@ -20,7 +49,8 @@ module Formwandler
20
49
  @hidden_options ||= {}
21
50
  end
22
51
 
23
- def transform(&block)
52
+ def transform(allow_blank: false, &block)
53
+ @transform_blank = allow_blank
24
54
  @value_transformer = FieldValueTransformer.new(&block)
25
55
  end
26
56
 
@@ -39,12 +69,19 @@ module Formwandler
39
69
  def set_defaults
40
70
  @hidden = false
41
71
  @disabled = false
72
+ @readonly = false
42
73
  @default = nil
43
74
  @delocalize = nil
44
75
  @model = nil
76
+ @model_class = nil
45
77
  @source = name
46
78
  @options = nil
47
79
  @array = false
48
80
  end
81
+
82
+ def set_model(model, model_class)
83
+ @model = model
84
+ self.model_class = model_class
85
+ end
49
86
  end
50
87
  end
@@ -14,17 +14,23 @@ module Formwandler
14
14
  ActiveModel::Name.new(self, nil, name.chomp('Form').underscore)
15
15
  end
16
16
 
17
+ def human_attribute_name(attr, options = {})
18
+ field_definition = @field_definitions.fetch(attr) { nil }
19
+ if options[:default].nil? && field_definition && field_definition.model_class
20
+ not_found = '__formwandler_not_found__'
21
+ model_translation = field_definition.model_class.human_attribute_name(field_definition.source, default: not_found)
22
+ options[:default] = model_translation unless model_translation == not_found
23
+ end
24
+ super(attr, options)
25
+ end
26
+
17
27
  def field_definitions
18
28
  @field_definitions ||= {}
19
29
  end
20
30
 
21
31
  def field(name, opts = {}, &block)
22
32
  field_definition = field_definitions[name] ||= FieldDefinition.new(name)
23
- opts.each do |key, value|
24
- field_definition.public_send("#{key}=", value)
25
- rescue NoMethodError
26
- raise ArgumentError, "Invalid option #{key}"
27
- end
33
+ field_definition.configure(opts)
28
34
  field_definition.instance_exec(&block) if block_given?
29
35
 
30
36
  attribute_accessor(name)
@@ -120,11 +126,12 @@ module Formwandler
120
126
  def models_valid?
121
127
  all_valid = true
122
128
  models.each do |name, model|
123
- all_valid = false if model.invalid?
124
129
  next if model.valid?
130
+
131
+ all_valid = false
125
132
  fields_for_model(name).each do |field|
126
133
  model.errors[field.source].each do |error_message|
127
- errors.add(field.name, error_message)
134
+ errors.add(field.name, error_message) unless errors.messages[field.source].include? error_message
128
135
  end
129
136
  end
130
137
  end
@@ -6,22 +6,18 @@ module Formwandler
6
6
 
7
7
  class_methods do
8
8
  def load_form(opts = {})
9
- before_action :_formwandler_load_form, opts
10
- end
11
-
12
- def skip_load_form(opts = {})
13
- skip_before_action :_formwandler_load_form, opts
9
+ before_action(opts.except(:models)) do
10
+ if opts.fetch(:models, true)
11
+ models = {inferred_resource_name.to_sym => instance_variable_get("@#{inferred_resource_name}")}.compact
12
+ end
13
+ form_instance = form_class.new(models: models || {}, controller: self)
14
+ instance_variable_set("@#{form_instance_name}", form_instance)
15
+ end
14
16
  end
15
17
  end
16
18
 
17
19
  private
18
20
 
19
- def _formwandler_load_form
20
- models = {inferred_resource_name.to_sym => instance_variable_get("@#{inferred_resource_name}")}.compact
21
- form_instance = form_class.new(models: models, controller: self)
22
- instance_variable_set("@#{form_instance_name}", form_instance)
23
- end
24
-
25
21
  def form_class_name
26
22
  "#{namespace}::#{inferred_resource_name.camelize}Form"
27
23
  end
@@ -1,3 +1,3 @@
1
1
  module Formwandler
2
- VERSION = '0.7.0'
2
+ VERSION = '0.9.0'
3
3
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: formwandler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stefan Bilharz
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-08-17 00:00:00.000000000 Z
11
+ date: 2021-06-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '5'
19
+ version: 5.0.0
20
20
  type: :runtime
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: '5'
26
+ version: 5.0.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: delocalize
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -86,14 +86,14 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '1.3'
89
+ version: '1.4'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '1.3'
96
+ version: '1.4'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: byebug
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -127,7 +127,7 @@ homepage: https://github.com/sbilharz/formwandler
127
127
  licenses:
128
128
  - MIT
129
129
  metadata: {}
130
- post_install_message:
130
+ post_install_message:
131
131
  rdoc_options: []
132
132
  require_paths:
133
133
  - lib
@@ -142,9 +142,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
142
142
  - !ruby/object:Gem::Version
143
143
  version: '0'
144
144
  requirements: []
145
- rubyforge_project:
146
- rubygems_version: 2.7.6
147
- signing_key:
145
+ rubygems_version: 3.1.4
146
+ signing_key:
148
147
  specification_version: 4
149
148
  summary: Form objects for rails
150
149
  test_files: []