DearInventory

A Ruby API client for connecting to DEAR Inventory. At this point, I have only been implementing the GET requests based upon our business needs but, if you like the look of this gem but require a missing endpoint, it would be quite easy to bolt on POST/PUT/Delete endpoints.

Honestly, the DEAR API is a mess. Where possible, this gem attempts to hide the rampant inconsistencies and provide continuity but I'm afraid I'm no magician.

Installation

Add this line to your application's Gemfile:

gem "dear_inventory"

And then execute:

$ bundle

Or install it yourself as:

$ gem install dear_inventory

N.B for Ruby 2.7

At time of writing, the Sorbet team has not yet accepted my pull request to fix deprecation warnings due to the use of the single splat operator. It can be quite frustrating to have your console flooded with warnings and so it may be worth your while specifying my fork of sorbet-runtime in your project's Gemfile:

gem "sorbet-runtime",
    git: "https://github.com/HashNotAdam/sorbet.git",
    branch: "feature/ruby_2_7_keyword_arguments",
    glob: "gems/sorbet-runtime/sorbet-runtime.gemspec"

Configuration

Before you begin, you will need to setup API credentials in DEAR Inventory at https://inventory.dearsystems.com/ExternalApi

Next you need to supply your API credentials:

require "dear_inventory"

DearInventory.configure do |config|
  config. = "account_id"
  config.key = "key"
end

There is a default logger set to write to STDOUT which is also configurable

DearInventory.configure do |config|
  ...
  config.logger = CustomLogger.new
end

Endpoints

Managing pagination

The response object for any endpoint that returns a paginated result set will include helper methods for retrieving the results.

each

each iterates over all the records as if they were not paginated, automatically retrieving subsequent pages.

DearInventory::Customer.().each do |record|
    do_some_things(record)
end

next_page

If you would like control over the pagination process, the paginated responses include a next_page method

response = DearInventory::Customer.()

loop do
  do_some_things(response)
  break unless response.next_page?
  response = response.next_page
end

Exceptions

Exceptions that occur while making a request to DEAR Inventory should be a subclass of DearInventory::RequestError. These errors include the DearInventory::Response instance which provides some flexibility in your error reporting.

def find_a_sale
  DearInventory::Sale.(id: "incorrect")
rescue DearInventory::RequestError => e
  message = [
    e.message,
    "URI: #{e.response.request.uri}",
    "Params: #{e.response.request.params.to_h}"
  ]
  ErrorMonitoring.error(message.join("\n"))
end

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake spec to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.

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 tags, and push the .gem file to rubygems.org.

Since it is necessary to authenticate with DEAR Inventory to test API resources, credentials are required. The dotenv gem is loaded when tests are run and will look for a .env file in the root directory. A .env.example file has been supplied so you copy it to .env and replace the example values:

cp .env.example .env

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/HashNotAdam/dear_inventory. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.

License

The gem is available as open source under the terms of the MIT License.

Code of Conduct

Everyone interacting in the DearInventory project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the code of conduct.