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 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
@@ -0,0 +1,7 @@
1
+ require 'rspec/core/rake_task'
2
+ require 'rubocop/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+ RuboCop::RakeTask.new
6
+
7
+ task default: [:spec, :rubocop]
@@ -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,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
@@ -0,0 +1,7 @@
1
+ # <%= gem_name %>
2
+
3
+ <%= description %>
4
+
5
+ ## Installation
6
+
7
+ $ gem install <%= gem_name %>
@@ -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,3 @@
1
+ module <%= gem_module %>
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,3 @@
1
+ module <%= gem_module %>
2
+ # autoload :MyClass, '<%= gem_name %>/my_class'
3
+ 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
@@ -0,0 +1,3 @@
1
+ module Gemstrap
2
+ VERSION = '0.0.1'
3
+ end
data/lib/gemstrap.rb ADDED
@@ -0,0 +1,5 @@
1
+ module Gemstrap
2
+ autoload :CLI, 'gemstrap/cli'
3
+ autoload :Template, 'gemstrap/template'
4
+ autoload :Generator, 'gemstrap/generator'
5
+ end
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