https://buttercms.com/blog/launching-your-own-ruby-gem-build-it/
- We need to start by creating the gem
bundle gem smsparatodos_client
- Defining dependencies in smsparatodos_client.gemspecand for this one we are going to addhttpartygem
spec.add_dependency 'httparty'- Implement the API client and configuration
lib/smsparatodos_client/configuration.rb
module SmsParataTodosClient
  class Configuration
    attr_accessor :auth_client, :auth_token
    def initialize
      @auth_client = ''
      @auth_token = ''
    end
  end
endlib/smsparatodos_client.rb
require 'httparty'
require_relative 'smsparatodos_client/configuration'
module SmsParaTodosClient
  class << self
    attr_accessor :configuration
  end
  def self.configure
    self.configuration ||= Configuration.new
    yield(configuration)
  end
endAnd the actual client
lib/smsparatodos_client/client.rb
module SmsparaTodosClient
  class Client
    include HTTParty
    base_uri 'api.smsparatodos.com/v2'
    def initialize
      @auth_token = SmsParaTodosClient.configuration.auth_token
      @auth_client = SmsParaTodosClient.configuration.auth_client
    end
  
    def send_sms(number:, content:, type: 'standard_delivery', customer_reference_id:, mobile_hub_id:)
      self.class.post('/sms/create', {
        headers: {
          'Content-Type' => 'application/json',
          'Authorization-Token'=> "Bearer #{@auth_token}",
          'Authorization-Client' => @auth_client
        },
        body: {
          sms_number: number,
          sms_content: content,
          sms_type: type,
          sms_customer_reference_id: customer_reference_id,
          mobile_hub_id: mobile_hub_id 
        }.to_json
      })
    end
  end
endSo this way you can specify your data in an initializer like this
config/initializers/smsparatodos_client.rb
SmsParaTodosClient.configure do |config|
  config.auth_token = ENV['SMS_AUTH_TOKEN']
  config.auth_client = ENV['SMS	_AUTH_CLIENT']
end- And then use it everywhere
client = SmsParaTodosClient::Client.new
response = client.send_sms(
  number: "+523121231111",
  content: "smsparatodos.com es increíble",
  customer_reference_id: "123",
  mobile_hub_id: "6d5be464-xxxx-xxxx-xxxx-xxxx7242c70d7"
)Before we go, let's add some basic tests using Rspec
- Let's start by adding the gem to our smsparatodos_client.gemspec
spec.add_development_dependency 'rspec', '~> 3.0'Run bundle install to install the dependencies 2. Initialize RSpec
Next, initialize RSpec in your gem directory to create the spec helper files:
bundle exec rspec --init
- Writing Test
Let's create the test under the /specdirectory, and if you are testing theClientclass, you might create a file namedclient_spec.rbwithin thespec/smsparatodos_clientdirectory
Here is the spec
spec/smsparatodos_client/client_spec.rb
require 'spec_helper'
require 'smsparatodos_client'
RSpec.describe SmsParaTodosClient::Client do
  before do
    SmsParaTodosClient.configure do |config|
      config.auth_token = 'test_token'
      config.auth_client = 'test_client'
    end
  end
  describe '#send_sms' do
    let(:client) { described_class.new }
    
    it "sends an SMS and returns a success response" do
      stub_request(:post, "https://api.smsparatodos.com/v2/sms/create")
        .with(
          headers: {
            'Authorization-Token' => 'Bearer test_token',
            'Authorization-Client' => 'test_client',
            'Content-Type' => 'application/json'
          },
          body: {
            sms_number: '+5143434343',
            sms_content: 'test message', 
            sms_type: 'standard_delivery',
            mobile_hub_id: 'test_hub_id'
          }.to_json
        ).to_return(status: 200, body: '', headers: {})
      response = client.send_sms(
        number: "+523121231111",
        content: "Test message",
        customer_reference_id: "123",
        mobile_hub_id: "test_hub_id"
      )
      expect(response.code).to eq 200
    end
  end
endThen you can run your tests with
bundle exec rspecThat's it, now you know how to create your own HTTP client gem for one of your custom APIs