nugem 0.8.1 → 0.8.3
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/.rubocop.yml +2 -3
- data/CHANGELOG.md +13 -0
- data/Gemfile +26 -0
- data/README.md +23 -12
- data/exe/nugem +1 -5
- data/lib/nugem/cli/cli_gem.rb +4 -5
- data/lib/nugem/cli/cli_jekyll.rb +15 -15
- data/lib/nugem/cli/cli_rails.rb +3 -4
- data/lib/nugem/cli.rb +53 -39
- data/lib/nugem/git.rb +61 -59
- data/lib/nugem/version.rb +1 -1
- data/lib/nugem.rb +7 -22
- data/lib/util.rb +27 -0
- data/nugem.gemspec +23 -12
- data/spec/status_persistence.txt +0 -0
- data/templates/common/gem_scaffold/%gem_name%.gemspec.tt +2 -3
- data/templates/common/gem_scaffold/.bundle/config +2 -0
- data/templates/common/gem_scaffold/.gitignore.tt +27 -0
- data/templates/common/gem_scaffold/.markdownlint.json +8 -0
- data/templates/common/gem_scaffold/.rspec +4 -0
- data/templates/common/gem_scaffold/.rubocop.yml.tt +80 -0
- data/templates/common/gem_scaffold/.shellcheckrc +5 -0
- data/templates/common/gem_scaffold/.vscode/%gem_name%.json.code-snippets.tt +19 -0
- data/templates/common/gem_scaffold/.vscode/extensions.json +22 -0
- data/templates/common/gem_scaffold/.vscode/launch.json +31 -0
- data/templates/common/gem_scaffold/.vscode/settings.json +5 -0
- data/templates/common/gem_scaffold/CHANGELOG.md.tt +4 -1
- data/templates/common/gem_scaffold/Gemfile.tt +16 -28
- data/templates/common/gem_scaffold/README.md.tt +53 -13
- data/templates/common/gem_scaffold/bin/attach +2 -1
- data/templates/common/gem_scaffold/bin/build +7 -0
- data/templates/common/gem_scaffold/bin/reset +4 -0
- data/templates/common/gem_scaffold/bin/setup.tt +6 -3
- data/templates/common/gem_scaffold/lib/%gem_name%.rb.tt +2 -0
- data/templates/common/gem_scaffold/test/test_helper.rb.tt +3 -3
- data/templates/jekyll/common_scaffold/spec/spec_helper.rb +1 -1
- data/templates/jekyll/demo/demo/Gemfile.tt +6 -5
- data/templates/jekyll/demo/demo/_bin/debug +1 -1
- data/templates/rails/engine_scaffold/app/assets/images/%gem_name%/.keep +0 -0
- data/templates/rails/engine_scaffold/app/assets/javascripts/%gem_name%/.keep +0 -0
- data/templates/rails/engine_scaffold/app/assets/stylesheets/%gem_name%/.keep +0 -0
- data/templates/rails/engine_scaffold/app/controllers/.keep +0 -0
- data/templates/rails/engine_scaffold/app/helpers/.keep +0 -0
- data/templates/rails/engine_scaffold/app/mailers/.keep +0 -0
- data/templates/rails/engine_scaffold/app/models/.keep +0 -0
- data/templates/rails/engine_scaffold/app/views/.keep +0 -0
- data/templates/rails/plugin_scaffold/.envrc +1 -0
- data/templates/rails/plugin_scaffold/.simplecov.tt +18 -0
- data/templates/rails/plugin_scaffold/.travis.yml +4 -0
- data/templates/rails/plugin_scaffold/test/dummy/.envrc +1 -0
- data/templates/rails/plugin_scaffold/test/dummy/app/assets/images/.keep +0 -0
- data/templates/rails/plugin_scaffold/test/dummy/app/controllers/concerns/.keep +0 -0
- data/templates/rails/plugin_scaffold/test/dummy/app/models/.keep +0 -0
- data/templates/rails/plugin_scaffold/test/dummy/app/models/concerns/.keep +0 -0
- data/templates/rails/plugin_scaffold/test/dummy/lib/assets/.keep +0 -0
- data/templates/rails/plugin_scaffold/test/dummy/log/.keep +0 -0
- data/templates/rails/rails_scaffold/test/dummy/.envrc +1 -0
- data/templates/rails/rails_scaffold/test/dummy/app/assets/images/.keep +0 -0
- data/templates/rails/rails_scaffold/test/dummy/app/controllers/concerns/.keep +0 -0
- data/templates/rails/rails_scaffold/test/dummy/app/models/.keep +0 -0
- data/templates/rails/rails_scaffold/test/dummy/app/models/concerns/.keep +0 -0
- data/templates/rails/rails_scaffold/test/dummy/lib/assets/.keep +0 -0
- data/templates/rails/rails_scaffold/test/dummy/log/.keep +0 -0
- metadata +55 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 86b9aac101ead8ba12ce81706c0f64f37ed979fa470d424083a8de6ae9635e5f
|
4
|
+
data.tar.gz: 7f470f94df11340de30b1cba0e1d45b335b32f222fd823b676920a22ddff950e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8ce715d8f39c3403b7febcec8d381b5de2d2792822cc408acc6fcb721e761249571da1db40dd9f19574eb24a899307590ee3d71663456752fb3ae33553616b06
|
7
|
+
data.tar.gz: 987bee354b52ef35372251fcf68271cef7fef3c9e3e7e9f9b2ede36eb0049bdc3520e68b01e79d19dae54aab3757ebd21e881f27ee55075f3f3dc43e5fda2e0b
|
data/.rubocop.yml
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require:
|
2
|
-
# - rubocop-jekyll
|
3
2
|
- rubocop-md
|
3
|
+
- rubocop-minitest
|
4
4
|
- rubocop-performance
|
5
5
|
- rubocop-rake
|
6
6
|
- rubocop-rspec
|
@@ -16,7 +16,6 @@ AllCops:
|
|
16
16
|
- Rakefile
|
17
17
|
- README.md
|
18
18
|
NewCops: enable
|
19
|
-
TargetRubyVersion: 3.1.3
|
20
19
|
|
21
20
|
Gemspec/DeprecatedAttributeAssignment:
|
22
21
|
Enabled: false
|
@@ -25,7 +24,7 @@ Gemspec/RequireMFA:
|
|
25
24
|
Enabled: false
|
26
25
|
|
27
26
|
Layout/ArgumentAlignment:
|
28
|
-
EnforcedStyle:
|
27
|
+
EnforcedStyle: with_first_argument
|
29
28
|
|
30
29
|
Layout/HashAlignment:
|
31
30
|
EnforcedColonStyle: table
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## 0.8.3
|
4
|
+
|
5
|
+
* Added more files to generated projects.
|
6
|
+
* Improved generated scripts and settings.
|
7
|
+
* `plain` command has been tested.
|
8
|
+
* `jekyll` and `rails` commands are not ready yet.
|
9
|
+
|
10
|
+
## 0.8.2
|
11
|
+
|
12
|
+
* Added `.markdownlint.json` to generated projects and this project.
|
13
|
+
|
14
|
+
|
3
15
|
## 0.8.1
|
4
16
|
|
5
17
|
* Corrected broken gemspec.
|
@@ -16,6 +28,7 @@
|
|
16
28
|
* Changed the default for including an executable to `false`.
|
17
29
|
* Added the `--quiet` and `--todos` options, common to the `plain`, `jekyll` and `rails` subcommands.
|
18
30
|
|
31
|
+
|
19
32
|
## 0.7.4
|
20
33
|
|
21
34
|
* Last release was 7 years prior without a change history.
|
data/Gemfile
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
# Runtime gem dependencies are specified in nugem.gemspec
|
4
|
+
gemspec
|
5
|
+
|
6
|
+
group :development do
|
7
|
+
gem 'erb_lint'
|
8
|
+
gem 'gem-release', require: false
|
9
|
+
gem 'rubocop', require: false
|
10
|
+
gem 'rubocop-md', require: false
|
11
|
+
gem 'rubocop-minitest', require: false
|
12
|
+
gem 'rubocop-performance', require: false
|
13
|
+
gem 'rubocop-rake', require: false
|
14
|
+
gem 'rubocop-rspec', require: false
|
15
|
+
end
|
16
|
+
|
17
|
+
group :test, :development do
|
18
|
+
gem 'bundler', require: false
|
19
|
+
gem 'coveralls', require: false
|
20
|
+
gem 'debug', '>= 1.0.0', require: false
|
21
|
+
gem 'geminabox', require: false
|
22
|
+
gem 'minitest', require: false
|
23
|
+
gem 'minitest-reporters', require: false
|
24
|
+
gem 'rake', require: false
|
25
|
+
gem 'rspec', require: false
|
26
|
+
end
|
data/README.md
CHANGED
@@ -1,20 +1,29 @@
|
|
1
1
|
# `Nugem` [](https://badge.fury.io/rb/nugem)
|
2
2
|
|
3
|
-
## WORK IN PROGRESS
|
4
|
-
|
5
3
|
`Nugem` creates a scaffold project for a new gem in a new git repository.
|
6
4
|
After you add your special code to the gem scaffold,
|
7
5
|
the project is ready to be released to a public or private gem server.
|
8
6
|
|
9
|
-
This gem generates a
|
10
|
-
with the following features:
|
7
|
+
This gem generates a new working Visual Studio Code project with the following features:
|
11
8
|
|
9
|
+
- Compatible with `rbenv`.
|
10
|
+
- `Gemfile` and `.gemspec` files set up.
|
12
11
|
- Generates a README with badges.
|
13
|
-
-
|
14
|
-
-
|
15
|
-
-
|
16
|
-
-
|
17
|
-
-
|
12
|
+
- Visual Studio Code project is set up with current Ruby extensions.
|
13
|
+
- Rubocop configured.
|
14
|
+
- Shellcheck configured.
|
15
|
+
- Markdown lint configured.
|
16
|
+
- Launch configurations set up for testing.
|
17
|
+
- Can automatically create a public or private git repository on GitHub for your new gem.
|
18
|
+
- Creates a test infrastructure based on `rspec`.
|
19
|
+
- Your gem can be publicly released to `rubygems.org`.
|
20
|
+
|
21
|
+
The following features are still in development, so they probably do not work yet:
|
22
|
+
|
23
|
+
- Automatically creates git repositories on BitBucket or Geminabox.
|
24
|
+
- Creates a test infrastructure based on `minitest` and `minitest-reporters`.
|
25
|
+
- Your gem can be privately released to a Geminabox gem server.
|
26
|
+
- Your gem can include a [Thor-based executable](https://github.com/rails/thor).
|
18
27
|
- Optionally create the gem as:
|
19
28
|
- A Rails plugin, possibly with a mountable engine.
|
20
29
|
- A Jekyll plugin (tag, block tag, filter, generator, or hooks).
|
@@ -41,7 +50,8 @@ $ gem update nugem
|
|
41
50
|
|
42
51
|
## Subcommands and Options
|
43
52
|
|
44
|
-
`Nugem` has 4 subcommands `plain`, `jekyll`, `help` and `rails
|
53
|
+
`Nugem` has 4 subcommands `plain`, `jekyll`, `help` and `rails`.
|
54
|
+
Currently, only `plain` and `help` have been properly tested.
|
45
55
|
|
46
56
|
### `help` Subcommand
|
47
57
|
|
@@ -76,7 +86,8 @@ Common options for the `plain`, `jekyll` and `rails` subcommands are:
|
|
76
86
|
|
77
87
|
<dt><code>--host</code></dt>
|
78
88
|
<dd>
|
79
|
-
specifies the git host; possible values are <code>bitbucket</code>,
|
89
|
+
specifies the git host; possible values are <code>bitbucket</code>,
|
90
|
+
<code>github</code> and <code>geminabox</code>.
|
80
91
|
</dd>
|
81
92
|
|
82
93
|
<dt><code>--private</code></dt>
|
@@ -96,7 +107,7 @@ Common options for the `plain`, `jekyll` and `rails` subcommands are:
|
|
96
107
|
|
97
108
|
The `plain`, `jekyll` and `rails` subcommands have common behavior.
|
98
109
|
|
99
|
-
Gem scaffolds are created within the `generated/` directory.
|
110
|
+
Gem scaffolds are created within the `generated/` directory of the current directory.
|
100
111
|
|
101
112
|
If your user name is not already stored in your git global config,
|
102
113
|
you will be asked for your GitHub or BitBucket user name.
|
data/exe/nugem
CHANGED
data/lib/nugem/cli/cli_gem.rb
CHANGED
@@ -1,12 +1,8 @@
|
|
1
1
|
require 'thor'
|
2
2
|
|
3
|
-
# Nugem::Cli is a Thor class that is invoked when a user runs a nugem executable
|
4
|
-
require_relative '../cli'
|
5
|
-
|
6
3
|
module Nugem
|
7
4
|
class Cli < Thor
|
8
5
|
include Thor::Actions
|
9
|
-
include Nugem::Git
|
10
6
|
|
11
7
|
desc 'plain NAME', 'Creates a new plain gem scaffold.'
|
12
8
|
|
@@ -22,6 +18,9 @@ module Nugem
|
|
22
18
|
desc: 'Publish the gem in a private repository.'
|
23
19
|
|
24
20
|
def plain(gem_name)
|
21
|
+
# puts set_color("gem_name=#{gem_name}", :yellow)
|
22
|
+
super if gem_name.empty?
|
23
|
+
|
25
24
|
@dir = Nugem.dest_root gem_name
|
26
25
|
|
27
26
|
@host = options['host']
|
@@ -37,7 +36,7 @@ module Nugem
|
|
37
36
|
# Defines globals for templates
|
38
37
|
def create_plain_scaffold(gem_name)
|
39
38
|
@gem_name = gem_name
|
40
|
-
|
39
|
+
puts set_color("Creating a scaffold for a new plain Ruby gem named #{@gem_name} in #{@dir}.", :green)
|
41
40
|
@class_name = Nugem.camel_case @gem_name
|
42
41
|
@executable = options[:executable]
|
43
42
|
@host = options[:bitbucket] ? :bitbucket : :github
|
data/lib/nugem/cli/cli_jekyll.rb
CHANGED
@@ -4,7 +4,6 @@ require_relative 'jekyll_demo'
|
|
4
4
|
module Nugem
|
5
5
|
class Cli < Thor # rubocop:disable Metrics/ClassLength
|
6
6
|
include Thor::Actions
|
7
|
-
include Nugem::Git
|
8
7
|
|
9
8
|
attr_accessor :class_name, :filter_params, :trailing_args, :trailing_dump, :trailing_params
|
10
9
|
|
@@ -27,8 +26,7 @@ module Nugem
|
|
27
26
|
method_option :generator, type: :string, repeatable: true,
|
28
27
|
desc: 'Specifies a Jekyll generator.'
|
29
28
|
|
30
|
-
method_option :hooks, type: :string,
|
31
|
-
desc: 'Specifies Jekyll hooks.'
|
29
|
+
method_option :hooks, type: :string, desc: 'Specifies Jekyll hooks.'
|
32
30
|
|
33
31
|
method_option :tag, name: :string, repeatable: true,
|
34
32
|
desc: 'Specifies the name of a Jekyll tag.'
|
@@ -93,16 +91,17 @@ module Nugem
|
|
93
91
|
# list of pairs that describe each Jekyll/Liquid tag invocation option:
|
94
92
|
# [[name1, type1], ... [nameN, typeN]]
|
95
93
|
def ask_option_names_types(tag)
|
96
|
-
names = ask("Please list the names of the options for the #{tag} Jekyll/Liquid tag:").split(/[ ,\t]/)
|
94
|
+
names = ask(set_color("Please list the names of the options for the #{tag} Jekyll/Liquid tag:", :green)).split(/[ ,\t]/)
|
97
95
|
types = names.reject(&:empty?).map do |name|
|
98
|
-
ask "What is the type of #{name}? (tab autocompletes)",
|
96
|
+
ask set_color("What is the type of #{name}? (tab autocompletes)", :green),
|
97
|
+
default: 'string', limited_to: %w[boolean string numeric]
|
99
98
|
end
|
100
99
|
@jekyll_parameter_names_types = names.zip types
|
101
100
|
@jekyll_parameter_names_types
|
102
101
|
end
|
103
102
|
|
104
103
|
def create_jekyll_scaffold
|
105
|
-
|
104
|
+
puts set_color("Creating a Jekyll scaffold for a new gem named #{@gem_name} in #{@dir}", :green)
|
106
105
|
@mute = true
|
107
106
|
directory 'jekyll/common_scaffold', @dir, force: true, mode: :preserve
|
108
107
|
directory 'jekyll/demo', @dir, force: true, mode: :preserve
|
@@ -113,7 +112,7 @@ module Nugem
|
|
113
112
|
@jekyll_class_name = Nugem.camel_case block_name
|
114
113
|
ask_option_names_types block_name # Defines @jekyll_parameter_names_types, which is a nested array of name/value pairs:
|
115
114
|
# [["opt1", "string"], ["opt2", "boolean"]]
|
116
|
-
|
115
|
+
puts set_color("Creating Jekyll block tag #{@block_name} scaffold within #{@jekyll_class_name}", :green)
|
117
116
|
@mute = true
|
118
117
|
directory 'jekyll/block_scaffold', @dir, force: true, mode: :preserve
|
119
118
|
append_to_file "#{Nugem.dest_root gem_name}/demo/index.html", Cli.add_demo_example(block_name, @jekyll_parameter_names_types, :block)
|
@@ -122,7 +121,7 @@ module Nugem
|
|
122
121
|
def create_jekyll_block_no_arg_scaffold(block_name)
|
123
122
|
@block_name = block_name
|
124
123
|
@jekyll_class_name = Nugem.camel_case block_name
|
125
|
-
|
124
|
+
puts set_color("Creating Jekyll block tag no_arg #{@block_name} scaffold within #{@jekyll_class_name}", :green)
|
126
125
|
@mute = true
|
127
126
|
directory 'jekyll/block_no_arg_scaffold', @dir, force: true, mode: :preserve
|
128
127
|
append_to_file "#{Nugem.dest_root gem_name}/demo/index.html", Cli.add_demo_example(block_name, @jekyll_parameter_names_types, :block)
|
@@ -132,8 +131,9 @@ module Nugem
|
|
132
131
|
# rubocop:disable Style/StringConcatenation
|
133
132
|
@filter_name = filter_name
|
134
133
|
@jekyll_class_name = Nugem.camel_case filter_name
|
135
|
-
|
136
|
-
|
134
|
+
prompt = set_color('Jekyll filters have at least one input. ' \
|
135
|
+
"What are the names of additional inputs for #{filter_name}, if any?", :green)
|
136
|
+
@filter_params = ask(prompt)
|
137
137
|
.split(/[ ,\t]/)
|
138
138
|
.reject(&:empty?)
|
139
139
|
unless @filter_params.empty?
|
@@ -143,7 +143,7 @@ module Nugem
|
|
143
143
|
lspace = "\n "
|
144
144
|
@trailing_dump2 = lspace + @filter_params.map { |arg| "#{arg} = \#{#{arg}}" }.join(lspace) unless @filter_params.empty?
|
145
145
|
end
|
146
|
-
|
146
|
+
puts set_color("Creating a new Jekyll filter method scaffold #{@filter_name}", :green)
|
147
147
|
@mute = true
|
148
148
|
directory 'jekyll/filter_scaffold', @dir, force: true, mode: :preserve
|
149
149
|
|
@@ -155,7 +155,7 @@ module Nugem
|
|
155
155
|
def create_jekyll_generator_scaffold(generator_name)
|
156
156
|
@generator_name = generator_name
|
157
157
|
@jekyll_class_name = Nugem.camel_case generator_name
|
158
|
-
|
158
|
+
puts set_color("Creating a new Jekyll generator class scaffold #{@jekyll_class_name}", :green)
|
159
159
|
@mute = true
|
160
160
|
directory 'jekyll/generator_scaffold', @dir, force: true, mode: :preserve
|
161
161
|
end
|
@@ -163,7 +163,7 @@ module Nugem
|
|
163
163
|
def create_jekyll_hooks_scaffold(plugin_name)
|
164
164
|
@plugin_name = plugin_name
|
165
165
|
@jekyll_class_name = Nugem.camel_case plugin_name
|
166
|
-
|
166
|
+
puts set_color('Creating a new Jekyll hook scaffold', :green)
|
167
167
|
@mute = true
|
168
168
|
directory 'jekyll/hooks_scaffold', @dir, force: true, mode: :preserve
|
169
169
|
end
|
@@ -171,7 +171,7 @@ module Nugem
|
|
171
171
|
def create_jekyll_tag_no_arg_scaffold(tag_name)
|
172
172
|
@tag_name = tag_name
|
173
173
|
@jekyll_class_name = Nugem.camel_case @tag_name
|
174
|
-
|
174
|
+
puts set_color("Creating Jekyll tag no_arg #{@tag_name} scaffold within #{@jekyll_class_name}", :green)
|
175
175
|
@mute = true
|
176
176
|
directory 'jekyll/tag_no_arg_scaffold', @dir, force: true, mode: :preserve
|
177
177
|
append_to_file "#{Nugem.dest_root gem_name}/demo/index.html", Cli.add_demo_example(tag_name, @jekyll_parameter_names_types, :tag)
|
@@ -182,7 +182,7 @@ module Nugem
|
|
182
182
|
@jekyll_class_name = Nugem.camel_case @tag_name
|
183
183
|
ask_option_names_types tag_name # Defines @jekyll_parameter_names_types, which is a nested array of name/value pairs:
|
184
184
|
# [["opt1", "string"], ["opt2", "boolean"]]
|
185
|
-
|
185
|
+
puts set_color("Creating Jekyll tag #{@tag_name} scaffold within #{@jekyll_class_name}", :green)
|
186
186
|
@mute = true
|
187
187
|
# puts set_color("@jekyll_parameter_names_types=#{@jekyll_parameter_names_types}", :yellow)
|
188
188
|
directory 'jekyll/tag_scaffold', @dir, force: true, mode: :preserve
|
data/lib/nugem/cli/cli_rails.rb
CHANGED
@@ -3,7 +3,6 @@ require_relative '../cli'
|
|
3
3
|
module Nugem
|
4
4
|
class Cli < Thor
|
5
5
|
include Thor::Actions
|
6
|
-
include Nugem::Git
|
7
6
|
|
8
7
|
desc 'rails NAME', 'Creates a new Rails rails scaffold.'
|
9
8
|
|
@@ -40,17 +39,17 @@ module Nugem
|
|
40
39
|
private
|
41
40
|
|
42
41
|
def create_engine_scaffold(gem_name)
|
43
|
-
|
42
|
+
puts set_color("Creating a new Rails engine scaffold for a new gem named #{gem_name} in #{@dir}", :green)
|
44
43
|
directory 'rails/engine_scaffold', @dir, force: true, mode: :preserve
|
45
44
|
end
|
46
45
|
|
47
46
|
def create_mountable_scaffold(gem_name)
|
48
|
-
|
47
|
+
puts set_color("Creating a mountable Rails engine scaffold for a new gem named #{gem_name} in #{@dir}", :green)
|
49
48
|
directory 'rails/mountable_scaffold', @dir, force: true, mode: :preserve
|
50
49
|
end
|
51
50
|
|
52
51
|
def create_rails_scaffold(gem_name)
|
53
|
-
|
52
|
+
puts set_color("Creating a new Rails plugin scaffold as a gem named #{gem_name} in #{@dir}", :green)
|
54
53
|
directory 'rails/rails_scaffold', @dir, force: true, mode: :preserve
|
55
54
|
Dir.chdir @dir do
|
56
55
|
run 'chmod +x test/dummy/bin/*' # TODO: fix me
|
data/lib/nugem/cli.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'fileutils'
|
2
2
|
require 'rugged'
|
3
|
-
require_relative '
|
3
|
+
require_relative 'git'
|
4
|
+
require_relative 'cli/cli_gem'
|
4
5
|
|
5
6
|
# Nugem::Cli is a Thor class that is invoked when a user runs a nugem executable.
|
6
7
|
# This file defines the common aspects of the Thor class.
|
@@ -8,7 +9,15 @@ require_relative '../nugem'
|
|
8
9
|
module Nugem
|
9
10
|
class Cli < Thor
|
10
11
|
include Thor::Actions
|
11
|
-
|
12
|
+
|
13
|
+
# These declarations make the class instance variable values available as an accessor,
|
14
|
+
# which is necessary to name template files that are named '%variable_name%.extension'.
|
15
|
+
# See https://www.rubydoc.info/gems/thor/Thor/Actions#directory-instance_method
|
16
|
+
attr_reader :block_name, :filter_name, :generator_name, :tag_name, :test_framework
|
17
|
+
|
18
|
+
package_name 'Nugem'
|
19
|
+
|
20
|
+
check_unknown_options!
|
12
21
|
|
13
22
|
class_option :executable, type: :boolean, default: false,
|
14
23
|
desc: 'Include an executable for the gem.'
|
@@ -30,10 +39,7 @@ module Nugem
|
|
30
39
|
# For example: "generated/%gem_name%"
|
31
40
|
attr_accessor :gem_name
|
32
41
|
|
33
|
-
|
34
|
-
require_relative 'cli/cli_jekyll'
|
35
|
-
require_relative 'cli/cli_rails'
|
36
|
-
|
42
|
+
# Return a non-zero status code on error. See https://github.com/rails/thor/issues/244
|
37
43
|
def self.exit_on_failure?
|
38
44
|
true
|
39
45
|
end
|
@@ -43,48 +49,56 @@ module Nugem
|
|
43
49
|
File.expand_path '../../templates', __dir__
|
44
50
|
end
|
45
51
|
|
52
|
+
def self.test_option(default_value)
|
53
|
+
method_option :test_framework, type: :string, default: default_value,
|
54
|
+
enum: %w[minitest rspec],
|
55
|
+
desc: "Use rspec or minitest for the test framework (default is #{default_value})."
|
56
|
+
end
|
57
|
+
|
46
58
|
def self.todo
|
47
59
|
'TODO: ' if @todos
|
48
60
|
end
|
49
61
|
|
50
|
-
|
51
|
-
|
52
|
-
def count_todos(filename)
|
53
|
-
filename_fq = "#{Nugem.dest_root gem_name}/#{filename}"
|
54
|
-
content = File.read filename_fq
|
55
|
-
content.scan('TODO').length
|
56
|
-
end
|
62
|
+
require_relative 'cli/cli_jekyll'
|
63
|
+
require_relative 'cli/cli_rails'
|
57
64
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
create_local_git_repository
|
64
|
-
FileUtils.rm_f 'Gemfile.lock'
|
65
|
-
# say "Running 'bundle install'", :green
|
66
|
-
# run 'bundle', abort_on_failure: false
|
67
|
-
say 'Creating remote repository', :green
|
68
|
-
create_remote_git_repository @repository \
|
69
|
-
if yes? "Do you want to create a repository on #{@repository.host.camel_case} named #{gem_name}? (y/N)"
|
65
|
+
no_tasks do
|
66
|
+
def count_todos(filename)
|
67
|
+
filename_fq = "#{Nugem.dest_root gem_name}/#{filename}"
|
68
|
+
content = File.read filename_fq
|
69
|
+
content.scan('TODO').length
|
70
70
|
end
|
71
|
-
say "The #{gem_name} gem was successfully created.", :green
|
72
|
-
report_todos gem_name
|
73
|
-
end
|
74
71
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
72
|
+
def initialize_repository(gem_name)
|
73
|
+
Dir.chdir Nugem.dest_root(gem_name) do
|
74
|
+
# puts set_color("Working in #{Dir.pwd}", :green)
|
75
|
+
run 'chmod +x bin/*'
|
76
|
+
run 'chmod +x exe/*' if @executable
|
77
|
+
create_local_git_repository
|
78
|
+
FileUtils.rm_f 'Gemfile.lock'
|
79
|
+
# puts set_color("Running 'bundle install'", :green)
|
80
|
+
# run 'bundle', abort_on_failure: false
|
81
|
+
create_remote_git_repository @repository \
|
82
|
+
if yes? set_color("Do you want to create a repository on #{@repository.host.camel_case} named #{gem_name}? (y/N)", :green)
|
83
|
+
end
|
84
|
+
puts set_color("The #{gem_name} gem was successfully created.", :green)
|
85
|
+
report_todos gem_name
|
81
86
|
end
|
82
87
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
+
def report_todos(gem_name)
|
89
|
+
gemspec_todos = count_todos "#{gem_name}.gemspec"
|
90
|
+
readme_todos = count_todos 'README.md'
|
91
|
+
if readme_todos.zero? && gemspec_todos.zero?
|
92
|
+
puts set_color("There are no TODOs. You can run 'bundle install' from within your new gem project now.", :blue)
|
93
|
+
return
|
94
|
+
end
|
95
|
+
|
96
|
+
msg = 'Please complete'
|
97
|
+
msg << " the #{gemspec_todos} TODOs in #{gem_name}.gemspec" if gemspec_todos.positive?
|
98
|
+
msg << ' and' if gemspec_todos.positive? && readme_todos.positive?
|
99
|
+
msg << " the #{readme_todos} TODOs in README.md." if readme_todos.positive?
|
100
|
+
puts set_color(msg, :yellow)
|
101
|
+
end
|
88
102
|
end
|
89
103
|
end
|
90
104
|
end
|
data/lib/nugem/git.rb
CHANGED
@@ -2,79 +2,81 @@ require 'thor'
|
|
2
2
|
require 'yaml'
|
3
3
|
|
4
4
|
module Nugem
|
5
|
-
|
5
|
+
class Cli < Thor
|
6
6
|
include Thor::Actions
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
no_tasks do
|
9
|
+
def create_local_git_repository
|
10
|
+
puts set_color('Creating the local git repository', :green)
|
11
|
+
run 'git init'
|
12
|
+
run 'git add .'
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
|
14
|
+
# See https://github.com/rails/thor/blob/v1.2.2/lib/thor/actions.rb#L236-L278
|
15
|
+
run "git commit -aqm 'Initial commit'", abort_on_failure: false
|
16
|
+
end
|
16
17
|
|
17
|
-
|
18
|
-
|
19
|
-
|
18
|
+
def github_config
|
19
|
+
gh_hosts_file = Nugem.expand_env('$HOME/.config/gh/hosts.yml')
|
20
|
+
return nil unless File.exist? gh_hosts_file
|
20
21
|
|
21
|
-
|
22
|
-
|
22
|
+
YAML.safe_load_file(gh_hosts_file)
|
23
|
+
end
|
23
24
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
25
|
+
def create_remote_git_repository(repository)
|
26
|
+
puts set_color("Creating a remote #{repository.host} repository", :green)
|
27
|
+
if repository.github?
|
28
|
+
gh_config = github_config
|
29
|
+
token = gh_config&.dig('github.com', 'oauth_token')
|
29
30
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
31
|
+
token ||= ask('What is your Github personal access token', echo: false)
|
32
|
+
run <<~END_CURL
|
33
|
+
curl --request POST \
|
34
|
+
--user '#{repository.user}:#{token}' \
|
35
|
+
https://api.github.com/user/repos \
|
36
|
+
-d '{"name":"#{repository.name}", "private":#{repository.private?}}'
|
37
|
+
END_CURL
|
38
|
+
else # BitBucket
|
39
|
+
password = ask('Please enter your Bitbucket password', echo: false)
|
40
|
+
fork_policy = repository.public? ? 'allow_forks' : 'no_public_forks'
|
41
|
+
run <<~END_BITBUCKET
|
42
|
+
curl --request POST \
|
43
|
+
--user #{repository.user}:#{password} \
|
44
|
+
https://api.bitbucket.org/2.0/repositories/#{repository.user}/#{repository.name} \
|
45
|
+
-d '{"scm":"git", "fork_policy":"#{fork_policy}", "is_private":"#{repository.private?}"}'
|
46
|
+
END_BITBUCKET
|
47
|
+
end
|
48
|
+
run "git remote add origin #{repository.origin}"
|
49
|
+
puts set_color("Pushing initial commit to remote #{repository.host} repository", :green)
|
50
|
+
run 'git push -u origin master'
|
46
51
|
end
|
47
|
-
run "git remote add origin #{repository.origin}"
|
48
|
-
say "Pushing initial commit to remote #{repository.host} repository", :green
|
49
|
-
run 'git push -u origin master'
|
50
|
-
end
|
51
52
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
53
|
+
def git_repository_user_name(host)
|
54
|
+
global_config = Rugged::Config.global
|
55
|
+
git_config_key = "nugem.#{host}user"
|
56
|
+
user = global_config[git_config_key]
|
56
57
|
|
57
|
-
|
58
|
-
|
58
|
+
gh_config = github_config
|
59
|
+
user ||= gh_config&.dig('github.com', 'user')
|
59
60
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
61
|
+
user = ask "What is your #{host} user name?" if user.to_s.empty?
|
62
|
+
global_config[git_config_key] = user if user != global_config[git_config_key]
|
63
|
+
user
|
64
|
+
end
|
64
65
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
66
|
+
def gem_server_url(private_)
|
67
|
+
if private_
|
68
|
+
global_config = Rugged::Config.global
|
69
|
+
git_config_key = 'nugem.gemserver'
|
70
|
+
url = global_config[git_config_key]
|
70
71
|
|
71
|
-
|
72
|
-
|
73
|
-
|
72
|
+
if url.to_s.empty?
|
73
|
+
url = ask('What is the url of your Geminabox server?')
|
74
|
+
global_config[git_config_key] = url
|
75
|
+
end
|
76
|
+
url
|
77
|
+
else
|
78
|
+
'https://rubygems.org'
|
74
79
|
end
|
75
|
-
url
|
76
|
-
else
|
77
|
-
'https://rubygems.org'
|
78
80
|
end
|
79
81
|
end
|
80
82
|
end
|
data/lib/nugem/version.rb
CHANGED
data/lib/nugem.rb
CHANGED
@@ -1,31 +1,16 @@
|
|
1
1
|
require 'thor'
|
2
|
-
require_relative 'nugem/git'
|
3
|
-
require_relative 'nugem/repository'
|
4
|
-
require_relative 'nugem/version'
|
5
2
|
require_relative 'util'
|
6
3
|
|
4
|
+
Signal.trap('INT') { exit }
|
5
|
+
|
7
6
|
module Nugem
|
8
7
|
# @return Path to the generated gem
|
9
8
|
def self.dest_root(gem_name)
|
10
9
|
File.expand_path "generated/#{gem_name}"
|
11
10
|
end
|
12
|
-
|
13
|
-
class Cli < Thor
|
14
|
-
include Thor::Actions
|
15
|
-
|
16
|
-
package_name 'Nugem'
|
17
|
-
|
18
|
-
# These declarations make the class instance variable values available as an accessor,
|
19
|
-
# which is necessary to name template files that are named '%variable_name%.extension'.
|
20
|
-
# See https://www.rubydoc.info/gems/thor/Thor/Actions#directory-instance_method
|
21
|
-
attr_reader :block_name, :filter_name, :generator_name, :tag_name, :test_framework
|
22
|
-
|
23
|
-
class << self
|
24
|
-
def test_option(default_value)
|
25
|
-
method_option :test_framework, type: :string, default: default_value,
|
26
|
-
enum: %w[minitest rspec],
|
27
|
-
desc: "Use rspec or minitest for the test framework (default is #{default_value})."
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
11
|
end
|
12
|
+
|
13
|
+
require_relative 'nugem/git'
|
14
|
+
require_relative 'nugem/cli'
|
15
|
+
require_relative 'nugem/repository'
|
16
|
+
require_relative 'nugem/version'
|