ruby_hubspot_api 0.1.2.1 → 0.2.1
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/.github/workflows/ruby.yml +47 -0
- data/.gitignore +1 -0
- data/CHANGELOG.md +36 -1
- data/Gemfile.lock +19 -10
- data/README.md +316 -24
- data/lib/hubspot/api_client.rb +40 -8
- data/lib/hubspot/batch.rb +252 -0
- data/lib/hubspot/config.rb +2 -1
- data/lib/hubspot/paged_batch.rb +56 -0
- data/lib/hubspot/paged_collection.rb +3 -18
- data/lib/hubspot/property.rb +4 -0
- data/lib/hubspot/resource.rb +248 -15
- data/lib/hubspot/version.rb +1 -1
- data/lib/hubspot.rb +14 -0
- data/lib/ruby_hubspot_api.rb +3 -0
- data/lib/support/patches.rb +11 -0
- data/ruby_hubspot_api.gemspec +4 -2
- metadata +41 -10
- data/.ruby-version +0 -1
    
        data/lib/hubspot/resource.rb
    CHANGED
    
    | @@ -1,23 +1,70 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 3 | 
             
            require_relative './api_client'
         | 
| 4 | 
            +
            require_relative './paged_collection'
         | 
| 5 | 
            +
            require_relative './paged_batch'
         | 
| 4 6 |  | 
| 5 7 | 
             
            module Hubspot
         | 
| 6 8 | 
             
              # rubocop:disable Metrics/ClassLength
         | 
| 7 | 
            -
             | 
| 9 | 
            +
             | 
| 10 | 
            +
              # HubSpot Resource Base Class
         | 
| 11 | 
            +
              # This class provides common functionality for interacting with HubSpot API resources such as Contacts, Companies, etc
         | 
| 12 | 
            +
              #
         | 
| 13 | 
            +
              # It supports common operations like finding, creating, updating, and deleting resources, as well as batch operations.
         | 
| 14 | 
            +
              #
         | 
| 15 | 
            +
              # This class is meant to be inherited by specific resources like `Hubspot::Contact`.
         | 
| 16 | 
            +
              #
         | 
| 17 | 
            +
              # You can access the properties of a resource instance by calling the property name as method
         | 
| 18 | 
            +
              #
         | 
| 19 | 
            +
              # Example Usage:
         | 
| 20 | 
            +
              #   Hubspot::Contact.find(1)
         | 
| 21 | 
            +
              #   contact.name # 'Luke'
         | 
| 22 | 
            +
              #
         | 
| 23 | 
            +
              #   company = Hubspot::Company.create(name: "Acme Corp")
         | 
| 24 | 
            +
              #   company.id.nil? # false
         | 
| 25 | 
            +
              #
         | 
| 8 26 | 
             
              class Resource < ApiClient
         | 
| 9 27 | 
             
                METADATA_FIELDS = %w[createdate hs_object_id lastmodifieddate].freeze
         | 
| 10 28 |  | 
| 11 | 
            -
                # Allow read/write access to properties and metadata
         | 
| 12 | 
            -
             | 
| 29 | 
            +
                # Allow read/write access to id, properties, changes and metadata
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                # the id of the object in hubspot
         | 
| 32 | 
            +
                attr_accessor :id
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                # the properties as if read from the api
         | 
| 35 | 
            +
                attr_accessor :properties
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                # track any changes made to properties before saving etc
         | 
| 38 | 
            +
                attr_accessor :changes
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                # any other data sent from the api about the resource
         | 
| 41 | 
            +
                attr_accessor :metadata
         | 
| 13 42 |  | 
| 14 43 | 
             
                class << self
         | 
| 15 44 | 
             
                  # Find a resource by ID and return an instance of the class
         | 
| 45 | 
            +
                  #
         | 
| 46 | 
            +
                  # id - [Integer] The ID (or hs_object_id) of the resource to fetch.
         | 
| 47 | 
            +
                  #
         | 
| 48 | 
            +
                  # Example:
         | 
| 49 | 
            +
                  #   contact = Hubspot::Contact.find(1)
         | 
| 50 | 
            +
                  #
         | 
| 51 | 
            +
                  # Returns An instance of the resource.
         | 
| 16 52 | 
             
                  def find(id)
         | 
| 17 53 | 
             
                    response = get("/crm/v3/objects/#{resource_name}/#{id}")
         | 
| 18 54 | 
             
                    instantiate_from_response(response)
         | 
| 19 55 | 
             
                  end
         | 
| 20 56 |  | 
| 57 | 
            +
                  # Finds a resource by a given property and value.
         | 
| 58 | 
            +
                  #
         | 
| 59 | 
            +
                  # property - The property to search by (e.g., "email").
         | 
| 60 | 
            +
                  # value - The value of the property to match.
         | 
| 61 | 
            +
                  # properties - Optional list of properties to return.
         | 
| 62 | 
            +
                  #
         | 
| 63 | 
            +
                  # Example:
         | 
| 64 | 
            +
                  #   properties = %w[firstname lastname email last_contacted]
         | 
| 65 | 
            +
                  #   contact = Hubspot::Contact.find_by("email", "john@example.com", properties)
         | 
| 66 | 
            +
                  #
         | 
| 67 | 
            +
                  # Returns An instance of the resource.
         | 
| 21 68 | 
             
                  def find_by(property, value, properties = nil)
         | 
| 22 69 | 
             
                    params = { idProperty: property }
         | 
| 23 70 | 
             
                    params[:properties] = properties if properties.is_a?(Array)
         | 
| @@ -25,12 +72,28 @@ module Hubspot | |
| 25 72 | 
             
                    instantiate_from_response(response)
         | 
| 26 73 | 
             
                  end
         | 
| 27 74 |  | 
| 28 | 
            -
                  #  | 
| 75 | 
            +
                  # Creates a new resource with the given parameters.
         | 
| 76 | 
            +
                  #
         | 
| 77 | 
            +
                  # params - The properties to create the resource with.
         | 
| 78 | 
            +
                  #
         | 
| 79 | 
            +
                  # Example:
         | 
| 80 | 
            +
                  #   contact = Hubspot::Contact.create(name: "John Doe", email: "john@example.com")
         | 
| 81 | 
            +
                  #
         | 
| 82 | 
            +
                  # Returns [Resource] The newly created resource.
         | 
| 29 83 | 
             
                  def create(params)
         | 
| 30 84 | 
             
                    response = post("/crm/v3/objects/#{resource_name}", body: { properties: params }.to_json)
         | 
| 31 85 | 
             
                    instantiate_from_response(response)
         | 
| 32 86 | 
             
                  end
         | 
| 33 87 |  | 
| 88 | 
            +
                  # Updates an existing resource by ID.
         | 
| 89 | 
            +
                  #
         | 
| 90 | 
            +
                  # id - The ID of the resource to update.
         | 
| 91 | 
            +
                  # params - The properties to update.
         | 
| 92 | 
            +
                  #
         | 
| 93 | 
            +
                  # Example:
         | 
| 94 | 
            +
                  #   contact.update(1, name: "Jane Doe")
         | 
| 95 | 
            +
                  #
         | 
| 96 | 
            +
                  # Returns True if the update was successful, false if not
         | 
| 34 97 | 
             
                  def update(id, params)
         | 
| 35 98 | 
             
                    response = patch("/crm/v3/objects/#{resource_name}/#{id}", body: { properties: params }.to_json)
         | 
| 36 99 | 
             
                    raise Hubspot.error_from_response(response) unless response.success?
         | 
| @@ -38,6 +101,14 @@ module Hubspot | |
| 38 101 | 
             
                    true
         | 
| 39 102 | 
             
                  end
         | 
| 40 103 |  | 
| 104 | 
            +
                  # Deletes a resource by ID.
         | 
| 105 | 
            +
                  #
         | 
| 106 | 
            +
                  # id - The ID of the resource to delete.
         | 
| 107 | 
            +
                  #
         | 
| 108 | 
            +
                  # Example:
         | 
| 109 | 
            +
                  #   Hubspot::Contact.archive(1)
         | 
| 110 | 
            +
                  #
         | 
| 111 | 
            +
                  # Returns True if the deletion was successful, false if not
         | 
| 41 112 | 
             
                  def archive(id)
         | 
| 42 113 | 
             
                    response = delete("/crm/v3/objects/#{resource_name}/#{id}")
         | 
| 43 114 | 
             
                    raise Hubspot.error_from_response(response) unless response.success?
         | 
| @@ -45,6 +116,14 @@ module Hubspot | |
| 45 116 | 
             
                    true
         | 
| 46 117 | 
             
                  end
         | 
| 47 118 |  | 
| 119 | 
            +
                  # Lists all resources with optional filters and pagination.
         | 
| 120 | 
            +
                  #
         | 
| 121 | 
            +
                  # params - Optional parameters to filter or paginate the results.
         | 
| 122 | 
            +
                  #
         | 
| 123 | 
            +
                  # Example:
         | 
| 124 | 
            +
                  #   contacts = Hubspot::Contact.list(limit: 100)
         | 
| 125 | 
            +
                  #
         | 
| 126 | 
            +
                  # Returns [PagedCollection] A collection of resources.
         | 
| 48 127 | 
             
                  def list(params = {})
         | 
| 49 128 | 
             
                    PagedCollection.new(
         | 
| 50 129 | 
             
                      url: "/crm/v3/objects/#{resource_name}",
         | 
| @@ -53,7 +132,45 @@ module Hubspot | |
| 53 132 | 
             
                    )
         | 
| 54 133 | 
             
                  end
         | 
| 55 134 |  | 
| 56 | 
            -
                  #  | 
| 135 | 
            +
                  # Performs a batch read operation to retrieve multiple resources by their IDs.
         | 
| 136 | 
            +
                  #
         | 
| 137 | 
            +
                  # object_ids  - A list of resource IDs to fetch.
         | 
| 138 | 
            +
                  #
         | 
| 139 | 
            +
                  # id_property - The property to use for identifying resources (default: 'id').
         | 
| 140 | 
            +
                  #
         | 
| 141 | 
            +
                  #
         | 
| 142 | 
            +
                  # Example:
         | 
| 143 | 
            +
                  #   Hubspot::Contact.batch_read([1, 2, 3])
         | 
| 144 | 
            +
                  #
         | 
| 145 | 
            +
                  # Returns [PagedBatch] A paged batch of resources (call .each_page to cycle through pages from the API)
         | 
| 146 | 
            +
                  def batch_read(object_ids = [], id_property: 'id')
         | 
| 147 | 
            +
                    params = id_property == 'id' ? {} : { idProperty: id_property }
         | 
| 148 | 
            +
             | 
| 149 | 
            +
                    PagedBatch.new(
         | 
| 150 | 
            +
                      url: "/crm/v3/objects/#{resource_name}/batch/read",
         | 
| 151 | 
            +
                      params: params,
         | 
| 152 | 
            +
                      object_ids: object_ids,
         | 
| 153 | 
            +
                      resource_class: self
         | 
| 154 | 
            +
                    )
         | 
| 155 | 
            +
                  end
         | 
| 156 | 
            +
             | 
| 157 | 
            +
                  # Performs a batch read operation to retrieve multiple resources by their IDs
         | 
| 158 | 
            +
                  # until there are none left
         | 
| 159 | 
            +
                  #
         | 
| 160 | 
            +
                  # object_ids - A list of resource IDs to fetch. [Array<Integer>]
         | 
| 161 | 
            +
                  # id_property - The property to use for identifying resources (default: 'id').
         | 
| 162 | 
            +
                  #
         | 
| 163 | 
            +
                  # Example:
         | 
| 164 | 
            +
                  #   Hubspot::Contact.batch_read([1, 2, 3])
         | 
| 165 | 
            +
                  #
         | 
| 166 | 
            +
                  # Returns [Hubspot::Batch] A batch of resources that can be operated on further
         | 
| 167 | 
            +
                  def batch_read_all(object_ids = [], id_property: 'id')
         | 
| 168 | 
            +
                    Hubspot::Batch.read(self, object_ids, id_property: id_property)
         | 
| 169 | 
            +
                  end
         | 
| 170 | 
            +
             | 
| 171 | 
            +
                  # Retrieve the complete list of properties for this resource class
         | 
| 172 | 
            +
                  #
         | 
| 173 | 
            +
                  # Returns [Array<Hubspot::Property>] An array of hubspot properties
         | 
| 57 174 | 
             
                  def properties
         | 
| 58 175 | 
             
                    @properties ||= begin
         | 
| 59 176 | 
             
                      response = get("/crm/v3/properties/#{resource_name}")
         | 
| @@ -61,10 +178,34 @@ module Hubspot | |
| 61 178 | 
             
                    end
         | 
| 62 179 | 
             
                  end
         | 
| 63 180 |  | 
| 181 | 
            +
                  # Retrieve the complete list of user defined properties for this resource class
         | 
| 182 | 
            +
                  #
         | 
| 183 | 
            +
                  # Returns [Array<Hubspot::Property>] An array of hubspot properties
         | 
| 64 184 | 
             
                  def custom_properties
         | 
| 65 185 | 
             
                    properties.reject { |property| property['hubspotDefined'] }
         | 
| 66 186 | 
             
                  end
         | 
| 67 187 |  | 
| 188 | 
            +
                  # Retrieve the complete list of updatable properties for this resource class
         | 
| 189 | 
            +
                  #
         | 
| 190 | 
            +
                  # Returns [Array<Hubspot::Property>] An array of updateable hubspot properties
         | 
| 191 | 
            +
                  def updatable_properties
         | 
| 192 | 
            +
                    properties.reject(&:read_only?)
         | 
| 193 | 
            +
                  end
         | 
| 194 | 
            +
             | 
| 195 | 
            +
                  # Retrieve the complete list of read-only properties for this resource class
         | 
| 196 | 
            +
                  #
         | 
| 197 | 
            +
                  # Returns [Array<Hubspot::Property>] An array of read-only hubspot properties
         | 
| 198 | 
            +
                  def read_only_properties
         | 
| 199 | 
            +
                    properties.select(&:read_only)
         | 
| 200 | 
            +
                  end
         | 
| 201 | 
            +
             | 
| 202 | 
            +
                  # Retrieve information about a specific property
         | 
| 203 | 
            +
                  #
         | 
| 204 | 
            +
                  # Example:
         | 
| 205 | 
            +
                  #   property = Hubspot::Contact.property('industry_sector')
         | 
| 206 | 
            +
                  #   values_for_select = property.options.each_with_object({}) { |prop, ps| ps[prop['value']] = prop['label'] }
         | 
| 207 | 
            +
                  #
         | 
| 208 | 
            +
                  # Returns [Array<Hubspot::Property>] An array of hubspot properties
         | 
| 68 209 | 
             
                  def property(property_name)
         | 
| 69 210 | 
             
                    properties.detect { |prop| prop.name == property_name }
         | 
| 70 211 | 
             
                  end
         | 
| @@ -81,6 +222,45 @@ module Hubspot | |
| 81 222 | 
             
                  }.freeze
         | 
| 82 223 |  | 
| 83 224 | 
             
                  # rubocop:disable Metrics/MethodLength
         | 
| 225 | 
            +
             | 
| 226 | 
            +
                  # Search for resources using a flexible query format and optional properties.
         | 
| 227 | 
            +
                  #
         | 
| 228 | 
            +
                  # This method allows searching for resources by passing a query in the form of a string (for full-text search)
         | 
| 229 | 
            +
                  # or a hash with special suffixes on the keys to define different comparison operators.
         | 
| 230 | 
            +
                  # You can also specify which properties to return and the number of results per page.
         | 
| 231 | 
            +
                  #
         | 
| 232 | 
            +
                  # Available suffixes for query keys (when using a hash):
         | 
| 233 | 
            +
                  #   - `_contains`: Matches values that contain the given string.
         | 
| 234 | 
            +
                  #   - `_gt`: Greater than comparison.
         | 
| 235 | 
            +
                  #   - `_lt`: Less than comparison.
         | 
| 236 | 
            +
                  #   - `_gte`: Greater than or equal to comparison.
         | 
| 237 | 
            +
                  #   - `_lte`: Less than or equal to comparison.
         | 
| 238 | 
            +
                  #   - `_neq`: Not equal to comparison.
         | 
| 239 | 
            +
                  #   - `_in`: Matches any of the values in the given array.
         | 
| 240 | 
            +
                  #
         | 
| 241 | 
            +
                  # If no suffix is provided, the default comparison is equality (`EQ`).
         | 
| 242 | 
            +
                  #
         | 
| 243 | 
            +
                  # query - [String, Hash] The query for searching. This can be either:
         | 
| 244 | 
            +
                  #   - A String: for full-text search.
         | 
| 245 | 
            +
                  #   - A Hash: where each key represents a property and may have suffixes for the comparison
         | 
| 246 | 
            +
                  #     (e.g., `{ email_contains: 'example.org', age_gt: 30 }`).
         | 
| 247 | 
            +
                  # properties - An optional array of property names to return in the search results. [Array<String>]
         | 
| 248 | 
            +
                  #   If not specified or empty, HubSpot will return the default set of properties.
         | 
| 249 | 
            +
                  # page_size - The number of results to return per page (default is 10 for contacts and 100 for everything else).
         | 
| 250 | 
            +
                  #
         | 
| 251 | 
            +
                  # Example Usage:
         | 
| 252 | 
            +
                  #   # Full-text search for 'example.org':
         | 
| 253 | 
            +
                  #   contacts = Hubspot::Contact.search(query: "example.org",
         | 
| 254 | 
            +
                  #                                      properties: ["email", "firstname", "lastname"], page_size: 50)
         | 
| 255 | 
            +
                  #
         | 
| 256 | 
            +
                  #   # Search for contacts whose email contains 'example.org' and are older than 30:
         | 
| 257 | 
            +
                  #   contacts = Hubspot::Contact.search(
         | 
| 258 | 
            +
                  #     query: { email_contains: 'example.org', age_gt: 30 },
         | 
| 259 | 
            +
                  #     properties: ["email", "firstname", "lastname"],
         | 
| 260 | 
            +
                  #     page_size: 50
         | 
| 261 | 
            +
                  #   )
         | 
| 262 | 
            +
                  #
         | 
| 263 | 
            +
                  # Returns [PagedCollection] A paged collection of results that can be iterated over.
         | 
| 84 264 | 
             
                  def search(query:, properties: [], page_size: 100)
         | 
| 85 265 | 
             
                    search_body = {}
         | 
| 86 266 |  | 
| @@ -111,8 +291,6 @@ module Hubspot | |
| 111 291 |  | 
| 112 292 | 
             
                  # rubocop:enable Metrics/MethodLength
         | 
| 113 293 |  | 
| 114 | 
            -
                  private
         | 
| 115 | 
            -
             | 
| 116 294 | 
             
                  # Define the resource name based on the class
         | 
| 117 295 | 
             
                  def resource_name
         | 
| 118 296 | 
             
                    name = self.name.split('::').last.downcase
         | 
| @@ -123,6 +301,8 @@ module Hubspot | |
| 123 301 | 
             
                    end
         | 
| 124 302 | 
             
                  end
         | 
| 125 303 |  | 
| 304 | 
            +
                  private
         | 
| 305 | 
            +
             | 
| 126 306 | 
             
                  # Instantiate a single resource object from the response
         | 
| 127 307 | 
             
                  def instantiate_from_response(response)
         | 
| 128 308 | 
             
                    data = handle_response(response)
         | 
| @@ -160,20 +340,51 @@ module Hubspot | |
| 160 340 | 
             
                end
         | 
| 161 341 |  | 
| 162 342 | 
             
                # rubocop:disable Ling/MissingSuper
         | 
| 343 | 
            +
             | 
| 344 | 
            +
                # Public: Initialize a resouce
         | 
| 345 | 
            +
                #
         | 
| 346 | 
            +
                # data - [2D Hash, nested Hash] data to initialise the resourse This can be either:
         | 
| 347 | 
            +
                #   - A Simple 2D Hash, key value pairs of property => value (for the create option)
         | 
| 348 | 
            +
                #   - A structured hash consisting of { id: <hs_object_id>, properties: {}, ... }
         | 
| 349 | 
            +
                #     This is the same structure as per the API, and can be rebuilt if you store the id
         | 
| 350 | 
            +
                #     of the object against your own data
         | 
| 351 | 
            +
                #
         | 
| 352 | 
            +
                # Example:
         | 
| 353 | 
            +
                #   contact = Hubspot::Contact.new(firstname: 'Luke', lastname: 'Skywalker', email: 'luke@jedi.org')
         | 
| 354 | 
            +
                #   contact.persisted? # false
         | 
| 355 | 
            +
                #   contact.save # creates the record in Hubspot
         | 
| 356 | 
            +
                #   contact.persisted? # true
         | 
| 357 | 
            +
                #   puts "Contact saved with hubspot id #{contact.id}"
         | 
| 358 | 
            +
                #
         | 
| 359 | 
            +
                #   existing_contact = Hubspot::Contact.new(id: hubspot_id, properties: contact.to_hubspot_properties)
         | 
| 163 360 | 
             
                def initialize(data = {})
         | 
| 361 | 
            +
                  data.transform_keys!(&:to_s)
         | 
| 164 362 | 
             
                  @id = extract_id(data)
         | 
| 165 363 | 
             
                  @properties = {}
         | 
| 166 364 | 
             
                  @metadata = {}
         | 
| 167 | 
            -
             | 
| 168 365 | 
             
                  if @id
         | 
| 169 366 | 
             
                    initialize_from_api(data)
         | 
| 170 367 | 
             
                  else
         | 
| 171 368 | 
             
                    initialize_new_object(data)
         | 
| 172 369 | 
             
                  end
         | 
| 173 370 | 
             
                end
         | 
| 371 | 
            +
             | 
| 174 372 | 
             
                # rubocop:enable Ling/MissingSuper
         | 
| 175 373 |  | 
| 176 | 
            -
                #  | 
| 374 | 
            +
                # Determine the state of the object
         | 
| 375 | 
            +
                #
         | 
| 376 | 
            +
                # Returns Boolean
         | 
| 377 | 
            +
                def changes?
         | 
| 378 | 
            +
                  !@changes.empty?
         | 
| 379 | 
            +
                end
         | 
| 380 | 
            +
             | 
| 381 | 
            +
                # Create or Update the resource.
         | 
| 382 | 
            +
                # If the resource was already persisted (e.g. it was retrieved from the API)
         | 
| 383 | 
            +
                # it will be updated using values from @changes
         | 
| 384 | 
            +
                #
         | 
| 385 | 
            +
                # If the resource is new (no id) it will be created
         | 
| 386 | 
            +
                #
         | 
| 387 | 
            +
                # Returns Boolean
         | 
| 177 388 | 
             
                def save
         | 
| 178 389 | 
             
                  if persisted?
         | 
| 179 390 | 
             
                    self.class.update(@id, @changes).tap do |result|
         | 
| @@ -187,11 +398,22 @@ module Hubspot | |
| 187 398 | 
             
                  end
         | 
| 188 399 | 
             
                end
         | 
| 189 400 |  | 
| 401 | 
            +
                # If the resource exists in Hubspot
         | 
| 402 | 
            +
                #
         | 
| 403 | 
            +
                # Returns Boolean
         | 
| 190 404 | 
             
                def persisted?
         | 
| 191 405 | 
             
                  @id ? true : false
         | 
| 192 406 | 
             
                end
         | 
| 193 407 |  | 
| 194 408 | 
             
                # Update the resource
         | 
| 409 | 
            +
                #
         | 
| 410 | 
            +
                # params - hash of properties to update in key value pairs
         | 
| 411 | 
            +
                #
         | 
| 412 | 
            +
                # Example:
         | 
| 413 | 
            +
                #   contact = Hubspot::Contact.find(hubspot_contact_id)
         | 
| 414 | 
            +
                #   contact.update(status: 'gold customer', last_contacted_at: Time.now.utc.iso8601)
         | 
| 415 | 
            +
                #
         | 
| 416 | 
            +
                # Returns Boolean
         | 
| 195 417 | 
             
                def update(params)
         | 
| 196 418 | 
             
                  raise 'Not able to update as not persisted' unless persisted?
         | 
| 197 419 |  | 
| @@ -202,13 +424,27 @@ module Hubspot | |
| 202 424 | 
             
                  save
         | 
| 203 425 | 
             
                end
         | 
| 204 426 |  | 
| 427 | 
            +
                # Archive the object in Hubspot
         | 
| 428 | 
            +
                #
         | 
| 429 | 
            +
                # Example:
         | 
| 430 | 
            +
                #   company = Hubspot::Company.find(hubspot_company_id)
         | 
| 431 | 
            +
                #   company.delete
         | 
| 432 | 
            +
                #
         | 
| 205 433 | 
             
                def delete
         | 
| 206 434 | 
             
                  self.class.archive(id)
         | 
| 207 435 | 
             
                end
         | 
| 208 436 | 
             
                alias archive delete
         | 
| 209 437 |  | 
| 438 | 
            +
                def resource_name
         | 
| 439 | 
            +
                  self.class.resource_name
         | 
| 440 | 
            +
                end
         | 
| 441 | 
            +
             | 
| 210 442 | 
             
                # rubocop:disable Metrics/MethodLength
         | 
| 211 | 
            -
             | 
| 443 | 
            +
             | 
| 444 | 
            +
                # getter: Check the properties and changes hashes to see if the method
         | 
| 445 | 
            +
                # being called is a key, and return the corresponding value
         | 
| 446 | 
            +
                # setter: If the method ends in "=" persist the value in the changes hash
         | 
| 447 | 
            +
                # (when it is different from the corresponding value in properties if set)
         | 
| 212 448 | 
             
                def method_missing(method, *args)
         | 
| 213 449 | 
             
                  method_name = method.to_s
         | 
| 214 450 |  | 
| @@ -232,19 +468,16 @@ module Hubspot | |
| 232 468 | 
             
                  end
         | 
| 233 469 |  | 
| 234 470 | 
             
                  # Fallback if the method or attribute is not found
         | 
| 235 | 
            -
                  # :nocov:
         | 
| 236 471 | 
             
                  super
         | 
| 237 | 
            -
                  # :nocov:
         | 
| 238 472 | 
             
                end
         | 
| 473 | 
            +
             | 
| 239 474 | 
             
                # rubocop:enable Metrics/MethodLength
         | 
| 240 475 |  | 
| 241 | 
            -
                # Ensure respond_to_missing?  | 
| 242 | 
            -
                # :nocov:
         | 
| 476 | 
            +
                # Ensure respond_to_missing? handles existing keys in the properties anc changes hashes
         | 
| 243 477 | 
             
                def respond_to_missing?(method_name, include_private = false)
         | 
| 244 478 | 
             
                  property_name = method_name.to_s.chomp('=')
         | 
| 245 479 | 
             
                  @properties.key?(property_name) || @changes.key?(property_name) || super
         | 
| 246 480 | 
             
                end
         | 
| 247 | 
            -
                # :nocov:
         | 
| 248 481 |  | 
| 249 482 | 
             
                private
         | 
| 250 483 |  | 
    
        data/lib/hubspot/version.rb
    CHANGED
    
    
    
        data/lib/hubspot.rb
    CHANGED
    
    | @@ -19,6 +19,7 @@ module Hubspot | |
| 19 19 | 
             
                def configure
         | 
| 20 20 | 
             
                  yield(config) if block_given?
         | 
| 21 21 | 
             
                  set_client_headers if config.access_token
         | 
| 22 | 
            +
                  set_request_timeouts
         | 
| 22 23 | 
             
                end
         | 
| 23 24 |  | 
| 24 25 | 
             
                def configured?
         | 
| @@ -31,5 +32,18 @@ module Hubspot | |
| 31 32 | 
             
                def set_client_headers
         | 
| 32 33 | 
             
                  Hubspot::ApiClient.headers 'Authorization' => "Bearer #{config.access_token}"
         | 
| 33 34 | 
             
                end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                def set_request_timeouts
         | 
| 37 | 
            +
                  config.timeout && Hubspot::ApiClient.default_timeout(config.timeout)
         | 
| 38 | 
            +
                  timeouts = %i[open_timeout read_timeout]
         | 
| 39 | 
            +
                  timeouts << :write_timeout if RUBY_VERSION >= '2.6'
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                  timeouts.each do |t|
         | 
| 42 | 
            +
                    timeout = config.send(t)
         | 
| 43 | 
            +
                    next unless timeout
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                    Hubspot::ApiClient.send(t, timeout)
         | 
| 46 | 
            +
                  end
         | 
| 47 | 
            +
                end
         | 
| 34 48 | 
             
              end
         | 
| 35 49 | 
             
            end
         | 
    
        data/lib/ruby_hubspot_api.rb
    CHANGED
    
    
    
        data/ruby_hubspot_api.gemspec
    CHANGED
    
    | @@ -40,12 +40,14 @@ Gem::Specification.new do |spec| | |
| 40 40 | 
             
              # Define development dependencies
         | 
| 41 41 | 
             
              spec.add_development_dependency 'rake', '>= 11.0', '< 14.0'
         | 
| 42 42 |  | 
| 43 | 
            -
              spec.add_development_dependency 'bundler', '>= 2.0'
         | 
| 43 | 
            +
              spec.add_development_dependency 'bundler', '>= 2.0', '< 2.4.0'
         | 
| 44 | 
            +
              spec.add_development_dependency 'codecov'
         | 
| 44 45 | 
             
              spec.add_development_dependency 'dotenv', '>= 2.0'
         | 
| 45 46 | 
             
              spec.add_development_dependency 'pry', '>= 0.1'
         | 
| 46 47 | 
             
              spec.add_development_dependency 'pry-byebug', '>= 3.0'
         | 
| 47 48 | 
             
              spec.add_development_dependency 'rspec', '>= 3.0'
         | 
| 48 | 
            -
              spec.add_development_dependency 'simplecov' | 
| 49 | 
            +
              spec.add_development_dependency 'simplecov'
         | 
| 50 | 
            +
              spec.add_development_dependency 'simplecov-lcov'
         | 
| 49 51 | 
             
              spec.add_development_dependency 'vcr', '>= 6.0'
         | 
| 50 52 | 
             
              spec.add_development_dependency 'webmock', '>= 3.0'
         | 
| 51 53 |  | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: ruby_hubspot_api
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.2.1
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Simon Brook
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2024- | 
| 11 | 
            +
            date: 2024-10-01 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: rake
         | 
| @@ -37,6 +37,9 @@ dependencies: | |
| 37 37 | 
             
                - - ">="
         | 
| 38 38 | 
             
                  - !ruby/object:Gem::Version
         | 
| 39 39 | 
             
                    version: '2.0'
         | 
| 40 | 
            +
                - - "<"
         | 
| 41 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 42 | 
            +
                    version: 2.4.0
         | 
| 40 43 | 
             
              type: :development
         | 
| 41 44 | 
             
              prerelease: false
         | 
| 42 45 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| @@ -44,6 +47,23 @@ dependencies: | |
| 44 47 | 
             
                - - ">="
         | 
| 45 48 | 
             
                  - !ruby/object:Gem::Version
         | 
| 46 49 | 
             
                    version: '2.0'
         | 
| 50 | 
            +
                - - "<"
         | 
| 51 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 52 | 
            +
                    version: 2.4.0
         | 
| 53 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 54 | 
            +
              name: codecov
         | 
| 55 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 56 | 
            +
                requirements:
         | 
| 57 | 
            +
                - - ">="
         | 
| 58 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 59 | 
            +
                    version: '0'
         | 
| 60 | 
            +
              type: :development
         | 
| 61 | 
            +
              prerelease: false
         | 
| 62 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 63 | 
            +
                requirements:
         | 
| 64 | 
            +
                - - ">="
         | 
| 65 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 66 | 
            +
                    version: '0'
         | 
| 47 67 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 48 68 | 
             
              name: dotenv
         | 
| 49 69 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -106,20 +126,28 @@ dependencies: | |
| 106 126 | 
             
                requirements:
         | 
| 107 127 | 
             
                - - ">="
         | 
| 108 128 | 
             
                  - !ruby/object:Gem::Version
         | 
| 109 | 
            -
                    version: '0 | 
| 110 | 
            -
                - - "<"
         | 
| 111 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 112 | 
            -
                    version: '1.0'
         | 
| 129 | 
            +
                    version: '0'
         | 
| 113 130 | 
             
              type: :development
         | 
| 114 131 | 
             
              prerelease: false
         | 
| 115 132 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 116 133 | 
             
                requirements:
         | 
| 117 134 | 
             
                - - ">="
         | 
| 118 135 | 
             
                  - !ruby/object:Gem::Version
         | 
| 119 | 
            -
                    version: '0 | 
| 120 | 
            -
             | 
| 136 | 
            +
                    version: '0'
         | 
| 137 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 138 | 
            +
              name: simplecov-lcov
         | 
| 139 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 140 | 
            +
                requirements:
         | 
| 141 | 
            +
                - - ">="
         | 
| 121 142 | 
             
                  - !ruby/object:Gem::Version
         | 
| 122 | 
            -
                    version: ' | 
| 143 | 
            +
                    version: '0'
         | 
| 144 | 
            +
              type: :development
         | 
| 145 | 
            +
              prerelease: false
         | 
| 146 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 147 | 
            +
                requirements:
         | 
| 148 | 
            +
                - - ">="
         | 
| 149 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 150 | 
            +
                    version: '0'
         | 
| 123 151 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 124 152 | 
             
              name: vcr
         | 
| 125 153 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -176,10 +204,10 @@ extensions: [] | |
| 176 204 | 
             
            extra_rdoc_files: []
         | 
| 177 205 | 
             
            files:
         | 
| 178 206 | 
             
            - ".env.sample"
         | 
| 207 | 
            +
            - ".github/workflows/ruby.yml"
         | 
| 179 208 | 
             
            - ".gitignore"
         | 
| 180 209 | 
             
            - ".rspec"
         | 
| 181 210 | 
             
            - ".rubocop.yml"
         | 
| 182 | 
            -
            - ".ruby-version"
         | 
| 183 211 | 
             
            - CHANGELOG.md
         | 
| 184 212 | 
             
            - Gemfile
         | 
| 185 213 | 
             
            - Gemfile.lock
         | 
| @@ -190,16 +218,19 @@ files: | |
| 190 218 | 
             
            - bin/setup
         | 
| 191 219 | 
             
            - lib/hubspot.rb
         | 
| 192 220 | 
             
            - lib/hubspot/api_client.rb
         | 
| 221 | 
            +
            - lib/hubspot/batch.rb
         | 
| 193 222 | 
             
            - lib/hubspot/company.rb
         | 
| 194 223 | 
             
            - lib/hubspot/config.rb
         | 
| 195 224 | 
             
            - lib/hubspot/contact.rb
         | 
| 196 225 | 
             
            - lib/hubspot/exceptions.rb
         | 
| 226 | 
            +
            - lib/hubspot/paged_batch.rb
         | 
| 197 227 | 
             
            - lib/hubspot/paged_collection.rb
         | 
| 198 228 | 
             
            - lib/hubspot/property.rb
         | 
| 199 229 | 
             
            - lib/hubspot/resource.rb
         | 
| 200 230 | 
             
            - lib/hubspot/user.rb
         | 
| 201 231 | 
             
            - lib/hubspot/version.rb
         | 
| 202 232 | 
             
            - lib/ruby_hubspot_api.rb
         | 
| 233 | 
            +
            - lib/support/patches.rb
         | 
| 203 234 | 
             
            - ruby_hubspot_api.gemspec
         | 
| 204 235 | 
             
            homepage: https://github.com/sensadrome/ruby_hubspot_api
         | 
| 205 236 | 
             
            licenses:
         | 
    
        data/.ruby-version
    DELETED
    
    | @@ -1 +0,0 @@ | |
| 1 | 
            -
            2.5.3
         |