Project

tarpon

0.02
No release in over a year
A Ruby interface to RevenueCat REST API
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

~> 13.0
~> 3.11
~> 1.29
~> 3.14

Runtime

~> 4.4
 Project Readme

Tarpon

Build Status Gem Version

A Ruby interface to RevenueCat's REST API.

Installation | Usage | API Reference

Installation

Add this line to your application's Gemfile:

gem 'tarpon'

And then execute:

$ bundle

Or install it yourself as:

$ gem install tarpon

Usage

Configuration

Tarpon::Client.configure do |c|
  c.public_api_key = 'your-public-key'
  c.secret_api_key = 'your-secret-key'
  c.timeout        = 5 # a global timeout in seconds for http requests to RevenueCat server, default is 5 seconds
end

Get your credentials from the RevenueCat dashboard. Read more about authentication on the RevenueCat docs.

Configuring multiple clients

If you need to support different configurations (e.g. to target different RevenueCat projects), you can instantiate different Tarpon clients. For example:

PROJECT_1_RC_CLIENT = Tarpon::Client.new do |c|
  c.public_api_key = 'project-1-public-key'
  c.secret_api_key = 'project-1-secret-key'
end

PROJECT_2_RC_CLIENT = Tarpon::Client.new do |c|
  c.public_api_key = 'project-2-public-key'
  c.secret_api_key = 'project-2-secret-key'
end

And then you can use them instead of calling methods on Tarpon::Client. For example:

PROEJCT_1_RC_CLIENT
  .subscriber('app_user_id')
  .get_or_create

You can also pass configuration values as a Hash to the Tarpon::Client constructor, if desired:

Tarpon::Client.new(public_api_key: 'public-key', private_api_key: 'private-key')

Performing requests

Get or create a subscriber

Tarpon::Client
  .subscriber('app_user_id')
  .get_or_create

Update subscriber attributes

Tarpon::Client
  .subscriber('app_user_id')
  .attributes
  .update('$email': {
    value: 'test@example.com'
  })

Delete a subscriber

Tarpon::Client
  .subscriber('app_user_id')
  .delete

Grant a promotional entitlement

Tarpon::Client
  .subscriber('app_user_id')
  .entitlements('entitlement_id')
  .grant_promotional(duration: 'daily', start_time_ms: 1582023714931)

Be aware that RevenueCat doesn't create the subscriber automatically. If the app_user_id doesn't exist, the request will fail with a 404 Not Found. Perform a Tarpon::Client.subscriber('app_user_id').get_or_create beforehand to make sure the subscriber exists when granting promotional entitlements:

Tarpon::Client.subscriber('app_user_id').get_or_create # subscriber is created

Tarpon::Client
  .subscriber('app_user_id')
  .entitlements('entitlement_id')
  .grant_promotional(duration: 'daily', start_time_ms: 1582023714931)

Check the endpoint reference for valid duration values, Tarpon does not perform any input validation.

List offerings available to subscriber

Tarpon::Client
  .subscriber('app_user_id')
  .offerings
  .list(platform)

Where platform is one either ios, android, macos, uikitformac or stripe.

Read more about offerings here

Revoke a promotional entitlement

Tarpon::Client
  .subscriber('app_user_id')
  .entitlements('entitlement_id')
  .revoke_promotional

Create a purchase

platform = 'ios' # possible values: android|ios|stripe
payload = {
  app_user_id: 'app_user_id',
  fetch_token: 'fetch_token',
}
Tarpon::Client
  .receipt
  .create(platform: platform, payload)

Check the endpoint reference for a valid purchase payload.

Defer billing (android)

Tarpon::Client
  .subscriber('app_user_id')
  .subscriptions('product_id')
  .defer(expiry_time_ms: 1582023715118)

Handling responses

By default, Tarpon will raise custom errors in the following occasions:

  • Tarpon::NotFoundError will be raised when RevenueCat server responds with a not found status code.

  • Tarpon::InvalidCredentialsError will be raised when RevenueCat server responds with unauthorized status code, e.g. invalid API key.

  • Tarpon::ServerError will be raised when RevenueCat server responds with internal error status code (5xx).

  • Tarpon::TimeoutError will be raised when RevenueCat server takes too long to respond, based on Tarpon::Client.timeout.

  • Tarpon::TooManyRequests will be raise when RevenueCat server responds with 429 status code.

For success and client error status codes, Tarpon will parse it to the response object.

The Response object

response = Tarpon::Client
             .subscriber('app_user_id')
             .get_or_create

The plain response body from RevenueCat is stored in the raw attribute:

response.raw
# {
#   request_date_ms: 1582029851163,
#   subscriber: {
#     original_app_user_id: 'app_user_id',
#     ...
#   }
# }

Use the success? method to know whether the request was successful:

response.success? # boolean

The subscriber entity is stored in the subscriber attribute when the subscriber object is returned by RevenueCat:

response.subscriber # <Tarpon::Entity::Subscriber>

The subscriber entity

The subscriber entity comes with a few goodies that might save you some time.

Get the user entitlements:

response.subscriber.entitlements

Get only active user entitlements:

response.subscriber.entitlements.active

The entitlement entity

response.subscriber.entitlements.each do |entitlement|
  entitlement.expires_date # Ruby time parsed from iso8601
  entitlement.active? # true if expires_date > Time.now.utc
end

Advanced HTTP configuration

You can access the HTTP requests as they are performed for advanced configuration, allowing you to configure things such as logging, instrumentation, more granular timeouts, or using an HTTP proxy.

Under the hood, Tarpon uses the HTTP.rb library, which provides an easy to extend API to configure HTTP requests. You can access this by providing a custom http_middleware Proc when configuring a Tarpon::Client that receives and returns an HTTP::Client.

Tarpon::Client.configure do |c|
  c.http_middleware = ->(http_client) do
    http_client
      .use(instrumentation: { instrumenter: ActiveSupport::Notifications.instrumenter })
      .via('https://custom.proxy.com', 8080)
  end
end

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/fishbrain/tarpon.

Clone the repository using

$ git clone https://github.com/fishbrain/tarpon.git && cd tarpon

Install development dependencies through Bundler

$ bundle install

Run tests and linter using

$ bundle exec rspec && bundle exec rubocop

License

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