sinatra-scopes 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 +1 -0
- data/README.md +26 -0
- data/Rakefile +25 -0
- data/VERSION +1 -0
- data/example_app.rb +24 -0
- data/examples.rb +20 -0
- data/lib/sinatra/scopes.rb +49 -0
- data/sinatra-scopes.gemspec +51 -0
- metadata +91 -0
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
/pkg
|
data/README.md
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
Sinatra Scopes
|
2
|
+
==============
|
3
|
+
|
4
|
+
Simple scoping for your request handlers. From `example_app.rb`:
|
5
|
+
|
6
|
+
scope :project, '/projects/*' do |project_id|
|
7
|
+
@project = Project[project_id]
|
8
|
+
end
|
9
|
+
|
10
|
+
project.get '/users/*' do |user_id|
|
11
|
+
@user = User[user_id]
|
12
|
+
"#{@project}, #{@user}"
|
13
|
+
end
|
14
|
+
|
15
|
+
Scopes don't have to specify a path pattern:
|
16
|
+
|
17
|
+
scope(:authorized) { auth }
|
18
|
+
|
19
|
+
authorized.get '/sekret/*' do |page|
|
20
|
+
page
|
21
|
+
end
|
22
|
+
|
23
|
+
Similar Implementations
|
24
|
+
-----------------------
|
25
|
+
|
26
|
+
[dcparker](http://github.com/dcparker) - [cilantro/lib/cilantro/controller.rb](http://github.com/dcparker/cilantro/blob/d6adede43e380688349ffecd7189e8a2d2b82df3/lib/cilantro/controller.rb)
|
data/Rakefile
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
begin
|
2
|
+
require 'jeweler'
|
3
|
+
Jeweler::Tasks.new do |s|
|
4
|
+
s.name = "sinatra-scopes"
|
5
|
+
s.homepage = "http://github.com/quackingduck/sinatra-scopes"
|
6
|
+
s.summary = "Simple request handler scoping for sinatra"
|
7
|
+
s.email = "myles@myles.id.au"
|
8
|
+
s.authors = ["Myles Byrne"]
|
9
|
+
|
10
|
+
s.add_dependency 'sinatra', '>= 0.9.4'
|
11
|
+
s.add_development_dependency 'exemplor', '>= 2000.0.0'
|
12
|
+
s.add_development_dependency 'rack-test', '0.4.0'
|
13
|
+
end
|
14
|
+
Jeweler::GemcutterTasks.new
|
15
|
+
rescue LoadError
|
16
|
+
puts "Install jeweler to build gem"
|
17
|
+
end
|
18
|
+
|
19
|
+
task :default => [:test]
|
20
|
+
|
21
|
+
task :examples do
|
22
|
+
ruby "examples.rb"
|
23
|
+
end
|
24
|
+
|
25
|
+
task :test => :examples
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
data/example_app.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'sinatra'
|
2
|
+
require 'sinatra/scopes'
|
3
|
+
|
4
|
+
Project = {'a' => 'Project A', 'b' => 'Project B'}
|
5
|
+
User = {'1' => 'User 1', '2' => 'User 2'}
|
6
|
+
|
7
|
+
scope :project, '/projects/*' do |project_id|
|
8
|
+
@project = Project[project_id]
|
9
|
+
end
|
10
|
+
|
11
|
+
project.get '/users/*' do |user_id|
|
12
|
+
@user = User[user_id]
|
13
|
+
"#{@project}, #{@user}"
|
14
|
+
end
|
15
|
+
|
16
|
+
helpers do
|
17
|
+
def auth; true end
|
18
|
+
end
|
19
|
+
|
20
|
+
scope(:authorized) { auth }
|
21
|
+
|
22
|
+
authorized.get '/sekret/*' do |page|
|
23
|
+
page
|
24
|
+
end
|
data/examples.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
$:.unshift 'lib'
|
2
|
+
require 'example_app'
|
3
|
+
set :environment, :test
|
4
|
+
|
5
|
+
require 'exemplor'
|
6
|
+
require 'rack/test'
|
7
|
+
|
8
|
+
eg.helpers do
|
9
|
+
include Rack::Test::Methods
|
10
|
+
def app; Sinatra::Application end
|
11
|
+
end
|
12
|
+
|
13
|
+
eg "Requesting an action built from a scope" do
|
14
|
+
Check(get('/projects/a/users/2').body).is('Project A, User 2')
|
15
|
+
Check(get('/projects/b/users/1').body).is('Project B, User 1')
|
16
|
+
end
|
17
|
+
|
18
|
+
eg "Scope with no path pattern" do
|
19
|
+
Check(get('/sekret/squirrel').body).is('squirrel')
|
20
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Sinatra
|
2
|
+
|
3
|
+
class Scope
|
4
|
+
|
5
|
+
def initialize(app, pattern, &blk)
|
6
|
+
@app = app
|
7
|
+
@pattern = pattern || ''
|
8
|
+
@block = blk
|
9
|
+
end
|
10
|
+
|
11
|
+
attr_reader :pattern, :block
|
12
|
+
|
13
|
+
def create_action(http_method, pattern, &blk)
|
14
|
+
scope = self
|
15
|
+
@app.send(http_method, scope.pattern + pattern) do |*args|
|
16
|
+
# run the scope block
|
17
|
+
self.instance_exec(*args[0...scope.block.arity], &scope.block)
|
18
|
+
# run the action block
|
19
|
+
self.instance_exec(*args[scope.block.arity..-1], &blk)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def get(pattern, &blk)
|
24
|
+
create_action :get, pattern, &blk
|
25
|
+
end
|
26
|
+
|
27
|
+
def post(pattern, &blk)
|
28
|
+
create_action :post, pattern, &blk
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
module ScopeBuilder
|
34
|
+
|
35
|
+
def scope(name, pattern = nil, &blk)
|
36
|
+
@scopes ||= {}
|
37
|
+
@scopes[name] = Scope.new Sinatra::Application, pattern, &blk
|
38
|
+
end
|
39
|
+
|
40
|
+
# hacky? I can't figure out which object to #define_method on
|
41
|
+
def method_missing(name)
|
42
|
+
return super unless @scopes.has_key? name
|
43
|
+
@scopes[name]
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
register ScopeBuilder
|
49
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{sinatra-scopes}
|
8
|
+
s.version = "0.1.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Myles Byrne"]
|
12
|
+
s.date = %q{2009-11-04}
|
13
|
+
s.email = %q{myles@myles.id.au}
|
14
|
+
s.extra_rdoc_files = [
|
15
|
+
"README.md"
|
16
|
+
]
|
17
|
+
s.files = [
|
18
|
+
".gitignore",
|
19
|
+
"README.md",
|
20
|
+
"Rakefile",
|
21
|
+
"VERSION",
|
22
|
+
"example_app.rb",
|
23
|
+
"examples.rb",
|
24
|
+
"lib/sinatra/scopes.rb",
|
25
|
+
"sinatra-scopes.gemspec"
|
26
|
+
]
|
27
|
+
s.homepage = %q{http://github.com/quackingduck/sinatra-scopes}
|
28
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
29
|
+
s.require_paths = ["lib"]
|
30
|
+
s.rubygems_version = %q{1.3.5}
|
31
|
+
s.summary = %q{Simple request handler scoping for sinatra}
|
32
|
+
|
33
|
+
if s.respond_to? :specification_version then
|
34
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
35
|
+
s.specification_version = 3
|
36
|
+
|
37
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
38
|
+
s.add_runtime_dependency(%q<sinatra>, [">= 0.9.4"])
|
39
|
+
s.add_development_dependency(%q<exemplor>, [">= 2000.0.0"])
|
40
|
+
s.add_development_dependency(%q<rack-test>, ["= 0.4.0"])
|
41
|
+
else
|
42
|
+
s.add_dependency(%q<sinatra>, [">= 0.9.4"])
|
43
|
+
s.add_dependency(%q<exemplor>, [">= 2000.0.0"])
|
44
|
+
s.add_dependency(%q<rack-test>, ["= 0.4.0"])
|
45
|
+
end
|
46
|
+
else
|
47
|
+
s.add_dependency(%q<sinatra>, [">= 0.9.4"])
|
48
|
+
s.add_dependency(%q<exemplor>, [">= 2000.0.0"])
|
49
|
+
s.add_dependency(%q<rack-test>, ["= 0.4.0"])
|
50
|
+
end
|
51
|
+
end
|
metadata
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sinatra-scopes
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Myles Byrne
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-11-04 00:00:00 +11: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.4
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: exemplor
|
27
|
+
type: :development
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 2000.0.0
|
34
|
+
version:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: rack-test
|
37
|
+
type: :development
|
38
|
+
version_requirement:
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - "="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 0.4.0
|
44
|
+
version:
|
45
|
+
description:
|
46
|
+
email: myles@myles.id.au
|
47
|
+
executables: []
|
48
|
+
|
49
|
+
extensions: []
|
50
|
+
|
51
|
+
extra_rdoc_files:
|
52
|
+
- README.md
|
53
|
+
files:
|
54
|
+
- .gitignore
|
55
|
+
- README.md
|
56
|
+
- Rakefile
|
57
|
+
- VERSION
|
58
|
+
- example_app.rb
|
59
|
+
- examples.rb
|
60
|
+
- lib/sinatra/scopes.rb
|
61
|
+
- sinatra-scopes.gemspec
|
62
|
+
has_rdoc: true
|
63
|
+
homepage: http://github.com/quackingduck/sinatra-scopes
|
64
|
+
licenses: []
|
65
|
+
|
66
|
+
post_install_message:
|
67
|
+
rdoc_options:
|
68
|
+
- --charset=UTF-8
|
69
|
+
require_paths:
|
70
|
+
- lib
|
71
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: "0"
|
76
|
+
version:
|
77
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: "0"
|
82
|
+
version:
|
83
|
+
requirements: []
|
84
|
+
|
85
|
+
rubyforge_project:
|
86
|
+
rubygems_version: 1.3.5
|
87
|
+
signing_key:
|
88
|
+
specification_version: 3
|
89
|
+
summary: Simple request handler scoping for sinatra
|
90
|
+
test_files: []
|
91
|
+
|