zombie_battleground-api 0.1.0 → 0.2.0
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/.gitignore +4 -0
- data/Gemfile.lock +29 -11
- data/README.md +4 -0
- data/Rakefile +62 -5
- data/lib/zombie_battleground/api.rb +108 -8
- data/lib/zombie_battleground/api/client.rb +157 -23
- data/lib/zombie_battleground/api/errors.rb +28 -0
- data/lib/zombie_battleground/api/models/card.rb +272 -32
- data/lib/zombie_battleground/api/models/deck.rb +234 -46
- data/lib/zombie_battleground/api/models/match.rb +211 -33
- data/lib/zombie_battleground/api/models/simple_card.rb +47 -11
- data/lib/zombie_battleground/api/requests/get_card_request.rb +45 -10
- data/lib/zombie_battleground/api/requests/get_cards_request.rb +203 -27
- data/lib/zombie_battleground/api/requests/get_deck_request.rb +43 -13
- data/lib/zombie_battleground/api/requests/get_decks_request.rb +141 -23
- data/lib/zombie_battleground/api/requests/get_match_request.rb +43 -13
- data/lib/zombie_battleground/api/requests/get_matches_request.rb +125 -21
- data/lib/zombie_battleground/api/requests/request_helper.rb +24 -10
- data/lib/zombie_battleground/api/responses/get_card_response.rb +50 -16
- data/lib/zombie_battleground/api/responses/get_cards_response.rb +103 -33
- data/lib/zombie_battleground/api/responses/get_deck_response.rb +49 -17
- data/lib/zombie_battleground/api/responses/get_decks_response.rb +103 -33
- data/lib/zombie_battleground/api/responses/get_match_response.rb +49 -17
- data/lib/zombie_battleground/api/responses/get_matches_response.rb +103 -33
- data/lib/zombie_battleground/api/responses/response_helper.rb +32 -16
- data/lib/zombie_battleground/api/validation_helper.rb +497 -0
- data/lib/zombie_battleground/api/version.rb +5 -1
- data/zombie_battleground-api.gemspec +6 -0
- metadata +71 -1
@@ -2,17 +2,45 @@
|
|
2
2
|
|
3
3
|
module ZombieBattleground
|
4
4
|
class Api
|
5
|
+
##
|
6
|
+
# Error classes for the API
|
5
7
|
class Errors
|
8
|
+
##
|
9
|
+
# Raised if the endpoint responds with a 400
|
6
10
|
class BadRequest < StandardError; end
|
11
|
+
|
12
|
+
##
|
13
|
+
# Raised if the endpoint responds with a 500
|
7
14
|
class InternalServerError < StandardError; end
|
15
|
+
|
16
|
+
##
|
17
|
+
# Raised if a request validation fails
|
8
18
|
class InvalidInput < StandardError; end
|
19
|
+
|
20
|
+
##
|
21
|
+
# Raised if the endpoint responds with a 404
|
9
22
|
class NotFound < StandardError; end
|
23
|
+
|
24
|
+
##
|
25
|
+
# Raised if the endpoint responds with a 503
|
10
26
|
class ServiceUnavailable < StandardError; end
|
27
|
+
|
28
|
+
##
|
29
|
+
# Raised if the response fails validation
|
11
30
|
class UnknownResponse < StandardError; end
|
12
31
|
|
13
32
|
##
|
14
33
|
# Creates an error with the Faraday response and the context for the error
|
15
34
|
class InvalidResponse < StandardError
|
35
|
+
##
|
36
|
+
# Creates an exception class with the Faraday response and error context
|
37
|
+
#
|
38
|
+
# @param response [Faraday::Response] response from the endpoint
|
39
|
+
# @param context [Class] parsed response object
|
40
|
+
#
|
41
|
+
# @return [ZombieBattleground::Api::Errors::InvalidResponse]
|
42
|
+
#
|
43
|
+
# @api private
|
16
44
|
def initialize(response, context)
|
17
45
|
@response = response
|
18
46
|
@context = context
|
@@ -7,38 +7,278 @@ require 'zombie_battleground/api/validation_helper'
|
|
7
7
|
module ZombieBattleground
|
8
8
|
class Api
|
9
9
|
##
|
10
|
-
#
|
11
|
-
class
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
10
|
+
# Namespace for Models
|
11
|
+
class Models
|
12
|
+
##
|
13
|
+
# Validator for Card
|
14
|
+
class Card
|
15
|
+
include ActiveModel::Validations
|
16
|
+
include ZombieBattleground::Api::ValidationHelper
|
17
|
+
|
18
|
+
##
|
19
|
+
# @!attribute [r] id
|
20
|
+
# the Cards's id
|
21
|
+
#
|
22
|
+
# @return [Integer]
|
23
|
+
#
|
24
|
+
# @example
|
25
|
+
# card.id #=> 1
|
26
|
+
#
|
27
|
+
# @api public
|
28
|
+
attr_reader :id
|
29
|
+
|
30
|
+
##
|
31
|
+
# @!attribute [r] mould_id
|
32
|
+
# the Cards's mould_id
|
33
|
+
#
|
34
|
+
# @return [String]
|
35
|
+
#
|
36
|
+
# @example
|
37
|
+
# card.mould_id #=> "1"
|
38
|
+
#
|
39
|
+
# @api public
|
40
|
+
attr_reader :mould_id
|
41
|
+
|
42
|
+
##
|
43
|
+
# @!attribute [r] version
|
44
|
+
# the Cards's version
|
45
|
+
#
|
46
|
+
# @return [String]
|
47
|
+
#
|
48
|
+
# @example
|
49
|
+
# card.version #=> "v3"
|
50
|
+
#
|
51
|
+
# @api public
|
52
|
+
attr_reader :version
|
53
|
+
|
54
|
+
##
|
55
|
+
# @!attribute [r] kind
|
56
|
+
# the Cards's kind
|
57
|
+
#
|
58
|
+
# @return [String]
|
59
|
+
#
|
60
|
+
# @example
|
61
|
+
# card.kind #=> "CREATURE"
|
62
|
+
#
|
63
|
+
# @api public
|
64
|
+
attr_reader :kind
|
65
|
+
|
66
|
+
##
|
67
|
+
# @!attribute [r] set
|
68
|
+
# the Cards's set
|
69
|
+
#
|
70
|
+
# @return [String]
|
71
|
+
#
|
72
|
+
# @example
|
73
|
+
# card.set #=> "AIR"
|
74
|
+
#
|
75
|
+
# @api public
|
76
|
+
attr_reader :set
|
77
|
+
|
78
|
+
##
|
79
|
+
# @!attribute [r] name
|
80
|
+
# the Cards's name
|
81
|
+
#
|
82
|
+
# @return [String]
|
83
|
+
#
|
84
|
+
# @example
|
85
|
+
# card.name #=> "Whizpar"
|
86
|
+
#
|
87
|
+
# @api public
|
88
|
+
attr_reader :name
|
89
|
+
|
90
|
+
##
|
91
|
+
# @!attribute [r] description
|
92
|
+
# the Cards's description
|
93
|
+
#
|
94
|
+
# @return [String]
|
95
|
+
#
|
96
|
+
# @example
|
97
|
+
# card.description #=> "<b>Attack:</b> +1 damage to Water zombies"
|
98
|
+
#
|
99
|
+
# @api public
|
100
|
+
attr_reader :description
|
101
|
+
|
102
|
+
##
|
103
|
+
# @!attribute [r] flavor_text
|
104
|
+
# the Cards's flavor_text
|
105
|
+
#
|
106
|
+
# @return [String]
|
107
|
+
#
|
108
|
+
# @example
|
109
|
+
# card.flavor_text #=> "The unfriendly ghost..."
|
110
|
+
#
|
111
|
+
# @api public
|
112
|
+
attr_reader :flavor_text
|
113
|
+
|
114
|
+
##
|
115
|
+
# @!attribute [r] picture
|
116
|
+
# the Cards's picture
|
117
|
+
#
|
118
|
+
# @return [String]
|
119
|
+
#
|
120
|
+
# @example
|
121
|
+
# card.picture #=> "Whizpar"
|
122
|
+
#
|
123
|
+
# @api public
|
124
|
+
attr_reader :picture
|
125
|
+
|
126
|
+
##
|
127
|
+
# @!attribute [r] rank
|
128
|
+
# the Cards's rank
|
129
|
+
#
|
130
|
+
# @return [String]
|
131
|
+
#
|
132
|
+
# @example
|
133
|
+
# card.rank #=> "MINION"
|
134
|
+
#
|
135
|
+
# @api public
|
136
|
+
attr_reader :rank
|
137
|
+
|
138
|
+
##
|
139
|
+
# @!attribute [r] type
|
140
|
+
# the Cards's type
|
141
|
+
#
|
142
|
+
# @return [String]
|
143
|
+
#
|
144
|
+
# @example
|
145
|
+
# card.type #=> "WALKER"
|
146
|
+
#
|
147
|
+
# @api public
|
148
|
+
attr_reader :type
|
149
|
+
|
150
|
+
##
|
151
|
+
# @!attribute [r] rarity
|
152
|
+
# the Cards's rarity
|
153
|
+
#
|
154
|
+
# @return [String]
|
155
|
+
#
|
156
|
+
# @example
|
157
|
+
# card.rarity #=> ""
|
158
|
+
#
|
159
|
+
# @api public
|
160
|
+
attr_reader :rarity
|
161
|
+
|
162
|
+
##
|
163
|
+
# @!attribute [r] frame
|
164
|
+
# the Cards's frame
|
165
|
+
#
|
166
|
+
# @return [String]
|
167
|
+
#
|
168
|
+
# @example
|
169
|
+
# card.frame #=> ""
|
170
|
+
#
|
171
|
+
# @api public
|
172
|
+
attr_reader :frame
|
173
|
+
|
174
|
+
##
|
175
|
+
# @!attribute [r] damage
|
176
|
+
# the Cards's damage
|
177
|
+
#
|
178
|
+
# @return [Integer]
|
179
|
+
#
|
180
|
+
# @example
|
181
|
+
# card.damage #=> 1
|
182
|
+
#
|
183
|
+
# @api public
|
184
|
+
attr_reader :damage
|
185
|
+
|
186
|
+
##
|
187
|
+
# @!attribute [r] health
|
188
|
+
# the Cards's health
|
189
|
+
#
|
190
|
+
# @return [Integer]
|
191
|
+
#
|
192
|
+
# @example
|
193
|
+
# card.health #=> 1
|
194
|
+
#
|
195
|
+
# @api public
|
196
|
+
attr_reader :health
|
197
|
+
|
198
|
+
##
|
199
|
+
# @!attribute [r] cost
|
200
|
+
# the Cards's cost
|
201
|
+
#
|
202
|
+
# @return [Integer]
|
203
|
+
#
|
204
|
+
# @example
|
205
|
+
# card.cost #=> 1
|
206
|
+
#
|
207
|
+
# @api public
|
208
|
+
attr_reader :cost
|
209
|
+
|
210
|
+
##
|
211
|
+
# @!attribute [r] ability
|
212
|
+
# the Cards's ability
|
213
|
+
#
|
214
|
+
# @return [String]
|
215
|
+
#
|
216
|
+
# @example
|
217
|
+
# card.ability #=> ""
|
218
|
+
#
|
219
|
+
# @api public
|
220
|
+
attr_reader :ability
|
221
|
+
|
222
|
+
##
|
223
|
+
# @!attribute [r] block_height
|
224
|
+
# the Cards's block_height
|
225
|
+
#
|
226
|
+
# @return [Integer]
|
227
|
+
#
|
228
|
+
# @example
|
229
|
+
# card.block_height #=> 0
|
230
|
+
#
|
231
|
+
# @api public
|
232
|
+
attr_reader :block_height
|
233
|
+
|
234
|
+
##
|
235
|
+
# @!attribute [r] image_url
|
236
|
+
# the Cards's image_url
|
237
|
+
#
|
238
|
+
# @return [String]
|
239
|
+
#
|
240
|
+
# @example
|
241
|
+
# card.image_url #=> "https://loom.games/img/cards/001.png"
|
242
|
+
#
|
243
|
+
# @api public
|
244
|
+
attr_reader :image_url
|
245
|
+
|
246
|
+
validate :id_is_a_non_negative_integer
|
247
|
+
validate :mould_id_is_a_string_and_not_null
|
248
|
+
validate :version_is_a_string_and_not_null
|
249
|
+
validate :kind_is_a_string_and_not_null
|
250
|
+
validate :set_is_a_string_and_not_null
|
251
|
+
validate :name_is_a_string_and_not_null
|
252
|
+
validate :description_is_a_string_and_not_null
|
253
|
+
validate :rank_is_a_string_and_not_null
|
254
|
+
validate :type_is_a_string_and_not_null
|
255
|
+
validate :rarity_is_a_string_and_not_null
|
256
|
+
validate :frame_is_a_string_and_not_null
|
257
|
+
validate :damage_is_a_non_negative_integer_and_not_null
|
258
|
+
validate :health_is_a_non_negative_integer_and_not_null
|
259
|
+
validate :cost_is_a_non_negative_integer_and_not_null
|
260
|
+
validate :ability_is_a_string_and_not_null
|
261
|
+
validate :block_height_is_a_non_negative_integer_and_not_null
|
262
|
+
validate :image_url_is_a_string_and_not_null
|
263
|
+
|
264
|
+
##
|
265
|
+
# Creates a new Card
|
266
|
+
#
|
267
|
+
# @param card [Hash] Parsed JSON response
|
268
|
+
#
|
269
|
+
# @return [ZombieBattleground::Api::Card]
|
270
|
+
#
|
271
|
+
# @example
|
272
|
+
# card = ZombieBattleground::Api::Card.new(parsed_json)
|
273
|
+
# # => ZombieBattleground::Api::Card
|
274
|
+
#
|
275
|
+
# @api public
|
276
|
+
def initialize(card)
|
277
|
+
card.each do |key, value|
|
278
|
+
next if value.nil? # this is an illegal response, card id 1 is bogus
|
279
|
+
|
280
|
+
instance_variable_set("@#{key}".to_sym, value)
|
281
|
+
end
|
42
282
|
end
|
43
283
|
end
|
44
284
|
end
|
@@ -7,57 +7,245 @@ require 'zombie_battleground/api/models/simple_card'
|
|
7
7
|
|
8
8
|
module ZombieBattleground
|
9
9
|
class Api
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
deck.
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
10
|
+
class Models
|
11
|
+
##
|
12
|
+
# Validator for Deck
|
13
|
+
class Deck
|
14
|
+
include ActiveModel::Validations
|
15
|
+
include ZombieBattleground::Api::ValidationHelper
|
16
|
+
|
17
|
+
##
|
18
|
+
# @!attribute [r] id
|
19
|
+
# Deck's id
|
20
|
+
#
|
21
|
+
# @return [Integer]
|
22
|
+
#
|
23
|
+
# @example
|
24
|
+
# deck.id #=> 1812
|
25
|
+
#
|
26
|
+
# @api public
|
27
|
+
attr_reader :id
|
28
|
+
|
29
|
+
##
|
30
|
+
# @!attribute [r] created_at
|
31
|
+
# the Deck's created_at time
|
32
|
+
#
|
33
|
+
# @return [Time]
|
34
|
+
#
|
35
|
+
# @example
|
36
|
+
# deck.created_at #=> Time
|
37
|
+
#
|
38
|
+
# @api public
|
39
|
+
attr_reader :created_at
|
40
|
+
|
41
|
+
##
|
42
|
+
# @!attribute [r] updated_at
|
43
|
+
# the Deck's updated_at time
|
44
|
+
#
|
45
|
+
# @return [Time]
|
46
|
+
#
|
47
|
+
# @example
|
48
|
+
# deck.updated_at #=> Time
|
49
|
+
#
|
50
|
+
# @api public
|
51
|
+
attr_reader :updated_at
|
52
|
+
|
53
|
+
##
|
54
|
+
# @!attribute [r] user_id
|
55
|
+
# the Deck's user_id
|
56
|
+
#
|
57
|
+
# @return [String]
|
58
|
+
#
|
59
|
+
# @example
|
60
|
+
# deck.user_id #=> "ZombieSlayer_5773"
|
61
|
+
#
|
62
|
+
# @api public
|
63
|
+
attr_reader :user_id
|
64
|
+
|
65
|
+
##
|
66
|
+
# @!attribute [r] deck_id
|
67
|
+
# the Deck's deck_id
|
68
|
+
#
|
69
|
+
# @return [Integer]
|
70
|
+
#
|
71
|
+
# @example
|
72
|
+
# deck.deck_id #=> 4
|
73
|
+
#
|
74
|
+
# @api public
|
75
|
+
attr_reader :deck_id
|
76
|
+
|
77
|
+
##
|
78
|
+
# @!attribute [r] name
|
79
|
+
# the Deck's name
|
80
|
+
#
|
81
|
+
# @return [String]
|
82
|
+
#
|
83
|
+
# @example
|
84
|
+
# deck.name #=> "Leaf Midrange"
|
85
|
+
#
|
86
|
+
# @api public
|
87
|
+
attr_reader :name
|
88
|
+
|
89
|
+
##
|
90
|
+
# @!attribute [r] hero_id
|
91
|
+
# the Deck's hero_id
|
92
|
+
#
|
93
|
+
# @return [Integer]
|
94
|
+
#
|
95
|
+
# @example
|
96
|
+
# deck.hero_id #=> 5
|
97
|
+
#
|
98
|
+
# @api public
|
99
|
+
attr_reader :hero_id
|
100
|
+
|
101
|
+
##
|
102
|
+
# @!attribute [r] cards
|
103
|
+
# the Deck's cards
|
104
|
+
#
|
105
|
+
# @return [Array<ZombieBattleground::Api::Models::SimpleCard>]
|
106
|
+
#
|
107
|
+
# @example
|
108
|
+
# deck.cards #=> [ZombieBattleground::Api::Models::SimpleCard]
|
109
|
+
#
|
110
|
+
# @api public
|
111
|
+
attr_reader :cards
|
112
|
+
|
113
|
+
##
|
114
|
+
# @!attribute [r] primary_skill_id
|
115
|
+
# the Deck's primary_skill_id
|
116
|
+
#
|
117
|
+
# @return [Integer]
|
118
|
+
#
|
119
|
+
# @example
|
120
|
+
# deck.primary_skill_id #=> 19
|
121
|
+
#
|
122
|
+
# @api public
|
123
|
+
attr_reader :primary_skill_id
|
124
|
+
|
125
|
+
##
|
126
|
+
# @!attribute [r] secondary_skill_id
|
127
|
+
# the Deck's secondary_skill_id
|
128
|
+
#
|
129
|
+
# @return [Integer]
|
130
|
+
#
|
131
|
+
# @example
|
132
|
+
# deck.secondary_skill_id #=> 18
|
133
|
+
#
|
134
|
+
# @api public
|
135
|
+
attr_reader :secondary_skill_id
|
136
|
+
|
137
|
+
##
|
138
|
+
# @!attribute [r] version
|
139
|
+
# the Deck's version
|
140
|
+
#
|
141
|
+
# @return [String]
|
142
|
+
#
|
143
|
+
# @example
|
144
|
+
# deck.version #=> "v5"
|
145
|
+
#
|
146
|
+
# @api public
|
147
|
+
attr_reader :version
|
148
|
+
|
149
|
+
##
|
150
|
+
# @!attribute [r] sender_address
|
151
|
+
# the Deck's sender_address
|
152
|
+
#
|
153
|
+
# @return [String]
|
154
|
+
#
|
155
|
+
# @example
|
156
|
+
# deck.sender_address #=> "0x62bb8C4452c3Fa7E9eEd6D9Ceaa4d3fe8E18E249"
|
157
|
+
#
|
158
|
+
# @api public
|
159
|
+
attr_reader :sender_address
|
160
|
+
|
161
|
+
##
|
162
|
+
# @!attribute [r] block_height
|
163
|
+
# the Deck's block_height
|
164
|
+
#
|
165
|
+
# @return [Integer]
|
166
|
+
#
|
167
|
+
# @example
|
168
|
+
# deck.block_height #=> 939237
|
169
|
+
#
|
170
|
+
# @api public
|
171
|
+
attr_reader :block_height
|
172
|
+
|
173
|
+
##
|
174
|
+
# @!attribute [r] is_deleted
|
175
|
+
# the Deck's is_deleted
|
176
|
+
#
|
177
|
+
# @return [Boolean]
|
178
|
+
#
|
179
|
+
# @example
|
180
|
+
# deck.is_deleted #=> false
|
181
|
+
#
|
182
|
+
# @api public
|
183
|
+
attr_reader :is_deleted
|
184
|
+
|
185
|
+
validate :id_is_a_non_negative_integer
|
186
|
+
validate :created_at_is_a_time_and_not_null
|
187
|
+
validate :updated_at_is_a_time_and_not_null
|
188
|
+
validate :user_id_is_a_string_and_not_null
|
189
|
+
validate :deck_id_is_a_non_negative_integer_and_not_null
|
190
|
+
validate :name_is_a_string_and_not_null
|
191
|
+
validate :hero_id_is_a_non_negative_integer_and_not_null
|
192
|
+
validate :cards_is_an_array_of_simple_card
|
193
|
+
validate :primary_skill_id_is_a_non_negative_integer_and_not_null
|
194
|
+
validate :secondary_skill_id_is_a_non_negative_integer_and_not_null
|
195
|
+
validate :version_is_a_string_and_not_null
|
196
|
+
validate :sender_address_is_a_string_and_not_null
|
197
|
+
validate :block_height_is_a_non_negative_integer_and_not_null
|
198
|
+
validates :is_deleted, inclusion: { in: [true, false] }
|
199
|
+
|
200
|
+
##
|
201
|
+
# Creates a new Deck
|
202
|
+
#
|
203
|
+
# @param card [Hash] Parsed JSON response
|
204
|
+
#
|
205
|
+
# @return [ZombieBattleground::Api::Deck]
|
206
|
+
#
|
207
|
+
# @example
|
208
|
+
# deck = ZombieBattleground::Api::Deck.new(parsed_json)
|
209
|
+
# # => ZombieBattleground::Api::Deck
|
210
|
+
#
|
211
|
+
# @api public
|
212
|
+
def initialize(deck)
|
213
|
+
deck.each do |key, value|
|
214
|
+
next if value.nil? # this is an illegal response, deck id 1 is bogus
|
215
|
+
|
216
|
+
if key == 'cards'
|
217
|
+
instance_variable_set(
|
218
|
+
"@#{key}".to_sym, value.map { |card| ZombieBattleground::Api::Models::SimpleCard.new(card) }
|
219
|
+
)
|
220
|
+
elsif %w[created_at updated_at].include?(key)
|
221
|
+
instance_variable_set("@#{key}".to_sym, Time.parse(value))
|
222
|
+
else
|
223
|
+
instance_variable_set("@#{key}".to_sym, value)
|
224
|
+
end
|
45
225
|
end
|
46
226
|
end
|
47
|
-
end
|
48
227
|
|
49
|
-
|
50
|
-
unless @cards.is_a?(Array)
|
51
|
-
errors.add(:cards, 'cards must be an Array')
|
52
|
-
return
|
53
|
-
end
|
228
|
+
private
|
54
229
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
230
|
+
##
|
231
|
+
# Validator for cards attribute
|
232
|
+
#
|
233
|
+
# @return [void]
|
234
|
+
#
|
235
|
+
# @api private
|
236
|
+
def cards_is_an_array_of_simple_card
|
237
|
+
unless @cards.is_a?(Array)
|
238
|
+
errors.add(:cards, 'cards must be an Array')
|
239
|
+
return
|
240
|
+
end
|
59
241
|
|
60
|
-
|
242
|
+
@cards.each do |card|
|
243
|
+
next if card.is_a?(ZombieBattleground::Api::Models::SimpleCard) &&
|
244
|
+
card.valid? &&
|
245
|
+
card.errors.size.zero?
|
246
|
+
|
247
|
+
errors.add(:cards, 'cards must be an array of SimpleCard')
|
248
|
+
end
|
61
249
|
end
|
62
250
|
end
|
63
251
|
end
|