Sha256: e8641fcdbcecdd909afd6d10b53e1a77321733e7c7edfa005b60f57ddaecbdcc

Contents?: true

Size: 1.86 KB

Versions: 7

Compression:

Stored size: 1.86 KB

Contents

# frozen_string_literal: true

require 'oj'

module EodFacade
  class Options < ::EodFacade::Base
    class << self
      def call(symbol)
        underlying = EodServices::Contract.underlying_symbol(symbol)
        expiry = EodServices::Contract.contract_expiry(symbol)
        option_type = contract_type(symbol)

        unless expiry
          raise ArgumentError, "Invalid expiration date for option #{symbol}"
        end

        response = make_request(url_path(underlying), params(expiry))

        unless response.success?
          raise ArgumentError, "Error fetching options data for #{symbol}"
        end

        contracts = response.parsed_response

        contract_hash(
          symbol: symbol,
          contracts: contracts,
          option_type: option_type
        )
      end

      private

      def params(expiry)
        {
          from: expiry.to_s,
          to: expiry.to_s
        }
      end

      def url_path(underlying)
        "/options/#{underlying}"
      end

      def contract_hash(symbol:, contracts:, option_type:)
        by_expiration = contracts['data'].first
        expiration_date = by_expiration && by_expiration['expirationDate']

        by_option_type = by_expiration && by_expiration['options'][option_type]
        contract = by_option_type&.find do |c|
          c['contractName'] == symbol
        end

        raise ArgumentError, "Contract #{symbol} not found" unless contract

        contract.merge('expirationDate' => expiration_date)
      end

      def contract_type(symbol)
        option_type = EodServices::Contract.contract_type(symbol)
        case option_type
        when EodModels::OptionType::CALL
          'CALL'
        when EodModels::OptionType::PUT
          'PUT'
        else
          raise ArgumentError,
                "Invalid option_type #{option_type} for symbol #{symbol}"
        end
      end
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
sensei_eod_utils-0.0.24 lib/eod_facade/options.rb
sensei_eod_utils-0.0.23 lib/eod_facade/options.rb
sensei_eod_utils-0.0.22 lib/eod_facade/options.rb
sensei_eod_utils-0.0.21 lib/eod_facade/options.rb
sensei_eod_utils-0.0.20 lib/eod_facade/options.rb
sensei_eod_utils-0.0.19 lib/eod_facade/options.rb
sensei_eod_utils-0.0.17 lib/eod_facade/options.rb