gemsmith 5.6.0 → 6.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +4 -3
  4. data/README.md +90 -54
  5. data/lib/gemsmith.rb +0 -1
  6. data/lib/gemsmith/aids/gem.rb +24 -0
  7. data/lib/gemsmith/aids/git.rb +10 -0
  8. data/lib/gemsmith/aids/spec.rb +41 -0
  9. data/lib/gemsmith/cli.rb +26 -11
  10. data/lib/gemsmith/cli_helpers.rb +20 -69
  11. data/lib/gemsmith/configuration.rb +189 -0
  12. data/lib/gemsmith/identity.rb +2 -2
  13. data/lib/gemsmith/rake/build.rb +17 -19
  14. data/lib/gemsmith/rake/tasks.rb +11 -9
  15. data/lib/gemsmith/skeletons/base_skeleton.rb +6 -9
  16. data/lib/gemsmith/skeletons/bundler_skeleton.rb +1 -1
  17. data/lib/gemsmith/skeletons/cli_skeleton.rb +3 -7
  18. data/lib/gemsmith/skeletons/documentation_skeleton.rb +17 -5
  19. data/lib/gemsmith/skeletons/gem_skeleton.rb +4 -4
  20. data/lib/gemsmith/skeletons/git_skeleton.rb +2 -2
  21. data/lib/gemsmith/skeletons/guard_skeleton.rb +2 -6
  22. data/lib/gemsmith/skeletons/pry_skeleton.rb +11 -0
  23. data/lib/gemsmith/skeletons/rails_skeleton.rb +21 -19
  24. data/lib/gemsmith/skeletons/rake_skeleton.rb +10 -15
  25. data/lib/gemsmith/skeletons/rspec_skeleton.rb +8 -12
  26. data/lib/gemsmith/skeletons/rubocop_skeleton.rb +3 -7
  27. data/lib/gemsmith/skeletons/ruby_skeleton.rb +1 -1
  28. data/lib/gemsmith/skeletons/travis_skeleton.rb +2 -6
  29. data/lib/gemsmith/templates/%gem_name%/%gem_name%.gemspec.tt +23 -29
  30. data/lib/gemsmith/templates/%gem_name%/.gitignore.tt +0 -1
  31. data/lib/gemsmith/templates/%gem_name%/.rubocop.yml.tt +3 -1
  32. data/lib/gemsmith/templates/%gem_name%/.ruby-version.tt +1 -1
  33. data/lib/gemsmith/templates/%gem_name%/.travis.yml.tt +3 -4
  34. data/lib/gemsmith/templates/%gem_name%/CODE_OF_CONDUCT.md.tt +18 -9
  35. data/lib/gemsmith/templates/%gem_name%/Guardfile.tt +1 -1
  36. data/lib/gemsmith/templates/%gem_name%/LICENSE.md.tt +1 -1
  37. data/lib/gemsmith/templates/%gem_name%/README.md.tt +25 -22
  38. data/lib/gemsmith/templates/%gem_name%/Rakefile.tt +1 -1
  39. data/lib/gemsmith/templates/%gem_name%/bin/%gem_name%.tt +5 -5
  40. data/lib/gemsmith/templates/%gem_name%/gemfiles/rails-%rails_version%.x.gemfile.tt +5 -0
  41. data/lib/gemsmith/templates/%gem_name%/lib/%gem_name%.rb.tt +3 -3
  42. data/lib/gemsmith/templates/%gem_name%/lib/%gem_name%/cli.rb.tt +7 -7
  43. data/lib/gemsmith/templates/%gem_name%/lib/%gem_name%/engine.rb.tt +2 -2
  44. data/lib/gemsmith/templates/%gem_name%/lib/%gem_name%/identity.rb.tt +5 -5
  45. data/lib/gemsmith/templates/%gem_name%/lib/generators/%gem_name%/install/USAGE.tt +2 -2
  46. data/lib/gemsmith/templates/%gem_name%/lib/generators/%gem_name%/install/install_generator.rb.tt +2 -2
  47. data/lib/gemsmith/templates/%gem_name%/lib/generators/%gem_name%/upgrade/USAGE.tt +2 -2
  48. data/lib/gemsmith/templates/%gem_name%/lib/generators/%gem_name%/upgrade/upgrade_generator.rb.tt +2 -2
  49. data/lib/gemsmith/templates/%gem_name%/lib/{%gem_name%/tasks → tasks}/rspec.rake.tt +0 -0
  50. data/lib/gemsmith/templates/%gem_name%/lib/{%gem_name%/tasks → tasks}/rubocop.rake.tt +0 -0
  51. data/lib/gemsmith/templates/%gem_name%/spec/lib/%gem_name%/%gem_name%_spec.rb.tt +1 -1
  52. data/lib/gemsmith/templates/%gem_name%/spec/spec_helper.rb.tt +5 -16
  53. data/lib/gemsmith/templates/%gem_name%/spec/support/extensions/pry.rb.tt +6 -0
  54. data/lib/{gemsmith/tasks → tasks}/rspec.rake +0 -0
  55. data/lib/{gemsmith/tasks → tasks}/rubocop.rake +0 -0
  56. metadata +47 -15
  57. metadata.gz.sig +0 -0
  58. data/lib/gemsmith/cli_options.rb +0 -103
  59. data/lib/gemsmith/kit.rb +0 -12
  60. data/lib/gemsmith/templates/%gem_name%/gemfiles/rails-4.1.x.gemfile.tt +0 -5
@@ -0,0 +1,189 @@
1
+ module Gemsmith
2
+ # Default configuration for gem with support for custom settings.
3
+ class Configuration
4
+ attr_reader :gem_name, :gem_class, :file_path
5
+ attr_writer :gem_platform, :gem_home_url, :gem_license, :gem_private_key, :gem_public_key, :author_name,
6
+ :author_email, :author_url, :organization_name, :organization_email, :organization_url,
7
+ :ruby_version, :rails_version, :create_cli, :create_rails, :create_security, :create_pry,
8
+ :create_guard, :create_rspec, :create_rubocop, :create_code_climate, :create_gemnasium,
9
+ :create_travis, :create_patreon, :github_user, :year
10
+
11
+ def initialize gem_name: "unknown",
12
+ gem_class: "Unknown",
13
+ git: Aids::Git,
14
+ file_path: File.join(ENV["HOME"], Identity.file_name)
15
+
16
+ @gem_name = gem_name
17
+ @gem_class = gem_class
18
+ @file_path = file_path
19
+ @git = git
20
+ @settings = load_settings
21
+ end
22
+
23
+ def gem_platform
24
+ @gem_platform || settings_group(:gem).fetch(:platform, "Gem::Platform::RUBY")
25
+ end
26
+
27
+ def gem_home_url
28
+ @gem_home_url || settings_group(:gem).fetch(:home_url, github_gem_url)
29
+ end
30
+
31
+ def gem_license
32
+ @gem_license || settings_group(:gem).fetch(:license, "MIT")
33
+ end
34
+
35
+ def gem_private_key
36
+ @gem_private_key || settings_group(:gem).fetch(:private_key, "~/.ssh/gem-private.pem")
37
+ end
38
+
39
+ def gem_public_key
40
+ @gem_public_key || settings_group(:gem).fetch(:public_key, "~/.ssh/gem-public.pem")
41
+ end
42
+
43
+ def author_name
44
+ @author_name || settings_group(:author).fetch(:name, git.config_value("user.name"))
45
+ end
46
+
47
+ def author_email
48
+ @author_email || settings_group(:author).fetch(:email, git.config_value("user.email"))
49
+ end
50
+
51
+ def author_url
52
+ @author_url || settings_group(:author).fetch(:url, "")
53
+ end
54
+
55
+ def organization_name
56
+ @organization_name || settings_group(:organization).fetch(:name, "")
57
+ end
58
+
59
+ def organization_url
60
+ @organization_url || settings_group(:organization).fetch(:url, "")
61
+ end
62
+
63
+ def ruby_version
64
+ @ruby_version || settings_group(:versions).fetch(:ruby, RUBY_VERSION)
65
+ end
66
+
67
+ def rails_version
68
+ @rails_version || settings_group(:versions).fetch(:rails, "4.2")
69
+ end
70
+
71
+ def create_cli?
72
+ parse_boolean @create_cli, :create, :cli, false
73
+ end
74
+
75
+ def create_rails?
76
+ parse_boolean @create_rails, :create, :rails, false
77
+ end
78
+
79
+ def create_security?
80
+ parse_boolean @create_security, :create, :security, true
81
+ end
82
+
83
+ def create_pry?
84
+ parse_boolean @create_pry, :create, :pry, true
85
+ end
86
+
87
+ def create_guard?
88
+ parse_boolean @create_guard, :create, :guard, true
89
+ end
90
+
91
+ def create_rspec?
92
+ parse_boolean @create_rspec, :create, :rspec, true
93
+ end
94
+
95
+ def create_rubocop?
96
+ parse_boolean @create_rubocop, :create, :rubocop, true
97
+ end
98
+
99
+ def create_code_climate?
100
+ parse_boolean @create_code_climate, :create, :code_climate, true
101
+ end
102
+
103
+ def create_gemnasium?
104
+ parse_boolean @create_gemnasium, :create, :gemnasium, true
105
+ end
106
+
107
+ def create_travis?
108
+ parse_boolean @create_travis, :create, :travis, true
109
+ end
110
+
111
+ def create_patreon?
112
+ parse_boolean @create_patreon, :create, :patreon, true
113
+ end
114
+
115
+ def github_user
116
+ @github_user || settings.fetch(:github_user, git.config_value("github.user"))
117
+ end
118
+
119
+ def year
120
+ @year || settings.fetch(:year, Time.now.year)
121
+ end
122
+
123
+ def to_h
124
+ {
125
+ year: year,
126
+ github_user: github_user,
127
+ gem: {
128
+ name: gem_name,
129
+ class: gem_class,
130
+ platform: gem_platform,
131
+ home_url: gem_home_url,
132
+ license: gem_license,
133
+ private_key: gem_private_key,
134
+ public_key: gem_public_key
135
+ },
136
+ author: {
137
+ name: author_name,
138
+ email: author_email,
139
+ url: author_url
140
+ },
141
+ organization: {
142
+ name: organization_name,
143
+ url: organization_url
144
+ },
145
+ versions: {
146
+ ruby: ruby_version,
147
+ rails: rails_version
148
+ },
149
+ create: {
150
+ cli: create_cli?,
151
+ rails: create_rails?,
152
+ security: create_security?,
153
+ pry: create_pry?,
154
+ guard: create_guard?,
155
+ rspec: create_rspec?,
156
+ rubocop: create_rubocop?,
157
+ code_climate: create_code_climate?,
158
+ gemnasium: create_gemnasium?,
159
+ travis: create_travis?,
160
+ patreon: create_patreon?
161
+ }
162
+ }
163
+ end
164
+
165
+ private
166
+
167
+ attr_reader :gem_parser, :git, :settings
168
+
169
+ def load_settings
170
+ return {} unless File.exist?(file_path)
171
+ yaml = YAML.load_file file_path
172
+ yaml.is_a?(Hash) ? yaml : {}
173
+ end
174
+
175
+ def settings_group key
176
+ settings.fetch key, {}
177
+ end
178
+
179
+ def parse_boolean variable, group_key, item_key, default_value
180
+ return variable if [true, false].include?(variable)
181
+ settings_group(group_key).fetch item_key, default_value
182
+ end
183
+
184
+ def github_gem_url
185
+ return "" if github_user.nil?
186
+ "https://github.com/#{github_user}/#{gem_name}"
187
+ end
188
+ end
189
+ end
@@ -10,11 +10,11 @@ module Gemsmith
10
10
  end
11
11
 
12
12
  def self.version
13
- "5.6.0"
13
+ "6.0.0"
14
14
  end
15
15
 
16
16
  def self.version_label
17
- [label, version].join " "
17
+ "#{label} #{version}"
18
18
  end
19
19
 
20
20
  def self.file_name
@@ -1,38 +1,36 @@
1
1
  require "bundler/ui/shell"
2
+ require "tocer"
2
3
 
3
4
  module Gemsmith
4
5
  module Rake
5
6
  # Provides gem build functionality. Meant to be wrapped in Rake tasks.
6
7
  class Build
7
- def initialize shell: Bundler::UI::Shell.new, kernel: Kernel
8
- @shell = shell
8
+ def initialize tocer: Tocer::Writer, shell: Bundler::UI::Shell, kernel: Kernel
9
+ @tocer = tocer
10
+ @shell = shell.new
9
11
  @kernel = kernel
10
12
  end
11
13
 
12
- def table_of_contents
13
- if kernel.system("command -v doctoc > /dev/null")
14
- kernel.system %(doctoc --title "# Table of Contents" README.md)
15
- else
16
- shell.error error_message
17
- kernel.exit 1
18
- end
14
+ def doc
15
+ readme = File.join Dir.pwd, "README.md"
16
+ tocer.new(readme).write
17
+ shell.confirm "Updated gem documentation."
19
18
  end
20
19
 
21
- def clean!
20
+ def clean
22
21
  FileUtils.rm_rf "pkg"
23
- shell.info "Gem artifacts cleaned."
22
+ shell.confirm "Cleaned gem artifacts."
24
23
  end
25
24
 
26
- private
27
-
28
- attr_reader :shell, :kernel
25
+ def validate
26
+ return if `git status --porcelain`.empty?
27
+ shell.error "Build failed: Gem has uncommitted changes."
28
+ kernel.exit 1
29
+ end
29
30
 
30
- def error_message
31
- url = "https://github.com/thlorenz/doctoc"
32
- command = "npm install --global doctoc"
31
+ private
33
32
 
34
- "Unable to update README Table of Contents, please install DocToc (#{url}): #{command}."
35
- end
33
+ attr_reader :tocer, :shell, :kernel
36
34
  end
37
35
  end
38
36
  end
@@ -16,23 +16,25 @@ module Gemsmith
16
16
  build = Gemsmith::Rake::Build.new
17
17
  release = Gemsmith::Rake::Release.new
18
18
 
19
- ::Rake::Task[:build].enhance [:clean, "readme:toc"]
19
+ ::Rake::Task[:build].enhance [:clean, :doc, :validate]
20
20
  ::Rake::Task[:release].enhance { ::Rake::Task[:clean].invoke }
21
21
 
22
- namespace :readme do
23
- desc "Update README Table of Contents."
24
- task :toc do
25
- build.table_of_contents
26
- end
22
+ desc "Update README (table of contents)"
23
+ task :doc do
24
+ build.doc
27
25
  end
28
26
 
29
- desc "Clean gem artifacts."
27
+ desc "Clean gem artifacts"
30
28
  task :clean do
31
- build.clean!
29
+ build.clean
30
+ end
31
+
32
+ task :validate do
33
+ build.validate
32
34
  end
33
35
 
34
36
  desc "Build, tag #{release.version_label} (signed), and push #{release.gem_file_name} to RubyGems"
35
- task publish: [:clean, :build, "release:guard_clean"] do
37
+ task publish: [:build, "release:guard_clean"] do
36
38
  release.publish
37
39
  ::Rake::Task["release:rubygem_push"].invoke
38
40
  end
@@ -2,25 +2,22 @@ module Gemsmith
2
2
  module Skeletons
3
3
  # Abstract class from which all skeletons inherit from.
4
4
  class BaseSkeleton
5
- def initialize cli
5
+ def initialize cli, configuration: Configuration.new
6
6
  @cli = cli
7
+ @configuration = configuration
7
8
  end
8
9
 
9
- def self.create cli
10
- new(cli).create
11
- end
12
-
13
- def enabled?
14
- true
10
+ def self.create cli, configuration: Configuration.new
11
+ new(cli, configuration: configuration).create
15
12
  end
16
13
 
17
14
  def create
18
15
  fail NotImplementedError, "The method, #create, is not implemented yet."
19
16
  end
20
17
 
21
- private
18
+ protected
22
19
 
23
- attr_reader :cli
20
+ attr_reader :cli, :configuration
24
21
 
25
22
  def lib_root
26
23
  "%gem_name%/lib"
@@ -3,7 +3,7 @@ module Gemsmith
3
3
  # Configures Bundler support.
4
4
  class BundlerSkeleton < BaseSkeleton
5
5
  def create
6
- Dir.chdir(File.join(cli.destination_root, cli.gem_name)) do
6
+ Dir.chdir(File.join(cli.destination_root, configuration.gem_name)) do
7
7
  cli.info "Installing gem dependencies..."
8
8
  `bundle install`
9
9
  end
@@ -2,15 +2,11 @@ module Gemsmith
2
2
  module Skeletons
3
3
  # Configures Command Line Interface (CLI) support.
4
4
  class CLISkeleton < BaseSkeleton
5
- def enabled?
6
- cli.template_options.key?(:bin) && cli.template_options[:bin]
7
- end
8
-
9
5
  def create
10
- return unless enabled?
6
+ return unless configuration.create_cli?
11
7
 
12
- cli.template "%gem_name%/bin/%gem_name%.tt", cli.template_options
13
- cli.template "%gem_name%/lib/%gem_name%/cli.rb.tt", cli.template_options
8
+ cli.template "%gem_name%/bin/%gem_name%.tt", configuration.to_h
9
+ cli.template "%gem_name%/lib/%gem_name%/cli.rb.tt", configuration.to_h
14
10
  end
15
11
  end
16
12
  end
@@ -1,13 +1,25 @@
1
+ require "tocer"
2
+
1
3
  module Gemsmith
2
4
  module Skeletons
3
5
  # Configures documentation support.
4
6
  class DocumentationSkeleton < BaseSkeleton
7
+ def create_files
8
+ cli.template "%gem_name%/README.md.tt", configuration.to_h
9
+ cli.template "%gem_name%/CONTRIBUTING.md.tt", configuration.to_h
10
+ cli.template "%gem_name%/CODE_OF_CONDUCT.md.tt", configuration.to_h
11
+ cli.template "%gem_name%/LICENSE.md.tt", configuration.to_h
12
+ cli.template "%gem_name%/CHANGELOG.md.tt", configuration.to_h
13
+ end
14
+
15
+ def update_readme
16
+ file = File.join cli.destination_root, configuration.gem_name, "README.md"
17
+ Tocer::Writer.new(file).write
18
+ end
19
+
5
20
  def create
6
- cli.template "%gem_name%/README.md.tt", cli.template_options
7
- cli.template "%gem_name%/CONTRIBUTING.md.tt", cli.template_options
8
- cli.template "%gem_name%/CODE_OF_CONDUCT.md.tt", cli.template_options
9
- cli.template "%gem_name%/LICENSE.md.tt", cli.template_options
10
- cli.template "%gem_name%/CHANGELOG.md.tt", cli.template_options
21
+ create_files
22
+ update_readme
11
23
  end
12
24
  end
13
25
  end
@@ -3,10 +3,10 @@ module Gemsmith
3
3
  # Configures default gem support.
4
4
  class GemSkeleton < BaseSkeleton
5
5
  def create
6
- cli.template "%gem_name%/Gemfile.tt", cli.template_options
7
- cli.template "%gem_name%/%gem_name%.gemspec.tt", cli.template_options
8
- cli.template "#{lib_root}/%gem_name%.rb.tt", cli.template_options
9
- cli.template "#{lib_root}/%gem_name%/identity.rb.tt", cli.template_options
6
+ cli.template "%gem_name%/Gemfile.tt", configuration.to_h
7
+ cli.template "%gem_name%/%gem_name%.gemspec.tt", configuration.to_h
8
+ cli.template "#{lib_root}/%gem_name%.rb.tt", configuration.to_h
9
+ cli.template "#{lib_root}/%gem_name%/identity.rb.tt", configuration.to_h
10
10
  end
11
11
  end
12
12
  end
@@ -3,11 +3,11 @@ module Gemsmith
3
3
  # Configures Git support.
4
4
  class GitSkeleton < BaseSkeleton
5
5
  def create_ignore_file
6
- cli.template "%gem_name%/.gitignore.tt", cli.template_options
6
+ cli.template "%gem_name%/.gitignore.tt", configuration.to_h
7
7
  end
8
8
 
9
9
  def create_repository
10
- Dir.chdir(File.join(cli.destination_root, cli.gem_name)) do
10
+ Dir.chdir(File.join(cli.destination_root, configuration.gem_name)) do
11
11
  `git init`
12
12
  `git add .`
13
13
  `git commit --all --no-verify --message "Added Gemsmith skeleton."`
@@ -2,13 +2,9 @@ module Gemsmith
2
2
  module Skeletons
3
3
  # Configures Guard support.
4
4
  class GuardSkeleton < BaseSkeleton
5
- def enabled?
6
- cli.template_options.key?(:guard) && cli.template_options[:guard]
7
- end
8
-
9
5
  def create
10
- return unless enabled?
11
- cli.template "%gem_name%/Guardfile.tt", cli.template_options
6
+ return unless configuration.create_guard?
7
+ cli.template "%gem_name%/Guardfile.tt", configuration.to_h
12
8
  end
13
9
  end
14
10
  end
@@ -0,0 +1,11 @@
1
+ module Gemsmith
2
+ module Skeletons
3
+ # Configures Pry debugging support.
4
+ class PrySkeleton < BaseSkeleton
5
+ def create
6
+ return unless configuration.create_pry?
7
+ cli.template "%gem_name%/spec/support/extensions/pry.rb.tt", configuration.to_h
8
+ end
9
+ end
10
+ end
11
+ end