/* * QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals. * Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using System; using System.Linq; using System.Collections.Generic; using static QuantConnect.StringExtensions; namespace QuantConnect.Data { /// /// Represents the source location and transport medium for a subscription /// public class SubscriptionDataSource : IEquatable { private readonly static IReadOnlyList> _empty = new List>(); /// /// Specifies whether the data source should be sorted. /// If False, data will be returned in the original order, else it will be ordered by time. /// public bool Sort { get; set; } /// /// Identifies where to get the subscription's data from /// public string Source { get; init; } /// /// Identifies the format of the data within the source /// public FileFormat Format { get; init; } /// /// Identifies the transport medium used to access the data, such as a local or remote file, or a polling rest API /// public SubscriptionTransportMedium TransportMedium { get; init; } /// /// Gets the header values to be used in the web request. /// public IReadOnlyList> Headers { get; init; } /// /// Initializes a new instance of the class. /// /// The subscription's data source location public SubscriptionDataSource(string source) : this(source, GetDefaultSubscriptionTransportMedium(source), FileFormat.Csv) { } /// /// Initializes a new instance of the class. /// /// The subscription's data source location /// The transport medium to be used to retrieve the subscription's data from the source public SubscriptionDataSource(string source, SubscriptionTransportMedium transportMedium) : this(source, transportMedium, FileFormat.Csv) { } /// /// Initializes a new instance of the class. /// /// The subscription's data source location /// The transport medium to be used to retrieve the subscription's data from the source /// The format of the data within the source public SubscriptionDataSource(string source, SubscriptionTransportMedium transportMedium, FileFormat format) : this(source, transportMedium, format, null) { } /// /// Initializes a new instance of the class with /// including the specified header values /// /// The subscription's data source location /// The transport medium to be used to retrieve the subscription's data from the source /// The format of the data within the source /// The headers to be used for this source public SubscriptionDataSource(string source, SubscriptionTransportMedium transportMedium, FileFormat format, IEnumerable> headers) { Source = source; Format = format; TransportMedium = transportMedium; Headers = headers?.ToList() ?? _empty; } /// /// Indicates whether the current object is equal to another object of the same type. /// /// /// true if the current object is equal to the parameter; otherwise, false. /// /// An object to compare with this object. public bool Equals(SubscriptionDataSource other) { if (ReferenceEquals(null, other)) return false; if (ReferenceEquals(this, other)) return true; return string.Equals(Source, other.Source) && TransportMedium == other.TransportMedium && Headers.SequenceEqual(other.Headers); } /// /// Determines whether the specified instance is equal to the current instance. /// /// /// true if the specified object is equal to the current object; otherwise, false. /// /// The object to compare with the current object. 2 public override bool Equals(object obj) { if (ReferenceEquals(null, obj)) return false; if (ReferenceEquals(this, obj)) return true; if (obj.GetType() != GetType()) return false; return Equals((SubscriptionDataSource) obj); } /// /// Serves as a hash function for a particular type. /// /// /// A hash code for the current . /// /// 2 public override int GetHashCode() { unchecked { return ((Source != null ? Source.GetHashCode() : 0)*397) ^ (int) TransportMedium; } } /// /// Indicates whether the current object is equal to another object of the same type. /// /// The instance on the left of the operator /// The instance on the right of the operator /// True if the two instances are considered equal, false otherwise public static bool operator ==(SubscriptionDataSource left, SubscriptionDataSource right) { return Equals(left, right); } /// /// Indicates whether the current object is not equal to another object of the same type. /// /// The instance on the left of the operator /// The instance on the right of the operator /// True if the two instances are not considered equal, false otherwise public static bool operator !=(SubscriptionDataSource left, SubscriptionDataSource right) { return !Equals(left, right); } /// /// Returns a string that represents the current object. /// /// /// A string that represents the current object. /// /// 2 public override string ToString() { return Invariant($"{TransportMedium}: {Format} {Source}"); } /// /// Gets the default transport medium for the specified source /// private static SubscriptionTransportMedium GetDefaultSubscriptionTransportMedium(string source) { if (source.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || source.StartsWith("https://", StringComparison.OrdinalIgnoreCase)) { return SubscriptionTransportMedium.RemoteFile; } return SubscriptionTransportMedium.LocalFile; } } }