mogu 0.6.0 → 0.8.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5043094005d94e801e049d1a6a03689deee2ded40a10703feb2b1dbb5cda5df0
4
- data.tar.gz: 3bc7f43bc271f0a32bbd3cf282020e6dbae6c6970975d3569ca796b379ea0757
3
+ metadata.gz: 269a89adb5358437707573187ca45661b19bde3752d18cda866624c22feffa4b
4
+ data.tar.gz: 26189a50fd73c9ceefcbef18a05bf161f1832fe26f6449decad4ee8af094e1bd
5
5
  SHA512:
6
- metadata.gz: 07de320e8f7c9c8fdb96f85c78b69a8089711474f0727648701906d2f8e4dcf8959136a063058e835999e2541008c3577a18fee4a1db62a8b148eb3855ca874e
7
- data.tar.gz: 00a5c8bd2bba6b3ad8c75b6df01f0f9088d9ea10807b8798a7d043d5e2553eaee40295ff17405cd5bdf2349c5c549e35ed7c9e12f959b79e37d035d8d912beff
6
+ metadata.gz: bdb9286c8524786c016a556b946a135de8df76cb0be38a6277b9edac6245d6235f3754bdfd4c61e7f7980db9a41a9435d16e90c68caaf6c75f804125bf2d667b
7
+ data.tar.gz: '0291883c08d156c983f845408f53eafe57d0576c58b065015ba3c5b7ee937fa3d3eff431367feb73d371a1860b6777cb5aff4d91a609bcbd2f7baabae2e1eaa8'
@@ -20,7 +20,7 @@
20
20
  "settings": {},
21
21
 
22
22
  // Add the IDs of extensions you want installed when the container is created.
23
- "extensions": ["castwide.solargraph"]
23
+ "extensions": ["castwide.solargraph", "soutaro.steep-vscode"]
24
24
 
25
25
  // Use 'forwardPorts' to make a list of ports inside the container available locally.
26
26
  // "forwardPorts": [],
@@ -2,6 +2,7 @@
2
2
  "[ruby]": {
3
3
  "editor.defaultFormatter": "castwide.solargraph"
4
4
  },
5
+ "solargraph.completion": false,
5
6
  "solargraph.diagnostics": true,
6
7
  "solargraph.formatting": true,
7
8
  "solargraph.useBundler": true
data/Gemfile CHANGED
@@ -16,3 +16,5 @@ gem 'rubocop-rake', '~> 0.6.0'
16
16
  gem 'rubocop-rspec', '~> 2.9'
17
17
 
18
18
  gem 'solargraph', '~> 0.44.3'
19
+
20
+ gem 'steep', '~> 0.52.0'
data/README.md CHANGED
@@ -12,6 +12,7 @@ CLI to create rails projects interactively.
12
12
  - database
13
13
  - javascript
14
14
  - css
15
+ - skips
15
16
  - Support in adding gems
16
17
 
17
18
  ## Installation
@@ -22,45 +23,75 @@ gem install mogu
22
23
 
23
24
  ## Usage
24
25
 
26
+ ### help
27
+
25
28
  ```bash
26
- mogu
29
+ mogu help
27
30
  ```
28
31
 
29
- ```bash
30
- Please input app path
32
+ ### new
31
33
 
32
- Do you want api mode? (y/N)
34
+ Create rails projects interactively.
33
35
 
34
- Choose customizes
35
- > ⬡ database (Default: sqlite3)
36
- ⬡ javascript (Default: importmap)
37
- ⬡ css
38
- ⬡ gems
36
+ ```bash
37
+ mogu new
38
+ ```
39
39
 
40
- Choose database
41
- > sqlite3
42
- mysql
43
- postgresql
40
+ ```bash
41
+ ? Please input app path
42
+ >
43
+
44
+ ? Do you want api mode? (Choose with ↑ ↓ ⏎)
45
+ > 1. no
46
+ 2. yes
47
+
48
+ ? Choose customizes (Toggle options. Choose with ↑ ↓ ⏎, filter with 'f')
49
+ > 1. ☐ database (Default: sqlite3)
50
+ 2. ☐ javascript (Default: importmap)
51
+ 3. ☐ css
52
+ 4. ☐ skips
53
+ 0. Done
54
+
55
+ ? Choose database (Choose with ↑ ↓ ⏎, filter with 'f')
56
+ > 1. sqlite3
57
+ 2. mysql
58
+ 3. postgresql
44
59
  ...
45
60
 
46
- Choose javascript
47
- > importmap
48
- webpack
49
- esbuild
50
- rollup
51
-
52
- Choose css
53
- > tailwind
54
- bootstrap
55
- bulma
56
- postcss
57
- sass
58
-
59
- Choose gems
60
- > brakeman
61
- solargraph
62
- ⬡ rspec
63
- ⬡ rubocop
61
+ ? Choose javascript (Choose with ↑ ↓ ⏎, filter with 'f')
62
+ > 1. importmap
63
+ 2. webpack
64
+ 3. esbuild
65
+ 4. rollup
66
+
67
+ ? Choose css (Choose with ↑ ↓ ⏎, filter with 'f')
68
+ > 1. tailwind
69
+ 2. bootstrap
70
+ 3. bulma
71
+ 4. postcss
72
+ 5. sass
73
+
74
+ ? Choose skips (Toggle options. Choose with ↑ ↓ ⏎, filter with 'f')
75
+ > 1. ☐ test
76
+ 0. Done
77
+ ```
78
+
79
+ ### gem
80
+
81
+ Add gems to rails projects.
82
+
83
+ ```bash
84
+ mogu gem
85
+ ```
86
+
87
+ ```bash
88
+ ? Choose gems (Toggle options. Choose with ↑ ↓ ⏎, filter with 'f')
89
+ > 1. ☐ brakeman
90
+ 2. ☐ solargraph
91
+ 3. ☐ rspec
92
+ 4. ☐ rubocop
93
+ 0. Done
94
+
64
95
  ```
65
96
 
66
97
  ## Development
data/Steepfile ADDED
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ target :lib do
4
+ signature 'sig'
5
+
6
+ check 'lib'
7
+
8
+ library 'erb', 'tempfile'
9
+ end
data/lib/mogu/cli.rb CHANGED
@@ -1,16 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rails/command'
4
3
  require 'thor'
5
4
 
6
5
  module Mogu
7
6
  class CLI < Thor
7
+ desc 'gem', 'Add gems to rails projects'
8
+ def gem
9
+ Mogu::GemCommand.new.run
10
+ end
11
+
8
12
  desc 'new', 'Create rails projects interactively'
9
13
  def new
10
- prompt = Mogu::Prompt.new
11
- prompt.run
12
-
13
- Rails::Command.invoke :application, ['new', *prompt.to_opt]
14
+ Mogu::NewCommand.new.run
14
15
  end
15
16
 
16
17
  desc 'version', 'Display mogu version'
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'cli/ui'
4
+ require 'erb'
5
+ require 'rails/command'
6
+ require 'tempfile'
7
+
8
+ module Mogu
9
+ class GemCommand
10
+ def run
11
+ erb = ERB.new File.read(File.expand_path('templates/gem.erb', __dir__.to_s))
12
+ template = Tempfile.new
13
+
14
+ gems = ask_gems
15
+ template.write erb.result_with_hash(gems: gems)
16
+ template.rewind
17
+
18
+ ENV.store 'LOCATION', template.path
19
+
20
+ Rails::Command.invoke 'app:template'
21
+ end
22
+
23
+ private
24
+
25
+ def ask_gems
26
+ options = %w[brakeman solargraph rspec rubocop]
27
+
28
+ ::CLI::UI::Prompt.ask 'Choose gems', multiple: true, options: options
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'cli/ui'
4
+ require 'rails/command'
5
+
6
+ module Mogu
7
+ class NewCommand
8
+ def run
9
+ @app_path = ask_app_path
10
+ @is_api = confirm_is_api
11
+ customizes = ask_customizes
12
+
13
+ @database = customizes.include?('database') ? ask_database : []
14
+ @javascript = customizes.include?('javascript') ? ask_javascript : []
15
+ @css = customizes.include?('css') ? ask_css : []
16
+ @skips = customizes.include?('skips') ? ask_skips : []
17
+
18
+ Rails::Command.invoke :application, ['new', *to_opt]
19
+ end
20
+
21
+ private
22
+
23
+ def ask_app_path
24
+ ::CLI::UI::Prompt.ask 'Please input app path', allow_empty: false
25
+ end
26
+
27
+ def confirm_is_api
28
+ ::CLI::UI::Prompt.confirm 'Do you want api mode?', default: false
29
+ end
30
+
31
+ def ask_customizes
32
+ ::CLI::UI::Prompt.ask 'Choose customizes', multiple: true do |handler|
33
+ handler.option('database (Default: sqlite3)') { 'database' }
34
+
35
+ unless @is_api
36
+ handler.option('javascript (Default: importmap)') { 'javascript' }
37
+ handler.option('css') { 'css' }
38
+ end
39
+
40
+ handler.option('skips') { 'skips' }
41
+ end
42
+ end
43
+
44
+ def ask_database
45
+ options = %w[sqlite3 mysql postgresql oracle sqlserver jdbcmysql jdbcsqlite3 jdbcpostgresql jdbc]
46
+
47
+ ::CLI::UI::Prompt.ask 'Choose database' do |handler|
48
+ options.each do |option|
49
+ handler.option(option) { |s| ['-d', s] }
50
+ end
51
+ end
52
+ end
53
+
54
+ def ask_javascript
55
+ options = %w[importmap webpack esbuild rollup]
56
+
57
+ ::CLI::UI::Prompt.ask 'Choose javascript' do |handler|
58
+ options.each do |option|
59
+ handler.option(option) { |s| ['-j', s] }
60
+ end
61
+ end
62
+ end
63
+
64
+ def ask_css
65
+ options = %w[tailwind bootstrap bulma postcss sass]
66
+
67
+ ::CLI::UI::Prompt.ask 'Choose css' do |handler|
68
+ options.each do |option|
69
+ handler.option(option) { |s| ['-c', s] }
70
+ end
71
+ end
72
+ end
73
+
74
+ def ask_skips
75
+ ::CLI::UI::Prompt.ask 'Choose skips', multiple: true do |handler|
76
+ handler.option('test') { '--skip-test' }
77
+ end
78
+ end
79
+
80
+ def to_opt
81
+ [
82
+ @app_path,
83
+ @is_api ? '--api' : [],
84
+ @database,
85
+ @javascript,
86
+ @css,
87
+ *@skips
88
+ ].flatten
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,39 @@
1
+ <% if gems.include? 'brakeman' %>
2
+ gem 'brakeman', group: :development
3
+ <% end %>
4
+
5
+ <% if gems.include? 'rspec' %>
6
+ gem 'factory_bot_rails', group: %i[development test]
7
+ gem 'rspec-rails', group: %i[development test]
8
+ <% end %>
9
+
10
+ <% if gems.include? 'rubocop' %>
11
+ gem 'rubocop-rails', group: :development, require: false
12
+ <% end %>
13
+
14
+ <% if gems.include? 'solargraph' %>
15
+ gem 'solargraph', group: :development
16
+ <% end %>
17
+
18
+ <% if gems.include? 'rubocop' %>
19
+ create_file '.rubocop.yml', <<~YML
20
+ require:
21
+ - rubocop-rails
22
+
23
+ AllCops:
24
+ NewCops: enable
25
+
26
+ Rails:
27
+ Enabled: true
28
+ YML
29
+ <% end %>
30
+
31
+ run 'bundle install'
32
+
33
+ <% if gems.include? 'rspec' %>
34
+ generate 'rspec:install'
35
+ <% end %>
36
+
37
+ <% if gems.include? 'rubocop' %>
38
+ run 'rubocop --auto-gen-config'
39
+ <% end %>
data/lib/mogu/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Mogu
4
- VERSION = '0.6.0'
4
+ VERSION = '0.8.1'
5
5
  end
data/lib/mogu.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'mogu/cli'
4
- require_relative 'mogu/prompt'
5
- require_relative 'mogu/template'
4
+ require_relative 'mogu/gem_command'
5
+ require_relative 'mogu/new_command'
6
6
  require_relative 'mogu/version'
7
7
 
8
8
  module Mogu; end
data/mogu.gemspec CHANGED
@@ -32,9 +32,9 @@ Gem::Specification.new do |spec|
32
32
  spec.require_paths = ['lib']
33
33
 
34
34
  # Uncomment to register a new dependency of your gem
35
+ spec.add_dependency 'cli-ui', '~> 1.0'
35
36
  spec.add_dependency 'railties', '~> 7.0'
36
37
  spec.add_dependency 'thor', '~> 1.0'
37
- spec.add_dependency 'tty-prompt', '~> 0.23'
38
38
 
39
39
  # For more information and examples about making a new gem, checkout our
40
40
  # guide at: https://bundler.io/guides/creating_gem.html
data/sig/mogu/cli.rbs ADDED
@@ -0,0 +1,10 @@
1
+ # TypeProf 0.21.2
2
+
3
+ # Classes
4
+ module Mogu
5
+ class CLI < Thor
6
+ def gem: -> void
7
+ def new: -> void
8
+ def version: -> void
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ # TypeProf 0.21.2
2
+
3
+ # Classes
4
+ module Mogu
5
+ class GemCommand
6
+ def run: -> void
7
+
8
+ private
9
+ def ask_gems: -> Array[String]
10
+ end
11
+ end
@@ -0,0 +1,25 @@
1
+ # TypeProf 0.21.2
2
+
3
+ # Classes
4
+ module Mogu
5
+ class NewCommand
6
+ @app_path: String
7
+ @is_api: bool
8
+ @database: Array[String]
9
+ @javascript: Array[String]
10
+ @css: Array[String]
11
+ @skips: Array[String]
12
+
13
+ def run: -> void
14
+
15
+ private
16
+ def ask_app_path: -> String
17
+ def confirm_is_api: -> bool
18
+ def ask_customizes: -> Array[String]
19
+ def ask_database: -> Array[String]
20
+ def ask_javascript: -> Array[String]
21
+ def ask_css: -> Array[String]
22
+ def ask_skips: -> Array[String]
23
+ def to_opt: -> Array[String]
24
+ end
25
+ end
@@ -0,0 +1,6 @@
1
+ # TypeProf 0.21.2
2
+
3
+ # Classes
4
+ module Mogu
5
+ VERSION: String
6
+ end
data/sig/patch.rbs ADDED
@@ -0,0 +1,19 @@
1
+ # Classes
2
+ module CLI
3
+ module UI
4
+ class Prompt
5
+ def self.ask: (String, ?allow_empty: bool, ?multiple: bool, ?options: Array[String]) ?{ (untyped) -> void } -> untyped
6
+ def self.confirm: (String, ?default: bool) -> bool
7
+ end
8
+ end
9
+ end
10
+
11
+ module Rails
12
+ class Command
13
+ def self.invoke: (String | Symbol, ?Array[String]) -> void
14
+ end
15
+ end
16
+
17
+ class Thor
18
+ def self.desc: (String, String) -> void
19
+ end
metadata CHANGED
@@ -1,57 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mogu
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - MoguraStore
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-04-03 00:00:00.000000000 Z
11
+ date: 2022-04-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: railties
14
+ name: cli-ui
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '7.0'
19
+ version: '1.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '7.0'
26
+ version: '1.0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: thor
28
+ name: railties
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.0'
33
+ version: '7.0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '1.0'
40
+ version: '7.0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: tty-prompt
42
+ name: thor
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0.23'
47
+ version: '1.0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0.23'
54
+ version: '1.0'
55
55
  description: CLI to create rails projects interactively.
56
56
  email:
57
57
  - 368034+lisp719@users.noreply.github.com
@@ -71,16 +71,23 @@ files:
71
71
  - LICENSE.txt
72
72
  - README.md
73
73
  - Rakefile
74
+ - Steepfile
74
75
  - bin/console
75
76
  - bin/setup
76
77
  - compose.yaml
77
78
  - exe/mogu
78
79
  - lib/mogu.rb
79
80
  - lib/mogu/cli.rb
80
- - lib/mogu/prompt.rb
81
- - lib/mogu/template.rb
81
+ - lib/mogu/gem_command.rb
82
+ - lib/mogu/new_command.rb
83
+ - lib/mogu/templates/gem.erb
82
84
  - lib/mogu/version.rb
83
85
  - mogu.gemspec
86
+ - sig/mogu/cli.rbs
87
+ - sig/mogu/gem_command.rbs
88
+ - sig/mogu/new_command.rbs
89
+ - sig/mogu/version.rbs
90
+ - sig/patch.rbs
84
91
  homepage: https://github.com/mogurastore/mogu
85
92
  licenses:
86
93
  - MIT
data/lib/mogu/prompt.rb DELETED
@@ -1,127 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'tty-prompt'
4
-
5
- module Mogu
6
- class Prompt
7
- Result = Struct.new(
8
- :app_path,
9
- :is_api,
10
- :customizes,
11
- :database,
12
- :javascript,
13
- :css,
14
- :gems,
15
- :template,
16
- keyword_init: true
17
- )
18
-
19
- def initialize
20
- @prompt = TTY::Prompt.new
21
-
22
- @result = Result.new(
23
- app_path: '',
24
- is_api: false,
25
- customizes: [],
26
- database: '',
27
- javascript: '',
28
- css: '',
29
- gems: [],
30
- template: nil
31
- )
32
- end
33
-
34
- def run
35
- @result.app_path = @prompt.ask 'Please input app path', required: true
36
- @result.is_api = @prompt.yes? 'Do you want api mode?', default: false
37
- @result.customizes = customizes
38
-
39
- @result.database = database if database?
40
- @result.javascript = javascript if javascript?
41
- @result.css = css if css?
42
- @result.gems = gems if gems?
43
- @result.template = Mogu::Template.create @result.gems if template?
44
- end
45
-
46
- def to_opt
47
- [
48
- @result.app_path,
49
- @result.is_api ? ['--api'] : [],
50
- database? ? ['-d', @result.database] : [],
51
- javascript? ? ['-j', @result.javascript] : [],
52
- css? ? ['-c', @result.css] : [],
53
- rspec? ? %w[-T] : [],
54
- template? ? ['-m', @result.template.path] : []
55
- ].flatten
56
- end
57
-
58
- private
59
-
60
- def database?
61
- @result.customizes.include? 'database'
62
- end
63
-
64
- def javascript?
65
- @result.customizes.include? 'javascript'
66
- end
67
-
68
- def css?
69
- @result.customizes.include? 'css'
70
- end
71
-
72
- def gems?
73
- @result.customizes.include? 'gems'
74
- end
75
-
76
- def rspec?
77
- @result.gems.include? 'rspec'
78
- end
79
-
80
- def template?
81
- @result.gems.any?
82
- end
83
-
84
- def css
85
- choices = %w[tailwind bootstrap bulma postcss sass]
86
-
87
- @prompt.select 'Choose css', choices
88
- end
89
-
90
- def customizes
91
- choices =
92
- if @result.is_api
93
- [
94
- { name: 'database (Default: sqlite3)', value: 'database' },
95
- { name: 'gems', value: 'gems' }
96
- ]
97
- else
98
- [
99
- { name: 'database (Default: sqlite3)', value: 'database' },
100
- { name: 'javascript (Default: importmap)', value: 'javascript' },
101
- { name: 'css', value: 'css' },
102
- { name: 'gems', value: 'gems' }
103
- ]
104
- end
105
-
106
- @prompt.multi_select 'Choose customizes', choices
107
- end
108
-
109
- def database
110
- choices = %w[sqlite3 mysql postgresql oracle sqlserver jdbcmysql jdbcsqlite3 jdbcpostgresql jdbc]
111
-
112
- @prompt.select 'Choose database', choices
113
- end
114
-
115
- def gems
116
- choices = %w[brakeman solargraph rspec rubocop]
117
-
118
- @prompt.multi_select 'Choose gems', choices
119
- end
120
-
121
- def javascript
122
- choices = %w[importmap webpack esbuild rollup]
123
-
124
- @prompt.select 'Choose javascript', choices
125
- end
126
- end
127
- end
data/lib/mogu/template.rb DELETED
@@ -1,79 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'tempfile'
4
-
5
- module Mogu
6
- class Template
7
- class << self
8
- def create(gems)
9
- template = new
10
- template.write gems
11
-
12
- template
13
- end
14
- end
15
-
16
- def initialize
17
- @file = Tempfile.new
18
- end
19
-
20
- def path
21
- @file.path
22
- end
23
-
24
- def write(gems)
25
- @file.write brakeman_code if gems.include? 'brakeman'
26
- @file.write solargraph_code if gems.include? 'solargraph'
27
- @file.write rspec_code if gems.include? 'rspec'
28
- @file.write rubocop_code if gems.include? 'rubocop'
29
-
30
- @file.rewind
31
- end
32
-
33
- private
34
-
35
- def brakeman_code
36
- <<~CODE
37
- gem 'brakeman', group: :development
38
- CODE
39
- end
40
-
41
- def solargraph_code
42
- <<~CODE
43
- gem 'solargraph', group: :development
44
- CODE
45
- end
46
-
47
- def rspec_code
48
- <<~CODE
49
- gem 'factory_bot_rails', group: %i[development test]
50
- gem 'rspec-rails', group: %i[development test]
51
-
52
- after_bundle do
53
- generate 'rspec:install'
54
- end
55
- CODE
56
- end
57
-
58
- def rubocop_code
59
- <<~CODE
60
- gem 'rubocop-rails', group: :development, require: false
61
-
62
- create_file '.rubocop.yml', <<~YML
63
- require:
64
- - rubocop-rails
65
-
66
- AllCops:
67
- NewCops: enable
68
-
69
- Rails:
70
- Enabled: true
71
- YML
72
-
73
- after_bundle do
74
- run 'rubocop --auto-gen-config'
75
- end
76
- CODE
77
- end
78
- end
79
- end