eac_rails_utils 0.0.1 → 0.1.10
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 +4 -4
- data/lib/assets/javascripts/input_searchable.js +1 -1
- data/lib/eac/common_form_helper/form_builder.rb +2 -0
- data/lib/eac/common_form_helper/form_builder/common_text_fields.rb +4 -1
- data/lib/eac/common_form_helper/form_builder/year_month_field.rb +30 -0
- data/lib/eac/inequality_queries.rb +36 -0
- data/lib/eac/listable.rb +223 -0
- data/lib/eac/no_presence_validator.rb +12 -0
- data/lib/eac/parsers/base.rb +64 -0
- data/lib/eac/parsers/files_test.rb +34 -0
- data/lib/eac/parsers/ofx.rb +30 -0
- data/lib/eac/source_target_fixtures.rb +1 -1
- data/lib/eac/tableless_model.rb +22 -0
- data/lib/eac_rails_utils.rb +13 -0
- data/lib/eac_rails_utils/patches/ofx_parser.rb +42 -0
- data/lib/eac_rails_utils/version.rb +2 -1
- data/test/dummy/config/locales/pt-BR.yml +38 -0
- data/test/lib/eac/listable_test.rb +138 -0
- metadata +75 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 19ccc8fc5f3f8b878422a8327af8faaa61e98075
|
4
|
+
data.tar.gz: f8081169339acbf890d7a9c981ed561cfacb5474
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b43a7c8a372dd670a2ad9ff13c66905859d3f2f367845f65faf52d76a548512c6589946572bc7f1ab3ea86880f4ccb4cc95d5d447f3981e7255c334212ca51eb
|
7
|
+
data.tar.gz: a28be360f63ca74287b1756263c05f638e76903d636e136547ca55997675a8ae6ca25b1e2cf921107a77ea280f05508e72bb3615637e433c81251440bc4b3c76
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module Eac
|
2
3
|
module CommonFormHelper
|
3
4
|
class FormBuilder
|
@@ -7,6 +8,7 @@ module Eac
|
|
7
8
|
include DateField
|
8
9
|
include RadioSelectField
|
9
10
|
include FieldsFor
|
11
|
+
include YearMonthField
|
10
12
|
|
11
13
|
attr_reader :form, :helper, :field_errors_showed
|
12
14
|
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module Eac
|
2
3
|
module CommonFormHelper
|
3
4
|
class FormBuilder
|
@@ -6,8 +7,10 @@ module Eac
|
|
6
7
|
class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
|
7
8
|
def #{t}_field(field_name, options = {}) # def text_field(field_name, options = {})
|
8
9
|
field(field_name, options) do # field(field_name, options) do
|
10
|
+
input_options = options[:input_options] || {}
|
11
|
+
input_options[:class] ||= 'form-control'
|
9
12
|
@form.#{t}_field(field_name, # @form.text_field(field_name,
|
10
|
-
|
13
|
+
input_options) # class: 'form-control')
|
11
14
|
end # end
|
12
15
|
end # end
|
13
16
|
RUBY_EVAL
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Eac
|
3
|
+
module CommonFormHelper
|
4
|
+
class FormBuilder
|
5
|
+
module YearMonthField
|
6
|
+
def year_month_field(field_name, options = {})
|
7
|
+
field(field_name, options) do
|
8
|
+
month_field(field_name) << ' / ' << year_field(field_name,
|
9
|
+
options[:years] || default_years)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def year_field(field_name, years)
|
16
|
+
form.select("#{field_name}_year", years.map { |y| [y, y] })
|
17
|
+
end
|
18
|
+
|
19
|
+
def month_field(field_name)
|
20
|
+
form.select("#{field_name}_month", (1..12).map { |y| [y.to_s.rjust(2, '0'), y] })
|
21
|
+
end
|
22
|
+
|
23
|
+
def default_years
|
24
|
+
current_year = Time.zone.now.year
|
25
|
+
((current_year - 5)..current_year)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Eac
|
3
|
+
# == Example:
|
4
|
+
#
|
5
|
+
# Note: model Product has a attribute "foo" Date, Time or Number:
|
6
|
+
#
|
7
|
+
# class Product
|
8
|
+
# include ::Eac::InequalityQueries
|
9
|
+
#
|
10
|
+
# add_inequality_queries(:foo)
|
11
|
+
# end
|
12
|
+
#
|
13
|
+
# This add the following scopes:
|
14
|
+
#
|
15
|
+
# Product.by_foo_gt(value) # Equivalent to Product.where("foo > ?", value)
|
16
|
+
# Product.by_foo_gteq(value) # Equivalent to Product.where("foo >= ?", value)
|
17
|
+
# Product.by_foo_lt(value) # Equivalent to Product.where("foo < ?", value)
|
18
|
+
# Product.by_foo_lteq(value) # Equivalent to Product.where("foo <= ?", value)
|
19
|
+
module InequalityQueries
|
20
|
+
class << self
|
21
|
+
def included(base)
|
22
|
+
base.extend(ClassMethods)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
module ClassMethods
|
27
|
+
def add_inequality_queries(attribute)
|
28
|
+
%w(gt gteq lt lteq).each do |ineq|
|
29
|
+
scope "by_#{attribute}_#{ineq}", lambda { |v|
|
30
|
+
where(arel_table[attribute].send(ineq, v))
|
31
|
+
}
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/eac/listable.rb
ADDED
@@ -0,0 +1,223 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Eac
|
3
|
+
module Listable
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
extend(::Eac::Listable::ClassMethods)
|
8
|
+
include(::Eac::Listable::InstanceMethods)
|
9
|
+
end
|
10
|
+
|
11
|
+
module ClassMethods
|
12
|
+
def lists
|
13
|
+
@lists ||= ::Eac::Listable::Lists.new(self)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
module InstanceMethods
|
18
|
+
LISTABLE_INSTANCE_VALUE_METHODS = %w(label description).freeze
|
19
|
+
|
20
|
+
def method_missing(name, *args, &block)
|
21
|
+
list, method = parse_method(name)
|
22
|
+
list && method ? list.instance_value(self).send(method) : super
|
23
|
+
end
|
24
|
+
|
25
|
+
def respond_to?(name, include_all = false)
|
26
|
+
list, method = parse_method(name)
|
27
|
+
list && method ? true : super
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def parse_method(method)
|
33
|
+
self.class.lists.acts_as_listable_items.each do |item, list|
|
34
|
+
LISTABLE_INSTANCE_VALUE_METHODS.each do |m|
|
35
|
+
return [list, m] if method.to_s == "#{item}_#{m}"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
[nil, nil]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
class Lists
|
43
|
+
attr_reader :source
|
44
|
+
|
45
|
+
def initialize(source)
|
46
|
+
@source = source
|
47
|
+
end
|
48
|
+
|
49
|
+
def add_integer(item, *labels)
|
50
|
+
check_acts_as_listable_new_item(item)
|
51
|
+
acts_as_listable_items[item] = ::Eac::Listable::IntegerList.new(
|
52
|
+
self, item, labels
|
53
|
+
)
|
54
|
+
end
|
55
|
+
|
56
|
+
def add_string(item, *labels)
|
57
|
+
check_acts_as_listable_new_item(item)
|
58
|
+
acts_as_listable_items[item] = ::Eac::Listable::StringList.new(
|
59
|
+
self, item, labels
|
60
|
+
)
|
61
|
+
end
|
62
|
+
|
63
|
+
def method_missing(name, *args, &block)
|
64
|
+
list = find_list_by_method(name)
|
65
|
+
list ? list : super
|
66
|
+
end
|
67
|
+
|
68
|
+
def respond_to?(name, include_all = false)
|
69
|
+
find_list_by_method(name) || super
|
70
|
+
end
|
71
|
+
|
72
|
+
def acts_as_listable_items
|
73
|
+
@acts_as_listable_items ||= ActiveSupport::HashWithIndifferentAccess.new
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
def check_acts_as_listable_new_item(item)
|
79
|
+
return unless acts_as_listable_items.key?(item)
|
80
|
+
raise "Item já adicionado anteriormente: #{item} em #{self} " \
|
81
|
+
"(#{acts_as_listable_items.keys})"
|
82
|
+
end
|
83
|
+
|
84
|
+
def find_list_by_method(method)
|
85
|
+
acts_as_listable_items.each do |item, list|
|
86
|
+
return list if method.to_sym == item.to_sym
|
87
|
+
end
|
88
|
+
nil
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
class List
|
93
|
+
attr_reader :item
|
94
|
+
|
95
|
+
def initialize(lists, item, labels)
|
96
|
+
@lists = lists
|
97
|
+
@item = item
|
98
|
+
@values = build_values(labels)
|
99
|
+
apply_constants
|
100
|
+
end
|
101
|
+
|
102
|
+
def values
|
103
|
+
@values.values.map(&:value)
|
104
|
+
end
|
105
|
+
|
106
|
+
def options
|
107
|
+
@values.values.map { |v| [v.label, v.value] }
|
108
|
+
end
|
109
|
+
|
110
|
+
def method_missing(name, *args, &block)
|
111
|
+
list = find_list_by_method(name)
|
112
|
+
list ? list : super
|
113
|
+
end
|
114
|
+
|
115
|
+
def respond_to?(name, include_all = false)
|
116
|
+
find_list_by_method(name) || super
|
117
|
+
end
|
118
|
+
|
119
|
+
def i18n_key
|
120
|
+
"eac.listable.#{class_i18n_key}.#{item}"
|
121
|
+
end
|
122
|
+
|
123
|
+
def instance_value(instance)
|
124
|
+
v = instance.send(item)
|
125
|
+
return @values[v] if @values.key?(v)
|
126
|
+
raise "List value unkown: #{v} (Source: #{@lists.source}, Item: #{item})"
|
127
|
+
end
|
128
|
+
|
129
|
+
private
|
130
|
+
|
131
|
+
def class_i18n_key
|
132
|
+
@lists.source.name.underscore.to_sym
|
133
|
+
end
|
134
|
+
|
135
|
+
def find_list_by_method(method)
|
136
|
+
@values.values.each do |v|
|
137
|
+
return v if method.to_s == "value_#{v.key}"
|
138
|
+
end
|
139
|
+
nil
|
140
|
+
end
|
141
|
+
|
142
|
+
def constants
|
143
|
+
labels.each_with_index.map { |v, i| ["#{item.upcase}_#{v.upcase}", values[i]] }
|
144
|
+
end
|
145
|
+
|
146
|
+
def apply_constants
|
147
|
+
@values.values.each do |v|
|
148
|
+
@lists.source.const_set(v.constant_name, v.value)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
def build_values(labels)
|
153
|
+
vs = {}
|
154
|
+
parse_labels(labels).each do |value, key|
|
155
|
+
v = Value.new(self, value, key)
|
156
|
+
vs[v.value] = v
|
157
|
+
end
|
158
|
+
vs
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
class Value
|
163
|
+
attr_reader :value, :key
|
164
|
+
|
165
|
+
def initialize(list, value, key)
|
166
|
+
@list = list
|
167
|
+
@value = value
|
168
|
+
@key = key
|
169
|
+
end
|
170
|
+
|
171
|
+
def to_s
|
172
|
+
"I: #{@list.item}, V: #{@value}, K: #{@key}"
|
173
|
+
end
|
174
|
+
|
175
|
+
def constant_name
|
176
|
+
"#{@list.item}_#{@key}".gsub(/[^a-z0-9_]/, '_').gsub(/_+/, '_')
|
177
|
+
.gsub(/(?:\A_|_\z)/, '').upcase
|
178
|
+
end
|
179
|
+
|
180
|
+
def label
|
181
|
+
translate('label')
|
182
|
+
end
|
183
|
+
|
184
|
+
def description
|
185
|
+
translate('description')
|
186
|
+
end
|
187
|
+
|
188
|
+
private
|
189
|
+
|
190
|
+
def translate(translate_key)
|
191
|
+
::I18n.t("#{@list.i18n_key}.#{@key}.#{translate_key}")
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
class IntegerList < ::Eac::Listable::List
|
196
|
+
protected
|
197
|
+
|
198
|
+
def parse_labels(labels)
|
199
|
+
if labels.first.is_a?(Hash)
|
200
|
+
Hash[labels.first.map { |k, v| [k.to_i, v.to_s] }]
|
201
|
+
else
|
202
|
+
Hash[labels.each_with_index.map { |v, i| [i + 1, v.to_s] }]
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
def build_value(index, _key)
|
207
|
+
index + 1
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
class StringList < ::Eac::Listable::List
|
212
|
+
protected
|
213
|
+
|
214
|
+
def parse_labels(labels)
|
215
|
+
if labels.first.is_a?(Hash)
|
216
|
+
Hash[labels.first.map { |k, v| [k.to_s, v.to_s] }]
|
217
|
+
else
|
218
|
+
Hash[labels.map { |v| [v.to_s, v.to_s] }]
|
219
|
+
end
|
220
|
+
end
|
221
|
+
end
|
222
|
+
end
|
223
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
# frozen_string_literal: true
|
4
|
+
module Eac
|
5
|
+
# https://stackoverflow.com/questions/10070786/rails-3-validation-presence-false
|
6
|
+
class NoPresenceValidator < ActiveModel::EachValidator
|
7
|
+
def validate_each(record, attribute, _value)
|
8
|
+
return if record.send(attribute).blank?
|
9
|
+
record.errors[attribute] << (options[:message] || 'must be blank')
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# ecoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'open-uri'
|
5
|
+
require 'fileutils'
|
6
|
+
|
7
|
+
module Eac
|
8
|
+
module Parsers
|
9
|
+
class Base
|
10
|
+
def initialize(url)
|
11
|
+
@url = url
|
12
|
+
end
|
13
|
+
|
14
|
+
def url
|
15
|
+
@url.gsub(%r{/+$}, '')
|
16
|
+
end
|
17
|
+
|
18
|
+
def content
|
19
|
+
s = content_by_url_type
|
20
|
+
log_content(s)
|
21
|
+
s
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def content_by_url_type
|
27
|
+
if @url.is_a?(Hash)
|
28
|
+
content_hash
|
29
|
+
elsif /^http/ =~ @url
|
30
|
+
content_get
|
31
|
+
else
|
32
|
+
content_file
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def content_file
|
37
|
+
open(@url, &:read)
|
38
|
+
end
|
39
|
+
|
40
|
+
def content_get
|
41
|
+
HTTPClient.new.get_content(@url, follow_redirect: true)
|
42
|
+
end
|
43
|
+
|
44
|
+
def content_hash
|
45
|
+
return content_post if @url[:method] == :post
|
46
|
+
raise "Unknown URL format: #{@url}"
|
47
|
+
end
|
48
|
+
|
49
|
+
def content_post
|
50
|
+
HTTPClient.new.post_content(@url[:url], @url[:params].merge(follow_redirect: true))
|
51
|
+
end
|
52
|
+
|
53
|
+
def log_content(s)
|
54
|
+
File.open(log_file, 'wb') { |file| file.write(s) }
|
55
|
+
end
|
56
|
+
|
57
|
+
def log_file
|
58
|
+
f = Rails.root.join('log', 'parsers', "#{self.class.name.parameterize}.log")
|
59
|
+
FileUtils.mkdir_p(File.dirname(f))
|
60
|
+
f
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module Eac
|
5
|
+
module Parsers
|
6
|
+
module FilesTest
|
7
|
+
def test_data
|
8
|
+
source_target_fixtures.source_target_files do |source_file, target_file|
|
9
|
+
sd = parser_class.new(source_file).data
|
10
|
+
td = YAML.load_file(target_file)
|
11
|
+
assert_equal sort_results(td), sort_results(sd)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
protected
|
16
|
+
|
17
|
+
def sort_results(r)
|
18
|
+
r
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def source_target_fixtures
|
24
|
+
::Eac::SourceTargetFixtures.new(
|
25
|
+
File.expand_path("../#{self.class.name.demodulize.underscore}_files", test_file)
|
26
|
+
)
|
27
|
+
end
|
28
|
+
|
29
|
+
def parser_class
|
30
|
+
self.class.name.gsub(/Test\z/, '').constantize
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Eac
|
3
|
+
module Parsers
|
4
|
+
class Ofx < ::Eac::Parsers::Base
|
5
|
+
def ofx
|
6
|
+
@ofx ||= ofx_parse
|
7
|
+
end
|
8
|
+
|
9
|
+
def assert_ofx
|
10
|
+
fail "Not a OFX: #{url}" unless ofx.bank_account || ofx.credit_card ||
|
11
|
+
ofx.investment
|
12
|
+
end
|
13
|
+
|
14
|
+
def ofx?
|
15
|
+
ofx.present?
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def ofx_parse
|
21
|
+
s = content.force_encoding('iso-8859-1').encode('utf-8').gsub(/(?<!\r)\n/, "\r\n")
|
22
|
+
begin
|
23
|
+
::OfxParser::OfxParser.parse(s)
|
24
|
+
rescue NoMethodError, ArgumentError
|
25
|
+
nil
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Eac
|
3
|
+
class TablelessModel
|
4
|
+
include ActiveModel::Model
|
5
|
+
include Virtus.model
|
6
|
+
include ActiveModel::Associations
|
7
|
+
|
8
|
+
# need hash like accessor, used internal Rails
|
9
|
+
def [](attr)
|
10
|
+
send(attr)
|
11
|
+
end
|
12
|
+
|
13
|
+
# need hash like accessor, used internal Rails
|
14
|
+
def []=(attr, value)
|
15
|
+
send("#{attr}=", value)
|
16
|
+
end
|
17
|
+
|
18
|
+
def save!
|
19
|
+
save || raise("#{self.class}.save failed: #{errors.messages}")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/eac_rails_utils.rb
CHANGED
@@ -1,7 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module EacRailsUtils
|
3
|
+
require 'activemodel/associations'
|
2
4
|
require 'nested_form_fields'
|
5
|
+
require 'ofx-parser'
|
6
|
+
require 'virtus'
|
3
7
|
|
4
8
|
require 'eac_rails_utils/patches/model_attribute_required'
|
9
|
+
require 'eac_rails_utils/patches/ofx_parser'
|
5
10
|
require 'eac_rails_utils/rails/engine'
|
6
11
|
require 'eac/cpf_validator'
|
7
12
|
require 'eac/formatter_helper'
|
@@ -12,16 +17,24 @@ module EacRailsUtils
|
|
12
17
|
require 'eac/common_form_helper/form_builder/fields_for'
|
13
18
|
require 'eac/common_form_helper/form_builder/radio_select_field'
|
14
19
|
require 'eac/common_form_helper/form_builder/searchable_association_field'
|
20
|
+
require 'eac/common_form_helper/form_builder/year_month_field'
|
15
21
|
require 'eac/common_form_helper/form_builder'
|
16
22
|
require 'eac/common_form_helper'
|
17
23
|
require 'eac/htmlbeautifier'
|
24
|
+
require 'eac/inequality_queries'
|
25
|
+
require 'eac/listable'
|
18
26
|
require 'eac/menus_helper'
|
19
27
|
require 'eac/menus_helper/bootstrap_gui_builder'
|
20
28
|
require 'eac/menus_helper/data_builder'
|
21
29
|
require 'eac/menus_helper/gui_builder'
|
22
30
|
require 'eac/model'
|
31
|
+
require 'eac/no_presence_validator'
|
32
|
+
require 'eac/parsers/base'
|
33
|
+
require 'eac/parsers/files_test'
|
34
|
+
require 'eac/parsers/ofx'
|
23
35
|
require 'eac/simple_cache'
|
24
36
|
require 'eac/source_target_fixtures'
|
37
|
+
require 'eac/tableless_model'
|
25
38
|
|
26
39
|
ActionView::Base.send :include, Eac::CommonFormHelper
|
27
40
|
ActionView::Base.send :include, Eac::FormatterHelper
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'ofx-parser'
|
3
|
+
|
4
|
+
module EacRailsUtils
|
5
|
+
module Patches
|
6
|
+
module OfxParser
|
7
|
+
module OfxParser
|
8
|
+
def self.included(base)
|
9
|
+
base.class_eval do
|
10
|
+
class << self
|
11
|
+
prepend ClassMethods
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
module ClassMethods
|
17
|
+
def build_transaction(t)
|
18
|
+
r = super
|
19
|
+
r.currate = (t / 'CURRENCY/CURRATE').inner_text
|
20
|
+
r
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
module Transaction
|
26
|
+
attr_accessor :currate, :cursym
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
unless ::OfxParser::OfxParser.included_modules.include?(
|
33
|
+
::EacRailsUtils::Patches::OfxParser::OfxParser
|
34
|
+
)
|
35
|
+
::OfxParser::OfxParser.send(:include, ::EacRailsUtils::Patches::OfxParser::OfxParser)
|
36
|
+
end
|
37
|
+
|
38
|
+
unless ::OfxParser::Transaction.included_modules.include?(
|
39
|
+
::EacRailsUtils::Patches::OfxParser::Transaction
|
40
|
+
)
|
41
|
+
::OfxParser::Transaction.send(:include, ::EacRailsUtils::Patches::OfxParser::Transaction)
|
42
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
pt-BR:
|
2
|
+
eac:
|
3
|
+
listable:
|
4
|
+
eac/listable_test/stub:
|
5
|
+
inteiro:
|
6
|
+
a:
|
7
|
+
label: Inteiro A
|
8
|
+
description: Inteiro A Descr.
|
9
|
+
b:
|
10
|
+
label: Inteiro BB
|
11
|
+
description: Inteiro BB Descr.
|
12
|
+
c:
|
13
|
+
label: Inteiro CCC
|
14
|
+
description: Inteiro CCC Descr.
|
15
|
+
cadeia:
|
16
|
+
a:
|
17
|
+
label: Cadeia AAA
|
18
|
+
description: Cadeia AAA Descr.
|
19
|
+
b:
|
20
|
+
label: Cadeia BB
|
21
|
+
description: Cadeia BB Descr.
|
22
|
+
c:
|
23
|
+
label: Cadeia C
|
24
|
+
description: Cadeia C Descr.
|
25
|
+
code:
|
26
|
+
a:
|
27
|
+
label: Código A
|
28
|
+
description: Código A Descr.
|
29
|
+
b:
|
30
|
+
label: Código B
|
31
|
+
description: Código B Descr.
|
32
|
+
type:
|
33
|
+
a:
|
34
|
+
label: Tipo A
|
35
|
+
description: Tipo A Descr.
|
36
|
+
b:
|
37
|
+
label: Tipo B
|
38
|
+
description: Tipo B Descr.
|
@@ -0,0 +1,138 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
module Eac
|
6
|
+
class ListableTest < ActiveSupport::TestCase
|
7
|
+
class Stub
|
8
|
+
include ::Eac::Listable
|
9
|
+
|
10
|
+
attr_accessor :inteiro, :code, :cadeia, :type
|
11
|
+
|
12
|
+
lists.add_integer :inteiro, :a, :b, :c
|
13
|
+
lists.add_integer :code, 7 => :a, 13 => :b
|
14
|
+
lists.add_string :cadeia, :a, :b, :c
|
15
|
+
lists.add_string :type, 'Namespace::ClazzA' => :a, 'Namespace::ClazzB' => :b
|
16
|
+
end
|
17
|
+
|
18
|
+
setup do
|
19
|
+
I18n.locale = 'pt-BR'
|
20
|
+
end
|
21
|
+
|
22
|
+
test 'attribute values' do
|
23
|
+
assert_equal [1, 2, 3], Stub.lists.inteiro.values
|
24
|
+
assert_equal [7, 13], Stub.lists.code.values
|
25
|
+
assert_equal %w(a b c), Stub.lists.cadeia.values
|
26
|
+
assert_equal %w(Namespace::ClazzA Namespace::ClazzB), Stub.lists.type.values
|
27
|
+
end
|
28
|
+
|
29
|
+
test 'value instance options' do
|
30
|
+
assert_equal [['Inteiro A', 1], ['Inteiro BB', 2], ['Inteiro CCC', 3]],
|
31
|
+
Stub.lists.inteiro.options
|
32
|
+
assert_equal [['Código A', 7], ['Código B', 13]], Stub.lists.code.options
|
33
|
+
assert_equal [['Cadeia AAA', 'a'], ['Cadeia BB', 'b'], ['Cadeia C', 'c']],
|
34
|
+
Stub.lists.cadeia.options
|
35
|
+
assert_equal [['Tipo A', 'Namespace::ClazzA'], ['Tipo B', 'Namespace::ClazzB']], Stub.lists.type.options
|
36
|
+
end
|
37
|
+
|
38
|
+
test 'constants' do
|
39
|
+
assert_equal 1, Stub::INTEIRO_A
|
40
|
+
assert_equal 2, Stub::INTEIRO_B
|
41
|
+
assert_equal 3, Stub::INTEIRO_C
|
42
|
+
assert_equal 7, Stub::CODE_A
|
43
|
+
assert_equal 13, Stub::CODE_B
|
44
|
+
assert_equal 'a', Stub::CADEIA_A
|
45
|
+
assert_equal 'b', Stub::CADEIA_B
|
46
|
+
assert_equal 'c', Stub::CADEIA_C
|
47
|
+
assert_equal 'Namespace::ClazzA', Stub::TYPE_A
|
48
|
+
assert_equal 'Namespace::ClazzB', Stub::TYPE_B
|
49
|
+
end
|
50
|
+
|
51
|
+
test 'values instances' do
|
52
|
+
assert Stub.lists.is_a?(::Eac::Listable::Lists)
|
53
|
+
assert Stub.lists.inteiro.value_a.is_a?(::Eac::Listable::Value)
|
54
|
+
assert Stub.lists.inteiro.value_b.is_a?(::Eac::Listable::Value)
|
55
|
+
assert Stub.lists.inteiro.value_c.is_a?(::Eac::Listable::Value)
|
56
|
+
assert Stub.lists.code.value_a.is_a?(::Eac::Listable::Value)
|
57
|
+
assert Stub.lists.code.value_b.is_a?(::Eac::Listable::Value)
|
58
|
+
assert Stub.lists.cadeia.value_a.is_a?(::Eac::Listable::Value)
|
59
|
+
assert Stub.lists.cadeia.value_b.is_a?(::Eac::Listable::Value)
|
60
|
+
assert Stub.lists.cadeia.value_c.is_a?(::Eac::Listable::Value)
|
61
|
+
assert Stub.lists.type.value_a.is_a?(::Eac::Listable::Value)
|
62
|
+
assert Stub.lists.type.value_b.is_a?(::Eac::Listable::Value)
|
63
|
+
end
|
64
|
+
|
65
|
+
test 'value instance label' do
|
66
|
+
assert_equal 'Inteiro A', Stub.lists.inteiro.value_a.label
|
67
|
+
assert_equal 'Inteiro BB', Stub.lists.inteiro.value_b.label
|
68
|
+
assert_equal 'Inteiro CCC', Stub.lists.inteiro.value_c.label
|
69
|
+
assert_equal 'Código A', Stub.lists.code.value_a.label
|
70
|
+
assert_equal 'Código B', Stub.lists.code.value_b.label
|
71
|
+
assert_equal 'Cadeia AAA', Stub.lists.cadeia.value_a.label
|
72
|
+
assert_equal 'Cadeia BB', Stub.lists.cadeia.value_b.label
|
73
|
+
assert_equal 'Cadeia C', Stub.lists.cadeia.value_c.label
|
74
|
+
assert_equal 'Tipo A', Stub.lists.type.value_a.label
|
75
|
+
assert_equal 'Tipo B', Stub.lists.type.value_b.label
|
76
|
+
end
|
77
|
+
|
78
|
+
test 'value instance description' do
|
79
|
+
assert_equal 'Inteiro A Descr.', Stub.lists.inteiro.value_a.description
|
80
|
+
assert_equal 'Inteiro BB Descr.', Stub.lists.inteiro.value_b.description
|
81
|
+
assert_equal 'Inteiro CCC Descr.', Stub.lists.inteiro.value_c.description
|
82
|
+
assert_equal 'Código A Descr.', Stub.lists.code.value_a.description
|
83
|
+
assert_equal 'Código B Descr.', Stub.lists.code.value_b.description
|
84
|
+
assert_equal 'Cadeia AAA Descr.', Stub.lists.cadeia.value_a.description
|
85
|
+
assert_equal 'Cadeia BB Descr.', Stub.lists.cadeia.value_b.description
|
86
|
+
assert_equal 'Cadeia C Descr.', Stub.lists.cadeia.value_c.description
|
87
|
+
assert_equal 'Tipo A Descr.', Stub.lists.type.value_a.description
|
88
|
+
assert_equal 'Tipo B Descr.', Stub.lists.type.value_b.description
|
89
|
+
end
|
90
|
+
|
91
|
+
test 'value instance constant name' do
|
92
|
+
assert_equal 'INTEIRO_A', Stub.lists.inteiro.value_a.constant_name
|
93
|
+
assert_equal 'INTEIRO_B', Stub.lists.inteiro.value_b.constant_name
|
94
|
+
assert_equal 'INTEIRO_C', Stub.lists.inteiro.value_c.constant_name
|
95
|
+
assert_equal 'CODE_B', Stub.lists.code.value_b.constant_name
|
96
|
+
assert_equal 'CODE_B', Stub.lists.code.value_b.constant_name
|
97
|
+
assert_equal 'CADEIA_A', Stub.lists.cadeia.value_a.constant_name
|
98
|
+
assert_equal 'CADEIA_B', Stub.lists.cadeia.value_b.constant_name
|
99
|
+
assert_equal 'CADEIA_C', Stub.lists.cadeia.value_c.constant_name
|
100
|
+
assert_equal 'TYPE_A', Stub.lists.type.value_a.constant_name
|
101
|
+
assert_equal 'TYPE_B', Stub.lists.type.value_b.constant_name
|
102
|
+
end
|
103
|
+
|
104
|
+
test 'instance label and descriptions' do
|
105
|
+
i = Stub.new
|
106
|
+
i.inteiro = Stub::INTEIRO_A
|
107
|
+
assert_equal 'Inteiro A', i.inteiro_label
|
108
|
+
assert_equal 'Inteiro A Descr.', i.inteiro_description
|
109
|
+
i.inteiro = Stub::INTEIRO_B
|
110
|
+
assert_equal 'Inteiro BB', i.inteiro_label
|
111
|
+
assert_equal 'Inteiro BB Descr.', i.inteiro_description
|
112
|
+
i.inteiro = Stub::INTEIRO_C
|
113
|
+
assert_equal 'Inteiro CCC', i.inteiro_label
|
114
|
+
assert_equal 'Inteiro CCC Descr.', i.inteiro_description
|
115
|
+
i.code = Stub::CODE_A
|
116
|
+
assert_equal 'Código A', i.code_label
|
117
|
+
assert_equal 'Código A Descr.', i.code_description
|
118
|
+
i.code = Stub::CODE_B
|
119
|
+
assert_equal 'Código B', i.code_label
|
120
|
+
assert_equal 'Código B Descr.', i.code_description
|
121
|
+
i.cadeia = Stub::CADEIA_A
|
122
|
+
assert_equal 'Cadeia AAA', i.cadeia_label
|
123
|
+
assert_equal 'Cadeia AAA Descr.', i.cadeia_description
|
124
|
+
i.cadeia = Stub::CADEIA_B
|
125
|
+
assert_equal 'Cadeia BB', i.cadeia_label
|
126
|
+
assert_equal 'Cadeia BB Descr.', i.cadeia_description
|
127
|
+
i.cadeia = Stub::CADEIA_C
|
128
|
+
assert_equal 'Cadeia C', i.cadeia_label
|
129
|
+
assert_equal 'Cadeia C Descr.', i.cadeia_description
|
130
|
+
i.type = Stub::TYPE_A
|
131
|
+
assert_equal 'Tipo A', i.type_label
|
132
|
+
assert_equal 'Tipo A Descr.', i.type_description
|
133
|
+
i.type = Stub::TYPE_B
|
134
|
+
assert_equal 'Tipo B', i.type_label
|
135
|
+
assert_equal 'Tipo B Descr.', i.type_description
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eac_rails_utils
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- E.A.C.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-12-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activemodel-associations
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.1.2
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.1.2
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: rails
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,6 +66,34 @@ dependencies:
|
|
52
66
|
- - ">="
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: 3.3.6
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: ofx-parser
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 1.1.0
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 1.1.0
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: virtus
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 1.0.5
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 1.0.5
|
55
97
|
- !ruby/object:Gem::Dependency
|
56
98
|
name: nested_form_fields
|
57
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -105,18 +147,27 @@ files:
|
|
105
147
|
- lib/eac/common_form_helper/form_builder/fields_for.rb
|
106
148
|
- lib/eac/common_form_helper/form_builder/radio_select_field.rb
|
107
149
|
- lib/eac/common_form_helper/form_builder/searchable_association_field.rb
|
150
|
+
- lib/eac/common_form_helper/form_builder/year_month_field.rb
|
108
151
|
- lib/eac/cpf_validator.rb
|
109
152
|
- lib/eac/formatter_helper.rb
|
110
153
|
- lib/eac/htmlbeautifier.rb
|
154
|
+
- lib/eac/inequality_queries.rb
|
155
|
+
- lib/eac/listable.rb
|
111
156
|
- lib/eac/menus_helper.rb
|
112
157
|
- lib/eac/menus_helper/bootstrap_gui_builder.rb
|
113
158
|
- lib/eac/menus_helper/data_builder.rb
|
114
159
|
- lib/eac/menus_helper/gui_builder.rb
|
115
160
|
- lib/eac/model.rb
|
161
|
+
- lib/eac/no_presence_validator.rb
|
162
|
+
- lib/eac/parsers/base.rb
|
163
|
+
- lib/eac/parsers/files_test.rb
|
164
|
+
- lib/eac/parsers/ofx.rb
|
116
165
|
- lib/eac/simple_cache.rb
|
117
166
|
- lib/eac/source_target_fixtures.rb
|
167
|
+
- lib/eac/tableless_model.rb
|
118
168
|
- lib/eac_rails_utils.rb
|
119
169
|
- lib/eac_rails_utils/patches/model_attribute_required.rb
|
170
|
+
- lib/eac_rails_utils/patches/ofx_parser.rb
|
120
171
|
- lib/eac_rails_utils/rails/engine.rb
|
121
172
|
- lib/eac_rails_utils/version.rb
|
122
173
|
- test/dummy/Rakefile
|
@@ -128,6 +179,7 @@ files:
|
|
128
179
|
- test/dummy/config/database.yml
|
129
180
|
- test/dummy/config/environment.rb
|
130
181
|
- test/dummy/config/environments/test.rb
|
182
|
+
- test/dummy/config/locales/pt-BR.yml
|
131
183
|
- test/dummy/config/routes.rb
|
132
184
|
- test/dummy/config/secrets.yml
|
133
185
|
- test/dummy/db/migrate/20160415125333_create_users.rb
|
@@ -137,6 +189,7 @@ files:
|
|
137
189
|
- test/lib/eac/common_form_helper_test.rb
|
138
190
|
- test/lib/eac/cpf_validator_test.rb
|
139
191
|
- test/lib/eac/formatter_helper_test.rb
|
192
|
+
- test/lib/eac/listable_test.rb
|
140
193
|
- test/lib/eac/model_test.rb
|
141
194
|
- test/lib/eac/simple_cache_test.rb
|
142
195
|
- test/lib/eac_rails_utils/patches/model_attribute_required_test.rb
|
@@ -160,30 +213,32 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
160
213
|
version: '0'
|
161
214
|
requirements: []
|
162
215
|
rubyforge_project:
|
163
|
-
rubygems_version: 2.
|
216
|
+
rubygems_version: 2.6.12
|
164
217
|
signing_key:
|
165
218
|
specification_version: 4
|
166
219
|
summary: Código reutilizável para as aplicações Rails da E.A.C..
|
167
220
|
test_files:
|
168
|
-
- test/lib/eac_rails_utils/patches/model_attribute_required_test.rb
|
169
|
-
- test/lib/eac/formatter_helper_test.rb
|
170
|
-
- test/lib/eac/common_form_helper_test.rb
|
171
|
-
- test/lib/eac/cpf_validator_test.rb
|
172
|
-
- test/lib/eac/model_test.rb
|
173
|
-
- test/lib/eac/simple_cache_test.rb
|
174
|
-
- test/dummy/config.ru
|
175
|
-
- test/dummy/db/migrate/20160415143229_add_job_to_users.rb
|
176
|
-
- test/dummy/db/migrate/20160415143123_create_jobs.rb
|
177
|
-
- test/dummy/db/migrate/20160415125333_create_users.rb
|
178
|
-
- test/dummy/db/schema.rb
|
179
|
-
- test/dummy/app/models/user.rb
|
180
|
-
- test/dummy/app/models/job.rb
|
181
221
|
- test/dummy/Rakefile
|
182
|
-
- test/dummy/config
|
183
|
-
- test/dummy/config/application.rb
|
222
|
+
- test/dummy/config.ru
|
184
223
|
- test/dummy/config/boot.rb
|
185
|
-
- test/dummy/config/secrets.yml
|
186
224
|
- test/dummy/config/database.yml
|
187
|
-
- test/dummy/config/
|
225
|
+
- test/dummy/config/secrets.yml
|
226
|
+
- test/dummy/config/locales/pt-BR.yml
|
227
|
+
- test/dummy/config/application.rb
|
228
|
+
- test/dummy/config/environments/test.rb
|
188
229
|
- test/dummy/config/environment.rb
|
230
|
+
- test/dummy/config/routes.rb
|
231
|
+
- test/dummy/db/schema.rb
|
232
|
+
- test/dummy/db/migrate/20160415143123_create_jobs.rb
|
233
|
+
- test/dummy/db/migrate/20160415143229_add_job_to_users.rb
|
234
|
+
- test/dummy/db/migrate/20160415125333_create_users.rb
|
235
|
+
- test/dummy/app/models/job.rb
|
236
|
+
- test/dummy/app/models/user.rb
|
189
237
|
- test/test_helper.rb
|
238
|
+
- test/lib/eac_rails_utils/patches/model_attribute_required_test.rb
|
239
|
+
- test/lib/eac/common_form_helper_test.rb
|
240
|
+
- test/lib/eac/cpf_validator_test.rb
|
241
|
+
- test/lib/eac/simple_cache_test.rb
|
242
|
+
- test/lib/eac/formatter_helper_test.rb
|
243
|
+
- test/lib/eac/listable_test.rb
|
244
|
+
- test/lib/eac/model_test.rb
|