ig_markets 0.13 → 0.14
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 +7 -1
- data/README.md +22 -18
- data/lib/ig_markets.rb +1 -0
- data/lib/ig_markets/account.rb +5 -0
- data/lib/ig_markets/activity.rb +1 -1
- data/lib/ig_markets/cli/commands/orders_command.rb +12 -0
- data/lib/ig_markets/cli/commands/watchlists_command.rb +7 -5
- data/lib/ig_markets/cli/tables/activities_table.rb +0 -3
- data/lib/ig_markets/client_sentiment.rb +5 -0
- data/lib/ig_markets/dealing_platform/position_methods.rb +11 -13
- data/lib/ig_markets/dealing_platform/working_order_methods.rb +10 -13
- data/lib/ig_markets/market.rb +5 -0
- data/lib/ig_markets/model.rb +9 -0
- data/lib/ig_markets/payload_formatter.rb +3 -2
- data/lib/ig_markets/position.rb +5 -0
- data/lib/ig_markets/version.rb +1 -1
- data/lib/ig_markets/working_order.rb +5 -0
- metadata +32 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4a9c0f861710bf880c830d2826c3e4ece9c2ef35
|
4
|
+
data.tar.gz: 4c2f4dbd5d336489e2a343ac0015ff34c0910e2b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fa7dc0e4c01816d95e5b6dfec934c3a52e66b9b82ed27f5b777c19a89fa7bda5915b8f9bdba02ae6a3b8b42c251622ffa91c2c1a41e6c032ca4ae7300b611ca8
|
7
|
+
data.tar.gz: 9ca3b4fe730001d4ed3d8900ec5483e3a10e386e9b772f4057e0696b9c3f8019889318faf6abda047735046dade967bcaf537a1a157b95e90e5eb751928feb23
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
# IG Markets Changelog
|
2
2
|
|
3
|
-
### 0.
|
3
|
+
### 0.14 — July 2, 2016
|
4
|
+
|
5
|
+
- Added `delete-all` subcommand to `ig_markets orders`
|
6
|
+
- Added a `#reload` method that reloads a model's attributes in-place to `IGMarkets::Account`,
|
7
|
+
`IGMarkets::ClientSentiment`, `IGMarkets::Market`, `IGMarkets::Position` and `IGMarkets::WorkingOrder`
|
8
|
+
|
9
|
+
### 0.13 — June 22, 2016
|
4
10
|
|
5
11
|
- Added `ig_markets performance` command that summarizes an account's dealing performance over a specified period
|
6
12
|
- Added `ig_markets markets` command which prints the current state of all the passed EPICs
|
data/README.md
CHANGED
@@ -76,6 +76,7 @@ commands and their subcommands is:
|
|
76
76
|
- `ig_markets orders create ...`
|
77
77
|
- `ig_markets orders update DEAL-ID ...`
|
78
78
|
- `ig_markets orders delete DEAL-ID`
|
79
|
+
- `ig_markets orders delete-all`
|
79
80
|
- `ig_markets performance --days N [...]`
|
80
81
|
- `ig_markets positions [list] [...]`
|
81
82
|
- `ig_markets positions create ...`
|
@@ -173,45 +174,48 @@ ig.deal_confirmation 'deal_reference'
|
|
173
174
|
# Positions
|
174
175
|
ig.positions.all
|
175
176
|
ig.positions.create currency_code: 'USD', direction: :buy, epic: 'CS.D.EURUSD.CFD.IP', size: 2
|
176
|
-
ig.positions['deal_id']
|
177
|
-
|
178
|
-
|
179
|
-
|
177
|
+
position = ig.positions['deal_id']
|
178
|
+
position.profit_loss
|
179
|
+
position.update limit_level: 1.2, stop_level: 1.1
|
180
|
+
position.reload
|
181
|
+
position.close
|
180
182
|
|
181
183
|
# Sprint market positions
|
182
184
|
ig.sprint_market_positions.all
|
183
|
-
ig.sprint_market_positions['deal_id']
|
184
185
|
ig.sprint_market_positions.create direction: :buy, epic: 'FM.D.EURUSD24.EURUSD24.IP',
|
185
186
|
expiry_period: :twenty_minutes, size: 100
|
187
|
+
sprint_market_position = ig.sprint_market_positions['deal_id']
|
186
188
|
|
187
189
|
# Working orders
|
188
190
|
ig.working_orders.all
|
189
191
|
ig.working_orders.create currency_code: 'USD', direction: :buy, epic: 'CS.D.EURUSD.CFD.IP',
|
190
192
|
level: 0.99, size: 1, type: :limit
|
191
|
-
ig.working_orders['deal_id']
|
192
|
-
|
193
|
-
|
193
|
+
working_order = ig.working_orders['deal_id']
|
194
|
+
working_order.update level: 1.25, limit_distance: 50, stop_distance: 50
|
195
|
+
working_order.reload
|
196
|
+
working_order.delete
|
194
197
|
|
195
198
|
# Markets
|
196
199
|
ig.markets.hierarchy
|
197
200
|
ig.markets.search 'EURUSD'
|
198
201
|
ig.markets.find 'CS.D.EURUSD.CFD.IP', 'IX.D.DOW.IFD.IP'
|
199
|
-
ig.markets['CS.D.EURUSD.CFD.IP']
|
200
|
-
|
201
|
-
|
202
|
+
market = ig.markets['CS.D.EURUSD.CFD.IP']
|
203
|
+
market.historical_prices resolution: :hour, number: 48
|
204
|
+
market.historical_prices resolution: :second, from: Time.now - 120, to: Time.now - 60
|
202
205
|
|
203
206
|
# Watchlists
|
204
207
|
ig.watchlists.all
|
205
208
|
ig.watchlists.create 'New Watchlist', 'CS.D.EURUSD.CFD.IP', 'UA.D.AAPL.CASH.IP'
|
206
|
-
ig.watchlists['watchlist_id']
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
209
|
+
watchlist = ig.watchlists['watchlist_id']
|
210
|
+
watchlist.markets
|
211
|
+
watchlist.add_market 'CS.D.EURUSD.CFD.IP'
|
212
|
+
watchlist.remove_market 'CS.D.EURUSD.CFD.IP'
|
213
|
+
watchlist.delete
|
211
214
|
|
212
215
|
# Client sentiment
|
213
|
-
ig.client_sentiment['EURUSD']
|
214
|
-
|
216
|
+
client_sentiment = ig.client_sentiment['EURUSD']
|
217
|
+
client_sentiment.related_sentiments
|
218
|
+
client_sentiment.reload
|
215
219
|
|
216
220
|
# Miscellaneous
|
217
221
|
ig.applications
|
data/lib/ig_markets.rb
CHANGED
data/lib/ig_markets/account.rb
CHANGED
@@ -19,5 +19,10 @@ module IGMarkets
|
|
19
19
|
attribute :currency, String, regex: Regex::CURRENCY
|
20
20
|
attribute :preferred, Boolean
|
21
21
|
attribute :status, Symbol, allowed_values: [:disabled, :enabled, :suspended_from_dealing]
|
22
|
+
|
23
|
+
# Reloads this account's attributes by re-querying the IG Markets API.
|
24
|
+
def reload
|
25
|
+
self.attributes = @dealing_platform.account.all.detect { |a| a.account_id == account_id }.attributes
|
26
|
+
end
|
22
27
|
end
|
23
28
|
end
|
data/lib/ig_markets/activity.rb
CHANGED
@@ -8,7 +8,7 @@ module IGMarkets
|
|
8
8
|
class Action < Model
|
9
9
|
attribute :action_type, Symbol, allowed_values: [:limit_order_amended, :limit_order_deleted,
|
10
10
|
:limit_order_filled, :limit_order_opened, :limit_order_rolled,
|
11
|
-
:position_closed, :position_deleted, :
|
11
|
+
:position_closed, :position_deleted, :position_opened,
|
12
12
|
:position_partially_closed, :position_rolled,
|
13
13
|
:stop_limit_amended, :stop_order_amended, :stop_order_deleted,
|
14
14
|
:stop_order_filled, :stop_order_opened, :stop_order_rolled,
|
@@ -74,6 +74,18 @@ module IGMarkets
|
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
77
|
+
desc 'delete-all', 'Deletes all working orders'
|
78
|
+
|
79
|
+
def delete_all
|
80
|
+
Main.begin_session(options) do |dealing_platform|
|
81
|
+
dealing_platform.working_orders.all.each do |working_order|
|
82
|
+
deal_reference = working_order.delete
|
83
|
+
|
84
|
+
Main.report_deal_confirmation deal_reference
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
77
89
|
private
|
78
90
|
|
79
91
|
ATTRIBUTES = [:currency_code, :direction, :epic, :expiry, :force_open, :good_till_date, :guaranteed_stop, :level,
|
@@ -66,11 +66,13 @@ module IGMarkets
|
|
66
66
|
end
|
67
67
|
|
68
68
|
def table_title(watchlist)
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
69
|
+
details = ["id: #{watchlist.id}"]
|
70
|
+
|
71
|
+
details << :default if watchlist.default_system_watchlist
|
72
|
+
details << :editable if watchlist.editable
|
73
|
+
details << :deleteable if watchlist.deleteable
|
74
|
+
|
75
|
+
"#{watchlist.name} (#{details.join ', '})"
|
74
76
|
end
|
75
77
|
end
|
76
78
|
end
|
@@ -27,9 +27,6 @@ module IGMarkets
|
|
27
27
|
types = details.actions.map(&:action_type).uniq
|
28
28
|
types.delete :unknown
|
29
29
|
|
30
|
-
# Fix a typo in one of the values
|
31
|
-
types.map! { |v| v == :position_opended ? :position_opened : v }
|
32
|
-
|
33
30
|
types.map { |v| format_cell_value v }.join ', '
|
34
31
|
end
|
35
32
|
end
|
@@ -6,6 +6,11 @@ module IGMarkets
|
|
6
6
|
attribute :market_id
|
7
7
|
attribute :short_position_percentage, Float
|
8
8
|
|
9
|
+
# Reloads this client sentiment's attributes by re-querying the IG Markets API.
|
10
|
+
def reload
|
11
|
+
self.attributes = @dealing_platform.client_sentiment[market_id].attributes
|
12
|
+
end
|
13
|
+
|
9
14
|
# Returns client sentiments for markets that are related to this one.
|
10
15
|
#
|
11
16
|
# @return [Array<ClientSentiment>]
|
@@ -69,10 +69,8 @@ module IGMarkets
|
|
69
69
|
# the position creation.
|
70
70
|
def create(attributes)
|
71
71
|
model = PositionCreateAttributes.new attributes
|
72
|
-
model.validate
|
73
72
|
|
74
|
-
payload = PayloadFormatter.format model
|
75
|
-
payload[:expiry] ||= '-'
|
73
|
+
payload = PayloadFormatter.format model, expiry: '-'
|
76
74
|
|
77
75
|
@dealing_platform.session.post('positions/otc', payload, API_V2).fetch(:deal_reference)
|
78
76
|
end
|
@@ -101,8 +99,17 @@ module IGMarkets
|
|
101
99
|
|
102
100
|
def initialize(attributes = {})
|
103
101
|
super
|
104
|
-
|
105
102
|
set_defaults
|
103
|
+
validate
|
104
|
+
end
|
105
|
+
|
106
|
+
private
|
107
|
+
|
108
|
+
def set_defaults
|
109
|
+
self.force_open = false if force_open.nil?
|
110
|
+
self.guaranteed_stop = false if guaranteed_stop.nil?
|
111
|
+
self.order_type ||= :market
|
112
|
+
self.time_in_force = :execute_and_eliminate if order_type == :market
|
106
113
|
end
|
107
114
|
|
108
115
|
# Runs a series of validations on this model's attributes to check whether it is ready to be sent to the IG
|
@@ -115,15 +122,6 @@ module IGMarkets
|
|
115
122
|
validate_guaranteed_stop_constraints
|
116
123
|
end
|
117
124
|
|
118
|
-
private
|
119
|
-
|
120
|
-
def set_defaults
|
121
|
-
self.force_open = false if force_open.nil?
|
122
|
-
self.guaranteed_stop = false if guaranteed_stop.nil?
|
123
|
-
self.order_type ||= :market
|
124
|
-
self.time_in_force = :execute_and_eliminate if order_type == :market
|
125
|
-
end
|
126
|
-
|
127
125
|
# Checks that all required attributes for position creation are present.
|
128
126
|
def validate_required_attributes
|
129
127
|
required = [:currency_code, :direction, :epic, :force_open, :guaranteed_stop, :order_type, :size,
|
@@ -63,11 +63,8 @@ module IGMarkets
|
|
63
63
|
# the working order creation.
|
64
64
|
def create(attributes)
|
65
65
|
model = WorkingOrderCreateAttributes.new attributes
|
66
|
-
model.validate
|
67
66
|
|
68
|
-
payload = PayloadFormatter.format model
|
69
|
-
|
70
|
-
payload[:expiry] ||= '-'
|
67
|
+
payload = PayloadFormatter.format model, expiry: '-'
|
71
68
|
|
72
69
|
@dealing_platform.session.post('workingorders/otc', payload, API_V2).fetch :deal_reference
|
73
70
|
end
|
@@ -92,8 +89,16 @@ module IGMarkets
|
|
92
89
|
|
93
90
|
def initialize(attributes)
|
94
91
|
super
|
95
|
-
|
96
92
|
set_defaults
|
93
|
+
validate
|
94
|
+
end
|
95
|
+
|
96
|
+
private
|
97
|
+
|
98
|
+
def set_defaults
|
99
|
+
self.force_open = false if force_open.nil?
|
100
|
+
self.guaranteed_stop = false if guaranteed_stop.nil?
|
101
|
+
self.time_in_force = good_till_date ? :good_till_date : :good_till_cancelled
|
97
102
|
end
|
98
103
|
|
99
104
|
# Runs a series of validations on this model's attributes to check whether it is ready to be sent to the IG
|
@@ -110,14 +115,6 @@ module IGMarkets
|
|
110
115
|
|
111
116
|
raise ArgumentError, 'Do not specify both stop_distance and stop_level options' if stop_distance && stop_level
|
112
117
|
end
|
113
|
-
|
114
|
-
private
|
115
|
-
|
116
|
-
def set_defaults
|
117
|
-
self.force_open = false if force_open.nil?
|
118
|
-
self.guaranteed_stop = false if guaranteed_stop.nil?
|
119
|
-
self.time_in_force = good_till_date ? :good_till_date : :good_till_cancelled
|
120
|
-
end
|
121
118
|
end
|
122
119
|
|
123
120
|
private_constant :WorkingOrderCreateAttributes
|
data/lib/ig_markets/market.rb
CHANGED
@@ -43,6 +43,11 @@ module IGMarkets
|
|
43
43
|
attribute :instrument, Instrument
|
44
44
|
attribute :snapshot, Snapshot
|
45
45
|
|
46
|
+
# Reloads this market's attributes by re-querying the IG Markets API.
|
47
|
+
def reload
|
48
|
+
self.attributes = @dealing_platform.markets[instrument.epic].attributes
|
49
|
+
end
|
50
|
+
|
46
51
|
# Returns historical prices for this market at a given resolution, either the most recent prices by specifying the
|
47
52
|
# `:number` option, or those from a date range by specifying the `:from` and `:to` options.
|
48
53
|
#
|
data/lib/ig_markets/model.rb
CHANGED
@@ -51,6 +51,15 @@ module IGMarkets
|
|
51
51
|
"#<#{self.class.name} #{formatted_attributes.join ', '}>"
|
52
52
|
end
|
53
53
|
|
54
|
+
# Mass assigns the passed attributes to this model.
|
55
|
+
#
|
56
|
+
# @param [Hash] new_attributes The attributes to assign on this model.
|
57
|
+
def attributes=(new_attributes)
|
58
|
+
new_attributes.each do |name, value|
|
59
|
+
send "#{name}=", value
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
54
63
|
private
|
55
64
|
|
56
65
|
# Returns the {#inspect} string for the given value.
|
@@ -9,10 +9,11 @@ module IGMarkets
|
|
9
9
|
# available `:format` option.
|
10
10
|
#
|
11
11
|
# @param [Model] model The model instance to convert attributes for.
|
12
|
+
# @param [Hash] defaults The default attribute values to return, can be overridden by values set on `model`.
|
12
13
|
#
|
13
14
|
# @return [Hash] The resulting attributes hash.
|
14
|
-
def format(model)
|
15
|
-
model.class.defined_attributes.each_with_object(
|
15
|
+
def format(model, defaults = {})
|
16
|
+
model.class.defined_attributes.each_with_object(defaults.dup) do |(name, options), formatted|
|
16
17
|
value = model.send name
|
17
18
|
|
18
19
|
next if value.nil?
|
data/lib/ig_markets/position.rb
CHANGED
@@ -59,6 +59,11 @@ module IGMarkets
|
|
59
59
|
price_delta * size * contract_size
|
60
60
|
end
|
61
61
|
|
62
|
+
# Reloads this position's attributes by re-querying the IG Markets API.
|
63
|
+
def reload
|
64
|
+
self.attributes = @dealing_platform.positions[deal_id].attributes
|
65
|
+
end
|
66
|
+
|
62
67
|
# Closes this position. If called with no options then this position will be fully closed at current market prices,
|
63
68
|
# partial closes and greater control over the close conditions can be achieved by using the relevant options.
|
64
69
|
#
|
data/lib/ig_markets/version.rb
CHANGED
@@ -21,6 +21,11 @@ module IGMarkets
|
|
21
21
|
|
22
22
|
deprecated_attribute :created_date, :good_till_date_iso
|
23
23
|
|
24
|
+
# Reloads this working order's attributes by re-querying the IG Markets API.
|
25
|
+
def reload
|
26
|
+
self.attributes = @dealing_platform.working_orders[deal_id].attributes
|
27
|
+
end
|
28
|
+
|
24
29
|
# Deletes this working order.
|
25
30
|
#
|
26
31
|
# @return [String] The deal reference of the deletion operation. Use {DealingPlatform#deal_confirmation} to check
|
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.14'
|
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-07-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: colorize
|
@@ -16,56 +16,56 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0.
|
19
|
+
version: '0.8'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '0.
|
26
|
+
version: '0.8'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: pry
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 0.10.3
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 0.10.3
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rest-client
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '2.0'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '2.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: terminal-table
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '1.
|
61
|
+
version: '1.6'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '1.
|
68
|
+
version: '1.6'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: thor
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,20 +80,34 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0.19'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: activesupport
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '5.0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '5.0'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: codeclimate-test-reporter
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
86
100
|
requirements:
|
87
101
|
- - "~>"
|
88
102
|
- !ruby/object:Gem::Version
|
89
|
-
version: '0.
|
103
|
+
version: '0.6'
|
90
104
|
type: :development
|
91
105
|
prerelease: false
|
92
106
|
version_requirements: !ruby/object:Gem::Requirement
|
93
107
|
requirements:
|
94
108
|
- - "~>"
|
95
109
|
- !ruby/object:Gem::Version
|
96
|
-
version: '0.
|
110
|
+
version: '0.6'
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: factory_girl
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -142,42 +156,42 @@ dependencies:
|
|
142
156
|
requirements:
|
143
157
|
- - "~>"
|
144
158
|
- !ruby/object:Gem::Version
|
145
|
-
version: '3.
|
159
|
+
version: '3.5'
|
146
160
|
type: :development
|
147
161
|
prerelease: false
|
148
162
|
version_requirements: !ruby/object:Gem::Requirement
|
149
163
|
requirements:
|
150
164
|
- - "~>"
|
151
165
|
- !ruby/object:Gem::Version
|
152
|
-
version: '3.
|
166
|
+
version: '3.5'
|
153
167
|
- !ruby/object:Gem::Dependency
|
154
168
|
name: rspec-mocks
|
155
169
|
requirement: !ruby/object:Gem::Requirement
|
156
170
|
requirements:
|
157
171
|
- - "~>"
|
158
172
|
- !ruby/object:Gem::Version
|
159
|
-
version: '3.
|
173
|
+
version: '3.5'
|
160
174
|
type: :development
|
161
175
|
prerelease: false
|
162
176
|
version_requirements: !ruby/object:Gem::Requirement
|
163
177
|
requirements:
|
164
178
|
- - "~>"
|
165
179
|
- !ruby/object:Gem::Version
|
166
|
-
version: '3.
|
180
|
+
version: '3.5'
|
167
181
|
- !ruby/object:Gem::Dependency
|
168
182
|
name: rubocop
|
169
183
|
requirement: !ruby/object:Gem::Requirement
|
170
184
|
requirements:
|
171
185
|
- - "~>"
|
172
186
|
- !ruby/object:Gem::Version
|
173
|
-
version: '0.
|
187
|
+
version: '0.41'
|
174
188
|
type: :development
|
175
189
|
prerelease: false
|
176
190
|
version_requirements: !ruby/object:Gem::Requirement
|
177
191
|
requirements:
|
178
192
|
- - "~>"
|
179
193
|
- !ruby/object:Gem::Version
|
180
|
-
version: '0.
|
194
|
+
version: '0.41'
|
181
195
|
- !ruby/object:Gem::Dependency
|
182
196
|
name: yard
|
183
197
|
requirement: !ruby/object:Gem::Requirement
|