emmy-http 0.1.5 → 0.1.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8ee8be3827495aa336fb2971686ad1cbfa901e53
4
- data.tar.gz: 72d47e9269d8dd829ecb9926260fda5189a91659
3
+ metadata.gz: 0971c78d06be99618226ee14b9eb60c57c5cf535
4
+ data.tar.gz: b6a4c6026afbaab8215cea42689bae329b119555
5
5
  SHA512:
6
- metadata.gz: b22d65f1c793b2ce8b12b16ef64080f65713d7d4b93b7f25eb53d794b41d5c558639422b7ee0d883e72412f96bd79b9fffdcbc4fdc346e686fe4396062d0d84b
7
- data.tar.gz: aba78e417ac83c315bbf118e5e5b990394fdc49979853ded65a37d18d6b9adca5f641762444e3eaab76d87d1b752558d4c6ebda6221d162cd0b133566c5481a3
6
+ metadata.gz: 33f5fc5aafa7d59ba0865dbdd3f2ca2c3c45325bdcfd30244b1c4e8e4170252ae67895f99e2ee061a97a8388a3ffd8a3b7e5583bb59e208f166403cb41586fc0
7
+ data.tar.gz: 6b499296b451a6bac10b39c872c5bd0bae17cd1cf4faf42c8cdbd96677b20fecbc6cccc66ba6fadb1879389ab0d7e1adbf7a16c883239deab79ead719ec9700d
data/Gemfile CHANGED
@@ -2,5 +2,3 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in emmy-http.gemspec
4
4
  gemspec
5
-
6
- gem 'emmy-machine'
data/emmy-http.gemspec CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
8
8
  spec.version = EmmyHttp::VERSION
9
9
  spec.authors = ["inre"]
10
10
  spec.email = ["inre.storm@gmail.com"]
11
- spec.summary = %q{EmmyHttp is a }
11
+ spec.summary = %q{EmmyHttp - EventMachine's HTTP Client}
12
12
  #spec.description = %q{TODO: Write a longer description. Optional.}
13
13
  spec.homepage = ""
14
14
  spec.license = "MIT"
@@ -18,7 +18,8 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- #spec.add_dependency "emmy-machine", "~> 0.1"
21
+ spec.add_dependency "event_object", "~> 0.9.1"
22
+ spec.add_dependency "emmy-machine", "~> 0.1.7"
22
23
  spec.add_dependency "fibre", "~> 0.9.3"
23
24
  spec.add_dependency "util_pack", "~> 0.1"
24
25
  spec.add_dependency "model_pack", "~> 0.9.6"
@@ -1,20 +1,130 @@
1
1
  #
2
2
  # class Google
3
- # include EmmyHttp::Model
4
- # adapter EmmyExtends::EmHttpRequest
5
- # default EmmyHttp::Request.new(
6
- # type: "post",
3
+ # include EmmyHttp::Model
4
+ # adapter EmmyExtends::EmHttpRequest
5
+ # defaults {
7
6
  # headers: {
8
7
  # 'Content-Type' => 'application/json'
9
8
  # }
10
- # )
9
+ # }
10
+ #
11
+ # post ''
11
12
  # end
12
13
  #
13
14
  # google = Google.new(url: 'http://google.com')
14
15
  # response = google.sync
15
16
 
17
+ #
18
+ # module DigitalOcean
19
+ # using EventObject
20
+ # API_TOKEN = "b7d03a6947b217efb6f3ec3bd3504582"
21
+ #
22
+ # class DigitalOcean::Error < StandardError; end
23
+ #
24
+ # class Request
25
+ # include EmmyHttp::Model
26
+ # adapter EmmyHttp::Client::Adapter
27
+ # header 'Content-Type' => 'application/json'
28
+ # header "Authorization: Bearer #{API_TOKEN}"
29
+ #
30
+ # events :success, :error
31
+ #
32
+ # def sync
33
+ # connect
34
+ #
35
+ # Fiber.sync do |f|
36
+ # on :success do |content|
37
+ # f.resume content
38
+ # end
39
+ #
40
+ # on :error do |message|
41
+ # raise DigitalOcean::Error, message
42
+ # end
43
+ # end
44
+ # end
45
+ #
46
+ # def request
47
+ # op = super(
48
+ #
49
+ # ).op
50
+ #
51
+ # op.on :success do |response, operation, conn|
52
+ # success!(response.content)
53
+ # end
54
+ #
55
+ # op.on :error do |message, operation, conn|
56
+ # error!(message)
57
+ # end
58
+ # end
59
+ # end
60
+ #
61
+ #
62
+ # class Droplets < Request
63
+ # get list: '/v2/droplets'
64
+ # post new: '/v2/droplets'
65
+ # get get: '/v2/:id'
66
+ #
67
+ #
68
+ # end
69
+ # end
70
+ require 'singleton'
71
+
16
72
  module EmmyHttp
17
73
  module Model
74
+ using EventObject
75
+
76
+ def self.included(base)
77
+ base.extend ClassMethods
78
+ base.include Singleton
79
+ base.include InstanceMethods
80
+ end
81
+
82
+ module InstanceMethods
83
+ def request
84
+ @request ||= EmmyHttp::Request.new
85
+ end
86
+ end
87
+
88
+ module ClassMethods
89
+ def request(a=nil)
90
+ instance.request.tap { |req| req.update_attributes(a) if a }
91
+ end
92
+
93
+ def adapter(name)
94
+ request.adapter = name
95
+ end
96
+
97
+ def url(uri)
98
+ request.url = uri
99
+ end
100
+
101
+ def defaults(attributes)
102
+ request.update_attributes(attributes)
103
+ end
104
+
105
+ def headers(head)
106
+ request.headers.merge!(head)
107
+ end
108
+
109
+ def raise_error(flag)
110
+ request.raise_error = flag
111
+ end
112
+
113
+ alias header headers
114
+
115
+ EmmyHttp::HTTP_METHODS.each do |name|
116
+ define_method name do |path, as: nil|
117
+ cdef as.to_s do |*a|
118
+ instance.var(as.to_s, request.copy.tap { |r| r.update_attributes(path: path) })
119
+ end
120
+
121
+ cdef "#{as}!" do |*a, &b|
122
+ send(as, *a, &b)
123
+ end
124
+ end
125
+ end
126
+ end
18
127
 
128
+ #<<<
19
129
  end
20
130
  end
@@ -20,6 +20,10 @@ module EmmyHttp
20
20
  @connection ||= EmmyMachine.connect(*self)
21
21
  end
22
22
 
23
+ def reconnect
24
+ EmmyMachine.reconnect(*self)
25
+ end
26
+
23
27
  def sync
24
28
  Fiber.sync do |fiber|
25
29
  # create connection
@@ -42,7 +46,11 @@ module EmmyHttp
42
46
 
43
47
  on :error do |error, operation, conn|
44
48
  # return error as exception
45
- fiber.leave ConnectionError, error.to_s
49
+ if request.raise_error?
50
+ fiber.leave ConnectionError, error.to_s
51
+ else
52
+ fiber.resume nil
53
+ end
46
54
  end
47
55
  end
48
56
  end
@@ -0,0 +1,11 @@
1
+ module EmmyHttp
2
+ refine Kernel do
3
+ def request(*a, &b)
4
+ EmmyHttp.request(*a, &b)
5
+ end
6
+
7
+ def request!(*a, &b)
8
+ EmmyHttp.request!(*a, &b)
9
+ end
10
+ end
11
+ end
@@ -1,24 +1,28 @@
1
1
  module EmmyHttp
2
2
  class Request
3
3
  include ModelPack::Document
4
- extend Forwardable
4
+ using EventObject
5
5
 
6
6
  #def_delegator :operation, :sync, :init, :head, :success, :error, :init!, :head!, :success!, :error!, :to_a
7
7
 
8
- attribute :type, default: "get" # word *method* reserved in ruby
8
+ attribute :type, default: "GET" # word *method* reserved in ruby
9
9
  attribute :url,
10
10
  writer: ->(url) { url.is_a?(URI) ? url : URI.parse(url) },
11
11
  serialize: ->(value) { value.to_s }
12
12
  dictionary :headers
13
13
 
14
+ attribute :path # replace url.path
14
15
  attribute :query # replace url.query
16
+
15
17
  # POST, PUT
16
18
  attribute :body # string, json hash
17
19
  attribute :form # hash form
20
+ attribute :json # serializable hash/object to json
18
21
  attribute :file # path
19
22
 
20
23
  attribute :keep_alive, predicate: true
21
24
  attribute :redirects, default: 6
25
+ attribute :raise_error, predicate: true, default: true
22
26
 
23
27
  object :timeouts, class_name: Timeouts, default: Timeouts
24
28
  object :ssl, class_name: SSL
@@ -27,23 +31,24 @@ module EmmyHttp
27
31
  attribute :adapter,
28
32
  writer: ->(class_name) { class_name.is_a?(String) ? constantize(class_name) : class_name },
29
33
  serialize: ->(value) { value.to_s }
30
- =begin
31
- attribute :response_class,
32
- writer: ->(class_name) { class_name.is_a?(String) ? constantize(class_name) : class_name },
33
- serialize: ->(value) { value.to_s }
34
34
 
35
- def initialize
36
- @response_class = Response
37
- end
38
- =end
39
35
  def operation
40
- @operation ||= EmmyHttp::Operation.new(self, adapter)
36
+ @operation ||= EmmyHttp::Operation.new(self, adapter.new)
41
37
  end
42
38
 
39
+ alias op operation
40
+
43
41
  def sync
44
42
  operation.sync
45
43
  end
46
44
 
45
+ EmmyHttp::HTTP_METHODS.each do |name|
46
+ self.def name do |a={}|
47
+ update_attributes(a.is_a?(String) ? {url: a} : a)
48
+ self
49
+ end
50
+ end
51
+
47
52
  # FIXME: move to model_pack
48
53
  def ssl?
49
54
  !!ssl
@@ -51,6 +56,10 @@ module EmmyHttp
51
56
 
52
57
  private
53
58
 
59
+ def error(message)
60
+ raise RequestError, message
61
+ end
62
+
54
63
  def constantize(class_name)
55
64
  return nil unless /\A(?:::)?([A-Z]\w*(?:::[A-Z]\w*)*)\z/ =~ class_name
56
65
  Object.module_eval("::#{$1}", __FILE__, __LINE__)
@@ -3,26 +3,30 @@ module EmmyHttp
3
3
  using EventObject
4
4
  include ModelPack::Document
5
5
 
6
- attribute :status
6
+ attribute :status, default: 0
7
7
  dictionary :headers, writer: -> (head) { EmmyHttp::Utils.convert_headers(head) }
8
- attribute :body
8
+ attribute :body, default: ''
9
+ attribute :finished, predicate: true#, hidden: true
9
10
 
10
- events :data
11
+ events :data, :done
11
12
 
12
13
  def initialize
13
14
  on :data do |chunk|
14
15
  body << chunk
15
16
  end
16
-
17
- reset
18
17
  end
19
18
 
20
- def reset
19
+ def clear
21
20
  @status = 0
22
21
  @headers = {}
23
22
  @body = ''
24
23
  end
25
24
 
25
+ def finish
26
+ @finished = true
27
+ done!
28
+ end
29
+
26
30
  def chunked_encoding?
27
31
  headers['Transfer-Encoding'] =~ /chunked/i
28
32
  end
@@ -35,12 +39,33 @@ module EmmyHttp
35
39
  headers['Content-Encoding'] =~ /gzip|compressed|deflate/i
36
40
  end
37
41
 
42
+ def content_length?
43
+ headers['Content-Length'] =~ /\A\d+\z/
44
+ end
45
+
46
+ def content_length
47
+ content_length? ? headers['Content-Length'].to_i : nil
48
+ end
49
+
50
+ def content_type
51
+ headers['Content-Type'] =~ /\A([^;]*)/; $1
52
+ end
53
+
38
54
  def location
39
55
  headers['Location']
40
56
  end
41
57
 
42
- def content_length
43
- headers['Content-Length'].to_i
58
+ def content
59
+ @content ||= case content_type
60
+ when 'application/json'
61
+ begin
62
+ JSON.parse(body)
63
+ rescue JSON::ParserError => e
64
+ raise ParserError, e.to_s
65
+ end
66
+ else
67
+ nil
68
+ end
44
69
  end
45
70
 
46
71
  def redirection?
@@ -3,7 +3,7 @@ module EmmyHttp
3
3
  extend self
4
4
 
5
5
  # CONTENT_TYPE becomes Content-Type
6
- def convert_headers(headers)
6
+ def convert_headers(headers)
7
7
  headers.inject({}) { |h, (k, v)|
8
8
  h[k.split(/[_-]/).map { |w| w.downcase.capitalize }.join('-')] = v; h
9
9
  }
@@ -1,3 +1,3 @@
1
1
  module EmmyHttp
2
- VERSION = "0.1.5"
2
+ VERSION = "0.1.6"
3
3
  end
data/lib/emmy_http.rb CHANGED
@@ -3,8 +3,13 @@ require "emmy_http/version"
3
3
  require "forwardable"
4
4
 
5
5
  module EmmyHttp
6
- class ConnectionError < StandardError; end
7
- class TimeoutError < ConnectionError; end
6
+ class HttpError < StandardError; end
7
+ class ParserError < HttpError; end
8
+ class RequestError < HttpError; end
9
+ class ConnectionError < HttpError; end
10
+ class TimeoutError < HttpError; end
11
+
12
+ HTTP_METHODS = %w(get head delete put post patch options)
8
13
 
9
14
  autoload :Adapter, "emmy_http/adapter"
10
15
  autoload :Timeouts, "emmy_http/client/timeouts"
@@ -15,4 +20,15 @@ module EmmyHttp
15
20
  autoload :Response, "emmy_http/response"
16
21
  autoload :Timeout, "emmy_http/timeout"
17
22
  autoload :Utils, "emmy_http/utils"
23
+ autoload :Model, "emmy_http/model"
24
+
25
+ extend self
26
+
27
+ def request(*a)
28
+ EmmyHttp::Request.new(*a).tap { |req| yield(req) if block_given? }
29
+ end
30
+
31
+ def request!(*a)
32
+ request(*a, &b).operation
33
+ end
18
34
  end
@@ -0,0 +1,34 @@
1
+ require "spec_helper"
2
+ require "fakes"
3
+ using Fibre::Synchrony
4
+
5
+ describe EmmyHttp::Model do
6
+
7
+ before do
8
+ stub_const("EmmyMachine", FakeEventMachine)
9
+ end
10
+
11
+ class HTTPBin
12
+ include EmmyHttp::Model
13
+ adapter FakeAdapter
14
+ url "http://httpbin.org"
15
+ header "Content-Type" => "application/json"
16
+
17
+ get '/get', as: :get_request
18
+ post '/post', as: :post_request
19
+ end
20
+
21
+ around do |example|
22
+ EmmyMachine.run_block &example
23
+ end
24
+
25
+ it "have requests from model" do
26
+ res = {
27
+ get_response: HTTPBin.get_request!,
28
+ post_response: HTTPBin.post_request!(form: {a: 5, b: 6})
29
+ }.sync
30
+
31
+ expect(res[:get_response].status).to be(200)
32
+ expect(res[:post_response].status).to be(200)
33
+ end
34
+ end
@@ -1,95 +1,67 @@
1
1
  require "spec_helper"
2
+ require "fakes"
2
3
  using EventObject
4
+ using Fibre::Synchrony
3
5
 
4
6
  describe EmmyHttp do
5
- Connection = EmmyMachine::Connection
6
-
7
- module FakeEventMachine
8
- extend EmmyMachine::ClassMethods
9
-
10
- def connect(adapter, init)
11
- conn = Class.new
12
- conn.extend Connection
13
- init.call
14
- adapter.connected(conn)
15
- conn
16
- end
17
-
18
- extend self
19
- end
20
-
21
- class FakeAdapter
22
- attr_accessor :delegate
23
- include EmmyHttp::Adapter
24
-
25
- def initialize_connection
26
- self.delegate.init! delegate
27
- end
28
-
29
- def connected(conn)
30
- # replace request with timer
31
- EventMachine.add_timer(0) do
32
- response = EmmyHttp::Response.new
33
- response.headers = {'CONTENT_TYPE' => 'text/html'}
34
- response.status = 200
35
- self.delegate.head!(response, delegate, conn)
36
- response.body = "OK"
37
- self.delegate.success!(delegate.response, delegate, conn)
38
- end
39
- end
40
-
41
- def to_a
42
- [self, method(:initialize_connection)]
43
- end
44
- end
7
+ include EmmyHttp
45
8
 
46
9
  before do
47
10
  stub_const("EmmyMachine", FakeEventMachine)
48
11
  end
49
12
 
50
13
  around do |example|
51
- EventMachine.run do
52
- EmmyMachine.fiber_block &example
53
- end
14
+ EmmyMachine.run_block &example
15
+ end
16
+
17
+ it "do http request with fake adapter" do
18
+ request = EmmyHttp::Request.new(
19
+ type: 'get',
20
+ url: 'http://google.com'
21
+ )
22
+ operation = EmmyHttp::Operation.new(request, FakeAdapter.new)
23
+ response = operation.sync
24
+
25
+ expect(response.status).to be 200
26
+ expect(response.headers).to include("Content-Type")
27
+ expect(response.body).to eq "OK"
54
28
  end
55
29
 
56
- it "should do http request with fake adapter" do
57
- begin
58
- request = EmmyHttp::Request.new(
59
- type: 'get',
60
- url: 'http://google.com'
61
- )
62
- operation = EmmyHttp::Operation.new(request, FakeAdapter.new)
63
- response = operation.sync
64
- ensure
65
- EventMachine.stop
66
- end
30
+ it "do http request with short syntax" do
31
+ response = request(adapter: FakeAdapter, raise_error: false).get('http://google.com').sync
67
32
 
33
+ expect(response).to_not be nil
68
34
  expect(response.status).to be 200
69
35
  expect(response.headers).to include("Content-Type")
70
36
  expect(response.body).to eq "OK"
71
37
  end
72
38
 
39
+ it "do async requests" do
40
+ req = request(adapter: FakeAdapter, raise_error: false)
41
+ responses = {
42
+ a: [req.copy.get('http://google.com').op, req.copy.get('http://google.com').op],
43
+ b: req.copy.get('http://google.com')
44
+ }.sync!
45
+
46
+ expect(responses[:a][0].status).to be 200
47
+ expect(responses[:a][1].status).to be 200
48
+ expect(responses[:b].status).to be 200
49
+ end
50
+
73
51
  it "should wait a couple seconds" do
74
- begin
75
- timeout = EmmyHttp::Timeout.new(2)
76
- res = timeout.sync
77
- ensure
78
- EventMachine.stop
79
- end
52
+ timeout = EmmyHttp::Timeout.new(2)
53
+ res = timeout.sync
54
+
80
55
  expect(res).to be true
81
56
  end
82
57
 
83
58
  it "should serialize request" do
84
- begin
85
- request = EmmyHttp::Request.new(
86
- type: 'get',
87
- url: 'http://google.com'
88
- )
89
- request_hash = request.serializable_hash
90
- ensure
91
- EventMachine.stop
92
- end
59
+ request = EmmyHttp::Request.new(
60
+ type: 'get',
61
+ url: 'http://google.com'
62
+ )
63
+ request_hash = request.serializable_hash
64
+
93
65
  expect(request_hash).to include(type: 'get', url: 'http://google.com')
94
66
  end
95
67
  end
data/spec/fakes.rb ADDED
@@ -0,0 +1,40 @@
1
+ Connection = EmmyMachine::Connection
2
+
3
+ module FakeEventMachine
4
+ extend EmmyMachine::ClassMethods
5
+
6
+ def connect(adapter, init)
7
+ conn = Class.new
8
+ conn.extend Connection
9
+ init.call
10
+ adapter.connected(conn)
11
+ conn
12
+ end
13
+
14
+ extend self
15
+ end
16
+
17
+ class FakeAdapter
18
+ attr_accessor :delegate
19
+ include EmmyHttp::Adapter
20
+
21
+ def initialize_connection
22
+ self.delegate.init! delegate
23
+ end
24
+
25
+ def connected(conn)
26
+ # replace request with timer
27
+ EventMachine.add_timer(0) do
28
+ response = EmmyHttp::Response.new
29
+ response.headers = {'Content-Type' => 'text/html'}
30
+ response.status = 200
31
+ self.delegate.head!(response, delegate, conn)
32
+ response.body = "OK"
33
+ self.delegate.success!(delegate.response, delegate, conn)
34
+ end
35
+ end
36
+
37
+ def to_a
38
+ [self, method(:initialize_connection)]
39
+ end
40
+ end
metadata CHANGED
@@ -1,15 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: emmy-http
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - inre
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-14 00:00:00.000000000 Z
11
+ date: 2015-04-19 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: event_object
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.9.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.9.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: emmy-machine
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.1.7
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.1.7
13
41
  - !ruby/object:Gem::Dependency
14
42
  name: fibre
15
43
  requirement: !ruby/object:Gem::Requirement
@@ -114,16 +142,16 @@ files:
114
142
  - lib/emmy_http/client/timeouts.rb
115
143
  - lib/emmy_http/model.rb
116
144
  - lib/emmy_http/operation.rb
145
+ - lib/emmy_http/refines.rb
117
146
  - lib/emmy_http/request.rb
118
147
  - lib/emmy_http/response.rb
119
- - lib/emmy_http/server/options.rb
120
148
  - lib/emmy_http/timeout.rb
121
149
  - lib/emmy_http/utils.rb
122
150
  - lib/emmy_http/version.rb
123
- - pkg/emmy-http-0.1.0.gem
124
- - pkg/emmy-http-0.1.1.gem
151
+ - spec/emmy_http/model_spec.rb
125
152
  - spec/emmy_http/response_spec.rb
126
153
  - spec/emmy_http_spec.rb
154
+ - spec/fakes.rb
127
155
  - spec/spec_helper.rb
128
156
  homepage: ''
129
157
  licenses:
@@ -148,8 +176,10 @@ rubyforge_project:
148
176
  rubygems_version: 2.4.3
149
177
  signing_key:
150
178
  specification_version: 4
151
- summary: EmmyHttp is a
179
+ summary: EmmyHttp - EventMachine's HTTP Client
152
180
  test_files:
181
+ - spec/emmy_http/model_spec.rb
153
182
  - spec/emmy_http/response_spec.rb
154
183
  - spec/emmy_http_spec.rb
184
+ - spec/fakes.rb
155
185
  - spec/spec_helper.rb
@@ -1,19 +0,0 @@
1
- module EmmyHttp
2
- class Server::Options
3
- include ModelPack::Document
4
-
5
- attribute :chdir, default: Dir.pwd
6
- attribute :environment, default: 'development'
7
- atrribute :address, default: '0.0.0.0'
8
- attribute :port, default: 3434
9
- attribute :timeout, default: 30
10
- attribute :pid, default: File.join(Dir.pwd, "tmp/pids/server.log")
11
- attribute :log, default: File.join(Dir.pwd, "log/server.log")
12
- attribute :max_conns, default: 1024
13
- attribute :max_persistent_conns, default: 100
14
- attribute :require default: []
15
- attribute :wait default: 30
16
- attribute :fiberpool_size, default: 20
17
- attribute :daemonize, default: false
18
- end
19
- end
Binary file
Binary file