simple 0.0.0 → 0.1

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ group :development do
6
+ gem 'parka'
7
+ gem 'rake'
8
+ end
9
+
10
+ group :test do
11
+ gem 'rack-test'
12
+ gem 'rspec'
13
+ end
@@ -0,0 +1,49 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ simple (0.1)
5
+ http_router
6
+ rack
7
+
8
+ GEM
9
+ remote: http://rubygems.org/
10
+ specs:
11
+ crack (0.3.1)
12
+ diff-lcs (1.1.3)
13
+ http_router (0.10.2)
14
+ rack (>= 1.0.0)
15
+ url_mount (~> 0.2.1)
16
+ mime-types (1.17.2)
17
+ parka (0.8.0)
18
+ crack (~> 0.3.0)
19
+ psych (~> 1.2.1)
20
+ rest-client (~> 1.6.7)
21
+ thor (~> 0.14.6)
22
+ psych (1.2.2)
23
+ rack (1.4.1)
24
+ rack-test (0.6.1)
25
+ rack (>= 1.0)
26
+ rake (0.9.2.2)
27
+ rest-client (1.6.7)
28
+ mime-types (>= 1.16)
29
+ rspec (2.8.0)
30
+ rspec-core (~> 2.8.0)
31
+ rspec-expectations (~> 2.8.0)
32
+ rspec-mocks (~> 2.8.0)
33
+ rspec-core (2.8.0)
34
+ rspec-expectations (2.8.0)
35
+ diff-lcs (~> 1.1.2)
36
+ rspec-mocks (2.8.0)
37
+ thor (0.14.6)
38
+ url_mount (0.2.1)
39
+ rack
40
+
41
+ PLATFORMS
42
+ ruby
43
+
44
+ DEPENDENCIES
45
+ parka
46
+ rack-test
47
+ rake
48
+ rspec
49
+ simple!
@@ -0,0 +1,91 @@
1
+ # Simple [![TravisCI][travis-img]][travis-ci] [![Dependency Status][gemnasium-img]][gemnasium]
2
+
3
+ [travis-img]: https://secure.travis-ci.org/bry4n/simple.png?branch=master
4
+ [travis-ci]: http://travis-ci.org/bry4n/simple
5
+ [gemnasium-img]: https://gemnasium.com/bry4n/simple.png?travis
6
+ [gemnasium]: https://gemnasium.com/bry4n/simple
7
+
8
+ _Simple web development framework for Ruby._
9
+
10
+ ## Installation
11
+
12
+ **_Notes: Simple is very new and still under development._** Feel free to create ticket and report about bug or improvement or addition.
13
+
14
+
15
+ put this line in your Gemfile
16
+
17
+ gem "simple"
18
+
19
+ or install with `gem` command line
20
+
21
+ gem install bundler
22
+
23
+ ## Features
24
+
25
+ * Built on top of [Rack](https://github.com/rack/rack) and [http_router](https://github.com/joshbuddy/http_router)
26
+ * Insanely small ruby web framework - < 100 LC
27
+ * Blazingly fast [benchmark](https://github.com/bry4n/simple/blob/master/examples/benchmark.log)
28
+ * Inspired by [Sinatra](https://github.com/sinatra/sinatra)
29
+ * Works with [Thin](http://code.macournoyer.com/thin/), [Unicorn](http://unicorn.bogomips.org/), [Pow](http://pow.cx/), [Heroku](http://www.heroku.com/)
30
+ * Easy to write your own Ruby web application.
31
+
32
+ ## Basic Usage
33
+
34
+ The little snippet of the famous hello world web application.
35
+
36
+ ```ruby
37
+ # config.ru
38
+
39
+ require 'simple'
40
+
41
+ class Example < Simple::Base
42
+
43
+ # GET /
44
+ get "/" do
45
+ [200, {"Content-Type" => "text/plain"}, ["Hello World"]]
46
+ end
47
+
48
+ # GET /hello
49
+ get "/:message" do
50
+ # params[:message]
51
+ end
52
+
53
+ # POST /users
54
+ post "/users" do
55
+ # User.create or etc
56
+ end
57
+
58
+ # GET /api/v1/users/online.xml
59
+ namespace :api do
60
+ namespace :v1 do
61
+ get "/users/online" do
62
+ # json/xml output
63
+ end
64
+ end
65
+ end
66
+
67
+ end
68
+
69
+ run Example
70
+ ````
71
+
72
+ This would create a Rack application.
73
+
74
+ ## TODO
75
+
76
+ * Before/After Filters
77
+ * Helpers (Form/Link/etc)
78
+ * Render Templates
79
+ * Rails style router (match "/hi" => "controller#action")
80
+ * And much more.
81
+
82
+ ## Contribution
83
+
84
+ * Fork the project
85
+ * Make your feature addition or bug fix.
86
+ * Add test for it
87
+ * Send me a pull request. Topic branches preferred.
88
+
89
+ ## Copyright
90
+
91
+ Copyright © 2012 Bryan Goines. See LICENSE for details.
@@ -0,0 +1,5 @@
1
+ require 'rspec/core/rake_task'
2
+
3
+ RSpec::Core::RakeTask.new(:spec)
4
+
5
+ task :default => :spec
@@ -0,0 +1,60 @@
1
+ 2-1-2012 - Mac OSX 10.7.2 - 2.4 Ghz Intel Core 2 Duo - 8GB Ram (1067Mhz DRR3) - Ruby 1.9.3 p0 with performance patch (https://gist.github.com/1688857)
2
+
3
+ $ thin -R examples/helloworld.ru start
4
+
5
+ $ ab -kc 30 -t 10 http://0.0.0.0:3000/
6
+
7
+ ---------------------------------------------------------------------------------
8
+ This is ApacheBench, Version 2.3 <$Revision: 1178079 $>
9
+ Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
10
+ Licensed to The Apache Software Foundation, http://www.apache.org/
11
+
12
+ Benchmarking 0.0.0.0 (be patient)
13
+ Completed 5000 requests
14
+ Completed 10000 requests
15
+ Completed 15000 requests
16
+ Completed 20000 requests
17
+ Completed 25000 requests
18
+ Completed 30000 requests
19
+ Completed 35000 requests
20
+ Finished 38698 requests
21
+
22
+
23
+ Server Software: thin
24
+ Server Hostname: 0.0.0.0
25
+ Server Port: 3000
26
+
27
+ Document Path: /
28
+ Document Length: 12 bytes
29
+
30
+ Concurrency Level: 30
31
+ Time taken for tests: 10.000 seconds
32
+ Complete requests: 38698
33
+ Failed requests: 0
34
+ Write errors: 0
35
+ Keep-Alive requests: 38698
36
+ Total transferred: 5611210 bytes
37
+ HTML transferred: 464376 bytes
38
+ Requests per second: 3869.70 [#/sec] (mean)
39
+ Time per request: 7.753 [ms] (mean)
40
+ Time per request: 0.258 [ms] (mean, across all concurrent requests)
41
+ Transfer rate: 547.96 [Kbytes/sec] received
42
+
43
+ Connection Times (ms)
44
+ min mean[+/-sd] median max
45
+ Connect: 0 0 0.0 0 1
46
+ Processing: 1 8 3.0 7 35
47
+ Waiting: 0 8 3.0 7 35
48
+ Total: 1 8 3.0 7 36
49
+
50
+ Percentage of the requests served within a certain time (ms)
51
+ 50% 7
52
+ 66% 8
53
+ 75% 9
54
+ 80% 10
55
+ 90% 12
56
+ 95% 13
57
+ 98% 15
58
+ 99% 16
59
+ 100% 36 (longest request)
60
+ ---------------------------------------------------------------------------------
@@ -0,0 +1,31 @@
1
+ $:.unshift File.expand_path('../lib', __FILE__)
2
+
3
+ require 'simple'
4
+
5
+ class HelloWorld < Simple::Base
6
+
7
+ namespace :api do
8
+ namespace :v1 do
9
+ get "/main" do
10
+ "API!!"
11
+ end
12
+ end
13
+ end
14
+
15
+ resource :say do
16
+ get "/:message" do
17
+ "You said: #{params[:message]}!"
18
+ end
19
+ end
20
+
21
+ get "/" do
22
+ "Hello World!"
23
+ end
24
+
25
+ post "/test" do
26
+ [200, {"content-type" => "text/plain"}, ["test..."]]
27
+ end
28
+
29
+ end
30
+
31
+ run HelloWorld
@@ -0,0 +1,81 @@
1
+ require 'rack'
2
+ require 'http_router'
3
+ require 'simple/core_ext' unless defined?(ActiveSupport)
4
+
5
+ class Simple
6
+ class Base
7
+
8
+ class << self
9
+
10
+ attr_accessor :env, :request
11
+
12
+ def reset!
13
+ @namespace, @env = [], {}
14
+ end
15
+
16
+ def inherited(subclass)
17
+ subclass.reset!
18
+ super
19
+ end
20
+
21
+ def params; _params.merge(env['router.params']); end
22
+ def session; env['rack.session'] ||= {}; end
23
+
24
+ def namespace(path, &blk)
25
+ @namespace.push(path)
26
+ blk.yield
27
+ @namespace.pop
28
+ end
29
+ alias_method :path, :namespace
30
+ alias_method :resource, :namespace
31
+ alias_method :resources, :namespace
32
+ alias_method :segment, :namespace
33
+ alias_method :group, :namespace
34
+
35
+ def get(path, options = {}, &blk); route(:get, path, options, &blk); end
36
+ def post(path, options = {}, &blk); route(:post, path, options, &blk); end
37
+ def put(path, options = {}, &blk); route(:put, path, options, &blk); end
38
+ def delete(path, options = {}, &blk); route(:delete, path, options, &blk); end
39
+ def head(path, options = {}, &blk); route(:head, path, options, &blk); end
40
+
41
+ def call(env)
42
+ @request = Rack::Request.new(env)
43
+ @params = @request.params.symbolize_keys
44
+ return not_found unless router.recognize(env)
45
+ @env = env
46
+ compile_response(env)
47
+ end
48
+
49
+ private
50
+
51
+ def _params
52
+ (env['rack.request.form_hash'] || {}).symbolize_keys.merge (env['rack.request.query_hash'] || {}).symbolize_keys
53
+ end
54
+
55
+ def compile_response(env)
56
+ data = router.call(env)
57
+ return data if data.is_a?(Array)
58
+ response = Rack::Response.new(data, 200)
59
+ response.finish
60
+ end
61
+
62
+ def not_found
63
+ response ||= Rack::Response.new("Not Found", 404)
64
+ response.finish
65
+ end
66
+
67
+ def route(method, path, options = {}, &blk)
68
+ router.send(method.to_sym, @namespace * '/' + path, options) {|env| @env=env; instance_eval(&blk) }
69
+ end
70
+
71
+ def router
72
+ @router ||= HttpRouter.new
73
+ end
74
+
75
+ end
76
+
77
+ end
78
+
79
+ API = Class.new(Base)
80
+
81
+ end
@@ -0,0 +1,8 @@
1
+ class Hash
2
+ def symbolize_keys
3
+ inject({}) do |options, (key, value)|
4
+ options[(key.to_sym rescue key) || key] = value
5
+ options
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,3 @@
1
+ class Simple
2
+ VERSION = "0.1"
3
+ end
Binary file
@@ -0,0 +1,17 @@
1
+ $:.unshift File.expand_path('../lib', __FILE__)
2
+
3
+ require "rubygems"
4
+ require "simple/version"
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "simple"
8
+ gem.version = Simple::VERSION
9
+ gem.author = "Bryan Goines"
10
+ gem.summary = "Simple lightweight web development framework for Ruby"
11
+ gem.email = "bryann83@gmail.com"
12
+ gem.homepage = "http://simplerb.com/"
13
+ gem.files = Dir['**/*']
14
+ # gem.executables = ""
15
+ gem.add_dependency "rack", "~> 1.4.1"
16
+ gem.add_dependency "http_router", "~> 0.10.2"
17
+ end
@@ -0,0 +1,44 @@
1
+ require File.dirname(__FILE__) + "/spec_helper"
2
+
3
+ describe "ExampleApp" do
4
+ include Rack::Test::Methods
5
+
6
+ let(:app) { Example }
7
+
8
+ it "GET /admin/show and then expect 200" do
9
+ get "/admin/show"
10
+ last_response.status.should == 200
11
+ last_response.body.should == "admin"
12
+ end
13
+
14
+ it "GET /hello and then expect 200" do
15
+ get "/hello"
16
+ last_response.status.should == 200
17
+ last_response.body.should == "get"
18
+ end
19
+
20
+ it "GET /blah/404 and then expect 403" do
21
+ get "/blah/404"
22
+ last_response.status.should == 404
23
+ last_response.body.should == "Not Found"
24
+ end
25
+
26
+ it "POST /hello and then expect 200" do
27
+ post "/hello"
28
+ last_response.status.should == 200
29
+ last_response.body.should == "post"
30
+ end
31
+
32
+ it "PUT /hello and then expect 200" do
33
+ put "/hello"
34
+ last_response.status.should == 200
35
+ last_response.body.should == "put"
36
+ end
37
+
38
+ it "DELETE /hello and then expect 200" do
39
+ delete "/hello"
40
+ last_response.status.should == 200
41
+ last_response.body.should == "delete"
42
+ end
43
+
44
+ end
@@ -0,0 +1,36 @@
1
+ $:.unshift File.expand_path('../lib', __FILE__)
2
+
3
+ ENV['RACK_ENV'] ||= "test"
4
+
5
+ require 'simple'
6
+ require 'rack/test'
7
+
8
+ class Example < Simple::Base
9
+
10
+ namespace :admin do
11
+ get "/show" do
12
+ "admin"
13
+ end
14
+ end
15
+
16
+ get '/hello' do
17
+ "get"
18
+ end
19
+
20
+ post "/hello" do
21
+ "post"
22
+ end
23
+
24
+ put "/hello" do
25
+ "put"
26
+ end
27
+
28
+ delete "/hello" do
29
+ "delete"
30
+ end
31
+
32
+ end
33
+
34
+ def session
35
+ last_request.env['rack.session']
36
+ end
metadata CHANGED
@@ -1,95 +1,79 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: simple
3
- version: !ruby/object:Gem::Version
4
- hash: 31
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 0
9
- - 0
10
- version: 0.0.0
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Bryan Goines
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2011-06-14 00:00:00 -05:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
22
- name: thor
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
12
+ date: 2012-02-03 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rack
16
+ requirement: &70265566059960 !ruby/object:Gem::Requirement
25
17
  none: false
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 3
30
- segments:
31
- - 0
32
- version: "0"
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 1.4.1
33
22
  type: :runtime
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
36
- name: rake
37
23
  prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: *70265566059960
25
+ - !ruby/object:Gem::Dependency
26
+ name: http_router
27
+ requirement: &70265566059420 !ruby/object:Gem::Requirement
39
28
  none: false
40
- requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- hash: 3
44
- segments:
45
- - 0
46
- version: "0"
47
- type: :development
48
- version_requirements: *id002
49
- description: " ...\n"
50
- email:
51
- - bryann83@gmail.com
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: 0.10.2
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *70265566059420
36
+ description:
37
+ email: bryann83@gmail.com
52
38
  executables: []
53
-
54
39
  extensions: []
55
-
56
40
  extra_rdoc_files: []
57
-
58
- files: []
59
-
60
- has_rdoc: true
61
- homepage: https://github.com/
41
+ files:
42
+ - examples/benchmark.log
43
+ - examples/helloworld.ru
44
+ - Gemfile
45
+ - Gemfile.lock
46
+ - lib/simple/core_ext.rb
47
+ - lib/simple/version.rb
48
+ - lib/simple.rb
49
+ - pkg/simple-0.1.gem
50
+ - Rakefile
51
+ - README.md
52
+ - simple.gemspec
53
+ - spec/example_spec.rb
54
+ - spec/spec_helper.rb
55
+ homepage: http://simplerb.com/
62
56
  licenses: []
63
-
64
57
  post_install_message:
65
58
  rdoc_options: []
66
-
67
- require_paths:
59
+ require_paths:
68
60
  - lib
69
- required_ruby_version: !ruby/object:Gem::Requirement
61
+ required_ruby_version: !ruby/object:Gem::Requirement
70
62
  none: false
71
- requirements:
72
- - - ">="
73
- - !ruby/object:Gem::Version
74
- hash: 3
75
- segments:
76
- - 0
77
- version: "0"
78
- required_rubygems_version: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ! '>='
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ required_rubygems_version: !ruby/object:Gem::Requirement
79
68
  none: false
80
- requirements:
81
- - - ">="
82
- - !ruby/object:Gem::Version
83
- hash: 3
84
- segments:
85
- - 0
86
- version: "0"
69
+ requirements:
70
+ - - ! '>='
71
+ - !ruby/object:Gem::Version
72
+ version: '0'
87
73
  requirements: []
88
-
89
74
  rubyforge_project:
90
- rubygems_version: 1.6.2
75
+ rubygems_version: 1.8.10
91
76
  signing_key:
92
77
  specification_version: 3
93
- summary: testing..
78
+ summary: Simple lightweight web development framework for Ruby
94
79
  test_files: []
95
-