modulorails 0.3.0 → 0.4.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/.dockerignore +14 -0
- data/.gitignore +2 -0
- data/.travis.yml +23 -4
- data/Appraisals +18 -0
- data/CHANGELOG.md +12 -0
- data/Dockerfile.ruby25 +34 -0
- data/Dockerfile.ruby26 +28 -0
- data/Dockerfile.ruby27 +25 -0
- data/Dockerfile.ruby30 +25 -0
- data/Dockerfile.ruby31 +25 -0
- data/Gemfile.lock +59 -52
- data/README.md +16 -4
- data/Rakefile +1 -1
- data/docker-compose.yml +37 -0
- data/entrypoints/appraisal_test.sh +7 -0
- data/gemfiles/rails_52.gemfile +9 -0
- data/gemfiles/rails_60.gemfile +9 -0
- data/gemfiles/rails_61.gemfile +9 -0
- data/gemfiles/rails_70.gemfile +9 -0
- data/lib/generators/{docker → modulorails/docker}/docker_generator.rb +1 -1
- data/lib/generators/{docker → modulorails/docker}/templates/Dockerfile.prod.tt +14 -9
- data/lib/generators/{docker → modulorails/docker}/templates/Dockerfile.tt +5 -7
- data/lib/generators/{docker → modulorails/docker}/templates/config/database.yml.tt +11 -0
- data/lib/generators/{docker → modulorails/docker}/templates/docker-compose.prod.yml.tt +18 -4
- data/lib/generators/modulorails/docker/templates/docker-compose.yml.tt +71 -0
- data/lib/generators/{docker → modulorails/docker}/templates/entrypoints/docker-entrypoint.sh.tt +0 -0
- data/lib/generators/modulorails/docker/templates/entrypoints/webpack-entrypoint.sh.tt +7 -0
- data/lib/generators/{gitlabci → modulorails/gitlabci}/gitlabci_generator.rb +4 -23
- data/lib/generators/modulorails/gitlabci/templates/.gitlab-ci.yml.tt +118 -0
- data/lib/generators/modulorails/gitlabci/templates/.modulorails-gitlab-ci +6 -0
- data/lib/generators/{gitlabci → modulorails/gitlabci}/templates/config/database-ci.yml.tt +0 -0
- data/lib/generators/modulorails/healthcheck/health_check_generator.rb +41 -0
- data/lib/generators/modulorails/healthcheck/templates/.modulorails-health_check +6 -0
- data/lib/generators/modulorails/healthcheck/templates/config/initializers/health_check.rb.tt +100 -0
- data/lib/generators/modulorails/self_update/self_update_generator.rb +32 -0
- data/lib/modulorails/configuration.rb +8 -2
- data/lib/modulorails/data.rb +21 -2
- data/lib/modulorails/railtie.rb +19 -4
- data/lib/modulorails/validators/database_configuration.rb +1 -1
- data/lib/modulorails/version.rb +1 -1
- data/lib/modulorails.rb +34 -15
- data/modulorails.gemspec +2 -0
- metadata +69 -24
- data/lib/generators/docker/templates/docker-compose.yml.tt +0 -37
- data/lib/generators/gitlabci/templates/.gitlab-ci.yml.tt +0 -79
- data/lib/generators/gitlabci/templates/.modulorails-gitlab-ci +0 -3
- data/lib/modulorails/updater.rb +0 -46
data/lib/modulorails.rb
CHANGED
@@ -2,9 +2,10 @@ require 'modulorails/version'
|
|
2
2
|
require 'modulorails/configuration'
|
3
3
|
require 'modulorails/data'
|
4
4
|
require 'modulorails/validators/database_configuration'
|
5
|
-
require 'modulorails/updater'
|
6
5
|
require 'modulorails/railtie' if defined?(Rails::Railtie)
|
7
|
-
require 'generators/gitlabci/gitlabci_generator'
|
6
|
+
require 'generators/modulorails/gitlabci/gitlabci_generator'
|
7
|
+
require 'generators/modulorails/healthcheck/health_check_generator'
|
8
|
+
require 'generators/modulorails/self_update/self_update_generator'
|
8
9
|
require 'httparty'
|
9
10
|
|
10
11
|
# Author: Matthieu 'ciappa_m' Ciappara
|
@@ -77,17 +78,25 @@ module Modulorails
|
|
77
78
|
# Define the JSON body of the request
|
78
79
|
body = data.to_params.to_json
|
79
80
|
|
80
|
-
#
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
81
|
+
# Prevent HTTParty to raise error and crash the server in dev
|
82
|
+
begin
|
83
|
+
# Post to the configured endpoint on the Intranet
|
84
|
+
response = HTTParty.post(configuration.endpoint, headers: headers, body: body)
|
85
|
+
|
86
|
+
# According to the API specification, on a "Bad request" response, the server explicits what
|
87
|
+
# went wrong with an `errors` field. We do not want to raise since the gem's user is not
|
88
|
+
# (necessarily) responsible for the error but we still need to display it somewhere to warn
|
89
|
+
# the user something went wrong.
|
90
|
+
puts("[Modulorails] Error: #{response['errors'].join(', ')}") if response.code == 400
|
91
|
+
|
92
|
+
# Return the response to allow users to do some more
|
93
|
+
response
|
94
|
+
rescue StandardError => e
|
95
|
+
# Still need to notify the user
|
96
|
+
puts("[Modulorails] Error: Could not post to #{configuration.endpoint}")
|
97
|
+
puts e.message
|
98
|
+
nil
|
99
|
+
end
|
91
100
|
else
|
92
101
|
raise Error.new('No endpoint or api key')
|
93
102
|
end
|
@@ -100,7 +109,7 @@ module Modulorails
|
|
100
109
|
def generate_ci_template
|
101
110
|
return if File.exists?(Rails.root.join('.modulorails-gitlab-ci'))
|
102
111
|
|
103
|
-
GitlabciGenerator.new([], {}, {}).invoke_all
|
112
|
+
Modulorails::GitlabciGenerator.new([], {}, {}).invoke_all
|
104
113
|
end
|
105
114
|
|
106
115
|
# @author Matthieu 'ciappa_m' Ciappara
|
@@ -124,9 +133,19 @@ module Modulorails
|
|
124
133
|
# Check the last version of Modulorails available on rubygems and update if there was a
|
125
134
|
# publication
|
126
135
|
def self_update
|
127
|
-
Modulorails::
|
136
|
+
Modulorails::SelfUpdateGenerator.new([], {}, {}).invoke_all unless configuration.no_auto_update
|
128
137
|
rescue StandardError => e
|
129
138
|
puts("[Modulorails] An error occured: #{e.class} - #{e.message}")
|
130
139
|
end
|
140
|
+
|
141
|
+
# @author Matthieu 'ciappa_m' Ciappara
|
142
|
+
#
|
143
|
+
# Generate a health_check configuration unless it was already done.
|
144
|
+
# The check is done using a 'keepfile'.
|
145
|
+
def generate_healthcheck_template
|
146
|
+
return if File.exists?(Rails.root.join('.modulorails-health_check'))
|
147
|
+
|
148
|
+
Modulorails::HealthCheckGenerator.new([], {}, {}).invoke_all
|
149
|
+
end
|
131
150
|
end
|
132
151
|
end
|
data/modulorails.gemspec
CHANGED
@@ -33,6 +33,8 @@ Gem::Specification.new do |spec|
|
|
33
33
|
spec.add_runtime_dependency 'git', '~> 1.7', '>= 1.7.0'
|
34
34
|
spec.add_runtime_dependency 'httparty'
|
35
35
|
spec.add_runtime_dependency 'i18n'
|
36
|
+
spec.add_runtime_dependency 'health_check', '~> 3.1'
|
36
37
|
|
37
38
|
spec.add_development_dependency 'activerecord', '>= 4.2.0'
|
39
|
+
spec.add_development_dependency "appraisal"
|
38
40
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: modulorails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthieu Ciappara
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-01-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|
@@ -28,22 +28,22 @@ dependencies:
|
|
28
28
|
name: git
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '1.7'
|
34
31
|
- - ">="
|
35
32
|
- !ruby/object:Gem::Version
|
36
33
|
version: 1.7.0
|
34
|
+
- - "~>"
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '1.7'
|
37
37
|
type: :runtime
|
38
38
|
prerelease: false
|
39
39
|
version_requirements: !ruby/object:Gem::Requirement
|
40
40
|
requirements:
|
41
|
-
- - "~>"
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
version: '1.7'
|
44
41
|
- - ">="
|
45
42
|
- !ruby/object:Gem::Version
|
46
43
|
version: 1.7.0
|
44
|
+
- - "~>"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '1.7'
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: httparty
|
49
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -72,6 +72,20 @@ dependencies:
|
|
72
72
|
- - ">="
|
73
73
|
- !ruby/object:Gem::Version
|
74
74
|
version: '0'
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: health_check
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '3.1'
|
82
|
+
type: :runtime
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - "~>"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '3.1'
|
75
89
|
- !ruby/object:Gem::Dependency
|
76
90
|
name: activerecord
|
77
91
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,6 +100,20 @@ dependencies:
|
|
86
100
|
- - ">="
|
87
101
|
- !ruby/object:Gem::Version
|
88
102
|
version: 4.2.0
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: appraisal
|
105
|
+
requirement: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
type: :development
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
89
117
|
description: |
|
90
118
|
Modulorails is the common base for the Ruby on Rails project at Modulotech
|
91
119
|
(https://www.modulotech.fr/).
|
@@ -98,11 +126,18 @@ executables: []
|
|
98
126
|
extensions: []
|
99
127
|
extra_rdoc_files: []
|
100
128
|
files:
|
129
|
+
- ".dockerignore"
|
101
130
|
- ".gitignore"
|
102
131
|
- ".rspec"
|
103
132
|
- ".travis.yml"
|
133
|
+
- Appraisals
|
104
134
|
- CHANGELOG.md
|
105
135
|
- CODE_OF_CONDUCT.md
|
136
|
+
- Dockerfile.ruby25
|
137
|
+
- Dockerfile.ruby26
|
138
|
+
- Dockerfile.ruby27
|
139
|
+
- Dockerfile.ruby30
|
140
|
+
- Dockerfile.ruby31
|
106
141
|
- Gemfile
|
107
142
|
- Gemfile.lock
|
108
143
|
- LICENSE.txt
|
@@ -111,22 +146,32 @@ files:
|
|
111
146
|
- bin/console
|
112
147
|
- bin/setup
|
113
148
|
- config/locales/en.yml
|
114
|
-
-
|
115
|
-
-
|
116
|
-
-
|
117
|
-
-
|
118
|
-
-
|
119
|
-
-
|
120
|
-
- lib/generators/docker/
|
121
|
-
- lib/generators/
|
122
|
-
- lib/generators/
|
123
|
-
- lib/generators/
|
124
|
-
- lib/generators/
|
149
|
+
- docker-compose.yml
|
150
|
+
- entrypoints/appraisal_test.sh
|
151
|
+
- gemfiles/rails_52.gemfile
|
152
|
+
- gemfiles/rails_60.gemfile
|
153
|
+
- gemfiles/rails_61.gemfile
|
154
|
+
- gemfiles/rails_70.gemfile
|
155
|
+
- lib/generators/modulorails/docker/docker_generator.rb
|
156
|
+
- lib/generators/modulorails/docker/templates/Dockerfile.prod.tt
|
157
|
+
- lib/generators/modulorails/docker/templates/Dockerfile.tt
|
158
|
+
- lib/generators/modulorails/docker/templates/config/database.yml.tt
|
159
|
+
- lib/generators/modulorails/docker/templates/docker-compose.prod.yml.tt
|
160
|
+
- lib/generators/modulorails/docker/templates/docker-compose.yml.tt
|
161
|
+
- lib/generators/modulorails/docker/templates/entrypoints/docker-entrypoint.sh.tt
|
162
|
+
- lib/generators/modulorails/docker/templates/entrypoints/webpack-entrypoint.sh.tt
|
163
|
+
- lib/generators/modulorails/gitlabci/gitlabci_generator.rb
|
164
|
+
- lib/generators/modulorails/gitlabci/templates/.gitlab-ci.yml.tt
|
165
|
+
- lib/generators/modulorails/gitlabci/templates/.modulorails-gitlab-ci
|
166
|
+
- lib/generators/modulorails/gitlabci/templates/config/database-ci.yml.tt
|
167
|
+
- lib/generators/modulorails/healthcheck/health_check_generator.rb
|
168
|
+
- lib/generators/modulorails/healthcheck/templates/.modulorails-health_check
|
169
|
+
- lib/generators/modulorails/healthcheck/templates/config/initializers/health_check.rb.tt
|
170
|
+
- lib/generators/modulorails/self_update/self_update_generator.rb
|
125
171
|
- lib/modulorails.rb
|
126
172
|
- lib/modulorails/configuration.rb
|
127
173
|
- lib/modulorails/data.rb
|
128
174
|
- lib/modulorails/railtie.rb
|
129
|
-
- lib/modulorails/updater.rb
|
130
175
|
- lib/modulorails/validators/database_configuration.rb
|
131
176
|
- lib/modulorails/version.rb
|
132
177
|
- modulorails.gemspec
|
@@ -137,7 +182,7 @@ metadata:
|
|
137
182
|
homepage_uri: https://github.com/moduloTech/modulorails
|
138
183
|
source_code_uri: https://github.com/moduloTech/modulorails
|
139
184
|
changelog_uri: https://github.com/moduloTech/modulorails/blob/master/CHANGELOG.md
|
140
|
-
post_install_message:
|
185
|
+
post_install_message:
|
141
186
|
rdoc_options: []
|
142
187
|
require_paths:
|
143
188
|
- lib
|
@@ -152,8 +197,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
152
197
|
- !ruby/object:Gem::Version
|
153
198
|
version: '0'
|
154
199
|
requirements: []
|
155
|
-
rubygems_version: 3.
|
156
|
-
signing_key:
|
200
|
+
rubygems_version: 3.0.3
|
201
|
+
signing_key:
|
157
202
|
specification_version: 4
|
158
203
|
summary: Common base for Ruby on Rails projects at Modulotech
|
159
204
|
test_files: []
|
@@ -1,37 +0,0 @@
|
|
1
|
-
version: '3.7'
|
2
|
-
|
3
|
-
<% image_name = Modulorails.data.name.parameterize %>
|
4
|
-
|
5
|
-
services:
|
6
|
-
app:
|
7
|
-
image: modulotechgroup/<%= image_name %>:dev
|
8
|
-
build:
|
9
|
-
context: .
|
10
|
-
dockerfile: Dockerfile
|
11
|
-
depends_on:
|
12
|
-
- database
|
13
|
-
- redis
|
14
|
-
ports:
|
15
|
-
- '3000:3000'
|
16
|
-
volumes:
|
17
|
-
- .:/app
|
18
|
-
environment:
|
19
|
-
RAILS_ENV: development
|
20
|
-
URL: http://localhost:3000
|
21
|
-
<%= image_name.upcase %>_DATABASE_HOST: database
|
22
|
-
<%= image_name.upcase %>_DATABASE_NAME: <%= image_name %>
|
23
|
-
entrypoint: ./entrypoints/docker-entrypoint.sh
|
24
|
-
|
25
|
-
database:
|
26
|
-
image: mysql:8.0
|
27
|
-
volumes:
|
28
|
-
- db_data:/var/lib/mysql
|
29
|
-
environment:
|
30
|
-
MYSQL_ALLOW_EMPTY_PASSWORD: 'true'
|
31
|
-
MYSQL_DATABASE: <%= image_name %>
|
32
|
-
|
33
|
-
redis:
|
34
|
-
image: redis:6.2-alpine
|
35
|
-
|
36
|
-
volumes:
|
37
|
-
db_data:
|
@@ -1,79 +0,0 @@
|
|
1
|
-
<%- adapter = Modulorails.data.adapter -%>
|
2
|
-
<%- if adapter =~ /mysql/ -%>
|
3
|
-
<%= GitlabciGenerator::MYSQL_DOCKER_DB -%>
|
4
|
-
<%- else -%>
|
5
|
-
<%= GitlabciGenerator::POSTGRES_DOCKER_DB -%>
|
6
|
-
<%- end -%>
|
7
|
-
|
8
|
-
image: ruby:<%= Modulorails.data.ruby_version %>
|
9
|
-
stages:
|
10
|
-
- lint
|
11
|
-
- test
|
12
|
-
- deploy
|
13
|
-
cache:
|
14
|
-
key: <%= Modulorails.data.rails_name.parameterize %>-ci_cd
|
15
|
-
paths:
|
16
|
-
- vendor/ruby
|
17
|
-
|
18
|
-
before_script:
|
19
|
-
- apt-get update -qy
|
20
|
-
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
|
21
|
-
- eval $(ssh-agent -s)
|
22
|
-
- ssh-add <(echo "$SSH_PRIVATE_KEY")
|
23
|
-
- mkdir -p ~/.ssh
|
24
|
-
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
|
25
|
-
- apt-get install -y ruby-dev
|
26
|
-
- gem install bundler -v <%= Modulorails.data.bundler_version %> --no-document
|
27
|
-
# You might need DPL if you're deploying using Heroku
|
28
|
-
#- gem install dpl -v 1.10.15 --no-document
|
29
|
-
# You might need to add some configurations here like a key for a theme
|
30
|
-
#- bundle config gems.rapidrailsthemes.com "$RRT_CFG"
|
31
|
-
- bundle install -j $(nproc) --path vendor
|
32
|
-
|
33
|
-
rubocop:
|
34
|
-
stage: lint
|
35
|
-
script:
|
36
|
-
- bundle exec rubocop -D
|
37
|
-
tags:
|
38
|
-
- rails
|
39
|
-
except:
|
40
|
-
- master
|
41
|
-
- staging
|
42
|
-
|
43
|
-
test:
|
44
|
-
stage: test
|
45
|
-
script:
|
46
|
-
- cp config/database-ci.yml config/database.yml
|
47
|
-
- "bundle exec rake db:create RAILS_ENV=test"
|
48
|
-
- "RAILS_ENV=test bundle exec rake db:migrate:reset"
|
49
|
-
- bundle exec rspec
|
50
|
-
tags:
|
51
|
-
- rails
|
52
|
-
except:
|
53
|
-
- master
|
54
|
-
|
55
|
-
staging:
|
56
|
-
stage: deploy
|
57
|
-
script:
|
58
|
-
# Uncomment the next line and update the application name if you're using DPL to deploy on
|
59
|
-
# Heroku
|
60
|
-
#- dpl --provider=heroku --app=APP_NAME --api-key=$HEROKU_API_KEY
|
61
|
-
# Remove the next line if you're not using Capistrano
|
62
|
-
- bundle exec cap staging deploy
|
63
|
-
only:
|
64
|
-
- staging
|
65
|
-
tags:
|
66
|
-
- rails
|
67
|
-
|
68
|
-
production:
|
69
|
-
stage: deploy
|
70
|
-
script:
|
71
|
-
# Uncomment the next line and update the application name if you're using DPL to deploy on
|
72
|
-
# Heroku
|
73
|
-
#- dpl --provider=heroku --app=APP_NAME --api-key=$HEROKU_API_KEY
|
74
|
-
# Remove the next line if you're not using Capistrano
|
75
|
-
- bundle exec cap production deploy
|
76
|
-
only:
|
77
|
-
- master
|
78
|
-
tags:
|
79
|
-
- rails
|
data/lib/modulorails/updater.rb
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
module Modulorails
|
2
|
-
# Author: Matthieu 'ciappa_m' Ciappara
|
3
|
-
# This updates modulorails by editing the gemfile and running a bundle update
|
4
|
-
class Updater
|
5
|
-
LATEST_VERSION_URL = 'https://rubygems.org/api/v1/versions/modulorails/latest.json'.freeze
|
6
|
-
|
7
|
-
def self.call(*args)
|
8
|
-
new(*args).call
|
9
|
-
end
|
10
|
-
|
11
|
-
def call
|
12
|
-
# Get the last published version
|
13
|
-
@last_published_version = HTTParty.get(LATEST_VERSION_URL).parsed_response['version']
|
14
|
-
|
15
|
-
# Do nothing if we could not fetch the last published version (whatever the reason)
|
16
|
-
# Or if the current version is the same as the last published version
|
17
|
-
return if @last_published_version.nil? || @last_published_version == Modulorails::VERSION
|
18
|
-
|
19
|
-
# If the last published version is different from the current version, we update the gem
|
20
|
-
edit_gemfile
|
21
|
-
end
|
22
|
-
|
23
|
-
private
|
24
|
-
|
25
|
-
def edit_gemfile
|
26
|
-
# Log to warn the user
|
27
|
-
puts("[Modulorails] Last version for modulorails is #{@last_published_version} while you "\
|
28
|
-
"are using version #{Modulorails::VERSION}. Running auto-update.")
|
29
|
-
|
30
|
-
# Read the lines of the Gemfile
|
31
|
-
gemfile_location = Rails.root.join('Gemfile')
|
32
|
-
lines = File.readlines gemfile_location
|
33
|
-
|
34
|
-
# Search and replace the modulorails line
|
35
|
-
index = lines.index { |l| l =~ /gem\s['"]modulorails['"]/ }
|
36
|
-
lines[index].gsub!(/(\s*)gem\s['"]modulorails['"].*/,
|
37
|
-
"#{$1}gem 'modulorails', '= #{@last_published_version}'")
|
38
|
-
|
39
|
-
# Update the Gemfile
|
40
|
-
File.open(gemfile_location, 'w') { |f| f.puts(lines) }
|
41
|
-
|
42
|
-
# Update the gem and the Gemfile.lock
|
43
|
-
system('bundle install')
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|