coins_paid_rails 1.2.0 → 1.3.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 +64 -0
- data/Gemfile.lock +19 -19
- data/coins_paid_rails.gemspec +1 -1
- data/lib/coins_paid/address.rb +2 -1
- data/lib/coins_paid.rb +2 -2
- data/lib/generators/coins_paid/migration_data.rb +13 -12
- data/lib/generators/coins_paid/migration_generator.rb +1 -1
- data/spec/address_spec.rb +66 -28
- data/spec/issued_addresses_spec.rb +5 -5
- data/spec/spec_helper.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2a245456681db498181920344cd14e9535d73f722674653a102d5edac3528a4e
|
4
|
+
data.tar.gz: 942f6799a1ae1784ea09810617c637bafd0745feba909a53779de1e4230ae33d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ebb41616c2ae9dfeee509b4c7cbcbd9589950ec0133974b118252081fa68662a2c9c10c8c5c2ea34b946a6b00f3d094e56a1a848dde062f09f07c681ed5aef79
|
7
|
+
data.tar.gz: c08a4d7d308e02fc81d547aa1361da7cbd48bd3cb1801af8890be00218eb3f01e415cfdd3b7ffe100620198c22485f3789c345ccb0a532827b4f3ad4d8bad67c
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
require:
|
2
|
+
- rubocop-performance
|
3
|
+
- rubocop-rails
|
4
|
+
AllCops:
|
5
|
+
TargetRubyVersion: 2.7
|
6
|
+
NewCops: enable
|
7
|
+
SuggestExtensions: false
|
8
|
+
|
9
|
+
Naming/MethodParameterName:
|
10
|
+
MinNameLength: 1
|
11
|
+
Naming/VariableNumber:
|
12
|
+
Enabled: false
|
13
|
+
|
14
|
+
Lint/MissingCopEnableDirective:
|
15
|
+
Enabled: false
|
16
|
+
|
17
|
+
Layout/EmptyLineAfterMagicComment:
|
18
|
+
Enabled: false
|
19
|
+
Layout/LineLength:
|
20
|
+
Max: 120
|
21
|
+
Layout/MultilineOperationIndentation:
|
22
|
+
Enabled: false
|
23
|
+
Layout/MultilineMethodCallIndentation:
|
24
|
+
EnforcedStyle: indented_relative_to_receiver
|
25
|
+
|
26
|
+
Style/AsciiComments:
|
27
|
+
Enabled: false
|
28
|
+
Style/ClassAndModuleChildren:
|
29
|
+
Enabled: false
|
30
|
+
Style/Documentation:
|
31
|
+
Enabled: false
|
32
|
+
Style/FormatStringToken:
|
33
|
+
Enabled: false
|
34
|
+
Style/Lambda:
|
35
|
+
Enabled: false
|
36
|
+
Style/LambdaCall:
|
37
|
+
Enabled: false
|
38
|
+
Style/ModuleFunction:
|
39
|
+
Enabled: false
|
40
|
+
Style/PercentLiteralDelimiters:
|
41
|
+
PreferredDelimiters:
|
42
|
+
'%i': '()'
|
43
|
+
'%I': '()'
|
44
|
+
'%r': '{}'
|
45
|
+
'%w': '()'
|
46
|
+
'%W': '()'
|
47
|
+
Style/SignalException:
|
48
|
+
EnforcedStyle: 'only_raise'
|
49
|
+
|
50
|
+
Metrics/AbcSize:
|
51
|
+
Exclude:
|
52
|
+
- 'config/**/*'
|
53
|
+
- 'db/**/*'
|
54
|
+
- 'spec/**/*'
|
55
|
+
Metrics/BlockLength:
|
56
|
+
Exclude:
|
57
|
+
- 'config/**/*'
|
58
|
+
- 'db/**/*'
|
59
|
+
- 'spec/**/*'
|
60
|
+
Metrics/MethodLength:
|
61
|
+
Exclude:
|
62
|
+
- 'config/**/*'
|
63
|
+
- 'db/**/*'
|
64
|
+
- 'spec/**/*'
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
coins_paid_rails (1.
|
4
|
+
coins_paid_rails (1.3.0)
|
5
5
|
activerecord (~> 6.1.4)
|
6
6
|
coins_paid_api (~> 1.0)
|
7
7
|
dry-initializer (~> 3.0)
|
@@ -36,14 +36,14 @@ GEM
|
|
36
36
|
zeitwerk (~> 2.3)
|
37
37
|
builder (3.2.4)
|
38
38
|
chunky_png (1.4.0)
|
39
|
-
coins_paid_api (1.0
|
39
|
+
coins_paid_api (1.1.0)
|
40
40
|
dry-struct (~> 1.0)
|
41
41
|
faraday (~> 0.12)
|
42
42
|
faraday_middleware (~> 0.11)
|
43
43
|
concurrent-ruby (1.1.10)
|
44
44
|
crass (1.0.6)
|
45
|
-
diff-lcs (1.
|
46
|
-
docile (1.
|
45
|
+
diff-lcs (1.5.0)
|
46
|
+
docile (1.4.0)
|
47
47
|
dry-configurable (0.14.0)
|
48
48
|
concurrent-ruby (~> 1.0)
|
49
49
|
dry-core (~> 0.6)
|
@@ -75,7 +75,6 @@ GEM
|
|
75
75
|
i18n (1.10.0)
|
76
76
|
concurrent-ruby (~> 1.0)
|
77
77
|
ice_nine (0.11.2)
|
78
|
-
json (2.3.0)
|
79
78
|
loofah (2.15.0)
|
80
79
|
crass (~> 1.0.2)
|
81
80
|
nokogiri (>= 1.5.9)
|
@@ -102,22 +101,22 @@ GEM
|
|
102
101
|
rake (>= 12.2)
|
103
102
|
thor (~> 1.0)
|
104
103
|
rake (13.0.6)
|
105
|
-
rqrcode (2.1.
|
104
|
+
rqrcode (2.1.1)
|
106
105
|
chunky_png (~> 1.0)
|
107
106
|
rqrcode_core (~> 1.0)
|
108
107
|
rqrcode_core (1.2.0)
|
109
|
-
rspec-core (3.
|
110
|
-
rspec-support (~> 3.
|
111
|
-
rspec-expectations (3.
|
108
|
+
rspec-core (3.11.0)
|
109
|
+
rspec-support (~> 3.11.0)
|
110
|
+
rspec-expectations (3.11.0)
|
112
111
|
diff-lcs (>= 1.2.0, < 2.0)
|
113
|
-
rspec-support (~> 3.
|
112
|
+
rspec-support (~> 3.11.0)
|
114
113
|
rspec-its (1.3.0)
|
115
114
|
rspec-core (>= 3.0.0)
|
116
115
|
rspec-expectations (>= 3.0.0)
|
117
|
-
rspec-mocks (3.
|
116
|
+
rspec-mocks (3.11.0)
|
118
117
|
diff-lcs (>= 1.2.0, < 2.0)
|
119
|
-
rspec-support (~> 3.
|
120
|
-
rspec-rails (5.
|
118
|
+
rspec-support (~> 3.11.0)
|
119
|
+
rspec-rails (5.1.1)
|
121
120
|
actionpack (>= 5.2)
|
122
121
|
activesupport (>= 5.2)
|
123
122
|
railties (>= 5.2)
|
@@ -125,12 +124,13 @@ GEM
|
|
125
124
|
rspec-expectations (~> 3.10)
|
126
125
|
rspec-mocks (~> 3.10)
|
127
126
|
rspec-support (~> 3.10)
|
128
|
-
rspec-support (3.
|
129
|
-
simplecov (0.
|
130
|
-
docile (~> 1.1
|
131
|
-
|
132
|
-
|
133
|
-
simplecov-html (0.
|
127
|
+
rspec-support (3.11.0)
|
128
|
+
simplecov (0.21.2)
|
129
|
+
docile (~> 1.1)
|
130
|
+
simplecov-html (~> 0.11)
|
131
|
+
simplecov_json_formatter (~> 0.1)
|
132
|
+
simplecov-html (0.12.3)
|
133
|
+
simplecov_json_formatter (0.1.4)
|
134
134
|
sqlite3 (1.4.2)
|
135
135
|
thor (1.2.1)
|
136
136
|
tzinfo (2.0.4)
|
data/coins_paid_rails.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'coins_paid_rails'
|
3
3
|
s.authors = ['Artem Biserov(artembiserov)', 'Oleg Ivanov(morhekil)']
|
4
|
-
s.version = '1.
|
4
|
+
s.version = '1.3.0'
|
5
5
|
s.files = `git ls-files`.split("\n")
|
6
6
|
s.summary = 'CoinsPaid Rails Integration'
|
7
7
|
s.license = 'MIT'
|
data/lib/coins_paid/address.rb
CHANGED
@@ -18,7 +18,8 @@ module CoinsPaid
|
|
18
18
|
|
19
19
|
def call
|
20
20
|
ActiveRecord::Base.transaction do
|
21
|
-
|
21
|
+
lookup_attrs = request_data.attributes.slice(:foreign_id, :convert_to, :currency)
|
22
|
+
CoinsPaidAddress.lock.find_or_create_by!(lookup_attrs) do |address|
|
22
23
|
response = CoinsPaid::API.take_address(request_data.attributes)
|
23
24
|
address.assign_attributes(response.attributes)
|
24
25
|
end
|
data/lib/coins_paid.rb
CHANGED
@@ -9,7 +9,7 @@ module CoinsPaid
|
|
9
9
|
|
10
10
|
UnknownCurrency = Class.new RuntimeError
|
11
11
|
|
12
|
-
def address(foreign_id, currency:, convert_to:)
|
12
|
+
def address(foreign_id, currency:, convert_to: currency)
|
13
13
|
Address.new(foreign_id: foreign_id, currency: currency, convert_to: convert_to).call
|
14
14
|
end
|
15
15
|
|
@@ -18,6 +18,6 @@ module CoinsPaid
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def issued_addresses(foreign_id)
|
21
|
-
CoinsPaidAddress.where(foreign_id: foreign_id).order(:currency)
|
21
|
+
CoinsPaidAddress.where(foreign_id: foreign_id).order(:currency, :convert_to)
|
22
22
|
end
|
23
23
|
end
|
@@ -5,18 +5,19 @@ module CoinsPaid
|
|
5
5
|
module_function
|
6
6
|
|
7
7
|
def get
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
8
|
+
<<~RUBY
|
9
|
+
create_table :coins_paid_addresses do |t|
|
10
|
+
t.string :foreign_id, null: false
|
11
|
+
t.string :currency, null: false
|
12
|
+
t.string :convert_to, null: false
|
13
|
+
t.string :address, null: false
|
14
|
+
t.string :tag
|
15
|
+
t.integer :external_id, null: false
|
16
|
+
|
17
|
+
t.timestamps
|
18
|
+
t.index [:foreign_id, :currency, :convert_to], name: :address_currencies, unique: true
|
19
|
+
end
|
20
|
+
RUBY
|
20
21
|
end
|
21
22
|
end
|
22
23
|
end
|
@@ -6,7 +6,7 @@ module CoinsPaid
|
|
6
6
|
module Generators
|
7
7
|
class MigrationGenerator < ActiveRecord::Generators::Base
|
8
8
|
argument :name, default: 'create_coins_paid_addresses'
|
9
|
-
source_root File.expand_path(
|
9
|
+
source_root File.expand_path('templates', __dir__)
|
10
10
|
|
11
11
|
def copy_coins_paid_migration
|
12
12
|
migration_template 'migration.rb', "#{db_migrate_path}/#{file_name}.rb"
|
data/spec/address_spec.rb
CHANGED
@@ -1,57 +1,95 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
describe CoinsPaid, '.address' do
|
4
|
-
let(:
|
4
|
+
let(:foreign_id) { 'user-id:2048' }
|
5
5
|
let(:currency) { 'BTC' }
|
6
6
|
let(:convert_to) { 'EUR' }
|
7
|
-
let(:full_address_attributes) do
|
8
|
-
{
|
9
|
-
foreign_id: foreign_key,
|
10
|
-
currency: currency
|
11
|
-
}.merge(address_attributes)
|
12
|
-
end
|
13
7
|
let(:address_attributes) do
|
14
8
|
{
|
15
9
|
external_id: 1,
|
16
10
|
address: '12983h13ro1hrt24it432t',
|
17
|
-
tag: 'tag-123'
|
11
|
+
tag: 'tag-123'
|
18
12
|
}
|
19
13
|
end
|
20
|
-
|
14
|
+
let(:api_request_args) { { foreign_id: foreign_id, currency: currency, convert_to: convert_to } }
|
15
|
+
|
16
|
+
subject(:take_address) { described_class.address(foreign_id, currency: currency, convert_to: convert_to) }
|
21
17
|
|
22
|
-
context 'when there is
|
23
|
-
let
|
24
|
-
|
18
|
+
context 'when there is a previously stored address record' do
|
19
|
+
let(:stored_address_attributes) do
|
20
|
+
address_attributes.merge(
|
21
|
+
foreign_id: foreign_id,
|
22
|
+
currency: currency,
|
23
|
+
convert_to: recorded_convert_to
|
24
|
+
)
|
25
|
+
end
|
26
|
+
|
27
|
+
let!(:stored_address) do
|
28
|
+
CoinsPaid::CoinsPaidAddress.create!(stored_address_attributes)
|
25
29
|
end
|
26
30
|
|
27
31
|
before do
|
28
|
-
allow(CoinsPaid::API).to receive(:take_address)
|
32
|
+
allow(CoinsPaid::API).to receive(:take_address).and_return(
|
33
|
+
CoinsPaid::API::TakeAddress::Response.new(address_attributes)
|
34
|
+
)
|
29
35
|
end
|
30
36
|
|
31
|
-
|
32
|
-
|
37
|
+
context 'with the same convert_to value' do
|
38
|
+
let(:recorded_convert_to) { convert_to }
|
33
39
|
|
34
|
-
|
40
|
+
it 'returns existing record' do
|
41
|
+
expect do
|
42
|
+
expect(take_address).to eq stored_address
|
43
|
+
end.to_not change(CoinsPaid::CoinsPaidAddress, :count)
|
44
|
+
expect(CoinsPaid::API).not_to have_received(:take_address)
|
45
|
+
end
|
35
46
|
end
|
36
|
-
end
|
37
47
|
|
38
|
-
|
39
|
-
|
40
|
-
allow(CoinsPaid::API).to receive(:take_address).and_raise(CoinsPaid::API::Error)
|
41
|
-
end
|
48
|
+
context 'with a different convert_to value' do
|
49
|
+
let(:recorded_convert_to) { 'DOGE' }
|
42
50
|
|
43
|
-
|
44
|
-
|
51
|
+
it 'requests and records new address' do
|
52
|
+
expect do
|
53
|
+
new_address_attrs = stored_address_attributes.merge(convert_to: convert_to)
|
54
|
+
expect(take_address).to have_attributes(new_address_attrs)
|
55
|
+
end.to change(CoinsPaid::CoinsPaidAddress, :count).by(1)
|
56
|
+
expect(CoinsPaid::API).to have_received(:take_address).with(api_request_args)
|
57
|
+
end
|
45
58
|
end
|
46
59
|
end
|
47
60
|
|
48
|
-
context 'when
|
49
|
-
|
50
|
-
|
61
|
+
context 'when there is no recorded address' do
|
62
|
+
context 'and coins paid api responds with error' do
|
63
|
+
before do
|
64
|
+
allow(CoinsPaid::API).to receive(:take_address).and_raise(CoinsPaid::API::Error)
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'raises error' do
|
68
|
+
expect { take_address }.to raise_error(CoinsPaid::API::Error)
|
69
|
+
end
|
51
70
|
end
|
52
71
|
|
53
|
-
|
54
|
-
|
72
|
+
context 'and coins paid returns valid response' do
|
73
|
+
before do
|
74
|
+
allow(CoinsPaid::API).to receive(:take_address).and_return(
|
75
|
+
CoinsPaid::API::TakeAddress::Response.new(address_attributes)
|
76
|
+
)
|
77
|
+
end
|
78
|
+
|
79
|
+
let(:new_address_attrs) do
|
80
|
+
address_attributes.merge(
|
81
|
+
foreign_id: foreign_id,
|
82
|
+
currency: currency,
|
83
|
+
convert_to: convert_to
|
84
|
+
)
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'creates new address' do
|
88
|
+
expect do
|
89
|
+
expect(take_address).to have_attributes(new_address_attrs)
|
90
|
+
end.to change(CoinsPaid::CoinsPaidAddress, :count).by(1)
|
91
|
+
expect(CoinsPaid::API).to have_received(:take_address).with(api_request_args)
|
92
|
+
end
|
55
93
|
end
|
56
94
|
end
|
57
95
|
end
|
@@ -6,15 +6,15 @@ describe CoinsPaid, '.issued_addresses' do
|
|
6
6
|
it 'returns addresses with requested foreign_id ordered by currency' do
|
7
7
|
attrs = {
|
8
8
|
foreign_id: foreign_id,
|
9
|
-
currency: 'BTC',
|
10
9
|
address: 'addr',
|
11
10
|
external_id: 1
|
12
11
|
}
|
13
12
|
|
14
|
-
addr1 = CoinsPaid::CoinsPaidAddress.create!(attrs)
|
15
|
-
addr2 = CoinsPaid::CoinsPaidAddress.create!(attrs.merge(currency: 'ETH'))
|
16
|
-
CoinsPaid::CoinsPaidAddress.create!(attrs.merge(
|
13
|
+
addr1 = CoinsPaid::CoinsPaidAddress.create!(attrs.merge(currency: 'BTC', convert_to: 'EUR'))
|
14
|
+
addr2 = CoinsPaid::CoinsPaidAddress.create!(attrs.merge(currency: 'ETH', convert_to: 'EUR'))
|
15
|
+
addr3 = CoinsPaid::CoinsPaidAddress.create!(attrs.merge(currency: 'ETH', convert_to: 'ETH'))
|
16
|
+
CoinsPaid::CoinsPaidAddress.create!(attrs.merge(currency: 'BTC', convert_to: 'EUR', foreign_id: 555))
|
17
17
|
|
18
|
-
expect(CoinsPaid.issued_addresses(foreign_id)).to eq [addr1, addr2]
|
18
|
+
expect(CoinsPaid.issued_addresses(foreign_id)).to eq [addr1, addr3, addr2]
|
19
19
|
end
|
20
20
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: coins_paid_rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Artem Biserov(artembiserov)
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2022-03-
|
12
|
+
date: 2022-03-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: coins_paid_api
|
@@ -90,6 +90,7 @@ files:
|
|
90
90
|
- ".circleci/config.yml"
|
91
91
|
- ".gitignore"
|
92
92
|
- ".rspec"
|
93
|
+
- ".rubocop.yml"
|
93
94
|
- ".ruby-version"
|
94
95
|
- Gemfile
|
95
96
|
- Gemfile.lock
|