nugem 0.8.1 → 0.8.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +2 -3
  3. data/CHANGELOG.md +13 -0
  4. data/Gemfile +26 -0
  5. data/README.md +23 -12
  6. data/exe/nugem +1 -5
  7. data/lib/nugem/cli/cli_gem.rb +4 -5
  8. data/lib/nugem/cli/cli_jekyll.rb +15 -15
  9. data/lib/nugem/cli/cli_rails.rb +3 -4
  10. data/lib/nugem/cli.rb +53 -39
  11. data/lib/nugem/git.rb +61 -59
  12. data/lib/nugem/version.rb +1 -1
  13. data/lib/nugem.rb +7 -22
  14. data/lib/util.rb +27 -0
  15. data/nugem.gemspec +23 -12
  16. data/spec/status_persistence.txt +0 -0
  17. data/templates/common/gem_scaffold/%gem_name%.gemspec.tt +2 -3
  18. data/templates/common/gem_scaffold/.bundle/config +2 -0
  19. data/templates/common/gem_scaffold/.gitignore.tt +27 -0
  20. data/templates/common/gem_scaffold/.markdownlint.json +8 -0
  21. data/templates/common/gem_scaffold/.rspec +4 -0
  22. data/templates/common/gem_scaffold/.rubocop.yml.tt +80 -0
  23. data/templates/common/gem_scaffold/.shellcheckrc +5 -0
  24. data/templates/common/gem_scaffold/.vscode/%gem_name%.json.code-snippets.tt +19 -0
  25. data/templates/common/gem_scaffold/.vscode/extensions.json +22 -0
  26. data/templates/common/gem_scaffold/.vscode/launch.json +31 -0
  27. data/templates/common/gem_scaffold/.vscode/settings.json +5 -0
  28. data/templates/common/gem_scaffold/CHANGELOG.md.tt +4 -1
  29. data/templates/common/gem_scaffold/Gemfile.tt +16 -28
  30. data/templates/common/gem_scaffold/README.md.tt +53 -13
  31. data/templates/common/gem_scaffold/bin/attach +2 -1
  32. data/templates/common/gem_scaffold/bin/build +7 -0
  33. data/templates/common/gem_scaffold/bin/reset +4 -0
  34. data/templates/common/gem_scaffold/bin/setup.tt +6 -3
  35. data/templates/common/gem_scaffold/lib/%gem_name%.rb.tt +2 -0
  36. data/templates/common/gem_scaffold/test/test_helper.rb.tt +3 -3
  37. data/templates/jekyll/common_scaffold/spec/spec_helper.rb +1 -1
  38. data/templates/jekyll/demo/demo/Gemfile.tt +6 -5
  39. data/templates/jekyll/demo/demo/_bin/debug +1 -1
  40. data/templates/rails/engine_scaffold/app/assets/images/%gem_name%/.keep +0 -0
  41. data/templates/rails/engine_scaffold/app/assets/javascripts/%gem_name%/.keep +0 -0
  42. data/templates/rails/engine_scaffold/app/assets/stylesheets/%gem_name%/.keep +0 -0
  43. data/templates/rails/engine_scaffold/app/controllers/.keep +0 -0
  44. data/templates/rails/engine_scaffold/app/helpers/.keep +0 -0
  45. data/templates/rails/engine_scaffold/app/mailers/.keep +0 -0
  46. data/templates/rails/engine_scaffold/app/models/.keep +0 -0
  47. data/templates/rails/engine_scaffold/app/views/.keep +0 -0
  48. data/templates/rails/plugin_scaffold/.envrc +1 -0
  49. data/templates/rails/plugin_scaffold/.simplecov.tt +18 -0
  50. data/templates/rails/plugin_scaffold/.travis.yml +4 -0
  51. data/templates/rails/plugin_scaffold/test/dummy/.envrc +1 -0
  52. data/templates/rails/plugin_scaffold/test/dummy/app/assets/images/.keep +0 -0
  53. data/templates/rails/plugin_scaffold/test/dummy/app/controllers/concerns/.keep +0 -0
  54. data/templates/rails/plugin_scaffold/test/dummy/app/models/.keep +0 -0
  55. data/templates/rails/plugin_scaffold/test/dummy/app/models/concerns/.keep +0 -0
  56. data/templates/rails/plugin_scaffold/test/dummy/lib/assets/.keep +0 -0
  57. data/templates/rails/plugin_scaffold/test/dummy/log/.keep +0 -0
  58. data/templates/rails/rails_scaffold/test/dummy/.envrc +1 -0
  59. data/templates/rails/rails_scaffold/test/dummy/app/assets/images/.keep +0 -0
  60. data/templates/rails/rails_scaffold/test/dummy/app/controllers/concerns/.keep +0 -0
  61. data/templates/rails/rails_scaffold/test/dummy/app/models/.keep +0 -0
  62. data/templates/rails/rails_scaffold/test/dummy/app/models/concerns/.keep +0 -0
  63. data/templates/rails/rails_scaffold/test/dummy/lib/assets/.keep +0 -0
  64. data/templates/rails/rails_scaffold/test/dummy/log/.keep +0 -0
  65. metadata +55 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: aec69f699e43e3648a4e01a6b82142c29df26cc655d0391e45aa64d1cfca53eb
4
- data.tar.gz: ed6d1d27b7ca1b63409c1123bae4b0128abfa63fa9cb4562e9b4e854d697e41e
3
+ metadata.gz: 86b9aac101ead8ba12ce81706c0f64f37ed979fa470d424083a8de6ae9635e5f
4
+ data.tar.gz: 7f470f94df11340de30b1cba0e1d45b335b32f222fd823b676920a22ddff950e
5
5
  SHA512:
6
- metadata.gz: 145bb85a469d0fb62fa1b841f81e143f6d3d208ed0c6bdf843295eaa632950fd5dd7adab1dfde67f26d9122c53efadd1334cbc916d1244c585e839893ce0ec74
7
- data.tar.gz: 1ee0b25be2d1e54f06ca5186f98f89ac90c8456cbb2763e16268cde0a52e56272432b43ab44e3c3829aa68fa3e9f978b92e48d3f3d46f8a30f4569ab983414be
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: with_fixed_indentation
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` [![Gem Version](https://badge.fury.io/rb/nugem.svg)](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 scaffold with all files you need to start,
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
- - Automatically creates local and remote git repositories (on GitHub, BitBucket or Geminabox) for your new gem.
14
- - Remote repositories can be private or public.
15
- - Can include a [Thor-based executable](https://github.com/rails/thor).
16
- - Creates a test infrastructure based on `rspec` or `minitest` and `minitest-reporters`.
17
- - Ready to publicly release to `rubygems.org` or to a private Geminabox gem server.
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>, <code>github</code> and <code>geminabox</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
@@ -1,9 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- if File.exist? 'lib/nugem/cli.rb'
4
- require_relative '../lib/nugem/cli'
5
- else
6
- require 'nugem/cli'
7
- end
3
+ require 'nugem'
8
4
 
9
5
  Nugem::Cli.start
@@ -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
- say "Creating a scaffold for a new plain Ruby gem named #{@gem_name} in #{@dir}.", :green
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
@@ -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)", default: 'string', limited_to: %w[boolean string numeric]
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
- say "Creating a Jekyll scaffold for a new gem named #{@gem_name} in #{@dir}", :green
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
- say "Creating Jekyll block tag #{@block_name} scaffold within #{@jekyll_class_name}", :green
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
- say "Creating Jekyll block tag no_arg #{@block_name} scaffold within #{@jekyll_class_name}", :green
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
- @filter_params = ask('Jekyll filters have at least one input. ' \
136
- "What are the names of additional inputs for #{filter_name}, if any?")
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
- say "Creating a new Jekyll filter method scaffold #{@filter_name}", :green
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
- say "Creating a new Jekyll generator class scaffold #{@jekyll_class_name}", :green
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
- say 'Creating a new Jekyll hook scaffold', :green
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
- say "Creating Jekyll tag no_arg #{@tag_name} scaffold within #{@jekyll_class_name}", :green
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
- say "Creating Jekyll tag #{@tag_name} scaffold within #{@jekyll_class_name}", :green
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
@@ -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
- say "Creating a new Rails engine scaffold for a new gem named #{gem_name} in #{@dir}", :green
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
- say "Creating a mountable Rails engine scaffold for a new gem named #{gem_name} in #{@dir}", :green
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
- say "Creating a new Rails plugin scaffold as a gem named #{gem_name} in #{@dir}", :green
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 '../nugem'
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
- include Nugem::Git
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
- require_relative 'cli/cli_gem'
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
- private
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
- def initialize_repository(gem_name)
59
- Dir.chdir Nugem.dest_root(gem_name) do
60
- # say "Working in #{Dir.pwd}", :green
61
- run 'chmod +x bin/*'
62
- run 'chmod +x exe/*' if @executable
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
- def report_todos(gem_name)
76
- gemspec_todos = count_todos "#{gem_name}.gemspec"
77
- readme_todos = count_todos 'README.md'
78
- if readme_todos.zero? && gemspec_todos.zero?
79
- say "There are no TODOs. You can run 'bundle install' from within your new gem project now.", :blue
80
- return
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
- msg = 'Please complete'
84
- msg << " the #{gemspec_todos} TODOs in #{gem_name}.gemspec" if gemspec_todos.positive?
85
- msg << ' and' if gemspec_todos.positive? && readme_todos.positive?
86
- msg << " the #{readme_todos} TODOs in README.md." if readme_todos.positive?
87
- say msg, :yellow
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
- module Git
5
+ class Cli < Thor
6
6
  include Thor::Actions
7
7
 
8
- def create_local_git_repository
9
- say 'Creating the local git repository', :green
10
- run 'git init'
11
- run 'git add .'
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
- # See https://github.com/rails/thor/blob/v1.2.2/lib/thor/actions.rb#L236-L278
14
- run "git commit -aqm 'Initial commit'", abort_on_failure: false
15
- end
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
- def github_config
18
- gh_hosts_file = Nugem.expand_env('$HOME/.config/gh/hosts.yml')
19
- return nil unless File.exist? gh_hosts_file
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
- YAML.safe_load(File.read(gh_hosts_file))
22
- end
22
+ YAML.safe_load_file(gh_hosts_file)
23
+ end
23
24
 
24
- def create_remote_git_repository(repository)
25
- say "Creating a remote #{repository.host} repository", :green
26
- if repository.github?
27
- gh_config = github_config
28
- token = gh_config&.dig('github.com', 'oauth_token')
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
- token ||= ask('What is your Github personal access token', echo: false)
31
- run <<~END_CURL
32
- curl --request POST \
33
- --user '#{repository.user}:#{token}' \
34
- https://api.github.com/user/repos \
35
- -d '{"name":"#{repository.name}", "private":#{repository.private?}}'
36
- END_CURL
37
- else # BitBucket
38
- password = ask('Please enter your Bitbucket password', echo: false)
39
- fork_policy = repository.public? ? 'allow_forks' : 'no_public_forks'
40
- run <<~END_BITBUCKET
41
- curl --request POST \
42
- --user #{repository.user}:#{password} \
43
- https://api.bitbucket.org/2.0/repositories/#{repository.user}/#{repository.name} \
44
- -d '{"scm":"git", "fork_policy":"#{fork_policy}", "is_private":"#{repository.private?}"}'
45
- END_BITBUCKET
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
- def git_repository_user_name(host)
53
- global_config = Rugged::Config.global
54
- git_config_key = "nugem.#{host}user"
55
- user = global_config[git_config_key]
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
- gh_config = github_config
58
- user ||= gh_config&.dig('github.com', 'user')
58
+ gh_config = github_config
59
+ user ||= gh_config&.dig('github.com', 'user')
59
60
 
60
- user = ask "What is your #{host} user name?" if user.to_s.empty?
61
- global_config[git_config_key] = user if user != global_config[git_config_key]
62
- user
63
- end
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
- def gem_server_url(private_)
66
- if private_
67
- global_config = Rugged::Config.global
68
- git_config_key = 'nugem.gemserver'
69
- url = global_config[git_config_key]
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
- if url.to_s.empty?
72
- url = ask('What is the url of your Geminabox server?')
73
- global_config[git_config_key] = url
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
@@ -1,3 +1,3 @@
1
1
  module Nugem
2
- VERSION = '0.8.1'.freeze
2
+ VERSION = '0.8.3'.freeze
3
3
  end
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'