activeresource 6.0.0 → 6.2.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.
- checksums.yaml +4 -4
 - data/README.md +3 -1
 - data/lib/active_resource/active_job_serializer.rb +3 -4
 - data/lib/active_resource/associations/builder/association.rb +1 -1
 - data/lib/active_resource/associations/builder/belongs_to.rb +1 -1
 - data/lib/active_resource/base.rb +49 -18
 - data/lib/active_resource/coder.rb +76 -0
 - data/lib/active_resource/collection.rb +1 -1
 - data/lib/active_resource/connection.rb +17 -10
 - data/lib/active_resource/custom_methods.rb +1 -1
 - data/lib/active_resource/exceptions.rb +7 -0
 - data/lib/active_resource/formats.rb +5 -1
 - data/lib/active_resource/http_mock.rb +30 -15
 - data/lib/active_resource/inheriting_hash.rb +19 -0
 - data/lib/active_resource/log_subscriber.rb +1 -1
 - data/lib/active_resource/railtie.rb +18 -0
 - data/lib/active_resource/rescuable.rb +26 -0
 - data/lib/active_resource/schema.rb +1 -1
 - data/lib/active_resource/serialization.rb +81 -0
 - data/lib/active_resource/validations.rb +4 -4
 - data/lib/active_resource/version.rb +2 -2
 - data/lib/active_resource/where_clause.rb +47 -0
 - data/lib/active_resource.rb +20 -0
 - metadata +14 -13
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 56d3dcccc623568664d512654a732adb1c7f4a254ab04e265ac1399d0e4c1967
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: d58a56b898820598bde4e7f285120623f91cd4abf16f5e9487b52922780b9dc1
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: f3347abdf46c203bc277274a0f3f308e8582137a91471ae4ef2064acd7f869a1d12ce020e8031bee2ec710dfecd9933e4b5718ae3a3181116f08ccb5a5839305
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: c81b3391288de5f1031a6372354555d7cdad9f117e68193094b728e8e9851e35fbcea41a4b9b977b1338cad30095680935e9eb30c7ceee9e7d338ddf160ae660
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -112,7 +112,7 @@ end 
     | 
|
| 
       112 
112 
     | 
    
         
             
            Active Resource is built on a standard JSON or XML format for requesting and submitting resources
         
     | 
| 
       113 
113 
     | 
    
         
             
            over HTTP. It mirrors the RESTful routing built into Action Controller but will also work with any
         
     | 
| 
       114 
114 
     | 
    
         
             
            other REST service that properly implements the protocol. REST uses HTTP, but unlike "typical" web
         
     | 
| 
       115 
     | 
    
         
            -
            applications, it makes use of all the  
     | 
| 
      
 115 
     | 
    
         
            +
            applications, it makes use of all the verbs available in the HTTP specification:
         
     | 
| 
       116 
116 
     | 
    
         | 
| 
       117 
117 
     | 
    
         
             
            * GET requests are used for finding and retrieving resources.
         
     | 
| 
       118 
118 
     | 
    
         
             
            * POST requests are used to create new resources.
         
     | 
| 
         @@ -296,6 +296,8 @@ The `payload` is a `Hash` with the following keys: 
     | 
|
| 
       296 
296 
     | 
    
         | 
| 
       297 
297 
     | 
    
         
             
            * `method` as a `Symbol`
         
     | 
| 
       298 
298 
     | 
    
         
             
            * `request_uri` as a `String`
         
     | 
| 
      
 299 
     | 
    
         
            +
            * `headers` as a `Hash`
         
     | 
| 
      
 300 
     | 
    
         
            +
            * `body` as a `String` when available
         
     | 
| 
       299 
301 
     | 
    
         
             
            * `result` as an `Net::HTTPResponse`
         
     | 
| 
       300 
302 
     | 
    
         | 
| 
       301 
303 
     | 
    
         
             
            ## License
         
     | 
| 
         @@ -4,7 +4,7 @@ module ActiveResource::Associations::Builder 
     | 
|
| 
       4 
4 
     | 
    
         
             
              class Association # :nodoc:
         
     | 
| 
       5 
5 
     | 
    
         
             
                # providing a Class-Variable, which will have a different store of subclasses
         
     | 
| 
       6 
6 
     | 
    
         
             
                class_attribute :valid_options
         
     | 
| 
       7 
     | 
    
         
            -
                self.valid_options = [:class_name]
         
     | 
| 
      
 7 
     | 
    
         
            +
                self.valid_options = [ :class_name ]
         
     | 
| 
       8 
8 
     | 
    
         | 
| 
       9 
9 
     | 
    
         
             
                # would identify subclasses of association
         
     | 
| 
       10 
10 
     | 
    
         
             
                class_attribute :macro
         
     | 
    
        data/lib/active_resource/base.rb
    CHANGED
    
    | 
         @@ -11,7 +11,6 @@ require "active_support/core_ext/object/blank" 
     | 
|
| 
       11 
11 
     | 
    
         
             
            require "active_support/core_ext/object/to_query"
         
     | 
| 
       12 
12 
     | 
    
         
             
            require "active_support/core_ext/object/duplicable"
         
     | 
| 
       13 
13 
     | 
    
         
             
            require "set"
         
     | 
| 
       14 
     | 
    
         
            -
            require "uri"
         
     | 
| 
       15 
14 
     | 
    
         | 
| 
       16 
15 
     | 
    
         
             
            require "active_resource/connection"
         
     | 
| 
       17 
16 
     | 
    
         
             
            require "active_resource/formats"
         
     | 
| 
         @@ -213,6 +212,7 @@ module ActiveResource 
     | 
|
| 
       213 
212 
     | 
    
         
             
              # * 301, 302, 303, 307 - ActiveResource::Redirection
         
     | 
| 
       214 
213 
     | 
    
         
             
              # * 400 - ActiveResource::BadRequest
         
     | 
| 
       215 
214 
     | 
    
         
             
              # * 401 - ActiveResource::UnauthorizedAccess
         
     | 
| 
      
 215 
     | 
    
         
            +
              # * 402 - ActiveResource::PaymentRequired
         
     | 
| 
       216 
216 
     | 
    
         
             
              # * 403 - ActiveResource::ForbiddenAccess
         
     | 
| 
       217 
217 
     | 
    
         
             
              # * 404 - ActiveResource::ResourceNotFound
         
     | 
| 
       218 
218 
     | 
    
         
             
              # * 405 - ActiveResource::MethodNotAllowed
         
     | 
| 
         @@ -490,8 +490,8 @@ module ActiveResource 
     | 
|
| 
       490 
490 
     | 
    
         
             
                      self._site = nil
         
     | 
| 
       491 
491 
     | 
    
         
             
                    else
         
     | 
| 
       492 
492 
     | 
    
         
             
                      self._site = create_site_uri_from(site)
         
     | 
| 
       493 
     | 
    
         
            -
                      self._user =  
     | 
| 
       494 
     | 
    
         
            -
                      self._password =  
     | 
| 
      
 493 
     | 
    
         
            +
                      self._user = URI_PARSER.unescape(_site.user) if _site.user
         
     | 
| 
      
 494 
     | 
    
         
            +
                      self._password = URI_PARSER.unescape(_site.password) if _site.password
         
     | 
| 
       495 
495 
     | 
    
         
             
                    end
         
     | 
| 
       496 
496 
     | 
    
         
             
                  end
         
     | 
| 
       497 
497 
     | 
    
         | 
| 
         @@ -750,7 +750,7 @@ module ActiveResource 
     | 
|
| 
       750 
750 
     | 
    
         
             
                  # Default value is <tt>site.path</tt>.
         
     | 
| 
       751 
751 
     | 
    
         
             
                  def prefix=(value = "/")
         
     | 
| 
       752 
752 
     | 
    
         
             
                    # Replace :placeholders with '#{embedded options[:lookups]}'
         
     | 
| 
       753 
     | 
    
         
            -
                    prefix_call = value.gsub(/:\w+/) { |key| "\#{ 
     | 
| 
      
 753 
     | 
    
         
            +
                    prefix_call = value.gsub(/:\w+/) { |key| "\#{URI_PARSER.escape options[#{key}].to_s}" }
         
     | 
| 
       754 
754 
     | 
    
         | 
| 
       755 
755 
     | 
    
         
             
                    # Clear prefix parameters in case they have been cached
         
     | 
| 
       756 
756 
     | 
    
         
             
                    @prefix_parameters = nil
         
     | 
| 
         @@ -886,6 +886,31 @@ module ActiveResource 
     | 
|
| 
       886 
886 
     | 
    
         
             
                    "#{prefix(prefix_options)}#{collection_name}#{format_extension}#{query_string(query_options)}"
         
     | 
| 
       887 
887 
     | 
    
         
             
                  end
         
     | 
| 
       888 
888 
     | 
    
         | 
| 
      
 889 
     | 
    
         
            +
                  # Gets the collection URL for the REST resources. If the +query_options+ parameter is omitted, Rails
         
     | 
| 
      
 890 
     | 
    
         
            +
                  # will split from the +prefix_options+.
         
     | 
| 
      
 891 
     | 
    
         
            +
                  #
         
     | 
| 
      
 892 
     | 
    
         
            +
                  # ==== Options
         
     | 
| 
      
 893 
     | 
    
         
            +
                  # * +prefix_options+ - A hash to add a prefix to the request for nested URLs (e.g., <tt>:account_id => 19</tt>
         
     | 
| 
      
 894 
     | 
    
         
            +
                  #   would yield a URL like <tt>/accounts/19/purchases.json</tt>).
         
     | 
| 
      
 895 
     | 
    
         
            +
                  # * +query_options+ - A hash to add items to the query string for the request.
         
     | 
| 
      
 896 
     | 
    
         
            +
                  #
         
     | 
| 
      
 897 
     | 
    
         
            +
                  # ==== Examples
         
     | 
| 
      
 898 
     | 
    
         
            +
                  #   Post.collection_url
         
     | 
| 
      
 899 
     | 
    
         
            +
                  #   # => https://example.com/posts.json
         
     | 
| 
      
 900 
     | 
    
         
            +
                  #
         
     | 
| 
      
 901 
     | 
    
         
            +
                  #   Comment.collection_url(:post_id => 5)
         
     | 
| 
      
 902 
     | 
    
         
            +
                  #   # => https://example.com/posts/5/comments.json
         
     | 
| 
      
 903 
     | 
    
         
            +
                  #
         
     | 
| 
      
 904 
     | 
    
         
            +
                  #   Comment.collection_url(:post_id => 5, :active => 1)
         
     | 
| 
      
 905 
     | 
    
         
            +
                  #   # => https://example.com/posts/5/comments.json?active=1
         
     | 
| 
      
 906 
     | 
    
         
            +
                  #
         
     | 
| 
      
 907 
     | 
    
         
            +
                  #   Comment.collection_url({:post_id => 5}, {:active => 1})
         
     | 
| 
      
 908 
     | 
    
         
            +
                  #   # => https://example.com/posts/5/comments.json?active=1
         
     | 
| 
      
 909 
     | 
    
         
            +
                  #
         
     | 
| 
      
 910 
     | 
    
         
            +
                  def collection_url(prefix_options = {}, query_options = nil)
         
     | 
| 
      
 911 
     | 
    
         
            +
                    URI.join(site, collection_path(prefix_options, query_options)).to_s
         
     | 
| 
      
 912 
     | 
    
         
            +
                  end
         
     | 
| 
      
 913 
     | 
    
         
            +
             
     | 
| 
       889 
914 
     | 
    
         
             
                  alias_method :set_primary_key, :primary_key=  # :nodoc:
         
     | 
| 
       890 
915 
     | 
    
         | 
| 
       891 
916 
     | 
    
         
             
                  # Builds a new, unsaved record using the default values from the remote server so
         
     | 
| 
         @@ -1037,12 +1062,13 @@ module ActiveResource 
     | 
|
| 
       1037 
1062 
     | 
    
         
             
                  # This is an alias for find(:all). You can pass in all the same
         
     | 
| 
       1038 
1063 
     | 
    
         
             
                  # arguments to this method as you can to <tt>find(:all)</tt>
         
     | 
| 
       1039 
1064 
     | 
    
         
             
                  def all(*args)
         
     | 
| 
       1040 
     | 
    
         
            -
                     
     | 
| 
      
 1065 
     | 
    
         
            +
                    WhereClause.new(self, *args)
         
     | 
| 
       1041 
1066 
     | 
    
         
             
                  end
         
     | 
| 
       1042 
1067 
     | 
    
         | 
| 
       1043 
1068 
     | 
    
         
             
                  def where(clauses = {})
         
     | 
| 
      
 1069 
     | 
    
         
            +
                    clauses = sanitize_forbidden_attributes(clauses)
         
     | 
| 
       1044 
1070 
     | 
    
         
             
                    raise ArgumentError, "expected a clauses Hash, got #{clauses.inspect}" unless clauses.is_a? Hash
         
     | 
| 
       1045 
     | 
    
         
            -
                     
     | 
| 
      
 1071 
     | 
    
         
            +
                    all(params: clauses)
         
     | 
| 
       1046 
1072 
     | 
    
         
             
                  end
         
     | 
| 
       1047 
1073 
     | 
    
         | 
| 
       1048 
1074 
     | 
    
         | 
| 
         @@ -1072,13 +1098,13 @@ module ActiveResource 
     | 
|
| 
       1072 
1098 
     | 
    
         
             
                  #
         
     | 
| 
       1073 
1099 
     | 
    
         
             
                  #   Note.exists(1349) # => false
         
     | 
| 
       1074 
1100 
     | 
    
         
             
                  def exists?(id, options = {})
         
     | 
| 
       1075 
     | 
    
         
            -
                     
     | 
| 
       1076 
     | 
    
         
            -
             
     | 
| 
       1077 
     | 
    
         
            -
             
     | 
| 
       1078 
     | 
    
         
            -
             
     | 
| 
       1079 
     | 
    
         
            -
             
     | 
| 
       1080 
     | 
    
         
            -
             
     | 
| 
       1081 
     | 
    
         
            -
                     
     | 
| 
      
 1101 
     | 
    
         
            +
                    return false unless id
         
     | 
| 
      
 1102 
     | 
    
         
            +
             
     | 
| 
      
 1103 
     | 
    
         
            +
                    prefix_options, query_options = split_options(options[:params])
         
     | 
| 
      
 1104 
     | 
    
         
            +
                    path = element_path(id, prefix_options, query_options)
         
     | 
| 
      
 1105 
     | 
    
         
            +
                    response = connection.head(path, headers)
         
     | 
| 
      
 1106 
     | 
    
         
            +
             
     | 
| 
      
 1107 
     | 
    
         
            +
                    (200..206).include?(response.code.to_i)
         
     | 
| 
       1082 
1108 
     | 
    
         
             
                  rescue ActiveResource::ResourceNotFound, ActiveResource::ResourceGone
         
     | 
| 
       1083 
1109 
     | 
    
         
             
                    false
         
     | 
| 
       1084 
1110 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -1443,6 +1469,8 @@ module ActiveResource 
     | 
|
| 
       1443 
1469 
     | 
    
         
             
                #   my_branch.name # => "Wilson Road"
         
     | 
| 
       1444 
1470 
     | 
    
         
             
                def reload
         
     | 
| 
       1445 
1471 
     | 
    
         
             
                  self.load(self.class.find(to_param, params: @prefix_options).attributes, false, true)
         
     | 
| 
      
 1472 
     | 
    
         
            +
                rescue => exception
         
     | 
| 
      
 1473 
     | 
    
         
            +
                  rescue_with_handler(exception) || raise
         
     | 
| 
       1446 
1474 
     | 
    
         
             
                end
         
     | 
| 
       1447 
1475 
     | 
    
         | 
| 
       1448 
1476 
     | 
    
         
             
                # A method to manually load attributes from a \hash. Recursively loads collections of
         
     | 
| 
         @@ -1471,6 +1499,7 @@ module ActiveResource 
     | 
|
| 
       1471 
1499 
     | 
    
         
             
                    raise ArgumentError, "expected attributes to be able to convert to Hash, got #{attributes.inspect}"
         
     | 
| 
       1472 
1500 
     | 
    
         
             
                  end
         
     | 
| 
       1473 
1501 
     | 
    
         | 
| 
      
 1502 
     | 
    
         
            +
                  attributes = sanitize_forbidden_attributes(attributes)
         
     | 
| 
       1474 
1503 
     | 
    
         
             
                  attributes = attributes.to_hash
         
     | 
| 
       1475 
1504 
     | 
    
         
             
                  @prefix_options, attributes = split_options(attributes)
         
     | 
| 
       1476 
1505 
     | 
    
         | 
| 
         @@ -1627,7 +1656,7 @@ module ActiveResource 
     | 
|
| 
       1627 
1656 
     | 
    
         
             
                private
         
     | 
| 
       1628 
1657 
     | 
    
         
             
                  # Determine whether the response is allowed to have a body per HTTP 1.1 spec section 4.4.1
         
     | 
| 
       1629 
1658 
     | 
    
         
             
                  def response_code_allows_body?(c)
         
     | 
| 
       1630 
     | 
    
         
            -
                    !((100..199).include?(c) || [204, 304].include?(c))
         
     | 
| 
      
 1659 
     | 
    
         
            +
                    !((100..199).include?(c) || [ 204, 304 ].include?(c))
         
     | 
| 
       1631 
1660 
     | 
    
         
             
                  end
         
     | 
| 
       1632 
1661 
     | 
    
         | 
| 
       1633 
1662 
     | 
    
         
             
                  # Tries to find a resource for a given collection name; if it fails, then the resource is created
         
     | 
| 
         @@ -1643,7 +1672,7 @@ module ActiveResource 
     | 
|
| 
       1643 
1672 
     | 
    
         
             
                    namespaces = module_names[0, module_names.size - 1].map do |module_name|
         
     | 
| 
       1644 
1673 
     | 
    
         
             
                      receiver = receiver.const_get(module_name)
         
     | 
| 
       1645 
1674 
     | 
    
         
             
                    end
         
     | 
| 
       1646 
     | 
    
         
            -
                    const_args = [resource_name, false]
         
     | 
| 
      
 1675 
     | 
    
         
            +
                    const_args = [ resource_name, false ]
         
     | 
| 
       1647 
1676 
     | 
    
         
             
                    if namespace = namespaces.reverse.detect { |ns| ns.const_defined?(*const_args) }
         
     | 
| 
       1648 
1677 
     | 
    
         
             
                      namespace.const_get(*const_args)
         
     | 
| 
       1649 
1678 
     | 
    
         
             
                    else
         
     | 
| 
         @@ -1656,7 +1685,7 @@ module ActiveResource 
     | 
|
| 
       1656 
1685 
     | 
    
         
             
                    return reflections[name.to_sym].klass if reflections.key?(name.to_sym)
         
     | 
| 
       1657 
1686 
     | 
    
         
             
                    resource_name = name.to_s.camelize
         
     | 
| 
       1658 
1687 
     | 
    
         | 
| 
       1659 
     | 
    
         
            -
                    const_args = [resource_name, false]
         
     | 
| 
      
 1688 
     | 
    
         
            +
                    const_args = [ resource_name, false ]
         
     | 
| 
       1660 
1689 
     | 
    
         | 
| 
       1661 
1690 
     | 
    
         
             
                    if !const_valid?(*const_args)
         
     | 
| 
       1662 
1691 
     | 
    
         
             
                      # resource_name is not a valid ruby module name and cannot be created normally
         
     | 
| 
         @@ -1718,14 +1747,16 @@ module ActiveResource 
     | 
|
| 
       1718 
1747 
     | 
    
         
             
              end
         
     | 
| 
       1719 
1748 
     | 
    
         | 
| 
       1720 
1749 
     | 
    
         
             
              class Base
         
     | 
| 
      
 1750 
     | 
    
         
            +
                extend ActiveModel::ForbiddenAttributesProtection
         
     | 
| 
       1721 
1751 
     | 
    
         
             
                extend ActiveModel::Naming
         
     | 
| 
       1722 
1752 
     | 
    
         
             
                extend ActiveResource::Associations
         
     | 
| 
       1723 
1753 
     | 
    
         | 
| 
       1724 
     | 
    
         
            -
                include Callbacks, CustomMethods, Validations
         
     | 
| 
      
 1754 
     | 
    
         
            +
                include Callbacks, CustomMethods, Validations, Serialization
         
     | 
| 
       1725 
1755 
     | 
    
         
             
                include ActiveModel::Conversion
         
     | 
| 
      
 1756 
     | 
    
         
            +
                include ActiveModel::ForbiddenAttributesProtection
         
     | 
| 
       1726 
1757 
     | 
    
         
             
                include ActiveModel::Serializers::JSON
         
     | 
| 
       1727 
1758 
     | 
    
         
             
                include ActiveModel::Serializers::Xml
         
     | 
| 
       1728 
     | 
    
         
            -
                include ActiveResource::Reflection
         
     | 
| 
      
 1759 
     | 
    
         
            +
                include ActiveResource::Reflection, ActiveResource::Rescuable
         
     | 
| 
       1729 
1760 
     | 
    
         
             
              end
         
     | 
| 
       1730 
1761 
     | 
    
         | 
| 
       1731 
1762 
     | 
    
         
             
              ActiveSupport.run_load_hooks(:active_resource, Base)
         
     | 
| 
         @@ -0,0 +1,76 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module ActiveResource
         
     | 
| 
      
 4 
     | 
    
         
            +
              # Integrates with Active Record's
         
     | 
| 
      
 5 
     | 
    
         
            +
              # {serialize}[link:https://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Serialization/ClassMethods.html#method-i-serialize]
         
     | 
| 
      
 6 
     | 
    
         
            +
              # method as the <tt>:coder</tt> option.
         
     | 
| 
      
 7 
     | 
    
         
            +
              #
         
     | 
| 
      
 8 
     | 
    
         
            +
              # Encodes Active Resource instances into a value to be stored in the
         
     | 
| 
      
 9 
     | 
    
         
            +
              # database. Decodes values read from the database into Active Resource
         
     | 
| 
      
 10 
     | 
    
         
            +
              # instances.
         
     | 
| 
      
 11 
     | 
    
         
            +
              #
         
     | 
| 
      
 12 
     | 
    
         
            +
              #   class User < ActiveRecord::Base
         
     | 
| 
      
 13 
     | 
    
         
            +
              #     serialize :person, coder: ActiveResource::Coder.new(Person)
         
     | 
| 
      
 14 
     | 
    
         
            +
              #   end
         
     | 
| 
      
 15 
     | 
    
         
            +
              #
         
     | 
| 
      
 16 
     | 
    
         
            +
              #   class Person < ActiveResource::Base
         
     | 
| 
      
 17 
     | 
    
         
            +
              #     schema do
         
     | 
| 
      
 18 
     | 
    
         
            +
              #       attribute :name, :string
         
     | 
| 
      
 19 
     | 
    
         
            +
              #     end
         
     | 
| 
      
 20 
     | 
    
         
            +
              #   end
         
     | 
| 
      
 21 
     | 
    
         
            +
              #
         
     | 
| 
      
 22 
     | 
    
         
            +
              #   user = User.new
         
     | 
| 
      
 23 
     | 
    
         
            +
              #   user.person = Person.new name: "Matz"
         
     | 
| 
      
 24 
     | 
    
         
            +
              #   user.person.name # => "Matz"
         
     | 
| 
      
 25 
     | 
    
         
            +
              #
         
     | 
| 
      
 26 
     | 
    
         
            +
              # Values are loaded as persisted when decoded from data containing a
         
     | 
| 
      
 27 
     | 
    
         
            +
              # primary key value, and new records when missing a primary key value:
         
     | 
| 
      
 28 
     | 
    
         
            +
              #
         
     | 
| 
      
 29 
     | 
    
         
            +
              #   user.person = Person.new
         
     | 
| 
      
 30 
     | 
    
         
            +
              #   user.person.persisted? # => true
         
     | 
| 
      
 31 
     | 
    
         
            +
              #
         
     | 
| 
      
 32 
     | 
    
         
            +
              #   user.person = Person.find(1)
         
     | 
| 
      
 33 
     | 
    
         
            +
              #   user.person.persisted? # => true
         
     | 
| 
      
 34 
     | 
    
         
            +
              #
         
     | 
| 
      
 35 
     | 
    
         
            +
              # By default, <tt>#dump</tt> serializes the instance to a string value by
         
     | 
| 
      
 36 
     | 
    
         
            +
              # calling Base#encode:
         
     | 
| 
      
 37 
     | 
    
         
            +
              #
         
     | 
| 
      
 38 
     | 
    
         
            +
              #   user.person_before_type_cast # => "{\"name\":\"Matz\"}"
         
     | 
| 
      
 39 
     | 
    
         
            +
              #
         
     | 
| 
      
 40 
     | 
    
         
            +
              # To customize serialization, pass the method name or a block as the second
         
     | 
| 
      
 41 
     | 
    
         
            +
              # argument:
         
     | 
| 
      
 42 
     | 
    
         
            +
              #
         
     | 
| 
      
 43 
     | 
    
         
            +
              #   person = Person.new name: "Matz"
         
     | 
| 
      
 44 
     | 
    
         
            +
              #
         
     | 
| 
      
 45 
     | 
    
         
            +
              #   coder = ActiveResource::Coder.new(Person, :serializable_hash)
         
     | 
| 
      
 46 
     | 
    
         
            +
              #   coder.dump(person) # => { "name" => "Matz" }
         
     | 
| 
      
 47 
     | 
    
         
            +
              #
         
     | 
| 
      
 48 
     | 
    
         
            +
              #   coder = ActiveResource::Coder.new(Person) { |person| person.serializable_hash }
         
     | 
| 
      
 49 
     | 
    
         
            +
              #   coder.dump(person) # => { "name" => "Matz" }
         
     | 
| 
      
 50 
     | 
    
         
            +
              class Coder
         
     | 
| 
      
 51 
     | 
    
         
            +
                attr_accessor :resource_class, :encoder
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
                def initialize(resource_class, encoder_method = :encode, &block)
         
     | 
| 
      
 54 
     | 
    
         
            +
                  @resource_class = resource_class
         
     | 
| 
      
 55 
     | 
    
         
            +
                  @encoder = block || encoder_method
         
     | 
| 
      
 56 
     | 
    
         
            +
                end
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
                # Serializes a resource value to a value that will be stored in the database.
         
     | 
| 
      
 59 
     | 
    
         
            +
                # Returns nil when passed nil
         
     | 
| 
      
 60 
     | 
    
         
            +
                def dump(value)
         
     | 
| 
      
 61 
     | 
    
         
            +
                  return if value.nil?
         
     | 
| 
      
 62 
     | 
    
         
            +
                  raise ArgumentError.new("expected value to be #{resource_class}, but was #{value.class}") unless value.is_a?(resource_class)
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
                  value.yield_self(&encoder)
         
     | 
| 
      
 65 
     | 
    
         
            +
                end
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
                # Deserializes a value from the database to a resource instance.
         
     | 
| 
      
 68 
     | 
    
         
            +
                # Returns nil when passed nil
         
     | 
| 
      
 69 
     | 
    
         
            +
                def load(value)
         
     | 
| 
      
 70 
     | 
    
         
            +
                  return if value.nil?
         
     | 
| 
      
 71 
     | 
    
         
            +
                  value = resource_class.format.decode(value) if value.is_a?(String)
         
     | 
| 
      
 72 
     | 
    
         
            +
                  raise ArgumentError.new("expected value to be Hash, but was #{value.class}") unless value.is_a?(Hash)
         
     | 
| 
      
 73 
     | 
    
         
            +
                  resource_class.new(value, value[resource_class.primary_key])
         
     | 
| 
      
 74 
     | 
    
         
            +
                end
         
     | 
| 
      
 75 
     | 
    
         
            +
              end
         
     | 
| 
      
 76 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -5,7 +5,7 @@ require "active_support/inflector" 
     | 
|
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
            module ActiveResource # :nodoc:
         
     | 
| 
       7 
7 
     | 
    
         
             
              class Collection # :nodoc:
         
     | 
| 
       8 
     | 
    
         
            -
                SELF_DEFINE_METHODS = [:to_a, :collect!, :map!, :all?]
         
     | 
| 
      
 8 
     | 
    
         
            +
                SELF_DEFINE_METHODS = [ :to_a, :collect!, :map!, :all? ]
         
     | 
| 
       9 
9 
     | 
    
         
             
                include Enumerable
         
     | 
| 
       10 
10 
     | 
    
         
             
                delegate :to_yaml, :all?, *(Array.instance_methods(false) - SELF_DEFINE_METHODS), to: :to_a
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
         @@ -5,7 +5,6 @@ require "active_support/core_ext/object/inclusion" 
     | 
|
| 
       5 
5 
     | 
    
         
             
            require "net/https"
         
     | 
| 
       6 
6 
     | 
    
         
             
            require "date"
         
     | 
| 
       7 
7 
     | 
    
         
             
            require "time"
         
     | 
| 
       8 
     | 
    
         
            -
            require "uri"
         
     | 
| 
       9 
8 
     | 
    
         | 
| 
       10 
9 
     | 
    
         
             
            module ActiveResource
         
     | 
| 
       11 
10 
     | 
    
         
             
              # Class to handle connections to remote web services.
         
     | 
| 
         @@ -43,8 +42,8 @@ module ActiveResource 
     | 
|
| 
       43 
42 
     | 
    
         
             
                def site=(site)
         
     | 
| 
       44 
43 
     | 
    
         
             
                  @site = site.is_a?(URI) ? site : URI.parse(site)
         
     | 
| 
       45 
44 
     | 
    
         
             
                  @ssl_options ||= {} if @site.is_a?(URI::HTTPS)
         
     | 
| 
       46 
     | 
    
         
            -
                  @user =  
     | 
| 
       47 
     | 
    
         
            -
                  @password =  
     | 
| 
      
 45 
     | 
    
         
            +
                  @user = URI_PARSER.unescape(@site.user) if @site.user
         
     | 
| 
      
 46 
     | 
    
         
            +
                  @password = URI_PARSER.unescape(@site.password) if @site.password
         
     | 
| 
       48 
47 
     | 
    
         
             
                end
         
     | 
| 
       49 
48 
     | 
    
         | 
| 
       50 
49 
     | 
    
         
             
                # Set the proxy for remote service.
         
     | 
| 
         @@ -117,9 +116,13 @@ module ActiveResource 
     | 
|
| 
       117 
116 
     | 
    
         
             
                private
         
     | 
| 
       118 
117 
     | 
    
         
             
                  # Makes a request to the remote service.
         
     | 
| 
       119 
118 
     | 
    
         
             
                  def request(method, path, *arguments)
         
     | 
| 
      
 119 
     | 
    
         
            +
                    body, headers = arguments
         
     | 
| 
      
 120 
     | 
    
         
            +
                    headers, body = body, nil if headers.nil?
         
     | 
| 
       120 
121 
     | 
    
         
             
                    result = ActiveSupport::Notifications.instrument("request.active_resource") do |payload|
         
     | 
| 
       121 
122 
     | 
    
         
             
                      payload[:method]      = method
         
     | 
| 
       122 
123 
     | 
    
         
             
                      payload[:request_uri] = "#{site.scheme}://#{site.host}:#{site.port}#{path}"
         
     | 
| 
      
 124 
     | 
    
         
            +
                      payload[:headers]     = headers
         
     | 
| 
      
 125 
     | 
    
         
            +
                      payload[:body]        = body
         
     | 
| 
       123 
126 
     | 
    
         
             
                      payload[:result]      = http.send(method, path, *arguments)
         
     | 
| 
       124 
127 
     | 
    
         
             
                    end
         
     | 
| 
       125 
128 
     | 
    
         
             
                    handle_response(result)
         
     | 
| 
         @@ -127,6 +130,8 @@ module ActiveResource 
     | 
|
| 
       127 
130 
     | 
    
         
             
                    raise TimeoutError.new(e.message)
         
     | 
| 
       128 
131 
     | 
    
         
             
                  rescue OpenSSL::SSL::SSLError => e
         
     | 
| 
       129 
132 
     | 
    
         
             
                    raise SSLError.new(e.message)
         
     | 
| 
      
 133 
     | 
    
         
            +
                  rescue Errno::ECONNREFUSED => e
         
     | 
| 
      
 134 
     | 
    
         
            +
                    raise ConnectionRefusedError.new(e.message)
         
     | 
| 
       130 
135 
     | 
    
         
             
                  end
         
     | 
| 
       131 
136 
     | 
    
         | 
| 
       132 
137 
     | 
    
         
             
                  # Handles response and error codes from the remote service.
         
     | 
| 
         @@ -140,6 +145,8 @@ module ActiveResource 
     | 
|
| 
       140 
145 
     | 
    
         
             
                      raise(BadRequest.new(response))
         
     | 
| 
       141 
146 
     | 
    
         
             
                    when 401
         
     | 
| 
       142 
147 
     | 
    
         
             
                      raise(UnauthorizedAccess.new(response))
         
     | 
| 
      
 148 
     | 
    
         
            +
                    when 402
         
     | 
| 
      
 149 
     | 
    
         
            +
                      raise(PaymentRequired.new(response))
         
     | 
| 
       143 
150 
     | 
    
         
             
                    when 403
         
     | 
| 
       144 
151 
     | 
    
         
             
                      raise(ForbiddenAccess.new(response))
         
     | 
| 
       145 
152 
     | 
    
         
             
                    when 404
         
     | 
| 
         @@ -173,8 +180,8 @@ module ActiveResource 
     | 
|
| 
       173 
180 
     | 
    
         | 
| 
       174 
181 
     | 
    
         
             
                  def new_http
         
     | 
| 
       175 
182 
     | 
    
         
             
                    if @proxy
         
     | 
| 
       176 
     | 
    
         
            -
                      user =  
     | 
| 
       177 
     | 
    
         
            -
                      password =  
     | 
| 
      
 183 
     | 
    
         
            +
                      user = URI_PARSER.unescape(@proxy.user) if @proxy.user
         
     | 
| 
      
 184 
     | 
    
         
            +
                      password = URI_PARSER.unescape(@proxy.password) if @proxy.password
         
     | 
| 
       178 
185 
     | 
    
         
             
                      Net::HTTP.new(@site.host, @site.port, @proxy.host, @proxy.port, user, password)
         
     | 
| 
       179 
186 
     | 
    
         
             
                    else
         
     | 
| 
       180 
187 
     | 
    
         
             
                      Net::HTTP.new(@site.host, @site.port)
         
     | 
| 
         @@ -211,7 +218,7 @@ module ActiveResource 
     | 
|
| 
       211 
218 
     | 
    
         | 
| 
       212 
219 
     | 
    
         
             
                  # Builds headers for request to remote service.
         
     | 
| 
       213 
220 
     | 
    
         
             
                  def build_request_headers(headers, http_method, uri)
         
     | 
| 
       214 
     | 
    
         
            -
                    authorization_header(http_method, uri).update(default_header).update(http_format_header(http_method)).update(headers)
         
     | 
| 
      
 221 
     | 
    
         
            +
                    authorization_header(http_method, uri).update(default_header).update(http_format_header(http_method)).update(headers.to_hash)
         
     | 
| 
       215 
222 
     | 
    
         
             
                  end
         
     | 
| 
       216 
223 
     | 
    
         | 
| 
       217 
224 
     | 
    
         
             
                  def response_auth_header
         
     | 
| 
         @@ -233,7 +240,7 @@ module ActiveResource 
     | 
|
| 
       233 
240 
     | 
    
         
             
                      if auth_type == :digest
         
     | 
| 
       234 
241 
     | 
    
         
             
                        { "Authorization" => digest_auth_header(http_method, uri) }
         
     | 
| 
       235 
242 
     | 
    
         
             
                      else
         
     | 
| 
       236 
     | 
    
         
            -
                        { "Authorization" => "Basic " + ["#{@user}:#{@password}"].pack("m").delete("\r\n") }
         
     | 
| 
      
 243 
     | 
    
         
            +
                        { "Authorization" => "Basic " + [ "#{@user}:#{@password}" ].pack("m").delete("\r\n") }
         
     | 
| 
       237 
244 
     | 
    
         
             
                      end
         
     | 
| 
       238 
245 
     | 
    
         
             
                    elsif @bearer_token
         
     | 
| 
       239 
246 
     | 
    
         
             
                      { "Authorization" => "Bearer #{@bearer_token}" }
         
     | 
| 
         @@ -252,7 +259,7 @@ module ActiveResource 
     | 
|
| 
       252 
259 
     | 
    
         
             
                    ha2 = Digest::MD5.hexdigest("#{http_method.to_s.upcase}:#{request_uri}")
         
     | 
| 
       253 
260 
     | 
    
         | 
| 
       254 
261 
     | 
    
         
             
                    params["cnonce"] = client_nonce
         
     | 
| 
       255 
     | 
    
         
            -
                    request_digest = Digest::MD5.hexdigest([ha1, params["nonce"], "0", params["cnonce"], params["qop"], ha2].join(":"))
         
     | 
| 
      
 262 
     | 
    
         
            +
                    request_digest = Digest::MD5.hexdigest([ ha1, params["nonce"], "0", params["cnonce"], params["qop"], ha2 ].join(":"))
         
     | 
| 
       256 
263 
     | 
    
         
             
                    "Digest #{auth_attributes_for(uri, request_digest, params)}"
         
     | 
| 
       257 
264 
     | 
    
         
             
                  end
         
     | 
| 
       258 
265 
     | 
    
         | 
| 
         @@ -278,7 +285,7 @@ module ActiveResource 
     | 
|
| 
       278 
285 
     | 
    
         
             
                        %Q(nonce="#{params['nonce']}"),
         
     | 
| 
       279 
286 
     | 
    
         
             
                        'nc="0"',
         
     | 
| 
       280 
287 
     | 
    
         
             
                        %Q(cnonce="#{params['cnonce']}"),
         
     | 
| 
       281 
     | 
    
         
            -
                        %Q(response="#{request_digest}")]
         
     | 
| 
      
 288 
     | 
    
         
            +
                        %Q(response="#{request_digest}") ]
         
     | 
| 
       282 
289 
     | 
    
         | 
| 
       283 
290 
     | 
    
         
             
                    auth_attrs << %Q(opaque="#{params['opaque']}") unless params["opaque"].blank?
         
     | 
| 
       284 
291 
     | 
    
         
             
                    auth_attrs.join(", ")
         
     | 
| 
         @@ -291,7 +298,7 @@ module ActiveResource 
     | 
|
| 
       291 
298 
     | 
    
         
             
                  def legitimize_auth_type(auth_type)
         
     | 
| 
       292 
299 
     | 
    
         
             
                    return :basic if auth_type.nil?
         
     | 
| 
       293 
300 
     | 
    
         
             
                    auth_type = auth_type.to_sym
         
     | 
| 
       294 
     | 
    
         
            -
                    auth_type.in?([:basic, :digest, :bearer]) ? auth_type : :basic
         
     | 
| 
      
 301 
     | 
    
         
            +
                    auth_type.in?([ :basic, :digest, :bearer ]) ? auth_type : :basic
         
     | 
| 
       295 
302 
     | 
    
         
             
                  end
         
     | 
| 
       296 
303 
     | 
    
         
             
              end
         
     | 
| 
       297 
304 
     | 
    
         
             
            end
         
     | 
| 
         @@ -119,7 +119,7 @@ module ActiveResource 
     | 
|
| 
       119 
119 
     | 
    
         | 
| 
       120 
120 
     | 
    
         
             
                private
         
     | 
| 
       121 
121 
     | 
    
         
             
                  def custom_method_element_url(method_name, options = {})
         
     | 
| 
       122 
     | 
    
         
            -
                    "#{self.class.prefix(prefix_options)}#{self.class.collection_name}/#{id}/#{method_name}#{self.class.format_extension}#{self.class.__send__(:query_string, options)}"
         
     | 
| 
      
 122 
     | 
    
         
            +
                    "#{self.class.prefix(prefix_options)}#{self.class.collection_name}/#{URI.encode_www_form_component(id.to_s)}/#{method_name}#{self.class.format_extension}#{self.class.__send__(:query_string, options)}"
         
     | 
| 
       123 
123 
     | 
    
         
             
                  end
         
     | 
| 
       124 
124 
     | 
    
         | 
| 
       125 
125 
     | 
    
         
             
                  def custom_method_new_element_url(method_name, options = {})
         
     | 
| 
         @@ -35,6 +35,9 @@ module ActiveResource 
     | 
|
| 
       35 
35 
     | 
    
         
             
                def to_s; @message ; end
         
     | 
| 
       36 
36 
     | 
    
         
             
              end
         
     | 
| 
       37 
37 
     | 
    
         | 
| 
      
 38 
     | 
    
         
            +
              # Raised when a Errno::ECONNREFUSED occurs.
         
     | 
| 
      
 39 
     | 
    
         
            +
              class ConnectionRefusedError < Errno::ECONNREFUSED; end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
       38 
41 
     | 
    
         
             
              # 3xx Redirection
         
     | 
| 
       39 
42 
     | 
    
         
             
              class Redirection < ConnectionError # :nodoc:
         
     | 
| 
       40 
43 
     | 
    
         
             
                def to_s
         
     | 
| 
         @@ -57,6 +60,10 @@ module ActiveResource 
     | 
|
| 
       57 
60 
     | 
    
         
             
              class UnauthorizedAccess < ClientError # :nodoc:
         
     | 
| 
       58 
61 
     | 
    
         
             
              end
         
     | 
| 
       59 
62 
     | 
    
         | 
| 
      
 63 
     | 
    
         
            +
              # 402 Payment Required
         
     | 
| 
      
 64 
     | 
    
         
            +
              class PaymentRequired < ClientError # :nodoc:
         
     | 
| 
      
 65 
     | 
    
         
            +
              end
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
       60 
67 
     | 
    
         
             
              # 403 Forbidden
         
     | 
| 
       61 
68 
     | 
    
         
             
              class ForbiddenAccess < ClientError # :nodoc:
         
     | 
| 
       62 
69 
     | 
    
         
             
              end
         
     | 
| 
         @@ -10,7 +10,11 @@ module ActiveResource 
     | 
|
| 
       10 
10 
     | 
    
         
             
                #   ActiveResource::Formats[:xml]  # => ActiveResource::Formats::XmlFormat
         
     | 
| 
       11 
11 
     | 
    
         
             
                #   ActiveResource::Formats[:json] # => ActiveResource::Formats::JsonFormat
         
     | 
| 
       12 
12 
     | 
    
         
             
                def self.[](mime_type_reference)
         
     | 
| 
       13 
     | 
    
         
            -
                   
     | 
| 
      
 13 
     | 
    
         
            +
                  case mime_type_reference.to_s
         
     | 
| 
      
 14 
     | 
    
         
            +
                  when "xml" then XmlFormat
         
     | 
| 
      
 15 
     | 
    
         
            +
                  when "json" then JsonFormat
         
     | 
| 
      
 16 
     | 
    
         
            +
                  else ActiveResource::Formats.const_get(ActiveSupport::Inflector.camelize(mime_type_reference.to_s) + "Format")
         
     | 
| 
      
 17 
     | 
    
         
            +
                  end
         
     | 
| 
       14 
18 
     | 
    
         
             
                end
         
     | 
| 
       15 
19 
     | 
    
         | 
| 
       16 
20 
     | 
    
         
             
                def self.remove_root(data)
         
     | 
| 
         @@ -58,12 +58,12 @@ module ActiveResource 
     | 
|
| 
       58 
58 
     | 
    
         
             
                  end
         
     | 
| 
       59 
59 
     | 
    
         | 
| 
       60 
60 
     | 
    
         
             
                  [ :post, :patch, :put, :get, :delete, :head ].each do |method|
         
     | 
| 
       61 
     | 
    
         
            -
                    # def post(path, request_headers = {}, body = nil, status = 200, response_headers = {})
         
     | 
| 
       62 
     | 
    
         
            -
                    #   @responses[Request.new(:post, path, nil, request_headers)] = Response.new(body || "", status, response_headers)
         
     | 
| 
      
 61 
     | 
    
         
            +
                    # def post(path, request_headers = {}, body = nil, status = 200, response_headers = {}, options: {})
         
     | 
| 
      
 62 
     | 
    
         
            +
                    #   @responses[Request.new(:post, path, nil, request_headers, options)] = Response.new(body || "", status, response_headers)
         
     | 
| 
       63 
63 
     | 
    
         
             
                    # end
         
     | 
| 
       64 
64 
     | 
    
         
             
                    module_eval <<-EOE, __FILE__, __LINE__ + 1
         
     | 
| 
       65 
     | 
    
         
            -
                      def #{method}(path, request_headers = {}, body = nil, status = 200, response_headers = {})
         
     | 
| 
       66 
     | 
    
         
            -
                        request  = Request.new(:#{method}, path, nil, request_headers)
         
     | 
| 
      
 65 
     | 
    
         
            +
                      def #{method}(path, request_headers = {}, body = nil, status = 200, response_headers = {}, options = {})
         
     | 
| 
      
 66 
     | 
    
         
            +
                        request  = Request.new(:#{method}, path, nil, request_headers, options)
         
     | 
| 
       67 
67 
     | 
    
         
             
                        response = Response.new(body || "", status, response_headers)
         
     | 
| 
       68 
68 
     | 
    
         | 
| 
       69 
69 
     | 
    
         
             
                        delete_duplicate_responses(request)
         
     | 
| 
         @@ -241,11 +241,11 @@ module ActiveResource 
     | 
|
| 
       241 
241 
     | 
    
         
             
                end
         
     | 
| 
       242 
242 
     | 
    
         | 
| 
       243 
243 
     | 
    
         
             
                # body?       methods
         
     | 
| 
       244 
     | 
    
         
            -
                { true  => %w 
     | 
| 
       245 
     | 
    
         
            -
                  false => %w 
     | 
| 
      
 244 
     | 
    
         
            +
                { true  => %w[post patch put],
         
     | 
| 
      
 245 
     | 
    
         
            +
                  false => %w[get delete head] }.each do |has_body, methods|
         
     | 
| 
       246 
246 
     | 
    
         
             
                  methods.each do |method|
         
     | 
| 
       247 
     | 
    
         
            -
                    # def post(path, body, headers)
         
     | 
| 
       248 
     | 
    
         
            -
                    #   request = ActiveResource::Request.new(:post, path, body, headers)
         
     | 
| 
      
 247 
     | 
    
         
            +
                    # def post(path, body, headers, options = {})
         
     | 
| 
      
 248 
     | 
    
         
            +
                    #   request = ActiveResource::Request.new(:post, path, body, headers, options)
         
     | 
| 
       249 
249 
     | 
    
         
             
                    #   self.class.requests << request
         
     | 
| 
       250 
250 
     | 
    
         
             
                    #   if response = self.class.responses.assoc(request)
         
     | 
| 
       251 
251 
     | 
    
         
             
                    #     response[1]
         
     | 
| 
         @@ -254,8 +254,8 @@ module ActiveResource 
     | 
|
| 
       254 
254 
     | 
    
         
             
                    #   end
         
     | 
| 
       255 
255 
     | 
    
         
             
                    # end
         
     | 
| 
       256 
256 
     | 
    
         
             
                    module_eval <<-EOE, __FILE__, __LINE__ + 1
         
     | 
| 
       257 
     | 
    
         
            -
                      def #{method}(path, #{'body, ' if has_body}headers)
         
     | 
| 
       258 
     | 
    
         
            -
                        request = ActiveResource::Request.new(:#{method}, path, #{has_body ? 'body, ' : 'nil, '}headers)
         
     | 
| 
      
 257 
     | 
    
         
            +
                      def #{method}(path, #{'body, ' if has_body}headers, options = {})
         
     | 
| 
      
 258 
     | 
    
         
            +
                        request = ActiveResource::Request.new(:#{method}, path, #{has_body ? 'body, ' : 'nil, '}headers, options)
         
     | 
| 
       259 
259 
     | 
    
         
             
                        self.class.requests << request
         
     | 
| 
       260 
260 
     | 
    
         
             
                        if response = self.class.responses.assoc(request)
         
     | 
| 
       261 
261 
     | 
    
         
             
                          response[1]
         
     | 
| 
         @@ -279,19 +279,34 @@ module ActiveResource 
     | 
|
| 
       279 
279 
     | 
    
         
             
              class Request
         
     | 
| 
       280 
280 
     | 
    
         
             
                attr_accessor :path, :method, :body, :headers
         
     | 
| 
       281 
281 
     | 
    
         | 
| 
       282 
     | 
    
         
            -
                def initialize(method, path, body = nil, headers = {})
         
     | 
| 
       283 
     | 
    
         
            -
                  @method, @path, @body, @headers = method, path, body, headers
         
     | 
| 
      
 282 
     | 
    
         
            +
                def initialize(method, path, body = nil, headers = {}, options = {})
         
     | 
| 
      
 283 
     | 
    
         
            +
                  @method, @path, @body, @headers, @options = method, path, body, headers, options
         
     | 
| 
       284 
284 
     | 
    
         
             
                end
         
     | 
| 
       285 
285 
     | 
    
         | 
| 
       286 
286 
     | 
    
         
             
                def ==(req)
         
     | 
| 
       287 
     | 
    
         
            -
                   
     | 
| 
      
 287 
     | 
    
         
            +
                  same_path?(req) && method == req.method && headers_match?(req)
         
     | 
| 
       288 
288 
     | 
    
         
             
                end
         
     | 
| 
       289 
289 
     | 
    
         | 
| 
       290 
290 
     | 
    
         
             
                def to_s
         
     | 
| 
       291 
291 
     | 
    
         
             
                  "<#{method.to_s.upcase}: #{path} [#{headers}] (#{body})>"
         
     | 
| 
       292 
292 
     | 
    
         
             
                end
         
     | 
| 
       293 
293 
     | 
    
         | 
| 
      
 294 
     | 
    
         
            +
                # Removes query parameters from the path.
         
     | 
| 
      
 295 
     | 
    
         
            +
                #
         
     | 
| 
      
 296 
     | 
    
         
            +
                # @return [String] the path without query parameters
         
     | 
| 
      
 297 
     | 
    
         
            +
                def remove_query_params_from_path
         
     | 
| 
      
 298 
     | 
    
         
            +
                  path.split("?").first
         
     | 
| 
      
 299 
     | 
    
         
            +
                end
         
     | 
| 
      
 300 
     | 
    
         
            +
             
     | 
| 
       294 
301 
     | 
    
         
             
                private
         
     | 
| 
      
 302 
     | 
    
         
            +
                  def same_path?(req)
         
     | 
| 
      
 303 
     | 
    
         
            +
                    if @options && @options[:omit_query_in_path]
         
     | 
| 
      
 304 
     | 
    
         
            +
                      remove_query_params_from_path == req.remove_query_params_from_path
         
     | 
| 
      
 305 
     | 
    
         
            +
                    else
         
     | 
| 
      
 306 
     | 
    
         
            +
                      path == req.path
         
     | 
| 
      
 307 
     | 
    
         
            +
                    end
         
     | 
| 
      
 308 
     | 
    
         
            +
                  end
         
     | 
| 
      
 309 
     | 
    
         
            +
             
     | 
| 
       295 
310 
     | 
    
         
             
                  def headers_match?(req)
         
     | 
| 
       296 
311 
     | 
    
         
             
                    # Ignore format header on equality if it's not defined
         
     | 
| 
       297 
312 
     | 
    
         
             
                    format_header = ActiveResource::Connection::HTTP_FORMAT_HEADER_NAMES[method]
         
     | 
| 
         @@ -360,11 +375,11 @@ module ActiveResource 
     | 
|
| 
       360 
375 
     | 
    
         
             
                    end
         
     | 
| 
       361 
376 
     | 
    
         | 
| 
       362 
377 
     | 
    
         
             
                    def unstub_http?
         
     | 
| 
       363 
     | 
    
         
            -
                      HttpMock.net_connection_enabled? && defined?(@http)  
     | 
| 
      
 378 
     | 
    
         
            +
                      HttpMock.net_connection_enabled? && (!defined?(@http) || @http.kind_of?(HttpMock))
         
     | 
| 
       364 
379 
     | 
    
         
             
                    end
         
     | 
| 
       365 
380 
     | 
    
         | 
| 
       366 
381 
     | 
    
         
             
                    def stub_http?
         
     | 
| 
       367 
     | 
    
         
            -
                      HttpMock.net_connection_disabled? && defined?(@http)  
     | 
| 
      
 382 
     | 
    
         
            +
                      HttpMock.net_connection_disabled? && (!defined?(@http) || @http.kind_of?(Net::HTTP))
         
     | 
| 
       368 
383 
     | 
    
         
             
                    end
         
     | 
| 
       369 
384 
     | 
    
         
             
                  end
         
     | 
| 
       370 
385 
     | 
    
         
             
              end
         
     | 
| 
         @@ -11,5 +11,24 @@ module ActiveResource 
     | 
|
| 
       11 
11 
     | 
    
         
             
                def [](key)
         
     | 
| 
       12 
12 
     | 
    
         
             
                  super || @parent_hash[key]
         
     | 
| 
       13 
13 
     | 
    
         
             
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                # Merges the flattened parent hash (if it's an InheritingHash)
         
     | 
| 
      
 16 
     | 
    
         
            +
                # with ourself
         
     | 
| 
      
 17 
     | 
    
         
            +
                def to_hash
         
     | 
| 
      
 18 
     | 
    
         
            +
                  @parent_hash.to_hash.merge(self)
         
     | 
| 
      
 19 
     | 
    
         
            +
                end
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                # So we can see the merged object in IRB or the Rails console
         
     | 
| 
      
 22 
     | 
    
         
            +
                def pretty_print(pp)
         
     | 
| 
      
 23 
     | 
    
         
            +
                  pp.pp_hash to_hash
         
     | 
| 
      
 24 
     | 
    
         
            +
                end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                def inspect
         
     | 
| 
      
 27 
     | 
    
         
            +
                  to_hash.inspect
         
     | 
| 
      
 28 
     | 
    
         
            +
                end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                def to_s
         
     | 
| 
      
 31 
     | 
    
         
            +
                  inspect
         
     | 
| 
      
 32 
     | 
    
         
            +
                end
         
     | 
| 
       14 
33 
     | 
    
         
             
              end
         
     | 
| 
       15 
34 
     | 
    
         
             
            end
         
     | 
| 
         @@ -14,7 +14,7 @@ module ActiveResource 
     | 
|
| 
       14 
14 
     | 
    
         
             
                  log_level_method = code.to_i < 400 ? :info : :error
         
     | 
| 
       15 
15 
     | 
    
         | 
| 
       16 
16 
     | 
    
         
             
                  send log_level_method, "#{event.payload[:method].to_s.upcase} #{event.payload[:request_uri]}"
         
     | 
| 
       17 
     | 
    
         
            -
                  send log_level_method, "--> %d %s %d (%.1fms)" % [code, message, body.to_s.length, event.duration]
         
     | 
| 
      
 17 
     | 
    
         
            +
                  send log_level_method, "--> %d %s %d (%.1fms)" % [ code, message, body.to_s.length, event.duration ]
         
     | 
| 
       18 
18 
     | 
    
         
             
                end
         
     | 
| 
       19 
19 
     | 
    
         | 
| 
       20 
20 
     | 
    
         
             
                def logger
         
     | 
| 
         @@ -5,6 +5,8 @@ require "rails" 
     | 
|
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
            module ActiveResource
         
     | 
| 
       7 
7 
     | 
    
         
             
              class Railtie < Rails::Railtie
         
     | 
| 
      
 8 
     | 
    
         
            +
                config.eager_load_namespaces << ActiveResource
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
       8 
10 
     | 
    
         
             
                config.active_resource = ActiveSupport::OrderedOptions.new
         
     | 
| 
       9 
11 
     | 
    
         | 
| 
       10 
12 
     | 
    
         
             
                initializer "active_resource.set_configs" do |app|
         
     | 
| 
         @@ -21,5 +23,21 @@ module ActiveResource 
     | 
|
| 
       21 
23 
     | 
    
         
             
                    app.config.active_job.custom_serializers << ActiveResource::ActiveJobSerializer
         
     | 
| 
       22 
24 
     | 
    
         
             
                  end
         
     | 
| 
       23 
25 
     | 
    
         
             
                end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                initializer "active_resource.deprecator" do |app|
         
     | 
| 
      
 28 
     | 
    
         
            +
                  if app.respond_to?(:deprecators)
         
     | 
| 
      
 29 
     | 
    
         
            +
                    app.deprecators[:active_resource] = ActiveResource.deprecator
         
     | 
| 
      
 30 
     | 
    
         
            +
                  end
         
     | 
| 
      
 31 
     | 
    
         
            +
                end
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                initializer "active_resource.logger" do
         
     | 
| 
      
 34 
     | 
    
         
            +
                  ActiveSupport.on_load(:active_resource) { self.logger ||= ::Rails.logger }
         
     | 
| 
      
 35 
     | 
    
         
            +
                end
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
                initializer "active_resource.http_mock" do
         
     | 
| 
      
 38 
     | 
    
         
            +
                  ActiveSupport.on_load(:active_support_test_case) do
         
     | 
| 
      
 39 
     | 
    
         
            +
                    teardown { ActiveResource::HttpMock.reset! }
         
     | 
| 
      
 40 
     | 
    
         
            +
                  end
         
     | 
| 
      
 41 
     | 
    
         
            +
                end
         
     | 
| 
       24 
42 
     | 
    
         
             
              end
         
     | 
| 
       25 
43 
     | 
    
         
             
            end
         
     | 
| 
         @@ -0,0 +1,26 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module ActiveResource
         
     | 
| 
      
 4 
     | 
    
         
            +
              # = Active Resource \Rescuable
         
     | 
| 
      
 5 
     | 
    
         
            +
              #
         
     | 
| 
      
 6 
     | 
    
         
            +
              # Provides
         
     | 
| 
      
 7 
     | 
    
         
            +
              # {rescue_from}[rdoc-ref:ActiveSupport::Rescuable::ClassMethods#rescue_from]
         
     | 
| 
      
 8 
     | 
    
         
            +
              # for resources. Wraps calls over the network to handle configured errors.
         
     | 
| 
      
 9 
     | 
    
         
            +
              module Rescuable
         
     | 
| 
      
 10 
     | 
    
         
            +
                extend ActiveSupport::Concern
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                included do
         
     | 
| 
      
 13 
     | 
    
         
            +
                  include ActiveSupport::Rescuable
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                  around_save :handle_exceptions
         
     | 
| 
      
 16 
     | 
    
         
            +
                  around_destroy :handle_exceptions
         
     | 
| 
      
 17 
     | 
    
         
            +
                end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                private
         
     | 
| 
      
 20 
     | 
    
         
            +
                  def handle_exceptions
         
     | 
| 
      
 21 
     | 
    
         
            +
                    yield
         
     | 
| 
      
 22 
     | 
    
         
            +
                  rescue => exception
         
     | 
| 
      
 23 
     | 
    
         
            +
                    rescue_with_handler(exception) || raise
         
     | 
| 
      
 24 
     | 
    
         
            +
                  end
         
     | 
| 
      
 25 
     | 
    
         
            +
              end
         
     | 
| 
      
 26 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -4,7 +4,7 @@ module ActiveResource # :nodoc: 
     | 
|
| 
       4 
4 
     | 
    
         
             
              class Schema # :nodoc:
         
     | 
| 
       5 
5 
     | 
    
         
             
                # attributes can be known to be one of these types. They are easy to
         
     | 
| 
       6 
6 
     | 
    
         
             
                # cast to/from.
         
     | 
| 
       7 
     | 
    
         
            -
                KNOWN_ATTRIBUTE_TYPES = %w 
     | 
| 
      
 7 
     | 
    
         
            +
                KNOWN_ATTRIBUTE_TYPES = %w[ string text integer float decimal datetime timestamp time date binary boolean ]
         
     | 
| 
       8 
8 
     | 
    
         | 
| 
       9 
9 
     | 
    
         
             
                # An array of attribute definitions, representing the attributes that
         
     | 
| 
       10 
10 
     | 
    
         
             
                # have been defined.
         
     | 
| 
         @@ -0,0 +1,81 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module ActiveResource
         
     | 
| 
      
 4 
     | 
    
         
            +
              # Compatibilitiy with Active Record's
         
     | 
| 
      
 5 
     | 
    
         
            +
              # {serialize}[link:https://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Serialization/ClassMethods.html#method-i-serialize]
         
     | 
| 
      
 6 
     | 
    
         
            +
              # method as the <tt>:coder</tt> option.
         
     | 
| 
      
 7 
     | 
    
         
            +
              #
         
     | 
| 
      
 8 
     | 
    
         
            +
              # === Writing to String columns
         
     | 
| 
      
 9 
     | 
    
         
            +
              #
         
     | 
| 
      
 10 
     | 
    
         
            +
              # Encodes Active Resource instances into a string to be stored in the
         
     | 
| 
      
 11 
     | 
    
         
            +
              # database. Decodes strings read from the database into Active Resource
         
     | 
| 
      
 12 
     | 
    
         
            +
              # instances.
         
     | 
| 
      
 13 
     | 
    
         
            +
              #
         
     | 
| 
      
 14 
     | 
    
         
            +
              #   class User < ActiveRecord::Base
         
     | 
| 
      
 15 
     | 
    
         
            +
              #     serialize :person, coder: Person
         
     | 
| 
      
 16 
     | 
    
         
            +
              #   end
         
     | 
| 
      
 17 
     | 
    
         
            +
              #
         
     | 
| 
      
 18 
     | 
    
         
            +
              #   class Person < ActiveResource::Base
         
     | 
| 
      
 19 
     | 
    
         
            +
              #     schema do
         
     | 
| 
      
 20 
     | 
    
         
            +
              #       attribute :name, :string
         
     | 
| 
      
 21 
     | 
    
         
            +
              #     end
         
     | 
| 
      
 22 
     | 
    
         
            +
              #   end
         
     | 
| 
      
 23 
     | 
    
         
            +
              #
         
     | 
| 
      
 24 
     | 
    
         
            +
              #   user = User.new
         
     | 
| 
      
 25 
     | 
    
         
            +
              #   user.person = Person.new name: "Matz"
         
     | 
| 
      
 26 
     | 
    
         
            +
              #
         
     | 
| 
      
 27 
     | 
    
         
            +
              # Writing string values incorporates the Base.format:
         
     | 
| 
      
 28 
     | 
    
         
            +
              #
         
     | 
| 
      
 29 
     | 
    
         
            +
              #   Person.format = :json
         
     | 
| 
      
 30 
     | 
    
         
            +
              #
         
     | 
| 
      
 31 
     | 
    
         
            +
              #   user.person = Person.new name: "Matz"
         
     | 
| 
      
 32 
     | 
    
         
            +
              #   user.person_before_type_cast # => "{\"name\":\"Matz\"}"
         
     | 
| 
      
 33 
     | 
    
         
            +
              #
         
     | 
| 
      
 34 
     | 
    
         
            +
              #   Person.format = :xml
         
     | 
| 
      
 35 
     | 
    
         
            +
              #
         
     | 
| 
      
 36 
     | 
    
         
            +
              #   user.person = Person.new name: "Matz"
         
     | 
| 
      
 37 
     | 
    
         
            +
              #   user.person_before_type_cast # => "<?xml version=\"1.0\" encoding=\"UTF-8\"?><person><name>Matz</name></person>"
         
     | 
| 
      
 38 
     | 
    
         
            +
              #
         
     | 
| 
      
 39 
     | 
    
         
            +
              # Instances are loaded as persisted when decoded from data containing a
         
     | 
| 
      
 40 
     | 
    
         
            +
              # primary key value, and new records when missing a primary key value:
         
     | 
| 
      
 41 
     | 
    
         
            +
              #
         
     | 
| 
      
 42 
     | 
    
         
            +
              #   user.person = Person.new
         
     | 
| 
      
 43 
     | 
    
         
            +
              #   user.person.persisted? # => false
         
     | 
| 
      
 44 
     | 
    
         
            +
              #
         
     | 
| 
      
 45 
     | 
    
         
            +
              #   user.person = Person.find(1)
         
     | 
| 
      
 46 
     | 
    
         
            +
              #   user.person.persisted? # => true
         
     | 
| 
      
 47 
     | 
    
         
            +
              #
         
     | 
| 
      
 48 
     | 
    
         
            +
              # === Writing to JSON and JSONB columns
         
     | 
| 
      
 49 
     | 
    
         
            +
              #
         
     | 
| 
      
 50 
     | 
    
         
            +
              #   class User < ActiveRecord::Base
         
     | 
| 
      
 51 
     | 
    
         
            +
              #     serialize :person, coder: ActiveResource::Coder.new(Person, :serializable_hash)
         
     | 
| 
      
 52 
     | 
    
         
            +
              #   end
         
     | 
| 
      
 53 
     | 
    
         
            +
              #
         
     | 
| 
      
 54 
     | 
    
         
            +
              #   class Person < ActiveResource::Base
         
     | 
| 
      
 55 
     | 
    
         
            +
              #     schema do
         
     | 
| 
      
 56 
     | 
    
         
            +
              #       attribute :name, :string
         
     | 
| 
      
 57 
     | 
    
         
            +
              #     end
         
     | 
| 
      
 58 
     | 
    
         
            +
              #   end
         
     | 
| 
      
 59 
     | 
    
         
            +
              #
         
     | 
| 
      
 60 
     | 
    
         
            +
              #   user = User.new
         
     | 
| 
      
 61 
     | 
    
         
            +
              #   user.person = Person.new name: "Matz"
         
     | 
| 
      
 62 
     | 
    
         
            +
              #   user.person.name # => "Matz"
         
     | 
| 
      
 63 
     | 
    
         
            +
              #
         
     | 
| 
      
 64 
     | 
    
         
            +
              #   user.person_before_type_cast # => {"name"=>"Matz"}
         
     | 
| 
      
 65 
     | 
    
         
            +
              module Serialization
         
     | 
| 
      
 66 
     | 
    
         
            +
                extend ActiveSupport::Concern
         
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
      
 68 
     | 
    
         
            +
                included do
         
     | 
| 
      
 69 
     | 
    
         
            +
                  class_attribute :coder, instance_accessor: false, instance_predicate: false
         
     | 
| 
      
 70 
     | 
    
         
            +
                end
         
     | 
| 
      
 71 
     | 
    
         
            +
             
     | 
| 
      
 72 
     | 
    
         
            +
                module ClassMethods
         
     | 
| 
      
 73 
     | 
    
         
            +
                  delegate :dump, :load, to: :coder
         
     | 
| 
      
 74 
     | 
    
         
            +
             
     | 
| 
      
 75 
     | 
    
         
            +
                  def inherited(subclass) # :nodoc:
         
     | 
| 
      
 76 
     | 
    
         
            +
                    super
         
     | 
| 
      
 77 
     | 
    
         
            +
                    subclass.coder = Coder.new(subclass)
         
     | 
| 
      
 78 
     | 
    
         
            +
                  end
         
     | 
| 
      
 79 
     | 
    
         
            +
                end
         
     | 
| 
      
 80 
     | 
    
         
            +
              end
         
     | 
| 
      
 81 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -15,7 +15,7 @@ module ActiveResource 
     | 
|
| 
       15 
15 
     | 
    
         
             
                # or not (by passing true).
         
     | 
| 
       16 
16 
     | 
    
         
             
                def from_array(messages, save_cache = false)
         
     | 
| 
       17 
17 
     | 
    
         
             
                  clear unless save_cache
         
     | 
| 
       18 
     | 
    
         
            -
                  humanized_attributes = Hash[@base.known_attributes.map { |attr_name| [attr_name.humanize, attr_name] }]
         
     | 
| 
      
 18 
     | 
    
         
            +
                  humanized_attributes = Hash[@base.known_attributes.map { |attr_name| [ attr_name.humanize, attr_name ] }]
         
     | 
| 
       19 
19 
     | 
    
         
             
                  messages.each do |message|
         
     | 
| 
       20 
20 
     | 
    
         
             
                    attr_message = humanized_attributes.keys.sort_by { |a| -a.length }.detect do |attr_name|
         
     | 
| 
       21 
21 
     | 
    
         
             
                      if message[0, attr_name.size + 1] == "#{attr_name} "
         
     | 
| 
         @@ -57,7 +57,7 @@ module ActiveResource 
     | 
|
| 
       57 
57 
     | 
    
         
             
                    errors = decoded["errors"] || {}
         
     | 
| 
       58 
58 
     | 
    
         
             
                    if errors.kind_of?(Array)
         
     | 
| 
       59 
59 
     | 
    
         
             
                      # 3.2.1-style with array of strings
         
     | 
| 
       60 
     | 
    
         
            -
                       
     | 
| 
      
 60 
     | 
    
         
            +
                      ActiveResource.deprecator.warn("Returning errors as an array of strings is deprecated.")
         
     | 
| 
       61 
61 
     | 
    
         
             
                      from_array errors, save_cache
         
     | 
| 
       62 
62 
     | 
    
         
             
                    else
         
     | 
| 
       63 
63 
     | 
    
         
             
                      # 3.2.2+ style
         
     | 
| 
         @@ -65,7 +65,7 @@ module ActiveResource 
     | 
|
| 
       65 
65 
     | 
    
         
             
                    end
         
     | 
| 
       66 
66 
     | 
    
         
             
                  else
         
     | 
| 
       67 
67 
     | 
    
         
             
                    # <3.2-style respond_with - lacks 'errors' key
         
     | 
| 
       68 
     | 
    
         
            -
                     
     | 
| 
      
 68 
     | 
    
         
            +
                    ActiveResource.deprecator.warn('Returning errors as a hash without a root "errors" key is deprecated.')
         
     | 
| 
       69 
69 
     | 
    
         
             
                    from_hash decoded, save_cache
         
     | 
| 
       70 
70 
     | 
    
         
             
                  end
         
     | 
| 
       71 
71 
     | 
    
         
             
                end
         
     | 
| 
         @@ -160,7 +160,7 @@ module ActiveResource 
     | 
|
| 
       160 
160 
     | 
    
         
             
                #   my_person.valid?
         
     | 
| 
       161 
161 
     | 
    
         
             
                #   # => false
         
     | 
| 
       162 
162 
     | 
    
         
             
                #
         
     | 
| 
       163 
     | 
    
         
            -
                def valid?
         
     | 
| 
      
 163 
     | 
    
         
            +
                def valid?(context = nil)
         
     | 
| 
       164 
164 
     | 
    
         
             
                  run_callbacks :validate do
         
     | 
| 
       165 
165 
     | 
    
         
             
                    super
         
     | 
| 
       166 
166 
     | 
    
         
             
                    load_remote_errors(@remote_errors, true) if defined?(@remote_errors) && @remote_errors.present?
         
     | 
| 
         @@ -0,0 +1,47 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module ActiveResource
         
     | 
| 
      
 4 
     | 
    
         
            +
              class WhereClause < BasicObject # :nodoc:
         
     | 
| 
      
 5 
     | 
    
         
            +
                delegate_missing_to :resources
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
                def initialize(resource_class, options = {})
         
     | 
| 
      
 8 
     | 
    
         
            +
                  @resource_class = resource_class
         
     | 
| 
      
 9 
     | 
    
         
            +
                  @options = options
         
     | 
| 
      
 10 
     | 
    
         
            +
                  @resources = nil
         
     | 
| 
      
 11 
     | 
    
         
            +
                  @loaded = false
         
     | 
| 
      
 12 
     | 
    
         
            +
                end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                def where(clauses = {})
         
     | 
| 
      
 15 
     | 
    
         
            +
                  all(params: clauses)
         
     | 
| 
      
 16 
     | 
    
         
            +
                end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                def all(options = {})
         
     | 
| 
      
 19 
     | 
    
         
            +
                  WhereClause.new(@resource_class, @options.deep_merge(options))
         
     | 
| 
      
 20 
     | 
    
         
            +
                end
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                def load
         
     | 
| 
      
 23 
     | 
    
         
            +
                  unless @loaded
         
     | 
| 
      
 24 
     | 
    
         
            +
                    @resources = @resource_class.find(:all, @options)
         
     | 
| 
      
 25 
     | 
    
         
            +
                    @loaded = true
         
     | 
| 
      
 26 
     | 
    
         
            +
                  end
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                  self
         
     | 
| 
      
 29 
     | 
    
         
            +
                end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                def reload
         
     | 
| 
      
 32 
     | 
    
         
            +
                  reset
         
     | 
| 
      
 33 
     | 
    
         
            +
                  load
         
     | 
| 
      
 34 
     | 
    
         
            +
                end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                private
         
     | 
| 
      
 37 
     | 
    
         
            +
                  def resources
         
     | 
| 
      
 38 
     | 
    
         
            +
                    load
         
     | 
| 
      
 39 
     | 
    
         
            +
                    @resources
         
     | 
| 
      
 40 
     | 
    
         
            +
                  end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                  def reset
         
     | 
| 
      
 43 
     | 
    
         
            +
                    @resources = nil
         
     | 
| 
      
 44 
     | 
    
         
            +
                    @loaded = false
         
     | 
| 
      
 45 
     | 
    
         
            +
                  end
         
     | 
| 
      
 46 
     | 
    
         
            +
              end
         
     | 
| 
      
 47 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/active_resource.rb
    CHANGED
    
    | 
         @@ -23,6 +23,8 @@ 
     | 
|
| 
       23 
23 
     | 
    
         
             
            # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
         
     | 
| 
       24 
24 
     | 
    
         
             
            #++
         
     | 
| 
       25 
25 
     | 
    
         | 
| 
      
 26 
     | 
    
         
            +
            require "uri"
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
       26 
28 
     | 
    
         
             
            require "active_support"
         
     | 
| 
       27 
29 
     | 
    
         
             
            require "active_model"
         
     | 
| 
       28 
30 
     | 
    
         
             
            require "active_resource/exceptions"
         
     | 
| 
         @@ -31,17 +33,35 @@ require "active_resource/version" 
     | 
|
| 
       31 
33 
     | 
    
         
             
            module ActiveResource
         
     | 
| 
       32 
34 
     | 
    
         
             
              extend ActiveSupport::Autoload
         
     | 
| 
       33 
35 
     | 
    
         | 
| 
      
 36 
     | 
    
         
            +
              URI_PARSER = defined?(URI::RFC2396_PARSER) ? URI::RFC2396_PARSER : URI::RFC2396_Parser.new
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
       34 
38 
     | 
    
         
             
              autoload :Base
         
     | 
| 
       35 
39 
     | 
    
         
             
              autoload :Callbacks
         
     | 
| 
      
 40 
     | 
    
         
            +
              autoload :Coder
         
     | 
| 
       36 
41 
     | 
    
         
             
              autoload :Connection
         
     | 
| 
       37 
42 
     | 
    
         
             
              autoload :CustomMethods
         
     | 
| 
       38 
43 
     | 
    
         
             
              autoload :Formats
         
     | 
| 
       39 
44 
     | 
    
         
             
              autoload :HttpMock
         
     | 
| 
      
 45 
     | 
    
         
            +
              autoload :Rescuable
         
     | 
| 
       40 
46 
     | 
    
         
             
              autoload :Schema
         
     | 
| 
      
 47 
     | 
    
         
            +
              autoload :Serialization
         
     | 
| 
       41 
48 
     | 
    
         
             
              autoload :Singleton
         
     | 
| 
       42 
49 
     | 
    
         
             
              autoload :InheritingHash
         
     | 
| 
       43 
50 
     | 
    
         
             
              autoload :Validations
         
     | 
| 
       44 
51 
     | 
    
         
             
              autoload :Collection
         
     | 
| 
      
 52 
     | 
    
         
            +
              eager_autoload do
         
     | 
| 
      
 53 
     | 
    
         
            +
                autoload :WhereClause
         
     | 
| 
      
 54 
     | 
    
         
            +
              end
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
              if ActiveSupport::VERSION::STRING >= "7.1"
         
     | 
| 
      
 57 
     | 
    
         
            +
                def self.deprecator
         
     | 
| 
      
 58 
     | 
    
         
            +
                  @deprecator ||= ActiveSupport::Deprecation.new(VERSION::STRING, "ActiveResource")
         
     | 
| 
      
 59 
     | 
    
         
            +
                end
         
     | 
| 
      
 60 
     | 
    
         
            +
              else
         
     | 
| 
      
 61 
     | 
    
         
            +
                def self.deprecator
         
     | 
| 
      
 62 
     | 
    
         
            +
                  ActiveSupport::Deprecation
         
     | 
| 
      
 63 
     | 
    
         
            +
                end
         
     | 
| 
      
 64 
     | 
    
         
            +
              end
         
     | 
| 
       45 
65 
     | 
    
         
             
            end
         
     | 
| 
       46 
66 
     | 
    
         | 
| 
       47 
67 
     | 
    
         
             
            require "active_resource/railtie" if defined?(Rails.application)
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,13 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: activeresource
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 6. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 6.2.0
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - David Heinemeier Hansson
         
     | 
| 
       8 
     | 
    
         
            -
            autorequire: 
         
     | 
| 
       9 
8 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
9 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date:  
     | 
| 
      
 10 
     | 
    
         
            +
            date: 1980-01-02 00:00:00.000000000 Z
         
     | 
| 
       12 
11 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
12 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
13 
     | 
    
         
             
              name: activesupport
         
     | 
| 
         @@ -16,28 +15,28 @@ dependencies: 
     | 
|
| 
       16 
15 
     | 
    
         
             
                requirements:
         
     | 
| 
       17 
16 
     | 
    
         
             
                - - ">="
         
     | 
| 
       18 
17 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       19 
     | 
    
         
            -
                    version: ' 
     | 
| 
      
 18 
     | 
    
         
            +
                    version: '7.0'
         
     | 
| 
       20 
19 
     | 
    
         
             
              type: :runtime
         
     | 
| 
       21 
20 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       22 
21 
     | 
    
         
             
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
       23 
22 
     | 
    
         
             
                requirements:
         
     | 
| 
       24 
23 
     | 
    
         
             
                - - ">="
         
     | 
| 
       25 
24 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       26 
     | 
    
         
            -
                    version: ' 
     | 
| 
      
 25 
     | 
    
         
            +
                    version: '7.0'
         
     | 
| 
       27 
26 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       28 
27 
     | 
    
         
             
              name: activemodel
         
     | 
| 
       29 
28 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
       30 
29 
     | 
    
         
             
                requirements:
         
     | 
| 
       31 
30 
     | 
    
         
             
                - - ">="
         
     | 
| 
       32 
31 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       33 
     | 
    
         
            -
                    version: ' 
     | 
| 
      
 32 
     | 
    
         
            +
                    version: '7.0'
         
     | 
| 
       34 
33 
     | 
    
         
             
              type: :runtime
         
     | 
| 
       35 
34 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       36 
35 
     | 
    
         
             
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
       37 
36 
     | 
    
         
             
                requirements:
         
     | 
| 
       38 
37 
     | 
    
         
             
                - - ">="
         
     | 
| 
       39 
38 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       40 
     | 
    
         
            -
                    version: ' 
     | 
| 
      
 39 
     | 
    
         
            +
                    version: '7.0'
         
     | 
| 
       41 
40 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       42 
41 
     | 
    
         
             
              name: activemodel-serializers-xml
         
     | 
| 
       43 
42 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
         @@ -112,6 +111,7 @@ files: 
     | 
|
| 
       112 
111 
     | 
    
         
             
            - lib/active_resource/associations/builder/has_one.rb
         
     | 
| 
       113 
112 
     | 
    
         
             
            - lib/active_resource/base.rb
         
     | 
| 
       114 
113 
     | 
    
         
             
            - lib/active_resource/callbacks.rb
         
     | 
| 
      
 114 
     | 
    
         
            +
            - lib/active_resource/coder.rb
         
     | 
| 
       115 
115 
     | 
    
         
             
            - lib/active_resource/collection.rb
         
     | 
| 
       116 
116 
     | 
    
         
             
            - lib/active_resource/connection.rb
         
     | 
| 
       117 
117 
     | 
    
         
             
            - lib/active_resource/custom_methods.rb
         
     | 
| 
         @@ -124,22 +124,24 @@ files: 
     | 
|
| 
       124 
124 
     | 
    
         
             
            - lib/active_resource/log_subscriber.rb
         
     | 
| 
       125 
125 
     | 
    
         
             
            - lib/active_resource/railtie.rb
         
     | 
| 
       126 
126 
     | 
    
         
             
            - lib/active_resource/reflection.rb
         
     | 
| 
      
 127 
     | 
    
         
            +
            - lib/active_resource/rescuable.rb
         
     | 
| 
       127 
128 
     | 
    
         
             
            - lib/active_resource/schema.rb
         
     | 
| 
      
 129 
     | 
    
         
            +
            - lib/active_resource/serialization.rb
         
     | 
| 
       128 
130 
     | 
    
         
             
            - lib/active_resource/singleton.rb
         
     | 
| 
       129 
131 
     | 
    
         
             
            - lib/active_resource/threadsafe_attributes.rb
         
     | 
| 
       130 
132 
     | 
    
         
             
            - lib/active_resource/validations.rb
         
     | 
| 
       131 
133 
     | 
    
         
             
            - lib/active_resource/version.rb
         
     | 
| 
      
 134 
     | 
    
         
            +
            - lib/active_resource/where_clause.rb
         
     | 
| 
       132 
135 
     | 
    
         
             
            - lib/activeresource.rb
         
     | 
| 
       133 
136 
     | 
    
         
             
            homepage: http://www.rubyonrails.org
         
     | 
| 
       134 
137 
     | 
    
         
             
            licenses:
         
     | 
| 
       135 
138 
     | 
    
         
             
            - MIT
         
     | 
| 
       136 
139 
     | 
    
         
             
            metadata:
         
     | 
| 
       137 
140 
     | 
    
         
             
              bug_tracker_uri: https://github.com/rails/activeresource/issues
         
     | 
| 
       138 
     | 
    
         
            -
              changelog_uri: https://github.com/rails/activeresource/releases/tag/v6. 
     | 
| 
      
 141 
     | 
    
         
            +
              changelog_uri: https://github.com/rails/activeresource/releases/tag/v6.2.0
         
     | 
| 
       139 
142 
     | 
    
         
             
              documentation_uri: http://rubydoc.info/gems/activeresource
         
     | 
| 
       140 
     | 
    
         
            -
              source_code_uri: https://github.com/rails/activeresource/tree/v6. 
     | 
| 
      
 143 
     | 
    
         
            +
              source_code_uri: https://github.com/rails/activeresource/tree/v6.2.0
         
     | 
| 
       141 
144 
     | 
    
         
             
              rubygems_mfa_required: 'true'
         
     | 
| 
       142 
     | 
    
         
            -
            post_install_message: 
         
     | 
| 
       143 
145 
     | 
    
         
             
            rdoc_options: []
         
     | 
| 
       144 
146 
     | 
    
         
             
            require_paths:
         
     | 
| 
       145 
147 
     | 
    
         
             
            - lib
         
     | 
| 
         @@ -147,15 +149,14 @@ required_ruby_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       147 
149 
     | 
    
         
             
              requirements:
         
     | 
| 
       148 
150 
     | 
    
         
             
              - - ">="
         
     | 
| 
       149 
151 
     | 
    
         
             
                - !ruby/object:Gem::Version
         
     | 
| 
       150 
     | 
    
         
            -
                  version: 2. 
     | 
| 
      
 152 
     | 
    
         
            +
                  version: 2.7.0
         
     | 
| 
       151 
153 
     | 
    
         
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         
     | 
| 
       152 
154 
     | 
    
         
             
              requirements:
         
     | 
| 
       153 
155 
     | 
    
         
             
              - - ">="
         
     | 
| 
       154 
156 
     | 
    
         
             
                - !ruby/object:Gem::Version
         
     | 
| 
       155 
157 
     | 
    
         
             
                  version: '0'
         
     | 
| 
       156 
158 
     | 
    
         
             
            requirements: []
         
     | 
| 
       157 
     | 
    
         
            -
            rubygems_version: 3. 
     | 
| 
       158 
     | 
    
         
            -
            signing_key: 
         
     | 
| 
      
 159 
     | 
    
         
            +
            rubygems_version: 3.6.7
         
     | 
| 
       159 
160 
     | 
    
         
             
            specification_version: 4
         
     | 
| 
       160 
161 
     | 
    
         
             
            summary: REST modeling framework (part of Rails).
         
     | 
| 
       161 
162 
     | 
    
         
             
            test_files: []
         
     |