pennylane 0.1.0 → 0.2.0.pre.alpha
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/CHANGELOG.md +11 -1
- data/Gemfile.lock +22 -1
- data/README.md +46 -0
- data/lib/pennylane/client.rb +1 -2
- data/lib/pennylane/object.rb +2 -5
- data/lib/pennylane/resources/base.rb +34 -6
- data/lib/pennylane/resources/category.rb +27 -0
- data/lib/pennylane/resources/category_group.rb +16 -0
- data/lib/pennylane/resources/customer.rb +3 -2
- data/lib/pennylane/resources/customer_invoice.rb +45 -0
- data/lib/pennylane/resources/product.rb +22 -0
- data/lib/pennylane/resources/supplier.rb +20 -0
- data/lib/pennylane/util.rb +18 -8
- data/lib/pennylane/version.rb +2 -2
- data/lib/pennylane.rb +6 -1
- data/pennylane.gemspec +1 -0
- metadata +23 -4
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 9a60c1035dbad731707f86c3e97610c740d286cb8e6f70b7ac30709bbe29a0f0
         | 
| 4 | 
            +
              data.tar.gz: b3fd35e53857c0d8df547bb361d4ae69bd1b73a482b7552232ab4cfcce5e8926
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 903f576a32e59f954c68c255ce0aeacf6a820315f233f9825b2d35036cff3ab0928c6ac9fb0e84daa059da40dfde4f1829c5dff61ad58a57a406a3483e69b9e8
         | 
| 7 | 
            +
              data.tar.gz: 72ed99e03c1d31ff1a871ebf0d335110c9a0a38a9acc9d8e14ecaf27a50731afef55ce6d1c77d89cbb0f95558eba121938ba8da7b87827e6c2416be10def3c5d
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,5 +1,15 @@ | |
| 1 1 | 
             
            ## [Unreleased]
         | 
| 2 2 |  | 
| 3 | 
            +
            ## [0.2.0-alpha] - 2024-04-20
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            - Support resources 
         | 
| 6 | 
            +
              - `CategoryGroup`
         | 
| 7 | 
            +
              - `Category` 
         | 
| 8 | 
            +
              - `Product`
         | 
| 9 | 
            +
            - Added missing `#create` to `Supplier`
         | 
| 10 | 
            +
            - Adding `#update` to `Customer` and `Supplier`
         | 
| 11 | 
            +
             | 
| 12 | 
            +
             | 
| 3 13 | 
             
            ## [0.1.0] - 2024-04-04
         | 
| 4 14 |  | 
| 5 | 
            -
            - Initial release
         | 
| 15 | 
            +
            - Initial release
         | 
    
        data/Gemfile.lock
    CHANGED
    
    | @@ -1,15 +1,33 @@ | |
| 1 1 | 
             
            PATH
         | 
| 2 2 | 
             
              remote: .
         | 
| 3 3 | 
             
              specs:
         | 
| 4 | 
            -
                pennylane (0. | 
| 4 | 
            +
                pennylane (0.2.0.pre.alpha)
         | 
| 5 5 |  | 
| 6 6 | 
             
            GEM
         | 
| 7 7 | 
             
              remote: https://rubygems.org/
         | 
| 8 8 | 
             
              specs:
         | 
| 9 | 
            +
                activesupport (7.1.3.2)
         | 
| 10 | 
            +
                  base64
         | 
| 11 | 
            +
                  bigdecimal
         | 
| 12 | 
            +
                  concurrent-ruby (~> 1.0, >= 1.0.2)
         | 
| 13 | 
            +
                  connection_pool (>= 2.2.5)
         | 
| 14 | 
            +
                  drb
         | 
| 15 | 
            +
                  i18n (>= 1.6, < 2)
         | 
| 16 | 
            +
                  minitest (>= 5.1)
         | 
| 17 | 
            +
                  mutex_m
         | 
| 18 | 
            +
                  tzinfo (~> 2.0)
         | 
| 9 19 | 
             
                ast (2.4.2)
         | 
| 20 | 
            +
                base64 (0.2.0)
         | 
| 21 | 
            +
                bigdecimal (3.1.7)
         | 
| 22 | 
            +
                concurrent-ruby (1.2.3)
         | 
| 23 | 
            +
                connection_pool (2.4.1)
         | 
| 24 | 
            +
                drb (2.2.1)
         | 
| 25 | 
            +
                i18n (1.14.4)
         | 
| 26 | 
            +
                  concurrent-ruby (~> 1.0)
         | 
| 10 27 | 
             
                json (2.7.2)
         | 
| 11 28 | 
             
                language_server-protocol (3.17.0.3)
         | 
| 12 29 | 
             
                minitest (5.22.3)
         | 
| 30 | 
            +
                mutex_m (0.2.0)
         | 
| 13 31 | 
             
                parallel (1.24.0)
         | 
| 14 32 | 
             
                parser (3.3.0.5)
         | 
| 15 33 | 
             
                  ast (~> 2.4.1)
         | 
| @@ -36,6 +54,8 @@ GEM | |
| 36 54 | 
             
                ruby-progressbar (1.13.0)
         | 
| 37 55 | 
             
                test-unit (3.6.2)
         | 
| 38 56 | 
             
                  power_assert
         | 
| 57 | 
            +
                tzinfo (2.0.6)
         | 
| 58 | 
            +
                  concurrent-ruby (~> 1.0)
         | 
| 39 59 | 
             
                unicode-display_width (2.5.0)
         | 
| 40 60 | 
             
                vcr (6.2.0)
         | 
| 41 61 |  | 
| @@ -43,6 +63,7 @@ PLATFORMS | |
| 43 63 | 
             
              arm64-darwin-22
         | 
| 44 64 |  | 
| 45 65 | 
             
            DEPENDENCIES
         | 
| 66 | 
            +
              activesupport (~> 7.1)
         | 
| 46 67 | 
             
              minitest (~> 5.22)
         | 
| 47 68 | 
             
              pennylane!
         | 
| 48 69 | 
             
              rake (~> 13.0)
         | 
    
        data/README.md
    CHANGED
    
    | @@ -38,6 +38,32 @@ Pennylane::Customer.list(filter: [{field: 'name', operator: 'eq', value: 'Apple' | |
| 38 38 |  | 
| 39 39 | 
             
            # Retrieve single customer
         | 
| 40 40 | 
             
            Pennylane::Customer.retrieve('38a1f19a-256d-4692-a8fe-0a16403f59ff')
         | 
| 41 | 
            +
             | 
| 42 | 
            +
            # Update a customer
         | 
| 43 | 
            +
            cus = Pennylane::Customer.retrieve('38a1f19a-256d-4692-a8fe-0a16403f59ff')
         | 
| 44 | 
            +
            cus.update(name: 'Apple Inc')
         | 
| 45 | 
            +
             | 
| 46 | 
            +
            ```
         | 
| 47 | 
            +
             | 
| 48 | 
            +
            ### Per-request api key [TODO]
         | 
| 49 | 
            +
            For apps that need to use multiple keys during the lifetime of a process. it's also possible to set a per-request key:
         | 
| 50 | 
            +
            ```ruby
         | 
| 51 | 
            +
            require "pennylane"
         | 
| 52 | 
            +
             | 
| 53 | 
            +
            Pennylane::Customer.list(
         | 
| 54 | 
            +
              {},
         | 
| 55 | 
            +
              {
         | 
| 56 | 
            +
                api_key: 'x1fa....'
         | 
| 57 | 
            +
              }
         | 
| 58 | 
            +
            )
         | 
| 59 | 
            +
             | 
| 60 | 
            +
            Pennylane::Customer.retrieve(
         | 
| 61 | 
            +
              '38a1f19a-256d-4692-a8fe-0a16403f59ff',
         | 
| 62 | 
            +
              {
         | 
| 63 | 
            +
                api_key: 'x1fa....'
         | 
| 64 | 
            +
              }
         | 
| 65 | 
            +
            )
         | 
| 66 | 
            +
             | 
| 41 67 | 
             
            ```
         | 
| 42 68 |  | 
| 43 69 | 
             
            ## Test mode
         | 
| @@ -50,6 +76,26 @@ After checking out the repo, run `bin/setup` to install dependencies. Then, run | |
| 50 76 |  | 
| 51 77 | 
             
            To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
         | 
| 52 78 |  | 
| 79 | 
            +
            Resources implemented so far :
         | 
| 80 | 
            +
            ### CUSTOMER INVOICING
         | 
| 81 | 
            +
             | 
| 82 | 
            +
            - Customer Invoices 🚧
         | 
| 83 | 
            +
            - Estimates 🚧
         | 
| 84 | 
            +
            - Billing Subscriptions 🚧
         | 
| 85 | 
            +
             | 
| 86 | 
            +
            ### REFERENTIALS
         | 
| 87 | 
            +
             | 
| 88 | 
            +
            - Customers ✅
         | 
| 89 | 
            +
            - Suppliers ✅
         | 
| 90 | 
            +
            - Categories ✅
         | 
| 91 | 
            +
            - CategoryGroups ✅
         | 
| 92 | 
            +
            - Products ✅
         | 
| 93 | 
            +
            - Plan Items 🚧
         | 
| 94 | 
            +
            - Enums 🚧
         | 
| 95 | 
            +
             | 
| 96 | 
            +
            ### SUPPLIER INVOICING
         | 
| 97 | 
            +
            - Supplier Invoices 🚧
         | 
| 98 | 
            +
             | 
| 53 99 | 
             
            ## Contributing
         | 
| 54 100 |  | 
| 55 101 | 
             
            Bug reports and pull requests are welcome on GitHub at https://github.com/sbounmy/pennylane. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/[USERNAME]/pennylane/blob/main/CODE_OF_CONDUCT.md).
         | 
    
        data/lib/pennylane/client.rb
    CHANGED
    
    | @@ -36,8 +36,7 @@ module Pennylane | |
| 36 36 |  | 
| 37 37 | 
             
                def request method, path, params:, opts: {}
         | 
| 38 38 | 
             
                  req = initialize_request(method, path, params[:query]).tap do |req|
         | 
| 39 | 
            -
                    req.body = params[:body].to_json if params[:body] | 
| 40 | 
            -
                    # req.query = params if !params.empty? && method == :get
         | 
| 39 | 
            +
                    req.body = params[:body].to_json if params[:body]
         | 
| 41 40 | 
             
                  end
         | 
| 42 41 |  | 
| 43 42 | 
             
                  http.request(req).tap do |resp|
         | 
    
        data/lib/pennylane/object.rb
    CHANGED
    
    | @@ -1,10 +1,7 @@ | |
| 1 1 | 
             
            module Pennylane
         | 
| 2 2 | 
             
              class Object
         | 
| 3 3 | 
             
                include Enumerable
         | 
| 4 | 
            -
             | 
| 5 | 
            -
                def initialize(id = nil)
         | 
| 6 | 
            -
                  @id = id
         | 
| 7 | 
            -
                end
         | 
| 4 | 
            +
                attr_reader :id
         | 
| 8 5 |  | 
| 9 6 | 
             
                def initialize_from_response(response, params = {}, opts = {})
         | 
| 10 7 | 
             
                  values = Util.symbolize_names(response)
         | 
| @@ -19,7 +16,7 @@ module Pennylane | |
| 19 16 | 
             
                end
         | 
| 20 17 |  | 
| 21 18 | 
             
                def self.build_from(response, params = {}, opts = {})
         | 
| 22 | 
            -
                  new | 
| 19 | 
            +
                  new.initialize_from_response(response, params, opts)
         | 
| 23 20 | 
             
                end
         | 
| 24 21 |  | 
| 25 22 | 
             
                def self.objects
         | 
| @@ -11,9 +11,9 @@ module Pennylane | |
| 11 11 | 
             
                      "#{object_name}s"
         | 
| 12 12 | 
             
                    end
         | 
| 13 13 |  | 
| 14 | 
            -
                    def request_pennylane_object(method:, path:, params: {}, opts: {}, usage: [])
         | 
| 14 | 
            +
                    def request_pennylane_object(method:, path:, params: {}, opts: {}, usage: [], with: {})
         | 
| 15 15 | 
             
                      resp, opts = execute_resource_request(method, path, params, opts, usage)
         | 
| 16 | 
            -
                      Util.convert_to_pennylane_object(Util.normalize_response(resp), params, opts)
         | 
| 16 | 
            +
                      Util.convert_to_pennylane_object(Util.normalize_response(resp, with), params, opts)
         | 
| 17 17 | 
             
                    end
         | 
| 18 18 |  | 
| 19 19 | 
             
                    def execute_resource_request(method, path, params = {}, opts = {}, usage = [])
         | 
| @@ -33,18 +33,46 @@ module Pennylane | |
| 33 33 | 
             
                    def client
         | 
| 34 34 | 
             
                      @client ||= Pennylane::Client.new(Pennylane.api_key)
         | 
| 35 35 | 
             
                    end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                    def normalize_filters(filters)
         | 
| 38 | 
            +
                      filters[:filter] = filters[:filter].to_json if filters[:filter]
         | 
| 39 | 
            +
                      filters
         | 
| 40 | 
            +
                    end
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                  # object happens to be nil when the object is in a list
         | 
| 44 | 
            +
                  def id
         | 
| 45 | 
            +
                    object.source_id
         | 
| 46 | 
            +
                  rescue
         | 
| 47 | 
            +
                    super
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                  #
         | 
| 51 | 
            +
                  def object
         | 
| 52 | 
            +
                    @values[self.class.object_name.to_sym]
         | 
| 53 | 
            +
                  end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                  # def inspect
         | 
| 56 | 
            +
                  #   id_string = respond_to?(:id) && !id.nil? ? " id=#{id}" : ""
         | 
| 57 | 
            +
                  #   "#<#{self.class}:0x#{object_id.to_s(16)}#{id_string}> JSON: " +
         | 
| 58 | 
            +
                  #     JSON.pretty_generate(object.instance_variable_get(:@values) || @values)
         | 
| 59 | 
            +
                  # end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                  def update(attributes)
         | 
| 62 | 
            +
                    resp, opts = self.class.request_pennylane_object(method: :put, path: "/#{self.class.object_name_plural}/#{id}", params: { body: { self.class.object_name => attributes } })
         | 
| 63 | 
            +
                    @values = resp.instance_variable_get :@values
         | 
| 64 | 
            +
                    self
         | 
| 36 65 | 
             
                  end
         | 
| 37 66 |  | 
| 38 67 | 
             
                  # So we can call directly method on the object rather than going through his key
         | 
| 39 68 | 
             
                  # Pennylane::Customer.retrieve('any-id').name == Pennylane::Customer.retrieve('any-id').customer.name
         | 
| 40 69 | 
             
                  def method_missing(method_name, *args, &block)
         | 
| 41 | 
            -
                     | 
| 42 | 
            -
                     | 
| 43 | 
            -
                    obj.send(method_name, *args, &block)
         | 
| 70 | 
            +
                    raise NoMethodError, "undefined method `#{method_name}` for #{self.class}" unless object
         | 
| 71 | 
            +
                    object.send(method_name, *args, &block)
         | 
| 44 72 | 
             
                  end
         | 
| 45 73 |  | 
| 46 74 | 
             
                  def respond_to_missing?(method_name, include_private = false)
         | 
| 47 | 
            -
                     | 
| 75 | 
            +
                    object.respond_to?(method_name) || super
         | 
| 48 76 | 
             
                  end
         | 
| 49 77 |  | 
| 50 78 | 
             
                end
         | 
| @@ -0,0 +1,27 @@ | |
| 1 | 
            +
            module Pennylane
         | 
| 2 | 
            +
              class Category < Resources::Base
         | 
| 3 | 
            +
             | 
| 4 | 
            +
                class << self
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                  # override the object_name_plural method otherwise it will return 'categorys'
         | 
| 7 | 
            +
                  def object_name_plural
         | 
| 8 | 
            +
                    'categories'
         | 
| 9 | 
            +
                  end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  def list filters = {}, opts = {}
         | 
| 12 | 
            +
                    normalize_filters(filters)
         | 
| 13 | 
            +
                    request_pennylane_object(method: :get, path: "/categories", params: { query: filters }, opts: opts)
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  def retrieve id, opts = {}
         | 
| 17 | 
            +
                    request_pennylane_object(method: :get, path: "/categories/#{id}", params: {}, opts: opts)
         | 
| 18 | 
            +
                  end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  def create params, opts = {}
         | 
| 21 | 
            +
                    request_pennylane_object(method: :post, path: "/categories", params: { body: { object_name => params } }, opts: opts)
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
            end
         | 
| @@ -0,0 +1,16 @@ | |
| 1 | 
            +
            module Pennylane
         | 
| 2 | 
            +
              class CategoryGroup < Resources::Base
         | 
| 3 | 
            +
             | 
| 4 | 
            +
                class << self
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                  def object_name
         | 
| 7 | 
            +
                    'category_group'
         | 
| 8 | 
            +
                  end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  def list filters = {}, opts = {}
         | 
| 11 | 
            +
                    request_pennylane_object(method: :get, path: "/category_groups", params: { query: filters }, opts: opts)
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
            end
         | 
| @@ -4,11 +4,12 @@ module Pennylane | |
| 4 4 | 
             
                class << self
         | 
| 5 5 |  | 
| 6 6 | 
             
                  def list filters = {}, opts = {}
         | 
| 7 | 
            +
                    normalize_filters(filters)
         | 
| 7 8 | 
             
                    request_pennylane_object(method: :get, path: "/customers", params: { query: filters }, opts: opts)
         | 
| 8 9 | 
             
                  end
         | 
| 9 10 |  | 
| 10 | 
            -
                  def retrieve  | 
| 11 | 
            -
                    request_pennylane_object(method: :get, path: "/customers/#{ | 
| 11 | 
            +
                  def retrieve id, opts = {}
         | 
| 12 | 
            +
                    request_pennylane_object(method: :get, path: "/customers/#{id}", params: {}, opts: opts)
         | 
| 12 13 | 
             
                  end
         | 
| 13 14 |  | 
| 14 15 | 
             
                  def create params, opts = {}
         | 
| @@ -0,0 +1,45 @@ | |
| 1 | 
            +
            module Pennylane
         | 
| 2 | 
            +
              class CustomerInvoice < Resources::Base
         | 
| 3 | 
            +
             | 
| 4 | 
            +
                class << self
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                  def object_name
         | 
| 7 | 
            +
                    'customer_invoice'
         | 
| 8 | 
            +
                  end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  def list filters = {}, opts = {}
         | 
| 11 | 
            +
                    normalize_filters(filters)
         | 
| 12 | 
            +
                    request_pennylane_object(method: :get, path: "/customer_invoices", params: { query: filters }, opts: opts, with: { invoice: 'customer_invoice' })
         | 
| 13 | 
            +
                  end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  def retrieve id, opts = {}
         | 
| 16 | 
            +
                    request_pennylane_object(method: :get, path: "/customer_invoices/#{id}", params: {}, opts: opts, with: { invoice: 'customer_invoice' })
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  def create params, opts = {}
         | 
| 20 | 
            +
                    request_pennylane_object(method: :post, path: "/customer_invoices", params: { body: params }, opts: opts, with: { invoice: 'customer_invoice' })
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                # since object name is different from the class name, we need to override the method
         | 
| 26 | 
            +
                def update(attributes)
         | 
| 27 | 
            +
                  resp, opts = self.class.request_pennylane_object(method: :put, path: "/#{self.class.object_name_plural}/#{id}",
         | 
| 28 | 
            +
                                                                   params: { body: { 'invoice' => attributes } },
         | 
| 29 | 
            +
                                                                   opts: {}, with: { invoice: 'customer_invoice' })
         | 
| 30 | 
            +
                  @values = resp.instance_variable_get :@values
         | 
| 31 | 
            +
                  self
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                # since object name is different from the class name, we need to override the object_name method
         | 
| 35 | 
            +
                def object
         | 
| 36 | 
            +
                  @values[:invoice]
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                # doesnt have a `source_id` so we override it
         | 
| 40 | 
            +
                def id
         | 
| 41 | 
            +
                  object.id
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
              end
         | 
| 45 | 
            +
            end
         | 
| @@ -0,0 +1,22 @@ | |
| 1 | 
            +
            module Pennylane
         | 
| 2 | 
            +
              class Product < Resources::Base
         | 
| 3 | 
            +
             | 
| 4 | 
            +
                class << self
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                  def list filters = {}, opts = {}
         | 
| 7 | 
            +
                    normalize_filters(filters)
         | 
| 8 | 
            +
                    request_pennylane_object(method: :get, path: "/products", params: { query: filters }, opts: opts)
         | 
| 9 | 
            +
                  end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  def retrieve id, opts = {}
         | 
| 12 | 
            +
                    request_pennylane_object(method: :get, path: "/products/#{id}", params: {}, opts: opts)
         | 
| 13 | 
            +
                  end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  def create params, opts = {}
         | 
| 16 | 
            +
                    request_pennylane_object(method: :post, path: "/products", params: { body: { product: params } }, opts: opts)
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
            end
         | 
| @@ -0,0 +1,20 @@ | |
| 1 | 
            +
            module Pennylane
         | 
| 2 | 
            +
              class Supplier < Resources::Base
         | 
| 3 | 
            +
                class << self
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                  def list filters = {}, opts = {}
         | 
| 6 | 
            +
                    normalize_filters(filters)
         | 
| 7 | 
            +
                    request_pennylane_object(method: :get, path: "/suppliers", params: { query: filters }, opts: opts)
         | 
| 8 | 
            +
                  end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  def retrieve supplier_id, opts = {}
         | 
| 11 | 
            +
                    request_pennylane_object(method: :get, path: "/suppliers/#{supplier_id}", params: {}, opts: opts)
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  def create params, opts = {}
         | 
| 15 | 
            +
                    request_pennylane_object(method: :post, path: "/suppliers", params: { body: { object_name => params } }, opts: opts)
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
            end
         | 
    
        data/lib/pennylane/util.rb
    CHANGED
    
    | @@ -20,28 +20,38 @@ module Pennylane | |
| 20 20 | 
             
                  # It will add an _object key to each hash in the response
         | 
| 21 21 | 
             
                  # This key will contain the name of the object
         | 
| 22 22 | 
             
                  # It will also add an _object key to the root of the response
         | 
| 23 | 
            -
                   | 
| 23 | 
            +
                  # with: is used to map the object name to a different class
         | 
| 24 | 
            +
                  # Example : GET /customer_invoices will return a list of invoices
         | 
| 25 | 
            +
                  #  {
         | 
| 26 | 
            +
                  #   "total_pages": 5,
         | 
| 27 | 
            +
                  #   "current_page": 1,
         | 
| 28 | 
            +
                  #   "total_invoices": 12,
         | 
| 29 | 
            +
                  #   "invoices": []
         | 
| 30 | 
            +
                  # }
         | 
| 31 | 
            +
                  # `invoices` should be `customer_invoice` so we can cast it to the right class CustomerInvoice
         | 
| 32 | 
            +
                  # Since we don't have the ability to change the API response.
         | 
| 33 | 
            +
                  # We can achieve this by calling normalize_response(response, with: {invoice: 'customer_invoice'})
         | 
| 34 | 
            +
                  def normalize_response(object, with={})
         | 
| 24 35 | 
             
                    # puts object.inspect
         | 
| 25 36 | 
             
                    case object
         | 
| 26 37 | 
             
                    when Hash
         | 
| 27 38 | 
             
                      new_hash = {}
         | 
| 28 | 
            -
                      new_hash['_object'] = object.has_key?('total_pages') ? 'list' : singularize(object.keys.first)
         | 
| 29 | 
            -
             | 
| 39 | 
            +
                      new_hash['_object'] = object.has_key?('total_pages') ? 'list' : (with[singularize(object.keys.first).to_sym] || singularize(object.keys.first))
         | 
| 30 40 | 
             
                      object.each do |key, value|
         | 
| 31 41 | 
             
                        if value.is_a? Array
         | 
| 32 42 | 
             
                          new_hash[key] = value.map do |h|
         | 
| 33 | 
            -
                            h['_object'] = singularize(key) if h.is_a? Hash
         | 
| 34 | 
            -
                            normalize_response(h)
         | 
| 43 | 
            +
                            h['_object'] = with[singularize(key).to_sym] || singularize(key) if h.is_a? Hash
         | 
| 44 | 
            +
                            normalize_response(h, with)
         | 
| 35 45 | 
             
                          end
         | 
| 36 46 | 
             
                        elsif value.is_a? Hash
         | 
| 37 | 
            -
                          value['_object'] = singularize(key)
         | 
| 47 | 
            +
                          value['_object'] = with[singularize(key).to_sym] || singularize(key)
         | 
| 38 48 | 
             
                        end
         | 
| 39 | 
            -
                        new_hash[key] = normalize_response(value)
         | 
| 49 | 
            +
                        new_hash[key] = normalize_response(value, with)
         | 
| 40 50 | 
             
                      end
         | 
| 41 51 | 
             
                      new_hash
         | 
| 42 52 | 
             
                    when Array
         | 
| 43 53 | 
             
                      object.map do |value|
         | 
| 44 | 
            -
                        normalize_response(value)
         | 
| 54 | 
            +
                        normalize_response(value, with)
         | 
| 45 55 | 
             
                      end
         | 
| 46 56 | 
             
                    else
         | 
| 47 57 | 
             
                      object
         | 
    
        data/lib/pennylane/version.rb
    CHANGED
    
    
    
        data/lib/pennylane.rb
    CHANGED
    
    | @@ -22,7 +22,12 @@ module Pennylane | |
| 22 22 |  | 
| 23 23 | 
             
              API_RESOURCES = {
         | 
| 24 24 | 
             
                ListObject.object_name => ListObject,
         | 
| 25 | 
            -
                 | 
| 25 | 
            +
                Category.object_name => Category,
         | 
| 26 | 
            +
                CategoryGroup.object_name => CategoryGroup,
         | 
| 27 | 
            +
                Customer.object_name => Customer,
         | 
| 28 | 
            +
                CustomerInvoice.object_name => CustomerInvoice,
         | 
| 29 | 
            +
                Product.object_name => Product,
         | 
| 30 | 
            +
                Supplier.object_name => Supplier
         | 
| 26 31 | 
             
              }.freeze
         | 
| 27 32 |  | 
| 28 33 | 
             
              @config = Pennylane::Configuration.new
         | 
    
        data/pennylane.gemspec
    CHANGED
    
    | @@ -34,5 +34,6 @@ Gem::Specification.new do |spec| | |
| 34 34 | 
             
              spec.add_development_dependency "vcr", "~> 6.2"
         | 
| 35 35 | 
             
              spec.add_development_dependency "test-unit", "~> 3.6"
         | 
| 36 36 | 
             
              spec.add_development_dependency "minitest", "~> 5.22"
         | 
| 37 | 
            +
              spec.add_development_dependency "activesupport", "~> 7.1"
         | 
| 37 38 | 
             
              # guide at: https://bundler.io/guides/creating_gem.html
         | 
| 38 39 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: pennylane
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.2.0.pre.alpha
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Stephane Bounmy
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2024-04- | 
| 11 | 
            +
            date: 2024-04-20 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: vcr
         | 
| @@ -52,6 +52,20 @@ dependencies: | |
| 52 52 | 
             
                - - "~>"
         | 
| 53 53 | 
             
                  - !ruby/object:Gem::Version
         | 
| 54 54 | 
             
                    version: '5.22'
         | 
| 55 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 56 | 
            +
              name: activesupport
         | 
| 57 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 58 | 
            +
                requirements:
         | 
| 59 | 
            +
                - - "~>"
         | 
| 60 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 61 | 
            +
                    version: '7.1'
         | 
| 62 | 
            +
              type: :development
         | 
| 63 | 
            +
              prerelease: false
         | 
| 64 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 65 | 
            +
                requirements:
         | 
| 66 | 
            +
                - - "~>"
         | 
| 67 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 68 | 
            +
                    version: '7.1'
         | 
| 55 69 | 
             
            description: Pennylane offers integrated financial management and accounting tools
         | 
| 56 70 | 
             
              for businesses. See https://pennylane.com for details.
         | 
| 57 71 | 
             
            email:
         | 
| @@ -74,7 +88,12 @@ files: | |
| 74 88 | 
             
            - lib/pennylane/list_object.rb
         | 
| 75 89 | 
             
            - lib/pennylane/object.rb
         | 
| 76 90 | 
             
            - lib/pennylane/resources/base.rb
         | 
| 91 | 
            +
            - lib/pennylane/resources/category.rb
         | 
| 92 | 
            +
            - lib/pennylane/resources/category_group.rb
         | 
| 77 93 | 
             
            - lib/pennylane/resources/customer.rb
         | 
| 94 | 
            +
            - lib/pennylane/resources/customer_invoice.rb
         | 
| 95 | 
            +
            - lib/pennylane/resources/product.rb
         | 
| 96 | 
            +
            - lib/pennylane/resources/supplier.rb
         | 
| 78 97 | 
             
            - lib/pennylane/util.rb
         | 
| 79 98 | 
             
            - lib/pennylane/version.rb
         | 
| 80 99 | 
             
            - pennylane.gemspec
         | 
| @@ -97,9 +116,9 @@ required_ruby_version: !ruby/object:Gem::Requirement | |
| 97 116 | 
             
                  version: 2.6.0
         | 
| 98 117 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 99 118 | 
             
              requirements:
         | 
| 100 | 
            -
              - - " | 
| 119 | 
            +
              - - ">"
         | 
| 101 120 | 
             
                - !ruby/object:Gem::Version
         | 
| 102 | 
            -
                  version:  | 
| 121 | 
            +
                  version: 1.3.1
         | 
| 103 122 | 
             
            requirements: []
         | 
| 104 123 | 
             
            rubygems_version: 3.4.10
         | 
| 105 124 | 
             
            signing_key:
         |