gemsmith 2.0.0 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/{LICENSE.rdoc → LICENSE.md} +1 -1
  3. data/README.md +154 -0
  4. data/lib/gemsmith.rb +2 -2
  5. data/lib/gemsmith/cli.rb +32 -131
  6. data/lib/gemsmith/cli_helpers.rb +90 -0
  7. data/lib/gemsmith/cli_options.rb +94 -0
  8. data/lib/gemsmith/skeletons/base_skeleton.rb +35 -0
  9. data/lib/gemsmith/skeletons/cli_skeleton.rb +10 -0
  10. data/lib/gemsmith/skeletons/default_skeleton.rb +21 -0
  11. data/lib/gemsmith/skeletons/documentation_skeleton.rb +12 -0
  12. data/lib/gemsmith/skeletons/git_skeleton.rb +13 -0
  13. data/lib/gemsmith/skeletons/rails_skeleton.rb +51 -0
  14. data/lib/gemsmith/skeletons/rspec_skeleton.rb +17 -0
  15. data/lib/gemsmith/skeletons/travis_skeleton.rb +9 -0
  16. data/lib/gemsmith/templates/{gem.gemspec.tmp → %gem_name%/%gem_name%.gemspec.tt} +4 -3
  17. data/lib/gemsmith/templates/{gitignore.tmp → %gem_name%/.gitignore.tt} +2 -1
  18. data/lib/gemsmith/templates/{rspec.tmp → %gem_name%/.rspec.tt} +0 -0
  19. data/lib/gemsmith/templates/%gem_name%/.ruby-version.tt +1 -0
  20. data/lib/gemsmith/templates/{travis.yml.tmp → %gem_name%/.travis.yml.tt} +0 -2
  21. data/lib/gemsmith/templates/{CHANGELOG.rdoc.tmp → %gem_name%/CHANGELOG.md.tt} +1 -1
  22. data/lib/gemsmith/templates/{CONTRIBUTING.md.tmp → %gem_name%/CONTRIBUTING.md.tt} +0 -0
  23. data/lib/gemsmith/templates/{Gemfile.tmp → %gem_name%/Gemfile.tt} +0 -0
  24. data/lib/gemsmith/templates/{LICENSE.rdoc.tmp → %gem_name%/LICENSE.md.tt} +1 -1
  25. data/lib/gemsmith/templates/%gem_name%/README.md.tt +59 -0
  26. data/lib/gemsmith/templates/{Rakefile.tmp → %gem_name%/Rakefile.tt} +0 -0
  27. data/lib/gemsmith/templates/{bin/gem.tmp → %gem_name%/bin/%gem_name%.tt} +0 -0
  28. data/lib/gemsmith/templates/{gemfiles/rails-3.2.x.gemfile.tmp → %gem_name%/gemfiles/rails-3.2.x.gemfile.tt} +1 -1
  29. data/lib/gemsmith/templates/%gem_name%/lib/%gem_name%.rb.tt +33 -0
  30. data/lib/gemsmith/templates/{lib/gem/action_controller/class_methods.rb.tmp → %gem_name%/lib/%gem_name%/action_controller/class_methods.rb.tt} +2 -2
  31. data/lib/gemsmith/templates/{lib/gem/action_controller/instance_methods.rb.tmp → %gem_name%/lib/%gem_name%/action_controller/instance_methods.rb.tt} +0 -0
  32. data/lib/gemsmith/templates/{lib/gem/action_view/instance_methods.rb.tmp → %gem_name%/lib/%gem_name%/action_view/instance_methods.rb.tt} +0 -0
  33. data/lib/gemsmith/templates/{lib/gem/active_record/class_methods.rb.tmp → %gem_name%/lib/%gem_name%/active_record/class_methods.rb.tt} +2 -2
  34. data/lib/gemsmith/templates/{lib/gem/active_record/instance_methods.rb.tmp → %gem_name%/lib/%gem_name%/active_record/instance_methods.rb.tt} +0 -0
  35. data/lib/gemsmith/templates/{lib/gem/cli.rb.tmp → %gem_name%/lib/%gem_name%/cli.rb.tt} +1 -1
  36. data/lib/gemsmith/templates/{lib/gem/version.rb.tmp → %gem_name%/lib/%gem_name%/version.rb.tt} +0 -0
  37. data/lib/gemsmith/templates/{lib/generators/gem/install/USAGE.tmp → %gem_name%/lib/generators/%gem_name%/install/USAGE.tt} +0 -0
  38. data/lib/gemsmith/templates/{lib/generators/gem/install/install_generator.rb.tmp → %gem_name%/lib/generators/%gem_name%/install/install_generator.rb.tt} +0 -0
  39. data/lib/gemsmith/templates/{lib/generators/gem/upgrade/USAGE.tmp → %gem_name%/lib/generators/%gem_name%/upgrade/USAGE.tt} +0 -0
  40. data/lib/gemsmith/templates/{lib/generators/gem/upgrade/upgrade_generator.rb.tmp → %gem_name%/lib/generators/%gem_name%/upgrade/upgrade_generator.rb.tt} +0 -0
  41. data/lib/gemsmith/templates/{spec/gem_spec.rb.tmp → %gem_name%/spec/%gem_name%_spec.rb.tt} +0 -0
  42. data/lib/gemsmith/templates/{spec/spec_helper.rb.tmp → %gem_name%/spec/spec_helper.rb.tt} +2 -1
  43. data/lib/gemsmith/version.rb +1 -1
  44. metadata +61 -40
  45. data/CHANGELOG.rdoc +0 -134
  46. data/README.rdoc +0 -133
  47. data/lib/gemsmith/templates/README.rdoc.tmp +0 -59
  48. data/lib/gemsmith/templates/gemfiles/rails-3.0.x.gemfile.tmp +0 -5
  49. data/lib/gemsmith/templates/gemfiles/rails-3.1.x.gemfile.tmp +0 -5
  50. data/lib/gemsmith/templates/lib/gem.rb.tmp +0 -33
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6f099b61afd087c4dc64b7850b0d5f1d69130b11
4
- data.tar.gz: d7078655ebcc3e7f4ae7528be679573a47fb638c
3
+ metadata.gz: 844ed51e2c822e23c4c5f2ec59783a872d56f86b
4
+ data.tar.gz: c4a454c20bb5f7085ba732d0a417b34419249395
5
5
  SHA512:
6
- metadata.gz: db87fed1447b0b7a73c93f8459c482faeed8f2e0d10872b412e1b2266013552d2d566eb213053b0618b7ee29f56ce6069010c3a5d59e34a88ff9e05a067efc02
7
- data.tar.gz: e87478defe7ab4402bcc565db390d7bd139bf310592dbdf53427c808001d7ad0c366efed332c7324c7a1536c7fa0b74de8e32ebcfebd3c66b08c3d1a113b8b9a
6
+ metadata.gz: a96e1522f52d68759bd1c3d406e73532806d9298ce5ff541e460ff223e27a7baa5cc9e8daffcc1032909c66fb099869ee429b2faa1e01f9a949d2722277a5525
7
+ data.tar.gz: 6fd9d55827af7153afa0e40b21411f6b91785ac15a8ec832c92337845714346ea4a21e3bb3007185be150393e8756ee59b5d320c875bf9b4eaf595583975ecff
@@ -1,4 +1,4 @@
1
- Copyright (c) 2011 {Red Alchemist}[http://www.redalchemist.com].
1
+ Copyright (c) 2011 [Red Alchemist](http://www.redalchemist.com).
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md ADDED
@@ -0,0 +1,154 @@
1
+ # Overview
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/gemsmith.png)](http://badge.fury.io/rb/gemsmith)
4
+ [![Code Climate GPA](https://codeclimate.com/github/bkuhlmann/gemsmith.png)](https://codeclimate.com/github/bkuhlmann/gemsmith)
5
+ [![Travis CI Status](https://secure.travis-ci.org/bkuhlmann/gemsmith.png)](http://travis-ci.org/bkuhlmann/gemsmith)
6
+
7
+ Gemsmith allows you to easily craft new gems via the command line with custom settings (if desired). If you are
8
+ a fan of [Bundler](https://github.com/carlhuda/bundler), then you'll appreciate the additional capabilities of this
9
+ gem. Gemsmith is essentially an enhanced version of Bundler's gem building capabilities.
10
+
11
+ # Features
12
+
13
+ * Builds a gem skeleton with Bundler functionality in mind.
14
+ * Supports common settings that can be applied to new gem creations.
15
+ * Supports binary skeletons with [Thor](https://github.com/wycats/thor) command line functionality.
16
+ * Supports [Ruby on Rails](http://rubyonrails.org).
17
+ * Supports [RSpec](http://rspec.info).
18
+ * Supports [Pry](http://pryrepl.org).
19
+ * Supports [Guard](https://github.com/guard/guard).
20
+ * Supports [Code Climate](https://codeclimate.com).
21
+ * Supports [Travis CI](http://travis-ci.org) skeletons.
22
+ * Adds commonly needed README, CHANGELOG, LICENSE, etc. template files.
23
+ * Provides the ability to open any installed gem within your favorite editor.
24
+
25
+ # Requirements
26
+
27
+ 1. A UNIX-based system.
28
+ 2. [Ruby 2.0.x](http://www.ruby-lang.org).
29
+ 3. [RubyGems](http://rubygems.org).
30
+ 4. [Bundler](https://github.com/carlhuda/bundler).
31
+
32
+ # Setup
33
+
34
+ Type the following from the command line to install:
35
+
36
+ gem install gemsmith
37
+
38
+ You can configure common settings for future gem builds by creating the following file:
39
+
40
+ ~/.gemsmith/settings.yml
41
+
42
+ ...using the following settings (for example):
43
+
44
+ ---
45
+ :author_name: Brooke Kuhlmann
46
+ :author_email: brooke@redalchemist.com
47
+ :author_url: http://www.redalchemist.com
48
+ :company_name: Red Alchemist
49
+
50
+ If no options are configured, then the defaults are as follows:
51
+
52
+ gem_platform: Gem::Platform::RUBY
53
+ author_name: <git name>
54
+ author_email: <git email>
55
+ author_url: https://www.unknown.com
56
+ gem_url: <author URL>
57
+ company_name: <author name>
58
+ company_url: <author URL>
59
+ github_user: <github user>
60
+ year: <current year>
61
+ ruby_version: 2.0.0
62
+ ruby_patch: p0
63
+ rails_version: 3.2.0
64
+
65
+ # Usage
66
+
67
+ From the command line, type: gemsmith help
68
+
69
+ gemsmith -c, [create=GEM_NAME] # Create new gem.
70
+ gemsmith -e, [edit] # Edit gem settings in default editor (assumes $EDITOR environment variable).
71
+ gemsmith -h, [help] # Show this message.
72
+ gemsmith -o, [open=NAME] # Opens gem in default editor (assumes $EDITOR environment variable).
73
+ gemsmith -r, [read=NAME] # Opens gem in default browser.
74
+ gemsmith -v, [version] # Show version.
75
+
76
+ For more gem creation options, type: gemsmith help create
77
+
78
+ -b, [--bin] # Add binary support.
79
+ -r, [--rails] # Add Rails support.
80
+ -p, [--pry] # Add Pry support.
81
+ # Default: true
82
+ -g, [--guard] # Add Guard support.
83
+ # Default: true
84
+ -s, [--rspec] # Add RSpec support.
85
+ # Default: true
86
+ -t, [--travis] # Add Travis CI support.
87
+ # Default: true
88
+ -c, [--code-climate] # Add Code Climate support.
89
+ # Default: true
90
+
91
+ Also, don't forget that once you have created your gem skeleton, the following rake tasks are also
92
+ available to you via Bundler (i.e. rake -T):
93
+
94
+ rake build # Build <gem>-<version>.gem into the pkg directory
95
+ rake install # Build and install <gem>-<version>.gem into system gems
96
+ rake release # Create tag v0.1.1 and build and push <gem>-<version>.gem to Rubygems
97
+
98
+ # Tests
99
+
100
+ To test, do the following:
101
+
102
+ 0. cd to the gem root.
103
+ 0. bundle install
104
+ 0. bundle exec rspec spec
105
+
106
+ # Best Practices
107
+
108
+ 0. [Semantic Versioning](http://semver.org)
109
+ 0. [Best Practices While Cutting Gems](http://rubysource.com/crafting-rubies-best-practices-while-cutting-gems).
110
+ 0. [Ruby on Rails Gem Packaging](http://weblog.rubyonrails.org/2009/9/1/gem-packaging-best-practices).
111
+ 0. [Gem Activation and You: Part I](http://erik.hollensbe.org/2013/05/11/gem-activation-and-you)
112
+ 0. [Gem Activation and You: Part II](http://erik.hollensbe.org/2013/05/15/gem-activation-and-you-part-2-bundler-and-binstubs)
113
+ 0. [Why You Should Use a BSD Style License](http://www.freebsd.org/doc/en/articles/bsdl-gpl/article.html).
114
+ 0. Add -w to the RUBYOPT environment variable when testing. [Details](http://avdi.org/devblog/2011/06/23/how-ruby-helps-you-fix-your-broken-code).
115
+
116
+ ## When To Include a Railtie ([Crafting Rails Applications](http://pragprog.com/book/jvrails/crafting-rails-applications) - Page 93 by José Valim)
117
+
118
+ * "Your gem needs to perform a given task while or after the Rails application is initialized."
119
+ * "Your gem needs to change a configuration value, such as setting a generator."
120
+ * "Your gem must provide Rake tasks and generators in nondefault locations (the default location for the former is lib/tasks and lib/gen- erators or lib/rails/generators for the latter)."
121
+ * "You want your gem to provide configuration options to the appli- cation, such as config.my_gem.key # :value."
122
+
123
+ # Documentation
124
+
125
+ In order to make your gem easier to use and adopt by others, good documentation is always a plus. Consider submitting
126
+ your gem to RubyDocs[http://rubydoc.info] once your gem is released and available for use. RubyDocs supports both
127
+ RDoc and YARD formats.
128
+
129
+ # Promotion
130
+
131
+ Once your gem is released, you might like to let the world know about the new awesomeness. Here are several resources:
132
+
133
+ * [How to Spread the Word About Your Code](https://hacks.mozilla.org/2013/05/how-to-spread-the-word-about-your-code)
134
+ * [Ruby Toolbox](https://www.ruby-toolbox.com)
135
+ * [RubyFlow](http://www.rubyflow.com)
136
+ * [The Ruby Show](http://rubyshow.com)
137
+ * [Ruby 5](http://ruby5.envylabs.com)
138
+
139
+ # Contributions
140
+
141
+ Read CONTRIBUTING for details.
142
+
143
+ # Credits
144
+
145
+ Developed by [Brooke Kuhlmann](http://www.redalchemist.com) at [Red Alchemist](http://www.redalchemist.com).
146
+
147
+ # License
148
+
149
+ Copyright (c) 2011 [Red Alchemist](http://www.redalchemist.com).
150
+ Read the LICENSE for details.
151
+
152
+ # History
153
+
154
+ Read the CHANGELOG for details.
data/lib/gemsmith.rb CHANGED
@@ -1,2 +1,2 @@
1
- require File.join File.dirname(__FILE__), "gemsmith", "version.rb"
2
- require File.join File.dirname(__FILE__), "gemsmith", "kit.rb"
1
+ require "gemsmith/version"
2
+ require "gemsmith/kit"
data/lib/gemsmith/cli.rb CHANGED
@@ -2,22 +2,35 @@ require "yaml"
2
2
  require "thor"
3
3
  require "thor/actions"
4
4
  require "thor_plus/actions"
5
+ require "gemsmith/cli_options"
6
+ require "gemsmith/cli_helpers"
7
+ require "gemsmith/skeletons/base_skeleton"
8
+ require "gemsmith/skeletons/default_skeleton"
9
+ require "gemsmith/skeletons/documentation_skeleton"
10
+ require "gemsmith/skeletons/cli_skeleton"
11
+ require "gemsmith/skeletons/rails_skeleton"
12
+ require "gemsmith/skeletons/rspec_skeleton"
13
+ require "gemsmith/skeletons/travis_skeleton"
14
+ require "gemsmith/skeletons/git_skeleton"
5
15
 
6
16
  module Gemsmith
7
17
  class CLI < Thor
8
18
  include Thor::Actions
9
19
  include ThorPlus::Actions
20
+ include CLIOptions
21
+ include CLIHelpers
10
22
 
11
23
  # Overwrites the Thor template source root.
12
24
  def self.source_root
13
25
  File.expand_path File.join(File.dirname(__FILE__), "templates")
14
26
  end
15
-
27
+
16
28
  # Initialize.
17
29
  def initialize args = [], options = {}, config = {}
18
30
  super args, options, config
19
31
  @settings_file = File.join ENV["HOME"], ".gemsmith", "settings.yml"
20
32
  @settings = load_yaml @settings_file
33
+ @template_options = {}
21
34
  end
22
35
 
23
36
  desc "-c, [create=GEM_NAME]", "Create new gem."
@@ -32,105 +45,32 @@ module Gemsmith
32
45
  def create name
33
46
  say
34
47
  info "Creating gem..."
35
-
36
- # Initialize options.
37
- template_options = build_template_options name, @settings, options
38
- gem_name = template_options[:gem_name]
39
-
40
- # Configure templates.
41
- target_path = File.join Dir.pwd, gem_name
42
-
43
- # Default templates.
44
- template "README.rdoc.tmp", File.join(target_path, "README.rdoc"), template_options
45
- template "CONTRIBUTING.md.tmp", File.join(target_path, "CONTRIBUTING.md"), template_options
46
- template "LICENSE.rdoc.tmp", File.join(target_path, "LICENSE.rdoc"), template_options
47
- template "CHANGELOG.rdoc.tmp", File.join(target_path, "CHANGELOG.rdoc"), template_options
48
- template "Gemfile.tmp", File.join(target_path, "Gemfile"), template_options
49
- template "Rakefile.tmp", File.join(target_path, "Rakefile"), template_options
50
- template "gitignore.tmp", File.join(target_path, ".gitignore"), template_options
51
- template "gem.gemspec.tmp", File.join(target_path, "#{gem_name}.gemspec"), template_options
52
- template File.join("lib", "gem.rb.tmp"), File.join(target_path, "lib", "#{gem_name}.rb"), template_options
53
- template File.join("lib", "gem", "version.rb.tmp"), File.join(target_path, "lib", gem_name, "version.rb"), template_options
54
-
55
- # Binary (optional).
56
- if template_options[:bin]
57
- template File.join("bin", "gem.tmp"), File.join(target_path, "bin", gem_name), template_options
58
- template File.join("lib", "gem", "cli.rb.tmp"), File.join(target_path, "lib", gem_name, "cli.rb"), template_options
59
- end
60
-
61
- # Ruby on Rails (optional).
62
- if template_options[:rails]
63
- # ActionController
64
- template File.join("lib", "gem", "action_controller", "class_methods.rb.tmp"), File.join(target_path, "lib", gem_name, "action_controller", "class_methods.rb"), template_options
65
- template File.join("lib", "gem", "action_controller", "instance_methods.rb.tmp"), File.join(target_path, "lib", gem_name, "action_controller", "instance_methods.rb"), template_options
66
- # ActionView
67
- template File.join("lib", "gem", "action_view", "instance_methods.rb.tmp"), File.join(target_path, "lib", gem_name, "action_view", "instance_methods.rb"), template_options
68
- # ActiveRecord
69
- template File.join("lib", "gem", "active_record", "class_methods.rb.tmp"), File.join(target_path, "lib", gem_name, "active_record", "class_methods.rb"), template_options
70
- template File.join("lib", "gem", "active_record", "instance_methods.rb.tmp"), File.join(target_path, "lib", gem_name, "active_record", "instance_methods.rb"), template_options
71
- # Generators
72
- empty_directory File.join(target_path, "lib", "generators", gem_name, "templates")
73
- template File.join("lib", "generators", "gem", "install", "install_generator.rb.tmp"), File.join(target_path, "lib", "generators", gem_name, "install", "install_generator.rb"), template_options
74
- template File.join("lib", "generators", "gem", "install", "USAGE.tmp"), File.join(target_path, "lib", "generators", gem_name, "install", "USAGE"), template_options
75
- template File.join("lib", "generators", "gem", "upgrade", "upgrade_generator.rb.tmp"), File.join(target_path, "lib", "generators", gem_name, "upgrade", "upgrade_generator.rb"), template_options
76
- template File.join("lib", "generators", "gem", "upgrade", "USAGE.tmp"), File.join(target_path, "lib", "generators", gem_name, "upgrade", "USAGE"), template_options
77
- # Travis CI (optional).
78
- if template_options[:travis]
79
- template File.join("gemfiles", "rails-3.0.x.gemfile.tmp"), File.join(target_path, "gemfiles", "rails-3.0.x.gemfile"), template_options
80
- template File.join("gemfiles", "rails-3.1.x.gemfile.tmp"), File.join(target_path, "gemfiles", "rails-3.1.x.gemfile"), template_options
81
- template File.join("gemfiles", "rails-3.2.x.gemfile.tmp"), File.join(target_path, "gemfiles", "rails-3.2.x.gemfile"), template_options
82
- end
83
- end
84
48
 
85
- # RSpec (optional).
86
- if template_options[:rspec]
87
- template "rspec.tmp", File.join(target_path, ".rspec"), template_options
88
- template File.join("spec", "spec_helper.rb.tmp"), File.join(target_path, "spec", "spec_helper.rb"), template_options
89
- template File.join("spec", "gem_spec.rb.tmp"), File.join(target_path, "spec", "#{gem_name}_spec.rb"), template_options
90
- end
49
+ initialize_template_options name, options
50
+ Skeletons::DefaultSkeleton.run self
51
+ Skeletons::DocumentationSkeleton.run self
52
+ Skeletons::CLISkeleton.run(self) if template_options[:bin]
53
+ Skeletons::RailsSkeleton.run(self) if template_options[:rails]
54
+ Skeletons::RspecSkeleton.run(self) if template_options[:rspec]
55
+ Skeletons::TravisSkeleton.run(self) if template_options[:travis]
56
+ Skeletons::GitSkeleton.run self
91
57
 
92
- # Travis CI (optional).
93
- if template_options[:travis]
94
- template "travis.yml.tmp", File.join(target_path, ".travis.yml"), template_options
95
- end
96
-
97
- # Git
98
- Dir.chdir(target_path) do
99
- `git init`
100
- `git add .`
101
- `git commit -a -n -m "Gemsmith skeleton created."`
102
- end
103
-
104
58
  info "Gem created."
105
59
  say
106
60
  end
107
-
61
+
108
62
  desc "-o, [open=NAME]", "Opens gem in default editor (assumes $EDITOR environment variable)."
109
63
  map "-o" => :open
110
64
  def open name
111
- specs = Gem::Specification.find_all_by_name name
112
- case
113
- when specs.size == 1
114
- `$EDITOR #{specs.first.full_gem_path}`
115
- when specs.size > 1
116
- say "Multiple versions found:"
117
- specs.each_with_index do |spec, index|
118
- say "#{index + 1}. #{spec.name} #{spec.version.version}"
119
- end
120
- result = ask "Please pick one (or type 'q' to quit):"
121
- unless result == 'q'
122
- if (1..specs.size).include?(result.to_i)
123
- spec = Gem::Specification.find_by_name(name, specs[result.to_i - 1].version.version)
124
- `$EDITOR #{spec.full_gem_path}`
125
- else
126
- error "Invalid option: #{result}"
127
- end
128
- end
129
- else
130
- say "Unable to find gem: #{name}"
131
- end
65
+ process_gem name, "open"
66
+ end
67
+
68
+ desc "-r, [read=NAME]", "Opens gem in default browser."
69
+ map "-r" => :read
70
+ def read name
71
+ process_gem name, "read"
132
72
  end
133
-
73
+
134
74
  desc "-e, [edit]", "Edit gem settings in default editor (assumes $EDITOR environment variable)."
135
75
  map "-e" => :edit
136
76
  def edit
@@ -142,49 +82,10 @@ module Gemsmith
142
82
  def version
143
83
  say "Gemsmith " + VERSION
144
84
  end
145
-
85
+
146
86
  desc "-h, [help]", "Show this message."
147
87
  def help task = nil
148
88
  say and super
149
89
  end
150
-
151
- private
152
-
153
- # Builds template options with default and/or custom settings (where the custom
154
- # settings trump default settings).
155
- # ==== Parameters
156
- # * +gem_name+ - Required. The gem name.
157
- # * +settings+ - Optional. The custom settings. Default: {}.
158
- # * +options+ - Optional. Additional command line options. Default: {}.
159
- def build_template_options gem_name, settings = {}, options = {}
160
- gem_name = Thor::Util.snake_case gem_name
161
- gem_class = Thor::Util.camel_case gem_name
162
- author_name = settings[:author_name] || Gemsmith::Kit.git_config_value("user.name") || "TODO: Add full name here."
163
- author_email = settings[:author_email] || Gemsmith::Kit.git_config_value("user.email") || "TODO: Add email address here."
164
- author_url = settings[:author_url] || "https://www.unknown.com"
165
- {
166
- gem_name: gem_name,
167
- gem_class: gem_class,
168
- gem_platform: (settings[:gem_platform] || "Gem::Platform::RUBY"),
169
- author_name: author_name,
170
- author_email: author_email,
171
- author_url: (author_url || "http://www.unknown.com"),
172
- gem_url: (settings[:gem_url] || author_url),
173
- company_name: (settings[:company_name] || author_name),
174
- company_url: (settings[:company_url] || author_url),
175
- github_user: (settings[:github_user] || Gemsmith::Kit.git_config_value("github.user") || "unknown"),
176
- year: (settings[:year] || Time.now.year),
177
- ruby_version: (settings[:ruby_version] || "2.0.0"),
178
- rails_version: (settings[:rails_version] || "3.0"),
179
- post_install_message: settings[:post_install_message],
180
- bin: (options[:bin] || false),
181
- rails: (options[:rails] || false),
182
- pry: (options[:pry] || true),
183
- guard: (options[:guard] || true),
184
- rspec: (options[:rspec] || true),
185
- travis: (options[:travis] || true),
186
- code_climate: (options[:code_climate] || true)
187
- }
188
- end
189
90
  end
190
91
  end
@@ -0,0 +1,90 @@
1
+ module Gemsmith
2
+ module CLIHelpers
3
+ # Answers the gem name (snake case).
4
+ # ==== Parameters
5
+ # * +name+ - Optional. The gem name. Default: nil
6
+ def gem_name name = nil
7
+ @gem_name ||= Thor::Util.snake_case name
8
+ end
9
+
10
+ # Answers the gem class (camel case).
11
+ # ==== Parameters
12
+ # * +name+ - Optional. The gem class. Default: nil
13
+ def gem_class name = nil
14
+ @gem_class ||= Thor::Util.camel_case name
15
+ end
16
+
17
+ # Answers all gem template options.
18
+ def template_options
19
+ @template_options
20
+ end
21
+
22
+ module_function
23
+
24
+ # Converts hash keys from strings to symbols (if any).
25
+ # ===== Parameters
26
+ # * +options+ - Optional. The hash to convert. Default: {}
27
+ def enforce_symbol_keys options = {}
28
+ options.each_with_object({}) { |(key, value), hash| hash[key.to_sym] = value }
29
+ end
30
+
31
+ # Prints currently installed gem name and version information.
32
+ # ===== Parameters
33
+ # * +gems+ - Required. The array of gem names (i.e. gem specifications).
34
+ def print_gems gems
35
+ say "Multiple versions found:"
36
+ gems.each_with_index do |spec, index|
37
+ say "#{index + 1}. #{spec.name} #{spec.version.version}"
38
+ end
39
+ end
40
+
41
+ # Picks a gem specification for processing.
42
+ # ===== Parameters
43
+ # * +gems+ - Required. The array of gem specifications.
44
+ # * +name+ - Required. The gem name to search for.
45
+ def pick_gem gems, name
46
+ result = ask "Please pick one (or type 'q' to quit):"
47
+
48
+ return if result == 'q' # Exit early.
49
+
50
+ if (1..gems.size).include?(result.to_i)
51
+ Gem::Specification.find_by_name name, gems[result.to_i - 1].version.version
52
+ else
53
+ error "Invalid option: #{result}"
54
+ nil
55
+ end
56
+ end
57
+
58
+ # Opens selected gem within default editor.
59
+ # ===== Parameters
60
+ # * +spec+ - Required. The gem specification.
61
+ def open_gem spec
62
+ `$EDITOR #{spec.full_gem_path}` if spec
63
+ end
64
+
65
+ # Opens selected gem within default browser.
66
+ # ===== Parameters
67
+ # * +spec+ - Required. The gem specification.
68
+ def read_gem spec
69
+ `open #{spec.homepage}` if spec
70
+ end
71
+
72
+ # Processes a gem for given name and command.
73
+ # ===== Parameters
74
+ # * +name+ - Required. The gem name.
75
+ # * +command+ - Required. The command to process the gem.
76
+ def process_gem name, command
77
+ specs = Gem::Specification.find_all_by_name name
78
+
79
+ case
80
+ when specs.size == 1
81
+ send "#{command}_gem", specs.first
82
+ when specs.size > 1
83
+ print_gems specs
84
+ send "#{command}_gem", pick_gem(specs, name)
85
+ else
86
+ say "Unable to find gem: #{name}"
87
+ end
88
+ end
89
+ end
90
+ end