singem 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/README.md +3 -10
- data/Rakefile +0 -54
- data/bin/singem +1 -5
- data/lib/generators/{twitter → default}/USAGE +0 -0
- data/lib/generators/{cucumber/cucumber_generator.rb → default/default_generator.rb} +4 -12
- data/lib/generators/default/templates/Gemfile +14 -0
- data/lib/generators/{cucumber → default}/templates/LICENSE +0 -0
- data/lib/generators/{cucumber → default}/templates/README.md +0 -0
- data/lib/generators/default/templates/Rakefile +19 -0
- data/lib/generators/{cucumber → default}/templates/TODO +1 -1
- data/lib/generators/default/templates/config.ru.erb +11 -0
- data/lib/generators/default/templates/lib/templates.rb.erb +13 -0
- data/lib/generators/{cucumber → default}/templates/lib/templates/app.rb.erb +1 -1
- data/lib/generators/{cucumber → default}/templates/spec/spec_helper.rb.erb +0 -0
- data/lib/generators/{cucumber → default}/templates/spec/templates_spec.rb.erb +0 -0
- data/lib/singem/version.rb +4 -0
- data/singem.gemspec +22 -0
- metadata +39 -74
- data/lib/generators/cucumber/USAGE +0 -5
- data/lib/generators/cucumber/templates/Gemfile +0 -29
- data/lib/generators/cucumber/templates/Rakefile +0 -71
- data/lib/generators/cucumber/templates/config.ru.erb +0 -20
- data/lib/generators/cucumber/templates/features/basics.feature.erb +0 -7
- data/lib/generators/cucumber/templates/features/step_definitions/basics.rb.erb +0 -8
- data/lib/generators/cucumber/templates/features/support/env.rb.erb +0 -21
- data/lib/generators/cucumber/templates/lib/templates.rb.erb +0 -16
- data/lib/generators/cucumber/templates/spec/fixtures.rb.erb +0 -0
- data/lib/generators/twitter/templates/Gemfile +0 -32
- data/lib/generators/twitter/templates/LICENSE +0 -20
- data/lib/generators/twitter/templates/README.md +0 -10
- data/lib/generators/twitter/templates/Rakefile +0 -71
- data/lib/generators/twitter/templates/TODO +0 -4
- data/lib/generators/twitter/templates/config.ru.erb +0 -23
- data/lib/generators/twitter/templates/features/basics.feature.erb +0 -11
- data/lib/generators/twitter/templates/features/step_definitions/basics.rb.erb +0 -15
- data/lib/generators/twitter/templates/features/support/env.rb.erb +0 -23
- data/lib/generators/twitter/templates/lib/templates.rb.erb +0 -55
- data/lib/generators/twitter/templates/lib/templates/app.rb.erb +0 -65
- data/lib/generators/twitter/templates/lib/templates/models/user.rb.erb +0 -38
- data/lib/generators/twitter/templates/lib/templates/views/about.haml +0 -5
- data/lib/generators/twitter/templates/lib/templates/views/failed.haml +0 -4
- data/lib/generators/twitter/templates/lib/templates/views/home.haml +0 -1
- data/lib/generators/twitter/templates/spec/fixtures.rb.erb +0 -0
- data/lib/generators/twitter/templates/spec/helpers.rb.erb +0 -36
- data/lib/generators/twitter/templates/spec/spec_helper.rb.erb +0 -39
- data/lib/generators/twitter/templates/spec/templates_spec.rb.erb +0 -59
- data/lib/generators/twitter/twitter_generator.rb +0 -90
data/.gitignore
ADDED
data/README.md
CHANGED
@@ -6,7 +6,7 @@ singem
|
|
6
6
|
Installation
|
7
7
|
============
|
8
8
|
|
9
|
-
%
|
9
|
+
% gem install singem
|
10
10
|
|
11
11
|
Or build it yourself
|
12
12
|
|
@@ -20,13 +20,6 @@ Basic Sinatra App, no sessions, cucumber testing
|
|
20
20
|
------------------------------------------------
|
21
21
|
% singem foo
|
22
22
|
% cd foo
|
23
|
-
% bundle install
|
24
|
-
%
|
23
|
+
% bundle install --binstubs
|
24
|
+
% bin/rake
|
25
25
|
|
26
|
-
Basic Twitter OAuth App,
|
27
|
-
------------------------------
|
28
|
-
% singem --twitter foo
|
29
|
-
% cd foo
|
30
|
-
% bundle install
|
31
|
-
% bundle exec rake
|
32
|
-
% open http://twitter.com/oauth_clients
|
data/Rakefile
CHANGED
@@ -2,57 +2,3 @@ require 'rake/gempackagetask'
|
|
2
2
|
require 'rubygems/specification'
|
3
3
|
require 'date'
|
4
4
|
require 'spec/rake/spectask'
|
5
|
-
|
6
|
-
GEM = "singem"
|
7
|
-
GEM_VERSION = "0.2.0"
|
8
|
-
AUTHOR = "Corey Donohoe"
|
9
|
-
EMAIL = "atmos@atmos.org"
|
10
|
-
HOMEPAGE = "http://github.com/atmos/singem"
|
11
|
-
SUMMARY = "A gem that provides generators for sinatra apps, ready to go with rack-test/webrat/randexp and others"
|
12
|
-
|
13
|
-
spec = Gem::Specification.new do |s|
|
14
|
-
s.name = GEM
|
15
|
-
s.version = GEM_VERSION
|
16
|
-
s.platform = Gem::Platform::RUBY
|
17
|
-
s.has_rdoc = true
|
18
|
-
s.extra_rdoc_files = ["LICENSE", 'TODO']
|
19
|
-
s.summary = SUMMARY
|
20
|
-
s.description = s.summary
|
21
|
-
s.author = AUTHOR
|
22
|
-
s.email = EMAIL
|
23
|
-
s.homepage = HOMEPAGE
|
24
|
-
|
25
|
-
s.add_dependency "rubigen"
|
26
|
-
s.add_dependency "bundler", '~>0.9.3'
|
27
|
-
|
28
|
-
s.bindir = "bin"
|
29
|
-
s.executables = %w( singem )
|
30
|
-
s.require_path = 'lib'
|
31
|
-
s.autorequire = GEM
|
32
|
-
s.files = %w(LICENSE README.md Rakefile TODO) + Dir.glob("{lib,spec}/**/*")
|
33
|
-
end
|
34
|
-
|
35
|
-
task :default => :spec
|
36
|
-
|
37
|
-
desc "Run specs"
|
38
|
-
Spec::Rake::SpecTask.new do |t|
|
39
|
-
t.spec_files = FileList['spec/**/*_spec.rb']
|
40
|
-
t.spec_opts = %w(-fs --color)
|
41
|
-
end
|
42
|
-
|
43
|
-
|
44
|
-
Rake::GemPackageTask.new(spec) do |pkg|
|
45
|
-
pkg.gem_spec = spec
|
46
|
-
end
|
47
|
-
|
48
|
-
desc "install the gem locally"
|
49
|
-
task :install => [:package] do
|
50
|
-
sh %{sudo gem install pkg/#{GEM}-#{GEM_VERSION}}
|
51
|
-
end
|
52
|
-
|
53
|
-
desc "create a gemspec file"
|
54
|
-
task :make_spec do
|
55
|
-
File.open("#{GEM}.gemspec", "w") do |file|
|
56
|
-
file.puts spec.to_ruby
|
57
|
-
end
|
58
|
-
end
|
data/bin/singem
CHANGED
@@ -12,8 +12,4 @@ RubiGen::Base.prepend_sources(*[
|
|
12
12
|
RubiGen::PathSource.new(:app, File.join(File.dirname(__FILE__), "..", "lib/generators"))
|
13
13
|
])
|
14
14
|
|
15
|
-
|
16
|
-
RubiGen::Scripts::Generate.new.run(ARGV, :generator => 'twitter', :backtrace => true)
|
17
|
-
else
|
18
|
-
RubiGen::Scripts::Generate.new.run(ARGV, :generator => 'cucumber', :backtrace => true)
|
19
|
-
end
|
15
|
+
RubiGen::Scripts::Generate.new.run(ARGV, :generator => "default", :backtrace => true)
|
File without changes
|
@@ -1,4 +1,4 @@
|
|
1
|
-
class
|
1
|
+
class DefaultGenerator < RubiGen::Base
|
2
2
|
DEFAULT_SHEBANG = File.join(Config::CONFIG['bindir'],
|
3
3
|
Config::CONFIG['ruby_install_name'])
|
4
4
|
|
@@ -19,28 +19,20 @@ class CucumberGenerator < RubiGen::Base
|
|
19
19
|
m.directory ''
|
20
20
|
BASEDIRS.each { |path| m.directory path }
|
21
21
|
m.directory "lib/#{name}"
|
22
|
-
m.directory "features/support"
|
23
|
-
m.directory "features/step_definitions"
|
24
22
|
|
25
23
|
# Create stubs
|
26
|
-
m.template "config.ru.erb", "config.ru
|
24
|
+
m.template "config.ru.erb", "config.ru"
|
27
25
|
m.template "lib/templates.rb.erb", "lib/#{name}.rb"
|
28
26
|
m.template "lib/templates/app.rb.erb", "lib/#{name}/app.rb"
|
29
27
|
|
30
|
-
# cucumber stubs
|
31
|
-
m.template "features/support/env.rb.erb", "features/support/env.rb"
|
32
|
-
m.template "features/basics.feature.erb", "features/#{name}.feature"
|
33
|
-
m.template "features/step_definitions/basics.rb.erb", "features/step_definitions/#{name}.rb"
|
34
|
-
|
35
28
|
# rspec stubs
|
36
29
|
m.template "spec/spec_helper.rb.erb", "spec/spec_helper.rb"
|
37
30
|
m.template "spec/templates_spec.rb.erb", "spec/#{name}_spec.rb"
|
38
|
-
m.template "spec/fixtures.rb.erb", "spec/fixtures.rb"
|
39
31
|
|
40
|
-
%w(LICENSE Rakefile README.md Gemfile).each do |file|
|
32
|
+
%w(LICENSE Rakefile README.md Gemfile).each do |file|
|
41
33
|
m.template file, file
|
42
34
|
end
|
43
|
-
%w(TODO).each do |file|
|
35
|
+
%w(TODO).each do |file|
|
44
36
|
m.file file, file
|
45
37
|
end
|
46
38
|
end
|
File without changes
|
File without changes
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'rake/gempackagetask'
|
2
|
+
require 'rubygems/specification'
|
3
|
+
require 'date'
|
4
|
+
require 'bundler'
|
5
|
+
|
6
|
+
task :default => [:spec]
|
7
|
+
|
8
|
+
require 'spec/rake/spectask'
|
9
|
+
desc "Run specs"
|
10
|
+
Spec::Rake::SpecTask.new do |t|
|
11
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
12
|
+
t.spec_opts = %w(-fs --color)
|
13
|
+
t.spec_opts << '--loadby' << 'random'
|
14
|
+
|
15
|
+
t.rcov_opts << '--exclude' << 'spec,.bundle'
|
16
|
+
t.rcov = ENV.has_key?('NO_RCOV') ? ENV['NO_RCOV'] != 'true' : true
|
17
|
+
t.rcov_opts << '--text-summary'
|
18
|
+
t.rcov_opts << '--sort' << 'coverage' << '--sort-reverse'
|
19
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
ENV['RACK_ENV'] ||= 'development'
|
2
|
+
require "rubygems"
|
3
|
+
require "bundler/setup"
|
4
|
+
|
5
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'lib', '<%= name %>'))
|
6
|
+
|
7
|
+
use Rack::Static, :urls => ["/css", "/img", "/js"], :root => "public"
|
8
|
+
|
9
|
+
run <%= name.camelize %>.app
|
10
|
+
|
11
|
+
# vim:ft=ruby
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'sinatra/base'
|
2
|
+
|
3
|
+
module <%= name.camelize %>
|
4
|
+
def self.app
|
5
|
+
@app ||= Rack::Builder.new do
|
6
|
+
use Rack::Session::Cookie, :key => 'rack.session', :path => '/',
|
7
|
+
:expire_after => 2592000, :secret => '<%= ::Digest::SHA1.hexdigest(Time.now.to_s) %>'
|
8
|
+
run <%= name.camelize %>::App
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
require File.dirname(__FILE__)+'/<%= name %>/app'
|
File without changes
|
File without changes
|
data/singem.gemspec
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "singem/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "singem"
|
7
|
+
s.version = Singem::VERSION
|
8
|
+
s.authors = ["Corey Donohoe"]
|
9
|
+
s.email = ["atmos@atmos.org"]
|
10
|
+
s.homepage = "http://github.com/atmos/singem"
|
11
|
+
s.summary = %q{A gem that provides generators for sinatra apps, ready to go with rack-test and others}
|
12
|
+
s.description = s.summary
|
13
|
+
|
14
|
+
s.rubyforge_project = "singem"
|
15
|
+
|
16
|
+
s.add_dependency "rubigen", "~>1.5.2"
|
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
|
+
end
|
metadata
CHANGED
@@ -1,108 +1,72 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: singem
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 19
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 3
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.3.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Corey Donohoe
|
14
|
-
autorequire:
|
14
|
+
autorequire:
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2011-08-02 00:00:00 -07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
22
|
name: rubigen
|
23
23
|
prerelease: false
|
24
24
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
|
-
requirements:
|
27
|
-
- - ">="
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
hash: 3
|
30
|
-
segments:
|
31
|
-
- 0
|
32
|
-
version: "0"
|
33
|
-
type: :runtime
|
34
|
-
version_requirements: *id001
|
35
|
-
- !ruby/object:Gem::Dependency
|
36
|
-
name: bundler
|
37
|
-
prerelease: false
|
38
|
-
requirement: &id002 !ruby/object:Gem::Requirement
|
39
25
|
none: false
|
40
26
|
requirements:
|
41
27
|
- - ~>
|
42
28
|
- !ruby/object:Gem::Version
|
43
|
-
hash:
|
29
|
+
hash: 7
|
44
30
|
segments:
|
45
|
-
-
|
46
|
-
-
|
47
|
-
-
|
48
|
-
version:
|
31
|
+
- 1
|
32
|
+
- 5
|
33
|
+
- 2
|
34
|
+
version: 1.5.2
|
49
35
|
type: :runtime
|
50
|
-
version_requirements: *
|
51
|
-
description: A gem that provides generators for sinatra apps, ready to go with rack-test
|
52
|
-
email:
|
36
|
+
version_requirements: *id001
|
37
|
+
description: A gem that provides generators for sinatra apps, ready to go with rack-test and others
|
38
|
+
email:
|
39
|
+
- atmos@atmos.org
|
53
40
|
executables:
|
54
41
|
- singem
|
55
42
|
extensions: []
|
56
43
|
|
57
|
-
extra_rdoc_files:
|
58
|
-
|
59
|
-
- TODO
|
44
|
+
extra_rdoc_files: []
|
45
|
+
|
60
46
|
files:
|
47
|
+
- .gitignore
|
61
48
|
- LICENSE
|
62
49
|
- README.md
|
63
50
|
- Rakefile
|
64
51
|
- TODO
|
65
|
-
-
|
66
|
-
- lib/generators/
|
67
|
-
- lib/generators/
|
68
|
-
- lib/generators/
|
69
|
-
- lib/generators/
|
70
|
-
- lib/generators/
|
71
|
-
- lib/generators/
|
72
|
-
- lib/generators/
|
73
|
-
- lib/generators/
|
74
|
-
- lib/generators/
|
75
|
-
- lib/generators/
|
76
|
-
- lib/generators/
|
77
|
-
- lib/generators/
|
78
|
-
- lib/
|
79
|
-
- lib/generators/cucumber/templates/TODO
|
80
|
-
- lib/generators/cucumber/USAGE
|
81
|
-
- lib/generators/twitter/templates/config.ru.erb
|
82
|
-
- lib/generators/twitter/templates/features/basics.feature.erb
|
83
|
-
- lib/generators/twitter/templates/features/step_definitions/basics.rb.erb
|
84
|
-
- lib/generators/twitter/templates/features/support/env.rb.erb
|
85
|
-
- lib/generators/twitter/templates/Gemfile
|
86
|
-
- lib/generators/twitter/templates/lib/templates/app.rb.erb
|
87
|
-
- lib/generators/twitter/templates/lib/templates/models/user.rb.erb
|
88
|
-
- lib/generators/twitter/templates/lib/templates/views/about.haml
|
89
|
-
- lib/generators/twitter/templates/lib/templates/views/failed.haml
|
90
|
-
- lib/generators/twitter/templates/lib/templates/views/home.haml
|
91
|
-
- lib/generators/twitter/templates/lib/templates.rb.erb
|
92
|
-
- lib/generators/twitter/templates/LICENSE
|
93
|
-
- lib/generators/twitter/templates/Rakefile
|
94
|
-
- lib/generators/twitter/templates/README.md
|
95
|
-
- lib/generators/twitter/templates/spec/fixtures.rb.erb
|
96
|
-
- lib/generators/twitter/templates/spec/helpers.rb.erb
|
97
|
-
- lib/generators/twitter/templates/spec/spec_helper.rb.erb
|
98
|
-
- lib/generators/twitter/templates/spec/templates_spec.rb.erb
|
99
|
-
- lib/generators/twitter/templates/TODO
|
100
|
-
- lib/generators/twitter/twitter_generator.rb
|
101
|
-
- lib/generators/twitter/USAGE
|
52
|
+
- bin/singem
|
53
|
+
- lib/generators/default/USAGE
|
54
|
+
- lib/generators/default/default_generator.rb
|
55
|
+
- lib/generators/default/templates/Gemfile
|
56
|
+
- lib/generators/default/templates/LICENSE
|
57
|
+
- lib/generators/default/templates/README.md
|
58
|
+
- lib/generators/default/templates/Rakefile
|
59
|
+
- lib/generators/default/templates/TODO
|
60
|
+
- lib/generators/default/templates/config.ru.erb
|
61
|
+
- lib/generators/default/templates/lib/templates.rb.erb
|
62
|
+
- lib/generators/default/templates/lib/templates/app.rb.erb
|
63
|
+
- lib/generators/default/templates/spec/spec_helper.rb.erb
|
64
|
+
- lib/generators/default/templates/spec/templates_spec.rb.erb
|
65
|
+
- lib/singem/version.rb
|
102
66
|
- lib/singen.rb
|
67
|
+
- singem.gemspec
|
103
68
|
- spec/singem_spec.rb
|
104
69
|
- spec/spec_helper.rb
|
105
|
-
- bin/singem
|
106
70
|
has_rdoc: true
|
107
71
|
homepage: http://github.com/atmos/singem
|
108
72
|
licenses: []
|
@@ -132,10 +96,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
132
96
|
version: "0"
|
133
97
|
requirements: []
|
134
98
|
|
135
|
-
rubyforge_project:
|
136
|
-
rubygems_version: 1.
|
99
|
+
rubyforge_project: singem
|
100
|
+
rubygems_version: 1.6.2
|
137
101
|
signing_key:
|
138
102
|
specification_version: 3
|
139
|
-
summary: A gem that provides generators for sinatra apps, ready to go with rack-test
|
140
|
-
test_files:
|
141
|
-
|
103
|
+
summary: A gem that provides generators for sinatra apps, ready to go with rack-test and others
|
104
|
+
test_files:
|
105
|
+
- spec/singem_spec.rb
|
106
|
+
- spec/spec_helper.rb
|
@@ -1,29 +0,0 @@
|
|
1
|
-
source :gemcutter
|
2
|
-
|
3
|
-
group :runtime do
|
4
|
-
gem 'rack_hoptoad', '~>0.1.2', :require => 'rack/hoptoad'
|
5
|
-
gem 'haml', '~>2.2.0'
|
6
|
-
gem 'sinatra', '~>1.0'
|
7
|
-
gem 'rack', '~>1.1.0'
|
8
|
-
#gem 'do_sqlite3', '>=0.10.1.1'
|
9
|
-
#gem 'dm-core', '>=0.10.2'
|
10
|
-
#gem 'dm-validations', '>=0.10.2'
|
11
|
-
#gem 'dm-timestamps', '>=0.10.2'
|
12
|
-
end
|
13
|
-
|
14
|
-
group :test do
|
15
|
-
gem 'rake'
|
16
|
-
gem 'rspec', '~>1.3.0', :require => 'spec'
|
17
|
-
gem 'rcov'
|
18
|
-
gem 'webrat', '~>0.7.0'
|
19
|
-
gem 'shotgun'
|
20
|
-
gem 'bundler', '~>1.0'
|
21
|
-
gem 'cucumber'
|
22
|
-
gem 'fakeweb', '>=1.2.8'
|
23
|
-
gem 'randexp', '>=0.1.4'
|
24
|
-
gem 'rack-test', '~>0.5.3', :require => 'rack/test'
|
25
|
-
gem 'ParseTree', '>=3.0.4', :require => [ ]
|
26
|
-
#gem 'dm-sweatshop', '~>0.10.2'
|
27
|
-
end
|
28
|
-
|
29
|
-
# vim:ft=ruby
|
@@ -1,71 +0,0 @@
|
|
1
|
-
require 'rake/gempackagetask'
|
2
|
-
require 'rubygems/specification'
|
3
|
-
require 'date'
|
4
|
-
require 'bundler'
|
5
|
-
|
6
|
-
task :default => [:cucumber, :spec]
|
7
|
-
|
8
|
-
require 'cucumber/rake/task'
|
9
|
-
desc "Run cucumber"
|
10
|
-
Cucumber::Rake::Task.new do |t|
|
11
|
-
t.cucumber_opts = %w{--format pretty}
|
12
|
-
end
|
13
|
-
|
14
|
-
require 'spec/rake/spectask'
|
15
|
-
desc "Run specs"
|
16
|
-
Spec::Rake::SpecTask.new do |t|
|
17
|
-
t.spec_files = FileList['spec/**/*_spec.rb']
|
18
|
-
t.spec_opts = %w(-fs --color)
|
19
|
-
t.spec_opts << '--loadby' << 'random'
|
20
|
-
|
21
|
-
t.rcov_opts << '--exclude' << 'spec,.bundle'
|
22
|
-
t.rcov = ENV.has_key?('NO_RCOV') ? ENV['NO_RCOV'] != 'true' : true
|
23
|
-
t.rcov_opts << '--text-summary'
|
24
|
-
t.rcov_opts << '--sort' << 'coverage' << '--sort-reverse'
|
25
|
-
end
|
26
|
-
|
27
|
-
GEM = "<%= name %>"
|
28
|
-
GEM_VERSION = "0.0.1"
|
29
|
-
AUTHOR = "Your Name"
|
30
|
-
EMAIL = "Your Email"
|
31
|
-
HOMEPAGE = "http://example.com"
|
32
|
-
SUMMARY = "A sinatra app that provides..."
|
33
|
-
|
34
|
-
spec = Gem::Specification.new do |s|
|
35
|
-
s.name = GEM
|
36
|
-
s.version = GEM_VERSION
|
37
|
-
s.platform = Gem::Platform::RUBY
|
38
|
-
s.has_rdoc = true
|
39
|
-
s.extra_rdoc_files = ["LICENSE", 'TODO']
|
40
|
-
s.summary = SUMMARY
|
41
|
-
s.description = s.summary
|
42
|
-
s.author = AUTHOR
|
43
|
-
s.email = EMAIL
|
44
|
-
s.homepage = HOMEPAGE
|
45
|
-
|
46
|
-
bundle = Bundler::Definition.build('Gemfile', 'Gemfile.lock', { })
|
47
|
-
bundle.dependencies.each do |dep|
|
48
|
-
next unless dep.groups.include?(:runtime)
|
49
|
-
s.add_dependency(dep.name, dep.version_requirements.to_s)
|
50
|
-
end
|
51
|
-
|
52
|
-
s.require_path = 'lib'
|
53
|
-
s.files = %w(LICENSE README.md Rakefile TODO) + Dir.glob("{lib,features}/**/*")
|
54
|
-
end
|
55
|
-
|
56
|
-
Rake::GemPackageTask.new(spec) do |pkg|
|
57
|
-
pkg.gem_spec = spec
|
58
|
-
end
|
59
|
-
|
60
|
-
desc "install the gem locally"
|
61
|
-
task :install => [:package] do
|
62
|
-
sh %{sudo gem install pkg/#{GEM}-#{GEM_VERSION}}
|
63
|
-
end
|
64
|
-
|
65
|
-
desc "create a gemspec file"
|
66
|
-
task :make_spec do
|
67
|
-
File.open("#{GEM}.gemspec", "w") do |file|
|
68
|
-
file.puts spec.to_ruby
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
@@ -1,20 +0,0 @@
|
|
1
|
-
ENV['RACK_ENV'] ||= 'development'
|
2
|
-
begin
|
3
|
-
require File.expand_path('../.bundle/environment', __FILE__)
|
4
|
-
rescue LoadError
|
5
|
-
require "rubygems"
|
6
|
-
require "bundler"
|
7
|
-
Bundler.setup
|
8
|
-
end
|
9
|
-
|
10
|
-
Bundler.require(:runtime)
|
11
|
-
|
12
|
-
require File.expand_path(File.join(File.dirname(__FILE__), 'lib', '<%= name %>'))
|
13
|
-
|
14
|
-
#DataMapper.setup(:default, "mysql://atmos:fail@localhost/<%= name.capitalize %>_production")
|
15
|
-
|
16
|
-
use Rack::Static, :urls => ["/css", "/img", "/js"], :root => "public"
|
17
|
-
|
18
|
-
run <%= name.camelize %>.app
|
19
|
-
|
20
|
-
# vim:ft=ruby
|
@@ -1,21 +0,0 @@
|
|
1
|
-
Bundler.require(:default, :runtime, :test)
|
2
|
-
require File.join(File.dirname(__FILE__), '..', '..', 'lib', '<%= name %>')
|
3
|
-
|
4
|
-
Webrat.configure do |config|
|
5
|
-
config.mode = :rack
|
6
|
-
config.application_port = 4567
|
7
|
-
end
|
8
|
-
|
9
|
-
module <%= name.camelize %>::AppHelpers
|
10
|
-
def app
|
11
|
-
<%= name.camelize %>.app
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
World(Rack::Test::Methods)
|
16
|
-
World(Webrat::Matchers)
|
17
|
-
World(<%= name.camelize %>::AppHelpers)
|
18
|
-
|
19
|
-
Before do
|
20
|
-
# insert before filtery things here
|
21
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
require 'sinatra/base'
|
2
|
-
require 'haml/util'
|
3
|
-
require 'haml/engine'
|
4
|
-
|
5
|
-
module <%= name.camelize %>
|
6
|
-
def self.app
|
7
|
-
@app ||= Rack::Builder.new do
|
8
|
-
# use Rack::Hoptoad 'mysecretkey'
|
9
|
-
# use Rack::Session::Cookie, :key => 'rack.session', :path => '/',
|
10
|
-
# :expire_after => 2592000, :secret => '<%= ::Digest::SHA1.hexdigest(Time.now.to_s) %>'
|
11
|
-
run <%= name.camelize %>::App
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
require File.dirname(__FILE__)+'/<%= name %>/app'
|
File without changes
|
@@ -1,32 +0,0 @@
|
|
1
|
-
source :gemcutter
|
2
|
-
|
3
|
-
group :runtime do
|
4
|
-
gem 'rack_hoptoad', '~>0.1.2', :require => 'rack/hoptoad'
|
5
|
-
gem 'haml', '~>2.2.0'
|
6
|
-
gem 'sinatra', '~>1.0.0'
|
7
|
-
gem 'rack', '~>1.1.0'
|
8
|
-
gem 'curb', '>=0.3.7'
|
9
|
-
gem 'json', '>=1.1.6'
|
10
|
-
gem 'oauth', '=0.3.2'
|
11
|
-
gem 'do_sqlite3', '>=0.10.1.1'
|
12
|
-
gem 'dm-core', '~>0.10.2'
|
13
|
-
gem 'dm-validations', '~>0.10.2'
|
14
|
-
gem 'dm-timestamps', '~>0.10.2'
|
15
|
-
end
|
16
|
-
|
17
|
-
group :test do
|
18
|
-
gem 'rake'
|
19
|
-
gem 'rspec', '~>1.3.0', :require => 'spec'
|
20
|
-
gem 'rcov'
|
21
|
-
gem 'webrat', '~>0.7.0'
|
22
|
-
gem 'shotgun'
|
23
|
-
gem 'bundler', '~>1.0'
|
24
|
-
gem 'cucumber'
|
25
|
-
gem 'fakeweb', '>=1.2.8'
|
26
|
-
gem 'randexp', '>=0.1.4'
|
27
|
-
gem 'rack-test', '~>0.5.3', :require => 'rack/test'
|
28
|
-
gem 'ParseTree', '>=3.0.4', :require => [ ]
|
29
|
-
#gem 'dm-sweatshop', '~>0.10.2'
|
30
|
-
end
|
31
|
-
|
32
|
-
# vim:ft=ruby
|
@@ -1,20 +0,0 @@
|
|
1
|
-
Copyright (c) <%= Time.now.year %> YOUR NAME
|
2
|
-
|
3
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
-
a copy of this software and associated documentation files (the
|
5
|
-
"Software"), to deal in the Software without restriction, including
|
6
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
-
permit persons to whom the Software is furnished to do so, subject to
|
9
|
-
the following conditions:
|
10
|
-
|
11
|
-
The above copyright notice and this permission notice shall be
|
12
|
-
included in all copies or substantial portions of the Software.
|
13
|
-
|
14
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
-
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
-
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
-
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
@@ -1,71 +0,0 @@
|
|
1
|
-
require 'rake/gempackagetask'
|
2
|
-
require 'rubygems/specification'
|
3
|
-
require 'date'
|
4
|
-
require 'bundler'
|
5
|
-
|
6
|
-
task :default => [:cucumber, :spec]
|
7
|
-
|
8
|
-
require 'cucumber/rake/task'
|
9
|
-
desc "Run cucumber"
|
10
|
-
Cucumber::Rake::Task.new do |t|
|
11
|
-
t.cucumber_opts = %w{--format pretty}
|
12
|
-
end
|
13
|
-
|
14
|
-
require 'spec/rake/spectask'
|
15
|
-
desc "Run specs"
|
16
|
-
Spec::Rake::SpecTask.new do |t|
|
17
|
-
t.spec_files = FileList['spec/**/*_spec.rb']
|
18
|
-
t.spec_opts = %w(-fs --color)
|
19
|
-
t.spec_opts << '--loadby' << 'random'
|
20
|
-
|
21
|
-
t.rcov_opts << '--exclude' << 'spec,.bundle'
|
22
|
-
t.rcov = ENV.has_key?('NO_RCOV') ? ENV['NO_RCOV'] != 'true' : true
|
23
|
-
t.rcov_opts << '--text-summary'
|
24
|
-
t.rcov_opts << '--sort' << 'coverage' << '--sort-reverse'
|
25
|
-
end
|
26
|
-
|
27
|
-
GEM = "<%= name %>"
|
28
|
-
GEM_VERSION = "0.0.1"
|
29
|
-
AUTHOR = "Your Name"
|
30
|
-
EMAIL = "Your Email"
|
31
|
-
HOMEPAGE = "http://example.com"
|
32
|
-
SUMMARY = "A sinatra app that provides..."
|
33
|
-
|
34
|
-
spec = Gem::Specification.new do |s|
|
35
|
-
s.name = GEM
|
36
|
-
s.version = GEM_VERSION
|
37
|
-
s.platform = Gem::Platform::RUBY
|
38
|
-
s.has_rdoc = true
|
39
|
-
s.extra_rdoc_files = ["LICENSE", 'TODO']
|
40
|
-
s.summary = SUMMARY
|
41
|
-
s.description = s.summary
|
42
|
-
s.author = AUTHOR
|
43
|
-
s.email = EMAIL
|
44
|
-
s.homepage = HOMEPAGE
|
45
|
-
|
46
|
-
bundle = Bundler::Definition.build('Gemfile', 'Gemfile.lock', { })
|
47
|
-
bundle.dependencies.each do |dep|
|
48
|
-
next unless dep.groups.include?(:runtime)
|
49
|
-
s.add_dependency(dep.name, dep.version_requirements.to_s)
|
50
|
-
end
|
51
|
-
|
52
|
-
s.require_path = 'lib'
|
53
|
-
s.files = %w(LICENSE README.md Rakefile TODO) + Dir.glob("{lib,features}/**/*")
|
54
|
-
end
|
55
|
-
|
56
|
-
Rake::GemPackageTask.new(spec) do |pkg|
|
57
|
-
pkg.gem_spec = spec
|
58
|
-
end
|
59
|
-
|
60
|
-
desc "install the gem locally"
|
61
|
-
task :install => [:package] do
|
62
|
-
sh %{sudo gem install pkg/#{GEM}-#{GEM_VERSION}}
|
63
|
-
end
|
64
|
-
|
65
|
-
desc "create a gemspec file"
|
66
|
-
task :make_spec do
|
67
|
-
File.open("#{GEM}.gemspec", "w") do |file|
|
68
|
-
file.puts spec.to_ruby
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
@@ -1,23 +0,0 @@
|
|
1
|
-
ENV['RACK_ENV'] ||= 'development'
|
2
|
-
begin
|
3
|
-
require File.expand_path('../.bundle/environment', __FILE__)
|
4
|
-
rescue LoadError
|
5
|
-
require "rubygems"
|
6
|
-
require "bundler"
|
7
|
-
Bundler.setup
|
8
|
-
end
|
9
|
-
|
10
|
-
Bundler.require(:runtime)
|
11
|
-
|
12
|
-
require File.join(File.dirname(__FILE__), 'lib', '<%= name %>')
|
13
|
-
|
14
|
-
ENV['<%= name.upcase %>_READKEY'] = /\w{18}/.gen # this should really be what twitter gives you
|
15
|
-
ENV['<%= name.upcase %>_READSECRET'] = /\w{24}/.gen # this should really be what twitter gives you
|
16
|
-
|
17
|
-
#DataMapper.setup(:default, "mysql://atmos:fail@localhost/<%= name.capitalize %>_production")
|
18
|
-
|
19
|
-
use Rack::Static, :urls => ["/css", "/img", "/js"], :root => "public"
|
20
|
-
|
21
|
-
run <%= name.camelize %>.app
|
22
|
-
|
23
|
-
# vim:ft=ruby
|
@@ -1,11 +0,0 @@
|
|
1
|
-
Feature: Visiting the Home Page
|
2
|
-
In order to display a splash page
|
3
|
-
|
4
|
-
Scenario: Seeing the splash page unauthenticated
|
5
|
-
When I visit the home page
|
6
|
-
Then I should be prompted to try the app
|
7
|
-
|
8
|
-
Scenario: Seeing the splash page authenticated
|
9
|
-
Given I am logged in
|
10
|
-
When I visit the home page
|
11
|
-
Then I should be greeted
|
@@ -1,15 +0,0 @@
|
|
1
|
-
When /^I visit the home page$/ do
|
2
|
-
get '/'
|
3
|
-
end
|
4
|
-
|
5
|
-
Then /^I should be greeted$/ do
|
6
|
-
last_response.should have_selector("h2:contains('Hello There, you little twitterer!')")
|
7
|
-
end
|
8
|
-
|
9
|
-
Then /^I should be prompted to try the app$/ do
|
10
|
-
last_response.should have_selector("p:contains('Would you mind trying out my new app')")
|
11
|
-
end
|
12
|
-
|
13
|
-
Given /^I am logged in$/ do
|
14
|
-
login_quentin
|
15
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
Bundler.require(:default, :runtime, :test)
|
2
|
-
require File.join(File.dirname(__FILE__), '..', '..', 'lib', '<%= name %>')
|
3
|
-
|
4
|
-
require 'spec/mocks'
|
5
|
-
require 'pp'
|
6
|
-
|
7
|
-
require File.dirname(__FILE__)+'/../../spec/helpers'
|
8
|
-
|
9
|
-
Webrat.configure do |config|
|
10
|
-
config.mode = :rack
|
11
|
-
config.application_port = 4567
|
12
|
-
end
|
13
|
-
|
14
|
-
World(Rack::Test::Methods)
|
15
|
-
World(Spec::Mocks::ExampleMethods)
|
16
|
-
World(Webrat::Methods)
|
17
|
-
World(Webrat::Matchers)
|
18
|
-
World(<%= name.camelize %>::AppHelpers)
|
19
|
-
|
20
|
-
Before do
|
21
|
-
DataMapper.setup(:default, "sqlite3://:memory:")
|
22
|
-
DataMapper.auto_migrate!
|
23
|
-
end
|
@@ -1,55 +0,0 @@
|
|
1
|
-
require 'oauth'
|
2
|
-
require 'json'
|
3
|
-
require 'haml/util'
|
4
|
-
require 'haml/engine'
|
5
|
-
require 'curb'
|
6
|
-
require 'logger'
|
7
|
-
|
8
|
-
require 'dm-core'
|
9
|
-
require 'dm-validations'
|
10
|
-
require 'dm-timestamps'
|
11
|
-
require 'sinatra/base'
|
12
|
-
|
13
|
-
module <%= name.camelize %>
|
14
|
-
module Log
|
15
|
-
def self.logger
|
16
|
-
if @logger.nil?
|
17
|
-
@logger = Logger.new("<%= name %>.log")
|
18
|
-
@logger.level = Logger::INFO
|
19
|
-
end
|
20
|
-
@logger
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
module OAuth
|
25
|
-
def self.consumer
|
26
|
-
::OAuth::Consumer.new(ENV['<%= name.upcase %>_READKEY'],
|
27
|
-
ENV['<%= name.upcase %>_READSECRET'],
|
28
|
-
{:site => 'http://twitter.com'})
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def self.retryable(options = {}, &block)
|
33
|
-
opts = { :tries => 1, :on => StandardError }.merge(options)
|
34
|
-
retry_exception, retries = opts[:on], opts[:tries]
|
35
|
-
|
36
|
-
begin
|
37
|
-
return yield
|
38
|
-
rescue retry_exception
|
39
|
-
retry if (retries -= 1) > 0
|
40
|
-
end
|
41
|
-
yield
|
42
|
-
end
|
43
|
-
|
44
|
-
def self.app
|
45
|
-
@app ||= Rack::Builder.new do
|
46
|
-
# use Rack::Hoptoad 'mysecretkey'
|
47
|
-
use Rack::Session::Cookie, :key => 'rack.session', :path => '/',
|
48
|
-
:expire_after => 2592000, :secret => '<%= ::Digest::SHA1.hexdigest(Time.now.to_s) %>'
|
49
|
-
run <%= name.camelize %>::App
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
require File.dirname(__FILE__)+'/<%= name %>/app'
|
55
|
-
require File.dirname(__FILE__)+'/<%= name %>/models/user'
|
@@ -1,65 +0,0 @@
|
|
1
|
-
module <%= name.camelize %>
|
2
|
-
class App < Sinatra::Base
|
3
|
-
set :views, File.expand_path(File.join(File.dirname(__FILE__), 'views'))
|
4
|
-
enable :methodoverride
|
5
|
-
|
6
|
-
helpers do
|
7
|
-
def oauth_consumer
|
8
|
-
::<%= name.camelize %>::OAuth.consumer
|
9
|
-
end
|
10
|
-
|
11
|
-
def current_user
|
12
|
-
session[:user_id].nil? ? nil : ::<%= name.camelize %>::User.get(session[:user_id])
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
error do
|
17
|
-
<%= name.camelize %>::Log.logger.info env['sinatra.error'].message
|
18
|
-
<%= name.camelize %>::Log.logger.info env['sinatra.error'].backtrace.join("\n")
|
19
|
-
haml :failed
|
20
|
-
end
|
21
|
-
|
22
|
-
get '/' do
|
23
|
-
haml current_user.nil? ? :about : :home
|
24
|
-
end
|
25
|
-
|
26
|
-
get '/authenticate' do
|
27
|
-
::<%= name.camelize %>.retryable(:times => 2) do
|
28
|
-
request_token = oauth_consumer.get_request_token
|
29
|
-
session[:request_token] = request_token.token
|
30
|
-
session[:request_token_secret] = request_token.secret
|
31
|
-
redirect request_token.authorize_url
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
get '/peace' do
|
36
|
-
session.clear
|
37
|
-
redirect '/'
|
38
|
-
end
|
39
|
-
|
40
|
-
get '/callback' do
|
41
|
-
@request_token = ::OAuth::RequestToken.new(oauth_consumer,
|
42
|
-
session[:request_token],
|
43
|
-
session[:request_token_secret])
|
44
|
-
|
45
|
-
access_token = @request_token.get_access_token
|
46
|
-
|
47
|
-
oauth_response = oauth_consumer.request(:get, '/account/verify_credentials.json',
|
48
|
-
access_token, { :scheme => :query_string })
|
49
|
-
case oauth_response
|
50
|
-
when Net::HTTPSuccess
|
51
|
-
user_info = JSON.parse(oauth_response.body)
|
52
|
-
user = ::<%= name.camelize %>::User.first_or_create(:twitter_id => user_info['id']) # really wish first_or_create behaved sanely
|
53
|
-
user.name, user.avatar = user_info['name'], user_info['profile_image_url']
|
54
|
-
user.token, user.secret = access_token.token, access_token.secret
|
55
|
-
user.url = 'http://twitter.com/'+user_info['screen_name']
|
56
|
-
user.save
|
57
|
-
|
58
|
-
session[:user_id] = user.id
|
59
|
-
redirect '/'
|
60
|
-
else
|
61
|
-
raise ArgumentError.new('Unhandled HTTP Response')
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
@@ -1,38 +0,0 @@
|
|
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, :required => true, :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
|
@@ -1 +0,0 @@
|
|
1
|
-
%h2 Hello There, you little twitterer!
|
File without changes
|
@@ -1,36 +0,0 @@
|
|
1
|
-
class Net::HTTPResponse
|
2
|
-
def body=(content)
|
3
|
-
@body = content
|
4
|
-
@read = true
|
5
|
-
end
|
6
|
-
end
|
7
|
-
|
8
|
-
module <%= name.camelize %>::AppHelpers
|
9
|
-
def app
|
10
|
-
<%= name.camelize %>.app
|
11
|
-
end
|
12
|
-
|
13
|
-
def login_quentin
|
14
|
-
response = Net::HTTPSuccess.new('1.0', 200, nil)
|
15
|
-
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\"}"
|
16
|
-
login(response)
|
17
|
-
end
|
18
|
-
|
19
|
-
def unauthorized_quentin
|
20
|
-
response = Net::HTTPUnauthorized.new('1.0', 401, nil)
|
21
|
-
response.body = "Unauthorized"
|
22
|
-
lambda { login(response) }.should raise_error(ArgumentError)
|
23
|
-
end
|
24
|
-
|
25
|
-
def login(response)
|
26
|
-
token = 'oU5W1XD2TTZhWT6Snfii9JbVBUkJOurCKhWQHz98765'
|
27
|
-
|
28
|
-
consumer = mock('Consumer', {:request => response})
|
29
|
-
request_token = mock('RequestToken', {:get_access_token => mock('AccessToken', {:token => 'foo', :secret => 'bar'})})
|
30
|
-
|
31
|
-
OAuth::Consumer.stub!(:new).and_return(consumer)
|
32
|
-
OAuth::RequestToken.stub!(:new).and_return(request_token)
|
33
|
-
|
34
|
-
visit "/callback?oauth_token=#{token}"
|
35
|
-
end
|
36
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
Bundler.require(:default, :runtime, :test)
|
2
|
-
require File.join(File.dirname(__FILE__), '..', 'lib', '<%= name %>')
|
3
|
-
require 'pp'
|
4
|
-
|
5
|
-
FakeWeb.allow_net_connect = false
|
6
|
-
ENV['<%= name.upcase %>_READKEY'] = /\w{18}/.gen
|
7
|
-
ENV['<%= name.upcase %>_READSECRET'] = /\w{18}/.gen
|
8
|
-
|
9
|
-
require File.dirname(__FILE__)+'/fixtures'
|
10
|
-
require File.dirname(__FILE__)+'/helpers'
|
11
|
-
|
12
|
-
Webrat.configure do |config|
|
13
|
-
config.mode = :rack
|
14
|
-
config.application_port = 4567
|
15
|
-
end
|
16
|
-
|
17
|
-
DataMapper.setup(:default, 'sqlite3::memory:')
|
18
|
-
|
19
|
-
Spec::Runner.configure do |config|
|
20
|
-
config.include(Rack::Test::Methods)
|
21
|
-
config.include(Webrat::Methods)
|
22
|
-
config.include(Webrat::Matchers)
|
23
|
-
config.include(<%= name.camelize %>::AppHelpers)
|
24
|
-
|
25
|
-
config.before(:each) do
|
26
|
-
::<%= name.camelize %>::App.environment = :development
|
27
|
-
DataMapper.auto_migrate!
|
28
|
-
FakeWeb.clean_registry
|
29
|
-
FakeWeb.register_uri(:post, "http://twitter.com:80/oauth/request_token",
|
30
|
-
[{:body => "oauth_token=requestkey&oauth_token_secret=requestsecret", :status => ["200", "OK"]},
|
31
|
-
{:body => "", :status => ["401", "Unauthorized"]},
|
32
|
-
{:body => "", :status => ["403", "Forbidden"]},
|
33
|
-
{:body => "Bad Gateway", :status => ["502", "Bad Gateway"]} ])
|
34
|
-
end
|
35
|
-
|
36
|
-
def app
|
37
|
-
<%= name.camelize %>.app
|
38
|
-
end
|
39
|
-
end
|
@@ -1,59 +0,0 @@
|
|
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
|
@@ -1,90 +0,0 @@
|
|
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 "features/support"
|
23
|
-
m.directory "features/step_definitions"
|
24
|
-
m.directory "lib/#{name}/sinatra"
|
25
|
-
m.directory "lib/#{name}/models"
|
26
|
-
m.directory "lib/#{name}/views"
|
27
|
-
|
28
|
-
# Create stubs
|
29
|
-
m.template "config.ru.erb", "config.ru.example"
|
30
|
-
m.template "lib/templates.rb.erb", "lib/#{name}.rb"
|
31
|
-
m.template "lib/templates/app.rb.erb", "lib/#{name}/app.rb"
|
32
|
-
m.template "lib/templates/models/user.rb.erb", "lib/#{name}/models/user.rb"
|
33
|
-
|
34
|
-
# cucumber stubs
|
35
|
-
m.template "features/support/env.rb.erb", "features/support/env.rb"
|
36
|
-
m.template "features/basics.feature.erb", "features/#{name}.feature"
|
37
|
-
m.template "features/step_definitions/basics.rb.erb", "features/step_definitions/#{name}.rb"
|
38
|
-
|
39
|
-
# rspec stubs
|
40
|
-
m.template "spec/spec_helper.rb.erb", "spec/spec_helper.rb"
|
41
|
-
m.template "spec/helpers.rb.erb", "spec/helpers.rb"
|
42
|
-
m.template "spec/templates_spec.rb.erb", "spec/#{name}_spec.rb"
|
43
|
-
m.template "spec/fixtures.rb.erb", "spec/fixtures.rb"
|
44
|
-
|
45
|
-
%w(LICENSE Rakefile README.md Gemfile).each do |file|
|
46
|
-
m.template file, file
|
47
|
-
end
|
48
|
-
%w(TODO).each do |file|
|
49
|
-
m.file file, file
|
50
|
-
end
|
51
|
-
%w(about failed home).each do |file|
|
52
|
-
m.file "lib/templates/views/#{file}.haml", "lib/#{name}/views/#{file}.haml"
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
protected
|
58
|
-
def banner
|
59
|
-
<<-EOS
|
60
|
-
Creates a simple RubyGems scaffold.
|
61
|
-
|
62
|
-
USAGE: #{spec.name} name --simple"
|
63
|
-
EOS
|
64
|
-
end
|
65
|
-
|
66
|
-
def add_options!(opts)
|
67
|
-
opts.separator ''
|
68
|
-
opts.separator 'Options:'
|
69
|
-
# For each option below, place the default
|
70
|
-
# at the top of the file next to "default_options"
|
71
|
-
# opts.on("-a", "--author=\"Your Name\"", String,
|
72
|
-
# "Some comment about this option",
|
73
|
-
# "Default: none") { |x| options[:author] = x }
|
74
|
-
opts.on("-v", "--version", "Show the #{File.basename($0)} version number and quit.")
|
75
|
-
end
|
76
|
-
|
77
|
-
def extract_options
|
78
|
-
# for each option, extract it into a local variable (and create an "attr_reader :author" at the top)
|
79
|
-
# Templates can access these value via the attr_reader-generated methods, but not the
|
80
|
-
# raw instance variable value.
|
81
|
-
# @author = options[:author]
|
82
|
-
end
|
83
|
-
|
84
|
-
# Installation skeleton. Intermediate directories are automatically
|
85
|
-
# created so don't sweat their absence here.
|
86
|
-
BASEDIRS = %w(
|
87
|
-
lib
|
88
|
-
spec
|
89
|
-
)
|
90
|
-
end
|