plaid 7.0.0.rc0 → 7.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f251b7c70ec04163c7e8e4fd398fb51289335177
4
- data.tar.gz: d2a80a47518e12c6ca387e16d23a005d30bf4d63
3
+ metadata.gz: 18ef4b160f63f39b30052f19f7ca073f168f4b6a
4
+ data.tar.gz: 7e30c7bf3971f6fdfc5c4f8863511c3a7b2467ac
5
5
  SHA512:
6
- metadata.gz: cf03af5a0686a67c11388a8ba91fc10728c0c2d6e61e9fa48e1f9374d569eda9f4251b19dac1a83a5b300ebb553a6fc38cc642f47db93e0350c80c7e6e075264
7
- data.tar.gz: 52fee6178dd77d0cb0320744c55f9b594a9cd40c10050876b238ba805ef857ed3fec2a8e7d6029b4fd466b19abb1e4a825c7c35bc0d603b293e4608c6ba2aaa1
6
+ metadata.gz: d94f18dcde295e44579da99448868145253ecc85d67699f2e60e8b332776c2e2cde77fed83eae657c517b99f3777407d27ffeb86583b2d78477606cc5b5d2b4e
7
+ data.tar.gz: f163eb2379937e625e852094398cc6b7c9e6f60ff801a400e25b30e2e4ce3fc779ffa1f1dd7657855d0ab6a5d5b2a32be4670b1706a1380da800ec8b1a067f65
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ # 7.0.0 20-May-2019
2
+
3
+ * Add support for 2019-05-29 API version
4
+
5
+ # 6.3.1 20-Mar-2019
6
+
7
+ * Remove unnecessary log line
8
+
1
9
  # 6.3.0 5-Mar-2019
2
10
 
3
11
  * Add support for include_institution_data to /institutions/search endpoint.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- plaid (7.0.0.rc0)
4
+ plaid (6.2.1)
5
5
  faraday
6
6
  faraday_middleware
7
7
  hashie (>= 3.4.3)
@@ -10,23 +10,23 @@ GEM
10
10
  remote: https://rubygems.org/
11
11
  specs:
12
12
  ast (2.4.0)
13
- dotenv (2.7.1)
14
- faraday (0.15.4)
13
+ dotenv (2.4.0)
14
+ faraday (0.15.2)
15
15
  multipart-post (>= 1.2, < 3)
16
- faraday_middleware (0.13.1)
16
+ faraday_middleware (0.12.2)
17
17
  faraday (>= 0.7.4, < 1.0)
18
- hashie (3.6.0)
18
+ hashie (3.5.7)
19
19
  minitest (5.11.3)
20
20
  minitest-around (0.4.1)
21
21
  minitest (~> 5.0)
22
22
  multipart-post (2.0.0)
23
- parallel (1.14.0)
24
- parser (2.6.0.0)
23
+ parallel (1.12.1)
24
+ parser (2.5.1.0)
25
25
  ast (~> 2.4.0)
26
- powerpack (0.1.2)
26
+ powerpack (0.1.1)
27
27
  rainbow (3.0.0)
28
- rake (12.3.2)
29
- rdoc (6.1.1)
28
+ rake (12.3.1)
29
+ rdoc (6.0.4)
30
30
  rubocop (0.53.0)
31
31
  parallel (~> 1.10)
32
32
  parser (>= 2.5)
@@ -34,17 +34,17 @@ GEM
34
34
  rainbow (>= 2.2.2, < 4.0)
35
35
  ruby-progressbar (~> 1.7)
36
36
  unicode-display_width (~> 1.0, >= 1.0.1)
37
- ruby-progressbar (1.10.0)
37
+ ruby-progressbar (1.9.0)
38
38
  sdoc (1.0.0)
39
39
  rdoc (>= 5.0)
40
- unicode-display_width (1.5.0)
40
+ unicode-display_width (1.3.2)
41
41
  vcr (4.0.0)
42
42
 
43
43
  PLATFORMS
44
44
  ruby
45
45
 
46
46
  DEPENDENCIES
47
- bundler (~> 1.17)
47
+ bundler (~> 1.7)
48
48
  dotenv
49
49
  minitest (~> 5.10)
50
50
  minitest-around (~> 0.4.0)
@@ -55,4 +55,4 @@ DEPENDENCIES
55
55
  vcr (~> 4.0.0)
56
56
 
57
57
  BUNDLED WITH
58
- 1.17.3
58
+ 1.16.2
data/README.md CHANGED
@@ -26,7 +26,8 @@ Each major version of `plaid-ruby` targets a specific version of the Plaid API:
26
26
 
27
27
  | API version | plaid-ruby release |
28
28
  | ----------- | ------------------ |
29
- | [`2018-05-22`][api-version-2018-05-22] (**latest**) | `6.x.x` |
29
+ | [`2019-05-29`][api-version-2019-05-29] (**latest**) | `7.x.x` |
30
+ | [`2018-05-22`][api-version-2018-05-22] | `6.x.x` |
30
31
  | `2017-03-08` | `5.x.x` |
31
32
 
32
33
  For information about what has changed between versions and how to update your integration, head to the [version changelog][version-changelog].
@@ -215,8 +216,6 @@ Any API call returns a response object which is accessible by dot notation
215
216
  and `response['foo']['bar']`. Expected keys for all types of responses are defined,
216
217
  and any attempt to access an unknown key will cause `NoMethodError` exception.
217
218
 
218
- These strict model checks can be disabled by setting `Plaid.relaxed_models = true`.
219
-
220
219
  ## Network Timeout
221
220
 
222
221
  A network timeout value is currently defaulted at 600 seconds = 10 minutes.
@@ -238,4 +237,5 @@ If you're looking for a Ruby client that works with the legacy Plaid API, use th
238
237
 
239
238
  [2]: https://github.com/plaid/plaid-ruby-legacy
240
239
  [version-changelog]: https://plaid.com/docs/api-upgrades
241
- [api-version-2018-05-22]: https://plaid.com/docs/api-upgrades#2018-05-22
240
+ [api-version-2018-05-22]: https://plaid.com/docs/api-upgrades#2018-05-22
241
+ [api-version-2019-05-29]: https://plaid.com/docs/api-upgrades#2019-05-29
data/lib/plaid.rb CHANGED
@@ -26,9 +26,9 @@ module Plaid
26
26
  #
27
27
  # We support two modes for parsing response bodies.
28
28
  #
29
- # Strict mode (default). Unknown attributes will cause NoMethodError.
29
+ # Strict mode: Unknown attributes will cause NoMethodError.
30
30
  #
31
- # Relaxed mode. If a response contains an unknown
31
+ # Relaxed mode (default): If a response contains an unknown
32
32
  # attribute, it won't cause any error and will be accessible
33
33
  # using brackets notation: `response['unknown_attribute']`.
34
34
  #
data/lib/plaid/models.rb CHANGED
@@ -7,10 +7,21 @@ module Plaid
7
7
  include Hashie::Extensions::Dash::IndifferentAccess
8
8
  include Hashie::Extensions::Dash::Coercion
9
9
 
10
+ @ignored_properties = []
11
+
12
+ def self.property_ignored?(property)
13
+ if defined? @ignored_properties
14
+ @ignored_properties.include?(property)
15
+ else
16
+ false
17
+ end
18
+ end
19
+
10
20
  # Internal: Be strict or forgiving depending on Plaid.relaxed_models
11
21
  # value.
12
22
  def assert_property_exists!(property)
13
- super unless Plaid.relaxed_models?
23
+ super unless Plaid.relaxed_models? ||
24
+ self.class.property_ignored?(property)
14
25
  end
15
26
  end
16
27
 
@@ -118,6 +129,49 @@ module Plaid
118
129
  property :webhook
119
130
  end
120
131
 
132
+ # Public: A representation of Item webhook status
133
+ class ItemStatusLastWebhook < BaseModel
134
+ ##
135
+ # :attr_reader:
136
+ # Public: The String last code sent (or nil).
137
+ # (e.g. "HISTORICAL_UPDATE").
138
+ property :code_sent
139
+
140
+ ##
141
+ # :attr_reader:
142
+ # Public: the String sent at date (or nil).
143
+ # (e.g. "2019-04-22T00:00:00Z").
144
+ property :sent_at
145
+ end
146
+
147
+ # Public: A representation of Item transaction update status
148
+ class ItemStatusTransactions < BaseModel
149
+ ##
150
+ # :attr_reader:
151
+ # Public: the String last failed update date (or nil).
152
+ # (e.g. "2019-04-22T00:00:00Z").
153
+ property :last_failed_update
154
+
155
+ ##
156
+ # :attr_reader:
157
+ # Public: the String last successful update date (or nil).
158
+ # (e.g. "2019-04-22T00:00:00Z").
159
+ property :last_successful_update
160
+ end
161
+
162
+ # Public: A representation of Item status
163
+ class ItemStatus < BaseModel
164
+ ##
165
+ # :attr_reader:
166
+ # Public: The ItemStatusLastWebhook for this ItemStatus.
167
+ property :last_webhook, coerce: ItemStatusLastWebhook
168
+
169
+ ##
170
+ # :attr_reader:
171
+ # Public: The ItemStatusTransactions for this ItemStatus.
172
+ property :transactions, coerce: ItemStatusTransactions
173
+ end
174
+
121
175
  # Public: A representation of account balances.
122
176
  class Balances < BaseModel
123
177
  ##
@@ -183,6 +237,12 @@ module Plaid
183
237
  # :attr_reader:
184
238
  # Public: The String subtype, e.g. "checking".
185
239
  property :subtype
240
+
241
+ ##
242
+ # :attr_reader:
243
+ # Public: The String verification status,
244
+ # e.g "manually_verified" (optional).
245
+ property :verification_status
186
246
  end
187
247
 
188
248
  # Public: A representation of an ACH account number.
@@ -233,7 +293,7 @@ module Plaid
233
293
  property :institution
234
294
  end
235
295
 
236
- # Public: A representation of an international account number.
296
+ # Public: A representation of an International account number.
237
297
  class NumberInternational < BaseModel
238
298
  ##
239
299
  # :attr_reader:
@@ -243,16 +303,17 @@ module Plaid
243
303
 
244
304
  ##
245
305
  # :attr_reader:
246
- # Public: The account's IBAN.
306
+ # Public: The String International Bank Account Number (IBAN). E.g.
307
+ # "GB33BUKB20201555555555".
247
308
  property :iban
248
309
 
249
310
  ##
250
311
  # :attr_reader:
251
- # Public: The account's BIC.
312
+ # Public: The String Bank Identifier Code (BIC). E.g. "BUKBGB22".
252
313
  property :bic
253
314
  end
254
315
 
255
- # Public: A representation of an BACS (UK) account number.
316
+ # Public: A representation of a BACS (British) account number.
256
317
  class NumberBACS < BaseModel
257
318
  ##
258
319
  # :attr_reader:
@@ -262,12 +323,12 @@ module Plaid
262
323
 
263
324
  ##
264
325
  # :attr_reader:
265
- # Public: The account's (UK) account number.
326
+ # Public: The String account number. E.g. "66374958".
266
327
  property :account
267
328
 
268
329
  ##
269
330
  # :attr_reader:
270
- # Public: The account's (UK) sort code.
331
+ # Public: The String sort code. E.g. "089999".
271
332
  property :sort_code
272
333
  end
273
334
 
@@ -407,7 +468,7 @@ module Plaid
407
468
 
408
469
  ##
409
470
  # :attr_reader:
410
- # Public: The String region name.
471
+ # Public: The String region or state name.
411
472
  property :region
412
473
 
413
474
  ##
@@ -417,18 +478,12 @@ module Plaid
417
478
 
418
479
  ##
419
480
  # :attr_reader:
420
- # Public: The String country, an ISO-3166-1 alpha-2 code.
481
+ # Public: The String country code.
421
482
  property :country
422
483
  end
423
484
 
424
485
  # Public: A representation of Identity address data.
425
486
  class IdentityAddress < BaseModel
426
- ##
427
- # :attr_reader:
428
- # Public: The Array of String accounts, associated with this address.
429
- # E.g. ["Plaid Credit Card 3333"].
430
- property :accounts
431
-
432
487
  ##
433
488
  # :attr_reader:
434
489
  # Public: The Boolean primary flag (true if it's the primary address).
@@ -527,6 +582,14 @@ module Plaid
527
582
  property :name
528
583
  end
529
584
 
585
+ # Public: A representation of an account with owners
586
+ class AccountWithOwners < Account
587
+ ##
588
+ # :attr_reader:
589
+ # Public: The Array of owners.
590
+ property :owners, coerce: Array[Identity]
591
+ end
592
+
530
593
  # Public: A representation of Income data.
531
594
  class Income < BaseModel
532
595
  ##
@@ -578,6 +641,8 @@ module Plaid
578
641
 
579
642
  # Public: A representation of an institution login credential.
580
643
  class InstitutionCredential < BaseModel
644
+ @ignored_properties = ['flexible_input_spec']
645
+
581
646
  ##
582
647
  # :attr_reader:
583
648
  # Public: The String label. E.g. "User ID".
@@ -594,8 +659,59 @@ module Plaid
594
659
  property :type
595
660
  end
596
661
 
662
+ # Public: A representation of Institution status breakdown.
663
+ class InstitutionStatusBreakdown < BaseModel
664
+ ##
665
+ # :attr_reader:
666
+ # Public: The Numeric success percentage.
667
+ # (e.g. 0.970)
668
+ property :success
669
+
670
+ ##
671
+ # :attr_reader:
672
+ # Public: The Numeric Plaid error percentage.
673
+ # (e.g. 0.010)
674
+ property :error_plaid
675
+
676
+ ##
677
+ # :attr_reader:
678
+ # Public: The Numeric Institution error percentage.
679
+ # (e.g. 0.020)
680
+ property :error_institution
681
+ end
682
+
683
+ # Public: A representation of Institution item logins status.
684
+ class InstitutionStatusItemLogins < BaseModel
685
+ ##
686
+ # :attr_reader:
687
+ # Public: The String last status change date.
688
+ # (e.g. "2019-04-22T20:52:00Z")
689
+ property :last_status_change
690
+
691
+ ##
692
+ # :attr_reader:
693
+ # Public: The String status.
694
+ # (e.g. one of "HEALTHY"|"DEGRADED"|"DOWN")
695
+ property :status
696
+
697
+ ##
698
+ # :attr_reader:
699
+ # Public: The breakdown for this Institution status.
700
+ property :breakdown, coerce: InstitutionStatusBreakdown
701
+ end
702
+
703
+ # Public: A representation of Institution status.
704
+ class InstitutionStatus < BaseModel
705
+ ##
706
+ # :attr_reader:
707
+ # Public: The Item logins status for this InstitutionStatus.
708
+ property :item_logins, coerce: InstitutionStatusItemLogins
709
+ end
710
+
597
711
  # Public: A representation of Institution.
598
712
  class Institution < BaseModel
713
+ @ignored_properties = ['input_spec']
714
+
599
715
  ##
600
716
  # :attr_reader:
601
717
  # Public: The Array of InstitutionCredential, presenting information on
@@ -635,6 +751,12 @@ module Plaid
635
751
  # E.g. ["auth", "balance", "identity", "transactions"].
636
752
  property :products
637
753
 
754
+ ##
755
+ # :attr_reader:
756
+ # Public: The Array of String country codes supported by this institution.
757
+ # E.g. ["US", "GB"].
758
+ property :country_codes
759
+
638
760
  ##
639
761
  # :attr_reader:
640
762
  # Public: The String primary color for this institution (e.g. "#095aa6").
@@ -650,6 +772,16 @@ module Plaid
650
772
  # Public: The String base 64 encoded url for this institution
651
773
  # E.g. "https://www.plaid.com").
652
774
  property :url
775
+
776
+ ##
777
+ # :attr_reader:
778
+ # Public: The Status for this Institution (or nil).
779
+ property :status, coerce: InstitutionStatus
780
+
781
+ ##
782
+ # :attr_reader:
783
+ # Public: The Array of String country codes supported by this institution.
784
+ property :country_codes
653
785
  end
654
786
 
655
787
  module MFA
@@ -717,7 +849,7 @@ module Plaid
717
849
 
718
850
  ##
719
851
  # :attr_reader:
720
- # Public: The String region name (or nil).
852
+ # Public: The String region or state name (or nil).
721
853
  property :region
722
854
 
723
855
  ##
@@ -732,7 +864,7 @@ module Plaid
732
864
 
733
865
  ##
734
866
  # :attr_reader:
735
- # Public: The String country, an ISO-3166-1 alpha-2 code.
867
+ # Public: The country code (or nil).
736
868
  property :country
737
869
  end
738
870
 
@@ -851,8 +983,7 @@ module Plaid
851
983
  property :unofficial_currency_code
852
984
  end
853
985
 
854
- # Public: A representation of Identity address details returned by the
855
- # assets endpoint.
986
+ # Public: A representation of asset report address details.
856
987
  class AssetReportAddressData < BaseModel
857
988
  ##
858
989
  # :attr_reader:
@@ -871,7 +1002,7 @@ module Plaid
871
1002
 
872
1003
  ##
873
1004
  # :attr_reader:
874
- # Public: The String ZIP code.
1005
+ # Public: The String zip code.
875
1006
  property :zip
876
1007
  end
877
1008
 
@@ -880,7 +1011,7 @@ module Plaid
880
1011
  ##
881
1012
  # :attr_reader:
882
1013
  # Public: Data about the components comprising an address; see
883
- # AssetReportAddressData object for fields.
1014
+ # IdentityAddressData object for fields.
884
1015
  property :data, coerce: AssetReportAddressData
885
1016
 
886
1017
  ##
@@ -972,45 +1103,6 @@ module Plaid
972
1103
  property :unofficial_currency_code
973
1104
  end
974
1105
 
975
- # Public: A representation of Transaction location returned by asset
976
- # reports.
977
- class AssetReportTransactionLocation < BaseModel
978
- ##
979
- # :attr_reader:
980
- # Public: The String address (or nil).
981
- property :address
982
-
983
- ##
984
- # :attr_reader:
985
- # Public: The String city name (or nil).
986
- property :city
987
-
988
- ##
989
- # :attr_reader:
990
- # Public: The Numeric latitude of the place (or nil).
991
- property :lat
992
-
993
- ##
994
- # :attr_reader:
995
- # Public: The Numeric longitude of the place (or nil).
996
- property :lon
997
-
998
- ##
999
- # :attr_reader:
1000
- # Public: The String state name (or nil).
1001
- property :state
1002
-
1003
- ##
1004
- # :attr_reader:
1005
- # Public: The String store number (or nil).
1006
- property :store_number
1007
-
1008
- ##
1009
- # :attr_reader:
1010
- # Public: The String ZIP code (or nil).
1011
- property :zip
1012
- end
1013
-
1014
1106
  # Public: A representation of an asset report transaction.
1015
1107
  class AssetReportTransaction < BaseModel
1016
1108
  ##
@@ -1085,9 +1177,9 @@ module Plaid
1085
1177
 
1086
1178
  ##
1087
1179
  # :attr_reader: Public: The location where transaction occurred
1088
- # (AssetReportTransactionLocation). This field only appears in an Asset
1089
- # Report with Insights.
1090
- property :location, coerce: AssetReportTransactionLocation
1180
+ # (TransactionLocation). This field only appears in an Asset Report with
1181
+ # Insights.
1182
+ property :location, coerce: TransactionLocation
1091
1183
 
1092
1184
  ##
1093
1185
  # :attr_reader: Public: The String transaction name (or nil). This field
@@ -21,12 +21,7 @@ module Plaid
21
21
  ##
22
22
  # :attr_reader:
23
23
  # Public: The list of accounts: Array of Plaid::Models::Account.
24
- property :accounts, coerce: Array[Models::Account]
25
-
26
- ##
27
- # :attr_reader:
28
- # Public: Identity information: Plaid::Models::Identity.
29
- property :identity, coerce: Models::Identity
24
+ property :accounts, coerce: Array[Models::AccountWithOwners]
30
25
 
31
26
  ##
32
27
  # :attr_reader:
@@ -331,6 +331,11 @@ module Plaid
331
331
  # :attr_reader:
332
332
  # Public: The item: Plaid::Models::Item.
333
333
  property :item, coerce: Models::Item
334
+
335
+ ##
336
+ # :attr_reader:
337
+ # Public: The item status: Plaid::Models::ItemStatus.
338
+ property :status, coerce: Models::ItemStatus
334
339
  end
335
340
 
336
341
  # Public: Removes an item
@@ -21,6 +21,29 @@ module Plaid
21
21
  # Public: The Boolean reset success flag.
22
22
  property :reset_login
23
23
  end
24
+
25
+ # Public: Fires a webhook for a sandbox item
26
+ #
27
+ # Does a POST /sandbox/item/fire_webhook call.
28
+ #
29
+ # access_token - access_token of the item to fire a webhook for.
30
+ # webhook_code - webhook_code to fire.
31
+ #
32
+ # Returns a FireWebhookResponse object.
33
+ def fire_webhook(access_token, webhook_code)
34
+ post_with_auth 'sandbox/item/fire_webhook',
35
+ FireWebhookResponse,
36
+ access_token: access_token,
37
+ webhook_code: webhook_code
38
+ end
39
+
40
+ # Public: Response for /sandbox/item/fire_webhook.
41
+ class FireWebhookResponse < Models::BaseResponse
42
+ ##
43
+ # :attr_reader:
44
+ # Public: The Boolean webhook fired success flag.
45
+ property :webhook_fired
46
+ end
24
47
  end
25
48
 
26
49
  # Public: Class used to call the SandboxPublicToken sub-product
data/lib/plaid/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Plaid
2
- VERSION = '7.0.0.rc0'.freeze
3
- API_VERSION = '2019-02-14'.freeze
2
+ VERSION = '7.0.0'.freeze
3
+ API_VERSION = '2019-05-29'.freeze
4
4
  end
data/plaid.gemspec CHANGED
@@ -38,7 +38,7 @@ Gem::Specification.new do |spec| # rubocop:disable Metrics/BlockLength
38
38
  spec.add_dependency 'faraday_middleware'
39
39
  spec.add_dependency 'hashie', '>= 3.4.3'
40
40
 
41
- spec.add_development_dependency 'bundler', '~> 1.17'
41
+ spec.add_development_dependency 'bundler', '~> 1.7'
42
42
  spec.add_development_dependency 'dotenv'
43
43
  spec.add_development_dependency 'minitest', '~> 5.10'
44
44
  spec.add_development_dependency 'minitest-around', '~> 0.4.0'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: plaid
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.0.0.rc0
4
+ version: 7.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Edmund Loo
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-03-21 00:00:00.000000000 Z
11
+ date: 2019-05-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '1.17'
61
+ version: '1.7'
62
62
  type: :development
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.17'
68
+ version: '1.7'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: dotenv
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -222,12 +222,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
222
222
  version: 2.1.0
223
223
  required_rubygems_version: !ruby/object:Gem::Requirement
224
224
  requirements:
225
- - - ">"
225
+ - - ">="
226
226
  - !ruby/object:Gem::Version
227
- version: 1.3.1
227
+ version: '0'
228
228
  requirements: []
229
229
  rubyforge_project:
230
- rubygems_version: 2.5.1
230
+ rubygems_version: 2.5.2.3
231
231
  signing_key:
232
232
  specification_version: 4
233
233
  summary: Ruby bindings for Plaid