sinatra-controllers 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.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