gemsmith 7.7.0 → 8.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/README.md +114 -118
  5. data/bin/gemsmith +2 -1
  6. data/lib/gemsmith/cli.rb +195 -99
  7. data/lib/gemsmith/cli_helpers.rb +8 -19
  8. data/lib/gemsmith/credentials.rb +2 -2
  9. data/lib/gemsmith/gem/inspector.rb +30 -0
  10. data/lib/gemsmith/gem/module_formatter.rb +51 -0
  11. data/lib/gemsmith/gem/requirement.rb +2 -0
  12. data/lib/gemsmith/{aids/gem_spec.rb → gem/specification.rb} +19 -26
  13. data/lib/gemsmith/generators/base.rb +33 -0
  14. data/lib/gemsmith/generators/bundler.rb +15 -0
  15. data/lib/gemsmith/generators/cli.rb +17 -0
  16. data/lib/gemsmith/generators/code_climate.rb +14 -0
  17. data/lib/gemsmith/generators/documentation.rb +28 -0
  18. data/lib/gemsmith/generators/gem.rb +17 -0
  19. data/lib/gemsmith/{skeletons/git_skeleton.rb → generators/git.rb} +13 -7
  20. data/lib/gemsmith/generators/git_hub.rb +14 -0
  21. data/lib/gemsmith/generators/guard.rb +13 -0
  22. data/lib/gemsmith/generators/pragma.rb +40 -0
  23. data/lib/gemsmith/generators/rails.rb +85 -0
  24. data/lib/gemsmith/generators/rake.rb +40 -0
  25. data/lib/gemsmith/generators/reek.rb +13 -0
  26. data/lib/gemsmith/generators/rspec.rb +23 -0
  27. data/lib/gemsmith/generators/rubocop.rb +16 -0
  28. data/lib/gemsmith/{skeletons/ruby_skeleton.rb → generators/ruby.rb} +5 -5
  29. data/lib/gemsmith/generators/scss_lint.rb +13 -0
  30. data/lib/gemsmith/generators/travis.rb +13 -0
  31. data/lib/gemsmith/git.rb +19 -0
  32. data/lib/gemsmith/identity.rb +1 -1
  33. data/lib/gemsmith/rake/builder.rb +65 -0
  34. data/lib/gemsmith/rake/{release.rb → publisher.rb} +14 -5
  35. data/lib/gemsmith/rake/tasks.rb +32 -20
  36. data/lib/gemsmith/template_helper.rb +28 -0
  37. data/lib/gemsmith/templates/%gem_name%/%gem_name%.gemspec.tt +30 -28
  38. data/lib/gemsmith/templates/%gem_name%/.codeclimate.yml.tt +36 -0
  39. data/lib/gemsmith/templates/%gem_name%/.rubocop.yml.tt +9 -1
  40. data/lib/gemsmith/templates/%gem_name%/.travis.yml.tt +4 -1
  41. data/lib/gemsmith/templates/%gem_name%/{CHANGELOG.md.tt → CHANGES.md.tt} +0 -0
  42. data/lib/gemsmith/templates/%gem_name%/Guardfile.tt +1 -1
  43. data/lib/gemsmith/templates/%gem_name%/README.md.tt +20 -18
  44. data/lib/gemsmith/templates/%gem_name%/Rakefile.tt +6 -1
  45. data/lib/gemsmith/templates/%gem_name%/bin/%gem_name%.tt +4 -4
  46. data/lib/gemsmith/templates/%gem_name%/bin/setup.tt +1 -1
  47. data/lib/gemsmith/templates/%gem_name%/lib/%gem_path%.rb.tt +4 -0
  48. data/lib/gemsmith/templates/%gem_name%/lib/%gem_path%/cli.rb.tt +54 -0
  49. data/lib/gemsmith/templates/%gem_name%/lib/{%gem_name% → %gem_path%}/engine.rb.tt +2 -4
  50. data/lib/gemsmith/templates/%gem_name%/lib/{%gem_name% → %gem_path%}/identity.rb.tt +3 -5
  51. data/lib/gemsmith/templates/%gem_name%/lib/generators/{%gem_name% → %gem_path%}/install/USAGE.tt +0 -0
  52. data/lib/gemsmith/templates/%gem_name%/lib/generators/{%gem_name% → %gem_path%}/install/install_generator.rb.tt +2 -5
  53. data/lib/gemsmith/templates/%gem_name%/lib/generators/{%gem_name% → %gem_path%}/upgrade/USAGE.tt +0 -0
  54. data/lib/gemsmith/templates/%gem_name%/lib/generators/{%gem_name% → %gem_path%}/upgrade/upgrade_generator.rb.tt +2 -5
  55. data/lib/gemsmith/templates/%gem_name%/lib/tasks/reek.rake.tt +6 -0
  56. data/lib/gemsmith/templates/%gem_name%/lib/tasks/scss_lint.rake.tt +6 -0
  57. data/lib/gemsmith/templates/%gem_name%/spec/lib/%gem_path%/cli_spec.rb.tt +83 -0
  58. data/lib/gemsmith/templates/%gem_name%/spec/rails_helper.rb.tt +14 -0
  59. data/lib/gemsmith/templates/%gem_name%/spec/spec_helper.rb.tt +29 -16
  60. data/lib/gemsmith/templates/%gem_name%/spec/support/shared_contexts/temp_dir.rb.tt +9 -0
  61. data/lib/tasks/reek.rake +8 -0
  62. data/lib/tasks/rspec.rake +2 -0
  63. data/lib/tasks/rubocop.rake +2 -0
  64. metadata +138 -149
  65. metadata.gz.sig +0 -0
  66. data/lib/gemsmith/aids/git.rb +0 -12
  67. data/lib/gemsmith/aids/spec.rb +0 -46
  68. data/lib/gemsmith/configuration.rb +0 -200
  69. data/lib/gemsmith/rake/build.rb +0 -38
  70. data/lib/gemsmith/skeletons/base_skeleton.rb +0 -29
  71. data/lib/gemsmith/skeletons/bundler_skeleton.rb +0 -15
  72. data/lib/gemsmith/skeletons/cli_skeleton.rb +0 -16
  73. data/lib/gemsmith/skeletons/documentation_skeleton.rb +0 -28
  74. data/lib/gemsmith/skeletons/gem_skeleton.rb +0 -17
  75. data/lib/gemsmith/skeletons/git_hub_skeleton.rb +0 -14
  76. data/lib/gemsmith/skeletons/guard_skeleton.rb +0 -13
  77. data/lib/gemsmith/skeletons/pry_skeleton.rb +0 -13
  78. data/lib/gemsmith/skeletons/rails_skeleton.rb +0 -61
  79. data/lib/gemsmith/skeletons/rake_skeleton.rb +0 -37
  80. data/lib/gemsmith/skeletons/rspec_skeleton.rb +0 -26
  81. data/lib/gemsmith/skeletons/rubocop_skeleton.rb +0 -15
  82. data/lib/gemsmith/skeletons/travis_skeleton.rb +0 -13
  83. data/lib/gemsmith/templates/%gem_name%/lib/%gem_name%.rb.tt +0 -6
  84. data/lib/gemsmith/templates/%gem_name%/lib/%gem_name%/cli.rb.tt +0 -40
  85. data/lib/gemsmith/templates/%gem_name%/lib/tasks/console.rake.tt +0 -7
  86. data/lib/gemsmith/templates/%gem_name%/spec/lib/%gem_name%/%gem_name%_spec.rb.tt +0 -7
  87. data/lib/gemsmith/templates/%gem_name%/spec/support/extensions/pry.rb.tt +0 -5
  88. data/lib/gemsmith/templates/%gem_name%/spec/support/kit/default_config.rb.tt +0 -18
  89. data/lib/gemsmith/templates/%gem_name%/spec/support/kit/stderr.rb.tt +0 -9
  90. data/lib/gemsmith/templates/%gem_name%/spec/support/kit/stdout.rb.tt +0 -9
  91. data/lib/gemsmith/templates/%gem_name%/spec/support/kit/temp_dir.rb.tt +0 -25
  92. data/lib/tasks/console.rake +0 -7
@@ -3,18 +3,6 @@
3
3
  module Gemsmith
4
4
  # Command Line Interface (CLI) helpers for the CLI class.
5
5
  module CLIHelpers
6
- def gem_name
7
- configuration.gem_name
8
- end
9
-
10
- def gem_class
11
- configuration.gem_class
12
- end
13
-
14
- def rails_version
15
- configuration.rails_version
16
- end
17
-
18
6
  module_function
19
7
 
20
8
  def print_gems gems
@@ -28,27 +16,28 @@ module Gemsmith
28
16
  return if answer == "q"
29
17
 
30
18
  if (1..gems.size).cover?(answer.to_i)
31
- gem_spec.find name, gems[answer.to_i - 1].version.version
19
+ Gem::Specification.find name, gems[answer.to_i - 1].version.version
32
20
  else
33
21
  error "Invalid option: #{answer}"
34
22
  nil
35
23
  end
36
24
  end
37
25
 
38
- def open_gem specification, method
26
+ def inspect_gem specification, method
39
27
  return unless specification
40
- spec = gem_spec.new specification.spec_file
41
- spec.public_send method
28
+ Gem::Inspector.new.public_send method, Gem::Specification.new(specification.spec_file)
29
+ rescue Versionaire::Errors::Conversion => exception
30
+ error(exception.message)
42
31
  end
43
32
 
44
33
  def process_gem name, method
45
- specs = gem_spec.find_all name
34
+ specs = Gem::Specification.find_all name
46
35
 
47
36
  if specs.size == 1
48
- open_gem specs.first, method
37
+ inspect_gem specs.first, method
49
38
  elsif specs.size > 1
50
39
  print_gems specs
51
- open_gem pick_gem(specs, name), method
40
+ inspect_gem pick_gem(specs, name), method
52
41
  else
53
42
  error("Unable to find gem: #{name}.") and ""
54
43
  end
@@ -6,7 +6,7 @@ require "gemsmith/authenticators/ruby_gems"
6
6
  require "gemsmith/authenticators/basic"
7
7
 
8
8
  module Gemsmith
9
- # Configures gem credentials for RubyGems and/or alternative servers.
9
+ # Generates gem credentials for RubyGems and/or alternative servers.
10
10
  class Credentials
11
11
  attr_reader :key, :url
12
12
 
@@ -55,7 +55,7 @@ module Gemsmith
55
55
 
56
56
  FileUtils.mkdir_p File.dirname self.class.file_path
57
57
  File.open(self.class.file_path, "w") { |file| file << YAML.dump(new_credentials) }
58
- FileUtils.chmod(0600, self.class.file_path)
58
+ FileUtils.chmod(0o600, self.class.file_path)
59
59
  end
60
60
 
61
61
  private
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "open3"
4
+
5
+ module Gemsmith
6
+ module Gem
7
+ # Provides the ability to investigate a gem in greater detail.
8
+ class Inspector
9
+ def self.editor
10
+ ENV.fetch "EDITOR"
11
+ end
12
+
13
+ def initialize shell: Open3
14
+ @shell = shell
15
+ end
16
+
17
+ def edit specification
18
+ shell.capture2 self.class.editor, specification.path
19
+ end
20
+
21
+ def visit specification
22
+ shell.capture2 "open", specification.homepage_url
23
+ end
24
+
25
+ private
26
+
27
+ attr_reader :shell
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "refinements/strings"
4
+
5
+ module Gemsmith
6
+ module Gem
7
+ # Formats single or multiple modules with correct, two-space indentation for templates.
8
+ class ModuleFormatter
9
+ using Refinements::Strings
10
+
11
+ def initialize namespace
12
+ @namespace = namespace
13
+ @modules = namespace.split "::"
14
+ @depth = namespace.scan("::").length
15
+ end
16
+
17
+ def render content
18
+ "#{prefix}#{body content}#{suffix.chomp}"
19
+ end
20
+
21
+ private
22
+
23
+ attr_reader :namespace, :modules, :depth
24
+
25
+ def prefix
26
+ modules.each.with_index.reduce "" do |result, (module_name, index)|
27
+ result + "#{indentation index}module #{module_name}\n"
28
+ end
29
+ end
30
+
31
+ def body content
32
+ indent = indentation depth + 1
33
+
34
+ content.sub(/\A\n/, "").split("\n").reduce "" do |body, line|
35
+ next "#{body}\n" if line.blank?
36
+ body + "#{indent}#{line.gsub(/^\s{2}/, "")}\n"
37
+ end
38
+ end
39
+
40
+ def suffix
41
+ modules.each.with_index.reduce "" do |result, (_, index)|
42
+ result + "#{indentation depth - index}end\n"
43
+ end
44
+ end
45
+
46
+ def indentation length
47
+ " " * length
48
+ end
49
+ end
50
+ end
51
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "versionaire"
2
4
 
3
5
  module Gemsmith
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "open3"
3
+ require "versionaire"
4
4
 
5
5
  module Gemsmith
6
- module Aids
6
+ module Gem
7
7
  # A Gem::Specification with additional enhancements.
8
- class GemSpec
8
+ class Specification
9
9
  def self.specification
10
10
  ::Gem::Specification
11
11
  end
@@ -14,10 +14,6 @@ module Gemsmith
14
14
  ::Gem::DEFAULT_HOST
15
15
  end
16
16
 
17
- def self.editor
18
- ENV.fetch "EDITOR"
19
- end
20
-
21
17
  def self.find name, version
22
18
  specification.find_by_name name, version
23
19
  end
@@ -26,11 +22,19 @@ module Gemsmith
26
22
  specification.find_all_by_name name, requirement
27
23
  end
28
24
 
29
- def initialize file_path, shell: Open3
25
+ def initialize file_path
30
26
  @file_path = file_path
31
- @shell = shell
32
27
  @spec = self.class.specification.load file_path
33
28
  validate
29
+ @version = Versionaire::Version @spec.version.to_s
30
+ end
31
+
32
+ def name
33
+ spec.name
34
+ end
35
+
36
+ def path
37
+ spec.full_gem_path
34
38
  end
35
39
 
36
40
  def homepage_url
@@ -45,36 +49,25 @@ module Gemsmith
45
49
  spec.metadata.fetch("allowed_push_host") { self.class.default_gem_host }
46
50
  end
47
51
 
48
- def open_gem
49
- shell.capture2 self.class.editor, spec.full_gem_path
50
- String spec.full_gem_path
51
- end
52
-
53
- def open_homepage
54
- shell.capture2 "open", homepage_url
55
- homepage_url
56
- end
57
-
58
52
  def version_number
59
- spec.version.version
53
+ version.to_s
60
54
  end
61
55
 
62
56
  def version_label
63
- "v#{version_number}"
57
+ version.label
64
58
  end
65
59
 
66
60
  def package_file_name
67
- "#{spec.name}-#{version_number}.gem"
61
+ "#{name}-#{version_number}.gem"
68
62
  end
69
63
 
70
64
  private
71
65
 
72
- attr_reader :file_path, :spec, :shell
66
+ attr_reader :file_path, :spec, :version
73
67
 
74
68
  def validate
75
- unless spec.is_a?(self.class.specification)
76
- fail(Errors::Specification, %(Unknown gem specification: "#{file_path}".))
77
- end
69
+ return if spec.is_a?(self.class.specification)
70
+ fail(Errors::Specification, %(Unknown gem specification: "#{file_path}".))
78
71
  end
79
72
  end
80
73
  end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gemsmith
4
+ module Generators
5
+ # Abstract class from which all generators inherit from.
6
+ class Base
7
+ def initialize cli, configuration: {}
8
+ @cli = cli
9
+ @configuration = configuration
10
+ end
11
+
12
+ def self.run cli, configuration: {}
13
+ new(cli, configuration: configuration).run
14
+ end
15
+
16
+ def run
17
+ fail NotImplementedError, "The method, #run, is not implemented yet."
18
+ end
19
+
20
+ protected
21
+
22
+ attr_reader :cli, :configuration
23
+
24
+ def lib_root
25
+ File.join "%gem_name%", "lib"
26
+ end
27
+
28
+ def lib_gem_root
29
+ File.join lib_root, "%gem_path%"
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gemsmith
4
+ module Generators
5
+ # Generates Bundler support.
6
+ class Bundler < Base
7
+ def run
8
+ Dir.chdir(cli.destination_root) do
9
+ cli.info "Installing gem dependencies..."
10
+ `bundle install`
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gemsmith
4
+ module Generators
5
+ # Generates Command Line Interface (CLI) support.
6
+ class CLI < Base
7
+ def run
8
+ return unless configuration.dig(:generate, :cli)
9
+
10
+ cli.template "%gem_name%/bin/%gem_name%.tt", configuration
11
+ cli.template "%gem_name%/lib/%gem_path%/cli.rb.tt", configuration
12
+ cli.template "%gem_name%/spec/lib/%gem_path%/cli_spec.rb.tt", configuration
13
+ cli.chmod "#{configuration.dig :gem, :name}/bin/#{configuration.dig :gem, :name}", 0o755
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gemsmith
4
+ module Generators
5
+ # Generates Code Climate support.
6
+ class CodeClimate < Base
7
+ def run
8
+ return unless configuration.dig(:generate, :code_climate)
9
+
10
+ cli.template "%gem_name%/.codeclimate.yml.tt", configuration
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "tocer"
4
+
5
+ module Gemsmith
6
+ module Generators
7
+ # Generates documentation support.
8
+ class Documentation < Base
9
+ def create_files
10
+ cli.template "%gem_name%/README.md.tt", configuration
11
+ cli.template "%gem_name%/CONTRIBUTING.md.tt", configuration
12
+ cli.template "%gem_name%/CODE_OF_CONDUCT.md.tt", configuration
13
+ cli.template "%gem_name%/LICENSE.md.tt", configuration
14
+ cli.template "%gem_name%/CHANGES.md.tt", configuration
15
+ end
16
+
17
+ def update_readme
18
+ file = File.join cli.destination_root, configuration.dig(:gem, :name), "README.md"
19
+ Tocer::Writer.new(file).write
20
+ end
21
+
22
+ def run
23
+ create_files
24
+ update_readme
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gemsmith
4
+ module Generators
5
+ # Generates default gem support.
6
+ class Gem < Base
7
+ def run
8
+ cli.template "%gem_name%/bin/setup.tt", configuration
9
+ cli.template "%gem_name%/Gemfile.tt", configuration
10
+ cli.template "%gem_name%/%gem_name%.gemspec.tt", configuration
11
+ cli.template "#{lib_gem_root}.rb.tt", configuration
12
+ cli.template "#{lib_gem_root}/identity.rb.tt", configuration
13
+ cli.chmod "#{configuration.dig(:gem, :name)}/bin/setup", 0o755
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,25 +1,31 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Gemsmith
4
- module Skeletons
5
- # Configures Git support.
6
- class GitSkeleton < BaseSkeleton
4
+ module Generators
5
+ # Generates Git support.
6
+ class Git < Base
7
7
  def create_ignore_file
8
- cli.template "%gem_name%/.gitignore.tt", configuration.to_h
8
+ cli.template "%gem_name%/.gitignore.tt", configuration
9
9
  end
10
10
 
11
11
  def create_repository
12
- Dir.chdir(File.join(cli.destination_root, configuration.gem_name)) do
12
+ Dir.chdir(gem_dir) do
13
13
  `git init`
14
14
  `git add .`
15
- `git commit --all --no-verify --message "Added Gemsmith skeleton."`
15
+ `git commit --all --no-verify --message "Added Gemsmith files."`
16
16
  end
17
17
  end
18
18
 
19
- def create
19
+ def run
20
20
  create_ignore_file
21
21
  create_repository
22
22
  end
23
+
24
+ private
25
+
26
+ def gem_dir
27
+ File.join cli.destination_root, configuration.dig(:gem, :name)
28
+ end
23
29
  end
24
30
  end
25
31
  end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gemsmith
4
+ module Generators
5
+ # Generates GitHub support.
6
+ class GitHub < Base
7
+ def run
8
+ return unless configuration.dig(:generate, :git_hub)
9
+ cli.template "%gem_name%/.github/ISSUE_TEMPLATE.md.tt", configuration
10
+ cli.template "%gem_name%/.github/PULL_REQUEST_TEMPLATE.md.tt", configuration
11
+ end
12
+ end
13
+ end
14
+ end