webber 0.0.1

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3888db1d27fb105a47a306b24a3ae5bff249d497
4
+ data.tar.gz: f0db15a22d54d119136f13a3ee83d3e8190179f8
5
+ SHA512:
6
+ metadata.gz: 9440bb58728320c58e3eaef92c09a6a012335c0a841a76a83b714d4d7c94899f28490dee3a1a0094dedf9474ed450ffdf0d0c0453909be5279f871fbdc4824a9
7
+ data.tar.gz: 4d94558137b4c06c0bc1b2cce8b745e3d41bc52ef851daa5ac72271c34ca09a6ec221c4a068323167f2b30cf67e0194f526d8fa0cbaa8d13ce356dcc1832c217
data/bin/hbs ADDED
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ argv = ARGV
4
+
5
+ _cmd = argv.shift
6
+
7
+ # 简单解析命令行参数 启动服务 和 设置环境
8
+
9
+ ENV["start_port"] = "3000"
10
+ ENV["app_env"] = "development"
11
+
12
+ case _cmd
13
+ when "s"
14
+
15
+ while !argv.empty?
16
+ _cmd = argv.shift
17
+ s = argv.shift
18
+ raise "命令#{_cmd}缺少参数" if s.nil?
19
+ case _cmd
20
+ when "-p"
21
+ ENV["start_port"] = s if s =~ /[0-9]+/
22
+ when "-e"
23
+ ENV["app_env"] = s if s =~ /[a-z]+/
24
+ end
25
+ end
26
+ require 'webber'
27
+ Webber::Server.boot!
28
+ when "c"
29
+ require 'irb'
30
+ require 'webber'
31
+
32
+ IRB.start
33
+ else
34
+ p "help"
35
+ end
data/lib/webber.rb ADDED
@@ -0,0 +1,10 @@
1
+ require "webber/version"
2
+ require "webber/server"
3
+
4
+ module Webber
5
+ module_function
6
+ # Your code goes here...
7
+ def hello
8
+ "helloworld"
9
+ end
10
+ end
@@ -0,0 +1,44 @@
1
+ # --------------------------------------------------
2
+ #
3
+ # 路由 简单实现 rails 的方式
4
+ #
5
+ # get "/", "home#index"
6
+ # post "/item/buy", "item#buy"
7
+ # match "/items", "item#new", via: [:get, :post]
8
+ #
9
+ # --------------------------------------------------
10
+ class HRoutes
11
+ @@tables = {}
12
+ class RouteStruct
13
+ attr_reader :controller, :action, :request_methods
14
+ def initialize c,a,m
15
+ @controller,@action,@request_methods = c,a,m
16
+ end
17
+ end
18
+ class << self
19
+ def get *args
20
+ self._parse "get",*args
21
+ end
22
+
23
+ def post *args
24
+ self._parse "get",*args
25
+ end
26
+
27
+ def match *args
28
+ self._parse "match",*args
29
+ end
30
+
31
+ def tables
32
+ @@tables
33
+ end
34
+
35
+ def _parse _m,*args
36
+ _path_info = args[0].to_s
37
+ if args[1] =~ /^(.*)#(.*)$/
38
+ @@tables[_path_info] = RouteStruct.new $1,$2, _m == "match" ? args[2][:via].map(&:to_s) : [_m.to_s]
39
+ else
40
+ raise "routes error!"
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,139 @@
1
+ require 'erb'
2
+ require 'rack'
3
+ require 'json'
4
+ require 'active_record'
5
+
6
+ app_path = File.expand_path('../../../../', __FILE__)
7
+ lib_path = File.expand_path('../../', __FILE__)
8
+ ENV["app_path"] = app_path
9
+ ENV["lib_path"] = lib_path
10
+
11
+ require File.expand_path('./hroutes', File.dirname(__FILE__))
12
+ require File.expand_path('boot', app_path)
13
+
14
+ module Webber
15
+ class Server
16
+ @@instance = nil
17
+ @@server = nil
18
+ def initialize#(&block)
19
+ @port,@env = ENV["start_port"], ENV["app_env"]
20
+ @config = Application.config
21
+ @middlewares = []
22
+ #self.instance_eval(&block)
23
+ # @@instance == self
24
+ end
25
+
26
+ def use(middleware_class,*options, &block)
27
+ @middlewares << lambda {|app| middleware_class.new(app,*options, &block)}
28
+ end
29
+
30
+ def run(app)
31
+ @app = app
32
+ end
33
+
34
+ def to_app
35
+ @middlewares.reverse.inject(@app) { |app, middleware| middleware.call(app)}
36
+ end
37
+
38
+ def load_default_middlewares
39
+ use Rack::ContentLength
40
+ use Rack::ContentType,"text/plain"
41
+
42
+ use Rack::CommonLogger, $stder # => 记录日志
43
+
44
+ use Rack::Chunked # => 分块传输 (很多服务器自动use了该中间件)
45
+
46
+ use Rack::ConditionalGet # => get资源缓存控制
47
+ # use Rack::Etag # => 判断计算url对象是否改变 和 ConditionalGet 中间件一起使用
48
+ use Rack::Deflater # => http 传输内容编码(压缩)
49
+
50
+ use Rack::Head # => RFC2616要求HEAD请求的响应体必须为空这就是Rack::HEAD所做的事情
51
+
52
+ use Rack::MethodOverride # => 用 post 模拟 put 和 delete
53
+ # => 需要表单中加入了一个隐含字段“_method” 把它的值设为“put 或 delete“
54
+ # use Rack::Lint # => 检查请求和响应是否符合Rack规格
55
+
56
+ use Rack::Reloader # => 开发环境用 修改代码不重启服务器
57
+ use Rack::Runtime # => header中加入一个 请求的处理时间 X-Runtime
58
+
59
+ # use Rack::Sendfile # => 传送文件
60
+
61
+ # apps = [lambda {|env| [404, {}, ["File doesn't exists"]]}, lambda {|env| [200, {}, ["I'm ok"]]}]
62
+ # use Rack::Cascade # => 挂载多个应用程序 它会尝试所有这些应用程序,直到某一个应用程序返回的代码不是404
63
+
64
+ # use Rack::Lock # => 不支持多线程框架 将互锁
65
+
66
+ use Rack::Session::Cookie, :key => 'rack.session', # => key, 缺省为 rack.session
67
+ :domain => 'example.com', # => 域名
68
+ :path => '/', # => 路径
69
+ :expire_after => 2592000, # => 过期时间
70
+ :secret => 'any_secret_key' # => cookie 加密
71
+
72
+ # default_options = {
73
+ # :path => '/',
74
+ # :domain => nil,
75
+ # :expire_after => nil,
76
+ # :secure => false,
77
+ # :httponly => true,
78
+ # :defer => false, # => 如果设置defer为true,那么响应头中将不会设置cookie(暂时还不知道有什么用处)
79
+ # :renew => false, # => 如果设置此选项为true,那么在具体的会话管理实现中不应该把原先客户端通过请求发送的session_id,
80
+ # # => 而是每次生成一个新的session_id,并把原先session_id对应的会话数据和这个新的session_id对应。
81
+ # # 注意renew的优先级高于defer,也就是即使defer设置为true,
82
+ # # 只要设置了renew为true,那么cookie也会被写入到响应头中
83
+ # :sidbits => 128 # => 生成的session_id长度为多少个bit, ID类提供了一个实用的generate_sid方法可以供你的具体实现使用
84
+ # }
85
+ # use Rack::Session::Abstract::ID,default_options
86
+
87
+ # default_options = Rack::Session::Abstract::ID::DEFAULT_OPTIONS.merge ({
88
+ # :namespace => 'rack:session', :memcache_server => 'localhost:11211'
89
+ # })
90
+ # use Rack::Session::Memcache, DEFAULT_OPTIONS
91
+ end
92
+ class << self
93
+ def load_middlewares
94
+ @@instance.load_default_middlewares
95
+ end
96
+
97
+ def parse_middlewares env
98
+ request = Rack::Request.new env
99
+ _path_info = request.path_info
100
+ _request_method = request.request_method.downcase
101
+ _route = HRoutes.tables[_path_info.to_s]
102
+
103
+ if _route.nil?
104
+ if !@config["page404"].nil?
105
+ _body = ::ERB.new(File.read(File.expand_path(@config["page404"], ENV["app_path"]))).result
106
+ else
107
+ _body = "page not found"
108
+ end
109
+ [ 404, { "Content-Type" => "text/html" }, [_body] ]
110
+ else
111
+ if _route.request_methods.include?(_request_method)
112
+ _controller = _route.controller
113
+ _action = _route.action
114
+ eval("#{_controller[0].upcase+_controller[1.._controller.size-1]}Controller.method(:#{_action})").call()
115
+ else
116
+ [404,{ "Content-Type" => "text/html" },["page not found"]]
117
+ end
118
+ end
119
+ end
120
+
121
+ def run_middlewares
122
+ @@instance.run method(:parse_middlewares)
123
+ end
124
+
125
+ def boot!
126
+ @@instance = self.new
127
+ load_middlewares
128
+ run_middlewares
129
+ start!
130
+ end
131
+
132
+ def start!
133
+ @@server = Gem.find_files("thin").empty? ? Rack::Handler::WEBrick : Rack::Handler::Thin
134
+ @@server.run @@instance.to_app,:Port => ENV["start_port"]
135
+ end
136
+ end
137
+ end
138
+ end
139
+
@@ -0,0 +1,3 @@
1
+ module Webber
2
+ VERSION = "0.0.1"
3
+ end
metadata ADDED
@@ -0,0 +1,120 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: webber
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - yoshikizh
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-03-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.7'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rack
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: "一个简单的服务器程序"
84
+ email:
85
+ - 177365340@qq.com
86
+ executables:
87
+ - hbs
88
+ extensions: []
89
+ extra_rdoc_files: []
90
+ files:
91
+ - bin/hbs
92
+ - lib/webber.rb
93
+ - lib/webber/hroutes.rb
94
+ - lib/webber/server.rb
95
+ - lib/webber/version.rb
96
+ homepage: ''
97
+ licenses:
98
+ - MIT
99
+ metadata: {}
100
+ post_install_message:
101
+ rdoc_options: []
102
+ require_paths:
103
+ - lib
104
+ required_ruby_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ required_rubygems_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ requirements: []
115
+ rubyforge_project:
116
+ rubygems_version: 2.2.2
117
+ signing_key:
118
+ specification_version: 4
119
+ summary: "一个简单的服务器程序"
120
+ test_files: []