flynn 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +7 -0
- data/.rvmrc +2 -0
- data/Gemfile +4 -0
- data/LICENSE +18 -0
- data/README.md +45 -0
- data/Rakefile +41 -0
- data/bin/flynn +31 -0
- data/flynn.gemspec +28 -0
- data/lib/flynn.rb +15 -0
- data/lib/flynn/config.rb +23 -0
- data/lib/flynn/helpers.rb +29 -0
- data/lib/flynn/recipes.rb +22 -0
- data/lib/flynn/recipes/basic.rb +15 -0
- data/lib/flynn/recipes/gem.rb +12 -0
- data/lib/flynn/recipes/node_web.rb +52 -0
- data/lib/flynn/recipes/rails2.rb +16 -0
- data/lib/flynn/recipes/rails3.rb +17 -0
- data/lib/flynn/recipes/rails_edge.rb +46 -0
- data/lib/flynn/recipes/rvm_base.rb +47 -0
- data/lib/flynn/recipes/sinatra.rb +81 -0
- data/lib/flynn/version.rb +3 -0
- data/spec/flynn/config_spec.rb +27 -0
- data/spec/flynn/helpers_spec.rb +28 -0
- data/spec/flynn/recipes/basic_spec.rb +16 -0
- data/spec/flynn/recipes/gem_spec.rb +28 -0
- data/spec/flynn/recipes/node_web_spec.rb +36 -0
- data/spec/flynn/recipes/rails2_spec.rb +28 -0
- data/spec/flynn/recipes/rails3_spec.rb +28 -0
- data/spec/flynn/recipes/rails_edge_spec.rb +32 -0
- data/spec/flynn/recipes/sinatra_spec.rb +45 -0
- data/spec/flynn/recipes_spec.rb +23 -0
- data/spec/flynn_spec.rb +10 -0
- data/spec/spec_helper.rb +9 -0
- metadata +142 -0
data/.gitignore
ADDED
data/.rvmrc
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
Copyright (c) 2011 Luke Chadwick
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
of this software and associated documentation files (the "Software"), to
|
5
|
+
deal in the Software without restriction, including without limitation the
|
6
|
+
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
7
|
+
sell copies of the Software, and to permit persons to whom the Software is
|
8
|
+
furnished to do so, subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in
|
11
|
+
all copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
16
|
+
THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
17
|
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
18
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
# Flynn
|
2
|
+
|
3
|
+
Flynn is an open source command line tool for easily bootstrapping new projects. It is a lightweight framework designed to meet the following goals: One command to start new projects, easily pluggable (allowing users to write their own *recipes*), simple configuration, and readable and maintainable code.
|
4
|
+
|
5
|
+
The tool currently hooks into RVM heavily for the creation of ruby projects. There should be very few other dependencies. *Recipes* are responsible for installing anything (read: gems) they need.
|
6
|
+
|
7
|
+
## Installation & Your first project
|
8
|
+
|
9
|
+
* Install Ruby 1.9 (via RVM or natively)
|
10
|
+
|
11
|
+
$> gem install rvm
|
12
|
+
$> rvm install <your favorite ruby>
|
13
|
+
$> rvm use --default <your favorite ruby>
|
14
|
+
|
15
|
+
* Install Flynn:
|
16
|
+
|
17
|
+
$> gem install flynn
|
18
|
+
|
19
|
+
* Create a new rails3 project:
|
20
|
+
|
21
|
+
$> flynn rails3 awesomeproject -J -O -m ../templates/heroku_template.rb
|
22
|
+
|
23
|
+
## Writing your own recipe: MySinatra
|
24
|
+
|
25
|
+
$> mate ~/.flynn/recipes/my_sinatra.rb
|
26
|
+
class Flynn::Recipes::MySinatra
|
27
|
+
def create(app_name, options=[])
|
28
|
+
# Do whatever tasks you want
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
Flynn will automatically load any ruby files within this directory.
|
33
|
+
|
34
|
+
##Contributing
|
35
|
+
|
36
|
+
Fork on GitHub, create a test & send a pull request.
|
37
|
+
|
38
|
+
##Bugs
|
39
|
+
|
40
|
+
Use the [Issue Tracker](http://github.com/vertis/flynn/issues)
|
41
|
+
|
42
|
+
## License & Acknowledgments
|
43
|
+
|
44
|
+
Flynn is distributed under the MIT license, for full details please see the LICENSE file.
|
45
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
Bundler::GemHelper.install_tasks
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'cover_me'
|
6
|
+
|
7
|
+
desc "Produce the coverage report"
|
8
|
+
task :coverage do
|
9
|
+
CoverMe.complete!
|
10
|
+
end
|
11
|
+
rescue LoadError
|
12
|
+
$stderr.puts "cover_me gem is not installed"
|
13
|
+
end
|
14
|
+
|
15
|
+
def load_rvm
|
16
|
+
return true if defined?(RVM)
|
17
|
+
puts "Loading RVM"
|
18
|
+
# load in RVM environment
|
19
|
+
if ENV['MY_RUBY_HOME'] && ENV['MY_RUBY_HOME'].include?('rvm')
|
20
|
+
begin
|
21
|
+
rvm_path = File.dirname(File.dirname(ENV['MY_RUBY_HOME']))
|
22
|
+
rvm_lib_path = File.join(rvm_path, 'lib')
|
23
|
+
$LOAD_PATH.unshift rvm_lib_path
|
24
|
+
|
25
|
+
require 'rvm'
|
26
|
+
@ruby_version = ENV['RUBY_VERSION']
|
27
|
+
rescue LoadError
|
28
|
+
# RVM is unavailable at this point.
|
29
|
+
raise "RVM ruby lib is currently unavailable."
|
30
|
+
end
|
31
|
+
else
|
32
|
+
raise "RVM ruby lib is currently unavailable."
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
desc "Install in the global gemset"
|
37
|
+
task :install_global => [:build] do
|
38
|
+
load_rvm
|
39
|
+
RVM.gemset_use! 'global'
|
40
|
+
system("gem install pkg/flynn-#{Flynn::VERSION}.gem")
|
41
|
+
end
|
data/bin/flynn
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
$:.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
|
3
|
+
|
4
|
+
require "rubygems" # ruby1.9 doesn't "require" it though
|
5
|
+
require 'flynn'
|
6
|
+
require 'active_support/inflector'
|
7
|
+
|
8
|
+
def print_usage
|
9
|
+
puts "Usage: flynn <recipe> <app_name> [options]"
|
10
|
+
available_recipes = Flynn::Recipes.available_recipes.map {|recipe| recipe.to_s.underscore }
|
11
|
+
puts ""
|
12
|
+
puts "Available recipes:"
|
13
|
+
available_recipes.each do |recipe|
|
14
|
+
puts " #{recipe}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
recipe = ARGV.shift
|
20
|
+
if recipe == 'help'
|
21
|
+
print_usage
|
22
|
+
exit 0
|
23
|
+
end
|
24
|
+
app_name = ARGV.shift
|
25
|
+
if Flynn::Recipes.const_defined?(recipe.camelize)
|
26
|
+
Flynn::Recipes.const_get(recipe.camelize).new.create(app_name, ARGV)
|
27
|
+
else
|
28
|
+
$stderr.puts "Flynn doesn't know how to create: #{recipe}"
|
29
|
+
puts ""
|
30
|
+
print_usage
|
31
|
+
end
|
data/flynn.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "flynn/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "flynn"
|
7
|
+
s.version = Flynn::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Luke Chadwick"]
|
10
|
+
s.email = ["luke.a.chadwick@gmail.com"]
|
11
|
+
s.homepage = ""
|
12
|
+
s.summary = %q{Flynn helps create ruby projects of different types}
|
13
|
+
s.description = %q{Whenever I start a new ruby project, I usually find myself repeating the same setup steps.
|
14
|
+
Flynn is a tool to help create common project types with sane defaults. }
|
15
|
+
|
16
|
+
s.rubyforge_project = "flynn"
|
17
|
+
|
18
|
+
s.files = `git ls-files`.split("\n")
|
19
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
20
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
21
|
+
s.require_paths = ["lib"]
|
22
|
+
|
23
|
+
s.add_dependency('activesupport')
|
24
|
+
s.add_dependency('i18n')
|
25
|
+
|
26
|
+
s.add_development_dependency('rspec')
|
27
|
+
s.add_development_dependency('cover_me')
|
28
|
+
end
|
data/lib/flynn.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'flynn/helpers'
|
2
|
+
require 'flynn/config'
|
3
|
+
require 'flynn/recipes'
|
4
|
+
|
5
|
+
module Flynn
|
6
|
+
def self.config
|
7
|
+
return @config unless @config.nil?
|
8
|
+
@config = Flynn::Config.new
|
9
|
+
@config.build
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.root
|
13
|
+
@root ="#{File.expand_path('../..',__FILE__)}"
|
14
|
+
end
|
15
|
+
end
|
data/lib/flynn/config.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
|
3
|
+
module Flynn
|
4
|
+
class Config
|
5
|
+
def build
|
6
|
+
recipes_directory.mkpath # will make the .flynn directory as well
|
7
|
+
config_file.open('w').close # is there an easier way
|
8
|
+
self
|
9
|
+
end
|
10
|
+
|
11
|
+
def flynn_directory
|
12
|
+
@flynn_directory ||= Pathname.new("#{ENV["HOME"]}/.flynn")
|
13
|
+
end
|
14
|
+
|
15
|
+
def config_file
|
16
|
+
@config_file ||= flynn_directory + 'config.yml'
|
17
|
+
end
|
18
|
+
|
19
|
+
def recipes_directory
|
20
|
+
@recipes_directory ||= flynn_directory + 'recipes'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Flynn
|
2
|
+
module Helpers
|
3
|
+
def inside(dir)
|
4
|
+
current_dir = Dir.pwd
|
5
|
+
Dir.chdir(dir)
|
6
|
+
yield
|
7
|
+
Dir.chdir(current_dir)
|
8
|
+
end
|
9
|
+
|
10
|
+
def run(cmd)
|
11
|
+
puts "Running: #{cmd}"
|
12
|
+
system(cmd)
|
13
|
+
end
|
14
|
+
|
15
|
+
def create_file(name, content)
|
16
|
+
throw Exception.new("File exists: #{name}") if File.exists?(name)
|
17
|
+
File.open(name, 'w') { |f| f.write content }
|
18
|
+
return true
|
19
|
+
end
|
20
|
+
|
21
|
+
def executable_path(cmd)
|
22
|
+
ENV['PATH'].split(':').each do |folder|
|
23
|
+
path = folder+'/'+cmd
|
24
|
+
return path if File.exists?(path)
|
25
|
+
end
|
26
|
+
nil
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'flynn/recipes/rvm_base'
|
2
|
+
require 'flynn/recipes/basic'
|
3
|
+
require 'flynn/recipes/gem'
|
4
|
+
require 'flynn/recipes/node_web'
|
5
|
+
require 'flynn/recipes/rails2'
|
6
|
+
require 'flynn/recipes/rails3'
|
7
|
+
require 'flynn/recipes/rails_edge'
|
8
|
+
require 'flynn/recipes/sinatra'
|
9
|
+
|
10
|
+
module Flynn
|
11
|
+
module Recipes
|
12
|
+
def self.load_user_recipes
|
13
|
+
Flynn.config.recipes_directory.children.each do |child|
|
14
|
+
require child.expand_path if child.extname=='.rb'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.available_recipes
|
19
|
+
Flynn::Recipes.constants - [:RvmBase]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Flynn
|
2
|
+
module Recipes
|
3
|
+
class Basic < RvmBase
|
4
|
+
def create(app_name, options={})
|
5
|
+
require 'fileutils'
|
6
|
+
puts "Creating #{app_name}"
|
7
|
+
FileUtils.mkdir(app_name)
|
8
|
+
inside app_name do
|
9
|
+
run("bundle init")
|
10
|
+
end
|
11
|
+
create_project_rvmrc(app_name)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'erb'
|
3
|
+
|
4
|
+
module Flynn
|
5
|
+
module Recipes
|
6
|
+
class NodeWeb
|
7
|
+
include Flynn::Helpers
|
8
|
+
|
9
|
+
def create(app_name, options=[])
|
10
|
+
namespace = lambda do
|
11
|
+
@app_name = app_name
|
12
|
+
@app_description = ""
|
13
|
+
|
14
|
+
#TODO: make this pull from your git details if they exist
|
15
|
+
@app_author = "You"
|
16
|
+
@app_author_email = "you@yourdomain.com"
|
17
|
+
end.call
|
18
|
+
|
19
|
+
check_for_node
|
20
|
+
check_for_npm
|
21
|
+
|
22
|
+
run("git clone https://github.com/vertis/flynn-node-template.git #{app_name}")
|
23
|
+
inside app_name do
|
24
|
+
template = ERB.new(File.read('package.json.erb'), nil)
|
25
|
+
create_file('package.json', template.result(namespace.send(:binding)))
|
26
|
+
run('rm package.json.erb')
|
27
|
+
run('git remote rm origin 2>/dev/null >/dev/null') # Borrowed from https://github.com/mwotton/instigator
|
28
|
+
run("npm install")
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
# Warn and exit if node.js isn't installed
|
34
|
+
def check_for_node
|
35
|
+
unless executable_path('node')
|
36
|
+
$stderr.puts "node.js is not installed"
|
37
|
+
throw Exception.new('node.js is not installed')
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def check_for_npm
|
42
|
+
unless executable_path('npm')
|
43
|
+
install_npm
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def install_npm
|
48
|
+
run("curl http://npmjs.org/install.sh | sh")
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
module Flynn
|
4
|
+
module Recipes
|
5
|
+
class Rails2 < RvmBase
|
6
|
+
def create(app_name, options=[])
|
7
|
+
RVM.gemset_create app_name
|
8
|
+
RVM.gemset_use! app_name
|
9
|
+
run("gem install rails -v '~> 2.3' --no-rdoc --no-ri")
|
10
|
+
puts "Creating #{app_name}"
|
11
|
+
run("rvm gemset use #{app_name} && rails #{app_name} #{options.join(" ")}")
|
12
|
+
create_project_rvmrc(app_name)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
module Flynn
|
4
|
+
module Recipes
|
5
|
+
class Rails3 < RvmBase
|
6
|
+
def create(app_name, options=[])
|
7
|
+
RVM.gemset_create app_name
|
8
|
+
RVM.gemset_use! app_name
|
9
|
+
#install_gem 'install', 'rails', '-v', '~> 2.3'
|
10
|
+
run("gem install rails -v '~> 3.0' --no-rdoc --no-ri")
|
11
|
+
puts "Creating #{app_name}"
|
12
|
+
run("rvm gemset use #{app_name} && rails new #{app_name} #{options.join(" ")}")
|
13
|
+
create_project_rvmrc(app_name)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
module Flynn
|
4
|
+
module Recipes
|
5
|
+
class RailsEdge < RvmBase
|
6
|
+
def create(app_name, options=[])
|
7
|
+
#disable_rvmrc
|
8
|
+
rails_base = "#{ENV['HOME']}/.flynn/rails_edge"
|
9
|
+
rails_src = "#{ENV['HOME']}/.flynn/rails_src"
|
10
|
+
RVM.gemset_create app_name
|
11
|
+
RVM.gemset_use! app_name
|
12
|
+
|
13
|
+
FileUtils.mkdir_p rails_base
|
14
|
+
File.open("#{ENV['HOME']}/.flynn/rails_edge/Gemfile", 'w') {|f| f.puts gemfile }
|
15
|
+
if File.directory?(rails_src)
|
16
|
+
inside rails_src do
|
17
|
+
run("git pull")
|
18
|
+
end
|
19
|
+
else
|
20
|
+
run("git clone git://github.com/rails/rails.git #{rails_src}")
|
21
|
+
end
|
22
|
+
bundle_cmd = "bundle install --gemfile #{rails_base}/Gemfile --binstubs"
|
23
|
+
puts "Creating '#{app_name}' running edge rails (this could take a while)"
|
24
|
+
run("rvm gemset use #{app_name} && #{bundle_cmd}")
|
25
|
+
run("rvm gemset use #{app_name} && #{rails_base}/bin/rails new #{app_name} --dev #{options.join(" ")}")
|
26
|
+
create_project_rvmrc(app_name)
|
27
|
+
# TODO: There must be a better way than having to call this a second time
|
28
|
+
inside app_name do
|
29
|
+
run "bundle install"
|
30
|
+
end
|
31
|
+
#restore_rvmrc
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
def gemfile
|
36
|
+
@gemfile ||= <<-EOS
|
37
|
+
# A sinatra gemfile
|
38
|
+
source "http://rubygems.org"
|
39
|
+
|
40
|
+
gem 'rake', '>= 0.9.0'
|
41
|
+
gem 'rails', :git => "#{ENV['HOME']}/.flynn/rails_src"
|
42
|
+
EOS
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Flynn
|
2
|
+
module Recipes
|
3
|
+
class RvmBase
|
4
|
+
include Flynn::Helpers
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
load_rvm
|
8
|
+
end
|
9
|
+
|
10
|
+
protected
|
11
|
+
|
12
|
+
def create_project_rvmrc(app_name)
|
13
|
+
rvmrc = <<-RVMRC
|
14
|
+
rvm_gemset_create_on_use_flag=1
|
15
|
+
rvm use #{@ruby_version}@#{app_name}
|
16
|
+
RVMRC
|
17
|
+
File.open("#{app_name}/.rvmrc", 'w') {|f| f.write(rvmrc) }
|
18
|
+
inside app_name do
|
19
|
+
run("rvm rvmrc trust")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def load_rvm
|
26
|
+
return true if defined?(RVM)
|
27
|
+
puts "Loading RVM"
|
28
|
+
# load in RVM environment
|
29
|
+
if ENV['MY_RUBY_HOME'] && ENV['MY_RUBY_HOME'].include?('rvm')
|
30
|
+
begin
|
31
|
+
rvm_path = File.dirname(File.dirname(ENV['MY_RUBY_HOME']))
|
32
|
+
rvm_lib_path = File.join(rvm_path, 'lib')
|
33
|
+
$LOAD_PATH.unshift rvm_lib_path
|
34
|
+
|
35
|
+
require 'rvm'
|
36
|
+
@ruby_version = ENV['RUBY_VERSION']
|
37
|
+
rescue LoadError
|
38
|
+
# RVM is unavailable at this point.
|
39
|
+
raise "RVM ruby lib is currently unavailable."
|
40
|
+
end
|
41
|
+
else
|
42
|
+
raise "RVM ruby lib is currently unavailable."
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
module Flynn
|
4
|
+
module Recipes
|
5
|
+
class Sinatra < RvmBase
|
6
|
+
def create(app_name, options=[])
|
7
|
+
@app_name = app_name
|
8
|
+
RVM.gemset_create app_name
|
9
|
+
RVM.gemset_use! app_name
|
10
|
+
puts "Creating #{app_name}"
|
11
|
+
FileUtils.mkdir(app_name)
|
12
|
+
create_gemfile
|
13
|
+
create_config_ru
|
14
|
+
create_app_rb
|
15
|
+
create_standard_directories
|
16
|
+
create_project_rvmrc(app_name)
|
17
|
+
|
18
|
+
inside(@app_name) do
|
19
|
+
run("bundle install")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
def create_gemfile
|
25
|
+
inside(@app_name) do
|
26
|
+
File.open("Gemfile", 'w') {|f| f.write(gemfile) }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def create_config_ru
|
31
|
+
inside(@app_name) do
|
32
|
+
File.open("config.ru", 'w') {|f| f.write(config_ru) }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def create_app_rb
|
37
|
+
inside(@app_name) do
|
38
|
+
File.open("app.rb", 'w') {|f| f.write(app_rb) }
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def create_standard_directories
|
43
|
+
inside(@app_name) do
|
44
|
+
FileUtils.mkdir_p('views')
|
45
|
+
FileUtils.mkdir_p('public')
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def config_ru
|
50
|
+
@config_ru ||= <<-EOS
|
51
|
+
require "./app" # ruby1.9 compatible
|
52
|
+
|
53
|
+
run Sinatra::Application
|
54
|
+
EOS
|
55
|
+
end
|
56
|
+
|
57
|
+
def app_rb
|
58
|
+
@app_rb ||= <<-EOS
|
59
|
+
require 'rubygems'
|
60
|
+
require 'bundler/setup'
|
61
|
+
require 'sinatra'
|
62
|
+
|
63
|
+
get '/' do
|
64
|
+
"Generated by Flynn"
|
65
|
+
end
|
66
|
+
EOS
|
67
|
+
end
|
68
|
+
|
69
|
+
def gemfile
|
70
|
+
@gemfile ||= <<-EOS
|
71
|
+
# A sinatra gemfile
|
72
|
+
source "http://rubygems.org"
|
73
|
+
|
74
|
+
gem 'sinatra'
|
75
|
+
gem 'haml'
|
76
|
+
gem 'sass'
|
77
|
+
EOS
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'pathname'
|
3
|
+
|
4
|
+
describe Flynn::Config do
|
5
|
+
context "#build" do
|
6
|
+
before :all do
|
7
|
+
@flynn_directory = Pathname.new("#{ENV["HOME"]}/.flynn")
|
8
|
+
@recipes_directory = @flynn_directory + 'recipes'
|
9
|
+
@config_file = @flynn_directory + 'config.yml'
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should create the .flynn directory if it doesn't exist" do
|
13
|
+
Flynn::Config.new.build
|
14
|
+
@flynn_directory.exist?.should == true
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should create the .flynn/recipes directory if it doesn't exist" do
|
18
|
+
Flynn::Config.new.build
|
19
|
+
@recipes_directory.exist?.should == true
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should create the .flynn/config.yml file if it doesn't exist" do
|
23
|
+
Flynn::Config.new.build
|
24
|
+
@config_file.exist?.should == true
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Flynn::Helpers do
|
4
|
+
before(:all) do
|
5
|
+
class Subject
|
6
|
+
include Flynn::Helpers
|
7
|
+
end
|
8
|
+
end
|
9
|
+
subject { Subject.new }
|
10
|
+
|
11
|
+
context "#inside" do
|
12
|
+
it "I should be inside the directory specified while within the block" do
|
13
|
+
subject.inside 'tmp' do
|
14
|
+
Dir.pwd.should =~ /tmp$/
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context "#executable_path" do
|
20
|
+
it "should return the path to the executable if it exists within $PATH" do
|
21
|
+
subject.executable_path('bash').should =~ /bash$/
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should return nil if the executable doesn't exist within $PATH" do
|
25
|
+
subject.executable_path('fake').should be_nil
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
describe Flynn::Recipes::Basic do
|
5
|
+
it "should have a create method" do
|
6
|
+
subject.should respond_to(:create)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should create a new basic project with the correct name" do
|
10
|
+
Dir.chdir('tmp')
|
11
|
+
subject.create('my_directory')
|
12
|
+
File.exists?('my_directory').should be_true
|
13
|
+
FileUtils.rm_r('my_directory')
|
14
|
+
Dir.chdir('..')
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
describe Flynn::Recipes::Gem do
|
5
|
+
it "should have a create method" do
|
6
|
+
subject.should respond_to(:create)
|
7
|
+
end
|
8
|
+
|
9
|
+
context "creating a gem project" do
|
10
|
+
before(:all) do
|
11
|
+
Dir.chdir('tmp')
|
12
|
+
subject.create('my_gem')
|
13
|
+
end
|
14
|
+
|
15
|
+
after(:all) do
|
16
|
+
FileUtils.rm_r('my_gem')
|
17
|
+
Dir.chdir('..')
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should create a new gem project with the correct name" do
|
21
|
+
File.exists?('my_gem').should be_true
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should create an .rvmrc for the new application" do
|
25
|
+
File.exists?('my_gem/.rvmrc').should be_true
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Flynn::Recipes::NodeWeb do
|
4
|
+
it "should have a create method" do
|
5
|
+
subject.should respond_to(:create)
|
6
|
+
end
|
7
|
+
|
8
|
+
context "creating a node web project" do
|
9
|
+
before(:all) do
|
10
|
+
Dir.chdir('tmp')
|
11
|
+
subject.create('my_node')
|
12
|
+
end
|
13
|
+
|
14
|
+
after(:all) do
|
15
|
+
FileUtils.rm_r('my_node')
|
16
|
+
Dir.chdir('..')
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should create a new node project with the correct name" do
|
20
|
+
File.exists?('my_node').should be_true
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should create an package.json for the new application" do
|
24
|
+
File.exists?('my_node/package.json').should be_true
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should create an app.js file for the new application" do
|
28
|
+
File.exists?('my_node/app.js').should be_true
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should have the standard directories" do
|
32
|
+
File.directory?('my_node/public').should be_true
|
33
|
+
File.directory?('my_node/views').should be_true
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
describe Flynn::Recipes::Rails2 do
|
5
|
+
it "should have a create method" do
|
6
|
+
subject.should respond_to(:create)
|
7
|
+
end
|
8
|
+
|
9
|
+
context "creating a rails2 project" do
|
10
|
+
before(:all) do
|
11
|
+
Dir.chdir('tmp')
|
12
|
+
subject.create('my_rails2')
|
13
|
+
end
|
14
|
+
|
15
|
+
after(:all) do
|
16
|
+
FileUtils.rm_r('my_rails2')
|
17
|
+
Dir.chdir('..')
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should create a new rails2 project with the correct name" do
|
21
|
+
File.exists?('my_rails2').should be_true
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should create an .rvmrc for the new application" do
|
25
|
+
File.exists?('my_rails2/.rvmrc').should be_true
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
describe Flynn::Recipes::Rails3 do
|
5
|
+
it "should have a create method" do
|
6
|
+
subject.should respond_to(:create)
|
7
|
+
end
|
8
|
+
|
9
|
+
context "creating a rails3 project" do
|
10
|
+
before(:all) do
|
11
|
+
Dir.chdir('tmp')
|
12
|
+
subject.create('my_rails3')
|
13
|
+
end
|
14
|
+
|
15
|
+
after(:all) do
|
16
|
+
FileUtils.rm_r('my_rails3')
|
17
|
+
Dir.chdir('..')
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should create a new rails3 project with the correct name" do
|
21
|
+
File.exists?('my_rails3').should be_true
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should create an .rvmrc for the new application" do
|
25
|
+
File.exists?('my_rails3/.rvmrc').should be_true
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
describe Flynn::Recipes::RailsEdge do
|
5
|
+
it "should have a create method" do
|
6
|
+
subject.should respond_to(:create)
|
7
|
+
end
|
8
|
+
|
9
|
+
context "creating a rails edge project" do
|
10
|
+
before(:all) do
|
11
|
+
Dir.chdir('tmp')
|
12
|
+
subject.create('my_edge')
|
13
|
+
end
|
14
|
+
|
15
|
+
after(:all) do
|
16
|
+
FileUtils.rm_r('my_edge')
|
17
|
+
Dir.chdir('..')
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should put down a gemfile to use with bundling" do
|
21
|
+
File.exists?("#{ENV['HOME']}/.flynn/rails_edge/gemfile").should be_true
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should create a new rails edge project with the correct name" do
|
25
|
+
File.exists?('my_edge').should be_true
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should create an .rvmrc for the new application" do
|
29
|
+
File.exists?('my_edge/.rvmrc').should be_true
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
describe Flynn::Recipes::Sinatra do
|
5
|
+
it "should have a create method" do
|
6
|
+
subject.should respond_to(:create)
|
7
|
+
end
|
8
|
+
|
9
|
+
context "creating a sinatra project" do
|
10
|
+
before(:all) do
|
11
|
+
Dir.chdir('tmp')
|
12
|
+
subject.create('my_sinatra')
|
13
|
+
end
|
14
|
+
|
15
|
+
after(:all) do
|
16
|
+
FileUtils.rm_r('my_sinatra')
|
17
|
+
Dir.chdir('..')
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should create a new sinatra project with the correct name" do
|
21
|
+
File.exists?('my_sinatra').should be_true
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should create an .rvmrc for the new application" do
|
25
|
+
File.exists?('my_sinatra/.rvmrc').should be_true
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should create an Gemfile for the new application" do
|
29
|
+
File.exists?('my_sinatra/Gemfile').should be_true
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should create a config.ru for the new application" do
|
33
|
+
File.exists?('my_sinatra/config.ru').should be_true
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should create an app.rb file for the new application" do
|
37
|
+
File.exists?('my_sinatra/app.rb').should be_true
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should have the standard directories" do
|
41
|
+
File.directory?('my_sinatra/public').should be_true
|
42
|
+
File.directory?('my_sinatra/views').should be_true
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Flynn::Recipes do
|
4
|
+
before :all do
|
5
|
+
recipe = """
|
6
|
+
class Flynn::Recipes::Test
|
7
|
+
def create
|
8
|
+
end
|
9
|
+
end
|
10
|
+
"""
|
11
|
+
@test_recipe = Flynn.config.recipes_directory + 'test.rb'
|
12
|
+
File.open(@test_recipe, 'w') {|f| f.puts recipe}
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should load all the recipes in the user recipe paths" do
|
16
|
+
Flynn::Recipes.load_user_recipes
|
17
|
+
lambda { Flynn::Recipes::Test.new }.should_not raise_error
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should return a list of all defined recipes" do
|
21
|
+
Flynn::Recipes.available_recipes.should == [:Gem, :Basic, :Rails2, :Rails3, :RailsEdge, :Sinatra, :Test]
|
22
|
+
end
|
23
|
+
end
|
data/spec/flynn_spec.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Flynn do
|
4
|
+
[:Basic, :Gem, :Rails2, :Rails3].each do |recipe|
|
5
|
+
it "should instantiate the #{recipe} recipe with no arguments" do
|
6
|
+
lambda { Flynn::Recipes.const_get(recipe).new }.should_not raise_error
|
7
|
+
lambda { Flynn::Recipes.const_get(recipe).new( "hiss" ) }.should raise_error
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,142 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: flynn
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 0.0.8
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Luke Chadwick
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2011-06-04 00:00:00 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: activesupport
|
17
|
+
prerelease: false
|
18
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
19
|
+
none: false
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
type: :runtime
|
25
|
+
version_requirements: *id001
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: i18n
|
28
|
+
prerelease: false
|
29
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
30
|
+
none: false
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: "0"
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id002
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: rspec
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: "0"
|
46
|
+
type: :development
|
47
|
+
version_requirements: *id003
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: cover_me
|
50
|
+
prerelease: false
|
51
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: "0"
|
57
|
+
type: :development
|
58
|
+
version_requirements: *id004
|
59
|
+
description: "Whenever I start a new ruby project, I usually find myself repeating the same setup steps.\n\
|
60
|
+
Flynn is a tool to help create common project types with sane defaults. "
|
61
|
+
email:
|
62
|
+
- luke.a.chadwick@gmail.com
|
63
|
+
executables:
|
64
|
+
- flynn
|
65
|
+
extensions: []
|
66
|
+
|
67
|
+
extra_rdoc_files: []
|
68
|
+
|
69
|
+
files:
|
70
|
+
- .gitignore
|
71
|
+
- .rvmrc
|
72
|
+
- Gemfile
|
73
|
+
- LICENSE
|
74
|
+
- README.md
|
75
|
+
- Rakefile
|
76
|
+
- bin/flynn
|
77
|
+
- flynn.gemspec
|
78
|
+
- lib/flynn.rb
|
79
|
+
- lib/flynn/config.rb
|
80
|
+
- lib/flynn/helpers.rb
|
81
|
+
- lib/flynn/recipes.rb
|
82
|
+
- lib/flynn/recipes/basic.rb
|
83
|
+
- lib/flynn/recipes/gem.rb
|
84
|
+
- lib/flynn/recipes/node_web.rb
|
85
|
+
- lib/flynn/recipes/rails2.rb
|
86
|
+
- lib/flynn/recipes/rails3.rb
|
87
|
+
- lib/flynn/recipes/rails_edge.rb
|
88
|
+
- lib/flynn/recipes/rvm_base.rb
|
89
|
+
- lib/flynn/recipes/sinatra.rb
|
90
|
+
- lib/flynn/version.rb
|
91
|
+
- spec/flynn/config_spec.rb
|
92
|
+
- spec/flynn/helpers_spec.rb
|
93
|
+
- spec/flynn/recipes/basic_spec.rb
|
94
|
+
- spec/flynn/recipes/gem_spec.rb
|
95
|
+
- spec/flynn/recipes/node_web_spec.rb
|
96
|
+
- spec/flynn/recipes/rails2_spec.rb
|
97
|
+
- spec/flynn/recipes/rails3_spec.rb
|
98
|
+
- spec/flynn/recipes/rails_edge_spec.rb
|
99
|
+
- spec/flynn/recipes/sinatra_spec.rb
|
100
|
+
- spec/flynn/recipes_spec.rb
|
101
|
+
- spec/flynn_spec.rb
|
102
|
+
- spec/spec_helper.rb
|
103
|
+
homepage: ""
|
104
|
+
licenses: []
|
105
|
+
|
106
|
+
post_install_message:
|
107
|
+
rdoc_options: []
|
108
|
+
|
109
|
+
require_paths:
|
110
|
+
- lib
|
111
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
112
|
+
none: false
|
113
|
+
requirements:
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: "0"
|
117
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
118
|
+
none: false
|
119
|
+
requirements:
|
120
|
+
- - ">="
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: "0"
|
123
|
+
requirements: []
|
124
|
+
|
125
|
+
rubyforge_project: flynn
|
126
|
+
rubygems_version: 1.7.2
|
127
|
+
signing_key:
|
128
|
+
specification_version: 3
|
129
|
+
summary: Flynn helps create ruby projects of different types
|
130
|
+
test_files:
|
131
|
+
- spec/flynn/config_spec.rb
|
132
|
+
- spec/flynn/helpers_spec.rb
|
133
|
+
- spec/flynn/recipes/basic_spec.rb
|
134
|
+
- spec/flynn/recipes/gem_spec.rb
|
135
|
+
- spec/flynn/recipes/node_web_spec.rb
|
136
|
+
- spec/flynn/recipes/rails2_spec.rb
|
137
|
+
- spec/flynn/recipes/rails3_spec.rb
|
138
|
+
- spec/flynn/recipes/rails_edge_spec.rb
|
139
|
+
- spec/flynn/recipes/sinatra_spec.rb
|
140
|
+
- spec/flynn/recipes_spec.rb
|
141
|
+
- spec/flynn_spec.rb
|
142
|
+
- spec/spec_helper.rb
|