ish_models 3.1.0.4 → 3.1.0.6
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/lib/ish_models.rb +11 -0
- data/lib/wco/leadset.rb +24 -0
- data/lib/wco/profile.rb +5 -0
- data/lib/wco/tag.rb +1 -0
- data/lib/wco_email/ability.rb-trash +43 -0
- data/lib/wco_email/conversation.rb +49 -0
- data/lib/wco_email/message_template.rb +6 -0
- data/lib/wco_email/tag.rb-trash +15 -0
- data/lib/wco_hosting/appliance.rb +48 -0
- data/lib/wco_hosting/appliance_tmpl.rb +57 -0
- data/lib/wco_hosting/domain.rb +24 -0
- data/lib/wco_hosting/serverhost.rb +140 -0
- metadata +39 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 79b866df45b1f836996eae873bb73bdad131d78fc60d35e1dbf09918792dc73c
|
4
|
+
data.tar.gz: 1a094e1696284dd4c74dcca8b2e8abd5d1abfe3722e7a20d3d69b5e593a48494
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d7472f45bceb194872bd369b0dd6c5fd1c29ceb35a6d8dbeaccd99bd5c0c0ad59847bef1b79f29ac20abe790c00925cf0fe77dca1a118b892ec9ebdc416cf876
|
7
|
+
data.tar.gz: 4702a3f0c1a8962f7ebbf9a2a6d7a4fbdf4a64339dd5092a88edf4523a552c87bc9caa672b727f6feae7a791adb7baa19981bcda0c47e2798e1395ef98a559ca
|
data/lib/ish_models.rb
CHANGED
@@ -5,8 +5,19 @@ require "ish_models/engine"
|
|
5
5
|
|
6
6
|
module IshModels; end
|
7
7
|
module Wco; end
|
8
|
+
module WcoEmail; end
|
9
|
+
module WcoHosting; end
|
8
10
|
|
11
|
+
require 'wco/leadset'
|
9
12
|
require 'wco/profile'
|
10
13
|
require 'wco/tag'
|
11
14
|
|
15
|
+
require 'wco_email/conversation'
|
16
|
+
require 'wco_email/message_template'
|
17
|
+
|
18
|
+
require 'wco_hosting/appliance'
|
19
|
+
require 'wco_hosting/appliance_tmpl'
|
20
|
+
require 'wco_hosting/domain'
|
21
|
+
require 'wco_hosting/serverhost'
|
22
|
+
|
12
23
|
|
data/lib/wco/leadset.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
|
2
|
+
class Wco::Leadset
|
3
|
+
include Mongoid::Document
|
4
|
+
include Mongoid::Timestamps
|
5
|
+
store_in collection: 'wco_leadsets'
|
6
|
+
|
7
|
+
field :company_url
|
8
|
+
def domain; company_url; end
|
9
|
+
validates :company_url, presence: true, uniqueness: true
|
10
|
+
index({ company_url: 1 }, { name: 'company_url' })
|
11
|
+
|
12
|
+
field :email
|
13
|
+
index({ email: 1 }, { name: 'email' })
|
14
|
+
validates :email, presence: true, uniqueness: true
|
15
|
+
|
16
|
+
has_many :profiles, class_name: 'Wco::Profile', inverse_of: :leadset
|
17
|
+
has_many :appliances, class_name: 'WcoHosting::Appliance', inverse_of: :leadset
|
18
|
+
|
19
|
+
has_many :serverhosts, class_name: 'WcoHosting::Serverhost', inverse_of: :leadset
|
20
|
+
def next_serverhost
|
21
|
+
serverhosts.first
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
data/lib/wco/profile.rb
CHANGED
@@ -2,9 +2,14 @@
|
|
2
2
|
class Wco::Profile
|
3
3
|
include Mongoid::Document
|
4
4
|
include Mongoid::Timestamps
|
5
|
+
store_in collection: 'ish_user_profiles'
|
5
6
|
|
6
7
|
field :email
|
8
|
+
index({ email: 1 }, { name: 'email' })
|
9
|
+
validates :email, presence: true, uniqueness: true
|
7
10
|
|
8
11
|
field :per_page, type: :integer, default: 25
|
9
12
|
|
13
|
+
belongs_to :leadset, class_name: 'Wco::Leadset', inverse_of: :profile, optional: true
|
14
|
+
|
10
15
|
end
|
data/lib/wco/tag.rb
CHANGED
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'cancancan'
|
4
|
+
|
5
|
+
class WcoEmail::Ability
|
6
|
+
include ::CanCan::Ability
|
7
|
+
|
8
|
+
def initialize(user)
|
9
|
+
|
10
|
+
if user
|
11
|
+
|
12
|
+
if [ 'piousbox@gmail.com', 'victor@piousbox.com', 'victor@wasya.co' ].include? user.email
|
13
|
+
can :manage, :all
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
# Define abilities for the user here. For example:
|
19
|
+
#
|
20
|
+
# return unless user.present?
|
21
|
+
# can :read, :all
|
22
|
+
# return unless user.admin?
|
23
|
+
# can :manage, :all
|
24
|
+
#
|
25
|
+
# The first argument to `can` is the action you are giving the user
|
26
|
+
# permission to do.
|
27
|
+
# If you pass :manage it will apply to every action. Other common actions
|
28
|
+
# here are :read, :create, :update and :destroy.
|
29
|
+
#
|
30
|
+
# The second argument is the resource the user can perform the action on.
|
31
|
+
# If you pass :all it will apply to every resource. Otherwise pass a Ruby
|
32
|
+
# class of the resource.
|
33
|
+
#
|
34
|
+
# The third argument is an optional hash of conditions to further filter the
|
35
|
+
# objects.
|
36
|
+
# For example, here the user can only update published articles.
|
37
|
+
#
|
38
|
+
# can :update, Article, published: true
|
39
|
+
#
|
40
|
+
# See the wiki for details:
|
41
|
+
# https://github.com/CanCanCommunity/cancancan/blob/develop/docs/define_check_abilities.md
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
|
2
|
+
class WcoEmail::Conversation
|
3
|
+
include Mongoid::Document
|
4
|
+
include Mongoid::Timestamps
|
5
|
+
# include Mongoid::Paranoia
|
6
|
+
|
7
|
+
store_in collection: 'office_email_conversations'
|
8
|
+
|
9
|
+
STATE_UNREAD = 'state_unread'
|
10
|
+
STATE_READ = 'state_read'
|
11
|
+
STATES = [ STATE_UNREAD, STATE_READ ]
|
12
|
+
field :state
|
13
|
+
|
14
|
+
field :subject
|
15
|
+
index({ subject: -1 })
|
16
|
+
|
17
|
+
field :latest_at
|
18
|
+
index({ latest_at: -1 })
|
19
|
+
|
20
|
+
field :from_emails, type: :array, default: []
|
21
|
+
index({ from_emails: -1 })
|
22
|
+
|
23
|
+
field :preview, default: ''
|
24
|
+
|
25
|
+
# has_many :lead_ties, class_name: 'Office::EmailConversationLead'
|
26
|
+
# def lead_ids
|
27
|
+
# email_conversation_leads.map( &:lead_id )
|
28
|
+
# end
|
29
|
+
# field :lead_ids, type: :array, default: []
|
30
|
+
def leads
|
31
|
+
Lead.find( lead_ties.map( &:lead_id ) )
|
32
|
+
end
|
33
|
+
|
34
|
+
# has_many :email_messages, class_name: 'Office::EmailMessage'
|
35
|
+
# has_many :email_conversation_tags, class_name: 'Office::EmailConversationTag'
|
36
|
+
|
37
|
+
# has_and_belongs_to_many :tags, class_name: 'WcoEmail::Tag'
|
38
|
+
|
39
|
+
## @TODO: test, rspec
|
40
|
+
def self.in_tag tag
|
41
|
+
case tag.class
|
42
|
+
when String
|
43
|
+
tag = WcoEmail::Tag.find_by slug: tag
|
44
|
+
end
|
45
|
+
where( :tag_ids => tag.id )
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
Conv = WcoEmail::Conversation
|
@@ -0,0 +1,15 @@
|
|
1
|
+
|
2
|
+
class WcoEmail::Tag
|
3
|
+
include Mongoid::Document
|
4
|
+
include Mongoid::Timestamps
|
5
|
+
|
6
|
+
field :slug
|
7
|
+
# index
|
8
|
+
# validate presence
|
9
|
+
# validate uniqueness ?
|
10
|
+
|
11
|
+
# parent-child
|
12
|
+
|
13
|
+
has_and_belongs_to_many :email_conversations, class_name: 'Wco::EmailConversation'
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
|
2
|
+
class WcoHosting::Appliance
|
3
|
+
include Mongoid::Document
|
4
|
+
include Mongoid::Timestamps
|
5
|
+
store_in collection: 'wco_appliances'
|
6
|
+
|
7
|
+
field :name
|
8
|
+
validates :name, uniqueness: { scope: :leadset }, presence: true
|
9
|
+
before_validation :set_name, on: :create, unless: ->{ name }
|
10
|
+
def set_name
|
11
|
+
name = "#{Time.now.strftime('%Y%m%d')}-#{(0...8).map { (65 + rand(26)).chr }.join}"
|
12
|
+
end
|
13
|
+
|
14
|
+
belongs_to :leadset, class_name: 'Wco::Leadset', inverse_of: :appliances
|
15
|
+
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
field :kind
|
20
|
+
|
21
|
+
field :service_name
|
22
|
+
field :environment
|
23
|
+
|
24
|
+
field :subdomain
|
25
|
+
field :domain
|
26
|
+
def host
|
27
|
+
"#{subdomain}.#{domain}"
|
28
|
+
end
|
29
|
+
|
30
|
+
belongs_to :appliance_tmpl, class_name: 'Wco::ApplianceTmpl'
|
31
|
+
def tmpl
|
32
|
+
appliance_tmpl
|
33
|
+
end
|
34
|
+
|
35
|
+
belongs_to :serverhost, class_name: 'Wco::Serverhost'
|
36
|
+
belongs_to :wco_leadset, class_name: 'Wco::Leadset', inverse_of: :appliances
|
37
|
+
|
38
|
+
# field :ip
|
39
|
+
field :port
|
40
|
+
|
41
|
+
STATE_PENDING = 'state-pending'
|
42
|
+
STATE_LIVE = 'state-live'
|
43
|
+
STATE_TERM = 'state-term'
|
44
|
+
field :state, default: STATE_PENDING
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
|
@@ -0,0 +1,57 @@
|
|
1
|
+
|
2
|
+
class WcoHosting::ApplianceTmpl
|
3
|
+
include Mongoid::Document
|
4
|
+
include Mongoid::Timestamps
|
5
|
+
store_in collection: 'wco_appliance_tmpls'
|
6
|
+
|
7
|
+
field :kind
|
8
|
+
validates :kind, uniqueness: { scope: :version }, presence: true
|
9
|
+
|
10
|
+
field :version, type: :string, default: '0.0.0'
|
11
|
+
validates :version, uniqueness: { scope: :kind }, presence: true
|
12
|
+
index({ kind: -1, version: -1 }, { name: :kind_version })
|
13
|
+
|
14
|
+
field :descr, type: :string
|
15
|
+
|
16
|
+
field :image
|
17
|
+
validates :image, presence: true
|
18
|
+
|
19
|
+
field :volume_zip
|
20
|
+
validates :volume_zip, presence: true
|
21
|
+
|
22
|
+
## Only underscores! These become variable names.
|
23
|
+
# KIND_CRM = 'kind_crm'
|
24
|
+
# KIND_DRUPAL = 'kind_drupal'
|
25
|
+
# KIND_HELLOWORLD = 'kind_helloworld'
|
26
|
+
# KIND_IROWOR = 'kind_irowor'
|
27
|
+
# KIND_JENKINS = 'kind_jenkins'
|
28
|
+
# KIND_MATOMO = 'kind_matomo'
|
29
|
+
# KIND_MOODLE = 'kind_moodle'
|
30
|
+
# KIND_PRESTASHOP = 'kind_prestashop'
|
31
|
+
# KIND_SMT = 'kind_smt'
|
32
|
+
# KIND_WORDPRESS = 'kind_wordpress'
|
33
|
+
|
34
|
+
## 2023-12-08 :: These names are impossible to change already.
|
35
|
+
KIND_CRM = 'crm'
|
36
|
+
KIND_DRUPAL = 'drupal'
|
37
|
+
KIND_HELLOWORLD = 'helloworld'
|
38
|
+
KIND_IROWOR = 'irowor'
|
39
|
+
KIND_JENKINS = 'jenkins'
|
40
|
+
KIND_MATOMO = 'matomo'
|
41
|
+
KIND_MOODLE = 'moodle'
|
42
|
+
KIND_PRESTASHOP = 'prestashop'
|
43
|
+
KIND_SMT = 'smt'
|
44
|
+
KIND_WORDPRESS = 'wordpress'
|
45
|
+
|
46
|
+
KINDS = [ KIND_CRM, KIND_DRUPAL, KIND_HELLOWORLD, KIND_IROWOR,
|
47
|
+
KIND_JENKINS, KIND_MATOMO, KIND_MOODLE, KIND_PRESTASHOP, KIND_SMT,
|
48
|
+
KIND_WORDPRESS ]
|
49
|
+
|
50
|
+
has_many :appliances, class_name: 'Wco::Appliance'
|
51
|
+
|
52
|
+
def self.latest_of kind
|
53
|
+
where({ kind: kind }).order_by({ version: :desc }).first
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
AppTmpl = WcoHosting::ApplianceTmpl
|
@@ -0,0 +1,24 @@
|
|
1
|
+
|
2
|
+
class WcoHosting::Domain
|
3
|
+
include Mongoid::Document
|
4
|
+
include Mongoid::Timestamps
|
5
|
+
store_in collection: 'wco_dns_domains'
|
6
|
+
|
7
|
+
field :name
|
8
|
+
validates :name, presence: true, uniqueness: true
|
9
|
+
|
10
|
+
## orbital.city : Z0145070C3DD1OJWHTXJ
|
11
|
+
## oquaney-splicing.com : Z060228025Y0JHUA35GN5
|
12
|
+
field :route53_zone
|
13
|
+
validates :route53_zone, presence: true
|
14
|
+
|
15
|
+
STATE_ACTIVE = 'active'
|
16
|
+
STATE_INACTIVE = 'inactive'
|
17
|
+
STATES = [ 'active', 'inactive' ]
|
18
|
+
field :state, default: STATE_ACTIVE
|
19
|
+
|
20
|
+
def self.list
|
21
|
+
[[nil,nil]] + all.where({ state: STATE_ACTIVE }).map { |i| [i.name, i.name ] }
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,140 @@
|
|
1
|
+
|
2
|
+
require 'net/scp'
|
3
|
+
|
4
|
+
class WcoHosting::Serverhost
|
5
|
+
include Mongoid::Document
|
6
|
+
include Mongoid::Timestamps
|
7
|
+
# include Mongoid::Autoinc
|
8
|
+
store_in collection: 'wco_serverhosts'
|
9
|
+
|
10
|
+
field :name, type: :string
|
11
|
+
# validates :name, uniqueness: { scope: :leadset_id }, presence: true
|
12
|
+
validates :name, uniqueness: { scope: :wco_leadset }, presence: true
|
13
|
+
|
14
|
+
# field :leadset_id, type: :integer
|
15
|
+
# has_and_belongs_to_many :leadsets, class_name: 'Wco::Leadset', inverse_of: :serverhosts
|
16
|
+
belongs_to :wco_leadset, class_name: 'Wco::Leadset'
|
17
|
+
|
18
|
+
field :next_port, type: :integer, default: 8000
|
19
|
+
|
20
|
+
field :nginx_root, default: '/opt/nginx'
|
21
|
+
field :public_ip
|
22
|
+
|
23
|
+
## net-ssh, sshkit
|
24
|
+
field :ssh_host
|
25
|
+
# field :ssh_username
|
26
|
+
# field :ssh_key
|
27
|
+
|
28
|
+
has_many :appliances, class_name: 'WcoHosting::Appliance'
|
29
|
+
|
30
|
+
def add_nginx_site app
|
31
|
+
ac = ActionController::Base.new
|
32
|
+
ac.instance_variable_set( :@app, app )
|
33
|
+
rendered_str = ac.render_to_string("scripts/nginx_site.conf")
|
34
|
+
puts '+++ add_nginx_site rendered_str:'
|
35
|
+
print rendered_str
|
36
|
+
|
37
|
+
file = Tempfile.new('prefix')
|
38
|
+
file.write rendered_str
|
39
|
+
file.close
|
40
|
+
|
41
|
+
cmd = "scp #{file.path} #{ssh_host}:/etc/nginx/sites-available/#{app.service_name}.conf "
|
42
|
+
puts! cmd, 'cmd'
|
43
|
+
`#{cmd}`
|
44
|
+
|
45
|
+
cmd = "ssh #{ssh_host} 'ln -s /etc/nginx/sites-available/#{app.service_name}.conf /etc/nginx/sites-enabled/#{app.service_name}.conf ' "
|
46
|
+
puts! cmd, 'cmd'
|
47
|
+
`#{cmd}`
|
48
|
+
|
49
|
+
cmd = "ssh #{ssh_host} 'nginx -s reload ' "
|
50
|
+
puts! cmd, 'cmd'
|
51
|
+
`#{cmd}`
|
52
|
+
|
53
|
+
cmd = "ssh #{ssh_host} 'certbot run -d #{app.origin} --nginx -n ' "
|
54
|
+
puts! cmd, 'cmd'
|
55
|
+
`#{cmd}`
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
WORKDIR = "/opt/projects/docker"
|
60
|
+
|
61
|
+
def add_docker_service app
|
62
|
+
puts! app, '#add_docker_service'
|
63
|
+
|
64
|
+
ac = ActionController::Base.new
|
65
|
+
ac.instance_variable_set( :@app, app )
|
66
|
+
ac.instance_variable_set( :@workdir, WORKDIR )
|
67
|
+
rendered_str = ac.render_to_string("docker-compose/dc-#{app.kind}")
|
68
|
+
puts '+++ add_docker_service rendered_str:'
|
69
|
+
print rendered_str
|
70
|
+
|
71
|
+
file = Tempfile.new('prefix')
|
72
|
+
file.write rendered_str
|
73
|
+
file.close
|
74
|
+
puts! file.path, 'file.path'
|
75
|
+
|
76
|
+
cmd = "scp #{file.path} #{ssh_host}:#{WORKDIR}/dc-#{app.service_name}.yml "
|
77
|
+
puts! cmd, 'cmd'
|
78
|
+
`#{cmd}`
|
79
|
+
|
80
|
+
cmd = "ssh #{ssh_host} 'cd #{WORKDIR} ; \
|
81
|
+
docker compose -f dc-#{app.service_name}.yml up -d #{app.service_name} ; \
|
82
|
+
echo ok #add_docker_service ' "
|
83
|
+
puts! cmd, 'cmd'
|
84
|
+
`#{cmd}`
|
85
|
+
|
86
|
+
puts "ok '#add_docker_service'"
|
87
|
+
end
|
88
|
+
|
89
|
+
def create_wordpress_volume app
|
90
|
+
ac = ActionController::Base.new
|
91
|
+
ac.instance_variable_set( :@app, app )
|
92
|
+
ac.instance_variable_set( :@workdir, WORKDIR )
|
93
|
+
rendered_str = ac.render_to_string("scripts/create_volume")
|
94
|
+
# puts '+++ create_volume rendered_str:'
|
95
|
+
# print rendered_str
|
96
|
+
|
97
|
+
file = Tempfile.new('prefix')
|
98
|
+
file.write rendered_str
|
99
|
+
file.close
|
100
|
+
# puts! file.path, 'file.path'
|
101
|
+
|
102
|
+
cmd = "scp #{file.path} #{ssh_host}:#{WORKDIR}/scripts/create_volume"
|
103
|
+
puts! cmd, 'cmd'
|
104
|
+
`#{cmd}`
|
105
|
+
|
106
|
+
cmd = "ssh #{ssh_host} 'chmod a+x #{WORKDIR}/scripts/create_volume ; \
|
107
|
+
#{WORKDIR}/scripts/create_volume ' "
|
108
|
+
puts! cmd, 'cmd'
|
109
|
+
`#{cmd}`
|
110
|
+
|
111
|
+
puts 'ok #create_volume'
|
112
|
+
end
|
113
|
+
|
114
|
+
def create_volume app
|
115
|
+
ac = ActionController::Base.new
|
116
|
+
ac.instance_variable_set( :@app, app )
|
117
|
+
ac.instance_variable_set( :@workdir, WORKDIR )
|
118
|
+
rendered_str = ac.render_to_string("scripts/create_volume")
|
119
|
+
# puts '+++ create_volume rendered_str:'
|
120
|
+
# print rendered_str
|
121
|
+
|
122
|
+
file = Tempfile.new('prefix')
|
123
|
+
file.write rendered_str
|
124
|
+
file.close
|
125
|
+
# puts! file.path, 'file.path'
|
126
|
+
|
127
|
+
cmd = "scp #{file.path} #{ssh_host}:#{WORKDIR}/scripts/create_volume"
|
128
|
+
puts! cmd, 'cmd'
|
129
|
+
`#{cmd}`
|
130
|
+
|
131
|
+
cmd = "ssh #{ssh_host} 'chmod a+x #{WORKDIR}/scripts/create_volume ; \
|
132
|
+
#{WORKDIR}/scripts/create_volume ' "
|
133
|
+
puts! cmd, 'cmd'
|
134
|
+
`#{cmd}`
|
135
|
+
|
136
|
+
puts 'ok #create_volume'
|
137
|
+
end
|
138
|
+
|
139
|
+
|
140
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ish_models
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.1.0.
|
4
|
+
version: 3.1.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- mac_a2141
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-12-
|
11
|
+
date: 2023-12-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -94,6 +94,34 @@ dependencies:
|
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: 1.0.1
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: net-ssh
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 7.2.0
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 7.2.0
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: net-scp
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 4.0.0
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 4.0.0
|
97
125
|
description: https://wasya.co
|
98
126
|
email:
|
99
127
|
- victor@piousbox.com
|
@@ -115,8 +143,17 @@ files:
|
|
115
143
|
- lib/ish_models/engine.rb
|
116
144
|
- lib/ish_models/version.rb-trash
|
117
145
|
- lib/tasks/ish_models_tasks.rake
|
146
|
+
- lib/wco/leadset.rb
|
118
147
|
- lib/wco/profile.rb
|
119
148
|
- lib/wco/tag.rb
|
149
|
+
- lib/wco_email/ability.rb-trash
|
150
|
+
- lib/wco_email/conversation.rb
|
151
|
+
- lib/wco_email/message_template.rb
|
152
|
+
- lib/wco_email/tag.rb-trash
|
153
|
+
- lib/wco_hosting/appliance.rb
|
154
|
+
- lib/wco_hosting/appliance_tmpl.rb
|
155
|
+
- lib/wco_hosting/domain.rb
|
156
|
+
- lib/wco_hosting/serverhost.rb
|
120
157
|
homepage: https://wasya.co
|
121
158
|
licenses:
|
122
159
|
- MIT
|