nexus_core 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d397d4a83206b0252f4a7a4f3091e3917a9ec952
4
+ data.tar.gz: 281c0120b3d8960ac303185b6788533cce3038b3
5
+ SHA512:
6
+ metadata.gz: afbdaebfcb5a24c6cc732982065fa9eb818f92ffbff8999c9dc4dc143e069b1603dcd7f3b3cf48bf4c48edf2074265adbbb5be40a7774838c951737b5539f142
7
+ data.tar.gz: b853e48b49862d9ea047f0ff691f425059052e8602402ac3e34f49726fefd6abb6c9c5879f69e288668c9f2c13f82c3c1c89d738559e8cc790fdd9b483293f03
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2016 Felix Tioh
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,28 @@
1
+ # NexusCore
2
+ Short description and motivation.
3
+
4
+ ## Usage
5
+ How to use my plugin.
6
+
7
+ ## Installation
8
+ Add this line to your application's Gemfile:
9
+
10
+ ```ruby
11
+ gem 'nexus_core'
12
+ ```
13
+
14
+ And then execute:
15
+ ```bash
16
+ $ bundle
17
+ ```
18
+
19
+ Or install it yourself as:
20
+ ```bash
21
+ $ gem install nexus_core
22
+ ```
23
+
24
+ ## Contributing
25
+ Contribution directions go here.
26
+
27
+ ## License
28
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,34 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'NexusCore'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.md')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+
18
+
19
+
20
+
21
+
22
+ require 'bundler/gem_tasks'
23
+
24
+ require 'rake/testtask'
25
+
26
+ Rake::TestTask.new(:test) do |t|
27
+ t.libs << 'lib'
28
+ t.libs << 'test'
29
+ t.pattern = 'test/**/*_test.rb'
30
+ t.verbose = false
31
+ end
32
+
33
+
34
+ task default: :test
@@ -0,0 +1,30 @@
1
+ module InvestorAccountAccessor
2
+ def self.included(base)
3
+ base.class_eval do
4
+ belongs_to :member
5
+ has_many :bank_accounts, dependent: :destroy
6
+ has_many :wallets, dependent: :destroy
7
+ end
8
+ end
9
+
10
+ def investments
11
+ wallet_ids = wallets.pluck(:id)
12
+ investment_klass.where(wallet_id: wallet_ids)
13
+ end
14
+
15
+ def account_id
16
+ '#' + id.to_s.rjust(6, '0')
17
+ end
18
+
19
+ def long_account_id
20
+ 'U' + id.to_s.rjust(6, '0')
21
+ end
22
+
23
+ def approved?
24
+ approval_status == STATUS_APPROVED
25
+ end
26
+
27
+ def pending?
28
+ approval_status == STATUS_PENDING_VERIFICATION
29
+ end
30
+ end
@@ -0,0 +1,11 @@
1
+ module JournalEntryAccessor
2
+ def self.included(base)
3
+ base.class_eval do
4
+ belongs_to :wallet
5
+ belongs_to :top_up
6
+ belongs_to :withdrawal
7
+ has_one :currency, through: :wallet
8
+ delegate :investor, to: :wallet
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,28 @@
1
+ module MemberAccessor
2
+ def self.included(base)
3
+ base.class_eval do
4
+ has_many :identities, dependent: :destroy, primary_key: :email, foreign_key: :email
5
+ has_one :member_profile, dependent: :destroy
6
+ has_one :investor_account, dependent: :destroy
7
+ alias_method :investor, :investor_account
8
+ has_one :preference, dependent: :destroy
9
+ has_many :session_analytics, dependent: :destroy
10
+ end
11
+ end
12
+
13
+ def age
14
+ TimeDifference.between(date_of_birth, Date.today).in_years.to_i if date_of_birth.present?
15
+ end
16
+
17
+ def investments
18
+ investor_account && investor_account.investments
19
+ end
20
+
21
+ def is_investor?
22
+ investor.present? and investor.approval_status != ::InvestorConstants::STATUS_NON_INVESTOR
23
+ end
24
+
25
+ def is_approved_investor?
26
+ is_investor? && investor.approval_status == ::InvestorConstants::STATUS_APPROVED
27
+ end
28
+ end
@@ -0,0 +1,9 @@
1
+ module TopUpAccessor
2
+ def self.included(base)
3
+ base.class_eval do
4
+ belongs_to :wallet
5
+ has_one :currency, through: :wallet
6
+ belongs_to :channel, class_name: 'PaymentChannelByCurrency'
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,18 @@
1
+ module WalletAccessor
2
+ def self.included(base)
3
+ base.class_eval do
4
+ belongs_to :bank_account
5
+ belongs_to :investor_account
6
+ alias_method :investor, :investor_account
7
+ belongs_to :currency
8
+ has_many :top_ups, dependent: :destroy
9
+ has_many :withdrawals, dependent: :destroy
10
+ has_many :journal_entries, dependent: :destroy
11
+ has_many :investments, dependent: :destroy, class_name: investment_klass.to_s
12
+
13
+ scope :idr, ->{ joins(:currency).where('currencies.code' => 'IDR') }
14
+ scope :sgd, ->{ joins(:currency).where('currencies.code' => 'SGD') }
15
+ scope :myr, ->{ joins(:currency).where('currencies.code' => 'MYR') }
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,9 @@
1
+ module WithdrawalAccessor
2
+ def self.included(base)
3
+ base.class_eval do
4
+ belongs_to :wallet
5
+ has_one :currency, through: :wallet
6
+ delegate :investor, :investor_account, to: :wallet
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ module InvestorConstants
2
+ TIER_ACCREDITED = 'accredited'
3
+ TIER_INSTITUTIONAL = 'institutional'
4
+ TIER_SOPHISTICATED = 'sophisticated'
5
+ TIER_ANGEL = 'angel'
6
+ TIER_RETAIL = 'retail'
7
+
8
+ STATUS_NON_INVESTOR = 'non_investor'
9
+ STATUS_PENDING_VERIFICATION = 'pending_verification'
10
+ STATUS_SCREENED = 'screened'
11
+ STATUS_APPROVED = 'approved'
12
+ STATUS_DECLINED = 'declined'
13
+ end
@@ -0,0 +1,9 @@
1
+ module JournalConstants
2
+ TOP_UP = 'top up'
3
+ WITHDRAWAL = 'withdrawal'
4
+ REPAYMENT_INTEREST = 'repayment interest'
5
+ REPAYMENT_PRINCIPAL = 'repayment principal'
6
+ RECOVERED_INTEREST = 'recovered interest'
7
+ RECOVERED_PRINCIPAL = 'recovered principal'
8
+ INVESTMENT = 'investment'
9
+ end
@@ -0,0 +1,4 @@
1
+ module Origin
2
+ ECF = 'ECF'
3
+ P2P = 'P2P'
4
+ end
@@ -0,0 +1,5 @@
1
+ module TopUpConstants
2
+ STATUS_PENDING = 'pending'
3
+ STATUS_CONFIRMED = 'confirmed'
4
+ STATUS_CANCELLED = 'cancelled'
5
+ end
@@ -0,0 +1,5 @@
1
+ module WithdrawalConstants
2
+ STATUS_PENDING = 'pending'
3
+ STATUS_CONFIRMED = 'confirmed'
4
+ STATUS_CANCELLED = 'cancelled'
5
+ end
@@ -0,0 +1,24 @@
1
+ module InvestorAccountDelegation
2
+ module Instance
3
+ def method_missing(method_sym, *args)
4
+ return member.send(method_sym, *args) if member.respond_to?(method_sym)
5
+ super
6
+ end
7
+ end
8
+
9
+ module Klass
10
+ def method_missing(method_sym, *args)
11
+ scope = method_sym.to_s.upcase
12
+ if InvestorConstants.constants.include?(scope.to_sym)
13
+ scope_value = const_get scope
14
+ if scope.split(/_/)[0] == 'TIER'
15
+ return where(investor_tier: scope_value)
16
+ end
17
+ if scope.split(/_/)[0] == 'STATUS'
18
+ return where(approval_status: scope_value)
19
+ end
20
+ end
21
+ super
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,16 @@
1
+ module MemberDelegation
2
+ module Instance
3
+ def method_missing(method_sym, *args)
4
+ if investor_account.respond_to?(method_sym)
5
+ return investor_account.send(method_sym, *args)
6
+ end
7
+ if preference.respond_to?(method_sym)
8
+ return preference.send(method_sym, *args)
9
+ end
10
+ if member_profile.respond_to?(method_sym)
11
+ return member_profile.send(method_sym, *args)
12
+ end
13
+ super
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,14 @@
1
+ module TopUpDelegation
2
+ module Klass
3
+ def method_missing(method_sym, *args)
4
+ scope = method_sym.to_s.upcase
5
+ if TopUpConstants.constants.include?(scope.to_sym)
6
+ scope_value = const_get scope
7
+ if scope.split(/_/)[0] == 'STATUS'
8
+ return where(status: scope_value)
9
+ end
10
+ end
11
+ super
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module WithdrawalDelegation
2
+ module Klass
3
+ def method_missing(method_sym, *args)
4
+ scope = method_sym.to_s.upcase
5
+ if WithdrawalConstants.constants.include?(scope.to_sym)
6
+ scope_value = const_get scope
7
+ if scope.split(/_/)[0] == 'STATUS'
8
+ return where(status: scope_value)
9
+ end
10
+ end
11
+ super
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,12 @@
1
+ class InvestorAccountLifecycle
2
+ module StateMachineTransitionMixin
3
+ def callback_submission
4
+ end
5
+
6
+ def callback_application_approved
7
+ end
8
+
9
+ def callback_application_declined
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,41 @@
1
+ class MemberLifecycle
2
+ def self.after_create(member)
3
+ Triggers.send_welcome_email(member)
4
+ Triggers.construct_member(member)
5
+ end
6
+
7
+ def self.after_save(member)
8
+ Triggers.record_country_for_reporting(member)
9
+ end
10
+
11
+ class Triggers
12
+ def self.send_welcome_email(member)
13
+
14
+ end
15
+
16
+ def self.construct_member(member)
17
+ investor = member.create_investor_account!
18
+ bank_account = investor.bank_accounts.create!
19
+ investor.wallets.create! bank_account: bank_account,
20
+ currency: Currency.idr
21
+ investor.wallets.create! bank_account: bank_account,
22
+ currency: Currency.sgd
23
+ investor.wallets.create! bank_account: bank_account,
24
+ currency: Currency.myr
25
+ member.create_member_profile!
26
+ member.create_preference!
27
+ end
28
+
29
+ def self.record_country_for_reporting(member)
30
+ country = NexusCore::ReportUtils.decode_ip member.last_login_from_ip_address
31
+ if Country[country].present?
32
+ country = Country[country].name
33
+ end
34
+ member.update_column :session_country, country
35
+ end
36
+ end
37
+
38
+ module StateMachineTransitionMixin
39
+ # not used
40
+ end
41
+ end
@@ -0,0 +1,21 @@
1
+ class TopUpLifecycle
2
+ def self.after_create(top_up)
3
+ Triggers.notify_admin(top_up)
4
+ end
5
+
6
+ class Triggers
7
+ def self.notify_admin(top_up)
8
+
9
+ end
10
+ end
11
+
12
+ module StateMachineTransitionMixin
13
+ def save_journal_entry
14
+
15
+ end
16
+
17
+ def send_confirmation_email
18
+
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ class WithdrawalLifecycle
2
+ def self.after_create(withdrawal)
3
+ Triggers.notify_admin(withdrawal)
4
+ end
5
+
6
+ class Triggers
7
+ def self.notify_admin(withdrawal)
8
+
9
+ end
10
+ end
11
+
12
+ module StateMachineTransitionMixin
13
+ def save_journal_entry
14
+
15
+ end
16
+
17
+ def send_confirmation_email
18
+
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,34 @@
1
+ module InvestorAccountStateMachine
2
+ def self.included(base)
3
+ base.include InvestorAccountLifecycle::StateMachineTransitionMixin
4
+ base.class_eval do
5
+ state_machine :approval_status, initial: :non_investor do
6
+ audit_trail class: base.investor_state_transition_klass
7
+ event :application_submitted do
8
+ transition :non_investor => :pending_verification
9
+ end
10
+
11
+ event :application_resubmitted do
12
+ transition :declined => :pending_verification
13
+ end
14
+
15
+ event :application_screened do
16
+ transition :pending_verification => :screened
17
+ end
18
+
19
+ event :application_approved do
20
+ transition :screened => :approved
21
+ end
22
+
23
+ event :application_declined do
24
+ transition [:pending_verification, :screened] => :declined
25
+ end
26
+
27
+ after_transition on: :application_submitted, do: :callback_submission
28
+ after_transition on: [:application_submitted, :application_resubmitted], do: :callback_submission
29
+ after_transition on: :application_approved, do: :callback_application_approved
30
+ after_transition on: :application_declined, do: :callback_application_declined
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,17 @@
1
+ module TopUpStateMachine
2
+ def self.included(base)
3
+ base.include TopUpLifecycle::StateMachineTransitionMixin
4
+ base.class_eval do
5
+ state_machine :status, initial: :pending do
6
+ event :confirm do
7
+ transition [:pending, :cancelled] => :confirmed
8
+ end
9
+
10
+ event :cancel do
11
+ transition [:pending] => :cancelled
12
+ end
13
+ after_transition on: :confirm, do: [:save_journal_entry, :send_confirmation_email]
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ module WithdrawalStateMachine
2
+ def self.included(base)
3
+ base.include WithdrawalLifecycle::StateMachineTransitionMixin
4
+ base.class_eval do
5
+ state_machine :status, initial: :pending do
6
+ event :confirm do
7
+ transition [:pending, :cancelled] => :confirmed
8
+ end
9
+
10
+ event :cancel do
11
+ transition [:pending] => :cancelled
12
+ end
13
+ after_transition on: :confirm, do: [:save_journal_entry, :send_confirmation_email]
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,4 @@
1
+ module NexusCore
2
+ class Engine < ::Rails::Engine
3
+ end
4
+ end
@@ -0,0 +1,67 @@
1
+ module NexusCore
2
+ module ReportUtils
3
+ module DateDefinition
4
+ def this_week
5
+ Date.today.strftime('%Y%W')
6
+ end
7
+
8
+ def last_week
9
+ Date.today.last_week.strftime('%Y%W')
10
+ end
11
+
12
+ def end_of_last_week
13
+ Date.today.last_week.end_of_week
14
+ end
15
+
16
+ def end_of_last_month
17
+ Date.today.last_month.end_of_month
18
+ end
19
+
20
+ def starting_last_month
21
+ Date.today.last_month.beginning_of_month
22
+ end
23
+ end
24
+ extend DateDefinition
25
+
26
+ module PeriodDefinition
27
+ def last_week_period
28
+ full_weeks_in_period(Date.today.last_week, Date.today)
29
+ end
30
+
31
+ def last_month_period
32
+ full_weeks_in_period(Date.today.last_month, Date.today)
33
+ end
34
+
35
+ def full_weeks_in_period(start, till)
36
+ start = Date.today.last_week.beginning_of_week if start.blank?
37
+ till = Date.today.last_week.end_of_week if till.blank?
38
+ start = [Date.today.last_week.beginning_of_week, start.beginning_of_week].min
39
+ till = [Date.today.last_week.end_of_week, till.end_of_week].min
40
+ [start, till].sort {|a,b| a <=> b}
41
+ end
42
+ end
43
+ extend PeriodDefinition
44
+
45
+ module PercentageHelper
46
+ def to_percentage(num)
47
+ "#{to_percentage_number(num)}%"
48
+ end
49
+
50
+ def to_percentage_number(num)
51
+ (num * 100).round(2)
52
+ end
53
+ end
54
+ extend PercentageHelper
55
+
56
+ def self.decode_ip(ip_addr)
57
+ g = GeoIP.new(File.join(Gem.datadir('nexus_core'), 'GeoIP.dat'))
58
+ begin
59
+ country = g.country(ip_addr).country_name
60
+ rescue
61
+ country = 'N/A'
62
+ puts "Unable to Reverse Geocode: '#{ip_addr}'"
63
+ end
64
+ return country
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,3 @@
1
+ module NexusCore
2
+ VERSION = '0.5.0'
3
+ end
data/lib/nexus_core.rb ADDED
@@ -0,0 +1,5 @@
1
+ require 'nexus_core/engine'
2
+ require 'nexus_core/report_utils'
3
+
4
+ module NexusCore
5
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :nexus_core do
3
+ # # Task goes here
4
+ # end
metadata ADDED
@@ -0,0 +1,142 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nexus_core
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.0
5
+ platform: ruby
6
+ authors:
7
+ - Felix Tioh
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-11-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 4.0.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 4.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: time_difference
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.4.2
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.4.2
41
+ - !ruby/object:Gem::Dependency
42
+ name: countries
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.2'
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: 1.2.5
51
+ type: :runtime
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - "~>"
56
+ - !ruby/object:Gem::Version
57
+ version: '1.2'
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 1.2.5
61
+ - !ruby/object:Gem::Dependency
62
+ name: geoip
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '1.6'
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: 1.6.2
71
+ type: :runtime
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - "~>"
76
+ - !ruby/object:Gem::Version
77
+ version: '1.6'
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: 1.6.2
81
+ description: ''
82
+ email:
83
+ - felixsagitta@gmail.com
84
+ executables: []
85
+ extensions: []
86
+ extra_rdoc_files: []
87
+ files:
88
+ - MIT-LICENSE
89
+ - README.md
90
+ - Rakefile
91
+ - app/accessors/investor_account_accessor.rb
92
+ - app/accessors/journal_entry_accessor.rb
93
+ - app/accessors/member_accessor.rb
94
+ - app/accessors/top_up_accessor.rb
95
+ - app/accessors/wallet_accessor.rb
96
+ - app/accessors/withdrawal_accessor.rb
97
+ - app/constants/investor_constants.rb
98
+ - app/constants/journal_constants.rb
99
+ - app/constants/origin.rb
100
+ - app/constants/top_up_constants.rb
101
+ - app/constants/withdrawal_constants.rb
102
+ - app/delegations/investor_account_delegation.rb
103
+ - app/delegations/member_delegation.rb
104
+ - app/delegations/top_up_delegation.rb
105
+ - app/delegations/withdrawal_delegation.rb
106
+ - app/lifecycle/investor_account_lifecycle.rb
107
+ - app/lifecycle/member_lifecycle.rb
108
+ - app/lifecycle/top_up_lifecycle.rb
109
+ - app/lifecycle/withdrawal_lifecycle.rb
110
+ - app/state_machines/investor_account_state_machine.rb
111
+ - app/state_machines/top_up_state_machine.rb
112
+ - app/state_machines/withdrawal_state_machine.rb
113
+ - lib/nexus_core.rb
114
+ - lib/nexus_core/engine.rb
115
+ - lib/nexus_core/report_utils.rb
116
+ - lib/nexus_core/version.rb
117
+ - lib/tasks/nexus_core_tasks.rake
118
+ homepage: https://www.crowdo.com
119
+ licenses:
120
+ - MIT
121
+ metadata: {}
122
+ post_install_message:
123
+ rdoc_options: []
124
+ require_paths:
125
+ - lib
126
+ required_ruby_version: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ required_rubygems_version: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - ">="
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ requirements: []
137
+ rubyforge_project:
138
+ rubygems_version: 2.6.7
139
+ signing_key:
140
+ specification_version: 4
141
+ summary: Provides Domain Layer for Nexus/P2P/ECF
142
+ test_files: []