wrest 3.0.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG +3 -0
  3. data/LICENCE +1 -1
  4. data/README.md +29 -28
  5. data/bin/wrest +2 -1
  6. data/bin/wrest_shell.rb +10 -8
  7. data/lib/wrest/async_request/event_machine_backend.rb +3 -1
  8. data/lib/wrest/async_request/thread_backend.rb +5 -2
  9. data/lib/wrest/async_request/thread_pool.rb +4 -2
  10. data/lib/wrest/async_request.rb +7 -6
  11. data/lib/wrest/cache_proxy.rb +39 -28
  12. data/lib/wrest/caching/memcached.rb +21 -18
  13. data/lib/wrest/caching/redis.rb +22 -22
  14. data/lib/wrest/caching.rb +16 -14
  15. data/lib/wrest/callback.rb +19 -16
  16. data/lib/wrest/components/container/alias_accessors.rb +51 -47
  17. data/lib/wrest/components/container/typecaster.rb +146 -96
  18. data/lib/wrest/components/container.rb +171 -152
  19. data/lib/wrest/components/mutators/base.rb +43 -34
  20. data/lib/wrest/components/mutators/camel_to_snake_case.rb +7 -3
  21. data/lib/wrest/components/mutators/{xml_mini_type_caster.rb → xml_type_caster.rb} +29 -16
  22. data/lib/wrest/components/mutators.rb +21 -19
  23. data/lib/wrest/components/translators/content_types.rb +20 -16
  24. data/lib/wrest/components/translators/json.rb +19 -16
  25. data/lib/wrest/components/translators/txt.rb +19 -15
  26. data/lib/wrest/components/translators/xml/conversions.rb +56 -0
  27. data/lib/wrest/components/translators/xml.rb +60 -18
  28. data/lib/wrest/components/translators.rb +7 -6
  29. data/lib/wrest/components.rb +11 -8
  30. data/lib/wrest/core_ext/hash/conversions.rb +10 -10
  31. data/lib/wrest/core_ext/hash.rb +4 -2
  32. data/lib/wrest/core_ext/string/conversions.rb +14 -13
  33. data/lib/wrest/core_ext/string.rb +5 -3
  34. data/lib/wrest/exceptions.rb +4 -2
  35. data/lib/wrest/hash_with_case_insensitive_access.rb +8 -8
  36. data/lib/wrest/hash_with_indifferent_access.rb +442 -0
  37. data/lib/wrest/http_codes.rb +20 -19
  38. data/lib/wrest/http_shared/headers.rb +2 -0
  39. data/lib/wrest/http_shared/standard_headers.rb +2 -2
  40. data/lib/wrest/http_shared/standard_tokens.rb +8 -6
  41. data/lib/wrest/http_shared.rb +5 -3
  42. data/lib/wrest/multipart.rb +20 -11
  43. data/lib/wrest/native/connection_factory.rb +15 -11
  44. data/lib/wrest/native/delete.rb +15 -11
  45. data/lib/wrest/native/get.rb +60 -56
  46. data/lib/wrest/native/options.rb +15 -11
  47. data/lib/wrest/native/patch.rb +16 -12
  48. data/lib/wrest/native/post.rb +15 -11
  49. data/lib/wrest/native/post_multipart.rb +22 -18
  50. data/lib/wrest/native/put.rb +16 -12
  51. data/lib/wrest/native/put_multipart.rb +22 -18
  52. data/lib/wrest/native/redirection.rb +13 -12
  53. data/lib/wrest/native/request.rb +144 -108
  54. data/lib/wrest/native/response.rb +87 -78
  55. data/lib/wrest/native/session.rb +49 -40
  56. data/lib/wrest/native.rb +14 -12
  57. data/lib/wrest/test/request_patches.rb +10 -3
  58. data/lib/wrest/test.rb +3 -1
  59. data/lib/wrest/uri/builders.rb +14 -12
  60. data/lib/wrest/uri.rb +70 -52
  61. data/lib/wrest/uri_template.rb +11 -7
  62. data/lib/wrest/utils.rb +129 -0
  63. data/lib/wrest/version.rb +3 -1
  64. data/lib/wrest.rb +31 -33
  65. data/lib/wrest_no_ext.rb +2 -0
  66. metadata +98 -48
  67. data/lib/wrest/components/mutators/xml_simple_type_caster.rb +0 -37
  68. data/lib/wrest/xml_mini/jdom/xpath_filter.rb +0 -17
  69. data/lib/wrest/xml_mini/jdom.rb +0 -6
  70. data/lib/wrest/xml_mini/libxml/xpath_filter.rb +0 -12
  71. data/lib/wrest/xml_mini/libxml.rb +0 -8
  72. data/lib/wrest/xml_mini/nokogiri/xpath_filter.rb +0 -15
  73. data/lib/wrest/xml_mini/nokogiri.rb +0 -7
  74. data/lib/wrest/xml_mini/rexml/xpath_filter.rb +0 -15
  75. data/lib/wrest/xml_mini/rexml.rb +0 -8
  76. data/lib/wrest/xml_mini.rb +0 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: f91ae89613e80b46bbae1cab5167b0266c5e09c3
4
- data.tar.gz: f0c445af93ea24acf525ef3daa33d172ee89321a
2
+ SHA256:
3
+ metadata.gz: 07fc2ba6c267b466a0caa4366cb63e1657b5966a4140742ed386c6fd657df03f
4
+ data.tar.gz: f917474be39d0ab7d89a4ba5e652e76798bb51619339dff36ffb0e7453f9b118
5
5
  SHA512:
6
- metadata.gz: 08a26da3142c49d6e2441aba1facad17ccf0f1a35d3ba35e67d24489b0542f1fe21930e58f4afae8b9a36e683bfd53fbc88514b04bce390aa280191c438d57f0
7
- data.tar.gz: 2efeacaca5351a696185e93e21c8647dd4374e2b8e98984fb20000a1f9deaef6f6baf61098f433824dac10248c0f00958accdf0742d0c96219d46cf4d4c4e881
6
+ metadata.gz: 783b115e74659773e4a04de550d713c30a906ecd2e3de517d168d5535a588366164d440fd47782e975d3236aee8d0a66fe37e729f25440ee67592526ee4c89d7
7
+ data.tar.gz: 7b2ed5a8a9638cc5ead4ac39edbb27a54ac03e5a9da97ec627eaa0e322979ba4ffcf1e3e52bfc2ffe61055d6d2f788d445c242954969971a052989e3eeeecf1e
data/CHANGELOG CHANGED
@@ -1,5 +1,8 @@
1
1
  Features under the section marked 'Current' are completed but pending release as a gem. If you need any of these, you'll need to use the latest source from the git repository.
2
2
 
3
+ == Current
4
+ * Upgrade gems and fix build on Ruby 3.1.2
5
+
3
6
  Features under a numbered section are complete and available in the Wrest gem.
4
7
 
5
8
  == 2.2.0
data/LICENCE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright 2009 - 2010 Sidu Ponnappa
1
+ Copyright 2009 - 2022 Sidu Ponnappa
2
2
  Licensed under the Apache License, Version 2.0 (the "License");
3
3
  you may not use this file except in compliance with the License.
4
4
  You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
data/README.md CHANGED
@@ -1,24 +1,36 @@
1
- [![Build Status](https://travis-ci.org/c42/wrest.svg?branch=master)](https://travis-ci.org/c42/wrest)
2
-
3
- # Wrest 2.2.0
4
-
5
- (c) Copyright 2009-2016 [Sidu Ponnappa](http://twitter.com/ponnappa). All Rights Reserved.
6
-
7
- Wrest is a ruby REST/HTTP client library. It is currently in use at substantial scale across all Ruby/JRuby systems at [GO-JEK](https://twitter.com/GojekTech).
8
-
9
- * Allows you to pick your Ruby: use CRuby or JRuby
1
+ # Wrest 4.0.0.dev
2
+
3
+ <p align="center"><img src="docs/wrest-logo-320x320.png" width="320"></p>
4
+ <p align="center">
5
+ <a href="https://rubygems.org/gems/wrest">
6
+ <img src="https://badge.fury.io/rb/wrest.svg" alt="Gem Version" height="18">
7
+ </a>
8
+ <a href="https://github.com/kaiwren/wrest/actions/workflows/ruby.yml">
9
+ <img src="https://github.com/kaiwren/wrest/actions/workflows/ruby.yml/badge.svg" alt="Ruby" style="max-width: 100%;">
10
+ </a>
11
+ <a href="https://github.com/kaiwren/wrest/actions/workflows/jruby.yml">
12
+ <img src="https://github.com/kaiwren/wrest/actions/workflows/jruby.yml/badge.svg" alt="JRuby" style="max-width: 100%;">
13
+ </a>
14
+ <a href="https://codeclimate.com/github/kaiwren/wrest/maintainability">
15
+ <img src="https://api.codeclimate.com/v1/badges/dc0366a60000561951ab/maintainability" />
16
+ </a>
17
+ </p>
18
+
19
+
20
+ Wrest is a ruby REST/HTTP client library. It is currently in use at 10x🦄 scale across all Ruby/JRuby systems at [Gojek](https://twitter.com/GojekTech).
21
+
22
+ * Quick tool to wrangle APIs to powerful library to build complex production grade systems, Wrest does it all
23
+ * Clean, object-oriented API with URLs as first class entities
10
24
  * Supports RFC 2616 based [caching](https://github.com/kaiwren/wrest/blob/caching/Caching.markdown)
11
25
  * Async http calls using Threads (truly useful only on JRuby due to [GIL](https://en.wikipedia.org/wiki/Global_interpreter_lock) limitations on CRuby) or EventMachine
12
- * Allows you to quickly build object oriented wrappers around any web service
13
- * Is designed to be used as a library, not just a command line REST client (fewer class/static methods, more object oriented)
14
26
  * Is spec driven, strongly favours immutable objects and avoids class methods and setters making it better suited for use as a library, especially in multi-threaded environments
15
27
  * Provides convenient HTTP wrappers, redirect handling, serialisation, deserialisation and xpath based lookup
16
28
 
17
- To receive notifications whenever new features are added to Wrest, please subscribe to my [twitter feed](http://twitter.com/ponnappa).
29
+ Wrest is currently undergoing a substantial clean-up of syntax and dendencies to bring it up to speed on Ruby 3.x and JRuby 9.3.x. This will be released shortly as version 4.0.0.
18
30
 
19
31
  ## Examples
20
32
 
21
- For Facebook, Twitter, Delicious, GitHub and other API examples, see http://github.com/c42/wrest/tree/master/examples
33
+ For Facebook, Twitter, Delicious, GitHub and other API examples, see http://github.com/kaiwren/wrest/tree/master/examples
22
34
 
23
35
  ### Basic Http Calls
24
36
 
@@ -27,10 +39,10 @@ For Facebook, Twitter, Delicious, GitHub and other API examples, see http://gith
27
39
  * Basic API calls
28
40
 
29
41
  ```
30
- # Works with json and xml out of the box
42
+ # Works with json and xml out of the box to give you a hash
31
43
  # See lib/wrest/components/translators to add other formats
32
44
 
33
- 'https://api.github.com/repos/c42/wrest/issues'.to_uri.get.deserialize
45
+ 'https://api.github.com/repos/rails/rails/issues'.to_uri.get.deserialize
34
46
  ```
35
47
 
36
48
  * Timeout support
@@ -52,8 +64,6 @@ For Facebook, Twitter, Delicious, GitHub and other API examples, see http://gith
52
64
  * Deserialise with XPath filtering
53
65
 
54
66
  ```
55
- ActiveSupport::XmlMini.backend = 'REXML'
56
-
57
67
  'http://twitter.com/statuses/public_timeline.xml'.to_uri.get.deserialise(
58
68
  xpath: '//user/name/text()'
59
69
  )
@@ -351,17 +361,6 @@ Detailed http debug logging can be turned on like so (DO NOT USE IN PRODUCTION!
351
361
  'https://api.github.com/repos/c42/wrest/issues'.to_uri(detailed_http_logging: $stdout).get.deserialize
352
362
  ```
353
363
 
354
-
355
- ### Json Backend
356
-
357
- Wrest uses the multi_json gem to manage Json backends, allowing it to play nice with Rails 3.1. To change the backend used, you can do the following:
358
-
359
- ```
360
- MultiJson.engine = :json_gem
361
- ```
362
-
363
- For more information, look up the [multi_json](http://github.com/intridea/multi_json) documentation.
364
-
365
364
  ### Build
366
365
 
367
366
  Standard options are available and can be listed using `rake -T`. Use rake:rcov for coverage and rake:rdoc to generate documentation. The link to the continuous integration build is over at the C42 Engineering [open source](http://c42.in/open_source) page.
@@ -433,3 +432,5 @@ Run the tests in a different terminal:
433
432
  * Jacques Crocker : [railsjedi](http://github.com/railsjedi)
434
433
  * Jasim A Basheer: [jasim](http://github.com/jasim)
435
434
  * Arvind Laxminarayan: [ardsrk](http://github.com/ardsrk)
435
+
436
+ ©️ Copyright 2009-2022 [Sidu Ponnappa](http://twitter.com/ponnappa). All Rights Reserved.
data/bin/wrest CHANGED
@@ -1,3 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
- load(File.dirname(__FILE__)+'/wrest_shell.rb')
4
+ load(File.join(__dir__, 'wrest_shell.rb'))
data/bin/wrest_shell.rb CHANGED
@@ -1,21 +1,23 @@
1
+ # frozen_string_literal: true
2
+
1
3
  puts "Ruby #{RUBY_VERSION}, #{RUBY_RELEASE_DATE}, #{RUBY_PLATFORM}"
2
4
 
3
- entry_point = File.expand_path "#{File.dirname(__FILE__)}/../lib/wrest.rb"
4
- version = File.expand_path "#{File.dirname(__FILE__)}/../lib/wrest/version.rb"
5
+ entry_point = File.join(__dir__, '..', 'lib', 'wrest.rb')
6
+ version_file = File.expand_path(File.join(__dir__, '..', 'lib', 'wrest', 'version.rb'))
5
7
 
6
8
  irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
7
9
 
8
10
  require 'optparse'
9
- options = { :irb => irb }
11
+ options = { irb: irb }
10
12
  OptionParser.new do |opt|
11
- opt.banner = "Usage: console [options]"
13
+ opt.banner = 'Usage: console [options]'
12
14
  opt.on("--irb=[#{irb}]", 'Invoke a different irb.') { |v| options[:irb] = v }
13
15
  opt.parse!(ARGV)
14
16
  end
15
17
 
16
- libs = " -r irb/completion"
17
- libs << " -r #{entry_point}"
18
+ libs = ' -r irb/completion ' \
19
+ "-r #{entry_point}"
18
20
 
19
- require version
21
+ require version_file
20
22
  puts "Loading Wrest #{Wrest::VERSION}"
21
- exec "#{options[:irb]} #{libs} --simple-prompt"
23
+ exec "#{options[:irb]} #{libs} --simple-prompt"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright 2009 Sidu Ponnappa
2
4
 
3
5
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -10,7 +12,7 @@
10
12
  begin
11
13
  gem 'eventmachine'
12
14
  rescue Gem::LoadError => e
13
- Wrest.logger.debug "Eventmachine ~> 0.12.10 not found. Wrest uses Eventmachine to perform evented asynchronous requests"
15
+ Wrest.logger.debug 'Eventmachine ~> 0.12.10 not found. Wrest uses Eventmachine to perform evented asynchronous requests'
14
16
  raise e
15
17
  end
16
18
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright 2009 Sidu Ponnappa
2
4
 
3
5
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -13,14 +15,15 @@ module Wrest
13
15
  # Only recommended for production use on JRuby.
14
16
  class ThreadBackend
15
17
  attr_reader :thread_pool
18
+
16
19
  def initialize(number_of_threads = 5)
17
20
  @thread_pool = ThreadPool.new(number_of_threads)
18
21
  end
19
-
22
+
20
23
  def execute(request)
21
24
  @thread_pool.execute_eventually(request)
22
25
  end
23
-
26
+
24
27
  # Uses Thread#join to wait until all
25
28
  # background requests are completed.
26
29
  def wait_for_thread_pool!
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright 2009-2016 Sidu Ponnappa
2
4
 
3
5
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -13,12 +15,12 @@ module Wrest
13
15
  def initialize(number_of_threads)
14
16
  @pool = Concurrent::FixedThreadPool.new(number_of_threads)
15
17
  end
16
-
18
+
17
19
  def execute_eventually(request)
18
20
  @pool.post { request.invoke }
19
21
  nil
20
22
  end
21
-
23
+
22
24
  def join_pool_threads!
23
25
  @pool.wait_for_termination
24
26
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright 2009 Sidu Ponnappa
2
4
 
3
5
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -7,12 +9,11 @@
7
9
  # is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8
10
  # See the License for the specific language governing permissions and limitations under the License.
9
11
 
10
-
11
12
  module Wrest
12
13
  module AsyncRequest
13
14
  # Loads Wrest eventmachine backend alongwith eventmachine gem
14
15
  def self.enable_em
15
- require "wrest/async_request/event_machine_backend"
16
+ require 'wrest/async_request/event_machine_backend'
16
17
  end
17
18
 
18
19
  # Assign default backend to be used for asynchronous request. Default is to use threads
@@ -20,13 +21,13 @@ module Wrest
20
21
  @default_backend = backend
21
22
  end
22
23
 
23
- # Assign default backend for asynchronous request to using eventmachine.
24
+ # Assign default backend for asynchronous request to using eventmachine.
24
25
  def self.default_to_em!
25
- self.enable_em
26
+ enable_em
26
27
  self.default_backend = Wrest::AsyncRequest::EventMachineBackend.new
27
28
  end
28
29
 
29
- # Assign default backend for asynchronous request to using threads.
30
+ # Assign default backend for asynchronous request to using threads.
30
31
  def self.default_to_threads!(number_of_threads = 5)
31
32
  self.default_backend = Wrest::AsyncRequest::ThreadBackend.new(number_of_threads)
32
33
  end
@@ -35,7 +36,7 @@ module Wrest
35
36
  def self.default_backend
36
37
  @default_backend || default_to_threads!
37
38
  end
38
-
39
+
39
40
  # Uses Thread#join to wait until all background requests
40
41
  # are completed.
41
42
  #
@@ -1,5 +1,6 @@
1
- module Wrest
1
+ # frozen_string_literal: true
2
2
 
3
+ module Wrest
3
4
  class CacheProxy
4
5
  class << self
5
6
  def new(get, cache_store)
@@ -15,20 +16,21 @@ module Wrest
15
16
  def initialize(get)
16
17
  @get = get
17
18
  end
19
+
18
20
  def get
19
21
  @get.invoke_without_cache_check
20
22
  end
21
23
  end
22
24
 
23
25
  class DefaultCacheProxy
24
- HOP_BY_HOP_HEADERS = ["connection",
25
- "keep-alive",
26
- "proxy-authenticate",
27
- "proxy-authorization",
28
- "te",
29
- "trailers",
30
- "transfer-encoding",
31
- "upgrade"]
26
+ HOP_BY_HOP_HEADERS = %w[connection
27
+ keep-alive
28
+ proxy-authenticate
29
+ proxy-authorization
30
+ te
31
+ trailers
32
+ transfer-encoding
33
+ upgrade].freeze
32
34
 
33
35
  def initialize(get, cache_store)
34
36
  @get = get
@@ -36,19 +38,15 @@ module Wrest
36
38
  end
37
39
 
38
40
  def log_cached_response
39
- Wrest.logger.debug "<*> (GET #{@get.hash}) #{@get.uri.protocol}://#{@get.uri.host}:#{@get.uri.port}#{@get.http_request.path}"
41
+ Wrest.logger.debug "<*> (GET #{@get.hash}) #{@get.uri.protocol}://#{@get.uri.host}:#{@get.uri.port}#{@get.http_request.path}"
40
42
  end
41
-
43
+
42
44
  def get
43
45
  cached_response = @cache_store[@get.full_uri_string]
44
- return get_fresh_response if cached_response.nil?
46
+ return fresh_get_response if cached_response.nil?
45
47
 
46
48
  if cached_response.expired?
47
- if cached_response.can_be_validated?
48
- get_validated_response_for(cached_response)
49
- else
50
- get_fresh_response
51
- end
49
+ expired_cached_response(cached_response)
52
50
  else
53
51
  log_cached_response
54
52
  cached_response
@@ -57,15 +55,17 @@ module Wrest
57
55
 
58
56
  def update_cache_headers_for(cached_response, new_response)
59
57
  # RFC 2616 13.5.3 (Combining Headers)
60
- cached_response.headers.merge!(new_response.headers.select {|key, value| not (HOP_BY_HOP_HEADERS.include? key.downcase)})
58
+ cached_response.headers.merge!(new_response.headers.reject do |key, _value|
59
+ (HOP_BY_HOP_HEADERS.include? key.downcase)
60
+ end)
61
61
  end
62
62
 
63
63
  def cache(response)
64
- @cache_store[@get.full_uri_string] = response.clone if response && response.cacheable?
64
+ @cache_store[@get.full_uri_string] = response.clone if response&.cacheable?
65
65
  end
66
66
 
67
- #:nodoc:
68
- def get_fresh_response
67
+ # :nodoc:
68
+ def fresh_get_response
69
69
  @cache_store.delete @get.full_uri_string
70
70
 
71
71
  response = @get.invoke_without_cache_check
@@ -75,10 +75,10 @@ module Wrest
75
75
  response
76
76
  end
77
77
 
78
- #:nodoc:
78
+ # :nodoc:
79
79
  def get_validated_response_for(cached_response)
80
80
  new_response = send_validation_request_for(cached_response)
81
- if new_response.code == "304"
81
+ if new_response.code == '304'
82
82
  update_cache_headers_for(cached_response, new_response)
83
83
  log_cached_response
84
84
  cached_response
@@ -88,21 +88,32 @@ module Wrest
88
88
  end
89
89
  end
90
90
 
91
- #:nodoc:
91
+ # :nodoc:
92
92
  # Send a cache-validation request to the server. This would be the actual Get request with extra cache-validation headers.
93
93
  # If a 304 (Not Modified) is received, Wrest would use the cached_response itself. Otherwise the new response is cached and used.
94
94
  def send_validation_request_for(cached_response)
95
95
  last_modified = cached_response.last_modified
96
- etag = cached_response.headers["etag"]
96
+ etag = cached_response.headers['etag']
97
97
 
98
98
  cache_validation_headers = {}
99
- cache_validation_headers["if-modified-since"] = last_modified unless last_modified.nil?
100
- cache_validation_headers["if-none-match"] = etag unless etag.nil?
99
+ cache_validation_headers['if-modified-since'] = last_modified unless last_modified.nil?
100
+ cache_validation_headers['if-none-match'] = etag unless etag.nil?
101
101
 
102
102
  new_request = @get.build_request_without_cache_store(cache_validation_headers)
103
103
 
104
104
  new_request.invoke
105
105
  end
106
+
107
+ private
108
+
109
+ # :nodoc:
110
+ def expired_cached_response(cached_response)
111
+ if cached_response.can_be_validated?
112
+ get_validated_response_for(cached_response)
113
+ else
114
+ fresh_get_response
115
+ end
116
+ end
106
117
  end
107
118
  end
108
- end
119
+ end
@@ -1,34 +1,37 @@
1
+ # frozen_string_literal: true
2
+
1
3
  begin
2
4
  gem 'dalli', '~> 2'
3
5
  rescue Gem::LoadError => e
4
- Wrest.logger.debug "Dalli ~> 2 not found. The Dalli gem is necessary to use the memcached caching back-end."
6
+ Wrest.logger.debug 'Dalli ~> 2 not found. The Dalli gem is necessary to use the memcached caching back-end.'
5
7
  raise e
6
8
  end
7
9
 
8
10
  require 'dalli'
9
11
 
10
- module Wrest::Caching
11
- class Memcached
12
+ module Wrest
13
+ module Caching
14
+ class Memcached
15
+ def initialize(server_urls = nil, options = {})
16
+ @memcached = Dalli::Client.new(server_urls, options)
17
+ end
12
18
 
13
- def initialize(server_urls=nil, options={})
14
- @memcached = Dalli::Client.new(server_urls, options)
15
- end
19
+ def [](key)
20
+ @memcached.get(key)
21
+ end
16
22
 
17
- def [](key)
18
- @memcached.get(key)
19
- end
23
+ def []=(key, value)
24
+ @memcached.set(key, value)
25
+ end
20
26
 
21
- def []=(key, value)
22
- @memcached.set(key, value)
23
- end
27
+ # should be compatible with Hash - return value of the deleted element.
28
+ def delete(key)
29
+ value = self[key]
24
30
 
25
- # should be compatible with Hash - return value of the deleted element.
26
- def delete(key)
27
- value = self[key]
28
-
29
- @memcached.delete key
31
+ @memcached.delete key
30
32
 
31
- return value
33
+ value
34
+ end
32
35
  end
33
36
  end
34
37
  end
@@ -1,38 +1,38 @@
1
+ # frozen_string_literal: true
2
+
1
3
  begin
2
4
  gem 'redis', '~> 3'
3
5
  rescue Gem::LoadError => e
4
- Wrest.logger.debug "Redis ~> 3 not found. The Redis gem is necessary to use redis as a caching back-end."
6
+ Wrest.logger.debug 'Redis ~> 3 not found. The Redis gem is necessary to use redis as a caching back-end.'
5
7
  raise e
6
8
  end
7
9
 
8
10
  require 'redis'
9
11
  require 'yaml'
10
12
 
11
- module Wrest::Caching
12
- class Redis
13
+ module Wrest
14
+ module Caching
15
+ class Redis
16
+ def initialize(redis_options = {})
17
+ @redis = ::Redis.new(redis_options)
18
+ end
13
19
 
14
- def initialize(redis_options = {})
15
- @redis = ::Redis.new(redis_options)
16
- end
20
+ def [](key)
21
+ value = @redis.get(key)
22
+ value.nil? ? nil : YAML.unsafe_load(value)
23
+ end
17
24
 
18
- def [](key)
19
- value = @redis.get(key)
20
- unmarshalled_value = value.nil? ? nil : YAML::load(value)
21
- unmarshalled_value
22
- end
25
+ def []=(key, response)
26
+ marshalled_response = YAML.dump(response)
27
+ @redis.set(key, marshalled_response)
28
+ @redis.expire(key, response.freshness_lifetime) unless response.expired?
29
+ end
23
30
 
24
- def []=(key, response)
25
- marshalled_response = YAML::dump(response)
26
- @redis.set(key, marshalled_response)
27
- unless response.expired?
28
- @redis.expire(key, response.freshness_lifetime)
31
+ def delete(key)
32
+ value = self[key]
33
+ @redis.del(key)
34
+ value
29
35
  end
30
36
  end
31
-
32
- def delete(key)
33
- value = self[key]
34
- @redis.del(key)
35
- return value
36
- end
37
37
  end
38
38
  end
data/lib/wrest/caching.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright 2009 Sidu Ponnappa
2
4
 
3
5
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -9,42 +11,42 @@
9
11
 
10
12
  module Wrest
11
13
  module Caching
12
- # Loads the Memcached caching back-end and the Dalli gem
14
+ # Loads the Memcached caching back-end and the Dalli gem
13
15
  def self.enable_memcached
14
- require "wrest/caching/memcached"
16
+ require 'wrest/caching/memcached'
15
17
  end
16
-
17
- # Loads the Redis caching back-end and the Redis gem
18
+
19
+ # Loads the Redis caching back-end and the Redis gem
18
20
  def self.enable_redis
19
- require "wrest/caching/redis"
21
+ require 'wrest/caching/redis'
20
22
  end
21
23
 
22
24
  # Configures Wrest to cache all requests. This will use a Ruby Hash.
23
- # WARNING: This should NEVER be used in a real environment. The Hash will
25
+ # WARNING: This should NEVER be used in a real environment. The Hash will
24
26
  # keep growing since Wrest does not limit the size of a cache store.
25
27
  #
26
28
  # Please switch to the memcached or redis back-end for production use.
27
29
  def self.default_to_hash!
28
- self.default_store = Hash.new
30
+ self.default_store = ({})
29
31
  end
30
32
 
31
- # Default Wrest to using memcached for caching requests.
33
+ # Default Wrest to using memcached for caching requests.
32
34
  def self.default_to_memcached!
33
- self.enable_memcached
34
- self.default_store = Wrest::Caching::Memcached.new
35
+ enable_memcached
36
+ self.default_store = Wrest::Caching::Memcached.new
35
37
  end
36
-
38
+
37
39
  # Default Wrest to using redis for caching requests.
38
- #
40
+ #
39
41
  # Options to configuring the redis gem can be passed as arguments.
40
42
  def self.default_to_redis!(redis_options = {})
41
- self.enable_redis
43
+ enable_redis
42
44
  self.default_store = Wrest::Caching::Redis.new(redis_options)
43
45
  end
44
46
 
45
47
  # Assign the default cache store to be used. Default is none.
46
48
  def self.default_store=(store)
47
- @default_store = store
49
+ @default_store = store
48
50
  end
49
51
 
50
52
  # Returns the default store for caching, if any is set.
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright 2009 Sidu Ponnappa
2
4
 
3
5
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -12,12 +14,13 @@ module Wrest
12
14
  attr_reader :callback_hash
13
15
 
14
16
  def initialize(callable)
15
- if callable.is_a?(Hash)
17
+ case callable
18
+ when Hash
16
19
  @callback_hash = Callback.ensure_values_are_collections(callable)
17
- elsif callable.is_a?(Proc)
20
+ when Proc
18
21
  @callback_hash = {}
19
22
  callable.call(self)
20
- elsif callable.is_a?(Callback)
23
+ when Callback
21
24
  @callback_hash = callable.callback_hash.dup
22
25
  end
23
26
  end
@@ -34,12 +37,12 @@ module Wrest
34
37
 
35
38
  def execute(response)
36
39
  callback_hash.each do |code, callback_list|
37
- callback_list.each {|callback| callback.call(response)} if case code
38
- when Range
39
- code.include?(response.code.to_i)
40
- when Fixnum
41
- code == response.code.to_i
42
- end
40
+ callback_list.each { |callback| callback.call(response) } if case code
41
+ when Range
42
+ code.include?(response.code.to_i)
43
+ when Integer
44
+ code == response.code.to_i
45
+ end
43
46
  end
44
47
  end
45
48
 
@@ -47,14 +50,14 @@ module Wrest
47
50
  @callback_hash[code] ? @callback_hash[code] << block : @callback_hash[code] = [block]
48
51
  end
49
52
 
50
- {200 => "ok", 201 => "created", 202 => "accepted", 204 => "no_content", 301 => "moved_permanently", 302 => "found", 303 => "see_other", 304 => "not_modified",
51
- 307 => "temporary_redirect", 400 => "bad_request", 401 => "unauthorized", 403 => "forbidden", 404 => "not_found", 405 => "method_not_allowed",
52
- 406 => "not_acceptable", 422 => "unprocessable_entity", 500 => "internal_server_error"}.each do |code, method|
53
- method_name = "on_#{method}".to_sym
54
- define_method method_name do |&block|
55
- (@callback_hash[code] ? @callback_hash[code] << block : @callback_hash[code] = [block]) if block
56
- end
53
+ { 200 => 'ok', 201 => 'created', 202 => 'accepted', 204 => 'no_content', 301 => 'moved_permanently', 302 => 'found', 303 => 'see_other', 304 => 'not_modified',
54
+ 307 => 'temporary_redirect', 400 => 'bad_request', 401 => 'unauthorized', 403 => 'forbidden', 404 => 'not_found', 405 => 'method_not_allowed',
55
+ 406 => 'not_acceptable', 422 => 'unprocessable_entity', 500 => 'internal_server_error' }.each do |code, method|
56
+ method_name = "on_#{method}".to_sym
57
+ define_method method_name do |&block|
58
+ (@callback_hash[code] ? @callback_hash[code] << block : @callback_hash[code] = [block]) if block
57
59
  end
60
+ end
58
61
 
59
62
  def self.ensure_values_are_collections(hash)
60
63
  result = {}