sinatra-controllers 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ pkg/*
2
+ *.gem
3
+ .bundle
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source :gemcutter
2
+
3
+ # Specify your gem's dependencies in sinatra-controllers.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,26 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ sinatra-controllers (0.0.3)
5
+ sinatra (>= 1.1.0)
6
+
7
+ GEM
8
+ remote: http://rubygems.org/
9
+ specs:
10
+ minitest (2.0.2)
11
+ rack (1.2.2)
12
+ sinatra (1.2.1)
13
+ rack (~> 1.1)
14
+ tilt (>= 1.2.2, < 2.0)
15
+ tilt (1.2.2)
16
+ watchr (0.7)
17
+
18
+ PLATFORMS
19
+ ruby
20
+
21
+ DEPENDENCIES
22
+ bundler (>= 1.0.0)
23
+ minitest (~> 2.0.0)
24
+ sinatra (>= 1.1.0)
25
+ sinatra-controllers!
26
+ watchr
data/README.rdoc ADDED
@@ -0,0 +1,60 @@
1
+ = Sinatra-controller
2
+
3
+ Sinatra routing done differently. Allows for clean organization across
4
+ multiple sinatra routes files.
5
+
6
+ NOTE: this has only been tested with ruby 1.9.2
7
+
8
+
9
+ == Examples
10
+ Also see the fixtures folders for what's used in the tests.
11
+
12
+ views/index.haml
13
+ <!DOCTYPE HTML>
14
+ %html
15
+ %head
16
+ %meta(http-equiv="content-type" content="text/html; charset=utf-8")
17
+
18
+ %title test page
19
+ %body
20
+ fly away with sinatra controllers
21
+
22
+ You can divide your routes cleanly between as many classes as you please. At
23
+ any time, you can also simply revert back to the plain vanilla sinatra syntax
24
+ on use get at the top level.
25
+
26
+ sinatra\_controller.rb
27
+ #!/usr/bin/env ruby
28
+
29
+ require 'sinatra'
30
+ require 'sinatra-controllers'
31
+
32
+ class Welcome < Sinatra::Controller
33
+ def index
34
+ haml :index
35
+ end
36
+
37
+ # this create a route corresponding to `get '/welcome/about'`
38
+ # making it a shortcut for common routes. It doesn't handle arguments
39
+ # unlike the block syntax.
40
+ def get_about
41
+ 'making controllers in sinatra easy'
42
+ end
43
+ end
44
+
45
+ Sinatra::Controllers.register Welcome do
46
+ get '/', :index
47
+ end
48
+
49
+ This is a trick for common requests that don't require arguments. It creates a
50
+ route corresponding to `get '/welcome/about'` in the flavor of Test::Unit where
51
+ it uses the prefix before the underscore for the route type. The block to
52
+ register is optional here.
53
+
54
+ class Welcome < Sinatra::Controller
55
+ def get_about
56
+ 'making controllers in sinatra easy'
57
+ end
58
+ end
59
+
60
+
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ require 'bundler'
2
+ require 'rake/testtask'
3
+ Bundler::GemHelper.install_tasks
4
+
5
+ Rake::TestTask.new :test do |spec|
6
+ spec.test_files = FileList["test/*_test.rb"]
7
+ end
@@ -0,0 +1,61 @@
1
+ module Sinatra
2
+ class Controller
3
+ attr_accessor :params, :request, :template_cache
4
+ include Sinatra::Templates
5
+ def initialize(params,request)
6
+ @params = params
7
+ @request = request
8
+ @template_cache = Tilt::Cache.new rescue 'sinatra < 1.0'
9
+ @templates = {}
10
+ end
11
+ class << self
12
+ def views
13
+ end
14
+ def templates
15
+ {}
16
+ end
17
+ end
18
+ end
19
+ module Controllers
20
+ class Mapping
21
+ attr_accessor :klass, :opts
22
+
23
+ def initialize(klass,opts={})
24
+ @klass = klass
25
+ @opts = opts
26
+ end
27
+
28
+ def route(verb, path, action, opts={})
29
+ aklass = klass # need this so it will stay in scope for closure
30
+ block = proc { aklass.new(params, request).send action }
31
+ Sinatra::Application.send verb, path, &block
32
+ end
33
+
34
+ def parse
35
+ klass.instance_methods.each do |meth|
36
+ next unless meth =~ /^(get|post|delete|put)_(.*)$/
37
+ route $1,"/#{klass.to_s.downcase}/#{$2.downcase}", meth
38
+ end
39
+ end
40
+
41
+ # why are these even defined?
42
+ undef_method :get, :post, :put, :delete
43
+ def method_missing(method,*a)
44
+ case method.to_s
45
+ when /(get|post|delete|put)/
46
+ route(method, *a)
47
+ else
48
+ super
49
+ end
50
+ end
51
+ end
52
+
53
+ class << self
54
+ def register(klass, opts={}, &block)
55
+ map = Mapping.new(klass,opts)
56
+ map.instance_eval(&block) if block
57
+ map.parse
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,5 @@
1
+ module Sinatra
2
+ module Controllers
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path("../lib/sinatra-controllers/version", __FILE__)
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "sinatra-controllers"
6
+ s.version = Sinatra::Controllers::VERSION
7
+ s.platform = Gem::Platform::RUBY
8
+ s.authors = ['Daniel Bretoi']
9
+ s.email = []
10
+ s.homepage = "http://rubygems.org/gems/sinatra-controllers"
11
+ s.summary = "Adds controllers to Sinatra"
12
+ s.description = "Adds controllers to Sinatra"
13
+
14
+ s.required_rubygems_version = ">= 1.3.6"
15
+ s.rubyforge_project = "sinatra-controllers"
16
+
17
+ s.add_dependency "sinatra", ">= 1.1.0"
18
+ s.add_development_dependency "bundler", ">= 1.0.0"
19
+ s.add_development_dependency "minitest", "~> 2.0.0"
20
+ s.add_development_dependency "watchr"
21
+
22
+ s.files = `git ls-files`.split("\n")
23
+ s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
24
+ s.require_path = 'lib'
25
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
26
+ end
@@ -0,0 +1,129 @@
1
+ require 'rack/test'
2
+ require 'test/unit'
3
+ require 'minitest/autorun'
4
+ require 'ap'
5
+ require './test/fixtures/sinatra_application'
6
+
7
+ class Pride
8
+ def print o
9
+ case o
10
+ when /0 errors/i
11
+ Kernel.print o.green
12
+ when /(e|f)/i
13
+ Kernel.print o.red
14
+ else
15
+ Kernel.print o.green
16
+ end
17
+ end
18
+ def puts o = ''
19
+ if o=~ /([1-9]+ failures)/
20
+ o.sub!(/([1-9]+ failures)/, '\1'.red)
21
+ end
22
+ Kernel.puts o
23
+ end
24
+ end
25
+ MiniTest::Unit.output = Pride.new
26
+
27
+ class ClassicMappingTest < MiniTest::Unit::TestCase
28
+ include Rack::Test::Methods
29
+
30
+ def app
31
+ @app = Sinatra::Application
32
+ @app.set :environment, :test
33
+ @app
34
+ end
35
+
36
+ def test_render
37
+ get '/'
38
+ assert_equal 200, last_response.status
39
+ assert_equal true, (last_response.body =~ /message/) != nil
40
+ end
41
+
42
+ def test_fringe
43
+ get '/fringe'
44
+ assert_equal 200, last_response.status
45
+ assert_equal true, (last_response.body =~ /bishop/) != nil
46
+ assert_equal true, (last_response.body =~ /Anna Torv/) != nil
47
+ end
48
+
49
+ def test_param_pass
50
+ get '/test/232'
51
+ assert_equal 200, last_response.status
52
+ assert_equal true, (last_response.body =~ /232/) != nil
53
+ end
54
+
55
+ def test_help_route
56
+ get '/help'
57
+ assert_equal 200, last_response.status
58
+ end
59
+ def test_help_index
60
+ get '/help/index'
61
+ assert_equal 200, last_response.status
62
+ assert_equal true, (last_response.body =~ /help found/) != nil
63
+ end
64
+
65
+ def test_regular
66
+ get '/regular'
67
+ assert_equal 200, last_response.status
68
+ assert_equal true, (last_response.body =~ /flames/) != nil
69
+ end
70
+
71
+ def test_all
72
+ delete '/all'
73
+ assert_equal 200, last_response.status
74
+ assert_equal true, (last_response.body =~ /wiped/) != nil
75
+ end
76
+
77
+ def test_flame
78
+ put '/flame'
79
+ assert_equal 200, last_response.status
80
+ assert_equal true, (last_response.body =~ /heat/) != nil
81
+ end
82
+
83
+ def test_request
84
+ get '/request'
85
+ assert_equal 200, last_response.status
86
+ assert_equal true, (last_response.body =~ /SCRIPT_NAME/) != nil
87
+ end
88
+
89
+ def test_post
90
+ post '/racket'
91
+ assert_equal 200, last_response.status
92
+ assert_equal true, (last_response.body =~ /posted/) != nil
93
+ end
94
+ def test_arguments
95
+ get '/take/123'
96
+ assert_equal 200, last_response.status
97
+ assert_equal true, (last_response.body =~ /123/) != nil
98
+ end
99
+ end
100
+
101
+ require 'minitest/spec'
102
+ describe "without defined route block" do
103
+ include Rack::Test::Methods
104
+ def app
105
+ @app = Sinatra::Application
106
+ @app.set :environment, :test
107
+ @app
108
+ end
109
+ it "should respond to get" do
110
+ get '/welcome/index'
111
+ last_response.status.must_equal 200
112
+ last_response.body.must_match /route test/
113
+ end
114
+ it "should respond to put" do
115
+ put '/welcome/update'
116
+ last_response.status.must_equal 200
117
+ last_response.body.must_match /walternet/
118
+ end
119
+ it "should respond to post" do
120
+ post '/welcome/peter'
121
+ last_response.status.must_equal 200
122
+ last_response.body.must_match /amber/
123
+ end
124
+ it "should respond to delete" do
125
+ delete '/welcome/universe'
126
+ last_response.status.must_equal 200
127
+ last_response.body.must_match /destroy/
128
+ end
129
+ end
@@ -0,0 +1,86 @@
1
+ require 'sinatra'
2
+ class Sinatra::Application
3
+ def env
4
+ @env.update('SCRIPT_NAME' => '/test')
5
+ end
6
+ end
7
+ require 'sinatra-controllers'
8
+
9
+ class Blah < Sinatra::Controller
10
+ def help
11
+ @blah = 'message' + params.inspect
12
+ haml :foo
13
+ end
14
+ def test
15
+ params.inspect
16
+ end
17
+
18
+ def flames
19
+ 'heat'
20
+ end
21
+
22
+ def requested
23
+ request.inspect
24
+ end
25
+
26
+ def racket
27
+ 'posted'
28
+ end
29
+
30
+ def everything
31
+ 'wiped'
32
+ end
33
+ def fringe
34
+ @fringe = "Anna Torv"
35
+ haml :fringe
36
+ end
37
+ def take
38
+ params[:arg]
39
+ end
40
+ end
41
+
42
+ class Help < Sinatra::Controller
43
+ def help
44
+ 'another help'
45
+ end
46
+ def get_index
47
+ 'help found'
48
+ end
49
+ end
50
+
51
+ class Welcome < Sinatra::Controller
52
+ def get_index
53
+ 'route test'
54
+ end
55
+ def put_update
56
+ 'walternet'
57
+ end
58
+ def post_peter
59
+ 'amber'
60
+ end
61
+ def delete_universe
62
+ 'destroy'
63
+ end
64
+ end
65
+
66
+ Sinatra::Controllers.register(Welcome)
67
+
68
+ Sinatra::Controllers.register(Help) do
69
+ get '/help', :help
70
+ end
71
+
72
+ Sinatra::Controllers.register(Blah) do
73
+ get '/request', :requested
74
+ get '/', :help
75
+ get '/test/:id', :test
76
+ post '/racket', :racket
77
+ put '/flame', :flames
78
+ delete '/all', :everything
79
+ get '/fringe', :fringe
80
+ get '/take/:arg', :take
81
+ end
82
+
83
+ # regular paths should work too
84
+ get '/regular' do
85
+ 'flames'
86
+ end
@@ -0,0 +1,9 @@
1
+ !!!
2
+ %html
3
+ %head
4
+ %meta(http-equiv="content-type" content="text/html; charset=utf-8")
5
+
6
+ %title test
7
+ %body
8
+ test
9
+ =@blah
@@ -0,0 +1,2 @@
1
+ bishop
2
+ = @fringe
data/test/watchr.rb ADDED
@@ -0,0 +1,4 @@
1
+ watch('test/.*_test.*') {|md| system "rake test"}
2
+ watch('test/*') {|md| system "rake test"}
3
+ watch('lib/*') {|md| system "rake test"}
4
+
metadata ADDED
@@ -0,0 +1,140 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sinatra-controllers
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 0
9
+ version: 0.1.0
10
+ platform: ruby
11
+ authors:
12
+ - Daniel Bretoi
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2011-04-02 00:00:00 -07:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: sinatra
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 1
30
+ - 1
31
+ - 0
32
+ version: 1.1.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
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ segments:
44
+ - 1
45
+ - 0
46
+ - 0
47
+ version: 1.0.0
48
+ type: :development
49
+ version_requirements: *id002
50
+ - !ruby/object:Gem::Dependency
51
+ name: minitest
52
+ prerelease: false
53
+ requirement: &id003 !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ~>
57
+ - !ruby/object:Gem::Version
58
+ segments:
59
+ - 2
60
+ - 0
61
+ - 0
62
+ version: 2.0.0
63
+ type: :development
64
+ version_requirements: *id003
65
+ - !ruby/object:Gem::Dependency
66
+ name: watchr
67
+ prerelease: false
68
+ requirement: &id004 !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ segments:
74
+ - 0
75
+ version: "0"
76
+ type: :development
77
+ version_requirements: *id004
78
+ description: Adds controllers to Sinatra
79
+ email: []
80
+
81
+ executables: []
82
+
83
+ extensions: []
84
+
85
+ extra_rdoc_files: []
86
+
87
+ files:
88
+ - .gitignore
89
+ - Gemfile
90
+ - Gemfile.lock
91
+ - README.rdoc
92
+ - Rakefile
93
+ - lib/sinatra-controllers.rb
94
+ - lib/sinatra-controllers/version.rb
95
+ - sinatra-controllers.gemspec
96
+ - test/controller_test.rb
97
+ - test/fixtures/sinatra_application.rb
98
+ - test/fixtures/views/foo.haml
99
+ - test/fixtures/views/fringe.haml
100
+ - test/watchr.rb
101
+ has_rdoc: true
102
+ homepage: http://rubygems.org/gems/sinatra-controllers
103
+ licenses: []
104
+
105
+ post_install_message:
106
+ rdoc_options: []
107
+
108
+ require_paths:
109
+ - lib
110
+ required_ruby_version: !ruby/object:Gem::Requirement
111
+ none: false
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ segments:
116
+ - 0
117
+ version: "0"
118
+ required_rubygems_version: !ruby/object:Gem::Requirement
119
+ none: false
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ segments:
124
+ - 1
125
+ - 3
126
+ - 6
127
+ version: 1.3.6
128
+ requirements: []
129
+
130
+ rubyforge_project: sinatra-controllers
131
+ rubygems_version: 1.3.7
132
+ signing_key:
133
+ specification_version: 3
134
+ summary: Adds controllers to Sinatra
135
+ test_files:
136
+ - test/controller_test.rb
137
+ - test/fixtures/sinatra_application.rb
138
+ - test/fixtures/views/foo.haml
139
+ - test/fixtures/views/fringe.haml
140
+ - test/watchr.rb