anupom-anobik 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,14 @@
1
+ === 0.0.2 / 2009-05-24
2
+
3
+ * 1 major changes
4
+
5
+ * Guard statements
6
+ * More tests
7
+ * Arrow anti-pattern
8
+
9
+ === 0.0.1 / 2009-05-21
10
+
11
+ * 1 major enhancement
12
+
13
+ * Anobik's Birthday!
14
+
@@ -0,0 +1,8 @@
1
+ test/spec_rack_anobik.rb
2
+ Rakefile
3
+ CHANGELOG.txt
4
+ lib/anobik.rb
5
+ lib/rack/anobik.rb
6
+ anobik-server
7
+ Manifest
8
+ README.rdoc
@@ -0,0 +1,79 @@
1
+ = Anobik
2
+
3
+ * http://github.com/anupom/anobik
4
+
5
+ == DESCRIPTION:
6
+
7
+ Anobik is a simple rack middleware ruby microframework
8
+
9
+ == FEATURES/PROBLEMS:
10
+
11
+ Anobik is a Rack based microframework that provides an easy way to map URL patterns to classes.
12
+ URL patterns can be literal strings or regular expressions.
13
+ when URLs are processed:
14
+ * the beginning and end are anchored (^ $)
15
+ * an optional end slash is added (/?)
16
+ * the i option is added for case-insensitive searches
17
+ * respective class method is called depending on the request method (GET/POST etc.)
18
+
19
+ It does not provide any view templating or database handling mechanism.
20
+ you can ofcourse use any opensource view templating engine or database access layer with it.
21
+ Anobik is very similar to web.py, but it is not a direct clone of web.py.
22
+ It is ofcourse highly inspired by web.py and other similar lightweight microframeworks.
23
+
24
+ Anobik acts as a Rack middleware app and that means you can use it with a
25
+ number of webservers including Thin, LiteSpeed, Phusion Passangeretc.
26
+ And BTW, you can also use it with Rails, Sinatra or any other Rack based frameworks.
27
+
28
+ == SYNOPSIS:
29
+
30
+ * routes.rb
31
+ class Routes
32
+ URLS = {
33
+ "/" => "index",
34
+ "/index/(\\d+)" => "index",
35
+ }
36
+ end
37
+
38
+ * index.rb
39
+ class Index
40
+ def get(id=nil)
41
+ "Hello world from anobik! #{id}"
42
+ end
43
+ end
44
+
45
+ * url
46
+ GET /index/1
47
+
48
+ == REQUIREMENTS:
49
+
50
+ Ruby 1.9 and Rack are the pre-requisites
51
+
52
+ == INSTALL:
53
+
54
+ sudo gem install anobik
55
+
56
+ == LICENSE:
57
+
58
+ (The MIT License)
59
+
60
+ Copyright (c) 2009 syamantics.com
61
+
62
+ Permission is hereby granted, free of charge, to any person obtaining
63
+ a copy of this software and associated documentation files (the
64
+ 'Software'), to deal in the Software without restriction, including
65
+ without limitation the rights to use, copy, modify, merge, publish,
66
+ distribute, sublicense, and/or sell copies of the Software, and to
67
+ permit persons to whom the Software is furnished to do so, subject to
68
+ the following conditions:
69
+
70
+ The above copyright notice and this permission notice shall be
71
+ included in all copies or substantial portions of the Software.
72
+
73
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
74
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
75
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
76
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
77
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
78
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
79
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,15 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'echoe'
4
+
5
+ Echoe.new('anobik', '0.0.2') do |p|
6
+ p.description = "Rack middleware Ruby micro-framework"
7
+ p.url = "http://github.com/anupom/anobik"
8
+ p.author = "Anupom Syam"
9
+ p.email = "anupom.syam@gmail.com"
10
+ p.ignore_pattern = ["nbproject", "tmp"]
11
+ p.development_dependencies = []
12
+ p.runtime_dependencies = ['rack']
13
+ end
14
+
15
+ Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].sort.each
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ ANOBIK_ROOT = "#{File.dirname(File.expand_path(__FILE__))}/" unless defined?(ANOBIK_ROOT)
3
+ require 'rubygems'
4
+ require 'anobik'
5
+ AnobikServer::run
@@ -0,0 +1,34 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{anobik}
5
+ s.version = "0.0.2"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Anupom Syam"]
9
+ s.date = %q{2009-05-24}
10
+ s.description = %q{Rack middleware Ruby micro-framework}
11
+ s.email = %q{anupom.syam@gmail.com}
12
+ s.extra_rdoc_files = ["CHANGELOG.txt", "lib/anobik.rb", "lib/rack/anobik.rb", "README.rdoc"]
13
+ s.files = ["test/spec_rack_anobik.rb", "Rakefile", "CHANGELOG.txt", "lib/anobik.rb", "lib/rack/anobik.rb", "anobik-server", "Manifest", "README.rdoc", "anobik.gemspec"]
14
+ s.has_rdoc = true
15
+ s.homepage = %q{http://github.com/anupom/anobik}
16
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Anobik", "--main", "README.rdoc"]
17
+ s.require_paths = ["lib"]
18
+ s.rubyforge_project = %q{anobik}
19
+ s.rubygems_version = %q{1.3.1}
20
+ s.summary = %q{Rack middleware Ruby micro-framework}
21
+
22
+ if s.respond_to? :specification_version then
23
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
24
+ s.specification_version = 2
25
+
26
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
27
+ s.add_runtime_dependency(%q<rack>, [">= 0"])
28
+ else
29
+ s.add_dependency(%q<rack>, [">= 0"])
30
+ end
31
+ else
32
+ s.add_dependency(%q<rack>, [">= 0"])
33
+ end
34
+ end
@@ -0,0 +1,75 @@
1
+ require 'rack'
2
+ require 'rack/anobik'
3
+ require 'optparse'
4
+
5
+ class AnobikServer
6
+ #
7
+ # Runs the Anobik middleware app
8
+ #
9
+ def self.run
10
+ #partially stolen from Rails
11
+ options = {
12
+ :Port => 3001,
13
+ :Host => "0.0.0.0",
14
+ :detach => false,
15
+ :debugger => false,
16
+ :production => false
17
+ }
18
+
19
+ ARGV.clone.options do |option|
20
+ option.on("-p", "--port=port", Integer,
21
+ "Runs Server on the specified port.", "Default: #{options[:Port]}") { |v| options[:Port] = v }
22
+ option.on("-b", "--binding=ip", String,
23
+ "Binds Server to the specified ip.", "Default: #{options[:Host]}") { |v| options[:Host] = v }
24
+ option.on("-d", "--daemon", "Make server run as a Daemon.") { options[:detach] = true }
25
+ option.on("-x", "--production", "Run the server in production mode.") { options[:production] = true }
26
+ option.on("-u", "--debugger", "Enable rack server debugging.") { options[:debugger] = true }
27
+
28
+ option.separator ""
29
+
30
+ option.on("-h", "--help", "Show this help message.") { puts option.help; exit }
31
+ option.parse!
32
+ end
33
+
34
+ unless server = Rack::Handler.get(ARGV.first) rescue nil
35
+ begin
36
+ server = Rack::Handler::Mongrel
37
+ rescue LoadError => e
38
+ server = Rack::Handler::WEBrick
39
+ end
40
+ end
41
+
42
+ puts "=> Booting with #{server}"
43
+ puts "=> Running in production mode" if options[:production]
44
+ puts "=> Application starting on http://#{options[:Host]}:#{options[:Port]}#{options[:path]}"
45
+
46
+ if options[:detach]
47
+ puts "=> Running as deamon with pid: #{Process.pid}"
48
+ Process.daemon
49
+ else
50
+ puts "=> Call with -d to detach"
51
+ end
52
+
53
+ app = Rack::Builder.new {
54
+ use Rack::CommonLogger if options[:debugger]
55
+ use Rack::ShowExceptions
56
+ use Rack::ShowStatus
57
+ use Rack::Static, :urls => ['/statics']
58
+ use Rack::Anobik, :url => '/', :production => options[:production]
59
+
60
+ run lambda { |env|
61
+ [404, {'Content-Type' => 'text/plain'}, 'Not a Anobik Request :)']
62
+ }
63
+ }.to_app
64
+
65
+ trap(:INT) { exit }
66
+
67
+ puts "=> Ctrl-C to shutdown server"
68
+
69
+ begin
70
+ server.run app, options.merge(:AccessLog => [])
71
+ ensure
72
+ puts "Exiting"
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,159 @@
1
+ module Rack
2
+ #
3
+ # Anobik is a Rack based microframework that provides an easy way to map URL patterns to classes.
4
+ # URL patterns can be literal strings or regular expressions.
5
+ # when URLs are processed:
6
+ # * the beginning and end are anchored (^ $)
7
+ # * an optional end slash is added (/?)
8
+ # * the i option is added for case-insensitive searches
9
+ # * respective class method is called depending on the request method (GET/POST etc.)
10
+ #
11
+ # It does not provide any view templating or database handling mechanism.
12
+ # you can ofcourse use any opensource view templating engine or database access layer with it.
13
+ # Anobik is very similar to web.py, but it is not a direct clone of web.py.
14
+ # It is ofcourse highly inspired by web.py and other similar lightweight microframeworks.
15
+ #
16
+ # Anobik acts as a Rack middleware app and that means you can use it with a
17
+ # number of webservers including Thin, LiteSpeed, Phusion Passangeretc.
18
+ # And BTW, you can also use it with Rails, Sinatra or any other Rack based frameworks.
19
+ #
20
+ # e.g:
21
+ #
22
+ # * routes.rb
23
+ # class Routes
24
+ # URLS = {
25
+ # "/" => "index",
26
+ # "/index/(\\d+)" => "index",
27
+ # }
28
+ # end
29
+ #
30
+ # * index.rb
31
+ # class Index
32
+ # def get (id=nil)
33
+ # "Hello world from web.rb! #{id}"
34
+ # end
35
+ # end
36
+ #
37
+ # * url
38
+ # GET /index/1
39
+ #
40
+ # MIT-License - Anupom Syam
41
+ #
42
+ class Anobik
43
+
44
+ ERR_MESSAGES = {
45
+ :missing_method => "Method %s::#%s not supported",
46
+ :missing_class => "Class %s not found in file %s.rb",
47
+ :missing_file => "File %s.rb missing in directory %s",
48
+ :invalid_path => "URL pattern unknown, Path %s not found",
49
+ :missing_routes_file => "Routes file %s.rb is not present in directory %s",
50
+ :missing_routes_class => "Class %s is missing in routes file %s.rb"
51
+ }
52
+ STATUSES = { :ok => 200, :bad_request => 404}
53
+ ROUTES_FILENAME = 'routes'
54
+
55
+ def initialize app, options
56
+ @app = app
57
+ @url = options[:url] || ''
58
+ @url = '' if @url == '/'
59
+ @production = options[:production]
60
+ $LOAD_PATH << ANOBIK_ROOT
61
+ end
62
+
63
+ def call env
64
+ req = Rack::Request.new(env)
65
+ path = req.path_info
66
+ method = req.request_method
67
+
68
+ @headers = { 'Content-Type' => 'text/html' }
69
+
70
+ #guard statements:
71
+ unless path.index(@url) == 0
72
+ return @app.call(env)
73
+ end
74
+
75
+ begin
76
+ anobik_load ROUTES_FILENAME
77
+ rescue Exception
78
+ return anobik_error(:missing_routes_file, [ROUTES_FILENAME, ANOBIK_ROOT])
79
+ end
80
+
81
+ routes_classname = to_class_name ROUTES_FILENAME
82
+ begin
83
+ raise NameError unless Object.const_get(routes_classname).kind_of? Class
84
+ rescue Exception
85
+ return anobik_error(:missing_routes_class, [routes_classname, ANOBIK_ROOT+ROUTES_FILENAME])
86
+ end
87
+
88
+ begin
89
+ urls = Object.const_get(routes_classname)::URLS
90
+ raise unless urls.kind_of? Hash
91
+ rescue Exception
92
+ urls = { "/" => "index" }
93
+ end
94
+ controller_filename = nil
95
+ matches = nil
96
+ urls.each do |regex, filename|
97
+ matches = path.match(Regexp.new('^' << @url << regex << '/?$', true))
98
+ unless matches.nil?
99
+ controller_filename = filename
100
+ break
101
+ end
102
+ end
103
+
104
+ if controller_filename.nil?
105
+ return anobik_error(:invalid_path, [path])
106
+ end
107
+
108
+ begin
109
+ anobik_load controller_filename
110
+ rescue Exception
111
+ return anobik_error(:missing_file, [controller_filename, ANOBIK_ROOT])
112
+ end
113
+
114
+ controller_classname = to_class_name controller_filename
115
+ begin
116
+ raise NameError unless Object.const_get(controller_classname).kind_of? Class
117
+ rescue Exception
118
+ return anobik_error(:missing_class, [controller_classname, ANOBIK_ROOT+controller_filename])
119
+ end
120
+
121
+ controller = Object.const_get(controller_classname).new
122
+ unless controller.respond_to?(method)
123
+ return anobik_error(:missing_method, [controller_classname, method])
124
+ end
125
+
126
+ body = eval 'controller.' << method <<
127
+ '(' << matches.captures.join(' , ') << ')'
128
+
129
+ [STATUSES[:ok], @headers, body]
130
+ end
131
+
132
+ def to_class_name filename
133
+ #shamelessly copied from Rails
134
+ filename.to_s.gsub(/\/(.?)/) { "::" + $1.upcase }.gsub(/(^|_)(.)/) { $2.upcase }
135
+ end
136
+
137
+ def anobik_error(err, array = [])
138
+ #will be handled by RACK::ShowExceptions
139
+ raise ERR_MESSAGES[err] % array unless @production
140
+ #will be handled by RACK::ShowStatus
141
+ return [STATUSES[:bad_request], @headers, '']
142
+ end
143
+
144
+ def anobik_root
145
+ ANOBIK_ROOT
146
+ end
147
+
148
+ def anobik_load filename
149
+ if (@production)
150
+ require filename
151
+ else
152
+ classname = to_class_name(filename).to_sym
153
+ Object.class_eval { remove_const classname } if Object.const_defined? classname
154
+ Kernel.load filename + '.rb'
155
+ end
156
+ end
157
+
158
+ end
159
+ end
@@ -0,0 +1,248 @@
1
+ require 'test/spec'
2
+
3
+ require 'rack'
4
+ require 'rack/mock'
5
+ require 'rack/anobik'
6
+
7
+ ANOBIK_ROOT = "#{File.dirname(File.expand_path(__FILE__))}/" unless defined?(ANOBIK_ROOT)
8
+
9
+ describe "Rack::Anobik" do
10
+
11
+ class EqualResponse < Test::Spec::CustomShould
12
+ def assumptions(response)
13
+ response.status.should.equal(object[:status])
14
+ response.body.should.match(object[:body])
15
+ end
16
+ end
17
+
18
+ def equal_response(response)
19
+ EqualResponse.new(response)
20
+ end
21
+
22
+ class EqualNotFound < Test::Spec::CustomShould
23
+ def assumptions(response)
24
+ response.status.should.equal(404)
25
+ response.body.should.match('Not Found')
26
+ end
27
+ end
28
+
29
+ def equal_not_found()
30
+ EqualNotFound.new(nil)
31
+ end
32
+
33
+ setup do
34
+ remove_routes_file
35
+ remove_file 'index'
36
+ end
37
+
38
+ it "should return default when non-anobik URL with production" do
39
+ response = anobik_app_production( '/other/').get('/')
40
+ response.should equal_response({:status => 200, :body => 'Not a Anobik Request'})
41
+ end
42
+
43
+ it "should return default when non-anobik url requested with dev" do
44
+ response = anobik_app_dev('/other/').get('/')
45
+ response.should equal_response({:status => 200, :body => 'Not a Anobik Request'})
46
+ end
47
+
48
+ it "should have the same ANOBIK_ROOT" do
49
+ ANOBIK_ROOT.should.equal( Rack::Anobik.new(nil, options('/', false)).anobik_root)
50
+ end
51
+
52
+ it "should return 404 when routes.rb is not present with production" do
53
+ remove_routes_file
54
+ response = anobik_app_production.get('/')
55
+ response.should equal_not_found
56
+ end
57
+
58
+ it "should return 500 when routes.rb is not present with dev" do
59
+ remove_routes_file
60
+ response = anobik_app_dev.get('/')
61
+ response.should equal_response({:status => 500, :body => 'routes.rb ' << 'is not present in directory'})
62
+ end
63
+
64
+ it "should return 404 when Routes class is not defined with production" do
65
+ create_routes_file ''
66
+ response = anobik_app_production.get('/')
67
+ response.should equal_not_found
68
+ remove_routes_file
69
+ end
70
+
71
+ it "should return 500 when Routes class is not defined with dev" do
72
+ create_routes_file ''
73
+ response = anobik_app_dev.get('/')
74
+ response.should equal_response({:status => 500, :body => 'Class Routes ' << 'is missing in routes file'})
75
+ remove_routes_file
76
+ end
77
+
78
+ it "should return 404 when no URL pattern matches with production" do
79
+ create_routes_file "class Routes\nend"
80
+ response = anobik_app_production.get('/unknown/pattern')
81
+ response.should equal_not_found
82
+ remove_routes_file
83
+ end
84
+
85
+ it "should return 500 when no URL pattern matches with dev" do
86
+ create_routes_file "class Routes\nend"
87
+ response =anobik_app_dev.get('/unknown/pattern')
88
+ response.should equal_response({:status => 500, :body => 'URL pattern ' << 'unknown'})
89
+ remove_routes_file
90
+ end
91
+
92
+ it "should return 404 when filename does not exist with production" do
93
+ remove_file 'index'
94
+ create_routes_file "class Routes\nend"
95
+ response = anobik_app_production.get('/')
96
+ response.should equal_not_found
97
+ remove_routes_file
98
+ end
99
+
100
+ it "should return 500 when filename does not exist with dev" do
101
+ remove_file 'index'
102
+ create_routes_file "class Routes\nend"
103
+ response = anobik_app_dev.get('/')
104
+ response.should equal_response({:status => 500, :body => 'missing ' << 'in directory'})
105
+ remove_routes_file
106
+ end
107
+
108
+ it "should return 404 when filename exists but class missing with production" do
109
+ create_routes_file "class Routes\nend"
110
+ create_file 'index', ''
111
+ response = anobik_app_production.get('/')
112
+ response.should equal_not_found
113
+ remove_routes_file
114
+ remove_file 'index'
115
+ end
116
+
117
+ it "should return 500 when filename exists but class missing with dev" do
118
+ create_routes_file "class Routes\nend"
119
+ create_file 'index', ''
120
+ response = anobik_app_dev.get('/')
121
+ response.should equal_response({:status => 500, :body => 'Class Index ' << 'not found in file'})
122
+ remove_routes_file
123
+ remove_file 'index'
124
+ end
125
+
126
+ it "should return 404 when class exists but method missing with production" do
127
+ create_routes_file "class Routes\nend"
128
+ create_file 'index', "class Index\nend"
129
+ response = anobik_app_production.get('/')
130
+ response.should equal_not_found
131
+ remove_routes_file
132
+ remove_file 'index'
133
+ end
134
+
135
+ it "should return 500 when class exists but method missing with dev" do
136
+ create_routes_file "class Routes\nend"
137
+ create_file 'index', "class Index\nend"
138
+ response = anobik_app_dev.get('/')
139
+ response.should equal_response({:status => 500, :body => 'Method Index::#GET ' << 'not supported'})
140
+ remove_routes_file
141
+ remove_file 'index'
142
+ end
143
+
144
+ it "should return 200 for GET when everything's ok" do
145
+ create_routes_file routes_file
146
+ create_file 'index', index_file
147
+ response = anobik_app_dev.get('/')
148
+ response.should equal_response({:status => 200, :body => 'GET_' << 'SUCCESS'})
149
+ remove_routes_file
150
+ remove_file 'index'
151
+ end
152
+
153
+ it "should return 200 when regex is valid" do
154
+ create_routes_file routes_file
155
+ create_file 'index', index_file
156
+ response = anobik_app_dev.get('/index/98')
157
+ response.should equal_response({:status => 200, :body => 'GET_' << 'SUCCESS98'})
158
+ remove_routes_file
159
+ remove_file 'index'
160
+ end
161
+
162
+ xit "should return 200 when root URL is called and index is present" do
163
+ create_routes_file routes_file
164
+ create_file 'index', index_file
165
+ response = anobik_app_dev.get('/')
166
+ response.should equal_response({:status => 200, :body => 'GET_' << 'SUCCESS'})
167
+ remove_routes_file
168
+ remove_file 'index'
169
+ end
170
+
171
+ it "should handle POST data" do
172
+ create_routes_file routes_file
173
+ create_file 'index', index_file
174
+ response = anobik_app_dev.post('/')
175
+ response.should equal_response({:status => 200, :body => 'POST_SUC' << 'CESS'})
176
+ remove_routes_file
177
+ remove_file 'index'
178
+ end
179
+
180
+ xit "should handle DELETE requests" do
181
+ end
182
+
183
+ xit "should handle PUT request" do
184
+ end
185
+
186
+ xit "should handle pseudo-DELETE requests" do
187
+ end
188
+
189
+ xit "should handle pseudo-PUT request" do
190
+ end
191
+
192
+ def anobik_app options
193
+ Rack::Builder.new {
194
+ use Rack::ShowExceptions
195
+ use Rack::ShowStatus
196
+ use Rack::Static, :urls => ['/statics']
197
+ use Rack::Anobik, :url => options[:url], :production => options[:production]
198
+ run lambda { |env|
199
+ [200, { 'Content-Type' => 'text/plain' }, 'Not a Anobik Request :)']
200
+ }
201
+ }.to_app
202
+ end
203
+
204
+ def anobik_app_production anobik_url=nil
205
+ anobik_url = '/' if anobik_url.nil?
206
+ Rack::MockRequest.new(anobik_app options(anobik_url, true))
207
+ end
208
+
209
+ def anobik_app_dev anobik_url=nil
210
+ anobik_url = '/' if anobik_url.nil?
211
+ Rack::MockRequest.new(anobik_app options(anobik_url, false))
212
+ end
213
+
214
+ def options url, production
215
+ { :url => url, :production =>production }
216
+ end
217
+
218
+ def create_routes_file str
219
+ create_file 'routes', str
220
+ end
221
+
222
+ def remove_routes_file
223
+ remove_file 'routes'
224
+ end
225
+
226
+ def create_file filename, str
227
+ ::File.open(ANOBIK_ROOT + filename + '.rb', 'w') {|f| f.write(str) }
228
+ end
229
+
230
+ def remove_file filename
231
+ ::File.delete(ANOBIK_ROOT + filename + '.rb') if ::File.exist?(ANOBIK_ROOT + filename + '.rb')
232
+ end
233
+
234
+ def index_file
235
+ return "class Index\n" <<
236
+ "def GET(id=nil)\n" <<
237
+ "'GET_SUCCESS'<<id.to_s\n" <<
238
+ "end\n" <<
239
+ "def POST()\n" <<
240
+ "'POST_SUCCESS'\n" <<
241
+ "end\n" <<
242
+ "end"
243
+ end
244
+
245
+ def routes_file
246
+ "class Routes\nURLS = {\n'/' => 'index',\n'/index/(\\d+)' => 'index'\n}\nend"
247
+ end
248
+ end
metadata ADDED
@@ -0,0 +1,78 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: anupom-anobik
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Anupom Syam
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-05-24 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rack
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ description: Rack middleware Ruby micro-framework
26
+ email: anupom.syam@gmail.com
27
+ executables: []
28
+
29
+ extensions: []
30
+
31
+ extra_rdoc_files:
32
+ - CHANGELOG.txt
33
+ - lib/anobik.rb
34
+ - lib/rack/anobik.rb
35
+ - README.rdoc
36
+ files:
37
+ - test/spec_rack_anobik.rb
38
+ - Rakefile
39
+ - CHANGELOG.txt
40
+ - lib/anobik.rb
41
+ - lib/rack/anobik.rb
42
+ - anobik-server
43
+ - Manifest
44
+ - README.rdoc
45
+ - anobik.gemspec
46
+ has_rdoc: true
47
+ homepage: http://github.com/anupom/anobik
48
+ post_install_message:
49
+ rdoc_options:
50
+ - --line-numbers
51
+ - --inline-source
52
+ - --title
53
+ - Anobik
54
+ - --main
55
+ - README.rdoc
56
+ require_paths:
57
+ - lib
58
+ required_ruby_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: "0"
63
+ version:
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: "1.2"
69
+ version:
70
+ requirements: []
71
+
72
+ rubyforge_project: anobik
73
+ rubygems_version: 1.2.0
74
+ signing_key:
75
+ specification_version: 2
76
+ summary: Rack middleware Ruby micro-framework
77
+ test_files: []
78
+