nexus_core 0.5.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 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: []