cog 0.2.2 → 0.3.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.
- data/BuiltIn.cogfile +96 -0
- data/bin/cog +30 -39
- data/built_in/generators/sort.rb +3 -0
- data/built_in/plugins/basic/Cogfile +6 -0
- data/built_in/plugins/basic/templates/basic/generator.rb.erb +1 -0
- data/built_in/templates/cog/Cogfile.erb +40 -0
- data/built_in/templates/cog/plugin/generator.rb.erb.erb +3 -0
- data/{templates/cog/custom_tool/tool.rb.erb → built_in/templates/cog/plugin/plugin.rb.erb} +4 -11
- data/{templates → built_in/templates}/warning.erb +0 -0
- data/lib/cog.rb +25 -11
- data/lib/cog/config.rb +112 -49
- data/lib/cog/config/{language_methods.rb → language_config.rb} +23 -27
- data/lib/cog/config/plugin_config.rb +31 -0
- data/lib/cog/config/project_config.rb +48 -0
- data/lib/cog/controllers.rb +6 -8
- data/lib/cog/controllers/generator_controller.rb +30 -21
- data/lib/cog/controllers/plugin_controller.rb +43 -0
- data/lib/cog/controllers/template_controller.rb +12 -33
- data/lib/cog/dsl.rb +9 -0
- data/lib/cog/dsl/cogfile.rb +145 -0
- data/lib/cog/dsl/language_dsl.rb +142 -0
- data/lib/cog/embed_context.rb +0 -2
- data/lib/cog/embeds.rb +2 -7
- data/lib/cog/errors.rb +11 -24
- data/lib/cog/generator.rb +10 -15
- data/lib/cog/generator/file_methods.rb +2 -2
- data/lib/cog/generator/filters.rb +10 -14
- data/lib/cog/generator/language_methods.rb +2 -3
- data/lib/cog/generator_sandbox.rb +32 -0
- data/lib/cog/helpers.rb +10 -2
- data/lib/cog/helpers/cascading_set.rb +104 -0
- data/lib/cog/{embeds → helpers}/file_scanner.rb +1 -1
- data/lib/cog/language.rb +140 -0
- data/lib/cog/native_extensions.rb +2 -0
- data/lib/cog/native_extensions/array.rb +19 -0
- data/lib/cog/native_extensions/string.rb +54 -0
- data/lib/cog/plugin.rb +35 -0
- data/lib/cog/spec_helpers.rb +36 -14
- data/lib/cog/spec_helpers/matchers.rb +14 -4
- data/lib/cog/spec_helpers/matchers/match_maker.rb +1 -1
- data/lib/cog/spec_helpers/runner.rb +3 -9
- data/lib/cog/version.rb +1 -1
- metadata +27 -44
- data/Default.cogfile +0 -25
- data/lib/cog/built_in_tools.rb +0 -9
- data/lib/cog/built_in_tools/basic.rb +0 -10
- data/lib/cog/built_in_tools/basic/cog_tool.rb +0 -11
- data/lib/cog/config/cogfile.rb +0 -117
- data/lib/cog/config/lang_info.rb +0 -40
- data/lib/cog/config/project_methods.rb +0 -35
- data/lib/cog/config/tool_methods.rb +0 -94
- data/lib/cog/controllers/tool_controller.rb +0 -50
- data/lib/cog/helpers/cascading_template_set.rb +0 -75
- data/lib/cog/helpers/string.rb +0 -26
- data/lib/cog/languages.rb +0 -52
- data/lib/cog/languages/c_language.rb +0 -29
- data/lib/cog/languages/c_plus_plus_language.rb +0 -28
- data/lib/cog/languages/c_sharp_language.rb +0 -24
- data/lib/cog/languages/java_language.rb +0 -24
- data/lib/cog/languages/java_script_language.rb +0 -24
- data/lib/cog/languages/language.rb +0 -73
- data/lib/cog/languages/mixins.rb +0 -10
- data/lib/cog/languages/mixins/c_style_comments.rb +0 -23
- data/lib/cog/languages/mixins/hash_comments.rb +0 -19
- data/lib/cog/languages/python_language.rb +0 -20
- data/lib/cog/languages/qt_project_language.rb +0 -16
- data/lib/cog/languages/ruby_language.rb +0 -28
- data/lib/cog/tool.rb +0 -61
- data/lib/cog/tool/dsl.rb +0 -26
- data/templates/basic/generator.rb.erb +0 -4
- data/templates/cog/custom_tool/Gemfile.erb +0 -8
- data/templates/cog/custom_tool/LICENSE.erb +0 -18
- data/templates/cog/custom_tool/README.markdown.erb +0 -18
- data/templates/cog/custom_tool/Rakefile.erb +0 -15
- data/templates/cog/custom_tool/cog_tool.rb.erb +0 -17
- data/templates/cog/custom_tool/generator.rb.erb.erb +0 -9
- data/templates/cog/custom_tool/template.txt.erb.erb +0 -1
- data/templates/cog/custom_tool/tool.gemspec.erb +0 -17
- data/templates/cog/custom_tool/version.rb.erb +0 -5
metadata
CHANGED
@@ -5,9 +5,9 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 3
|
9
|
+
- 0
|
10
|
+
version: 0.3.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Kevin Tonon
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-12-
|
18
|
+
date: 2012-12-30 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: gli
|
@@ -111,35 +111,27 @@ extra_rdoc_files: []
|
|
111
111
|
|
112
112
|
files:
|
113
113
|
- bin/cog
|
114
|
-
-
|
114
|
+
- BuiltIn.cogfile
|
115
115
|
- LICENSE
|
116
|
-
-
|
117
|
-
-
|
118
|
-
- templates/
|
119
|
-
- templates/cog/
|
120
|
-
- templates/cog/
|
121
|
-
- templates/cog/
|
122
|
-
- templates/
|
123
|
-
-
|
124
|
-
-
|
125
|
-
-
|
126
|
-
- templates/cog/custom_tool/version.rb.erb
|
127
|
-
- templates/warning.erb
|
128
|
-
- lib/cog/built_in_tools/basic/cog_tool.rb
|
129
|
-
- lib/cog/built_in_tools/basic.rb
|
130
|
-
- lib/cog/built_in_tools.rb
|
131
|
-
- lib/cog/config/cogfile.rb
|
132
|
-
- lib/cog/config/lang_info.rb
|
133
|
-
- lib/cog/config/language_methods.rb
|
134
|
-
- lib/cog/config/project_methods.rb
|
135
|
-
- lib/cog/config/tool_methods.rb
|
116
|
+
- built_in/generators/sort.rb
|
117
|
+
- built_in/plugins/basic/Cogfile
|
118
|
+
- built_in/plugins/basic/templates/basic/generator.rb.erb
|
119
|
+
- built_in/templates/cog/Cogfile.erb
|
120
|
+
- built_in/templates/cog/plugin/generator.rb.erb.erb
|
121
|
+
- built_in/templates/cog/plugin/plugin.rb.erb
|
122
|
+
- built_in/templates/warning.erb
|
123
|
+
- lib/cog/config/language_config.rb
|
124
|
+
- lib/cog/config/plugin_config.rb
|
125
|
+
- lib/cog/config/project_config.rb
|
136
126
|
- lib/cog/config.rb
|
137
127
|
- lib/cog/controllers/generator_controller.rb
|
128
|
+
- lib/cog/controllers/plugin_controller.rb
|
138
129
|
- lib/cog/controllers/template_controller.rb
|
139
|
-
- lib/cog/controllers/tool_controller.rb
|
140
130
|
- lib/cog/controllers.rb
|
131
|
+
- lib/cog/dsl/cogfile.rb
|
132
|
+
- lib/cog/dsl/language_dsl.rb
|
133
|
+
- lib/cog/dsl.rb
|
141
134
|
- lib/cog/embed_context.rb
|
142
|
-
- lib/cog/embeds/file_scanner.rb
|
143
135
|
- lib/cog/embeds.rb
|
144
136
|
- lib/cog/errors.rb
|
145
137
|
- lib/cog/generator/file_methods.rb
|
@@ -147,28 +139,19 @@ files:
|
|
147
139
|
- lib/cog/generator/language_methods/scope.rb
|
148
140
|
- lib/cog/generator/language_methods.rb
|
149
141
|
- lib/cog/generator.rb
|
150
|
-
- lib/cog/
|
151
|
-
- lib/cog/helpers/
|
142
|
+
- lib/cog/generator_sandbox.rb
|
143
|
+
- lib/cog/helpers/cascading_set.rb
|
144
|
+
- lib/cog/helpers/file_scanner.rb
|
152
145
|
- lib/cog/helpers.rb
|
153
|
-
- lib/cog/
|
154
|
-
- lib/cog/
|
155
|
-
- lib/cog/
|
156
|
-
- lib/cog/
|
157
|
-
- lib/cog/
|
158
|
-
- lib/cog/languages/language.rb
|
159
|
-
- lib/cog/languages/mixins/c_style_comments.rb
|
160
|
-
- lib/cog/languages/mixins/hash_comments.rb
|
161
|
-
- lib/cog/languages/mixins.rb
|
162
|
-
- lib/cog/languages/python_language.rb
|
163
|
-
- lib/cog/languages/qt_project_language.rb
|
164
|
-
- lib/cog/languages/ruby_language.rb
|
165
|
-
- lib/cog/languages.rb
|
146
|
+
- lib/cog/language.rb
|
147
|
+
- lib/cog/native_extensions/array.rb
|
148
|
+
- lib/cog/native_extensions/string.rb
|
149
|
+
- lib/cog/native_extensions.rb
|
150
|
+
- lib/cog/plugin.rb
|
166
151
|
- lib/cog/spec_helpers/matchers/match_maker.rb
|
167
152
|
- lib/cog/spec_helpers/matchers.rb
|
168
153
|
- lib/cog/spec_helpers/runner.rb
|
169
154
|
- lib/cog/spec_helpers.rb
|
170
|
-
- lib/cog/tool/dsl.rb
|
171
|
-
- lib/cog/tool.rb
|
172
155
|
- lib/cog/version.rb
|
173
156
|
- lib/cog.rb
|
174
157
|
- yard-templates/default/fulldoc/html/css/common.css
|
data/Default.cogfile
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
# All paths are relative to the directory containing this file.
|
2
|
-
|
3
|
-
# Define the directory in which to find project generators
|
4
|
-
project_generators_path 'cog/generators'
|
5
|
-
|
6
|
-
# Define the directory in which to find custom project templates
|
7
|
-
project_templates_path 'cog/templates'
|
8
|
-
|
9
|
-
# Define the directory to which project source code is generated
|
10
|
-
project_source_path 'src'
|
11
|
-
|
12
|
-
# Explicitly specify a mapping from file extensions to languages
|
13
|
-
#
|
14
|
-
# key => value pairs from this mapping will override the default
|
15
|
-
# language map supplied by +cog+
|
16
|
-
#
|
17
|
-
# Type `cog language list` to see a list of supported languages
|
18
|
-
# and the current file extension mappings
|
19
|
-
language_extensions({
|
20
|
-
# :h => 'c++',
|
21
|
-
})
|
22
|
-
|
23
|
-
# Define the target language which should be used when
|
24
|
-
# creating generators, and no language is explicitly specified
|
25
|
-
default_target_language 'c++'
|
data/lib/cog/built_in_tools.rb
DELETED
data/lib/cog/config/cogfile.rb
DELETED
@@ -1,117 +0,0 @@
|
|
1
|
-
require 'active_support/core_ext'
|
2
|
-
require 'cog/languages'
|
3
|
-
|
4
|
-
module Cog
|
5
|
-
module Config
|
6
|
-
|
7
|
-
# In your project's +Cogfile+, +self+ has been set to an instance of this class.
|
8
|
-
# Typing <tt>cog init</tt> will create a +Cogfile+ in the present working directory.
|
9
|
-
#
|
10
|
-
# @example
|
11
|
-
# # All paths are relative to the directory containing this file.
|
12
|
-
#
|
13
|
-
# # Define the directory in which to find project generators
|
14
|
-
# project_generators_path 'cog/generators'
|
15
|
-
#
|
16
|
-
# # Define the directory in which to find custom project templates
|
17
|
-
# project_templates_path 'cog/templates'
|
18
|
-
#
|
19
|
-
# # Define the directory to which project source code is generated
|
20
|
-
# project_source_path 'src'
|
21
|
-
#
|
22
|
-
# # Explicitly specify a mapping from file extensions to languages
|
23
|
-
# #
|
24
|
-
# # key => value pairs from this mapping will override the default
|
25
|
-
# # language map supplied by +cog+
|
26
|
-
# #
|
27
|
-
# # Type `cog language list` to see a list of supported languages
|
28
|
-
# # and the current file extension mappings
|
29
|
-
# language_extensions({
|
30
|
-
# # :h => 'c++',
|
31
|
-
# })
|
32
|
-
#
|
33
|
-
# # Define the target language which should be used when
|
34
|
-
# # creating generators, and no language is explicitly specified
|
35
|
-
# default_target_language 'c++'
|
36
|
-
#
|
37
|
-
class Cogfile
|
38
|
-
|
39
|
-
# Initialize with an instance of {Config}
|
40
|
-
# @api developer
|
41
|
-
# @param config [Config] the object which will be configured by this Cogfile
|
42
|
-
def initialize(config)
|
43
|
-
@config = config
|
44
|
-
end
|
45
|
-
|
46
|
-
# Interpret the +Cogfile+ at {Config::ProjectMethods#cogfile_path}
|
47
|
-
# @api developer
|
48
|
-
# @return [nil]
|
49
|
-
def interpret
|
50
|
-
eval File.read(@config.cogfile_path), binding
|
51
|
-
nil
|
52
|
-
rescue Exception => e
|
53
|
-
raise CogfileError.new(e.to_s)
|
54
|
-
end
|
55
|
-
|
56
|
-
# Define the directory in which to find project generators
|
57
|
-
# @param path [String] a file system path
|
58
|
-
# @param absolute [Boolean] if +false+, the path is relative to {Config::ProjectMethods#project_root}
|
59
|
-
# @return [nil]
|
60
|
-
def project_generators_path(path, absolute=false)
|
61
|
-
@config.instance_eval do
|
62
|
-
@project_generators_path = absolute ? path : File.join(project_root, path)
|
63
|
-
end
|
64
|
-
nil
|
65
|
-
end
|
66
|
-
|
67
|
-
# Define the directory in which to find custom project templates
|
68
|
-
# @param path [String] a file system path
|
69
|
-
# @param absolute [Boolean] if +false+, the path is relative to {Config::ProjectMethods#project_root}
|
70
|
-
# @return [nil]
|
71
|
-
def project_templates_path(path, absolute=false)
|
72
|
-
@config.instance_eval do
|
73
|
-
@project_templates_path = absolute ? path : File.join(project_root, path)
|
74
|
-
end
|
75
|
-
nil
|
76
|
-
end
|
77
|
-
|
78
|
-
# Define the directory to which project source code is generated
|
79
|
-
# @param path [String] a file system path
|
80
|
-
# @param absolute [Boolean] if +false+, the path is relative to {Config::ProjectMethods#project_root}
|
81
|
-
# @return [nil]
|
82
|
-
def project_source_path(path, absolute=false)
|
83
|
-
@config.instance_eval do
|
84
|
-
@project_source_path = absolute ? path : File.join(project_root, path)
|
85
|
-
end
|
86
|
-
nil
|
87
|
-
end
|
88
|
-
|
89
|
-
# Explicitly specify a mapping from file extensions to languages
|
90
|
-
# @param map [Hash] key-value pairs from this mapping will override the default language map supplied by +cog+
|
91
|
-
# @return [nil]
|
92
|
-
def language_extensions(map)
|
93
|
-
@config.instance_eval do
|
94
|
-
@language_extension_map.update map
|
95
|
-
end
|
96
|
-
nil
|
97
|
-
end
|
98
|
-
|
99
|
-
# Define the target language which should be used when
|
100
|
-
# creating generators, and no language is explicitly specified
|
101
|
-
# @param lang_id [String] a language identifier
|
102
|
-
def default_target_language(lang_id)
|
103
|
-
@config.instance_eval do
|
104
|
-
@target_language = Cog::Languages.get_language(lang_id)
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
# For wrapping errors which occur during the processing of a {Cogfile}
|
110
|
-
class CogfileError < StandardError
|
111
|
-
def message
|
112
|
-
"in Cogfile, " + super
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
end
|
117
|
-
end
|
data/lib/cog/config/lang_info.rb
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
module Cog
|
2
|
-
module Config
|
3
|
-
|
4
|
-
# Describes configuration of a supported language
|
5
|
-
class LangInfo
|
6
|
-
# @return [String] a language identifier
|
7
|
-
attr_reader :lang_id
|
8
|
-
|
9
|
-
# @return [Array<String>] a list of aliases
|
10
|
-
attr_reader :aliases
|
11
|
-
|
12
|
-
# @return [Array<Symbol>] a list of extension which currently map to this language
|
13
|
-
attr_reader :extensions
|
14
|
-
|
15
|
-
# @return [String] readable name of the language
|
16
|
-
attr_reader :name
|
17
|
-
|
18
|
-
# @api developer
|
19
|
-
def initialize(lang_id, aliases)
|
20
|
-
@lang_id = lang_id
|
21
|
-
@aliases = aliases.dup
|
22
|
-
@name = @aliases.empty? ? @lang_id : @aliases.join(', ')
|
23
|
-
@extensions = []
|
24
|
-
end
|
25
|
-
|
26
|
-
# @param w [FixNum] width of the first column
|
27
|
-
# @return [String] one line summary in two columns
|
28
|
-
def to_s(w=nil)
|
29
|
-
w ||= name.length
|
30
|
-
"#{name.ljust w} -> #{@extensions.collect {|x| x.to_s}.sort.join ', '}"
|
31
|
-
end
|
32
|
-
|
33
|
-
# Sort by name
|
34
|
-
def <=>(other)
|
35
|
-
name <=> other.name
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
end
|
40
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
module Cog
|
2
|
-
module Config
|
3
|
-
|
4
|
-
# {Config} methods related to projects
|
5
|
-
module ProjectMethods
|
6
|
-
|
7
|
-
# @return [String] path to the project's {Cogfile}
|
8
|
-
attr_reader :cogfile_path
|
9
|
-
|
10
|
-
# @return [String] directory in which to find project generators
|
11
|
-
attr_reader :project_generators_path
|
12
|
-
|
13
|
-
# @return [String] directory in which the project's {Cogfile} is found
|
14
|
-
attr_reader :project_root
|
15
|
-
|
16
|
-
# @return [String] directory to which project source code is generated
|
17
|
-
attr_reader :project_source_path
|
18
|
-
|
19
|
-
# @return [String] directory in which to find custom project templates
|
20
|
-
attr_reader :project_templates_path
|
21
|
-
|
22
|
-
# @return [Boolean] whether or not we operating in the context of a project
|
23
|
-
def project?
|
24
|
-
!@project_root.nil?
|
25
|
-
end
|
26
|
-
|
27
|
-
# @return [Array<String>] list of paths to files in the {#project_source_path} which are written in a supported language
|
28
|
-
def supported_project_files
|
29
|
-
exts = Cog.language_extensions.join ','
|
30
|
-
Dir.glob "#{Cog.project_source_path}/**/*.{#{exts}}"
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
@@ -1,94 +0,0 @@
|
|
1
|
-
module Cog
|
2
|
-
module Config
|
3
|
-
|
4
|
-
# {Config} methods related to tools
|
5
|
-
module ToolMethods
|
6
|
-
|
7
|
-
# @return [Tool] the active tool affects the creation of new generators
|
8
|
-
def active_tool
|
9
|
-
@active_tools.last
|
10
|
-
end
|
11
|
-
|
12
|
-
# @return [Array<Tool>] a sorted list of available tools
|
13
|
-
def tools
|
14
|
-
@tools.values.sort
|
15
|
-
end
|
16
|
-
|
17
|
-
# Register built-in and custom tools.
|
18
|
-
# @api developer
|
19
|
-
#
|
20
|
-
# Custom tools are specified in the +COG_TOOLS+ environment variable.
|
21
|
-
# @return [nil]
|
22
|
-
def register_tools
|
23
|
-
# Register built-in tools
|
24
|
-
[:basic].each do |built_in|
|
25
|
-
require File.join(Cog.gem_dir, 'lib', 'cog', 'built_in_tools', built_in.to_s, 'cog_tool.rb')
|
26
|
-
end
|
27
|
-
# Register custom tools defined in COG_TOOLS
|
28
|
-
(ENV['COG_TOOLS'] || '').split(':').each do |path|
|
29
|
-
explicit = path.end_with? '.rb'
|
30
|
-
@next_tool_was_required_explicitly = explicit
|
31
|
-
path = "#{path}/cog_tool" unless explicit
|
32
|
-
begin
|
33
|
-
require path
|
34
|
-
rescue LoadError
|
35
|
-
raise Errors::CouldNotLoadTool.new path
|
36
|
-
end
|
37
|
-
end
|
38
|
-
nil
|
39
|
-
end
|
40
|
-
|
41
|
-
# Define a new +cog+ tool
|
42
|
-
# @param path [String] path to the <tt>cog_tool.rb</tt> file. This method should be called from the <tt>cog_tool.rb</tt> file, in which case <tt>__FILE__</tt> should be used as the argument
|
43
|
-
# @option opt [Boolean] :built_in (false) if +true+, then treat this tool as a built-in tool. If you are defininig a custom tool, leave this value as +false+
|
44
|
-
# @yield [Tool::DSL] define the tool
|
45
|
-
# @return [nil]
|
46
|
-
# @example
|
47
|
-
# require 'cog'
|
48
|
-
# include Cog::Generator
|
49
|
-
#
|
50
|
-
# Cog.register_tool __FILE__ do |tool|
|
51
|
-
#
|
52
|
-
# # Define a method which creates the generator
|
53
|
-
# tool.stamp_generator do |name, dest|
|
54
|
-
#
|
55
|
-
# # Setup context for the template
|
56
|
-
# @name = name
|
57
|
-
#
|
58
|
-
# # Create the generator file
|
59
|
-
# stamp 'my_tool/generator.rb', dest, :absolute_destination => true
|
60
|
-
#
|
61
|
-
# end
|
62
|
-
# end
|
63
|
-
def register_tool(path, opt={}, &block)
|
64
|
-
tool = Tool.new path, :built_in => opt[:built_in], :explicit_require => @next_tool_was_required_explicitly
|
65
|
-
dsl = Tool::DSL.new tool
|
66
|
-
block.call dsl
|
67
|
-
@tools[tool.name] = tool
|
68
|
-
nil
|
69
|
-
end
|
70
|
-
|
71
|
-
# @api developer
|
72
|
-
# @return [Boolean] whether or not a tool is registered with the given name
|
73
|
-
def tool_registered?(name)
|
74
|
-
@tools.member? name
|
75
|
-
end
|
76
|
-
|
77
|
-
# Activate the registered tool with the given name within the scope of the provided block. If no block is provided, the tool will remain active indefinitely.
|
78
|
-
# @param name [String] name of the registered tool to activate
|
79
|
-
# @yield the tool will be active within this block
|
80
|
-
# @return [nil]
|
81
|
-
def activate_tool(name, &block)
|
82
|
-
name = name.to_s
|
83
|
-
raise Errors::NoSuchTool.new(name) unless tool_registered?(name)
|
84
|
-
@tools[name].load
|
85
|
-
@active_tools << @tools[name]
|
86
|
-
if block
|
87
|
-
block.call
|
88
|
-
@active_tools.pop
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|