oanda_api 0.9.5 → 0.9.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +15 -0
- data/CHANGELOG.md +24 -9
- data/Gemfile +2 -3
- data/README.md +11 -9
- data/lib/oanda_api.rb +1 -0
- data/lib/oanda_api/client/client.rb +13 -7
- data/lib/oanda_api/configuration.rb +57 -24
- data/lib/oanda_api/resource/order.rb +5 -6
- data/lib/oanda_api/resource/transaction.rb +3 -4
- data/lib/oanda_api/resource_collection.rb +4 -2
- data/lib/oanda_api/streaming/request.rb +6 -1
- data/lib/oanda_api/throttling/throttling.rb +105 -0
- data/lib/oanda_api/version.rb +1 -1
- data/oanda_api.gemspec +4 -4
- data/spec/fixtures/vcr_cassettes/accounts_get.yml +7 -5
- data/spec/fixtures/vcr_cassettes/accounts_id_get.yml +18 -14
- data/spec/fixtures/vcr_cassettes/calendar_events_period_get.yml +20 -14
- data/spec/fixtures/vcr_cassettes/calendar_instrument_and_period_get.yml +24 -21
- data/spec/fixtures/vcr_cassettes/calendar_period_get.yml +20 -14
- data/spec/fixtures/vcr_cassettes/candles_options_get.yml +12 -10
- data/spec/fixtures/vcr_cassettes/client_helper_accounts.yml +48 -5
- data/spec/fixtures/vcr_cassettes/instrument_EUR_USD.yml +11 -9
- data/spec/fixtures/vcr_cassettes/instrument_USD_JPY.yml +10 -8
- data/spec/fixtures/vcr_cassettes/instruments_get.yml +25 -19
- data/spec/fixtures/vcr_cassettes/instruments_options_get.yml +8 -6
- data/spec/fixtures/vcr_cassettes/order_id_close.yml +159 -313
- data/spec/fixtures/vcr_cassettes/order_id_get.yml +103 -21
- data/spec/fixtures/vcr_cassettes/order_options_create.yml +9 -7
- data/spec/fixtures/vcr_cassettes/order_options_update.yml +62 -20
- data/spec/fixtures/vcr_cassettes/orders_get.yml +46 -137
- data/spec/fixtures/vcr_cassettes/orders_options_get.yml +29 -50
- data/spec/fixtures/vcr_cassettes/positions_get.yml +19 -15
- data/spec/fixtures/vcr_cassettes/positions_instrument_close.yml +35 -27
- data/spec/fixtures/vcr_cassettes/positions_instrument_get.yml +17 -13
- data/spec/fixtures/vcr_cassettes/prices_options_get.yml +12 -10
- data/spec/fixtures/vcr_cassettes/spread_history_get.yml +17 -13
- data/spec/fixtures/vcr_cassettes/spreads_get.yml +17 -13
- data/spec/fixtures/vcr_cassettes/trade_id_close.yml +115 -52
- data/spec/fixtures/vcr_cassettes/trade_id_get.yml +278 -16
- data/spec/fixtures/vcr_cassettes/trade_options_modify.yml +58 -16
- data/spec/fixtures/vcr_cassettes/trades_filter_get.yml +44 -19
- data/spec/fixtures/vcr_cassettes/trades_get.yml +55 -16
- data/spec/fixtures/vcr_cassettes/transaction_id_get.yml +271 -149
- data/spec/fixtures/vcr_cassettes/transactions_options_get.yml +258 -133
- data/spec/fixtures/vcr_cassettes/with_throttling_and_max_requests_per_second.yml +28 -22
- data/spec/fixtures/vcr_cassettes/with_throttling_new_connections.yml +443 -0
- data/spec/fixtures/vcr_cassettes/with_throttling_with_multiple_threads.yml +57 -45
- data/spec/fixtures/vcr_cassettes/without_throttling.yml +91 -71
- data/spec/oanda_api/configuration_spec.rb +31 -0
- data/spec/oanda_api/examples/request_throttling_spec.rb +39 -4
- data/spec/oanda_api/examples/spread_history_spec.rb +3 -3
- data/spec/oanda_api/resource_collection_spec.rb +9 -0
- data/spec/oanda_api/streaming/client_spec.rb +5 -5
- data/spec/oanda_api/streaming/request_spec.rb +23 -8
- data/spec/spec_helper.rb +0 -3
- data/spec/support/client_helper.rb +6 -2
- metadata +13 -12
- data/spec/fixtures/vcr_cassettes/client_helper_account.yml +0 -45
@@ -14,16 +14,16 @@ http_interactions:
|
|
14
14
|
Connection:
|
15
15
|
- keep-alive
|
16
16
|
Keep-Alive:
|
17
|
-
- 30
|
17
|
+
- '30'
|
18
18
|
response:
|
19
19
|
status:
|
20
20
|
code: 200
|
21
21
|
message: OK
|
22
22
|
headers:
|
23
23
|
Server:
|
24
|
-
- openresty/1.
|
24
|
+
- openresty/1.9.15.1
|
25
25
|
Date:
|
26
|
-
- Mon,
|
26
|
+
- Mon, 08 Jan 2018 18:26:34 GMT
|
27
27
|
Content-Type:
|
28
28
|
- application/json
|
29
29
|
Content-Length:
|
@@ -31,14 +31,16 @@ http_interactions:
|
|
31
31
|
Connection:
|
32
32
|
- keep-alive
|
33
33
|
Etag:
|
34
|
-
- '"
|
34
|
+
- '"f31dec3261edd9030df81dc0ba69fe5a9d4e2fc9"'
|
35
|
+
Access-Control-Allow-Origin:
|
36
|
+
- "*"
|
35
37
|
body:
|
36
38
|
encoding: UTF-8
|
37
39
|
string: "{\n\t\"prices\" : [\n\t\t{\n\t\t\t\"instrument\" : \"EUR_USD\",\n\t\t\t\"time\"
|
38
|
-
: \"
|
39
|
-
: 1.
|
40
|
+
: \"2018-01-08T18:26:31.344805Z\",\n\t\t\t\"bid\" : 1.19674,\n\t\t\t\"ask\"
|
41
|
+
: 1.19686\n\t\t}\n\t]\n}"
|
40
42
|
http_version:
|
41
|
-
recorded_at: Mon,
|
43
|
+
recorded_at: Mon, 08 Jan 2018 18:26:45 GMT
|
42
44
|
- request:
|
43
45
|
method: get
|
44
46
|
uri: https://api-fxpractice.oanda.com/v1/prices?instruments=EUR_USD
|
@@ -53,16 +55,16 @@ http_interactions:
|
|
53
55
|
Connection:
|
54
56
|
- keep-alive
|
55
57
|
Keep-Alive:
|
56
|
-
- 30
|
58
|
+
- '30'
|
57
59
|
response:
|
58
60
|
status:
|
59
61
|
code: 200
|
60
62
|
message: OK
|
61
63
|
headers:
|
62
64
|
Server:
|
63
|
-
- openresty/1.
|
65
|
+
- openresty/1.9.15.1
|
64
66
|
Date:
|
65
|
-
- Mon,
|
67
|
+
- Mon, 08 Jan 2018 18:26:34 GMT
|
66
68
|
Content-Type:
|
67
69
|
- application/json
|
68
70
|
Content-Length:
|
@@ -70,14 +72,16 @@ http_interactions:
|
|
70
72
|
Connection:
|
71
73
|
- keep-alive
|
72
74
|
Etag:
|
73
|
-
- '"
|
75
|
+
- '"f31dec3261edd9030df81dc0ba69fe5a9d4e2fc9"'
|
76
|
+
Access-Control-Allow-Origin:
|
77
|
+
- "*"
|
74
78
|
body:
|
75
79
|
encoding: UTF-8
|
76
80
|
string: "{\n\t\"prices\" : [\n\t\t{\n\t\t\t\"instrument\" : \"EUR_USD\",\n\t\t\t\"time\"
|
77
|
-
: \"
|
78
|
-
: 1.
|
81
|
+
: \"2018-01-08T18:26:31.344805Z\",\n\t\t\t\"bid\" : 1.19674,\n\t\t\t\"ask\"
|
82
|
+
: 1.19686\n\t\t}\n\t]\n}"
|
79
83
|
http_version:
|
80
|
-
recorded_at: Mon,
|
84
|
+
recorded_at: Mon, 08 Jan 2018 18:26:45 GMT
|
81
85
|
- request:
|
82
86
|
method: get
|
83
87
|
uri: https://api-fxpractice.oanda.com/v1/prices?instruments=EUR_USD
|
@@ -92,16 +96,16 @@ http_interactions:
|
|
92
96
|
Connection:
|
93
97
|
- keep-alive
|
94
98
|
Keep-Alive:
|
95
|
-
- 30
|
99
|
+
- '30'
|
96
100
|
response:
|
97
101
|
status:
|
98
102
|
code: 200
|
99
103
|
message: OK
|
100
104
|
headers:
|
101
105
|
Server:
|
102
|
-
- openresty/1.
|
106
|
+
- openresty/1.9.15.1
|
103
107
|
Date:
|
104
|
-
- Mon,
|
108
|
+
- Mon, 08 Jan 2018 18:26:34 GMT
|
105
109
|
Content-Type:
|
106
110
|
- application/json
|
107
111
|
Content-Length:
|
@@ -109,14 +113,16 @@ http_interactions:
|
|
109
113
|
Connection:
|
110
114
|
- keep-alive
|
111
115
|
Etag:
|
112
|
-
- '"
|
116
|
+
- '"f31dec3261edd9030df81dc0ba69fe5a9d4e2fc9"'
|
117
|
+
Access-Control-Allow-Origin:
|
118
|
+
- "*"
|
113
119
|
body:
|
114
120
|
encoding: UTF-8
|
115
121
|
string: "{\n\t\"prices\" : [\n\t\t{\n\t\t\t\"instrument\" : \"EUR_USD\",\n\t\t\t\"time\"
|
116
|
-
: \"
|
117
|
-
: 1.
|
122
|
+
: \"2018-01-08T18:26:31.344805Z\",\n\t\t\t\"bid\" : 1.19674,\n\t\t\t\"ask\"
|
123
|
+
: 1.19686\n\t\t}\n\t]\n}"
|
118
124
|
http_version:
|
119
|
-
recorded_at: Mon,
|
125
|
+
recorded_at: Mon, 08 Jan 2018 18:26:45 GMT
|
120
126
|
- request:
|
121
127
|
method: get
|
122
128
|
uri: https://api-fxpractice.oanda.com/v1/prices?instruments=EUR_USD
|
@@ -131,16 +137,16 @@ http_interactions:
|
|
131
137
|
Connection:
|
132
138
|
- keep-alive
|
133
139
|
Keep-Alive:
|
134
|
-
- 30
|
140
|
+
- '30'
|
135
141
|
response:
|
136
142
|
status:
|
137
143
|
code: 200
|
138
144
|
message: OK
|
139
145
|
headers:
|
140
146
|
Server:
|
141
|
-
- openresty/1.
|
147
|
+
- openresty/1.9.15.1
|
142
148
|
Date:
|
143
|
-
- Mon,
|
149
|
+
- Mon, 08 Jan 2018 18:26:34 GMT
|
144
150
|
Content-Type:
|
145
151
|
- application/json
|
146
152
|
Content-Length:
|
@@ -148,14 +154,16 @@ http_interactions:
|
|
148
154
|
Connection:
|
149
155
|
- keep-alive
|
150
156
|
Etag:
|
151
|
-
- '"
|
157
|
+
- '"f31dec3261edd9030df81dc0ba69fe5a9d4e2fc9"'
|
158
|
+
Access-Control-Allow-Origin:
|
159
|
+
- "*"
|
152
160
|
body:
|
153
161
|
encoding: UTF-8
|
154
162
|
string: "{\n\t\"prices\" : [\n\t\t{\n\t\t\t\"instrument\" : \"EUR_USD\",\n\t\t\t\"time\"
|
155
|
-
: \"
|
156
|
-
: 1.
|
163
|
+
: \"2018-01-08T18:26:31.344805Z\",\n\t\t\t\"bid\" : 1.19674,\n\t\t\t\"ask\"
|
164
|
+
: 1.19686\n\t\t}\n\t]\n}"
|
157
165
|
http_version:
|
158
|
-
recorded_at: Mon,
|
166
|
+
recorded_at: Mon, 08 Jan 2018 18:26:45 GMT
|
159
167
|
- request:
|
160
168
|
method: get
|
161
169
|
uri: https://api-fxpractice.oanda.com/v1/prices?instruments=EUR_USD
|
@@ -170,16 +178,16 @@ http_interactions:
|
|
170
178
|
Connection:
|
171
179
|
- keep-alive
|
172
180
|
Keep-Alive:
|
173
|
-
- 30
|
181
|
+
- '30'
|
174
182
|
response:
|
175
183
|
status:
|
176
184
|
code: 200
|
177
185
|
message: OK
|
178
186
|
headers:
|
179
187
|
Server:
|
180
|
-
- openresty/1.
|
188
|
+
- openresty/1.9.15.1
|
181
189
|
Date:
|
182
|
-
- Mon,
|
190
|
+
- Mon, 08 Jan 2018 18:26:34 GMT
|
183
191
|
Content-Type:
|
184
192
|
- application/json
|
185
193
|
Content-Length:
|
@@ -187,14 +195,16 @@ http_interactions:
|
|
187
195
|
Connection:
|
188
196
|
- keep-alive
|
189
197
|
Etag:
|
190
|
-
- '"
|
198
|
+
- '"f31dec3261edd9030df81dc0ba69fe5a9d4e2fc9"'
|
199
|
+
Access-Control-Allow-Origin:
|
200
|
+
- "*"
|
191
201
|
body:
|
192
202
|
encoding: UTF-8
|
193
203
|
string: "{\n\t\"prices\" : [\n\t\t{\n\t\t\t\"instrument\" : \"EUR_USD\",\n\t\t\t\"time\"
|
194
|
-
: \"
|
195
|
-
: 1.
|
204
|
+
: \"2018-01-08T18:26:31.344805Z\",\n\t\t\t\"bid\" : 1.19674,\n\t\t\t\"ask\"
|
205
|
+
: 1.19686\n\t\t}\n\t]\n}"
|
196
206
|
http_version:
|
197
|
-
recorded_at: Mon,
|
207
|
+
recorded_at: Mon, 08 Jan 2018 18:26:45 GMT
|
198
208
|
- request:
|
199
209
|
method: get
|
200
210
|
uri: https://api-fxpractice.oanda.com/v1/prices?instruments=EUR_USD
|
@@ -209,16 +219,16 @@ http_interactions:
|
|
209
219
|
Connection:
|
210
220
|
- keep-alive
|
211
221
|
Keep-Alive:
|
212
|
-
- 30
|
222
|
+
- '30'
|
213
223
|
response:
|
214
224
|
status:
|
215
225
|
code: 200
|
216
226
|
message: OK
|
217
227
|
headers:
|
218
228
|
Server:
|
219
|
-
- openresty/1.
|
229
|
+
- openresty/1.9.15.1
|
220
230
|
Date:
|
221
|
-
- Mon,
|
231
|
+
- Mon, 08 Jan 2018 18:26:34 GMT
|
222
232
|
Content-Type:
|
223
233
|
- application/json
|
224
234
|
Content-Length:
|
@@ -226,14 +236,16 @@ http_interactions:
|
|
226
236
|
Connection:
|
227
237
|
- keep-alive
|
228
238
|
Etag:
|
229
|
-
- '"
|
239
|
+
- '"f31dec3261edd9030df81dc0ba69fe5a9d4e2fc9"'
|
240
|
+
Access-Control-Allow-Origin:
|
241
|
+
- "*"
|
230
242
|
body:
|
231
243
|
encoding: UTF-8
|
232
244
|
string: "{\n\t\"prices\" : [\n\t\t{\n\t\t\t\"instrument\" : \"EUR_USD\",\n\t\t\t\"time\"
|
233
|
-
: \"
|
234
|
-
: 1.
|
245
|
+
: \"2018-01-08T18:26:31.344805Z\",\n\t\t\t\"bid\" : 1.19674,\n\t\t\t\"ask\"
|
246
|
+
: 1.19686\n\t\t}\n\t]\n}"
|
235
247
|
http_version:
|
236
|
-
recorded_at: Mon,
|
248
|
+
recorded_at: Mon, 08 Jan 2018 18:26:45 GMT
|
237
249
|
- request:
|
238
250
|
method: get
|
239
251
|
uri: https://api-fxpractice.oanda.com/v1/prices?instruments=EUR_USD
|
@@ -248,16 +260,16 @@ http_interactions:
|
|
248
260
|
Connection:
|
249
261
|
- keep-alive
|
250
262
|
Keep-Alive:
|
251
|
-
- 30
|
263
|
+
- '30'
|
252
264
|
response:
|
253
265
|
status:
|
254
266
|
code: 200
|
255
267
|
message: OK
|
256
268
|
headers:
|
257
269
|
Server:
|
258
|
-
- openresty/1.
|
270
|
+
- openresty/1.9.15.1
|
259
271
|
Date:
|
260
|
-
- Mon,
|
272
|
+
- Mon, 08 Jan 2018 18:26:34 GMT
|
261
273
|
Content-Type:
|
262
274
|
- application/json
|
263
275
|
Content-Length:
|
@@ -265,14 +277,16 @@ http_interactions:
|
|
265
277
|
Connection:
|
266
278
|
- keep-alive
|
267
279
|
Etag:
|
268
|
-
- '"
|
280
|
+
- '"f31dec3261edd9030df81dc0ba69fe5a9d4e2fc9"'
|
281
|
+
Access-Control-Allow-Origin:
|
282
|
+
- "*"
|
269
283
|
body:
|
270
284
|
encoding: UTF-8
|
271
285
|
string: "{\n\t\"prices\" : [\n\t\t{\n\t\t\t\"instrument\" : \"EUR_USD\",\n\t\t\t\"time\"
|
272
|
-
: \"
|
273
|
-
: 1.
|
286
|
+
: \"2018-01-08T18:26:31.344805Z\",\n\t\t\t\"bid\" : 1.19674,\n\t\t\t\"ask\"
|
287
|
+
: 1.19686\n\t\t}\n\t]\n}"
|
274
288
|
http_version:
|
275
|
-
recorded_at: Mon,
|
289
|
+
recorded_at: Mon, 08 Jan 2018 18:26:45 GMT
|
276
290
|
- request:
|
277
291
|
method: get
|
278
292
|
uri: https://api-fxpractice.oanda.com/v1/prices?instruments=EUR_USD
|
@@ -287,16 +301,16 @@ http_interactions:
|
|
287
301
|
Connection:
|
288
302
|
- keep-alive
|
289
303
|
Keep-Alive:
|
290
|
-
- 30
|
304
|
+
- '30'
|
291
305
|
response:
|
292
306
|
status:
|
293
307
|
code: 200
|
294
308
|
message: OK
|
295
309
|
headers:
|
296
310
|
Server:
|
297
|
-
- openresty/1.
|
311
|
+
- openresty/1.9.15.1
|
298
312
|
Date:
|
299
|
-
- Mon,
|
313
|
+
- Mon, 08 Jan 2018 18:26:34 GMT
|
300
314
|
Content-Type:
|
301
315
|
- application/json
|
302
316
|
Content-Length:
|
@@ -304,14 +318,16 @@ http_interactions:
|
|
304
318
|
Connection:
|
305
319
|
- keep-alive
|
306
320
|
Etag:
|
307
|
-
- '"
|
321
|
+
- '"f31dec3261edd9030df81dc0ba69fe5a9d4e2fc9"'
|
322
|
+
Access-Control-Allow-Origin:
|
323
|
+
- "*"
|
308
324
|
body:
|
309
325
|
encoding: UTF-8
|
310
326
|
string: "{\n\t\"prices\" : [\n\t\t{\n\t\t\t\"instrument\" : \"EUR_USD\",\n\t\t\t\"time\"
|
311
|
-
: \"
|
312
|
-
: 1.
|
327
|
+
: \"2018-01-08T18:26:31.344805Z\",\n\t\t\t\"bid\" : 1.19674,\n\t\t\t\"ask\"
|
328
|
+
: 1.19686\n\t\t}\n\t]\n}"
|
313
329
|
http_version:
|
314
|
-
recorded_at: Mon,
|
330
|
+
recorded_at: Mon, 08 Jan 2018 18:26:45 GMT
|
315
331
|
- request:
|
316
332
|
method: get
|
317
333
|
uri: https://api-fxpractice.oanda.com/v1/prices?instruments=EUR_USD
|
@@ -326,16 +342,16 @@ http_interactions:
|
|
326
342
|
Connection:
|
327
343
|
- keep-alive
|
328
344
|
Keep-Alive:
|
329
|
-
- 30
|
345
|
+
- '30'
|
330
346
|
response:
|
331
347
|
status:
|
332
348
|
code: 200
|
333
349
|
message: OK
|
334
350
|
headers:
|
335
351
|
Server:
|
336
|
-
- openresty/1.
|
352
|
+
- openresty/1.9.15.1
|
337
353
|
Date:
|
338
|
-
- Mon,
|
354
|
+
- Mon, 08 Jan 2018 18:26:34 GMT
|
339
355
|
Content-Type:
|
340
356
|
- application/json
|
341
357
|
Content-Length:
|
@@ -343,14 +359,16 @@ http_interactions:
|
|
343
359
|
Connection:
|
344
360
|
- keep-alive
|
345
361
|
Etag:
|
346
|
-
- '"
|
362
|
+
- '"f31dec3261edd9030df81dc0ba69fe5a9d4e2fc9"'
|
363
|
+
Access-Control-Allow-Origin:
|
364
|
+
- "*"
|
347
365
|
body:
|
348
366
|
encoding: UTF-8
|
349
367
|
string: "{\n\t\"prices\" : [\n\t\t{\n\t\t\t\"instrument\" : \"EUR_USD\",\n\t\t\t\"time\"
|
350
|
-
: \"
|
351
|
-
: 1.
|
368
|
+
: \"2018-01-08T18:26:31.344805Z\",\n\t\t\t\"bid\" : 1.19674,\n\t\t\t\"ask\"
|
369
|
+
: 1.19686\n\t\t}\n\t]\n}"
|
352
370
|
http_version:
|
353
|
-
recorded_at: Mon,
|
371
|
+
recorded_at: Mon, 08 Jan 2018 18:26:45 GMT
|
354
372
|
- request:
|
355
373
|
method: get
|
356
374
|
uri: https://api-fxpractice.oanda.com/v1/prices?instruments=EUR_USD
|
@@ -365,16 +383,16 @@ http_interactions:
|
|
365
383
|
Connection:
|
366
384
|
- keep-alive
|
367
385
|
Keep-Alive:
|
368
|
-
- 30
|
386
|
+
- '30'
|
369
387
|
response:
|
370
388
|
status:
|
371
389
|
code: 200
|
372
390
|
message: OK
|
373
391
|
headers:
|
374
392
|
Server:
|
375
|
-
- openresty/1.
|
393
|
+
- openresty/1.9.15.1
|
376
394
|
Date:
|
377
|
-
- Mon,
|
395
|
+
- Mon, 08 Jan 2018 18:26:35 GMT
|
378
396
|
Content-Type:
|
379
397
|
- application/json
|
380
398
|
Content-Length:
|
@@ -382,12 +400,14 @@ http_interactions:
|
|
382
400
|
Connection:
|
383
401
|
- keep-alive
|
384
402
|
Etag:
|
385
|
-
- '"
|
403
|
+
- '"f31dec3261edd9030df81dc0ba69fe5a9d4e2fc9"'
|
404
|
+
Access-Control-Allow-Origin:
|
405
|
+
- "*"
|
386
406
|
body:
|
387
407
|
encoding: UTF-8
|
388
408
|
string: "{\n\t\"prices\" : [\n\t\t{\n\t\t\t\"instrument\" : \"EUR_USD\",\n\t\t\t\"time\"
|
389
|
-
: \"
|
390
|
-
: 1.
|
409
|
+
: \"2018-01-08T18:26:31.344805Z\",\n\t\t\t\"bid\" : 1.19674,\n\t\t\t\"ask\"
|
410
|
+
: 1.19686\n\t\t}\n\t]\n}"
|
391
411
|
http_version:
|
392
|
-
recorded_at: Mon,
|
393
|
-
recorded_with: VCR
|
412
|
+
recorded_at: Mon, 08 Jan 2018 18:26:45 GMT
|
413
|
+
recorded_with: VCR 4.0.0
|
@@ -72,6 +72,7 @@ describe "OandaAPI::Configuration" do
|
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
75
|
+
#---
|
75
76
|
describe "#max_requests_per_second" do
|
76
77
|
it "returns the default max requests per second" do
|
77
78
|
expect(config.max_requests_per_second).to eq OandaAPI::Configuration::MAX_REQUESTS_PER_SECOND
|
@@ -101,6 +102,36 @@ describe "OandaAPI::Configuration" do
|
|
101
102
|
expect(config.min_request_interval).to eq(0.5)
|
102
103
|
end
|
103
104
|
end
|
105
|
+
|
106
|
+
describe "#max_new_connections_per_second" do
|
107
|
+
it "returns the default max new connections per second" do
|
108
|
+
expect(config.max_new_connections_per_second).to eq OandaAPI::Configuration::MAX_NEW_CONNECTIONS_PER_SECOND
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
describe "#max_new_connections_per_second=" do
|
113
|
+
it "overrides the default max new connections per second" do
|
114
|
+
config.max_new_connections_per_second = 5
|
115
|
+
expect(config.max_new_connections_per_second).to eq 5
|
116
|
+
end
|
117
|
+
|
118
|
+
it "must be numeric" do
|
119
|
+
expect { config.max_new_connections_per_second = "X" }.to raise_error(ArgumentError)
|
120
|
+
end
|
121
|
+
|
122
|
+
it "must be > 0" do
|
123
|
+
[-10, 0].each do |val|
|
124
|
+
expect { config.max_new_connections_per_second = val }.to raise_error(ArgumentError)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
describe "#min_new_connection_interval" do
|
130
|
+
it "is the inverse of #max_new_connections_per_second" do
|
131
|
+
config.max_new_connections_per_second = 2
|
132
|
+
expect(config.min_new_connection_interval).to eq(0.5)
|
133
|
+
end
|
134
|
+
end
|
104
135
|
|
105
136
|
describe "#open_timeout" do
|
106
137
|
it "returns the default open timeout" do
|
@@ -5,11 +5,13 @@ describe "OandaAPI::Client" do
|
|
5
5
|
let(:client) { ClientHelper.client }
|
6
6
|
|
7
7
|
around do |example|
|
8
|
-
reset_configuration(:use_request_throttling,
|
8
|
+
reset_configuration(:use_request_throttling,
|
9
|
+
:max_requests_per_second,
|
10
|
+
:max_new_connections_per_second) { example.call }
|
9
11
|
end
|
10
12
|
|
11
13
|
context "when NOT using request throttling" do
|
12
|
-
it "
|
14
|
+
it "does NOT limit the request rate of multiple sequential requests", :vcr do
|
13
15
|
OandaAPI.configuration.use_request_throttling = false
|
14
16
|
VCR.use_cassette("without_throttling") do
|
15
17
|
start_time = Time.now
|
@@ -24,11 +26,44 @@ describe "OandaAPI::Client" do
|
|
24
26
|
expect(Time.now - start_time).to be > 0.0 && be < 1.0
|
25
27
|
end
|
26
28
|
end
|
29
|
+
|
30
|
+
#
|
31
|
+
# 08 Jan, 2018 - it seems connection rate limiting is not enforced consistently by Oanda
|
32
|
+
# so, removing this test for now.
|
33
|
+
#
|
34
|
+
# it "does NOT limit the rate of NEW connections", :vcr do
|
35
|
+
# OandaAPI.configuration.use_request_throttling = false
|
36
|
+
# VCR.use_cassette("without_throttling_new_connections") do
|
37
|
+
# message = ""
|
38
|
+
# begin
|
39
|
+
# 1.upto(10) do
|
40
|
+
# client = ClientHelper.client force_new: true
|
41
|
+
# client.prices(instruments: "EUR_USD").get
|
42
|
+
# end
|
43
|
+
# rescue OandaAPI::RequestError => e
|
44
|
+
# message = e.message
|
45
|
+
# end
|
46
|
+
# expect(message).to match(/Rate limit violation of newly established connections/)
|
47
|
+
# end
|
48
|
+
# end
|
27
49
|
end
|
28
50
|
|
29
51
|
context "when using request throttling" do
|
52
|
+
it "limits the rate of NEW connections", :vcr do
|
53
|
+
OandaAPI.configuration.use_request_throttling = true
|
54
|
+
VCR.use_cassette("with_throttling_new_connections") do
|
55
|
+
successful_connections = 0
|
56
|
+
1.upto(10) do
|
57
|
+
client = ClientHelper.client force_new: true
|
58
|
+
client.accounts.get
|
59
|
+
successful_connections += 1
|
60
|
+
end
|
61
|
+
expect(successful_connections).to eq 10
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
30
65
|
context "with a positive value set for max_requests_per_second" do
|
31
|
-
it "
|
66
|
+
it "limits multiple sequential requests to the rate specified in the requests_per_second setting " do
|
32
67
|
OandaAPI.configuration.use_request_throttling = true
|
33
68
|
OandaAPI.configuration.max_requests_per_second = 2
|
34
69
|
|
@@ -47,7 +82,7 @@ describe "OandaAPI::Client" do
|
|
47
82
|
end
|
48
83
|
|
49
84
|
context "when multiple threads make synchronized requests to the same client instance" do
|
50
|
-
it "
|
85
|
+
it "throttles the combined requests made by all threads" do
|
51
86
|
OandaAPI.configuration.use_request_throttling = true
|
52
87
|
OandaAPI.configuration.max_requests_per_second = 3
|
53
88
|
|