eac_rails_utils 0.12.3 → 0.13.3

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: 5079ee2e8f4f12a6616ee157f4face6077b87f695af719fa268897e66ab66598
4
- data.tar.gz: 5a25a0ff7d3b44cdbb40bb738fed65f1b4c3e1cc15f72dba1962bd56db3e1e63
3
+ metadata.gz: 7156f5e6b807386aff176fcb1dbe8461f95de94e60292d19d04112e988e440d8
4
+ data.tar.gz: a5a4b862946e67c883889627de183ab18981fa940a87be7918bfe8216990e1dc
5
5
  SHA512:
6
- metadata.gz: a20e62ffdcd580bbba0de2b4cd3b26519c0e50d57c6d266b824930837114ee2d1e914c5c13cb47f6d28853df4372d1de88798da0b5510cb910700fee6152a728
7
- data.tar.gz: b9d71d8a26a100f8e189928d2c3e2c4363ab896d40b4783762a52aab6657acdfb50ffd6e56bea7d02c03361edd463eda6d20081b002854a3c712c7ceed6047d4
6
+ metadata.gz: aaa6c8a6736f484fc769f892a421b152f2f7eee58d04aca66202cc68ed50aa43823893d22a34627b6361667faa80973f1c7f0aa50bc57a891daf9f0181c3816b
7
+ data.tar.gz: aac2e1e91726bdee9526d222c9c0db0955a16071bb014ec5a65803c7bda4af684669c264d2ce486c669626a803e1f6da688b076b5b401e544faac653456bba8d
data/Rakefile CHANGED
@@ -7,14 +7,3 @@ rescue LoadError
7
7
  end
8
8
 
9
9
  Bundler::GemHelper.install_tasks
10
-
11
- require 'rake/testtask'
12
-
13
- Rake::TestTask.new(:test) do |t|
14
- t.libs << 'lib'
15
- t.libs << 'test'
16
- t.pattern = 'test/**/*_test.rb'
17
- t.verbose = false
18
- end
19
-
20
- task default: :test
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module EacRailsUtils
6
+ module EngineHelper
7
+ common_concern do
8
+ append_self_migrations
9
+ end
10
+
11
+ module ClassMethods
12
+ def append_self_migrations
13
+ initializer :append_migrations do |app|
14
+ config.paths['db/migrate'].expanded.each do |expanded_path|
15
+ app.config.paths['db/migrate'] << expanded_path
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EacRailsUtils
4
- VERSION = '0.12.3'
4
+ VERSION = '0.13.3'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eac_rails_utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.3
4
+ version: 0.13.3
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: 2021-06-28 00:00:00.000000000 Z
11
+ date: 2021-08-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel-associations
@@ -115,47 +115,19 @@ dependencies:
115
115
  - !ruby/object:Gem::Version
116
116
  version: '0'
117
117
  - !ruby/object:Gem::Dependency
118
- name: eac_ruby_gem_support
118
+ name: eac_rails_gem_support
119
119
  requirement: !ruby/object:Gem::Requirement
120
120
  requirements:
121
121
  - - "~>"
122
122
  - !ruby/object:Gem::Version
123
- version: '0.2'
124
- type: :development
125
- prerelease: false
126
- version_requirements: !ruby/object:Gem::Requirement
127
- requirements:
128
- - - "~>"
129
- - !ruby/object:Gem::Version
130
- version: '0.2'
131
- - !ruby/object:Gem::Dependency
132
- name: rspec-rails
133
- requirement: !ruby/object:Gem::Requirement
134
- requirements:
135
- - - ">="
136
- - !ruby/object:Gem::Version
137
- version: '0'
138
- type: :development
139
- prerelease: false
140
- version_requirements: !ruby/object:Gem::Requirement
141
- requirements:
142
- - - ">="
143
- - !ruby/object:Gem::Version
144
- version: '0'
145
- - !ruby/object:Gem::Dependency
146
- name: sqlite3
147
- requirement: !ruby/object:Gem::Requirement
148
- requirements:
149
- - - "~>"
150
- - !ruby/object:Gem::Version
151
- version: 1.3.13
123
+ version: '0.3'
152
124
  type: :development
153
125
  prerelease: false
154
126
  version_requirements: !ruby/object:Gem::Requirement
155
127
  requirements:
156
128
  - - "~>"
157
129
  - !ruby/object:Gem::Version
158
- version: 1.3.13
130
+ version: '0.3'
159
131
  description:
160
132
  email:
161
133
  executables: []
@@ -212,6 +184,7 @@ files:
212
184
  - lib/assets/stylesheets/jmenu.scss
213
185
  - lib/eac_rails_utils.rb
214
186
  - lib/eac_rails_utils/engine.rb
187
+ - lib/eac_rails_utils/engine_helper.rb
215
188
  - lib/eac_rails_utils/htmlbeautifier.rb
216
189
  - lib/eac_rails_utils/models.rb
217
190
  - lib/eac_rails_utils/models/fetch_errors.rb
@@ -223,29 +196,6 @@ files:
223
196
  - lib/eac_rails_utils/patches/action_controller_base.rb
224
197
  - lib/eac_rails_utils/patches/active_model_associations.rb
225
198
  - lib/eac_rails_utils/version.rb
226
- - test/dummy/Rakefile
227
- - test/dummy/app/assets/config/manifest.js
228
- - test/dummy/app/models/job.rb
229
- - test/dummy/app/models/user.rb
230
- - test/dummy/bin/rails
231
- - test/dummy/config.ru
232
- - test/dummy/config/application.rb
233
- - test/dummy/config/boot.rb
234
- - test/dummy/config/database.yml
235
- - test/dummy/config/environment.rb
236
- - test/dummy/config/environments/test.rb
237
- - test/dummy/config/locales/pt-BR.yml
238
- - test/dummy/config/routes.rb
239
- - test/dummy/config/secrets.yml
240
- - test/dummy/db/migrate/20160415125333_create_users.rb
241
- - test/dummy/db/migrate/20160415143123_create_jobs.rb
242
- - test/dummy/db/migrate/20160415143229_add_job_to_users.rb
243
- - test/dummy/db/schema.rb
244
- - test/helpers/eac_rails_utils/data_table_test_helper_test.rb
245
- - test/helpers/eac_rails_utils/formatter_helper_test.rb
246
- - test/lib/eac_rails_utils/models/fetch_errors_test.rb
247
- - test/test_helper.rb
248
- - test/validators/cpf_validator_test.rb
249
199
  homepage:
250
200
  licenses: []
251
201
  metadata: {}
@@ -264,31 +214,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
264
214
  - !ruby/object:Gem::Version
265
215
  version: '0'
266
216
  requirements: []
267
- rubygems_version: 3.0.9
217
+ rubygems_version: 3.1.6
268
218
  signing_key:
269
219
  specification_version: 4
270
220
  summary: Código reutilizável para as aplicações Rails da E.A.C..
271
- test_files:
272
- - test/dummy/Rakefile
273
- - test/dummy/config.ru
274
- - test/dummy/config/boot.rb
275
- - test/dummy/config/database.yml
276
- - test/dummy/config/secrets.yml
277
- - test/dummy/config/locales/pt-BR.yml
278
- - test/dummy/config/application.rb
279
- - test/dummy/config/environments/test.rb
280
- - test/dummy/config/environment.rb
281
- - test/dummy/config/routes.rb
282
- - test/dummy/db/schema.rb
283
- - test/dummy/db/migrate/20160415143123_create_jobs.rb
284
- - test/dummy/db/migrate/20160415143229_add_job_to_users.rb
285
- - test/dummy/db/migrate/20160415125333_create_users.rb
286
- - test/dummy/app/models/job.rb
287
- - test/dummy/app/models/user.rb
288
- - test/dummy/app/assets/config/manifest.js
289
- - test/dummy/bin/rails
290
- - test/test_helper.rb
291
- - test/validators/cpf_validator_test.rb
292
- - test/helpers/eac_rails_utils/data_table_test_helper_test.rb
293
- - test/helpers/eac_rails_utils/formatter_helper_test.rb
294
- - test/lib/eac_rails_utils/models/fetch_errors_test.rb
221
+ test_files: []
data/test/dummy/Rakefile DELETED
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Add your own tasks in files placed in lib/tasks ending in .rake,
4
- # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
5
-
6
- require File.expand_path('config/application', __dir__)
7
-
8
- Rails.application.load_tasks
@@ -1,3 +0,0 @@
1
- //= link_tree ../images
2
- //= link_directory ../javascripts .js
3
- //= link_directory ../stylesheets .css
@@ -1,6 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Job < ActiveRecord::Base
4
- has_many :users
5
- accepts_nested_attributes_for :users, reject_if: :all_blank, allow_destroy: true
6
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class User < ActiveRecord::Base
4
- belongs_to :job
5
-
6
- validates :job, presence: true
7
- validates :password, presence: true
8
- validates :email, format: { with: /\A[^@\s]+@[^@\s]+\z/ }
9
- end
data/test/dummy/bin/rails DELETED
@@ -1,6 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- APP_PATH = File.expand_path('../config/application', __dir__)
5
- require_relative '../config/boot'
6
- require 'rails/commands'
data/test/dummy/config.ru DELETED
@@ -1,6 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # This file is used by Rack-based servers to start the application.
4
-
5
- require ::File.expand_path('../config/environment', __FILE__)
6
- run Rails.application
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require File.expand_path('boot', __dir__)
4
-
5
- require 'rails/all'
6
-
7
- Bundler.require(*Rails.groups)
8
- require 'eac_rails_utils'
9
-
10
- module Dummy
11
- class Application < Rails::Application
12
- config.active_record.raise_in_transactional_callbacks = true if ::Rails.version < '5'
13
- end
14
- end
@@ -1,6 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Set up gems listed in the Gemfile.
4
- ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../../Gemfile', __dir__)
5
-
6
- require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
@@ -1,5 +0,0 @@
1
- test:
2
- adapter: sqlite3
3
- pool: 5
4
- timeout: 5000
5
- database: db/test.sqlite3
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Load the Rails application.
4
- require File.expand_path('application', __dir__)
5
-
6
- # Initialize the Rails application.
7
- Rails.application.initialize!
@@ -1,44 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- Rails.application.configure do
4
- # Settings specified here will take precedence over those in config/application.rb.
5
-
6
- # The test environment is used exclusively to run your application's
7
- # test suite. You never need to work with it otherwise. Remember that
8
- # your test database is "scratch space" for the test suite and is wiped
9
- # and recreated between test runs. Don't rely on the data there!
10
- config.cache_classes = true
11
-
12
- # Do not eager load code on boot. This avoids loading your whole application
13
- # just for the purpose of running a single test. If you are using a tool that
14
- # preloads Rails for running tests, you may have to set it to true.
15
- config.eager_load = false
16
-
17
- # Configure static file server for tests with Cache-Control for performance.
18
- config.serve_static_files = true
19
- config.static_cache_control = 'public, max-age=3600'
20
-
21
- # Show full error reports and disable caching.
22
- config.consider_all_requests_local = true
23
- config.action_controller.perform_caching = false
24
-
25
- # Raise exceptions instead of rendering exception templates.
26
- config.action_dispatch.show_exceptions = false
27
-
28
- # Disable request forgery protection in test environment.
29
- config.action_controller.allow_forgery_protection = false
30
-
31
- # Tell Action Mailer not to deliver emails to the real world.
32
- # The :test delivery method accumulates sent emails in the
33
- # ActionMailer::Base.deliveries array.
34
- config.action_mailer.delivery_method = :test
35
-
36
- # Randomize the order test cases are executed.
37
- config.active_support.test_order = :random
38
-
39
- # Print deprecation notices to the stderr.
40
- config.active_support.deprecation = :stderr
41
-
42
- # Raises error for missing translations
43
- # config.action_view.raise_on_missing_translations = true
44
- end
@@ -1,38 +0,0 @@
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.
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- Rails.application.routes.draw do
4
- resources :jobs do
5
- collection do
6
- get 'search'
7
- end
8
- end
9
- resources :users
10
- end
@@ -1,22 +0,0 @@
1
- # Be sure to restart your server when you modify this file.
2
-
3
- # Your secret key is used for verifying the integrity of signed cookies.
4
- # If you change this key, all old signed cookies will become invalid!
5
-
6
- # Make sure the secret is at least 30 characters and all random,
7
- # no regular words or you'll be exposed to dictionary attacks.
8
- # You can use `rake secret` to generate a secure secret key.
9
-
10
- # Make sure the secrets in this file are kept private
11
- # if you're sharing your code publicly.
12
-
13
- development:
14
- secret_key_base: 50d3bce23e309d961dafde3edfa89be2713718a5e2fb75b6c3e1f61826230921535243d2f221b8cecebeaceccb574a1e74fbbf3b89a9d53758ac988950f1753c
15
-
16
- test:
17
- secret_key_base: 75f37392ef7726b50b4ce117bd6a7eca7cdc299608e256f7ca163b14032559217364d41b7c091483ce02179a18c956f6e076331a611c0500f2862f83979a6c16
18
-
19
- # Do not keep production secrets in the repository,
20
- # instead read values from the environment.
21
- production:
22
- secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class CreateUsers < (
4
- Rails.version < '5' ? ActiveRecord::Migration : ActiveRecord::Migration[4.2]
5
- )
6
- def change
7
- create_table :users do |t|
8
- t.string :name
9
- t.string :email
10
- t.string :password
11
- end
12
- end
13
- end
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class CreateJobs < (
4
- Rails.version < '5' ? ActiveRecord::Migration : ActiveRecord::Migration[4.2]
5
- )
6
- def change
7
- create_table :jobs do |t|
8
- t.string :name
9
- end
10
- end
11
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class AddJobToUsers < (
4
- Rails.version < '5' ? ActiveRecord::Migration : ActiveRecord::Migration[4.2]
5
- )
6
- def change
7
- add_belongs_to :users, :job
8
- end
9
- end
@@ -1,25 +0,0 @@
1
- # encoding: UTF-8
2
- # This file is auto-generated from the current state of the database. Instead
3
- # of editing this file, please use the migrations feature of Active Record to
4
- # incrementally modify your database, and then regenerate this schema definition.
5
- #
6
- # Note that this schema.rb definition is the authoritative source for your
7
- # database schema. If you need to create the application database on another
8
- # system, you should be using db:schema:load, not running all the migrations
9
- # from scratch. The latter is a flawed and unsustainable approach (the more migrations
10
- # you'll amass, the slower it'll run and the greater likelihood for issues).
11
- #
12
- # It's strongly recommended that you check this file into your version control system.
13
-
14
- ActiveRecord::Schema.define(version: 20_160_415_143_229) do
15
- create_table 'jobs', force: :cascade do |t|
16
- t.string 'name'
17
- end
18
-
19
- create_table 'users', force: :cascade do |t|
20
- t.string 'name'
21
- t.string 'email'
22
- t.string 'password'
23
- t.integer 'job_id'
24
- end
25
- end
@@ -1,44 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
-
5
- module EacRailsUtils
6
- class DataTableTestHelperTest < ActionView::TestCase
7
- include ::EacRailsUtils::DataTableHelper
8
-
9
- class Person
10
- attr_reader :name, :age, :job
11
-
12
- def initialize(name, age, job)
13
- @name = name
14
- @age = age
15
- @job = job
16
- end
17
- end
18
-
19
- class Job
20
- attr_reader :name, :id
21
-
22
- def initialize(name)
23
- @name = name
24
- @id = SecureRandom.random_number(100_000)
25
- end
26
- end
27
-
28
- def test_data_table
29
- ds = []
30
- ds << Person.new('Fulano', 15, Job.new('Padeiro'))
31
- ds << Person.new('Sicrano', 25, nil)
32
-
33
- data_table(ds) do |s|
34
- s.paging = false
35
- s.column('Name', 'name')
36
- s.column('Age', 'age')
37
- s.column('Name + Age') { |v| "#{v.name} + #{v.age}" }
38
- s.column('Job', 'job')
39
- s.column('Job ID', 'job.id')
40
- s.column('Job ID + 10', 'job.id') { |_v| + 10 }
41
- end
42
- end
43
- end
44
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
-
5
- module EacRailsUtils
6
- class FormatterHelperTest < ActionView::TestCase
7
- include ::EacRailsUtils::FormatterHelper
8
-
9
- test 'should convert BRL currency to float' do
10
- brl_currency = { a: '1', b: '1,2', c: '1,23', d: '123.456.789,01',
11
- e: 'R$1,23', f: 'R$ 123.4,56' }
12
- float_currency = { a: 1, b: 1.2, c: 1.23, d: 123_456_789.01,
13
- e: 1.23, f: 123_4.56 }
14
-
15
- brl_currency.each do |k, v|
16
- assert_equal float_currency[k], brl_currency_to_float(v),
17
- "#{v} should be #{float_currency[k]}"
18
- end
19
- end
20
- end
21
- end
@@ -1,80 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
-
5
- module EacRailsUtils
6
- module Models
7
- class FetchErrorsTest < ActiveSupport::TestCase
8
- class M1
9
- include ActiveModel::Model
10
- include EacRailsUtils::Models::FetchErrors
11
- attr_accessor :name, :age, :account, :country_id, :other
12
- end
13
-
14
- class M2
15
- include ActiveModel::Model
16
- attr_accessor :name, :myage, :account_id, :country
17
-
18
- validate :my_validate
19
-
20
- def my_validate
21
- errors.add(:name, 'NAME_ERROR')
22
- errors.add(:myage, 'MYAGE_ERROR')
23
- errors.add(:account_id, 'ACCOUNT_ID_ERROR')
24
- errors.add(:country, 'COUNTRY_ERROR')
25
- end
26
- end
27
-
28
- def setup
29
- reset_m1
30
- reset_m2
31
- end
32
-
33
- def test_fetch_column_errors
34
- @m1.fetch_column_errors(@m2, :myage, :age)
35
- assert_equal @m2.errors[:myage], @m1.errors[:age]
36
- end
37
-
38
- def test_fetch_record_errors
39
- @m1.fetch_record_errors(@m2)
40
- { name: :name, account_id: :account, country: :country_id }.each do |c2, c1|
41
- assert_equal @m2.errors[c2], @m1.errors[c1], "c2: #{c2}, c1: #{c1}"
42
- end
43
- assert @m1.errors[:age].empty?
44
- end
45
-
46
- def test_fetch_record_errors_with_default_column
47
- @m1.fetch_record_errors(@m2, default_column: :other)
48
- assert_equal @m2.errors[:name], @m1.errors[:name]
49
- assert @m1.errors[:age].empty?
50
- assert_equal ['Myage: MYAGE_ERROR'], @m1.errors[:other]
51
- end
52
-
53
- def test_fetch_record_errors_with_skip_option
54
- @m1.fetch_record_errors(@m2, skip: [:name])
55
- assert @m1.errors[:name].empty?
56
- assert @m1.errors[:age].empty?
57
- end
58
-
59
- def test_fetch_record_errors_by_mapping
60
- @m1.fetch_record_errors_by_mapping(@m2, name: :name, myage: :age)
61
- assert_equal @m2.errors[:name], @m1.errors[:name]
62
- assert_equal @m2.errors[:myage], @m1.errors[:age]
63
- end
64
-
65
- private
66
-
67
- def reset_m1
68
- @m1 = M1.new
69
- assert @m1.errors.empty?
70
- end
71
-
72
- def reset_m2
73
- @m2 = M2.new
74
- assert_not @m2.valid?
75
- assert_not @m2.errors[:name].empty?
76
- assert_not @m2.errors[:myage].empty?
77
- end
78
- end
79
- end
80
- end
data/test/test_helper.rb DELETED
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- ENV['RAILS_ENV'] = 'test'
4
- require File.expand_path('../test/dummy/config/environment.rb', __dir__)
5
- require 'rails/test_help'
6
-
7
- module ActiveSupport
8
- class TestCase
9
- def reset_test_database
10
- ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:ruby, ENV['SCHEMA'])
11
- end
12
- end
13
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
-
5
- module EacRailsUtils
6
- class CpfValidatorTest < ActiveSupport::TestCase
7
- class M1
8
- include ActiveModel::Model
9
-
10
- attr_accessor :cpf
11
-
12
- validates :cpf, 'eac_rails_utils/cpf' => true, allow_nil: true
13
- end
14
-
15
- def setup
16
- @record = M1.new
17
- end
18
-
19
- def test_valid_cpfs
20
- ['85630275305', '66244374487', nil].each do |v|
21
- @record.cpf = v
22
- @record.valid?
23
- assert_equal [], @record.errors[:cpf], "CPF: \"#{v}\""
24
- end
25
- end
26
-
27
- def test_invalid_cpfs
28
- ['', ' ', 'abc', '856.302.753-05', '662.443.744-87', '85630275304'].each do |v|
29
- @record.cpf = v
30
- @record.valid?
31
- assert_not_equal [], @record.errors[:cpf], "CPF: \"#{v}\""
32
- end
33
- end
34
- end
35
- end