singem 0.0.2
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/LICENSE +20 -0
- data/README.md +36 -0
- data/Rakefile +63 -0
- data/TODO +1 -0
- data/bin/singem +26 -0
- data/lib/generators/cucumber/USAGE +5 -0
- data/lib/generators/cucumber/cucumber_generator.rb +82 -0
- data/lib/generators/cucumber/templates/LICENSE +20 -0
- data/lib/generators/cucumber/templates/README.md +4 -0
- data/lib/generators/cucumber/templates/Rakefile +73 -0
- data/lib/generators/cucumber/templates/TODO +4 -0
- data/lib/generators/cucumber/templates/config.ru.erb +11 -0
- data/lib/generators/cucumber/templates/features/basics.feature.erb +6 -0
- data/lib/generators/cucumber/templates/features/step_definitions/basics.rb.erb +8 -0
- data/lib/generators/cucumber/templates/features/support/env.rb.erb +32 -0
- data/lib/generators/cucumber/templates/lib/templates.rb.erb +9 -0
- data/lib/generators/cucumber/templates/lib/templates/app.rb.erb +7 -0
- data/lib/generators/cucumber/templates/spec/fixtures.rb.erb +0 -0
- data/lib/generators/cucumber/templates/spec/spec_helper.rb.erb +40 -0
- data/lib/generators/cucumber/templates/spec/templates_spec.rb.erb +8 -0
- data/lib/generators/singem/USAGE +5 -0
- data/lib/generators/singem/singem_generator.rb +77 -0
- data/lib/generators/singem/templates/LICENSE +20 -0
- data/lib/generators/singem/templates/README.md +4 -0
- data/lib/generators/singem/templates/Rakefile +66 -0
- data/lib/generators/singem/templates/TODO +4 -0
- data/lib/generators/singem/templates/config.ru.erb +11 -0
- data/lib/generators/singem/templates/lib/templates.rb.erb +9 -0
- data/lib/generators/singem/templates/lib/templates/app.rb.erb +7 -0
- data/lib/generators/singem/templates/spec/fixtures.rb.erb +0 -0
- data/lib/generators/singem/templates/spec/spec_helper.rb.erb +40 -0
- data/lib/generators/singem/templates/spec/templates_spec.rb.erb +8 -0
- data/lib/generators/twitter/USAGE +5 -0
- data/lib/generators/twitter/templates/LICENSE +20 -0
- data/lib/generators/twitter/templates/README.md +4 -0
- data/lib/generators/twitter/templates/Rakefile +66 -0
- data/lib/generators/twitter/templates/TODO +4 -0
- data/lib/generators/twitter/templates/config.ru.erb +14 -0
- data/lib/generators/twitter/templates/lib/templates.rb.erb +58 -0
- data/lib/generators/twitter/templates/lib/templates/models/user.rb.erb +38 -0
- data/lib/generators/twitter/templates/lib/templates/sinatra/app.rb.erb +66 -0
- data/lib/generators/twitter/templates/lib/templates/views/about.haml +5 -0
- data/lib/generators/twitter/templates/lib/templates/views/failed.haml +4 -0
- data/lib/generators/twitter/templates/lib/templates/views/home.haml +1 -0
- data/lib/generators/twitter/templates/spec/fixtures.rb.erb +0 -0
- data/lib/generators/twitter/templates/spec/spec_helper.rb.erb +75 -0
- data/lib/generators/twitter/templates/spec/templates_spec.rb.erb +59 -0
- data/lib/generators/twitter/twitter_generator.rb +81 -0
- data/lib/singen.rb +0 -0
- data/spec/singem_spec.rb +7 -0
- data/spec/spec_helper.rb +2 -0
- metadata +184 -0
@@ -0,0 +1,38 @@
|
|
1
|
+
module <%= name.camelize %>
|
2
|
+
class User
|
3
|
+
include DataMapper::Resource
|
4
|
+
class UserCreationError < StandardError; end
|
5
|
+
storage_names[:default] = '<%= name.camelize %>_users'
|
6
|
+
|
7
|
+
property :id, Serial
|
8
|
+
property :twitter_id, Integer, :nullable => false, :unique => true
|
9
|
+
property :name, String
|
10
|
+
property :token, String
|
11
|
+
property :secret, String
|
12
|
+
|
13
|
+
property :url, String, :length => 512
|
14
|
+
property :avatar, String, :length => 512, :default => 'http://static.twitter.com/images/default_profile_normal.png'
|
15
|
+
|
16
|
+
timestamps :at
|
17
|
+
|
18
|
+
def access_token
|
19
|
+
::OAuth::AccessToken.new(::<%= name.camelize %>::OAuth.consumer, token, secret)
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.create_twitter_user(twitter_id)
|
23
|
+
content = Curl::Easy.perform("http://twitter.com/users/show/#{twitter_id}.json") do |curl|
|
24
|
+
curl.timeout = 30
|
25
|
+
end
|
26
|
+
user_info = JSON.parse(content.body_str)
|
27
|
+
raise UserCreationError.new("Unable to find '#{twitter_id}'") if(user_info['error'] == 'Not found')
|
28
|
+
result = unless user_info['error']
|
29
|
+
self.first_or_create({:twitter_id => user_info['id']},{
|
30
|
+
:name => user_info['name'],
|
31
|
+
:avatar => user_info['profile_image_url'],
|
32
|
+
:url => 'http://twitter.com/'+user_info['screen_name']})
|
33
|
+
end
|
34
|
+
rescue JSON::ParserError
|
35
|
+
raise UserCreationError.new("Unable to find '#{twitter_id}'")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module <%= name.camelize %>
|
2
|
+
class App < Sinatra::Default
|
3
|
+
set :views, File.expand_path(File.dirname(__FILE__)+'/../views')
|
4
|
+
enable :sessions
|
5
|
+
enable :methodoverride
|
6
|
+
|
7
|
+
helpers do
|
8
|
+
def oauth_consumer
|
9
|
+
::<%= name.camelize %>::OAuth.consumer
|
10
|
+
end
|
11
|
+
|
12
|
+
def current_user
|
13
|
+
session[:user_id].nil? ? nil : ::<%= name.camelize %>::User.get(session[:user_id])
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
error do
|
18
|
+
<%= name.camelize %>::Log.logger.info env['sinatra.error'].message
|
19
|
+
<%= name.camelize %>::Log.logger.info env['sinatra.error'].backtrace.join("\n")
|
20
|
+
haml :failed
|
21
|
+
end
|
22
|
+
|
23
|
+
get '/' do
|
24
|
+
haml current_user.nil? ? :about : :home
|
25
|
+
end
|
26
|
+
|
27
|
+
get '/authenticate' do
|
28
|
+
::<%= name.camelize %>.retryable(:times => 2) do
|
29
|
+
request_token = oauth_consumer.get_request_token
|
30
|
+
session[:request_token] = request_token.token
|
31
|
+
session[:request_token_secret] = request_token.secret
|
32
|
+
redirect request_token.authorize_url
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
get '/peace' do
|
37
|
+
session.clear
|
38
|
+
redirect '/'
|
39
|
+
end
|
40
|
+
|
41
|
+
get '/callback' do
|
42
|
+
@request_token = ::OAuth::RequestToken.new(oauth_consumer,
|
43
|
+
session[:request_token],
|
44
|
+
session[:request_token_secret])
|
45
|
+
|
46
|
+
access_token = @request_token.get_access_token
|
47
|
+
|
48
|
+
oauth_response = oauth_consumer.request(:get, '/account/verify_credentials.json',
|
49
|
+
access_token, { :scheme => :query_string })
|
50
|
+
case oauth_response
|
51
|
+
when Net::HTTPSuccess
|
52
|
+
user_info = JSON.parse(oauth_response.body)
|
53
|
+
user = ::<%= name.camelize %>::User.first_or_create(:twitter_id => user_info['id']) # really wish first_or_create behaved sanely
|
54
|
+
user.name, user.avatar = user_info['name'], user_info['profile_image_url']
|
55
|
+
user.token, user.secret = access_token.token, access_token.secret
|
56
|
+
user.url = 'http://twitter.com/'+user_info['screen_name']
|
57
|
+
user.save
|
58
|
+
|
59
|
+
session[:user_id] = user.id
|
60
|
+
redirect '/'
|
61
|
+
else
|
62
|
+
raise ArgumentError.new('Unhandled HTTP Response')
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
%h2 Hello There, you little twitterer!
|
File without changes
|
@@ -0,0 +1,75 @@
|
|
1
|
+
$TESTING=true
|
2
|
+
$:.push File.join(File.dirname(__FILE__), '..', 'lib')
|
3
|
+
require 'rubygems'
|
4
|
+
require 'randexp'
|
5
|
+
require '<%= name %>'
|
6
|
+
require 'dm-core'
|
7
|
+
require 'rack/test'
|
8
|
+
require 'webrat'
|
9
|
+
require 'dm-sweatshop'
|
10
|
+
require 'fakeweb'
|
11
|
+
require 'pp'
|
12
|
+
|
13
|
+
FakeWeb.allow_net_connect = false
|
14
|
+
ENV['<%= name.upcase %>_READKEY'] = /\w{18}/.gen
|
15
|
+
ENV['<%= name.upcase %>_READSECRET'] = /\w{18}/.gen
|
16
|
+
|
17
|
+
require File.dirname(__FILE__)+'/fixtures'
|
18
|
+
|
19
|
+
DataMapper.setup(:default, 'sqlite3::memory:')
|
20
|
+
|
21
|
+
class Net::HTTPResponse
|
22
|
+
def body=(content)
|
23
|
+
@body = content
|
24
|
+
@read = true
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
Spec::Runner.configure do |config|
|
29
|
+
config.include(Rack::Test::Methods)
|
30
|
+
config.include(Webrat::Methods)
|
31
|
+
config.include(Webrat::Matchers)
|
32
|
+
|
33
|
+
config.before(:each) do
|
34
|
+
::<%= name.camelize %>::App.environment = :development
|
35
|
+
DataMapper.auto_migrate!
|
36
|
+
FakeWeb.clean_registry
|
37
|
+
FakeWeb.register_uri(:post, "http://twitter.com:80/oauth/request_token",
|
38
|
+
[{:string => "oauth_token=requestkey&oauth_token_secret=requestsecret", :status => ["200", "OK"]},
|
39
|
+
{:string => "", :status => ["401", "Unauthorized"]},
|
40
|
+
{:string => "", :status => ["403", "Forbidden"]},
|
41
|
+
{:string => "Bad Gateway", :status => ["502", "Bad Gateway"]} ])
|
42
|
+
end
|
43
|
+
|
44
|
+
def app
|
45
|
+
@app = Rack::Builder.new do
|
46
|
+
run <%= name.camelize %>::App
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def login_quentin
|
51
|
+
response = Net::HTTPSuccess.new('1.0', 200, nil)
|
52
|
+
response.body = "{\"description\":\"lulz\",\"profile_background_image_url\":\"http:\\/\\/static.twitter.com\\/images\\/themes\\/theme3\\/bg.gif\",\"utc_offset\":-25200,\"friends_count\":157,\"profile_background_color\":\"EDECE9\",\"profile_text_color\":\"634047\",\"url\":\"http:\\/\\/example.org\",\"name\":\"Quentin Blake\",\"favourites_count\":6,\"profile_link_color\":\"088253\",\"protected\":false,\"status\":{\"truncated\":false,\"in_reply_to_status_id\":null,\"text\":\"stu stu studio\",\"in_reply_to_user_id\":null,\"favorited\":false,\"created_at\":\"Tue Mar 31 19:02:12 +0000 2009\",\"id\":1426242614,\"source\":\"<a href=\\\"http:\\/\\/iconfactory.com\\/software\\/twitterrific\\\">twitterrific<\\/a>\"},\"created_at\":\"Sun Mar 18 20:07:13 +0000 2007\",\"statuses_count\":2560,\"profile_background_tile\":false,\"time_zone\":\"Mountain Time (US & Canada)\",\"profile_sidebar_fill_color\":\"E3E2DE\",\"profile_image_url\":\"http:\\/\\/static.twitter.com\\/images\\/default_profile_normal.png\",\"notifications\":false,\"profile_sidebar_border_color\":\"D3D2CF\",\"location\":\"Boulder, Colorado\",\"id\":1484261,\"following\":false,\"followers_count\":368,\"screen_name\":\"caboose\"}"
|
53
|
+
login(response)
|
54
|
+
last_response.headers['Location'].should eql('/')
|
55
|
+
end
|
56
|
+
|
57
|
+
def unauthorized_quentin
|
58
|
+
response = Net::HTTPUnauthorized.new('1.0', 401, nil)
|
59
|
+
response.body = "Unauthorized"
|
60
|
+
lambda { login(response) }.should raise_error(ArgumentError)
|
61
|
+
end
|
62
|
+
|
63
|
+
def login(response)
|
64
|
+
token = 'oU5W1XD2TTZhWT6Snfii9JbVBUkJOurCKhWQHz98765'
|
65
|
+
|
66
|
+
consumer = mock('Consumer', {:request => response})
|
67
|
+
request_token = mock('RequestToken', {:get_access_token => mock('AccessToken', {:token => 'foo', :secret => 'bar'})})
|
68
|
+
|
69
|
+
OAuth::Consumer.stub!(:new).and_return(consumer)
|
70
|
+
OAuth::RequestToken.stub!(:new).and_return(request_token)
|
71
|
+
|
72
|
+
get '/callback', :oauth_token => token
|
73
|
+
last_response
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe "visiting /" do
|
4
|
+
describe "when unauthenticated" do
|
5
|
+
it "should display the about page" do
|
6
|
+
get '/'
|
7
|
+
last_response.should have_selector("h2:contains('Do you use twitter?')")
|
8
|
+
end
|
9
|
+
end
|
10
|
+
describe "when unauthorized" do
|
11
|
+
it "should raise an error" do
|
12
|
+
lambda { unauthorized_quentin }.should raise_error
|
13
|
+
end
|
14
|
+
end
|
15
|
+
describe "when authenticated" do
|
16
|
+
it "should display a greeting" do
|
17
|
+
login_quentin
|
18
|
+
get '/'
|
19
|
+
last_response.should have_selector("h2:contains('Hello There, you little twitterer!')")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "visiting /peace" do
|
25
|
+
describe "when authenticated" do
|
26
|
+
it "should clear the session and redirect to the home page" do
|
27
|
+
login_quentin
|
28
|
+
get '/peace'
|
29
|
+
last_response.headers['Location'].should eql('/')
|
30
|
+
|
31
|
+
get last_response.headers['Location']
|
32
|
+
last_response.should have_selector("h2:contains('Do you use twitter?')")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "triggering a 404" do
|
38
|
+
it "should display the failed page" do
|
39
|
+
pending
|
40
|
+
get '/lost'
|
41
|
+
last_response.should have_selector("p:contains('Something went wonky.')")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "visiting /authenticate" do
|
46
|
+
it "should redirect to twitter for authentication" do
|
47
|
+
get '/authenticate'
|
48
|
+
last_response.headers['Location'].should eql('http://twitter.com/oauth/authorize?oauth_token=requestkey')
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "<%= name.camelize %>::User" do
|
53
|
+
it "can create users from twitter ids that exist" do
|
54
|
+
lambda { <%= name.camelize %>::User.create_twitter_user('atmos') }.should_not raise_error
|
55
|
+
end
|
56
|
+
it "can't create users from twitter ids that do not exist" do
|
57
|
+
lambda { <%= name.camelize %>::User.create_twitter_user(/\w{18}/.gen) }.should raise_error(<%= name.camelize %>::User::UserCreationError)
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
class TwitterGenerator < RubiGen::Base
|
2
|
+
DEFAULT_SHEBANG = File.join(Config::CONFIG['bindir'],
|
3
|
+
Config::CONFIG['ruby_install_name'])
|
4
|
+
|
5
|
+
default_options :author => nil
|
6
|
+
attr_reader :name
|
7
|
+
|
8
|
+
def initialize(runtime_args, runtime_options = {})
|
9
|
+
super
|
10
|
+
usage if args.empty?
|
11
|
+
@destination_root = File.expand_path(args.shift)
|
12
|
+
@name = base_name
|
13
|
+
extract_options
|
14
|
+
end
|
15
|
+
|
16
|
+
def manifest
|
17
|
+
record do |m|
|
18
|
+
# Ensure appropriate folder(s) exists
|
19
|
+
m.directory ''
|
20
|
+
BASEDIRS.each { |path| m.directory path }
|
21
|
+
m.directory "lib/#{name}"
|
22
|
+
m.directory "lib/#{name}/sinatra"
|
23
|
+
m.directory "lib/#{name}/models"
|
24
|
+
m.directory "lib/#{name}/views"
|
25
|
+
|
26
|
+
# Create stubs
|
27
|
+
m.template "config.ru.erb", "config.ru.example"
|
28
|
+
m.template "lib/templates.rb.erb", "lib/#{name}.rb"
|
29
|
+
m.template "lib/templates/sinatra/app.rb.erb", "lib/#{name}/sinatra/app.rb"
|
30
|
+
m.template "lib/templates/models/user.rb.erb", "lib/#{name}/models/user.rb"
|
31
|
+
|
32
|
+
m.template "spec/spec_helper.rb.erb", "spec/spec_helper.rb"
|
33
|
+
m.template "spec/templates_spec.rb.erb", "spec/#{name}_spec.rb"
|
34
|
+
m.template "spec/fixtures.rb.erb", "spec/fixtures.rb"
|
35
|
+
|
36
|
+
%w(LICENSE Rakefile README.md).each do |file|
|
37
|
+
m.template file, file
|
38
|
+
end
|
39
|
+
%w(TODO).each do |file|
|
40
|
+
m.file file, file
|
41
|
+
end
|
42
|
+
%w(about failed home).each do |file|
|
43
|
+
m.file "lib/templates/views/#{file}.haml", "lib/#{name}/views/#{file}.haml"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
protected
|
49
|
+
def banner
|
50
|
+
<<-EOS
|
51
|
+
Creates a simple RubyGems scaffold.
|
52
|
+
|
53
|
+
USAGE: #{spec.name} name --simple"
|
54
|
+
EOS
|
55
|
+
end
|
56
|
+
|
57
|
+
def add_options!(opts)
|
58
|
+
opts.separator ''
|
59
|
+
opts.separator 'Options:'
|
60
|
+
# For each option below, place the default
|
61
|
+
# at the top of the file next to "default_options"
|
62
|
+
# opts.on("-a", "--author=\"Your Name\"", String,
|
63
|
+
# "Some comment about this option",
|
64
|
+
# "Default: none") { |x| options[:author] = x }
|
65
|
+
opts.on("-v", "--version", "Show the #{File.basename($0)} version number and quit.")
|
66
|
+
end
|
67
|
+
|
68
|
+
def extract_options
|
69
|
+
# for each option, extract it into a local variable (and create an "attr_reader :author" at the top)
|
70
|
+
# Templates can access these value via the attr_reader-generated methods, but not the
|
71
|
+
# raw instance variable value.
|
72
|
+
# @author = options[:author]
|
73
|
+
end
|
74
|
+
|
75
|
+
# Installation skeleton. Intermediate directories are automatically
|
76
|
+
# created so don't sweat their absence here.
|
77
|
+
BASEDIRS = %w(
|
78
|
+
lib
|
79
|
+
spec
|
80
|
+
)
|
81
|
+
end
|
data/lib/singen.rb
ADDED
File without changes
|
data/spec/singem_spec.rb
ADDED
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,184 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: singem
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Corey Donohoe
|
8
|
+
autorequire: singem
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-05-22 00:00:00 -06:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: sinatra
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.9.2
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rubigen
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.5.2
|
34
|
+
version:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: rack-test
|
37
|
+
type: :runtime
|
38
|
+
version_requirement:
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 0.3.0
|
44
|
+
version:
|
45
|
+
- !ruby/object:Gem::Dependency
|
46
|
+
name: webrat
|
47
|
+
type: :runtime
|
48
|
+
version_requirement:
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 0.4.4
|
54
|
+
version:
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: fakeweb
|
57
|
+
type: :runtime
|
58
|
+
version_requirement:
|
59
|
+
version_requirements: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ~>
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: 1.2.0
|
64
|
+
version:
|
65
|
+
- !ruby/object:Gem::Dependency
|
66
|
+
name: haml
|
67
|
+
type: :runtime
|
68
|
+
version_requirement:
|
69
|
+
version_requirements: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - ~>
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: 2.0.9
|
74
|
+
version:
|
75
|
+
description: A gem that provides generators for sinatra apps, ready to go with rack-test/webrat/randexp and others
|
76
|
+
email: atmos@atmos.org
|
77
|
+
executables:
|
78
|
+
- singem
|
79
|
+
extensions: []
|
80
|
+
|
81
|
+
extra_rdoc_files:
|
82
|
+
- LICENSE
|
83
|
+
- TODO
|
84
|
+
files:
|
85
|
+
- LICENSE
|
86
|
+
- README.md
|
87
|
+
- Rakefile
|
88
|
+
- TODO
|
89
|
+
- lib/generators
|
90
|
+
- lib/generators/cucumber
|
91
|
+
- lib/generators/cucumber/cucumber_generator.rb
|
92
|
+
- lib/generators/cucumber/templates
|
93
|
+
- lib/generators/cucumber/templates/config.ru.erb
|
94
|
+
- lib/generators/cucumber/templates/features
|
95
|
+
- lib/generators/cucumber/templates/features/basics.feature.erb
|
96
|
+
- lib/generators/cucumber/templates/features/step_definitions
|
97
|
+
- lib/generators/cucumber/templates/features/step_definitions/basics.rb.erb
|
98
|
+
- lib/generators/cucumber/templates/features/support
|
99
|
+
- lib/generators/cucumber/templates/features/support/env.rb.erb
|
100
|
+
- lib/generators/cucumber/templates/lib
|
101
|
+
- lib/generators/cucumber/templates/lib/templates
|
102
|
+
- lib/generators/cucumber/templates/lib/templates/app.rb.erb
|
103
|
+
- lib/generators/cucumber/templates/lib/templates.rb.erb
|
104
|
+
- lib/generators/cucumber/templates/LICENSE
|
105
|
+
- lib/generators/cucumber/templates/Rakefile
|
106
|
+
- lib/generators/cucumber/templates/README.md
|
107
|
+
- lib/generators/cucumber/templates/spec
|
108
|
+
- lib/generators/cucumber/templates/spec/fixtures.rb.erb
|
109
|
+
- lib/generators/cucumber/templates/spec/spec_helper.rb.erb
|
110
|
+
- lib/generators/cucumber/templates/spec/templates_spec.rb.erb
|
111
|
+
- lib/generators/cucumber/templates/TODO
|
112
|
+
- lib/generators/cucumber/USAGE
|
113
|
+
- lib/generators/singem
|
114
|
+
- lib/generators/singem/singem_generator.rb
|
115
|
+
- lib/generators/singem/templates
|
116
|
+
- lib/generators/singem/templates/config.ru.erb
|
117
|
+
- lib/generators/singem/templates/lib
|
118
|
+
- lib/generators/singem/templates/lib/templates
|
119
|
+
- lib/generators/singem/templates/lib/templates/app.rb.erb
|
120
|
+
- lib/generators/singem/templates/lib/templates.rb.erb
|
121
|
+
- lib/generators/singem/templates/LICENSE
|
122
|
+
- lib/generators/singem/templates/Rakefile
|
123
|
+
- lib/generators/singem/templates/README.md
|
124
|
+
- lib/generators/singem/templates/spec
|
125
|
+
- lib/generators/singem/templates/spec/fixtures.rb.erb
|
126
|
+
- lib/generators/singem/templates/spec/spec_helper.rb.erb
|
127
|
+
- lib/generators/singem/templates/spec/templates_spec.rb.erb
|
128
|
+
- lib/generators/singem/templates/TODO
|
129
|
+
- lib/generators/singem/USAGE
|
130
|
+
- lib/generators/twitter
|
131
|
+
- lib/generators/twitter/templates
|
132
|
+
- lib/generators/twitter/templates/config.ru.erb
|
133
|
+
- lib/generators/twitter/templates/lib
|
134
|
+
- lib/generators/twitter/templates/lib/templates
|
135
|
+
- lib/generators/twitter/templates/lib/templates/models
|
136
|
+
- lib/generators/twitter/templates/lib/templates/models/user.rb.erb
|
137
|
+
- lib/generators/twitter/templates/lib/templates/sinatra
|
138
|
+
- lib/generators/twitter/templates/lib/templates/sinatra/app.rb.erb
|
139
|
+
- lib/generators/twitter/templates/lib/templates/views
|
140
|
+
- lib/generators/twitter/templates/lib/templates/views/about.haml
|
141
|
+
- lib/generators/twitter/templates/lib/templates/views/failed.haml
|
142
|
+
- lib/generators/twitter/templates/lib/templates/views/home.haml
|
143
|
+
- lib/generators/twitter/templates/lib/templates.rb.erb
|
144
|
+
- lib/generators/twitter/templates/LICENSE
|
145
|
+
- lib/generators/twitter/templates/Rakefile
|
146
|
+
- lib/generators/twitter/templates/README.md
|
147
|
+
- lib/generators/twitter/templates/spec
|
148
|
+
- lib/generators/twitter/templates/spec/fixtures.rb.erb
|
149
|
+
- lib/generators/twitter/templates/spec/spec_helper.rb.erb
|
150
|
+
- lib/generators/twitter/templates/spec/templates_spec.rb.erb
|
151
|
+
- lib/generators/twitter/templates/TODO
|
152
|
+
- lib/generators/twitter/twitter_generator.rb
|
153
|
+
- lib/generators/twitter/USAGE
|
154
|
+
- lib/singen.rb
|
155
|
+
- spec/singem_spec.rb
|
156
|
+
- spec/spec_helper.rb
|
157
|
+
has_rdoc: true
|
158
|
+
homepage: http://github.com/atmos/singem
|
159
|
+
post_install_message:
|
160
|
+
rdoc_options: []
|
161
|
+
|
162
|
+
require_paths:
|
163
|
+
- lib
|
164
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
165
|
+
requirements:
|
166
|
+
- - ">="
|
167
|
+
- !ruby/object:Gem::Version
|
168
|
+
version: "0"
|
169
|
+
version:
|
170
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
171
|
+
requirements:
|
172
|
+
- - ">="
|
173
|
+
- !ruby/object:Gem::Version
|
174
|
+
version: "0"
|
175
|
+
version:
|
176
|
+
requirements: []
|
177
|
+
|
178
|
+
rubyforge_project:
|
179
|
+
rubygems_version: 1.3.1
|
180
|
+
signing_key:
|
181
|
+
specification_version: 2
|
182
|
+
summary: A gem that provides generators for sinatra apps, ready to go with rack-test/webrat/randexp and others
|
183
|
+
test_files: []
|
184
|
+
|