singem 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. data/LICENSE +20 -0
  2. data/README.md +36 -0
  3. data/Rakefile +63 -0
  4. data/TODO +1 -0
  5. data/bin/singem +26 -0
  6. data/lib/generators/cucumber/USAGE +5 -0
  7. data/lib/generators/cucumber/cucumber_generator.rb +82 -0
  8. data/lib/generators/cucumber/templates/LICENSE +20 -0
  9. data/lib/generators/cucumber/templates/README.md +4 -0
  10. data/lib/generators/cucumber/templates/Rakefile +73 -0
  11. data/lib/generators/cucumber/templates/TODO +4 -0
  12. data/lib/generators/cucumber/templates/config.ru.erb +11 -0
  13. data/lib/generators/cucumber/templates/features/basics.feature.erb +6 -0
  14. data/lib/generators/cucumber/templates/features/step_definitions/basics.rb.erb +8 -0
  15. data/lib/generators/cucumber/templates/features/support/env.rb.erb +32 -0
  16. data/lib/generators/cucumber/templates/lib/templates.rb.erb +9 -0
  17. data/lib/generators/cucumber/templates/lib/templates/app.rb.erb +7 -0
  18. data/lib/generators/cucumber/templates/spec/fixtures.rb.erb +0 -0
  19. data/lib/generators/cucumber/templates/spec/spec_helper.rb.erb +40 -0
  20. data/lib/generators/cucumber/templates/spec/templates_spec.rb.erb +8 -0
  21. data/lib/generators/singem/USAGE +5 -0
  22. data/lib/generators/singem/singem_generator.rb +77 -0
  23. data/lib/generators/singem/templates/LICENSE +20 -0
  24. data/lib/generators/singem/templates/README.md +4 -0
  25. data/lib/generators/singem/templates/Rakefile +66 -0
  26. data/lib/generators/singem/templates/TODO +4 -0
  27. data/lib/generators/singem/templates/config.ru.erb +11 -0
  28. data/lib/generators/singem/templates/lib/templates.rb.erb +9 -0
  29. data/lib/generators/singem/templates/lib/templates/app.rb.erb +7 -0
  30. data/lib/generators/singem/templates/spec/fixtures.rb.erb +0 -0
  31. data/lib/generators/singem/templates/spec/spec_helper.rb.erb +40 -0
  32. data/lib/generators/singem/templates/spec/templates_spec.rb.erb +8 -0
  33. data/lib/generators/twitter/USAGE +5 -0
  34. data/lib/generators/twitter/templates/LICENSE +20 -0
  35. data/lib/generators/twitter/templates/README.md +4 -0
  36. data/lib/generators/twitter/templates/Rakefile +66 -0
  37. data/lib/generators/twitter/templates/TODO +4 -0
  38. data/lib/generators/twitter/templates/config.ru.erb +14 -0
  39. data/lib/generators/twitter/templates/lib/templates.rb.erb +58 -0
  40. data/lib/generators/twitter/templates/lib/templates/models/user.rb.erb +38 -0
  41. data/lib/generators/twitter/templates/lib/templates/sinatra/app.rb.erb +66 -0
  42. data/lib/generators/twitter/templates/lib/templates/views/about.haml +5 -0
  43. data/lib/generators/twitter/templates/lib/templates/views/failed.haml +4 -0
  44. data/lib/generators/twitter/templates/lib/templates/views/home.haml +1 -0
  45. data/lib/generators/twitter/templates/spec/fixtures.rb.erb +0 -0
  46. data/lib/generators/twitter/templates/spec/spec_helper.rb.erb +75 -0
  47. data/lib/generators/twitter/templates/spec/templates_spec.rb.erb +59 -0
  48. data/lib/generators/twitter/twitter_generator.rb +81 -0
  49. data/lib/singen.rb +0 -0
  50. data/spec/singem_spec.rb +7 -0
  51. data/spec/spec_helper.rb +2 -0
  52. 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,5 @@
1
+ %h2 Do you use twitter?
2
+ %p
3
+ Would you mind trying out my new app?
4
+ %p
5
+ Enter your custom stuff here.
@@ -0,0 +1,4 @@
1
+ %p
2
+ Something went wonky.
3
+ a{:href => '/'} Try again
4
+ ?
@@ -0,0 +1 @@
1
+ %h2 Hello There, you little twitterer!
@@ -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
@@ -0,0 +1,7 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe "singen" do
4
+ it "should do nothing" do
5
+ true.should == true
6
+ end
7
+ end
@@ -0,0 +1,2 @@
1
+ $TESTING=true
2
+ $:.push File.join(File.dirname(__FILE__), '..', 'lib')
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
+