gem_generator 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 8f6652896d539c126a338591546a05a6c4ac65009eb9fd9add79ffce31412cc0
4
+ data.tar.gz: d8f5b3dd52a7f98cd2d548281cc50070de63d2ea308e53acb254ec71ee700dcc
5
+ SHA512:
6
+ metadata.gz: 14987f158b13c559f9f77846abbee7b15da524c76d77cb8eec965461a59a34255c4fe503336f65483c69b91ae31f23114dce5c5bbe4d6b08652acede07cf1302
7
+ data.tar.gz: a4d5a7cab7d3ca9e7fd8ea2266052bebb0450f6276414ac8c681241ef6ffcd45471f30ec2eb0872a4a9cca3ca5ca583fe225661d34a1577ca3d7b067bb167ed2
data/CHANGELOG.md ADDED
@@ -0,0 +1,7 @@
1
+ # Changelog
2
+
3
+ ## Unreleased
4
+
5
+ ## 0.1.0 (2021-10-05)
6
+
7
+ * Initial release.
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2020 Alexander Popov
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,67 @@
1
+ # Gem Generator
2
+
3
+ [![Cirrus CI - Base Branch Build Status](https://img.shields.io/cirrus/github/AlexWayfer/gem_generator?style=flat-square)](https://cirrus-ci.com/github/AlexWayfer/gem_generator)
4
+ [![Codecov branch](https://img.shields.io/codecov/c/github/AlexWayfer/gem_generator/main.svg?style=flat-square)](https://codecov.io/gh/AlexWayfer/gem_generator)
5
+ [![Code Climate](https://img.shields.io/codeclimate/maintainability/AlexWayfer/gem_generator.svg?style=flat-square)](https://codeclimate.com/github/AlexWayfer/gem_generator)
6
+ [![Depfu](https://img.shields.io/depfu/AlexWayfer/gem_generator?style=flat-square)](https://depfu.com/repos/github/AlexWayfer/gem_generator)
7
+ [![Inline docs](https://inch-ci.org/github/AlexWayfer/gem_generator.svg?branch=main)](https://inch-ci.org/github/AlexWayfer/gem_generator)
8
+ [![license](https://img.shields.io/github/license/AlexWayfer/gem_generator.svg?style=flat-square)](LICENSE.txt)
9
+ [![Gem](https://img.shields.io/gem/v/gem_generator.svg?style=flat-square)](https://rubygems.org/gems/gem_generator)
10
+
11
+ Gem for new gems generation.
12
+
13
+ It was created for myself, but you can suggest options for generation to adopt it for your usage.
14
+
15
+ ## Installation
16
+
17
+ Install it globally:
18
+
19
+ ```shell
20
+ gem install gem_generator
21
+ ```
22
+
23
+ ## Usage
24
+
25
+ ```sh
26
+ gem_generator --namespace=github_nickname name_of_a_new_gem
27
+ ```
28
+
29
+ You can create a config file, `.gem_generator.yaml` (or `.yml`) like this:
30
+
31
+ ```yaml
32
+ ## This can be overwriten via `--namespace` CLI option, config just as default
33
+ :namespace: AlexWayfer
34
+
35
+ ## These options have defaults from `git config --get user.*`
36
+ # :author:
37
+ # :name: Alexander Popov
38
+ # :email: alex.wayfer@gmail.com
39
+ ```
40
+
41
+ Gem Generator will look for it in each directory from current to the root,
42
+ so the common place for it in the home directory, but you can redefine it,
43
+ for example, in some directory for work projects.
44
+
45
+ ## Template creation
46
+
47
+
48
+
49
+ ## Development
50
+
51
+ After checking out the repo, run `bundle install` to install dependencies.
52
+
53
+ Then, run `toys rspec` to run the tests.
54
+
55
+ To install this gem onto your local machine, run `toys gem install`.
56
+
57
+ To release a new version, run `toys gem release %version%`.
58
+ See how it works [here](https://github.com/AlexWayfer/gem_toys#release).
59
+
60
+ ## Contributing
61
+
62
+ Bug reports and pull requests are welcome on [GitHub](https://github.com/AlexWayfer/gem_generator).
63
+
64
+ ## License
65
+
66
+ The gem is available as open source under the terms of the
67
+ [MIT License](https://opensource.org/licenses/MIT).
data/exe/gem_generator ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # frozen_string_literal: true
4
+
5
+ require_relative '../lib/gem_generator/command'
6
+
7
+ GemGenerator::Command.run
@@ -0,0 +1,161 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'clamp'
4
+ require 'erb'
5
+ require 'fileutils'
6
+ require 'pathname'
7
+
8
+ require_relative 'render_variables'
9
+
10
+ ## https://github.com/mdub/clamp#allowing-options-after-parameters
11
+ Clamp.allow_options_after_parameters = true
12
+
13
+ module GemGenerator
14
+ ## Main CLI command for Gem Generator
15
+ class Command < Clamp::Command
16
+ parameter 'NAME', 'name of a new gem'
17
+ parameter 'TEMPLATE', 'template path of a new gem'
18
+
19
+ option ['-n', '--namespace'], 'NAME', 'use NAME as repository namespace'
20
+ option ['-i', '--indentation'], 'TYPE', 'type of indentation (tabs or spaces)',
21
+ default: 'tabs' do |value|
22
+ ## TODO: Add something like `:variants` to Clamp
23
+ unless %w[tabs spaces].include? value
24
+ raise ArgumentError, 'Only `tabs` or `spaces` values acceptable'
25
+ end
26
+
27
+ value
28
+ end
29
+
30
+ attr_reader(
31
+ :path, :title, :modules, :version_constant, :github_path, :github_uri,
32
+ :author_name, :author_email
33
+ )
34
+
35
+ def execute
36
+ @directory = File.expand_path name
37
+
38
+ signal_usage_error 'the target directory already exists' if Dir.exist? @directory
39
+
40
+ ## Prevent error like '"FIXME" or "TODO" is not a description' for `bundle install`
41
+ @summary = ask_for_summary
42
+
43
+ copy_files
44
+
45
+ render_files_and_file_names
46
+
47
+ install_dependencies
48
+
49
+ ## If there is no `gem_generator` config — `render` asks `git config`
50
+ ## Also do `git add .` after all renders
51
+ initialize_git
52
+
53
+ puts 'Done.'
54
+
55
+ puts <<~HELP
56
+ To checkout into a new directory:
57
+ cd #{name}
58
+ HELP
59
+ end
60
+
61
+ private
62
+
63
+ def ask_for_summary
64
+ require 'readline'
65
+
66
+ puts 'Please, write a summary for the gem:'
67
+
68
+ result = Readline.readline('> ', true)
69
+
70
+ puts <<~TEXT
71
+
72
+ Thank you! You can write more detailed description later for `spec.description` and `README.md`.
73
+
74
+ TEXT
75
+
76
+ ## Give a time to read the hint about description
77
+ # sleep 3
78
+
79
+ result
80
+ end
81
+
82
+ def copy_files
83
+ puts 'Copying files...'
84
+
85
+ FileUtils.cp_r template, @directory
86
+
87
+ FileUtils.rm_rf "#{@directory}/.git"
88
+ end
89
+
90
+ def rename_files
91
+ puts 'Renaming files...'
92
+
93
+ { 'gem_name' => @render_variables.name, 'gem_path' => @render_variables.path }
94
+ .each do |template_name, real_name|
95
+ Dir["#{@directory}/**/*#{template_name}*"].each do |file_name|
96
+ new_file_name =
97
+ @directory + file_name.delete_prefix(@directory).gsub(template_name, real_name)
98
+
99
+ FileUtils.mkdir_p File.dirname new_file_name
100
+
101
+ File.rename file_name, new_file_name
102
+ end
103
+ end
104
+ end
105
+
106
+ def render_files_and_file_names
107
+ @render_variables = RenderVariables.new name, namespace, indentation, @summary
108
+
109
+ rename_files
110
+
111
+ begin
112
+ render_files
113
+ rescue SystemExit, Clamp::UsageError => e
114
+ FileUtils.rm_r @directory
115
+ raise e
116
+ end
117
+ end
118
+
119
+ def render_files
120
+ puts 'Rendering files...'
121
+
122
+ Dir.glob("#{@directory}/**/*.erb", File::FNM_DOTMATCH).each do |template_file|
123
+ ## Read a template file content and render it
124
+ content =
125
+ ERB.new(File.read(template_file), trim_mode: '-').result(@render_variables.get_binding)
126
+
127
+ ## Replace tabs with spaces if necessary
128
+ ## TODO: Get spaces count from `.editorconfig` file
129
+ content.gsub!(/^\t+/) { |tabs| ' ' * tabs.count("\t") } if indentation == 'spaces'
130
+
131
+ ## Render variables in file name
132
+ real_pathname = Pathname.new(template_file).sub_ext('')
133
+
134
+ ## Rename template file
135
+ File.rename template_file, real_pathname
136
+
137
+ ## Update file content
138
+ File.write real_pathname, content
139
+ end
140
+ end
141
+
142
+ def initialize_git
143
+ puts 'Initializing git...'
144
+
145
+ Dir.chdir name do
146
+ system 'git init'
147
+ system 'git add .'
148
+ end
149
+ end
150
+
151
+ def install_dependencies
152
+ puts 'Installing dependencies...'
153
+
154
+ Dir.chdir name do
155
+ system 'bundle update'
156
+
157
+ system 'npm install' if File.exist? 'package.json'
158
+ end
159
+ end
160
+ end
161
+ end
@@ -0,0 +1,132 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'yaml'
4
+ require 'memery'
5
+ require 'gorilla_patch/blank'
6
+ require 'gorilla_patch/inflections'
7
+
8
+ module GemGenerator
9
+ ## Class for a single object which should be a scope in render
10
+ class RenderVariables
11
+ include Memery
12
+
13
+ using GorillaPatch::Blank
14
+ using GorillaPatch::Inflections
15
+
16
+ attr_reader :name, :indentation, :summary
17
+
18
+ def initialize(name, namespace_option, indentation, summary)
19
+ @name = name
20
+ @namespace_option = namespace_option
21
+ @indentation = indentation
22
+ @summary = summary
23
+ end
24
+
25
+ ## `public :binding` and `send :binding` return caller binding
26
+ ## This is from ERB documentation: https://ruby-doc.org/core-2.7.2/Binding.html
27
+ # rubocop:disable Naming/AccessorMethodName
28
+ def get_binding
29
+ binding
30
+ end
31
+ # rubocop:enable Naming/AccessorMethodName
32
+
33
+ memoize def summary_quotes
34
+ summary.include?("'") ? '"' : "'"
35
+ end
36
+
37
+ memoize def description
38
+ summary.match?(/[.?!]$/) ? summary : "#{summary}."
39
+ end
40
+
41
+ memoize def path
42
+ name.tr('-', '/')
43
+ end
44
+
45
+ memoize def title
46
+ name.split(/[-_]/).map(&:camelize).join(' ')
47
+ end
48
+
49
+ memoize def module_name
50
+ path.camelize
51
+ end
52
+
53
+ memoize def modules
54
+ module_name.split('::')
55
+ end
56
+
57
+ memoize def version_constant
58
+ "#{module_name}::VERSION"
59
+ end
60
+
61
+ memoize def github_path
62
+ "#{github_namespace}/#{name}"
63
+ end
64
+
65
+ memoize def github_namespace_uri
66
+ "https://github.com/#{github_namespace}"
67
+ end
68
+
69
+ memoize def github_uri
70
+ "https://github.com/#{github_path}"
71
+ end
72
+
73
+ EXAMPLE_VALUES = {
74
+ name: 'My Name',
75
+ email: 'my.email@example.com'
76
+ }.freeze
77
+ private_constant :EXAMPLE_VALUES
78
+
79
+ %i[name email].each do |property|
80
+ method_name = "author_#{property}"
81
+
82
+ define_method method_name do
83
+ result = config.dig(:author, property) || `git config --get user.#{property}`.chomp
84
+
85
+ return result unless result.blank?
86
+
87
+ abort <<~TEXT
88
+ You have to specify project's author #{property}.
89
+ You can use `git config user.#{property} "#{EXAMPLE_VALUES[property]}"`, or create a configuration file.
90
+ Check the README.
91
+ TEXT
92
+ end
93
+
94
+ memoize method_name
95
+ end
96
+
97
+ private
98
+
99
+ memoize def github_namespace
100
+ result = @namespace_option || config[:namespace]
101
+
102
+ return result unless result.blank?
103
+
104
+ abort <<~TEXT
105
+ You have to specify project's namespace on GitHub.
106
+ You can use `--namespace` option, or create a configuration file.
107
+ Check the README.
108
+ TEXT
109
+ end
110
+
111
+ memoize def config
112
+ config_file = find_config_file
113
+ return {} unless config_file
114
+
115
+ YAML.load_file config_file
116
+ end
117
+
118
+ def find_config_file
119
+ config_lookup_directory = Dir.getwd
120
+
121
+ until (
122
+ config_file = Dir.glob(
123
+ File.join(config_lookup_directory, '.gem_generator.y{a,}ml'), File::FNM_DOTMATCH
124
+ ).first
125
+ ) || config_lookup_directory == '/'
126
+ config_lookup_directory = File.dirname config_lookup_directory
127
+ end
128
+
129
+ config_file
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GemGenerator
4
+ VERSION = '0.1.0'
5
+ end
metadata ADDED
@@ -0,0 +1,270 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gem_generator
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Alexander Popov
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2021-10-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: alt_memery
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: clamp
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.3'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: gorilla_patch
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '4.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '4.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry-byebug
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.9'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.9'
69
+ - !ruby/object:Gem::Dependency
70
+ name: bundler
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '2.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '2.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: gem_toys
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.9.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.9.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: toys
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.12.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 0.12.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: bundler-audit
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 0.9.0
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 0.9.0
125
+ - !ruby/object:Gem::Dependency
126
+ name: ffaker
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '2.19'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '2.19'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rspec
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '3.9'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '3.9'
153
+ - !ruby/object:Gem::Dependency
154
+ name: simplecov
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: 0.21.0
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: 0.21.0
167
+ - !ruby/object:Gem::Dependency
168
+ name: simplecov-cobertura
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '1.4'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '1.4'
181
+ - !ruby/object:Gem::Dependency
182
+ name: rubocop
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: 1.22.0
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: 1.22.0
195
+ - !ruby/object:Gem::Dependency
196
+ name: rubocop-performance
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: '1.0'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - "~>"
207
+ - !ruby/object:Gem::Version
208
+ version: '1.0'
209
+ - !ruby/object:Gem::Dependency
210
+ name: rubocop-rspec
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - "~>"
214
+ - !ruby/object:Gem::Version
215
+ version: '2.0'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - "~>"
221
+ - !ruby/object:Gem::Version
222
+ version: '2.0'
223
+ description: 'Generator for gems.
224
+
225
+ '
226
+ email:
227
+ - alex.wayfer@gmail.com
228
+ executables:
229
+ - gem_generator
230
+ extensions: []
231
+ extra_rdoc_files: []
232
+ files:
233
+ - CHANGELOG.md
234
+ - LICENSE.txt
235
+ - README.md
236
+ - exe/gem_generator
237
+ - lib/gem_generator/command.rb
238
+ - lib/gem_generator/render_variables.rb
239
+ - lib/gem_generator/version.rb
240
+ homepage: https://github.com/AlexWayfer/gem_generator
241
+ licenses:
242
+ - MIT
243
+ metadata:
244
+ bug_tracker_uri: https://github.com/AlexWayfer/gem_generator/issues
245
+ changelog_uri: https://github.com/AlexWayfer/gem_generator/blob/v0.1.0/CHANGELOG.md
246
+ homepage_uri: https://github.com/AlexWayfer/gem_generator
247
+ source_code_uri: https://github.com/AlexWayfer/gem_generator
248
+ post_install_message:
249
+ rdoc_options: []
250
+ require_paths:
251
+ - lib
252
+ required_ruby_version: !ruby/object:Gem::Requirement
253
+ requirements:
254
+ - - ">="
255
+ - !ruby/object:Gem::Version
256
+ version: '2.6'
257
+ - - "<"
258
+ - !ruby/object:Gem::Version
259
+ version: '4'
260
+ required_rubygems_version: !ruby/object:Gem::Requirement
261
+ requirements:
262
+ - - ">="
263
+ - !ruby/object:Gem::Version
264
+ version: '0'
265
+ requirements: []
266
+ rubygems_version: 3.2.22
267
+ signing_key:
268
+ specification_version: 4
269
+ summary: Generator for gems
270
+ test_files: []