flynn 0.0.8
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.
- 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
|