miron 0.0.1 → 0.0.2

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: 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.