coins_paid_rails 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.circleci/config.yml +108 -0
- data/.gitignore +3 -0
- data/.rspec +2 -0
- data/Gemfile +9 -0
- data/coins_paid_rails.gemspec +15 -0
- data/lib/coins_paid.rb +32 -0
- data/lib/coins_paid/address.rb +26 -0
- data/lib/coins_paid/coins_paid_address.rb +6 -0
- data/lib/coins_paid/qr_code.rb +40 -0
- data/lib/coins_paid_rails.rb +2 -0
- data/lib/generators/coins_paid/migration_data.rb +22 -0
- data/lib/generators/coins_paid/migration_generator.rb +20 -0
- data/lib/generators/coins_paid/templates/migration.rb +7 -0
- data/spec/address_spec.rb +56 -0
- data/spec/currency_spec.rb +43 -0
- data/spec/qr_code_spec.rb +26 -0
- data/spec/spec_helper.rb +26 -0
- data/spec/support/database/create_table.rb +14 -0
- metadata +132 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 76dfc07ca328248272a643ae517e9f4e3adfc8d4199df23c4e18aea9f90ee484
|
4
|
+
data.tar.gz: 522e768d858bc97704304a6021b42e06c5905cbebd151556de6d326a6fc5f62b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 25c3a98da0c552ac54e791d4df5cf939ffdb47be6a6bf17dc1de240e03769c69dc2b1edfaaf492e52c53eec3b2ee20a105bb17bc04a6e2af410adb09dbbdbd42
|
7
|
+
data.tar.gz: e06207597934bcb1279527225c76ac08ffb0273cba8ad36d2db96a9a90e3fa3ac4e899b5c1a01f220ff3799ee43ee28ba00f6887a38634b33bd8905d434b01bb
|
@@ -0,0 +1,108 @@
|
|
1
|
+
version: 2.0
|
2
|
+
defaults: &defaults
|
3
|
+
docker:
|
4
|
+
- image: circleci/ruby:2.5-stretch-node
|
5
|
+
working_directory: ~/coins_paid
|
6
|
+
|
7
|
+
jobs:
|
8
|
+
checkout_code:
|
9
|
+
<<: *defaults
|
10
|
+
steps:
|
11
|
+
- checkout
|
12
|
+
- run: mkdir log
|
13
|
+
- save_cache:
|
14
|
+
key: v1-repo-{{ .Environment.CIRCLE_SHA1 }}
|
15
|
+
paths:
|
16
|
+
- ~/coins_paid
|
17
|
+
|
18
|
+
download_cc_reporter:
|
19
|
+
<<: *defaults
|
20
|
+
steps:
|
21
|
+
- run:
|
22
|
+
name: Download cc-test-reporter
|
23
|
+
command: |
|
24
|
+
mkdir -p cc/
|
25
|
+
curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc/cc-test-reporter
|
26
|
+
chmod +x ./cc/cc-test-reporter
|
27
|
+
- persist_to_workspace:
|
28
|
+
root: ~/coins_paid
|
29
|
+
paths:
|
30
|
+
- cc/cc-test-reporter
|
31
|
+
|
32
|
+
run_bundler:
|
33
|
+
<<: *defaults
|
34
|
+
steps:
|
35
|
+
- restore_cache:
|
36
|
+
key: v1-repo-{{ .Environment.CIRCLE_SHA1 }}
|
37
|
+
- restore_cache:
|
38
|
+
key: v1-bundle-{{ checksum "Gemfile" }}
|
39
|
+
- run: echo "export rvm_ignore_gemsets_flag=1" >> ~/.rvmrc
|
40
|
+
- run: sudo apt-get update && sudo apt-get install -y libsodium-dev
|
41
|
+
- run: bundle check --path=vendor/bundle || bundle install --path=vendor/bundle --jobs=4 --retry=3
|
42
|
+
- save_cache:
|
43
|
+
key: v1-bundle-{{ checksum "Gemfile" }}
|
44
|
+
paths:
|
45
|
+
- ~/coins_paid/vendor/bundle
|
46
|
+
|
47
|
+
run_rspec_tests:
|
48
|
+
<<: *defaults
|
49
|
+
docker:
|
50
|
+
- image: circleci/ruby:2.5-stretch-node
|
51
|
+
environment:
|
52
|
+
RACK_ENV: "test"
|
53
|
+
CIRCLE_ARTIFACTS: "./tmp"
|
54
|
+
steps:
|
55
|
+
- restore_cache:
|
56
|
+
key: v1-repo-{{ .Environment.CIRCLE_SHA1 }}
|
57
|
+
- restore_cache:
|
58
|
+
key: v1-bundle-{{ checksum "Gemfile" }}
|
59
|
+
- attach_workspace:
|
60
|
+
at: ~/coins_paid
|
61
|
+
- run: sudo apt-get update && sudo apt-get install -y libsodium-dev
|
62
|
+
- run: bundle check --path vendor/bundle
|
63
|
+
- run: bundle exec rspec spec
|
64
|
+
- run: ./cc/cc-test-reporter format-coverage -t simplecov -o cc/codeclimate.rspec.json tmp/coverage/.resultset.json
|
65
|
+
- persist_to_workspace:
|
66
|
+
root: ~/coins_paid
|
67
|
+
paths:
|
68
|
+
- cc/codeclimate.rspec.json
|
69
|
+
|
70
|
+
upload_cc_coverage:
|
71
|
+
<<: *defaults
|
72
|
+
steps:
|
73
|
+
- attach_workspace:
|
74
|
+
at: ~/coins_paid
|
75
|
+
- run:
|
76
|
+
name: Upload coverage results to Code Climate
|
77
|
+
command: |
|
78
|
+
./cc/cc-test-reporter upload-coverage -i cc/codeclimate.rspec.json
|
79
|
+
|
80
|
+
deploy:
|
81
|
+
<<: *defaults
|
82
|
+
steps:
|
83
|
+
- restore_cache:
|
84
|
+
key: v1-repo-{{ .Environment.CIRCLE_SHA1 }}
|
85
|
+
- restore_cache:
|
86
|
+
key: v1-bundle-{{ checksum "Gemfile" }}
|
87
|
+
- run: mkdir -p ~/.ssh && ssh-keyscan -H github.com >> ~/.ssh/known_hosts
|
88
|
+
- run: sudo apt-get update && sudo apt-get install -y libsodium-dev
|
89
|
+
- run: bundle check --path vendor/bundle
|
90
|
+
- run: bundle exec rake deploy:branch_or_label
|
91
|
+
|
92
|
+
workflows:
|
93
|
+
version: 2
|
94
|
+
build_test_deploy:
|
95
|
+
jobs:
|
96
|
+
- checkout_code
|
97
|
+
- download_cc_reporter:
|
98
|
+
requires:
|
99
|
+
- checkout_code
|
100
|
+
- run_bundler:
|
101
|
+
requires:
|
102
|
+
- download_cc_reporter
|
103
|
+
- run_rspec_tests:
|
104
|
+
requires:
|
105
|
+
- run_bundler
|
106
|
+
- upload_cc_coverage:
|
107
|
+
requires:
|
108
|
+
- run_rspec_tests
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'coins_paid_rails'
|
3
|
+
s.authors = ['Artem Biserov(artembiserov)', 'Oleg Ivanov(morhekil)']
|
4
|
+
s.version = '1.0.0'
|
5
|
+
s.files = `git ls-files`.split("\n")
|
6
|
+
s.summary = 'CoinsPaid Rails Integration'
|
7
|
+
s.license = 'MIT'
|
8
|
+
|
9
|
+
s.add_runtime_dependency 'coins_paid_api', '~> 1.0'
|
10
|
+
s.add_runtime_dependency 'activerecord', '>= 4.2.0'
|
11
|
+
s.add_runtime_dependency 'dry-initializer', '~> 3.0'
|
12
|
+
s.add_runtime_dependency 'dry-struct', '~> 1.0'
|
13
|
+
s.add_development_dependency 'rspec-rails', '~> 3.0'
|
14
|
+
end
|
15
|
+
|
data/lib/coins_paid.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'dry-struct'
|
3
|
+
require 'dry-initializer'
|
4
|
+
require_relative 'coins_paid/address'
|
5
|
+
require_relative 'coins_paid/coins_paid_address'
|
6
|
+
require_relative 'coins_paid/qr_code'
|
7
|
+
|
8
|
+
module CoinsPaid
|
9
|
+
module_function
|
10
|
+
|
11
|
+
UnknownCurrency = Class.new RuntimeError
|
12
|
+
|
13
|
+
DEFAULT_CONVERT_TO = ENV['COINS_PAID_CURRENCY']
|
14
|
+
|
15
|
+
CRYPTO_CURRENCIES = {
|
16
|
+
'BTC' => 'bitcoin',
|
17
|
+
'ETH' => 'ethereum',
|
18
|
+
'LTC' => 'litecoin'
|
19
|
+
}.freeze
|
20
|
+
|
21
|
+
def address(foreign_id, currency:)
|
22
|
+
Address.new(foreign_id: foreign_id, currency: currency, convert_to: DEFAULT_CONVERT_TO).call
|
23
|
+
end
|
24
|
+
|
25
|
+
def qr_code(player_id, currency:, label:, message:)
|
26
|
+
QrCode.new(player_id, currency: currency, label: label, message: message)
|
27
|
+
end
|
28
|
+
|
29
|
+
def currency(name)
|
30
|
+
CoinsPaid::API.currencies_list.find { |item| item.currency == name } || raise(UnknownCurrency, name)
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module CoinsPaid
|
4
|
+
class Address
|
5
|
+
module Types
|
6
|
+
include Dry.Types()
|
7
|
+
end
|
8
|
+
|
9
|
+
class Data < Dry::Struct
|
10
|
+
attribute :foreign_id, Types::Coercible::String
|
11
|
+
attribute :currency, Types::String
|
12
|
+
attribute :convert_to, Types::String
|
13
|
+
end
|
14
|
+
|
15
|
+
include Dry::Initializer.define -> do
|
16
|
+
param :request_data, Data
|
17
|
+
end
|
18
|
+
|
19
|
+
def call
|
20
|
+
CoinsPaidAddress.find_or_create_by!(request_data.attributes.slice(:foreign_id, :currency)) do |address|
|
21
|
+
response = CoinsPaid::API.take_address(request_data.attributes)
|
22
|
+
address.assign_attributes(response.attributes)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module CoinsPaid
|
4
|
+
class QrCode
|
5
|
+
include Dry::Initializer.define -> do
|
6
|
+
param :player_id
|
7
|
+
option :currency
|
8
|
+
option :label
|
9
|
+
option :message
|
10
|
+
end
|
11
|
+
|
12
|
+
def url
|
13
|
+
"#{token_type}:#{address}?label=#{encode(label)}&message=#{encode(message)}"
|
14
|
+
end
|
15
|
+
|
16
|
+
def address
|
17
|
+
@address ||= CoinsPaid.address(player_id, currency: currency).address
|
18
|
+
end
|
19
|
+
|
20
|
+
def svg
|
21
|
+
RQRCode::QRCode.new(url).as_svg(
|
22
|
+
offset: 0,
|
23
|
+
color: '000',
|
24
|
+
shape_rendering: 'crispEdges',
|
25
|
+
module_size: 3,
|
26
|
+
standalone: true
|
27
|
+
)
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def token_type
|
33
|
+
CRYPTO_CURRENCIES.fetch(currency)
|
34
|
+
end
|
35
|
+
|
36
|
+
def encode(string)
|
37
|
+
URI.encode_www_form_component(string)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module CoinsPaid
|
4
|
+
module MigrationData
|
5
|
+
module_function
|
6
|
+
|
7
|
+
def get
|
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 :address, null: false
|
13
|
+
t.string :tag
|
14
|
+
t.integer :external_id, null: false
|
15
|
+
|
16
|
+
t.timestamps
|
17
|
+
t.index [:foreign_id, :currency], unique: true
|
18
|
+
end
|
19
|
+
RUBY
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'rails/generators/active_record'
|
3
|
+
require_relative 'migration_data'
|
4
|
+
|
5
|
+
module CoinsPaid
|
6
|
+
module Generators
|
7
|
+
class MigrationGenerator < ActiveRecord::Generators::Base
|
8
|
+
argument :name, default: 'create_coins_paid_addresses'
|
9
|
+
source_root File.expand_path("templates", __dir__)
|
10
|
+
|
11
|
+
def copy_coins_paid_migration
|
12
|
+
migration_template 'migration.rb', "#{db_migrate_path}/#{file_name}.rb"
|
13
|
+
end
|
14
|
+
|
15
|
+
def migration_data
|
16
|
+
CoinsPaid::MigrationData.get
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
describe CoinsPaid, '.address' do
|
4
|
+
let(:foreign_key) { 'user-id:2048' }
|
5
|
+
let(:currency) { 'BTC' }
|
6
|
+
let(:full_address_attributes) do
|
7
|
+
{
|
8
|
+
foreign_id: foreign_key,
|
9
|
+
currency: currency
|
10
|
+
}.merge(address_attributes)
|
11
|
+
end
|
12
|
+
let(:address_attributes) do
|
13
|
+
{
|
14
|
+
external_id: 1,
|
15
|
+
address: '12983h13ro1hrt24it432t',
|
16
|
+
tag: 'tag-123',
|
17
|
+
}
|
18
|
+
end
|
19
|
+
subject(:take_address) { described_class.address(foreign_key, currency: currency) }
|
20
|
+
|
21
|
+
context 'when there is existing record' do
|
22
|
+
let!(:address) do
|
23
|
+
CoinsPaid::CoinsPaidAddress.create!(full_address_attributes)
|
24
|
+
end
|
25
|
+
|
26
|
+
before do
|
27
|
+
allow(CoinsPaid::API).to receive(:take_address)
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'returns existing record' do
|
31
|
+
expect(take_address).to eq address
|
32
|
+
|
33
|
+
expect(CoinsPaid::API).not_to have_received(:take_address)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'when coins paid api responds with error' do
|
38
|
+
before do
|
39
|
+
allow(CoinsPaid::API).to receive(:take_address).and_raise(CoinsPaid::API::Error)
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'raises error' do
|
43
|
+
expect { take_address }.to raise_error(CoinsPaid::API::Error)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'when coins paid return valid response' do
|
48
|
+
before do
|
49
|
+
allow(CoinsPaid::API).to receive(:take_address).and_return(CoinsPaid::API::TakeAddress::Response.new(address_attributes))
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'creates new address' do
|
53
|
+
expect(take_address).to have_attributes(full_address_attributes)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
describe CoinsPaid, '.currency' do
|
4
|
+
let(:eth) { instance_double(CoinsPaid::API::Currency, currency: 'ETH') }
|
5
|
+
|
6
|
+
subject(:currency) { described_class.currency(eth.currency) }
|
7
|
+
|
8
|
+
context 'when CoinsPaid API responds correctly' do
|
9
|
+
before do
|
10
|
+
allow(CoinsPaid::API).to receive(:currencies_list) { currencies }
|
11
|
+
end
|
12
|
+
|
13
|
+
context 'and currency exists at CoinsPaid' do
|
14
|
+
let(:currencies) do
|
15
|
+
[eth, instance_double(CoinsPaid::API::Currency, currency: 'm' + eth.currency)]
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'returns requested currency details' do
|
19
|
+
expect(currency).to eq eth
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'and currency does not exist at CoinsPaid' do
|
24
|
+
let(:currencies) do
|
25
|
+
[instance_double(CoinsPaid::API::Currency, currency: 'm' + eth.currency)]
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'errors' do
|
29
|
+
expect { currency }.to raise_error(CoinsPaid::UnknownCurrency)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'when coins paid api errors' do
|
35
|
+
before do
|
36
|
+
allow(CoinsPaid::API).to receive(:currencies_list).and_raise(CoinsPaid::API::Error)
|
37
|
+
end
|
38
|
+
|
39
|
+
it 're-raises error' do
|
40
|
+
expect { currency }.to raise_error(CoinsPaid::API::Error)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
describe CoinsPaid, '.qr_code' do
|
4
|
+
let(:foreign_id) { 123 }
|
5
|
+
let(:coins_paid_address) do
|
6
|
+
instance_double CoinsPaid::CoinsPaidAddress,
|
7
|
+
currency: 'BTC',
|
8
|
+
address: 'abc123'
|
9
|
+
end
|
10
|
+
subject(:qr_code) do
|
11
|
+
described_class.qr_code(
|
12
|
+
foreign_id,
|
13
|
+
currency: 'BTC',
|
14
|
+
label: 'RedStar deposit',
|
15
|
+
message: 'Make a deposit to RedStar'
|
16
|
+
)
|
17
|
+
end
|
18
|
+
|
19
|
+
before do
|
20
|
+
allow(CoinsPaid).to receive(:address).with(foreign_id, currency: 'BTC').and_return(coins_paid_address)
|
21
|
+
end
|
22
|
+
|
23
|
+
describe '#payment_url' do
|
24
|
+
its(:url) { is_expected.to eq 'bitcoin:abc123?label=RedStar+deposit&message=Make+a+deposit+to+RedStar' }
|
25
|
+
end
|
26
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
ENV['COINS_PAID_CURRENCY'] = 'EUR'
|
2
|
+
|
3
|
+
if ENV['CIRCLE_ARTIFACTS']
|
4
|
+
require 'simplecov'
|
5
|
+
SimpleCov.start
|
6
|
+
end
|
7
|
+
|
8
|
+
require 'active_record'
|
9
|
+
require "active_record/railtie"
|
10
|
+
require 'rspec/rails'
|
11
|
+
require 'rspec/its'
|
12
|
+
|
13
|
+
require 'coins_paid_api'
|
14
|
+
require 'coins_paid_rails'
|
15
|
+
|
16
|
+
Dir['./spec/support/**/*.rb'].each { |f| require f }
|
17
|
+
|
18
|
+
ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: 'spec/test.db')
|
19
|
+
|
20
|
+
RSpec.configure do |config|
|
21
|
+
config.use_transactional_fixtures = true
|
22
|
+
|
23
|
+
config.before :suite do
|
24
|
+
CreateTable.migrate(:up)
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require_relative '../../../lib/generators/coins_paid/migration_data'
|
3
|
+
|
4
|
+
class CreateTable < ActiveRecord::Migration[ActiveRecord::Migration.current_version]
|
5
|
+
def up
|
6
|
+
drop_table :coins_paid_addresses if table_exists?(:coins_paid_addresses)
|
7
|
+
|
8
|
+
migration_data
|
9
|
+
end
|
10
|
+
|
11
|
+
def migration_data
|
12
|
+
instance_eval CoinsPaid::MigrationData.get
|
13
|
+
end
|
14
|
+
end
|
metadata
ADDED
@@ -0,0 +1,132 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: coins_paid_rails
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Artem Biserov(artembiserov)
|
8
|
+
- Oleg Ivanov(morhekil)
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2019-11-20 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: coins_paid_api
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '1.0'
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - "~>"
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '1.0'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: activerecord
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: 4.2.0
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: 4.2.0
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: dry-initializer
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - "~>"
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '3.0'
|
49
|
+
type: :runtime
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - "~>"
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '3.0'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: dry-struct
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - "~>"
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '1.0'
|
63
|
+
type: :runtime
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '1.0'
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: rspec-rails
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - "~>"
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '3.0'
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - "~>"
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '3.0'
|
84
|
+
description:
|
85
|
+
email:
|
86
|
+
executables: []
|
87
|
+
extensions: []
|
88
|
+
extra_rdoc_files: []
|
89
|
+
files:
|
90
|
+
- ".circleci/config.yml"
|
91
|
+
- ".gitignore"
|
92
|
+
- ".rspec"
|
93
|
+
- Gemfile
|
94
|
+
- coins_paid_rails.gemspec
|
95
|
+
- lib/coins_paid.rb
|
96
|
+
- lib/coins_paid/address.rb
|
97
|
+
- lib/coins_paid/coins_paid_address.rb
|
98
|
+
- lib/coins_paid/qr_code.rb
|
99
|
+
- lib/coins_paid_rails.rb
|
100
|
+
- lib/generators/coins_paid/migration_data.rb
|
101
|
+
- lib/generators/coins_paid/migration_generator.rb
|
102
|
+
- lib/generators/coins_paid/templates/migration.rb
|
103
|
+
- spec/address_spec.rb
|
104
|
+
- spec/currency_spec.rb
|
105
|
+
- spec/qr_code_spec.rb
|
106
|
+
- spec/spec_helper.rb
|
107
|
+
- spec/support/database/create_table.rb
|
108
|
+
homepage:
|
109
|
+
licenses:
|
110
|
+
- MIT
|
111
|
+
metadata: {}
|
112
|
+
post_install_message:
|
113
|
+
rdoc_options: []
|
114
|
+
require_paths:
|
115
|
+
- lib
|
116
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
117
|
+
requirements:
|
118
|
+
- - ">="
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: '0'
|
121
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - ">="
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
requirements: []
|
127
|
+
rubyforge_project:
|
128
|
+
rubygems_version: 2.7.6
|
129
|
+
signing_key:
|
130
|
+
specification_version: 4
|
131
|
+
summary: CoinsPaid Rails Integration
|
132
|
+
test_files: []
|