wrest 3.0.0 → 4.0.0

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.
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
@@ -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,26 +9,27 @@
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 Components
13
- module Translators::Json
14
- extend self
14
+ module Translators
15
+ module Json
16
+ module_function
15
17
 
16
- def deserialise(response, options = {})
17
- ActiveSupport::JSON.decode(response.body)
18
- end
18
+ def deserialise(response, _options = {})
19
+ JSON.parse(response.body)
20
+ end
19
21
 
20
- def deserialize(response, options = {})
21
- deserialise(response, options)
22
- end
23
-
24
- def serialise(hash, options = {})
25
- hash.to_json(options)
26
- end
27
-
28
- def serialize(hash, options = {})
29
- serialise(hash, options)
22
+ def deserialize(response, options = {})
23
+ deserialise(response, options)
24
+ end
25
+
26
+ def serialise(hash, options = {})
27
+ hash.to_json(options)
28
+ end
29
+
30
+ def serialize(hash, options = {})
31
+ serialise(hash, options)
32
+ end
30
33
  end
31
34
  end
32
35
  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,24 +9,26 @@
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
  module Wrest
10
- module Components::Translators
11
- module Txt
12
- extend self
12
+ module Components
13
+ module Translators
14
+ module Txt
15
+ module_function
13
16
 
14
- def deserialise(response,options={})
15
- response.body
16
- end
17
+ def deserialise(response, _options = {})
18
+ response.body
19
+ end
17
20
 
18
- def deserialize(response, options = {})
19
- deserialise(response, options)
20
- end
21
+ def deserialize(response, options = {})
22
+ deserialise(response, options)
23
+ end
21
24
 
22
- def serialise(hash, options = {})
23
- hash.inspect
24
- end
25
-
26
- def serialize(hash, options = {})
27
- serialise(hash, options)
25
+ def serialise(hash, _options = {})
26
+ hash.inspect
27
+ end
28
+
29
+ def serialize(hash, options = {})
30
+ serialise(hash, options)
31
+ end
28
32
  end
29
33
  end
30
34
  end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Wrest
4
+ module Components
5
+ module Translators
6
+ module Xml
7
+ module Conversions # :nodoc:
8
+ module Document # :nodoc:
9
+ def to_hash
10
+ root.to_hash
11
+ end
12
+ end
13
+
14
+ module Node # :nodoc:
15
+ CONTENT_ROOT = '__content__'
16
+
17
+ # Convert XML document to hash.
18
+ #
19
+ # hash::
20
+ # Hash to merge the converted element into.
21
+ def to_hash(hash = {})
22
+ node_hash = {}
23
+
24
+ # Insert node hash into parent hash correctly.
25
+ case hash[name]
26
+ when Array then hash[name] << node_hash
27
+ when Hash then hash[name] = [hash[name], node_hash]
28
+ when nil then hash[name] = node_hash
29
+ end
30
+
31
+ # Handle child elements
32
+ children.each do |c|
33
+ if c.element?
34
+ c.to_hash(node_hash)
35
+ elsif c.text? || c.cdata?
36
+ node_hash[CONTENT_ROOT] ||= +''
37
+ node_hash[CONTENT_ROOT] << c.content
38
+ end
39
+ end
40
+
41
+ # Remove content node if it is blank and there are child tags
42
+ node_hash.delete(CONTENT_ROOT) if node_hash.length > 1 && Utils.object_blank?(node_hash[CONTENT_ROOT])
43
+
44
+ # Handle attributes
45
+ attribute_nodes.each { |a| node_hash[a.node_name] = a.value }
46
+
47
+ hash
48
+ end
49
+ end
50
+ end
51
+ Nokogiri::XML::Document.include(Conversions::Document)
52
+ Nokogiri::XML::Node.include(Conversions::Node)
53
+ end
54
+ end
55
+ end
56
+ 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");
@@ -6,29 +8,69 @@
6
8
  # Unless required by applicable law or agreed to in writing, software distributed under the License
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.
11
+
12
+ require_relative 'xml/conversions'
13
+
9
14
  module Wrest
10
- module Components::Translators
11
- module Xml
12
- extend self
15
+ module Components
16
+ module Translators
17
+ module Xml
18
+ module_function
13
19
 
14
- def deserialise(response,options={})
15
- if(!options[:xpath].nil?)
16
- ActiveSupport::XmlMini.filter(response.body,options[:xpath])
17
- else
18
- Hash.from_xml(response.body)
20
+ def deserialise(response, options = {})
21
+ data = response.body
22
+ data = StringIO.new(data || '') unless data.respond_to?(:read)
23
+ return {} if data.eof?
24
+
25
+ if options[:xpath].nil?
26
+ parse(data)
27
+ else
28
+ search(data, options[:xpath])
29
+ end
19
30
  end
20
- end
21
31
 
22
- def deserialize(response, options = {})
23
- deserialise(response, options)
24
- end
32
+ def deserialize(response, options = {})
33
+ deserialise(response, options)
34
+ end
25
35
 
26
- def serialise(hash, options = {})
27
- hash.to_xml(options)
28
- end
29
-
30
- def serialize(hash, options = {})
31
- serialise(hash, options)
36
+ def serialise(hash, _options = {})
37
+ to_xml(hash)
38
+ end
39
+
40
+ def serialize(hash, options = {})
41
+ serialise(hash, options)
42
+ end
43
+
44
+ def to_xml(hash, builder = nil)
45
+ builder ||= Nokogiri::XML::Builder.new
46
+ hash.each_with_object(builder) do |(key, value), inner_builder|
47
+ if value.is_a?(Hash)
48
+ inner_builder.send(key.to_s) do |child_builder|
49
+ to_xml(value, child_builder)
50
+ end
51
+ else
52
+ inner_builder.send(key.to_s, value.to_s)
53
+ end
54
+ end.to_xml
55
+ end
56
+
57
+ # Parse an XML Document string or IO into a simple hash using libxml / nokogiri.
58
+ # data::
59
+ # XML Document string or IO to parse
60
+ def parse(data)
61
+ build_nokogiri_doc(data).to_hash
62
+ end
63
+
64
+ def search(data, xpath)
65
+ build_nokogiri_doc(data).xpath(xpath)
66
+ end
67
+
68
+ def build_nokogiri_doc(data)
69
+ doc = Nokogiri::XML(data)
70
+ raise doc.errors.join("\n") if doc.errors.length.positive?
71
+
72
+ doc
73
+ end
32
74
  end
33
75
  end
34
76
  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,7 +9,6 @@
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 Components
13
14
  # Contains strategies/lambdas which know how to deserialise
@@ -17,13 +18,13 @@ module Wrest
17
18
  # the content type
18
19
  def self.lookup(content_type)
19
20
  translator = CONTENT_TYPES[content_type]
20
- translator || (raise Wrest::Exceptions::UnsupportedContentType.new("Unsupported content type #{content_type}"))
21
+ translator || (raise Wrest::Exceptions::UnsupportedContentType, "Unsupported content type #{content_type}")
21
22
  end
22
23
  end
23
24
  end
24
25
  end
25
26
 
26
- require "wrest/components/translators/txt"
27
- require "wrest/components/translators/xml"
28
- require "wrest/components/translators/json"
29
- require "wrest/components/translators/content_types"
27
+ require 'wrest/components/translators/txt'
28
+ require 'wrest/components/translators/xml'
29
+ require 'wrest/components/translators/json'
30
+ require 'wrest/components/translators/content_types'
@@ -1,11 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright 2009 Sidu Ponnappa
2
4
 
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6
- # Unless required by applicable law or agreed to in writing, software distributed under the License
7
- # is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8
- # See the License for the specific language governing permissions and limitations under the License.
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
8
+ # Unless required by applicable law or agreed to in writing, software distributed under the License
9
+ # is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
+ # See the License for the specific language governing permissions and limitations under the License.
9
11
 
10
12
  module Wrest
11
13
  # A component is a building block that can
@@ -15,5 +17,6 @@ module Wrest
15
17
  end
16
18
  end
17
19
 
18
- require "wrest/components/container"
19
- require "wrest/components/translators"
20
+ require 'wrest/components/container'
21
+ require 'wrest/components/mutators'
22
+ require 'wrest/components/translators'
@@ -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");
@@ -8,37 +10,35 @@
8
10
  # See the License for the specific language governing permissions and limitations under the License.
9
11
 
10
12
  module Wrest
11
- module CoreExt #:nodoc:
12
- module Hash #:nodoc:
13
+ module CoreExt # :nodoc:
14
+ module Hash # :nodoc:
13
15
  # Makes it easier to build other objects from a Hash
14
16
  module Conversions
15
-
16
17
  # This method accepts a hash mutator (found in Wrest::Compononents)
17
18
  # to build a new hash map by making changes to an existing one.
18
19
  #
19
- # No, this method does not mutate the state of the hash it is invoked on,
20
+ # No, this method does not mutate the state of the hash it is invoked on,
20
21
  # but rather builds a new one.
21
22
  #
22
- # Yes, the name is misleading in that respect. However, one
23
+ # Yes, the name is misleading in that respect. However, one
23
24
  # hopes the absence of an exclamation mark will increase clarity.
24
25
  #
25
26
  # Uses include mutating the hash produced by deserialising xml
26
27
  # by using the meta data in the hash to type cast values.
27
- #
28
+ #
28
29
  # Example:
29
30
  # "http://search.yahooapis.com/NewsSearchService/V1/newsSearch".to_uri.get(
30
- # :appid => 'YahooDemo',
31
+ # :appid => 'YahooDemo',
31
32
  # :output => 'xml',
32
33
  # :query => 'India',
33
34
  # :results=> '3',
34
35
  # :start => '1'
35
- # ).deserialise.mutate_using(XmlSimpleTypeCaster.new)
36
+ # ).deserialise.mutate_using(XmlTypeCaster.new)
36
37
  def mutate_using(mutator)
37
38
  mutated_hash = {}
38
- self.each{|tuple| mutated_hash.store(*mutator.mutate(tuple))}
39
+ each { |tuple| mutated_hash.store(*mutator.mutate(tuple)) }
39
40
  mutated_hash
40
41
  end
41
-
42
42
  end
43
43
  end
44
44
  end
@@ -1,5 +1,7 @@
1
- require "wrest/core_ext/hash/conversions"
1
+ # frozen_string_literal: true
2
2
 
3
- class Hash #:nodoc:
3
+ require 'wrest/core_ext/hash/conversions'
4
+
5
+ class Hash # :nodoc:
4
6
  include Wrest::CoreExt::Hash::Conversions
5
7
  end
@@ -1,19 +1,21 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright 2009 Sidu Ponnappa
2
4
 
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6
- # Unless required by applicable law or agreed to in writing, software distributed under the License
7
- # is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8
- # See the License for the specific language governing permissions and limitations under the License.
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
8
+ # Unless required by applicable law or agreed to in writing, software distributed under the License
9
+ # is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
+ # See the License for the specific language governing permissions and limitations under the License.
9
11
 
10
12
  module Wrest
11
- module CoreExt #:nodoc:
12
- module String #:nodoc:
13
+ module CoreExt # :nodoc:
14
+ module String # :nodoc:
13
15
  # Makes it easier to build other objects from a String
14
16
  # This module is opt-out - if you don't want the to_uri
15
- # and to_uri_template convenience method on String, set
16
- # the NoStringExtensions constant on the Wrest module
17
+ # and to_uri_template convenience method on String, set
18
+ # the NoStringExtensions constant on the Wrest module
17
19
  # before requiring wrest.
18
20
  #
19
21
  # module Wrest
@@ -21,15 +23,14 @@ module Wrest
21
23
  # end
22
24
  # require 'wrest'
23
25
  module Conversions
24
-
25
26
  # A convenience method equivalent to Wrest::Uri.new(string)
26
27
  def to_uri(options = {})
27
- Wrest::Uri.new(self.strip, options)
28
+ Wrest::Uri.new(strip, options)
28
29
  end
29
30
 
30
31
  # A convenience method equivalent to Wrest:UriTemplate.new(uri_pattern)
31
32
  def to_uri_template(options = {})
32
- Wrest::UriTemplate.new(self.strip, options)
33
+ Wrest::UriTemplate.new(strip, options)
33
34
  end
34
35
  end
35
36
  end
@@ -1,5 +1,7 @@
1
- require "wrest/core_ext/string/conversions"
1
+ # frozen_string_literal: true
2
2
 
3
- class String #:nodoc:
3
+ require 'wrest/core_ext/string/conversions'
4
+
5
+ class String # :nodoc:
4
6
  include Wrest::CoreExt::String::Conversions unless Wrest.const_defined?('NoStringExtensions')
5
- end
7
+ end
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Wrest
2
- module Exceptions #:nodoc:
4
+ module Exceptions # :nodoc:
3
5
  # Raised when a base method that should be overriden
4
6
  # is invoked on a subclass that has not implemented it.
5
7
  class MethodNotOverridden < StandardError
@@ -26,7 +28,7 @@ module Wrest
26
28
  # Raised when a request times out
27
29
  class Timeout < StandardError
28
30
  end
29
-
31
+
30
32
  class UnsupportedHttpVerb < StandardError
31
33
  end
32
34
 
@@ -1,5 +1,6 @@
1
- module Wrest
1
+ # frozen_string_literal: true
2
2
 
3
+ module Wrest
3
4
  # A hash with case-insensitive key access.
4
5
  #
5
6
  # hash = Wrest::HashWithCaseInsensitiveAccess.new 'Abcd' => 1, 'xyz' => 2
@@ -7,14 +8,14 @@ module Wrest
7
8
  # hash['abcd'] #=> 1
8
9
  # hash['aBCd'] #=> 1
9
10
  #
10
- class HashWithCaseInsensitiveAccess < ::Hash #:nodoc:
11
-
12
- def initialize(hash={})
11
+ class HashWithCaseInsensitiveAccess < ::Hash # :nodoc:
12
+ def initialize(hash = {})
13
13
  super()
14
14
  hash.each do |key, value|
15
15
  self[convert_key(key)] = value
16
16
  end
17
17
  end
18
+
18
19
  def [](key)
19
20
  super(convert_key(key))
20
21
  end
@@ -44,9 +45,8 @@ module Wrest
44
45
 
45
46
  protected
46
47
 
47
- def convert_key(key)
48
- key.is_a?(String) ? key.downcase : key
49
- end
50
-
48
+ def convert_key(key)
49
+ key.is_a?(String) ? key.downcase : key
50
+ end
51
51
  end
52
52
  end