rack-app 2.3.1 → 3.0.0.alpha

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: ad8506429f00c8cf61712b58c30ef5e8ebdea569
4
- data.tar.gz: a11ed11e9abf3e00862b7ac95d9311bf946a3e5b
3
+ metadata.gz: ebb99d6cbc443f59e0f17c2d1216ed44ae7d8b5f
4
+ data.tar.gz: cb9d4c1a858802c241c76fcc4ba48c113b06b5e9
5
5
  SHA512:
6
- metadata.gz: 88326c427c07e4086db8861f4e7b762a393cf30ccc570e2bf62c737c1347c4768d8598b60a4d400631f6a60d87f7fbbd28e61b89553521669d99b46b99d4ea37
7
- data.tar.gz: 0c8bbada9d89d67841640a6641743bdbd554c4fcb0d95891daef4226a86f9a94df355d2c203fd8ec5ac7eede97a8df9f94c806cfae21aa7b0fcd1dca5ec72109
6
+ metadata.gz: 6398d60c1909301924d191e4875e81c945c8ec06cd41b3e2158a87744bd2080e1c0a3c9074a7ff6f3cdb3f7e217eefa60976a432259cb7bdfd6f48cb96d1dcae
7
+ data.tar.gz: bb3c51ab85a38d507f685ebe3c7d61f1936f354c0cce2d1009072fa45ca1ee488f583805f75ede3c5c3b22957abeed9a6d6adc42cb73a79ab23185608e51508e
@@ -6,10 +6,13 @@ install:
6
6
  - bundle install
7
7
 
8
8
  rvm:
9
+
9
10
  - 1.8
10
11
  - 1.9
11
- - 2.0
12
- - 2.1
12
+ - 2.0.0
13
+ - 2.1.1
14
+ - 2.1.2
15
+
13
16
  - jruby-18mode
14
17
  - jruby-19mode
15
18
  - ree
@@ -18,13 +21,6 @@ rvm:
18
21
  - jruby-head
19
22
 
20
23
  matrix:
21
- include:
22
-
23
- - rvm: ruby-head
24
- before_install:
25
- - 'gem update --system 2.4.8'
26
-
27
-
28
24
  allow_failures:
29
25
  - rvm: ruby-head
30
26
  - rvm: jruby-head
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.3.1
1
+ 3.0.0.alpha
@@ -7,10 +7,12 @@ class Rack::App
7
7
  require 'rack/app/version'
8
8
  require 'rack/app/constants'
9
9
 
10
+ require 'rack/app/test'
10
11
  require 'rack/app/utils'
11
12
  require 'rack/app/params'
12
13
  require 'rack/app/router'
13
14
  require 'rack/app/endpoint'
15
+ require 'rack/app/extension'
14
16
  require 'rack/app/serializer'
15
17
  require 'rack/app/file_server'
16
18
  require 'rack/app/error_handler'
@@ -1,3 +1,4 @@
1
1
  module Rack::App::Constants
2
- NORMALIZED_REQUEST_PATH = 'NORMALIZED_REQUEST_PATH'
2
+ NORMALIZED_PATH_INFO = 'rack-app.path_info'.freeze
3
+ PATH_PARAMS_MATCHER = 'rack-app.path_params_matcher'.freeze
3
4
  end
@@ -7,7 +7,7 @@ class Rack::App::Endpoint
7
7
  def initialize(properties)
8
8
  @properties = properties
9
9
 
10
- @api_class = properties[:app_class]
10
+ @app_class = properties[:app_class]
11
11
  @error_handler = properties[:error_handler] || Rack::App::ErrorHandler.new
12
12
  @serializer = properties[:serializer] || Rack::App::Serializer.new
13
13
  @headers = properties[:default_headers] || {}
@@ -37,11 +37,11 @@ class Rack::App::Endpoint
37
37
 
38
38
  def get_response_body(rack_request, rack_response)
39
39
 
40
- request_handler = @api_class.new
40
+ request_handler = @app_class.new
41
41
  set_default_headers(rack_response)
42
42
  request_handler.request = rack_request
43
43
  request_handler.response = rack_response
44
- rack_request.env['rack.app.path_params_matcher']= @path_params_matcher.dup
44
+ rack_request.env[::Rack::App::Constants::PATH_PARAMS_MATCHER]= @path_params_matcher.dup
45
45
  return @error_handler.execute_with_error_handling_for(request_handler, @endpoint_method_name)
46
46
 
47
47
  end
@@ -67,7 +67,7 @@ class Rack::App::Endpoint
67
67
 
68
68
  def register_method_to_app_class(proc)
69
69
  method_name = ::Rack::App::Utils.uuid
70
- @api_class.__send__(:define_method, method_name, &proc)
70
+ @app_class.__send__(:define_method, method_name, &proc)
71
71
  return method_name
72
72
  end
73
73
 
@@ -0,0 +1,29 @@
1
+ class Rack::App::Extension
2
+ class << self
3
+
4
+ def includes
5
+ @includes ||= []
6
+ end
7
+
8
+ def extends
9
+ @extends ||= []
10
+ end
11
+
12
+ def inheritances
13
+ @on_inheritances ||= []
14
+ end
15
+
16
+ def include(endpoint_methods_module)
17
+ includes << endpoint_methods_module
18
+ end
19
+
20
+ def extend(app_class_methods_module)
21
+ extends << app_class_methods_module
22
+ end
23
+
24
+ def on_inheritance(&block)
25
+ inheritances << block
26
+ end
27
+
28
+ end
29
+ end
@@ -1,24 +1,26 @@
1
1
  require 'cgi'
2
2
  class Rack::App::Params
3
3
 
4
- def initialize(request_env)
5
- @request_env = request_env
6
- end
7
-
8
4
  def to_hash
9
5
  query_params.merge(request_path_params)
10
6
  end
11
7
 
12
8
  protected
13
9
 
10
+ def initialize(request_env)
11
+ @request_env = request_env
12
+ end
13
+
14
14
  def query_params
15
- CGI.parse(@request_env[Rack::QUERY_STRING].to_s).freeze.reduce({}) do |params_collection, (k, v)|
15
+ raw_cgi_params.reduce({}) do |params_collection, (k, v)|
16
16
 
17
- if v.is_a?(Array) and v.length === 1
17
+ if single_paramter_value?(v)
18
18
  params_collection[k]= v[0]
19
+
19
20
  else
20
21
  k = k.sub(/\[\]$/, '')
21
22
  params_collection[k]= v
23
+
22
24
  end
23
25
 
24
26
  params_collection
@@ -26,6 +28,14 @@ class Rack::App::Params
26
28
  end
27
29
  end
28
30
 
31
+ def single_paramter_value?(v)
32
+ v.is_a?(Array) and v.length === 1
33
+ end
34
+
35
+ def raw_cgi_params
36
+ CGI.parse(@request_env[::Rack::QUERY_STRING].to_s)
37
+ end
38
+
29
39
  def request_path_params
30
40
  path_params = {}
31
41
  path_params.merge!(extract_path_params) unless path_params_matcher.empty?
@@ -40,11 +50,11 @@ class Rack::App::Params
40
50
  end
41
51
 
42
52
  def request_path_parts
43
- Rack::App::Utils.normalize_path(@request_env['REQUEST_PATH']).split('/')
53
+ @request_env[::Rack::App::Constants::NORMALIZED_PATH_INFO].split('/')
44
54
  end
45
55
 
46
56
  def path_params_matcher
47
- @request_env['rack.app.path_params_matcher'] || {}
57
+ @request_env[::Rack::App::Constants::PATH_PARAMS_MATCHER] || {}
48
58
  end
49
59
 
50
60
  end
@@ -3,7 +3,7 @@ module Rack::App::RequestConfigurator
3
3
  extend self
4
4
 
5
5
  def configure(request_env)
6
- request_env[Rack::App::Constants::NORMALIZED_REQUEST_PATH]= Rack::App::Utils.normalize_path(request_env['REQUEST_PATH'])
6
+ request_env[Rack::App::Constants::NORMALIZED_PATH_INFO]= Rack::App::Utils.normalize_path(request_env[::Rack::PATH_INFO])
7
7
  request_env
8
8
  end
9
9
 
@@ -5,13 +5,13 @@ module Rack::App::SingletonMethods
5
5
  require 'rack/app/singleton_methods/mounting'
6
6
  require 'rack/app/singleton_methods/rack_interface'
7
7
  require 'rack/app/singleton_methods/route_handling'
8
- require 'rack/app/singleton_methods/utility'
8
+ require 'rack/app/singleton_methods/settings'
9
9
 
10
10
  include Rack::App::SingletonMethods::HttpMethods
11
11
  include Rack::App::SingletonMethods::Inheritance
12
12
  include Rack::App::SingletonMethods::Mounting
13
13
  include Rack::App::SingletonMethods::RackInterface
14
14
  include Rack::App::SingletonMethods::RouteHandling
15
- include Rack::App::SingletonMethods::Utility
15
+ include Rack::App::SingletonMethods::Settings
16
16
 
17
17
  end
@@ -1,5 +1,7 @@
1
1
  module Rack::App::SingletonMethods::HttpMethods
2
2
 
3
+ protected
4
+
3
5
  def get(path = '/', &block)
4
6
  add_route('GET', path, &block)
5
7
  end
@@ -1,26 +1,28 @@
1
1
  module Rack::App::SingletonMethods::Inheritance
2
2
 
3
- def inherited(klass)
3
+ def on_inheritance(&block)
4
+ @on_inheritance ||= []
5
+ @on_inheritance << block unless block.nil?
6
+ @on_inheritance
7
+ end
8
+
9
+ protected
10
+
11
+ def inherited(child)
4
12
 
5
- klass.serializer(&serializer.logic)
6
- klass.headers.merge!(headers)
7
- klass.middlewares.push(*middlewares)
13
+ child.serializer(&serializer.logic)
14
+ child.headers.merge!(headers)
15
+ child.__send__(:middlewares).push(*middlewares)
8
16
 
9
17
  on_inheritance.each do |block|
10
- block.call(self, klass)
11
- klass.on_inheritance(&block)
18
+ block.call(self, child)
19
+ child.on_inheritance(&block)
12
20
  end
13
21
 
14
22
  error.handlers.each do |ex_class, block|
15
- klass.error(ex_class, &block)
23
+ child.error(ex_class, &block)
16
24
  end
17
25
 
18
26
  end
19
27
 
20
- def on_inheritance(&block)
21
- @on_inheritance ||= []
22
- @on_inheritance << block unless block.nil?
23
- @on_inheritance
24
- end
25
-
26
28
  end
@@ -1,40 +1,35 @@
1
1
  module Rack::App::SingletonMethods::Mounting
2
2
 
3
- def on_mounted(&block)
4
- @on_mounted ||= []
5
- @on_mounted << block unless block.nil?
6
- @on_mounted
7
- end
8
-
9
- alias while_being_mounted on_mounted
10
-
11
3
  def mount(api_class, mount_prop={})
4
+ mount_to_path = ::Rack::App::Utils.deep_dup(mount_prop[:to])
12
5
 
13
6
  unless api_class.is_a?(Class) and api_class <= Rack::App
14
7
  raise(ArgumentError, 'Invalid class given for mount, must be a Rack::App')
15
8
  end
16
9
 
17
- api_class.on_mounted.each do |on_mount|
18
- on_mount.call(self, mount_prop)
10
+ duplication = ::Rack::App::Utils.deep_dup(api_class)
11
+
12
+ duplication.on_mounted.each do |on_mount|
13
+ duplication.instance_exec(mount_prop, &on_mount)
19
14
  end
20
15
 
21
- merge_prop = {:namespaces => [@namespaces, mount_prop[:to]].flatten}
22
- router.merge_router!(api_class.router, merge_prop)
16
+ merge_prop = {:namespaces => [@namespaces, mount_to_path].flatten}
17
+ router.merge_router!(duplication.router, merge_prop)
23
18
 
24
19
  return nil
25
20
  end
26
21
 
27
22
  def mount_directory(directory_path, options={})
28
23
 
29
- directory_full_path = Rack::App::Utils.expand_path(directory_path)
24
+ directory_full_path = ::Rack::App::Utils.expand_path(directory_path)
30
25
 
31
26
  namespace options[:to] do
32
27
 
33
28
  Dir.glob(File.join(directory_full_path, '**', '*')).each do |file_path|
34
29
 
35
30
  request_path = file_path.sub(/^#{Regexp.escape(directory_full_path)}/, '')
36
- get(request_path){ serve_file(file_path) }
37
- options(request_path){ '' }
31
+ get(request_path) { serve_file(file_path) }
32
+ options(request_path) { '' }
38
33
 
39
34
  end
40
35
 
@@ -52,4 +47,14 @@ module Rack::App::SingletonMethods::Mounting
52
47
  @last_description = nil
53
48
  end
54
49
 
50
+ protected
51
+
52
+ def on_mounted(&block)
53
+ @on_mounted ||= []
54
+ @on_mounted << block unless block.nil?
55
+ @on_mounted
56
+ end
57
+
58
+ alias while_being_mounted on_mounted
59
+
55
60
  end
@@ -1,10 +1,12 @@
1
1
  module Rack::App::SingletonMethods::RackInterface
2
2
 
3
+ public
4
+
3
5
  def call(request_env)
4
6
  Rack::App::RequestConfigurator.configure(request_env)
5
7
  endpoint = router.fetch_endpoint(
6
- request_env['REQUEST_METHOD'],
7
- request_env[Rack::App::Constants::NORMALIZED_REQUEST_PATH])
8
+ request_env[::Rack::REQUEST_METHOD],
9
+ request_env[Rack::App::Constants::NORMALIZED_PATH_INFO])
8
10
  endpoint.call(request_env)
9
11
  end
10
12
 
@@ -1,5 +1,11 @@
1
1
  module Rack::App::SingletonMethods::RouteHandling
2
2
 
3
+ def router
4
+ @router ||= Rack::App::Router.new
5
+ end
6
+
7
+ protected
8
+
3
9
  def root(endpoint_path)
4
10
  %W[GET POST PUT DELETE OPTIONS PATCH HEAD].each do |request_method|
5
11
  endpoint = router.fetch_endpoint(request_method, endpoint_path)
@@ -54,8 +60,4 @@ module Rack::App::SingletonMethods::RouteHandling
54
60
  nil
55
61
  end
56
62
 
57
- def router
58
- @router ||= Rack::App::Router.new
59
- end
60
-
61
63
  end
@@ -1,4 +1,6 @@
1
- module Rack::App::SingletonMethods::Utility
1
+ module Rack::App::SingletonMethods::Settings
2
+
3
+ protected
2
4
 
3
5
  def serializer(&definition_how_to_serialize)
4
6
  @serializer ||= Rack::App::Serializer.new
@@ -16,13 +18,17 @@ module Rack::App::SingletonMethods::Utility
16
18
  @headers
17
19
  end
18
20
 
19
- def middlewares(&block)
20
- @middlewares ||= []
21
- @middlewares << block unless block.nil?
22
- @middlewares
23
- end
21
+ def extensions(*extensions)
22
+ extensions.each do |ext|
23
+ if ext.is_a?(::Class) && ext < (::Rack::App::Extension)
24
24
 
25
- alias middleware middlewares
25
+ ext.includes.each { |m| include(m) }
26
+ ext.extends.each { |m| extend(m) }
27
+ ext.inheritances.each { |block| on_inheritance(&block) }
28
+
29
+ end
30
+ end
31
+ end
26
32
 
27
33
  def error(*exception_classes, &block)
28
34
  @error_handler ||= Rack::App::ErrorHandler.new
@@ -33,4 +39,14 @@ module Rack::App::SingletonMethods::Utility
33
39
  return @error_handler
34
40
  end
35
41
 
42
+ private
43
+
44
+ def middlewares(&block)
45
+ @middlewares ||= []
46
+ @middlewares << block unless block.nil?
47
+ @middlewares
48
+ end
49
+
50
+ alias middleware middlewares
51
+
36
52
  end
@@ -3,54 +3,24 @@ require 'rack/app'
3
3
  module Rack::App::Test
4
4
 
5
5
  require 'rack/app/test/utils'
6
+ require 'rack/app/test/singleton_methods'
6
7
 
7
8
  def self.included(klass)
8
- klass.__send__(:extend,SpecHelpers)
9
+ klass.__send__(:extend, self::SingletonMethods)
9
10
  end
10
11
 
11
- module SpecHelpers
12
+ attr_reader :last_response
12
13
 
13
- def rack_app(*args,&constructor)
14
-
15
- begin
16
- let(:rack_app){ rack_app_by(*args,&constructor) }
17
- rescue NoMethodError
18
- define_method(:rack_app) do
19
- rack_app_by(*args,&constructor)
20
- end
21
- end
22
-
23
- end
24
-
25
- end
14
+ [:get, :post, :put, :delete, :options, :patch].each do |request_method|
15
+ define_method(request_method) do |*args|
26
16
 
27
- def rack_app_by(*args,&constructor)
28
- subject_app = nil
29
- rack_app_class = args.shift
17
+ properties = args.select { |e| e.is_a?(Hash) }.reduce({}, &:merge!)
18
+ url = args.select { |e| e.is_a?(String) }.first || properties.delete(:url)
19
+ request = Rack::MockRequest.new(rack_app)
20
+ env = Rack::App::Test::Utils.env_by(properties)
30
21
 
31
- if constructor.nil?
32
- subject_app = rack_app_class
33
- else
34
- subject_app = Class.new(rack_app_class || Rack::App)
35
- subject_app.class_eval(&constructor)
36
- end
22
+ return @last_response = request.__send__(request_method, url, env)
37
23
 
38
- subject_app
39
- end
40
-
41
- [:get, :post, :put, :delete, :options, :patch].each do |request_method|
42
- define_method(request_method) do |properties|
43
- properties ||= Hash.new
44
- url = properties.delete(:url)
45
- request_env = Rack::App::Test::Utils.request_env_by(request_method, url, properties)
46
- raw_response = rack_app.call(request_env)
47
-
48
- body = []
49
- raw_response[2].each do |e|
50
- body << e
51
- end
52
-
53
- return Rack::Response.new(body,raw_response[0],raw_response[1])
54
24
  end
55
25
  end
56
26
 
@@ -0,0 +1,15 @@
1
+ module Rack::App::Test::SingletonMethods
2
+
3
+ def rack_app(*args, &constructor)
4
+
5
+ begin
6
+ let(:rack_app) { Rack::App::Test::Utils.rack_app_by(*args, &constructor) }
7
+ rescue NoMethodError
8
+ define_method(:rack_app) do
9
+ rack_app_by(*args, &constructor)
10
+ end
11
+ end
12
+
13
+ end
14
+
15
+ end
@@ -1,4 +1,5 @@
1
1
  module Rack::App::Test::Utils
2
+
2
3
  extend self
3
4
 
4
5
  def format_properties(properties)
@@ -9,48 +10,47 @@ module Rack::App::Test::Utils
9
10
  properties
10
11
  end
11
12
 
12
- def request_env_by(request_method, url, raw_properties)
13
+ def rack_app_by(*args, &constructor)
14
+ subject_app = nil
13
15
 
14
- properties = format_properties(raw_properties)
15
- additional_headers = properties[:headers].reduce({}) { |m, (k, v)| m.merge("HTTP_#{k.to_s.gsub('-', '_').upcase}" => v.to_s) }
16
+ rack_app_class = args.shift
16
17
 
17
- payload = raw_properties.delete(:payload)
18
+ if constructor.nil?
19
+ subject_app = rack_app_class
20
+ else
21
+ subject_app = Class.new(rack_app_class || ::Rack::App)
22
+ subject_app.class_eval(&constructor)
23
+ end
18
24
 
19
- io = case payload
25
+ subject_app
26
+ end
20
27
 
21
- when IO
22
- payload
28
+ def env_by(properties)
23
29
 
24
- when String
25
- StringIO.new(payload.to_s)
30
+ properties = format_properties(properties)
31
+ env = properties[:headers].reduce({}) { |m, (k, v)| m.merge("HTTP_#{k.to_s.gsub('-', '_').upcase}" => v.to_s) }
32
+ payload = properties.delete(:payload)
33
+ env["rack.input"]= ::Rack::Lint::InputWrapper.new(string_io_for(payload))
34
+ env[::Rack::QUERY_STRING]= encode_www_form(properties[:params].to_a)
35
+ env.merge!(properties[:env] || {})
26
36
 
27
- else
28
- StringIO.new('')
29
37
 
30
- end
38
+ env
39
+ end
40
+
41
+ def string_io_for(payload)
42
+ case payload
31
43
 
32
- additional_headers["rack.input"]= ::Rack::Lint::InputWrapper.new(io)
44
+ when IO
45
+ payload
33
46
 
34
- {
35
- "REMOTE_ADDR" => "192.168.56.1",
36
- "REQUEST_METHOD" => request_method.to_s.upcase,
37
- "REQUEST_PATH" => url,
38
- "REQUEST_URI" => url,
39
- "PATH_INFO" => url,
40
- "SERVER_PROTOCOL" => "HTTP/1.1",
41
- "CONTENT_LENGTH" => "0",
42
- "CONTENT_TYPE" => "application/x-www-form-urlencoded",
43
- "SERVER_NAME" => "hds-dev.ett.local",
44
- "SERVER_PORT" => "80",
45
- "QUERY_STRING" => encode_www_form(properties[:params].to_a),
46
- "HTTP_VERSION" => "HTTP/1.1",
47
- "HTTP_USER_AGENT" => "spec",
48
- "HTTP_HOST" => "spec.local",
49
- "HTTP_ACCEPT_ENCODING" => "gzip;q=1.0,deflate;q=0.6,identity;q=0.3",
50
- "HTTP_ACCEPT" => "*/*",
51
- "HTTP_CONNECTION" => "close"
52
- }.merge(additional_headers)
47
+ when String
48
+ StringIO.new(payload.to_s)
53
49
 
50
+ else
51
+ StringIO.new('')
52
+
53
+ end
54
54
  end
55
55
 
56
56
  def encode_www_form(enum)
@@ -93,9 +93,8 @@ module Rack::App::Test::Utils
93
93
 
94
94
  def encode_www_form_component(str)
95
95
  str = str.to_s.dup
96
-
97
- TBLENCWWWCOMP_.each do |from,to|
98
- str.gsub!(from,to)
96
+ TBLENCWWWCOMP_.each do |from, to|
97
+ str.gsub!(from, to)
99
98
  end
100
99
  str
101
100
  end
@@ -2,6 +2,8 @@ require 'securerandom'
2
2
  module Rack::App::Utils
3
3
  extend self
4
4
 
5
+ require 'rack/app/utils/deep_dup'
6
+
5
7
  # Normalizes URI path.
6
8
  #
7
9
  # Strips off trailing slash and ensures there is a leading slash.
@@ -75,4 +77,9 @@ module Rack::App::Utils
75
77
  File.join(directory,basename)
76
78
  end
77
79
 
80
+
81
+ def deep_dup(object)
82
+ ::Rack::App::Utils::DeepDup.new(object).to_dup
83
+ end
84
+
78
85
  end
@@ -0,0 +1,90 @@
1
+ class Rack::App::Utils::DeepDup
2
+
3
+ def initialize(object)
4
+ @object = object
5
+ end
6
+
7
+ def to_dup
8
+ @register = {}
9
+
10
+ dup(@object)
11
+ end
12
+
13
+ protected
14
+
15
+ def registration(object, duplicate)
16
+ @register[object.object_id]= duplicate
17
+ duplicate
18
+ end
19
+
20
+ def registered(object)
21
+ @register[object.object_id]
22
+ end
23
+
24
+ def dup(object)
25
+
26
+ return registered(object) if registered(object)
27
+
28
+ case object
29
+
30
+ when Array
31
+ dup_array(object)
32
+
33
+ when Hash
34
+ dup_hash(object)
35
+
36
+ when Range
37
+ dup_range(object)
38
+
39
+ when Struct
40
+ dup_struct(object)
41
+
42
+ when NilClass, Symbol, Numeric, TrueClass, FalseClass
43
+ registration(object, object)
44
+
45
+ else
46
+ dup_object(object)
47
+
48
+ end
49
+ end
50
+
51
+ def dup_array(object)
52
+ duplication = dup_object(object)
53
+ duplication.map!{ |e| dup(e) }
54
+ end
55
+
56
+ def dup_hash(object)
57
+ duplication = dup_object(object)
58
+ object.reduce(duplication) { |hash, (k, v)| hash.merge!(dup(k) => dup(v)) }
59
+ end
60
+
61
+ def dup_range(range)
62
+ registration(range, range.class.new(dup(range.first), dup(range.last)))
63
+ rescue
64
+ registration(range, range.dup)
65
+ end
66
+
67
+ def dup_struct(struct)
68
+ duplication = registration(struct, struct.dup)
69
+
70
+ struct.each_pair do |attr, value|
71
+ duplication.__send__("#{attr}=", dup(value))
72
+ end
73
+
74
+ duplication
75
+ end
76
+
77
+ def dup_object(object)
78
+ dup_instance_variables(object, registration(object, object.dup))
79
+ end
80
+
81
+ def dup_instance_variables(object, duplicate)
82
+ object.instance_variables.each do |instance_variable|
83
+ value = object.instance_variable_get(instance_variable)
84
+ duplicate.instance_variable_set(instance_variable, dup(value))
85
+ end
86
+
87
+ return duplicate
88
+ end
89
+
90
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-app
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.1
4
+ version: 3.0.0.alpha
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Luzsi
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-03-17 00:00:00.000000000 Z
11
+ date: 2016-03-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -86,13 +86,12 @@ files:
86
86
  - Rakefile
87
87
  - VERSION
88
88
  - Vagrantfile
89
- - bin/console
90
- - bin/setup
91
89
  - lib/rack/app.rb
92
90
  - lib/rack/app/constants.rb
93
91
  - lib/rack/app/endpoint.rb
94
92
  - lib/rack/app/endpoint/not_found.rb
95
93
  - lib/rack/app/error_handler.rb
94
+ - lib/rack/app/extension.rb
96
95
  - lib/rack/app/file_server.rb
97
96
  - lib/rack/app/instance_methods.rb
98
97
  - lib/rack/app/instance_methods/core.rb
@@ -112,10 +111,12 @@ files:
112
111
  - lib/rack/app/singleton_methods/mounting.rb
113
112
  - lib/rack/app/singleton_methods/rack_interface.rb
114
113
  - lib/rack/app/singleton_methods/route_handling.rb
115
- - lib/rack/app/singleton_methods/utility.rb
114
+ - lib/rack/app/singleton_methods/settings.rb
116
115
  - lib/rack/app/test.rb
116
+ - lib/rack/app/test/singleton_methods.rb
117
117
  - lib/rack/app/test/utils.rb
118
118
  - lib/rack/app/utils.rb
119
+ - lib/rack/app/utils/deep_dup.rb
119
120
  - lib/rack/app/version.rb
120
121
  - rack-app.gemspec
121
122
  homepage: http://www.rack-app.com/
@@ -133,9 +134,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
133
134
  version: '0'
134
135
  required_rubygems_version: !ruby/object:Gem::Requirement
135
136
  requirements:
136
- - - ">="
137
+ - - ">"
137
138
  - !ruby/object:Gem::Version
138
- version: '0'
139
+ version: 1.3.1
139
140
  requirements: []
140
141
  rubyforge_project:
141
142
  rubygems_version: 2.4.8
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require "bundler/setup"
4
- require "rack/app"
5
-
6
- # You can add fixtures and/or initialization code here to make experimenting
7
- # with your gem easier. You can also use a different console, if you like.
8
-
9
- # (If you use this, don't forget to add pry to your Gemfile!)
10
- # require "pry"
11
- # Pry.start
12
-
13
- require "irb"
14
- IRB.start
data/bin/setup DELETED
@@ -1,7 +0,0 @@
1
- #!/bin/bash
2
- set -euo pipefail
3
- IFS=$'\n\t'
4
-
5
- bundle install
6
-
7
- # Do any other automated setup that you need to do here