Как провести рефакторинг вызовов обмена данными IEX для получения данных из API в программе ruby - PullRequest
0 голосов
/ 16 февраля 2020

Я использую iex exchange api для получения информации об акциях. Это прекрасно работает, но мой код очень уродливый, интересно, как реорганизовать код.

stock = IEX::Api::Client.new(
            publishable_token: token,
            endpoint: 'https://sandbox.iexapis.com/v1'
            )  

Это то, что нужно для получения информации. Проблема в том, что я должен поместить приведенный выше код в каждый метод, который использует API. Например,

def self.stock_price(ticker) 
        stock = IEX::Api::Client.new(
            publishable_token: token,
            endpoint: 'https://sandbox.iexapis.com/v1'
            )  
        company = stock.company(ticker)
        quote = stock.quote(ticker.upcase) 
        puts "#{company.company_name}: #{quote.latest_price}"
    end 

    def self.week_52_high(ticker) 
        stock = IEX::Api::Client.new(
            publishable_token: token,
            endpoint: 'https://sandbox.iexapis.com/v1'
            )  
            key_stats = stock.key_stats(ticker) 
            puts "52-week high: #{key_stats.week_52_high}"
    end 

    def self.week_52_low(ticker) 
        stock = IEX::Api::Client.new(
            publishable_token: token,
            endpoint: 'https://sandbox.iexapis.com/v1'
            )  
            key_stats = stock.key_stats(ticker) 
            puts "52-week low: #{key_stats.week_52_low}"
       end

Можно ли каким-либо образом учесть факт, который вызывает другой файл и вызывает метод таким образом? Код очень повторяется как есть. Переменная "stock" - это то, с чем мне нужно работать, должна ли я сделать это глобальной переменной? Я слышал, что нет-нет, но является ли этот случай исключением? Кроме того, там, где у меня есть

publishable_token: token,

, эта переменная токена на самом деле является моим жестко закодированным токеном, а не «токеновой» переменной, которую вы видите, я просто изменил ее из-за проблем безопасности. Что я должен делать вместо того, чтобы жестко кодировать это? Документация говорит, чтобы превратить его в переменную окружения, но я не знаю, что это значит. Заранее спасибо!

1 Ответ

1 голос
/ 16 февраля 2020

Что я должен делать вместо того, чтобы жестко его кодировать? В документации говорится, что нужно превратить ее в переменную окружения, но я не знаю, что это значит.

переменная окружения - это переменная, значение которой устанавливается вне приложения, обычно через функциональность встроена в операционную систему или оболочку. Вы должны проверить документацию для вашей установки, чтобы увидеть, как установить env vars.

Вы можете получить env vars в Ruby через ENV ha sh.

ENV['FOO']
ENV.fetch('FOO') # will raise a KeyError if it is not set instead of just returning nil

Rails 5.2 и выше имеют безопасные учетные данные , которые можно использовать вместо этого. Он хранит ваши учетные данные в зашифрованном файле YAML, который можно проверить в системе контроля версий.

Как мне это изменить?

Один из способов сделать это - использовать делегирование вместо множества методов c:

require 'forwardable'

class MyClient
  extend Forwardable
  TOKEN = ENV.fetch('IEX_API_TOKEN')
  ENDPOINT = ENV.fetch('IEX_API_ENDPOINT', 'https://sandbox.iexapis.com/v1')

  def_delegators :@client, :company, :quote, :key_stats

  def initialize(publishable_token: TOKEN, endpoint: ENDPOINT, client: nil)
    # This is know as constructor injection and makes it easy to mock out
    # the dependency in tests 
    @client = client || IEX::Api::Client.new(publishable_token: TOKEN, endpoint: ENDPOINT)
  end

  def stock_price(ticker)
    company_name = company(ticker).company_name
    price = quote(ticker.upcase).latest_price
    puts "#{company_name}: #{price}"
  end 

  def week_52_high(ticker) 
    puts "52-week high: #{key_stats(ticker).week_52_high}"
  end 

  def week_52_low(ticker) 
    puts "52-week low: #{key_stats(ticker).week_52_low}"
  end
end

@client = MyClient.new
@client.week_52_low(ticker)
...