simple_form-bank_account_number 1.0.0 → 1.1.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 +4 -4
- data/.rubocop.yml +45 -0
- data/.travis.yml +2 -6
- data/Gemfile +1 -1
- data/LICENSE.txt +1 -1
- data/README.md +7 -0
- data/Rakefile +5 -2
- data/lib/simple_form/bank_account_number.rb +16 -39
- data/lib/simple_form/bank_account_number/countries.rb +39 -24
- data/lib/simple_form/bank_account_number/formatter.rb +57 -0
- data/simple_form-bank_account_number.gemspec +9 -8
- data/spec/simple_form/bank_account_number/formatter_spec.rb +38 -0
- data/spec/simple_form/bank_account_number_spec.rb +0 -21
- metadata +28 -11
- data/lib/simple_form/bank_account_number/version.rb +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 89400455ffe9eb2f250fbd14802352f6c89e3ec5
|
4
|
+
data.tar.gz: a3eea1f96cceda733ae7f0bd2d59d966459f956d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 68828827190438e6a1d99bffdddbf15dc3e551f850da24b310ff837f53a0fe0ccf502252a43b0dcf5139078ef3f355b4fb6d02bef1fe432e1ee69304cece0809
|
7
|
+
data.tar.gz: b8ad4bdcb94676adf92f65e9f545cbce636ef716e84bb3d208cc0bb33ce28684c60561a1d43c4749e4a870cf29478c0536b4ab29bfee69e730b2e453ef5bd67c
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
Metrics/AbcSize:
|
2
|
+
Enabled: false
|
3
|
+
|
4
|
+
Metrics/MethodLength:
|
5
|
+
Enabled: false
|
6
|
+
|
7
|
+
Metrics/LineLength:
|
8
|
+
Max: 120
|
9
|
+
Exclude: [spec/**/*.rb]
|
10
|
+
|
11
|
+
Lint/AssignmentInCondition:
|
12
|
+
Enabled: false
|
13
|
+
|
14
|
+
Lint/EndAlignment:
|
15
|
+
Enabled: false
|
16
|
+
|
17
|
+
Style/AccessModifierIndentation:
|
18
|
+
EnforcedStyle: outdent
|
19
|
+
|
20
|
+
Style/AndOr:
|
21
|
+
EnforcedStyle: conditionals
|
22
|
+
|
23
|
+
Style/ClassAndModuleChildren:
|
24
|
+
Enabled: false
|
25
|
+
|
26
|
+
Style/ElseAlignment:
|
27
|
+
Enabled: false
|
28
|
+
|
29
|
+
Style/IndentationWidth:
|
30
|
+
Enabled: false
|
31
|
+
|
32
|
+
Style/SignalException:
|
33
|
+
EnforcedStyle: only_raise
|
34
|
+
|
35
|
+
Style/StringLiterals:
|
36
|
+
EnforcedStyle: double_quotes
|
37
|
+
|
38
|
+
Style/SpecialGlobalVars:
|
39
|
+
Enabled: false
|
40
|
+
|
41
|
+
Style/TrailingComma:
|
42
|
+
Enabled: false
|
43
|
+
|
44
|
+
Style/Documentation:
|
45
|
+
Enabled: false
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
# SimpleForm::BankAccountNumber
|
2
2
|
|
3
|
+
[](https://travis-ci.org/buckybox/simple_form-bank_account_number)
|
4
|
+
[](https://gemnasium.com/buckybox/simple_form-bank_account_number)
|
5
|
+
[](https://rubygems.org/gems/simple_form-bank_account_number)
|
6
|
+
|
3
7
|
A [SimpleForm](https://github.com/plataformatec/simple_form) input field for bank account numbers.
|
4
8
|
|
5
9
|
## Usage
|
@@ -17,3 +21,6 @@ You probably want to concatenate them into one single number for your backend wi
|
|
17
21
|
|
18
22
|
`params[:bank_deposit][:account_number] = params[:bank_deposit][:account_number].join`
|
19
23
|
|
24
|
+
## License
|
25
|
+
|
26
|
+
MIT
|
data/Rakefile
CHANGED
@@ -1,8 +1,11 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
|
-
require "rspec/core/rake_task"
|
3
2
|
|
3
|
+
require "rspec/core/rake_task"
|
4
4
|
RSpec::Core::RakeTask.new(:spec) do |t|
|
5
5
|
t.ruby_opts = "-w"
|
6
6
|
end
|
7
7
|
|
8
|
-
|
8
|
+
require "rubocop/rake_task"
|
9
|
+
RuboCop::RakeTask.new
|
10
|
+
|
11
|
+
task default: [:rubocop, :spec]
|
@@ -1,46 +1,33 @@
|
|
1
1
|
require "simple_form"
|
2
|
-
require "simple_form/bank_account_number/
|
3
|
-
require "simple_form/bank_account_number/version"
|
2
|
+
require "simple_form/bank_account_number/formatter"
|
4
3
|
|
5
4
|
module SimpleForm
|
6
5
|
module Inputs
|
7
6
|
class BankAccountNumberInput < NumericInput
|
8
|
-
def self.formatted_bank_account_number(full_number, country)
|
9
|
-
full_number = full_number.dup
|
10
|
-
|
11
|
-
fields = number_format(country).map do |part|
|
12
|
-
length = part[:format].source.scan(/\b\d}/).map(&:to_i).max
|
13
|
-
full_number.slice!(0, length || full_number.length)
|
14
|
-
end
|
15
|
-
|
16
|
-
unless full_number.empty?
|
17
|
-
raise ArgumentError, "format does not match (#{full_number.length} extra digits)"
|
18
|
-
end
|
19
|
-
|
20
|
-
fields.join("-")
|
21
|
-
end
|
22
|
-
|
23
|
-
# requires to set :country and :value
|
24
7
|
def input
|
25
8
|
country = options.delete(:country) || raise(ArgumentError, "You must set the :country key.")
|
26
|
-
full_number = options.fetch(:value
|
27
|
-
parts =
|
9
|
+
full_number = options.fetch(:value, "")
|
10
|
+
parts = BankAccountNumber::Formatter.formatted_bank_account_number(full_number, country).to_h.values
|
11
|
+
format = BankAccountNumber::Formatter.number_format(country)
|
12
|
+
|
13
|
+
format.fetch(:parts).map do |part|
|
14
|
+
input_html_options.delete(:country) # don't include it in the markup
|
28
15
|
|
29
|
-
fields = self.class.number_format(country).map do |part|
|
30
16
|
input_html_options[:required] = "required"
|
31
17
|
input_html_options[:autocomplete] = "off"
|
32
|
-
input_html_options[:name] = "#{lookup_model_names.join(
|
33
|
-
input_html_options[:pattern] = "^#{part
|
34
|
-
input_html_options[:title] = part
|
18
|
+
input_html_options[:name] = "#{lookup_model_names.join('_')}[#{reflection_or_attribute_name}][]"
|
19
|
+
input_html_options[:pattern] = "^#{part.fetch(:format).source}$"
|
20
|
+
input_html_options[:title] = part.fetch(:title)
|
35
21
|
input_html_options[:style] = "width: auto; display: inline; margin-right: .2em"
|
36
|
-
input_html_options.
|
22
|
+
input_html_options["data-label"] = part.fetch(:label)
|
23
|
+
input_html_options["data-multiline"] = format.fetch(:multiline)
|
37
24
|
|
38
25
|
# Twitter Bootstrap tooltips
|
39
26
|
input_html_options["data-toggle"] = "tooltip"
|
40
|
-
input_html_options["data-original-title"] = part
|
27
|
+
input_html_options["data-original-title"] = part.fetch(:title)
|
41
28
|
input_html_options["data-placement"] = "bottom"
|
42
29
|
|
43
|
-
if length = part
|
30
|
+
if length = part.fetch(:format).source.scan(/\b\d}/).map(&:to_i).max
|
44
31
|
input_html_options[:size] = length
|
45
32
|
input_html_options[:maxlength] = length
|
46
33
|
else
|
@@ -48,21 +35,11 @@ module SimpleForm
|
|
48
35
|
input_html_options[:maxlength] = nil
|
49
36
|
end
|
50
37
|
|
51
|
-
input_html_options[:value] = parts.
|
38
|
+
input_html_options[:value] = parts.shift
|
52
39
|
|
53
40
|
super
|
54
|
-
end
|
55
|
-
|
56
|
-
fields.join
|
57
|
-
end
|
58
|
-
|
59
|
-
private
|
60
|
-
|
61
|
-
def self.number_format(country)
|
62
|
-
SimpleForm::BankAccountNumber::COUNTRIES[country.upcase] ||
|
63
|
-
SimpleForm::BankAccountNumber::DEFAULT_FORMAT
|
41
|
+
end.join
|
64
42
|
end
|
65
43
|
end
|
66
44
|
end
|
67
45
|
end
|
68
|
-
|
@@ -1,29 +1,44 @@
|
|
1
|
+
require "simple_form"
|
2
|
+
|
1
3
|
module SimpleForm
|
2
4
|
module BankAccountNumber
|
3
5
|
COUNTRIES = {
|
4
|
-
"AU" =>
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
6
|
+
"AU" => {
|
7
|
+
parts: [
|
8
|
+
{ label: "BSB Number", title: "6 digit BSB number", format: /\d{6}/ },
|
9
|
+
{ label: "Account Number", title: "6 to 9 digit account number", format: /\d{6,9}/ },
|
10
|
+
],
|
11
|
+
multiline: true,
|
12
|
+
},
|
13
|
+
"CA" => {
|
14
|
+
parts: [
|
15
|
+
{ label: "Transit Number", title: "8 or 9 digit transit number", format: /\d{8,9}/ },
|
16
|
+
{ label: "Account Number", title: "7 to 12 digit account number", format: /\d{7,12}/ },
|
17
|
+
],
|
18
|
+
multiline: true,
|
19
|
+
},
|
20
|
+
"GB" => {
|
21
|
+
parts: [
|
22
|
+
{ label: "Sort Code", title: "6 digit sort code", format: /\d{6}/ },
|
23
|
+
{ label: "Account Number", title: "7 to 10 digit account number", format: /\d{7,10}/ },
|
24
|
+
],
|
25
|
+
multiline: true,
|
26
|
+
},
|
27
|
+
"NZ" => {
|
28
|
+
parts: [
|
29
|
+
{ label: "Bank Number", title: "2 digit bank number", format: /\d{2}/ },
|
30
|
+
{ label: "Branch Number", title: "4 digit branch number", format: /\d{4}/ },
|
31
|
+
{ label: "Account Number", title: "7 digit account number", format: /\d{7}/ },
|
32
|
+
{ label: "Suffix", title: "2 or 3 digit suffix", format: /\d{2,3}/ },
|
33
|
+
],
|
34
|
+
multiline: false,
|
35
|
+
},
|
36
|
+
nil => { # NOTE: default format
|
37
|
+
parts: [
|
38
|
+
{ label: "Account Number", title: "account number", format: /[A-Z0-9]+/ }
|
39
|
+
],
|
40
|
+
multiline: false,
|
41
|
+
}
|
42
|
+
}.freeze
|
27
43
|
end
|
28
44
|
end
|
29
|
-
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require "simple_form"
|
2
|
+
require "simple_form/bank_account_number/countries"
|
3
|
+
|
4
|
+
module SimpleForm
|
5
|
+
module BankAccountNumber
|
6
|
+
class Formatter
|
7
|
+
def self.number_format(country)
|
8
|
+
BankAccountNumber::COUNTRIES.fetch(
|
9
|
+
country.upcase, BankAccountNumber::COUNTRIES[nil]
|
10
|
+
)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.formatted_bank_account_number(full_number, country)
|
14
|
+
full_number = full_number.to_s.dup
|
15
|
+
format = number_format(country)
|
16
|
+
|
17
|
+
fields = format.fetch(:parts).inject({}) do |hash, part|
|
18
|
+
length = part.fetch(:format).source.scan(/\b\d}/).map(&:to_i).max
|
19
|
+
field = full_number.slice!(0, length || full_number.length)
|
20
|
+
|
21
|
+
hash.merge!(part.fetch(:label) => field)
|
22
|
+
end
|
23
|
+
|
24
|
+
unless full_number.empty?
|
25
|
+
raise ArgumentError, "format does not match (#{full_number.length} extra digits)"
|
26
|
+
end
|
27
|
+
|
28
|
+
new(fields, country)
|
29
|
+
end
|
30
|
+
|
31
|
+
def initialize(fields, country)
|
32
|
+
@fields = fields
|
33
|
+
@country = country
|
34
|
+
end
|
35
|
+
|
36
|
+
def to_s(value_separator: ": ", field_separator: "\n")
|
37
|
+
hash = if multiline?
|
38
|
+
to_h
|
39
|
+
else
|
40
|
+
{ "Account Number" => to_h.values.join("-") } # TODO: i18n
|
41
|
+
end
|
42
|
+
|
43
|
+
hash.map do |label, value|
|
44
|
+
[label, value_separator, value].join
|
45
|
+
end.join(field_separator)
|
46
|
+
end
|
47
|
+
|
48
|
+
def to_h
|
49
|
+
@fields
|
50
|
+
end
|
51
|
+
|
52
|
+
def multiline?
|
53
|
+
self.class.number_format(@country).fetch(:multiline)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -1,16 +1,15 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
lib = File.expand_path(
|
2
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require 'simple_form/bank_account_number/version'
|
5
4
|
|
6
5
|
Gem::Specification.new do |spec|
|
7
6
|
spec.name = "simple_form-bank_account_number"
|
8
|
-
spec.version =
|
7
|
+
spec.version = "1.1.0"
|
9
8
|
spec.authors = ["Cédric Félizard"]
|
10
9
|
spec.email = ["cedric@felizard.fr"]
|
11
|
-
spec.description =
|
12
|
-
spec.summary =
|
13
|
-
spec.homepage = ""
|
10
|
+
spec.description = "A SimpleForm input field for bank account numbers"
|
11
|
+
spec.summary = "Bank account number field for SimpleForm"
|
12
|
+
spec.homepage = "https://github.com/buckybox/simple_form-bank_account_number"
|
14
13
|
spec.license = "MIT"
|
15
14
|
|
16
15
|
spec.files = `git ls-files`.split($/)
|
@@ -18,8 +17,10 @@ Gem::Specification.new do |spec|
|
|
18
17
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
18
|
spec.require_paths = ["lib"]
|
20
19
|
|
21
|
-
spec.add_dependency
|
22
|
-
|
20
|
+
spec.add_dependency "simple_form", "~> 2.1.0"
|
21
|
+
|
23
22
|
spec.add_development_dependency "rake"
|
23
|
+
spec.add_development_dependency "bundler"
|
24
24
|
spec.add_development_dependency "rspec"
|
25
|
+
spec.add_development_dependency "rubocop"
|
25
26
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require "simple_form/bank_account_number/formatter"
|
2
|
+
|
3
|
+
module SimpleForm
|
4
|
+
module BankAccountNumber
|
5
|
+
describe Formatter do
|
6
|
+
describe ".formatted_bank_account_number" do
|
7
|
+
def assert(country, number, formatted_number)
|
8
|
+
expect(Formatter.formatted_bank_account_number(number, country).to_h).to eq formatted_number
|
9
|
+
end
|
10
|
+
|
11
|
+
specify do
|
12
|
+
assert "AU", "484795453513423", "BSB Number" => "484795", "Account Number" => "453513423"
|
13
|
+
assert "GB", "40142431565517", "Sort Code" => "401424", "Account Number" => "31565517"
|
14
|
+
assert "NZ", "041587005000000", "Bank Number" => "04", "Branch Number" => "1587", "Account Number" => "0050000", "Suffix" => "00"
|
15
|
+
assert "XX", "1234", "Account Number" => "1234"
|
16
|
+
end
|
17
|
+
|
18
|
+
it "honors the multiline flag" do
|
19
|
+
gb = Formatter.formatted_bank_account_number("40142431565517", "GB")
|
20
|
+
expect(gb.to_s).to eq "Sort Code: 401424\nAccount Number: 31565517"
|
21
|
+
|
22
|
+
nz = Formatter.formatted_bank_account_number("041587005000000", "NZ")
|
23
|
+
expect(nz.to_s).to eq "Account Number: 04-1587-0050000-00"
|
24
|
+
|
25
|
+
xx = Formatter.formatted_bank_account_number("1234", "XX")
|
26
|
+
expect(xx.to_s).to eq "Account Number: 1234" # TODO: support i18n
|
27
|
+
end
|
28
|
+
|
29
|
+
it "preserves the given number" do
|
30
|
+
number = "484795453513423"
|
31
|
+
Formatter.formatted_bank_account_number(number, "AU")
|
32
|
+
|
33
|
+
expect(number).to eq "484795453513423"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -17,26 +17,6 @@ end
|
|
17
17
|
|
18
18
|
module SimpleForm::Inputs
|
19
19
|
describe BankAccountNumberInput do
|
20
|
-
describe ".formatted_bank_account_number" do
|
21
|
-
def assert country, number, formatted_number
|
22
|
-
expect(BankAccountNumberInput.formatted_bank_account_number(number, country)).to eq formatted_number
|
23
|
-
end
|
24
|
-
|
25
|
-
specify do
|
26
|
-
assert "AU", "484795453513423", "484795-453513423"
|
27
|
-
assert "GB", "40142431565517", "401424-31565517"
|
28
|
-
assert "NZ", "041587005000000", "04-1587-0050000-00"
|
29
|
-
assert "XX", "1234", "1234"
|
30
|
-
end
|
31
|
-
|
32
|
-
it "preserves the given number" do
|
33
|
-
number = "484795453513423"
|
34
|
-
BankAccountNumberInput.formatted_bank_account_number(number, "AU")
|
35
|
-
|
36
|
-
expect(number).to eq "484795453513423"
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
20
|
describe "#input" do
|
41
21
|
let(:options) do
|
42
22
|
{
|
@@ -59,4 +39,3 @@ module SimpleForm::Inputs
|
|
59
39
|
end
|
60
40
|
end
|
61
41
|
end
|
62
|
-
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple_form-bank_account_number
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cédric Félizard
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-05-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: simple_form
|
@@ -25,21 +25,21 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 2.1.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rubocop
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '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'
|
69
83
|
description: A SimpleForm input field for bank account numbers
|
70
84
|
email:
|
71
85
|
- cedric@felizard.fr
|
@@ -74,6 +88,7 @@ extensions: []
|
|
74
88
|
extra_rdoc_files: []
|
75
89
|
files:
|
76
90
|
- ".gitignore"
|
91
|
+
- ".rubocop.yml"
|
77
92
|
- ".travis.yml"
|
78
93
|
- Gemfile
|
79
94
|
- LICENSE.txt
|
@@ -81,10 +96,11 @@ files:
|
|
81
96
|
- Rakefile
|
82
97
|
- lib/simple_form/bank_account_number.rb
|
83
98
|
- lib/simple_form/bank_account_number/countries.rb
|
84
|
-
- lib/simple_form/bank_account_number/
|
99
|
+
- lib/simple_form/bank_account_number/formatter.rb
|
85
100
|
- simple_form-bank_account_number.gemspec
|
101
|
+
- spec/simple_form/bank_account_number/formatter_spec.rb
|
86
102
|
- spec/simple_form/bank_account_number_spec.rb
|
87
|
-
homepage:
|
103
|
+
homepage: https://github.com/buckybox/simple_form-bank_account_number
|
88
104
|
licenses:
|
89
105
|
- MIT
|
90
106
|
metadata: {}
|
@@ -104,9 +120,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
104
120
|
version: '0'
|
105
121
|
requirements: []
|
106
122
|
rubyforge_project:
|
107
|
-
rubygems_version: 2.
|
123
|
+
rubygems_version: 2.4.6
|
108
124
|
signing_key:
|
109
125
|
specification_version: 4
|
110
126
|
summary: Bank account number field for SimpleForm
|
111
127
|
test_files:
|
128
|
+
- spec/simple_form/bank_account_number/formatter_spec.rb
|
112
129
|
- spec/simple_form/bank_account_number_spec.rb
|