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.
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
+