ig_markets 0.20 → 0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/lib/ig_markets/dealing_platform/account_methods.rb +1 -1
- data/lib/ig_markets/dealing_platform/client_sentiment_methods.rb +1 -1
- data/lib/ig_markets/dealing_platform/market_methods.rb +1 -1
- data/lib/ig_markets/dealing_platform/position_methods.rb +1 -1
- data/lib/ig_markets/dealing_platform/sprint_market_position_methods.rb +1 -1
- data/lib/ig_markets/dealing_platform/streaming_methods.rb +1 -1
- data/lib/ig_markets/dealing_platform/watchlist_methods.rb +1 -1
- data/lib/ig_markets/dealing_platform/working_order_methods.rb +1 -1
- data/lib/ig_markets/errors.rb +49 -1
- data/lib/ig_markets/instrument.rb +3 -1
- data/lib/ig_markets/streaming/account_state.rb +4 -3
- data/lib/ig_markets/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f39c3b7d7b0f7a66c1de890bc6fc9514c97d009f
|
4
|
+
data.tar.gz: 53029d58d12ef0b11863339bd84a5833f3165bee
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dbf8fc12c117a245f89d44d0731c446f9363403763edae0023ac6416f16bad20bb566a12b593b80f8425a6b9b92c48219c5155aff4aee8c0d9cf34e5f0c834c0
|
7
|
+
data.tar.gz: 89abaf288cc72eb6d96039765c09f3eb34912290c6faa3124ec874117c6285755b343586b3f3f389c632a4864306cd2c290ee8af56fb77cfed8e1917efd061ce
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
# IG Markets Changelog
|
2
2
|
|
3
|
+
### 0.21 — September 29, 2016
|
4
|
+
|
5
|
+
- Replaced `IGMarkets::Streaming::AccountState#data_to_process?` with
|
6
|
+
`IGMarkets::Streaming::AccountState#data_queue_empty?`
|
7
|
+
- Fixed circular references in the `IGMarkets::DealingPlatform` subclasses
|
8
|
+
- All documented IG Markets API errors now have a matching `IGMarkets::IGMarketsError` subclass, and any unrecognized
|
9
|
+
error codes returned by the API cause a warning to be written to `stderr`
|
10
|
+
|
3
11
|
### 0.20 — August 20, 2016
|
4
12
|
|
5
13
|
- Added `IGMarkets::DealingPlatform#streaming` which along with new classes in the `IGMarkets::Streaming` module
|
@@ -6,7 +6,7 @@ module IGMarkets
|
|
6
6
|
#
|
7
7
|
# @param [DealingPlatform] dealing_platform The dealing platform.
|
8
8
|
def initialize(dealing_platform)
|
9
|
-
@dealing_platform = dealing_platform
|
9
|
+
@dealing_platform = WeakRef.new dealing_platform
|
10
10
|
end
|
11
11
|
|
12
12
|
# Returns all accounts associated with the current IG Markets login.
|
@@ -6,7 +6,7 @@ module IGMarkets
|
|
6
6
|
#
|
7
7
|
# @param [DealingPlatform] dealing_platform The dealing platform.
|
8
8
|
def initialize(dealing_platform)
|
9
|
-
@dealing_platform = dealing_platform
|
9
|
+
@dealing_platform = WeakRef.new dealing_platform
|
10
10
|
end
|
11
11
|
|
12
12
|
# Returns the client sentiment for a market.
|
@@ -6,7 +6,7 @@ module IGMarkets
|
|
6
6
|
#
|
7
7
|
# @param [DealingPlatform] dealing_platform The dealing platform.
|
8
8
|
def initialize(dealing_platform)
|
9
|
-
@dealing_platform = dealing_platform
|
9
|
+
@dealing_platform = WeakRef.new dealing_platform
|
10
10
|
end
|
11
11
|
|
12
12
|
# Returns details on the market hierarchy directly under the specified node.
|
@@ -6,7 +6,7 @@ module IGMarkets
|
|
6
6
|
#
|
7
7
|
# @param [DealingPlatform] dealing_platform The dealing platform.
|
8
8
|
def initialize(dealing_platform)
|
9
|
-
@dealing_platform = dealing_platform
|
9
|
+
@dealing_platform = WeakRef.new dealing_platform
|
10
10
|
end
|
11
11
|
|
12
12
|
# Returns all sprint market positions.
|
@@ -6,7 +6,7 @@ module IGMarkets
|
|
6
6
|
#
|
7
7
|
# @param [DealingPlatform] dealing_platform The dealing platform.
|
8
8
|
def initialize(dealing_platform)
|
9
|
-
@dealing_platform = dealing_platform
|
9
|
+
@dealing_platform = WeakRef.new dealing_platform
|
10
10
|
@queue = Queue.new
|
11
11
|
@on_error_callbacks = []
|
12
12
|
end
|
data/lib/ig_markets/errors.rb
CHANGED
@@ -89,6 +89,10 @@ module IGMarkets
|
|
89
89
|
class TooManyEPICSError < IGMarketsError
|
90
90
|
end
|
91
91
|
|
92
|
+
# This error is raised when an invalid page size is specified.
|
93
|
+
class InvalidPageSizeError < IGMarketsError
|
94
|
+
end
|
95
|
+
|
92
96
|
# This error is raised when the account has been denied login privileges.
|
93
97
|
class AccountAccessDeniedError < IGMarketsError
|
94
98
|
end
|
@@ -142,6 +146,10 @@ module IGMarkets
|
|
142
146
|
class APIKeyRevokedError < IGMarketsError
|
143
147
|
end
|
144
148
|
|
149
|
+
# This error is raised when a timeout occurs during authentication.
|
150
|
+
class AuthenticationTimeoutError < IGMarketsError
|
151
|
+
end
|
152
|
+
|
145
153
|
# This error is raised when the client has been suspended from using the platform.
|
146
154
|
class ClientSuspendedError < IGMarketsError
|
147
155
|
end
|
@@ -170,6 +178,10 @@ module IGMarkets
|
|
170
178
|
class InvalidWebsiteError < IGMarketsError
|
171
179
|
end
|
172
180
|
|
181
|
+
# This error is raised when an invalid OAuth access token is encountered.
|
182
|
+
class OAuthTokenInvalidError < IGMarketsError
|
183
|
+
end
|
184
|
+
|
173
185
|
# This error is raised when there have been too many failed login attempts.
|
174
186
|
class TooManyFailedLoginAttemptsError < IGMarketsError
|
175
187
|
end
|
@@ -178,6 +190,22 @@ module IGMarkets
|
|
178
190
|
class WatchlistInvalidEPICError < IGMarketsError
|
179
191
|
end
|
180
192
|
|
193
|
+
# This error is raised when the expiry period of the sprint market position is invalid.
|
194
|
+
class SprintMarketPositionInvalidExpiryError < IGMarketsError
|
195
|
+
end
|
196
|
+
|
197
|
+
# This error is raised when an unspecified error occurs trying to create a sprint market position.
|
198
|
+
class SprintMarketPositionCreateError < IGMarketsError
|
199
|
+
end
|
200
|
+
|
201
|
+
# This error is raised when the expiry time of a sprint market falls outside market trading hours.
|
202
|
+
class SprintMarketClosedError < IGMarketsError
|
203
|
+
end
|
204
|
+
|
205
|
+
# This error is raised when a sprint market position's order size is invalid.
|
206
|
+
class SprintMarketInvalidOrderSizeError < IGMarketsError
|
207
|
+
end
|
208
|
+
|
181
209
|
# This error is raised when trying to set the current account to the current account.
|
182
210
|
class AccountAlreadyCurrentError < IGMarketsError
|
183
211
|
end
|
@@ -190,6 +218,10 @@ module IGMarkets
|
|
190
218
|
class InvalidAccountIDError < IGMarketsError
|
191
219
|
end
|
192
220
|
|
221
|
+
# This error is raised when a specified instrument is not found.
|
222
|
+
class InstrumentNotFoundError < IGMarketsError
|
223
|
+
end
|
224
|
+
|
193
225
|
# This error is raised when an unsupported EPIC was specified.
|
194
226
|
class UnsupportedEPICError < IGMarketsError
|
195
227
|
end
|
@@ -246,13 +278,20 @@ module IGMarkets
|
|
246
278
|
#
|
247
279
|
# @param [String] error_code The error code.
|
248
280
|
#
|
249
|
-
# @return [
|
281
|
+
# @return [IGMarketsError]
|
250
282
|
#
|
251
283
|
# @private
|
252
284
|
def self.build(error_code)
|
253
285
|
if API_ERROR_CODE_TO_CLASS.key? error_code
|
254
286
|
API_ERROR_CODE_TO_CLASS[error_code].new ''
|
255
287
|
else
|
288
|
+
@reported_unrecognized_error_codes ||= []
|
289
|
+
|
290
|
+
unless @reported_unrecognized_error_codes.include? error_code
|
291
|
+
@reported_unrecognized_error_codes << error_code
|
292
|
+
warn "ig_markets: unrecognized error code #{error_code}"
|
293
|
+
end
|
294
|
+
|
256
295
|
new error_code
|
257
296
|
end
|
258
297
|
end
|
@@ -280,6 +319,8 @@ module IGMarkets
|
|
280
319
|
'error.public-api.failure.preferred.account.not.set' => Errors::PreferredAccountNotSetError,
|
281
320
|
'error.public-api.failure.stockbroking-not-supported' => Errors::StockbrokingNotSupportedError,
|
282
321
|
'error.public-api.too-many-epics' => Errors::TooManyEPICSError,
|
322
|
+
'error.request.invalid.date-range' => Errors::InvalidDateRangeError,
|
323
|
+
'error.request.invalid.page-size' => Errors::InvalidPageSizeError,
|
283
324
|
'error.security.account-access-denied' => Errors::AccountAccessDeniedError,
|
284
325
|
'error.security.account-migrated' => Errors::AccountMigratedError,
|
285
326
|
'error.security.account-not-yet-activated' => Errors::AccountNotYetActivatedError,
|
@@ -293,6 +334,7 @@ module IGMarkets
|
|
293
334
|
'error.security.api-key-missing' => Errors::APIKeyMissingError,
|
294
335
|
'error.security.api-key-restricted' => Errors::APIKeyRestrictedError,
|
295
336
|
'error.security.api-key-revoked' => Errors::APIKeyRevokedError,
|
337
|
+
'error.security.authentication.timeout' => Errors::AuthenticationTimeoutError,
|
296
338
|
'error.security.client-suspended' => Errors::ClientSuspendedError,
|
297
339
|
'error.security.client-token-invalid' => Errors::ClientTokenInvalidError,
|
298
340
|
'error.security.client-token-missing' => Errors::ClientTokenMissingError,
|
@@ -300,11 +342,17 @@ module IGMarkets
|
|
300
342
|
'error.security.invalid-application' => Errors::InvalidApplicationError,
|
301
343
|
'error.security.invalid-details' => Errors::InvalidCredentialsError,
|
302
344
|
'error.security.invalid-website' => Errors::InvalidWebsiteError,
|
345
|
+
'error.security.oauth-token-invalid' => Errors::OAuthTokenInvalidError,
|
303
346
|
'error.security.too-many-failed-attempts' => Errors::TooManyFailedLoginAttemptsError,
|
304
347
|
'error.service.watchlists.add-instrument.invalid-epic' => Errors::WatchlistInvalidEPICError,
|
348
|
+
'error.sprintmarket.create-position.expiry.outside-valid-range' => Errors::SprintMarketPositionInvalidExpiryError,
|
349
|
+
'error.sprintmarket.create-position.failure' => Errors::SprintMarketPositionCreateError,
|
350
|
+
'error.sprintmarket.create-position.market-closed' => Errors::SprintMarketPositionInvalidExpiryError,
|
351
|
+
'error.sprintmarket.create-position.order-size.invalid' => Errors::SprintMarketInvalidOrderSizeError,
|
305
352
|
'error.switch.accountId-must-be-different' => Errors::AccountAlreadyCurrentError,
|
306
353
|
'error.switch.cannot-set-default-account' => Errors::CannotSetDefaultAccountError,
|
307
354
|
'error.switch.invalid-accountId' => Errors::InvalidAccountIDError,
|
355
|
+
'error.trading.otc.instrument-not-found' => Errors::InstrumentNotFoundError,
|
308
356
|
'error.unsupported.epic' => Errors::UnsupportedEPICError,
|
309
357
|
'error.watchlists.management.cannot-delete-watchlist' => Errors::CannotDeleteWatchlistError,
|
310
358
|
'error.watchlists.management.duplicate-name' => Errors::DuplicateWatchlistNameError,
|
@@ -31,12 +31,14 @@ module IGMarkets
|
|
31
31
|
attribute :open_time
|
32
32
|
|
33
33
|
# This method is used by {DealingPlatform#instantiate_models} to work around a vagary in the IG API where there
|
34
|
-
# is a seemingly unnecessary hash for the :opening_hours value that contains a single
|
34
|
+
# is a seemingly unnecessary hash for the :opening_hours value that contains a single `:market_times` key which is
|
35
35
|
# what holds the actual opening hours data.
|
36
36
|
#
|
37
37
|
# @param [Hash] attributes
|
38
38
|
#
|
39
39
|
# @return [Hash]
|
40
|
+
#
|
41
|
+
# @private
|
40
42
|
def self.adjusted_api_attributes(attributes)
|
41
43
|
attributes.keys == [:market_times] ? attributes[:market_times] : attributes
|
42
44
|
end
|
@@ -51,11 +51,12 @@ module IGMarkets
|
|
51
51
|
update_market_subscriptions
|
52
52
|
end
|
53
53
|
|
54
|
-
# Returns whether there is
|
54
|
+
# Returns whether the data queue is empty. If this returns false then there is data waiting to be processed by a
|
55
|
+
# call to {#process_queued_data}.
|
55
56
|
#
|
56
57
|
# @return [Boolean]
|
57
|
-
def
|
58
|
-
|
58
|
+
def data_queue_empty?
|
59
|
+
@data_queue.empty?
|
59
60
|
end
|
60
61
|
|
61
62
|
# Processes all queued data and updates {#accounts}, {#positions} and {#working_orders} accordingly. If there are
|
data/lib/ig_markets/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ig_markets
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.21'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Richard Viney
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-09-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: colorize
|