1
0
Fork 0
mirror of https://github.com/maybe-finance/maybe.git synced 2025-08-05 05:25:24 +02:00

Initial pass at Synth-based ticker selection (#1392)

* Initial pass at Synth-based ticker selection

* Update _tickers.turbo_stream.erb

* Functional combobox display

* A few cleanup steps

* Linter

* Prevent long strings

* Another step towards functional combobox

* Deprecated files

* Custom Combobox implementation

* Lint

* Test suite fixes

* Lint

* Make direct use of mic codes

* Update splits

* Update trades_test.rb
This commit is contained in:
Josh Pigford 2024-10-30 09:23:44 -04:00 committed by GitHub
parent 490f44589e
commit cd91e66618
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
20 changed files with 118 additions and 232 deletions

View file

@ -1,45 +0,0 @@
class Security::Importer
def initialize(provider, stock_exchange = nil)
@provider = provider
@stock_exchange = stock_exchange
end
def import
securities = @provider.fetch_tickers(exchange_mic: @stock_exchange)&.tickers
# Deduplicate securities based on ticker and exchange_mic
securities_to_create = securities
.map do |security|
{
name: security[:name],
ticker: security[:symbol],
country_code: security[:country_code],
exchange_mic: security[:exchange_mic],
exchange_acronym: security[:exchange_acronym]
}
end
.compact
.uniq { |security| [ security[:ticker], security[:exchange_mic] ] }
# First update any existing securities that only have a ticker
Security.where(exchange_mic: nil)
.where(ticker: securities_to_create.map { |s| s[:ticker] })
.update_all(
securities_to_create.map do |security|
{
name: security[:name],
country_code: security[:country_code],
exchange_mic: security[:exchange_mic],
exchange_acronym: security[:exchange_acronym]
}
end.first
)
# Then create/update any remaining securities
Security.upsert_all(
securities_to_create,
unique_by: [ :ticker, :exchange_mic ],
update_only: [ :name, :country_code, :exchange_acronym ]
) unless securities_to_create.empty?
end
end

View file

@ -0,0 +1,20 @@
class Security::SynthComboboxOption
include ActiveModel::Model
include Providable
attr_accessor :symbol, :name, :logo_url, :exchange_acronym, :exchange_mic
class << self
def find_in_synth(query)
security_prices_provider.search_securities(query:, dataset: "limited", country_code: Current.family.country).securities.map { |attrs| new(**attrs) }
end
end
def id
"#{symbol}|#{exchange_mic}" # submitted by combobox as value
end
def to_combobox_display
"#{symbol} - #{name} (#{exchange_acronym})" # shown in combobox input when selected
end
end