gemmy_rb 0.0.1a
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 +7 -0
- data/bin/gemmy +3 -0
- data/lib/gemmy.rb +18 -0
- data/lib/gemmy/cli.rb +58 -0
- data/lib/gemmy/config.rb +67 -0
- data/lib/gemmy/plugin.rb +49 -0
- data/lib/gemmy/plugin/gemspec_generator.rb +31 -0
- data/lib/gemmy/plugin/template_generator.rb +15 -0
- data/lib/gemmy/plugin/test_directory_generator.rb +19 -0
- data/lib/gemmy/runner.rb +15 -0
- data/lib/gemmy/template_writer.rb +24 -0
- data/lib/gemmy/version.rb +3 -0
- data/templates/Gemfile.erb +3 -0
- data/templates/README.md.erb +7 -0
- data/templates/Rakefile.erb +62 -0
- data/templates/base_module.rb.erb +1 -0
- data/templates/gemspec.erb +18 -0
- data/templates/gitignore +4 -0
- data/templates/test_helper.rb.erb +4 -0
- data/templates/version.rb.erb +19 -0
- metadata +63 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f6e3186aa7bdf083d7900fb09e70eb9f8c6d580d
|
4
|
+
data.tar.gz: 567648eade0d418f02344b1ad88fdda5ed4f9c51
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d005a8beab2961a98672f26a78e7253138f5b2e53e7e0416fde195f6120ec894babbe69a056ea98b29f82929879d40d44f6419915fc980e4d8ac9fea7283b9ad
|
7
|
+
data.tar.gz: fdd195ff2a642cf028607084ecd3721cb2e4211ac5f4c1e8cd6041ecc7a47a90cf64b6d4daeba7ad98310d72516e8628cfb1cde855ed3828120f5245d4065233
|
data/bin/gemmy
ADDED
data/lib/gemmy.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'gemmy/config'
|
2
|
+
require 'gemmy/runner'
|
3
|
+
require 'gemmy/plugin'
|
4
|
+
|
5
|
+
module Gemmy
|
6
|
+
class << self
|
7
|
+
def root_dir
|
8
|
+
File.expand_path('../..', __FILE__)
|
9
|
+
end
|
10
|
+
|
11
|
+
def bootstrap(opts = {})
|
12
|
+
config = opts[:config] || Gemmy::Config.default
|
13
|
+
plugins = opts[:plugins] || Gemmy::Plugin.defaults(config)
|
14
|
+
runner = Gemmy::Runner.new(config, plugins)
|
15
|
+
runner.run
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/gemmy/cli.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'gemmy'
|
3
|
+
|
4
|
+
module Gemmy
|
5
|
+
class CLI < Thor
|
6
|
+
desc 'init', 'Initialize gem'
|
7
|
+
option :dir, type: :string
|
8
|
+
option :authors, type: :string
|
9
|
+
option :email, type: :string
|
10
|
+
option :name, type: :string
|
11
|
+
option :homepage, type: :string
|
12
|
+
option :summary, type: :string
|
13
|
+
option :description, type: :string
|
14
|
+
def init
|
15
|
+
opts = options.dup
|
16
|
+
if opts[:dir]
|
17
|
+
opts[:dir] = File.join(Dir.getwd, opts[:dir])
|
18
|
+
else
|
19
|
+
opts[:dir] = Dir.getwd
|
20
|
+
end
|
21
|
+
|
22
|
+
if opts[:authors]
|
23
|
+
opts[:authors] = opts[:authors].split(',')
|
24
|
+
else
|
25
|
+
opts[:authors] = [`git config user.name`.strip]
|
26
|
+
end
|
27
|
+
|
28
|
+
opts[:email] ||= `git config user.email`.strip
|
29
|
+
opts[:name] ||= opts[:dir].split(File::SEPARATOR).last
|
30
|
+
opts[:homepage] ||= "https://github.com/#{`git config github.user`.strip}/#{opts[:name]}"
|
31
|
+
opts[:summary] ||= prompt_for('Summary')
|
32
|
+
opts[:description] ||= prompt_for('Description')
|
33
|
+
|
34
|
+
puts "Initializing gem '#{opts[:name]}' in #{opts[:dir]}"
|
35
|
+
puts opts.map {|k,v| "#{k.to_s.capitalize}: #{v}"}
|
36
|
+
.map {|s| s.prepend '* '}
|
37
|
+
.join("\n")
|
38
|
+
|
39
|
+
config = Gemmy::Config.default.merge({
|
40
|
+
gem_name: opts[:name],
|
41
|
+
gem_authors: [opts[:authors]],
|
42
|
+
gem_email: opts[:email],
|
43
|
+
gem_homepage: opts[:homepage],
|
44
|
+
gem_summary: opts[:summary],
|
45
|
+
gem_description: opts[:description],
|
46
|
+
dir: opts[:dir]
|
47
|
+
})
|
48
|
+
Gemmy.bootstrap(config: config)
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def prompt_for(str)
|
54
|
+
print str + ': '
|
55
|
+
$stdin.gets.strip
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
data/lib/gemmy/config.rb
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'erb'
|
2
|
+
|
3
|
+
module Gemmy
|
4
|
+
class Config
|
5
|
+
class << self
|
6
|
+
def default
|
7
|
+
new({
|
8
|
+
dir: Dir.getwd,
|
9
|
+
template_dir: File.join(Gemmy.root_dir, 'templates'),
|
10
|
+
test_style: :spec,
|
11
|
+
test_library: :minitest,
|
12
|
+
gem_name: nil,
|
13
|
+
gem_summary: '',
|
14
|
+
gem_description: '',
|
15
|
+
gem_licenses: ['MIT'],
|
16
|
+
gem_initial_version: '0.0.0'
|
17
|
+
})
|
18
|
+
end
|
19
|
+
|
20
|
+
def load_file(yml_file)
|
21
|
+
new(YAML.load_file(yml_file))
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def initialize(config = {})
|
26
|
+
@config = config
|
27
|
+
end
|
28
|
+
|
29
|
+
def merge(hash)
|
30
|
+
tap { @config = @config.merge(hash) }
|
31
|
+
end
|
32
|
+
|
33
|
+
def validate
|
34
|
+
[:gem_name, :dir].each do |sym|
|
35
|
+
raise ArgumentError.new("#{sym} required") if !respond_to?(sym) || public_send(sym).nil?
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def apply_to_template(template)
|
40
|
+
ERB.new(template).result(binding)
|
41
|
+
end
|
42
|
+
|
43
|
+
def respond_to_missing?(sym, include_private = false)
|
44
|
+
@config.has_key? sym
|
45
|
+
end
|
46
|
+
|
47
|
+
def gem_module_name
|
48
|
+
gem_name.split('_').map {|s| capitalize s}.join
|
49
|
+
.split('-').map {|s| capitalize s}.join('::')
|
50
|
+
end
|
51
|
+
|
52
|
+
def gem_base_path
|
53
|
+
gem_name.gsub('-', '/')
|
54
|
+
end
|
55
|
+
|
56
|
+
def method_missing(sym, *args)
|
57
|
+
return @config[sym] if @config.has_key? sym
|
58
|
+
super
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def capitalize(s)
|
64
|
+
s[0].upcase << s[1..-1]
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
data/lib/gemmy/plugin.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'gemmy/plugin/template_generator'
|
2
|
+
require 'gemmy/plugin/test_directory_generator'
|
3
|
+
require 'gemmy/plugin/gemspec_generator'
|
4
|
+
|
5
|
+
module Gemmy
|
6
|
+
class Plugin
|
7
|
+
# Plugins are duck typed on #run
|
8
|
+
def run; end
|
9
|
+
|
10
|
+
class << self
|
11
|
+
def defaults(config)
|
12
|
+
[
|
13
|
+
Gemmy::Plugin::TemplateGenerator.new(
|
14
|
+
config: config,
|
15
|
+
template: File.join(config.template_dir, 'Gemfile.erb'),
|
16
|
+
out: File.join(config.dir, 'Gemfile')
|
17
|
+
),
|
18
|
+
Gemmy::Plugin::TemplateGenerator.new(
|
19
|
+
config: config,
|
20
|
+
template: File.join(config.template_dir, 'Rakefile.erb'),
|
21
|
+
out: File.join(config.dir, 'Rakefile')
|
22
|
+
),
|
23
|
+
Gemmy::Plugin::TemplateGenerator.new(
|
24
|
+
config: config,
|
25
|
+
template: File.join(config.template_dir, 'README.md.erb'),
|
26
|
+
out: File.join(config.dir, 'README.md')
|
27
|
+
),
|
28
|
+
Gemmy::Plugin::TemplateGenerator.new(
|
29
|
+
config: config,
|
30
|
+
template: File.join(config.template_dir, 'gitignore'),
|
31
|
+
out: File.join(config.dir, '.gitignore')
|
32
|
+
),
|
33
|
+
Gemmy::Plugin::TestDirectoryGenerator.new(
|
34
|
+
config: config,
|
35
|
+
helper_template: File.join(config.template_dir, 'test_helper.rb.erb'),
|
36
|
+
test_style: config.test_style,
|
37
|
+
working_dir: config.dir
|
38
|
+
),
|
39
|
+
Gemmy::Plugin::GemspecGenerator.new(
|
40
|
+
config: config,
|
41
|
+
gemspec_template: File.join(config.template_dir, 'gemspec.erb'),
|
42
|
+
version_template: File.join(config.template_dir, 'version.rb.erb'),
|
43
|
+
base_module_template: File.join(config.template_dir, 'base_module.rb.erb')
|
44
|
+
)
|
45
|
+
]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'gemmy/template_writer'
|
2
|
+
|
3
|
+
module Gemmy
|
4
|
+
class Plugin
|
5
|
+
class GemspecGenerator
|
6
|
+
def initialize(config: nil, gemspec_template: nil, version_template: nil, base_module_template: nil)
|
7
|
+
@writers = [
|
8
|
+
Gemmy::TemplateWriter.new(
|
9
|
+
config,
|
10
|
+
gemspec_template,
|
11
|
+
File.join(config.dir, "#{config.gem_name}.gemspec")
|
12
|
+
),
|
13
|
+
Gemmy::TemplateWriter.new(
|
14
|
+
config,
|
15
|
+
version_template,
|
16
|
+
File.join(config.dir, 'lib', config.gem_base_path, 'version.rb')
|
17
|
+
),
|
18
|
+
Gemmy::TemplateWriter.new(
|
19
|
+
config,
|
20
|
+
base_module_template,
|
21
|
+
File.join(config.dir, 'lib', config.gem_base_path + '.rb')
|
22
|
+
)
|
23
|
+
]
|
24
|
+
end
|
25
|
+
|
26
|
+
def run
|
27
|
+
@writers.each(&:write)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'gemmy/template_writer'
|
2
|
+
|
3
|
+
module Gemmy
|
4
|
+
class Plugin
|
5
|
+
class TemplateGenerator
|
6
|
+
def initialize(config: nil, template: nil, out: nil)
|
7
|
+
@writer = Gemmy::TemplateWriter.new(config, template, out)
|
8
|
+
end
|
9
|
+
|
10
|
+
def run
|
11
|
+
@writer.write
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'gemmy/template_writer'
|
2
|
+
|
3
|
+
module Gemmy
|
4
|
+
class Plugin
|
5
|
+
class TestDirectoryGenerator
|
6
|
+
def initialize(config: nil, helper_template: nil, test_style: nil, working_dir: nil)
|
7
|
+
@writer = Gemmy::TemplateWriter.new(
|
8
|
+
config,
|
9
|
+
helper_template,
|
10
|
+
File.join(working_dir, test_style.to_s, "#{test_style}_helper.rb")
|
11
|
+
)
|
12
|
+
end
|
13
|
+
|
14
|
+
def run
|
15
|
+
@writer.write
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/gemmy/runner.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
module Gemmy
|
2
|
+
class Runner
|
3
|
+
def initialize(config, plugins)
|
4
|
+
@config = config
|
5
|
+
@plugins = plugins
|
6
|
+
end
|
7
|
+
|
8
|
+
def run
|
9
|
+
@config.validate
|
10
|
+
Dir.mkdir(@config.dir) unless Dir.exists?(@config.dir)
|
11
|
+
@plugins.each { |p| p.run }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
module Gemmy
|
4
|
+
class TemplateWriter
|
5
|
+
def initialize(config, template_path, out)
|
6
|
+
@config = config
|
7
|
+
@template_path = template_path
|
8
|
+
@out = out
|
9
|
+
end
|
10
|
+
|
11
|
+
def write
|
12
|
+
FileUtils.mkdir_p(File.dirname(@out))
|
13
|
+
File.open(@out, 'w') do |f|
|
14
|
+
is_erb = !!@template_path[/\.erb$/]
|
15
|
+
template = File.read(@template_path)
|
16
|
+
if is_erb
|
17
|
+
f.write @config.apply_to_template(template)
|
18
|
+
else
|
19
|
+
f.write template
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'rake/testtask'
|
2
|
+
|
3
|
+
Rake::TestTask.new do |t|
|
4
|
+
t.name = :<%= test_style %>
|
5
|
+
t.libs << '<%= test_style %>'
|
6
|
+
t.test_files = FileList['<%= test_style %>/**/*<%= test_style %>.rb']
|
7
|
+
t.verbose = true
|
8
|
+
end
|
9
|
+
|
10
|
+
task :default => [:<%= test_style %>]
|
11
|
+
|
12
|
+
desc 'rm all *.gem files'
|
13
|
+
task :clean do
|
14
|
+
require 'fileutils'
|
15
|
+
FileUtils.rm Dir.glob('*.gem')
|
16
|
+
end
|
17
|
+
|
18
|
+
desc 'build gem'
|
19
|
+
task :build do
|
20
|
+
gemspec = Dir.glob('*.gemspec').first
|
21
|
+
system "gem build #{gemspec}"
|
22
|
+
end
|
23
|
+
|
24
|
+
desc 'install local gem'
|
25
|
+
task :install_local do
|
26
|
+
gem = Dir.glob('*.gem').first
|
27
|
+
system "gem install #{gem} --local"
|
28
|
+
end
|
29
|
+
|
30
|
+
desc 'build gem and push it to rubygems'
|
31
|
+
task :deploy => [:clean, :build] do
|
32
|
+
gem = Dir.glob('*.gem').first
|
33
|
+
system "gem push #{gem}"
|
34
|
+
end
|
35
|
+
|
36
|
+
desc 'runs through entire deploy process'
|
37
|
+
task :full_deploy => [:<%= test_style %>, :change_version] do
|
38
|
+
system "git push && git push --tags"
|
39
|
+
Rake::Task['deploy'].invoke
|
40
|
+
end
|
41
|
+
|
42
|
+
task :change_version do
|
43
|
+
raise "Version required: ENV['TO']" unless ENV['TO']
|
44
|
+
|
45
|
+
puts 'Checking for existing tag'
|
46
|
+
raise "Tag '#{ENV['TO']}' already exists!" unless `git tag -l $TO`.empty?
|
47
|
+
|
48
|
+
puts "Updating version.rb to '#{ENV['TO']}'"
|
49
|
+
version_file = '<%= File.join('lib', gem_base_path, 'version.rb') %>'
|
50
|
+
before_text = File.read(version_file)
|
51
|
+
text = before_text.gsub(/(?<=').+(?=')/, ENV['TO'])
|
52
|
+
raise "Aborting: Version didn't change" if text == before_text
|
53
|
+
File.open(version_file, 'w') {|f| f.puts text}
|
54
|
+
|
55
|
+
puts 'Committing version.rb'
|
56
|
+
exit(1) unless system "git add <%= File.join('lib', gem_base_path, 'version.rb') %>"
|
57
|
+
exit(1) unless system "git commit -m 'bump to version #{ENV['TO']}'"
|
58
|
+
exit(1) unless system "git tag #{ENV['TO']}"
|
59
|
+
|
60
|
+
puts "Tag '#{ENV['TO']}' generated. Don't forget to push --tags! :)"
|
61
|
+
end
|
62
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
require '<%= File.join(gem_base_path, 'version') %>'
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require_relative '<%= File.join('lib', gem_base_path, 'version') %>'
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = '<%= gem_name %>'
|
5
|
+
s.version = <%= gem_module_name %>::VERSION
|
6
|
+
s.licenses = [<%= gem_licenses.map {|l| "'#{l}'"}.join(', ') %>]
|
7
|
+
s.summary = '<%= gem_summary %>'
|
8
|
+
s.description = '<%= gem_description %>'
|
9
|
+
s.authors = [<%= gem_authors.map {|a| "'#{a}'"}.join(', ') %>]
|
10
|
+
s.email = '<%= gem_email %>'
|
11
|
+
s.files = Dir['lib/**/*.rb']
|
12
|
+
s.homepage = '<%= gem_homepage %>'
|
13
|
+
<%
|
14
|
+
# TODO: if plugins.include? Rakefile
|
15
|
+
%>
|
16
|
+
s.add_development_dependency 'rake', '~>0'
|
17
|
+
end
|
18
|
+
|
data/templates/gitignore
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
<%=
|
2
|
+
space_factor = 2
|
3
|
+
nesting = -1
|
4
|
+
''.tap do |out|
|
5
|
+
gem_module_name.split('::').each do |mod_part|
|
6
|
+
nesting += 1
|
7
|
+
out << ' ' * nesting * space_factor << 'module ' << mod_part << "\n"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
%><%= ' ' * (nesting + 1) * space_factor %>VERSION = '<%= gem_initial_version %>'
|
11
|
+
<%=
|
12
|
+
''.tap do |out|
|
13
|
+
while nesting >= 0
|
14
|
+
out << ' ' * nesting * space_factor << "end"
|
15
|
+
out << "\n" unless nesting == 0
|
16
|
+
nesting -= 1
|
17
|
+
end
|
18
|
+
end
|
19
|
+
%>
|
metadata
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gemmy_rb
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1a
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- jbodah
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-06-18 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Create a lot of gems? Try gemmy_rb!
|
14
|
+
email: jb3689@yahoo.com
|
15
|
+
executables:
|
16
|
+
- gemmy
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- bin/gemmy
|
21
|
+
- lib/gemmy.rb
|
22
|
+
- lib/gemmy/cli.rb
|
23
|
+
- lib/gemmy/config.rb
|
24
|
+
- lib/gemmy/plugin.rb
|
25
|
+
- lib/gemmy/plugin/gemspec_generator.rb
|
26
|
+
- lib/gemmy/plugin/template_generator.rb
|
27
|
+
- lib/gemmy/plugin/test_directory_generator.rb
|
28
|
+
- lib/gemmy/runner.rb
|
29
|
+
- lib/gemmy/template_writer.rb
|
30
|
+
- lib/gemmy/version.rb
|
31
|
+
- templates/Gemfile.erb
|
32
|
+
- templates/README.md.erb
|
33
|
+
- templates/Rakefile.erb
|
34
|
+
- templates/base_module.rb.erb
|
35
|
+
- templates/gemspec.erb
|
36
|
+
- templates/gitignore
|
37
|
+
- templates/test_helper.rb.erb
|
38
|
+
- templates/version.rb.erb
|
39
|
+
homepage: https://github.com/jbodah/gemmy_rb
|
40
|
+
licenses:
|
41
|
+
- MIT
|
42
|
+
metadata: {}
|
43
|
+
post_install_message:
|
44
|
+
rdoc_options: []
|
45
|
+
require_paths:
|
46
|
+
- lib
|
47
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
48
|
+
requirements:
|
49
|
+
- - ">="
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '0'
|
52
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">"
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: 1.3.1
|
57
|
+
requirements: []
|
58
|
+
rubyforge_project:
|
59
|
+
rubygems_version: 2.2.2
|
60
|
+
signing_key:
|
61
|
+
specification_version: 4
|
62
|
+
summary: a gem for generating other gems
|
63
|
+
test_files: []
|