miron 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0c04dafa4abf1207f7cd2fa1fc8ffd280d67040f
4
- data.tar.gz: c2072ce7cac097d879d82aa31f20decb6e9210d2
3
+ metadata.gz: 0cb072267bfc059dd87476db6a6beeef482d146b
4
+ data.tar.gz: 88d977829876a1ac2c3065b6c077a3dfc5d3cea6
5
5
  SHA512:
6
- metadata.gz: 6f804660f7d397e908d60d0ba7eb252c77b3acd7a85892a081404494d57990a3d83cf4fd324aa590aba8f651c1765ea097c4b2576a8ee46110beb25d4906599a
7
- data.tar.gz: 72654931ca42ee95eb5fddd399e55ec26fa3de7d033f6669c012a1581a7f9cf19ff60588b4f022ac34b329ecdea33d8a9fee722711258fe78667cdf35f2f1a4f
6
+ metadata.gz: 6bcf690d497f18ed1a5c5ea21a934150c09d0e07ae6ef0d63fe05bde31204bb672ce8408a0b9d4037777a62cbdfe148646c04391dfef85441e8ec738c9959129
7
+ data.tar.gz: b73d71624ae079a8fa61d1ca5f3e842dd7a0451b0405b077b37469d9dda83428a0b04ba88d84f34ef1994a81d5e599561e140b538c3d2408f32bb92363ada9f3
data/.gitignore CHANGED
@@ -7,3 +7,4 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+ /rack_stuff
data/.rubocop.yml CHANGED
@@ -1 +1,6 @@
1
+ AllCops:
2
+ Exclude:
3
+ - rack_stuff/**/*
4
+ - tmp/**/*
5
+
1
6
  inherit_from: .rubocop_todo.yml
data/.rubocop_todo.yml CHANGED
@@ -4,6 +4,8 @@ Metrics/AbcSize:
4
4
  Enabled: false
5
5
  Metrics/LineLength:
6
6
  Max: 120
7
+ Metrics/MethodLength:
8
+ Max: 15
7
9
  Style/BracesAroundHashParameters:
8
10
  Enabled: false
9
11
  Style/Documentation:
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
- ### 0.0.1 - Next Release
1
+ ### 0.0.2 - Next Release
2
+ * Add `Miron::Auth::Basic` middleware to allow HTTP Basic authentication - [@maclover7](https://github.com/maclover7).
3
+ * Add `use` to Mironfile.rb to allow adding of middleware - [@maclover7](https://github.com/maclover7).
4
+ * Add Puma HTTP handler - [@maclover7](https://github.com/maclover7).
5
+ * Add Unicorn HTTP handler - [@maclover7](https://github.com/maclover7).
6
+ * Add Thin HTTP handler - [@maclover7](https://github.com/maclover7).
2
7
 
8
+ ### 0.0.1 (9/21/2015)
3
9
  * Initial public release - [@maclover7](https://github.com/maclover7).
4
10
  * Add WEBrick HTTP Handler - [@maclover7](https://github.com/maclover7).
5
- * Your contribution here.
@@ -0,0 +1,50 @@
1
+ module Miron
2
+ module Auth
3
+ class Basic
4
+ attr_reader :request
5
+
6
+ def self.call(request)
7
+ @request = request
8
+ return unauthorized if authorization_key.nil?
9
+ check_auth
10
+ end
11
+
12
+ def self.auth_cleared
13
+ true
14
+ end
15
+
16
+ def self.authorization_key
17
+ authorization_keys = ['HTTP_AUTHORIZATION', 'HTTP_X-HTTP_AUTHORIZATION', 'HTTP_X_HTTP_AUTHORIZATION']
18
+ @authorization_key ||= authorization_keys.detect { |key| @request.key?(key) } || nil
19
+ end
20
+
21
+ def self.bad_request
22
+ Miron::Response.new(400, { 'Content-Type' => 'text/plain', 'Content-Length' => '0' }, '')
23
+ end
24
+
25
+ def self.check_auth
26
+ # Get Auth Scheme and encoded username/password
27
+ auth_key = @request[authorization_key].split(' ', 2)
28
+ scheme = auth_key.first && auth_key.first.downcase
29
+ return bad_request if scheme != 'basic'
30
+
31
+ # Validate credentials
32
+ decrypted_auth_key = auth_key.last.unpack('m*').first.split(/:/, 2)
33
+ if [ENV['MIRON_BAUTH_USERNAME'], ENV['MIRON_BAUTH_PWD']] == decrypted_auth_key
34
+ return auth_cleared
35
+ else
36
+ return unauthorized
37
+ end
38
+ end
39
+
40
+ def self.unauthorized
41
+ Miron::Response.new(401,
42
+ { 'Content-Type' => 'text/plain',
43
+ 'Content-Length' => '0',
44
+ 'WWW-Authenticate' => 'Basic realm="Login"'
45
+ },
46
+ '')
47
+ end
48
+ end
49
+ end
50
+ end
@@ -7,7 +7,7 @@ module Miron
7
7
  ]
8
8
 
9
9
  def initialize(argv)
10
- @mironfile_path = Pathname.pwd + 'Mironfile'
10
+ @mironfile_path = Pathname.pwd + 'Mironfile.rb'
11
11
  super
12
12
  end
13
13
 
@@ -12,10 +12,11 @@ module Miron
12
12
  end
13
13
 
14
14
  def initialize(argv)
15
- @app = Miron::Mironfile.from_dir(Pathname.pwd).app
15
+ @mironfile = Miron::Mironfile.from_dir(Pathname.pwd)
16
16
  @options = {}
17
- @options['port'] = argv.option('port') || '9290'
18
- @options['server'] = argv.option('server')
17
+ @options['port'] = argv.option('port') || 9290
18
+ @options['handler'] = argv.option('handler')
19
+ @options['mironfile_path'] = Pathname.pwd + 'Mironfile'
19
20
  super
20
21
  end
21
22
 
@@ -25,7 +26,7 @@ module Miron
25
26
  end
26
27
 
27
28
  def run
28
- server = Miron::Server.new(@app, @options)
29
+ server = Miron::Server.new(@mironfile, @options)
29
30
  server.start
30
31
  end
31
32
  end
@@ -0,0 +1,55 @@
1
+ require 'puma'
2
+
3
+ module Miron
4
+ class Handler
5
+ class Puma
6
+ def self.run(mironfile, options = {})
7
+ Puma::Proxy.new(mironfile, options)
8
+ end
9
+
10
+ def initialize(mironfile)
11
+ @mironfile = mironfile
12
+ end
13
+
14
+ def call(env)
15
+ # Get response
16
+ miron_request = env
17
+ miron_response = Miron::Request.new(miron_request, @mironfile).fetch_response
18
+ # Process response
19
+ response_http_status = miron_response.http_status
20
+ # Add cookies to headers
21
+ miron_response.cookies.each do |k, v|
22
+ miron_response.headers['Set-Cookie'] = "#{k}=#{v}"
23
+ end
24
+ response_body = [miron_response.body]
25
+ [response_http_status, miron_response.headers, response_body]
26
+ end
27
+
28
+ class Proxy
29
+ def initialize(mironfile, options)
30
+ @mironfile = mironfile
31
+ @options = options
32
+ @serv = ::Puma::Server.new(Puma.new(@mironfile))
33
+ listen(@options['host'], @options['port'].to_i)
34
+ end
35
+
36
+ def stop
37
+ @serv.stop
38
+ end
39
+
40
+ def listen(address, port)
41
+ @serv.add_tcp_listener(address, port)
42
+ @serv.run
43
+ puts "Puma #{::Puma::Const::PUMA_VERSION} starting..."
44
+ puts "* Environment: #{@options['environment']}"
45
+ puts "* Listening on #{@options['host']}:#{@options['port']}"
46
+ begin
47
+ sleep
48
+ rescue Interrupt
49
+ puts '* Shutting down...'
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,53 @@
1
+ require 'thin'
2
+
3
+ module Miron
4
+ class Handler
5
+ class Thin < Thin::Server
6
+ def self.run(mironfile, options = {})
7
+ Thin::Proxy.new(mironfile, options)
8
+ end
9
+
10
+ def initialize(mironfile, *args)
11
+ @mironfile = mironfile
12
+ super
13
+ end
14
+
15
+ def call(env)
16
+ # Get response
17
+ miron_request = env
18
+ miron_response = Miron::Request.new(miron_request, @mironfile).fetch_response
19
+ # Process response
20
+ response_http_status = miron_response.http_status
21
+ # Add cookies to headers
22
+ miron_response.cookies.each do |k, v|
23
+ miron_response.headers['Set-Cookie'] = "#{k}=#{v}"
24
+ end
25
+ response_body = [miron_response.body]
26
+ # Write back to Unicorn
27
+ [response_http_status, miron_response.headers, response_body]
28
+ end
29
+
30
+ def start
31
+ @app = self
32
+ super
33
+ end
34
+
35
+ class Proxy
36
+ def initialize(mironfile, options)
37
+ @mironfile = mironfile
38
+ @options = options
39
+ listen(@options['host'], @options['port'].to_i)
40
+ end
41
+
42
+ def listen(address, port)
43
+ args = [address, port, nil]
44
+ # Thin versions below 0.8.0 do not support additional options
45
+ args.pop if ::Thin::VERSION::MAJOR < 1 && ::Thin::VERSION::MINOR < 8
46
+ server = ::Miron::Handler::Thin.new(@mironfile, *args)
47
+ yield server if block_given?
48
+ server.start
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,59 @@
1
+ require 'unicorn'
2
+
3
+ module Miron
4
+ class Handler
5
+ class Unicorn < Unicorn::HttpServer
6
+ def self.run(mironfile, options = {})
7
+ Unicorn::Proxy.new(mironfile, options)
8
+ end
9
+
10
+ def initialize(mironfile, options)
11
+ @mironfile = mironfile
12
+ super
13
+ end
14
+
15
+ def process_client(socket)
16
+ # Get response
17
+ miron_request = @request.read(socket)
18
+ miron_response = Miron::Request.new(miron_request, @mironfile).fetch_response
19
+ # Process response
20
+ response_http_status = miron_response.http_status
21
+ # Add cookies to headers
22
+ miron_response.cookies.each do |k, v|
23
+ miron_response.headers['Set-Cookie'] = "#{k}=#{v}"
24
+ end
25
+ response_body = [miron_response.body]
26
+ # Write back to Unicorn
27
+ http_response_write(socket, response_http_status, miron_response.headers, response_body)
28
+ unless socket.closed?
29
+ socket.shutdown
30
+ socket.close
31
+ end
32
+ rescue => e
33
+ handle_error(socket, e)
34
+ end
35
+
36
+ class Proxy
37
+ def initialize(mironfile, options)
38
+ @mironfile = mironfile
39
+ @options = options
40
+ listen(@options['host'], @options['port'].to_i)
41
+ end
42
+
43
+ def listen(address, port)
44
+ puts 'Unicorn starting...'
45
+ puts "* Environment: #{@options['environment']}"
46
+ puts "* Listening on #{@options['host']}:#{@options['port']}"
47
+ begin
48
+ ::Miron::Handler::Unicorn.new(@mironfile, {
49
+ listeners: ["#{address}:#{port}"],
50
+ logger: Logger.new(nil)
51
+ }).start.join
52
+ rescue Interrupt
53
+ puts '* Shutting down...'
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -1,29 +1,33 @@
1
1
  require 'webrick'
2
2
  require 'logger'
3
+ require 'stringio'
3
4
 
4
5
  module Miron
5
6
  class Handler
6
7
  class WEBrick < ::WEBrick::HTTPServlet::AbstractServlet
7
- def self.run(app, options = {})
8
- environment = ENV['MIRON_ENV'] || 'development'
9
- default_host = environment == 'development' ? 'localhost' : nil
10
-
11
- options[:BindAddress] = options.delete(:Host) || default_host
8
+ def self.run(mironfile, options = {})
9
+ options[:BindAddress] = options['host']
12
10
  options[:Port] = options['port']
13
11
  @server = ::WEBrick::HTTPServer.new(options)
14
- @server.mount('/', Miron::Handler::WEBrick, app)
12
+ @server.mount('/', Miron::Handler::WEBrick, mironfile)
15
13
  yield @server if block_given?
16
- @server.start
14
+
15
+ begin
16
+ @server.start
17
+ rescue Interrupt
18
+ puts '* Shutting down...'
19
+ end
17
20
  end
18
21
 
19
- def initialize(server, app)
22
+ def initialize(server, mironfile)
20
23
  super server
21
- @app = app
24
+ @mironfile = mironfile
22
25
  end
23
26
 
24
27
  def service(webrick_request, webrick_response)
25
28
  miron_request = webrick_request.meta_vars
26
- miron_response = Miron::Request.new(miron_request, webrick_response, @app).fetch_response
29
+ parse_input_body(webrick_request, miron_request)
30
+ miron_response = Miron::Request.new(miron_request, @mironfile).fetch_response
27
31
 
28
32
  webrick_response.status = miron_response.http_status
29
33
  webrick_response.body << miron_response.body
@@ -32,6 +36,14 @@ module Miron
32
36
  miron_response.body.close if miron_response.body.respond_to?(:close)
33
37
  end
34
38
 
39
+ def parse_input_body(webrick_request, miron_request)
40
+ if webrick_request.body.to_s.nil? || webrick_request.body.to_s.empty?
41
+ miron_request['HTTP_BODY'] = ''
42
+ else
43
+ miron_request['HTTP_BODY'] = ::MultiJson.load(webrick_request.body.to_s)
44
+ end
45
+ end
46
+
35
47
  def shutdown
36
48
  @server.shutdown
37
49
  end
@@ -8,17 +8,19 @@ module Miron
8
8
  # @return [Miron::Mironfile] Returns newly create {Miron::Mironfile}
9
9
  # @return [Nil] If no Mironfile was found in the given dir
10
10
  #
11
- attr_reader :app
11
+ attr_reader :app, :middleware
12
12
 
13
13
  def self.from_dir(dir)
14
- path = dir + 'Mironfile'
15
- mironfile = Mironfile.new do
14
+ path = dir + 'Mironfile.rb'
15
+ mironfile = Mironfile.new(path) do
16
16
  eval(path.read, nil, path.to_s)
17
17
  end
18
18
  mironfile
19
19
  end
20
20
 
21
- def initialize(&block)
21
+ def initialize(mironfile_path, &block)
22
+ require_relative File.expand_path(mironfile_path, __FILE__)
23
+ @middleware = []
22
24
  instance_eval(&block)
23
25
  end
24
26
 
@@ -32,7 +34,38 @@ module Miron
32
34
  #
33
35
  # run Heartbeat
34
36
  def run(app)
35
- @app = app
37
+ @app = app.to_s.gsub!('Miron::Mironfile::', '').constantize
38
+ end
39
+
40
+ # Takes an argument that is an object that responds to #call and returns a {Miron::Response}.
41
+ #
42
+ # class Middle
43
+ # def self.call(request)
44
+ # puts "hello from middle"
45
+ # end
46
+ # end
47
+ #
48
+ # class Heartbeat
49
+ # def self.call(request)
50
+ # Miron::Response.new(200, { "Content-Type" => "text/plain" }, "OK")
51
+ # end
52
+ # end
53
+ #
54
+ # use Middle
55
+ # run Heartbeat
56
+ def use(middleware)
57
+ middleware_string = middleware.to_s
58
+ if middleware_string.include?('Miron::Mironfile::')
59
+ @middleware << middleware_string.gsub!('Miron::Mironfile::', '').constantize
60
+ else
61
+ @middleware << middleware_string.constantize
62
+ end
36
63
  end
37
64
  end
38
65
  end
66
+
67
+ def run(_)
68
+ end
69
+
70
+ def use(_)
71
+ end
data/lib/miron/request.rb CHANGED
@@ -2,27 +2,50 @@ module Miron
2
2
  # Miron::Request allows HTTP responses to be sent.
3
3
  #
4
4
  class Request
5
- attr_reader :miron_request, :miron_response, :app
5
+ attr_reader :request, :mironfile
6
6
 
7
- # @param [Class] miron_request
8
- # Request object (can be an instance of `WEBrick::Request`)
7
+ # @param [Hash] request
8
+ # Request information
9
9
  #
10
- # @param [Class] miron_response
11
- # Response object (can be an instance of `WEBrick::Response`)
10
+ # @param [Mironfile] mironfile
11
+ # Mironfile that has the app and middleware to perform a `.call` on
12
12
  #
13
- # @param [] app
14
- # App to perform a `.call` on
15
- #
16
- def initialize(miron_request, miron_response, app)
17
- @miron_request = miron_request
18
- @miron_response = miron_response
19
- @app = app
13
+ def initialize(request, mironfile)
14
+ @request = request
15
+ @mironfile = mironfile
16
+ @response = Miron::Response.new
17
+ fix_hash_keys
20
18
  end
21
19
 
22
20
  # @return [Response] returns the newly created {Miron::Response}
23
21
  #
24
22
  def fetch_response
25
- @app.call(@miron_request)
23
+ miron_response = nil
24
+ @mironfile.middleware.each do |middleware|
25
+ middleware_response = middleware.call(@request, @response)
26
+ miron_response = middleware_response if middleware_response.is_a?(Miron::Response)
27
+ end
28
+
29
+ return miron_response unless miron_response.nil?
30
+
31
+ app_response = @mironfile.app.call(@request, @response)
32
+ miron_response = app_response if app_response.is_a?(Miron::Response)
33
+ miron_response
34
+ end
35
+
36
+ private
37
+
38
+ # Make request hash keys easier to understand.
39
+ def fix_hash_keys
40
+ # Convert PATH_INFO to PATH
41
+ return unless @request['PATH_INFO']
42
+ @request['PATH'] = @request['PATH_INFO']
43
+ @request.delete('PATH_INFO')
44
+
45
+ # Convert REQUEST_METHOD to HTTP_METHOD
46
+ return unless @request['REQUEST_METHOD']
47
+ @request['HTTP_METHOD'] = @request['REQUEST_METHOD']
48
+ @request.delete('REQUEST_METHOD')
26
49
  end
27
50
  end
28
51
  end
@@ -2,7 +2,7 @@ module Miron
2
2
  # Miron::Reponse allows HTTP responses to be sent.
3
3
  #
4
4
  class Response
5
- attr_reader :http_status, :headers, :body, :cookies
5
+ attr_accessor :http_status, :headers, :body, :cookies
6
6
 
7
7
  # @param [Integer] http_status
8
8
  # the HTTP status code to return
@@ -15,11 +15,11 @@ module Miron
15
15
  #
16
16
  # @return [Response] returns the newly created {Miron::Response}
17
17
  #
18
- def initialize(http_status, headers, body, cookies = {})
19
- @http_status = http_status
20
- @headers = headers
21
- @body = body
22
- @cookies = cookies
18
+ def initialize
19
+ @http_status = 200
20
+ @headers = {}
21
+ @body = ''
22
+ @cookies = {}
23
23
  end
24
24
  end
25
25
  end
data/lib/miron/server.rb CHANGED
@@ -2,31 +2,34 @@ module Miron
2
2
  # Miron::Server allows HTTP responses to be sent.
3
3
  #
4
4
  class Server
5
- attr_reader :app, :options
5
+ attr_reader :mironfile, :options
6
6
  attr_accessor :handler
7
7
 
8
- # @param [String] app
9
- # A String of the mironfile that will be powering the {Miron::Server}
8
+ # @param [Mironfile] mironfile
9
+ # An instance of {Miron::Mironfile} that will be powering the {Miron::Server}
10
10
  #
11
11
  # @param [Hash] options
12
12
  # A Hash of configuration options
13
13
  #
14
- # @return [Response] returns the newly created {Miron::Response}
14
+ # @return [Response] returns the newly created {Miron::Server}
15
15
  #
16
- def initialize(app, options)
17
- @app = app
16
+ def initialize(mironfile, options)
17
+ @mironfile = mironfile
18
18
  @options = options
19
19
  resolve_handler
20
20
  end
21
21
 
22
22
  def start
23
- @handler.run(app, options)
23
+ # Set options defaults and run the handler
24
+ @options['environment'] = ENV['MIRON_ENV'] || 'development'
25
+ @options['host'] = '0.0.0.0'
26
+ @handler.run(@mironfile, @options)
24
27
  end
25
28
 
26
29
  private
27
30
 
28
31
  def resolve_handler
29
- @handler = Miron::Handler.get(options['server'])
32
+ @handler = Miron::Handler.get(@options['handler'])
30
33
  end
31
34
  end
32
35
  end
data/lib/miron/utils.rb CHANGED
@@ -9,7 +9,7 @@ module Miron
9
9
  # @return [Nil] If no Mironfile was found in the given dir
10
10
  #
11
11
  def self.mironfile_in_dir(dir)
12
- mironfile = dir + 'Mironfile'
12
+ mironfile = dir + 'Mironfile.rb'
13
13
  if mironfile.exist?
14
14
  true
15
15
  else
data/lib/miron/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Miron
2
2
  # The version of Miron
3
3
  #
4
- VERSION = '0.0.1'
4
+ VERSION = '0.0.2'
5
5
  end
data/lib/miron.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'pathname'
2
2
  require 'active_support/core_ext/string/strip'
3
3
  require 'active_support/core_ext/string/inflections'
4
+ require 'multi_json'
4
5
 
5
6
  require 'miron/version'
6
7
 
@@ -15,7 +16,14 @@ module Miron
15
16
  autoload :Server, 'miron/server'
16
17
  autoload :Utils, 'miron/utils'
17
18
 
19
+ module Auth
20
+ autoload :Basic, 'miron/auth/basic'
21
+ end
22
+
18
23
  class Handler
24
+ autoload :Puma, 'miron/handlers/puma'
25
+ autoload :Thin, 'miron/handlers/thin'
26
+ autoload :Unicorn, 'miron/handlers/unicorn'
19
27
  autoload :WEBrick, 'miron/handlers/webrick'
20
28
  end
21
29
  end
data/miron.gemspec CHANGED
@@ -21,11 +21,16 @@ Gem::Specification.new do |spec|
21
21
 
22
22
  spec.add_runtime_dependency 'activesupport'
23
23
  spec.add_runtime_dependency 'claide'
24
+ spec.add_runtime_dependency 'multi_json'
24
25
 
25
26
  spec.add_development_dependency 'bundler', '~> 1.10'
27
+ spec.add_development_dependency 'httparty'
26
28
  spec.add_development_dependency 'pry'
29
+ spec.add_development_dependency 'puma'
27
30
  spec.add_development_dependency 'rake', '~> 10.0'
28
31
  spec.add_development_dependency 'rspec'
29
32
  spec.add_development_dependency 'rubocop'
33
+ spec.add_development_dependency 'thin'
34
+ spec.add_development_dependency 'unicorn'
30
35
  spec.add_development_dependency 'yard'
31
36
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: miron
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jon Moss
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-09-21 00:00:00.000000000 Z
11
+ date: 2015-10-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: multi_json
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: bundler
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +66,20 @@ dependencies:
52
66
  - - "~>"
53
67
  - !ruby/object:Gem::Version
54
68
  version: '1.10'
69
+ - !ruby/object:Gem::Dependency
70
+ name: httparty
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'
55
83
  - !ruby/object:Gem::Dependency
56
84
  name: pry
57
85
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +94,20 @@ dependencies:
66
94
  - - ">="
67
95
  - !ruby/object:Gem::Version
68
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: puma
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
69
111
  - !ruby/object:Gem::Dependency
70
112
  name: rake
71
113
  requirement: !ruby/object:Gem::Requirement
@@ -108,6 +150,34 @@ dependencies:
108
150
  - - ">="
109
151
  - !ruby/object:Gem::Version
110
152
  version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: thin
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: unicorn
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
111
181
  - !ruby/object:Gem::Dependency
112
182
  name: yard
113
183
  requirement: !ruby/object:Gem::Requirement
@@ -147,10 +217,14 @@ files:
147
217
  - bin/travis
148
218
  - exe/miron
149
219
  - lib/miron.rb
220
+ - lib/miron/auth/basic.rb
150
221
  - lib/miron/command.rb
151
222
  - lib/miron/command/init.rb
152
223
  - lib/miron/command/server.rb
153
224
  - lib/miron/handler.rb
225
+ - lib/miron/handlers/puma.rb
226
+ - lib/miron/handlers/thin.rb
227
+ - lib/miron/handlers/unicorn.rb
154
228
  - lib/miron/handlers/webrick.rb
155
229
  - lib/miron/mironfile.rb
156
230
  - lib/miron/request.rb
@@ -179,7 +253,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
179
253
  version: '0'
180
254
  requirements: []
181
255
  rubyforge_project:
182
- rubygems_version: 2.4.5.1
256
+ rubygems_version: 2.4.8
183
257
  signing_key:
184
258
  specification_version: 4
185
259
  summary: A redesigned Ruby web interface.