rack-app 5.6.0 → 5.7.0.rc

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: d01a4b973a8a3b61c3fac65895cea447902368e0
4
- data.tar.gz: 1661ab7a248eeb8d7df8cc65f23348ea9cf7c666
3
+ metadata.gz: 3a9a62e22dc06930f5166a88e4af70c06faac8a4
4
+ data.tar.gz: 7c72121249494bd83440ea3a6819cc24fa8d6608
5
5
  SHA512:
6
- metadata.gz: 0044dac4f6b279fd9f3d00d43bbba4ee86791fe40e7028999d8dbe1faf1164fa3c5918491e6ad2c3a7d76ed44c69e70033b7de8f41b73eae3067ff8e98fecc1f
7
- data.tar.gz: f452f8899a4067484d63574ca9655b172813af4b7787865a846db8e5b37d0988a5f2487393fa3bdff209a6017b57e8b1a91e281eeae79b8770b1bbeb34ce2cec
6
+ metadata.gz: cb093d6592e2ee3cb1efb4a2a40fc02a7cb44972e0abf4acb748d694be5d0dd33b0a1363bdce1d589a28596ab007e805c2b082f28327fd92bc2bd8458be3e654
7
+ data.tar.gz: 221eab9e61d07b9a45c3ca302c02795e40c27d4fbcbf2e3af6a8a67e36c38bc040e90af37fafcd94d72c4250a2a525366371b79bb86c109ead12756e2df397bb
data/VERSION CHANGED
@@ -1 +1 @@
1
- 5.6.0
1
+ 5.7.0.rc
@@ -0,0 +1,3 @@
1
+ Rack::App::Extension.register(:payload) do
2
+ # extend(Rack::App::Payload::SingletonMethods)
3
+ end
@@ -1,3 +1,4 @@
1
1
  module Rack::App::BundledExtensions
2
2
  require "rack/app/bundled_extensions/logger"
3
+ require "rack/app/bundled_extensions/payload"
3
4
  end
@@ -1,7 +1,7 @@
1
1
  module Rack::App::Constants
2
2
 
3
3
  require "rack/app/constants/http_status_codes"
4
-
4
+
5
5
  def self.rack_constant(constant_name, fallback_value)
6
6
  ::Rack.const_get(constant_name)
7
7
  rescue NameError
@@ -27,7 +27,7 @@ module Rack::App::Constants
27
27
  METHODS = (METHOD.constants - [:ANY]).map(&:to_s).freeze
28
28
 
29
29
  module Headers
30
- CONTENT_TYPE = Rack::App::Constants.rack_constant(:CONTENT_TYPE, "Content-Type")
30
+ CONTENT_TYPE = "Content-Type".freeze
31
31
  end
32
32
 
33
33
  end
@@ -39,13 +39,22 @@ module Rack::App::Constants
39
39
  REQUEST_METHOD = Rack::App::Constants.rack_constant(:REQUEST_METHOD, "REQUEST_METHOD")
40
40
 
41
41
  EXTNAME = 'rack-app.extname'.freeze
42
- REQUEST_HANDLER = 'rack-app.handler'
43
- SERIALIZER = 'rack-app.serializer'
44
- PARSED_PARAMS = 'rack-app.parsed_params'
45
- VALIDATED_PARAMS = 'rack-app.validated_params'
42
+ SERIALIZER = 'rack-app.serializer'.freeze
43
+ CONTENT_TYPE = 'CONTENT_TYPE'.freeze
44
+ REQUEST_HANDLER = 'rack-app.handler'.freeze
45
+
46
+ PARAMS_GETTER = 'rack-app.params.getter'
47
+ PARSED_PARAMS = 'rack-app.params.parsed'.freeze
48
+ VALIDATED_PARAMS = 'rack-app.params.validated'.freeze
49
+
50
+ PAYLOAD_PARSER = 'rack-app.payload.parser'.freeze
51
+ PAYLOAD_GETTER = 'rack-app.payload.getter'.freeze
52
+ PARSED_PAYLOAD = 'rack-app.payload.parsed'.freeze
53
+
46
54
  ORIGINAL_PATH_INFO = 'rack-app.original_path_info'.freeze
47
55
  PATH_PARAMS_MATCHER = 'rack-app.path_params_matcher'.freeze
48
56
  METHODOVERRIDE_ORIGINAL_METHOD = 'rack-app.methodoverride.original_method'.freeze
57
+
49
58
  end
50
59
 
51
60
  MOUNTED_DIRECTORY = '[Mounted Directory]'.freeze
@@ -7,14 +7,18 @@ class Rack::App::Endpoint::Builder
7
7
 
8
8
  def build
9
9
  builder = Rack::Builder.new
10
+ apply_core_middlewares(builder)
10
11
  apply_middleware_build_blocks(builder)
11
- @config.endpoint_method_name
12
12
  builder.run(Rack::App::Endpoint::Executor.new(@config))
13
13
  builder.to_app
14
14
  end
15
15
 
16
16
  protected
17
17
 
18
+ def apply_core_middlewares(builder)
19
+ builder.use(Rack::App::Middlewares::Configuration::PayloadParserSetter)
20
+ end
21
+
18
22
  def apply_middleware_build_blocks(builder)
19
23
  builder_blocks.each do |builder_block|
20
24
  builder_block.call(builder)
@@ -20,6 +20,14 @@ class Rack::App::Endpoint::Config
20
20
  serializer_builder.to_serializer
21
21
  end
22
22
 
23
+ def payload
24
+ app_class.__send__(:payload)
25
+ end
26
+
27
+ def payload_parser
28
+ payload.parser.to_parser
29
+ end
30
+
23
31
  def serializer_builder
24
32
  @raw[:serializer_builder] ||= app_class.__send__(:formats)
25
33
  end
@@ -2,6 +2,7 @@ class Rack::App::Endpoint::Executor
2
2
 
3
3
  def initialize(endpoint_properties)
4
4
  @endpoint_properties = endpoint_properties
5
+ @endpoint_properties.endpoint_method_name
5
6
  end
6
7
 
7
8
  def call(env)
@@ -25,7 +26,6 @@ class Rack::App::Endpoint::Executor
25
26
  end
26
27
 
27
28
  EXTNAME = ::Rack::App::Constants::ENV::EXTNAME
28
- CONTENT_TYPE = ::Rack::App::Constants::HTTP::Headers::CONTENT_TYPE
29
29
 
30
30
  def set_response_body(handler, response_body)
31
31
  extname = handler.request.env[EXTNAME]
@@ -1,29 +1,23 @@
1
1
  module Rack::App::InstanceMethods::Payload
2
2
 
3
+ def payload
4
+ request.env[Rack::App::Constants::ENV::PAYLOAD_GETTER].call
5
+ end
6
+
3
7
  def payload_stream(&block)
4
8
  return nil unless @request.body.respond_to?(:gets)
5
- while chunk = request.body.gets
9
+ while chunk = @request.body.gets
6
10
  block.call(chunk)
7
11
  end
8
- request.body.rewind
12
+ @request.body.rewind
9
13
  nil
10
14
  end
11
15
 
12
- def payload
13
- @__payload__ ||= lambda {
14
-
15
- payload = ''
16
- payload_stream { |chunk| payload << chunk }
17
- return payload
18
-
19
- }.call
20
- end
21
-
22
16
  def payload_to_file(file_path, file_mod='w')
17
+ return nil unless @request.body.respond_to?(:gets)
23
18
  File.open(file_path, file_mod) do |file|
24
- payload_stream { |chunk| file.print(chunk) }
19
+ payload_stream{ |chunk| file.print(chunk) }
25
20
  end
26
21
  end
27
22
 
28
23
  end
29
-
@@ -0,0 +1,18 @@
1
+ class Rack::App::Middlewares::Configuration::PayloadParserSetter
2
+
3
+ PARSER = ::Rack::App::Constants::ENV::PAYLOAD_PARSER
4
+ PARSED = ::Rack::App::Constants::ENV::PARSED_PAYLOAD
5
+ GETTER = ::Rack::App::Constants::ENV::PAYLOAD_GETTER
6
+
7
+ def initialize(app)
8
+ @app = app
9
+ @parser = Rack::App::Payload::Parser.new
10
+ end
11
+
12
+ def call(env)
13
+ env[PARSER]= @parser
14
+ env[GETTER]= lambda { env[PARSED] ||= env[PARSER].parse_env(env) }
15
+ @app.call(env)
16
+ end
17
+
18
+ end
@@ -5,6 +5,7 @@ class Rack::App::Middlewares::Configuration
5
5
 
6
6
  require "rack/app/middlewares/configuration/handler_setter"
7
7
  require "rack/app/middlewares/configuration/serializer_setter"
8
+ require "rack/app/middlewares/configuration/payload_parser_setter"
8
9
 
9
10
  require "rack/app/middlewares/configuration/path_params_matcher"
10
11
 
@@ -0,0 +1,18 @@
1
+ class Rack::App::Middlewares::Payload::ParserSetter
2
+
3
+ PARSER = ::Rack::App::Constants::ENV::PAYLOAD_PARSER
4
+ PARSED = ::Rack::App::Constants::ENV::PARSED_PAYLOAD
5
+ GETTER = ::Rack::App::Constants::ENV::PAYLOAD_GETTER
6
+
7
+ def initialize(app, payload_builder)
8
+ @payload_parser = payload_builder.parser.to_parser
9
+ @app = app
10
+ end
11
+
12
+ def call(env)
13
+ env[PARSER]= @payload_parser
14
+ env[GETTER]= lambda { env[PARSED] ||= env[PARSER].parse_env(env) }
15
+ @app.call(env)
16
+ end
17
+
18
+ end
@@ -0,0 +1,3 @@
1
+ module Rack::App::Middlewares::Payload
2
+ require 'rack/app/middlewares/payload/parser_setter'
3
+ end
@@ -0,0 +1,18 @@
1
+ class Rack::App::Middlewares::PayloadParserSetter
2
+
3
+ PARSER = ::Rack::App::Constants::ENV::PAYLOAD_PARSER
4
+ PARSED = ::Rack::App::Constants::ENV::PARSED_PAYLOAD
5
+ GETTER = ::Rack::App::Constants::ENV::PAYLOAD_GETTER
6
+
7
+ def initialize(app, payload_parser)
8
+ @payload_parser = payload_parser
9
+ @app = app
10
+ end
11
+
12
+ def call(env)
13
+ env[PARSER]= @payload_parser
14
+ env[GETTER]= lambda { env[PARSED] ||= env[PARSER].parse_env(env) }
15
+ @app.call(env)
16
+ end
17
+
18
+ end
@@ -1,7 +1,9 @@
1
1
  module Rack::App::Middlewares
2
+ require 'rack/app/middlewares/payload_parser_setter'
2
3
  require 'rack/app/middlewares/path_info_cutter'
3
4
  require 'rack/app/middlewares/configuration'
4
5
  require 'rack/app/middlewares/header_setter'
6
+ require 'rack/app/middlewares/payload'
5
7
  require 'rack/app/middlewares/params'
6
8
  require 'rack/app/middlewares/hooks'
7
9
  end
@@ -0,0 +1,9 @@
1
+ class Rack::App::Payload::Builder
2
+
3
+ def parser(&block)
4
+ @parser_builder ||= Rack::App::Payload::Parser::Builder.new
5
+ @parser_builder.instance_exec(&block) if block
6
+ @parser_builder
7
+ end
8
+
9
+ end
@@ -0,0 +1,93 @@
1
+ module Rack::App::Payload::Parser::Builder::Formats
2
+ extend(self)
3
+
4
+ JSON_CONTENT_TYPE = [
5
+ "application/json",
6
+ "application/x-javascript",
7
+ "text/javascript",
8
+ "text/x-javascript",
9
+ "text/x-json",
10
+ ]
11
+
12
+ JSON_PARSER = proc do |io|
13
+ begin
14
+ ::JSON.load(io)
15
+ rescue ::JSON::ParserError => ex
16
+ rr = Rack::Response.new
17
+ rr.status = 400
18
+ rr.write(ex.message)
19
+ throw(:rack_response, rr)
20
+ end
21
+ end
22
+
23
+ def json(builder)
24
+ require "json"
25
+ JSON_CONTENT_TYPE.each do |content_type|
26
+ builder.on(content_type, &JSON_PARSER)
27
+ end
28
+ end
29
+
30
+ # CSV_CONTENT_TYPE = [
31
+ # "text/comma-separated-values",
32
+ # "application/csv",
33
+ # "text/csv",
34
+ # ]
35
+ #
36
+ # CSV_PARSER = proc do |io|
37
+ # CSV.parse(io.read)
38
+ # end
39
+ #
40
+ # def csv(builder)
41
+ # require "csv"
42
+ # CSV_CONTENT_TYPE.each do |content_type|
43
+ # builder.on(content_type, &CSV_PARSER)
44
+ # end
45
+ # rescue LoadError
46
+ # end
47
+
48
+ FORM_CONTENT_TYPES = [
49
+ 'application/x-www-form-urlencoded',
50
+ # 'multipart/form-data'
51
+ ].freeze
52
+
53
+ FORM_SEP_CHAR = '&'.freeze
54
+
55
+ RACK_QUERY_PARSER = if Rack::Utils.respond_to?(:default_query_parser)
56
+ lambda do |form|
57
+ ::Rack::Utils.default_query_parser.parse_nested_query(form, FORM_SEP_CHAR)
58
+ end
59
+ else
60
+ lambda do |form|
61
+ ::Rack::Utils.parse_nested_query(form, FORM_SEP_CHAR)
62
+ end
63
+ end
64
+
65
+ NULL_END_CHAR = /#{"\u0000"}$/
66
+
67
+ FORM_PARSER = proc do |io|
68
+ form_vars = io.read
69
+ # Fix for Safari Ajax postings that always append \0
70
+ form_vars.slice!(NULL_END_CHAR)
71
+ RACK_QUERY_PARSER.call(form_vars)
72
+ end
73
+
74
+ def www_form_urlencoded(builder)
75
+ FORM_CONTENT_TYPES.each do |content_type|
76
+ builder.on(content_type, &FORM_PARSER)
77
+ end
78
+ end
79
+
80
+ alias form www_form_urlencoded
81
+ alias urlencoded www_form_urlencoded
82
+
83
+ def accept(builder, *form_names)
84
+ last_name = nil
85
+ form_names.map(&:to_sym).each do |form_name|
86
+ last_name = form_name
87
+ __send__ form_name, builder
88
+ end
89
+ rescue NoMethodError
90
+ raise(NotImplementedError, "unknown formatter: #{last_name}")
91
+ end
92
+
93
+ end
@@ -0,0 +1,39 @@
1
+ class Rack::App::Payload::Parser::Builder
2
+
3
+ require "rack/app/payload/parser/builder/formats"
4
+
5
+ def initialize
6
+ @parsers = {}
7
+ end
8
+
9
+ def to_parser
10
+ Rack::App::Payload::Parser.new(@parsers)
11
+ end
12
+
13
+ def on(content_type, &parser)
14
+ @parsers[content_type]= parser
15
+ self
16
+ end
17
+
18
+ def accept(*formats)
19
+ Rack::App::Payload::Parser::Builder::Formats.accept(self, *formats)
20
+ end
21
+
22
+ # def reject_unsupported_media_types
23
+ # reject = proc do
24
+ # rr = Rack::Response.new
25
+ # rr.status = 415
26
+ # rr.write("Unsupported Media Type")
27
+ # throw(:rack_response, rr)
28
+ # end
29
+ # @parsers = Hash.new(reject).merge(@parsers)
30
+ # nil
31
+ # end
32
+
33
+ def merge!(parser_builder)
34
+ raise unless parser_builder.is_a?(self.class)
35
+ @parsers.merge!(parser_builder.instance_variable_get(:@parsers))
36
+ self
37
+ end
38
+
39
+ end
@@ -0,0 +1,26 @@
1
+ require 'stringio'
2
+ require 'rack/request'
3
+ class Rack::App::Payload::Parser
4
+ require 'rack/app/payload/parser/builder'
5
+
6
+ DEFAULT_PARSER = proc { |io| io.read }
7
+
8
+ def initialize(content_type__parsers = {})
9
+ raise unless content_type__parsers.is_a?(Hash)
10
+ @content_type__parsers = Hash.new(DEFAULT_PARSER)
11
+ @content_type__parsers.merge!(content_type__parsers)
12
+ end
13
+
14
+ def parse_io(content_type, io)
15
+ @content_type__parsers[content_type.to_s].call(io)
16
+ end
17
+
18
+ def parse_env(env)
19
+ request = Rack::Request.new(env)
20
+ parse_io(request.content_type, request.body)
21
+ end
22
+
23
+ def parse_string(content_type, str)
24
+ parse_io(content_type, StringIO.new(str))
25
+ end
26
+ end
@@ -0,0 +1,4 @@
1
+ class Rack::App::Payload
2
+ require "rack/app/payload/parser"
3
+ require "rack/app/payload/builder"
4
+ end
@@ -22,8 +22,6 @@ class Rack::App::Serializer
22
22
  String(@formatters[extname].call(object))
23
23
  end
24
24
 
25
- CONTENT_TYPE = ::Rack::App::Constants::HTTP::Headers::CONTENT_TYPE
26
-
27
25
  def response_headers_for(extname)
28
26
  headers = {}
29
27
  add_content_type_for(headers, extname)
@@ -45,6 +43,8 @@ class Rack::App::Serializer
45
43
 
46
44
  protected
47
45
 
46
+ CONTENT_TYPE = ::Rack::App::Constants::HTTP::Headers::CONTENT_TYPE
47
+
48
48
  def add_content_type_for(headers, extname)
49
49
  content_type = @content_types[extname]
50
50
  if content_type
@@ -11,6 +11,7 @@ module Rack::App::SingletonMethods::Extensions
11
11
  end
12
12
 
13
13
  alias apply_extension apply_extensions
14
+ Rack::App::Utils.deprecate(self, :apply_extension, :apply_extensions, 2017, 01)
14
15
 
15
16
  def extensions(*extensions_names)
16
17
  apply_extensions(*extensions_names)
@@ -1,17 +1,15 @@
1
1
  module Rack::App::SingletonMethods::Formats
2
-
3
2
  def formats(&descriptor)
4
3
  @formats_builder ||= Rack::App::Serializer::FormatsBuilder.new
5
4
  unless descriptor.nil?
6
5
  @formats_builder.instance_exec(&descriptor)
7
- router.reset
6
+ router.reset
8
7
  end
9
8
  @formats_builder
10
9
  end
11
10
 
12
- def serializer(default_content_type=nil, &how_to_serialize)
13
- formats{ default(default_content_type,&how_to_serialize) } unless how_to_serialize.nil?
14
- return formats.to_serializer
11
+ def serializer(default_content_type = nil, &how_to_serialize)
12
+ formats { default(default_content_type, &how_to_serialize) } unless how_to_serialize.nil?
13
+ formats.to_serializer
15
14
  end
16
-
17
15
  end
@@ -9,4 +9,5 @@ module Rack::App::SingletonMethods::ParamsValidator
9
9
  end
10
10
  end
11
11
  alias params validate_params
12
+ Rack::App::Utils.deprecate(self, :params, :validate_params, 2016, 10)
12
13
  end
@@ -0,0 +1,12 @@
1
+ module Rack::App::SingletonMethods::Payload
2
+
3
+ def payload(&block)
4
+ unless @payload_builder
5
+ @payload_builder = Rack::App::Payload::Builder.new
6
+ use(Rack::App::Middlewares::Payload::ParserSetter, @payload_builder)
7
+ end
8
+ @payload_builder.instance_exec(&block) if block
9
+ nil
10
+ end
11
+
12
+ end
@@ -1,26 +1,28 @@
1
1
  module Rack::App::SingletonMethods
2
2
 
3
+ require 'rack/app/singleton_methods/params_validator'
4
+ require 'rack/app/singleton_methods/rack_interface'
5
+ require 'rack/app/singleton_methods/route_handling'
3
6
  require 'rack/app/singleton_methods/http_methods'
4
7
  require 'rack/app/singleton_methods/inheritance'
5
8
  require 'rack/app/singleton_methods/middleware'
9
+ require 'rack/app/singleton_methods/extensions'
6
10
  require 'rack/app/singleton_methods/mounting'
7
- require 'rack/app/singleton_methods/params_validator'
8
- require 'rack/app/singleton_methods/rack_interface'
9
- require 'rack/app/singleton_methods/route_handling'
10
11
  require 'rack/app/singleton_methods/settings'
11
- require 'rack/app/singleton_methods/extensions'
12
+ require 'rack/app/singleton_methods/payload'
12
13
  require 'rack/app/singleton_methods/formats'
13
14
  require 'rack/app/singleton_methods/hooks'
14
15
 
16
+ include Rack::App::SingletonMethods::ParamsValidator
17
+ include Rack::App::SingletonMethods::RackInterface
18
+ include Rack::App::SingletonMethods::RouteHandling
15
19
  include Rack::App::SingletonMethods::HttpMethods
16
20
  include Rack::App::SingletonMethods::Inheritance
21
+ include Rack::App::SingletonMethods::Extensions
17
22
  include Rack::App::SingletonMethods::Middleware
18
23
  include Rack::App::SingletonMethods::Mounting
19
- include Rack::App::SingletonMethods::ParamsValidator
20
- include Rack::App::SingletonMethods::RackInterface
21
- include Rack::App::SingletonMethods::RouteHandling
22
24
  include Rack::App::SingletonMethods::Settings
23
- include Rack::App::SingletonMethods::Extensions
25
+ include Rack::App::SingletonMethods::Payload
24
26
  include Rack::App::SingletonMethods::Formats
25
27
  include Rack::App::SingletonMethods::Hooks
26
28
 
data/lib/rack/app.rb CHANGED
@@ -11,6 +11,7 @@ class Rack::App
11
11
  require 'rack/app/test'
12
12
  require 'rack/app/utils'
13
13
  require 'rack/app/params'
14
+ require 'rack/app/payload'
14
15
  require 'rack/app/router'
15
16
  require 'rack/app/endpoint'
16
17
  require 'rack/app/streamer'
@@ -0,0 +1,30 @@
1
+ require 'benchmark'
2
+
3
+ TEST_AMOUNT = 2_000_000
4
+ Benchmark.bm(15) do |x|
5
+
6
+ rgx = /\0\z/
7
+ x.report('sub! + rgx') do
8
+ TEST_AMOUNT.times do
9
+ str = "hello\0"
10
+ str.sub!(rgx, '')
11
+ end
12
+ end
13
+
14
+ x.report('slice! + rgx') do
15
+ TEST_AMOUNT.times do
16
+ str = "hello\0"
17
+ str.slice!(rgx)
18
+ end
19
+ end
20
+
21
+ end_char = ?\0
22
+
23
+ x.report('slice! + int + if') do
24
+ TEST_AMOUNT.times do
25
+ str = "hello\0"
26
+ str.slice!(-1) if str[-1] == end_char
27
+ end
28
+ end
29
+
30
+ end
@@ -0,0 +1,94 @@
1
+ o = Object.new
2
+ ms = o.methods
3
+ require "minitest"
4
+
5
+ block = proc do |payload|
6
+ assert_kind_of(Array, payload, 'Payload should be a collection')
7
+ payload.each do |element|
8
+ assert_kind_of(Hash, element, 'Payload collection elements should be hashtables')
9
+
10
+ assert_includes(element.keys, 'hello', 'payload elements should has hello key')
11
+ end
12
+ end
13
+
14
+ good_payload = [
15
+ {"hello" => "world1"},
16
+ {"hello" => "world2"}
17
+ ]
18
+
19
+ bad1_payload = [
20
+ {"nope" => "world1"},
21
+ {"hello" => "world2"}
22
+ ]
23
+
24
+ bad2_payload = {"hello" => "world2"}
25
+
26
+ class Validator
27
+
28
+ include Minitest::Assertions
29
+
30
+ attr_accessor :assertions
31
+ def initialize(&block)
32
+ @assertions = 0
33
+ singleton = class << self
34
+ self
35
+ end
36
+ singleton.__send__(:define_method, :__tester__, &block)
37
+ singleton.__send__(:protected, :__tester__)
38
+ end
39
+
40
+ def test(payload)
41
+ __tester__(payload)
42
+ rescue Minitest::Assertion => ex
43
+ puts ex.message
44
+ end
45
+
46
+ end
47
+
48
+ class Documentation
49
+
50
+ def initialize(&block)
51
+ @docs = []
52
+ singleton = class << self
53
+ self
54
+ end
55
+ singleton.__send__(:define_method, :__tester__, &block)
56
+ singleton.__send__(:protected, :__tester__)
57
+ end
58
+
59
+ def to_doc
60
+ o = Object.new
61
+ def o.method_missing(*_)
62
+ self
63
+ end
64
+
65
+ def o.each(&block)
66
+ block.call(self)
67
+ end
68
+
69
+ def o.inspect
70
+ 'element'
71
+ end
72
+ __tester__(o)
73
+
74
+ @docs.join("\n")
75
+ end
76
+
77
+ protected
78
+
79
+ def method_missing(method_name,*args,&block)
80
+ @docs << args.select{|arg| arg.is_a?(String) }.last
81
+ end
82
+
83
+ end
84
+
85
+
86
+ puts Object.new.methods - ms # no output , no monkey patch than
87
+
88
+ v = Validator.new(&block)
89
+ v.test(good_payload)
90
+ v.test(bad1_payload)
91
+ v.test(bad2_payload)
92
+
93
+ d = Documentation.new(&block)
94
+ puts d.to_doc
data/spike/xml.rb ADDED
@@ -0,0 +1,24 @@
1
+ require 'net/http'
2
+ require 'rexml/document'
3
+
4
+ # Web search for "madonna"
5
+ url = 'http://api.search.yahoo.com/WebSearchService/V1/webSearch?appid=YahooDemo&query=madonna&results=2'
6
+
7
+ # get the XML data as a string
8
+ xml_data = Net::HTTP.get_response(URI.parse(url)).body
9
+
10
+ # extract event information
11
+ doc = REXML::Document.new(xml_data)
12
+ titles = []
13
+ links = []
14
+ doc.elements.each('ResultSet/Result/Title') do |ele|
15
+ titles << ele.text
16
+ end
17
+ doc.elements.each('ResultSet/Result/Url') do |ele|
18
+ links << ele.text
19
+ end
20
+
21
+ # print all events
22
+ titles.each_with_index do |title, idx|
23
+ print "#{title} => #{links[idx]}\n"
24
+ 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: 5.6.0
4
+ version: 5.7.0.rc
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Luzsi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-09-23 00:00:00.000000000 Z
11
+ date: 2016-12-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -95,6 +95,7 @@ files:
95
95
  - lib/rack/app.rb
96
96
  - lib/rack/app/bundled_extensions.rb
97
97
  - lib/rack/app/bundled_extensions/logger.rb
98
+ - lib/rack/app/bundled_extensions/payload.rb
98
99
  - lib/rack/app/cli.rb
99
100
  - lib/rack/app/cli/command.rb
100
101
  - lib/rack/app/cli/command/configurator.rb
@@ -124,6 +125,7 @@ files:
124
125
  - lib/rack/app/middlewares/configuration.rb
125
126
  - lib/rack/app/middlewares/configuration/handler_setter.rb
126
127
  - lib/rack/app/middlewares/configuration/path_params_matcher.rb
128
+ - lib/rack/app/middlewares/configuration/payload_parser_setter.rb
127
129
  - lib/rack/app/middlewares/configuration/serializer_setter.rb
128
130
  - lib/rack/app/middlewares/header_setter.rb
129
131
  - lib/rack/app/middlewares/hooks.rb
@@ -137,7 +139,15 @@ files:
137
139
  - lib/rack/app/middlewares/params/setter.rb
138
140
  - lib/rack/app/middlewares/params/validator.rb
139
141
  - lib/rack/app/middlewares/path_info_cutter.rb
142
+ - lib/rack/app/middlewares/payload.rb
143
+ - lib/rack/app/middlewares/payload/parser_setter.rb
144
+ - lib/rack/app/middlewares/payload_parser_setter.rb
140
145
  - lib/rack/app/params.rb
146
+ - lib/rack/app/payload.rb
147
+ - lib/rack/app/payload/builder.rb
148
+ - lib/rack/app/payload/parser.rb
149
+ - lib/rack/app/payload/parser/builder.rb
150
+ - lib/rack/app/payload/parser/builder/formats.rb
141
151
  - lib/rack/app/request_configurator.rb
142
152
  - lib/rack/app/router.rb
143
153
  - lib/rack/app/router/base.rb
@@ -156,6 +166,7 @@ files:
156
166
  - lib/rack/app/singleton_methods/middleware.rb
157
167
  - lib/rack/app/singleton_methods/mounting.rb
158
168
  - lib/rack/app/singleton_methods/params_validator.rb
169
+ - lib/rack/app/singleton_methods/payload.rb
159
170
  - lib/rack/app/singleton_methods/rack_interface.rb
160
171
  - lib/rack/app/singleton_methods/route_handling.rb
161
172
  - lib/rack/app/singleton_methods/settings.rb
@@ -186,6 +197,9 @@ files:
186
197
  - spike/method_vs_hash.rb
187
198
  - spike/method_vs_instance_exec.rb
188
199
  - spike/return_vs_throw.rb
200
+ - spike/slice_vs_sub.rb
201
+ - spike/validator_with_minitest.rb
202
+ - spike/xml.rb
189
203
  - src/Net__HTTP Cheat Sheet.pdf
190
204
  homepage: http://www.rack-app.com/
191
205
  licenses:
@@ -202,9 +216,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
202
216
  version: '0'
203
217
  required_rubygems_version: !ruby/object:Gem::Requirement
204
218
  requirements:
205
- - - ">="
219
+ - - ">"
206
220
  - !ruby/object:Gem::Version
207
- version: '0'
221
+ version: 1.3.1
208
222
  requirements: []
209
223
  rubyforge_project:
210
224
  rubygems_version: 2.5.1