gemstrap 0.0.1
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 +15 -0
- data/Rakefile +7 -0
- data/lib/gemstrap/cli.rb +77 -0
- data/lib/gemstrap/colorize.rb +19 -0
- data/lib/gemstrap/generator.rb +110 -0
- data/lib/gemstrap/template/Gemfile +2 -0
- data/lib/gemstrap/template/README.md.erb +7 -0
- data/lib/gemstrap/template/Rakefile +14 -0
- data/lib/gemstrap/template/gemspec.erb +23 -0
- data/lib/gemstrap/template/lib/gem_name/version.rb.erb +3 -0
- data/lib/gemstrap/template/lib/root.rb.erb +3 -0
- data/lib/gemstrap/template.rb +15 -0
- data/lib/gemstrap/version.rb +3 -0
- data/lib/gemstrap.rb +5 -0
- data/spec/cli_spec.rb +45 -0
- metadata +87 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
NGU2MzRjYjA5NWM4YTQ3M2U0YWJlMjUxMzlkY2ZlZjRkZjAyMWE1Yg==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ZDQ4NjIyYTFlYTU3M2Y0Y2FjZjMyYTAxYzQ1MzE4MDQ3YjVmNDUxYg==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MjU3MmRjNWUyZDhmNDFjYTAwYzIyNjRjN2U0OTBmMDNmZjliNzBjZmU2ODlj
|
10
|
+
ODhlNDNmMTFiZjI2NGYxOGU2MjkwNmQ2NDNmYzIzYzc5NDFmZjIwMGNhNWY1
|
11
|
+
NDI2NTk1Mjk1ODliMGY2YjViZDMzYmE5N2MwNTQyMWJhNDQzYTU=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
YThiMDE5OTI4N2Q3MTMxNzUwZTI0NmQzZDdhMzY3N2IxYWI4MGI0MDBmYjNh
|
14
|
+
Yjg2YjZlYzk2NjI0ZDBkZTU4MmI1N2MzZGNlYzc3NWUwZDMzYzg3YzM4Nzkz
|
15
|
+
ZGYyNmI5YmRiYjk1OWYzZjMyYjVkOTc1OGQ0YzQwMjYwZWZlOWU=
|
data/Rakefile
ADDED
data/lib/gemstrap/cli.rb
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
require 'gemstrap/version'
|
3
|
+
require 'gemstrap/generator'
|
4
|
+
|
5
|
+
module Gemstrap
|
6
|
+
class CLI
|
7
|
+
def self.read(arguments = ARGV)
|
8
|
+
options = Hash.new
|
9
|
+
optparse = OptionParser.new do |opts|
|
10
|
+
opts.on('-h', '--help', 'Display this message') do
|
11
|
+
puts opts
|
12
|
+
exit
|
13
|
+
end
|
14
|
+
opts.on('-V', '--version', 'Display version') do
|
15
|
+
puts Gemstrap::VERSION
|
16
|
+
exit
|
17
|
+
end
|
18
|
+
opts.on('-n', '--name GEM_NAME', 'Gem name') do |gem_name|
|
19
|
+
options[:gem_name] = gem_name
|
20
|
+
end
|
21
|
+
opts.on('-d', '--description GEM_DESC', 'Gem description') do |description|
|
22
|
+
options[:description] = description
|
23
|
+
end
|
24
|
+
opts.on('-a', '--authors AUTHORS', 'CSV list of authors names (e.g. John Dorian, Christopher Turk)') do |authors|
|
25
|
+
options[:authors] = authors.split(',')
|
26
|
+
end
|
27
|
+
opts.on('-m', '--emails AUTHORS_EMAILS', 'CSV list of corresponding authors emails (e.g. jd@sacredheart.com, turk@sacredheart.com)') do |authors_emails|
|
28
|
+
options[:authors_emails] = authors_emails.split(',')
|
29
|
+
end
|
30
|
+
opts.on('-s', '--summary SUMMARY', 'Gem summary. If not supplied takes description value.') do |summary|
|
31
|
+
options[:summary] = summary
|
32
|
+
end
|
33
|
+
opts.on('-g', '--github_user GITHUB_USER', 'Github user. If not blank, homepage will be set to GITHUB_USER/GEM_NAME') do |github_user|
|
34
|
+
options[:github_user] = github_user
|
35
|
+
end
|
36
|
+
opts.on('-H', '--homepage HOMEPAGE', 'Homepage URL. Takes priority over the github_user parameter.') do |homepage|
|
37
|
+
options[:homepage] = homepage
|
38
|
+
end
|
39
|
+
opts.on('-i', '--interactive', 'Interactive mode. Prompt for user the parameters for gem generate.') do
|
40
|
+
options = run_interactive_mode
|
41
|
+
end
|
42
|
+
end
|
43
|
+
optparse.parse!(arguments)
|
44
|
+
options = run_interactive_mode if options.empty?
|
45
|
+
fail 'Gem name cannot be empty' unless options[:gem_name]
|
46
|
+
options[:summary] ||= options[:description]
|
47
|
+
options
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.run_interactive_mode
|
51
|
+
options = Hash.new
|
52
|
+
gem_name = prompt('Gem name: ')
|
53
|
+
options[:gem_name] = gem_name unless gem_name.empty?
|
54
|
+
options[:description] = prompt('Gem description: ')
|
55
|
+
options[:authors] = prompt('Authors: ').split(',')
|
56
|
+
options[:authors_emails] = prompt('Authors emails: ').split(',')
|
57
|
+
options[:summary] = prompt('Summary: ')
|
58
|
+
options[:github_user] = prompt('Github user: ')
|
59
|
+
options[:homepage] = prompt('Homepage: ')
|
60
|
+
options
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.prompt(msg)
|
64
|
+
print(msg)
|
65
|
+
gets.strip
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.run(options)
|
69
|
+
new(options)
|
70
|
+
end
|
71
|
+
|
72
|
+
def initialize(options)
|
73
|
+
@generator = Gemstrap::Generator.new
|
74
|
+
@generator.run(options)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Gemstrap
|
2
|
+
module Colorize
|
3
|
+
CLEAR = "\e[0m"
|
4
|
+
BOLD = "\e[1m"
|
5
|
+
BLACK = "\e[30m"
|
6
|
+
RED = "\e[31m"
|
7
|
+
GREEN = "\e[32m"
|
8
|
+
YELLOW = "\e[33m"
|
9
|
+
BLUE = "\e[34m"
|
10
|
+
MAGENTA = "\e[35m"
|
11
|
+
CYAN = "\e[36m"
|
12
|
+
WHITE = "\e[37m"
|
13
|
+
|
14
|
+
def color(text, color, bold = false)
|
15
|
+
bold = bold ? BOLD : ''
|
16
|
+
"#{bold}#{color}#{text}#{CLEAR}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
require 'gemstrap/template'
|
5
|
+
require 'gemstrap/colorize'
|
6
|
+
|
7
|
+
module Gemstrap
|
8
|
+
class Generator
|
9
|
+
include FileUtils
|
10
|
+
include Colorize
|
11
|
+
|
12
|
+
def run(args)
|
13
|
+
options.merge!(args)
|
14
|
+
puts " creating gem #{color(gem_name, YELLOW)}"
|
15
|
+
say_args(args)
|
16
|
+
generate!
|
17
|
+
rescue => e
|
18
|
+
puts e.message
|
19
|
+
puts e.backtrace.join("\n")
|
20
|
+
end
|
21
|
+
|
22
|
+
def method_missing(method, *args, &block)
|
23
|
+
return context[method] if context.include?(method)
|
24
|
+
super
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def options
|
30
|
+
@options ||= {
|
31
|
+
gem_name: '',
|
32
|
+
authors: [],
|
33
|
+
authors_emails: [],
|
34
|
+
description: '',
|
35
|
+
summary: '',
|
36
|
+
github_user: '',
|
37
|
+
homepage: ''
|
38
|
+
}
|
39
|
+
end
|
40
|
+
|
41
|
+
def context
|
42
|
+
options[:templates] = Pathname.new(File.dirname(__FILE__)).join('template')
|
43
|
+
options[:path] = Pathname.new('.').join(options[:gem_name])
|
44
|
+
options[:lib_path] = options[:path].join('lib')
|
45
|
+
options[:spec_path] = options[:path].join('spec')
|
46
|
+
options[:gem_module] = gem_name_to_module_name
|
47
|
+
options
|
48
|
+
end
|
49
|
+
|
50
|
+
def generate!
|
51
|
+
puts ' generate'
|
52
|
+
mkdir_p(path)
|
53
|
+
generate_root_files
|
54
|
+
generate_lib_files
|
55
|
+
mkdir_p(spec_path)
|
56
|
+
cp(templates.join('Rakefile'), path)
|
57
|
+
end
|
58
|
+
|
59
|
+
def generate_root_files
|
60
|
+
%w(.gitignore Rakefile Gemfile).each do |file|
|
61
|
+
copy_template(templates.join(file), path.join(file))
|
62
|
+
end
|
63
|
+
generate_file(path.join('README.md'), render_template('README.md.erb'))
|
64
|
+
generate_file(path.join("#{gem_name}.gemspec"), render_template('gemspec.erb'))
|
65
|
+
end
|
66
|
+
|
67
|
+
def generate_lib_files
|
68
|
+
[lib_path, lib_path.join(gem_name)].each { |path| mkdir_p(path) }
|
69
|
+
generate_file(lib_path.join("#{gem_name}.rb"), render_template('lib/root.rb.erb'))
|
70
|
+
generate_file(lib_path.join("#{gem_name}/version.rb"), render_template('lib/gem_name/version.rb.erb'))
|
71
|
+
end
|
72
|
+
|
73
|
+
def render_template(template_path)
|
74
|
+
Gemstrap::Template.render(templates.join(template_path), context)
|
75
|
+
end
|
76
|
+
|
77
|
+
def mkdir_p(path)
|
78
|
+
say_created(path)
|
79
|
+
super(path)
|
80
|
+
end
|
81
|
+
|
82
|
+
def copy_template(from, to)
|
83
|
+
cp(from, to)
|
84
|
+
say_created(to)
|
85
|
+
end
|
86
|
+
|
87
|
+
def generate_file(path, contents)
|
88
|
+
IO.write(path, contents)
|
89
|
+
say_created(path)
|
90
|
+
end
|
91
|
+
|
92
|
+
def say_args(args)
|
93
|
+
puts ' gem data'
|
94
|
+
args.each do |k, v|
|
95
|
+
k = color(k, BOLD, true)
|
96
|
+
puts " using #{k.ljust(28)} => #{v}"
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def say_created(item)
|
101
|
+
created_color = color('create', GREEN, true)
|
102
|
+
puts " #{created_color} #{item}"
|
103
|
+
end
|
104
|
+
|
105
|
+
def gem_name_to_module_name
|
106
|
+
name_parts = options[:gem_name].split('-').collect { |n| n.split('_') }
|
107
|
+
name_parts.flatten.collect(&:capitalize).join
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'bundler/setup'
|
5
|
+
rescue LoadError
|
6
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
7
|
+
end
|
8
|
+
|
9
|
+
require 'bundler/gem_tasks'
|
10
|
+
|
11
|
+
require 'rspec/core'
|
12
|
+
require 'rspec/core/rake_task'
|
13
|
+
|
14
|
+
task default: :spec
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
$LOAD_PATH.push File.expand_path('../lib', __FILE__)
|
4
|
+
|
5
|
+
require '<%= gem_name %>/version'
|
6
|
+
|
7
|
+
# Describe your gem and declare its dependencies:
|
8
|
+
Gem::Specification.new do |s|
|
9
|
+
s.name = '<%= gem_name %>'
|
10
|
+
s.version = <%= gem_module %>::VERSION
|
11
|
+
<% if authors %>s.authors = <%= authors %><% end %>
|
12
|
+
<% if authors_emails %>s.email = <%= authors_emails %><% end %>
|
13
|
+
s.homepage = <% if homepage.size > 0 %>'<%= homepage %>'<% elsif github_user %>'https://github.com/<%= github_user %>/<%= gem_name %>'<% end %>
|
14
|
+
s.summary = '<%= summary %>'
|
15
|
+
s.description = '<%= description %>'
|
16
|
+
s.license = 'MIT'
|
17
|
+
|
18
|
+
s.files = Dir['{app,config,db,lib}/**/*', 'MIT-LICENSE', 'Rakefile', 'README.md']
|
19
|
+
s.test_files = Dir['spec/**/*']
|
20
|
+
|
21
|
+
s.add_development_dependency 'rake'
|
22
|
+
s.add_development_dependency 'rspec-core'
|
23
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'erb'
|
2
|
+
require 'ostruct'
|
3
|
+
|
4
|
+
module Gemstrap
|
5
|
+
class Template < OpenStruct
|
6
|
+
def self.render(template_path, hash)
|
7
|
+
Template.new(hash).render(template_path)
|
8
|
+
end
|
9
|
+
|
10
|
+
def render(template_path)
|
11
|
+
template = ERB.new(IO.read(template_path))
|
12
|
+
template.result(binding)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/gemstrap.rb
ADDED
data/spec/cli_spec.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../lib/gemstrap/cli.rb'
|
2
|
+
|
3
|
+
describe Gemstrap::CLI do
|
4
|
+
it 'does raise an error on missing name' do
|
5
|
+
expect do
|
6
|
+
Gemstrap::CLI.read(['-n'])
|
7
|
+
end.to raise_error
|
8
|
+
end
|
9
|
+
|
10
|
+
context '#read' do
|
11
|
+
let(:args) do
|
12
|
+
{
|
13
|
+
gem_name: 'yourface_jokes',
|
14
|
+
description: 'Generates your-face jokes. Guaranteed funny.',
|
15
|
+
summary: 'Your-face joke generator',
|
16
|
+
github_user: 'dieb',
|
17
|
+
authors: ['John Dorian'],
|
18
|
+
authors_emails: ['jd@sacredheart.com'],
|
19
|
+
homepage: 'http://yourface.io'
|
20
|
+
}
|
21
|
+
end
|
22
|
+
let(:sample_argv) do
|
23
|
+
['-n', args[:gem_name],
|
24
|
+
'-a', args[:authors].first,
|
25
|
+
'-m', args[:authors_emails].first,
|
26
|
+
'-d', args[:description],
|
27
|
+
'-s', args[:summary],
|
28
|
+
'-g', args[:github_user],
|
29
|
+
'-H', args[:homepage]]
|
30
|
+
end
|
31
|
+
let(:options) { Gemstrap::CLI.read(sample_argv) }
|
32
|
+
|
33
|
+
it 'does parse input arguments' do
|
34
|
+
args.each do |key, expected|
|
35
|
+
expect(options[key]).to eql(expected)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'does reuses description on summary' do
|
40
|
+
sample_argv.delete args[:summary]
|
41
|
+
sample_argv.delete '-s'
|
42
|
+
expect(options[:summary]).to eql(args[:description])
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
metadata
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gemstrap
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- André Dieb Martins
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-06-04 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '10.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '10.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '3.0'
|
41
|
+
description: Command-line tool for bootstraping a new ruby gem in seconds.
|
42
|
+
email:
|
43
|
+
- andre.dieb@gmail.com
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- Rakefile
|
49
|
+
- lib/gemstrap.rb
|
50
|
+
- lib/gemstrap/cli.rb
|
51
|
+
- lib/gemstrap/colorize.rb
|
52
|
+
- lib/gemstrap/generator.rb
|
53
|
+
- lib/gemstrap/template.rb
|
54
|
+
- lib/gemstrap/template/Gemfile
|
55
|
+
- lib/gemstrap/template/README.md.erb
|
56
|
+
- lib/gemstrap/template/Rakefile
|
57
|
+
- lib/gemstrap/template/gemspec.erb
|
58
|
+
- lib/gemstrap/template/lib/gem_name/version.rb.erb
|
59
|
+
- lib/gemstrap/template/lib/root.rb.erb
|
60
|
+
- lib/gemstrap/version.rb
|
61
|
+
- spec/cli_spec.rb
|
62
|
+
homepage: https://github.com/dieb/gemstrap
|
63
|
+
licenses:
|
64
|
+
- MIT
|
65
|
+
metadata: {}
|
66
|
+
post_install_message:
|
67
|
+
rdoc_options: []
|
68
|
+
require_paths:
|
69
|
+
- lib
|
70
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ! '>='
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - ! '>='
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0'
|
80
|
+
requirements: []
|
81
|
+
rubyforge_project:
|
82
|
+
rubygems_version: 2.2.2
|
83
|
+
signing_key:
|
84
|
+
specification_version: 4
|
85
|
+
summary: Fastest way to bootstrap a new ruby gem.
|
86
|
+
test_files:
|
87
|
+
- spec/cli_spec.rb
|