eac_rails_utils 0.10.1 → 0.11.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 (58) hide show
  1. checksums.yaml +4 -4
  2. data/{lib/eac → app/helpers/eac_rails_utils}/common_form_helper.rb +5 -1
  3. data/{lib/eac → app/helpers/eac_rails_utils}/common_form_helper/form_builder.rb +10 -2
  4. data/{lib/eac → app/helpers/eac_rails_utils}/common_form_helper/form_builder/association_select_field.rb +1 -1
  5. data/{lib/eac → app/helpers/eac_rails_utils}/common_form_helper/form_builder/common_text_fields.rb +1 -1
  6. data/{lib/eac → app/helpers/eac_rails_utils}/common_form_helper/form_builder/currency_field.rb +1 -1
  7. data/{lib/eac → app/helpers/eac_rails_utils}/common_form_helper/form_builder/date_field.rb +1 -1
  8. data/{lib/eac → app/helpers/eac_rails_utils}/common_form_helper/form_builder/fields_for.rb +1 -1
  9. data/{lib/eac → app/helpers/eac_rails_utils}/common_form_helper/form_builder/file_field.rb +1 -1
  10. data/{lib/eac → app/helpers/eac_rails_utils}/common_form_helper/form_builder/radio_select_field.rb +1 -1
  11. data/{lib/eac → app/helpers/eac_rails_utils}/common_form_helper/form_builder/searchable_association_field.rb +1 -1
  12. data/{lib/eac → app/helpers/eac_rails_utils}/common_form_helper/form_builder/select_field.rb +1 -1
  13. data/{lib/eac → app/helpers/eac_rails_utils}/common_form_helper/form_builder/time_field.rb +1 -1
  14. data/{lib/eac → app/helpers/eac_rails_utils}/common_form_helper/form_builder/year_month_field.rb +1 -1
  15. data/app/helpers/eac_rails_utils/data_table_helper.rb +13 -0
  16. data/{lib/eac → app/helpers/eac_rails_utils}/data_table_helper/column.rb +1 -1
  17. data/{lib/eac → app/helpers/eac_rails_utils}/data_table_helper/data_table.rb +2 -2
  18. data/{lib/eac → app/helpers/eac_rails_utils}/data_table_helper/setup.rb +2 -2
  19. data/{lib/eac → app/helpers/eac_rails_utils}/menus_helper.rb +5 -1
  20. data/{lib/eac → app/helpers/eac_rails_utils}/menus_helper/bootstrap_gui_builder.rb +1 -1
  21. data/{lib/eac → app/helpers/eac_rails_utils}/menus_helper/data_builder.rb +1 -1
  22. data/{lib/eac → app/helpers/eac_rails_utils}/menus_helper/gui_builder.rb +1 -1
  23. data/{lib/eac → app/validators/eac_rails_utils}/cpf_validator.rb +1 -1
  24. data/{lib/eac → app/validators/eac_rails_utils}/no_presence_validator.rb +1 -1
  25. data/lib/eac_rails_utils.rb +2 -39
  26. data/lib/eac_rails_utils/engine.rb +2 -0
  27. data/lib/{eac → eac_rails_utils}/htmlbeautifier.rb +1 -1
  28. data/lib/eac_rails_utils/models.rb +9 -0
  29. data/lib/eac_rails_utils/models/attribute_required.rb +43 -0
  30. data/lib/eac_rails_utils/models/fetch_errors.rb +92 -0
  31. data/lib/eac_rails_utils/models/inequality_queries.rb +39 -0
  32. data/lib/eac_rails_utils/models/tableless.rb +97 -0
  33. data/lib/eac_rails_utils/models/test_utils.rb +65 -0
  34. data/lib/eac_rails_utils/patches.rb +9 -0
  35. data/lib/eac_rails_utils/patches/action_controller_base.rb +2 -0
  36. data/lib/eac_rails_utils/version.rb +1 -1
  37. data/test/dummy/app/models/user.rb +4 -0
  38. data/test/{lib/eac → helpers/eac_rails_utils}/common_form_helper_test.rb +2 -2
  39. data/test/{lib/eac → helpers/eac_rails_utils}/data_table_test_helper_test.rb +2 -2
  40. data/test/{app/helpers → helpers}/eac_rails_utils/formatter_helper_test.rb +0 -0
  41. data/test/lib/eac_rails_utils/{patches/model_attribute_required_test.rb → models/attribute_required_test.rb} +1 -0
  42. data/test/lib/eac_rails_utils/models/fetch_errors_test.rb +80 -0
  43. data/test/lib/eac_rails_utils/models/tableless_test.rb +25 -0
  44. data/test/{lib/eac → validators}/cpf_validator_test.rb +2 -2
  45. metadata +63 -64
  46. data/lib/eac/data_table_helper.rb +0 -13
  47. data/lib/eac/inequality_queries.rb +0 -37
  48. data/lib/eac/model.rb +0 -90
  49. data/lib/eac/test_utils.rb +0 -61
  50. data/lib/eac_rails_utils/patches/model_attribute_required.rb +0 -34
  51. data/lib/eac_rails_utils/patches/ofx_parser.rb +0 -43
  52. data/lib/eac_rails_utils/tableless_model.rb +0 -92
  53. data/test/lib/eac/model_test.rb +0 -78
  54. data/test/lib/eac/source_target_fixtures_test_files/a.source.html +0 -1
  55. data/test/lib/eac/source_target_fixtures_test_files/a.target.yaml +0 -1
  56. data/test/lib/eac/source_target_fixtures_test_files/b.source.html +0 -1
  57. data/test/lib/eac/source_target_fixtures_test_files/c.target.yaml +0 -1
  58. data/test/lib/eac_rails_utils/tableless_model_test.rb +0 -23
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_dependency 'eac/data_table_helper/column'
4
- require_dependency 'eac/data_table_helper/setup'
5
- require_dependency 'eac/data_table_helper/data_table'
6
-
7
- module Eac
8
- module DataTableHelper
9
- def data_table(dataset, &block)
10
- ::Eac::DataTableHelper::DataTable.new(self, dataset, &block).output
11
- end
12
- end
13
- end
@@ -1,37 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Eac
4
- # == Example:
5
- #
6
- # Note: model Product has a attribute "foo" Date, Time or Number:
7
- #
8
- # class Product
9
- # include ::Eac::InequalityQueries
10
- #
11
- # add_inequality_queries(:foo)
12
- # end
13
- #
14
- # This add the following scopes:
15
- #
16
- # Product.by_foo_gt(value) # Equivalent to Product.where("foo > ?", value)
17
- # Product.by_foo_gteq(value) # Equivalent to Product.where("foo >= ?", value)
18
- # Product.by_foo_lt(value) # Equivalent to Product.where("foo < ?", value)
19
- # Product.by_foo_lteq(value) # Equivalent to Product.where("foo <= ?", value)
20
- module InequalityQueries
21
- class << self
22
- def included(base)
23
- base.extend(ClassMethods)
24
- end
25
- end
26
-
27
- module ClassMethods
28
- def add_inequality_queries(attribute)
29
- %w[gt gteq lt lteq].each do |ineq|
30
- scope "by_#{attribute}_#{ineq}", lambda { |v|
31
- where(arel_table[attribute].send(ineq, v))
32
- }
33
- end
34
- end
35
- end
36
- end
37
- end
@@ -1,90 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Eac
4
- module Model
5
- # Adiciona as mensagens de erro de record. As mensagens de uma coluna X em record
6
- # serão adicionadas na coluna X em self. Se options[:default_column] for especificado
7
- # as mensagens da coluna X de record em que X não existe em self serão adicionadas
8
- # na coluna options[:default_column].
9
- # Um array de colunas pode ser passado em options[:skip] de colunas em record que não
10
- # terão suas falhas adicionadas.
11
- def fetch_record_errors(record, options = {})
12
- record.errors.keys.each do |column|
13
- fetch_column_errors(record, column, column, options)
14
- end
15
- end
16
-
17
- # Similar a fetch_record_errors, mas torna possível especificar, através de mapping,
18
- # colunas-alvo em self com nomes diferentes das colunas-fonte em record.
19
- # mapping tem o formato { record_column => self_column }.
20
- def fetch_record_errors_by_mapping(record, mapping, options = {})
21
- mapping.each do |record_column, self_column|
22
- fetch_column_errors(record, record_column, self_column, options)
23
- end
24
- end
25
-
26
- def fetch_column_errors(record, record_column, self_column, options = {})
27
- return if options[:skip]&.include?(record_column)
28
-
29
- record.errors[record_column].each do |message|
30
- fetch_error_column_message(self_column, message, options[:default_column],
31
- "#{record.class.human_attribute_name(record_column)}: ")
32
- end
33
- end
34
-
35
- # Verifica se uma coluna existe.
36
- def column?(column)
37
- respond_to?(column) && respond_to?("#{column}=")
38
- end
39
-
40
- def save_or_raise
41
- raise "Falha ao tentar salvar #{self.class.name}: #{errors_to_string}" unless save
42
-
43
- self
44
- end
45
-
46
- private
47
-
48
- def fetch_error_column_message(column, message, default_column, default_column_message_prefix)
49
- build_self_columns_messages(column, message, default_column,
50
- default_column_message_prefix).each do |k, v|
51
- if column?(k)
52
- add_error_message(k, v)
53
- break
54
- end
55
- end
56
- end
57
-
58
- # Adiciona uma mensagem de erro a uma coluna somente se a coluna
59
- # ainda não a possui
60
- def add_error_message(column, message)
61
- return if errors[column].include?(message)
62
-
63
- errors.add(column, message)
64
- end
65
-
66
- # Produz uma lista de campos-mensagens, em ordem de preferência,
67
- # que podem receber uma mensagem de falha.
68
- def build_self_columns_messages(column, message, default_column,
69
- default_column_message_prefix)
70
- r = { column => message }
71
- m = /^(.+)_id$/.match(column)
72
- if m
73
- r[m[1]] = message
74
- else
75
- r["#{column}_id"] = message
76
- end
77
- r[default_column] = "#{default_column_message_prefix}#{message}" if default_column
78
- r
79
- end
80
-
81
- def errors_to_string
82
- b = ''
83
- errors.messages.each do |field, messages|
84
- b += ' / ' if b != ''
85
- b += field.to_s + ': ' + messages.to_s
86
- end
87
- b
88
- end
89
- end
90
- end
@@ -1,61 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Eac
4
- module TestUtils
5
- # Add more helper methods to be used by all tests here...
6
- def valid_invalid_column_values_test(record, column, valid_values, invalid_values)
7
- valid_values.each do |v|
8
- record.send("#{column}=", v)
9
- assert record.valid?, "#{record.errors.messages}, #{column} = #{v.inspect} should be valid"
10
- end
11
- invalid_values.each do |v|
12
- record.send("#{column}=", v)
13
- assert_not record.valid?, "#{column} = #{v.inspect} should be invalid"
14
- end
15
- end
16
-
17
- # Verifica falhas em campos específicos de um record
18
- def assert_record_errors(record, fields_without_error, fields_with_error)
19
- fields_without_error.each do |c|
20
- assert record.errors[c].empty?, "Column: #{c} should not have errors (#{record.errors[c]})"
21
- end
22
- fields_with_error. each do |c|
23
- assert_not record.errors[c].empty?, "Column: #{c} should have errors"
24
- end
25
- end
26
-
27
- # Verifica, campo por campo, se invalida o registro.
28
- def assert_column_changes(ppp, expected_valid_result, changes)
29
- changes.each do |k, v|
30
- ppp.send("#{k}=", v)
31
- assert_equal expected_valid_result, ppp.valid?,
32
- "\"#{k}\" change should be " + (expected_valid_result ? 'valid' : 'invalid')
33
- assert_not ppp.errors[k].empty? unless expected_valid_result
34
- ppp.restore_attributes
35
- end
36
- end
37
-
38
- # Ex.: attrs = {a: 1, b: 2} resulta em
39
- # [{a: nil, b: nil}, {a: 1, b: nil}, {a: nil, b: 2}, {a: 1, b: 2}].
40
- def all_combinations(attrs)
41
- combs = [{}]
42
- attrs.each do |attr_name, value|
43
- combs = all_combinations_new_combination(attr_name, value, combs)
44
- end
45
- combs
46
- end
47
-
48
- def all_combinations_new_combination(attr_name, value, combs)
49
- new_comb = []
50
- assert_not value.nil?, "#{attr_name}=#{value}"
51
- [nil, value].each do |vv|
52
- combs.each do |c|
53
- cc = c.dup
54
- cc[attr_name] = vv
55
- new_comb << cc
56
- end
57
- end
58
- new_comb
59
- end
60
- end
61
- end
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'active_record'
4
-
5
- module EacRailsUtils
6
- module Patches
7
- module ModelAttributeRequired
8
- def self.included(base)
9
- base.extend ClassMethods
10
- base.include InstanceMethods
11
- end
12
-
13
- module ClassMethods
14
- def column_required?(column)
15
- m = new
16
- m.validate
17
- m.errors.key?(column.to_sym)
18
- end
19
- end
20
-
21
- module InstanceMethods
22
- def attribute_required?(column)
23
- self.class.column_required?(column)
24
- end
25
- end
26
- end
27
- end
28
- end
29
-
30
- [::ActiveRecord::Base, ::ActiveModel::Model].each do |c|
31
- next if c.included_modules.include? ::EacRailsUtils::Patches::ModelAttributeRequired
32
-
33
- c.include ::EacRailsUtils::Patches::ModelAttributeRequired
34
- end
@@ -1,43 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'ofx-parser'
4
-
5
- module EacRailsUtils
6
- module Patches
7
- module OfxParser
8
- module OfxParser
9
- def self.included(base)
10
- base.class_eval do
11
- class << self
12
- prepend ClassMethods
13
- end
14
- end
15
- end
16
-
17
- module ClassMethods
18
- def build_transaction(transaction)
19
- r = super
20
- r.currate = (transaction / 'CURRENCY/CURRATE').inner_text
21
- r
22
- end
23
- end
24
- end
25
-
26
- module Transaction
27
- attr_accessor :currate, :cursym
28
- end
29
- end
30
- end
31
- end
32
-
33
- unless ::OfxParser::OfxParser.included_modules.include?(
34
- ::EacRailsUtils::Patches::OfxParser::OfxParser
35
- )
36
- ::OfxParser::OfxParser.include ::EacRailsUtils::Patches::OfxParser::OfxParser
37
- end
38
-
39
- unless ::OfxParser::Transaction.included_modules.include?(
40
- ::EacRailsUtils::Patches::OfxParser::Transaction
41
- )
42
- ::OfxParser::Transaction.include ::EacRailsUtils::Patches::OfxParser::Transaction
43
- end
@@ -1,92 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module EacRailsUtils
4
- class TablelessModel
5
- include ActiveModel::Model
6
- include Virtus.model
7
- include ActiveModel::Associations
8
-
9
- def initialize(values = {})
10
- super(build_attributes(values))
11
- end
12
-
13
- def attributes=(values)
14
- super(build_attributes(values))
15
- end
16
-
17
- # need hash like accessor, used internal Rails
18
- def [](attr)
19
- send(attr)
20
- end
21
-
22
- # need hash like accessor, used internal Rails
23
- def []=(attr, value)
24
- send("#{attr}=", value)
25
- end
26
-
27
- def save!
28
- save || raise("#{self.class}.save failed: #{errors.messages}")
29
- end
30
-
31
- private
32
-
33
- def build_attributes(values)
34
- AttributesBuilder.new(self.class, values).to_attributes
35
- end
36
-
37
- class AttributesBuilder
38
- DATE_TIME_FIELDS = %i[year month day hour min sec].freeze
39
-
40
- def initialize(model_class, values)
41
- @model_class = model_class
42
- @values = {}
43
- values.each { |k, v| add(k, v) }
44
- end
45
-
46
- def to_attributes
47
- @values
48
- end
49
-
50
- private
51
-
52
- def add(key, value)
53
- array_attr = parse_array_attr_key(key)
54
- if array_attr
55
- array_value_set(array_attr, value)
56
- else
57
- @values[key] = value
58
- end
59
- end
60
-
61
- def parse_array_attr_key(key)
62
- m = /\A(.+)\(([0-9]+)(.)\)\z/.match(key)
63
- return unless m
64
-
65
- ::OpenStruct.new(key: m[1], index: m[2].to_i - 1, converter: array_value_converter(m[3]))
66
- end
67
-
68
- def array_value_set(array_attr, value)
69
- @values[array_attr.key] ||= {}
70
- @values[array_attr.key].merge!(
71
- DATE_TIME_FIELDS[array_attr.index] => value.send(array_attr.converter)
72
- )
73
- end
74
-
75
- def array_value_converter(str_type)
76
- case str_type
77
- when 'i'
78
- 'to_i'
79
- else
80
- raise "Unknown array type: \"#{str_type}\""
81
- end
82
- end
83
-
84
- def date_time_attribute?(key)
85
- attr = @model_class.attributes[key]
86
- return false unless attr
87
-
88
- raise attr.to_s
89
- end
90
- end
91
- end
92
- end
@@ -1,78 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
-
5
- module Eac
6
- class ModelTest < ActiveSupport::TestCase
7
- class M1
8
- include ActiveModel::Model
9
- include Eac::Model
10
- attr_accessor :name, :age, :account, :country_id, :other
11
- end
12
-
13
- class M2
14
- include ActiveModel::Model
15
- attr_accessor :name, :myage, :account_id, :country
16
-
17
- validate :my_validate
18
-
19
- def my_validate
20
- errors.add(:name, 'NAME_ERROR')
21
- errors.add(:myage, 'MYAGE_ERROR')
22
- errors.add(:account_id, 'ACCOUNT_ID_ERROR')
23
- errors.add(:country, 'COUNTRY_ERROR')
24
- end
25
- end
26
-
27
- def setup
28
- reset_m1
29
- reset_m2
30
- end
31
-
32
- def test_fetch_column_errors
33
- @m1.fetch_column_errors(@m2, :myage, :age)
34
- assert_equal @m2.errors[:myage], @m1.errors[:age]
35
- end
36
-
37
- def test_fetch_record_errors
38
- @m1.fetch_record_errors(@m2)
39
- { name: :name, account_id: :account, country: :country_id }.each do |c2, c1|
40
- assert_equal @m2.errors[c2], @m1.errors[c1], "c2: #{c2}, c1: #{c1}"
41
- end
42
- assert @m1.errors[:age].empty?
43
- end
44
-
45
- def test_fetch_record_errors_with_default_column
46
- @m1.fetch_record_errors(@m2, default_column: :other)
47
- assert_equal @m2.errors[:name], @m1.errors[:name]
48
- assert @m1.errors[:age].empty?
49
- assert_equal ['Myage: MYAGE_ERROR'], @m1.errors[:other]
50
- end
51
-
52
- def test_fetch_record_errors_with_skip_option
53
- @m1.fetch_record_errors(@m2, skip: [:name])
54
- assert @m1.errors[:name].empty?
55
- assert @m1.errors[:age].empty?
56
- end
57
-
58
- def test_fetch_record_errors_by_mapping
59
- @m1.fetch_record_errors_by_mapping(@m2, name: :name, myage: :age)
60
- assert_equal @m2.errors[:name], @m1.errors[:name]
61
- assert_equal @m2.errors[:myage], @m1.errors[:age]
62
- end
63
-
64
- private
65
-
66
- def reset_m1
67
- @m1 = M1.new
68
- assert @m1.errors.empty?
69
- end
70
-
71
- def reset_m2
72
- @m2 = M2.new
73
- assert_not @m2.valid?
74
- assert_not @m2.errors[:name].empty?
75
- assert_not @m2.errors[:myage].empty?
76
- end
77
- end
78
- end