rest-core 3.6.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/.gitmodules +3 -0
  3. data/.travis.yml +0 -1
  4. data/CHANGES.md +28 -0
  5. data/Gemfile +0 -2
  6. data/README.md +14 -95
  7. data/Rakefile +16 -3
  8. data/example/simple.rb +1 -0
  9. data/example/use-cases.rb +15 -3
  10. data/lib/rest-core.rb +38 -75
  11. data/lib/rest-core/client/universal.rb +3 -1
  12. data/lib/rest-core/client_oauth1.rb +64 -59
  13. data/lib/rest-core/event.rb +9 -11
  14. data/lib/rest-core/middleware/auth_basic.rb +21 -21
  15. data/lib/rest-core/middleware/bypass.rb +8 -8
  16. data/lib/rest-core/middleware/cache.rb +94 -90
  17. data/lib/rest-core/middleware/clash_response.rb +15 -14
  18. data/lib/rest-core/middleware/common_logger.rb +27 -26
  19. data/lib/rest-core/middleware/default_headers.rb +8 -8
  20. data/lib/rest-core/middleware/default_payload.rb +8 -8
  21. data/lib/rest-core/middleware/default_query.rb +8 -8
  22. data/lib/rest-core/middleware/default_site.rb +12 -12
  23. data/lib/rest-core/middleware/defaults.rb +38 -38
  24. data/lib/rest-core/middleware/error_detector.rb +10 -10
  25. data/lib/rest-core/middleware/error_detector_http.rb +6 -4
  26. data/lib/rest-core/middleware/error_handler.rb +14 -14
  27. data/lib/rest-core/middleware/follow_redirect.rb +28 -27
  28. data/lib/rest-core/middleware/json_request.rb +13 -11
  29. data/lib/rest-core/middleware/json_response.rb +29 -28
  30. data/lib/rest-core/middleware/oauth1_header.rb +84 -83
  31. data/lib/rest-core/middleware/oauth2_header.rb +27 -25
  32. data/lib/rest-core/middleware/oauth2_query.rb +15 -15
  33. data/lib/rest-core/middleware/query_response.rb +14 -14
  34. data/lib/rest-core/middleware/retry.rb +25 -23
  35. data/lib/rest-core/middleware/smash_response.rb +15 -14
  36. data/lib/rest-core/middleware/timeout.rb +18 -19
  37. data/lib/rest-core/test.rb +1 -18
  38. data/lib/rest-core/util/clash.rb +38 -37
  39. data/lib/rest-core/util/config.rb +40 -39
  40. data/lib/rest-core/util/dalli_extension.rb +11 -10
  41. data/lib/rest-core/util/hmac.rb +9 -8
  42. data/lib/rest-core/util/json.rb +55 -54
  43. data/lib/rest-core/util/parse_link.rb +13 -12
  44. data/lib/rest-core/util/parse_query.rb +24 -22
  45. data/lib/rest-core/version.rb +1 -1
  46. data/rest-core.gemspec +121 -158
  47. data/test/test_cache.rb +2 -0
  48. data/test/test_default_payload.rb +1 -1
  49. data/test/test_error_handler.rb +5 -4
  50. data/test/test_timeout.rb +9 -8
  51. data/test/test_universal.rb +8 -0
  52. metadata +9 -73
  53. data/lib/rest-core/builder.rb +0 -162
  54. data/lib/rest-core/client.rb +0 -277
  55. data/lib/rest-core/client/simple.rb +0 -2
  56. data/lib/rest-core/engine.rb +0 -36
  57. data/lib/rest-core/engine/dry.rb +0 -9
  58. data/lib/rest-core/engine/http-client.rb +0 -41
  59. data/lib/rest-core/error.rb +0 -5
  60. data/lib/rest-core/event_source.rb +0 -137
  61. data/lib/rest-core/middleware.rb +0 -151
  62. data/lib/rest-core/promise.rb +0 -249
  63. data/lib/rest-core/thread_pool.rb +0 -131
  64. data/lib/rest-core/timer.rb +0 -58
  65. data/lib/rest-core/util/payload.rb +0 -173
  66. data/test/test_builder.rb +0 -40
  67. data/test/test_client.rb +0 -177
  68. data/test/test_event_source.rb +0 -159
  69. data/test/test_future.rb +0 -16
  70. data/test/test_httpclient.rb +0 -118
  71. data/test/test_payload.rb +0 -204
  72. data/test/test_promise.rb +0 -146
  73. data/test/test_simple.rb +0 -38
  74. data/test/test_thread_pool.rb +0 -10
@@ -1,21 +1,22 @@
1
1
 
2
- require 'rest-core/middleware'
3
2
  require 'rest-core/util/clash'
4
3
 
5
- class RestCore::ClashResponse
6
- def self.members; [:clash_response]; end
7
- include RestCore::Middleware
4
+ module RestCore
5
+ class ClashResponse
6
+ def self.members; [:clash_response]; end
7
+ include Middleware
8
8
 
9
- def call env, &k
10
- return app.call(env, &k) if env[DRY]
11
- return app.call(env, &k) unless clash_response(env)
9
+ def call env, &k
10
+ return app.call(env, &k) if env[DRY]
11
+ return app.call(env, &k) unless clash_response(env)
12
12
 
13
- app.call(env){ |res|
14
- if res[RESPONSE_BODY].kind_of?(Hash)
15
- yield(res.merge(RESPONSE_BODY => Clash.new(res[RESPONSE_BODY])))
16
- else
17
- yield(res)
18
- end
19
- }
13
+ app.call(env){ |res|
14
+ if res[RESPONSE_BODY].kind_of?(Hash)
15
+ yield(res.merge(RESPONSE_BODY => Clash.new(res[RESPONSE_BODY])))
16
+ else
17
+ yield(res)
18
+ end
19
+ }
20
+ end
20
21
  end
21
22
  end
@@ -1,35 +1,36 @@
1
1
 
2
2
  require 'rest-core/event'
3
- require 'rest-core/middleware'
4
3
 
5
- class RestCore::CommonLogger
6
- def self.members; [:log_method]; end
7
- include RestCore::Middleware
4
+ module RestCore
5
+ class CommonLogger
6
+ def self.members; [:log_method]; end
7
+ include Middleware
8
8
 
9
- def call env
10
- start_time = Time.now
11
- flushed = flush(env)
12
- app.call(flushed){ |response|
13
- yield(process(response, start_time))
14
- }
15
- rescue
16
- process(flushed, start_time)
17
- raise
18
- end
9
+ def call env
10
+ start_time = Time.now
11
+ flushed = flush(env)
12
+ app.call(flushed){ |response|
13
+ yield(process(response, start_time))
14
+ }
15
+ rescue
16
+ process(flushed, start_time)
17
+ raise
18
+ end
19
19
 
20
- def process response, start_time
21
- flush(log(response, log_request(start_time, response)))
22
- end
20
+ def process response, start_time
21
+ flush(log(response, log_request(start_time, response)))
22
+ end
23
23
 
24
- def flush env
25
- return env if !log_method(env) || env[DRY]
26
- (env[LOG] || []).compact.
27
- each{ |obj| log_method(env).call("RestCore: #{obj}") }
28
- env.merge(LOG => [])
29
- end
24
+ def flush env
25
+ return env if !log_method(env) || env[DRY]
26
+ (env[LOG] || []).compact.
27
+ each{ |obj| log_method(env).call("RestCore: #{obj}") }
28
+ env.merge(LOG => [])
29
+ end
30
30
 
31
- def log_request start_time, response
32
- Event::Requested.new(Time.now - start_time,
33
- "#{response[RC::REQUEST_METHOD].to_s.upcase} #{request_uri(response)}")
31
+ def log_request start_time, response
32
+ Event::Requested.new(Time.now - start_time,
33
+ "#{response[REQUEST_METHOD].to_s.upcase} #{request_uri(response)}")
34
+ end
34
35
  end
35
36
  end
@@ -1,11 +1,11 @@
1
1
 
2
- require 'rest-core/middleware'
3
-
4
- class RestCore::DefaultHeaders
5
- def self.members; [:headers]; end
6
- include RestCore::Middleware
7
- def call env, &k
8
- h = merge_hash(@headers, headers(env), env[REQUEST_HEADERS])
9
- app.call(env.merge(REQUEST_HEADERS => h), &k)
2
+ module RestCore
3
+ class DefaultHeaders
4
+ def self.members; [:headers]; end
5
+ include Middleware
6
+ def call env, &k
7
+ h = merge_hash(@headers, headers(env), env[REQUEST_HEADERS])
8
+ app.call(env.merge(REQUEST_HEADERS => h), &k)
9
+ end
10
10
  end
11
11
  end
@@ -1,11 +1,11 @@
1
1
 
2
- require 'rest-core/middleware'
3
-
4
- class RestCore::DefaultPayload
5
- def self.members; [:payload]; end
6
- include RestCore::Middleware
7
- def call env, &k
8
- p = merge_hash(@payload, payload(env), env[REQUEST_PAYLOAD])
9
- app.call(env.merge(REQUEST_PAYLOAD => p), &k)
2
+ module RestCore
3
+ class DefaultPayload
4
+ def self.members; [:payload]; end
5
+ include Middleware
6
+ def call env, &k
7
+ p = merge_hash(@payload, payload(env), env[REQUEST_PAYLOAD])
8
+ app.call(env.merge(REQUEST_PAYLOAD => p), &k)
9
+ end
10
10
  end
11
11
  end
@@ -1,11 +1,11 @@
1
1
 
2
- require 'rest-core/middleware'
3
-
4
- class RestCore::DefaultQuery
5
- def self.members; [:query]; end
6
- include RestCore::Middleware
7
- def call env, &k
8
- q = merge_hash(@query, query(env), env[REQUEST_QUERY])
9
- app.call(env.merge(REQUEST_QUERY => q), &k)
2
+ module RestCore
3
+ class DefaultQuery
4
+ def self.members; [:query]; end
5
+ include Middleware
6
+ def call env, &k
7
+ q = merge_hash(@query, query(env), env[REQUEST_QUERY])
8
+ app.call(env.merge(REQUEST_QUERY => q), &k)
9
+ end
10
10
  end
11
11
  end
@@ -1,17 +1,17 @@
1
1
 
2
- require 'rest-core/middleware'
2
+ module RestCore
3
+ class DefaultSite
4
+ def self.members; [:site]; end
5
+ include Middleware
3
6
 
4
- class RestCore::DefaultSite
5
- def self.members; [:site]; end
6
- include RestCore::Middleware
7
+ def call env, &k
8
+ path = if env[REQUEST_PATH].to_s.include?('://')
9
+ env[REQUEST_PATH]
10
+ else
11
+ File.join(site(env).to_s, env[REQUEST_PATH].to_s)
12
+ end
7
13
 
8
- def call env, &k
9
- path = if env[REQUEST_PATH].to_s.include?('://')
10
- env[REQUEST_PATH]
11
- else
12
- File.join(site(env).to_s, env[REQUEST_PATH].to_s)
13
- end
14
-
15
- app.call(env.merge(REQUEST_PATH => path), &k)
14
+ app.call(env.merge(REQUEST_PATH => path), &k)
15
+ end
16
16
  end
17
17
  end
@@ -1,46 +1,46 @@
1
1
 
2
- require 'rest-core/middleware'
2
+ module RestCore
3
+ class Defaults
4
+ def self.members; [:defaults]; end
5
+ include Middleware
3
6
 
4
- class RestCore::Defaults
5
- def self.members; [:defaults]; end
6
- include RestCore::Middleware
7
+ # the use of singleton_class is making serialization hard!
8
+ # def initialize app, defaults
9
+ # super
10
+ # singleton_class.module_eval do
11
+ # defaults.each{ |(key, value)|
12
+ # define_method(key) do |env|
13
+ # if value.respond_to?(:call)
14
+ # value.call
15
+ # else
16
+ # value
17
+ # end
18
+ # end
19
+ # }
20
+ # end
21
+ # end
7
22
 
8
- # the use of singleton_class is making serialization hard!
9
- # def initialize app, defaults
10
- # super
11
- # singleton_class.module_eval do
12
- # defaults.each{ |(key, value)|
13
- # define_method(key) do |env|
14
- # if value.respond_to?(:call)
15
- # value.call
16
- # else
17
- # value
18
- # end
19
- # end
20
- # }
21
- # end
22
- # end
23
-
24
- def method_missing msg, *args, &block
25
- env = args.first
26
- if env.kind_of?(Hash) && (d = defaults(env)) && d.key?(msg)
27
- defaults(env)[msg]
28
- else
29
- super
23
+ def method_missing msg, *args, &block
24
+ env = args.first
25
+ if env.kind_of?(Hash) && (d = defaults(env)) && d.key?(msg)
26
+ defaults(env)[msg]
27
+ else
28
+ super
29
+ end
30
30
  end
31
- end
32
31
 
33
- def respond_to_missing? msg, include_private=false
34
- # since psych would call respond_to? before setting up
35
- # instance variables when restoring ruby objects, we might
36
- # be accessing undefined ivars in that case even all ivars are
37
- # defined in initialize. we can't avoid this because we can't
38
- # use singleton_class (otherwise we can't serialize this)
39
- return super unless instance_variable_defined?(:@defaults)
40
- if (d = defaults({})) && d.key?(msg)
41
- true
42
- else
43
- super
32
+ def respond_to_missing? msg, include_private=false
33
+ # since psych would call respond_to? before setting up
34
+ # instance variables when restoring ruby objects, we might
35
+ # be accessing undefined ivars in that case even all ivars are
36
+ # defined in initialize. we can't avoid this because we can't
37
+ # use singleton_class (otherwise we can't serialize this)
38
+ return super unless instance_variable_defined?(:@defaults)
39
+ if (d = defaults({})) && d.key?(msg)
40
+ true
41
+ else
42
+ super
43
+ end
44
44
  end
45
45
  end
46
46
  end
@@ -1,14 +1,14 @@
1
1
 
2
- require 'rest-core/middleware'
2
+ module RestCore
3
+ class ErrorDetector
4
+ def self.members; [:error_detector]; end
5
+ include Middleware
3
6
 
4
- class RestCore::ErrorDetector
5
- def self.members; [:error_detector]; end
6
- include RestCore::Middleware
7
-
8
- def call env
9
- app.call(env){ |response|
10
- detector = error_detector(env)
11
- yield(fail(response, detector && detector.call(response)))
12
- }
7
+ def call env
8
+ app.call(env){ |response|
9
+ detector = error_detector(env)
10
+ yield(fail(response, detector && detector.call(response)))
11
+ }
12
+ end
13
13
  end
14
14
  end
@@ -1,9 +1,11 @@
1
1
 
2
2
  require 'rest-core/middleware/error_detector'
3
3
 
4
- class RestCore::ErrorDetectorHttp < RestCore::ErrorDetector
5
- def initialize app, detector=nil
6
- super(app, detector ||
7
- lambda{ |env| (env[RESPONSE_STATUS] || 200) / 100 >= 4 })
4
+ module RestCore
5
+ class ErrorDetectorHttp < RestCore::ErrorDetector
6
+ def initialize app, detector=nil
7
+ super(app, detector ||
8
+ lambda{ |env| (env[RESPONSE_STATUS] || 200) / 100 >= 4 })
9
+ end
8
10
  end
9
11
  end
@@ -1,18 +1,18 @@
1
1
 
2
- require 'rest-core/middleware'
2
+ module RestCore
3
+ class ErrorHandler
4
+ def self.members; [:error_handler]; end
5
+ include Middleware
3
6
 
4
- class RestCore::ErrorHandler
5
- def self.members; [:error_handler]; end
6
- include RestCore::Middleware
7
-
8
- def call env
9
- app.call(env){ |res|
10
- h = error_handler(res)
11
- f = res[FAIL] || []
12
- yield(if f.empty? || f.find{ |ff| ff.kind_of?(Exception) } || !h
13
- res
14
- else
15
- fail(res, h.call(res))
16
- end)}
7
+ def call env
8
+ app.call(env){ |res|
9
+ h = error_handler(res)
10
+ f = res[FAIL] || []
11
+ yield(if f.empty? || f.find{ |ff| ff.kind_of?(Exception) } || !h
12
+ res
13
+ else
14
+ fail(res, h.call(res))
15
+ end)}
16
+ end
17
17
  end
18
18
  end
@@ -1,35 +1,36 @@
1
1
 
2
- require 'rest-core/middleware'
2
+ module RestCore
3
+ class FollowRedirect
4
+ def self.members; [:max_redirects]; end
5
+ include Middleware
3
6
 
4
- class RestCore::FollowRedirect
5
- def self.members; [:max_redirects]; end
6
- include RestCore::Middleware
7
-
8
- def call env, &k
9
- if env[DRY]
10
- app.call(env, &k)
11
- else
12
- app.call(env){ |res| process(res, k) }
7
+ def call env, &k
8
+ if env[DRY]
9
+ app.call(env, &k)
10
+ else
11
+ app.call(env){ |res| process(res, k) }
12
+ end
13
13
  end
14
- end
15
14
 
16
- def process res, k
17
- return k.call(res) if max_redirects(res) <= 0
18
- return k.call(res) if ![301,302,303,307].include?(res[RESPONSE_STATUS])
19
- return k.call(res) if [301,302 ,307].include?(res[RESPONSE_STATUS]) &&
20
- ![:get, :head ].include?(res[REQUEST_METHOD])
15
+ def process res, k
16
+ return k.call(res) if max_redirects(res) <= 0
17
+ status = res[RESPONSE_STATUS]
18
+ return k.call(res) if ![301,302,303,307].include?(status)
19
+ return k.call(res) if [301,302 ,307].include?(status) &&
20
+ ![:get, :head ].include?(res[REQUEST_METHOD])
21
21
 
22
- location = [res[RESPONSE_HEADERS]['LOCATION']].flatten.first
23
- meth = if res[RESPONSE_STATUS] == 303
24
- :get
25
- else
26
- res[REQUEST_METHOD]
27
- end
22
+ location = [res[RESPONSE_HEADERS]['LOCATION']].flatten.first
23
+ meth = if status == 303
24
+ :get
25
+ else
26
+ res[REQUEST_METHOD]
27
+ end
28
28
 
29
- give_promise(call(res.merge(
30
- REQUEST_METHOD => meth ,
31
- REQUEST_PATH => location,
32
- REQUEST_QUERY => {} ,
33
- 'max_redirects' => max_redirects(res) - 1), &k))
29
+ give_promise(call(res.merge(
30
+ REQUEST_METHOD => meth ,
31
+ REQUEST_PATH => location,
32
+ REQUEST_QUERY => {} ,
33
+ 'max_redirects' => max_redirects(res) - 1), &k))
34
+ end
34
35
  end
35
36
  end
@@ -1,19 +1,21 @@
1
1
 
2
- require 'rest-core/middleware'
3
2
  require 'rest-core/util/json'
4
3
 
5
- class RestCore::JsonRequest
6
- def self.members; [:json_request]; end
7
- include RestCore::Middleware
4
+ module RestCore
5
+ class JsonRequest
6
+ def self.members; [:json_request]; end
7
+ include Middleware
8
8
 
9
- JSON_REQUEST_HEADER = {'Content-Type' => 'application/json'}.freeze
9
+ JSON_REQUEST_HEADER = {'Content-Type' => 'application/json'}.freeze
10
10
 
11
- def call env, &k
12
- return app.call(env, &k) unless json_request(env)
13
- return app.call(env, &k) unless has_payload?(env)
11
+ def call env, &k
12
+ return app.call(env, &k) unless json_request(env)
13
+ return app.call(env, &k) unless has_payload?(env)
14
14
 
15
- app.call(env.merge(
16
- REQUEST_HEADERS => JSON_REQUEST_HEADER.merge(env[REQUEST_HEADERS]||{}),
17
- REQUEST_PAYLOAD => Json.encode(env[REQUEST_PAYLOAD]) ), &k)
15
+ headers = env[REQUEST_HEADERS] || {}
16
+ app.call(env.merge(
17
+ REQUEST_HEADERS => JSON_REQUEST_HEADER.merge(headers),
18
+ REQUEST_PAYLOAD => Json.encode(env[REQUEST_PAYLOAD])), &k)
19
+ end
18
20
  end
19
21
  end